diff options
35 files changed, 1297 insertions, 1582 deletions
diff --git a/asm/battle_2.s b/asm/battle_2.s index ee7b80ad4..3fdaeca33 100644 --- a/asm/battle_2.s +++ b/asm/battle_2.s @@ -1132,7 +1132,7 @@ _0801067E: adds r1, r0 ldrh r0, [r1] strh r0, [r2, 0x10] - bl sub_8044708 + bl SetDeoxysStats ldr r1, _080106F0 @ =gUnknown_2023E82 b _080108B2 .align 2, 0 @@ -1834,7 +1834,7 @@ _08010CE2: adds r1, r7, 0 bl sub_8010414 bl sub_801017C - bl sub_8044708 + bl SetDeoxysStats ldr r0, _08010D4C @ =gDecompressionBuffer ldr r1, _08010D50 @ =gPlayerParty movs r2, 0x96 @@ -6570,7 +6570,7 @@ _080131F6: add r1, r10 ldr r2, [r1] movs r1, 0x2 - bl sub_8044898 + bl HandleSetPokedexFlag b _080132C2 .align 2, 0 _08013230: .4byte gBaseStats @@ -6609,7 +6609,7 @@ _0801324C: add r1, r10 ldr r2, [r1] movs r1, 0x2 - bl sub_8044898 + bl HandleSetPokedexFlag b _080132B4 _0801328E: ldr r0, _08013324 @ =0x0001aa02 @@ -6628,7 +6628,7 @@ _0801328E: add r1, r10 ldr r2, [r1] movs r1, 0x2 - bl sub_8044898 + bl HandleSetPokedexFlag _080132B4: movs r0, 0 bl EmitLoadMonSprite @@ -7097,7 +7097,7 @@ _0801364C: adds r1, r7 ldr r2, [r1] movs r1, 0x2 - bl sub_8044898 + bl HandleSetPokedexFlag _08013684: ldrb r0, [r4] adds r0, 0x1 diff --git a/asm/battle_interface.s b/asm/battle_interface.s index acf228669..959e4e19d 100644 --- a/asm/battle_interface.s +++ b/asm/battle_interface.s @@ -3610,7 +3610,7 @@ _08049734: lsls r1, 24 lsrs r1, 24 adds r0, r7, 0 - bl sub_80448F8 + bl CheckBattleTypeGhost lsls r0, 24 cmp r0, 0 beq _08049754 @@ -3755,7 +3755,7 @@ sub_804981C: @ 804981C ldr r6, _080498EC @ =gEnemyParty adds r0, r6 adds r1, r4, 0 - bl sub_80448F8 + bl CheckBattleTypeGhost lsls r0, 24 cmp r0, 0 bne _0804991C diff --git a/asm/battle_script_commands.s b/asm/battle_script_commands.s index b240c3da2..747859147 100644 --- a/asm/battle_script_commands.s +++ b/asm/battle_script_commands.s @@ -13273,7 +13273,7 @@ sub_80240D4: @ 80240D4 adds r1, r4 ldr r2, [r1] movs r1, 0x2 - bl sub_8044898 + bl HandleSetPokedexFlag _0802412A: ldr r2, _08024180 @ =gAbsentBattlerFlags ldr r1, _08024184 @ =gBitTable @@ -13398,7 +13398,7 @@ _08024228: bl GetBankMultiplayerId lsls r0, 24 lsrs r0, 24 - bl sub_8043620 + bl GetLinkTrainerFlankId lsls r0, 16 lsrs r0, 16 cmp r0, 0x1 @@ -21520,7 +21520,7 @@ _08028336: bl GetBankMultiplayerId lsls r0, 24 lsrs r0, 24 - bl sub_8043620 + bl GetLinkTrainerFlankId lsls r0, 16 lsrs r0, 16 cmp r0, 0x1 @@ -21665,7 +21665,7 @@ _08028458: bl GetBankMultiplayerId lsls r0, 24 lsrs r0, 24 - bl sub_8043620 + bl GetLinkTrainerFlankId lsls r0, 16 lsrs r0, 16 cmp r0, 0x1 @@ -32384,7 +32384,7 @@ _0802D9B4: lsrs r0, 16 movs r1, 0x3 adds r2, r4, 0 - bl sub_8044898 + bl HandleSetPokedexFlag ldr r1, _0802D9D4 @ =gUnknown_2023D74 ldr r0, [r1] adds r0, 0x5 diff --git a/asm/battle_setup.s b/asm/battle_setup.s index db8b366b4..99e4c3468 100644 --- a/asm/battle_setup.s +++ b/asm/battle_setup.s @@ -2051,7 +2051,7 @@ sub_8080628: @ 8080628 beq _080806BE ldr r0, _08080668 @ =gTrainerBattleOpponent_A ldrh r0, [r0] - bl sub_804367C + bl GetTrainerEncounterMusicId lsls r0, 24 lsrs r0, 24 cmp r0, 0xD diff --git a/asm/battle_tower.s b/asm/battle_tower.s index 01ac780a2..453896446 100644 --- a/asm/battle_tower.s +++ b/asm/battle_tower.s @@ -1222,7 +1222,7 @@ _080E6286: adds r2, r3 ldr r1, [r4] adds r1, r2 - bl sub_803E0A4 + bl CreateBattleTowerMon adds r6, 0x1 cmp r6, 0x2 ble _080E6286 @@ -1251,7 +1251,7 @@ _080E62B2: muls r2, r6 adds r2, 0x1C adds r1, r2 - bl sub_803E0A4 + bl CreateBattleTowerMon adds r6, 0x1 cmp r6, 0x2 ble _080E62B2 @@ -2136,7 +2136,7 @@ _080E69A0: adds r2, r1 ldr r1, [r4] adds r1, r2 - bl sub_803E0A4 + bl CreateBattleTowerMon adds r5, 0x1 cmp r5, 0x2 ble _080E69A0 diff --git a/asm/battle_util.s b/asm/battle_util.s index 04202e9da..50f5210aa 100644 --- a/asm/battle_util.s +++ b/asm/battle_util.s @@ -5775,7 +5775,7 @@ _08019C40: mov r8, r0 _08019C66: adds r0, r7, 0 - bl sub_8043620 + bl GetLinkTrainerFlankId lsls r0, 24 lsrs r6, r0, 24 lsls r0, r6, 1 diff --git a/asm/overworld.s b/asm/overworld.s index 5e50a5d05..934fd29f3 100644 --- a/asm/overworld.s +++ b/asm/overworld.s @@ -38,7 +38,7 @@ sub_8054C04: @ 8054C04 adds r4, r0, 0 lsls r4, 24 lsrs r4, 24 - bl sub_80444F8 + bl GetPlayerPartyHighestLevel lsls r0, 24 lsrs r0, 24 ldr r1, _08054C40 @ =gUnknown_826D294 diff --git a/asm/party_menu.s b/asm/party_menu.s index 215dfbe8e..ace2e3554 100644 --- a/asm/party_menu.s +++ b/asm/party_menu.s @@ -18182,7 +18182,7 @@ sub_8127AC0: @ 8127AC0 bne _08127B08 _08127AE6: ldr r4, _08127AFC @ =gStringVar1 - bl sub_80444C4 + bl GetTrainerPartnerName adds r1, r0, 0 adds r0, r4, 0 bl StringCopy diff --git a/asm/pokemon_3.s b/asm/pokemon_3.s deleted file mode 100644 index 416c996bb..000000000 --- a/asm/pokemon_3.s +++ /dev/null @@ -1,1228 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start sub_80444F8 -sub_80444F8: @ 80444F8 - push {r4-r6,lr} - movs r6, 0x1 - movs r5, 0 -_080444FE: - movs r0, 0x64 - adds r1, r5, 0 - muls r1, r0 - ldr r0, _08044548 @ =gPlayerParty - adds r4, r1, r0 - adds r0, r4, 0 - movs r1, 0x5 - movs r2, 0 - bl GetMonData - cmp r0, 0x1 - bne _08044538 - adds r0, r4, 0 - movs r1, 0x6 - movs r2, 0 - bl GetMonData - cmp r0, 0 - bne _08044538 - adds r0, r4, 0 - movs r1, 0x38 - movs r2, 0 - bl GetMonData - lsls r0, 24 - lsrs r0, 24 - cmp r0, r6 - bls _08044538 - adds r6, r0, 0 -_08044538: - adds r5, 0x1 - cmp r5, 0x5 - ble _080444FE - adds r0, r6, 0 - pop {r4-r6} - pop {r1} - bx r1 - .align 2, 0 -_08044548: .4byte gPlayerParty - thumb_func_end sub_80444F8 - - thumb_func_start sub_804454C -sub_804454C: @ 804454C - lsls r0, 16 - lsrs r0, 16 - ldr r1, _08044558 @ =gFacilityClassToPicIndex - adds r0, r1 - ldrb r0, [r0] - bx lr - .align 2, 0 -_08044558: .4byte gFacilityClassToPicIndex - thumb_func_end sub_804454C - - thumb_func_start sub_804455C -sub_804455C: @ 804455C - push {r4,r5,lr} - lsls r0, 24 - lsrs r0, 24 - lsls r1, 24 - lsrs r5, r1, 24 - cmp r0, 0x5 - bhi _08044632 - lsls r0, 2 - ldr r1, _08044574 @ =_08044578 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_08044574: .4byte _08044578 - .align 2, 0 -_08044578: - .4byte _08044632 - .4byte _08044590 - .4byte _08044664 - .4byte _080445BC - .4byte _08044664 - .4byte _080445F4 -_08044590: - ldr r0, _080445B0 @ =gBattleTypeFlags - ldr r0, [r0] - movs r1, 0x40 - ands r0, r1 - cmp r0, 0 - beq _08044632 - ldr r0, _080445B4 @ =gMain - ldr r1, _080445B8 @ =0x00000439 - adds r0, r1 - ldrb r1, [r0] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _08044632 - b _0804461A - .align 2, 0 -_080445B0: .4byte gBattleTypeFlags -_080445B4: .4byte gMain -_080445B8: .4byte 0x00000439 -_080445BC: - ldr r0, _080445E8 @ =gBattleTypeFlags - ldr r0, [r0] - movs r1, 0x40 - ands r0, r1 - cmp r0, 0 - beq _08044632 - ldr r0, _080445EC @ =gMain - ldr r1, _080445F0 @ =0x00000439 - adds r0, r1 - ldrb r1, [r0] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _08044632 - cmp r5, 0x1 - beq _08044664 - cmp r5, 0x4 - beq _08044664 - cmp r5, 0x5 - beq _08044664 - b _08044632 - .align 2, 0 -_080445E8: .4byte gBattleTypeFlags -_080445EC: .4byte gMain -_080445F0: .4byte 0x00000439 -_080445F4: - ldr r0, _08044638 @ =gBattleTypeFlags - ldr r2, [r0] - movs r3, 0x2 - adds r0, r2, 0 - ands r0, r3 - cmp r0, 0 - beq _08044648 - ldr r0, _0804463C @ =gMain - ldr r1, _08044640 @ =0x00000439 - adds r0, r1 - ldrb r1, [r0] - adds r0, r3, 0 - ands r0, r1 - cmp r0, 0 - beq _08044632 - movs r0, 0x40 - ands r2, r0 - cmp r2, 0 - beq _08044658 -_0804461A: - ldr r4, _08044644 @ =gLinkPlayers - bl GetMultiplayerId - lsls r0, 24 - lsrs r0, 24 - lsls r1, r0, 3 - subs r1, r0 - lsls r1, 2 - adds r1, r4 - ldrh r0, [r1, 0x18] - cmp r0, r5 - bne _08044664 -_08044632: - movs r0, 0 - b _08044666 - .align 2, 0 -_08044638: .4byte gBattleTypeFlags -_0804463C: .4byte gMain -_08044640: .4byte 0x00000439 -_08044644: .4byte gLinkPlayers -_08044648: - ldr r0, _0804466C @ =gMain - ldr r1, _08044670 @ =0x00000439 - adds r0, r1 - ldrb r1, [r0] - adds r0, r3, 0 - ands r0, r1 - cmp r0, 0 - beq _08044632 -_08044658: - adds r0, r5, 0 - bl GetBattlerSide - lsls r0, 24 - cmp r0, 0 - beq _08044632 -_08044664: - movs r0, 0x1 -_08044666: - pop {r4,r5} - pop {r1} - bx r1 - .align 2, 0 -_0804466C: .4byte gMain -_08044670: .4byte 0x00000439 - thumb_func_end sub_804455C - - thumb_func_start GetDeoxysStat -GetDeoxysStat: @ 8044674 - push {r4-r6,lr} - adds r5, r0, 0 - adds r6, r1, 0 - ldr r0, _0804469C @ =gBattleTypeFlags - ldr r0, [r0] - movs r1, 0x20 - ands r0, r1 - cmp r0, 0 - bne _08044698 - adds r0, r5, 0 - movs r1, 0xB - movs r2, 0 - bl GetMonData - movs r1, 0xCD - lsls r1, 1 - cmp r0, r1 - beq _080446A0 -_08044698: - movs r0, 0 - b _080446FE - .align 2, 0 -_0804469C: .4byte gBattleTypeFlags -_080446A0: - adds r1, r6, 0 - adds r1, 0x27 - adds r0, r5, 0 - movs r2, 0 - bl GetMonData - adds r4, r0, 0 - adds r1, r6, 0 - adds r1, 0x1A - adds r0, r5, 0 - movs r2, 0 - bl GetMonData - ldr r2, _08044704 @ =gUnknown_825E026 - lsls r1, r6, 1 - adds r1, r2 - ldrh r1, [r1] - lsls r1, 1 - adds r1, r4 - cmp r0, 0 - bge _080446CC - adds r0, 0x3 -_080446CC: - asrs r0, 2 - adds r0, r1, r0 - adds r1, r5, 0 - adds r1, 0x54 - ldrb r1, [r1] - muls r0, r1 - movs r1, 0x64 - bl __divsi3 - adds r0, 0x5 - lsls r0, 16 - lsrs r4, r0, 16 - adds r0, r5, 0 - bl GetNature - lsls r0, 24 - lsrs r0, 24 - lsls r2, r6, 24 - lsrs r2, 24 - adds r1, r4, 0 - bl nature_stat_mod - lsls r0, 16 - lsrs r4, r0, 16 - adds r0, r4, 0 -_080446FE: - pop {r4-r6} - pop {r1} - bx r1 - .align 2, 0 -_08044704: .4byte gUnknown_825E026 - thumb_func_end GetDeoxysStat - - thumb_func_start sub_8044708 -sub_8044708: @ 8044708 - push {r4,r5,lr} - sub sp, 0x4 - movs r5, 0 -_0804470E: - movs r0, 0x64 - adds r1, r5, 0 - muls r1, r0 - ldr r0, _080447A8 @ =gPlayerParty - adds r4, r1, r0 - adds r0, r4, 0 - movs r1, 0xB - movs r2, 0 - bl GetMonData - movs r1, 0xCD - lsls r1, 1 - cmp r0, r1 - bne _08044798 - adds r0, r4, 0 - movs r1, 0x3B - movs r2, 0 - bl GetMonData - str r0, [sp] - adds r0, r4, 0 - movs r1, 0x3B - mov r2, sp - bl SetMonData - adds r0, r4, 0 - movs r1, 0x3C - movs r2, 0 - bl GetMonData - str r0, [sp] - adds r0, r4, 0 - movs r1, 0x3C - mov r2, sp - bl SetMonData - adds r0, r4, 0 - movs r1, 0x3D - movs r2, 0 - bl GetMonData - str r0, [sp] - adds r0, r4, 0 - movs r1, 0x3D - mov r2, sp - bl SetMonData - adds r0, r4, 0 - movs r1, 0x3E - movs r2, 0 - bl GetMonData - str r0, [sp] - adds r0, r4, 0 - movs r1, 0x3E - mov r2, sp - bl SetMonData - adds r0, r4, 0 - movs r1, 0x3F - movs r2, 0 - bl GetMonData - str r0, [sp] - adds r0, r4, 0 - movs r1, 0x3F - mov r2, sp - bl SetMonData -_08044798: - adds r5, 0x1 - cmp r5, 0x5 - ble _0804470E - add sp, 0x4 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_080447A8: .4byte gPlayerParty - thumb_func_end sub_8044708 - - thumb_func_start sub_80447AC -sub_80447AC: @ 80447AC - push {lr} - bl GetMultiplayerId - movs r1, 0x1 - eors r0, r1 - lsls r0, 24 - lsrs r0, 24 - ldr r3, _080447E8 @ =gLinkPlayers - lsls r1, r0, 3 - subs r1, r0 - lsls r1, 2 - adds r0, r3, 0x4 - adds r0, r1, r0 - ldr r2, [r0] - movs r0, 0x7 - ands r2, r0 - adds r1, r3 - ldrb r0, [r1, 0x13] - lsls r0, 3 - orrs r2, r0 - ldr r0, _080447EC @ =gUnknown_825E032 - lsls r2, 1 - adds r2, r0 - ldrh r0, [r2] - bl sub_804454C - lsls r0, 16 - lsrs r0, 16 - pop {r1} - bx r1 - .align 2, 0 -_080447E8: .4byte gLinkPlayers -_080447EC: .4byte gUnknown_825E032 - thumb_func_end sub_80447AC - - thumb_func_start sub_80447F0 -sub_80447F0: @ 80447F0 - push {lr} - bl GetMultiplayerId - movs r1, 0x1 - eors r0, r1 - lsls r0, 24 - lsrs r0, 24 - ldr r3, _0804482C @ =gLinkPlayers - lsls r1, r0, 3 - subs r1, r0 - lsls r1, 2 - adds r0, r3, 0x4 - adds r0, r1, r0 - ldr r2, [r0] - movs r0, 0x7 - ands r2, r0 - adds r1, r3 - ldrb r0, [r1, 0x13] - lsls r0, 3 - orrs r2, r0 - ldr r1, _08044830 @ =gFacilityClassToTrainerClass - ldr r0, _08044834 @ =gUnknown_825E032 - lsls r2, 1 - adds r2, r0 - ldrh r0, [r2] - adds r0, r1 - ldrb r0, [r0] - pop {r1} - bx r1 - .align 2, 0 -_0804482C: .4byte gLinkPlayers -_08044830: .4byte gFacilityClassToTrainerClass -_08044834: .4byte gUnknown_825E032 - thumb_func_end sub_80447F0 - - thumb_func_start sub_8044838 -sub_8044838: @ 8044838 - push {r4-r7,lr} - sub sp, 0x14 - ldr r0, _08044888 @ =gSpecialVar_0x8004 - ldrh r5, [r0] - ldr r0, _0804488C @ =gSpecialVar_0x8005 - ldrh r4, [r0] - ldr r0, _08044890 @ =gSpecialVar_0x8006 - ldrh r6, [r0] - bl ZeroEnemyPartyMons - ldr r7, _08044894 @ =gEnemyParty - lsls r4, 24 - lsrs r4, 24 - movs r0, 0 - str r0, [sp] - str r0, [sp, 0x4] - str r0, [sp, 0x8] - str r0, [sp, 0xC] - adds r0, r7, 0 - adds r1, r5, 0 - adds r2, r4, 0 - movs r3, 0x20 - bl CreateObedientMon - cmp r6, 0 - beq _08044880 - add r0, sp, 0x10 - strb r6, [r0] - adds r1, r0, 0 - asrs r0, r6, 8 - strb r0, [r1, 0x1] - adds r0, r7, 0 - movs r1, 0xC - add r2, sp, 0x10 - bl SetMonData -_08044880: - add sp, 0x14 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08044888: .4byte gSpecialVar_0x8004 -_0804488C: .4byte gSpecialVar_0x8005 -_08044890: .4byte gSpecialVar_0x8006 -_08044894: .4byte gEnemyParty - thumb_func_end sub_8044838 - - thumb_func_start sub_8044898 -sub_8044898: @ 8044898 - push {r4-r7,lr} - adds r7, r2, 0 - lsls r0, 16 - lsrs r4, r0, 16 - adds r6, r4, 0 - lsls r1, 24 - lsrs r5, r1, 24 - movs r0, 0x2 - eors r0, r5 - negs r1, r0 - orrs r1, r0 - lsrs r1, 31 - adds r0, r4, 0 - bl GetSetPokedexFlag - lsls r0, 24 - cmp r0, 0 - bne _080448EE - adds r0, r4, 0 - adds r1, r5, 0 - bl GetSetPokedexFlag - adds r0, r4, 0 - bl NationalPokedexNumToSpecies - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0xC9 - bne _080448D8 - ldr r0, _080448F4 @ =gSaveBlock2Ptr - ldr r0, [r0] - str r7, [r0, 0x1C] -_080448D8: - adds r0, r6, 0 - bl NationalPokedexNumToSpecies - lsls r0, 16 - movs r1, 0x9A - lsls r1, 17 - cmp r0, r1 - bne _080448EE - ldr r0, _080448F4 @ =gSaveBlock2Ptr - ldr r0, [r0] - str r7, [r0, 0x20] -_080448EE: - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080448F4: .4byte gSaveBlock2Ptr - thumb_func_end sub_8044898 - - thumb_func_start sub_80448F8 -sub_80448F8: @ 80448F8 - push {r4,lr} - sub sp, 0xC - adds r4, r0, 0 - lsls r1, 24 - lsrs r2, r1, 24 - ldr r0, _0804493C @ =gBattleTypeFlags - ldr r0, [r0] - movs r1, 0x80 - lsls r1, 8 - ands r0, r1 - cmp r0, 0 - beq _08044944 - adds r0, r2, 0 - bl GetBattlerSide - lsls r0, 24 - cmp r0, 0 - beq _08044944 - adds r0, r4, 0 - movs r1, 0x2 - mov r2, sp - bl GetMonData - mov r0, sp - bl StringGetEnd10 - ldr r1, _08044940 @ =gUnknown_841D148 - mov r0, sp - bl StringCompare - cmp r0, 0 - bne _08044944 - movs r0, 0x1 - b _08044946 - .align 2, 0 -_0804493C: .4byte gBattleTypeFlags -_08044940: .4byte gUnknown_841D148 -_08044944: - movs r0, 0 -_08044946: - add sp, 0xC - pop {r4} - pop {r1} - bx r1 - thumb_func_end sub_80448F8 - - thumb_func_start sub_8044950 -sub_8044950: @ 8044950 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - adds r4, r0, 0 - lsls r1, 24 - lsrs r1, 24 - movs r6, 0 - cmp r1, 0x3 - bls _080449EC - adds r5, r6, 0 - ldrb r0, [r4] - lsls r0, 28 - lsrs r0, 28 - cmp r5, r0 - bge _08044A2C -_08044972: - ldr r1, [r4, 0x10] - lsls r3, r5, 1 - adds r0, r3, r5 - lsls r0, 3 - ldr r2, _080449E8 @ =gUnknown_825DEF0 - adds r1, r0, r1 - adds r0, r2 - ldm r0!, {r2,r6,r7} - stm r1!, {r2,r6,r7} - ldm r0!, {r2,r6,r7} - stm r1!, {r2,r6,r7} - movs r6, 0 - ldrb r2, [r4, 0x1] - ldr r0, [r4, 0x10] - mov r10, r0 - mov r8, r3 - ldr r7, [r4, 0x14] - adds r1, r5, 0x1 - mov r9, r1 - cmp r6, r2 - bcs _080449C2 - mov r12, r7 - ldr r1, [r4, 0xC] - lsls r0, r5, 2 - adds r0, r1 - ldr r3, [r0] -_080449A6: - adds r0, r5, 0 - muls r0, r2 - adds r0, r6 - lsls r0, 3 - add r0, r12 - lsls r1, r6, 11 - adds r1, r3, r1 - str r1, [r0] - adds r0, r6, 0x1 - lsls r0, 16 - lsrs r6, r0, 16 - ldrb r2, [r4, 0x1] - cmp r6, r2 - bcc _080449A6 -_080449C2: - mov r2, r8 - adds r1, r2, r5 - lsls r1, 3 - add r1, r10 - ldrb r0, [r4, 0x1] - muls r0, r5 - lsls r0, 3 - adds r0, r7, r0 - str r0, [r1, 0xC] - mov r3, r9 - lsls r0, r3, 16 - lsrs r5, r0, 16 - ldrb r0, [r4] - lsls r0, 28 - lsrs r0, 28 - cmp r5, r0 - blt _08044972 - b _08044A2C - .align 2, 0 -_080449E8: .4byte gUnknown_825DEF0 -_080449EC: - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 3 - ldr r2, _08044A3C @ =gUnknown_825DEF0 - ldr r1, [r4, 0x10] - adds r0, r2 - ldm r0!, {r2,r5,r7} - stm r1!, {r2,r5,r7} - ldm r0!, {r3,r5,r7} - stm r1!, {r3,r5,r7} - ldr r0, [r4, 0x10] - mov r10, r0 - ldr r7, [r4, 0x14] - ldrb r1, [r4, 0x1] - cmp r6, r1 - bcs _08044A28 - adds r3, r7, 0 - ldr r0, [r4, 0xC] - ldr r2, [r0] -_08044A12: - lsls r0, r6, 3 - adds r0, r3 - lsls r1, r6, 11 - adds r1, r2, r1 - str r1, [r0] - adds r0, r6, 0x1 - lsls r0, 16 - lsrs r6, r0, 16 - ldrb r5, [r4, 0x1] - cmp r6, r5 - bcc _08044A12 -_08044A28: - mov r6, r10 - str r7, [r6, 0xC] -_08044A2C: - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08044A3C: .4byte gUnknown_825DEF0 - thumb_func_end sub_8044950 - - thumb_func_start sub_8044A40 -sub_8044A40: @ 8044A40 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - adds r4, r0, 0 - ldrb r0, [r4] - lsls r0, 28 - movs r3, 0 - cmp r0, 0 - beq _08044ADA - ldr r0, _08044AE8 @ =gUnknown_825E05C - mov r10, r0 -_08044A5A: - ldr r0, [r4, 0x10] - lsls r2, r3, 1 - adds r1, r2, r3 - lsls r1, 3 - adds r1, r0 - mov r0, r10 - ldm r0!, {r5-r7} - stm r1!, {r5-r7} - ldm r0!, {r5-r7} - stm r1!, {r5-r7} - movs r5, 0 - ldr r0, [r4, 0x10] - mov r8, r0 - mov r12, r2 - ldr r7, [r4, 0x14] - adds r1, r3, 0x1 - mov r9, r1 - ldrb r6, [r4, 0x1] - cmp r5, r6 - bcs _08044AAE - adds r6, r7, 0 - ldr r1, [r4, 0xC] - lsls r0, r3, 2 - adds r0, r1 - ldr r2, [r0] -_08044A8C: - ldrb r0, [r4] - lsls r0, 28 - lsrs r0, 28 - adds r1, r3, 0 - muls r1, r0 - adds r1, r5 - lsls r1, 3 - adds r1, r6 - lsls r0, r5, 11 - adds r0, r2, r0 - str r0, [r1] - adds r0, r5, 0x1 - lsls r0, 16 - lsrs r5, r0, 16 - ldrb r0, [r4, 0x1] - cmp r5, r0 - bcc _08044A8C -_08044AAE: - mov r5, r12 - adds r1, r5, r3 - lsls r1, 3 - add r1, r8 - ldrb r0, [r4] - lsls r0, 28 - lsrs r0, 28 - muls r0, r3 - lsls r0, 3 - adds r0, r7, r0 - str r0, [r1, 0xC] - ldr r6, _08044AEC @ =gUnknown_82349BC - str r6, [r1, 0x8] - strh r3, [r1, 0x2] - mov r7, r9 - lsls r0, r7, 16 - lsrs r3, r0, 16 - ldrb r0, [r4] - lsls r0, 28 - lsrs r0, 28 - cmp r3, r0 - blt _08044A5A -_08044ADA: - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08044AE8: .4byte gUnknown_825E05C -_08044AEC: .4byte gUnknown_82349BC - thumb_func_end sub_8044A40 - - thumb_func_start SetUpMonSpriteManagerMaybe -SetUpMonSpriteManagerMaybe: @ 8044AF0 - push {r4-r7,lr} - mov r7, r8 - push {r7} - lsls r0, 24 - lsrs r6, r0, 24 - lsls r1, 24 - lsrs r5, r1, 24 - movs r0, 0 - mov r8, r0 - ldr r4, _08044B34 @ =gUnknown_20244F4 - ldr r1, [r4] - cmp r1, 0 - beq _08044B1E - ldrb r0, [r1, 0x2] - cmp r0, 0xA3 - beq _08044B2E - adds r0, r1, 0 - movs r1, 0 - movs r2, 0x18 - bl memset - mov r1, r8 - str r1, [r4] -_08044B1E: - ldr r4, _08044B34 @ =gUnknown_20244F4 - movs r0, 0x18 - bl AllocZeroed - adds r2, r0, 0 - str r2, [r4] - cmp r2, 0 - bne _08044B38 -_08044B2E: - movs r0, 0 - b _08044D70 - .align 2, 0 -_08044B34: .4byte gUnknown_20244F4 -_08044B38: - cmp r5, 0 - beq _08044B94 - cmp r5, 0x1 - bne _08044B94 - cmp r6, 0x4 - bne _08044B5E - ldrb r1, [r2] - movs r0, 0x10 - negs r0, r0 - ands r0, r1 - movs r1, 0x4 - orrs r0, r1 - strb r0, [r2] - ldr r2, [r4] - ldrb r1, [r2] - movs r0, 0xF - ands r0, r1 - movs r1, 0x40 - b _08044B7C -_08044B5E: - cmp r6, 0x4 - bls _08044B64 - movs r6, 0 -_08044B64: - ldrb r1, [r2] - movs r0, 0x10 - negs r0, r0 - ands r0, r1 - movs r1, 0x1 - orrs r0, r1 - strb r0, [r2] - ldr r2, [r4] - ldrb r1, [r2] - movs r0, 0xF - ands r0, r1 - movs r1, 0x10 -_08044B7C: - orrs r0, r1 - strb r0, [r2] - ldr r2, _08044B90 @ =gUnknown_20244F4 - ldr r1, [r2] - movs r0, 0x4 - strb r0, [r1, 0x1] - ldr r1, [r2] - movs r0, 0x1 - strb r0, [r1, 0x3] - b _08044BD0 - .align 2, 0 -_08044B90: .4byte gUnknown_20244F4 -_08044B94: - cmp r6, 0 - bne _08044B9A - movs r6, 0x1 -_08044B9A: - cmp r6, 0x8 - bls _08044BA0 - movs r6, 0x8 -_08044BA0: - ldr r4, _08044C10 @ =gUnknown_20244F4 - ldr r3, [r4] - movs r0, 0xF - adds r1, r6, 0 - ands r1, r0 - ldrb r2, [r3] - movs r0, 0x10 - negs r0, r0 - ands r0, r2 - orrs r0, r1 - strb r0, [r3] - ldr r2, [r4] - lsls r3, r6, 4 - ldrb r1, [r2] - movs r0, 0xF - ands r0, r1 - orrs r0, r3 - strb r0, [r2] - ldr r1, [r4] - movs r2, 0 - movs r0, 0x4 - strb r0, [r1, 0x1] - ldr r0, [r4] - strb r2, [r0, 0x3] -_08044BD0: - ldr r5, _08044C10 @ =gUnknown_20244F4 - ldr r0, [r5] - ldrb r1, [r0, 0x1] - lsls r1, 11 - str r1, [r0, 0x4] - ldrb r0, [r0] - lsls r0, 28 - lsrs r0, 28 - muls r0, r1 - bl AllocZeroed - ldr r1, [r5] - str r0, [r1, 0x8] - ldrb r0, [r1] - lsls r0, 28 - lsrs r0, 23 - bl AllocZeroed - adds r2, r0, 0 - ldr r1, [r5] - str r2, [r1, 0xC] - ldr r0, [r1, 0x8] - cmp r0, 0 - beq _08044C04 - cmp r2, 0 - bne _08044C14 -_08044C04: - movs r0, 0x1 - mov r1, r8 - orrs r1, r0 - mov r8, r1 - b _08044C44 - .align 2, 0 -_08044C10: .4byte gUnknown_20244F4 -_08044C14: - ldrb r0, [r1] - lsls r0, 28 - movs r4, 0 - adds r3, r5, 0 - cmp r0, 0 - beq _08044C44 -_08044C20: - ldr r3, [r5] - ldr r0, [r3, 0xC] - lsls r1, r4, 2 - adds r1, r0 - ldr r0, [r3, 0x4] - adds r2, r0, 0 - muls r2, r4 - ldr r0, [r3, 0x8] - adds r0, r2 - str r0, [r1] - adds r0, r4, 0x1 - lsls r0, 24 - lsrs r4, r0, 24 - ldrb r0, [r3] - lsls r0, 28 - lsrs r0, 28 - cmp r4, r0 - blt _08044C20 -_08044C44: - ldr r5, _08044C8C @ =gUnknown_20244F4 - ldr r0, [r5] - ldrb r1, [r0] - lsls r1, 28 - lsrs r1, 28 - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 3 - bl AllocZeroed - ldr r2, [r5] - str r0, [r2, 0x10] - ldrb r1, [r2] - lsls r1, 28 - lsrs r1, 28 - ldrb r0, [r2, 0x1] - lsls r0, 3 - muls r0, r1 - bl AllocZeroed - adds r2, r0, 0 - ldr r1, [r5] - str r2, [r1, 0x14] - ldr r0, [r1, 0x10] - cmp r0, 0 - beq _08044C7C - cmp r2, 0 - bne _08044C90 -_08044C7C: - movs r0, 0x2 - mov r1, r8 - orrs r1, r0 - lsls r0, r1, 24 - lsrs r0, 24 - mov r8, r0 - b _08044CE2 - .align 2, 0 -_08044C8C: .4byte gUnknown_20244F4 -_08044C90: - movs r4, 0 - ldrb r0, [r1, 0x1] - ldrb r1, [r1] - lsls r1, 28 - lsrs r1, 28 - muls r0, r1 - adds r3, r5, 0 - cmp r4, r0 - bge _08044CC6 - adds r7, r3, 0 - movs r5, 0x80 - lsls r5, 4 -_08044CA8: - ldr r2, [r7] - ldr r1, [r2, 0x14] - lsls r0, r4, 3 - adds r0, r1 - strh r5, [r0, 0x4] - adds r0, r4, 0x1 - lsls r0, 24 - lsrs r4, r0, 24 - ldrb r1, [r2, 0x1] - ldrb r0, [r2] - lsls r0, 28 - lsrs r0, 28 - muls r0, r1 - cmp r4, r0 - blt _08044CA8 -_08044CC6: - ldr r0, [r3] - ldrb r4, [r0, 0x3] - cmp r4, 0 - beq _08044CDA - cmp r4, 0x1 - bne _08044CDA - adds r1, r6, 0 - bl sub_8044950 - b _08044CE2 -_08044CDA: - ldr r0, _08044D60 @ =gUnknown_20244F4 - ldr r0, [r0] - bl sub_8044A40 -_08044CE2: - movs r0, 0x2 - mov r1, r8 - ands r0, r1 - cmp r0, 0 - beq _08044D12 - ldr r4, _08044D60 @ =gUnknown_20244F4 - ldr r0, [r4] - ldr r0, [r0, 0x14] - cmp r0, 0 - beq _08044D00 - bl Free - ldr r1, [r4] - movs r0, 0 - str r0, [r1, 0x14] -_08044D00: - ldr r0, [r4] - ldr r0, [r0, 0x10] - cmp r0, 0 - beq _08044D12 - bl Free - ldr r1, [r4] - movs r0, 0 - str r0, [r1, 0x10] -_08044D12: - movs r0, 0x1 - mov r1, r8 - ands r0, r1 - cmp r0, 0 - beq _08044D42 - ldr r4, _08044D60 @ =gUnknown_20244F4 - ldr r0, [r4] - ldr r0, [r0, 0xC] - cmp r0, 0 - beq _08044D30 - bl Free - ldr r1, [r4] - movs r0, 0 - str r0, [r1, 0xC] -_08044D30: - ldr r0, [r4] - ldr r0, [r0, 0x8] - cmp r0, 0 - beq _08044D42 - bl Free - ldr r1, [r4] - movs r0, 0 - str r0, [r1, 0x8] -_08044D42: - mov r0, r8 - cmp r0, 0 - beq _08044D64 - ldr r4, _08044D60 @ =gUnknown_20244F4 - ldr r0, [r4] - movs r1, 0 - movs r2, 0x18 - bl memset - ldr r0, [r4] - bl Free - movs r0, 0 - str r0, [r4] - b _08044D6C - .align 2, 0 -_08044D60: .4byte gUnknown_20244F4 -_08044D64: - ldr r0, _08044D7C @ =gUnknown_20244F4 - ldr r1, [r0] - movs r0, 0xA3 - strb r0, [r1, 0x2] -_08044D6C: - ldr r0, _08044D7C @ =gUnknown_20244F4 - ldr r0, [r0] -_08044D70: - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_08044D7C: .4byte gUnknown_20244F4 - thumb_func_end SetUpMonSpriteManagerMaybe - - thumb_func_start sub_8044D80 -sub_8044D80: @ 8044D80 - push {r4,lr} - ldr r4, _08044D9C @ =gUnknown_20244F4 - ldr r1, [r4] - cmp r1, 0 - beq _08044DFA - ldrb r0, [r1, 0x2] - cmp r0, 0xA3 - beq _08044DA0 - adds r0, r1, 0 - movs r1, 0 - movs r2, 0x18 - bl memset - b _08044DF6 - .align 2, 0 -_08044D9C: .4byte gUnknown_20244F4 -_08044DA0: - ldr r0, [r1, 0x14] - cmp r0, 0 - beq _08044DB0 - bl Free - ldr r1, [r4] - movs r0, 0 - str r0, [r1, 0x14] -_08044DB0: - ldr r0, [r4] - ldr r0, [r0, 0x10] - cmp r0, 0 - beq _08044DC2 - bl Free - ldr r1, [r4] - movs r0, 0 - str r0, [r1, 0x10] -_08044DC2: - ldr r0, [r4] - ldr r0, [r0, 0xC] - cmp r0, 0 - beq _08044DD4 - bl Free - ldr r1, [r4] - movs r0, 0 - str r0, [r1, 0xC] -_08044DD4: - ldr r0, [r4] - ldr r0, [r0, 0x8] - cmp r0, 0 - beq _08044DE6 - bl Free - ldr r1, [r4] - movs r0, 0 - str r0, [r1, 0x8] -_08044DE6: - ldr r0, [r4] - movs r1, 0 - movs r2, 0x18 - bl memset - ldr r0, [r4] - bl Free -_08044DF6: - movs r0, 0 - str r0, [r4] -_08044DFA: - pop {r4} - pop {r0} - bx r0 - thumb_func_end sub_8044D80 - - thumb_func_start sub_8044E00 -sub_8044E00: @ 8044E00 - push {lr} - lsls r0, 24 - lsrs r1, r0, 24 - ldr r0, _08044E14 @ =gUnknown_20244F4 - ldr r2, [r0] - ldrb r0, [r2, 0x2] - cmp r0, 0xA3 - beq _08044E18 - movs r0, 0 - b _08044E2C - .align 2, 0 -_08044E14: .4byte gUnknown_20244F4 -_08044E18: - ldrb r0, [r2] - lsls r0, 28 - lsrs r0, 28 - cmp r1, r0 - blt _08044E24 - movs r1, 0 -_08044E24: - ldr r0, [r2, 0xC] - lsls r1, 2 - adds r1, r0 - ldr r0, [r1] -_08044E2C: - pop {r1} - bx r1 - thumb_func_end sub_8044E00 - - .align 2, 0 @ Don't pad with nop. diff --git a/asm/pokemon_summary_screen.s b/asm/pokemon_summary_screen.s index 2fa836876..cf1782306 100644 --- a/asm/pokemon_summary_screen.s +++ b/asm/pokemon_summary_screen.s @@ -9193,7 +9193,7 @@ sub_81390B0: @ 81390B0 mov r4, sp adds r4, 0x6 strb r0, [r4] - ldr r5, _081391E8 @ =gUnknown_825DEA1 + ldr r5, _081391E8 @ =gPPUpGetMask ldr r0, _081391E0 @ =gUnknown_203B16D ldrb r1, [r0] adds r0, r1, r5 @@ -9278,7 +9278,7 @@ _081391D8: .4byte gUnknown_203B140 _081391DC: .4byte 0x000032f4 _081391E0: .4byte gUnknown_203B16D _081391E4: .4byte gUnknown_203B16E -_081391E8: .4byte gUnknown_825DEA1 +_081391E8: .4byte gPPUpGetMask thumb_func_end sub_81390B0 thumb_func_start sub_81391EC @@ -9340,7 +9340,7 @@ sub_81391EC: @ 81391EC mov r4, sp adds r4, 0x6 strb r0, [r4] - ldr r5, _08139324 @ =gUnknown_825DEA1 + ldr r5, _08139324 @ =gPPUpGetMask ldr r0, _0813931C @ =gUnknown_203B16D ldrb r1, [r0] adds r0, r1, r5 @@ -9425,7 +9425,7 @@ _08139314: .4byte gUnknown_203B140 _08139318: .4byte 0x000032f4 _0813931C: .4byte gUnknown_203B16D _08139320: .4byte gUnknown_203B16E -_08139324: .4byte gUnknown_825DEA1 +_08139324: .4byte gPPUpGetMask thumb_func_end sub_81391EC thumb_func_start sub_8139328 diff --git a/asm/script_pokemon_util_80BF8FC.s b/asm/script_pokemon_util_80BF8FC.s index 26c113dfd..b5ef5f090 100644 --- a/asm/script_pokemon_util_80BF8FC.s +++ b/asm/script_pokemon_util_80BF8FC.s @@ -269,7 +269,7 @@ sub_80BFAA8: @ 80BFAA8 mov r6, sp adds r6, 0x6 strb r0, [r6] - ldr r1, _080BFBA4 @ =gUnknown_825DEA1 + ldr r1, _080BFBA4 @ =gPPUpGetMask adds r0, r5, r1 ldrb r0, [r0] mov r9, r0 @@ -330,7 +330,7 @@ sub_80BFAA8: @ 80BFAA8 pop {r0} bx r0 .align 2, 0 -_080BFBA4: .4byte gUnknown_825DEA1 +_080BFBA4: .4byte gPPUpGetMask thumb_func_end sub_80BFAA8 thumb_func_start sub_80BFBA8 diff --git a/asm/trade.s b/asm/trade.s index 967144d63..61328d618 100644 --- a/asm/trade.s +++ b/asm/trade.s @@ -8135,7 +8135,7 @@ sub_80507A0: @ 80507A0 adds r0, r4, 0 movs r1, 0x3 adds r2, r5, 0 - bl sub_8044898 + bl HandleSetPokedexFlag _080507F4: pop {r4,r5} pop {r0} diff --git a/asm/trainer_card.s b/asm/trainer_card.s index e8a591264..0ccec8553 100644 --- a/asm/trainer_card.s +++ b/asm/trainer_card.s @@ -4955,7 +4955,7 @@ sub_808B838: @ 808B838 adds r0, r1 ldrb r4, [r0] adds r0, r4, 0 - bl sub_804454C + bl FacilityClassToPicIndex lsls r0, 16 lsrs r0, 16 ldr r4, _0808B8A0 @ =gUnknown_83CD8EC @@ -4982,7 +4982,7 @@ _0808B8A4: cmp r0, 0 beq _0808B8FC adds r0, r4, 0 - bl sub_804454C + bl FacilityClassToPicIndex lsls r0, 16 lsrs r0, 16 ldr r4, _0808B8F4 @ =gUnknown_83CD8EC diff --git a/data/data.s b/data/data.s index 499e3c9db..d0725532a 100644 --- a/data/data.s +++ b/data/data.s @@ -68,7 +68,52 @@ gUnknown_8234690:: @ 8234690 .incbin "baserom.gba", 0x234690, 0x4 gUnknown_8234694:: @ 8234694 - .incbin "baserom.gba", 0x234694, 0x328 + .incbin "baserom.gba", 0x234694, 0x4 + +gUnknown_8234698:: @ 8234698 + .incbin "baserom.gba", 0x234698, 0x20 + +gUnknown_82346B8:: @ 82346B8 + .incbin "baserom.gba", 0x2346B8, 0x20 + +gUnknown_82346D8:: @ 82346D8 + .incbin "baserom.gba", 0x2346D8, 0x20 + +gUnknown_82346F8:: @ 82346F8 + .incbin "baserom.gba", 0x2346F8, 0x20 + +gUnknown_8234718:: @ 8234718 + .incbin "baserom.gba", 0x234718, 0x28 + +gUnknown_8234740:: @ 8234740 + .incbin "baserom.gba", 0x234740, 0x28 + +gUnknown_8234768:: @ 8234768 + .incbin "baserom.gba", 0x234768, 0x20 + +gUnknown_8234788:: @ 8234788 + .incbin "baserom.gba", 0x234788, 0x20 + +gUnknown_82347A8:: @ 82347A8 + .incbin "baserom.gba", 0x2347A8, 0x20 + +gUnknown_82347C8:: @ 82347C8 + .incbin "baserom.gba", 0x2347C8, 0x20 + +gUnknown_82347E8:: @ 82347E8 + .incbin "baserom.gba", 0x2347E8, 0xE0 + +gUnknown_82348C8:: @ 82348C8 + .incbin "baserom.gba", 0x2348C8, 0x24 + +gUnknown_82348EC:: @ 82348EC + .incbin "baserom.gba", 0x2348EC, 0x58 + +gUnknown_8234944:: @ 8234944 + .incbin "baserom.gba", 0x234944, 0x58 + +gUnknown_823499C:: @ 823499C + .incbin "baserom.gba", 0x23499C, 0x20 gUnknown_82349BC:: @ 82349BC .incbin "baserom.gba", 0x2349BC, 0x10 @@ -174,7 +219,16 @@ gUnknown_824EFF0:: @ 824EFF0 .incbin "baserom.gba", 0x24EFF0, 0x18 gUnknown_824F008:: @ 824F008 - .incbin "baserom.gba", 0x24F008, 0x40 + .incbin "baserom.gba", 0x24F008, 0x8 + +gUnknown_824F010:: @ 824F010 + .incbin "baserom.gba", 0x24F010, 0x8 + +gUnknown_824F018:: @ 824F018 + .incbin "baserom.gba", 0x24F018, 0x8 + +gUnknown_824F020:: @ 824F020 + .incbin "baserom.gba", 0x24F020, 0x28 gUnknown_824F048:: @ 824F048 .incbin "baserom.gba", 0x24F048, 0x8 @@ -499,54 +553,6 @@ gEvolutionTable:: @ 8259754 gLevelUpLearnsets:: @ 825D7B4 .incbin "baserom.gba", 0x25D7B4, 0x670 -gPokeblockFlavorCompatibilityTable:: @ 825DE24 - .incbin "baserom.gba", 0x25DE24, 0x7D - -gUnknown_825DEA1:: @ 825DEA1 - .incbin "baserom.gba", 0x25DEA1, 0x4 - -gPPUpWriteMasks:: @ 825DEA5 - .incbin "baserom.gba", 0x25DEA5, 0x4 - -gUnknown_825DEA9:: @ 825DEA9 - .incbin "baserom.gba", 0x25DEA9, 0x4 - -gStatStageRatios:: @ 825DEAD - .incbin "baserom.gba", 0x25DEAD, 0x1F - -sHoldEffectToType:: @ 825DECC - .incbin "baserom.gba", 0x25DECC, 0x24 - -gUnknown_825DEF0:: @ 825DEF0 - .incbin "baserom.gba", 0x25DEF0, 0x60 - -gUnknown_825DF50:: @ 825DF50 - .incbin "baserom.gba", 0x25DF50, 0x90 - -sSecretBaseFacilityClasses:: @ 825DFE0 - .incbin "baserom.gba", 0x25DFE0, 0xA - -sGetMonDataEVConstants:: @ 825DFEA - .incbin "baserom.gba", 0x25DFEA, 0x6 - -gUnknown_825DFF0:: @ 825DFF0 - .incbin "baserom.gba", 0x25DFF0, 0x6 - -sFriendshipEventDeltas:: @ 825DFF6 - .incbin "baserom.gba", 0x25DFF6, 0x1E - -sHMMoves:: @ 825E014 - .incbin "baserom.gba", 0x25E014, 0x12 - -gUnknown_825E026:: @ 825E026 - .incbin "baserom.gba", 0x25E026, 0xC - -gUnknown_825E032:: @ 825E032 - .incbin "baserom.gba", 0x25E032, 0x2A - -gUnknown_825E05C:: @ 825E05C - .incbin "baserom.gba", 0x25E05C, 0x18 - .section .rodata.825EF0C .align 2 diff --git a/data/maps/BirthIsland_Exterior/scripts.inc b/data/maps/BirthIsland_Exterior/scripts.inc index 1d3fc4db6..f00cd73f2 100644 --- a/data/maps/BirthIsland_Exterior/scripts.inc +++ b/data/maps/BirthIsland_Exterior/scripts.inc @@ -90,7 +90,7 @@ EventScript_1652C0:: @ 81652C0 setvar VAR_0x8004, SPECIES_DEOXYS setvar VAR_0x8005, 30 setvar VAR_0x8006, 0 - special sub_8044838 + special CreateObedientEnemyMon setflag FLAG_0x807 special sub_807F9D8 waitstate diff --git a/data/maps/NavelRock_Base/scripts.inc b/data/maps/NavelRock_Base/scripts.inc index 34cca4e9b..8818c1d01 100644 --- a/data/maps/NavelRock_Base/scripts.inc +++ b/data/maps/NavelRock_Base/scripts.inc @@ -63,7 +63,7 @@ NavelRock_Base_EventScript_165134:: @ 8165134 setvar VAR_0x8004, SPECIES_LUGIA setvar VAR_0x8005, 70 setvar VAR_0x8006, 0 - special sub_8044838 + special CreateObedientEnemyMon setflag FLAG_0x807 special sub_807F9D8 waitstate diff --git a/data/maps/NavelRock_Summit/scripts.inc b/data/maps/NavelRock_Summit/scripts.inc index cb82149e8..d359d4d25 100644 --- a/data/maps/NavelRock_Summit/scripts.inc +++ b/data/maps/NavelRock_Summit/scripts.inc @@ -67,7 +67,7 @@ NavelRock_Summit_EventScript_164FFB:: @ 8164FFB setvar VAR_0x8004, SPECIES_HO_OH setvar VAR_0x8005, 70 setvar VAR_0x8006, 0 - special sub_8044838 + special CreateObedientEnemyMon setflag FLAG_0x807 special sub_807F9D8 waitstate diff --git a/data/specials.inc b/data/specials.inc index 4c7ad327d..7c82d42f8 100644 --- a/data/specials.inc +++ b/data/specials.inc @@ -452,5 +452,5 @@ gSpecials:: @ 815FD60 def_special sub_80CB328 def_special sub_80CD154 def_special sub_80CD1B4 - def_special sub_8044838 + def_special CreateObedientEnemyMon gSpecialsEnd:: diff --git a/include/battle.h b/include/battle.h index 2e6d251c3..277f79c51 100644 --- a/include/battle.h +++ b/include/battle.h @@ -33,39 +33,6 @@ #define GET_BANK_SIDE(bank)((GetBattlerPosition(bank) & BIT_SIDE)) #define GET_BANK_SIDE2(bank)((GET_BANK_IDENTITY(bank) & BIT_SIDE)) -#define BATTLE_TYPE_DOUBLE 0x0001 -#define BATTLE_TYPE_LINK 0x0002 -#define BATTLE_TYPE_WILD 0x0004 -#define BATTLE_TYPE_TRAINER 0x0008 -#define BATTLE_TYPE_FIRST_BATTLE 0x0010 -#define BATTLE_TYPE_20 0x0020 -#define BATTLE_TYPE_MULTI 0x0040 -#define BATTLE_TYPE_SAFARI 0x0080 -#define BATTLE_TYPE_BATTLE_TOWER 0x0100 -#define BATTLE_TYPE_WALLY_TUTORIAL 0x0200 -#define BATTLE_TYPE_ROAMER 0x0400 -#define BATTLE_TYPE_EREADER_TRAINER 0x0800 -#define BATTLE_TYPE_KYOGRE_GROUDON 0x1000 -#define BATTLE_TYPE_LEGENDARY 0x2000 -#define BATTLE_TYPE_REGI 0x4000 -#define BATTLE_TYPE_TWO_OPPONENTS 0x8000 -#define BATTLE_TYPE_DOME 0x10000 // this is used in pokemon.c, but its clearly not the correct name for FR/LG. TODO: Fix these -#define BATTLE_TYPE_PALACE 0x20000 -#define BATTLE_TYPE_ARENA 0x40000 -#define BATTLE_TYPE_FACTORY 0x80000 -#define BATTLE_TYPE_x100000 0x100000 -#define BATTLE_TYPE_PYRAMID 0x200000 -#define BATTLE_TYPE_INGAME_PARTNER 0x400000 -#define BATTLE_TYPE_x800000 0x800000 -#define BATTLE_TYPE_RECORDED 0x1000000 -#define BATTLE_TYPE_x2000000 0x2000000 -#define BATTLE_TYPE_x4000000 0x4000000 -#define BATTLE_TYPE_SECRET_BASE 0x8000000 -#define BATTLE_TYPE_GROUDON 0x10000000 -#define BATTLE_TYPE_KYORGE 0x20000000 -#define BATTLE_TYPE_RAYQUAZA 0x40000000 -#define BATTLE_TYPE_x80000000 0x80000000 - #define TRAINER_OPPONENT_3FE 0x3FE #define TRAINER_OPPONENT_C00 0xC00 #define TRAINER_OPPONENT_800 0x800 @@ -984,5 +951,6 @@ extern u16 gBattlerPartyIndexes[MAX_BATTLERS_COUNT]; extern s32 gBattleMoveDamage; extern u8 gBattleOutcome; +extern u8 gBattleMonForms[MAX_BATTLERS_COUNT]; #endif // GUARD_BATTLE_H diff --git a/include/battle_2.h b/include/battle_2.h index 1f7a2304d..cb9247372 100644 --- a/include/battle_2.h +++ b/include/battle_2.h @@ -44,6 +44,7 @@ void RunBattleScriptCommands_PopCallbacksStack(void); void RunBattleScriptCommands(void); bool8 TryRunFromBattle(u8 bank); void sub_800FD9C(void); +void sub_80120C4(struct Sprite *); extern const u8 gStatusConditionString_PoisonJpn[8]; extern const u8 gStatusConditionString_SleepJpn[8]; diff --git a/include/battle_ai_script_commands.h b/include/battle_ai_script_commands.h index 5f8c4419b..3786d4a8c 100644 --- a/include/battle_ai_script_commands.h +++ b/include/battle_ai_script_commands.h @@ -3,6 +3,8 @@ #include "global.h" +extern u8 sBattler_AI; + void BattleAI_HandleItemUseBeforeAISetup(u8 defaultScoreMoves); void BattleAI_SetupAIData(u8 defaultScoreMoves); u8 BattleAI_ChooseMoveOrAction(void); diff --git a/include/battle_util.h b/include/battle_util.h index ed070720d..a062f0743 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -87,5 +87,6 @@ void HandleAction_RunBattleScript(void); u8 GetMoveTarget(u16 move, u8 useMoveTarget); u8 IsMonDisobedient(void); void MarkBufferBankForExecution(u8 battlerId); +void sub_80174B8(u8 battlerId); #endif // GUARD_BATTLE_UTIL_H diff --git a/include/constants/battle.h b/include/constants/battle.h index 074c0d0cd..3b765eede 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -59,7 +59,7 @@ #define BATTLE_TYPE_KYOGRE_GROUDON 0x1000 #define BATTLE_TYPE_LEGENDARY 0x2000 #define BATTLE_TYPE_REGI 0x4000 -#define BATTLE_TYPE_TWO_OPPONENTS 0x8000 +#define BATTLE_TYPE_GHOST 0x8000 #define BATTLE_TYPE_DOME 0x10000 #define BATTLE_TYPE_PALACE 0x20000 #define BATTLE_TYPE_ARENA 0x40000 diff --git a/include/data2.h b/include/data2.h index e383b1c9a..5601fc16c 100644 --- a/include/data2.h +++ b/include/data2.h @@ -18,5 +18,33 @@ extern const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1]; extern const u8 gMoveNames[][13]; extern const u8 gAbilityNames[][13]; extern const u8 gTypeNames[][7]; +extern u16 gUnknown_8251CB8[]; +extern u16 gUnknown_8251FEE[]; +extern u16 gUnknown_8252324[]; +extern u16 gUnknown_82539D4[]; +extern struct SpindaSpot gSpindaSpotGraphics[]; +extern s8 gNatureStatTable[][5]; +extern u32 gTMHMLearnsets[][2]; + +extern const struct CompressedSpritePalette gMonPaletteTable[]; +extern const struct CompressedSpritePalette gMonShinyPaletteTable[]; +extern const union AnimCmd *const *const gTrainerBackAnimsPtrTable[]; +extern const union AnimCmd *const *const gTrainerFrontAnimsPtrTable[]; + +extern const struct OamData gUnknown_824F010; +extern const struct OamData gUnknown_824F018; +extern const union AnimCmd *const gUnknown_82349BC[]; +extern const union AffineAnimCmd *const gUnknown_82348C8[]; +extern const union AffineAnimCmd *const gUnknown_8234944[]; +extern const struct SpriteFrameImage gUnknown_8234698[]; +extern const struct SpriteFrameImage gUnknown_82346B8[]; +extern const struct SpriteFrameImage gUnknown_82346D8[]; +extern const struct SpriteFrameImage gUnknown_82346F8[]; +extern const struct SpriteFrameImage gUnknown_8234718[]; +extern const struct SpriteFrameImage gUnknown_8234740[]; +extern const struct SpriteFrameImage gUnknown_8234768[]; +extern const struct SpriteFrameImage gUnknown_8234788[]; +extern const struct SpriteFrameImage gUnknown_82347A8[]; +extern const struct SpriteFrameImage gUnknown_82347C8[]; #endif // GUARD_DATA2_H diff --git a/include/field_specials.h b/include/field_specials.h index 0e4fdd787..a82cb20a2 100644 --- a/include/field_specials.h +++ b/include/field_specials.h @@ -11,5 +11,7 @@ void sub_80CCB68(void); void nullsub_60(void); void nullsub_61(void); u8 ContextNpcGetTextColor(void); +void set_unknown_box_id(u8); +u16 get_unknown_box_id(void); #endif // GUARD_FIELD_SPECIALS_H diff --git a/include/party_menu.h b/include/party_menu.h index 3b620c3b0..e4fc182e9 100644 --- a/include/party_menu.h +++ b/include/party_menu.h @@ -61,5 +61,6 @@ void sub_8126894(u8 taskId, TaskFunc followUpFunc); void sub_81279E0(void); void ItemUseCB_Medicine(u8 taskId, TaskFunc followUpFunc); u8 GetItemEffectType(u16 itemId); +u8 pokemon_order_func(u8); #endif // GUARD_PARTY_MENU_H diff --git a/include/pokemon.h b/include/pokemon.h index 558eedc67..e84778fa3 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -2,6 +2,7 @@ #define GUARD_POKEMON_H #include "global.h" +#include "sprite.h" #define MON_DATA_PERSONALITY 0 #define MON_DATA_OT_ID 1 @@ -545,30 +546,26 @@ void CreateMonWithNature(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, void CreateMonWithGenderNatureLetter(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 gender, u8 nature, u8 unownLetter); void CreateMaleMon(struct Pokemon *mon, u16 species, u8 level); void CreateMonWithIVsPersonality(struct Pokemon *mon, u16 species, u8 level, u32 ivs, u32 personality); -void CreateMonWithIVsOTID(struct Pokemon *mon, u16 species, u8 level, u8 *ivs, u32 otId); void CreateMonWithEVSpread(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 evSpread); -u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon); +void CreateBattleTowerMon(struct Pokemon *mon, struct BattleTowerPokemon *src); +void sub_803E23C(struct Pokemon *mon, struct BattleTowerPokemon *dest); void CalculateMonStats(struct Pokemon *mon); -u8 GetLevelFromMonExp(struct Pokemon *mon); +void BoxMonToMon(struct BoxPokemon *src, struct Pokemon *dest); u8 GetLevelFromBoxMonExp(struct BoxPokemon *boxMon); u16 GiveMoveToMon(struct Pokemon *mon, u16 move); -u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move); u16 GiveMoveToBattleMon(struct BattlePokemon *mon, u16 move); -void MonRestorePP(struct Pokemon *mon); void SetMonMoveSlot(struct Pokemon *mon, u16 move, u8 slot); void SetBattleMonMoveSlot(struct BattlePokemon *mon, u16 move, u8 slot); -void GiveMonInitialMoveset(struct Pokemon *mon); -void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon); +u16 MonTryLearningNewMove(struct Pokemon *mon, bool8 firstMove); void DeleteFirstMoveAndGiveMoveToMon(struct Pokemon *mon, u16 move); -void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move); -bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex); -bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex, u8 e); - +s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 sideStatus, u16 powerOverride, u8 typeOverride, u8 battlerIdAtk, u8 battlerIdDef); +u8 CountAliveMons(u8 a1); +u8 GetDefaultMoveTarget(u8 a1); u8 GetMonGender(struct Pokemon *mon); u8 GetBoxMonGender(struct BoxPokemon *boxMon); u8 GetGenderFromSpeciesAndPersonality(u16 species, u32 personality); -void EncryptBoxMon(struct BoxPokemon *boxMon); -void DecryptBoxMon(struct BoxPokemon *boxMon); +void SetMultiuseSpriteTemplateToPokemon(u16 speciesTag, u8 battlerPosition); +void SetMultiuseSpriteTemplateToTrainerBack(u16 trainerSpriteId, u8 battlerPosition); // These are full type signatures for GetMonData() and GetBoxMonData(), // but they are not used since some code erroneously omits the third arg. @@ -583,101 +580,81 @@ u32 GetMonData(); u32 GetBoxMonData(); #endif // IS_POKEMON_C -void SetMonData(struct Pokemon *mon, s32 field, const void *data); -void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *data); +void SetMonData(struct Pokemon *mon, s32 field, const void *dataArg); +void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg); void CopyMon(void *dest, void *src, size_t size); u8 GiveMonToPlayer(struct Pokemon *mon); -u8 SendMonToPC(struct Pokemon *mon); u8 CalculatePlayerPartyCount(void); u8 CalculateEnemyPartyCount(void); - +u8 GetMonsStateToDoubles(void); u8 GetAbilityBySpecies(u16 species, bool8 altAbility); u8 GetMonAbility(struct Pokemon *mon); -void CreateSecretBaseEnemyParty(struct SecretBaseRecord *secretBaseRecord); u8 GetSecretBaseTrainerPicIndex(void); u8 GetSecretBaseTrainerNameIndex(void); bool8 IsPlayerPartyAndPokemonStorageFull(void); -bool8 IsPokemonStorageFull(void); void GetSpeciesName(u8 *name, u16 species); u8 CalculatePPWithBonus(u16 move, u8 ppBonuses, u8 moveIndex); void RemoveMonPPBonus(struct Pokemon *mon, u8 moveIndex); void RemoveBattleMonPPBonus(struct BattlePokemon *mon, u8 moveIndex); -void CopyPlayerPartyMonToBattleData(u8 battleIndex, u8 partyIndex); - +bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex); +bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 moveIndex, u8 e); +bool8 PokemonUseItemEffects2(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 moveIndex, u8 e); +u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit); +const u8 *Battle_PrintStatBoosterEffectMessage(u16 itemId); u8 GetNature(struct Pokemon *mon); -u8 GetNatureFromPersonality(u32 personality); - -u16 nature_stat_mod(u8 nature, u16 n, u8 statIndex); - -void MonRestorePP(struct Pokemon *); -void BoxMonRestorePP(struct BoxPokemon *); - +u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem); u16 NationalPokedexNumToSpecies(u16 nationalNum); -u16 NationalToHoennOrder(u16); -u16 SpeciesToNationalPokedexNum(u16); -u16 HoennToNationalOrder(u16); +u16 SpeciesToNationalPokedexNum(u16 species); +u16 HoennToNationalOrder(u16 hoennNum); u16 SpeciesToCryId(u16 species); -void DrawSpindaSpots(u16, u32, u8 *, u8); -void AdjustFriendship(struct Pokemon *, u8); -u8 CheckPartyHasHadPokerus(struct Pokemon *, u8); -void UpdatePartyPokerusTime(u16); -u32 CanMonLearnTMHM(struct Pokemon *, u8); -u32 CanSpeciesLearnTMHM(u16 species, u8 tm); +void DrawSpindaSpots(u16 species, u32 personality, u8 *dest, u8 a4); +void EvolutionRenameMon(struct Pokemon *mon, u16 oldSpecies, u16 newSpecies); +bool8 sub_80435E0(void); +bool8 GetLinkTrainerFlankId(u8 linkPlayerId); +s32 GetBankMultiplayerId(u16 a1); +u8 GetTrainerEncounterMusicId(u16 trainer); +void AdjustFriendship(struct Pokemon *mon, u8 event); +void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies); +u16 GetMonEVCount(struct Pokemon *mon); +void sub_8043A68(void); +u8 CheckPartyPokerus(struct Pokemon *party, u8 selection); +u8 CheckPartyHasHadPokerus(struct Pokemon *party, u8 selection); +void sub_8043B40(void); +bool8 TryIncrementMonLevel(struct Pokemon *mon); +u32 CanMonLearnTMHM(struct Pokemon *mon, u8 tm); u8 GetMoveRelearnerMoves(struct Pokemon *mon, u16 *moves); +u8 GetLevelUpMovesBySpecies(u16 species, u16 *moves); +u8 GetNumberOfRelearnableMoves(struct Pokemon *mon); +u16 sub_8043F90(u16 species); void ClearBattleMonForms(void); +void PlayBattleBGM(void); +void PlayMapChosenOrBattleBGM(u16 songId); const u32 *GetMonFrontSpritePal(struct Pokemon *mon); -const u32 *GetFrontSpritePalFromSpeciesAndPersonality(u16, u32, u32); -const struct CompressedSpritePalette *sub_80409C8(u16, u32, u32); -bool8 IsOtherTrainer(u32, u8 *); -void SetWildMonHeldItem(void); -u16 GetMonEVCount(struct Pokemon *); - -const struct CompressedSpritePalette *sub_806E794(struct Pokemon *mon); +const u32 *GetFrontSpritePalFromSpeciesAndPersonality(u16 species, u32 otId, u32 personality); const struct CompressedSpritePalette *GetMonSpritePalStruct(struct Pokemon *mon); const struct CompressedSpritePalette *GetMonSpritePalStructFromOtIdPersonality(u16 species, u32 otId , u32 personality); bool32 IsHMMove2(u16 move); bool8 IsPokeSpriteNotFlipped(u16 species); -bool8 IsMonShiny(struct Pokemon *mon); -bool8 IsShinyOtIdPersonality(u32 otId, u32 personality); - -void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies); +s8 GetFlavorRelationByPersonality(u32 personality, u8 flavor); bool8 IsTradedMon(struct Pokemon *mon); +bool8 IsOtherTrainer(u32 otId, u8 *otName); +void MonRestorePP(struct Pokemon *mon); +void BoxMonRestorePP(struct BoxPokemon *boxMon); +void sub_8044348(void); +void SetWildMonHeldItem(void); +bool8 IsMonShiny(struct Pokemon *mon); +u8 *GetTrainerPartnerName(void); +u8 GetPlayerPartyHighestLevel(void); +u16 FacilityClassToPicIndex(u16 facilityClass); +bool8 sub_804455C(u8 caseId, u8 battlerId); +void SetDeoxysStats(void); +u16 sub_80447AC(void); +u16 sub_80447F0(void); +void CreateObedientEnemyMon(void); void HandleSetPokedexFlag(u16 nationalNum, u8 caseId, u32 personality); -s32 GetBankMultiplayerId(u16 a1); -bool16 sub_806D82C(u8 id); -u16 MonTryLearningNewMove(struct Pokemon* mon, bool8); -void sub_8068AA4(void); // sets stats for deoxys -bool8 HasTwoFramesAnimation(u16 species); -u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem); -void RandomlyGivePartyPokerus(struct Pokemon *party); -u8 CheckPartyPokerus(struct Pokemon *party, u8 selection); -u8 CheckPartyHasHadPokerus(struct Pokemon *party, u8 selection); -void UpdatePartyPokerusTime(u16 days); -void PartySpreadPokerus(struct Pokemon *party); -s8 GetMonFlavorRelation(struct Pokemon *mon, u8 a2); -s8 GetFlavorRelationByPersonality(u32 personality, u8 a2); -u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit); -u8 GetDefaultMoveTarget(u8 atkBank); -u16 PlayerGenderToFrontTrainerPicId(u8 playerGender); -void sub_806A1C0(u16 arg0, u8 bankIdentity); -void sub_806A12C(u16 trainerSpriteId, u8 bankIdentity); -u8 GetSecretBaseTrainerPicIndex(void); -bool8 TryIncrementMonLevel(struct Pokemon *mon); -void BoxMonToMon(struct BoxPokemon *srcMon, struct Pokemon *dstMon); -u8 GetLevelUpMovesBySpecies(u16 species, u16 *moves); -bool8 HealStatusConditions(struct Pokemon *mon, u32 battlePartyId, u32 healMask, u8 battlerId); - -#include "sprite.h" - -void DoMonFrontSpriteAnimation(struct Sprite* sprite, u16 species, bool8 noCry, u8 arg3); -void BattleAnimateFrontSprite(struct Sprite* sprite, u16 species, bool8 noCry, u8 arg3); -void BattleAnimateBackSprite(struct Sprite* sprite, u16 species); - -void PlayMapChosenOrBattleBGM(u16 songId); -u8 GetMonsStateToDoubles(void); -void sub_803E0A4(struct Pokemon *mon, struct BattleTowerPokemon *src); -void SetMultiuseSpriteTemplateToPokemon(u16 trainerSpriteId, u8 battlerPosition); - -const u8 * Battle_PrintStatBoosterEffectMessage(u16 itemId); +bool8 CheckBattleTypeGhost(struct Pokemon *mon, u8 bank); +struct OakSpeechNidoranFStruct *OakSpeechNidoranFSetup(u8 battlePosition, bool8 enable); +void OakSpeechNidoranFFreeResources(void); +void *OakSpeechNidoranFGetBuffer(u8 bufferId); #endif // GUARD_POKEMON_H diff --git a/include/pokemon_3.h b/include/pokemon_3.h deleted file mode 100644 index e65bc85fc..000000000 --- a/include/pokemon_3.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef GUARD_POKEMON_3_H -#define GUARD_POKEMON_3_H - -#include "global.h" - -const u8* GetTrainerClassNameFromId(u16 trainerId); -const u8* GetTrainerNameFromId(u16 trainerId); -void * SetUpMonSpriteManagerMaybe(u8, u8); -void sub_8044D80(void); -void * sub_8044E00(u8 buffId); - -#endif // GUARD_POKEMON_3_H diff --git a/include/pokemon_storage_system.h b/include/pokemon_storage_system.h index f2fbe85a7..8ab9e5f0e 100644 --- a/include/pokemon_storage_system.h +++ b/include/pokemon_storage_system.h @@ -14,5 +14,6 @@ u32 GetBoxMonDataFromAnyBox(u8 boxId, u8 monPosition, u32 request); void sub_808BCB4(u8 boxId, u8 monPosition); u8 * GetBoxNamePtr(u8 boxId); void sub_808CE60(void); +u8 StorageGetCurrentBox(void); #endif // GUARD_POKEMON_STORAGE_SYSTEM_H diff --git a/include/strings.h b/include/strings.h index 8fb15be76..70d30b230 100644 --- a/include/strings.h +++ b/include/strings.h @@ -177,6 +177,17 @@ extern const u8 gUnknown_84166A7[]; extern const u8 gUnknown_84169DC[]; extern const u8 gUnknown_841623D[]; extern const u8 gUnknown_84162BD[]; +extern const u8 gUnknown_841D148[]; + +// pokemon.c +extern const u8 BattleText_Rose[]; +extern const u8 BattleText_UnknownString3[]; +extern const u8 BattleText_GetPumped[]; +extern const u8 BattleText_MistShroud[]; +extern const u8 gText_EggNickname[]; +extern const u8 gText_BadEgg[]; +extern const u8 gText_PkmnsXPreventsSwitching[]; +extern u8 *gUnknown_83FD5D0[]; // diploma extern const u8 gUnknown_841B60E[]; diff --git a/ld_script.txt b/ld_script.txt index 6dddecf0c..d891908ca 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -76,7 +76,6 @@ SECTIONS { asm/battle_ai_switch_items.o(.text); asm/battle_controller_link_opponent.o(.text); src/pokemon.o(.text); - asm/pokemon_3.o(.text); src/trig.o(.text); src/random.o(.text); src/util.o(.text); @@ -381,6 +380,7 @@ SECTIONS { src/bg_regs.o(.rodata); src/string_util.o(.rodata); data/data.o(.rodata); + src/pokemon.o(.rodata); src/trig.o(.rodata); src/util.o(.rodata); src/daycare.o(.rodata); diff --git a/src/oak_speech.c b/src/oak_speech.c index 26736604e..c00335136 100644 --- a/src/oak_speech.c +++ b/src/oak_speech.c @@ -14,7 +14,7 @@ #include "menu.h" #include "help_system.h" #include "new_menu_helpers.h" -#include "pokemon_3.h" +#include "pokemon.h" #include "sound.h" #include "event_scripts.h" #include "scanline_effect.h" @@ -500,7 +500,7 @@ static void Task_OaksSpeech1(u8 taskId) break; case 1: sOakSpeechResources = AllocZeroed(sizeof(*sOakSpeechResources)); - SetUpMonSpriteManagerMaybe(1, 1); + OakSpeechNidoranFSetup(1, 1); break; case 2: SetGpuReg(REG_OFFSET_WIN0H, 0); @@ -1513,7 +1513,7 @@ static void Task_OakSpeech41(u8 taskId) static void Task_OakSpeech42(u8 taskId) { FreeAllWindowBuffers(); - sub_8044D80(); + OakSpeechNidoranFFreeResources(); Free(sOakSpeechResources); sOakSpeechResources = NULL; gTextFlags.canABSpeedUpPrint = FALSE; @@ -1612,7 +1612,7 @@ static void CreateNidoranFSprite(u8 taskId) { u8 spriteId; - DecompressPicFromTable(gUnknown_8235194, sub_8044E00(0), SPECIES_NIDORAN_F); + DecompressPicFromTable(gUnknown_8235194, OakSpeechNidoranFGetBuffer(0), SPECIES_NIDORAN_F); LoadCompressedSpritePaletteUsingHeap(&gUnknown_82373F4); SetMultiuseSpriteTemplateToPokemon(SPECIES_NIDORAN_F, 0); spriteId = CreateSprite(&gMultiuseSpriteTemplate, 0x60, 0x60, 1); diff --git a/src/pokemon.c b/src/pokemon.c index b9b5e6d76..f4150d5b6 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -5,8 +5,10 @@ #include "random.h" #include "main.h" #include "text.h" +#include "data2.h" #include "string_util.h" #include "battle.h" +#include "battle_2.h" #include "item.h" #include "event_data.h" #include "util.h" @@ -16,9 +18,17 @@ #include "battle_controllers.h" #include "evolution_scene.h" #include "battle_message.h" +#include "battle_util.h" +#include "battle_ai_script_commands.h" #include "link.h" #include "m4a.h" #include "sound.h" +#include "pokedex.h" +#include "strings.h" +#include "malloc.h" +#include "overworld.h" +#include "party_menu.h" +#include "field_specials.h" #include "constants/items.h" #include "constants/species.h" #include "constants/pokemon.h" @@ -34,63 +44,304 @@ // Extracts the lower 16 bits of a 32-bit number #define LOHALF(n) ((n) & 0xFFFF) -// TODO: what is this -struct UnkStruct20244F4 +struct OakSpeechNidoranFStruct { - u8 unk0:4; - u8 unk0_2:4; - u8 filler1[0xF]; - struct SpriteTemplate *unk10; + u8 spriteCount:4; + u8 battlePosition:4; + u8 frameCount; + u8 enable; + bool8 enable2; + u32 sizePerSprite; + u8 *dataBuffer; + u8 **bufferPtrs; + struct SpriteTemplate *templates; + struct SpriteFrameImage *frameImages; }; -// External symbols -extern struct UnkStruct20244F4 *gUnknown_20244F4; -extern struct SpriteTemplate gUnknown_825DEF0[]; -extern struct SpriteTemplate gUnknown_825DF50[]; -extern const union AnimCmd *const *const gTrainerBackAnimsPtrTable[]; -extern struct SpriteTemplate gUnknown_825DEF0[]; -extern const union AnimCmd *const *const gTrainerFrontAnimsPtrTable[]; -extern const union AnimCmd *const gUnknown_82349BC[]; -extern const u8 gUnknown_825DEA1[]; -extern const u8 gPPUpWriteMasks[]; -extern u8 *gUnknown_83FD5D0[]; -extern const u8 gUnknown_825DFF0[]; -extern const u8 gText_EggNickname[]; -extern const u8 gText_BadEgg[]; -extern const u8 BattleText_Rose[]; -extern const u8 BattleText_UnknownString3[]; -extern const u8 BattleText_GetPumped[]; -extern const u8 BattleText_MistShroud[]; -extern const u8 gText_PkmnsXPreventsSwitching[]; -extern const u8 sHoldEffectToType[][2]; +// TODO: move sLearningMoveTableID, gPlayerPartyCount, gEnemyPartyCount, +// gEnemyParty, gPlayerParty here after resolving symbol ref in between. extern u8 sLearningMoveTableID; -extern const u8 sSecretBaseFacilityClasses[2][5]; -extern u16 gUnknown_8251CB8[]; -extern u16 gUnknown_8251FEE[]; -extern u16 gUnknown_8252324[]; -extern u16 gUnknown_82539D4[]; -extern struct SpindaSpot gSpindaSpotGraphics[]; -extern s8 gNatureStatTable[][5]; -extern const s8 sFriendshipEventDeltas[][3]; -extern u32 gTMHMLearnsets[][2]; -extern u8 gBattleMonForms[4]; -extern const struct CompressedSpritePalette gMonPaletteTable[]; -extern const struct CompressedSpritePalette gMonShinyPaletteTable[]; -extern const u16 sHMMoves[]; -extern s8 gPokeblockFlavorCompatibilityTable[]; - -// External functions -extern u8 GetCurrentRegionMapSectionId(void); // overworld -extern const struct BattleMove gBattleMoves[]; -extern u8 sBattler_AI; // battle_ai -extern void set_unknown_box_id(u8); // field_specials -extern u8 pokemon_order_func(u8); -extern u16 get_unknown_box_id(void); // field_specials -extern u8 StorageGetCurrentBox(void); // pokemon_storage_system -extern void sub_80174B8(u8 battlerId); - -union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 substructType); -s32 GetDeoxysStat(struct Pokemon *mon, s32 statId); + +EWRAM_DATA struct SpriteTemplate gMultiuseSpriteTemplate = {0}; +static EWRAM_DATA struct OakSpeechNidoranFStruct *sOakSpeechNidoranResources = NULL; + +static union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 substructType); +static u16 GetDeoxysStat(struct Pokemon *mon, s32 statId); +static bool8 IsShinyOtIdPersonality(u32 otId, u32 personality); +static u16 ModifyStatByNature(u8 nature, u16 n, u8 statIndex); +static u8 GetNatureFromPersonality(u32 personality); +static bool8 sub_8042BE8(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId); +static bool8 HealStatusConditions(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId); +static bool8 IsPokemonStorageFull(void); +static u8 SendMonToPC(struct Pokemon* mon); +static void EncryptBoxMon(struct BoxPokemon *boxMon); +static void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move); +static void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon); +static u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move); +static u8 GetLevelFromMonExp(struct Pokemon *mon); +static u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon); + +const s8 gPokeblockFlavorCompatibilityTable[] = +{ + // Cool, Beauty, Cute, Smart, Tough + 0, 0, 0, 0, 0, // Hardy + 1, 0, 0, 0, -1, // Lonely + 1, 0, -1, 0, 0, // Brave + 1, -1, 0, 0, 0, // Adamant + 1, 0, 0, -1, 0, // Naughty + -1, 0, 0, 0, 1, // Bold + 0, 0, 0, 0, 0, // Docile + 0, 0, -1, 0, 1, // Relaxed + 0, -1, 0, 0, 1, // Impish + 0, 0, 0, -1, 1, // Lax + -1, 0, 1, 0, 0, // Timid + 0, 0, 1, 0, -1, // Hasty + 0, 0, 0, 0, 0, // Serious + 0, -1, 1, 0, 0, // Jolly + 0, 0, 1, -1, 0, // Naive + -1, 1, 0, 0, 0, // Modest + 0, 1, 0, 0, -1, // Mild + 0, 1, -1, 0, 0, // Quiet + 0, 0, 0, 0, 0, // Bashful + 0, 1, 0, -1, 0, // Rash + -1, 0, 0, 1, 0, // Calm + 0, 0, 0, 1, -1, // Gentle + 0, 0, -1, 1, 0, // Sassy + 0, -1, 0, 1, 0, // Careful + 0, 0, 0, 0, 0 // Quirky +}; + +const u8 gPPUpGetMask[] = { 0x03, 0x0c, 0x30, 0xc0 }; // Masks for getting PP Up count, also PP Max values + +const u8 gPPUpSetMask[] = { 0xfc, 0xf3, 0xcf, 0x3f }; // Masks for setting PP Up count + +const u8 gPPUpAddMask[] = { 0x01, 0x04, 0x10, 0x40 }; // Values added to PP Up count + +const u8 gStatStageRatios[][2] = +{ + { 10, 40 }, + { 10, 35 }, + { 10, 30 }, + { 10, 25 }, + { 10, 20 }, + { 10, 15 }, + { 10, 10 }, + { 15, 10 }, + { 20, 10 }, + { 25, 10 }, + { 30, 10 }, + { 35, 10 }, + { 40, 10 }, + { 138, 174 }, + { 108, 120 }, +}; + +static const u8 sFiller = _(""); + +static const u8 sHoldEffectToType[][2] = +{ + {HOLD_EFFECT_BUG_POWER, TYPE_BUG}, + {HOLD_EFFECT_STEEL_POWER, TYPE_STEEL}, + {HOLD_EFFECT_GROUND_POWER, TYPE_GROUND}, + {HOLD_EFFECT_ROCK_POWER, TYPE_ROCK}, + {HOLD_EFFECT_GRASS_POWER, TYPE_GRASS}, + {HOLD_EFFECT_DARK_POWER, TYPE_DARK}, + {HOLD_EFFECT_FIGHTING_POWER, TYPE_FIGHTING}, + {HOLD_EFFECT_ELECTRIC_POWER, TYPE_ELECTRIC}, + {HOLD_EFFECT_WATER_POWER, TYPE_WATER}, + {HOLD_EFFECT_FLYING_POWER, TYPE_FLYING}, + {HOLD_EFFECT_POISON_POWER, TYPE_POISON}, + {HOLD_EFFECT_ICE_POWER, TYPE_ICE}, + {HOLD_EFFECT_GHOST_POWER, TYPE_GHOST}, + {HOLD_EFFECT_PSYCHIC_POWER, TYPE_PSYCHIC}, + {HOLD_EFFECT_FIRE_POWER, TYPE_FIRE}, + {HOLD_EFFECT_DRAGON_POWER, TYPE_DRAGON}, + {HOLD_EFFECT_NORMAL_POWER, TYPE_NORMAL}, +}; + +const struct SpriteTemplate gUnknown_825DEF0[] = +{ + { + .tileTag = SPRITE_INVALID_TAG, + .paletteTag = 0, + .oam = &gUnknown_824F018, + .anims = NULL, + .images = gUnknown_8234698, + .affineAnims = gUnknown_82348C8, + .callback = sub_80120C4, + }, + { + .tileTag = SPRITE_INVALID_TAG, + .paletteTag = 0, + .oam = &gUnknown_824F010, + .anims = NULL, + .images = gUnknown_82346B8, + .affineAnims = gUnknown_8234944, + .callback = oac_poke_opponent, + }, + { + .tileTag = SPRITE_INVALID_TAG, + .paletteTag = 0, + .oam = &gUnknown_824F018, + .anims = NULL, + .images = gUnknown_82346D8, + .affineAnims = gUnknown_82348C8, + .callback = sub_80120C4, + }, + { + .tileTag = SPRITE_INVALID_TAG, + .paletteTag = 0, + .oam = &gUnknown_824F010, + .anims = NULL, + .images = gUnknown_82346F8, + .affineAnims = gUnknown_8234944, + .callback = oac_poke_opponent, + }, +}; + +const struct SpriteTemplate gUnknown_825DF50[] = +{ + { + .tileTag = SPRITE_INVALID_TAG, + .paletteTag = 0, + .oam = &gUnknown_824F018, + .anims = NULL, + .images = gUnknown_8234718, + .affineAnims = gUnknown_82348C8, + .callback = sub_80120C4, + }, + { + .tileTag = SPRITE_INVALID_TAG, + .paletteTag = 0, + .oam = &gUnknown_824F018, + .anims = NULL, + .images = gUnknown_8234740, + .affineAnims = gUnknown_82348C8, + .callback = sub_80120C4, + }, + { + .tileTag = SPRITE_INVALID_TAG, + .paletteTag = 0, + .oam = &gUnknown_824F018, + .anims = NULL, + .images = gUnknown_82347A8, + .affineAnims = gUnknown_82348C8, + .callback = sub_80120C4, + }, + { + .tileTag = SPRITE_INVALID_TAG, + .paletteTag = 0, + .oam = &gUnknown_824F018, + .anims = NULL, + .images = gUnknown_82347C8, + .affineAnims = gUnknown_82348C8, + .callback = sub_80120C4, + }, + { + .tileTag = SPRITE_INVALID_TAG, + .paletteTag = 0, + .oam = &gUnknown_824F018, + .anims = NULL, + .images = gUnknown_8234768, + .affineAnims = gUnknown_82348C8, + .callback = sub_80120C4, + }, + { + .tileTag = SPRITE_INVALID_TAG, + .paletteTag = 0, + .oam = &gUnknown_824F018, + .anims = NULL, + .images = gUnknown_8234788, + .affineAnims = gUnknown_82348C8, + .callback = sub_80120C4, + }, +}; + +static const u8 sSecretBaseFacilityClasses[][5] = +{ + { 0x58, 0x58, 0x58, 0x58, 0x58 }, + { 0x58, 0x58, 0x58, 0x58, 0x58 }, +}; + +static const u8 sGetMonDataEVConstants[] = +{ + MON_DATA_HP_EV, + MON_DATA_ATK_EV, + MON_DATA_DEF_EV, + MON_DATA_SPEED_EV, + MON_DATA_SPDEF_EV, + MON_DATA_SPATK_EV +}; + +static const u8 gUnknown_825DFF0[] = +{ + STAT_ATK, STAT_ATK, STAT_SPEED, STAT_DEF, STAT_SPATK, STAT_ACC +}; + +static const s8 sFriendshipEventDeltas[][3] = +{ + { 5, 3, 2 }, + { 5, 3, 2 }, + { 1, 1, 0 }, + { 3, 2, 1 }, + { 1, 1, 0 }, + { 1, 1, 1 }, + { 3, 3, 3 }, + {-1, -1, -1 }, + {-5, -5, -10 }, + {-5, -5, -10 }, +}; + +static const u16 sHMMoves[] = +{ + MOVE_CUT, MOVE_FLY, MOVE_SURF, MOVE_STRENGTH, MOVE_FLASH, + MOVE_ROCK_SMASH, MOVE_WATERFALL, MOVE_DIVE, 0xFFFF +}; + +static const u16 sDeoxysBaseStats[] = +{ + 50, // Hp + 180, // Attack + 20, // Defense + 150, // Speed + 180, // Sp.Attack + 20, // Sp.Defense +}; + +const u16 gLinkPlayerFacilityClasses[] = +{ + 0x74, 0x6F, 0x5C, 0x58, 0x6A, + 0x59, 0x6D, 0x6C, 0x75, 0x7D, + 0x5D, 0x5A, 0x89, 0x8A, 0x8C, + 0x68, 0x0, +}; + +const static struct OamData sOakSpeechNidoranFDummyOamData = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, +}; + +const struct SpriteTemplate sOakSpeechNidoranFDummyTemplate = +{ + .tileTag = SPRITE_INVALID_TAG, + .paletteTag = SPRITE_INVALID_TAG, + .oam = &sOakSpeechNidoranFDummyOamData, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; // code void ZeroBoxMonData(struct BoxPokemon *boxMon) @@ -307,7 +558,7 @@ void CreateMonWithIVsPersonality(struct Pokemon *mon, u16 species, u8 level, u32 CalculateMonStats(mon); } -void CreateMonWithIVsOTID(struct Pokemon *mon, u16 species, u8 level, u8 *ivs, u32 otId) +static void CreateMonWithIVsOTID(struct Pokemon *mon, u16 species, u8 level, u8 *ivs, u32 otId) { CreateMon(mon, species, level, 0, 0, 0, OT_ID_PRESET, otId); SetMonData(mon, MON_DATA_HP_IV, &ivs[0]); @@ -351,7 +602,7 @@ void CreateMonWithEVSpread(struct Pokemon *mon, u16 species, u8 level, u8 fixedI CalculateMonStats(mon); } -void sub_803E0A4(struct Pokemon *mon, struct BattleTowerPokemon *src) +void CreateBattleTowerMon(struct Pokemon *mon, struct BattleTowerPokemon *src) { s32 i; u8 value; @@ -402,7 +653,7 @@ void sub_803E0A4(struct Pokemon *mon, struct BattleTowerPokemon *src) CalculateMonStats(mon); } -void CreateObedientMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId) +static void CreateObedientMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId) { bool32 obedient = TRUE; @@ -447,7 +698,7 @@ void sub_803E23C(struct Pokemon *mon, struct BattleTowerPokemon *dest) GetMonData(mon, MON_DATA_NICKNAME, dest->nickname); } -u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon) +static u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon) { u16 checksum = 0; union PokemonSubstruct *substruct0 = GetSubstruct(boxMon, boxMon->personality, 0); @@ -476,7 +727,7 @@ u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon) u8 baseStat = gBaseStats[species].base; \ s32 n = (((2 * baseStat + iv + ev / 4) * level) / 100) + 5; \ u8 nature = GetNature(mon); \ - n = nature_stat_mod(nature, n, statIndex); \ + n = ModifyStatByNature(nature, n, statIndex); \ SetMonData(mon, field, &n); \ } @@ -556,7 +807,7 @@ void BoxMonToMon(struct BoxPokemon *src, struct Pokemon *dest) CalculateMonStats(dest); } -u8 GetLevelFromMonExp(struct Pokemon *mon) +static u8 GetLevelFromMonExp(struct Pokemon *mon) { u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); u32 exp = GetMonData(mon, MON_DATA_EXP, NULL); @@ -585,7 +836,7 @@ u16 GiveMoveToMon(struct Pokemon *mon, u16 move) return GiveMoveToBoxMon(&mon->box, move); } -u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move) +static u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move) { s32 i; for (i = 0; i < 4; i++) @@ -632,7 +883,7 @@ void SetBattleMonMoveSlot(struct BattlePokemon *mon, u16 move, u8 slot) mon->pp[slot] = gBattleMoves[move].pp; } -void GiveMonInitialMoveset(struct Pokemon *mon) +static void GiveMonInitialMoveset(struct Pokemon *mon) { GiveBoxMonInitialMoveset(&mon->box); } @@ -640,7 +891,7 @@ void GiveMonInitialMoveset(struct Pokemon *mon) // TODO: make level_up_learnsets.h in src/data and move this to there. #define LEVEL_UP_END 0xffff -void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon) +static void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon) { u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL); s32 level = GetLevelFromBoxMonExp(boxMon); @@ -722,7 +973,7 @@ void DeleteFirstMoveAndGiveMoveToMon(struct Pokemon *mon, u16 move) SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonuses); } -void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move) +static void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move) { s32 i; u16 moves[4]; @@ -1122,7 +1373,7 @@ u8 GetGenderFromSpeciesAndPersonality(u16 species, u32 personality) return MON_MALE; } -void SetMultiuseSpriteTemplateToPokemon(u16 trainerSpriteId, u8 battlerPosition) +void SetMultiuseSpriteTemplateToPokemon(u16 speciesTag, u8 battlerPosition) { if(gMonSpritesGfxPtr != NULL) { @@ -1133,12 +1384,12 @@ void SetMultiuseSpriteTemplateToPokemon(u16 trainerSpriteId, u8 battlerPosition) } else { - if(gUnknown_20244F4) + if(sOakSpeechNidoranResources) { - if(battlerPosition >= (s8)gUnknown_20244F4->unk0_2) // why a cast?!? changing the unk0_2 type to s8 causes extra shifts, but a cast is the correct fix. why, compiler? + if(battlerPosition >= (s8)sOakSpeechNidoranResources->battlePosition) // why a cast?!? changing the unk0_2 type to s8 causes extra shifts, but a cast is the correct fix. why, compiler? battlerPosition = 0; - gMultiuseSpriteTemplate = gUnknown_20244F4->unk10[battlerPosition]; + gMultiuseSpriteTemplate = sOakSpeechNidoranResources->templates[battlerPosition]; } else { @@ -1148,7 +1399,7 @@ void SetMultiuseSpriteTemplateToPokemon(u16 trainerSpriteId, u8 battlerPosition) gMultiuseSpriteTemplate = gUnknown_825DEF0[battlerPosition]; } } - gMultiuseSpriteTemplate.paletteTag = trainerSpriteId; + gMultiuseSpriteTemplate.paletteTag = speciesTag; gMultiuseSpriteTemplate.anims = gUnknown_82349BC; } @@ -1170,7 +1421,7 @@ void SetMultiuseSpriteTemplateToTrainerBack(u16 trainerSpriteId, u8 battlerPosit } } -void EncryptBoxMon(struct BoxPokemon *boxMon) +static void EncryptBoxMon(struct BoxPokemon *boxMon) { u32 i; for (i = 0; i < 12; i++) @@ -1180,7 +1431,7 @@ void EncryptBoxMon(struct BoxPokemon *boxMon) } } -void DecryptBoxMon(struct BoxPokemon *boxMon) +static void DecryptBoxMon(struct BoxPokemon *boxMon) { u32 i; for (i = 0; i < 12; i++) @@ -1236,7 +1487,7 @@ case n: \ break; \ } \ -union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 substructType) +static union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 substructType) { union PokemonSubstruct *substruct = NULL; @@ -1290,27 +1541,27 @@ u32 GetMonData(struct Pokemon *mon, s32 field, u8* data) ret = mon->maxHP; break; case MON_DATA_ATK: - ret = (u16)GetDeoxysStat(mon, STAT_ATK); + ret = GetDeoxysStat(mon, STAT_ATK); if (!ret) ret = mon->attack; break; case MON_DATA_DEF: - ret = (u16)GetDeoxysStat(mon, STAT_DEF); + ret = GetDeoxysStat(mon, STAT_DEF); if (!ret) ret = mon->defense; break; case MON_DATA_SPEED: - ret = (u16)GetDeoxysStat(mon, STAT_SPEED); + ret = GetDeoxysStat(mon, STAT_SPEED); if (!ret) ret = mon->speed; break; case MON_DATA_SPATK: - ret = (u16)GetDeoxysStat(mon, STAT_SPATK); + ret = GetDeoxysStat(mon, STAT_SPATK); if (!ret) ret = mon->spAttack; break; case MON_DATA_SPDEF: - ret = (u16)GetDeoxysStat(mon, STAT_SPDEF); + ret = GetDeoxysStat(mon, STAT_SPDEF); if (!ret) ret = mon->spDefense; break; @@ -2065,7 +2316,7 @@ u8 GiveMonToPlayer(struct Pokemon *mon) return MON_GIVEN_TO_PARTY; } -u8 SendMonToPC(struct Pokemon* mon) +static u8 SendMonToPC(struct Pokemon* mon) { s32 boxNo, boxPos; @@ -2165,7 +2416,7 @@ u8 GetMonAbility(struct Pokemon *mon) return GetAbilityBySpecies(species, altAbility); } -void CreateSecretBaseEnemyParty(struct SecretBaseRecord *secretBaseRecord) +static void CreateSecretBaseEnemyParty(struct SecretBaseRecord *secretBaseRecord) { s32 i, j; @@ -2224,7 +2475,7 @@ bool8 IsPlayerPartyAndPokemonStorageFull(void) return IsPokemonStorageFull(); } -bool8 IsPokemonStorageFull(void) +static bool8 IsPokemonStorageFull(void) { s32 i, j; @@ -2258,22 +2509,22 @@ void GetSpeciesName(u8 *name, u16 species) u8 CalculatePPWithBonus(u16 move, u8 ppBonuses, u8 moveIndex) { u8 basePP = gBattleMoves[move].pp; - return basePP + ((basePP * 20 * ((gUnknown_825DEA1[moveIndex] & ppBonuses) >> (2 * moveIndex))) / 100); + return basePP + ((basePP * 20 * ((gPPUpGetMask[moveIndex] & ppBonuses) >> (2 * moveIndex))) / 100); } void RemoveMonPPBonus(struct Pokemon *mon, u8 moveIndex) { u8 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL); - ppBonuses &= gPPUpWriteMasks[moveIndex]; + ppBonuses &= gPPUpSetMask[moveIndex]; SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonuses); } void RemoveBattleMonPPBonus(struct BattlePokemon *mon, u8 moveIndex) { - mon->ppBonuses &= gPPUpWriteMasks[moveIndex]; + mon->ppBonuses &= gPPUpSetMask[moveIndex]; } -void CopyPlayerPartyMonToBattleData(u8 battlerId, u8 partyIndex) +static void CopyPlayerPartyMonToBattleData(u8 battlerId, u8 partyIndex) { u16* hpSwitchout; s32 i; @@ -2333,10 +2584,6 @@ bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 item, u8 partyIndex, return PokemonUseItemEffects(mon, item, partyIndex, moveIndex, 0); } -extern const u8 gUnknown_825DEA1[]; -extern const u8 gUnknown_825DEA9[]; -extern const u8 sGetMonDataEVConstants[]; - bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 moveIndex, u8 e) { u32 data; @@ -2512,11 +2759,11 @@ bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 mo if (r10 & 0x20) { r10 &= ~0x20; - data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_825DEA1[moveIndex]) >> (moveIndex * 2); + data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2); sp28 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex); if (data < 3 && sp28 > 4) { - data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) + gUnknown_825DEA9[moveIndex]; + data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) + gPPUpAddMask[moveIndex]; SetMonData(pkmn, MON_DATA_PP_BONUSES, &data); data = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - sp28; @@ -2741,13 +2988,13 @@ bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 mo } break; case 4: - data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_825DEA1[moveIndex]) >> (moveIndex * 2); + data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2); if (data < 3) { r4 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex); data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL); - data &= gPPUpWriteMasks[moveIndex]; - data += gUnknown_825DEA9[moveIndex] * 3; + data &= gPPUpSetMask[moveIndex]; + data += gPPUpAddMask[moveIndex] * 3; SetMonData(pkmn, MON_DATA_PP_BONUSES, &data); data = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - r4; @@ -2840,7 +3087,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 mo return retVal; } -bool8 HealStatusConditions(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId) +static bool8 HealStatusConditions(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId) { u32 status = GetMonData(mon, MON_DATA_STATUS, 0); @@ -2858,8 +3105,6 @@ bool8 HealStatusConditions(struct Pokemon *mon, u32 unused, u32 healMask, u8 bat } } -extern bool8 sub_8042BE8(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId); - #ifdef NONMATCHING /* * This is nonmatching due to the compiler's insistence on avoiding the u8 cast @@ -3047,11 +3292,11 @@ bool8 PokemonUseItemEffects2(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 m if (r10 & 0x20) { r10 &= ~0x20; - data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_825DEA1[moveIndex]) >> (moveIndex * 2); + data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2); sp28 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex); if (data < 3 && sp28 > 4) { - //data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) + gUnknown_825DEA9[moveIndex]; + //data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) + gPPUpAddMask[moveIndex]; //SetMonData(pkmn, MON_DATA_PP_BONUSES, &data); // //data = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - sp28; @@ -3286,7 +3531,7 @@ bool8 PokemonUseItemEffects2(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 m } break; case 4: - data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_825DEA1[moveIndex]) >> (moveIndex * 2); + data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2); r4 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex); if (data < 3) { @@ -3295,8 +3540,8 @@ bool8 PokemonUseItemEffects2(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 m /* data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL); - data &= gPPUpWriteMasks[moveIndex]; - data += gUnknown_825DEA9[moveIndex] * 3; + data &= gPPUpSetMask[moveIndex]; + data += gPPUpAddMask[moveIndex] * 3; SetMonData(pkmn, MON_DATA_PP_BONUSES, &data); data = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - r4; @@ -3957,7 +4202,7 @@ _08042850:\n\ movs r2, 0\n\ bl GetMonData\n\ adds r5, r0, 0\n\ - ldr r0, _080428DC @ =gUnknown_825DEA1\n\ + ldr r0, _080428DC @ =gPPUpGetMask\n\ ldr r1, [sp, 0x8]\n\ adds r0, r1, r0\n\ ldrb r0, [r0]\n\ @@ -4013,7 +4258,7 @@ _080428D2:\n\ ldr r0, [r0]\n\ mov pc, r0\n\ .align 2, 0\n\ -_080428DC: .4byte gUnknown_825DEA1\n\ +_080428DC: .4byte gPPUpGetMask\n\ _080428E0: .4byte _080428E4\n\ .align 2, 0\n\ _080428E4:\n\ @@ -4275,7 +4520,7 @@ _08042AF4:\n\ movs r2, 0\n\ bl GetMonData\n\ adds r5, r0, 0\n\ - ldr r0, _08042B48 @ =gUnknown_825DEA1\n\ + ldr r0, _08042B48 @ =gPPUpGetMask\n\ ldr r1, [sp, 0x8]\n\ adds r0, r1, r0\n\ ldrb r0, [r0]\n\ @@ -4309,7 +4554,7 @@ _08042AF4:\n\ str r2, [sp, 0x10]\n\ b _08042BBE\n\ .align 2, 0\n\ -_08042B48: .4byte gUnknown_825DEA1\n\ +_08042B48: .4byte gPPUpGetMask\n\ _08042B4C:\n\ mov r0, r8\n\ movs r1, 0x20\n\ @@ -4397,7 +4642,7 @@ _08042BD8:\n\ } #endif -bool8 sub_8042BE8(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId) +static bool8 sub_8042BE8(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId) { if((GetMonData(mon, MON_DATA_STATUS, NULL) & healMask) != 0) return TRUE; @@ -4518,7 +4763,7 @@ u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit) return offset; } -void sub_8042D50(int stat) +static void sub_8042D50(int stat) { gBattlerTarget = gBattlerInMenuId; StringCopy(gBattleTextBuff1, gUnknown_83FD5D0[gUnknown_825DFF0[stat]]); @@ -4581,13 +4826,11 @@ u8 GetNature(struct Pokemon *mon) return GetMonData(mon, MON_DATA_PERSONALITY, 0) % 25; } -u8 GetNatureFromPersonality(u32 personality) +static u8 GetNatureFromPersonality(u32 personality) { return personality % 25; } -extern bool32 sub_806E25C(void); - u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem) { int i; @@ -4718,7 +4961,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem) // HoennPokedexNumToSpecies, but is it really Hoenn or Kanto its checking // TODO: Figure this out -u16 sub_80431B4(u16 var) +static u16 sub_80431B4(u16 var) { u16 species; @@ -4755,7 +4998,7 @@ u16 NationalPokedexNumToSpecies(u16 nationalNum) } // NationalToKantoOrder? -u16 sub_804324C(u16 nationalNum) +static u16 sub_804324C(u16 nationalNum) { u16 hoennNum; @@ -4783,7 +5026,7 @@ u16 SpeciesToNationalPokedexNum(u16 species) // these 2 functions are probably kanto and not hoenn // TODO: figure this out -u16 SpeciesToHoennPokedexNum(u16 species) +static u16 SpeciesToHoennPokedexNum(u16 species) { if (!species) return 0; @@ -4810,7 +5053,7 @@ u16 SpeciesToCryId(u16 species) return gUnknown_82539D4[species - ((SPECIES_OLD_UNOWN_Z + 1) - 1)]; } -void sub_8043338(u16 species, u32 personality, u8 *dest) +static void sub_8043338(u16 species, u32 personality, u8 *dest) { if (species == SPECIES_SPINDA && dest != gMonSpritesGfxPtr->sprites[0] @@ -4928,10 +5171,10 @@ bool8 sub_80435E0(void) return retVal; } -bool8 sub_8043620(u8 id) +bool8 GetLinkTrainerFlankId(u8 linkPlayerId) { bool8 retVal = FALSE; - switch (gLinkPlayers[id].id) + switch (gLinkPlayers[linkPlayerId].id) { case 0: case 3: @@ -4954,12 +5197,12 @@ s32 GetBankMultiplayerId(u16 a1) return id; } -u8 sub_804367C(u16 trainer) +u8 GetTrainerEncounterMusicId(u16 trainer) { return gTrainers[trainer].encounterMusic_gender & 0x7F; } -u16 nature_stat_mod(u8 nature, u16 n, u8 statIndex) +static u16 ModifyStatByNature(u8 nature, u16 n, u8 statIndex) { if (statIndex < 1 || statIndex > 5) { @@ -5204,7 +5447,7 @@ u8 CheckPartyHasHadPokerus(struct Pokemon *party, u8 selection) return retVal; } -void sub_8043B38(void) +static void sub_8043B38(void) { u8 foo[4]; // huh? } @@ -5214,7 +5457,7 @@ void sub_8043B40(void) u8 foo[4]; // huh? } -void sub_8043B48(struct Pokemon *mon, int species, u8 unused, u32 data) +static void SetMonExpWithMaxLevelCheck(struct Pokemon *mon, int species, u8 unused, u32 data) { if (data > gExperienceTables[gBaseStats[species].growthRate][100]) { @@ -5235,7 +5478,7 @@ bool8 TryIncrementMonLevel(struct Pokemon *mon) if(exp > gExperienceTables[gBaseStats[species].growthRate][newLevel]) { SetMonData(mon, MON_DATA_LEVEL, &newLevel); - sub_8043B48(mon, species, newLevel, exp); + SetMonExpWithMaxLevelCheck(mon, species, newLevel, exp); return TRUE; } else @@ -5243,7 +5486,7 @@ bool8 TryIncrementMonLevel(struct Pokemon *mon) } else { - sub_8043B48(mon, species, level, exp); + SetMonExpWithMaxLevelCheck(mon, species, level, exp); return FALSE; } } @@ -5377,7 +5620,7 @@ void ClearBattleMonForms(void) gBattleMonForms[i] = 0; } -u16 GetMUS_ForBattle(void) +static u16 GetMUS_ForBattle(void) { if(gBattleTypeFlags & 0x1000) return 0x12A; @@ -5480,7 +5723,7 @@ bool8 IsPokeSpriteNotFlipped(u16 species) return gBaseStats[species].noFlip; } -s8 GetMonFlavorRelation(struct Pokemon *mon, u8 flavor) +static s8 GetMonFlavorRelation(struct Pokemon *mon, u8 flavor) { u8 nature = GetNature(mon); return gPokeblockFlavorCompatibilityTable[nature * 5 + flavor]; @@ -5595,7 +5838,7 @@ bool8 IsMonShiny(struct Pokemon *mon) return IsShinyOtIdPersonality(otId, personality); } -bool8 IsShinyOtIdPersonality(u32 otId, u32 personality) +static bool8 IsShinyOtIdPersonality(u32 otId, u32 personality) { bool8 retVal = FALSE; u32 shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality); @@ -5604,8 +5847,728 @@ bool8 IsShinyOtIdPersonality(u32 otId, u32 personality) return retVal; } -u8 *sub_80444C4(void) +u8 *GetTrainerPartnerName(void) { u8 id = GetMultiplayerId(); return gLinkPlayers[GetBankMultiplayerId(gLinkPlayers[id].id ^ 2)].name; } + +u8 GetPlayerPartyHighestLevel(void) +{ + s32 slot; + u8 level, monLevel; + + level = 1; + for(slot = 0; slot < PARTY_SIZE; ++slot) + { + if (GetMonData(&gPlayerParty[slot], MON_DATA_SANITY_HAS_SPECIES, NULL) == 1 && !GetMonData(&gPlayerParty[slot], MON_DATA_SANITY_IS_EGG, NULL)) + { + monLevel = GetMonData(&gPlayerParty[slot], MON_DATA_LEVEL, NULL); + if (monLevel > level) + level = monLevel; + } + } + return level; +} + +u16 FacilityClassToPicIndex(u16 facilityClass) +{ + return gFacilityClassToPicIndex[facilityClass]; +} + +bool8 sub_804455C(u8 caseId, u8 battlerId) +{ + switch (caseId) + { + case 0: + default: + return FALSE; + case 1: + if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) + return FALSE; + if (!gMain.inBattle) + return FALSE; + if (gLinkPlayers[GetMultiplayerId()].id == battlerId) + return FALSE; + break; + case 2: + break; + case 3: + if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) + return FALSE; + if (!gMain.inBattle) + return FALSE; + if (battlerId == 1 || battlerId == 4 || battlerId == 5) + return TRUE; + return FALSE; + case 4: + break; + case 5: + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + if (!gMain.inBattle) + return FALSE; + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + if (gLinkPlayers[GetMultiplayerId()].id == battlerId) + return FALSE; + } + else + { + if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) + return FALSE; + } + } + else + { + if (!gMain.inBattle) + return FALSE; + if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) + return FALSE; + } + break; + } + + return TRUE; +} + +static u16 GetDeoxysStat(struct Pokemon *mon, s32 statId) +{ + s32 ivVal, evVal; + u16 statValue; + u8 nature; + + if (gBattleTypeFlags & BATTLE_TYPE_20 || GetMonData(mon, MON_DATA_SPECIES, NULL) != SPECIES_DEOXYS) + { + return statValue = 0; + } + else + { + ivVal = GetMonData(mon, MON_DATA_HP_IV + statId, NULL); + evVal = GetMonData(mon, MON_DATA_HP_EV + statId, NULL); + statValue = ((sDeoxysBaseStats[statId] * 2 + ivVal + evVal / 4) * mon->level) / 100 + 5; + nature = GetNature(mon); + statValue = ModifyStatByNature(nature, statValue, (u8)statId); + } + return statValue; +} + +void SetDeoxysStats(void) +{ + s32 i, value; + + for (i = 0; i < PARTY_SIZE; i++) + { + struct Pokemon *mon = &gPlayerParty[i]; + + if (GetMonData(mon, MON_DATA_SPECIES, NULL) != SPECIES_DEOXYS) + continue; + value = GetMonData(mon, MON_DATA_ATK, NULL); + SetMonData(mon, MON_DATA_ATK, &value); + value = GetMonData(mon, MON_DATA_DEF, NULL); + SetMonData(mon, MON_DATA_DEF, &value); + value = GetMonData(mon, MON_DATA_SPEED, NULL); + SetMonData(mon, MON_DATA_SPEED, &value); + value = GetMonData(mon, MON_DATA_SPATK, NULL); + SetMonData(mon, MON_DATA_SPATK, &value); + value = GetMonData(mon, MON_DATA_SPDEF, NULL); + SetMonData(mon, MON_DATA_SPDEF, &value); + } +} + +u16 sub_80447AC(void) +{ + u8 linkId = GetMultiplayerId() ^ 1; + u32 arrId = gLinkPlayers[linkId].trainerId & 7; + + arrId |= gLinkPlayers[linkId].gender << 3; + return FacilityClassToPicIndex(gLinkPlayerFacilityClasses[arrId]); +} + +u16 sub_80447F0(void) +{ + u8 linkId = GetMultiplayerId() ^ 1; + u32 arrId = gLinkPlayers[linkId].trainerId & 7; + + arrId |= gLinkPlayers[linkId].gender << 3; + return gFacilityClassToTrainerClass[gLinkPlayerFacilityClasses[arrId]]; +} + +void CreateObedientEnemyMon(void) +{ + s32 species = gSpecialVar_0x8004; + s32 level = gSpecialVar_0x8005; + s32 itemId = gSpecialVar_0x8006; + + ZeroEnemyPartyMons(); + CreateObedientMon(&gEnemyParty[0], species, level, 32, 0, 0, 0, 0); + if (itemId) + { + u8 heldItem[2]; + + heldItem[0] = itemId; + heldItem[1] = itemId >> 8; + SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, heldItem); + } +} + +void HandleSetPokedexFlag(u16 nationalNum, u8 caseId, u32 personality) +{ + u8 getFlagCaseId = (caseId == FLAG_SET_SEEN) ? FLAG_GET_SEEN : FLAG_GET_CAUGHT; + + if (!GetSetPokedexFlag(nationalNum, getFlagCaseId)) + { + GetSetPokedexFlag(nationalNum, caseId); + if (NationalPokedexNumToSpecies(nationalNum) == SPECIES_UNOWN) + gSaveBlock2Ptr->pokedex.unownPersonality = personality; + if (NationalPokedexNumToSpecies(nationalNum) == SPECIES_SPINDA) + gSaveBlock2Ptr->pokedex.spindaPersonality = personality; + } +} + +bool8 CheckBattleTypeGhost(struct Pokemon *mon, u8 bank) +{ + u8 buffer[12]; + + if (gBattleTypeFlags & BATTLE_TYPE_GHOST && GetBattlerSide(bank)) + { + GetMonData(mon, MON_DATA_NICKNAME, buffer); + StringGetEnd10(buffer); + if (!StringCompare(buffer, gUnknown_841D148)) + return TRUE; + } + return FALSE; +} + +static void OakSpeechNidoranFSetupTemplate(struct OakSpeechNidoranFStruct *structPtr, u8 battlePosition) +{ + u16 i = 0, j = 0; + + if (battlePosition > 3) + { + for (i = 0; i < (s8)structPtr->spriteCount; ++i) + { + structPtr->templates[i] = gUnknown_825DEF0[i]; + for (j = 0; j < structPtr->frameCount; ++j) + structPtr->frameImages[i * structPtr->frameCount + j].data = &structPtr->bufferPtrs[i][j * 0x800]; + structPtr->templates[i].images = &structPtr->frameImages[i * structPtr->frameCount]; + } + } + else + { + const struct SpriteTemplate *template = &gUnknown_825DEF0[battlePosition]; + + structPtr->templates[0] = *template; + for (j = 0; j < structPtr->frameCount; ++j) + structPtr->frameImages[j].data = &structPtr->bufferPtrs[0][j * 0x800]; + structPtr->templates[0].images = structPtr->frameImages; + } +} + +// not used +static void OakSpeechNidoranFSetupTemplateDummy(struct OakSpeechNidoranFStruct *structPtr) +{ + u16 i, j; + + for (i = 0; i < (s8)structPtr->spriteCount; ++i) + { + structPtr->templates[i] = sOakSpeechNidoranFDummyTemplate; + for (j = 0; j < structPtr->frameCount; ++j) + structPtr->frameImages[i * structPtr->spriteCount + j].data = &structPtr->bufferPtrs[i][j * 0x800]; + structPtr->templates[i].images = &structPtr->frameImages[i * structPtr->spriteCount]; // should be frameCount logically + structPtr->templates[i].anims = gUnknown_82349BC; + structPtr->templates[i].paletteTag = i; + } +} + +#ifdef NONMATCHING +struct OakSpeechNidoranFStruct *OakSpeechNidoranFSetup(u8 battlePosition, bool8 enable) +{ + s32 size; + u8 i, flags = 0; + + if (sOakSpeechNidoranResources != NULL) + { + if (sOakSpeechNidoranResources->enable == 0xA3) + return NULL; + memset(sOakSpeechNidoranResources, 0, sizeof(struct OakSpeechNidoranFStruct)); + sOakSpeechNidoranResources = NULL; + } + sOakSpeechNidoranResources = AllocZeroed(0x18); + if (sOakSpeechNidoranResources == NULL) + return NULL; + switch (enable) + { + case TRUE: + if (battlePosition == 4) + { + sOakSpeechNidoranResources->spriteCount = 4; + sOakSpeechNidoranResources->battlePosition = 4; + } + else + { + if (battlePosition > 4) + battlePosition = 0; + sOakSpeechNidoranResources->spriteCount = 1; + sOakSpeechNidoranResources->battlePosition = 1; + } + sOakSpeechNidoranResources->frameCount = 4; + sOakSpeechNidoranResources->enable2 = TRUE; + break; + case FALSE: + default: + if (!battlePosition) + battlePosition = 1; + if (battlePosition > 8) + battlePosition = 8; + // The following two statements refused to cooperate. + sOakSpeechNidoranResources->spriteCount = battlePosition; + sOakSpeechNidoranResources->battlePosition = battlePosition; + sOakSpeechNidoranResources->frameCount = 4; + sOakSpeechNidoranResources->enable2 = FALSE; + break; + } + size = sOakSpeechNidoranResources->frameCount * 0x800; + sOakSpeechNidoranResources->sizePerSprite = size; + sOakSpeechNidoranResources->dataBuffer = AllocZeroed(sOakSpeechNidoranResources->spriteCount * size); + sOakSpeechNidoranResources->bufferPtrs = AllocZeroed(sOakSpeechNidoranResources->spriteCount * 0x20); + if (sOakSpeechNidoranResources->dataBuffer == NULL || sOakSpeechNidoranResources->bufferPtrs == NULL) + { + flags |= 1; + } + else + { + for (i = 0; i < (s8)sOakSpeechNidoranResources->spriteCount; ++i) + sOakSpeechNidoranResources->bufferPtrs[i] = &sOakSpeechNidoranResources->dataBuffer[sOakSpeechNidoranResources->sizePerSprite * i]; + } + sOakSpeechNidoranResources->templates = AllocZeroed(sizeof(struct SpriteTemplate) * sOakSpeechNidoranResources->spriteCount); + sOakSpeechNidoranResources->frameImages = AllocZeroed(sOakSpeechNidoranResources->spriteCount * sizeof(struct SpriteFrameImage) * sOakSpeechNidoranResources->frameCount); + if (sOakSpeechNidoranResources->templates == NULL || sOakSpeechNidoranResources->frameImages == NULL) + { + flags |= 2; + } + else + { + for (i = 0; i < sOakSpeechNidoranResources->frameCount * sOakSpeechNidoranResources->spriteCount; ++i) + sOakSpeechNidoranResources->frameImages[i].size = 0x800; + switch (sOakSpeechNidoranResources->enable2) + { + case TRUE: + OakSpeechNidoranFSetupTemplate(sOakSpeechNidoranResources, battlePosition); + break; + case FALSE: + default: + OakSpeechNidoranFSetupTemplateDummy(sOakSpeechNidoranResources); + break; + } + } + if (flags & 2) + { + if (sOakSpeechNidoranResources->frameImages != NULL) + FREE_AND_SET_NULL(sOakSpeechNidoranResources->frameImages); + if (sOakSpeechNidoranResources->templates != NULL) + FREE_AND_SET_NULL(sOakSpeechNidoranResources->templates); + } + if (flags & 1) + { + if (sOakSpeechNidoranResources->bufferPtrs != NULL) + FREE_AND_SET_NULL(sOakSpeechNidoranResources->bufferPtrs); + if (sOakSpeechNidoranResources->dataBuffer != NULL) + FREE_AND_SET_NULL(sOakSpeechNidoranResources->dataBuffer); + } + if (flags) + { + memset(sOakSpeechNidoranResources, 0, sizeof(struct OakSpeechNidoranFStruct)); + FREE_AND_SET_NULL(sOakSpeechNidoranResources); + } + else + { + sOakSpeechNidoranResources->enable = 0xA3; + } + return sOakSpeechNidoranResources; +} +#else +NAKED +struct OakSpeechNidoranFStruct *OakSpeechNidoranFSetup(u8 battlePosition, bool8 enable) +{ + asm_unified("\n\ + push {r4-r7,lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + lsls r1, 24\n\ + lsrs r5, r1, 24\n\ + movs r0, 0\n\ + mov r8, r0\n\ + ldr r4, _08044B34 @ =sOakSpeechNidoranResources\n\ + ldr r1, [r4]\n\ + cmp r1, 0\n\ + beq _08044B1E\n\ + ldrb r0, [r1, 0x2]\n\ + cmp r0, 0xA3\n\ + beq _08044B2E\n\ + adds r0, r1, 0\n\ + movs r1, 0\n\ + movs r2, 0x18\n\ + bl memset\n\ + mov r1, r8\n\ + str r1, [r4]\n\ + _08044B1E:\n\ + ldr r4, _08044B34 @ =sOakSpeechNidoranResources\n\ + movs r0, 0x18\n\ + bl AllocZeroed\n\ + adds r2, r0, 0\n\ + str r2, [r4]\n\ + cmp r2, 0\n\ + bne _08044B38\n\ + _08044B2E:\n\ + movs r0, 0\n\ + b _08044D70\n\ + .align 2, 0\n\ + _08044B34: .4byte sOakSpeechNidoranResources\n\ + _08044B38:\n\ + cmp r5, 0\n\ + beq _08044B94\n\ + cmp r5, 0x1\n\ + bne _08044B94\n\ + cmp r6, 0x4\n\ + bne _08044B5E\n\ + ldrb r1, [r2]\n\ + movs r0, 0x10\n\ + negs r0, r0\n\ + ands r0, r1\n\ + movs r1, 0x4\n\ + orrs r0, r1\n\ + strb r0, [r2]\n\ + ldr r2, [r4]\n\ + ldrb r1, [r2]\n\ + movs r0, 0xF\n\ + ands r0, r1\n\ + movs r1, 0x40\n\ + b _08044B7C\n\ + _08044B5E:\n\ + cmp r6, 0x4\n\ + bls _08044B64\n\ + movs r6, 0\n\ + _08044B64:\n\ + ldrb r1, [r2]\n\ + movs r0, 0x10\n\ + negs r0, r0\n\ + ands r0, r1\n\ + movs r1, 0x1\n\ + orrs r0, r1\n\ + strb r0, [r2]\n\ + ldr r2, [r4]\n\ + ldrb r1, [r2]\n\ + movs r0, 0xF\n\ + ands r0, r1\n\ + movs r1, 0x10\n\ + _08044B7C:\n\ + orrs r0, r1\n\ + strb r0, [r2]\n\ + ldr r2, _08044B90 @ =sOakSpeechNidoranResources\n\ + ldr r1, [r2]\n\ + movs r0, 0x4\n\ + strb r0, [r1, 0x1]\n\ + ldr r1, [r2]\n\ + movs r0, 0x1\n\ + strb r0, [r1, 0x3]\n\ + b _08044BD0\n\ + .align 2, 0\n\ + _08044B90: .4byte sOakSpeechNidoranResources\n\ + _08044B94:\n\ + cmp r6, 0\n\ + bne _08044B9A\n\ + movs r6, 0x1\n\ + _08044B9A:\n\ + cmp r6, 0x8\n\ + bls _08044BA0\n\ + movs r6, 0x8\n\ + _08044BA0:\n\ + ldr r4, _08044C10 @ =sOakSpeechNidoranResources\n\ + ldr r3, [r4]\n\ + movs r0, 0xF\n\ + adds r1, r6, 0\n\ + ands r1, r0\n\ + ldrb r2, [r3]\n\ + movs r0, 0x10\n\ + negs r0, r0\n\ + ands r0, r2\n\ + orrs r0, r1\n\ + strb r0, [r3]\n\ + ldr r2, [r4]\n\ + lsls r3, r6, 4\n\ + ldrb r1, [r2]\n\ + movs r0, 0xF\n\ + ands r0, r1\n\ + orrs r0, r3\n\ + strb r0, [r2]\n\ + ldr r1, [r4]\n\ + movs r2, 0\n\ + movs r0, 0x4\n\ + strb r0, [r1, 0x1]\n\ + ldr r0, [r4]\n\ + strb r2, [r0, 0x3]\n\ + _08044BD0:\n\ + ldr r5, _08044C10 @ =sOakSpeechNidoranResources\n\ + ldr r0, [r5]\n\ + ldrb r1, [r0, 0x1]\n\ + lsls r1, 11\n\ + str r1, [r0, 0x4]\n\ + ldrb r0, [r0]\n\ + lsls r0, 28\n\ + lsrs r0, 28\n\ + muls r0, r1\n\ + bl AllocZeroed\n\ + ldr r1, [r5]\n\ + str r0, [r1, 0x8]\n\ + ldrb r0, [r1]\n\ + lsls r0, 28\n\ + lsrs r0, 23\n\ + bl AllocZeroed\n\ + adds r2, r0, 0\n\ + ldr r1, [r5]\n\ + str r2, [r1, 0xC]\n\ + ldr r0, [r1, 0x8]\n\ + cmp r0, 0\n\ + beq _08044C04\n\ + cmp r2, 0\n\ + bne _08044C14\n\ + _08044C04:\n\ + movs r0, 0x1\n\ + mov r1, r8\n\ + orrs r1, r0\n\ + mov r8, r1\n\ + b _08044C44\n\ + .align 2, 0\n\ + _08044C10: .4byte sOakSpeechNidoranResources\n\ + _08044C14:\n\ + ldrb r0, [r1]\n\ + lsls r0, 28\n\ + movs r4, 0\n\ + adds r3, r5, 0\n\ + cmp r0, 0\n\ + beq _08044C44\n\ + _08044C20:\n\ + ldr r3, [r5]\n\ + ldr r0, [r3, 0xC]\n\ + lsls r1, r4, 2\n\ + adds r1, r0\n\ + ldr r0, [r3, 0x4]\n\ + adds r2, r0, 0\n\ + muls r2, r4\n\ + ldr r0, [r3, 0x8]\n\ + adds r0, r2\n\ + str r0, [r1]\n\ + adds r0, r4, 0x1\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + ldrb r0, [r3]\n\ + lsls r0, 28\n\ + lsrs r0, 28\n\ + cmp r4, r0\n\ + blt _08044C20\n\ + _08044C44:\n\ + ldr r5, _08044C8C @ =sOakSpeechNidoranResources\n\ + ldr r0, [r5]\n\ + ldrb r1, [r0]\n\ + lsls r1, 28\n\ + lsrs r1, 28\n\ + lsls r0, r1, 1\n\ + adds r0, r1\n\ + lsls r0, 3\n\ + bl AllocZeroed\n\ + ldr r2, [r5]\n\ + str r0, [r2, 0x10]\n\ + ldrb r1, [r2]\n\ + lsls r1, 28\n\ + lsrs r1, 28\n\ + ldrb r0, [r2, 0x1]\n\ + lsls r0, 3\n\ + muls r0, r1\n\ + bl AllocZeroed\n\ + adds r2, r0, 0\n\ + ldr r1, [r5]\n\ + str r2, [r1, 0x14]\n\ + ldr r0, [r1, 0x10]\n\ + cmp r0, 0\n\ + beq _08044C7C\n\ + cmp r2, 0\n\ + bne _08044C90\n\ + _08044C7C:\n\ + movs r0, 0x2\n\ + mov r1, r8\n\ + orrs r1, r0\n\ + lsls r0, r1, 24\n\ + lsrs r0, 24\n\ + mov r8, r0\n\ + b _08044CE2\n\ + .align 2, 0\n\ + _08044C8C: .4byte sOakSpeechNidoranResources\n\ + _08044C90:\n\ + movs r4, 0\n\ + ldrb r0, [r1, 0x1]\n\ + ldrb r1, [r1]\n\ + lsls r1, 28\n\ + lsrs r1, 28\n\ + muls r0, r1\n\ + adds r3, r5, 0\n\ + cmp r4, r0\n\ + bge _08044CC6\n\ + adds r7, r3, 0\n\ + movs r5, 0x80\n\ + lsls r5, 4\n\ + _08044CA8:\n\ + ldr r2, [r7]\n\ + ldr r1, [r2, 0x14]\n\ + lsls r0, r4, 3\n\ + adds r0, r1\n\ + strh r5, [r0, 0x4]\n\ + adds r0, r4, 0x1\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + ldrb r1, [r2, 0x1]\n\ + ldrb r0, [r2]\n\ + lsls r0, 28\n\ + lsrs r0, 28\n\ + muls r0, r1\n\ + cmp r4, r0\n\ + blt _08044CA8\n\ + _08044CC6:\n\ + ldr r0, [r3]\n\ + ldrb r4, [r0, 0x3]\n\ + cmp r4, 0\n\ + beq _08044CDA\n\ + cmp r4, 0x1\n\ + bne _08044CDA\n\ + adds r1, r6, 0\n\ + bl OakSpeechNidoranFSetupTemplate\n\ + b _08044CE2\n\ + _08044CDA:\n\ + ldr r0, _08044D60 @ =sOakSpeechNidoranResources\n\ + ldr r0, [r0]\n\ + bl OakSpeechNidoranFSetupTemplateDummy\n\ + _08044CE2:\n\ + movs r0, 0x2\n\ + mov r1, r8\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08044D12\n\ + ldr r4, _08044D60 @ =sOakSpeechNidoranResources\n\ + ldr r0, [r4]\n\ + ldr r0, [r0, 0x14]\n\ + cmp r0, 0\n\ + beq _08044D00\n\ + bl Free\n\ + ldr r1, [r4]\n\ + movs r0, 0\n\ + str r0, [r1, 0x14]\n\ + _08044D00:\n\ + ldr r0, [r4]\n\ + ldr r0, [r0, 0x10]\n\ + cmp r0, 0\n\ + beq _08044D12\n\ + bl Free\n\ + ldr r1, [r4]\n\ + movs r0, 0\n\ + str r0, [r1, 0x10]\n\ + _08044D12:\n\ + movs r0, 0x1\n\ + mov r1, r8\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08044D42\n\ + ldr r4, _08044D60 @ =sOakSpeechNidoranResources\n\ + ldr r0, [r4]\n\ + ldr r0, [r0, 0xC]\n\ + cmp r0, 0\n\ + beq _08044D30\n\ + bl Free\n\ + ldr r1, [r4]\n\ + movs r0, 0\n\ + str r0, [r1, 0xC]\n\ + _08044D30:\n\ + ldr r0, [r4]\n\ + ldr r0, [r0, 0x8]\n\ + cmp r0, 0\n\ + beq _08044D42\n\ + bl Free\n\ + ldr r1, [r4]\n\ + movs r0, 0\n\ + str r0, [r1, 0x8]\n\ + _08044D42:\n\ + mov r0, r8\n\ + cmp r0, 0\n\ + beq _08044D64\n\ + ldr r4, _08044D60 @ =sOakSpeechNidoranResources\n\ + ldr r0, [r4]\n\ + movs r1, 0\n\ + movs r2, 0x18\n\ + bl memset\n\ + ldr r0, [r4]\n\ + bl Free\n\ + movs r0, 0\n\ + str r0, [r4]\n\ + b _08044D6C\n\ + .align 2, 0\n\ + _08044D60: .4byte sOakSpeechNidoranResources\n\ + _08044D64:\n\ + ldr r0, _08044D7C @ =sOakSpeechNidoranResources\n\ + ldr r1, [r0]\n\ + movs r0, 0xA3\n\ + strb r0, [r1, 0x2]\n\ + _08044D6C:\n\ + ldr r0, _08044D7C @ =sOakSpeechNidoranResources\n\ + ldr r0, [r0]\n\ + _08044D70:\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .align 2, 0\n\ + _08044D7C: .4byte sOakSpeechNidoranResources\n\ + "); +} +#endif + +void OakSpeechNidoranFFreeResources(void) +{ + if (sOakSpeechNidoranResources != NULL) + { + if (sOakSpeechNidoranResources->enable != 0xA3) + { + memset(sOakSpeechNidoranResources, 0, sizeof(struct OakSpeechNidoranFStruct)); + sOakSpeechNidoranResources = NULL; + } + else + { + if (sOakSpeechNidoranResources->frameImages != NULL) + FREE_AND_SET_NULL(sOakSpeechNidoranResources->frameImages); + if (sOakSpeechNidoranResources->templates != NULL) + FREE_AND_SET_NULL(sOakSpeechNidoranResources->templates); + if (sOakSpeechNidoranResources->bufferPtrs != NULL) + FREE_AND_SET_NULL(sOakSpeechNidoranResources->bufferPtrs); + if (sOakSpeechNidoranResources->dataBuffer != NULL) + FREE_AND_SET_NULL(sOakSpeechNidoranResources->dataBuffer); + memset(sOakSpeechNidoranResources, 0, sizeof(struct OakSpeechNidoranFStruct)); + FREE_AND_SET_NULL(sOakSpeechNidoranResources); + } + + } +} + +void *OakSpeechNidoranFGetBuffer(u8 bufferId) +{ + if (sOakSpeechNidoranResources->enable != 0xA3) + { + return NULL; + } + else + { + if (bufferId >= (s8)sOakSpeechNidoranResources->spriteCount) + bufferId = 0; + return sOakSpeechNidoranResources->bufferPtrs[bufferId]; + } +} diff --git a/src/trainer_tower.c b/src/trainer_tower.c index b7b9c096d..cdb42ca96 100644 --- a/src/trainer_tower.c +++ b/src/trainer_tower.c @@ -1378,21 +1378,21 @@ void sub_815E9FC(void) { r2 = gUnknown_847A2EE[r5][r6]; gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r4].unk_040[r2].level = r9; - sub_803E0A4(&gEnemyParty[r6], &gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r4].unk_040[r2]); + CreateBattleTowerMon(&gEnemyParty[r6], &gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r4].unk_040[r2]); } break; case 1: r2 = gUnknown_847A2FE[r5][0]; gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[0].unk_040[r2].level = r9; - sub_803E0A4(&gEnemyParty[0], &gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[0].unk_040[r2]); + CreateBattleTowerMon(&gEnemyParty[0], &gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[0].unk_040[r2]); r2 = gUnknown_847A2FE[r5][1]; gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[1].unk_040[r2].level = r9; - sub_803E0A4(&gEnemyParty[1], &gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[1].unk_040[r2]); + CreateBattleTowerMon(&gEnemyParty[1], &gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[1].unk_040[r2]); break; case 2: r2 = gUnknown_847A30E[r5][r4]; gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r4].unk_040[r2].level = r9; - sub_803E0A4(&gEnemyParty[0], &gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r4].unk_040[r2]); + CreateBattleTowerMon(&gEnemyParty[0], &gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r4].unk_040[r2]); break; } } diff --git a/sym_ewram.txt b/sym_ewram.txt index b968e31ee..bb2198bd4 100644 --- a/sym_ewram.txt +++ b/sym_ewram.txt @@ -487,13 +487,7 @@ gUnknown_2024414: @ 2024414 gUnknown_2024478: @ 2024478 .space 0x64 -gMultiuseSpriteTemplate: @ 20244DC - .space 0x18 - -gUnknown_20244F4: @ 20244F4 - .space 0x4 - - .align 2 + .include "src/pokemon.o" .include "src/daycare.o" .align 2 .include "src/load_save.o" |