diff options
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 Binary files differnew file mode 100644 index 000000000..15df00440 --- /dev/null +++ b/graphics/interface/hold_icons.png 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 |