diff --git a/asm/dodrio_berry_picking.s b/asm/dodrio_berry_picking.s index e52e7a347..bcb250567 100755 --- a/asm/dodrio_berry_picking.s +++ b/asm/dodrio_berry_picking.s @@ -5,309 +5,6 @@ .text - thumb_func_start sub_802493C -sub_802493C: @ 802493C - push {r4-r6,lr} - adds r5, r1, 0 - lsls r0, 16 - lsrs r6, r0, 16 - ldr r1, =gUnknown_03000DB0 - movs r0, 0 - str r0, [r1] - ldr r0, =gReceivedRemoteLinkPlayers - ldrb r0, [r0] - cmp r0, 0 - beq _08024A10 - ldr r4, =gUnknown_02022C98 - ldr r0, =0x00003330 - bl AllocZeroed - str r0, [r4] - cmp r0, 0 - beq _08024A10 - bl sub_8024A1C - ldr r0, [r4] - bl sub_8024A30 - ldr r0, [r4] - str r5, [r0] - bl GetMultiplayerId - ldr r1, [r4] - adds r1, 0x28 - strb r0, [r1] - ldr r1, [r4] - ldr r2, =0x000032cc - adds r0, r1, r2 - adds r2, r1, 0 - adds r2, 0x28 - ldrb r3, [r2] - lsls r2, r3, 4 - subs r2, r3 - lsls r2, 2 - adds r1, r2 - ldr r2, =0x000031a0 - adds r1, r2 - movs r2, 0x3C - bl memcpy - ldr r0, [r4] - adds r1, r0, 0 - adds r1, 0x28 - ldrb r1, [r1] - lsls r1, 2 - ldr r2, =0x0000318c - adds r1, r2 - adds r0, r1 - movs r1, 0x64 - muls r1, r6 - ldr r2, =gPlayerParty - adds r1, r2 - bl sub_80261F8 - ldr r0, =sub_8024BC8 - movs r1, 0x1 - bl CreateTask - ldr r0, =sub_80261CC - bl SetMainCallback2 - bl sub_80273F0 - ldr r2, [r4] - adds r0, r2, 0 - adds r0, 0x24 - ldrb r0, [r0] - adds r1, r2, 0 - adds r1, 0x44 - adds r2, 0x48 - bl sub_8026B5C - bl StopMapMusic - ldr r0, =0x0000021e - bl PlayNewMapMusic - b _08024A16 - .pool -_08024A10: - adds r0, r5, 0 - bl SetMainCallback2 -_08024A16: - pop {r4-r6} - pop {r0} - bx r0 - thumb_func_end sub_802493C - - thumb_func_start sub_8024A1C -sub_8024A1C: @ 8024A1C - push {lr} - bl ResetTasks - bl ResetSpriteData - bl FreeAllSpritePalettes - pop {r0} - bx r0 - thumb_func_end sub_8024A1C - - thumb_func_start sub_8024A30 -sub_8024A30: @ 8024A30 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x28 - adds r2, r0, 0 - movs r0, 0 - strb r0, [r2, 0xC] - strb r0, [r2, 0x10] - strb r0, [r2, 0x14] - strb r0, [r2, 0x18] - strb r0, [r2, 0x1C] - movs r3, 0x8E - lsls r3, 1 - adds r1, r2, r3 - str r0, [r1] - movs r7, 0x90 - lsls r7, 1 - adds r1, r2, r7 - str r0, [r1] - adds r1, r2, 0 - adds r1, 0x30 - strb r0, [r1] - adds r1, 0x10 - strb r0, [r1] - subs r1, 0x4 - strb r0, [r1] - adds r3, 0x10 - adds r1, r2, r3 - str r0, [r1] - movs r5, 0 - adds r1, r2, 0 - adds r1, 0x98 - movs r3, 0 -_08024A76: - adds r0, r1, r5 - strb r3, [r0] - adds r0, r5, 0x1 - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0x3 - bls _08024A76 - movs r5, 0 - adds r7, r2, 0 - adds r7, 0xA8 - str r7, [sp] - adds r0, r2, 0 - adds r0, 0xB0 - str r0, [sp, 0xC] - movs r1, 0x4A - adds r1, r2 - mov r10, r1 - movs r3, 0x4C - adds r3, r2 - mov r9, r3 - movs r7, 0x4E - adds r7, r2 - mov r12, r7 - subs r0, 0x60 - str r0, [sp, 0x24] - adds r6, r2, 0 - adds r6, 0x54 - adds r1, r2, 0 - adds r1, 0xD0 - str r1, [sp, 0x1C] - adds r3, r2, 0 - adds r3, 0xDC - str r3, [sp, 0x20] - adds r7, r2, 0 - adds r7, 0xC4 - str r7, [sp, 0x14] - adds r0, 0xA4 - str r0, [sp, 0x4] - adds r1, 0x25 - str r1, [sp, 0x8] - subs r3, 0xBC - str r3, [sp, 0x10] - movs r7, 0x24 - adds r7, r2 - mov r8, r7 - subs r0, 0xC0 - str r0, [sp, 0x18] - movs r3, 0 - movs r1, 0x86 - lsls r1, 1 - adds r4, r2, r1 - movs r7, 0x98 - lsls r7, 1 - adds r2, r7 -_08024AE2: - ldr r1, [sp] - adds r0, r1, r5 - strb r3, [r0] - ldr r7, [sp, 0xC] - adds r0, r7, r5 - strb r3, [r0] - lsls r0, r5, 1 - adds r0, r5 - lsls r0, 2 - mov r7, r10 - adds r1, r7, r0 - strh r3, [r1] - mov r7, r9 - adds r1, r7, r0 - strh r3, [r1] - mov r7, r12 - adds r1, r7, r0 - strh r3, [r1] - ldr r7, [sp, 0x24] - adds r1, r7, r0 - strh r3, [r1] - adds r0, r6, r0 - strh r3, [r0] - adds r0, r4, r5 - strb r3, [r0] - lsls r0, r5, 2 - adds r0, r2, r0 - str r3, [r0] - adds r0, r5, 0x1 - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0x4 - bls _08024AE2 - movs r5, 0 - movs r3, 0 - movs r4, 0xFF - ldr r6, [sp, 0x1C] -_08024B2C: - adds r0, r6, r5 - strb r3, [r0] - ldr r1, [sp, 0x20] - adds r0, r1, r5 - strb r3, [r0] - ldr r7, [sp, 0x14] - adds r0, r7, r5 - strb r3, [r0] - lsls r1, r5, 1 - ldr r0, [sp, 0x4] - adds r2, r0, r1 - ldrb r0, [r2] - orrs r0, r4 - strb r0, [r2] - ldr r7, [sp, 0x8] - adds r1, r7, r1 - ldrb r0, [r1] - orrs r0, r4 - strb r0, [r1] - adds r0, r5, 0x1 - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0xA - bls _08024B2C - bl GetMultiplayerId - movs r1, 0 - lsls r0, 24 - cmp r0, 0 - bne _08024B6A - movs r1, 0x1 -_08024B6A: - ldr r0, [sp, 0x10] - strb r1, [r0] - bl GetLinkPlayerCount - mov r1, r8 - strb r0, [r1] - bl GetMultiplayerId - ldr r3, [sp, 0x18] - strb r0, [r3] - movs r5, 0x1 - mov r7, r8 - ldrb r7, [r7] - cmp r5, r7 - bcs _08024BB6 - ldr r7, [sp, 0x18] - mov r6, r8 -_08024B8C: - adds r4, r7, r5 - subs r0, r5, 0x1 - adds r0, r7, r0 - ldrb r0, [r0] - adds r0, 0x1 - strb r0, [r4] - ldrb r2, [r4] - ldrb r1, [r6] - subs r0, r1, 0x1 - cmp r2, r0 - ble _08024BAA - adds r0, r2, 0 - bl __umodsi3 - strb r0, [r4] -_08024BAA: - adds r0, r5, 0x1 - lsls r0, 24 - lsrs r5, r0, 24 - ldrb r0, [r6] - cmp r5, r0 - bcc _08024B8C -_08024BB6: - add sp, 0x28 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_8024A30 - thumb_func_start sub_8024BC8 sub_8024BC8: @ 8024BC8 push {r4,r5,lr} diff --git a/ld_script.txt b/ld_script.txt index a78890b9f..88d49b4f3 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -65,6 +65,7 @@ SECTIONS { asm/union_room_chat.o(.text); asm/berry_crush.o(.text); asm/berry_powder_vendor.o(.text); + src/dodrio_berry_picking.o(.text); asm/dodrio_berry_picking.o(.text); asm/pokemon_jump.o(.text); src/rtc.o(.text); @@ -414,6 +415,7 @@ SECTIONS { data/union_room_chat.o(.rodata); data/berry_crush.o(.rodata); data/berry_powder_vendor.o(.rodata); + src/dodrio_berry_picking.o(.rodata); data/dodrio_berry_picking.o(.rodata); data/pokemon_jump.o(.rodata); src/rtc.o(.rodata); diff --git a/src/dodrio_berry_picking.c b/src/dodrio_berry_picking.c new file mode 100644 index 000000000..6f4960877 --- /dev/null +++ b/src/dodrio_berry_picking.c @@ -0,0 +1,183 @@ +#include "global.h" +#include "alloc.h" +#include "link.h" +#include "task.h" +#include "main.h" +#include "constants/songs.h" +#include "sound.h" + +struct DodrioBerryPickingSubstruct_004A +{ + /*0x00*/ u16 unk00; + /*0x02*/ u8 filler02[10]; +}; // size = 0x0C + +struct DodrioBerryPickingSubstruct_31A0 +{ + u8 unk_00[0x3C - 0x00]; +}; // size = 0x3C + +struct DodrioBerryPickingSubstruct_318C +{ + bool8 isShiny; +}; + +struct DodrioBerryPickingStruct +{ + /*0x0000*/ void (*savedCallback)(void); + /*0x0004*/ u8 filler_0004[8]; + /*0x000C*/ u8 unk_000C; + /*0x000D*/ u8 filler_000D[3]; + /*0x0010*/ u8 unk_0010; + /*0x0011*/ u8 filler_0011[3]; + /*0x0014*/ u8 unk_0014; + /*0x0015*/ u8 filler_0015[3]; + /*0x0018*/ u8 unk_0018; + /*0x0019*/ u8 filler_0019[3]; + /*0x001C*/ u8 unk_001C; + /*0x001D*/ u8 filler_001D[3]; + /*0x0020*/ u8 unk_0020; + /*0x0021*/ u8 filler_0021[3]; + /*0x0024*/ u8 unk_0024; + /*0x0025*/ u8 filler_0025[3]; + /*0x0028*/ u8 multiplayerId; + /*0x0029*/ u8 filler_0029[7]; + /*0x0030*/ u8 unk_0030; + /*0x0031*/ u8 filler_0031[3]; + /*0x0034*/ u8 unk_0034[5]; + /*0x0039*/ u8 filler_0039[3]; + /*0x003C*/ u8 unk_003C; + /*0x003D*/ u8 filler_003D[3]; + /*0x0040*/ u8 unk_0040; + /*0x0041*/ u8 filler_0041[3]; + /*0x0044*/ u8 unk_0044; + /*0x0045*/ u8 filler_0045[3]; + /*0x0048*/ u8 unk_0048; + // align 1 + /*0x004A*/ u16 unk_004A[5][6]; + /*0x0086*/ u8 filler_0086[18]; + /*0x0098*/ u8 unk_0098[4]; + /*0x009C*/ u8 filler_009C[12]; + /*0x00A8*/ u8 unk_00A8[5]; + /*0x00AD*/ u8 filler_00AD[3]; + /*0x00B0*/ u8 unk_00B0[5]; + /*0x00B5*/ u8 filler_00B5[0xC4 - 0xB5]; + /*0x00C4*/ u8 unk_00C4[11]; + /*0x00CF*/ u8 filler_00CF[1]; + /*0x00D0*/ u8 unk_00D0[11]; + /*0x00DB*/ u8 filler_00DB[1]; + /*0x00DC*/ u8 unk_00DC[11]; + /*0x00E7*/ u8 filler_0xE7[0xF4 - 0xE7]; + /*0x00F4*/ u8 unk_00F4[11][2]; + /*0x010A*/ u8 filler_010A[2]; + /*0x010C*/ u8 unk_010C[5]; + /*0x0111*/ u8 filler_0111[11]; + /*0x011C*/ u32 unk_011C; + /*0x0120*/ u32 unk_0120; + /*0x0124*/ u8 filler_0124[8]; + /*0x012C*/ u32 unk_012C; + /*0x0130*/ u32 unk_0130[5]; + /*0x0144*/ u8 filler_0144[0x318C - 0x0144]; + /*0x318C*/ struct DodrioBerryPickingSubstruct_318C unk_318C[5]; + /*0x31A0*/ struct DodrioBerryPickingSubstruct_31A0 unk_31A0[5]; + /*0x32CC*/ struct DodrioBerryPickingSubstruct_31A0 unk_32CC; + /*0x3308*/ u8 unk_3308[0x3330 - 0x3308]; +}; // size = 0x3330 + +EWRAM_DATA struct DodrioBerryPickingStruct * gUnknown_02022C98 = NULL; +IWRAM_DATA bool32 gUnknown_03000DB0; + +void sub_8024A1C(void); +void sub_8024A30(struct DodrioBerryPickingStruct *); +void sub_8024BC8(u8 taskId); +void sub_80261F8(struct DodrioBerryPickingSubstruct_318C *, struct Pokemon *); +void sub_80261CC(void); +void sub_8026B5C(u8, u8*, u8*); +void sub_80273F0(void); + +void sub_802493C(u16 a0, void (*a1)(void)) +{ + gUnknown_03000DB0 = FALSE; + + if (gReceivedRemoteLinkPlayers != 0 && (gUnknown_02022C98 = AllocZeroed(sizeof(*gUnknown_02022C98))) != NULL) + { + sub_8024A1C(); + sub_8024A30(gUnknown_02022C98); + gUnknown_02022C98->savedCallback = a1; + gUnknown_02022C98->multiplayerId = GetMultiplayerId(); + gUnknown_02022C98->unk_32CC = gUnknown_02022C98->unk_31A0[gUnknown_02022C98->multiplayerId]; + sub_80261F8(&gUnknown_02022C98->unk_318C[gUnknown_02022C98->multiplayerId], &gPlayerParty[a0]); + CreateTask(sub_8024BC8, 1); + SetMainCallback2(sub_80261CC); + sub_80273F0(); + sub_8026B5C(gUnknown_02022C98->unk_0024, &gUnknown_02022C98->unk_0044, &gUnknown_02022C98->unk_0048); + StopMapMusic(); + PlayNewMapMusic(MUS_RG_KINOMIKUI); + } + else + { + SetMainCallback2(a1); + return; + } +} + +void sub_8024A1C(void) +{ + ResetTasks(); + ResetSpriteData(); + FreeAllSpritePalettes(); +} + +void sub_8024A30(struct DodrioBerryPickingStruct * data) +{ + u8 i; + + data->unk_000C = 0; + data->unk_0010 = 0; + data->unk_0014 = 0; + data->unk_0018 = 0; + data->unk_001C = 0; + data->unk_011C = 0; + data->unk_0120 = 0; + data->unk_0030 = 0; + data->unk_0040 = 0; + data->unk_003C = 0; + data->unk_012C = 0; + + for (i = 0; i < 4; i++) + { + data->unk_0098[i] = 0; + } + + for (i = 0; i < 5; i++) + { + data->unk_00A8[i] = 0; + data->unk_00B0[i] = 0; + data->unk_004A[i][0] = 0; + data->unk_004A[i][1] = 0; + data->unk_004A[i][2] = 0; + data->unk_004A[i][3] = 0; + data->unk_004A[i][5] = 0; + data->unk_010C[i] = 0; + data->unk_0130[i] = 0; + } + + for (i = 0; i < 11; i++) + { + data->unk_00D0[i] = 0; + data->unk_00DC[i] = 0; + data->unk_00C4[i] = 0; + data->unk_00F4[i][0] = 0xFF; + data->unk_00F4[i][1] = 0xFF; + } + + data->unk_0020 = GetMultiplayerId() == 0 ? 1 : 0; + data->unk_0024 = GetLinkPlayerCount(); + data->unk_0034[0] = GetMultiplayerId(); + for (i = 1; i < data->unk_0024; i++) + { + data->unk_0034[i] = data->unk_0034[i - 1] + 1; + if (data->unk_0034[i] > data->unk_0024 - 1) + data->unk_0034[i] %= data->unk_0024; + } +} diff --git a/src/union_room.c b/src/union_room.c index 51d48fdcf..68a517ea6 100644 --- a/src/union_room.c +++ b/src/union_room.c @@ -194,7 +194,6 @@ IWRAM_DATA struct UnkStruct_Leader *gUnknown_03000DA0; IWRAM_DATA struct UnkStruct_Group *gUnknown_03000DA4; IWRAM_DATA struct UnkStruct_URoom *gUnknown_03000DA8; IWRAM_DATA void *gUnknown_03000DAC; -IWRAM_DATA bool32 gUnknown_03000DB0; // this file's functions void sub_80173E0(u8 windowId, u8 arg1, const u8 *str, u8 arg3, u8 arg4, u8 arg5); diff --git a/sym_bss.txt b/sym_bss.txt index 1eef0130b..5117ab19d 100644 --- a/sym_bss.txt +++ b/sym_bss.txt @@ -8,6 +8,7 @@ .include "src/link.o" .include "src/link_rfu.o" .include "src/union_room.o" + .include "src/dodrio_berry_picking.o" .include "src/rtc.o" .include "src/main_menu.o" .include "src/rom_8034C54.o" diff --git a/sym_ewram.txt b/sym_ewram.txt index e4b315c92..937568855 100644 --- a/sym_ewram.txt +++ b/sym_ewram.txt @@ -76,8 +76,7 @@ gUnknown_02022C90: @ 2022C90 gUnknown_02022C94: @ 2022C94 .space 0x4 -gUnknown_02022C98: @ 2022C98 - .space 0x4 + .include "src/dodrio_berry_picking.o" gUnknown_02022C9C: @ 2022C9C .space 0x14