From 3ee5d39ab2fe0a4ba133415258ad459f603149a5 Mon Sep 17 00:00:00 2001 From: Pseurae Date: Sun, 6 Oct 2024 09:10:15 +0000 Subject: [PATCH] Introduce printf debugging, repoint attack tables --- Makefile | 6 +- assembly/battle_anim_scripts.s | 365 ++ assembly/hooks/save_load_failed.s | 3 + assembly/macros/battle_anim.inc | 270 ++ extract_move_anim.py | 17 + extract_move_data.py | 667 +++ extract_move_desc.py | 396 ++ extract_move_names.py | 404 ++ include/debug.h | 24 + include/mini_printf.h | 51 + include/pokemon.h | 9 +- include/text.h | 18 +- linker.ld | 1 + linker/rodata.ld | 4 +- main.asm | 1 + retrieve_repoints.py | 35 + scripts/new_moves.asm | 177 + src/data/moves/battle.c | 4268 ++++++++++++++++++++ src/data/moves/descriptions.c | 359 ++ src/data/moves/names.c | 360 ++ src/{battle_moves.c => data/moves/split.c} | 2 - src/debug.c | 46 + src/field_effect_helpers.c | 1 + src/field_message_box.c | 5 - src/item_menu.c | 1 + src/mini_printf.c | 356 ++ 26 files changed, 7831 insertions(+), 15 deletions(-) create mode 100644 assembly/battle_anim_scripts.s create mode 100644 assembly/macros/battle_anim.inc create mode 100644 extract_move_anim.py create mode 100644 extract_move_data.py create mode 100644 extract_move_desc.py create mode 100644 extract_move_names.py create mode 100644 include/debug.h create mode 100644 include/mini_printf.h create mode 100644 retrieve_repoints.py create mode 100644 scripts/new_moves.asm create mode 100644 src/data/moves/battle.c create mode 100644 src/data/moves/descriptions.c create mode 100644 src/data/moves/names.c rename src/{battle_moves.c => data/moves/split.c} (99%) create mode 100644 src/debug.c create mode 100644 src/mini_printf.c diff --git a/Makefile b/Makefile index 323f608..9cf0f51 100644 --- a/Makefile +++ b/Makefile @@ -15,15 +15,15 @@ else EXE := endif -SRC_FILES ?= $(wildcard src/*.c) -ASM_FILES ?= $(wildcard assembly/*.s assembly/*/*.s) +SRC_FILES := $(shell find src -name "*.c") +ASM_FILES := $(shell find assembly -name "*.s") SRC_OBJS := $(SRC_FILES:src/%.c=build/src/%.o) ASM_OBJS := $(ASM_FILES:assembly/%.s=build/assembly/%.o) OBJ_FILES ?= $(SRC_OBJS) $(ASM_OBJS) -CFLAGS = -Wall -std=c99 -O2 -Iinclude -g -mthumb -mno-thumb-interwork -march=armv4t -mcpu=arm7tdmi -mtune=arm7tdmi -x c -c -Wparentheses -Wno-unused -Werror +CFLAGS = -Wall -std=c99 -O2 -Iinclude -g -mlong-calls -mthumb -mno-thumb-interwork -march=armv4t -mcpu=arm7tdmi -mtune=arm7tdmi -x c -c -Wparentheses -Wno-unused -Werror AS := $(PREFIX)as ASFLAGS := -mthumb -I assembly -I include diff --git a/assembly/battle_anim_scripts.s b/assembly/battle_anim_scripts.s new file mode 100644 index 0000000..9a5874d --- /dev/null +++ b/assembly/battle_anim_scripts.s @@ -0,0 +1,365 @@ +.global gBattleAnims_Moves + +.include "assembly/macros/constants.inc" +.include "assembly/macros/battle_anim.inc" + +.section .script_data, "aw", %progbits + +.align 2 + +gBattleAnims_Moves: + .4byte 0x81c7794 + .4byte 0x81c7794 + .4byte 0x81d053c + .4byte 0x81c77c5 + .4byte 0x81c86c3 + .4byte 0x81c854d + .4byte 0x81c9cb5 + .4byte 0x81d1107 + .4byte 0x81cdb3e + .4byte 0x81cdf28 + .4byte 0x81ce1d8 + .4byte 0x81c9be1 + .4byte 0x81c9c29 + .4byte 0x81d1e0b + .4byte 0x81c8ea4 + .4byte 0x81c8b8a + .4byte 0x81cfe9a + .4byte 0x81cfeeb + .4byte 0x81ca1e9 + .4byte 0x81d046f + .4byte 0x81d1552 + .4byte 0x81c9309 + .4byte 0x81c9391 + .4byte 0x81c8b2a + .4byte 0x81d06ea + .4byte 0x81c8627 + .4byte 0x81d05f7 + .4byte 0x81caa3a + .4byte 0x81ce774 + .4byte 0x81caabd + .4byte 0x81cab1a + .4byte 0x81cab87 + .4byte 0x81cac04 + .4byte 0x81c7cf2 + .4byte 0x81c7d30 + .4byte 0x81d158c + .4byte 0x81c80e6 + .4byte 0x81cad81 + .4byte 0x81c817a + .4byte 0x81c8b71 + .4byte 0x81c828d + .4byte 0x81c82e2 + .4byte 0x81c7f5c + .4byte 0x81d121a + .4byte 0x81ce9e2 + .4byte 0x81ce3af + .4byte 0x81ce31e + .4byte 0x81cae00 + .4byte 0x81c7dbd + .4byte 0x81c873b + .4byte 0x81d1ef1 + .4byte 0x81cfb5a + .4byte 0x81c84d9 + .4byte 0x81d0267 + .4byte 0x81d1073 + .4byte 0x81d00cc + .4byte 0x81cf240 + .4byte 0x81d0253 + .4byte 0x81ceb4d + .4byte 0x81cefba + .4byte 0x81d15a2 + .4byte 0x81ca573 + .4byte 0x81cec91 + .4byte 0x81d31ea + .4byte 0x81cff88 + .4byte 0x81c93c8 + .4byte 0x81d0aee + .4byte 0x81caed4 + .4byte 0x81d08ac + .4byte 0x81d4f58 + .4byte 0x81c7c5e + .4byte 0x81cf427 + .4byte 0x81cf53f + .4byte 0x81c8483 + .4byte 0x81ca1b3 + .4byte 0x81d0dde + .4byte 0x81ced65 + .4byte 0x81c7818 + .4byte 0x81c7949 + .4byte 0x81c7a77 + .4byte 0x81d0ca6 + .4byte 0x81d1c98 + .4byte 0x81ce8ba + .4byte 0x81c9096 + .4byte 0x81c879c + .4byte 0x81c880a + .4byte 0x81c89c0 + .4byte 0x81cddce + .4byte 0x81ca35f + .4byte 0x81caf31 + .4byte 0x81caf7e + .4byte 0x81cb0a1 + .4byte 0x81cf983 + .4byte 0x81cdc69 + .4byte 0x81cdcca + .4byte 0x81d163c + .4byte 0x81cb1bd + .4byte 0x81cb1da + .4byte 0x81cb224 + .4byte 0x81cb27c + .4byte 0x81cb2f2 + .4byte 0x81d1a0d + .4byte 0x81d1fc9 + .4byte 0x81c7e15 + .4byte 0x81cb30b + .4byte 0x81d1f1f + .4byte 0x81cd909 + .4byte 0x81cb352 + .4byte 0x81ca710 + .4byte 0x81ca291 + .4byte 0x81cec84 + .4byte 0x81c977c + .4byte 0x81ce57f + .4byte 0x81ce47a + .4byte 0x81d10d4 + .4byte 0x81ce52c + .4byte 0x81d1b59 + .4byte 0x81d1b99 + .4byte 0x81cb365 + .4byte 0x81c7794 + .4byte 0x81c9219 + .4byte 0x81d1a55 + .4byte 0x81d1b32 + .4byte 0x81ce672 + .4byte 0x81cf9f2 + .4byte 0x81cfca8 + .4byte 0x81c8355 + .4byte 0x81c9421 + .4byte 0x81ceaf0 + .4byte 0x81c7ba5 + .4byte 0x81cb38f + .4byte 0x81c8df1 + .4byte 0x81d2013 + .4byte 0x81cb455 + .4byte 0x81cb479 + .4byte 0x81d213b + .4byte 0x81d0654 + .4byte 0x81cb4ca + .4byte 0x81d1271 + .4byte 0x81d1474 + .4byte 0x81cb533 + .4byte 0x81cf8d7 + .4byte 0x81d24af + .4byte 0x81cb57b + .4byte 0x81d3054 + .4byte 0x81ce59c + .4byte 0x81c8f5c + .4byte 0x81d0c41 + .4byte 0x81cb713 + .4byte 0x81d169c + .4byte 0x81cb720 + .4byte 0x81cb735 + .4byte 0x81d0159 + .4byte 0x81c9675 + .4byte 0x81d24f6 + .4byte 0x81cfc54 + .4byte 0x81cdc29 + .4byte 0x81ca3eb + .4byte 0x81d29a8 + .4byte 0x81cb74e + .4byte 0x81ca809 + .4byte 0x81d2a0f + .4byte 0x81cb75a + .4byte 0x81cb7db + .4byte 0x81d3c6f + .4byte 0x81cb815 + .4byte 0x81cb87b + .4byte 0x81d071d + .4byte 0x81ca52c + .4byte 0x81d1d6a + .4byte 0x81cda06 + .4byte 0x81cb8a3 + .4byte 0x81c7e62 + .4byte 0x81ce3ea + .4byte 0x81d207b + .4byte 0x81cb8f9 + .4byte 0x81ca91e + .4byte 0x81cffaf + .4byte 0x81d0be7 + .4byte 0x81c8ca5 + .4byte 0x81cb936 + .4byte 0x81cf146 + .4byte 0x81c97b5 + .4byte 0x81cb965 + .4byte 0x81d23e3 + .4byte 0x81ce6ed + .4byte 0x81d2446 + .4byte 0x81cd91e + .4byte 0x81cfa34 + .4byte 0x81ce81c + .4byte 0x81d100d + .4byte 0x81cfd55 + .4byte 0x81d1722 + .4byte 0x81cb9ed + .4byte 0x81cba2c + .4byte 0x81d2784 + .4byte 0x81ca650 + .4byte 0x81c97d2 + .4byte 0x81cfd0a + .4byte 0x81ca2e4 + .4byte 0x81c9d08 + .4byte 0x81d0304 + .4byte 0x81cf6cf + .4byte 0x81cba87 + .4byte 0x81cbb1b + .4byte 0x81cbb5e + .4byte 0x81cbb9f + .4byte 0x81cbc26 + .4byte 0x81cbc6e + .4byte 0x81c9ea3 + .4byte 0x81c914a + .4byte 0x81d1807 + .4byte 0x81ca31a + .4byte 0x81ca0ba + .4byte 0x81d28ed + .4byte 0x81d21bd + .4byte 0x81d3f36 + .4byte 0x81d260b + .4byte 0x81c9830 + .4byte 0x81c9af7 + .4byte 0x81c9b39 + .4byte 0x81cdff1 + .4byte 0x81cbcb0 + .4byte 0x81d07e4 + .4byte 0x81cfdac + .4byte 0x81ce20a + .4byte 0x81d2762 + .4byte 0x81d2c41 + .4byte 0x81c8d80 + .4byte 0x81cbd41 + .4byte 0x81d3100 + .4byte 0x81d18b6 + .4byte 0x81d197a + .4byte 0x81d097b + .4byte 0x81d306c + .4byte 0x81cf959 + .4byte 0x81cbdae + .4byte 0x81c8bbc + .4byte 0x81d058e + .4byte 0x81d553a + .4byte 0x81ce997 + .4byte 0x81d0b91 + .4byte 0x81cea40 + .4byte 0x81ce506 + .4byte 0x81c8eea + .4byte 0x81cbe3e + .4byte 0x81d0ee5 + .4byte 0x81d1aef + .4byte 0x81cdd2d + .4byte 0x81d09f6 + .4byte 0x81d038c + .4byte 0x81c8a2f + .4byte 0x81d23a8 + .4byte 0x81cbefc + .4byte 0x81d2dae + .4byte 0x81d2e65 + .4byte 0x81d2fa8 + .4byte 0x81cbfc6 + .4byte 0x81cc076 + .4byte 0x81cc0ae + .4byte 0x81d332c + .4byte 0x81d2b83 + .4byte 0x81cc0f2 + .4byte 0x81cc136 + .4byte 0x81d3e6f + .4byte 0x81cc156 + .4byte 0x81cc1b1 + .4byte 0x81d0ee5 + .4byte 0x81cc1d0 + .4byte 0x81cc26b + .4byte 0x81cc2bf + .4byte 0x81d2ce8 + .4byte 0x81d3428 + .4byte 0x81d2d66 + .4byte 0x81cc332 + .4byte 0x81d255a + .4byte 0x81cc3a3 + .4byte 0x81d50b5 + .4byte 0x81cc45e + .4byte 0x81d3b99 + .4byte 0x81cc492 + .4byte 0x81cc697 + .4byte 0x81d523b + .4byte 0x81cc6da + .4byte 0x81cc74f + .4byte 0x81cc81c + .4byte 0x81cc867 + .4byte 0x81d3485 + .4byte 0x81cc8aa + .4byte 0x81d498b + .4byte 0x81d54e6 + .4byte 0x81d49a5 + .4byte 0x81d36cf + .4byte 0x81cc8d2 + .4byte 0x81cc918 + .4byte 0x81cc95b + .4byte 0x81cca72 + .4byte 0x81ccb01 + .4byte 0x81ccbd1 + .4byte 0x81d34c8 + .4byte 0x81ccc3c + .4byte 0x81d57ba + .4byte 0x81ccd73 + .4byte 0x81ccf23 + .4byte 0x81d3550 + .4byte 0x81d3c30 + .4byte 0x81ccf3b + .4byte 0x81d444a + .4byte 0x81d4dde + .4byte 0x81d3b12 + .4byte 0x81d4f10 + .4byte 0x81d5989 + .4byte 0x81ccfab + .4byte 0x81cd10d + .4byte 0x81cd19d + .4byte 0x81d4afc + .4byte 0x81cd1ff + .4byte 0x81d468c + .4byte 0x81d4773 + .4byte 0x81d3e1f + .4byte 0x81cd249 + .4byte 0x81cd33c + .4byte 0x81d43c5 + .4byte 0x81cd3a8 + .4byte 0x81cf33f + .4byte 0x81cd3d6 + .4byte 0x81cd431 + .4byte 0x81d53ed + .4byte 0x81d35d2 + .4byte 0x81d36aa + .4byte 0x81d3764 + .4byte 0x81d3776 + .4byte 0x81cd499 + .4byte 0x81c8021 + .4byte 0x81cd503 + .4byte 0x81cd52d + .4byte 0x81cd53c + .4byte 0x81d380c + .4byte 0x81d3c7b + .4byte 0x81cd55e + .4byte 0x81d04d9 + .4byte 0x81d3a75 + .4byte 0x81d1914 + .4byte 0x81cd57c + .4byte 0x81cd5d9 + .4byte 0x81d5699 + .4byte 0x81cd6d1 + .4byte 0x81cd6f7 + .4byte 0x81cd775 + .4byte 0x81cd7f8 + .4byte 0x81d4a5f + .4byte 0x81cd867 + .4byte 0x81d50d2 + .4byte 0x81d52cb + .4byte 0x81d51c7 diff --git a/assembly/hooks/save_load_failed.s b/assembly/hooks/save_load_failed.s index ef8a084..6dc0e40 100644 --- a/assembly/hooks/save_load_failed.s +++ b/assembly/hooks/save_load_failed.s @@ -1,5 +1,8 @@ .global NoFlashMemoryCallback NoFlashMemoryCallback: +push {r0} +bl MgbaOpen +pop {r0} cmp r0, #1 beq return_to_main diff --git a/assembly/macros/battle_anim.inc b/assembly/macros/battle_anim.inc new file mode 100644 index 0000000..58f1e5b --- /dev/null +++ b/assembly/macros/battle_anim.inc @@ -0,0 +1,270 @@ + .macro loadspritegfx id + .byte 0x00 + .2byte \id + .endm + + .macro unloadspritegfx id + .byte 0x01 + .2byte \id + .endm + + .macro createsprite template, anim_battler, subpriority_offset, argv:vararg + .byte 0x02 + .4byte \template + .if \anim_battler == ANIM_BATTLER_TARGET + .byte 0x80 | (\subpriority_offset & 0x7F) + .else + .byte (\subpriority_offset & 0x7F) + .endif + .byte (.Lsprite_\@_2 - .Lsprite_\@_1) / 2 +.Lsprite_\@_1: + .2byte \argv +.Lsprite_\@_2: + .endm + + .macro createvisualtask addr, priority, argv:vararg + .byte 0x03 + .4byte \addr + .byte \priority + .byte (.Lcreatetask_\@_2 - .Lcreatetask_\@_1) / 2 +.Lcreatetask_\@_1: + .2byte \argv +.Lcreatetask_\@_2: + .endm + + .macro delay amount + .byte 0x04 + .byte \amount + .endm + + .macro waitforvisualfinish + .byte 0x05 + .endm + + .macro hang1 + .byte 0x06 + .endm + + .macro hang2 + .byte 0x07 + .endm + + .macro end + .byte 0x08 + .endm + + .macro playse id + .byte 0x09 + .2byte \id + .endm + + .macro monbg which + .byte 0x0A + .byte \which + .endm + + .macro clearmonbg which + .byte 0x0B + .byte \which + .endm + + .macro setalpha eva, evb + .byte 0x0C + .2byte ((\evb) << 8) | (\eva) + .endm + + .macro blendoff + .byte 0x0D + .endm + + .macro call addr + .byte 0x0E + .4byte \addr + .endm + + .macro return + .byte 0x0F + .endm + + .macro setarg arg_num, value + .byte 0x10 + .byte \arg_num + .2byte \value + .endm + + .macro choosetwoturnanim addr1, addr2 + .byte 0x11 + .4byte \addr1 + .4byte \addr2 + .endm + + .macro jumpifmoveturn cond, addr + .byte 0x12 + .byte \cond + .4byte \addr + .endm + + .macro goto addr + .byte 0x13 + .4byte \addr + .endm + + .macro fadetobg id + .byte 0x14 + .byte \id + .endm + + .macro restorebg + .byte 0x15 + .endm + + .macro waitbgfadeout + .byte 0x16 + .endm + + .macro waitbgfadein + .byte 0x17 + .endm + + .macro changebg id + .byte 0x18 + .byte \id + .endm + + .macro playsewithpan id, pan + .byte 0x19 + .2byte \id + .byte \pan + .endm + + .macro setpan pan + .byte 0x1A + .byte \pan + .endm + + .macro panse_1B id, pan_start, pan_end, step, delay + .byte 0x1B + .2byte \id + .byte \pan_start + .byte \pan_end + .byte \step + .byte \delay + .endm + + .macro loopsewithpan id, pan, delay, count + .byte 0x1C + .2byte \id + .byte \pan + .byte \delay + .byte \count + .endm + + .macro waitplaysewithpan id, pan, count + .byte 0x1D + .2byte \id + .byte \pan + .byte \count + .endm + + .macro setbldcnt bldcnt + .byte 0x1E + .2byte \bldcnt + .endm + + .macro createsoundtask addr, argv:vararg + .byte 0x1F + .4byte \addr + .byte (.Lcreatetask_1F_\@_2 - .Lcreatetask_1F_\@_1) / 2 +.Lcreatetask_1F_\@_1: + .2byte \argv +.Lcreatetask_1F_\@_2: + .endm + + .macro waitsound + .byte 0x20 + .endm + + .macro jumpargeq arg_num, value, addr + .byte 0x21 + .byte \arg_num + .2byte \value + .4byte \addr + .endm + + .macro monbg_22 bank + .byte 0x22 + .byte \bank + .endm + + .macro clearmonbg_23 bank + .byte 0x23 + .byte \bank + .endm + + .macro jumpifcontest addr + .byte 0x24 + .4byte \addr + .endm + + .macro fadetobgfromset a, b, c + .byte 0x25 + .byte \a + .byte \b + .byte \c + .endm + + .macro panse_26 id, pan_start, pan_end, step, delay + .byte 0x26 + .2byte \id + .byte \pan_start + .byte \pan_end + .byte \step + .byte \delay + .endm + + .macro panse_27 id, pan_start, pan_end, step, delay + .byte 0x27 + .2byte \id + .byte \pan_start + .byte \pan_end + .byte \step + .byte \delay + .endm + + .macro monbgprio_28 bank + .byte 0x28 + .byte \bank + .endm + + .macro monbgprio_29 + .byte 0x29 + .endm + + .macro monbgprio_2A bank + .byte 0x2A + .byte \bank + .endm + + .macro invisible bank + .byte 0x2B + .byte \bank + .endm + + .macro visible bank + .byte 0x2C + .byte \bank + .endm + + .macro doublebattle_2D bank + .byte 0x2D + .byte \bank + .endm + + .macro doublebattle_2E bank + .byte 0x2E + .byte \bank + .endm + + .macro stopsound + .byte 0x2F + .endm diff --git a/extract_move_anim.py b/extract_move_anim.py new file mode 100644 index 0000000..4334465 --- /dev/null +++ b/extract_move_anim.py @@ -0,0 +1,17 @@ +def iter_moveanim_ptrs(rom): + for i in range(355): + yield hex(int.from_bytes(rom.read(4), 'little')) + + +if __name__ == "__main__": + movenames = [] + + rom = open("snakewood.gba", "rb") + rom.seek(0x1C7168) + + print("gBattleAnims_Moves::") + for v in iter_moveanim_ptrs(rom): + print(f" .4byte {v}") + + rom.close() + diff --git a/extract_move_data.py b/extract_move_data.py new file mode 100644 index 0000000..eec56b1 --- /dev/null +++ b/extract_move_data.py @@ -0,0 +1,667 @@ +moves = [ + "MOVE_NONE", + "MOVE_POUND", + "MOVE_KARATE_CHOP", + "MOVE_DOUBLE_SLAP", + "MOVE_COMET_PUNCH", + "MOVE_MEGA_PUNCH", + "MOVE_PAY_DAY", + "MOVE_FIRE_PUNCH", + "MOVE_ICE_PUNCH", + "MOVE_THUNDER_PUNCH", + "MOVE_SCRATCH", + "MOVE_VICE_GRIP", + "MOVE_GUILLOTINE", + "MOVE_RAZOR_WIND", + "MOVE_SWORDS_DANCE", + "MOVE_CUT", + "MOVE_GUST", + "MOVE_WING_ATTACK", + "MOVE_WHIRLWIND", + "MOVE_FLY", + "MOVE_BIND", + "MOVE_SLAM", + "MOVE_VINE_WHIP", + "MOVE_SKULLBREAKER", + "MOVE_DOUBLE_KICK", + "MOVE_MEGA_KICK", + "MOVE_JUMP_KICK", + "MOVE_ROLLING_KICK", + "MOVE_SAND_ATTACK", + "MOVE_HEADBUTT", + "MOVE_HORN_ATTACK", + "MOVE_FURY_ATTACK", + "MOVE_HORN_DRILL", + "MOVE_TACKLE", + "MOVE_BODY_SLAM", + "MOVE_WRAP", + "MOVE_TAKE_DOWN", + "MOVE_THRASH", + "MOVE_DOUBLE_EDGE", + "MOVE_TAIL_WHIP", + "MOVE_POISON_STING", + "MOVE_TWINEEDLE", + "MOVE_PIN_MISSILE", + "MOVE_LEER", + "MOVE_BITE", + "MOVE_GROWL", + "MOVE_ROAR", + "MOVE_SING", + "MOVE_SUPERSONIC", + "MOVE_SONIC_BOOM", + "MOVE_DISABLE", + "MOVE_ACID", + "MOVE_EMBER", + "MOVE_FIRE_PUMP", + "MOVE_MIST", + "MOVE_WATER_GUN", + "MOVE_STORM_SURGE", + "MOVE_SURF", + "MOVE_ICE_BEAM", + "MOVE_BLIZZARD", + "MOVE_PSYBEAM", + "MOVE_BOILINGWATER", + "MOVE_AURORA_BEAM", + "MOVE_HYPER_BEAM", + "MOVE_PECK", + "MOVE_DRILL_PECK", + "MOVE_SUBMISSION", + "MOVE_LOW_KICK", + "MOVE_COUNTER", + "MOVE_SEISMIC_TOSS", + "MOVE_STRENGTH", + "MOVE_ABSORB", + "MOVE_MEGA_DRAIN", + "MOVE_LEECH_SEED", + "MOVE_GROWTH", + "MOVE_RAZOR_LEAF", + "MOVE_SOLAR_BEAM", + "MOVE_POISON_POWDER", + "MOVE_STUN_SPORE", + "MOVE_SLEEP_POWDER", + "MOVE_PETAL_DANCE", + "MOVE_STRING_SHOT", + "MOVE_DRACO_FURY", + "MOVE_FIRE_SPIN", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_DISCHARGE", + "MOVE_ROCK_THROW", + "MOVE_EARTHQUAKE", + "MOVE_FISSURE", + "MOVE_DIG", + "MOVE_TOXIC", + "MOVE_CONFUSION", + "MOVE_PSYCHIC", + "MOVE_HYPNOSIS", + "MOVE_MEDITATE", + "MOVE_AGILITY", + "MOVE_QUICK_ATTACK", + "MOVE_RAGE", + "MOVE_TELEPORT", + "MOVE_NIGHT_SHADE", + "MOVE_MIMIC", + "MOVE_SCREECH", + "MOVE_DOUBLE_TEAM", + "MOVE_RECOVER", + "MOVE_HARDEN", + "MOVE_MINIMIZE", + "MOVE_SMOKESCREEN", + "MOVE_CONFUSE_RAY", + "MOVE_WITHDRAW", + "MOVE_DEFENSE_CURL", + "MOVE_BARRIER", + "MOVE_LIGHT_SCREEN", + "MOVE_HAZE", + "MOVE_REFLECT", + "MOVE_FOCUS_ENERGY", + "MOVE_BIDE", + "MOVE_METRONOME", + "MOVE_MIRROR_MOVE", + "MOVE_SELF_DESTRUCT", + "MOVE_EGG_BOMB", + "MOVE_LICK", + "MOVE_SMOG", + "MOVE_SLUDGE", + "MOVE_BONE_CLUB", + "MOVE_FIRE_BLAST", + "MOVE_WATERFALL", + "MOVE_CLAMP", + "MOVE_SWIFT", + "MOVE_SKULL_BASH", + "MOVE_SPIKE_CANNON", + "MOVE_CONSTRICT", + "MOVE_AMNESIA", + "MOVE_KINESIS", + "MOVE_SOFT_BOILED", + "MOVE_HI_JUMP_KICK", + "MOVE_GLARE", + "MOVE_DREAM_EATER", + "MOVE_POISON_GAS", + "MOVE_BARRAGE", + "MOVE_LEECH_LIFE", + "MOVE_LOVELY_KISS", + "MOVE_SKY_ATTACK", + "MOVE_TRANSFORM", + "MOVE_BUBBLE", + "MOVE_DIZZY_PUNCH", + "MOVE_SPORE", + "MOVE_FLASH", + "MOVE_PSYWAVE", + "MOVE_SPLASH", + "MOVE_ACID_ARMOR", + "MOVE_CRABHAMMER", + "MOVE_EXPLOSION", + "MOVE_FURY_SWIPES", + "MOVE_BONEMERANG", + "MOVE_REST", + "MOVE_ROCK_SLIDE", + "MOVE_HYPER_FANG", + "MOVE_SHARPEN", + "MOVE_CONVERSION", + "MOVE_TRI_ATTACK", + "MOVE_SUPER_FANG", + "MOVE_SLASH", + "MOVE_SUBSTITUTE", + "MOVE_STRUGGLE", + "MOVE_SKETCH", + "MOVE_TRIPLE_KICK", + "MOVE_THIEF", + "MOVE_SPIDER_WEB", + "MOVE_MIND_READER", + "MOVE_NIGHTMARE", + "MOVE_FLAME_WHEEL", + "MOVE_SNORE", + "MOVE_CURSE", + "MOVE_FLAIL", + "MOVE_CONVERSION_2", + "MOVE_AEROBLAST", + "MOVE_COTTON_SPORE", + "MOVE_REVERSAL", + "MOVE_SPITE", + "MOVE_POWDER_SNOW", + "MOVE_PROTECT", + "MOVE_MACH_PUNCH", + "MOVE_SCARY_FACE", + "MOVE_FAINT_ATTACK", + "MOVE_SWEET_KISS", + "MOVE_BELLY_DRUM", + "MOVE_SLUDGE_BOMB", + "MOVE_MUD_SLAP", + "MOVE_OCTAZOOKA", + "MOVE_SPIKES", + "MOVE_ZAP_CANNON", + "MOVE_FORESIGHT", + "MOVE_DESTINY_BOND", + "MOVE_PERISH_SONG", + "MOVE_ICEBREATH", + "MOVE_DETECT", + "MOVE_BONE_RUSH", + "MOVE_DATA_STREAM", + "MOVE_OUTRAGE", + "MOVE_SANDSTORM", + "MOVE_GIGA_DRAIN", + "MOVE_ENDURE", + "MOVE_CHARM", + "MOVE_ROLLOUT", + "MOVE_SHADOW_SWIPE", + "MOVE_SWAGGER", + "MOVE_MILK_DRINK", + "MOVE_SPARK", + "MOVE_FURY_CUTTER", + "MOVE_STEEL_WING", + "MOVE_MEAN_LOOK", + "MOVE_ATTRACT", + "MOVE_SLEEP_TALK", + "MOVE_HEAL_BELL", + "MOVE_RETURN", + "MOVE_PRESENT", + "MOVE_FRUSTRATION", + "MOVE_SAFEGUARD", + "MOVE_PAIN_SPLIT", + "MOVE_SACRED_FIRE", + "MOVE_MAGNITUDE", + "MOVE_DYNAMIC_PUNCH", + "MOVE_MEGAHORN", + "MOVE_DRAGON_BREATH", + "MOVE_BATON_PASS", + "MOVE_ENCORE", + "MOVE_PURSUIT", + "MOVE_RAPID_SPIN", + "MOVE_SWEET_SCENT", + "MOVE_IRON_TAIL", + "MOVE_METAL_CLAW", + "MOVE_VITAL_THROW", + "MOVE_MORNING_SUN", + "MOVE_SYNTHESIS", + "MOVE_MOONLIGHT", + "MOVE_HIDDEN_POWER", + "MOVE_CROSS_CHOP", + "MOVE_TWISTER", + "MOVE_RAIN_DANCE", + "MOVE_SUNNY_DAY", + "MOVE_CRUNCH", + "MOVE_MIRROR_COAT", + "MOVE_PSYCH_UP", + "MOVE_EXTREME_SPEED", + "MOVE_ANCIENT_POWER", + "MOVE_SHADOW_BALL", + "MOVE_FUTURE_SIGHT", + "MOVE_ROCK_SMASH", + "MOVE_WHIRLPOOL", + "MOVE_BEAT_UP", + "MOVE_FAKE_OUT", + "MOVE_UPROAR", + "MOVE_STOCKPILE", + "MOVE_SPIT_UP", + "MOVE_SWALLOW", + "MOVE_HEAT_WAVE", + "MOVE_HAIL", + "MOVE_TORMENT", + "MOVE_FLATTER", + "MOVE_WILL_O_WISP", + "MOVE_MEMENTO", + "MOVE_FACADE", + "MOVE_FOCUS_PUNCH", + "MOVE_SMELLING_SALT", + "MOVE_FOLLOW_ME", + "MOVE_NATURE_POWER", + "MOVE_CHARGE", + "MOVE_TAUNT", + "MOVE_HELPING_HAND", + "MOVE_TRICK", + "MOVE_ROLE_PLAY", + "MOVE_WISH", + "MOVE_ASSIST", + "MOVE_INGRAIN", + "MOVE_SUPERPOWER", + "MOVE_MAGIC_COAT", + "MOVE_RECYCLE", + "MOVE_REVENGE", + "MOVE_BRICK_BREAK", + "MOVE_YAWN", + "MOVE_KNOCK_OFF", + "MOVE_ENDEAVOR", + "MOVE_ERUPTION", + "MOVE_SKILL_SWAP", + "MOVE_IMPRISON", + "MOVE_REFRESH", + "MOVE_GRUDGE", + "MOVE_SNATCH", + "MOVE_SECRET_POWER", + "MOVE_DIVE", + "MOVE_ARM_THRUST", + "MOVE_CAMOUFLAGE", + "MOVE_BRIGHT_IDEA", + "MOVE_CRAZY_BOLT", + "MOVE_AFRO_BREAK", + "MOVE_FEATHER_DANCE", + "MOVE_TEETER_DANCE", + "MOVE_FRICTIONKICK", + "MOVE_MUD_SPORT", + "MOVE_ICE_BALL", + "MOVE_NEEDLE_ARM", + "MOVE_SLACK_OFF", + "MOVE_HYPER_VOICE", + "MOVE_POISON_FANG", + "MOVE_CRUSH_CLAW", + "MOVE_BLAST_BURN", + "MOVE_HYDRO_CANNON", + "MOVE_METEOR_MASH", + "MOVE_ASTONISH", + "MOVE_WEATHER_BALL", + "MOVE_AROMATHERAPY", + "MOVE_FAKE_TEARS", + "MOVE_AIR_CUTTER", + "MOVE_OVERHEAT", + "MOVE_ODOR_SLEUTH", + "MOVE_ROCK_TOMB", + "MOVE_SILVER_WIND", + "MOVE_METAL_SOUND", + "MOVE_GRASS_WHISTLE", + "MOVE_TICKLE", + "MOVE_COSMIC_POWER", + "MOVE_WATER_SPOUT", + "MOVE_SIGNAL_BEAM", + "MOVE_SHADOW_PUNCH", + "MOVE_EXTRASENSORY", + "MOVE_SKY_UPPERCUT", + "MOVE_SAND_TOMB", + "MOVE_SHEER_COLD", + "MOVE_MUDDY_WATER", + "MOVE_BULLET_SEED", + "MOVE_AERIAL_ACE", + "MOVE_CRYSTALSTORM", + "MOVE_IRON_DEFENSE", + "MOVE_BLOCK", + "MOVE_HOWL", + "MOVE_DRAGON_CLAW", + "MOVE_FRENZY_PLANT", + "MOVE_BULK_UP", + "MOVE_BOUNCE", + "MOVE_MUD_SHOT", + "MOVE_POISON_TAIL", + "MOVE_COVET", + "MOVE_WILD_BOLT", + "MOVE_MAGICAL_LEAF", + "MOVE_WATER_SPORT", + "MOVE_CALM_MIND", + "MOVE_LEAF_BLADE", + "MOVE_FURY_DANCE", + "MOVE_ROCK_BLAST", + "MOVE_SHOCK_WAVE", + "MOVE_WATER_PULSE", + "MOVE_PULSAR", + "MOVE_CURSE_CLAW", +] + +effects = [ +"EFFECT_HIT", +"EFFECT_SLEEP", +"EFFECT_POISON_HIT", +"EFFECT_ABSORB", +"EFFECT_BURN_HIT", +"EFFECT_FREEZE_HIT", +"EFFECT_PARALYZE_HIT", +"EFFECT_EXPLOSION", +"EFFECT_DREAM_EATER", +"EFFECT_MIRROR_MOVE", +"EFFECT_ATTACK_UP", +"EFFECT_DEFENSE_UP", +"EFFECT_SPEED_UP", +"EFFECT_SPECIAL_ATTACK_UP", +"EFFECT_SPECIAL_DEFENSE_UP", +"EFFECT_ACCURACY_UP", +"EFFECT_EVASION_UP", +"EFFECT_ALWAYS_HIT", +"EFFECT_ATTACK_DOWN", +"EFFECT_DEFENSE_DOWN", +"EFFECT_SPEED_DOWN", +"EFFECT_SPECIAL_ATTACK_DOWN", +"EFFECT_SPECIAL_DEFENSE_DOWN", +"EFFECT_ACCURACY_DOWN", +"EFFECT_EVASION_DOWN", +"EFFECT_HAZE", +"EFFECT_BIDE", +"EFFECT_RAMPAGE", +"EFFECT_ROAR", +"EFFECT_MULTI_HIT", +"EFFECT_CONVERSION", +"EFFECT_FLINCH_HIT", +"EFFECT_RESTORE_HP", +"EFFECT_TOXIC", +"EFFECT_PAY_DAY", +"EFFECT_LIGHT_SCREEN", +"EFFECT_TRI_ATTACK", +"EFFECT_REST", +"EFFECT_OHKO", +"EFFECT_RAZOR_WIND", +"EFFECT_SUPER_FANG", +"EFFECT_DRAGON_RAGE", +"EFFECT_TRAP", +"EFFECT_HIGH_CRITICAL", +"EFFECT_DOUBLE_HIT", +"EFFECT_RECOIL_IF_MISS", +"EFFECT_MIST", +"EFFECT_FOCUS_ENERGY", +"EFFECT_RECOIL", +"EFFECT_CONFUSE", +"EFFECT_ATTACK_UP_2", +"EFFECT_DEFENSE_UP_2", +"EFFECT_SPEED_UP_2", +"EFFECT_SPECIAL_ATTACK_UP_2", +"EFFECT_SPECIAL_DEFENSE_UP_2", +"EFFECT_ACCURACY_UP_2", +"EFFECT_EVASION_UP_2", +"EFFECT_TRANSFORM", +"EFFECT_ATTACK_DOWN_2", +"EFFECT_DEFENSE_DOWN_2", +"EFFECT_SPEED_DOWN_2", +"EFFECT_SPECIAL_ATTACK_DOWN_2", +"EFFECT_SPECIAL_DEFENSE_DOWN_2", +"EFFECT_ACCURACY_DOWN_2", +"EFFECT_EVASION_DOWN_2", +"EFFECT_REFLECT", +"EFFECT_POISON", +"EFFECT_PARALYZE", +"EFFECT_ATTACK_DOWN_HIT", +"EFFECT_DEFENSE_DOWN_HIT", +"EFFECT_SPEED_DOWN_HIT", +"EFFECT_SPECIAL_ATTACK_DOWN_HIT", +"EFFECT_SPECIAL_DEFENSE_DOWN_HIT", +"EFFECT_ACCURACY_DOWN_HIT", +"EFFECT_EVASION_DOWN_HIT", +"EFFECT_SKY_ATTACK", +"EFFECT_CONFUSE_HIT", +"EFFECT_TWINEEDLE", +"EFFECT_VITAL_THROW", +"EFFECT_SUBSTITUTE", +"EFFECT_RECHARGE", +"EFFECT_RAGE", +"EFFECT_MIMIC", +"EFFECT_METRONOME", +"EFFECT_LEECH_SEED", +"EFFECT_SPLASH", +"EFFECT_DISABLE", +"EFFECT_LEVEL_DAMAGE", +"EFFECT_PSYWAVE", +"EFFECT_COUNTER", +"EFFECT_ENCORE", +"EFFECT_PAIN_SPLIT", +"EFFECT_SNORE", +"EFFECT_CONVERSION_2", +"EFFECT_LOCK_ON", +"EFFECT_SKETCH", +"EFFECT_UNUSED_60", +"EFFECT_SLEEP_TALK", +"EFFECT_DESTINY_BOND", +"EFFECT_FLAIL", +"EFFECT_SPITE", +"EFFECT_FALSE_SWIPE", +"EFFECT_HEAL_BELL", +"EFFECT_QUICK_ATTACK", +"EFFECT_TRIPLE_KICK", +"EFFECT_THIEF", +"EFFECT_MEAN_LOOK", +"EFFECT_NIGHTMARE", +"EFFECT_MINIMIZE", +"EFFECT_CURSE", +"EFFECT_UNUSED_6E", +"EFFECT_PROTECT", +"EFFECT_SPIKES", +"EFFECT_FORESIGHT", +"EFFECT_PERISH_SONG", +"EFFECT_SANDSTORM", +"EFFECT_ENDURE", +"EFFECT_ROLLOUT", +"EFFECT_SWAGGER", +"EFFECT_FURY_CUTTER", +"EFFECT_ATTRACT", +"EFFECT_RETURN", +"EFFECT_PRESENT", +"EFFECT_FRUSTRATION", +"EFFECT_SAFEGUARD", +"EFFECT_THAW_HIT", +"EFFECT_MAGNITUDE", +"EFFECT_BATON_PASS", +"EFFECT_PURSUIT", +"EFFECT_RAPID_SPIN", +"EFFECT_SONICBOOM", +"EFFECT_UNUSED_83", +"EFFECT_MORNING_SUN", +"EFFECT_SYNTHESIS", +"EFFECT_MOONLIGHT", +"EFFECT_HIDDEN_POWER", +"EFFECT_RAIN_DANCE", +"EFFECT_SUNNY_DAY", +"EFFECT_DEFENSE_UP_HIT", +"EFFECT_ATTACK_UP_HIT", +"EFFECT_ALL_STATS_UP_HIT", +"EFFECT_UNUSED_8D", +"EFFECT_BELLY_DRUM", +"EFFECT_PSYCH_UP", +"EFFECT_MIRROR_COAT", +"EFFECT_SKULL_BASH", +"EFFECT_TWISTER", +"EFFECT_EARTHQUAKE", +"EFFECT_FUTURE_SIGHT", +"EFFECT_GUST", +"EFFECT_FLINCH_HIT_2", +"EFFECT_SOLARBEAM", +"EFFECT_THUNDER", +"EFFECT_TELEPORT", +"EFFECT_BEAT_UP", +"EFFECT_FLY", +"EFFECT_DEFENSE_CURL", +"EFFECT_SOFTBOILED", +"EFFECT_FAKE_OUT", +"EFFECT_UPROAR", +"EFFECT_STOCKPILE", +"EFFECT_SPIT_UP", +"EFFECT_SWALLOW", +"EFFECT_UNUSED_A3", +"EFFECT_HAIL", +"EFFECT_TORMENT", +"EFFECT_FLATTER", +"EFFECT_WILL_O_WISP", +"EFFECT_MEMENTO", +"EFFECT_FACADE", +"EFFECT_FOCUS_PUNCH", +"EFFECT_SMELLINGSALT", +"EFFECT_FOLLOW_ME", +"EFFECT_NATURE_POWER", +"EFFECT_CHARGE", +"EFFECT_TAUNT", +"EFFECT_HELPING_HAND", +"EFFECT_TRICK", +"EFFECT_ROLE_PLAY", +"EFFECT_WISH", +"EFFECT_ASSIST", +"EFFECT_INGRAIN", +"EFFECT_SUPERPOWER", +"EFFECT_MAGIC_COAT", +"EFFECT_RECYCLE", +"EFFECT_REVENGE", +"EFFECT_BRICK_BREAK", +"EFFECT_YAWN", +"EFFECT_KNOCK_OFF", +"EFFECT_ENDEAVOR", +"EFFECT_ERUPTION", +"EFFECT_SKILL_SWAP", +"EFFECT_IMPRISON", +"EFFECT_REFRESH", +"EFFECT_GRUDGE", +"EFFECT_SNATCH", +"EFFECT_LOW_KICK", +"EFFECT_SECRET_POWER", +"EFFECT_DOUBLE_EDGE", +"EFFECT_TEETER_DANCE", +"EFFECT_BLAZE_KICK", +"EFFECT_MUD_SPORT", +"EFFECT_POISON_FANG", +"EFFECT_WEATHER_BALL", +"EFFECT_OVERHEAT", +"EFFECT_TICKLE", +"EFFECT_COSMIC_POWER", +"EFFECT_SKY_UPPERCUT", +"EFFECT_BULK_UP", +"EFFECT_POISON_TAIL", +"EFFECT_WATER_SPORT", +"EFFECT_CALM_MIND", +"EFFECT_DRAGON_DANCE", +"EFFECT_CAMOUFLAGE", +] + +types = [ +"TYPE_NORMAL", +"TYPE_FIGHTING", +"TYPE_FLYING", +"TYPE_POISON", +"TYPE_GROUND", +"TYPE_ROCK", +"TYPE_BUG", +"TYPE_GHOST", +"TYPE_STEEL", +"TYPE_MYSTERY", +"TYPE_FIRE", +"TYPE_WATER", +"TYPE_GRASS", +"TYPE_ELECTRIC", +"TYPE_PSYCHIC", +"TYPE_ICE", +"TYPE_DRAGON", +"TYPE_DARK", +] + +targets = [ +"TARGET_SELECTED_POKEMON", +"TARGET_SPECIAL", +"TARGET_UNK2", +"TARGET_RANDOM", +"TARGET_BOTH_ENEMIES", +"TARGET_USER", +"TARGET_ALL_EXCEPT_USER", +"TARGET_ENEMY_SIDE", +] + +flags = [ +"F_MAKES_CONTACT", +"F_AFFECTED_BY_PROTECT", +"F_AFFECTED_BY_MAGIC_COAT", +"F_AFFECTED_BY_SNATCH", +"F_MIRROR_MOVE_COMPATIBLE", +"F_AFFECTED_BY_KINGS_ROCK", +] + +from struct import unpack + +def fast_log(x): + result = 0 + while x := (x >> 1): pass + return result + +def iter_movedesc_ptrs(rom): + for i in range(355): + yield unpack(" 0: + if f & 1: + result.append(flags[i]) + i += 1 + f >>= 1 + + return " | ".join(result) + + +if __name__ == "__main__": + rom = open("snakewood.gba", "rb") + rom.seek(0x1fb12c) + + f = open("movedata.txt", "w") + + for name, data in zip(moves, iter_movedesc_ptrs(rom)): + f.write( +f"""[{name}] = {{ + .effect = {effects[data[0]]}, + .power = {data[1]}, + .type = {types[data[2]]}, + .accuracy = {data[3]}, + .pp = {data[4]}, + .secondaryEffectChance = {data[5]}, + .target = {targets[fast_log(data[6])]}, + .priority = {data[7]}, + .flags = {get_flags(data[8])}, +}},\n\n""" +) + + f.close() + rom.close() + diff --git a/extract_move_desc.py b/extract_move_desc.py new file mode 100644 index 0000000..89d56aa --- /dev/null +++ b/extract_move_desc.py @@ -0,0 +1,396 @@ +moves = [ + "MOVE_NONE", + "MOVE_POUND", + "MOVE_KARATE_CHOP", + "MOVE_DOUBLE_SLAP", + "MOVE_COMET_PUNCH", + "MOVE_MEGA_PUNCH", + "MOVE_PAY_DAY", + "MOVE_FIRE_PUNCH", + "MOVE_ICE_PUNCH", + "MOVE_THUNDER_PUNCH", + "MOVE_SCRATCH", + "MOVE_VICE_GRIP", + "MOVE_GUILLOTINE", + "MOVE_RAZOR_WIND", + "MOVE_SWORDS_DANCE", + "MOVE_CUT", + "MOVE_GUST", + "MOVE_WING_ATTACK", + "MOVE_WHIRLWIND", + "MOVE_FLY", + "MOVE_BIND", + "MOVE_SLAM", + "MOVE_VINE_WHIP", + "MOVE_SKULLBREAKER", + "MOVE_DOUBLE_KICK", + "MOVE_MEGA_KICK", + "MOVE_JUMP_KICK", + "MOVE_ROLLING_KICK", + "MOVE_SAND_ATTACK", + "MOVE_HEADBUTT", + "MOVE_HORN_ATTACK", + "MOVE_FURY_ATTACK", + "MOVE_HORN_DRILL", + "MOVE_TACKLE", + "MOVE_BODY_SLAM", + "MOVE_WRAP", + "MOVE_TAKE_DOWN", + "MOVE_THRASH", + "MOVE_DOUBLE_EDGE", + "MOVE_TAIL_WHIP", + "MOVE_POISON_STING", + "MOVE_TWINEEDLE", + "MOVE_PIN_MISSILE", + "MOVE_LEER", + "MOVE_BITE", + "MOVE_GROWL", + "MOVE_ROAR", + "MOVE_SING", + "MOVE_SUPERSONIC", + "MOVE_SONIC_BOOM", + "MOVE_DISABLE", + "MOVE_ACID", + "MOVE_EMBER", + "MOVE_FIRE_PUMP", + "MOVE_MIST", + "MOVE_WATER_GUN", + "MOVE_STORM_SURGE", + "MOVE_SURF", + "MOVE_ICE_BEAM", + "MOVE_BLIZZARD", + "MOVE_PSYBEAM", + "MOVE_BOILINGWATER", + "MOVE_AURORA_BEAM", + "MOVE_HYPER_BEAM", + "MOVE_PECK", + "MOVE_DRILL_PECK", + "MOVE_SUBMISSION", + "MOVE_LOW_KICK", + "MOVE_COUNTER", + "MOVE_SEISMIC_TOSS", + "MOVE_STRENGTH", + "MOVE_ABSORB", + "MOVE_MEGA_DRAIN", + "MOVE_LEECH_SEED", + "MOVE_GROWTH", + "MOVE_RAZOR_LEAF", + "MOVE_SOLAR_BEAM", + "MOVE_POISON_POWDER", + "MOVE_STUN_SPORE", + "MOVE_SLEEP_POWDER", + "MOVE_PETAL_DANCE", + "MOVE_STRING_SHOT", + "MOVE_DRACO_FURY", + "MOVE_FIRE_SPIN", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_DISCHARGE", + "MOVE_ROCK_THROW", + "MOVE_EARTHQUAKE", + "MOVE_FISSURE", + "MOVE_DIG", + "MOVE_TOXIC", + "MOVE_CONFUSION", + "MOVE_PSYCHIC", + "MOVE_HYPNOSIS", + "MOVE_MEDITATE", + "MOVE_AGILITY", + "MOVE_QUICK_ATTACK", + "MOVE_RAGE", + "MOVE_TELEPORT", + "MOVE_NIGHT_SHADE", + "MOVE_MIMIC", + "MOVE_SCREECH", + "MOVE_DOUBLE_TEAM", + "MOVE_RECOVER", + "MOVE_HARDEN", + "MOVE_MINIMIZE", + "MOVE_SMOKESCREEN", + "MOVE_CONFUSE_RAY", + "MOVE_WITHDRAW", + "MOVE_DEFENSE_CURL", + "MOVE_BARRIER", + "MOVE_LIGHT_SCREEN", + "MOVE_HAZE", + "MOVE_REFLECT", + "MOVE_FOCUS_ENERGY", + "MOVE_BIDE", + "MOVE_METRONOME", + "MOVE_MIRROR_MOVE", + "MOVE_SELF_DESTRUCT", + "MOVE_EGG_BOMB", + "MOVE_LICK", + "MOVE_SMOG", + "MOVE_SLUDGE", + "MOVE_BONE_CLUB", + "MOVE_FIRE_BLAST", + "MOVE_WATERFALL", + "MOVE_CLAMP", + "MOVE_SWIFT", + "MOVE_SKULL_BASH", + "MOVE_SPIKE_CANNON", + "MOVE_CONSTRICT", + "MOVE_AMNESIA", + "MOVE_KINESIS", + "MOVE_SOFT_BOILED", + "MOVE_HI_JUMP_KICK", + "MOVE_GLARE", + "MOVE_DREAM_EATER", + "MOVE_POISON_GAS", + "MOVE_BARRAGE", + "MOVE_LEECH_LIFE", + "MOVE_LOVELY_KISS", + "MOVE_SKY_ATTACK", + "MOVE_TRANSFORM", + "MOVE_BUBBLE", + "MOVE_DIZZY_PUNCH", + "MOVE_SPORE", + "MOVE_FLASH", + "MOVE_PSYWAVE", + "MOVE_SPLASH", + "MOVE_ACID_ARMOR", + "MOVE_CRABHAMMER", + "MOVE_EXPLOSION", + "MOVE_FURY_SWIPES", + "MOVE_BONEMERANG", + "MOVE_REST", + "MOVE_ROCK_SLIDE", + "MOVE_HYPER_FANG", + "MOVE_SHARPEN", + "MOVE_CONVERSION", + "MOVE_TRI_ATTACK", + "MOVE_SUPER_FANG", + "MOVE_SLASH", + "MOVE_SUBSTITUTE", + "MOVE_STRUGGLE", + "MOVE_SKETCH", + "MOVE_TRIPLE_KICK", + "MOVE_THIEF", + "MOVE_SPIDER_WEB", + "MOVE_MIND_READER", + "MOVE_NIGHTMARE", + "MOVE_FLAME_WHEEL", + "MOVE_SNORE", + "MOVE_CURSE", + "MOVE_FLAIL", + "MOVE_CONVERSION_2", + "MOVE_AEROBLAST", + "MOVE_COTTON_SPORE", + "MOVE_REVERSAL", + "MOVE_SPITE", + "MOVE_POWDER_SNOW", + "MOVE_PROTECT", + "MOVE_MACH_PUNCH", + "MOVE_SCARY_FACE", + "MOVE_FAINT_ATTACK", + "MOVE_SWEET_KISS", + "MOVE_BELLY_DRUM", + "MOVE_SLUDGE_BOMB", + "MOVE_MUD_SLAP", + "MOVE_OCTAZOOKA", + "MOVE_SPIKES", + "MOVE_ZAP_CANNON", + "MOVE_FORESIGHT", + "MOVE_DESTINY_BOND", + "MOVE_PERISH_SONG", + "MOVE_ICEBREATH", + "MOVE_DETECT", + "MOVE_BONE_RUSH", + "MOVE_DATA_STREAM", + "MOVE_OUTRAGE", + "MOVE_SANDSTORM", + "MOVE_GIGA_DRAIN", + "MOVE_ENDURE", + "MOVE_CHARM", + "MOVE_ROLLOUT", + "MOVE_SHADOW_SWIPE", + "MOVE_SWAGGER", + "MOVE_MILK_DRINK", + "MOVE_SPARK", + "MOVE_FURY_CUTTER", + "MOVE_STEEL_WING", + "MOVE_MEAN_LOOK", + "MOVE_ATTRACT", + "MOVE_SLEEP_TALK", + "MOVE_HEAL_BELL", + "MOVE_RETURN", + "MOVE_PRESENT", + "MOVE_FRUSTRATION", + "MOVE_SAFEGUARD", + "MOVE_PAIN_SPLIT", + "MOVE_SACRED_FIRE", + "MOVE_MAGNITUDE", + "MOVE_DYNAMIC_PUNCH", + "MOVE_MEGAHORN", + "MOVE_DRAGON_BREATH", + "MOVE_BATON_PASS", + "MOVE_ENCORE", + "MOVE_PURSUIT", + "MOVE_RAPID_SPIN", + "MOVE_SWEET_SCENT", + "MOVE_IRON_TAIL", + "MOVE_METAL_CLAW", + "MOVE_VITAL_THROW", + "MOVE_MORNING_SUN", + "MOVE_SYNTHESIS", + "MOVE_MOONLIGHT", + "MOVE_HIDDEN_POWER", + "MOVE_CROSS_CHOP", + "MOVE_TWISTER", + "MOVE_RAIN_DANCE", + "MOVE_SUNNY_DAY", + "MOVE_CRUNCH", + "MOVE_MIRROR_COAT", + "MOVE_PSYCH_UP", + "MOVE_EXTREME_SPEED", + "MOVE_ANCIENT_POWER", + "MOVE_SHADOW_BALL", + "MOVE_FUTURE_SIGHT", + "MOVE_ROCK_SMASH", + "MOVE_WHIRLPOOL", + "MOVE_BEAT_UP", + "MOVE_FAKE_OUT", + "MOVE_UPROAR", + "MOVE_STOCKPILE", + "MOVE_SPIT_UP", + "MOVE_SWALLOW", + "MOVE_HEAT_WAVE", + "MOVE_HAIL", + "MOVE_TORMENT", + "MOVE_FLATTER", + "MOVE_WILL_O_WISP", + "MOVE_MEMENTO", + "MOVE_FACADE", + "MOVE_FOCUS_PUNCH", + "MOVE_SMELLING_SALT", + "MOVE_FOLLOW_ME", + "MOVE_NATURE_POWER", + "MOVE_CHARGE", + "MOVE_TAUNT", + "MOVE_HELPING_HAND", + "MOVE_TRICK", + "MOVE_ROLE_PLAY", + "MOVE_WISH", + "MOVE_ASSIST", + "MOVE_INGRAIN", + "MOVE_SUPERPOWER", + "MOVE_MAGIC_COAT", + "MOVE_RECYCLE", + "MOVE_REVENGE", + "MOVE_BRICK_BREAK", + "MOVE_YAWN", + "MOVE_KNOCK_OFF", + "MOVE_ENDEAVOR", + "MOVE_ERUPTION", + "MOVE_SKILL_SWAP", + "MOVE_IMPRISON", + "MOVE_REFRESH", + "MOVE_GRUDGE", + "MOVE_SNATCH", + "MOVE_SECRET_POWER", + "MOVE_DIVE", + "MOVE_ARM_THRUST", + "MOVE_CAMOUFLAGE", + "MOVE_BRIGHT_IDEA", + "MOVE_CRAZY_BOLT", + "MOVE_AFRO_BREAK", + "MOVE_FEATHER_DANCE", + "MOVE_TEETER_DANCE", + "MOVE_FRICTIONKICK", + "MOVE_MUD_SPORT", + "MOVE_ICE_BALL", + "MOVE_NEEDLE_ARM", + "MOVE_SLACK_OFF", + "MOVE_HYPER_VOICE", + "MOVE_POISON_FANG", + "MOVE_CRUSH_CLAW", + "MOVE_BLAST_BURN", + "MOVE_HYDRO_CANNON", + "MOVE_METEOR_MASH", + "MOVE_ASTONISH", + "MOVE_WEATHER_BALL", + "MOVE_AROMATHERAPY", + "MOVE_FAKE_TEARS", + "MOVE_AIR_CUTTER", + "MOVE_OVERHEAT", + "MOVE_ODOR_SLEUTH", + "MOVE_ROCK_TOMB", + "MOVE_SILVER_WIND", + "MOVE_METAL_SOUND", + "MOVE_GRASS_WHISTLE", + "MOVE_TICKLE", + "MOVE_COSMIC_POWER", + "MOVE_WATER_SPOUT", + "MOVE_SIGNAL_BEAM", + "MOVE_SHADOW_PUNCH", + "MOVE_EXTRASENSORY", + "MOVE_SKY_UPPERCUT", + "MOVE_SAND_TOMB", + "MOVE_SHEER_COLD", + "MOVE_MUDDY_WATER", + "MOVE_BULLET_SEED", + "MOVE_AERIAL_ACE", + "MOVE_CRYSTALSTORM", + "MOVE_IRON_DEFENSE", + "MOVE_BLOCK", + "MOVE_HOWL", + "MOVE_DRAGON_CLAW", + "MOVE_FRENZY_PLANT", + "MOVE_BULK_UP", + "MOVE_BOUNCE", + "MOVE_MUD_SHOT", + "MOVE_POISON_TAIL", + "MOVE_COVET", + "MOVE_WILD_BOLT", + "MOVE_MAGICAL_LEAF", + "MOVE_WATER_SPORT", + "MOVE_CALM_MIND", + "MOVE_LEAF_BLADE", + "MOVE_FURY_DANCE", + "MOVE_ROCK_BLAST", + "MOVE_SHOCK_WAVE", + "MOVE_WATER_PULSE", + "MOVE_PULSAR", + "MOVE_CURSE_CLAW", +] + +character_map = {} +end_char = None + +def open_charmap(): + global end_char + f = open("charmap.tbl", "r") + for line in f.readlines(): + if not line.strip(): continue + if line.startswith("/"): + end_char = int("0x" + line[1:].strip(), 16) + continue + + try: + c, r = line.split("=") + c, r = c.strip(), r[0] + + character_map[int("0x" + c, 16)] = r + except Exception as e: + print(line, e) + +def iter_movedesc_ptrs(rom): + for i in range(355 - 1): + yield hex(int.from_bytes(rom.read(4), 'little')) + + +if __name__ == "__main__": + open_charmap() + + movenames = [] + + rom = open("snakewood.gba", "rb") + rom.seek(0x3c09d8) + + for k, v in zip(moves[1:], iter_movedesc_ptrs(rom)): + print(f"[{k}] = (const u8 *){v},") + + rom.close() + diff --git a/extract_move_names.py b/extract_move_names.py new file mode 100644 index 0000000..c259d82 --- /dev/null +++ b/extract_move_names.py @@ -0,0 +1,404 @@ +moves = [ + "MOVE_NONE", + "MOVE_POUND", + "MOVE_KARATE_CHOP", + "MOVE_DOUBLE_SLAP", + "MOVE_COMET_PUNCH", + "MOVE_MEGA_PUNCH", + "MOVE_PAY_DAY", + "MOVE_FIRE_PUNCH", + "MOVE_ICE_PUNCH", + "MOVE_THUNDER_PUNCH", + "MOVE_SCRATCH", + "MOVE_VICE_GRIP", + "MOVE_GUILLOTINE", + "MOVE_RAZOR_WIND", + "MOVE_SWORDS_DANCE", + "MOVE_CUT", + "MOVE_GUST", + "MOVE_WING_ATTACK", + "MOVE_WHIRLWIND", + "MOVE_FLY", + "MOVE_BIND", + "MOVE_SLAM", + "MOVE_VINE_WHIP", + "MOVE_SKULLBREAKER", + "MOVE_DOUBLE_KICK", + "MOVE_MEGA_KICK", + "MOVE_JUMP_KICK", + "MOVE_ROLLING_KICK", + "MOVE_SAND_ATTACK", + "MOVE_HEADBUTT", + "MOVE_HORN_ATTACK", + "MOVE_FURY_ATTACK", + "MOVE_HORN_DRILL", + "MOVE_TACKLE", + "MOVE_BODY_SLAM", + "MOVE_WRAP", + "MOVE_TAKE_DOWN", + "MOVE_THRASH", + "MOVE_DOUBLE_EDGE", + "MOVE_TAIL_WHIP", + "MOVE_POISON_STING", + "MOVE_TWINEEDLE", + "MOVE_PIN_MISSILE", + "MOVE_LEER", + "MOVE_BITE", + "MOVE_GROWL", + "MOVE_ROAR", + "MOVE_SING", + "MOVE_SUPERSONIC", + "MOVE_SONIC_BOOM", + "MOVE_DISABLE", + "MOVE_ACID", + "MOVE_EMBER", + "MOVE_FIRE_PUMP", + "MOVE_MIST", + "MOVE_WATER_GUN", + "MOVE_STORM_SURGE", + "MOVE_SURF", + "MOVE_ICE_BEAM", + "MOVE_BLIZZARD", + "MOVE_PSYBEAM", + "MOVE_BOILINGWATER", + "MOVE_AURORA_BEAM", + "MOVE_HYPER_BEAM", + "MOVE_PECK", + "MOVE_DRILL_PECK", + "MOVE_SUBMISSION", + "MOVE_LOW_KICK", + "MOVE_COUNTER", + "MOVE_SEISMIC_TOSS", + "MOVE_STRENGTH", + "MOVE_ABSORB", + "MOVE_MEGA_DRAIN", + "MOVE_LEECH_SEED", + "MOVE_GROWTH", + "MOVE_RAZOR_LEAF", + "MOVE_SOLAR_BEAM", + "MOVE_POISON_POWDER", + "MOVE_STUN_SPORE", + "MOVE_SLEEP_POWDER", + "MOVE_PETAL_DANCE", + "MOVE_STRING_SHOT", + "MOVE_DRACO_FURY", + "MOVE_FIRE_SPIN", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_DISCHARGE", + "MOVE_ROCK_THROW", + "MOVE_EARTHQUAKE", + "MOVE_FISSURE", + "MOVE_DIG", + "MOVE_TOXIC", + "MOVE_CONFUSION", + "MOVE_PSYCHIC", + "MOVE_HYPNOSIS", + "MOVE_MEDITATE", + "MOVE_AGILITY", + "MOVE_QUICK_ATTACK", + "MOVE_RAGE", + "MOVE_TELEPORT", + "MOVE_NIGHT_SHADE", + "MOVE_MIMIC", + "MOVE_SCREECH", + "MOVE_DOUBLE_TEAM", + "MOVE_RECOVER", + "MOVE_HARDEN", + "MOVE_MINIMIZE", + "MOVE_SMOKESCREEN", + "MOVE_CONFUSE_RAY", + "MOVE_WITHDRAW", + "MOVE_DEFENSE_CURL", + "MOVE_BARRIER", + "MOVE_LIGHT_SCREEN", + "MOVE_HAZE", + "MOVE_REFLECT", + "MOVE_FOCUS_ENERGY", + "MOVE_BIDE", + "MOVE_METRONOME", + "MOVE_MIRROR_MOVE", + "MOVE_SELF_DESTRUCT", + "MOVE_EGG_BOMB", + "MOVE_LICK", + "MOVE_SMOG", + "MOVE_SLUDGE", + "MOVE_BONE_CLUB", + "MOVE_FIRE_BLAST", + "MOVE_WATERFALL", + "MOVE_CLAMP", + "MOVE_SWIFT", + "MOVE_SKULL_BASH", + "MOVE_SPIKE_CANNON", + "MOVE_CONSTRICT", + "MOVE_AMNESIA", + "MOVE_KINESIS", + "MOVE_SOFT_BOILED", + "MOVE_HI_JUMP_KICK", + "MOVE_GLARE", + "MOVE_DREAM_EATER", + "MOVE_POISON_GAS", + "MOVE_BARRAGE", + "MOVE_LEECH_LIFE", + "MOVE_LOVELY_KISS", + "MOVE_SKY_ATTACK", + "MOVE_TRANSFORM", + "MOVE_BUBBLE", + "MOVE_DIZZY_PUNCH", + "MOVE_SPORE", + "MOVE_FLASH", + "MOVE_PSYWAVE", + "MOVE_SPLASH", + "MOVE_ACID_ARMOR", + "MOVE_CRABHAMMER", + "MOVE_EXPLOSION", + "MOVE_FURY_SWIPES", + "MOVE_BONEMERANG", + "MOVE_REST", + "MOVE_ROCK_SLIDE", + "MOVE_HYPER_FANG", + "MOVE_SHARPEN", + "MOVE_CONVERSION", + "MOVE_TRI_ATTACK", + "MOVE_SUPER_FANG", + "MOVE_SLASH", + "MOVE_SUBSTITUTE", + "MOVE_STRUGGLE", + "MOVE_SKETCH", + "MOVE_TRIPLE_KICK", + "MOVE_THIEF", + "MOVE_SPIDER_WEB", + "MOVE_MIND_READER", + "MOVE_NIGHTMARE", + "MOVE_FLAME_WHEEL", + "MOVE_SNORE", + "MOVE_CURSE", + "MOVE_FLAIL", + "MOVE_CONVERSION_2", + "MOVE_AEROBLAST", + "MOVE_COTTON_SPORE", + "MOVE_REVERSAL", + "MOVE_SPITE", + "MOVE_POWDER_SNOW", + "MOVE_PROTECT", + "MOVE_MACH_PUNCH", + "MOVE_SCARY_FACE", + "MOVE_FAINT_ATTACK", + "MOVE_SWEET_KISS", + "MOVE_BELLY_DRUM", + "MOVE_SLUDGE_BOMB", + "MOVE_MUD_SLAP", + "MOVE_OCTAZOOKA", + "MOVE_SPIKES", + "MOVE_ZAP_CANNON", + "MOVE_FORESIGHT", + "MOVE_DESTINY_BOND", + "MOVE_PERISH_SONG", + "MOVE_ICEBREATH", + "MOVE_DETECT", + "MOVE_BONE_RUSH", + "MOVE_DATA_STREAM", + "MOVE_OUTRAGE", + "MOVE_SANDSTORM", + "MOVE_GIGA_DRAIN", + "MOVE_ENDURE", + "MOVE_CHARM", + "MOVE_ROLLOUT", + "MOVE_SHADOW_SWIPE", + "MOVE_SWAGGER", + "MOVE_MILK_DRINK", + "MOVE_SPARK", + "MOVE_FURY_CUTTER", + "MOVE_STEEL_WING", + "MOVE_MEAN_LOOK", + "MOVE_ATTRACT", + "MOVE_SLEEP_TALK", + "MOVE_HEAL_BELL", + "MOVE_RETURN", + "MOVE_PRESENT", + "MOVE_FRUSTRATION", + "MOVE_SAFEGUARD", + "MOVE_PAIN_SPLIT", + "MOVE_SACRED_FIRE", + "MOVE_MAGNITUDE", + "MOVE_DYNAMIC_PUNCH", + "MOVE_MEGAHORN", + "MOVE_DRAGON_BREATH", + "MOVE_BATON_PASS", + "MOVE_ENCORE", + "MOVE_PURSUIT", + "MOVE_RAPID_SPIN", + "MOVE_SWEET_SCENT", + "MOVE_IRON_TAIL", + "MOVE_METAL_CLAW", + "MOVE_VITAL_THROW", + "MOVE_MORNING_SUN", + "MOVE_SYNTHESIS", + "MOVE_MOONLIGHT", + "MOVE_HIDDEN_POWER", + "MOVE_CROSS_CHOP", + "MOVE_TWISTER", + "MOVE_RAIN_DANCE", + "MOVE_SUNNY_DAY", + "MOVE_CRUNCH", + "MOVE_MIRROR_COAT", + "MOVE_PSYCH_UP", + "MOVE_EXTREME_SPEED", + "MOVE_ANCIENT_POWER", + "MOVE_SHADOW_BALL", + "MOVE_FUTURE_SIGHT", + "MOVE_ROCK_SMASH", + "MOVE_WHIRLPOOL", + "MOVE_BEAT_UP", + "MOVE_FAKE_OUT", + "MOVE_UPROAR", + "MOVE_STOCKPILE", + "MOVE_SPIT_UP", + "MOVE_SWALLOW", + "MOVE_HEAT_WAVE", + "MOVE_HAIL", + "MOVE_TORMENT", + "MOVE_FLATTER", + "MOVE_WILL_O_WISP", + "MOVE_MEMENTO", + "MOVE_FACADE", + "MOVE_FOCUS_PUNCH", + "MOVE_SMELLING_SALT", + "MOVE_FOLLOW_ME", + "MOVE_NATURE_POWER", + "MOVE_CHARGE", + "MOVE_TAUNT", + "MOVE_HELPING_HAND", + "MOVE_TRICK", + "MOVE_ROLE_PLAY", + "MOVE_WISH", + "MOVE_ASSIST", + "MOVE_INGRAIN", + "MOVE_SUPERPOWER", + "MOVE_MAGIC_COAT", + "MOVE_RECYCLE", + "MOVE_REVENGE", + "MOVE_BRICK_BREAK", + "MOVE_YAWN", + "MOVE_KNOCK_OFF", + "MOVE_ENDEAVOR", + "MOVE_ERUPTION", + "MOVE_SKILL_SWAP", + "MOVE_IMPRISON", + "MOVE_REFRESH", + "MOVE_GRUDGE", + "MOVE_SNATCH", + "MOVE_SECRET_POWER", + "MOVE_DIVE", + "MOVE_ARM_THRUST", + "MOVE_CAMOUFLAGE", + "MOVE_BRIGHT_IDEA", + "MOVE_CRAZY_BOLT", + "MOVE_AFRO_BREAK", + "MOVE_FEATHER_DANCE", + "MOVE_TEETER_DANCE", + "MOVE_FRICTIONKICK", + "MOVE_MUD_SPORT", + "MOVE_ICE_BALL", + "MOVE_NEEDLE_ARM", + "MOVE_SLACK_OFF", + "MOVE_HYPER_VOICE", + "MOVE_POISON_FANG", + "MOVE_CRUSH_CLAW", + "MOVE_BLAST_BURN", + "MOVE_HYDRO_CANNON", + "MOVE_METEOR_MASH", + "MOVE_ASTONISH", + "MOVE_WEATHER_BALL", + "MOVE_AROMATHERAPY", + "MOVE_FAKE_TEARS", + "MOVE_AIR_CUTTER", + "MOVE_OVERHEAT", + "MOVE_ODOR_SLEUTH", + "MOVE_ROCK_TOMB", + "MOVE_SILVER_WIND", + "MOVE_METAL_SOUND", + "MOVE_GRASS_WHISTLE", + "MOVE_TICKLE", + "MOVE_COSMIC_POWER", + "MOVE_WATER_SPOUT", + "MOVE_SIGNAL_BEAM", + "MOVE_SHADOW_PUNCH", + "MOVE_EXTRASENSORY", + "MOVE_SKY_UPPERCUT", + "MOVE_SAND_TOMB", + "MOVE_SHEER_COLD", + "MOVE_MUDDY_WATER", + "MOVE_BULLET_SEED", + "MOVE_AERIAL_ACE", + "MOVE_CRYSTALSTORM", + "MOVE_IRON_DEFENSE", + "MOVE_BLOCK", + "MOVE_HOWL", + "MOVE_DRAGON_CLAW", + "MOVE_FRENZY_PLANT", + "MOVE_BULK_UP", + "MOVE_BOUNCE", + "MOVE_MUD_SHOT", + "MOVE_POISON_TAIL", + "MOVE_COVET", + "MOVE_WILD_BOLT", + "MOVE_MAGICAL_LEAF", + "MOVE_WATER_SPORT", + "MOVE_CALM_MIND", + "MOVE_LEAF_BLADE", + "MOVE_FURY_DANCE", + "MOVE_ROCK_BLAST", + "MOVE_SHOCK_WAVE", + "MOVE_WATER_PULSE", + "MOVE_PULSAR", + "MOVE_CURSE_CLAW", +] + +character_map = {} +end_char = None + +def open_charmap(): + global end_char + f = open("charmap.tbl", "r") + for line in f.readlines(): + if not line.strip(): continue + if line.startswith("/"): + end_char = int("0x" + line[1:].strip(), 16) + continue + + try: + c, r = line.split("=") + c, r = c.strip(), r[0] + + character_map[int("0x" + c, 16)] = r + except Exception as e: + print(line, e) + +def iter_moves(rom): + for i in range(355): + raw_movename = rom.read(13) + movename = "" + + for j in raw_movename: + if j in character_map: + movename += character_map[j] + if j == end_char: + break + + yield movename + +if __name__ == "__main__": + open_charmap() + + movenames = [] + + rom = open("snakewood.gba", "rb") + rom.seek(0x1F8320) + + for k, v in zip(moves, iter_moves(rom)): + print(f"[{k}] = _(\"{v}\"),") + + rom.close() + diff --git a/include/debug.h b/include/debug.h new file mode 100644 index 0000000..15adcc4 --- /dev/null +++ b/include/debug.h @@ -0,0 +1,24 @@ +#pragma once + +#define MGBA_LOG_FATAL (0) +#define MGBA_LOG_ERROR (1) +#define MGBA_LOG_WARN (2) +#define MGBA_LOG_INFO (3) +#define MGBA_LOG_DEBUG (4) + +#define LOG_HANDLER LOG_HANDLER_MGBA_PRINT + +bool32 MgbaOpen(void); +void MgbaClose(void); +void MgbaPrintf(s32 level, const char *pBuf, ...); +void MgbaAssert(const char *pFile, s32 nLine, const char *pExpression, bool32 nStopProgram); + +#define DebugPrintf(pBuf, ...) MgbaPrintf(MGBA_LOG_INFO, pBuf, ## __VA_ARGS__) +#define DebugAssert(pFile, nLine, pExpression, nStopProgram) MgbaAssert(pFile, nLine, pExpression, nStopProgram) +#define DebugPrintfLevel(level, pBuf, ...) MgbaPrintf(level, pBuf, ## __VA_ARGS__) + +#define AGB_ASSERT(exp) (exp) ? ((void*)0) : DebugAssert(__FILE__, __LINE__, #exp, TRUE) +#define AGB_WARNING(exp) (exp) ? ((void*)0) : DebugAssert(__FILE__, __LINE__, #exp, FALSE) + +#define AGB_WARNING_EX(exp, file, line) (exp) ? ((void *)0) : DebugAssert(file, line, #exp, FALSE); +#define AGB_ASSERT_EX(exp, file, line) (exp) ? ((void *)0) : DebugAssert(file, line, #exp, TRUE); diff --git a/include/mini_printf.h b/include/mini_printf.h new file mode 100644 index 0000000..7f682c9 --- /dev/null +++ b/include/mini_printf.h @@ -0,0 +1,51 @@ +/* + * The Minimal snprintf() implementation + * + * Copyright (c) 2013 Michal Ludvig + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the auhor nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Courtey of https://github.com/mludvig/mini-printf + * stripped to reduce file size for agb needs + */ + +#ifndef __MINI_PRINTF__ +#define __MINI_PRINTF__ + +#include + +#ifdef NDEBUG + +#define mini_vsnprintf(buffer, buffer_len, fmt, va) +#define mini_vpprintf(buf, fmt, va) + +#else + +s32 LONG_CALL mini_vsnprintf(char* buffer, u32 buffer_len, const char *fmt, va_list va); +s32 LONG_CALL mini_vpprintf(void* buf, const char *fmt, va_list va); + +#endif +#endif \ No newline at end of file diff --git a/include/pokemon.h b/include/pokemon.h index bfede84..7aad4bf 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -25,6 +25,7 @@ struct PACKED BattleMove u8 target; s8 priority; u8 flags; + u8 unk0[3]; }; struct ContestMove @@ -144,7 +145,6 @@ struct BattlePokemon extern struct Pokemon gPlayerParty[PARTY_SIZE]; extern const struct ContestMove gContestMoves[]; -extern const struct BattleMove gBattleMoves[]; u32 LONG_CALL CanMonLearnTMHM(struct Pokemon *mon, u8 tm); bool8 LONG_CALL MonKnowsMove(struct Pokemon *mon, u16 move); @@ -179,4 +179,9 @@ enum extern const s8 gNatureStatTable[25][5]; extern const u8 *const gNatureNames[25]; extern const struct BaseStats gBaseStats[]; -extern const u8 gAbilityNames[][13]; \ No newline at end of file +extern const u8 gAbilityNames[][13]; + +extern const u8 gMoveNames[][13]; +extern const u8 *const gMoveDescriptions[]; +extern const u8 gBattleMoveSplit[]; +extern const struct BattleMove gBattleMoves[]; \ No newline at end of file diff --git a/include/text.h b/include/text.h index 6e7df6f..eb8ce01 100644 --- a/include/text.h +++ b/include/text.h @@ -3,7 +3,24 @@ #define CHAR_SPACE 0x00 #define CHAR_LV 0x34 #define CHAR_SONG_WORD_SEPARATOR 0x37 // separates words in the bard song. Not sure if it's used for anything else + +#define CHAR_PERCENT 0x5B +#define CHAR_LEFT_PAREN 0x5C +#define CHAR_RIGHT_PAREN 0x5D + +#define CHAR_LESS_THAN 0x85 +#define CHAR_GREATER_THAN 0x86 + #define CHAR_0 0xA1 +#define CHAR_1 0xA2 +#define CHAR_2 0xA3 +#define CHAR_3 0xA4 +#define CHAR_4 0xA5 +#define CHAR_5 0xA6 +#define CHAR_6 0xA7 +#define CHAR_7 0xA8 +#define CHAR_8 0xA9 +#define CHAR_9 0xAA #define CHAR_EXCL_MARK 0xAB #define CHAR_QUESTION_MARK 0xAC #define CHAR_PERIOD 0xAD @@ -120,7 +137,6 @@ #define EXT_CTRL_CODE_ENG 0x16 extern u16 gBGTilemapBuffers[4][0x400]; -extern const u8 gMoveNames[][13]; extern u8 gStringVar1[0x100]; extern u8 gStringVar2[0x100]; diff --git a/linker.ld b/linker.ld index b3e235d..398d956 100644 --- a/linker.ld +++ b/linker.ld @@ -23,6 +23,7 @@ SECTIONS { ALIGN(4) { *(.rodata); + *(.rodata.str1.4); } > rom = 0xff .script_data : diff --git a/linker/rodata.ld b/linker/rodata.ld index 2c4c724..bde6281 100644 --- a/linker/rodata.ld +++ b/linker/rodata.ld @@ -6,10 +6,10 @@ gMenuTextWindowTemplate = 0x81e6ce4; gMonFrontPicCoords = 0x81e7c74; gMonFrontPicTable = 0x81e8354; gMonPaletteTable = 0x81ea5b4; -gMoveNames = 0x81f8320; +/* gMoveNames = 0x81f8320; */ gTypeNames = 0x81f9870; gMonSpriteGfx_Sprite_ptr = 0x81faf4c; -gBattleMoves = 0x81fb12c; +/* gBattleMoves = 0x81fb12c; */ gNatureStatTable = 0x81fd070; gHoldEffectToType = 0x8208263; gFieldEffectObjectTemplatePointers = 0x836dfc0; diff --git a/main.asm b/main.asm index 8b426b7..8d7e87f 100644 --- a/main.asm +++ b/main.asm @@ -62,6 +62,7 @@ .include "scripts/hm_system.asm" .include "scripts/more_exp.asm" .include "scripts/nature_changer.asm" +.include "scripts/new_moves.asm" .include "scripts/new_title_screen.asm" .include "scripts/ow_shadows.asm" .include "scripts/ps_split.asm" diff --git a/retrieve_repoints.py b/retrieve_repoints.py new file mode 100644 index 0000000..7248d7c --- /dev/null +++ b/retrieve_repoints.py @@ -0,0 +1,35 @@ +offsetNames = { +} + +offsetsToCheck = [ +] + +def add_offset_to_check(name: str, offset: int): + offsetsToCheck.append(offset) + offsetNames[offset] = name + +def convert_to_pointer(b): + return int.from_bytes(b, "little") + +if __name__ == "__main__": + add_offset_to_check("gBattleMoves", 0x81fb12c) + add_offset_to_check("gMoveNames", 0x81f8320) + add_offset_to_check("gBattleAnims_Moves", 0x81c7168) + add_offset_to_check("gMoveDescriptions", 0x83c09d8) + + rom = open("snakewood.gba", "rb") + rom.seek(192) + + result = { } + + while data := rom.read(4): + offset = convert_to_pointer(data) + if offset in offsetsToCheck: + result.setdefault(offsetNames[offset], []).append(hex(0x8000000 + rom.tell() - 4)) + + # print(result) + for sym, offsets in result.items(): + for off in offsets: + print(f".org {off} :: .word {sym}") + + rom.close() \ No newline at end of file diff --git a/scripts/new_moves.asm b/scripts/new_moves.asm new file mode 100644 index 0000000..6899a00 --- /dev/null +++ b/scripts/new_moves.asm @@ -0,0 +1,177 @@ +.org 0x800ca54 :: .word gBattleMoves +.org 0x8010cf4 :: .word gBattleMoves +.org 0x8010f24 :: .word gBattleMoves +.org 0x8013380 :: .word gBattleMoves +.org 0x8014324 :: .word gBattleMoves +.org 0x8014460 :: .word gBattleMoves +.org 0x80145b4 :: .word gBattleMoves +.org 0x80146e8 :: .word gBattleMoves +.org 0x80159d4 :: .word gBattleMoves +.org 0x8015c88 :: .word gBattleMoves +.org 0x8017984 :: .word gBattleMoves +.org 0x8017bfc :: .word gBattleMoves +.org 0x8017ff4 :: .word gBattleMoves +.org 0x80184c0 :: .word gBattleMoves +.org 0x8018b28 :: .word gBattleMoves +.org 0x8018b80 :: .word gBattleMoves +.org 0x8018e78 :: .word gBattleMoves +.org 0x8018f44 :: .word gBattleMoves +.org 0x8019038 :: .word gBattleMoves +.org 0x8019114 :: .word gBattleMoves +.org 0x80191f0 :: .word gBattleMoves +.org 0x80192c4 :: .word gBattleMoves +.org 0x8019430 :: .word gBattleMoves +.org 0x801b320 :: .word gBattleMoves +.org 0x801b5fc :: .word gBattleMoves +.org 0x801b800 :: .word gBattleMoves +.org 0x801be24 :: .word gBattleMoves +.org 0x801bec0 :: .word gBattleMoves +.org 0x801bf80 :: .word gBattleMoves +.org 0x801c0e8 :: .word gBattleMoves +.org 0x801c164 :: .word gBattleMoves +.org 0x801c2ac :: .word gBattleMoves +.org 0x801c3f8 :: .word gBattleMoves +.org 0x801c570 :: .word gBattleMoves +.org 0x801c618 :: .word gBattleMoves +.org 0x801c6f8 :: .word gBattleMoves +.org 0x801c948 :: .word gBattleMoves +.org 0x801caec :: .word gBattleMoves +.org 0x801cbe4 :: .word gBattleMoves +.org 0x801cc6c :: .word gBattleMoves +.org 0x801ccac :: .word gBattleMoves +.org 0x801cd94 :: .word gBattleMoves +.org 0x801cf20 :: .word gBattleMoves +.org 0x801cf84 :: .word gBattleMoves +.org 0x801d1bc :: .word gBattleMoves +.org 0x801d240 :: .word gBattleMoves +.org 0x801d270 :: .word gBattleMoves +.org 0x801d31c :: .word gBattleMoves +.org 0x801d458 :: .word gBattleMoves +.org 0x801d4c0 :: .word gBattleMoves +.org 0x801d570 :: .word gBattleMoves +.org 0x801d704 :: .word gBattleMoves +.org 0x801da0c :: .word gBattleMoves +.org 0x801dc1c :: .word gBattleMoves +.org 0x801f648 :: .word gBattleMoves +.org 0x801f680 :: .word gBattleMoves +.org 0x80218d8 :: .word gBattleMoves +.org 0x8021a1c :: .word gBattleMoves +.org 0x8021f40 :: .word gBattleMoves +.org 0x802213c :: .word gBattleMoves +.org 0x80222c0 :: .word gBattleMoves +.org 0x8022340 :: .word gBattleMoves +.org 0x8022510 :: .word gBattleMoves +.org 0x8022770 :: .word gBattleMoves +.org 0x8024420 :: .word gBattleMoves +.org 0x80247f8 :: .word gBattleMoves +.org 0x8025214 :: .word gBattleMoves +.org 0x8025614 :: .word gBattleMoves +.org 0x80256a0 :: .word gBattleMoves +.org 0x8026928 :: .word gBattleMoves +.org 0x80269cc :: .word gBattleMoves +.org 0x8026ce4 :: .word gBattleMoves +.org 0x8027598 :: .word gBattleMoves +.org 0x8027810 :: .word gBattleMoves +.org 0x8027958 :: .word gBattleMoves +.org 0x8028310 :: .word gBattleMoves +.org 0x8028380 :: .word gBattleMoves +.org 0x802840c :: .word gBattleMoves +.org 0x8028e58 :: .word gBattleMoves +.org 0x8028f70 :: .word gBattleMoves +.org 0x8028fa8 :: .word gBattleMoves +.org 0x8029bf8 :: .word gBattleMoves +.org 0x8029fbc :: .word gBattleMoves +.org 0x802a7e8 :: .word gBattleMoves +.org 0x802b144 :: .word gBattleMoves +.org 0x802c530 :: .word gBattleMoves +.org 0x802c670 :: .word gBattleMoves +.org 0x802c714 :: .word gBattleMoves +.org 0x802e3a0 :: .word gBattleMoves +.org 0x80354e8 :: .word gBattleMoves +.org 0x8035534 :: .word gBattleMoves +.org 0x8036288 :: .word gBattleMoves +.org 0x80362d4 :: .word gBattleMoves +.org 0x80364a4 :: .word gBattleMoves +.org 0x8036740 :: .word gBattleMoves +.org 0x803702c :: .word gBattleMoves +.org 0x803b68c :: .word gBattleMoves +.org 0x803b710 :: .word gBattleMoves +.org 0x803b97c :: .word gBattleMoves +.org 0x803ba28 :: .word gBattleMoves +.org 0x803ba7c :: .word gBattleMoves +.org 0x803baa0 :: .word gBattleMoves +.org 0x803bfec :: .word gBattleMoves +.org 0x803c14c :: .word gBattleMoves +.org 0x803c2a8 :: .word gBattleMoves +.org 0x803de2c :: .word gBattleMoves +.org 0x80a01e4 :: .word gBattleMoves +.org 0x80a02e0 :: .word gBattleMoves +.org 0x80a038c :: .word gBattleMoves +.org 0x80a0508 :: .word gBattleMoves +.org 0x80a0554 :: .word gBattleMoves +.org 0x80b29d4 :: .word gBattleMoves +.org 0x810803c :: .word gBattleMoves +.org 0x81080ac :: .word gBattleMoves +.org 0x81081c8 :: .word gBattleMoves +.org 0x81081ec :: .word gBattleMoves +.org 0x8108330 :: .word gBattleMoves +.org 0x8108668 :: .word gBattleMoves +.org 0x8108b7c :: .word gBattleMoves +.org 0x8108bc4 :: .word gBattleMoves +.org 0x8108e1c :: .word gBattleMoves +.org 0x8108ef8 :: .word gBattleMoves +.org 0x8109154 :: .word gBattleMoves +.org 0x81091c8 :: .word gBattleMoves +.org 0x8109254 :: .word gBattleMoves +.org 0x81092a4 :: .word gBattleMoves +.org 0x8109624 :: .word gBattleMoves +.org 0x810964c :: .word gBattleMoves +.org 0x8109674 :: .word gBattleMoves +.org 0x813383c :: .word gBattleMoves +.org 0x81339a0 :: .word gBattleMoves +.org 0x81339c4 :: .word gBattleMoves +.org 0x802e18c :: .word gMoveNames +.org 0x804a3ec :: .word gMoveNames +.org 0x8067500 :: .word gMoveNames +.org 0x806f120 :: .word gMoveNames +.org 0x806f23c :: .word gMoveNames +.org 0x806f52c :: .word gMoveNames +.org 0x806f604 :: .word gMoveNames +.org 0x806f668 :: .word gMoveNames +.org 0x806f71c :: .word gMoveNames +.org 0x806f7a4 :: .word gMoveNames +.org 0x8070370 :: .word gMoveNames +.org 0x8070614 :: .word gMoveNames +.org 0x8070bc8 :: .word gMoveNames +.org 0x8070c40 :: .word gMoveNames +.org 0x8070d14 :: .word gMoveNames +.org 0x8070d7c :: .word gMoveNames +.org 0x80a0294 :: .word gMoveNames +.org 0x80a0328 :: .word gMoveNames +.org 0x80a0384 :: .word gMoveNames +.org 0x80a462c :: .word gMoveNames +.org 0x80a46f4 :: .word gMoveNames +.org 0x80aa5b4 :: .word gMoveNames +.org 0x80abe7c :: .word gMoveNames +.org 0x80ac69c :: .word gMoveNames +.org 0x80ad200 :: .word gMoveNames +.org 0x80ad5bc :: .word gMoveNames +.org 0x80ad6c4 :: .word gMoveNames +.org 0x80af274 :: .word gMoveNames +.org 0x80b14d8 :: .word gMoveNames +.org 0x80c0b28 :: .word gMoveNames +.org 0x80c1da0 :: .word gMoveNames +.org 0x80c9f70 :: .word gMoveNames +.org 0x80eb28c :: .word gMoveNames +.org 0x80eb340 :: .word gMoveNames +.org 0x80eb464 :: .word gMoveNames +.org 0x80eb62c :: .word gMoveNames +.org 0x80f9fd8 :: .word gMoveNames +.org 0x8120e48 :: .word gMoveNames +.org 0x812165c :: .word gMoveNames +.org 0x8121b50 :: .word gMoveNames +.org 0x8132f44 :: .word gMoveNames +.org 0x8133600 :: .word gMoveNames +.org 0x8075734 :: .word gBattleAnims_Moves +.org 0x80a0494 :: .word gMoveDescriptions +.org 0x8133c00 :: .word gMoveDescriptions \ No newline at end of file diff --git a/src/data/moves/battle.c b/src/data/moves/battle.c new file mode 100644 index 0000000..de23eb0 --- /dev/null +++ b/src/data/moves/battle.c @@ -0,0 +1,4268 @@ +#include "types.h" +#include "constants/battle.h" +#include "pokemon.h" +#include "constants/move_effects.h" +#include "constants/moves.h" +#include "constants/pokemon.h" + +const struct BattleMove gBattleMoves[] = { + [MOVE_NONE] = { + .effect = EFFECT_HIT, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 0, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = 0, + }, + + [MOVE_POUND] = { + .effect = EFFECT_HIT, + .power = 40, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 35, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_KARATE_CHOP] = { + .effect = EFFECT_HIGH_CRITICAL, + .power = 50, + .type = TYPE_FIGHTING, + .accuracy = 100, + .pp = 25, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_DOUBLE_SLAP] = { + .effect = EFFECT_MULTI_HIT, + .power = 15, + .type = TYPE_NORMAL, + .accuracy = 85, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_COMET_PUNCH] = { + .effect = EFFECT_MULTI_HIT, + .power = 18, + .type = TYPE_NORMAL, + .accuracy = 85, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_MEGA_PUNCH] = { + .effect = EFFECT_HIT, + .power = 80, + .type = TYPE_NORMAL, + .accuracy = 85, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_PAY_DAY] = { + .effect = EFFECT_PAY_DAY, + .power = 40, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 100, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_FIRE_PUNCH] = { + .effect = EFFECT_BURN_HIT, + .power = 75, + .type = TYPE_FIRE, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 10, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_ICE_PUNCH] = { + .effect = EFFECT_FREEZE_HIT, + .power = 75, + .type = TYPE_ICE, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 10, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_THUNDER_PUNCH] = { + .effect = EFFECT_PARALYZE_HIT, + .power = 75, + .type = TYPE_ELECTRIC, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 10, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_SCRATCH] = { + .effect = EFFECT_HIT, + .power = 40, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 35, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_VICE_GRIP] = { + .effect = EFFECT_HIT, + .power = 55, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 30, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_GUILLOTINE] = { + .effect = EFFECT_OHKO, + .power = 1, + .type = TYPE_NORMAL, + .accuracy = 30, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_RAZOR_WIND] = { + .effect = EFFECT_RAZOR_WIND, + .power = 80, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_SWORDS_DANCE] = { + .effect = EFFECT_ATTACK_UP_2, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 30, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_CUT] = { + .effect = EFFECT_ATTACK_UP_HIT, + .power = 65, + .type = TYPE_NORMAL, + .accuracy = 95, + .pp = 30, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_GUST] = { + .effect = EFFECT_GUST, + .power = 40, + .type = TYPE_FLYING, + .accuracy = 100, + .pp = 35, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_WING_ATTACK] = { + .effect = EFFECT_HIT, + .power = 60, + .type = TYPE_FLYING, + .accuracy = 100, + .pp = 35, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_WHIRLWIND] = { + .effect = EFFECT_ROAR, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = -6, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_FLY] = { + .effect = EFFECT_FLY, + .power = 70, + .type = TYPE_FLYING, + .accuracy = 95, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_BIND] = { + .effect = EFFECT_TRAP, + .power = 15, + .type = TYPE_NORMAL, + .accuracy = 75, + .pp = 20, + .secondaryEffectChance = 100, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_SLAM] = { + .effect = EFFECT_HIT, + .power = 80, + .type = TYPE_NORMAL, + .accuracy = 75, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_VINE_WHIP] = { + .effect = EFFECT_HIT, + .power = 35, + .type = TYPE_GRASS, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_SKULLBREAKER] = { + .effect = EFFECT_PARALYZE_HIT, + .power = 85, + .type = TYPE_FIGHTING, + .accuracy = 85, + .pp = 10, + .secondaryEffectChance = 40, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_DOUBLE_KICK] = { + .effect = EFFECT_DOUBLE_HIT, + .power = 30, + .type = TYPE_FIGHTING, + .accuracy = 100, + .pp = 30, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_MEGA_KICK] = { + .effect = EFFECT_HIT, + .power = 120, + .type = TYPE_NORMAL, + .accuracy = 75, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_JUMP_KICK] = { + .effect = EFFECT_RECOIL_IF_MISS, + .power = 70, + .type = TYPE_FIGHTING, + .accuracy = 95, + .pp = 25, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_ROLLING_KICK] = { + .effect = EFFECT_FLINCH_HIT, + .power = 60, + .type = TYPE_FIGHTING, + .accuracy = 85, + .pp = 15, + .secondaryEffectChance = 30, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_SAND_ATTACK] = { + .effect = EFFECT_ACCURACY_DOWN, + .power = 0, + .type = TYPE_GROUND, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_HEADBUTT] = { + .effect = EFFECT_FLINCH_HIT, + .power = 70, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 30, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_HORN_ATTACK] = { + .effect = EFFECT_HIT, + .power = 65, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 25, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_FURY_ATTACK] = { + .effect = EFFECT_MULTI_HIT, + .power = 15, + .type = TYPE_NORMAL, + .accuracy = 85, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_HORN_DRILL] = { + .effect = EFFECT_OHKO, + .power = 1, + .type = TYPE_NORMAL, + .accuracy = 30, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_TACKLE] = { + .effect = EFFECT_HIT, + .power = 35, + .type = TYPE_NORMAL, + .accuracy = 95, + .pp = 35, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_BODY_SLAM] = { + .effect = EFFECT_PARALYZE_HIT, + .power = 85, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 30, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_WRAP] = { + .effect = EFFECT_TRAP, + .power = 15, + .type = TYPE_NORMAL, + .accuracy = 85, + .pp = 20, + .secondaryEffectChance = 100, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_TAKE_DOWN] = { + .effect = EFFECT_RECOIL, + .power = 90, + .type = TYPE_NORMAL, + .accuracy = 85, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_THRASH] = { + .effect = EFFECT_RAMPAGE, + .power = 90, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 100, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_DOUBLE_EDGE] = { + .effect = EFFECT_DOUBLE_EDGE, + .power = 120, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_TAIL_WHIP] = { + .effect = EFFECT_DEFENSE_DOWN, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 30, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_POISON_STING] = { + .effect = EFFECT_POISON_HIT, + .power = 15, + .type = TYPE_POISON, + .accuracy = 100, + .pp = 35, + .secondaryEffectChance = 30, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_TWINEEDLE] = { + .effect = EFFECT_TWINEEDLE, + .power = 25, + .type = TYPE_BUG, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 20, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_PIN_MISSILE] = { + .effect = EFFECT_MULTI_HIT, + .power = 14, + .type = TYPE_BUG, + .accuracy = 85, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_LEER] = { + .effect = EFFECT_DEFENSE_DOWN, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 30, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_BITE] = { + .effect = EFFECT_FLINCH_HIT, + .power = 60, + .type = TYPE_DARK, + .accuracy = 100, + .pp = 25, + .secondaryEffectChance = 30, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_GROWL] = { + .effect = EFFECT_ATTACK_DOWN, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 40, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_ROAR] = { + .effect = EFFECT_ROAR, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = -6, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_SING] = { + .effect = EFFECT_SLEEP, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 55, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_SUPERSONIC] = { + .effect = EFFECT_CONFUSE, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 55, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_SONIC_BOOM] = { + .effect = EFFECT_SONICBOOM, + .power = 1, + .type = TYPE_NORMAL, + .accuracy = 90, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_DISABLE] = { + .effect = EFFECT_DISABLE, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 55, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_ACID] = { + .effect = EFFECT_DEFENSE_DOWN_HIT, + .power = 40, + .type = TYPE_POISON, + .accuracy = 100, + .pp = 30, + .secondaryEffectChance = 10, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_EMBER] = { + .effect = EFFECT_BURN_HIT, + .power = 40, + .type = TYPE_FIRE, + .accuracy = 100, + .pp = 25, + .secondaryEffectChance = 10, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_FIRE_PUMP] = { + .effect = EFFECT_BURN_HIT, + .power = 90, + .type = TYPE_FIRE, + .accuracy = 100, + .pp = 8, + .secondaryEffectChance = 40, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_MIST] = { + .effect = EFFECT_MIST, + .power = 0, + .type = TYPE_ICE, + .accuracy = 0, + .pp = 30, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_WATER_GUN] = { + .effect = EFFECT_HIT, + .power = 40, + .type = TYPE_WATER, + .accuracy = 100, + .pp = 25, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_STORM_SURGE] = { + .effect = EFFECT_HIT, + .power = 120, + .type = TYPE_WATER, + .accuracy = 80, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_SURF] = { + .effect = EFFECT_HIT, + .power = 95, + .type = TYPE_WATER, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_ICE_BEAM] = { + .effect = EFFECT_FREEZE_HIT, + .power = 95, + .type = TYPE_ICE, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 10, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_BLIZZARD] = { + .effect = EFFECT_FREEZE_HIT, + .power = 120, + .type = TYPE_ICE, + .accuracy = 70, + .pp = 5, + .secondaryEffectChance = 10, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_PSYBEAM] = { + .effect = EFFECT_CONFUSE_HIT, + .power = 65, + .type = TYPE_PSYCHIC, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 10, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_BOILINGWATER] = { + .effect = EFFECT_BURN_HIT, + .power = 20, + .type = TYPE_WATER, + .accuracy = 90, + .pp = 15, + .secondaryEffectChance = 50, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_AURORA_BEAM] = { + .effect = EFFECT_ATTACK_DOWN_HIT, + .power = 65, + .type = TYPE_ICE, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 10, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_HYPER_BEAM] = { + .effect = EFFECT_RECHARGE, + .power = 150, + .type = TYPE_NORMAL, + .accuracy = 90, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_PECK] = { + .effect = EFFECT_HIT, + .power = 35, + .type = TYPE_FLYING, + .accuracy = 100, + .pp = 35, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_DRILL_PECK] = { + .effect = EFFECT_HIT, + .power = 80, + .type = TYPE_FLYING, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_SUBMISSION] = { + .effect = EFFECT_RECOIL, + .power = 80, + .type = TYPE_FIGHTING, + .accuracy = 80, + .pp = 25, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_LOW_KICK] = { + .effect = EFFECT_LOW_KICK, + .power = 1, + .type = TYPE_FIGHTING, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_COUNTER] = { + .effect = EFFECT_COUNTER, + .power = 1, + .type = TYPE_FIGHTING, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = -5, + .flags = F_MAKES_CONTACT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_SEISMIC_TOSS] = { + .effect = EFFECT_LEVEL_DAMAGE, + .power = 1, + .type = TYPE_FIGHTING, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_STRENGTH] = { + .effect = EFFECT_RECHARGE, + .power = 150, + .type = TYPE_NORMAL, + .accuracy = 90, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_ABSORB] = { + .effect = EFFECT_ABSORB, + .power = 20, + .type = TYPE_GRASS, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_MEGA_DRAIN] = { + .effect = EFFECT_ABSORB, + .power = 40, + .type = TYPE_GRASS, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_LEECH_SEED] = { + .effect = EFFECT_LEECH_SEED, + .power = 0, + .type = TYPE_GRASS, + .accuracy = 90, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_GROWTH] = { + .effect = EFFECT_SPECIAL_ATTACK_UP, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 40, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_RAZOR_LEAF] = { + .effect = EFFECT_HIGH_CRITICAL, + .power = 55, + .type = TYPE_GRASS, + .accuracy = 95, + .pp = 25, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_SOLAR_BEAM] = { + .effect = EFFECT_SOLARBEAM, + .power = 120, + .type = TYPE_GRASS, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_POISON_POWDER] = { + .effect = EFFECT_POISON, + .power = 0, + .type = TYPE_POISON, + .accuracy = 75, + .pp = 35, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_STUN_SPORE] = { + .effect = EFFECT_PARALYZE, + .power = 0, + .type = TYPE_GRASS, + .accuracy = 75, + .pp = 30, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_SLEEP_POWDER] = { + .effect = EFFECT_SLEEP, + .power = 0, + .type = TYPE_GRASS, + .accuracy = 75, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_PETAL_DANCE] = { + .effect = EFFECT_RAMPAGE, + .power = 70, + .type = TYPE_GRASS, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 100, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_STRING_SHOT] = { + .effect = EFFECT_SPEED_DOWN, + .power = 0, + .type = TYPE_BUG, + .accuracy = 95, + .pp = 40, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_DRACO_FURY] = { + .effect = EFFECT_DRAGON_RAGE, + .power = 1, + .type = TYPE_DRAGON, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_FIRE_SPIN] = { + .effect = EFFECT_TRAP, + .power = 15, + .type = TYPE_FIRE, + .accuracy = 70, + .pp = 15, + .secondaryEffectChance = 100, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_THUNDER_SHOCK] = { + .effect = EFFECT_PARALYZE_HIT, + .power = 40, + .type = TYPE_ELECTRIC, + .accuracy = 100, + .pp = 30, + .secondaryEffectChance = 10, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_THUNDERBOLT] = { + .effect = EFFECT_PARALYZE_HIT, + .power = 95, + .type = TYPE_ELECTRIC, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 10, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_THUNDER_WAVE] = { + .effect = EFFECT_PARALYZE, + .power = 0, + .type = TYPE_ELECTRIC, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_DISCHARGE] = { + .effect = EFFECT_PARALYZE_HIT, + .power = 80, + .type = TYPE_ELECTRIC, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 30, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_ROCK_THROW] = { + .effect = EFFECT_HIT, + .power = 50, + .type = TYPE_ROCK, + .accuracy = 90, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_EARTHQUAKE] = { + .effect = EFFECT_EARTHQUAKE, + .power = 100, + .type = TYPE_GROUND, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_FISSURE] = { + .effect = EFFECT_OHKO, + .power = 1, + .type = TYPE_GROUND, + .accuracy = 30, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_DIG] = { + .effect = EFFECT_FLY, + .power = 60, + .type = TYPE_GROUND, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_TOXIC] = { + .effect = EFFECT_TOXIC, + .power = 0, + .type = TYPE_POISON, + .accuracy = 85, + .pp = 10, + .secondaryEffectChance = 100, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_CONFUSION] = { + .effect = EFFECT_CONFUSE_HIT, + .power = 50, + .type = TYPE_PSYCHIC, + .accuracy = 100, + .pp = 25, + .secondaryEffectChance = 10, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_PSYCHIC] = { + .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, + .power = 90, + .type = TYPE_PSYCHIC, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 10, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_HYPNOSIS] = { + .effect = EFFECT_SLEEP, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 60, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_MEDITATE] = { + .effect = EFFECT_ATTACK_UP, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 40, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_AGILITY] = { + .effect = EFFECT_SPEED_UP_2, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 30, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_QUICK_ATTACK] = { + .effect = EFFECT_QUICK_ATTACK, + .power = 40, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 30, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 1, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_RAGE] = { + .effect = EFFECT_RAGE, + .power = 20, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_TELEPORT] = { + .effect = EFFECT_TELEPORT, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = 0, + }, + + [MOVE_NIGHT_SHADE] = { + .effect = EFFECT_LEVEL_DAMAGE, + .power = 1, + .type = TYPE_GHOST, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_MIMIC] = { + .effect = EFFECT_MIMIC, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT, + }, + + [MOVE_SCREECH] = { + .effect = EFFECT_DEFENSE_DOWN_2, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 85, + .pp = 40, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_DOUBLE_TEAM] = { + .effect = EFFECT_EVASION_UP, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_RECOVER] = { + .effect = EFFECT_RESTORE_HP, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_HARDEN] = { + .effect = EFFECT_DEFENSE_UP, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 30, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_MINIMIZE] = { + .effect = EFFECT_MINIMIZE, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_SMOKESCREEN] = { + .effect = EFFECT_ACCURACY_DOWN, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_CONFUSE_RAY] = { + .effect = EFFECT_CONFUSE, + .power = 0, + .type = TYPE_GHOST, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_WITHDRAW] = { + .effect = EFFECT_DEFENSE_UP, + .power = 0, + .type = TYPE_WATER, + .accuracy = 0, + .pp = 40, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_DEFENSE_CURL] = { + .effect = EFFECT_DEFENSE_CURL, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 40, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_BARRIER] = { + .effect = EFFECT_DEFENSE_UP_2, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 30, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_LIGHT_SCREEN] = { + .effect = EFFECT_LIGHT_SCREEN, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 30, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_HAZE] = { + .effect = EFFECT_HAZE, + .power = 0, + .type = TYPE_ICE, + .accuracy = 0, + .pp = 30, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT, + }, + + [MOVE_REFLECT] = { + .effect = EFFECT_REFLECT, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_FOCUS_ENERGY] = { + .effect = EFFECT_FOCUS_ENERGY, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 30, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_BIDE] = { + .effect = EFFECT_BIDE, + .power = 1, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_METRONOME] = { + .effect = EFFECT_METRONOME, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = 0, + }, + + [MOVE_MIRROR_MOVE] = { + .effect = EFFECT_MIRROR_MOVE, + .power = 0, + .type = TYPE_FLYING, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = 0, + }, + + [MOVE_SELF_DESTRUCT] = { + .effect = EFFECT_EXPLOSION, + .power = 200, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_EGG_BOMB] = { + .effect = EFFECT_HIT, + .power = 100, + .type = TYPE_NORMAL, + .accuracy = 75, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_LICK] = { + .effect = EFFECT_PARALYZE_HIT, + .power = 20, + .type = TYPE_GHOST, + .accuracy = 100, + .pp = 30, + .secondaryEffectChance = 30, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_SMOG] = { + .effect = EFFECT_POISON_HIT, + .power = 20, + .type = TYPE_POISON, + .accuracy = 70, + .pp = 20, + .secondaryEffectChance = 40, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_SLUDGE] = { + .effect = EFFECT_POISON_HIT, + .power = 65, + .type = TYPE_POISON, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 30, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_BONE_CLUB] = { + .effect = EFFECT_FLINCH_HIT, + .power = 65, + .type = TYPE_GROUND, + .accuracy = 85, + .pp = 20, + .secondaryEffectChance = 10, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_FIRE_BLAST] = { + .effect = EFFECT_BURN_HIT, + .power = 120, + .type = TYPE_FIRE, + .accuracy = 85, + .pp = 5, + .secondaryEffectChance = 10, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_WATERFALL] = { + .effect = EFFECT_HIT, + .power = 80, + .type = TYPE_WATER, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_CLAMP] = { + .effect = EFFECT_TRAP, + .power = 35, + .type = TYPE_WATER, + .accuracy = 75, + .pp = 10, + .secondaryEffectChance = 100, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_SWIFT] = { + .effect = EFFECT_ALWAYS_HIT, + .power = 60, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_SKULL_BASH] = { + .effect = EFFECT_SKULL_BASH, + .power = 100, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_SPIKE_CANNON] = { + .effect = EFFECT_MULTI_HIT, + .power = 20, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_CONSTRICT] = { + .effect = EFFECT_SPEED_DOWN_HIT, + .power = 10, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 35, + .secondaryEffectChance = 10, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_AMNESIA] = { + .effect = EFFECT_SPECIAL_DEFENSE_UP_2, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_KINESIS] = { + .effect = EFFECT_ACCURACY_DOWN, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 80, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_SOFT_BOILED] = { + .effect = EFFECT_SOFTBOILED, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_HI_JUMP_KICK] = { + .effect = EFFECT_RECOIL_IF_MISS, + .power = 85, + .type = TYPE_FIGHTING, + .accuracy = 90, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_GLARE] = { + .effect = EFFECT_PARALYZE, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 75, + .pp = 30, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_DREAM_EATER] = { + .effect = EFFECT_DREAM_EATER, + .power = 100, + .type = TYPE_PSYCHIC, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_POISON_GAS] = { + .effect = EFFECT_POISON, + .power = 0, + .type = TYPE_POISON, + .accuracy = 55, + .pp = 40, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_BARRAGE] = { + .effect = EFFECT_MULTI_HIT, + .power = 15, + .type = TYPE_NORMAL, + .accuracy = 85, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_LEECH_LIFE] = { + .effect = EFFECT_ABSORB, + .power = 20, + .type = TYPE_BUG, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_LOVELY_KISS] = { + .effect = EFFECT_SLEEP, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 75, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_SKY_ATTACK] = { + .effect = EFFECT_SKY_ATTACK, + .power = 140, + .type = TYPE_FLYING, + .accuracy = 90, + .pp = 5, + .secondaryEffectChance = 30, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_TRANSFORM] = { + .effect = EFFECT_TRANSFORM, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = 0, + }, + + [MOVE_BUBBLE] = { + .effect = EFFECT_SPEED_DOWN_HIT, + .power = 20, + .type = TYPE_WATER, + .accuracy = 100, + .pp = 30, + .secondaryEffectChance = 10, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_DIZZY_PUNCH] = { + .effect = EFFECT_CONFUSE_HIT, + .power = 70, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 20, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_SPORE] = { + .effect = EFFECT_SLEEP, + .power = 0, + .type = TYPE_GRASS, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_FLASH] = { + .effect = EFFECT_ACCURACY_DOWN_HIT, + .power = 40, + .type = TYPE_ELECTRIC, + .accuracy = 75, + .pp = 20, + .secondaryEffectChance = 100, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_PSYWAVE] = { + .effect = EFFECT_PSYWAVE, + .power = 1, + .type = TYPE_PSYCHIC, + .accuracy = 80, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_SPLASH] = { + .effect = EFFECT_SPLASH, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 40, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = 0, + }, + + [MOVE_ACID_ARMOR] = { + .effect = EFFECT_DEFENSE_UP_2, + .power = 0, + .type = TYPE_POISON, + .accuracy = 0, + .pp = 40, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_CRABHAMMER] = { + .effect = EFFECT_HIGH_CRITICAL, + .power = 90, + .type = TYPE_WATER, + .accuracy = 85, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_EXPLOSION] = { + .effect = EFFECT_EXPLOSION, + .power = 255, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_FURY_SWIPES] = { + .effect = EFFECT_MULTI_HIT, + .power = 18, + .type = TYPE_NORMAL, + .accuracy = 80, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_BONEMERANG] = { + .effect = EFFECT_DOUBLE_HIT, + .power = 50, + .type = TYPE_GROUND, + .accuracy = 90, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_REST] = { + .effect = EFFECT_REST, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_ROCK_SLIDE] = { + .effect = EFFECT_FLINCH_HIT, + .power = 75, + .type = TYPE_ROCK, + .accuracy = 90, + .pp = 10, + .secondaryEffectChance = 30, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_HYPER_FANG] = { + .effect = EFFECT_FLINCH_HIT, + .power = 80, + .type = TYPE_NORMAL, + .accuracy = 90, + .pp = 15, + .secondaryEffectChance = 10, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_SHARPEN] = { + .effect = EFFECT_ATTACK_UP, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 30, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_CONVERSION] = { + .effect = EFFECT_CONVERSION, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 30, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = 0, + }, + + [MOVE_TRI_ATTACK] = { + .effect = EFFECT_TRI_ATTACK, + .power = 80, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 20, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_SUPER_FANG] = { + .effect = EFFECT_SUPER_FANG, + .power = 1, + .type = TYPE_NORMAL, + .accuracy = 90, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_SLASH] = { + .effect = EFFECT_HIGH_CRITICAL, + .power = 70, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_SUBSTITUTE] = { + .effect = EFFECT_SUBSTITUTE, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_STRUGGLE] = { + .effect = EFFECT_RECOIL, + .power = 50, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 1, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_SKETCH] = { + .effect = EFFECT_SKETCH, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = 0, + }, + + [MOVE_TRIPLE_KICK] = { + .effect = EFFECT_TRIPLE_KICK, + .power = 10, + .type = TYPE_FIGHTING, + .accuracy = 90, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_THIEF] = { + .effect = EFFECT_THIEF, + .power = 40, + .type = TYPE_DARK, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 100, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_SPIDER_WEB] = { + .effect = EFFECT_MEAN_LOOK, + .power = 0, + .type = TYPE_BUG, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_MIND_READER] = { + .effect = EFFECT_LOCK_ON, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_NIGHTMARE] = { + .effect = EFFECT_NIGHTMARE, + .power = 0, + .type = TYPE_GHOST, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_FLAME_WHEEL] = { + .effect = EFFECT_THAW_HIT, + .power = 60, + .type = TYPE_FIRE, + .accuracy = 100, + .pp = 25, + .secondaryEffectChance = 10, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_SNORE] = { + .effect = EFFECT_SNORE, + .power = 40, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 30, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_CURSE] = { + .effect = EFFECT_CURSE, + .power = 0, + .type = TYPE_GHOST, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = 0, + }, + + [MOVE_FLAIL] = { + .effect = EFFECT_FLAIL, + .power = 1, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_CONVERSION_2] = { + .effect = EFFECT_CONVERSION_2, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 30, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = 0, + }, + + [MOVE_AEROBLAST] = { + .effect = EFFECT_HIGH_CRITICAL, + .power = 100, + .type = TYPE_FLYING, + .accuracy = 95, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_COTTON_SPORE] = { + .effect = EFFECT_SPEED_DOWN_2, + .power = 0, + .type = TYPE_GRASS, + .accuracy = 85, + .pp = 40, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_REVERSAL] = { + .effect = EFFECT_FLAIL, + .power = 1, + .type = TYPE_FIGHTING, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_SPITE] = { + .effect = EFFECT_SPITE, + .power = 0, + .type = TYPE_GHOST, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_POWDER_SNOW] = { + .effect = EFFECT_FREEZE_HIT, + .power = 40, + .type = TYPE_ICE, + .accuracy = 100, + .pp = 25, + .secondaryEffectChance = 10, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_PROTECT] = { + .effect = EFFECT_PROTECT, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 3, + .flags = 0, + }, + + [MOVE_MACH_PUNCH] = { + .effect = EFFECT_QUICK_ATTACK, + .power = 40, + .type = TYPE_FIGHTING, + .accuracy = 100, + .pp = 30, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 1, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_SCARY_FACE] = { + .effect = EFFECT_SPEED_DOWN_2, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 90, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_FAINT_ATTACK] = { + .effect = EFFECT_ALWAYS_HIT, + .power = 60, + .type = TYPE_DARK, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_SWEET_KISS] = { + .effect = EFFECT_CONFUSE, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 75, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_BELLY_DRUM] = { + .effect = EFFECT_BELLY_DRUM, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_SLUDGE_BOMB] = { + .effect = EFFECT_POISON_HIT, + .power = 90, + .type = TYPE_POISON, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 30, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_MUD_SLAP] = { + .effect = EFFECT_ACCURACY_DOWN_HIT, + .power = 20, + .type = TYPE_GROUND, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 100, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_OCTAZOOKA] = { + .effect = EFFECT_ACCURACY_DOWN_HIT, + .power = 65, + .type = TYPE_WATER, + .accuracy = 85, + .pp = 10, + .secondaryEffectChance = 50, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_SPIKES] = { + .effect = EFFECT_SPIKES, + .power = 0, + .type = TYPE_GROUND, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = 0, + }, + + [MOVE_ZAP_CANNON] = { + .effect = EFFECT_PARALYZE_HIT, + .power = 100, + .type = TYPE_ELECTRIC, + .accuracy = 50, + .pp = 5, + .secondaryEffectChance = 100, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_FORESIGHT] = { + .effect = EFFECT_FORESIGHT, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 40, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_DESTINY_BOND] = { + .effect = EFFECT_DESTINY_BOND, + .power = 0, + .type = TYPE_GHOST, + .accuracy = 0, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = 0, + }, + + [MOVE_PERISH_SONG] = { + .effect = EFFECT_PERISH_SONG, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = 0, + }, + + [MOVE_ICEBREATH] = { + .effect = EFFECT_FREEZE_HIT, + .power = 25, + .type = TYPE_ICE, + .accuracy = 95, + .pp = 15, + .secondaryEffectChance = 50, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_DETECT] = { + .effect = EFFECT_PROTECT, + .power = 0, + .type = TYPE_FIGHTING, + .accuracy = 0, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 3, + .flags = 0, + }, + + [MOVE_BONE_RUSH] = { + .effect = EFFECT_MULTI_HIT, + .power = 25, + .type = TYPE_GROUND, + .accuracy = 85, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_DATA_STREAM] = { + .effect = EFFECT_QUICK_ATTACK, + .power = 100, + .type = TYPE_ELECTRIC, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_OUTRAGE] = { + .effect = EFFECT_RAMPAGE, + .power = 90, + .type = TYPE_DRAGON, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 100, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_SANDSTORM] = { + .effect = EFFECT_SANDSTORM, + .power = 0, + .type = TYPE_ROCK, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = 0, + }, + + [MOVE_GIGA_DRAIN] = { + .effect = EFFECT_ABSORB, + .power = 60, + .type = TYPE_GRASS, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_ENDURE] = { + .effect = EFFECT_ENDURE, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 3, + .flags = 0, + }, + + [MOVE_CHARM] = { + .effect = EFFECT_ATTACK_DOWN_2, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_ROLLOUT] = { + .effect = EFFECT_ROLLOUT, + .power = 30, + .type = TYPE_ROCK, + .accuracy = 90, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_SHADOW_SWIPE] = { + .effect = EFFECT_HIGH_CRITICAL, + .power = 90, + .type = TYPE_GHOST, + .accuracy = 90, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_SWAGGER] = { + .effect = EFFECT_SWAGGER, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 90, + .pp = 15, + .secondaryEffectChance = 100, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_MILK_DRINK] = { + .effect = EFFECT_SOFTBOILED, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_SNATCH, + }, + + [MOVE_SPARK] = { + .effect = EFFECT_PARALYZE_HIT, + .power = 65, + .type = TYPE_ELECTRIC, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 30, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_FURY_CUTTER] = { + .effect = EFFECT_FURY_CUTTER, + .power = 10, + .type = TYPE_BUG, + .accuracy = 95, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_STEEL_WING] = { + .effect = EFFECT_DEFENSE_UP_HIT, + .power = 70, + .type = TYPE_STEEL, + .accuracy = 90, + .pp = 25, + .secondaryEffectChance = 10, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_MEAN_LOOK] = { + .effect = EFFECT_MEAN_LOOK, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_ATTRACT] = { + .effect = EFFECT_ATTRACT, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_SLEEP_TALK] = { + .effect = EFFECT_SLEEP_TALK, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = 0, + }, + + [MOVE_HEAL_BELL] = { + .effect = EFFECT_HEAL_BELL, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_RETURN] = { + .effect = EFFECT_RETURN, + .power = 1, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_PRESENT] = { + .effect = EFFECT_PRESENT, + .power = 1, + .type = TYPE_NORMAL, + .accuracy = 90, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_FRUSTRATION] = { + .effect = EFFECT_FRUSTRATION, + .power = 1, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_SAFEGUARD] = { + .effect = EFFECT_SAFEGUARD, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 25, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_PAIN_SPLIT] = { + .effect = EFFECT_PAIN_SPLIT, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_SACRED_FIRE] = { + .effect = EFFECT_THAW_HIT, + .power = 100, + .type = TYPE_FIRE, + .accuracy = 95, + .pp = 5, + .secondaryEffectChance = 50, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_MAGNITUDE] = { + .effect = EFFECT_MAGNITUDE, + .power = 1, + .type = TYPE_GROUND, + .accuracy = 100, + .pp = 30, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_DYNAMIC_PUNCH] = { + .effect = EFFECT_CONFUSE_HIT, + .power = 100, + .type = TYPE_FIGHTING, + .accuracy = 50, + .pp = 5, + .secondaryEffectChance = 100, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_MEGAHORN] = { + .effect = EFFECT_HIT, + .power = 120, + .type = TYPE_BUG, + .accuracy = 85, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_DRAGON_BREATH] = { + .effect = EFFECT_PARALYZE_HIT, + .power = 60, + .type = TYPE_DRAGON, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 30, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_BATON_PASS] = { + .effect = EFFECT_BATON_PASS, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 40, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = 0, + }, + + [MOVE_ENCORE] = { + .effect = EFFECT_ENCORE, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_PURSUIT] = { + .effect = EFFECT_PURSUIT, + .power = 40, + .type = TYPE_DARK, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_RAPID_SPIN] = { + .effect = EFFECT_RAPID_SPIN, + .power = 20, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 40, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_SWEET_SCENT] = { + .effect = EFFECT_EVASION_DOWN, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_IRON_TAIL] = { + .effect = EFFECT_DEFENSE_DOWN_HIT, + .power = 100, + .type = TYPE_STEEL, + .accuracy = 81, + .pp = 10, + .secondaryEffectChance = 30, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_METAL_CLAW] = { + .effect = EFFECT_ATTACK_UP_HIT, + .power = 50, + .type = TYPE_STEEL, + .accuracy = 95, + .pp = 35, + .secondaryEffectChance = 10, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_VITAL_THROW] = { + .effect = EFFECT_VITAL_THROW, + .power = 70, + .type = TYPE_FIGHTING, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = -1, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_MORNING_SUN] = { + .effect = EFFECT_MORNING_SUN, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_SYNTHESIS] = { + .effect = EFFECT_SYNTHESIS, + .power = 0, + .type = TYPE_GRASS, + .accuracy = 0, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_MOONLIGHT] = { + .effect = EFFECT_MOONLIGHT, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_HIDDEN_POWER] = { + .effect = EFFECT_HIDDEN_POWER, + .power = 1, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_CROSS_CHOP] = { + .effect = EFFECT_HIGH_CRITICAL, + .power = 100, + .type = TYPE_FIGHTING, + .accuracy = 80, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_TWISTER] = { + .effect = EFFECT_TWISTER, + .power = 40, + .type = TYPE_DRAGON, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 20, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_RAIN_DANCE] = { + .effect = EFFECT_RAIN_DANCE, + .power = 0, + .type = TYPE_WATER, + .accuracy = 0, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = 0, + }, + + [MOVE_SUNNY_DAY] = { + .effect = EFFECT_SUNNY_DAY, + .power = 0, + .type = TYPE_FIRE, + .accuracy = 0, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = 0, + }, + + [MOVE_CRUNCH] = { + .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, + .power = 80, + .type = TYPE_DARK, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 20, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_MIRROR_COAT] = { + .effect = EFFECT_MIRROR_COAT, + .power = 1, + .type = TYPE_PSYCHIC, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = -5, + .flags = F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_PSYCH_UP] = { + .effect = EFFECT_PSYCH_UP, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_EXTREME_SPEED] = { + .effect = EFFECT_QUICK_ATTACK, + .power = 80, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 1, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_ANCIENT_POWER] = { + .effect = EFFECT_ALL_STATS_UP_HIT, + .power = 60, + .type = TYPE_ROCK, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 10, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_SHADOW_BALL] = { + .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, + .power = 80, + .type = TYPE_GHOST, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 20, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_FUTURE_SIGHT] = { + .effect = EFFECT_FUTURE_SIGHT, + .power = 80, + .type = TYPE_PSYCHIC, + .accuracy = 90, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = 0, + }, + + [MOVE_ROCK_SMASH] = { + .effect = EFFECT_DEFENSE_DOWN_HIT, + .power = 50, + .type = TYPE_FIGHTING, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 50, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_WHIRLPOOL] = { + .effect = EFFECT_TRAP, + .power = 15, + .type = TYPE_WATER, + .accuracy = 70, + .pp = 15, + .secondaryEffectChance = 100, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_BEAT_UP] = { + .effect = EFFECT_BEAT_UP, + .power = 10, + .type = TYPE_DARK, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_FAKE_OUT] = { + .effect = EFFECT_FAKE_OUT, + .power = 40, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 1, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_UPROAR] = { + .effect = EFFECT_UPROAR, + .power = 50, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 100, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_STOCKPILE] = { + .effect = EFFECT_STOCKPILE, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_SPIT_UP] = { + .effect = EFFECT_SPIT_UP, + .power = 100, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_SWALLOW] = { + .effect = EFFECT_SWALLOW, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_HEAT_WAVE] = { + .effect = EFFECT_BURN_HIT, + .power = 100, + .type = TYPE_FIRE, + .accuracy = 90, + .pp = 10, + .secondaryEffectChance = 10, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_HAIL] = { + .effect = EFFECT_HAIL, + .power = 0, + .type = TYPE_ICE, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT, + }, + + [MOVE_TORMENT] = { + .effect = EFFECT_TORMENT, + .power = 0, + .type = TYPE_DARK, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_FLATTER] = { + .effect = EFFECT_FLATTER, + .power = 0, + .type = TYPE_DARK, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_WILL_O_WISP] = { + .effect = EFFECT_WILL_O_WISP, + .power = 0, + .type = TYPE_FIRE, + .accuracy = 75, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_MEMENTO] = { + .effect = EFFECT_MEMENTO, + .power = 0, + .type = TYPE_DARK, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_FACADE] = { + .effect = EFFECT_FACADE, + .power = 70, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_FOCUS_PUNCH] = { + .effect = EFFECT_FOCUS_PUNCH, + .power = 150, + .type = TYPE_FIGHTING, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = -3, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT, + }, + + [MOVE_SMELLING_SALT] = { + .effect = EFFECT_SMELLINGSALT, + .power = 60, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_FOLLOW_ME] = { + .effect = EFFECT_FOLLOW_ME, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 3, + .flags = 0, + }, + + [MOVE_NATURE_POWER] = { + .effect = EFFECT_NATURE_POWER, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 95, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = 0, + }, + + [MOVE_CHARGE] = { + .effect = EFFECT_CHARGE, + .power = 0, + .type = TYPE_ELECTRIC, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_TAUNT] = { + .effect = EFFECT_TAUNT, + .power = 0, + .type = TYPE_DARK, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT, + }, + + [MOVE_HELPING_HAND] = { + .effect = EFFECT_HELPING_HAND, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 5, + .flags = 0, + }, + + [MOVE_TRICK] = { + .effect = EFFECT_TRICK, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_ROLE_PLAY] = { + .effect = EFFECT_ROLE_PLAY, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = 0, + }, + + [MOVE_WISH] = { + .effect = EFFECT_WISH, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT, + }, + + [MOVE_ASSIST] = { + .effect = EFFECT_ASSIST, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = 0, + }, + + [MOVE_INGRAIN] = { + .effect = EFFECT_INGRAIN, + .power = 0, + .type = TYPE_GRASS, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_SUPERPOWER] = { + .effect = EFFECT_SUPERPOWER, + .power = 120, + .type = TYPE_FIGHTING, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_MAGIC_COAT] = { + .effect = EFFECT_MAGIC_COAT, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 4, + .flags = 0, + }, + + [MOVE_RECYCLE] = { + .effect = EFFECT_RECYCLE, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = 0, + }, + + [MOVE_REVENGE] = { + .effect = EFFECT_REVENGE, + .power = 60, + .type = TYPE_FIGHTING, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = -4, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_BRICK_BREAK] = { + .effect = EFFECT_BRICK_BREAK, + .power = 75, + .type = TYPE_FIGHTING, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_YAWN] = { + .effect = EFFECT_YAWN, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_KNOCK_OFF] = { + .effect = EFFECT_KNOCK_OFF, + .power = 20, + .type = TYPE_DARK, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 100, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_ENDEAVOR] = { + .effect = EFFECT_ENDEAVOR, + .power = 1, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_ERUPTION] = { + .effect = EFFECT_ERUPTION, + .power = 150, + .type = TYPE_FIRE, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_SKILL_SWAP] = { + .effect = EFFECT_SKILL_SWAP, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_IMPRISON] = { + .effect = EFFECT_IMPRISON, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT, + }, + + [MOVE_REFRESH] = { + .effect = EFFECT_REFRESH, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_GRUDGE] = { + .effect = EFFECT_GRUDGE, + .power = 0, + .type = TYPE_GHOST, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_SNATCH] = { + .effect = EFFECT_SNATCH, + .power = 0, + .type = TYPE_DARK, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 4, + .flags = F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_SECRET_POWER] = { + .effect = EFFECT_SECRET_POWER, + .power = 70, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 30, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_DIVE] = { + .effect = EFFECT_FLY, + .power = 60, + .type = TYPE_WATER, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_ARM_THRUST] = { + .effect = EFFECT_MULTI_HIT, + .power = 15, + .type = TYPE_FIGHTING, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_CAMOUFLAGE] = { + .effect = EFFECT_CAMOUFLAGE, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_BRIGHT_IDEA] = { + .effect = EFFECT_SPECIAL_ATTACK_UP_2, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_CRAZY_BOLT] = { + .effect = EFFECT_ATTACK_DOWN_HIT, + .power = 95, + .type = TYPE_DARK, + .accuracy = 95, + .pp = 5, + .secondaryEffectChance = 50, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_AFRO_BREAK] = { + .effect = EFFECT_DOUBLE_EDGE, + .power = 120, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_FEATHER_DANCE] = { + .effect = EFFECT_ATTACK_DOWN_2, + .power = 0, + .type = TYPE_FLYING, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_TEETER_DANCE] = { + .effect = EFFECT_TEETER_DANCE, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT, + }, + + [MOVE_FRICTIONKICK] = { + .effect = EFFECT_RECOIL, + .power = 120, + .type = TYPE_BUG, + .accuracy = 80, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_MUD_SPORT] = { + .effect = EFFECT_MUD_SPORT, + .power = 0, + .type = TYPE_GROUND, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = 0, + }, + + [MOVE_ICE_BALL] = { + .effect = EFFECT_ROLLOUT, + .power = 30, + .type = TYPE_ICE, + .accuracy = 90, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_NEEDLE_ARM] = { + .effect = EFFECT_FLINCH_HIT_2, + .power = 60, + .type = TYPE_GRASS, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 30, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_SLACK_OFF] = { + .effect = EFFECT_RESTORE_HP, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_HYPER_VOICE] = { + .effect = EFFECT_HIT, + .power = 90, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_POISON_FANG] = { + .effect = EFFECT_POISON_FANG, + .power = 50, + .type = TYPE_POISON, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 30, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_CRUSH_CLAW] = { + .effect = EFFECT_DEFENSE_DOWN_HIT, + .power = 75, + .type = TYPE_NORMAL, + .accuracy = 95, + .pp = 10, + .secondaryEffectChance = 50, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_BLAST_BURN] = { + .effect = EFFECT_RECHARGE, + .power = 150, + .type = TYPE_FIRE, + .accuracy = 90, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_HYDRO_CANNON] = { + .effect = EFFECT_RECHARGE, + .power = 150, + .type = TYPE_WATER, + .accuracy = 90, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_METEOR_MASH] = { + .effect = EFFECT_ATTACK_UP_HIT, + .power = 100, + .type = TYPE_STEEL, + .accuracy = 85, + .pp = 10, + .secondaryEffectChance = 20, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_ASTONISH] = { + .effect = EFFECT_FLINCH_HIT_2, + .power = 30, + .type = TYPE_GHOST, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 30, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_WEATHER_BALL] = { + .effect = EFFECT_WEATHER_BALL, + .power = 50, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_AROMATHERAPY] = { + .effect = EFFECT_HEAL_BELL, + .power = 0, + .type = TYPE_GRASS, + .accuracy = 0, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_FAKE_TEARS] = { + .effect = EFFECT_SPECIAL_DEFENSE_DOWN_2, + .power = 0, + .type = TYPE_DARK, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_AIR_CUTTER] = { + .effect = EFFECT_HIGH_CRITICAL, + .power = 55, + .type = TYPE_FLYING, + .accuracy = 95, + .pp = 25, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_OVERHEAT] = { + .effect = EFFECT_OVERHEAT, + .power = 140, + .type = TYPE_FIRE, + .accuracy = 90, + .pp = 5, + .secondaryEffectChance = 100, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_ODOR_SLEUTH] = { + .effect = EFFECT_FORESIGHT, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 40, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_ROCK_TOMB] = { + .effect = EFFECT_SPEED_DOWN_HIT, + .power = 50, + .type = TYPE_ROCK, + .accuracy = 80, + .pp = 10, + .secondaryEffectChance = 100, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_SILVER_WIND] = { + .effect = EFFECT_ALL_STATS_UP_HIT, + .power = 60, + .type = TYPE_BUG, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 10, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_METAL_SOUND] = { + .effect = EFFECT_SPECIAL_DEFENSE_DOWN_2, + .power = 0, + .type = TYPE_STEEL, + .accuracy = 85, + .pp = 40, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_GRASS_WHISTLE] = { + .effect = EFFECT_SLEEP, + .power = 0, + .type = TYPE_GRASS, + .accuracy = 65, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_TICKLE] = { + .effect = EFFECT_TICKLE, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_COSMIC_POWER] = { + .effect = EFFECT_COSMIC_POWER, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_WATER_SPOUT] = { + .effect = EFFECT_ERUPTION, + .power = 150, + .type = TYPE_WATER, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_SIGNAL_BEAM] = { + .effect = EFFECT_CONFUSE_HIT, + .power = 75, + .type = TYPE_BUG, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 10, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_SHADOW_PUNCH] = { + .effect = EFFECT_ALWAYS_HIT, + .power = 60, + .type = TYPE_GHOST, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_EXTRASENSORY] = { + .effect = EFFECT_FLINCH_HIT_2, + .power = 80, + .type = TYPE_PSYCHIC, + .accuracy = 100, + .pp = 30, + .secondaryEffectChance = 10, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_SKY_UPPERCUT] = { + .effect = EFFECT_SKY_UPPERCUT, + .power = 85, + .type = TYPE_FIGHTING, + .accuracy = 90, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_SAND_TOMB] = { + .effect = EFFECT_TRAP, + .power = 15, + .type = TYPE_GROUND, + .accuracy = 70, + .pp = 15, + .secondaryEffectChance = 100, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_SHEER_COLD] = { + .effect = EFFECT_OHKO, + .power = 1, + .type = TYPE_ICE, + .accuracy = 30, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_MUDDY_WATER] = { + .effect = EFFECT_ACCURACY_DOWN_HIT, + .power = 95, + .type = TYPE_WATER, + .accuracy = 85, + .pp = 10, + .secondaryEffectChance = 30, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_BULLET_SEED] = { + .effect = EFFECT_MULTI_HIT, + .power = 10, + .type = TYPE_GRASS, + .accuracy = 100, + .pp = 30, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_AERIAL_ACE] = { + .effect = EFFECT_ALWAYS_HIT, + .power = 60, + .type = TYPE_FLYING, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_CRYSTALSTORM] = { + .effect = EFFECT_RECHARGE, + .power = 150, + .type = TYPE_STEEL, + .accuracy = 88, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_IRON_DEFENSE] = { + .effect = EFFECT_DEFENSE_UP_2, + .power = 0, + .type = TYPE_STEEL, + .accuracy = 0, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_BLOCK] = { + .effect = EFFECT_MEAN_LOOK, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_AFFECTED_BY_MAGIC_COAT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_HOWL] = { + .effect = EFFECT_ATTACK_UP, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 40, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_DRAGON_CLAW] = { + .effect = EFFECT_HIT, + .power = 80, + .type = TYPE_DRAGON, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_FRENZY_PLANT] = { + .effect = EFFECT_RECHARGE, + .power = 150, + .type = TYPE_GRASS, + .accuracy = 90, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_BULK_UP] = { + .effect = EFFECT_BULK_UP, + .power = 0, + .type = TYPE_FIGHTING, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_BOUNCE] = { + .effect = EFFECT_FLY, + .power = 85, + .type = TYPE_FLYING, + .accuracy = 85, + .pp = 5, + .secondaryEffectChance = 30, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_MUD_SHOT] = { + .effect = EFFECT_SPEED_DOWN_HIT, + .power = 55, + .type = TYPE_GROUND, + .accuracy = 95, + .pp = 15, + .secondaryEffectChance = 100, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_POISON_TAIL] = { + .effect = EFFECT_POISON_TAIL, + .power = 70, + .type = TYPE_POISON, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 10, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_COVET] = { + .effect = EFFECT_THIEF, + .power = 40, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 40, + .secondaryEffectChance = 100, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE, + }, + + [MOVE_WILD_BOLT] = { + .effect = EFFECT_DOUBLE_EDGE, + .power = 90, + .type = TYPE_ELECTRIC, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_MAGICAL_LEAF] = { + .effect = EFFECT_ALWAYS_HIT, + .power = 60, + .type = TYPE_GRASS, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_WATER_SPORT] = { + .effect = EFFECT_WATER_SPORT, + .power = 0, + .type = TYPE_WATER, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = 0, + }, + + [MOVE_CALM_MIND] = { + .effect = EFFECT_CALM_MIND, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_LEAF_BLADE] = { + .effect = EFFECT_HIGH_CRITICAL, + .power = 70, + .type = TYPE_GRASS, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_MAKES_CONTACT | F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_FURY_DANCE] = { + .effect = EFFECT_DRAGON_DANCE, + .power = 0, + .type = TYPE_DRAGON, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_SNATCH, + }, + + [MOVE_ROCK_BLAST] = { + .effect = EFFECT_MULTI_HIT, + .power = 25, + .type = TYPE_ROCK, + .accuracy = 80, + .pp = 10, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_SHOCK_WAVE] = { + .effect = EFFECT_ALWAYS_HIT, + .power = 60, + .type = TYPE_ELECTRIC, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_WATER_PULSE] = { + .effect = EFFECT_CONFUSE_HIT, + .power = 60, + .type = TYPE_WATER, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 20, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, + + [MOVE_PULSAR] = { + .effect = EFFECT_ACCURACY_DOWN_HIT, + .power = 125, + .type = TYPE_DARK, + .accuracy = 80, + .pp = 5, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = 0, + }, + + [MOVE_CURSE_CLAW] = { + .effect = EFFECT_OHKO, + .power = 1, + .type = TYPE_ROCK, + .accuracy = 77, + .pp = 1, + .secondaryEffectChance = 0, + .target = TARGET_SELECTED_POKEMON, + .priority = 0, + .flags = F_AFFECTED_BY_PROTECT | F_MIRROR_MOVE_COMPATIBLE | F_AFFECTED_BY_KINGS_ROCK, + }, +}; \ No newline at end of file diff --git a/src/data/moves/descriptions.c b/src/data/moves/descriptions.c new file mode 100644 index 0000000..fd7a9a3 --- /dev/null +++ b/src/data/moves/descriptions.c @@ -0,0 +1,359 @@ +#include "types.h" +#include "constants/moves.h" + +const u8 *const gMoveDescriptions[] = { + [MOVE_POUND - 1] = (const u8 *)0x83bc680, + [MOVE_KARATE_CHOP - 1] = (const u8 *)0x83bc6a6, + [MOVE_DOUBLE_SLAP - 1] = (const u8 *)0x83bc6d8, + [MOVE_COMET_PUNCH - 1] = (const u8 *)0x83bc6ff, + [MOVE_MEGA_PUNCH - 1] = (const u8 *)0x83bc728, + [MOVE_PAY_DAY - 1] = (const u8 *)0x83bc755, + [MOVE_FIRE_PUNCH - 1] = (const u8 *)0x83bc788, + [MOVE_ICE_PUNCH - 1] = (const u8 *)0x83bc7ad, + [MOVE_THUNDER_PUNCH - 1] = (const u8 *)0x83bc7d3, + [MOVE_SCRATCH - 1] = (const u8 *)0x83bc803, + [MOVE_VICE_GRIP - 1] = (const u8 *)0x83bc827, + [MOVE_GUILLOTINE - 1] = (const u8 *)0x83bc856, + [MOVE_RAZOR_WIND - 1] = (const u8 *)0x83bc888, + [MOVE_SWORDS_DANCE - 1] = (const u8 *)0x83bc8bc, + [MOVE_CUT - 1] = (const u8 *)0x83bc8e9, + [MOVE_GUST - 1] = (const u8 *)0x83bc916, + [MOVE_WING_ATTACK - 1] = (const u8 *)0x83bc94f, + [MOVE_WHIRLWIND - 1] = (const u8 *)0x83bc977, + [MOVE_FLY - 1] = (const u8 *)0x83bc9a9, + [MOVE_BIND - 1] = (const u8 *)0x83bc9e1, + [MOVE_SLAM - 1] = (const u8 *)0x83bca0e, + [MOVE_VINE_WHIP - 1] = (const u8 *)0x83bca39, + [MOVE_SKULLBREAKER - 1] = (const u8 *)0x83bca67, + [MOVE_DOUBLE_KICK - 1] = (const u8 *)0x83bca9e, + [MOVE_MEGA_KICK - 1] = (const u8 *)0x83bcad2, + [MOVE_JUMP_KICK - 1] = (const u8 *)0x83bcb01, + [MOVE_ROLLING_KICK - 1] = (const u8 *)0x83bcb36, + [MOVE_SAND_ATTACK - 1] = (const u8 *)0x83bcb5f, + [MOVE_HEADBUTT - 1] = (const u8 *)0x83bcb97, + [MOVE_HORN_ATTACK - 1] = (const u8 *)0x83bcbc2, + [MOVE_FURY_ATTACK - 1] = (const u8 *)0x83bcbe1, + [MOVE_HORN_DRILL - 1] = (const u8 *)0x83bcc12, + [MOVE_TACKLE - 1] = (const u8 *)0x83bcc45, + [MOVE_BODY_SLAM - 1] = (const u8 *)0x83bcc6f, + [MOVE_WRAP - 1] = (const u8 *)0x83bcc9a, + [MOVE_TAKE_DOWN - 1] = (const u8 *)0x83bccd3, + [MOVE_THRASH - 1] = (const u8 *)0x83bcd06, + [MOVE_DOUBLE_EDGE - 1] = (const u8 *)0x83bcd38, + [MOVE_TAIL_WHIP - 1] = (const u8 *)0x83bcd68, + [MOVE_POISON_STING - 1] = (const u8 *)0x83bcd92, + [MOVE_TWINEEDLE - 1] = (const u8 *)0x83bcdc4, + [MOVE_PIN_MISSILE - 1] = (const u8 *)0x83bcdf0, + [MOVE_LEER - 1] = (const u8 *)0x83bce1d, + [MOVE_BITE - 1] = (const u8 *)0x83bce4d, + [MOVE_GROWL - 1] = (const u8 *)0x83bce7c, + [MOVE_ROAR - 1] = (const u8 *)0x83bcea6, + [MOVE_SING - 1] = (const u8 *)0x83bcecc, + [MOVE_SUPERSONIC - 1] = (const u8 *)0x83bceff, + [MOVE_SONIC_BOOM - 1] = (const u8 *)0x83bcf33, + [MOVE_DISABLE - 1] = (const u8 *)0x83bcf6a, + [MOVE_ACID - 1] = (const u8 *)0x83bcf97, + [MOVE_EMBER - 1] = (const u8 *)0x83bcfc6, + [MOVE_FIRE_PUMP - 1] = (const u8 *)0x83bcff2, + [MOVE_MIST - 1] = (const u8 *)0x83bd022, + [MOVE_WATER_GUN - 1] = (const u8 *)0x83bd054, + [MOVE_STORM_SURGE - 1] = (const u8 *)0x83bd075, + [MOVE_SURF - 1] = (const u8 *)0x83bd0a3, + [MOVE_ICE_BEAM - 1] = (const u8 *)0x83bd0d9, + [MOVE_BLIZZARD - 1] = (const u8 *)0x83bd10d, + [MOVE_PSYBEAM - 1] = (const u8 *)0x83bd140, + [MOVE_BOILINGWATER - 1] = (const u8 *)0x83bd16f, + [MOVE_AURORA_BEAM - 1] = (const u8 *)0x83bd19f, + [MOVE_HYPER_BEAM - 1] = (const u8 *)0x83bd1d3, + [MOVE_PECK - 1] = (const u8 *)0x83bd209, + [MOVE_DRILL_PECK - 1] = (const u8 *)0x83bd233, + [MOVE_SUBMISSION - 1] = (const u8 *)0x83bd26a, + [MOVE_LOW_KICK - 1] = (const u8 *)0x83bd299, + [MOVE_COUNTER - 1] = (const u8 *)0x83bd2cb, + [MOVE_SEISMIC_TOSS - 1] = (const u8 *)0x83bd2fe, + [MOVE_STRENGTH - 1] = (const u8 *)0x83bd32d, + [MOVE_ABSORB - 1] = (const u8 *)0x83bd358, + [MOVE_MEGA_DRAIN - 1] = (const u8 *)0x83bd38a, + [MOVE_LEECH_SEED - 1] = (const u8 *)0x83bd3bc, + [MOVE_GROWTH - 1] = (const u8 *)0x83bd3f0, + [MOVE_RAZOR_LEAF - 1] = (const u8 *)0x83bd41f, + [MOVE_SOLAR_BEAM - 1] = (const u8 *)0x83bd454, + [MOVE_POISON_POWDER - 1] = (const u8 *)0x83bd487, + [MOVE_STUN_SPORE - 1] = (const u8 *)0x83bd4b8, + [MOVE_SLEEP_POWDER - 1] = (const u8 *)0x83bd4e5, + [MOVE_PETAL_DANCE - 1] = (const u8 *)0x83bd518, + [MOVE_STRING_SHOT - 1] = (const u8 *)0x83bd54a, + [MOVE_DRACO_FURY - 1] = (const u8 *)0x83bd579, + [MOVE_FIRE_SPIN - 1] = (const u8 *)0x83bd5b0, + [MOVE_THUNDER_SHOCK - 1] = (const u8 *)0x83bd5e2, + [MOVE_THUNDERBOLT - 1] = (const u8 *)0x83bd612, + [MOVE_THUNDER_WAVE - 1] = (const u8 *)0x83bd648, + [MOVE_DISCHARGE - 1] = (const u8 *)0x83bd67b, + [MOVE_ROCK_THROW - 1] = (const u8 *)0x83bd6a8, + [MOVE_EARTHQUAKE - 1] = (const u8 *)0x83bd6ce, + [MOVE_FISSURE - 1] = (const u8 *)0x83bd702, + [MOVE_DIG - 1] = (const u8 *)0x83bd735, + [MOVE_TOXIC - 1] = (const u8 *)0x83bd76c, + [MOVE_CONFUSION - 1] = (const u8 *)0x83bd798, + [MOVE_PSYCHIC - 1] = (const u8 *)0x83bd7c3, + [MOVE_HYPNOSIS - 1] = (const u8 *)0x83bd7f5, + [MOVE_MEDITATE - 1] = (const u8 *)0x83bd81f, + [MOVE_AGILITY - 1] = (const u8 *)0x83bd850, + [MOVE_QUICK_ATTACK - 1] = (const u8 *)0x83bd879, + [MOVE_RAGE - 1] = (const u8 *)0x83bd8ad, + [MOVE_TELEPORT - 1] = (const u8 *)0x83bd8dc, + [MOVE_NIGHT_SHADE - 1] = (const u8 *)0x83bd90e, + [MOVE_MIMIC - 1] = (const u8 *)0x83bd93d, + [MOVE_SCREECH - 1] = (const u8 *)0x83bd96e, + [MOVE_DOUBLE_TEAM - 1] = (const u8 *)0x83bd9a3, + [MOVE_RECOVER - 1] = (const u8 *)0x83bd9d1, + [MOVE_HARDEN - 1] = (const u8 *)0x83bd9fc, + [MOVE_MINIMIZE - 1] = (const u8 *)0x83bda2b, + [MOVE_SMOKESCREEN - 1] = (const u8 *)0x83bda5b, + [MOVE_CONFUSE_RAY - 1] = (const u8 *)0x83bda8c, + [MOVE_WITHDRAW - 1] = (const u8 *)0x83bdab2, + [MOVE_DEFENSE_CURL - 1] = (const u8 *)0x83bdaeb, + [MOVE_BARRIER - 1] = (const u8 *)0x83bdb1d, + [MOVE_LIGHT_SCREEN - 1] = (const u8 *)0x83bdb4c, + [MOVE_HAZE - 1] = (const u8 *)0x83bdb80, + [MOVE_REFLECT - 1] = (const u8 *)0x83bdbb7, + [MOVE_FOCUS_ENERGY - 1] = (const u8 *)0x83bdbee, + [MOVE_BIDE - 1] = (const u8 *)0x83bdc1d, + [MOVE_METRONOME - 1] = (const u8 *)0x83bdc4d, + [MOVE_MIRROR_MOVE - 1] = (const u8 *)0x83bdc81, + [MOVE_SELF_DESTRUCT - 1] = (const u8 *)0x83bdcaf, + [MOVE_EGG_BOMB - 1] = (const u8 *)0x83bdce0, + [MOVE_LICK - 1] = (const u8 *)0x83bdd06, + [MOVE_SMOG - 1] = (const u8 *)0x83bdd3d, + [MOVE_SLUDGE - 1] = (const u8 *)0x83bdd69, + [MOVE_BONE_CLUB - 1] = (const u8 *)0x83bdd9e, + [MOVE_FIRE_BLAST - 1] = (const u8 *)0x83bddce, + [MOVE_WATERFALL - 1] = (const u8 *)0x83bde01, + [MOVE_CLAMP - 1] = (const u8 *)0x83bde31, + [MOVE_SWIFT - 1] = (const u8 *)0x83bde5e, + [MOVE_SKULL_BASH - 1] = (const u8 *)0x83bde87, + [MOVE_SPIKE_CANNON - 1] = (const u8 *)0x83bdeb9, + [MOVE_CONSTRICT - 1] = (const u8 *)0x83bdee9, + [MOVE_AMNESIA - 1] = (const u8 *)0x83bdf16, + [MOVE_KINESIS - 1] = (const u8 *)0x83bdf4a, + [MOVE_SOFT_BOILED - 1] = (const u8 *)0x83bdf71, + [MOVE_HI_JUMP_KICK - 1] = (const u8 *)0x83bdf9c, + [MOVE_GLARE - 1] = (const u8 *)0x83bdfd1, + [MOVE_DREAM_EATER - 1] = (const u8 *)0x83be003, + [MOVE_POISON_GAS - 1] = (const u8 *)0x83be03a, + [MOVE_BARRAGE - 1] = (const u8 *)0x83be06b, + [MOVE_LEECH_LIFE - 1] = (const u8 *)0x83be098, + [MOVE_LOVELY_KISS - 1] = (const u8 *)0x83be0c9, + [MOVE_SKY_ATTACK - 1] = (const u8 *)0x83be0fe, + [MOVE_TRANSFORM - 1] = (const u8 *)0x83be133, + [MOVE_BUBBLE - 1] = (const u8 *)0x83be168, + [MOVE_DIZZY_PUNCH - 1] = (const u8 *)0x83be19c, + [MOVE_SPORE - 1] = (const u8 *)0x83be1c7, + [MOVE_FLASH - 1] = (const u8 *)0x83be1fc, + [MOVE_PSYWAVE - 1] = (const u8 *)0x83be231, + [MOVE_SPLASH - 1] = (const u8 *)0x83be263, + [MOVE_ACID_ARMOR - 1] = (const u8 *)0x83be293, + [MOVE_CRABHAMMER - 1] = (const u8 *)0x83be2c7, + [MOVE_EXPLOSION - 1] = (const u8 *)0x83be2fd, + [MOVE_FURY_SWIPES - 1] = (const u8 *)0x83be32e, + [MOVE_BONEMERANG - 1] = (const u8 *)0x83be362, + [MOVE_REST - 1] = (const u8 *)0x83be38e, + [MOVE_ROCK_SLIDE - 1] = (const u8 *)0x83be3c4, + [MOVE_HYPER_FANG - 1] = (const u8 *)0x83be3f4, + [MOVE_SHARPEN - 1] = (const u8 *)0x83be423, + [MOVE_CONVERSION - 1] = (const u8 *)0x83be450, + [MOVE_TRI_ATTACK - 1] = (const u8 *)0x83be481, + [MOVE_SUPER_FANG - 1] = (const u8 *)0x83be4ae, + [MOVE_SLASH - 1] = (const u8 *)0x83be4e3, + [MOVE_SUBSTITUTE - 1] = (const u8 *)0x83be51b, + [MOVE_STRUGGLE - 1] = (const u8 *)0x83be54f, + [MOVE_SKETCH - 1] = (const u8 *)0x83be58b, + [MOVE_TRIPLE_KICK - 1] = (const u8 *)0x83be5b3, + [MOVE_THIEF - 1] = (const u8 *)0x83be5e9, + [MOVE_SPIDER_WEB - 1] = (const u8 *)0x83be61c, + [MOVE_MIND_READER - 1] = (const u8 *)0x83be653, + [MOVE_NIGHTMARE - 1] = (const u8 *)0x83be68a, + [MOVE_FLAME_WHEEL - 1] = (const u8 *)0x83be6bc, + [MOVE_SNORE - 1] = (const u8 *)0x83be6eb, + [MOVE_CURSE - 1] = (const u8 *)0x83be71d, + [MOVE_FLAIL - 1] = (const u8 *)0x83be74b, + [MOVE_CONVERSION_2 - 1] = (const u8 *)0x83be77c, + [MOVE_AEROBLAST - 1] = (const u8 *)0x83be7b0, + [MOVE_COTTON_SPORE - 1] = (const u8 *)0x83be7e4, + [MOVE_REVERSAL - 1] = (const u8 *)0x83be815, + [MOVE_SPITE - 1] = (const u8 *)0x83be846, + [MOVE_POWDER_SNOW - 1] = (const u8 *)0x83be875, + [MOVE_PROTECT - 1] = (const u8 *)0x83be8ab, + [MOVE_MACH_PUNCH - 1] = (const u8 *)0x83be8de, + [MOVE_SCARY_FACE - 1] = (const u8 *)0x83be911, + [MOVE_FAINT_ATTACK - 1] = (const u8 *)0x83be946, + [MOVE_SWEET_KISS - 1] = (const u8 *)0x83be976, + [MOVE_BELLY_DRUM - 1] = (const u8 *)0x83be9ac, + [MOVE_SLUDGE_BOMB - 1] = (const u8 *)0x83be9d3, + [MOVE_MUD_SLAP - 1] = (const u8 *)0x83bea08, + [MOVE_OCTAZOOKA - 1] = (const u8 *)0x83bea3c, + [MOVE_SPIKES - 1] = (const u8 *)0x83bea6c, + [MOVE_ZAP_CANNON - 1] = (const u8 *)0x83bea98, + [MOVE_FORESIGHT - 1] = (const u8 *)0x83beace, + [MOVE_DESTINY_BOND - 1] = (const u8 *)0x83beb01, + [MOVE_PERISH_SONG - 1] = (const u8 *)0x83beb34, + [MOVE_ICEBREATH - 1] = (const u8 *)0x83beb65, + [MOVE_DETECT - 1] = (const u8 *)0x83beb94, + [MOVE_BONE_RUSH - 1] = (const u8 *)0x83bebc7, + [MOVE_DATA_STREAM - 1] = (const u8 *)0x83bebf9, + [MOVE_OUTRAGE - 1] = (const u8 *)0x83bec2b, + [MOVE_SANDSTORM - 1] = (const u8 *)0x83bec5d, + [MOVE_GIGA_DRAIN - 1] = (const u8 *)0x83bec8e, + [MOVE_ENDURE - 1] = (const u8 *)0x83becbf, + [MOVE_CHARM - 1] = (const u8 *)0x83becf4, + [MOVE_ROLLOUT - 1] = (const u8 *)0x83bed23, + [MOVE_SHADOW_SWIPE - 1] = (const u8 *)0x83bed54, + [MOVE_SWAGGER - 1] = (const u8 *)0x83bed86, + [MOVE_MILK_DRINK - 1] = (const u8 *)0x83bedb8, + [MOVE_SPARK - 1] = (const u8 *)0x83bede3, + [MOVE_FURY_CUTTER - 1] = (const u8 *)0x83bee14, + [MOVE_STEEL_WING - 1] = (const u8 *)0x83bee47, + [MOVE_MEAN_LOOK - 1] = (const u8 *)0x83bee74, + [MOVE_ATTRACT - 1] = (const u8 *)0x83beea9, + [MOVE_SLEEP_TALK - 1] = (const u8 *)0x83beeda, + [MOVE_HEAL_BELL - 1] = (const u8 *)0x83bef02, + [MOVE_RETURN - 1] = (const u8 *)0x83bef36, + [MOVE_PRESENT - 1] = (const u8 *)0x83bef69, + [MOVE_FRUSTRATION - 1] = (const u8 *)0x83bef97, + [MOVE_SAFEGUARD - 1] = (const u8 *)0x83befce, + [MOVE_PAIN_SPLIT - 1] = (const u8 *)0x83beffd, + [MOVE_SACRED_FIRE - 1] = (const u8 *)0x83bf033, + [MOVE_MAGNITUDE - 1] = (const u8 *)0x83bf063, + [MOVE_DYNAMIC_PUNCH - 1] = (const u8 *)0x83bf090, + [MOVE_MEGAHORN - 1] = (const u8 *)0x83bf0c6, + [MOVE_DRAGON_BREATH - 1] = (const u8 *)0x83bf0f6, + [MOVE_BATON_PASS - 1] = (const u8 *)0x83bf12a, + [MOVE_ENCORE - 1] = (const u8 *)0x83bf15f, + [MOVE_PURSUIT - 1] = (const u8 *)0x83bf195, + [MOVE_RAPID_SPIN - 1] = (const u8 *)0x83bf1c9, + [MOVE_SWEET_SCENT - 1] = (const u8 *)0x83bf1f9, + [MOVE_IRON_TAIL - 1] = (const u8 *)0x83bf220, + [MOVE_METAL_CLAW - 1] = (const u8 *)0x83bf252, + [MOVE_VITAL_THROW - 1] = (const u8 *)0x83bf282, + [MOVE_MORNING_SUN - 1] = (const u8 *)0x83bf2b3, + [MOVE_SYNTHESIS - 1] = (const u8 *)0x83bf2e4, + [MOVE_MOONLIGHT - 1] = (const u8 *)0x83bf315, + [MOVE_HIDDEN_POWER - 1] = (const u8 *)0x83bf346, + [MOVE_CROSS_CHOP - 1] = (const u8 *)0x83bf36e, + [MOVE_TWISTER - 1] = (const u8 *)0x83bf3a1, + [MOVE_RAIN_DANCE - 1] = (const u8 *)0x83bf3d0, + [MOVE_SUNNY_DAY - 1] = (const u8 *)0x83bf403, + [MOVE_CRUNCH - 1] = (const u8 *)0x83bf435, + [MOVE_MIRROR_COAT - 1] = (const u8 *)0x83bf463, + [MOVE_PSYCH_UP - 1] = (const u8 *)0x83bf49a, + [MOVE_EXTREME_SPEED - 1] = (const u8 *)0x83bf4cc, + [MOVE_ANCIENT_POWER - 1] = (const u8 *)0x83bf4f3, + [MOVE_SHADOW_BALL - 1] = (const u8 *)0x83bf517, + [MOVE_FUTURE_SIGHT - 1] = (const u8 *)0x83bf54c, + [MOVE_ROCK_SMASH - 1] = (const u8 *)0x83bf57b, + [MOVE_WHIRLPOOL - 1] = (const u8 *)0x83bf5aa, + [MOVE_BEAT_UP - 1] = (const u8 *)0x83bf5e3, + [MOVE_FAKE_OUT - 1] = (const u8 *)0x83bf610, + [MOVE_UPROAR - 1] = (const u8 *)0x83bf643, + [MOVE_STOCKPILE - 1] = (const u8 *)0x83bf679, + [MOVE_SPIT_UP - 1] = (const u8 *)0x83bf69d, + [MOVE_SWALLOW - 1] = (const u8 *)0x83bf6ce, + [MOVE_HEAT_WAVE - 1] = (const u8 *)0x83bf6f8, + [MOVE_HAIL - 1] = (const u8 *)0x83bf72d, + [MOVE_TORMENT - 1] = (const u8 *)0x83bf75a, + [MOVE_FLATTER - 1] = (const u8 *)0x83bf78f, + [MOVE_WILL_O_WISP - 1] = (const u8 *)0x83bf7b9, + [MOVE_MEMENTO - 1] = (const u8 *)0x83bf7e7, + [MOVE_FACADE - 1] = (const u8 *)0x83bf817, + [MOVE_FOCUS_PUNCH - 1] = (const u8 *)0x83bf84a, + [MOVE_SMELLING_SALT - 1] = (const u8 *)0x83bf87f, + [MOVE_FOLLOW_ME - 1] = (const u8 *)0x83bf8b5, + [MOVE_NATURE_POWER - 1] = (const u8 *)0x83bf8e8, + [MOVE_CHARGE - 1] = (const u8 *)0x83bf91d, + [MOVE_TAUNT - 1] = (const u8 *)0x83bf951, + [MOVE_HELPING_HAND - 1] = (const u8 *)0x83bf97e, + [MOVE_TRICK - 1] = (const u8 *)0x83bf9a9, + [MOVE_ROLE_PLAY - 1] = (const u8 *)0x83bf9d1, + [MOVE_WISH - 1] = (const u8 *)0x83bfa03, + [MOVE_ASSIST - 1] = (const u8 *)0x83bfa33, + [MOVE_INGRAIN - 1] = (const u8 *)0x83bfa65, + [MOVE_SUPERPOWER - 1] = (const u8 *)0x83bfa9c, + [MOVE_MAGIC_COAT - 1] = (const u8 *)0x83bfacb, + [MOVE_RECYCLE - 1] = (const u8 *)0x83bfafa, + [MOVE_REVENGE - 1] = (const u8 *)0x83bfb21, + [MOVE_BRICK_BREAK - 1] = (const u8 *)0x83bfb53, + [MOVE_YAWN - 1] = (const u8 *)0x83bfb88, + [MOVE_KNOCK_OFF - 1] = (const u8 *)0x83bfbbd, + [MOVE_ENDEAVOR - 1] = (const u8 *)0x83bfbf1, + [MOVE_ERUPTION - 1] = (const u8 *)0x83bfc2a, + [MOVE_SKILL_SWAP - 1] = (const u8 *)0x83bfc5c, + [MOVE_IMPRISON - 1] = (const u8 *)0x83bfc8e, + [MOVE_REFRESH - 1] = (const u8 *)0x83bfcc0, + [MOVE_GRUDGE - 1] = (const u8 *)0x83bfce7, + [MOVE_SNATCH - 1] = (const u8 *)0x83bfd1d, + [MOVE_SECRET_POWER - 1] = (const u8 *)0x83bfd4f, + [MOVE_DIVE - 1] = (const u8 *)0x83bfd7d, + [MOVE_ARM_THRUST - 1] = (const u8 *)0x83bfdb4, + [MOVE_CAMOUFLAGE - 1] = (const u8 *)0x83bfdeb, + [MOVE_BRIGHT_IDEA - 1] = (const u8 *)0x83bfe20, + [MOVE_CRAZY_BOLT - 1] = (const u8 *)0x83bfe4d, + [MOVE_AFRO_BREAK - 1] = (const u8 *)0x83bfe7f, + [MOVE_FEATHER_DANCE - 1] = (const u8 *)0x83bfeb1, + [MOVE_TEETER_DANCE - 1] = (const u8 *)0x83bfee6, + [MOVE_FRICTIONKICK - 1] = (const u8 *)0x83bff09, + [MOVE_MUD_SPORT - 1] = (const u8 *)0x83bff43, + [MOVE_ICE_BALL - 1] = (const u8 *)0x83bff7a, + [MOVE_NEEDLE_ARM - 1] = (const u8 *)0x83bffaf, + [MOVE_SLACK_OFF - 1] = (const u8 *)0x83bffde, + [MOVE_HYPER_VOICE - 1] = (const u8 *)0x83c000b, + [MOVE_POISON_FANG - 1] = (const u8 *)0x83c003a, + [MOVE_CRUSH_CLAW - 1] = (const u8 *)0x83c006b, + [MOVE_BLAST_BURN - 1] = (const u8 *)0x83c00a1, + [MOVE_HYDRO_CANNON - 1] = (const u8 *)0x83c00d7, + [MOVE_METEOR_MASH - 1] = (const u8 *)0x83c010d, + [MOVE_ASTONISH - 1] = (const u8 *)0x83c013a, + [MOVE_WEATHER_BALL - 1] = (const u8 *)0x83c016b, + [MOVE_AROMATHERAPY - 1] = (const u8 *)0x83c019e, + [MOVE_FAKE_TEARS - 1] = (const u8 *)0x83c01cf, + [MOVE_AIR_CUTTER - 1] = (const u8 *)0x83c0201, + [MOVE_OVERHEAT - 1] = (const u8 *)0x83c0235, + [MOVE_ODOR_SLEUTH - 1] = (const u8 *)0x83c026d, + [MOVE_ROCK_TOMB - 1] = (const u8 *)0x83c02a0, + [MOVE_SILVER_WIND - 1] = (const u8 *)0x83c02d5, + [MOVE_METAL_SOUND - 1] = (const u8 *)0x83c0300, + [MOVE_GRASS_WHISTLE - 1] = (const u8 *)0x83c0336, + [MOVE_TICKLE - 1] = (const u8 *)0x83c0367, + [MOVE_COSMIC_POWER - 1] = (const u8 *)0x83c0398, + [MOVE_WATER_SPOUT - 1] = (const u8 *)0x83c03c8, + [MOVE_SIGNAL_BEAM - 1] = (const u8 *)0x83c03f7, + [MOVE_SHADOW_PUNCH - 1] = (const u8 *)0x83c0427, + [MOVE_EXTRASENSORY - 1] = (const u8 *)0x83c0459, + [MOVE_SKY_UPPERCUT - 1] = (const u8 *)0x83c048d, + [MOVE_SAND_TOMB - 1] = (const u8 *)0x83c04bc, + [MOVE_SHEER_COLD - 1] = (const u8 *)0x83c04f3, + [MOVE_MUDDY_WATER - 1] = (const u8 *)0x83c0526, + [MOVE_BULLET_SEED - 1] = (const u8 *)0x83c0554, + [MOVE_AERIAL_ACE - 1] = (const u8 *)0x83c0584, + [MOVE_CRYSTALSTORM - 1] = (const u8 *)0x83c05b0, + [MOVE_IRON_DEFENSE - 1] = (const u8 *)0x83c05e3, + [MOVE_BLOCK - 1] = (const u8 *)0x83c0618, + [MOVE_HOWL - 1] = (const u8 *)0x83c0640, + [MOVE_DRAGON_CLAW - 1] = (const u8 *)0x83c066d, + [MOVE_FRENZY_PLANT - 1] = (const u8 *)0x83c068f, + [MOVE_BULK_UP - 1] = (const u8 *)0x83c06c5, + [MOVE_BOUNCE - 1] = (const u8 *)0x83c06f9, + [MOVE_MUD_SHOT - 1] = (const u8 *)0x83c072c, + [MOVE_POISON_TAIL - 1] = (const u8 *)0x83c0754, + [MOVE_COVET - 1] = (const u8 *)0x83c0784, + [MOVE_WILD_BOLT - 1] = (const u8 *)0x83c07b3, + [MOVE_MAGICAL_LEAF - 1] = (const u8 *)0x83c07e7, + [MOVE_WATER_SPORT - 1] = (const u8 *)0x83c081a, + [MOVE_CALM_MIND - 1] = (const u8 *)0x83c084f, + [MOVE_LEAF_BLADE - 1] = (const u8 *)0x83c0880, + [MOVE_FURY_DANCE - 1] = (const u8 *)0x83c08b4, + [MOVE_ROCK_BLAST - 1] = (const u8 *)0x83c08e0, + [MOVE_SHOCK_WAVE - 1] = (const u8 *)0x83c0911, + [MOVE_WATER_PULSE - 1] = (const u8 *)0x83c0939, + [MOVE_PULSAR - 1] = (const u8 *)0x83c096c, + [MOVE_CURSE_CLAW - 1] = (const u8 *)0x83c099d, +}; \ No newline at end of file diff --git a/src/data/moves/names.c b/src/data/moves/names.c new file mode 100644 index 0000000..5e41748 --- /dev/null +++ b/src/data/moves/names.c @@ -0,0 +1,360 @@ +#include "types.h" +#include "constants/moves.h" + +const u8 gMoveNames[][13] = { + [MOVE_NONE] = _("-"), + [MOVE_POUND] = _("POUND"), + [MOVE_KARATE_CHOP] = _("KARATE CHOP"), + [MOVE_DOUBLE_SLAP] = _("DOUBLESLAP"), + [MOVE_COMET_PUNCH] = _("COMET PUNCH"), + [MOVE_MEGA_PUNCH] = _("MEGA PUNCH"), + [MOVE_PAY_DAY] = _("PAY DAY"), + [MOVE_FIRE_PUNCH] = _("FIRE PUNCH"), + [MOVE_ICE_PUNCH] = _("ICE PUNCH"), + [MOVE_THUNDER_PUNCH] = _("THUNDERPUNCH"), + [MOVE_SCRATCH] = _("SCRATCH"), + [MOVE_VICE_GRIP] = _("VICEGRIP"), + [MOVE_GUILLOTINE] = _("GUILLOTINE"), + [MOVE_RAZOR_WIND] = _("RAZOR WIND"), + [MOVE_SWORDS_DANCE] = _("SWORDS DANCE"), + [MOVE_CUT] = _("CUT"), + [MOVE_GUST] = _("GUST"), + [MOVE_WING_ATTACK] = _("WING ATTACK"), + [MOVE_WHIRLWIND] = _("WHIRLWIND"), + [MOVE_FLY] = _("FLY"), + [MOVE_BIND] = _("BIND"), + [MOVE_SLAM] = _("SLAM"), + [MOVE_VINE_WHIP] = _("VINE WHIP"), + [MOVE_SKULLBREAKER] = _("SKULLBREAKER"), + [MOVE_DOUBLE_KICK] = _("DOUBLE KICK"), + [MOVE_MEGA_KICK] = _("MEGA KICK"), + [MOVE_JUMP_KICK] = _("JUMP KICK"), + [MOVE_ROLLING_KICK] = _("ROLLING KICK"), + [MOVE_SAND_ATTACK] = _("SAND-ATTACK"), + [MOVE_HEADBUTT] = _("HEADBUTT"), + [MOVE_HORN_ATTACK] = _("HORN ATTACK"), + [MOVE_FURY_ATTACK] = _("FURY ATTACK"), + [MOVE_HORN_DRILL] = _("HORN DRILL"), + [MOVE_TACKLE] = _("TACKLE"), + [MOVE_BODY_SLAM] = _("BODY SLAM"), + [MOVE_WRAP] = _("WRAP"), + [MOVE_TAKE_DOWN] = _("TAKE DOWN"), + [MOVE_THRASH] = _("THRASH"), + [MOVE_DOUBLE_EDGE] = _("DOUBLE-EDGE"), + [MOVE_TAIL_WHIP] = _("TAIL WHIP"), + [MOVE_POISON_STING] = _("POISON STING"), + [MOVE_TWINEEDLE] = _("TWINEEDLE"), + [MOVE_PIN_MISSILE] = _("PIN MISSILE"), + [MOVE_LEER] = _("LEER"), + [MOVE_BITE] = _("BITE"), + [MOVE_GROWL] = _("GROWL"), + [MOVE_ROAR] = _("ROAR"), + [MOVE_SING] = _("SING"), + [MOVE_SUPERSONIC] = _("SUPERSONIC"), + [MOVE_SONIC_BOOM] = _("SONICBOOM"), + [MOVE_DISABLE] = _("DISABLE"), + [MOVE_ACID] = _("ACID"), + [MOVE_EMBER] = _("EMBER"), + [MOVE_FIRE_PUMP] = _("FIRE PUMP"), + [MOVE_MIST] = _("MIST"), + [MOVE_WATER_GUN] = _("WATER GUN"), + [MOVE_STORM_SURGE] = _("STORM SURGE"), + [MOVE_SURF] = _("SURF"), + [MOVE_ICE_BEAM] = _("ICE BEAM"), + [MOVE_BLIZZARD] = _("BLIZZARD"), + [MOVE_PSYBEAM] = _("PSYBEAM"), + [MOVE_BOILINGWATER] = _("BOILINGWATER"), + [MOVE_AURORA_BEAM] = _("AURORA BEAM"), + [MOVE_HYPER_BEAM] = _("HYPER BEAM"), + [MOVE_PECK] = _("PECK"), + [MOVE_DRILL_PECK] = _("DRILL PECK"), + [MOVE_SUBMISSION] = _("SUBMISSION"), + [MOVE_LOW_KICK] = _("LOW KICK"), + [MOVE_COUNTER] = _("COUNTER"), + [MOVE_SEISMIC_TOSS] = _("SEISMIC TOSS"), + [MOVE_STRENGTH] = _("STRENGTH"), + [MOVE_ABSORB] = _("ABSORB"), + [MOVE_MEGA_DRAIN] = _("MEGA DRAIN"), + [MOVE_LEECH_SEED] = _("LEECH SEED"), + [MOVE_GROWTH] = _("GROWTH"), + [MOVE_RAZOR_LEAF] = _("RAZOR LEAF"), + [MOVE_SOLAR_BEAM] = _("SOLARBEAM"), + [MOVE_POISON_POWDER] = _("POISONPOWDER"), + [MOVE_STUN_SPORE] = _("STUN SPORE"), + [MOVE_SLEEP_POWDER] = _("SLEEP POWDER"), + [MOVE_PETAL_DANCE] = _("PETAL DANCE"), + [MOVE_STRING_SHOT] = _("STRING SHOT"), + [MOVE_DRACO_FURY] = _("DRACO FURY"), + [MOVE_FIRE_SPIN] = _("FIRE SPIN"), + [MOVE_THUNDER_SHOCK] = _("THUNDERSHOCK"), + [MOVE_THUNDERBOLT] = _("THUNDERBOLT"), + [MOVE_THUNDER_WAVE] = _("THUNDER WAVE"), + [MOVE_DISCHARGE] = _("DISCHARGE"), + [MOVE_ROCK_THROW] = _("ROCK THROW"), + [MOVE_EARTHQUAKE] = _("EARTHQUAKE"), + [MOVE_FISSURE] = _("FISSURE"), + [MOVE_DIG] = _("DIG"), + [MOVE_TOXIC] = _("TOXIC"), + [MOVE_CONFUSION] = _("CONFUSION"), + [MOVE_PSYCHIC] = _("PSYCHIC"), + [MOVE_HYPNOSIS] = _("HYPNOSIS"), + [MOVE_MEDITATE] = _("MEDITATE"), + [MOVE_AGILITY] = _("AGILITY"), + [MOVE_QUICK_ATTACK] = _("QUICK ATTACK"), + [MOVE_RAGE] = _("RAGE"), + [MOVE_TELEPORT] = _("TELEPORT"), + [MOVE_NIGHT_SHADE] = _("NIGHT SHADE"), + [MOVE_MIMIC] = _("MIMIC"), + [MOVE_SCREECH] = _("SCREECH"), + [MOVE_DOUBLE_TEAM] = _("DOUBLE TEAM"), + [MOVE_RECOVER] = _("RECOVER"), + [MOVE_HARDEN] = _("HARDEN"), + [MOVE_MINIMIZE] = _("MINIMIZE"), + [MOVE_SMOKESCREEN] = _("SMOKESCREEN"), + [MOVE_CONFUSE_RAY] = _("CONFUSE RAY"), + [MOVE_WITHDRAW] = _("WITHDRAW"), + [MOVE_DEFENSE_CURL] = _("DEFENSE CURL"), + [MOVE_BARRIER] = _("BARRIER"), + [MOVE_LIGHT_SCREEN] = _("LIGHT SCREEN"), + [MOVE_HAZE] = _("HAZE"), + [MOVE_REFLECT] = _("REFLECT"), + [MOVE_FOCUS_ENERGY] = _("FOCUS ENERGY"), + [MOVE_BIDE] = _("BIDE"), + [MOVE_METRONOME] = _("METRONOME"), + [MOVE_MIRROR_MOVE] = _("MIRROR MOVE"), + [MOVE_SELF_DESTRUCT] = _("SELFDESTRUCT"), + [MOVE_EGG_BOMB] = _("EGG BOMB"), + [MOVE_LICK] = _("LICK"), + [MOVE_SMOG] = _("SMOG"), + [MOVE_SLUDGE] = _("SLUDGE"), + [MOVE_BONE_CLUB] = _("BONE CLUB"), + [MOVE_FIRE_BLAST] = _("FIRE BLAST"), + [MOVE_WATERFALL] = _("WATERFALL"), + [MOVE_CLAMP] = _("CLAMP"), + [MOVE_SWIFT] = _("SWIFT"), + [MOVE_SKULL_BASH] = _("SKULL BASH"), + [MOVE_SPIKE_CANNON] = _("SPIKE CANNON"), + [MOVE_CONSTRICT] = _("CONSTRICT"), + [MOVE_AMNESIA] = _("AMNESIA"), + [MOVE_KINESIS] = _("KINESIS"), + [MOVE_SOFT_BOILED] = _("SOFTBOILED"), + [MOVE_HI_JUMP_KICK] = _("HI JUMP KICK"), + [MOVE_GLARE] = _("GLARE"), + [MOVE_DREAM_EATER] = _("DREAM EATER"), + [MOVE_POISON_GAS] = _("POISON GAS"), + [MOVE_BARRAGE] = _("BARRAGE"), + [MOVE_LEECH_LIFE] = _("LEECH LIFE"), + [MOVE_LOVELY_KISS] = _("LOVELY KISS"), + [MOVE_SKY_ATTACK] = _("SKY ATTACK"), + [MOVE_TRANSFORM] = _("TRANSFORM"), + [MOVE_BUBBLE] = _("BUBBLE"), + [MOVE_DIZZY_PUNCH] = _("DIZZY PUNCH"), + [MOVE_SPORE] = _("SPORE"), + [MOVE_FLASH] = _("FLASH"), + [MOVE_PSYWAVE] = _("PSYWAVE"), + [MOVE_SPLASH] = _("SPLASH"), + [MOVE_ACID_ARMOR] = _("ACID ARMOR"), + [MOVE_CRABHAMMER] = _("CRABHAMMER"), + [MOVE_EXPLOSION] = _("EXPLOSION"), + [MOVE_FURY_SWIPES] = _("FURY SWIPES"), + [MOVE_BONEMERANG] = _("BONEMERANG"), + [MOVE_REST] = _("REST"), + [MOVE_ROCK_SLIDE] = _("ROCK SLIDE"), + [MOVE_HYPER_FANG] = _("HYPER FANG"), + [MOVE_SHARPEN] = _("SHARPEN"), + [MOVE_CONVERSION] = _("CONVERSION"), + [MOVE_TRI_ATTACK] = _("TRI ATTACK"), + [MOVE_SUPER_FANG] = _("SUPER FANG"), + [MOVE_SLASH] = _("SLASH"), + [MOVE_SUBSTITUTE] = _("SUBSTITUTE"), + [MOVE_STRUGGLE] = _("STRUGGLE"), + [MOVE_SKETCH] = _("SKETCH"), + [MOVE_TRIPLE_KICK] = _("TRIPLE KICK"), + [MOVE_THIEF] = _("THIEF"), + [MOVE_SPIDER_WEB] = _("SPIDER WEB"), + [MOVE_MIND_READER] = _("MIND READER"), + [MOVE_NIGHTMARE] = _("NIGHTMARE"), + [MOVE_FLAME_WHEEL] = _("FLAME WHEEL"), + [MOVE_SNORE] = _("SNORE"), + [MOVE_CURSE] = _("CURSE"), + [MOVE_FLAIL] = _("FLAIL"), + [MOVE_CONVERSION_2] = _("CONVERSION 2"), + [MOVE_AEROBLAST] = _("AEROBLAST"), + [MOVE_COTTON_SPORE] = _("COTTON SPORE"), + [MOVE_REVERSAL] = _("REVERSAL"), + [MOVE_SPITE] = _("SPITE"), + [MOVE_POWDER_SNOW] = _("POWDER SNOW"), + [MOVE_PROTECT] = _("PROTECT"), + [MOVE_MACH_PUNCH] = _("MACH PUNCH"), + [MOVE_SCARY_FACE] = _("SCARY FACE"), + [MOVE_FAINT_ATTACK] = _("FAINT ATTACK"), + [MOVE_SWEET_KISS] = _("SWEET KISS"), + [MOVE_BELLY_DRUM] = _("BELLY DRUM"), + [MOVE_SLUDGE_BOMB] = _("SLUDGE BOMB"), + [MOVE_MUD_SLAP] = _("MUD-SLAP"), + [MOVE_OCTAZOOKA] = _("OCTAZOOKA"), + [MOVE_SPIKES] = _("SPIKES"), + [MOVE_ZAP_CANNON] = _("ZAP CANNON"), + [MOVE_FORESIGHT] = _("FORESIGHT"), + [MOVE_DESTINY_BOND] = _("DESTINY BOND"), + [MOVE_PERISH_SONG] = _("PERISH SONG"), + [MOVE_ICEBREATH] = _("ICE BREATH"), + [MOVE_DETECT] = _("DETECT"), + [MOVE_BONE_RUSH] = _("BONE RUSH"), + [MOVE_DATA_STREAM] = _("DATA STREAM"), + [MOVE_OUTRAGE] = _("OUTRAGE"), + [MOVE_SANDSTORM] = _("SANDSTORM"), + [MOVE_GIGA_DRAIN] = _("GIGA DRAIN"), + [MOVE_ENDURE] = _("ENDURE"), + [MOVE_CHARM] = _("CHARM"), + [MOVE_ROLLOUT] = _("ROLLOUT"), + [MOVE_SHADOW_SWIPE] = _("SHADOW SWIPE"), + [MOVE_SWAGGER] = _("SWAGGER"), + [MOVE_MILK_DRINK] = _("MILK DRINK"), + [MOVE_SPARK] = _("SPARK"), + [MOVE_FURY_CUTTER] = _("FURY CUTTER"), + [MOVE_STEEL_WING] = _("STEEL WING"), + [MOVE_MEAN_LOOK] = _("MEAN LOOK"), + [MOVE_ATTRACT] = _("ATTRACT"), + [MOVE_SLEEP_TALK] = _("SLEEP TALK"), + [MOVE_HEAL_BELL] = _("HEAL BELL"), + [MOVE_RETURN] = _("RETURN"), + [MOVE_PRESENT] = _("PRESENT"), + [MOVE_FRUSTRATION] = _("FRUSTRATION"), + [MOVE_SAFEGUARD] = _("SAFEGUARD"), + [MOVE_PAIN_SPLIT] = _("PAIN SPLIT"), + [MOVE_SACRED_FIRE] = _("SACRED FIRE"), + [MOVE_MAGNITUDE] = _("MAGNITUDE"), + [MOVE_DYNAMIC_PUNCH] = _("DYNAMICPUNCH"), + [MOVE_MEGAHORN] = _("MEGAHORN"), + [MOVE_DRAGON_BREATH] = _("DRAGONBREATH"), + [MOVE_BATON_PASS] = _("BATON PASS"), + [MOVE_ENCORE] = _("ENCORE"), + [MOVE_PURSUIT] = _("PURSUIT"), + [MOVE_RAPID_SPIN] = _("RAPID SPIN"), + [MOVE_SWEET_SCENT] = _("SWEET SCENT"), + [MOVE_IRON_TAIL] = _("IRON SLAM"), + [MOVE_METAL_CLAW] = _("METAL CLAW"), + [MOVE_VITAL_THROW] = _("VITAL THROW"), + [MOVE_MORNING_SUN] = _("MORNING SUN"), + [MOVE_SYNTHESIS] = _("SYNTHESIS"), + [MOVE_MOONLIGHT] = _("MOONLIGHT"), + [MOVE_HIDDEN_POWER] = _("HIDDEN POWER"), + [MOVE_CROSS_CHOP] = _("CROSS CHOP"), + [MOVE_TWISTER] = _("TWISTER"), + [MOVE_RAIN_DANCE] = _("RAIN DANCE"), + [MOVE_SUNNY_DAY] = _("SUNNY DAY"), + [MOVE_CRUNCH] = _("CRUNCH"), + [MOVE_MIRROR_COAT] = _("MIRROR COAT"), + [MOVE_PSYCH_UP] = _("PSYCH UP"), + [MOVE_EXTREME_SPEED] = _("EXTREMESPEED"), + [MOVE_ANCIENT_POWER] = _("ANCIENTPOWER"), + [MOVE_SHADOW_BALL] = _("SHADOW BALL"), + [MOVE_FUTURE_SIGHT] = _("FUTURE SIGHT"), + [MOVE_ROCK_SMASH] = _("ROCK SMASH"), + [MOVE_WHIRLPOOL] = _("WHIRLPOOL"), + [MOVE_BEAT_UP] = _("BEAT UP"), + [MOVE_FAKE_OUT] = _("FAKE OUT"), + [MOVE_UPROAR] = _("UPROAR"), + [MOVE_STOCKPILE] = _("STOCKPILE"), + [MOVE_SPIT_UP] = _("SPIT UP"), + [MOVE_SWALLOW] = _("SWALLOW"), + [MOVE_HEAT_WAVE] = _("HEAT WAVE"), + [MOVE_HAIL] = _("HAIL"), + [MOVE_TORMENT] = _("TORMENT"), + [MOVE_FLATTER] = _("FLATTER"), + [MOVE_WILL_O_WISP] = _("WILL-O-WISP"), + [MOVE_MEMENTO] = _("MEMENTO"), + [MOVE_FACADE] = _("FACADE"), + [MOVE_FOCUS_PUNCH] = _("FOCUS PUNCH"), + [MOVE_SMELLING_SALT] = _("SMELLINGSALT"), + [MOVE_FOLLOW_ME] = _("FOLLOW ME"), + [MOVE_NATURE_POWER] = _("NATURE POWER"), + [MOVE_CHARGE] = _("CHARGE"), + [MOVE_TAUNT] = _("TAUNT"), + [MOVE_HELPING_HAND] = _("HELPING HAND"), + [MOVE_TRICK] = _("TRICK"), + [MOVE_ROLE_PLAY] = _("ROLE PLAY"), + [MOVE_WISH] = _("WISH"), + [MOVE_ASSIST] = _("ASSIST"), + [MOVE_INGRAIN] = _("INGRAIN"), + [MOVE_SUPERPOWER] = _("SUPERPOWER"), + [MOVE_MAGIC_COAT] = _("MAGIC COAT"), + [MOVE_RECYCLE] = _("RECYCLE"), + [MOVE_REVENGE] = _("REVENGE"), + [MOVE_BRICK_BREAK] = _("BRICK BREAK"), + [MOVE_YAWN] = _("YAWN"), + [MOVE_KNOCK_OFF] = _("KNOCK OFF"), + [MOVE_ENDEAVOR] = _("ENDEAVOR"), + [MOVE_ERUPTION] = _("ERUPTION"), + [MOVE_SKILL_SWAP] = _("SKILL SWAP"), + [MOVE_IMPRISON] = _("IMPRISON"), + [MOVE_REFRESH] = _("REFRESH"), + [MOVE_GRUDGE] = _("GRUDGE"), + [MOVE_SNATCH] = _("SNATCH"), + [MOVE_SECRET_POWER] = _("SECRET POWER"), + [MOVE_DIVE] = _("DIVE"), + [MOVE_ARM_THRUST] = _("ARM THRUST"), + [MOVE_CAMOUFLAGE] = _("CAMOUFLAGE"), + [MOVE_BRIGHT_IDEA] = _("BRIGHT IDEA"), + [MOVE_CRAZY_BOLT] = _("CRAZY BOLT"), + [MOVE_AFRO_BREAK] = _("AFRO BREAK"), + [MOVE_FEATHER_DANCE] = _("FEATHERDANCE"), + [MOVE_TEETER_DANCE] = _("TEETER DANCE"), + [MOVE_FRICTIONKICK] = _("FRICTIONKICK"), + [MOVE_MUD_SPORT] = _("MUD SPORT"), + [MOVE_ICE_BALL] = _("ICE BALL"), + [MOVE_NEEDLE_ARM] = _("NEEDLE ARM"), + [MOVE_SLACK_OFF] = _("SLACK OFF"), + [MOVE_HYPER_VOICE] = _("HYPER VOICE"), + [MOVE_POISON_FANG] = _("POISON FANG"), + [MOVE_CRUSH_CLAW] = _("CRUSH CLAW"), + [MOVE_BLAST_BURN] = _("BLAST BURN"), + [MOVE_HYDRO_CANNON] = _("HYDRO CANNON"), + [MOVE_METEOR_MASH] = _("METEOR MASH"), + [MOVE_ASTONISH] = _("ASTONISH"), + [MOVE_WEATHER_BALL] = _("WEATHER BALL"), + [MOVE_AROMATHERAPY] = _("AROMATHERAPY"), + [MOVE_FAKE_TEARS] = _("FAKE TEARS"), + [MOVE_AIR_CUTTER] = _("AIR CUTTER"), + [MOVE_OVERHEAT] = _("OVERHEAT"), + [MOVE_ODOR_SLEUTH] = _("ODOR SLEUTH"), + [MOVE_ROCK_TOMB] = _("ROCK TOMB"), + [MOVE_SILVER_WIND] = _("SILVER WIND"), + [MOVE_METAL_SOUND] = _("METAL SOUND"), + [MOVE_GRASS_WHISTLE] = _("GRASSWHISTLE"), + [MOVE_TICKLE] = _("TICKLE"), + [MOVE_COSMIC_POWER] = _("COSMIC POWER"), + [MOVE_WATER_SPOUT] = _("WATER SPOUT"), + [MOVE_SIGNAL_BEAM] = _("SIGNAL BEAM"), + [MOVE_SHADOW_PUNCH] = _("SHADOW PUNCH"), + [MOVE_EXTRASENSORY] = _("EXTRASENSORY"), + [MOVE_SKY_UPPERCUT] = _("SKY UPPERCUT"), + [MOVE_SAND_TOMB] = _("SAND TOMB"), + [MOVE_SHEER_COLD] = _("SHEER COLD"), + [MOVE_MUDDY_WATER] = _("MUDDY WATER"), + [MOVE_BULLET_SEED] = _("BULLET SEED"), + [MOVE_AERIAL_ACE] = _("AERIAL ACE"), + [MOVE_CRYSTALSTORM] = _("CRYSTALSTORM"), + [MOVE_IRON_DEFENSE] = _("IRON DEFENSE"), + [MOVE_BLOCK] = _("BLOCK"), + [MOVE_HOWL] = _("HOWL"), + [MOVE_DRAGON_CLAW] = _("DRAGON CLAW"), + [MOVE_FRENZY_PLANT] = _("FRENZY PLANT"), + [MOVE_BULK_UP] = _("BULK UP"), + [MOVE_BOUNCE] = _("BOUNCE"), + [MOVE_MUD_SHOT] = _("MUD SHOT"), + [MOVE_POISON_TAIL] = _("POISON SLASH"), + [MOVE_COVET] = _("COVET"), + [MOVE_WILD_BOLT] = _("WILD BOLT"), + [MOVE_MAGICAL_LEAF] = _("MAGICAL LEAF"), + [MOVE_WATER_SPORT] = _("WATER SPORT"), + [MOVE_CALM_MIND] = _("CALM MIND"), + [MOVE_LEAF_BLADE] = _("LEAF BLADE"), + [MOVE_FURY_DANCE] = _("FURY DANCE"), + [MOVE_ROCK_BLAST] = _("ROCK BLAST"), + [MOVE_SHOCK_WAVE] = _("SHOCK WAVE"), + [MOVE_WATER_PULSE] = _("WATER PULSE"), + [MOVE_PULSAR] = _("PULSAR"), + [MOVE_CURSE_CLAW] = _("CURSE CLAW"), +}; \ No newline at end of file diff --git a/src/battle_moves.c b/src/data/moves/split.c similarity index 99% rename from src/battle_moves.c rename to src/data/moves/split.c index e15c1ad..65d1281 100644 --- a/src/battle_moves.c +++ b/src/data/moves/split.c @@ -1,7 +1,5 @@ #include "types.h" #include "pokemon.h" -#include "constants/battle.h" -#include "constants/move_effects.h" #include "constants/moves.h" // 0x81fb144 diff --git a/src/debug.c b/src/debug.c new file mode 100644 index 0000000..8e79e30 --- /dev/null +++ b/src/debug.c @@ -0,0 +1,46 @@ +#include "types.h" +#include "debug.h" +#include "mini_printf.h" +#include "constants/gba.h" + +// hardware extensions for LOG_HANDLER_MGBA_PRINT +#define REG_DEBUG_ENABLE ((vu16*) (0x4FFF780)) // handshake: (w)[0xC0DE] -> (r)[0x1DEA] +#define REG_DEBUG_FLAGS ((vu16*) (0x4FFF700)) +#define REG_DEBUG_STRING ((char*) (0x4FFF600)) + +#define MGBA_REG_DEBUG_MAX (256) + +bool32 MgbaOpen(void) +{ + *REG_DEBUG_ENABLE = 0xC0DE; + return *REG_DEBUG_ENABLE == 0x1DEA; +} + +void MgbaClose(void) +{ + *REG_DEBUG_ENABLE = 0; +} + +void MgbaPrintf(s32 level, const char* ptr, ...) +{ + va_list args; + + level &= 0x7; + va_start(args, ptr); + mini_vsnprintf(REG_DEBUG_STRING, MGBA_REG_DEBUG_MAX, ptr, args); + va_end(args); + *REG_DEBUG_FLAGS = level | 0x100; +} + +void MgbaAssert(const char *pFile, s32 nLine, const char *pExpression, bool32 nStopProgram) +{ + if (nStopProgram) + { + MgbaPrintf(MGBA_LOG_ERROR, "ASSERTION FAILED FILE=[%s] LINE=[%d] EXP=[%s]", pFile, nLine, pExpression); + __asm__(".hword 0xEFFF"); + } + else + { + MgbaPrintf(MGBA_LOG_WARN, "WARING FILE=[%s] LINE=[%d] EXP=[%s]", pFile, nLine, pExpression); + } +} diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index c67b2de..bec21f2 100644 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -1,4 +1,5 @@ #include "types.h" +#include "debug.h" #include "field_effect_helpers.h" #include "event_object_movement.h" #include "fieldmap.h" diff --git a/src/field_message_box.c b/src/field_message_box.c index 84aedd1..30c9e56 100644 --- a/src/field_message_box.c +++ b/src/field_message_box.c @@ -73,9 +73,4 @@ void HideFieldMessageBoxInstant(void) TextWindow_EraseDialogueFrame(&gFieldMessageBoxWindow); sMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN; -} - -void ShowFieldMessageInstantBuffer(void) -{ - ShowFieldMessageInstant(gStringVar1); } \ No newline at end of file diff --git a/src/item_menu.c b/src/item_menu.c index efea95c..49d26a5 100644 --- a/src/item_menu.c +++ b/src/item_menu.c @@ -7,6 +7,7 @@ #include "item_use.h" #include "map_name_popup.h" #include "menu.h" +#include "pokemon.h" #include "script.h" #include "script_menu.h" #include "sound.h" diff --git a/src/mini_printf.c b/src/mini_printf.c new file mode 100644 index 0000000..8159148 --- /dev/null +++ b/src/mini_printf.c @@ -0,0 +1,356 @@ +/* + * The Minimal snprintf() implementation + * + * Copyright (c) 2013,2014 Michal Ludvig + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the auhor nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * mini-printf courtesy of https://github.com/mludvig/mini-printf + * stripped to reduce file size for agb needs + */ + +#include "types.h" +#include "text.h" +#include "mini_printf.h" +#include "string_util.h" + +#ifndef NDEBUG + +struct mini_buff +{ + char *buffer, *pbuffer; + u32 buffer_len; +}; + +static inline char mini_pchar_decode(char encoded) +{ + char ret = '?'; + if (encoded >= CHAR_a && encoded <= CHAR_z) + ret = encoded-(CHAR_a-'a'); // lower-case characters + else if (encoded >= CHAR_A && encoded <= CHAR_Z) + ret = encoded-(CHAR_A-'A'); // upper-case characters + else if (encoded >= CHAR_0 && encoded <= CHAR_9) + ret = encoded-(CHAR_0-'0'); // numbers + else if (encoded == CHAR_SPACE) + ret = ' '; // space + else if (encoded == CHAR_EXCL_MARK) + ret = '!'; // exclamation point + else if (encoded == CHAR_QUESTION_MARK) + ret = '?'; // question mark + else if (encoded == CHAR_PERIOD) + ret = '.'; // period + else if (encoded == CHAR_DBL_QUOT_LEFT || encoded == CHAR_DBL_QUOT_RIGHT) + ret = '"'; // double quote + else if (encoded == CHAR_SGL_QUOT_LEFT || encoded == CHAR_SGL_QUOT_RIGHT) + ret = '\''; // single quote + else if (encoded == CHAR_CURRENCY) + ret = '$'; // currency mark (pokemonies in game, dollar sign in logs) + else if (encoded == CHAR_COMMA) + ret = ','; // comma + else if (encoded == CHAR_MULT_SIGN) + ret = '#'; // pound, hashtag, octothorpe, whatever + else if (encoded == CHAR_SLASH) + ret = '/'; // slash + else if (encoded == CHAR_LESS_THAN) + ret = '<'; // less than sign + else if (encoded == CHAR_GREATER_THAN) + ret = '>'; // greater than sign + else if (encoded == CHAR_PERCENT) + ret = '%'; // percentage + else if (encoded == CHAR_LEFT_PAREN) + ret = '('; // opening parentheses + else if (encoded == CHAR_RIGHT_PAREN) + ret = ')'; // closing parentheses + return ret; +} + +static s32 _putsAscii(char *s, s32 len, void *buf) +{ + char *p0; + s32 i; + struct mini_buff *b; + + if (!buf) + return len; + + b = buf; + p0 = b->buffer; + + /* Copy to buffer */ + for (i = 0; i < len; i++) + { + if(b->pbuffer == b->buffer + b->buffer_len - 1) + { + break; + } + *(b->pbuffer ++) = s[i]; + } + *(b->pbuffer) = 0; + return b->pbuffer - p0; +} + +static s32 _putsEncoded(char *s, s32 len, void *buf) +{ + char *p0; + s32 i; + struct mini_buff *b; + + if (!buf) + return len; + + b = buf; + p0 = b->buffer; + + /* Copy to buffer */ + for (i = 0; i < len; i++) + { + if(b->pbuffer == b->buffer + b->buffer_len - 1) + { + break; + } + *(b->pbuffer ++) = mini_pchar_decode(s[i]); + } + *(b->pbuffer) = 0; + return b->pbuffer - p0; +} + +static s32 mini_strlen(const char *s) +{ + s32 len = 0; + while (s[len] != '\0') len++; + return len; +} + +static s32 mini_itoa(s32 value, u32 radix, s32 uppercase, bool32 unsig, char *buffer) +{ + char *pbuffer = buffer; + s32 negative = 0; + s32 i, len; + + /* No support for unusual radixes. */ + if (radix > 16) + return 0; + + if (value < 0 && !unsig) + { + negative = 1; + value = -value; + } + + /* This builds the string back to front ... */ + do + { + s32 digit = value % radix; + *(pbuffer++) = (digit < 10 ? '0' + digit : (uppercase ? 'A' : 'a') + digit - 10); + value /= radix; + } while (value > 0); + + if (negative) + *(pbuffer++) = '-'; + + *(pbuffer) = '\0'; + + /* ... now we reverse it (could do it recursively but will + * conserve the stack space) */ + len = (pbuffer - buffer); + for (i = 0; i < len / 2; i++) + { + char j = buffer[i]; + buffer[i] = buffer[len-i-1]; + buffer[len-i-1] = j; + } + + return len; +} + +static s32 mini_pad(char* ptr, s32 len, char pad_char, s32 pad_to, char *buffer) +{ + s32 i; + bool32 overflow = FALSE; + char * pbuffer = buffer; + if(pad_to == 0) + pad_to = len; + if (len > pad_to) + { + len = pad_to; + overflow = TRUE; + } + for(i = pad_to - len; i > 0; i --) + { + *(pbuffer++) = pad_char; + } + for(i = len; i > 0; i --) + { + *(pbuffer++) = *(ptr++); + } + len = pbuffer - buffer; + if(overflow) + { + for (i = 0; i < 3 && pbuffer > buffer; i ++) + { + *(pbuffer-- - 1) = '*'; + } + } + return len; +} + +s32 mini_vsnprintf(char *buffer, u32 buffer_len, const char *fmt, va_list va) +{ + struct mini_buff b; + s32 n; + b.buffer = buffer; + b.pbuffer = buffer; + b.buffer_len = buffer_len; + if (buffer_len == 0) + buffer = NULL; + n = mini_vpprintf((buffer != NULL) ? &b : NULL, fmt, va); + if (buffer == NULL) + return n; + return b.pbuffer - b.buffer; +} + +s32 mini_vpprintf(void* buf, const char *fmt, va_list va) +{ + char bf[24]; + char bf2[24]; + char ch; + s32 n; + n = 0; + while ((ch=*(fmt++))) + { + s32 len; + if (ch != '%') + { + len = 1; + len = _putsAscii(&ch, len, buf); + } else + { + char pad_char = ' '; + s32 pad_to = 0; + char l = 0; + char *ptr; + + ch=*(fmt++); + + /* Zero padding requested */ + if (ch == '0') + pad_char = '0'; + while (ch >= '0' && ch <= '9') + { + pad_to = pad_to * 10 + (ch - '0'); + ch= *(fmt++); + } + if(pad_to > (s32) sizeof(bf)) + { + pad_to = sizeof(bf); + } + if (ch == 'l') + { + l = 1; + ch=*(fmt++); + } + + switch (ch) + { + case 0: + goto end; + case 'u': + case 'd': + if(l) + { + len = mini_itoa(va_arg(va, u32), 10, 0, (ch=='u'), bf2); + } else + { + if(ch == 'u') + { + len = mini_itoa((u32) va_arg(va, u32), 10, 0, 1, bf2); + } + else + { + len = mini_itoa((s32) va_arg(va, s32), 10, 0, 0, bf2); + } + } + len = mini_pad(bf2, len, pad_char, pad_to, bf); + len = _putsAscii(bf, len, buf); + break; + + case 'x': + case 'X': + if(l) + { + len = mini_itoa(va_arg(va, u32), 16, (ch=='X'), 1, bf2); + } + else + { + len = mini_itoa((u32) va_arg(va, u32), 16, (ch=='X'), 1, bf2); + } + len = mini_pad(bf2, len, pad_char, pad_to, bf); + len = _putsAscii(bf, len, buf); + break; + + case 'c' : + ch = (char)(va_arg(va, s32)); + len = mini_pad(&ch, 1, pad_char, pad_to, bf); + len = _putsAscii(bf, len, buf); + break; + + case 's' : + ptr = va_arg(va, char*); + len = mini_strlen(ptr); + if (pad_to > 0) + { + len = mini_pad(ptr, len, pad_char, pad_to, bf); + len = _putsAscii(bf, len, buf); + } else + { + len = _putsAscii(ptr, len, buf); + } + break; + case 'S' : // preproc encoded string handler + ptr = va_arg(va, char*); + len = StringLength((u8*)ptr); + if (pad_to > 0) + { + len = mini_pad(ptr, len, pad_char, pad_to, bf); + len = _putsEncoded(bf, len, buf); + } else + { + len = _putsEncoded(ptr, len, buf); + } + break; + default: + len = 1; + len = _putsAscii(&ch, len, buf); + break; + } + } + n = n + len; + } +end: + return n; +} + +#endif