summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/fldeff_cut.s6
-rw-r--r--asm/fldeff_flash.s6
-rw-r--r--asm/party_menu.s218
-rw-r--r--common_syms/party_menu.txt1
-rw-r--r--data/graphics.s10
-rw-r--r--data/party_menu.s669
-rw-r--r--data/strings.s136
-rw-r--r--graphics/interface/hold_icons.pal19
-rw-r--r--graphics/interface/hold_icons.pngbin0 -> 120 bytes
-rw-r--r--graphics/interface/party_menu_cancel_button.bin2
-rw-r--r--graphics/interface/party_menu_confirm_button.bin1
-rw-r--r--include/constants/party_menu.h114
-rw-r--r--include/constants/trade.h118
-rw-r--r--include/fldeff.h4
-rw-r--r--include/graphics.h7
-rw-r--r--include/party_menu.h51
-rw-r--r--include/strings.h79
-rw-r--r--include/trade.h3
-rw-r--r--include/union_room.h3
-rw-r--r--ld_script.txt3
-rw-r--r--src/battle_controller_oak_old_man.c2
-rw-r--r--src/battle_controller_player.c2
-rw-r--r--src/battle_controller_pokedude.c2
-rw-r--r--src/battle_main.c10
-rw-r--r--src/battle_script_commands.c6
-rw-r--r--src/data/party_menu.h1334
-rw-r--r--src/data/pokemon/tutor_learnsets.h2813
-rw-r--r--src/fldeff_softboiled.c24
-rw-r--r--src/fldeff_sweetscent.c2
-rw-r--r--src/item_pc.c2
-rw-r--r--src/party_menu.c172
-rw-r--r--src/trade.c6
-rw-r--r--sym_common.txt4
-rw-r--r--sym_ewram.txt50
34 files changed, 4902 insertions, 977 deletions
diff --git a/asm/fldeff_cut.s b/asm/fldeff_cut.s
index ec892e0bb..d56ccd500 100644
--- a/asm/fldeff_cut.s
+++ b/asm/fldeff_cut.s
@@ -24,8 +24,8 @@ sub_8097874: @ 8097874
bx r1
thumb_func_end sub_8097874
- thumb_func_start sub_8097898
-sub_8097898: @ 8097898
+ thumb_func_start SetUpFieldMove_Cut
+SetUpFieldMove_Cut: @ 8097898
push {r4-r7,lr}
mov r7, r8
push {r7}
@@ -138,7 +138,7 @@ _08097970:
.align 2, 0
_0809797C: .4byte gPlayerFacingPosition
_08097980: .4byte 0x0000ffff
- thumb_func_end sub_8097898
+ thumb_func_end SetUpFieldMove_Cut
thumb_func_start sub_8097984
sub_8097984: @ 8097984
diff --git a/asm/fldeff_flash.s b/asm/fldeff_flash.s
index 51e55de63..23f86d6b7 100644
--- a/asm/fldeff_flash.s
+++ b/asm/fldeff_flash.s
@@ -5,8 +5,8 @@
.text
- thumb_func_start sub_80C9B2C
-sub_80C9B2C: @ 80C9B2C
+ thumb_func_start SetUpFieldMove_Flash
+SetUpFieldMove_Flash: @ 80C9B2C
push {lr}
ldr r0, _080C9B54 @ =gMapHeader
ldrb r0, [r0, 0x15]
@@ -37,7 +37,7 @@ _080C9B6C:
_080C9B6E:
pop {r1}
bx r1
- thumb_func_end sub_80C9B2C
+ thumb_func_end SetUpFieldMove_Flash
thumb_func_start sub_80C9B74
sub_80C9B74: @ 80C9B74
diff --git a/asm/party_menu.s b/asm/party_menu.s
index 081515121..955fba24e 100644
--- a/asm/party_menu.s
+++ b/asm/party_menu.s
@@ -1980,7 +1980,7 @@ _0811F9D8: .4byte gPartyMenu
DrawCancelConfirmButtons: @ 811F9DC
push {r4-r6,lr}
sub sp, 0xC
- ldr r1, _0811FA18 @ =gUnknown_8459FC4
+ ldr r1, _0811FA18 @ =sConfirmButton_Tilemap
movs r6, 0x7
str r6, [sp]
movs r5, 0x2
@@ -1991,7 +1991,7 @@ DrawCancelConfirmButtons: @ 811F9DC
movs r2, 0x17
movs r3, 0x10
bl CopyToBgTilemapBufferRect_ChangePalette
- ldr r1, _0811FA1C @ =gUnknown_8459FE0
+ ldr r1, _0811FA1C @ =sCancelButton_Tilemap
str r6, [sp]
str r5, [sp, 0x4]
str r4, [sp, 0x8]
@@ -2006,8 +2006,8 @@ DrawCancelConfirmButtons: @ 811F9DC
pop {r0}
bx r0
.align 2, 0
-_0811FA18: .4byte gUnknown_8459FC4
-_0811FA1C: .4byte gUnknown_8459FE0
+_0811FA18: .4byte sConfirmButton_Tilemap
+_0811FA1C: .4byte sCancelButton_Tilemap
thumb_func_end DrawCancelConfirmButtons
thumb_func_start IsMultiBattle
@@ -4293,7 +4293,7 @@ _08120B7C:
b _08120B9E
_08120B80:
mov r0, r8
- bl GetMoveTutorMove
+ bl GetTutorMove
_08120B86:
lsls r0, 16
lsrs r1, r0, 16
@@ -4315,8 +4315,8 @@ _08120B9E:
bx r1
thumb_func_end CanMonLearnTMTutor
- thumb_func_start GetMoveTutorMove
-GetMoveTutorMove: @ 8120BA8
+ thumb_func_start GetTutorMove
+GetTutorMove: @ 8120BA8
push {lr}
lsls r0, 24
lsrs r1, r0, 24
@@ -4345,7 +4345,7 @@ _08120BD0:
lsls r0, 1 @ MOVE_HYDRO_CANNON
b _08120BDE
_08120BD6:
- ldr r0, _08120BE4 @ =gMoveTutorMoves
+ ldr r0, _08120BE4 @ =sTutorMoves
lsls r1, 1
adds r1, r0
ldrh r0, [r1]
@@ -4353,8 +4353,8 @@ _08120BDE:
pop {r1}
bx r1
.align 2, 0
-_08120BE4: .4byte gMoveTutorMoves
- thumb_func_end GetMoveTutorMove
+_08120BE4: .4byte sTutorMoves
+ thumb_func_end GetTutorMove
thumb_func_start CanLearnTutorMove
CanLearnTutorMove: @ 8120BE8
@@ -4804,12 +4804,12 @@ _08120F24:
beq _08120F44
b _08120F62
_08120F2A:
- ldr r0, _08120F34 @ =gUnknown_203B0A9
+ ldr r0, _08120F34 @ =gPartyMenu + 9
movs r1, 0x2
bl UpdateCurrentPartySelection
b _08120F62
.align 2, 0
-_08120F34: .4byte gUnknown_203B0A9
+_08120F34: .4byte gPartyMenu + 9
_08120F38:
movs r0, 0x5
bl PlaySE
@@ -5401,7 +5401,7 @@ BlitBitmapToPartyWindow_RightColumn: @ 81213A0
_081213CC:
cmp r5, 0
bne _081213E8
- ldr r1, _081213E4 @ =sOtherSlotTileNums
+ ldr r1, _081213E4 @ =sOtherSlotsTileNums
str r2, [sp]
str r3, [sp, 0x4]
str r4, [sp, 0x8]
@@ -5410,9 +5410,9 @@ _081213CC:
bl BlitBitmapToPartyWindow
b _081213F8
.align 2, 0
-_081213E4: .4byte sOtherSlotTileNums
+_081213E4: .4byte sOtherSlotsTileNums
_081213E8:
- ldr r1, _08121400 @ =sOtherSlotTileNums_Egg
+ ldr r1, _08121400 @ =sOtherSlotsTileNums_Egg
str r2, [sp]
str r3, [sp, 0x4]
str r4, [sp, 0x8]
@@ -5425,7 +5425,7 @@ _081213F8:
pop {r0}
bx r0
.align 2, 0
-_08121400: .4byte sOtherSlotTileNums_Egg
+_08121400: .4byte sOtherSlotsTileNums_Egg
thumb_func_end BlitBitmapToPartyWindow_RightColumn
thumb_func_start DrawEmptySlot
@@ -5434,7 +5434,7 @@ DrawEmptySlot: @ 8121404
sub sp, 0xC
lsls r0, 24
lsrs r0, 24
- ldr r1, _08121428 @ =gUnknown_845A278
+ ldr r1, _08121428 @ =sEmptySlotTileNums
movs r2, 0
str r2, [sp]
movs r2, 0x12
@@ -5448,7 +5448,7 @@ DrawEmptySlot: @ 8121404
pop {r0}
bx r0
.align 2, 0
-_08121428: .4byte gUnknown_845A278
+_08121428: .4byte sEmptySlotTileNums
thumb_func_end DrawEmptySlot
thumb_func_start LoadPartyBoxPalette
@@ -5471,15 +5471,15 @@ LoadPartyBoxPalette: @ 812142C
ands r0, r4
cmp r0, 0
beq _0812145C
- ldr r5, _08121458 @ =gUnknown_845A2D4
+ ldr r5, _08121458 @ =sPartyBoxSelectedForActionPalIds1
b _0812160A
.align 2, 0
-_08121458: .4byte gUnknown_845A2D4
+_08121458: .4byte sPartyBoxSelectedForActionPalIds1
_0812145C:
- ldr r5, _08121494 @ =gUnknown_845A2D4
+ ldr r5, _08121494 @ =sPartyBoxSelectedForActionPalIds1
ldrb r0, [r5]
bl GetPartyMenuPalBufferPtr
- ldr r4, _08121498 @ =gUnknown_845A2B2
+ ldr r4, _08121498 @ =sPartyBoxPalOffsets1
ldrb r1, [r4]
adds r1, r6
movs r2, 0x2
@@ -5496,21 +5496,21 @@ _0812145C:
adds r1, r6
movs r2, 0x2
bl LoadPalette
- ldr r5, _0812149C @ =gUnknown_845A2E3
+ ldr r5, _0812149C @ =sPartyBoxSelectedForActionPalIds2
b _0812163E
.align 2, 0
-_08121494: .4byte gUnknown_845A2D4
-_08121498: .4byte gUnknown_845A2B2
-_0812149C: .4byte gUnknown_845A2E3
+_08121494: .4byte sPartyBoxSelectedForActionPalIds1
+_08121498: .4byte sPartyBoxPalOffsets1
+_0812149C: .4byte sPartyBoxSelectedForActionPalIds2
_081214A0:
movs r0, 0x10
ands r0, r4
cmp r0, 0
beq _081214EC
- ldr r5, _081214E0 @ =gUnknown_845A2D4
+ ldr r5, _081214E0 @ =sPartyBoxSelectedForActionPalIds1
ldrb r0, [r5]
bl GetPartyMenuPalBufferPtr
- ldr r4, _081214E4 @ =gUnknown_845A2B2
+ ldr r4, _081214E4 @ =sPartyBoxPalOffsets1
ldrb r1, [r4]
adds r1, r6
movs r2, 0x2
@@ -5527,12 +5527,12 @@ _081214A0:
adds r1, r6
movs r2, 0x2
bl LoadPalette
- ldr r5, _081214E8 @ =gUnknown_845A2E3
+ ldr r5, _081214E8 @ =sPartyBoxSelectedForActionPalIds2
b _0812163E
.align 2, 0
-_081214E0: .4byte gUnknown_845A2D4
-_081214E4: .4byte gUnknown_845A2B2
-_081214E8: .4byte gUnknown_845A2E3
+_081214E0: .4byte sPartyBoxSelectedForActionPalIds1
+_081214E4: .4byte sPartyBoxPalOffsets1
+_081214E8: .4byte sPartyBoxSelectedForActionPalIds2
_081214EC:
movs r0, 0x4
ands r0, r4
@@ -5542,15 +5542,15 @@ _081214EC:
ands r0, r4
cmp r0, 0
beq _08121504
- ldr r5, _08121500 @ =gUnknown_845A2D4
+ ldr r5, _08121500 @ =sPartyBoxSelectedForActionPalIds1
b _0812160A
.align 2, 0
-_08121500: .4byte gUnknown_845A2D4
+_08121500: .4byte sPartyBoxSelectedForActionPalIds1
_08121504:
- ldr r5, _0812153C @ =gUnknown_845A2D4
+ ldr r5, _0812153C @ =sPartyBoxSelectedForActionPalIds1
ldrb r0, [r5]
bl GetPartyMenuPalBufferPtr
- ldr r4, _08121540 @ =gUnknown_845A2B2
+ ldr r4, _08121540 @ =sPartyBoxPalOffsets1
ldrb r1, [r4]
adds r1, r6
movs r2, 0x2
@@ -5567,12 +5567,12 @@ _08121504:
adds r1, r6
movs r2, 0x2
bl LoadPalette
- ldr r5, _08121544 @ =gUnknown_845A2E3
+ ldr r5, _08121544 @ =sPartyBoxSelectedForActionPalIds2
b _0812163E
.align 2, 0
-_0812153C: .4byte gUnknown_845A2D4
-_08121540: .4byte gUnknown_845A2B2
-_08121544: .4byte gUnknown_845A2E3
+_0812153C: .4byte sPartyBoxSelectedForActionPalIds1
+_08121540: .4byte sPartyBoxPalOffsets1
+_08121544: .4byte sPartyBoxSelectedForActionPalIds2
_08121548:
movs r0, 0x2
ands r0, r4
@@ -5582,15 +5582,15 @@ _08121548:
ands r0, r4
cmp r0, 0
beq _08121560
- ldr r5, _0812155C @ =gUnknown_845A2D1
+ ldr r5, _0812155C @ =sPartyBoxCurrSelectionFaintedPalIds
b _0812160A
.align 2, 0
-_0812155C: .4byte gUnknown_845A2D1
+_0812155C: .4byte sPartyBoxCurrSelectionFaintedPalIds
_08121560:
- ldr r5, _08121598 @ =gUnknown_845A2C8
+ ldr r5, _08121598 @ =sPartyBoxFaintedPalIds1
ldrb r0, [r5]
bl GetPartyMenuPalBufferPtr
- ldr r4, _0812159C @ =gUnknown_845A2B2
+ ldr r4, _0812159C @ =sPartyBoxPalOffsets1
ldrb r1, [r4]
adds r1, r6
movs r2, 0x2
@@ -5607,12 +5607,12 @@ _08121560:
adds r1, r6
movs r2, 0x2
bl LoadPalette
- ldr r5, _081215A0 @ =gUnknown_845A2DD
+ ldr r5, _081215A0 @ =sPartyBoxFaintedPalIds2
b _0812163E
.align 2, 0
-_08121598: .4byte gUnknown_845A2C8
-_0812159C: .4byte gUnknown_845A2B2
-_081215A0: .4byte gUnknown_845A2DD
+_08121598: .4byte sPartyBoxFaintedPalIds1
+_0812159C: .4byte sPartyBoxPalOffsets1
+_081215A0: .4byte sPartyBoxFaintedPalIds2
_081215A4:
movs r0, 0x8
ands r0, r4
@@ -5622,15 +5622,15 @@ _081215A4:
ands r0, r4
cmp r0, 0
beq _081215BC
- ldr r5, _081215B8 @ =gUnknown_845A2CE
+ ldr r5, _081215B8 @ =sPartyBoxCurrSelectionMultiPalIds
b _0812160A
.align 2, 0
-_081215B8: .4byte gUnknown_845A2CE
+_081215B8: .4byte sPartyBoxCurrSelectionMultiPalIds
_081215BC:
- ldr r5, _081215F4 @ =gUnknown_845A2C5
+ ldr r5, _081215F4 @ =sPartyBoxMultiPalIds1
ldrb r0, [r5]
bl GetPartyMenuPalBufferPtr
- ldr r4, _081215F8 @ =gUnknown_845A2B2
+ ldr r4, _081215F8 @ =sPartyBoxPalOffsets1
ldrb r1, [r4]
adds r1, r6
movs r2, 0x2
@@ -5647,22 +5647,22 @@ _081215BC:
adds r1, r6
movs r2, 0x2
bl LoadPalette
- ldr r5, _081215FC @ =gUnknown_845A2DA
+ ldr r5, _081215FC @ =sPartyBoxMultiPalIds2
b _0812163E
.align 2, 0
-_081215F4: .4byte gUnknown_845A2C5
-_081215F8: .4byte gUnknown_845A2B2
-_081215FC: .4byte gUnknown_845A2DA
+_081215F4: .4byte sPartyBoxMultiPalIds1
+_081215F8: .4byte sPartyBoxPalOffsets1
+_081215FC: .4byte sPartyBoxMultiPalIds2
_08121600:
movs r0, 0x1
ands r5, r0
cmp r5, 0
beq _08121684
- ldr r5, _08121674 @ =gUnknown_845A2CB
+ ldr r5, _08121674 @ =sPartyBoxCurrSelectionPalIds1
_0812160A:
ldrb r0, [r5]
bl GetPartyMenuPalBufferPtr
- ldr r4, _08121678 @ =gUnknown_845A2B2
+ ldr r4, _08121678 @ =sPartyBoxPalOffsets1
ldrb r1, [r4]
adds r1, r6
movs r2, 0x2
@@ -5679,11 +5679,11 @@ _0812160A:
adds r1, r6
movs r2, 0x2
bl LoadPalette
- ldr r5, _0812167C @ =gUnknown_845A2E0
+ ldr r5, _0812167C @ =sPartyBoxCurrSelectionPalIds2
_0812163E:
ldrb r0, [r5]
bl GetPartyMenuPalBufferPtr
- ldr r4, _08121680 @ =gUnknown_845A2B5
+ ldr r4, _08121680 @ =sPartyBoxPalOffsets2
ldrb r1, [r4]
adds r1, r6
movs r2, 0x2
@@ -5702,15 +5702,15 @@ _0812163E:
bl LoadPalette
b _081216EC
.align 2, 0
-_08121674: .4byte gUnknown_845A2CB
-_08121678: .4byte gUnknown_845A2B2
-_0812167C: .4byte gUnknown_845A2E0
-_08121680: .4byte gUnknown_845A2B5
+_08121674: .4byte sPartyBoxCurrSelectionPalIds1
+_08121678: .4byte sPartyBoxPalOffsets1
+_0812167C: .4byte sPartyBoxCurrSelectionPalIds2
+_08121680: .4byte sPartyBoxPalOffsets2
_08121684:
- ldr r5, _081216F4 @ =gUnknown_845A2C2
+ ldr r5, _081216F4 @ =sPartyBoxEmptySlotPalIds1
ldrb r0, [r5]
bl GetPartyMenuPalBufferPtr
- ldr r4, _081216F8 @ =gUnknown_845A2B2
+ ldr r4, _081216F8 @ =sPartyBoxPalOffsets1
ldrb r1, [r4]
adds r1, r7
movs r2, 0x2
@@ -5727,10 +5727,10 @@ _08121684:
adds r1, r7
movs r2, 0x2
bl LoadPalette
- ldr r5, _081216FC @ =gUnknown_845A2D7
+ ldr r5, _081216FC @ =sPartyBoxEmptySlotPalIds2
ldrb r0, [r5]
bl GetPartyMenuPalBufferPtr
- ldr r4, _08121700 @ =gUnknown_845A2B5
+ ldr r4, _08121700 @ =sPartyBoxPalOffsets2
ldrb r1, [r4]
adds r1, r7
movs r2, 0x2
@@ -5752,10 +5752,10 @@ _081216EC:
pop {r0}
bx r0
.align 2, 0
-_081216F4: .4byte gUnknown_845A2C2
-_081216F8: .4byte gUnknown_845A2B2
-_081216FC: .4byte gUnknown_845A2D7
-_08121700: .4byte gUnknown_845A2B5
+_081216F4: .4byte sPartyBoxEmptySlotPalIds1
+_081216F8: .4byte sPartyBoxPalOffsets1
+_081216FC: .4byte sPartyBoxEmptySlotPalIds2
+_08121700: .4byte sPartyBoxPalOffsets2
thumb_func_end LoadPartyBoxPalette
thumb_func_start DisplayPartyPokemonBarDetail
@@ -6321,16 +6321,16 @@ DisplayPartyPokemonHPBar: @ 8121B2C
blt _08121BA8
cmp r0, 0x4
bgt _08121BA8
- ldr r5, _08121B74 @ =gUnknown_845A2BC
+ ldr r5, _08121B74 @ =sHPBarGreenPalIds
b _08121B7A
.align 2, 0
-_08121B74: .4byte gUnknown_845A2BC
+_08121B74: .4byte sHPBarGreenPalIds
_08121B78:
- ldr r5, _08121BA0 @ =gUnknown_845A2BE
+ ldr r5, _08121BA0 @ =sHPBarYellowPalIds
_08121B7A:
ldrb r0, [r5]
bl GetPartyMenuPalBufferPtr
- ldr r4, _08121BA4 @ =gUnknown_845A2B0
+ ldr r4, _08121BA4 @ =sHPBarPalOffsets
ldrb r1, [r4]
adds r1, r7
movs r2, 0x2
@@ -6343,13 +6343,13 @@ _08121B7A:
bl LoadPalette
b _08121BCC
.align 2, 0
-_08121BA0: .4byte gUnknown_845A2BE
-_08121BA4: .4byte gUnknown_845A2B0
+_08121BA0: .4byte sHPBarYellowPalIds
+_08121BA4: .4byte sHPBarPalOffsets
_08121BA8:
- ldr r5, _08121C68 @ =gUnknown_845A2C0
+ ldr r5, _08121C68 @ =sHPBarRedPalIds
ldrb r0, [r5]
bl GetPartyMenuPalBufferPtr
- ldr r4, _08121C6C @ =gUnknown_845A2B0
+ ldr r4, _08121C6C @ =sHPBarPalOffsets
ldrb r1, [r4]
adds r1, r7
movs r2, 0x2
@@ -6373,7 +6373,7 @@ _08121BCC:
lsls r0, 24
lsrs r5, r0, 24
ldrb r0, [r6, 0x8]
- ldr r4, _08121C6C @ =gUnknown_845A2B0
+ ldr r4, _08121C6C @ =sHPBarPalOffsets
ldrb r1, [r4, 0x1]
ldr r3, [r6]
ldrb r2, [r3, 0x18]
@@ -6434,8 +6434,8 @@ _08121C50:
pop {r0}
bx r0
.align 2, 0
-_08121C68: .4byte gUnknown_845A2C0
-_08121C6C: .4byte gUnknown_845A2B0
+_08121C68: .4byte sHPBarRedPalIds
+_08121C6C: .4byte sHPBarPalOffsets
thumb_func_end DisplayPartyPokemonHPBar
thumb_func_start DisplayPartyPokemonDescriptionText
@@ -6557,30 +6557,30 @@ _08121D44:
.4byte _08121D60
.4byte _08121D68
_08121D58:
- ldr r0, _08121D5C @ =gUnknown_845A128
+ ldr r0, _08121D5C @ =sDoWhatWithMonMsgWindowTemplate
b _08121D72
.align 2, 0
-_08121D5C: .4byte gUnknown_845A128
+_08121D5C: .4byte sDoWhatWithMonMsgWindowTemplate
_08121D60:
- ldr r0, _08121D64 @ =gUnknown_845A130
+ ldr r0, _08121D64 @ =sDoWhatWithItemMsgWindowTemplate
b _08121D72
.align 2, 0
-_08121D64: .4byte gUnknown_845A130
+_08121D64: .4byte sDoWhatWithItemMsgWindowTemplate
_08121D68:
- ldr r0, _08121D6C @ =gUnknown_845A138
+ ldr r0, _08121D6C @ =sDoWhatWithMailMsgWindowTemplate
b _08121D72
.align 2, 0
-_08121D6C: .4byte gUnknown_845A138
+_08121D6C: .4byte sDoWhatWithMailMsgWindowTemplate
_08121D70:
- ldr r0, _08121D7C @ =gUnknown_845A140
+ ldr r0, _08121D7C @ =sWhichMoveMsgWindowTemplate
_08121D72:
bl AddWindow
strb r0, [r5]
b _08121D88
.align 2, 0
-_08121D7C: .4byte gUnknown_845A140
+_08121D7C: .4byte sWhichMoveMsgWindowTemplate
_08121D80:
- ldr r0, _08121D9C @ =gUnknown_845A120
+ ldr r0, _08121D9C @ =sDefaultPartyMsgWindowTemplate
bl AddWindow
strb r0, [r4, 0xD]
_08121D88:
@@ -6595,7 +6595,7 @@ _08121D88:
movs r6, 0x2
b _08121DB0
.align 2, 0
-_08121D9C: .4byte gUnknown_845A120
+_08121D9C: .4byte sDefaultPartyMsgWindowTemplate
_08121DA0: .4byte sPartyMenuInternal
_08121DA4:
bl ShouldUseChooseMonText
@@ -7107,10 +7107,10 @@ _0812217A:
str r0, [sp]
movs r1, 0
str r1, [sp, 0x4]
- ldr r0, _081221CC @ =gUnknown_845A00B
+ ldr r0, _081221CC @ =sFontColorTable + 15
str r0, [sp, 0x8]
str r1, [sp, 0xC]
- ldr r1, _081221D0 @ =gUnknown_845A37C
+ ldr r1, _081221D0 @ =sHMDescriptionTable
adds r0, r5, 0
subs r0, 0x12
lsls r0, 2
@@ -7133,8 +7133,8 @@ _081221C0:
bx r0
.align 2, 0
_081221C8: .4byte gUnknown_845A178
-_081221CC: .4byte gUnknown_845A00B
-_081221D0: .4byte gUnknown_845A37C
+_081221CC: .4byte sFontColorTable + 15
+_081221D0: .4byte sHMDescriptionTable
thumb_func_end sub_8122138
thumb_func_start CreatePartyMonIconSprite
@@ -11422,15 +11422,15 @@ _08124410: .4byte gPartyMenu
_08124414: .4byte gPlayerParty
_08124418:
ldr r0, _08124424 @ =gStringVar4
- ldr r1, _08124428 @ =gUnknown_84170BC
+ ldr r1, _08124428 @ =gText_PkmnCantBeTradedNow
bl StringExpandPlaceholders
b _08124434
.align 2, 0
_08124424: .4byte gStringVar4
-_08124428: .4byte gUnknown_84170BC
+_08124428: .4byte gText_PkmnCantBeTradedNow
_0812442C:
ldr r0, _08124478 @ =gStringVar4
- ldr r1, _0812447C @ =gUnknown_84170E0
+ ldr r1, _0812447C @ =gText_EggCantBeTradedNow
bl StringExpandPlaceholders
_08124434:
movs r0, 0x1A
@@ -11465,7 +11465,7 @@ _0812446C:
bx r0
.align 2, 0
_08124478: .4byte gStringVar4
-_0812447C: .4byte gUnknown_84170E0
+_0812447C: .4byte gText_EggCantBeTradedNow
_08124480: .4byte sPartyMenuInternal
_08124484: .4byte gText_PauseUntilPress
_08124488: .4byte gTasks
@@ -11590,10 +11590,10 @@ _08124590:
bx r0
thumb_func_end CursorCB_Trade1
- thumb_func_start nullsub_93
-nullsub_93: @ 81245A0
+ thumb_func_start CursorCB_Trade2
+CursorCB_Trade2: @ 81245A0
bx lr
- thumb_func_end nullsub_93
+ thumb_func_end CursorCB_Trade2
thumb_func_start CursorCB_FieldMove
CursorCB_FieldMove: @ 81245A4
@@ -14019,7 +14019,7 @@ TryUsePPItem: @ 8125958
lsls r0, 24
lsrs r6, r0, 24
movs r4, 0
- ldr r7, _08125990 @ =gUnknown_203B0AE
+ ldr r7, _08125990 @ =gPartyMenu + 14
ldr r0, _08125994 @ =gSpecialVar_ItemId
ldrh r5, [r0]
movs r0, 0xE
@@ -14040,7 +14040,7 @@ TryUsePPItem: @ 8125958
ldr r0, _0812599C @ =gText_WontHaveEffect
b _081259F6
.align 2, 0
-_08125990: .4byte gUnknown_203B0AE
+_08125990: .4byte gPartyMenu + 14
_08125994: .4byte gSpecialVar_ItemId
_08125998: .4byte gPartyMenuUseExitCallback
_0812599C: .4byte gText_WontHaveEffect
@@ -16549,7 +16549,7 @@ TryTutorSelectedMon: @ 8126DC8
bl GetMonNickname
ldr r4, _08126E5C @ =gSpecialVar_0x8005
ldrb r0, [r4]
- bl GetMoveTutorMove
+ bl GetTutorMove
strh r0, [r7, 0xE]
ldr r0, _08126E60 @ =gStringVar2
movs r1, 0xE
@@ -18299,7 +18299,7 @@ _08127BEC:
beq _08127C64
adds r0, r5, 0
bl GetPartyIdFromBattleSlot
- ldr r1, _08127C30 @ =gUnknown_203B0C1
+ ldr r1, _08127C30 @ =gSelectedMonPartyId
strb r0, [r1]
ldr r1, _08127C34 @ =gPartyMenuUseExitCallback
movs r0, 0x1
@@ -18325,7 +18325,7 @@ _08127BEC:
movs r0, 0x1
b _08127C8C
.align 2, 0
-_08127C30: .4byte gUnknown_203B0C1
+_08127C30: .4byte gSelectedMonPartyId
_08127C34: .4byte gPartyMenuUseExitCallback
_08127C38: .4byte gBattlerPartyIndexes
_08127C3C: .4byte gBattlerInMenuId
diff --git a/common_syms/party_menu.txt b/common_syms/party_menu.txt
new file mode 100644
index 000000000..6ed37392c
--- /dev/null
+++ b/common_syms/party_menu.txt
@@ -0,0 +1 @@
+gItemUseCB
diff --git a/data/graphics.s b/data/graphics.s
index 9810abf91..a6b9db097 100644
--- a/data/graphics.s
+++ b/data/graphics.s
@@ -13904,23 +13904,23 @@ gPartyMenuBg_Tilemap:: @ 8E82AB0
.incbin "graphics/interface/party_menu_misc.bin.lz"
.align 2
-gFile_graphics_interface_party_menu_pokeball_sheet:: @ 8E82BE8
+gPartyMenuPokeball_Gfx:: @ 8E82BE8
.incbin "graphics/interface/party_menu_pokeball.4bpp.lz"
.align 2
-gFile_graphics_interface_party_menu_pokeball_small_sheet:: @ 8E82D68
+gPartyMenuPokeballSmall_Gfx:: @ 8E82D68
.incbin "graphics/interface/party_menu_pokeball_small.4bpp.lz"
.align 2
-gFile_graphics_interface_party_menu_pokeball_palette:: @ 8E82E7C
+gPartyMenuPokeball_Pal:: @ 8E82E7C
.incbin "graphics/interface/party_menu_pokeball.gbapal.lz"
.align 2
-gUnknown_8E82EA0:: @ 8E82EA0
+gStatusGfx_Icons:: @ 8E82EA0
.incbin "baserom.gba", 0xE82EA0, 0x204
.align 2
-gFile_graphics_interface_status_icons_palette:: @ 8E830A4
+gStatusPal_Icons:: @ 8E830A4
.incbin "graphics/interface/status_icons.gbapal.lz"
.align 2
diff --git a/data/party_menu.s b/data/party_menu.s
deleted file mode 100644
index 1f10d0ea5..000000000
--- a/data/party_menu.s
+++ /dev/null
@@ -1,669 +0,0 @@
-#include "constants/region_map.h"
-#include "constants/flags.h"
-#include "constants/moves.h"
- .include "asm/macros.inc"
- .include "constants/constants.inc"
- .section .rodata
- .align 2
-
-gMoveTutorMoves:: @ 8459B60
- .2byte MOVE_MEGA_PUNCH
- .2byte MOVE_SWORDS_DANCE
- .2byte MOVE_MEGA_KICK
- .2byte MOVE_BODY_SLAM
- .2byte MOVE_DOUBLE_EDGE
- .2byte MOVE_COUNTER
- .2byte MOVE_SEISMIC_TOSS
- .2byte MOVE_MIMIC
- .2byte MOVE_METRONOME
- .2byte MOVE_SOFT_BOILED
- .2byte MOVE_DREAM_EATER
- .2byte MOVE_THUNDER_WAVE
- .2byte MOVE_EXPLOSION
- .2byte MOVE_ROCK_SLIDE
- .2byte MOVE_SUBSTITUTE
-
-sTutorLearnsets:: @ 8459B7E
- .2byte 0x0000
- .2byte 0x409a
- .2byte 0x409a
- .2byte 0x409a
- .2byte 0x60ff
- .2byte 0x60ff
- .2byte 0x60ff
- .2byte 0x40fd
- .2byte 0x40fd
- .2byte 0x40fd
- .2byte 0x0000
- .2byte 0x0000
- .2byte 0x4490
- .2byte 0x0000
- .2byte 0x0000
- .2byte 0x4092
- .2byte 0x4090
- .2byte 0x4090
- .2byte 0x4090
- .2byte 0x48b8
- .2byte 0x48b8
- .2byte 0x4090
- .2byte 0x4090
- .2byte 0x6098
- .2byte 0x6098
- .2byte 0x48fd
- .2byte 0x48fd
- .2byte 0x60fa
- .2byte 0x60fa
- .2byte 0x40b8
- .2byte 0x40b8
- .2byte 0x60fd
- .2byte 0x40b8
- .2byte 0x40b8
- .2byte 0x60fd
- .2byte 0x4ffd
- .2byte 0x4ffd
- .2byte 0x4098
- .2byte 0x4098
- .2byte 0x4cfd
- .2byte 0x4cfd
- .2byte 0x4090
- .2byte 0x4090
- .2byte 0x4092
- .2byte 0x4092
- .2byte 0x409a
- .2byte 0x40ba
- .2byte 0x40ba
- .2byte 0x4090
- .2byte 0x4090
- .2byte 0x6098
- .2byte 0x6098
- .2byte 0x4498
- .2byte 0x4498
- .2byte 0x40fd
- .2byte 0x40fd
- .2byte 0x61fd
- .2byte 0x61fd
- .2byte 0x4098
- .2byte 0x4098
- .2byte 0x4098
- .2byte 0x41fd
- .2byte 0x41fd
- .2byte 0x4dfd
- .2byte 0x4dfd
- .2byte 0x4dfd
- .2byte 0x61fd
- .2byte 0x61fd
- .2byte 0x61fd
- .2byte 0x4092
- .2byte 0x4092
- .2byte 0x409a
- .2byte 0x4092
- .2byte 0x4092
- .2byte 0x71f9
- .2byte 0x71f9
- .2byte 0x71fd
- .2byte 0x4098
- .2byte 0x4098
- .2byte 0x4c98
- .2byte 0x4cfd
- .2byte 0x4890
- .2byte 0x4890
- .2byte 0x409a
- .2byte 0x4098
- .2byte 0x4098
- .2byte 0x4098
- .2byte 0x4098
- .2byte 0x5088
- .2byte 0x5088
- .2byte 0x5090
- .2byte 0x5090
- .2byte 0x5480
- .2byte 0x5480
- .2byte 0x55fd
- .2byte 0x7098
- .2byte 0x4dfd
- .2byte 0x4dfd
- .2byte 0x409a
- .2byte 0x409a
- .2byte 0x5880
- .2byte 0x5880
- .2byte 0x5490
- .2byte 0x5490
- .2byte 0x60ff
- .2byte 0x60ff
- .2byte 0x61fd
- .2byte 0x61fd
- .2byte 0x64ff
- .2byte 0x5080
- .2byte 0x5080
- .2byte 0x60ba
- .2byte 0x60ff
- .2byte 0x4ffd
- .2byte 0x409a
- .2byte 0x60fd
- .2byte 0x4090
- .2byte 0x4090
- .2byte 0x4090
- .2byte 0x4090
- .2byte 0x4890
- .2byte 0x4c90
- .2byte 0x4dfd
- .2byte 0x40b2
- .2byte 0x45fd
- .2byte 0x48fd
- .2byte 0x40fd
- .2byte 0x60da
- .2byte 0x4098
- .2byte 0x0000
- .2byte 0x4898
- .2byte 0x4498
- .2byte 0x0000
- .2byte 0x4098
- .2byte 0x4098
- .2byte 0x4898
- .2byte 0x4098
- .2byte 0x4c90
- .2byte 0x6098
- .2byte 0x60d8
- .2byte 0x6098
- .2byte 0x60de
- .2byte 0x6090
- .2byte 0x61fd
- .2byte 0x4090
- .2byte 0x4890
- .2byte 0x4090
- .2byte 0x4898
- .2byte 0x4898
- .2byte 0x4898
- .2byte 0x4dfd
- .2byte 0x7fff
- .2byte 0x40ba
- .2byte 0x40ba
- .2byte 0x40ba
- .2byte 0x4098
- .2byte 0x4098
- .2byte 0x60fd
- .2byte 0x60ff
- .2byte 0x60ff
- .2byte 0x60ff
- .2byte 0x4098
- .2byte 0x4098
- .2byte 0x4490
- .2byte 0x4490
- .2byte 0x4093
- .2byte 0x4093
- .2byte 0x4098
- .2byte 0x4098
- .2byte 0x4090
- .2byte 0x4890
- .2byte 0x4890
- .2byte 0x48fd
- .2byte 0x4ffd
- .2byte 0x4cfd
- .2byte 0x4ffd
- .2byte 0x4ffd
- .2byte 0x4c90
- .2byte 0x4c90
- .2byte 0x4898
- .2byte 0x48fd
- .2byte 0x48fd
- .2byte 0x4092
- .2byte 0x40dd
- .2byte 0x40dd
- .2byte 0x70fd
- .2byte 0x41fd
- .2byte 0x4092
- .2byte 0x4092
- .2byte 0x4092
- .2byte 0x4dfd
- .2byte 0x4092
- .2byte 0x4092
- .2byte 0x4490
- .2byte 0x4098
- .2byte 0x40fd
- .2byte 0x4498
- .2byte 0x4498
- .2byte 0x4c90
- .2byte 0x4cfd
- .2byte 0x4c90
- .2byte 0x0000
- .2byte 0x0000
- .2byte 0x4c98
- .2byte 0x70b8
- .2byte 0x70b8
- .2byte 0x6cb8
- .2byte 0x64b2
- .2byte 0x7098
- .2byte 0x49fd
- .2byte 0x69fd
- .2byte 0x4892
- .2byte 0x40b2
- .2byte 0x6098
- .2byte 0x60fa
- .2byte 0x44b2
- .2byte 0x41ff
- .2byte 0x61ff
- .2byte 0x6098
- .2byte 0x6098
- .2byte 0x6098
- .2byte 0x6098
- .2byte 0x7098
- .2byte 0x4890
- .2byte 0x48d0
- .2byte 0x40fd
- .2byte 0x4098
- .2byte 0x60b0
- .2byte 0x44b8
- .2byte 0x44b8
- .2byte 0x4098
- .2byte 0x40b8
- .2byte 0x60b8
- .2byte 0x4c90
- .2byte 0x4c98
- .2byte 0x0000
- .2byte 0x60fc
- .2byte 0x60fc
- .2byte 0x45fd
- .2byte 0x48fd
- .2byte 0x40fd
- .2byte 0x69fd
- .2byte 0x4ffd
- .2byte 0x4898
- .2byte 0x4098
- .2byte 0x4098
- .2byte 0x6098
- .2byte 0x6098
- .2byte 0x68fd
- .2byte 0x4c98
- .2byte 0x4c90
- .2byte 0x4592
- .2byte 0x0000
- .2byte 0x0000
- .2byte 0x0000
- .2byte 0x0000
- .2byte 0x0000
- .2byte 0x0000
- .2byte 0x0000
- .2byte 0x0000
- .2byte 0x0000
- .2byte 0x0000
- .2byte 0x0000
- .2byte 0x0000
- .2byte 0x0000
- .2byte 0x0000
- .2byte 0x0000
- .2byte 0x0000
- .2byte 0x0000
- .2byte 0x0000
- .2byte 0x0000
- .2byte 0x0000
- .2byte 0x0000
- .2byte 0x0000
- .2byte 0x0000
- .2byte 0x0000
- .2byte 0x0000
- .2byte 0x40ff
- .2byte 0x40ff
- .2byte 0x40ff
- .2byte 0x60ff
- .2byte 0x60ff
- .2byte 0x60ff
- .2byte 0x4098
- .2byte 0x60fd
- .2byte 0x60fd
- .2byte 0x40b8
- .2byte 0x40b8
- .2byte 0x4898
- .2byte 0x4898
- .2byte 0x0000
- .2byte 0x0000
- .2byte 0x4090
- .2byte 0x0000
- .2byte 0x4090
- .2byte 0x409a
- .2byte 0x409a
- .2byte 0x41ff
- .2byte 0x509a
- .2byte 0x509e
- .2byte 0x509e
- .2byte 0x4090
- .2byte 0x4092
- .2byte 0x4490
- .2byte 0x40b0
- .2byte 0x40b0
- .2byte 0x409a
- .2byte 0x40ff
- .2byte 0x65fd
- .2byte 0x4090
- .2byte 0x4090
- .2byte 0x4090
- .2byte 0x4090
- .2byte 0x4098
- .2byte 0x4098
- .2byte 0x4c98
- .2byte 0x4c98
- .2byte 0x69fd
- .2byte 0x7490
- .2byte 0x7490
- .2byte 0x7898
- .2byte 0x7098
- .2byte 0x45fd
- .2byte 0x4090
- .2byte 0x6090
- .2byte 0x4090
- .2byte 0x40ba
- .2byte 0x40ba
- .2byte 0x4090
- .2byte 0x4098
- .2byte 0x4090
- .2byte 0x4090
- .2byte 0x6098
- .2byte 0x6098
- .2byte 0x6098
- .2byte 0x61fd
- .2byte 0x61fd
- .2byte 0x4898
- .2byte 0x4898
- .2byte 0x6098
- .2byte 0x7098
- .2byte 0x6098
- .2byte 0x6098
- .2byte 0x6098
- .2byte 0x40fb
- .2byte 0x40ff
- .2byte 0x4098
- .2byte 0x5098
- .2byte 0x7498
- .2byte 0x7498
- .2byte 0x4098
- .2byte 0x4498
- .2byte 0x44fd
- .2byte 0x49fd
- .2byte 0x49fd
- .2byte 0x60ff
- .2byte 0x45fd
- .2byte 0x65fd
- .2byte 0x4498
- .2byte 0x4498
- .2byte 0x0000
- .2byte 0x4498
- .2byte 0x65fd
- .2byte 0x409a
- .2byte 0x60fd
- .2byte 0x60fd
- .2byte 0x60fd
- .2byte 0x54b8
- .2byte 0x54b8
- .2byte 0x409a
- .2byte 0x40fd
- .2byte 0x60fd
- .2byte 0x60fd
- .2byte 0x4098
- .2byte 0x4098
- .2byte 0x4098
- .2byte 0x6cba
- .2byte 0x4c98
- .2byte 0x4d98
- .2byte 0x4098
- .2byte 0x68ff
- .2byte 0x6098
- .2byte 0x6098
- .2byte 0x6098
- .2byte 0x68fd
- .2byte 0x4898
- .2byte 0x49fd
- .2byte 0x49fd
- .2byte 0x6098
- .2byte 0x6098
- .2byte 0x609a
- .2byte 0x60da
- .2byte 0x4c98
- .2byte 0x4c98
- .2byte 0x4c98
- .2byte 0x6098
- .2byte 0x6098
- .2byte 0x6098
- .2byte 0x0000
- .2byte 0x7098
- .2byte 0x7098
- .2byte 0x78fd
- .2byte 0x78fd
- .2byte 0x78fd
- .2byte 0x6898
- .2byte 0x68ff
- .2byte 0x6898
- .2byte 0x4c98
- .2byte 0x4c98
- .2byte 0x4d98
- .2byte 0x6cfd
- .2byte 0x4490
-
- .align 2
-sPartyMenuBgTemplates:: @ 8459EB8
- .incbin "baserom.gba", 0x459EB8, 0xC
-
-sPartyBoxInfoRects:: @ 8459EC4
- .incbin "baserom.gba", 0x459EC4, 0x40
-
-sPartyMenuSpriteCoords:: @ 8459F04
- .incbin "baserom.gba", 0x459F04, 0xC0
-
-gUnknown_8459FC4:: @ 8459FC4
- .incbin "baserom.gba", 0x459FC4, 0x1C
-
-gUnknown_8459FE0:: @ 8459FE0
- .incbin "baserom.gba", 0x459FE0, 0x1C
-
-sFontColorTable:: @ 8459FFC
- .incbin "baserom.gba", 0x459FFC, 0xF
-
-gUnknown_845A00B:: @ 845A00B
- .incbin "baserom.gba", 0x45A00B, 0x5
-
-sSinglePartyMenuWindowTemplate:: @ 845A010
- .incbin "baserom.gba", 0x45A010, 0x40
-
-sDoublePartyMenuWindowTemplate:: @ 845A050
- .incbin "baserom.gba", 0x45A050, 0x40
-
-sMultiPartyMenuWindowTemplate:: @ 845A090
- .incbin "baserom.gba", 0x45A090, 0x40
-
-sShowcaseMultiPartyMenuWindowTemplate:: @ 845A0D0
- .incbin "baserom.gba", 0x45A0D0, 0x38
-
-sCancelButtonWindowTemplate:: @ 845A108
- .incbin "baserom.gba", 0x45A108, 0x8
-
-sMultiCancelButtonWindowTemplate:: @ 845A110
- .incbin "baserom.gba", 0x45A110, 0x8
-
-sConfirmButtonWindowTemplate:: @ 845A118
- .incbin "baserom.gba", 0x45A118, 0x8
-
-gUnknown_845A120:: @ 845A120
- .incbin "baserom.gba", 0x45A120, 0x8
-
-gUnknown_845A128:: @ 845A128
- .incbin "baserom.gba", 0x45A128, 0x8
-
-gUnknown_845A130:: @ 845A130
- .incbin "baserom.gba", 0x45A130, 0x8
-
-gUnknown_845A138:: @ 845A138
- .incbin "baserom.gba", 0x45A138, 0x8
-
-gUnknown_845A140:: @ 845A140
- .incbin "baserom.gba", 0x45A140, 0x8
-
-sItemGiveTakeWindowTemplate:: @ 845A148
- .incbin "baserom.gba", 0x45A148, 0x8
-
-sMailReadTakeWindowTemplate:: @ 845A150
- .incbin "baserom.gba", 0x45A150, 0x8
-
-sMoveSelectWindowTemplate:: @ 845A158
- .incbin "baserom.gba", 0x45A158, 0x8
-
-sPartyMenuYesNoWindowTemplate:: @ 845A160
- .incbin "baserom.gba", 0x45A160, 0x8
-
-sLevelUpStatsWindowTemplate:: @ 845A168
- .incbin "baserom.gba", 0x45A168, 0x8
-
-gUnknown_845A170:: @ 845A170
- .incbin "baserom.gba", 0x45A170, 0x8
-
-gUnknown_845A178:: @ 845A178
- .incbin "baserom.gba", 0x45A178, 0x8
-
-sMainSlotTileNums:: @ 845A180
- .incbin "baserom.gba", 0x45A180, 0x46
-
-sMainSlotTileNums_Egg:: @ 845A1C6
- .incbin "baserom.gba", 0x45A1C6, 0x46
-
-sOtherSlotTileNums:: @ 845A20C
- .incbin "baserom.gba", 0x45A20C, 0x36
-
-sOtherSlotTileNums_Egg:: @ 845A242
- .incbin "baserom.gba", 0x45A242, 0x36
-
-gUnknown_845A278:: @ 845A278
- .incbin "baserom.gba", 0x45A278, 0x36
-
-sGenderPalOffsets:: @ 845A2AE
- .incbin "baserom.gba", 0x45A2AE, 0x2
-
-gUnknown_845A2B0:: @ 845A2B0
- .incbin "baserom.gba", 0x45A2B0, 0x2
-
-gUnknown_845A2B2:: @ 845A2B2
- .incbin "baserom.gba", 0x45A2B2, 0x3
-
-gUnknown_845A2B5:: @ 845A2B5
- .incbin "baserom.gba", 0x45A2B5, 0x3
-
-sGenderMalePalIds:: @ 845A2B8
- .incbin "baserom.gba", 0x45A2B8, 0x2
-
-sGenderFemalePalIds:: @ 845A2BA
- .incbin "baserom.gba", 0x45A2BA, 0x2
-
-gUnknown_845A2BC:: @ 845A2BC
- .incbin "baserom.gba", 0x45A2BC, 0x2
-
-gUnknown_845A2BE:: @ 845A2BE
- .incbin "baserom.gba", 0x45A2BE, 0x2
-
-gUnknown_845A2C0:: @ 845A2C0
- .incbin "baserom.gba", 0x45A2C0, 0x2
-
-gUnknown_845A2C2:: @ 845A2C2
- .incbin "baserom.gba", 0x45A2C2, 0x3
-
-gUnknown_845A2C5:: @ 845A2C5
- .incbin "baserom.gba", 0x45A2C5, 0x3
-
-gUnknown_845A2C8:: @ 845A2C8
- .incbin "baserom.gba", 0x45A2C8, 0x3
-
-gUnknown_845A2CB:: @ 845A2CB
- .incbin "baserom.gba", 0x45A2CB, 0x3
-
-gUnknown_845A2CE:: @ 845A2CE
- .incbin "baserom.gba", 0x45A2CE, 0x3
-
-gUnknown_845A2D1:: @ 845A2D1
- .incbin "baserom.gba", 0x45A2D1, 0x3
-
-gUnknown_845A2D4:: @ 845A2D4
- .incbin "baserom.gba", 0x45A2D4, 0x3
-
-gUnknown_845A2D7:: @ 845A2D7
- .incbin "baserom.gba", 0x45A2D7, 0x3
-
-gUnknown_845A2DA:: @ 845A2DA
- .incbin "baserom.gba", 0x45A2DA, 0x3
-
-gUnknown_845A2DD:: @ 845A2DD
- .incbin "baserom.gba", 0x45A2DD, 0x3
-
-gUnknown_845A2E0:: @ 845A2E0
- .incbin "baserom.gba", 0x45A2E0, 0x3
-
-gUnknown_845A2E3:: @ 845A2E3
- .incbin "baserom.gba", 0x45A2E3, 0x5
-
-sActionStringTable:: @ 845A2E8
- .incbin "baserom.gba", 0x45A2E8, 0x6C
-
-sDescriptionStringTable:: @ 845A354
- .incbin "baserom.gba", 0x45A354, 0x28
-
-gUnknown_845A37C:: @ 845A37C
- .incbin "baserom.gba", 0x45A37C, 0xB0
-
-sSpriteSheet_HeldItem:: @ 845A42C
- .incbin "baserom.gba", 0x45A42C, 0x8
-
-sSpritePalette_HeldItem:: @ 845A434
- .incbin "baserom.gba", 0x45A434, 0x8
-
-sSpriteTemplate_HeldItem:: @ 845A43C
- .incbin "baserom.gba", 0x45A43C, 0x38
-
-sSpriteSheet_MenuPokeball:: @ 845A474
- .incbin "baserom.gba", 0x45A474, 0x8
-
-sSpritePalette_MenuPokeball:: @ 845A47C
- .incbin "baserom.gba", 0x45A47C, 0x8
-
-sSpriteTemplate_MenuPokeball:: @ 845A484
- .incbin "baserom.gba", 0x45A484, 0x68
-
-sSpriteSheet_MenuPokeballSmall:: @ 845A4EC
- .incbin "baserom.gba", 0x45A4EC, 0x8
-
-sSpriteTemplate_MenuPokeballSmall:: @ 845A4F4
- .incbin "baserom.gba", 0x45A4F4, 0x80
-
-sSpriteSheet_StatusIcons:: @ 845A574
- .incbin "baserom.gba", 0x45A574, 0x8
-
-sSpritePalette_StatusIcons:: @ 845A57C
- .incbin "baserom.gba", 0x45A57C, 0x8
-
-sSpriteTemplate_StatusIcons:: @ 845A584
- .incbin "baserom.gba", 0x45A584, 0x18
-
-sMultiBattlePartnersPartyMask:: @ 845A59C
- .incbin "baserom.gba", 0x45A59C, 0x7C
-
-sCursorOptions:: @ 845A618
- .incbin "baserom.gba", 0x45A618, 0x114
-
-sPartyMenuActions:: @ 845A72C
- .incbin "baserom.gba", 0x45A72C, 0x34
-
-sPartyMenuActionCounts:: @ 845A760
- .incbin "baserom.gba", 0x45A760, 0xE
-
-sFieldMoves:: @ 845A76E
- .incbin "baserom.gba", 0x45A76E, 0x1A
-
-sFieldMoveCursorCallbacks:: @ 845A788
- .incbin "baserom.gba", 0x45A788, 0x60
-
-sUnionRoomTradeMessages:: @ 845A7E8
- .4byte gUnknown_841718C @ Not what other player wants
- .4byte gUnknown_84171CC @ Not an egg
- .4byte gUnknown_84170BC @ Mon can't be traded
- .4byte gUnknown_84170BC @ Mon can't be traded
- .4byte gUnknown_84170FC @ Other trainer's mon can't be traded
- .4byte gUnknown_84170E0 @ Egg can't be traded
- .4byte gUnknown_8417130 @ Other trainer can't accept
- .4byte gUnknown_8417164 @ Can't trade with trainer now
- .4byte gUnknown_8417164 @ Can't trade with trainer now
-
-sTMHMMoves:: @ 845A80C
- .incbin "baserom.gba", 0x45A80C, 0x74
diff --git a/data/strings.s b/data/strings.s
index 3cd263df9..a0454c12b 100644
--- a/data/strings.s
+++ b/data/strings.s
@@ -433,16 +433,16 @@ gString_Dummy:: @ 84161CD
gUnknown_84161CE::
.string "キャンセル$"
-gUnknown_84161D4::
+gText_Item::
.string "ITEM$"
-gUnknown_84161D9::
+gText_Mail::
.string "MAIL$"
-gUnknown_84161DE::
+gText_Take::
.string "TAKE$"
-gUnknown_84161E3::
+gText_Store::
.string "STORE$"
gUnknown_84161E9::
@@ -804,34 +804,34 @@ gText_TurnedOverItemsWorthYen:: @ 8416959
gText_PokedollarVar1:: @ 841697A
.string "¥{STR_VAR_1}$"
-gUnknown_841697E:: @ 0x841697E
+gText_Shift:: @ 0x841697E
.string "SHIFT$"
-gUnknown_8416984:: @ 0x8416984
+gText_SendOut:: @ 0x8416984
.string "SEND OUT$"
-gUnknown_841698D:: @ 0x841698D
+gText_Switch2:: @ 0x841698D
.string "SWITCH$"
-gUnknown_8416994:: @ 0x8416994
+gText_Summary5:: @ 0x8416994
.string "SUMMARY$"
gUnknown_841699C:: @ 0x841699C
.string "つかえるわざ$"
-gUnknown_84169A3:: @ 0x84169A3
+gText_Enter:: @ 0x84169A3
.string "ENTER$"
-gUnknown_84169A9:: @ 0x84169A9
+gText_NoEntry:: @ 0x84169A9
.string "NO ENTRY$"
-gUnknown_84169B2:: @ 0x84169B2
+gText_Take2:: @ 0x84169B2
.string "TAKE$"
-gUnknown_84169B7:: @ 0x84169B7
+gText_Read2:: @ 0x84169B7
.string "READ$"
-gUnknown_84169BC:: @ 0x84169BC
+gText_Trade4:: @ 0x84169BC
.string "TRADE$"
gText_HP3:: @ 84169C2
@@ -1044,144 +1044,144 @@ gUnknown_8417094:: @ 0x8417094
.string "POKéMON for battle.$"
.align 2
-gUnknown_84170BC:: @ 84170BC
+gText_PkmnCantBeTradedNow:: @ 84170BC
.string "That POKéMON can't be traded\n"
.string "now.$"
.align 2
-gUnknown_84170E0:: @ 84170E0
+gText_EggCantBeTradedNow:: @ 84170E0
.string "An EGG can't be traded now.$"
.align 2
-gUnknown_84170FC:: @ 0x84170FC
+gText_OtherTrainersPkmnCantBeTraded:: @ 0x84170FC
.string "The other TRAINER's POKéMON\n"
.string "can't be traded now.$"
.align 2
-gUnknown_8417130:: @ 0x8417130
+gText_OtherTrainerCantAcceptPkmn:: @ 0x8417130
.string "The other TRAINER can't accept\n"
.string "that POKéMON now.$"
.align 2
-gUnknown_8417164:: @ 0x8417164
+gText_CantTradeWithTrainer:: @ 0x8417164
.string "You can't trade with that\n"
.string "TRAINER now.$"
.align 2
-gUnknown_841718C:: @ 0x841718C
+gText_NotPkmnOtherTrainerWants:: @ 0x841718C
.string "That isn't the type of POKéMON\n"
.string "that the other TRAINER wants.$"
.align 2
-gUnknown_84171CC:: @ 0x84171CC
+gText_ThatIsntAnEgg:: @ 0x84171CC
.string "That isn't an EGG.$"
-gUnknown_84171DF:: @ 0x84171DF
+gText_ChoosePokemon:: @ 0x84171DF
.string "Choose a POKéMON.$"
-gUnknown_84171F1:: @ 0x84171F1
+gText_MoveToWhere:: @ 0x84171F1
.string "Move to where?$"
-gUnknown_8417200:: @ 0x8417200
+gText_TeachWhichPokemon:: @ 0x8417200
.string "Teach which POKéMON?$"
-gUnknown_8417215:: @ 0x8417215
+gText_UseOnWhichPokemon:: @ 0x8417215
.string "Use on which POKéMON?$"
-gUnknown_841722B:: @ 0x841722B
+gText_GiveToWhichPokemon:: @ 0x841722B
.string "Give to which POKéMON?$"
-gUnknown_8417242:: @ 0x8417242
+gText_DoWhatWithPokemon:: @ 0x8417242
.string "Do what with this {PKMN}?$"
-gUnknown_8417258:: @ 0x8417258
+gText_NothingToCut:: @ 0x8417258
.string "There's nothing to CUT.$"
-gUnknown_8417270:: @ 0x8417270
+gText_CantSurfHere:: @ 0x8417270
.string "No SURFING here!$"
-gUnknown_8417281:: @ 0x8417281
+gText_AlreadySurfing:: @ 0x8417281
.string "You're already SURFING.$"
-gUnknown_8417299:: @ 0x8417299
+gText_CantUseHere:: @ 0x8417299
.string "Can't use that here.$"
-gUnknown_84172AE:: @ 0x84172AE
+gText_RestoreWhichMove:: @ 0x84172AE
.string "Restore which move?$"
-gUnknown_84172C2:: @ 0x84172C2
+gText_BoostPp:: @ 0x84172C2
.string "Boost PP of which?$"
-gUnknown_84172D5:: @ 0x84172D5
+gText_DoWhatWithItem:: @ 0x84172D5
.string "Do what with an item?$"
-gUnknown_84172EB:: @ 0x84172EB
+gText_NoPokemonForBattle:: @ 0x84172EB
.string "No battling this way!$"
-gUnknown_8417301:: @ 0x8417301
+gText_ChoosePokemon2:: @ 0x8417301
.string "Choose a POKéMON.$"
-gUnknown_8417313:: @ 0x8417313
+gText_NotEnoughHp:: @ 0x8417313
.string "Not enough HP‥$"
-gUnknown_8417322:: @ 0x8417322
+gText_ThreePkmnAreNeeded:: @ 0x8417322
.string "Three {PKMN} are needed.$"
-gUnknown_8417337:: @ 0x8417337
+gText_PokemonCantBeSame:: @ 0x8417337
.string "{PKMN} can't be the same.$"
-gUnknown_841734D:: @ 0x841734D
+gText_NoIdenticalHoldItems:: @ 0x841734D
.string "No same hold items!$"
-gUnknown_8417361:: @ 0x8417361
+gText_CurrentIsTooFast:: @ 0x8417361
.string "The current is much too fast!$"
-gUnknown_841737F:: @ 0x841737F
+gText_DoWhatWithMail:: @ 0x841737F
.string "Do what with the MAIL?$"
-gUnknown_8417396:: @ 0x8417396
+gText_ChoosePokemonCancel:: @ 0x8417396
.string "Choose POKéMON or CANCEL.$"
-gUnknown_84173B0:: @ 0x84173B0
+gText_ChoosePokemonConfirm:: @ 0x84173B0
.string "Choose POKéMON and confirm.$"
-gUnknown_84173CC:: @ 0x84173CC
+gText_TwoPokemonAreNeeded:: @ 0x84173CC
.string "Two POKéMON are needed.$"
-gUnknown_84173E4:: @ 0x84173E4
+gText_EnjoyCycling:: @ 0x84173E4
.string "Let's enjoy cycling!$"
-gUnknown_84173F9:: @ 0x84173F9
+gText_InUseAlready_PM:: @ 0x84173F9
.string "This is in use already.$"
-gUnknown_8417411:: @ 0x8417411
+gText_NoUse:: @ 0x8417411
.string "No use.$"
-gUnknown_8417419:: @ 0x8417419
+gText_Able:: @ 0x8417419
.string "ABLE$"
-gUnknown_841741E:: @ 0x841741E
+gText_First_PM:: @ 0x841741E
.string "FIRST$"
-gUnknown_8417424:: @ 0x8417424
+gText_Second_PM:: @ 0x8417424
.string "SECOND$"
-gUnknown_841742B:: @ 0x841742B
+gText_Third_PM:: @ 0x841742B
.string "THIRD$"
-gUnknown_8417431:: @ 0x8417431
+gText_Able2:: @ 0x8417431
.string "ABLE$"
-gUnknown_8417436:: @ 0x8417436
+gText_NotAble:: @ 0x8417436
.string "NOT ABLE$"
-gUnknown_841743F:: @ 0x841743F
+gText_Able3:: @ 0x841743F
.string "ABLE!$"
-gUnknown_8417445:: @ 0x8417445
+gText_NotAble2:: @ 0x8417445
.string "NOT ABLE!$"
-gUnknown_841744F:: @ 0x841744F
+gText_Learned:: @ 0x841744F
.string "LEARNED$"
gUnknown_8417457:: @ 8417457
@@ -1197,40 +1197,40 @@ gUnknown_8417494:: @ 8417494
.string "You also choose POKéMON here if\n"
.string "you want to use an item on one.{PAUSE_UNTIL_PRESS}$"
-gUnknown_8417533:: @ 0x8417533
+gText_CutATreeOrGrass:: @ 0x8417533
.string "Cut a tree or grass.$"
-gUnknown_8417548:: @ 0x8417548
+gText_FlyToAKnownTown:: @ 0x8417548
.string "Fly to a known town.$"
-gUnknown_841755D:: @ 0x841755D
+gText_TravelOnWater:: @ 0x841755D
.string "Travel on water.$"
-gUnknown_841756E:: @ 0x841756E
+gText_MoveHeavyBoulders:: @ 0x841756E
.string "Move heavy boulders.$"
-gUnknown_8417583:: @ 0x8417583
+gText_LightUpDarkness:: @ 0x8417583
.string "Light up darkness.$"
-gUnknown_8417596:: @ 0x8417596
+gText_ShatterACrackedRock:: @ 0x8417596
.string "Shatter a cracked rock.$"
-gUnknown_84175AE:: @ 0x84175AE
+gText_ClimbAWaterfall:: @ 0x84175AE
.string "Climb a waterfall.$"
gUnknown_84175C1:: @ 0x84175C1
.string "すいちゅうに もぐる$"
-gUnknown_84175CC:: @ 0x84175CC
+gText_EscapeFromHere:: @ 0x84175CC
.string "Escape from here.$"
-gUnknown_84175DE:: @ 0x84175DE
+gText_LureWildPokemon:: @ 0x84175DE
.string "Lure wild POKéMON.$"
-gUnknown_84175F1:: @ 0x84175F1
+gText_ShareHp:: @ 0x84175F1
.string "Share HP.$"
-gUnknown_84175FB:: @ 0x84175FB
+gText_ReturnToAHealingSpot:: @ 0x84175FB
.string "Return to a healing spot.$"
gUnknown_8417615:: @ 8417615
@@ -3266,7 +3266,7 @@ gText_Badges:: @ 841B6EC
gTextJPDummy_Ko:: @ 841B6F3
.string "$"
-gUnknown_841B6F4:: @ 0x841B6F4
+gText_Register:: @ 0x841B6F4
.string "REGISTER$"
gText_HatchedFromEgg:: @ 841B6FD
diff --git a/graphics/interface/hold_icons.pal b/graphics/interface/hold_icons.pal
new file mode 100644
index 000000000..e31d717c9
--- /dev/null
+++ b/graphics/interface/hold_icons.pal
@@ -0,0 +1,19 @@
+JASC-PAL
+0100
+16
+57 205 106
+255 255 255
+213 213 255
+148 148 180
+255 246 156
+222 222 115
+246 82 41
+164 90 82
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+98 98 98
diff --git a/graphics/interface/hold_icons.png b/graphics/interface/hold_icons.png
new file mode 100644
index 000000000..15df00440
--- /dev/null
+++ b/graphics/interface/hold_icons.png
Binary files differ
diff --git a/graphics/interface/party_menu_cancel_button.bin b/graphics/interface/party_menu_cancel_button.bin
new file mode 100644
index 000000000..7f11aaf4e
--- /dev/null
+++ b/graphics/interface/party_menu_cancel_button.bin
@@ -0,0 +1,2 @@
+
+            \ No newline at end of file
diff --git a/graphics/interface/party_menu_confirm_button.bin b/graphics/interface/party_menu_confirm_button.bin
new file mode 100644
index 000000000..8c3c1be3d
--- /dev/null
+++ b/graphics/interface/party_menu_confirm_button.bin
@@ -0,0 +1 @@
+#$ \ No newline at end of file
diff --git a/include/constants/party_menu.h b/include/constants/party_menu.h
new file mode 100644
index 000000000..f8f77f466
--- /dev/null
+++ b/include/constants/party_menu.h
@@ -0,0 +1,114 @@
+#ifndef GUARD_CONSTANTS_PARTY_MENU_H
+#define GUARD_CONSTANTS_PARTY_MENU_H
+
+#define AILMENT_NONE 0
+#define AILMENT_PSN 1
+#define AILMENT_PRZ 2
+#define AILMENT_SLP 3
+#define AILMENT_FRZ 4
+#define AILMENT_BRN 5
+#define AILMENT_PKRS 6
+#define AILMENT_FNT 7
+
+#define TUTOR_MOVE_MEGA_PUNCH 0
+#define TUTOR_MOVE_SWORDS_DANCE 1
+#define TUTOR_MOVE_MEGA_KICK 2
+#define TUTOR_MOVE_BODY_SLAM 3
+#define TUTOR_MOVE_DOUBLE_EDGE 4
+#define TUTOR_MOVE_COUNTER 5
+#define TUTOR_MOVE_SEISMIC_TOSS 6
+#define TUTOR_MOVE_MIMIC 7
+#define TUTOR_MOVE_METRONOME 8
+#define TUTOR_MOVE_SOFT_BOILED 9
+#define TUTOR_MOVE_DREAM_EATER 10
+#define TUTOR_MOVE_THUNDER_WAVE 11
+#define TUTOR_MOVE_EXPLOSION 12
+#define TUTOR_MOVE_ROCK_SLIDE 13
+#define TUTOR_MOVE_SUBSTITUTE 14
+#define TUTOR_MOVE_COUNT 15
+
+#define PARTY_LAYOUT_SINGLE 0
+#define PARTY_LAYOUT_DOUBLE 1
+#define PARTY_LAYOUT_MULTI 2
+#define PARTY_LAYOUT_MULTI_SHOWCASE 3 // The layout during the screen that appears just before a multi battle
+#define PARTY_LAYOUT_COUNT 4
+#define KEEP_PARTY_LAYOUT 0xFF
+
+#define PARTY_MENU_TYPE_FIELD 0
+#define PARTY_MENU_TYPE_IN_BATTLE 1
+#define PARTY_MENU_TYPE_CONTEST 2
+#define PARTY_MENU_TYPE_CHOOSE_MON 3
+#define PARTY_MENU_TYPE_CHOOSE_HALF 4 // multi battles, eReader battles, and some battle facilities
+#define PARTY_MENU_TYPE_MULTI_SHOWCASE 5
+#define PARTY_MENU_TYPE_DAYCARE 6
+#define PARTY_MENU_TYPE_MOVE_RELEARNER 7
+#define PARTY_MENU_TYPE_UNION_ROOM_REGISTER 8 // trading board
+#define PARTY_MENU_TYPE_UNION_ROOM_TRADE 9 // trading board
+#define PARTY_MENU_TYPE_SPIN_TRADE 10 // Unused beta for Gen IV's Spin Trade
+#define PARTY_MENU_TYPE_MINIGAME 11
+#define PARTY_MENU_TYPE_STORE_PYRAMID_HELD_ITEMS 12
+
+#define PARTY_ACTION_CHOOSE_MON 0
+#define PARTY_ACTION_SEND_OUT 1
+#define PARTY_ACTION_CANT_SWITCH 2
+#define PARTY_ACTION_USE_ITEM 3
+#define PARTY_ACTION_ABILITY_PREVENTS 4
+#define PARTY_ACTION_GIVE_ITEM 5
+#define PARTY_ACTION_GIVE_PC_ITEM 6 // Unused. Not possible to give non-mail items directly from PC
+#define PARTY_ACTION_GIVE_MAILBOX_MAIL 7
+#define PARTY_ACTION_SWITCH 8
+#define PARTY_ACTION_SWITCHING 9
+#define PARTY_ACTION_SOFTBOILED 10
+#define PARTY_ACTION_CHOOSE_AND_CLOSE 11
+#define PARTY_ACTION_MOVE_TUTOR 12
+#define PARTY_ACTION_MINIGAME 13
+#define PARTY_ACTION_REUSABLE_ITEM 14 // Unused. The only reusable items are handled separately
+
+// IDs for DisplayPartyMenuStdMessage, to display the message at the bottom of the party menu
+#define PARTY_MSG_CHOOSE_MON 0
+#define PARTY_MSG_CHOOSE_MON_OR_CANCEL 1
+#define PARTY_MSG_CHOOSE_MON_AND_CONFIRM 2
+#define PARTY_MSG_MOVE_TO_WHERE 3
+#define PARTY_MSG_TEACH_WHICH_MON 4
+#define PARTY_MSG_USE_ON_WHICH_MON 5
+#define PARTY_MSG_GIVE_TO_WHICH_MON 6
+#define PARTY_MSG_NOTHING_TO_CUT 7
+#define PARTY_MSG_CANT_SURF_HERE 8
+#define PARTY_MSG_ALREADY_SURFING 9
+#define PARTY_MSG_CURRENT_TOO_FAST 10
+#define PARTY_MSG_ENJOY_CYCLING 11
+#define PARTY_MSG_ALREADY_IN_USE 12
+#define PARTY_MSG_CANT_USE_HERE 13
+#define PARTY_MSG_NO_MON_FOR_BATTLE 14
+#define PARTY_MSG_CHOOSE_MON_2 15
+#define PARTY_MSG_NOT_ENOUGH_HP 16
+#define PARTY_MSG_THREE_MONS_ARE_NEEDED 17
+#define PARTY_MSG_TWO_MONS_ARE_NEEDED 18
+#define PARTY_MSG_MONS_CANT_BE_SAME 19
+#define PARTY_MSG_NO_SAME_HOLD_ITEMS 20
+#define PARTY_MSG_UNUSED 21
+#define PARTY_MSG_DO_WHAT_WITH_MON 22
+#define PARTY_MSG_RESTORE_WHICH_MOVE 23
+#define PARTY_MSG_BOOST_PP_WHICH_MOVE 24
+#define PARTY_MSG_DO_WHAT_WITH_ITEM 25
+#define PARTY_MSG_DO_WHAT_WITH_MAIL 26
+#define PARTY_MSG_NONE 127
+
+// IDs for DisplayPartyPokemonDescriptionText, to display a message in the party pokemon's box
+#define PARTYBOX_DESC_NO_USE 0
+#define PARTYBOX_DESC_ABLE_3 1
+#define PARTYBOX_DESC_FIRST 2
+#define PARTYBOX_DESC_SECOND 3
+#define PARTYBOX_DESC_THIRD 4
+#define PARTYBOX_DESC_ABLE 5
+#define PARTYBOX_DESC_NOT_ABLE 6
+#define PARTYBOX_DESC_ABLE_2 7
+#define PARTYBOX_DESC_NOT_ABLE_2 8
+#define PARTYBOX_DESC_LEARNED 9
+
+#define SELECTWINDOW_ACTIONS 0
+#define SELECTWINDOW_ITEM 1
+#define SELECTWINDOW_MAIL 2
+#define SELECTWINDOW_MOVES 3
+
+#endif // GUARD_CONSTANTS_PARTY_MENU_H
diff --git a/include/constants/trade.h b/include/constants/trade.h
new file mode 100644
index 000000000..b1371caab
--- /dev/null
+++ b/include/constants/trade.h
@@ -0,0 +1,118 @@
+ #ifndef GUARD_CONSTANTS_TRADE_H
+#define GUARD_CONSTANTS_TRADE_H
+
+// TODO: document trade.c and trade_scene.c with corresponding macros
+// and examine if these are correct
+
+#define TRADE_PLAYER 0
+#define TRADE_PARTNER 1
+
+#define LINK_TRADE_TIMEOUT 300
+
+// In-game Trade IDs
+#define INGAME_TRADE_SEEDOT 0
+#define INGAME_TRADE_PLUSLE 1
+#define INGAME_TRADE_HORSEA 2
+#define INGAME_TRADE_MEOWTH 3
+
+// Flag IDs for sending link data
+#define INITIATE_TRADE 1
+#define CANCEL_TRADE 2
+#define WANTS_TO_TRADE 1
+#define WANTS_TO_CANCEL 2
+#define READY_FINISH_TRADE 1
+#define FINISH_TRADE 2
+
+// Return values for CanTradeSelectedMon and CanSpinTradeMon
+#define CAN_TRADE_MON 0
+#define CANT_TRADE_LAST_MON 1
+#define CANT_TRADE_NATIONAL 2
+#define CANT_TRADE_EGG_YET 3
+#define CANT_TRADE_INVALID_MON 4
+#define CANT_TRADE_EGG_YET2 5
+
+// Return values for CheckValidityOfTradeMons
+#define PLAYER_MON_INVALID 0
+#define BOTH_MONS_VALID 1
+#define PARTNER_MON_INVALID 2
+
+// Return values for GetGameProgressForLinkTrade
+#define TRADE_BOTH_PLAYERS_READY 0
+#define TRADE_PLAYER_NOT_READY 1
+#define TRADE_PARTNER_NOT_READY 2
+
+// Indexes for sTradeActionTexts
+#define TRADE_TEXT_CANCEL 0
+#define TRADE_TEXT_CHOOSE_MON 1
+#define TRADE_TEXT_SUMMARY 2
+#define TRADE_TEXT_TRADE 3
+#define TRADE_TEXT_CANCEL_TRADE 4
+#define TRADE_TEXT_JP_QUIT 5
+
+// Checked to confirm DrawTradeMenuParty has reached final state
+#define DRAW_PARTY_FINISH 5
+
+// Message indexes for sTradeMessages
+#define TRADE_MSG_STANDBY 0
+#define TRADE_MSG_CANCELED 1
+#define TRADE_MSG_ONLY_MON1 2
+#define TRADE_MSG_ONLY_MON2 3
+#define TRADE_MSG_WAITING_FOR_FRIEND 4
+#define TRADE_MSG_FRIEND_WANTS_TO_TRADE 5
+#define TRADE_MSG_MON_CANT_BE_TRADED 6
+#define TRADE_MSG_EGG_CANT_BE_TRADED 7
+#define TRADE_MSG_FRIENDS_MON_CANT_BE_TRADED 8
+
+// IDs for QueueAction
+#define QUEUE_SEND_DATA 0
+#define QUEUE_STANDBY 1
+#define QUEUE_ONLY_MON1 2
+#define QUEUE_ONLY_MON2 3
+#define QUEUE_UNUSED1 4
+#define QUEUE_UNUSED2 5
+#define QUEUE_MON_CANT_BE_TRADED 6
+#define QUEUE_EGG_CANT_BE_TRADED 7
+#define QUEUE_FRIENDS_MON_CANT_BE_TRADED 8
+
+#define QUEUE_DELAY_MSG 3
+#define QUEUE_DELAY_DATA 5
+
+// IDs for CallTradeMenuFunc
+#define TRADEMENUFUNC_MAIN_MENU 0
+#define TRADEMENUFUNC_SELECTED_MON 1
+#define TRADEMENUFUNC_SHOW_MON_SUMMARY 2
+#define TRADEMENUFUNC_CONFIRM_OR_CANCEL_TRADE 3
+#define TRADEMENUFUNC_CANCEL_TRADE_PROMPT 4
+#define TRADEMENUFUNC_UNUSED_5 5
+#define TRADEMENUFUNC_BOTH_MONS_SELECTED 6
+#define TRADEMENUFUNC_CONFIRM_TRADE_PROMPT 7
+#define TRADEMENUFUNC_REDRAW_MAIN_MENU 8
+#define TRADEMENUFUNC_LINK_TRADE_FADE_OUT 9
+#define TRADEMENUFUNC_LINK_TRADE_WAIT_FADE 10
+#define TRADEMENUFUNC_CANCEL_TRADE_1 11
+#define TRADEMENUFUNC_CANCEL_TRADE_2 12
+#define TRADEMENUFUNC_START_LINK_TRADE 13
+#define TRADEMENUFUNC_DELAY_TRADE_CONFIRM 14
+#define TRADEMENUFUNC_UNUSED_15 15
+#define TRADEMENUFUNC_LINK_TRADE_WAIT_QUEUE 16
+#define TRADEMENUFUNC_PARTNER_MON_INVALID 17
+#define TRADEMENUFUNC_STANDBY 100
+
+// Message indexes for sUnionRoomTradeMessages
+#define UR_TRADE_MSG_NONE 0
+#define UR_TRADE_MSG_NOT_MON_PARTNER_WANTS 1
+#define UR_TRADE_MSG_NOT_EGG 2
+#define UR_TRADE_MSG_MON_CANT_BE_TRADED_1 3
+#define UR_TRADE_MSG_MON_CANT_BE_TRADED_2 4
+#define UR_TRADE_MSG_PARTNERS_MON_CANT_BE_TRADED 5
+#define UR_TRADE_MSG_EGG_CANT_BE_TRADED 6
+#define UR_TRADE_MSG_PARTNER_CANT_ACCEPT_MON 7
+#define UR_TRADE_MSG_CANT_TRADE_WITH_PARTNER_1 8
+#define UR_TRADE_MSG_CANT_TRADE_WITH_PARTNER_2 9
+
+// Return values for CanRegisterMonForTradingBoard
+#define CAN_REGISTER_MON 0
+#define CANT_REGISTER_MON 1
+#define CANT_REGISTER_EGG 2
+
+#endif //GUARD_CONSTANTS_TRADE_H
diff --git a/include/fldeff.h b/include/fldeff.h
index 690d5f953..8dcb42500 100644
--- a/include/fldeff.h
+++ b/include/fldeff.h
@@ -16,8 +16,10 @@ u8 oei_task_add(void);
// flash
u8 sub_80C9DCC(u8 lightLevel, u8 mapType);
u8 sub_80C9D7C(u8 mapType1, u8 mapType2);
+bool8 SetUpFieldMove_Flash(void);
// cut
+bool8 SetUpFieldMove_Cut(void);
// dig
bool8 SetUpFieldMove_Dig(void);
@@ -43,7 +45,7 @@ bool8 SetUpFieldMove_Teleport(void);
bool8 FldEff_UseTeleport(void);
// softboiled
-bool8 hm_prepare_dive_probably(void);
+bool8 SetUpFieldMove_SoftBoiled(void);
void ChooseMonForSoftboiled(u8 taskId);
void sub_80E5724(u8 taskId);
diff --git a/include/graphics.h b/include/graphics.h
index 354339235..930201403 100644
--- a/include/graphics.h
+++ b/include/graphics.h
@@ -3740,6 +3740,13 @@ extern const u8 gWeatherFog1Tiles[];
extern const u32 gBattleAnimFogTilemap[];
extern const u16 gUnknown_83C2CE0[];
+// party_menu
+extern const u32 gPartyMenuPokeball_Gfx[];
+extern const u32 gPartyMenuPokeball_Pal[];
+extern const u32 gPartyMenuPokeballSmall_Gfx[];
+extern const u32 gStatusGfx_Icons[];
+extern const u32 gStatusPal_Icons[];
+
// credits
extern const u32 gCreditsPokeballBgGfxTiles[];
extern const u32 gCreditsPokeballBgGfxMap[];
diff --git a/include/party_menu.h b/include/party_menu.h
index 6e96c47ee..f5b4bd827 100644
--- a/include/party_menu.h
+++ b/include/party_menu.h
@@ -3,49 +3,28 @@
#include "main.h"
#include "task.h"
+#include "constants/party_menu.h"
-enum {
- AILMENT_NONE,
- AILMENT_PSN,
- AILMENT_PRZ,
- AILMENT_SLP,
- AILMENT_FRZ,
- AILMENT_BRN,
- AILMENT_PKRS,
- AILMENT_FNT
-};
-
-enum
-{
- PARTY_CHOOSE_MON,
- PARTY_MUST_CHOOSE_MON,
- PARTY_CANT_SWITCH,
- PARTY_USE_ITEM_ON,
- PARTY_ABILITY_PREVENTS,
- PARTY_GIVE_ITEM,
-};
-
-struct Struct203B0A0
+struct PartyMenu
{
MainCallback exitCallback;
- TaskFunc unk4;
- u8 unk8_0:4;
- u8 mode:2;
- u8 unk8_2:2;
- s8 unk9;
- s8 unkA;
- u8 unkB;
- u16 unkC;
- s16 unkE;
- s16 unk10;
+ TaskFunc task;
+ u8 menuType:4;
+ u8 layout:2;
+ s8 slotId;
+ s8 slotId2;
+ u8 action;
+ u16 bagItem;
+ s16 data1; // used variously as a moveId, counter, moveSlotId, or cursorPos
+ s16 learnMoveState; // data2, used only as a learn move state
};
-extern struct Struct203B0A0 gPartyMenu;
+extern struct PartyMenu gPartyMenu;
extern u8 gPartyMenuUseExitCallback;
-extern u8 gUnknown_203B0C1;
-extern u8 gBattlePartyCurrentOrder[3];
+extern u8 gSelectedMonPartyId;
+extern u8 gBattlePartyCurrentOrder[PARTY_SIZE / 2];
extern void (*gItemUseCB)(u8 taskId, TaskFunc func);
-extern u8 gSelectedOrderFromParty[3];
+extern u8 gSelectedOrderFromParty[4];
bool8 FieldCallback_PrepareFadeInFromMenu(void);
bool8 MonKnowsMove(struct Pokemon *, u16);
diff --git a/include/strings.h b/include/strings.h
index f5dc759e6..9242c7eaa 100644
--- a/include/strings.h
+++ b/include/strings.h
@@ -265,6 +265,77 @@ extern const u8 gUnknown_81C6787[];
extern const u8 gUnknown_81C684B[];
extern const u8 gUnknown_81C686C[];
+// party_menu
+extern const u8 gText_ChoosePokemon[];
+extern const u8 gText_ChoosePokemonCancel[];
+extern const u8 gText_ChoosePokemonConfirm[];
+extern const u8 gText_MoveToWhere[];
+extern const u8 gText_TeachWhichPokemon[];
+extern const u8 gText_UseOnWhichPokemon[];
+extern const u8 gText_GiveToWhichPokemon[];
+extern const u8 gText_NothingToCut[];
+extern const u8 gText_CantSurfHere[];
+extern const u8 gText_AlreadySurfing[];
+extern const u8 gText_CurrentIsTooFast[];
+extern const u8 gText_EnjoyCycling[];
+extern const u8 gText_InUseAlready_PM[];
+extern const u8 gText_CantUseHere[];
+extern const u8 gText_NoPokemonForBattle[];
+extern const u8 gText_ChoosePokemon2[];
+extern const u8 gText_NotEnoughHp[];
+extern const u8 gText_ThreePkmnAreNeeded[];
+extern const u8 gText_TwoPokemonAreNeeded[];
+extern const u8 gText_PokemonCantBeSame[];
+extern const u8 gText_NoIdenticalHoldItems[];
+extern const u8 gString_Dummy[];
+extern const u8 gText_DoWhatWithPokemon[];
+extern const u8 gText_RestoreWhichMove[];
+extern const u8 gText_BoostPp[];
+extern const u8 gText_DoWhatWithItem[];
+extern const u8 gText_DoWhatWithMail[];
+extern const u8 gText_NoUse[];
+extern const u8 gText_Able[];
+extern const u8 gText_First_PM[];
+extern const u8 gText_Second_PM[];
+extern const u8 gText_Third_PM[];
+extern const u8 gText_NotAble[];
+extern const u8 gText_Able3[];
+extern const u8 gText_NotAble2[];
+extern const u8 gText_Learned[];
+extern const u8 gText_Able2[];
+extern const u8 gText_CutATreeOrGrass[];
+extern const u8 gText_FlyToAKnownTown[];
+extern const u8 gText_TravelOnWater[];
+extern const u8 gText_MoveHeavyBoulders[];
+extern const u8 gText_LightUpDarkness[];
+extern const u8 gText_ShatterACrackedRock[];
+extern const u8 gText_ClimbAWaterfall[];
+extern const u8 gText_EscapeFromHere[];
+extern const u8 gText_LureWildPokemon[];
+extern const u8 gText_ShareHp[];
+extern const u8 gText_ReturnToAHealingSpot[];
+extern const u8 gText_Summary5[];
+extern const u8 gText_Switch2[];
+extern const u8 gText_Item[];
+extern const u8 gText_Take[];
+extern const u8 gText_Mail[];
+extern const u8 gText_Take2[];
+extern const u8 gText_Read2[];
+extern const u8 gText_Shift[];
+extern const u8 gText_SendOut[];
+extern const u8 gText_Enter[];
+extern const u8 gText_NoEntry[];
+extern const u8 gText_Store[];
+extern const u8 gText_Register[];
+extern const u8 gText_Trade4[];
+extern const u8 gText_NotPkmnOtherTrainerWants[];
+extern const u8 gText_ThatIsntAnEgg[];
+extern const u8 gText_PkmnCantBeTradedNow[];
+extern const u8 gText_OtherTrainersPkmnCantBeTraded[];
+extern const u8 gText_EggCantBeTradedNow[];
+extern const u8 gText_OtherTrainerCantAcceptPkmn[];
+extern const u8 gText_CantTradeWithTrainer[];
+
// credits
extern const u8 gString_Dummy[];
extern const u8 gString_PokemonFireRed_Staff[]; // FR
@@ -390,7 +461,7 @@ extern const u8 gText_Pokedex[];
extern const u8 gTextJPDummy_Hiki[];
extern const u8 gText_Badges[];
extern const u8 gTextJPDummy_Ko[];
-extern const u8 gUnknown_841B6F4[];
+extern const u8 gText_Register[];
// mystery_gift_menu
extern const u8 gText_PickOKExit[];
@@ -703,9 +774,9 @@ extern const u8 gUnknown_841E16B[];
extern const u8 gUnknown_8417094[];
extern const u8 gUnknown_841E199[];
extern const u8 gUnknown_841E1C5[];
-extern const u8 gUnknown_84170BC[];
-extern const u8 gUnknown_84170E0[];
-extern const u8 gUnknown_84170FC[];
+extern const u8 gText_PkmnCantBeTradedNow[];
+extern const u8 gText_EggCantBeTradedNow[];
+extern const u8 gText_OtherTrainersPkmnCantBeTraded[];
extern const u8 gUnknown_841E09F[];
extern const u8 gEasyChatGroupName_Pokemon[];
diff --git a/include/trade.h b/include/trade.h
index 257357053..3c42be3ea 100644
--- a/include/trade.h
+++ b/include/trade.h
@@ -1,6 +1,9 @@
#ifndef GUARD_TRADE_H
#define GUARD_TRADE_H
+#include "global.h"
+#include "constants/trade.h"
+
extern struct MailStruct gLinkPartnerMail[6];
extern u8 gSelectedTradeMonPositions[2];
diff --git a/include/union_room.h b/include/union_room.h
index 2e97d87f4..00354ff31 100644
--- a/include/union_room.h
+++ b/include/union_room.h
@@ -1,6 +1,9 @@
#ifndef GUARD_UNION_ROOM_H
#define GUARD_UNION_ROOM_H
+#include "global.h"
+#include "librfu.h"
+
struct UnkStruct_Shared
{
struct UnkLinkRfuStruct_02022B14 field_0;
diff --git a/ld_script.txt b/ld_script.txt
index c23a7f105..fcf214ccb 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -239,6 +239,7 @@ SECTIONS {
src/quest_log.o(.text);
asm/link_rfu_3.o(.text);
asm/pokemon_special_anim.o(.text);
+ src/party_menu.o(.text);
asm/party_menu.o(.text);
asm/union_room_chat.o(.text);
src/help_system_812B1E0.o(.text);
@@ -516,7 +517,7 @@ SECTIONS {
src/quest_log.o(.rodata);
data/link_rfu_3.o(.rodata);
data/pokemon_special_anim.o(.rodata);
- data/party_menu.o(.rodata);
+ src/party_menu.o(.rodata);
data/union_room_chat.o(.rodata);
src/help_system_812B1E0.o(.rodata);
src/fame_checker.o(.rodata);
diff --git a/src/battle_controller_oak_old_man.c b/src/battle_controller_oak_old_man.c
index da8530c72..08c89ec1e 100644
--- a/src/battle_controller_oak_old_man.c
+++ b/src/battle_controller_oak_old_man.c
@@ -364,7 +364,7 @@ static void WaitForMonSelection(void)
if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active)
{
if (gPartyMenuUseExitCallback == 1)
- BtlController_EmitChosenMonReturnValue(1, gUnknown_203B0C1, gBattlePartyCurrentOrder);
+ BtlController_EmitChosenMonReturnValue(1, gSelectedMonPartyId, gBattlePartyCurrentOrder);
else
BtlController_EmitChosenMonReturnValue(1, 6, NULL);
OakOldManBufferExecCompleted();
diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c
index 41d81052e..baa794f70 100644
--- a/src/battle_controller_player.c
+++ b/src/battle_controller_player.c
@@ -1314,7 +1314,7 @@ static void WaitForMonSelection(void)
if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active)
{
if (gPartyMenuUseExitCallback == 1)
- BtlController_EmitChosenMonReturnValue(1, gUnknown_203B0C1, gBattlePartyCurrentOrder);
+ BtlController_EmitChosenMonReturnValue(1, gSelectedMonPartyId, gBattlePartyCurrentOrder);
else
BtlController_EmitChosenMonReturnValue(1, 6, NULL);
if ((gBattleBufferA[gActiveBattler][1] & 0xF) == 1)
diff --git a/src/battle_controller_pokedude.c b/src/battle_controller_pokedude.c
index 59fda163b..0b71a92e8 100644
--- a/src/battle_controller_pokedude.c
+++ b/src/battle_controller_pokedude.c
@@ -715,7 +715,7 @@ static void WaitForMonSelection(void)
if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active)
{
if (gPartyMenuUseExitCallback == 1)
- BtlController_EmitChosenMonReturnValue(1, gUnknown_203B0C1, gBattlePartyCurrentOrder);
+ BtlController_EmitChosenMonReturnValue(1, gSelectedMonPartyId, gBattlePartyCurrentOrder);
else
BtlController_EmitChosenMonReturnValue(1, 6, NULL);
PokedudeBufferExecCompleted();
diff --git a/src/battle_main.c b/src/battle_main.c
index da9bc1a49..a6d7e69c8 100644
--- a/src/battle_main.c
+++ b/src/battle_main.c
@@ -3137,7 +3137,7 @@ static void HandleTurnActionSelectionState(void)
*(gBattleStruct->field_58 + gActiveBattler) = gBattlerPartyIndexes[gActiveBattler];
if (gBattleMons[gActiveBattler].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION) || gStatuses3[gActiveBattler] & STATUS3_ROOTED)
{
- BtlController_EmitChoosePokemon(0, PARTY_CANT_SWITCH, 6, ABILITY_NONE, gBattleStruct->field_60[gActiveBattler]);
+ BtlController_EmitChoosePokemon(0, PARTY_ACTION_CANT_SWITCH, 6, ABILITY_NONE, gBattleStruct->field_60[gActiveBattler]);
}
else if ((i = ABILITY_ON_OPPOSING_FIELD(gActiveBattler, ABILITY_SHADOW_TAG))
|| ((i = ABILITY_ON_OPPOSING_FIELD(gActiveBattler, ABILITY_ARENA_TRAP))
@@ -3146,16 +3146,16 @@ static void HandleTurnActionSelectionState(void)
|| ((i = AbilityBattleEffects(ABILITYEFFECT_CHECK_FIELD_EXCEPT_BATTLER, gActiveBattler, ABILITY_MAGNET_PULL, 0, 0))
&& IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_STEEL)))
{
- BtlController_EmitChoosePokemon(0, ((i - 1) << 4) | PARTY_ABILITY_PREVENTS, 6, gLastUsedAbility, gBattleStruct->field_60[gActiveBattler]);
+ BtlController_EmitChoosePokemon(0, ((i - 1) << 4) | PARTY_ACTION_ABILITY_PREVENTS, 6, gLastUsedAbility, gBattleStruct->field_60[gActiveBattler]);
}
else
{
if (gActiveBattler == 2 && gChosenActionByBattler[0] == B_ACTION_SWITCH)
- BtlController_EmitChoosePokemon(0, PARTY_CHOOSE_MON, *(gBattleStruct->monToSwitchIntoId + 0), ABILITY_NONE, gBattleStruct->field_60[gActiveBattler]);
+ BtlController_EmitChoosePokemon(0, PARTY_ACTION_CHOOSE_MON, *(gBattleStruct->monToSwitchIntoId + 0), ABILITY_NONE, gBattleStruct->field_60[gActiveBattler]);
else if (gActiveBattler == 3 && gChosenActionByBattler[1] == B_ACTION_SWITCH)
- BtlController_EmitChoosePokemon(0, PARTY_CHOOSE_MON, *(gBattleStruct->monToSwitchIntoId + 1), ABILITY_NONE, gBattleStruct->field_60[gActiveBattler]);
+ BtlController_EmitChoosePokemon(0, PARTY_ACTION_CHOOSE_MON, *(gBattleStruct->monToSwitchIntoId + 1), ABILITY_NONE, gBattleStruct->field_60[gActiveBattler]);
else
- BtlController_EmitChoosePokemon(0, PARTY_CHOOSE_MON, 6, ABILITY_NONE, gBattleStruct->field_60[gActiveBattler]);
+ BtlController_EmitChoosePokemon(0, PARTY_ACTION_CHOOSE_MON, 6, ABILITY_NONE, gBattleStruct->field_60[gActiveBattler]);
}
MarkBattlerForControllerExec(gActiveBattler);
break;
diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c
index c568d96f9..fe7359eb9 100644
--- a/src/battle_script_commands.c
+++ b/src/battle_script_commands.c
@@ -4504,7 +4504,7 @@ static void atk4F_jumpifcantswitch(void)
static void sub_8024398(u8 arg0)
{
*(gBattleStruct->field_58 + gActiveBattler) = gBattlerPartyIndexes[gActiveBattler];
- BtlController_EmitChoosePokemon(0, PARTY_MUST_CHOOSE_MON, arg0, 0, gBattleStruct->field_60[gActiveBattler]);
+ BtlController_EmitChoosePokemon(0, PARTY_ACTION_SEND_OUT, arg0, 0, gBattleStruct->field_60[gActiveBattler]);
MarkBattlerForControllerExec(gActiveBattler);
}
@@ -4739,9 +4739,9 @@ static void atk50_openpartyscreen(void)
else
{
if (gBattlescriptCurrInstr[1] & OPEN_PARTY_ALLOW_CANCEL)
- hitmarkerFaintBits = PARTY_CHOOSE_MON; // Used here as the caseId for the EmitChoose function.
+ hitmarkerFaintBits = PARTY_ACTION_CHOOSE_MON; // Used here as the caseId for the EmitChoose function.
else
- hitmarkerFaintBits = PARTY_MUST_CHOOSE_MON;
+ hitmarkerFaintBits = PARTY_ACTION_SEND_OUT;
battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1] & ~(OPEN_PARTY_ALLOW_CANCEL));
if (gSpecialStatuses[battlerId].flag40)
{
diff --git a/src/data/party_menu.h b/src/data/party_menu.h
new file mode 100644
index 000000000..fde1a80f8
--- /dev/null
+++ b/src/data/party_menu.h
@@ -0,0 +1,1334 @@
+const struct BgTemplate sPartyMenuBgTemplates[] =
+{
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 31,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0
+ },
+ {
+ .bg = 1,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 30,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0
+ },
+ {
+ .bg = 2,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 28,
+ .screenSize = 1,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0
+ },
+};
+
+enum
+{
+ PARTY_BOX_LEFT_COLUMN,
+ PARTY_BOX_RIGHT_COLUMN,
+};
+
+const struct PartyMenuBoxInfoRects sPartyBoxInfoRects[] =
+{
+ [PARTY_BOX_LEFT_COLUMN] =
+ {
+ BlitBitmapToPartyWindow_LeftColumn,
+ {
+ // The below are the x, y, width, and height for each of the following info
+ 24, 11, 40, 13, // Nickname
+ 32, 20, 32, 8, // Level
+ 64, 20, 8, 8, // Gender
+ 38, 36, 24, 8, // HP
+ 53, 36, 24, 8, // Max HP
+ 24, 35, 48, 3 // HP bar
+ },
+ 12, 34, 64, 16 // Description text (e.g. NO USE)
+ },
+ [PARTY_BOX_RIGHT_COLUMN] =
+ {
+ BlitBitmapToPartyWindow_RightColumn,
+ {
+ // The below are the x, y, width, and height for each of the following info
+ 22, 3, 40, 13, // Nickname
+ 32, 12, 32, 8, // Level
+ 64, 12, 8, 8, // Gender
+ 102, 12, 24, 8, // HP
+ 117, 12, 24, 8, // Max HP
+ 88, 10, 48, 3 // HP bar
+ },
+ 77, 4, 64, 16 // Description text
+ },
+};
+
+const u8 sPartyMenuSpriteCoords[PARTY_LAYOUT_COUNT][PARTY_SIZE][4 * 2] =
+{
+ [PARTY_LAYOUT_SINGLE] =
+ {
+ { 16, 40, 20, 50, 56, 52, 16, 34},
+ {104, 18, 108, 28, 144, 27, 102, 25},
+ {104, 42, 108, 52, 144, 51, 102, 49},
+ {104, 66, 108, 76, 144, 75, 102, 73},
+ {104, 90, 108, 100, 144, 99, 102, 97},
+ {104, 114, 108, 124, 144, 123, 102, 121},
+ },
+ [PARTY_LAYOUT_DOUBLE] =
+ {
+ { 16, 24, 20, 34, 56, 36, 16, 18},
+ { 16, 80, 20, 90, 56, 92, 16, 74},
+ {104, 18, 108, 28, 144, 27, 102, 25},
+ {104, 50, 108, 60, 144, 59, 102, 57},
+ {104, 82, 108, 92, 144, 91, 102, 89},
+ {104, 114, 108, 124, 144, 123, 102, 121},
+ },
+ [PARTY_LAYOUT_MULTI] =
+ {
+ { 16, 24, 20, 34, 56, 36, 16, 18},
+ { 16, 80, 20, 90, 56, 92, 16, 74},
+ {104, 26, 106, 36, 144, 35, 102, 33},
+ {104, 50, 106, 60, 144, 59, 102, 57},
+ {104, 82, 106, 92, 144, 91, 102, 89},
+ {104, 106, 106, 116, 144, 115, 102, 113},
+ },
+ [PARTY_LAYOUT_MULTI_SHOWCASE] =
+ {
+ { 16, 32, 20, 42, 56, 44, 16, 26},
+ {104, 34, 106, 44, 144, 43, 102, 41},
+ {104, 58, 106, 68, 144, 67, 102, 65},
+ { 16, 104, 20, 114, 56, 116, 16, 98},
+ {104, 106, 106, 116, 144, 115, 102, 113},
+ {104, 130, 106, 140, 144, 139, 102, 137},
+ },
+};
+
+const u32 sConfirmButton_Tilemap[] = INCBIN_U32("graphics/interface/party_menu_confirm_button.bin");
+const u32 sCancelButton_Tilemap[] = INCBIN_U32("graphics/interface/party_menu_cancel_button.bin");
+
+// NOTE TO MYSELF: remove these after #159 gets merged
+#define TEXT_COLOR_TRANSPARENT 0x0
+#define TEXT_COLOR_WHITE 0x1
+#define TEXT_COLOR_DARK_GREY 0x2
+#define TEXT_COLOR_LIGHT_GREY 0x3
+#define TEXT_COLOR_RED 0x4
+#define TEXT_COLOR_LIGHT_RED 0x5
+#define TEXT_COLOR_GREEN 0x6
+#define TEXT_COLOR_LIGHT_GREEN 0x7
+#define TEXT_COLOR_BLUE 0x8
+#define TEXT_COLOR_LIGHT_BLUE 0x9
+#define TEXT_DYNAMIC_COLOR_1 0xA // Usually white
+#define TEXT_DYNAMIC_COLOR_2 0xB // Usually white w/ tinge of green
+#define TEXT_DYNAMIC_COLOR_3 0xC // Usually white
+#define TEXT_DYNAMIC_COLOR_4 0xD // Usually aquamarine
+#define TEXT_DYNAMIC_COLOR_5 0xE // Usually blue-green
+#define TEXT_DYNAMIC_COLOR_6 0xF // Usually cerulean
+
+const u8 sFontColorTable[][3] =
+{
+ {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_GREY, TEXT_COLOR_DARK_GREY}, // Default
+ {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_GREEN}, // Unused
+ {TEXT_COLOR_TRANSPARENT, TEXT_DYNAMIC_COLOR_2, TEXT_DYNAMIC_COLOR_3}, // Gender symbol
+ {TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY}, // Selection actions
+ {TEXT_COLOR_WHITE, TEXT_COLOR_BLUE, TEXT_COLOR_LIGHT_BLUE}, // Field moves
+ {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY}, // Unused
+};
+
+const struct WindowTemplate sSinglePartyMenuWindowTemplate[] =
+{
+ {
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 3,
+ .width = 10,
+ .height = 7,
+ .paletteNum = 3,
+ .baseBlock = 0x63,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 12,
+ .tilemapTop = 1,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 4,
+ .baseBlock = 0xA9,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 12,
+ .tilemapTop = 4,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 5,
+ .baseBlock = 0xDF,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 12,
+ .tilemapTop = 7,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 6,
+ .baseBlock = 0x115,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 12,
+ .tilemapTop = 10,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 7,
+ .baseBlock = 0x14B,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 12,
+ .tilemapTop = 13,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 8,
+ .baseBlock = 0x181,
+ },
+ {
+ .bg = 2,
+ .tilemapLeft = 1,
+ .tilemapTop = 15,
+ .width = 28,
+ .height = 4,
+ .paletteNum = 14,
+ .baseBlock = 0x1DF,
+ },
+ DUMMY_WIN_TEMPLATE
+};
+
+const struct WindowTemplate sDoublePartyMenuWindowTemplate[] =
+{
+ {
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 1,
+ .width = 10,
+ .height = 7,
+ .paletteNum = 3,
+ .baseBlock = 0x63,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 8,
+ .width = 10,
+ .height = 7,
+ .paletteNum = 4,
+ .baseBlock = 0xA9,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 12,
+ .tilemapTop = 1,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 5,
+ .baseBlock = 0xEF,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 12,
+ .tilemapTop = 5,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 6,
+ .baseBlock = 0x125,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 12,
+ .tilemapTop = 9,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 7,
+ .baseBlock = 0x15B,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 12,
+ .tilemapTop = 13,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 8,
+ .baseBlock = 0x191,
+ },
+ {
+ .bg = 2,
+ .tilemapLeft = 1,
+ .tilemapTop = 15,
+ .width = 28,
+ .height = 4,
+ .paletteNum = 14,
+ .baseBlock = 0x1DF,
+ },
+ DUMMY_WIN_TEMPLATE
+};
+
+const struct WindowTemplate sMultiPartyMenuWindowTemplate[] =
+{
+ {
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 1,
+ .width = 10,
+ .height = 7,
+ .paletteNum = 3,
+ .baseBlock = 0x63,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 8,
+ .width = 10,
+ .height = 7,
+ .paletteNum = 4,
+ .baseBlock = 0xA9,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 12,
+ .tilemapTop = 2,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 5,
+ .baseBlock = 0xEF,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 12,
+ .tilemapTop = 5,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 6,
+ .baseBlock = 0x125,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 12,
+ .tilemapTop = 9,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 7,
+ .baseBlock = 0x15B,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 12,
+ .tilemapTop = 12,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 8,
+ .baseBlock = 0x191,
+ },
+ {
+ .bg = 2,
+ .tilemapLeft = 1,
+ .tilemapTop = 15,
+ .width = 28,
+ .height = 4,
+ .paletteNum = 14,
+ .baseBlock = 0x1DF,
+ },
+ DUMMY_WIN_TEMPLATE
+};
+
+const struct WindowTemplate sShowcaseMultiPartyMenuWindowTemplate[] =
+{
+ {
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 2,
+ .width = 10,
+ .height = 7,
+ .paletteNum = 3,
+ .baseBlock = 0x63,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 12,
+ .tilemapTop = 3,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 5,
+ .baseBlock = 0xA9,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 12,
+ .tilemapTop = 6,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 6,
+ .baseBlock = 0xDF,
+ },
+ {
+ .bg = 2,
+ .tilemapLeft = 1,
+ .tilemapTop = 11,
+ .width = 10,
+ .height = 7,
+ .paletteNum = 4,
+ .baseBlock = 0x115,
+ },
+ {
+ .bg = 2,
+ .tilemapLeft = 12,
+ .tilemapTop = 12,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 7,
+ .baseBlock = 0x16B,
+ },
+ {
+ .bg = 2,
+ .tilemapLeft = 12,
+ .tilemapTop = 15,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 8,
+ .baseBlock = 0x1A1,
+ },
+ DUMMY_WIN_TEMPLATE
+};
+
+const struct WindowTemplate sCancelButtonWindowTemplate =
+{
+ .bg = 0,
+ .tilemapLeft = 24,
+ .tilemapTop = 17,
+ .width = 6,
+ .height = 2,
+ .paletteNum = 3,
+ .baseBlock = 0x1C7,
+};
+
+const struct WindowTemplate sMultiCancelButtonWindowTemplate =
+{
+ .bg = 0,
+ .tilemapLeft = 24,
+ .tilemapTop = 18,
+ .width = 6,
+ .height = 2,
+ .paletteNum = 3,
+ .baseBlock = 0x1C7,
+};
+
+const struct WindowTemplate sConfirmButtonWindowTemplate =
+{
+ .bg = 0,
+ .tilemapLeft = 24,
+ .tilemapTop = 16,
+ .width = 6,
+ .height = 2,
+ .paletteNum = 3,
+ .baseBlock = 0x1D3,
+};
+
+const struct WindowTemplate sDefaultPartyMsgWindowTemplate =
+{
+ .bg = 2,
+ .tilemapLeft = 1,
+ .tilemapTop = 17,
+ .width = 21,
+ .height = 2,
+ .paletteNum = 15,
+ .baseBlock = 0x24F,
+};
+
+const struct WindowTemplate sDoWhatWithMonMsgWindowTemplate =
+{
+ .bg = 2,
+ .tilemapLeft = 1,
+ .tilemapTop = 17,
+ .width = 16,
+ .height = 2,
+ .paletteNum = 15,
+ .baseBlock = 0x279,
+};
+
+const struct WindowTemplate sDoWhatWithItemMsgWindowTemplate =
+{
+ .bg = 2,
+ .tilemapLeft = 1,
+ .tilemapTop = 17,
+ .width = 19,
+ .height = 2,
+ .paletteNum = 15,
+ .baseBlock = 0x299,
+};
+
+const struct WindowTemplate sDoWhatWithMailMsgWindowTemplate =
+{
+ .bg = 2,
+ .tilemapLeft = 1,
+ .tilemapTop = 17,
+ .width = 16,
+ .height = 2,
+ .paletteNum = 15,
+ .baseBlock = 0x299,
+};
+
+const struct WindowTemplate sWhichMoveMsgWindowTemplate =
+{
+ .bg = 2,
+ .tilemapLeft = 1,
+ .tilemapTop = 17,
+ .width = 15,
+ .height = 2,
+ .paletteNum = 15,
+ .baseBlock = 0x299,
+};
+
+const struct WindowTemplate sItemGiveTakeWindowTemplate =
+{
+ .bg = 2,
+ .tilemapLeft = 22,
+ .tilemapTop = 13,
+ .width = 7,
+ .height = 6,
+ .paletteNum = 14,
+ .baseBlock = 0x373,
+};
+
+const struct WindowTemplate sMailReadTakeWindowTemplate =
+{
+ .bg = 2,
+ .tilemapLeft = 19,
+ .tilemapTop = 13,
+ .width = 10,
+ .height = 6,
+ .paletteNum = 14,
+ .baseBlock = 0x373,
+};
+
+const struct WindowTemplate sMoveSelectWindowTemplate =
+{
+ .bg = 2,
+ .tilemapLeft = 18,
+ .tilemapTop = 11,
+ .width = 11,
+ .height = 8,
+ .paletteNum = 14,
+ .baseBlock = 0x2BF,
+};
+
+const struct WindowTemplate sPartyMenuYesNoWindowTemplate =
+{
+ .bg = 2,
+ .tilemapLeft = 21,
+ .tilemapTop = 9,
+ .width = 6,
+ .height = 4,
+ .paletteNum = 14,
+ .baseBlock = 0x2BF,
+};
+
+const struct WindowTemplate sLevelUpStatsWindowTemplate =
+{
+ .bg = 2,
+ .tilemapLeft = 19,
+ .tilemapTop = 1,
+ .width = 10,
+ .height = 11,
+ .paletteNum = 14,
+ .baseBlock = 0x2BF,
+};
+
+const struct WindowTemplate gUnknown_845A170 =
+{
+ .bg = 2,
+ .tilemapLeft = 2,
+ .tilemapTop = 15,
+ .width = 26,
+ .height = 4,
+ .paletteNum = 14,
+ .baseBlock = 0x1DF,
+};
+
+const struct WindowTemplate gUnknown_845A178 =
+{
+ .bg = 2,
+ .tilemapLeft = 0,
+ .tilemapTop = 13,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 12,
+ .baseBlock = 0x373,
+};
+
+const u8 sMainSlotTileNums[] =
+{
+ 24, 25, 25, 25, 25, 25, 25, 25, 25, 26,
+ 32, 33, 33, 33, 33, 33, 33, 33, 33, 34,
+ 32, 33, 33, 33, 33, 33, 33, 33, 33, 34,
+ 32, 33, 33, 33, 33, 33, 33, 33, 33, 34,
+ 40, 59, 60, 58, 58, 58, 58, 58, 58, 61,
+ 15, 16, 16, 16, 16, 16, 16, 16, 16, 17,
+ 46, 47, 47, 47, 47, 47, 47, 47, 47, 48,
+};
+
+const u8 sMainSlotTileNums_Egg[] =
+{
+ 24, 25, 25, 25, 25, 25, 25, 25, 25, 26,
+ 32, 33, 33, 33, 33, 33, 33, 33, 33, 34,
+ 32, 33, 33, 33, 33, 33, 33, 33, 33, 34,
+ 32, 33, 33, 33, 33, 33, 33, 33, 33, 34,
+ 40, 41, 41, 41, 41, 41, 41, 41, 41, 42,
+ 15, 16, 16, 16, 16, 16, 16, 16, 16, 17,
+ 46, 47, 47, 47, 47, 47, 47, 47, 47, 48,
+};
+
+const u8 sOtherSlotsTileNums[] =
+{
+ 43, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 45, 49, 33,
+ 33, 33, 33, 33, 33, 33, 33, 52, 53, 51,
+ 51, 51, 51, 51, 51, 54, 55, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 57,
+};
+
+const u8 sOtherSlotsTileNums_Egg[] =
+{
+ 43, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 45, 49, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 50, 55, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 57,
+};
+
+const u8 sEmptySlotTileNums[] =
+{
+ 21, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 23, 30, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 31, 37, 38, 38, 38,
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+ 38, 38, 38, 39,
+};
+
+const u8 sGenderPalOffsets[] = {11, 12};
+
+const u8 sHPBarPalOffsets[] = {9, 10};
+
+const u8 sPartyBoxPalOffsets1[] = {4, 5, 6};
+
+const u8 sPartyBoxPalOffsets2[] = {1, 7, 8};
+
+const u8 sGenderMalePalIds[] = {59, 60};
+
+const u8 sGenderFemalePalIds[] = {75, 76};
+
+const u8 sHPBarGreenPalIds[] = {57, 58};
+
+const u8 sHPBarYellowPalIds[] = {73, 74};
+
+const u8 sHPBarRedPalIds[] = {89, 90};
+
+const u8 sPartyBoxEmptySlotPalIds1[] = {52, 53, 54};
+
+const u8 sPartyBoxMultiPalIds1[] = {68, 69, 70};
+
+const u8 sPartyBoxFaintedPalIds1[] = {84, 85, 86};
+
+const u8 sPartyBoxCurrSelectionPalIds1[] = {116, 117, 118};
+
+const u8 sPartyBoxCurrSelectionMultiPalIds[] = {132, 133, 134};
+
+const u8 sPartyBoxCurrSelectionFaintedPalIds[] = {148, 149, 150};
+
+const u8 sPartyBoxSelectedForActionPalIds1[] = {100, 101, 102};
+
+const u8 sPartyBoxEmptySlotPalIds2[] = {49, 55, 56};
+
+const u8 sPartyBoxMultiPalIds2[] = {65, 71, 72};
+
+const u8 sPartyBoxFaintedPalIds2[] = {81, 87, 88};
+
+const u8 sPartyBoxCurrSelectionPalIds2[] = {97, 103, 104};
+
+const u8 sPartyBoxSelectedForActionPalIds2[] = {161, 167, 168};
+
+const u8 *const sActionStringTable[] =
+{
+ [PARTY_MSG_CHOOSE_MON] = gText_ChoosePokemon,
+ [PARTY_MSG_CHOOSE_MON_OR_CANCEL] = gText_ChoosePokemonCancel,
+ [PARTY_MSG_CHOOSE_MON_AND_CONFIRM] = gText_ChoosePokemonConfirm,
+ [PARTY_MSG_MOVE_TO_WHERE] = gText_MoveToWhere,
+ [PARTY_MSG_TEACH_WHICH_MON] = gText_TeachWhichPokemon,
+ [PARTY_MSG_USE_ON_WHICH_MON] = gText_UseOnWhichPokemon,
+ [PARTY_MSG_GIVE_TO_WHICH_MON] = gText_GiveToWhichPokemon,
+ [PARTY_MSG_NOTHING_TO_CUT] = gText_NothingToCut,
+ [PARTY_MSG_CANT_SURF_HERE] = gText_CantSurfHere,
+ [PARTY_MSG_ALREADY_SURFING] = gText_AlreadySurfing,
+ [PARTY_MSG_CURRENT_TOO_FAST] = gText_CurrentIsTooFast,
+ [PARTY_MSG_ENJOY_CYCLING] = gText_EnjoyCycling,
+ [PARTY_MSG_ALREADY_IN_USE] = gText_InUseAlready_PM,
+ [PARTY_MSG_CANT_USE_HERE] = gText_CantUseHere,
+ [PARTY_MSG_NO_MON_FOR_BATTLE] = gText_NoPokemonForBattle,
+ [PARTY_MSG_CHOOSE_MON_2] = gText_ChoosePokemon2,
+ [PARTY_MSG_NOT_ENOUGH_HP] = gText_NotEnoughHp,
+ [PARTY_MSG_THREE_MONS_ARE_NEEDED] = gText_ThreePkmnAreNeeded,
+ [PARTY_MSG_TWO_MONS_ARE_NEEDED] = gText_TwoPokemonAreNeeded,
+ [PARTY_MSG_MONS_CANT_BE_SAME] = gText_PokemonCantBeSame,
+ [PARTY_MSG_NO_SAME_HOLD_ITEMS] = gText_NoIdenticalHoldItems,
+ [PARTY_MSG_UNUSED] = gString_Dummy,
+ [PARTY_MSG_DO_WHAT_WITH_MON] = gText_DoWhatWithPokemon,
+ [PARTY_MSG_RESTORE_WHICH_MOVE] = gText_RestoreWhichMove,
+ [PARTY_MSG_BOOST_PP_WHICH_MOVE] = gText_BoostPp,
+ [PARTY_MSG_DO_WHAT_WITH_ITEM] = gText_DoWhatWithItem,
+ [PARTY_MSG_DO_WHAT_WITH_MAIL] = gText_DoWhatWithMail,
+};
+
+const u8 *const sDescriptionStringTable[] =
+{
+ [PARTYBOX_DESC_NO_USE] = gText_NoUse,
+ [PARTYBOX_DESC_ABLE_3] = gText_Able,
+ [PARTYBOX_DESC_FIRST] = gText_First_PM,
+ [PARTYBOX_DESC_SECOND] = gText_Second_PM,
+ [PARTYBOX_DESC_THIRD] = gText_Third_PM,
+ [PARTYBOX_DESC_ABLE] = gText_Able2,
+ [PARTYBOX_DESC_NOT_ABLE] = gText_NotAble,
+ [PARTYBOX_DESC_ABLE_2] = gText_Able3,
+ [PARTYBOX_DESC_NOT_ABLE_2] = gText_NotAble2,
+ [PARTYBOX_DESC_LEARNED] = gText_Learned,
+};
+
+const u8 *const sHMDescriptionTable[] =
+{
+ gText_LightUpDarkness,
+ gText_CutATreeOrGrass,
+ gText_FlyToAKnownTown,
+ gText_MoveHeavyBoulders,
+ gText_TravelOnWater,
+ gText_ShatterACrackedRock,
+ gText_ClimbAWaterfall,
+ gText_ReturnToAHealingSpot,
+ gText_EscapeFromHere,
+ gText_ShareHp,
+ gText_ShareHp,
+ gText_LureWildPokemon,
+};
+
+const u32 sHeldItemGfx[] = INCBIN_U32("graphics/interface/hold_icons.4bpp");
+const u16 sHeldItemPalette[] = INCBIN_U16("graphics/interface/hold_icons.gbapal");
+
+const struct OamData sOamData_HeldItem =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = SPRITE_SHAPE(8x8),
+ .x = 0,
+ .matrixNum = 0,
+ .size = SPRITE_SIZE(8x8),
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const union AnimCmd sSpriteAnim_HeldItem[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END
+};
+
+const union AnimCmd sSpriteAnim_HeldMail[] =
+{
+ ANIMCMD_FRAME(1, 1),
+ ANIMCMD_END
+};
+
+const union AnimCmd *const sSpriteAnimTable_HeldItem[] =
+{
+ sSpriteAnim_HeldItem,
+ sSpriteAnim_HeldMail,
+};
+
+const struct SpriteSheet sSpriteSheet_HeldItem =
+{
+ sHeldItemGfx, sizeof(sHeldItemGfx), 0xd750
+};
+
+const struct SpritePalette sSpritePalette_HeldItem =
+{
+ sHeldItemPalette, 0xd750
+};
+
+const struct SpriteTemplate sSpriteTemplate_HeldItem =
+{
+ 0xd750,
+ 0xd750,
+ &sOamData_HeldItem,
+ sSpriteAnimTable_HeldItem,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ SpriteCallbackDummy,
+};
+
+const struct OamData sOamData_MenuPokeball =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = SPRITE_SHAPE(32x32),
+ .x = 0,
+ .matrixNum = 0,
+ .size = SPRITE_SIZE(32x32),
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const union AnimCmd sPokeballAnim_Closed[] =
+{
+ ANIMCMD_FRAME(0, 0),
+ ANIMCMD_END
+};
+
+const union AnimCmd sPokeballAnim_Open[] =
+{
+ ANIMCMD_FRAME(16, 0),
+ ANIMCMD_END
+};
+
+const union AnimCmd *const sSpriteAnimTable_MenuPokeball[] =
+{
+ sPokeballAnim_Closed,
+ sPokeballAnim_Open,
+};
+
+const struct CompressedSpriteSheet sSpriteSheet_MenuPokeball =
+{
+ gPartyMenuPokeball_Gfx, 0x400, 0x04b0
+};
+
+const struct CompressedSpritePalette sSpritePalette_MenuPokeball =
+{
+ gPartyMenuPokeball_Pal, 0x04b0
+};
+
+// Used for the pokeball sprite on each party slot / Cancel button
+const struct SpriteTemplate sSpriteTemplate_MenuPokeball =
+{
+ .tileTag = 0x04b0,
+ .paletteTag = 0x04b0,
+ .oam = &sOamData_MenuPokeball,
+ .anims = sSpriteAnimTable_MenuPokeball,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+const struct OamData sOamData_MenuPokeballSmall =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = SPRITE_SHAPE(16x16),
+ .x = 0,
+ .matrixNum = 0,
+ .size = SPRITE_SIZE(16x16),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const union AnimCmd sSmallPokeballAnim_Closed[] =
+{
+ ANIMCMD_FRAME(0, 0),
+ ANIMCMD_END
+};
+
+const union AnimCmd sSmallPokeballAnim_Open[] =
+{
+ ANIMCMD_FRAME(4, 0),
+ ANIMCMD_END
+};
+
+const union AnimCmd sSmallPokeballAnim_Blank1[] =
+{
+ ANIMCMD_FRAME(8, 0),
+ ANIMCMD_END
+};
+
+const union AnimCmd sSmallPokeballAnim_Blank2[] =
+{
+ ANIMCMD_FRAME(12, 0),
+ ANIMCMD_END
+};
+
+const union AnimCmd sSmallPokeballAnim_Blank3[] =
+{
+ ANIMCMD_FRAME(16, 0),
+ ANIMCMD_END
+};
+
+const union AnimCmd sSmallPokeballAnim_Blank4[] =
+{
+ ANIMCMD_FRAME(20, 0),
+ ANIMCMD_END
+};
+
+// The blanks below are never used. See SpriteCB_BounceConfirmCancelButton, where they were intended to be used
+const union AnimCmd *const sSpriteAnimTable_MenuPokeballSmall[] =
+{
+ sSmallPokeballAnim_Closed,
+ sSmallPokeballAnim_Open,
+ sSmallPokeballAnim_Blank1,
+ sSmallPokeballAnim_Blank2,
+ sSmallPokeballAnim_Blank3,
+ sSmallPokeballAnim_Blank4,
+};
+
+const struct CompressedSpriteSheet sSpriteSheet_MenuPokeballSmall =
+{
+ gPartyMenuPokeballSmall_Gfx, 0x0300, 0x04b1
+};
+
+// Used for the pokeball sprite next to Cancel and Confirm when both are present, otherwise sSpriteTemplate_MenuPokeball is used
+const struct SpriteTemplate sSpriteTemplate_MenuPokeballSmall =
+{
+ .tileTag = 1201,
+ .paletteTag = 1200,
+ .oam = &sOamData_MenuPokeballSmall,
+ .anims = sSpriteAnimTable_MenuPokeballSmall,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+const struct OamData sOamData_StatusCondition =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = SPRITE_SHAPE(32x8),
+ .x = 0,
+ .matrixNum = 0,
+ .size = SPRITE_SIZE(32x8),
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const union AnimCmd sSpriteAnim_StatusPoison[] =
+{
+ ANIMCMD_FRAME(0, 0),
+ ANIMCMD_END
+};
+
+const union AnimCmd sSpriteAnim_StatusParalyzed[] =
+{
+ ANIMCMD_FRAME(4, 0),
+ ANIMCMD_END
+};
+
+const union AnimCmd sSpriteAnim_StatusSleep[] =
+{
+ ANIMCMD_FRAME(8, 0),
+ ANIMCMD_END
+};
+
+const union AnimCmd sSpriteAnim_StatusFrozen[] =
+{
+ ANIMCMD_FRAME(12, 0),
+ ANIMCMD_END
+};
+
+const union AnimCmd sSpriteAnim_StatusBurn[] =
+{
+ ANIMCMD_FRAME(16, 0),
+ ANIMCMD_END
+};
+
+const union AnimCmd sSpriteAnim_StatusPokerus[] =
+{
+ ANIMCMD_FRAME(20, 0),
+ ANIMCMD_END
+};
+
+const union AnimCmd sSpriteAnim_StatusFaint[] =
+{
+ ANIMCMD_FRAME(24, 0),
+ ANIMCMD_END
+};
+
+const union AnimCmd sSpriteAnim_Blank[] =
+{
+ ANIMCMD_FRAME(28, 0),
+ ANIMCMD_END
+};
+
+const union AnimCmd *const sSpriteTemplate_StatusCondition[] =
+{
+ sSpriteAnim_StatusPoison,
+ sSpriteAnim_StatusParalyzed,
+ sSpriteAnim_StatusSleep,
+ sSpriteAnim_StatusFrozen,
+ sSpriteAnim_StatusBurn,
+ sSpriteAnim_StatusPokerus,
+ sSpriteAnim_StatusFaint,
+ sSpriteAnim_Blank,
+};
+
+const struct CompressedSpriteSheet sSpriteSheet_StatusIcons =
+{
+ gStatusGfx_Icons, 0x400, 1202
+};
+
+const struct CompressedSpritePalette sSpritePalette_StatusIcons =
+{
+ gStatusPal_Icons, 1202
+};
+
+const struct SpriteTemplate sSpriteTemplate_StatusIcons =
+{
+ .tileTag = 1202,
+ .paletteTag = 1202,
+ .oam = &sOamData_StatusCondition,
+ .anims = sSpriteTemplate_StatusCondition,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+const bool8 sMultiBattlePartnersPartyMask[PARTY_SIZE + 2] =
+{
+ FALSE,
+ TRUE,
+ FALSE,
+ FALSE,
+ TRUE,
+ TRUE,
+ FALSE,
+};
+
+const u16 sTMHMMoves_Duplicate[] =
+{
+ MOVE_FOCUS_PUNCH,
+ MOVE_DRAGON_CLAW,
+ MOVE_WATER_PULSE,
+ MOVE_CALM_MIND,
+ MOVE_ROAR,
+ MOVE_TOXIC,
+ MOVE_HAIL,
+ MOVE_BULK_UP,
+ MOVE_BULLET_SEED,
+ MOVE_HIDDEN_POWER,
+ MOVE_SUNNY_DAY,
+ MOVE_TAUNT,
+ MOVE_ICE_BEAM,
+ MOVE_BLIZZARD,
+ MOVE_HYPER_BEAM,
+ MOVE_LIGHT_SCREEN,
+ MOVE_PROTECT,
+ MOVE_RAIN_DANCE,
+ MOVE_GIGA_DRAIN,
+ MOVE_SAFEGUARD,
+ MOVE_FRUSTRATION,
+ MOVE_SOLAR_BEAM,
+ MOVE_IRON_TAIL,
+ MOVE_THUNDERBOLT,
+ MOVE_THUNDER,
+ MOVE_EARTHQUAKE,
+ MOVE_RETURN,
+ MOVE_DIG,
+ MOVE_PSYCHIC,
+ MOVE_SHADOW_BALL,
+ MOVE_BRICK_BREAK,
+ MOVE_DOUBLE_TEAM,
+ MOVE_REFLECT,
+ MOVE_SHOCK_WAVE,
+ MOVE_FLAMETHROWER,
+ MOVE_SLUDGE_BOMB,
+ MOVE_SANDSTORM,
+ MOVE_FIRE_BLAST,
+ MOVE_ROCK_TOMB,
+ MOVE_AERIAL_ACE,
+ MOVE_TORMENT,
+ MOVE_FACADE,
+ MOVE_SECRET_POWER,
+ MOVE_REST,
+ MOVE_ATTRACT,
+ MOVE_THIEF,
+ MOVE_STEEL_WING,
+ MOVE_SKILL_SWAP,
+ MOVE_SNATCH,
+ MOVE_OVERHEAT,
+ MOVE_CUT,
+ MOVE_FLY,
+ MOVE_SURF,
+ MOVE_STRENGTH,
+ MOVE_FLASH,
+ MOVE_ROCK_SMASH,
+ MOVE_WATERFALL,
+ MOVE_DIVE,
+};
+
+enum
+{
+ MENU_SUMMARY,
+ MENU_SWITCH,
+ MENU_CANCEL1,
+ MENU_ITEM,
+ MENU_GIVE,
+ MENU_TAKE_ITEM,
+ MENU_MAIL,
+ MENU_TAKE_MAIL,
+ MENU_READ,
+ MENU_CANCEL2,
+ MENU_SHIFT,
+ MENU_SEND_OUT,
+ MENU_ENTER,
+ MENU_NO_ENTRY,
+ MENU_STORE,
+ MENU_REGISTER,
+ MENU_TRADE1,
+ MENU_TRADE2,
+ MENU_FIELD_MOVES,
+};
+
+enum
+{
+ FIELD_MOVE_FLASH,
+ FIELD_MOVE_CUT,
+ FIELD_MOVE_FLY,
+ FIELD_MOVE_STRENGTH,
+ FIELD_MOVE_SURF,
+ FIELD_MOVE_ROCK_SMASH,
+ FIELD_MOVE_WATERFALL,
+ FIELD_MOVE_TELEPORT,
+ FIELD_MOVE_DIG,
+ FIELD_MOVE_MILK_DRINK,
+ FIELD_MOVE_SOFT_BOILED,
+ FIELD_MOVE_SWEET_SCENT,
+ FIELD_MOVE_END,
+};
+
+struct
+{
+ const u8 *text;
+ TaskFunc func;
+} const sCursorOptions[] =
+{
+ [MENU_SUMMARY] = {gText_Summary5, CursorCB_Summary},
+ [MENU_SWITCH] = {gText_Switch2, CursorCB_Switch},
+ [MENU_CANCEL1] = {gFameCheckerText_Cancel, CursorCB_Cancel1},
+ [MENU_ITEM] = {gText_Item, CursorCB_Item},
+ [MENU_GIVE] = {gOtherText_Give, CursorCB_Give},
+ [MENU_TAKE_ITEM] = {gText_Take, CursorCB_TakeItem},
+ [MENU_MAIL] = {gText_Mail, CursorCB_Mail},
+ [MENU_TAKE_MAIL] = {gText_Take2, CursorCB_TakeMail},
+ [MENU_READ] = {gText_Read2, CursorCB_Read},
+ [MENU_CANCEL2] = {gFameCheckerText_Cancel, CursorCB_Cancel2},
+ [MENU_SHIFT] = {gText_Shift, CursorCB_SendMon},
+ [MENU_SEND_OUT] = {gText_SendOut, CursorCB_SendMon},
+ [MENU_ENTER] = {gText_Enter, CursorCB_Enter},
+ [MENU_NO_ENTRY] = {gText_NoEntry, CursorCB_NoEntry},
+ [MENU_STORE] = {gText_Store, CursorCB_Store},
+ [MENU_REGISTER] = {gText_Register, CursorCB_Register},
+ [MENU_TRADE1] = {gText_Trade4, CursorCB_Trade1},
+ [MENU_TRADE2] = {gText_Trade4, CursorCB_Trade2},
+ [MENU_FIELD_MOVES + FIELD_MOVE_FLASH] = {gMoveNames[MOVE_FLASH], CursorCB_FieldMove},
+ [MENU_FIELD_MOVES + FIELD_MOVE_CUT] = {gMoveNames[MOVE_CUT], CursorCB_FieldMove},
+ [MENU_FIELD_MOVES + FIELD_MOVE_FLY] = {gMoveNames[MOVE_FLY], CursorCB_FieldMove},
+ [MENU_FIELD_MOVES + FIELD_MOVE_STRENGTH] = {gMoveNames[MOVE_STRENGTH], CursorCB_FieldMove},
+ [MENU_FIELD_MOVES + FIELD_MOVE_SURF] = {gMoveNames[MOVE_SURF], CursorCB_FieldMove},
+ [MENU_FIELD_MOVES + FIELD_MOVE_ROCK_SMASH] = {gMoveNames[MOVE_ROCK_SMASH], CursorCB_FieldMove},
+ [MENU_FIELD_MOVES + FIELD_MOVE_WATERFALL] = {gMoveNames[MOVE_WATERFALL], CursorCB_FieldMove},
+ [MENU_FIELD_MOVES + FIELD_MOVE_TELEPORT] = {gMoveNames[MOVE_TELEPORT], CursorCB_FieldMove},
+ [MENU_FIELD_MOVES + FIELD_MOVE_DIG] = {gMoveNames[MOVE_DIG], CursorCB_FieldMove},
+ [MENU_FIELD_MOVES + FIELD_MOVE_MILK_DRINK] = {gMoveNames[MOVE_MILK_DRINK], CursorCB_FieldMove},
+ [MENU_FIELD_MOVES + FIELD_MOVE_SOFT_BOILED] = {gMoveNames[MOVE_SOFT_BOILED], CursorCB_FieldMove},
+ [MENU_FIELD_MOVES + FIELD_MOVE_SWEET_SCENT] = {gMoveNames[MOVE_SWEET_SCENT], CursorCB_FieldMove},
+};
+
+const u8 sPartyMenuAction_SummarySwitchCancel[] = {MENU_SUMMARY, MENU_SWITCH, MENU_CANCEL1};
+const u8 sPartyMenuAction_ShiftSummaryCancel[] = {MENU_SHIFT, MENU_SUMMARY, MENU_CANCEL1};
+const u8 sPartyMenuAction_SendOutSummaryCancel[] = {MENU_SEND_OUT, MENU_SUMMARY, MENU_CANCEL1};
+const u8 sPartyMenuAction_SummaryCancel[] = {MENU_SUMMARY, MENU_CANCEL1};
+const u8 sPartyMenuAction_EnterSummaryCancel[] = {MENU_ENTER, MENU_SUMMARY, MENU_CANCEL1};
+const u8 sPartyMenuAction_NoEntrySummaryCancel[] = {MENU_NO_ENTRY, MENU_SUMMARY, MENU_CANCEL1};
+const u8 sPartyMenuAction_StoreSummaryCancel[] = {MENU_STORE, MENU_SUMMARY, MENU_CANCEL1};
+const u8 sPartyMenuAction_GiveTakeItemCancel[] = {MENU_GIVE, MENU_TAKE_ITEM, MENU_CANCEL2};
+const u8 sPartyMenuAction_ReadTakeMailCancel[] = {MENU_READ, MENU_TAKE_MAIL, MENU_CANCEL2};
+const u8 sPartyMenuAction_RegisterSummaryCancel[] = {MENU_REGISTER, MENU_SUMMARY, MENU_CANCEL1};
+const u8 sPartyMenuAction_TradeSummaryCancel1[] = {MENU_TRADE1, MENU_SUMMARY, MENU_CANCEL1};
+const u8 sPartyMenuAction_TradeSummaryCancel2[] = {MENU_TRADE2, MENU_SUMMARY, MENU_CANCEL1};
+
+// IDs for the action lists that appear when a party mon is selected
+enum
+{
+ ACTIONS_NONE,
+ ACTIONS_SWITCH,
+ ACTIONS_SHIFT,
+ ACTIONS_SEND_OUT,
+ ACTIONS_ENTER,
+ ACTIONS_NO_ENTRY,
+ ACTIONS_STORE,
+ ACTIONS_SUMMARY_ONLY,
+ ACTIONS_ITEM,
+ ACTIONS_MAIL,
+ ACTIONS_REGISTER,
+ ACTIONS_TRADE,
+ ACTIONS_SPIN_TRADE,
+};
+
+const u8 *const sPartyMenuActions[] =
+{
+ [ACTIONS_NONE] = NULL,
+ [ACTIONS_SWITCH] = sPartyMenuAction_SummarySwitchCancel,
+ [ACTIONS_SHIFT] = sPartyMenuAction_ShiftSummaryCancel,
+ [ACTIONS_SEND_OUT] = sPartyMenuAction_SendOutSummaryCancel,
+ [ACTIONS_ENTER] = sPartyMenuAction_EnterSummaryCancel,
+ [ACTIONS_NO_ENTRY] = sPartyMenuAction_NoEntrySummaryCancel,
+ [ACTIONS_STORE] = sPartyMenuAction_StoreSummaryCancel,
+ [ACTIONS_SUMMARY_ONLY] = sPartyMenuAction_SummaryCancel,
+ [ACTIONS_ITEM] = sPartyMenuAction_GiveTakeItemCancel,
+ [ACTIONS_MAIL] = sPartyMenuAction_ReadTakeMailCancel,
+ [ACTIONS_REGISTER] = sPartyMenuAction_RegisterSummaryCancel,
+ [ACTIONS_TRADE] = sPartyMenuAction_TradeSummaryCancel1,
+ [ACTIONS_SPIN_TRADE] = sPartyMenuAction_TradeSummaryCancel2,
+};
+
+const u8 sPartyMenuActionCounts[] =
+{
+ [ACTIONS_NONE] = 0,
+ [ACTIONS_SWITCH] = NELEMS(sPartyMenuAction_SummarySwitchCancel),
+ [ACTIONS_SHIFT] = NELEMS(sPartyMenuAction_ShiftSummaryCancel),
+ [ACTIONS_SEND_OUT] = NELEMS(sPartyMenuAction_SendOutSummaryCancel),
+ [ACTIONS_ENTER] = NELEMS(sPartyMenuAction_EnterSummaryCancel),
+ [ACTIONS_NO_ENTRY] = NELEMS(sPartyMenuAction_NoEntrySummaryCancel),
+ [ACTIONS_STORE] = NELEMS(sPartyMenuAction_StoreSummaryCancel),
+ [ACTIONS_SUMMARY_ONLY] = NELEMS(sPartyMenuAction_SummaryCancel),
+ [ACTIONS_ITEM] = NELEMS(sPartyMenuAction_GiveTakeItemCancel),
+ [ACTIONS_MAIL] = NELEMS(sPartyMenuAction_ReadTakeMailCancel),
+ [ACTIONS_REGISTER] = NELEMS(sPartyMenuAction_RegisterSummaryCancel),
+ [ACTIONS_TRADE] = NELEMS(sPartyMenuAction_TradeSummaryCancel1),
+ [ACTIONS_SPIN_TRADE] = NELEMS(sPartyMenuAction_TradeSummaryCancel2),
+};
+
+const u16 sFieldMoves[] =
+{
+ MOVE_FLASH, MOVE_CUT, MOVE_FLY, MOVE_STRENGTH, MOVE_SURF, MOVE_ROCK_SMASH, MOVE_WATERFALL, MOVE_TELEPORT,
+ MOVE_DIG, MOVE_MILK_DRINK, MOVE_SOFT_BOILED, MOVE_SWEET_SCENT, FIELD_MOVE_END // this may be misuse of enum. same in emerald
+};
+
+struct
+{
+ bool8 (*fieldMoveFunc)(void);
+ u8 msgId;
+} const sFieldMoveCursorCallbacks[] =
+{
+ [FIELD_MOVE_FLASH] = {SetUpFieldMove_Flash, PARTY_MSG_CANT_USE_HERE},
+ [FIELD_MOVE_CUT] = {SetUpFieldMove_Cut, PARTY_MSG_NOTHING_TO_CUT},
+ [FIELD_MOVE_FLY] = {SetUpFieldMove_Fly, PARTY_MSG_CANT_USE_HERE},
+ [FIELD_MOVE_STRENGTH] = {SetUpFieldMove_Strength, PARTY_MSG_CANT_USE_HERE},
+ [FIELD_MOVE_SURF] = {SetUpFieldMove_Surf, PARTY_MSG_CANT_SURF_HERE},
+ [FIELD_MOVE_ROCK_SMASH] = {SetUpFieldMove_RockSmash, PARTY_MSG_CANT_USE_HERE},
+ [FIELD_MOVE_WATERFALL] = {SetUpFieldMove_Waterfall, PARTY_MSG_CANT_USE_HERE},
+ [FIELD_MOVE_TELEPORT] = {SetUpFieldMove_Teleport, PARTY_MSG_CANT_USE_HERE},
+ [FIELD_MOVE_DIG] = {SetUpFieldMove_Dig, PARTY_MSG_CANT_USE_HERE},
+ [FIELD_MOVE_MILK_DRINK] = {SetUpFieldMove_SoftBoiled, PARTY_MSG_NOT_ENOUGH_HP},
+ [FIELD_MOVE_SOFT_BOILED] = {SetUpFieldMove_SoftBoiled, PARTY_MSG_NOT_ENOUGH_HP},
+ [FIELD_MOVE_SWEET_SCENT] = {SetUpFieldMove_SweetScent, PARTY_MSG_CANT_USE_HERE},
+};
+
+const u8 *const sUnionRoomTradeMessages[] =
+{
+ [UR_TRADE_MSG_NOT_MON_PARTNER_WANTS - 1] = gText_NotPkmnOtherTrainerWants,
+ [UR_TRADE_MSG_NOT_EGG - 1] = gText_ThatIsntAnEgg,
+ [UR_TRADE_MSG_MON_CANT_BE_TRADED_1 - 1] = gText_PkmnCantBeTradedNow,
+ [UR_TRADE_MSG_MON_CANT_BE_TRADED_2 - 1] = gText_PkmnCantBeTradedNow,
+ [UR_TRADE_MSG_PARTNERS_MON_CANT_BE_TRADED - 1] = gText_OtherTrainersPkmnCantBeTraded,
+ [UR_TRADE_MSG_EGG_CANT_BE_TRADED -1] = gText_EggCantBeTradedNow,
+ [UR_TRADE_MSG_PARTNER_CANT_ACCEPT_MON - 1] = gText_OtherTrainerCantAcceptPkmn,
+ [UR_TRADE_MSG_CANT_TRADE_WITH_PARTNER_1 - 1] = gText_CantTradeWithTrainer,
+ [UR_TRADE_MSG_CANT_TRADE_WITH_PARTNER_2 - 1] = gText_CantTradeWithTrainer,
+};
+
+const u16 sTMHMMoves[] =
+{
+ MOVE_FOCUS_PUNCH,
+ MOVE_DRAGON_CLAW,
+ MOVE_WATER_PULSE,
+ MOVE_CALM_MIND,
+ MOVE_ROAR,
+ MOVE_TOXIC,
+ MOVE_HAIL,
+ MOVE_BULK_UP,
+ MOVE_BULLET_SEED,
+ MOVE_HIDDEN_POWER,
+ MOVE_SUNNY_DAY,
+ MOVE_TAUNT,
+ MOVE_ICE_BEAM,
+ MOVE_BLIZZARD,
+ MOVE_HYPER_BEAM,
+ MOVE_LIGHT_SCREEN,
+ MOVE_PROTECT,
+ MOVE_RAIN_DANCE,
+ MOVE_GIGA_DRAIN,
+ MOVE_SAFEGUARD,
+ MOVE_FRUSTRATION,
+ MOVE_SOLAR_BEAM,
+ MOVE_IRON_TAIL,
+ MOVE_THUNDERBOLT,
+ MOVE_THUNDER,
+ MOVE_EARTHQUAKE,
+ MOVE_RETURN,
+ MOVE_DIG,
+ MOVE_PSYCHIC,
+ MOVE_SHADOW_BALL,
+ MOVE_BRICK_BREAK,
+ MOVE_DOUBLE_TEAM,
+ MOVE_REFLECT,
+ MOVE_SHOCK_WAVE,
+ MOVE_FLAMETHROWER,
+ MOVE_SLUDGE_BOMB,
+ MOVE_SANDSTORM,
+ MOVE_FIRE_BLAST,
+ MOVE_ROCK_TOMB,
+ MOVE_AERIAL_ACE,
+ MOVE_TORMENT,
+ MOVE_FACADE,
+ MOVE_SECRET_POWER,
+ MOVE_REST,
+ MOVE_ATTRACT,
+ MOVE_THIEF,
+ MOVE_STEEL_WING,
+ MOVE_SKILL_SWAP,
+ MOVE_SNATCH,
+ MOVE_OVERHEAT,
+ MOVE_CUT,
+ MOVE_FLY,
+ MOVE_SURF,
+ MOVE_STRENGTH,
+ MOVE_FLASH,
+ MOVE_ROCK_SMASH,
+ MOVE_WATERFALL,
+ MOVE_DIVE,
+};
diff --git a/src/data/pokemon/tutor_learnsets.h b/src/data/pokemon/tutor_learnsets.h
new file mode 100644
index 000000000..3f2fbf6a0
--- /dev/null
+++ b/src/data/pokemon/tutor_learnsets.h
@@ -0,0 +1,2813 @@
+const u16 sTutorMoves[TUTOR_MOVE_COUNT] =
+{
+ [TUTOR_MOVE_MEGA_PUNCH] = MOVE_MEGA_PUNCH,
+ [TUTOR_MOVE_SWORDS_DANCE] = MOVE_SWORDS_DANCE,
+ [TUTOR_MOVE_MEGA_KICK] = MOVE_MEGA_KICK,
+ [TUTOR_MOVE_BODY_SLAM] = MOVE_BODY_SLAM,
+ [TUTOR_MOVE_DOUBLE_EDGE] = MOVE_DOUBLE_EDGE,
+ [TUTOR_MOVE_COUNTER] = MOVE_COUNTER,
+ [TUTOR_MOVE_SEISMIC_TOSS] = MOVE_SEISMIC_TOSS,
+ [TUTOR_MOVE_MIMIC] = MOVE_MIMIC,
+ [TUTOR_MOVE_METRONOME] = MOVE_METRONOME,
+ [TUTOR_MOVE_SOFT_BOILED] = MOVE_SOFT_BOILED,
+ [TUTOR_MOVE_DREAM_EATER] = MOVE_DREAM_EATER,
+ [TUTOR_MOVE_THUNDER_WAVE] = MOVE_THUNDER_WAVE,
+ [TUTOR_MOVE_EXPLOSION] = MOVE_EXPLOSION,
+ [TUTOR_MOVE_ROCK_SLIDE] = MOVE_ROCK_SLIDE,
+ [TUTOR_MOVE_SUBSTITUTE] = MOVE_SUBSTITUTE,
+};
+
+#define TUTOR(move) (1u << (TUTOR_##move))
+
+const u16 sTutorLearnsets[] =
+{
+ [SPECIES_NONE] = 0,
+
+ [SPECIES_BULBASAUR] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_IVYSAUR] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_VENUSAUR] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_CHARMANDER] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_CHARMELEON] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_CHARIZARD] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SQUIRTLE] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_WARTORTLE] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_BLASTOISE] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_CATERPIE] = 0,
+
+ [SPECIES_METAPOD] = 0,
+
+ [SPECIES_BUTTERFREE] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_WEEDLE] = 0,
+
+ [SPECIES_KAKUNA] = 0,
+
+ [SPECIES_BEEDRILL] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_PIDGEY] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_PIDGEOTTO] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_PIDGEOT] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_RATTATA] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_RATICATE] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SPEAROW] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_FEAROW] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_EKANS] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_ARBOK] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_PIKACHU] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_RAICHU] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SANDSHREW] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SANDSLASH] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_NIDORAN_F] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_NIDORINA] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_NIDOQUEEN] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_NIDORAN_M] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_NIDORINO] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_NIDOKING] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_CLEFAIRY] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_SOFT_BOILED)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_CLEFABLE] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_SOFT_BOILED)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_VULPIX] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_NINETALES] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_JIGGLYPUFF] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_WIGGLYTUFF] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_ZUBAT] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_GOLBAT] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_ODDISH] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_GLOOM] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_VILEPLUME] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_PARAS] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_PARASECT] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_VENONAT] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_VENOMOTH] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_DIGLETT] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_DUGTRIO] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_MEOWTH] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_PERSIAN] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_PSYDUCK] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_GOLDUCK] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_MANKEY] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_PRIMEAPE] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_GROWLITHE] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_ARCANINE] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_POLIWAG] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_POLIWHIRL] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_POLIWRATH] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_ABRA] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_KADABRA] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_ALAKAZAM] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_MACHOP] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_MACHOKE] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_MACHAMP] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_BELLSPROUT] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_WEEPINBELL] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_VICTREEBEL] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_TENTACOOL] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_TENTACRUEL] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_GEODUDE] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_GRAVELER] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_GOLEM] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_PONYTA] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_RAPIDASH] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SLOWPOKE] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SLOWBRO] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_MAGNEMITE] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_MAGNETON] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_FARFETCHD] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_DODUO] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_DODRIO] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SEEL] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_DEWGONG] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_GRIMER] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_MUK] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SHELLDER] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_CLOYSTER] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_GASTLY] = TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_HAUNTER] = TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_GENGAR] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_ONIX] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_DROWZEE] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_HYPNO] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_KRABBY] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_KINGLER] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_VOLTORB] = TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_ELECTRODE] = TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_EXEGGCUTE] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_EXEGGUTOR] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_CUBONE] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_MAROWAK] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_HITMONLEE] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_HITMONCHAN] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_LICKITUNG] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_KOFFING] = TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_WEEZING] = TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_RHYHORN] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_RHYDON] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_CHANSEY] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_SOFT_BOILED)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_TANGELA] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_KANGASKHAN] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_HORSEA] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SEADRA] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_GOLDEEN] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SEAKING] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_STARYU] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_STARMIE] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_MR_MIME] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SCYTHER] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_JYNX] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_ELECTABUZZ] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_MAGMAR] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_PINSIR] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_TAUROS] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_MAGIKARP] = 0,
+
+ [SPECIES_GYARADOS] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_LAPRAS] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_DITTO] = 0,
+
+ [SPECIES_EEVEE] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_VAPOREON] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_JOLTEON] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_FLAREON] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_PORYGON] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_OMANYTE] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_OMASTAR] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_KABUTO] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_KABUTOPS] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_AERODACTYL] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SNORLAX] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_ARTICUNO] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_ZAPDOS] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_MOLTRES] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_DRATINI] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_DRAGONAIR] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_DRAGONITE] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_MEWTWO] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_MEW] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_SOFT_BOILED)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_CHIKORITA] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_BAYLEEF] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_MEGANIUM] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_CYNDAQUIL] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_QUILAVA] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_TYPHLOSION] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_TOTODILE] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_CROCONAW] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_FERALIGATR] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SENTRET] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_FURRET] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_HOOTHOOT] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_NOCTOWL] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_LEDYBA] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_LEDIAN] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SPINARAK] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_ARIADOS] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_CROBAT] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_CHINCHOU] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_LANTURN] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_PICHU] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_CLEFFA] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_SOFT_BOILED)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_IGGLYBUFF] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_TOGEPI] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_SOFT_BOILED)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_TOGETIC] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_SOFT_BOILED)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_NATU] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_XATU] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_MAREEP] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_FLAAFFY] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_AMPHAROS] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_BELLOSSOM] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_MARILL] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_AZUMARILL] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SUDOWOODO] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_POLITOED] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_HOPPIP] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SKIPLOOM] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_JUMPLUFF] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_AIPOM] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SUNKERN] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SUNFLORA] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_YANMA] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_WOOPER] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_QUAGSIRE] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_ESPEON] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_UMBREON] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_MURKROW] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SLOWKING] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_MISDREAVUS] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_UNOWN] = 0,
+
+ [SPECIES_WOBBUFFET] = 0,
+
+ [SPECIES_GIRAFARIG] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_PINECO] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_FORRETRESS] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_DUNSPARCE] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_GLIGAR] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_STEELIX] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SNUBBULL] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_GRANBULL] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_QWILFISH] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SCIZOR] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SHUCKLE] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_HERACROSS] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SNEASEL] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_TEDDIURSA] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_URSARING] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SLUGMA] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_MAGCARGO] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SWINUB] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_PILOSWINE] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_CORSOLA] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_REMORAID] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_OCTILLERY] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_DELIBIRD] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_MANTINE] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SKARMORY] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_HOUNDOUR] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_HOUNDOOM] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_KINGDRA] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_PHANPY] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_DONPHAN] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_PORYGON2] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_STANTLER] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SMEARGLE] = 0,
+
+ [SPECIES_TYROGUE] = TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_HITMONTOP] = TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SMOOCHUM] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_ELEKID] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_MAGBY] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_MILTANK] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_BLISSEY] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_SOFT_BOILED)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_RAIKOU] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_ENTEI] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SUICUNE] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_LARVITAR] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_PUPITAR] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_TYRANITAR] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_LUGIA] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_HO_OH] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_CELEBI] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_TREECKO] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_GROVYLE] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SCEPTILE] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_TORCHIC] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_COMBUSKEN] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_BLAZIKEN] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_MUDKIP] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_MARSHTOMP] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SWAMPERT] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_POOCHYENA] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_MIGHTYENA] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_ZIGZAGOON] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_LINOONE] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_WURMPLE] = 0,
+
+ [SPECIES_SILCOON] = 0,
+
+ [SPECIES_BEAUTIFLY] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_CASCOON] = 0,
+
+ [SPECIES_DUSTOX] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_LOTAD] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_LOMBRE] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_LUDICOLO] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SEEDOT] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_NUZLEAF] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SHIFTRY] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_NINCADA] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_NINJASK] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SHEDINJA] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_TAILLOW] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SWELLOW] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SHROOMISH] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_BRELOOM] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SPINDA] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_WINGULL] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_PELIPPER] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SURSKIT] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_MASQUERAIN] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_WAILMER] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_WAILORD] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SKITTY] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_DELCATTY] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_KECLEON] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_BALTOY] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_CLAYDOL] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_NOSEPASS] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_TORKOAL] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SABLEYE] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_BARBOACH] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_WHISCASH] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_LUVDISC] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_CORPHISH] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_CRAWDAUNT] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_FEEBAS] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_MILOTIC] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_CARVANHA] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SHARPEDO] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_TRAPINCH] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_VIBRAVA] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_FLYGON] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_MAKUHITA] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_HARIYAMA] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_ELECTRIKE] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_MANECTRIC] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_NUMEL] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_CAMERUPT] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SPHEAL] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SEALEO] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_WALREIN] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_CACNEA] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_CACTURNE] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SNORUNT] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_GLALIE] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_LUNATONE] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SOLROCK] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_AZURILL] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SPOINK] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_GRUMPIG] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_PLUSLE] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_MINUN] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_MAWILE] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_MEDITITE] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_MEDICHAM] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SWABLU] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_ALTARIA] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_WYNAUT] = 0,
+
+ [SPECIES_DUSKULL] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_DUSCLOPS] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_ROSELIA] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SLAKOTH] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_VIGOROTH] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SLAKING] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_GULPIN] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SWALOT] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_TROPIUS] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_WHISMUR] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_LOUDRED] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_EXPLOUD] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_CLAMPERL] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_HUNTAIL] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_GOREBYSS] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_ABSOL] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SHUPPET] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_BANETTE] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SEVIPER] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_ZANGOOSE] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_RELICANTH] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_ARON] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_LAIRON] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_AGGRON] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_CASTFORM] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_VOLBEAT] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_ILLUMISE] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_LILEEP] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_CRADILY] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_ANORITH] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_ARMALDO] = TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_RALTS] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_KIRLIA] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_GARDEVOIR] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_BAGON] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SHELGON] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_SALAMENCE] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_BELDUM] = 0,
+
+ [SPECIES_METANG] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_METAGROSS] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_REGIROCK] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_REGICE] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_REGISTEEL] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_KYOGRE] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_GROUDON] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_RAYQUAZA] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_LATIAS] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_LATIOS] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_JIRACHI] = TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_DEOXYS] = TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE),
+
+ [SPECIES_CHIMECHO] = TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE),
+};
diff --git a/src/fldeff_softboiled.c b/src/fldeff_softboiled.c
index 6840df686..d68d66d08 100644
--- a/src/fldeff_softboiled.c
+++ b/src/fldeff_softboiled.c
@@ -15,7 +15,7 @@ static void sub_80E5934(u8 taskId);
extern const u8 gUnknown_84169F8[];
extern const u8 gText_PkmnHPRestoredByVar2[];
-bool8 hm_prepare_dive_probably(void)
+bool8 SetUpFieldMove_SoftBoiled(void)
{
u16 maxHp = GetMonData(&gPlayerParty[GetCursorSelectionMonId()], MON_DATA_MAX_HP);
u16 curHp = GetMonData(&gPlayerParty[GetCursorSelectionMonId()], MON_DATA_HP);
@@ -28,8 +28,8 @@ bool8 hm_prepare_dive_probably(void)
void ChooseMonForSoftboiled(u8 taskId)
{
- gPartyMenu.unkB = 10;
- gPartyMenu.unkA = gPartyMenu.unk9;
+ gPartyMenu.action = 10;
+ gPartyMenu.slotId2 = gPartyMenu.slotId;
AnimatePartySlot(GetCursorSelectionMonId(), 1);
DisplayPartyMenuStdMessage(5);
gTasks[taskId].func = Task_HandleChooseMonInput;
@@ -37,14 +37,14 @@ void ChooseMonForSoftboiled(u8 taskId)
void sub_80E5724(u8 taskId)
{
- u8 r8 = gPartyMenu.unk9;
- u8 r5 = gPartyMenu.unkA;
+ u8 r8 = gPartyMenu.slotId;
+ u8 r5 = gPartyMenu.slotId2;
u16 curHp;
s16 delta;
if (r5 > 6)
{
- gPartyMenu.unkB = 0;
+ gPartyMenu.action = 0;
DisplayPartyMenuStdMessage(0);
gTasks[taskId].func = Task_HandleChooseMonInput;
}
@@ -66,12 +66,12 @@ void sub_80E5724(u8 taskId)
static void sub_80E57E8(u8 taskId)
{
PlaySE(SE_KAIFUKU);
- PartyMenuModifyHP(taskId, gPartyMenu.unkA, 1, GetMonData(&gPlayerParty[gPartyMenu.unk9], MON_DATA_MAX_HP) / 5, sub_80E583C);
+ PartyMenuModifyHP(taskId, gPartyMenu.slotId2, 1, GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_MAX_HP) / 5, sub_80E583C);
}
static void sub_80E583C(u8 taskId)
{
- GetMonNickname(&gPlayerParty[gPartyMenu.unkA], gStringVar1);
+ GetMonNickname(&gPlayerParty[gPartyMenu.slotId2], gStringVar1);
StringExpandPlaceholders(gStringVar4, gText_PkmnHPRestoredByVar2);
DisplayPartyMenuMessage(gStringVar4, 0);
ScheduleBgCopyTilemapToVram(2);
@@ -82,10 +82,10 @@ static void sub_80E58A0(u8 taskId)
{
if (IsPartyMenuTextPrinterActive() != TRUE)
{
- gPartyMenu.unkB = 0;
- AnimatePartySlot(gPartyMenu.unk9, 0);
- gPartyMenu.unk9 = gPartyMenu.unkA;
- AnimatePartySlot(gPartyMenu.unkA, 1);
+ gPartyMenu.action = 0;
+ AnimatePartySlot(gPartyMenu.slotId, 0);
+ gPartyMenu.slotId = gPartyMenu.slotId2;
+ AnimatePartySlot(gPartyMenu.slotId2, 1);
ClearStdWindowAndFrameToTransparent(6, 0);
ClearWindowTilemap(6);
DisplayPartyMenuStdMessage(0);
diff --git a/src/fldeff_sweetscent.c b/src/fldeff_sweetscent.c
index c413f29c1..66529cd55 100644
--- a/src/fldeff_sweetscent.c
+++ b/src/fldeff_sweetscent.c
@@ -20,7 +20,7 @@ static void FailSweetScentEncounter(u8 taskId);
static void Unused_StartSweetscentFldeff(void)
{
- gPartyMenu.unk9 = 0;
+ gPartyMenu.slotId = 0;
FieldCallback_SweetScent();
}
diff --git a/src/item_pc.c b/src/item_pc.c
index 450e0d142..f4320cd41 100644
--- a/src/item_pc.c
+++ b/src/item_pc.c
@@ -1030,7 +1030,7 @@ static void Task_ItemPcGive(u8 taskId)
static void ItemPc_CB2_SwitchToPartyMenu(void)
{
InitPartyMenu(0, 0, 6, 0, 6, Task_HandleChooseMonInput, ItemPc_CB2_ReturnFromPartyMenu);
- gPartyMenu.unkC = ItemPc_GetItemIdBySlotId(ItemPc_GetCursorPosition());
+ gPartyMenu.bagItem = ItemPc_GetItemIdBySlotId(ItemPc_GetCursorPosition());
}
static void ItemPc_CB2_ReturnFromPartyMenu(void)
diff --git a/src/party_menu.c b/src/party_menu.c
new file mode 100644
index 000000000..674b329c2
--- /dev/null
+++ b/src/party_menu.c
@@ -0,0 +1,172 @@
+#include "global.h"
+#include "malloc.h"
+#include "battle.h"
+#include "battle_anim.h"
+#include "battle_controllers.h"
+#include "battle_gfx_sfx_util.h"
+#include "battle_interface.h"
+#include "bg.h"
+#include "data.h"
+#include "decompress.h"
+#include "easy_chat.h"
+#include "event_data.h"
+#include "evolution_scene.h"
+#include "field_control_avatar.h"
+#include "field_effect.h"
+#include "field_player_avatar.h"
+#include "field_screen_effect.h"
+#include "field_specials.h"
+#include "field_weather.h"
+#include "fieldmap.h"
+#include "fldeff.h"
+#include "gpu_regs.h"
+#include "graphics.h"
+#include "item.h"
+#include "item_menu.h"
+#include "item_use.h"
+#include "link.h"
+#include "link_rfu.h"
+#include "mail.h"
+#include "main.h"
+#include "menu.h"
+#include "menu_helpers.h"
+#include "new_menu_helpers.h"
+#include "metatile_behavior.h"
+#include "overworld.h"
+#include "palette.h"
+#include "party_menu.h"
+#include "player_pc.h"
+#include "pokemon.h"
+#include "pokemon_icon.h"
+#include "pokemon_jump.h"
+#include "pokemon_storage_system.h"
+#include "pokemon_summary_screen.h"
+#include "region_map.h"
+#include "reshow_battle_screen.h"
+#include "scanline_effect.h"
+#include "script.h"
+#include "sound.h"
+#include "sprite.h"
+#include "start_menu.h"
+#include "string_util.h"
+#include "strings.h"
+#include "task.h"
+#include "text.h"
+#include "text_window.h"
+#include "trade.h"
+#include "union_room.h"
+#include "window.h"
+#include "constants/battle.h"
+#include "constants/easy_chat.h"
+#include "constants/field_effects.h"
+#include "constants/flags.h"
+#include "constants/item_effects.h"
+#include "constants/items.h"
+#include "constants/maps.h"
+#include "constants/moves.h"
+#include "constants/songs.h"
+#include "constants/species.h"
+#include "constants/vars.h"
+
+#define PARTY_PAL_SELECTED (1 << 0)
+#define PARTY_PAL_FAINTED (1 << 1)
+#define PARTY_PAL_TO_SWITCH (1 << 2)
+#define PARTY_PAL_MULTI_ALT (1 << 3)
+#define PARTY_PAL_SWITCHING (1 << 4)
+#define PARTY_PAL_TO_SOFTBOIL (1 << 5)
+#define PARTY_PAL_NO_MON (1 << 6)
+#define PARTY_PAL_UNUSED (1 << 7)
+
+#define MENU_DIR_DOWN 1
+#define MENU_DIR_UP -1
+#define MENU_DIR_RIGHT 2
+#define MENU_DIR_LEFT -2
+
+enum
+{
+ CAN_LEARN_MOVE,
+ CANNOT_LEARN_MOVE,
+ ALREADY_KNOWS_MOVE,
+ CANNOT_LEARN_MOVE_IS_EGG
+};
+
+struct PartyMenuBoxInfoRects
+{
+ void (*blitFunc)(u8 windowId, u8 x, u8 y, u8 width, u8 height, bool8 isEgg);
+ u8 dimensions[24];
+ u8 descTextLeft;
+ u8 descTextTop;
+ u8 descTextWidth;
+ u8 descTextHeight;
+};
+
+struct PartyMenuInternal
+{
+ TaskFunc task;
+ MainCallback exitCallback;
+ u32 chooseHalf:1;
+ u32 lastSelectedSlot:3; // Used to return to same slot when going left/right bewtween columns
+ u32 spriteIdConfirmPokeball:7;
+ u32 spriteIdCancelPokeball:7;
+ u32 messageId:14;
+ u8 windowId[3];
+ u8 actions[8];
+ u8 numActions;
+ u16 palBuffer[BG_PLTT_SIZE / sizeof(u16)];
+ s16 data[16];
+};
+
+struct PartyMenuBox
+{
+ const struct PartyMenuBoxInfoRects *infoRects;
+ const u8 *spriteCoords;
+ u8 windowId;
+ u8 monSpriteId;
+ u8 itemSpriteId;
+ u8 pokeballSpriteId;
+ u8 statusSpriteId;
+};
+
+void BlitBitmapToPartyWindow_LeftColumn(u8 windowId, u8 x, u8 y, u8 width, u8 height, bool8 isEgg);
+void BlitBitmapToPartyWindow_RightColumn(u8 windowId, u8 x, u8 y, u8 width, u8 height, bool8 isEgg);
+void CursorCB_Summary(u8 taskId);
+void CursorCB_Switch(u8 taskId);
+void CursorCB_Cancel1(u8 taskId);
+void CursorCB_Item(u8 taskId);
+void CursorCB_Give(u8 taskId);
+void CursorCB_TakeItem(u8 taskId);
+void CursorCB_Mail(u8 taskId);
+void CursorCB_Read(u8 taskId);
+void CursorCB_TakeMail(u8 taskId);
+void CursorCB_Cancel2(u8 taskId);
+void CursorCB_SendMon(u8 taskId);
+void CursorCB_Enter(u8 taskId);
+void CursorCB_NoEntry(u8 taskId);
+void CursorCB_Store(u8 taskId);
+void CursorCB_Register(u8 taskId);
+void CursorCB_Trade1(u8 taskId);
+void CursorCB_Trade2(u8 taskId);
+void CursorCB_FieldMove(u8 taskId);
+bool8 SetUpFieldMove_Fly(void);
+bool8 SetUpFieldMove_Waterfall(void);
+bool8 SetUpFieldMove_Surf(void);
+
+EWRAM_DATA struct PartyMenuInternal *sPartyMenuInternal = NULL;
+EWRAM_DATA struct PartyMenu gPartyMenu = {0};
+EWRAM_DATA struct PartyMenuBox *sPartyMenuBoxes = NULL;
+EWRAM_DATA u8 *sPartyBgGfxTilemap = NULL;
+EWRAM_DATA u8 *sPartyBgTilemapBuffer = NULL;
+EWRAM_DATA bool8 gPartyMenuUseExitCallback = FALSE;
+EWRAM_DATA u8 gSelectedMonPartyId = 0;
+EWRAM_DATA MainCallback gPostMenuFieldCallback = NULL;
+EWRAM_DATA u16 *sSlot1TilemapBuffer = NULL; // for switching party slots
+EWRAM_DATA u16 *sSlot2TilemapBuffer = NULL;
+EWRAM_DATA struct Pokemon *gUnknown_203B0D0 = NULL;
+EWRAM_DATA u8 gSelectedOrderFromParty[4] = {0};
+EWRAM_DATA u16 sPartyMenuItemId = ITEM_NONE;
+ALIGNED(4) EWRAM_DATA u8 gBattlePartyCurrentOrder[PARTY_SIZE / 2] = {0}; // bits 0-3 are the current pos of Slot 1, 4-7 are Slot 2, and so on
+
+void (*gItemUseCB)(u8, TaskFunc);
+
+#include "data/pokemon/tutor_learnsets.h"
+#include "data/party_menu.h"
diff --git a/src/trade.c b/src/trade.c
index 792f1524b..85bd7b2ca 100644
--- a/src/trade.c
+++ b/src/trade.c
@@ -459,9 +459,9 @@ static const u8 *const sTradeErrorOrStatusMessagePtrs[] = {
gUnknown_8417094, // That's your only POKéMON for battle
gUnknown_841E199, // Waiting for your friend to finish
gUnknown_841E1C5, // Your friend wants to trade POKéMON
- gUnknown_84170BC, // That POKéMON can't be traded now
- gUnknown_84170E0, // An EGG can't be traded now
- gUnknown_84170FC // The other TRAINER's POKéMON can't be traded now
+ gText_PkmnCantBeTradedNow, // That POKéMON can't be traded now
+ gText_EggCantBeTradedNow, // An EGG can't be traded now
+ gText_OtherTrainersPkmnCantBeTraded // The other TRAINER's POKéMON can't be traded now
};
static const u8 gUnknown_8261F18[] = { 0, 1, 2 };
diff --git a/sym_common.txt b/sym_common.txt
index 30b886f7a..3fcbce1e0 100644
--- a/sym_common.txt
+++ b/sym_common.txt
@@ -180,9 +180,7 @@ gUnknown_3005E90: @ 3005E90
gUnknown_3005E94: @ 3005E94
.space 0x4
-gItemUseCB: @ 3005E98
- .space 0x4
-
+ .include "party_menu.o"
.include "help_system_812B1E0.o"
.align 4
.include "fame_checker.o"
diff --git a/sym_ewram.txt b/sym_ewram.txt
index 891ba29a3..e4de1e801 100644
--- a/sym_ewram.txt
+++ b/sym_ewram.txt
@@ -596,54 +596,10 @@ gUnknown_203B094: @ 203B094
gUnknown_203B098: @ 203B098
.space 0x4
-sPartyMenuInternal: @ 203B09C
- .space 0x4
-
-gPartyMenu: @ 203B0A0
- .space 0x9
-
-gUnknown_203B0A9: @ 203B0A9
- .space 0x5
-
-gUnknown_203B0AE: @ 203B0AE
- .space 0x6
-
-sPartyMenuBoxes: @ 203B0B4
- .space 0x4
-
-sPartyBgGfxTilemap: @ 203B0B8
- .space 0x4
-
-sPartyBgTilemapBuffer: @ 203B0BC
- .space 0x4
-
-gPartyMenuUseExitCallback: @ 203B0C0
- .space 0x1
-
-gUnknown_203B0C1: @ 203B0C1
- .space 0x3
-
-gPostMenuFieldCallback: @ 203B0C4
- .space 0x4
-
-sSlot1TilemapBuffer: @ 203B0C8
- .space 0x4
-
-sSlot2TilemapBuffer: @ 203B0CC
- .space 0x4
-
-gUnknown_203B0D0: @ 203B0D0
- .space 0x4
-
-gSelectedOrderFromParty: @ 203B0D4
- .space 0x4
-
-sPartyMenuItemId: @ 203B0D8
- .space 0x4
-
-gBattlePartyCurrentOrder: @ 203B0DC
- .space 0x4
+ .align 2
+ .include "src/party_menu.o"
+ .align 2
gUnknown_203B0E0: @ 203B0E0
.space 0x4