diff options
-rw-r--r-- | asm/secret_base.s | 770 | ||||
-rw-r--r-- | include/global.h | 4 | ||||
-rw-r--r-- | include/secret_base.h | 15 | ||||
-rw-r--r-- | ld_script.txt | 1 | ||||
-rw-r--r-- | src/field/secret_base.c | 484 |
5 files changed, 444 insertions, 830 deletions
diff --git a/asm/secret_base.s b/asm/secret_base.s deleted file mode 100644 index 9033e0765..000000000 --- a/asm/secret_base.s +++ /dev/null @@ -1,770 +0,0 @@ - .include "constants/gba_constants.inc" - .include "constants/species_constants.inc" - .include "asm/macros.inc" - - .syntax unified - -.section .text_80BC1D0 - - thumb_func_start sub_80BD1FC -sub_80BD1FC: @ 80BD1FC - push {r4,r5,lr} - adds r5, r0, 0 - ldrb r0, [r5] - cmp r0, 0 - beq _080BD278 - ldrb r0, [r5] - bl sub_80BD12C - lsls r0, 16 - lsrs r4, r0, 16 - asrs r2, r0, 16 - cmp r2, 0 - beq _080BD278 - movs r0, 0x1 - negs r0, r0 - cmp r2, r0 - beq _080BD254 - ldr r0, _080BD24C @ =gSaveBlock1 - lsls r1, r2, 2 - adds r1, r2 - lsls r1, 5 - adds r1, r0 - ldr r0, _080BD250 @ =0x00001a09 - adds r1, r0 - ldrb r1, [r1] - lsls r0, r1, 28 - lsrs r0, 28 - cmp r0, 0x1 - beq _080BD278 - lsrs r0, r1, 6 - cmp r0, 0x2 - bne _080BD246 - ldrb r1, [r5, 0x1] - movs r0, 0xF - ands r0, r1 - cmp r0, 0x1 - bne _080BD278 -_080BD246: - lsls r4, 24 - lsrs r4, 24 - b _080BD26C - .align 2, 0 -_080BD24C: .4byte gSaveBlock1 -_080BD250: .4byte 0x00001a09 -_080BD254: - bl sub_80BD170 - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0 - bne _080BD26C - bl sub_80BD1B0 - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0 - beq _080BD278 -_080BD26C: - adds r0, r4, 0 - adds r1, r5, 0 - bl sub_80BD034 - adds r0, r4, 0 - b _080BD27A -_080BD278: - movs r0, 0 -_080BD27A: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end sub_80BD1FC - - thumb_func_start sub_80BD280 -sub_80BD280: @ 80BD280 - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - sub sp, 0xA0 - ldr r0, _080BD324 @ =gSaveBlock1 + 0x1A08 - mov r8, r0 - movs r2, 0x1 -_080BD290: - adds r1, r2, 0x1 - lsls r0, r1, 24 - lsrs r5, r0, 24 - mov r9, r1 - cmp r5, 0x13 - bhi _080BD30C - lsls r0, r2, 2 - adds r0, r2 - lsls r0, 5 - mov r1, r8 - adds r6, r0, r1 - movs r7, 0xC0 -_080BD2A8: - ldrb r0, [r6, 0x1] - adds r3, r7, 0 - ands r3, r0 - cmp r3, 0 - bne _080BD2C6 - lsls r2, r5, 2 - adds r0, r2, r5 - lsls r0, 5 - add r0, r8 - ldrb r1, [r0, 0x1] - adds r0, r7, 0 - ands r0, r1 - adds r4, r2, 0 - cmp r0, 0x40 - beq _080BD2DE -_080BD2C6: - cmp r3, 0x80 - bne _080BD302 - lsls r2, r5, 2 - adds r0, r2, r5 - lsls r0, 5 - add r0, r8 - ldrb r1, [r0, 0x1] - adds r0, r7, 0 - ands r0, r1 - adds r4, r2, 0 - cmp r0, 0x80 - beq _080BD302 -_080BD2DE: - mov r0, sp - adds r1, r6, 0 - movs r2, 0xA0 - bl memcpy - adds r4, r5 - lsls r4, 5 - add r4, r8 - adds r0, r6, 0 - adds r1, r4, 0 - movs r2, 0xA0 - bl memcpy - adds r0, r4, 0 - mov r1, sp - movs r2, 0xA0 - bl memcpy -_080BD302: - adds r0, r5, 0x1 - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0x13 - bls _080BD2A8 -_080BD30C: - mov r1, r9 - lsls r0, r1, 24 - lsrs r2, r0, 24 - cmp r2, 0x12 - bls _080BD290 - add sp, 0xA0 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080BD324: .4byte gSaveBlock1 + 0x1A08 - thumb_func_end sub_80BD280 - - thumb_func_start sub_80BD328 -sub_80BD328: @ 80BD328 - push {r4-r6,lr} - adds r6, r0, 0 - lsls r1, 24 - lsrs r5, r1, 24 - movs r4, 0x1 -_080BD332: - lsls r0, r4, 2 - adds r0, r4 - lsls r0, 5 - adds r1, r0, r6 - ldrb r0, [r1, 0x1] - lsrs r0, 6 - cmp r0, r5 - bne _080BD348 - adds r0, r1, 0 - bl sub_80BD1FC -_080BD348: - adds r0, r4, 0x1 - lsls r0, 16 - lsrs r4, r0, 16 - cmp r4, 0x13 - bls _080BD332 - pop {r4-r6} - pop {r0} - bx r0 - thumb_func_end sub_80BD328 - - thumb_func_start sub_80BD358 -sub_80BD358: @ 80BD358 - push {r4-r6,lr} - adds r5, r0, 0 - ldrb r0, [r5] - cmp r0, 0 - beq _080BD372 - ldrb r0, [r5, 0x1] - lsls r0, 27 - ldr r1, _080BD378 @ =gSaveBlock2 - lsrs r0, 31 - adds r4, r1, 0 - ldrb r1, [r4, 0x8] - cmp r0, r1 - beq _080BD37C -_080BD372: - movs r0, 0 - b _080BD3D4 - .align 2, 0 -_080BD378: .4byte gSaveBlock2 -_080BD37C: - movs r2, 0 - adds r3, r5, 0 - adds r3, 0x9 - adds r6, r4, 0 - adds r6, 0xA -_080BD386: - adds r0, r3, r2 - adds r1, r2, r6 - ldrb r0, [r0] - ldrb r1, [r1] - cmp r0, r1 - bne _080BD372 - adds r0, r2, 0x1 - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0x3 - bls _080BD386 - movs r2, 0 - ldrb r0, [r5, 0x2] - cmp r0, 0xFF - bne _080BD3AA - ldrb r0, [r4] - cmp r0, 0xFF - beq _080BD3D2 -_080BD3AA: - adds r3, r5, 0x2 - adds r0, r3, r2 - adds r1, r2, r4 - ldrb r0, [r0] - ldrb r1, [r1] - cmp r0, r1 - bne _080BD372 - adds r0, r2, 0x1 - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0x6 - bhi _080BD3D2 - adds r0, r3, r2 - ldrb r0, [r0] - cmp r0, 0xFF - bne _080BD3AA - adds r0, r2, r4 - ldrb r0, [r0] - cmp r0, 0xFF - bne _080BD3AA -_080BD3D2: - movs r0, 0x1 -_080BD3D4: - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end sub_80BD358 - - thumb_func_start sub_80BD3DC -sub_80BD3DC: @ 80BD3DC - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - mov r10, r0 - mov r9, r1 - mov r8, r2 - movs r5, 0 - movs r6, 0 -_080BD3F0: - movs r0, 0x1 - ands r0, r5 - cmp r0, 0 - bne _080BD41A - lsls r0, r6, 2 - adds r0, r6 - lsls r0, 5 - mov r1, r10 - adds r4, r1, r0 - adds r0, r4, 0 - bl sub_80BD358 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _080BD41A - adds r0, r4, 0 - bl sub_80BB4AC - movs r0, 0x1 - orrs r5, r0 -_080BD41A: - movs r7, 0x2 - movs r0, 0x2 - ands r0, r5 - cmp r0, 0 - bne _080BD448 - lsls r0, r6, 2 - adds r0, r6 - lsls r0, 5 - mov r1, r9 - adds r4, r1, r0 - adds r0, r4, 0 - bl sub_80BD358 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _080BD448 - adds r0, r4, 0 - bl sub_80BB4AC - orrs r5, r7 - lsls r0, r5, 24 - lsrs r5, r0, 24 -_080BD448: - movs r7, 0x4 - movs r0, 0x4 - ands r0, r5 - cmp r0, 0 - bne _080BD476 - lsls r0, r6, 2 - adds r0, r6 - lsls r0, 5 - mov r1, r8 - adds r4, r1, r0 - adds r0, r4, 0 - bl sub_80BD358 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _080BD476 - adds r0, r4, 0 - bl sub_80BB4AC - orrs r5, r7 - lsls r0, r5, 24 - lsrs r5, r0, 24 -_080BD476: - cmp r5, 0x7 - beq _080BD484 - adds r0, r6, 0x1 - lsls r0, 24 - lsrs r6, r0, 24 - cmp r6, 0x13 - bls _080BD3F0 -_080BD484: - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_80BD3DC - - thumb_func_start sub_80BD494 -sub_80BD494: @ 80BD494 - push {r4-r7,lr} - mov r7, r8 - push {r7} - adds r6, r0, 0 - mov r8, r1 - lsls r2, 24 - lsrs r7, r2, 24 - movs r5, 0 -_080BD4A4: - lsls r0, r5, 2 - adds r0, r5 - lsls r0, 5 - mov r1, r8 - adds r4, r0, r1 - ldrb r0, [r4] - cmp r0, 0 - beq _080BD4FE - adds r0, r6, 0 - adds r1, r4, 0 - bl sub_80BD0EC - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _080BD4FE - cmp r7, 0 - bne _080BD4D0 - adds r0, r4, 0 - bl sub_80BB4AC - b _080BD508 -_080BD4D0: - ldrh r0, [r6, 0xE] - ldrh r3, [r4, 0xE] - cmp r0, r3 - bls _080BD4E0 - adds r0, r4, 0 - bl sub_80BB4AC - b _080BD508 -_080BD4E0: - ldrb r0, [r6, 0x1] - lsls r0, 28 - lsrs r0, 28 - ldrb r1, [r4, 0x1] - movs r3, 0x10 - negs r3, r3 - adds r2, r3, 0 - ands r1, r2 - orrs r1, r0 - strb r1, [r4, 0x1] - adds r0, r6, 0 - bl sub_80BB4AC - movs r0, 0x1 - b _080BD50A -_080BD4FE: - adds r0, r5, 0x1 - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0x13 - bls _080BD4A4 -_080BD508: - movs r0, 0 -_080BD50A: - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_80BD494 - - thumb_func_start sub_80BD514 -sub_80BD514: @ 80BD514 - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - mov r9, r0 - adds r7, r1, 0 - mov r8, r2 - adds r6, r3, 0 - movs r5, 0x1 -_080BD526: - lsls r0, r5, 2 - adds r0, r5 - lsls r0, 5 - mov r1, r9 - adds r4, r0, r1 - ldrb r0, [r4] - cmp r0, 0 - beq _080BD578 - ldrb r1, [r4, 0x1] - movs r0, 0xC0 - ands r0, r1 - cmp r0, 0x40 - bne _080BD54E - movs r2, 0x10 - negs r2, r2 - adds r0, r2, 0 - ands r0, r1 - movs r1, 0x1 - orrs r0, r1 - strb r0, [r4, 0x1] -_080BD54E: - adds r0, r4, 0 - adds r1, r7, 0 - adds r2, r5, 0 - bl sub_80BD494 - lsls r0, 24 - cmp r0, 0 - bne _080BD578 - adds r0, r4, 0 - mov r1, r8 - adds r2, r5, 0 - bl sub_80BD494 - lsls r0, 24 - cmp r0, 0 - bne _080BD578 - adds r0, r4, 0 - adds r1, r6, 0 - adds r2, r5, 0 - bl sub_80BD494 -_080BD578: - adds r0, r5, 0x1 - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0x13 - bls _080BD526 - movs r5, 0 -_080BD584: - lsls r0, r5, 2 - adds r0, r5 - lsls r0, 5 - adds r4, r0, r7 - ldrb r0, [r4] - cmp r0, 0 - beq _080BD5B8 - ldrb r0, [r4, 0x1] - movs r2, 0x21 - negs r2, r2 - adds r1, r2, 0 - ands r0, r1 - strb r0, [r4, 0x1] - adds r0, r4, 0 - mov r1, r8 - adds r2, r5, 0 - bl sub_80BD494 - lsls r0, 24 - cmp r0, 0 - bne _080BD5B8 - adds r0, r4, 0 - adds r1, r6, 0 - adds r2, r5, 0 - bl sub_80BD494 -_080BD5B8: - adds r0, r5, 0x1 - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0x13 - bls _080BD584 - movs r5, 0 - movs r0, 0x21 - negs r0, r0 - adds r7, r0, 0 -_080BD5CA: - lsls r0, r5, 2 - adds r0, r5 - lsls r4, r0, 5 - mov r2, r8 - adds r1, r4, r2 - ldrb r0, [r1] - cmp r0, 0 - beq _080BD5EA - ldrb r0, [r1, 0x1] - ands r0, r7 - strb r0, [r1, 0x1] - adds r0, r1, 0 - adds r1, r6, 0 - adds r2, r5, 0 - bl sub_80BD494 -_080BD5EA: - adds r1, r4, r6 - ldrb r0, [r1] - cmp r0, 0 - beq _080BD5F8 - ldrb r0, [r1, 0x1] - ands r0, r7 - strb r0, [r1, 0x1] -_080BD5F8: - adds r0, r5, 0x1 - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0x13 - bls _080BD5CA - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_80BD514 - - thumb_func_start sub_80BD610 -sub_80BD610: @ 80BD610 - push {r4-r6,lr} - adds r4, r0, 0 - adds r5, r1, 0 - adds r6, r2, 0 - bl sub_80BD3DC - ldr r0, _080BD670 @ =gSaveBlock1 + 0x1A08 - adds r1, r4, 0 - adds r2, r5, 0 - adds r3, r6, 0 - bl sub_80BD514 - adds r0, r4, 0 - bl sub_80BD1FC - adds r0, r5, 0 - bl sub_80BD1FC - adds r0, r6, 0 - bl sub_80BD1FC - adds r0, r4, 0 - movs r1, 0x1 - bl sub_80BD328 - adds r0, r5, 0 - movs r1, 0x1 - bl sub_80BD328 - adds r0, r6, 0 - movs r1, 0x1 - bl sub_80BD328 - adds r0, r4, 0 - movs r1, 0 - bl sub_80BD328 - adds r0, r5, 0 - movs r1, 0 - bl sub_80BD328 - adds r0, r6, 0 - movs r1, 0 - bl sub_80BD328 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_080BD670: .4byte gSaveBlock1 + 0x1A08 - thumb_func_end sub_80BD610 - - thumb_func_start sub_80BD674 -sub_80BD674: @ 80BD674 - push {r4-r7,lr} - adds r6, r0, 0 - adds r5, r1, 0 - lsls r2, 24 - lsrs r7, r2, 24 - movs r0, 0x60 - bl FlagGet - lsls r0, 24 - cmp r0, 0 - bne _080BD68C - b _080BD790 -_080BD68C: - bl GetLinkPlayerCount - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x2 - beq _080BD69E - cmp r0, 0x3 - beq _080BD6BA - b _080BD6C8 -_080BD69E: - lsls r4, r5, 1 - adds r0, r6, r4 - movs r1, 0 - adds r2, r5, 0 - bl memset - adds r4, r5 - adds r4, r6, r4 - adds r0, r4, 0 - movs r1, 0 - adds r2, r5, 0 - bl memset - b _080BD6C8 -_080BD6BA: - lsls r0, r5, 1 - adds r0, r5 - adds r0, r6, r0 - movs r1, 0 - adds r2, r5, 0 - bl memset -_080BD6C8: - cmp r7, 0x1 - beq _080BD6F0 - cmp r7, 0x1 - bgt _080BD6D6 - cmp r7, 0 - beq _080BD6E0 - b _080BD71C -_080BD6D6: - cmp r7, 0x2 - beq _080BD700 - cmp r7, 0x3 - beq _080BD710 - b _080BD71C -_080BD6E0: - adds r0, r6, r5 - lsls r2, r5, 1 - adds r1, r6, r2 - adds r2, r5 - adds r2, r6, r2 - bl sub_80BD610 - b _080BD71C -_080BD6F0: - lsls r1, r5, 1 - adds r0, r6, r1 - adds r1, r5 - adds r1, r6, r1 - adds r2, r6, 0 - bl sub_80BD610 - b _080BD71C -_080BD700: - lsls r0, r5, 1 - adds r0, r5 - adds r0, r6, r0 - adds r2, r6, r5 - adds r1, r6, 0 - bl sub_80BD610 - b _080BD71C -_080BD710: - adds r1, r6, r5 - lsls r2, r5, 1 - adds r2, r6, r2 - adds r0, r6, 0 - bl sub_80BD610 -_080BD71C: - movs r3, 0x1 - ldr r6, _080BD798 @ =gSaveBlock1 - movs r5, 0x10 - negs r5, r5 - ldr r4, _080BD79C @ =0x00001a09 -_080BD726: - lsls r0, r3, 2 - adds r0, r3 - lsls r0, 5 - adds r0, r6 - adds r2, r0, r4 - ldrb r1, [r2] - lsls r0, r1, 28 - lsrs r0, 28 - cmp r0, 0x1 - bne _080BD746 - movs r0, 0x3F - ands r0, r1 - movs r1, 0x40 - orrs r0, r1 - ands r0, r5 - strb r0, [r2] -_080BD746: - adds r0, r3, 0x1 - lsls r0, 16 - lsrs r3, r0, 16 - cmp r3, 0x13 - bls _080BD726 - bl sub_80BD280 - movs r3, 0x1 - ldr r4, _080BD798 @ =gSaveBlock1 - ldr r6, _080BD79C @ =0x00001a09 - adds r7, r4, 0 - movs r5, 0x3F -_080BD75E: - lsls r0, r3, 2 - adds r0, r3 - lsls r0, 5 - adds r0, r4 - adds r2, r0, r6 - ldrb r1, [r2] - lsrs r0, r1, 6 - cmp r0, 0x2 - bne _080BD776 - adds r0, r5, 0 - ands r0, r1 - strb r0, [r2] -_080BD776: - adds r0, r3, 0x1 - lsls r0, 16 - lsrs r3, r0, 16 - cmp r3, 0x13 - bls _080BD75E - ldr r0, _080BD7A0 @ =0x00001a16 - adds r2, r7, r0 - ldrh r1, [r2] - ldr r0, _080BD7A4 @ =0x0000ffff - cmp r1, r0 - beq _080BD790 - adds r0, r1, 0x1 - strh r0, [r2] -_080BD790: - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080BD798: .4byte gSaveBlock1 -_080BD79C: .4byte 0x00001a09 -_080BD7A0: .4byte 0x00001a16 -_080BD7A4: .4byte 0x0000ffff - thumb_func_end sub_80BD674 - - .align 2, 0 @ Don't pad with nop. diff --git a/include/global.h b/include/global.h index e6a073aa5..7c1ac9c68 100644 --- a/include/global.h +++ b/include/global.h @@ -130,12 +130,12 @@ struct UCoords16 struct SecretBaseRecord { - /*ID?*/ /*0x1A08*/ u8 secretBaseId; + /*0x1A08*/ u8 secretBaseId; /*0x1A09*/ u8 sbr_field_1_0:4; /*0x1A09*/ u8 gender:1; /*0x1A09*/ u8 sbr_field_1_5:1; /*0x1A09*/ u8 sbr_field_1_6:2; - /*0x1A0A*/ u8 sbr_field_2[7]; // 0xFF bytes? + /*0x1A0A*/ u8 playerName[OT_NAME_LENGTH]; /*0x1A11*/ u8 trainerId[4]; // byte 0 is used for determining trainer class /*0x1A16*/ u16 sbr_field_e; /*0x1A18*/ u8 sbr_field_10; diff --git a/include/secret_base.h b/include/secret_base.h index 0c4ae6694..07784556f 100644 --- a/include/secret_base.h +++ b/include/secret_base.h @@ -1,17 +1,20 @@ #ifndef GUARD_SECRET_BASE_H #define GUARD_SECRET_BASE_H +// Maximum number of secret bases the game can store. This include 1 for the player, and up to 19 others from linked players. +#define MAX_SECRET_BASES 20 + void ResetSecretBases(void); -void sub_80BB970(struct MapEvents *); +void sub_80BB970(struct MapEvents *events); u8 sub_80BBB24(void); -void sub_80BBCCC(u8); +void sub_80BBCCC(u8 flagIn); void sub_80BC038(struct MapPosition *, struct MapEvents *); u8 sub_80BC050(); -u8 *GetSecretBaseMapName(u8 *); +u8 *GetSecretBaseMapName(u8 *dest); void sub_80BC300(); -u8 sub_80BCCA4(u8); +u8 sub_80BCCA4(u8 secretBaseIndex); const u8 *sub_80BCCE8(void); -void sub_80BCF1C(u8); -void sub_80BD674(void *, u32, u8); +void sub_80BCF1C(u8 taskId); +void sub_80BD674(void *playerRecords, u32 size, u8 c); #endif // GUARD_SECRET_BASE_H diff --git a/ld_script.txt b/ld_script.txt index f16611f57..a72a43f17 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -154,7 +154,6 @@ SECTIONS { src/engine/record_mixing.o(.text); src/debug/sound_check_menu.o(.text); src/field/secret_base.o(.text); - asm/secret_base.o(.text_80BC1D0); src/field/tv.o(.text); asm/contest_link_80C2020.o(.text); src/script_pokemon_util_80C4BF0.o(.text); diff --git a/src/field/secret_base.c b/src/field/secret_base.c index be73f04bf..f2ed6adb6 100644 --- a/src/field/secret_base.c +++ b/src/field/secret_base.c @@ -12,6 +12,7 @@ #include "field_specials.h" #include "field_weather.h" #include "fieldmap.h" +#include "link.h" #include "main.h" #include "sound.h" #include "songs.h" @@ -33,29 +34,27 @@ #include "vars.h" +static void sub_80BC7D8(u8 taskId); +static void sub_80BC824(u8 taskId); static u8 sub_80BC948(u8 a); - -extern u8 gUnknown_0815F399[]; -extern u8 gUnknown_0815F49A[]; +static void sub_80BC980(u8 taskId); +static void sub_80BC9E4(u8 taskId); +static void sub_80BCA84(u8); +static void sub_80BCAEC(u8 taskId); +static void sub_80BCB90(u8); +static void sub_80BCBC0(u8); +static void sub_80BCBF8(u8 taskId); +static void sub_80BCC54(u8 taskId); +static void Task_SecretBasePC_Registry(u8 taskId); extern void DoDecorationSoundEffect(s16 metatileId); extern void sub_80C6A54(s16 x, s16 y); extern void sub_80C68A4(s16 metatileId, s16 x, s16 y); extern void DoYellowCave4Sparkle(void); -void sub_80BCA84(u8); -void sub_80BCBF8(u8 taskId); -void sub_80BCB90(u8); -void sub_80BCBC0(u8); - -void Task_SecretBasePC_Registry(u8 taskId); -void sub_80BC7D8(u8 taskId); -void sub_80BC824(u8 taskId); -void sub_80BCC54(u8 taskId); -void sub_80BC980(u8 taskId); -void sub_80BC9E4(u8 taskId); -void sub_80BCAEC(u8 taskId); -u8 sub_80BCCA4(u8); +extern u8 gUnknown_0815F399[]; +extern u8 gUnknown_0815F49A[]; +extern u8 gUnknown_020387DC; const struct { @@ -71,7 +70,6 @@ const struct {0x271, 0x278} }; -extern u8 gUnknown_020387DC; const u8 gUnknown_083D1374[] = { MAP_ID_SECRET_BASE_RED_CAVE1, 0, @@ -152,13 +150,13 @@ extern u8 UnknownString_81A2B2A[]; extern u8 UnknownString_81A2754[]; -void sub_80BB4AC(struct SecretBaseRecord *record) // 080bb4ac +void ClearSecretBase(struct SecretBaseRecord *record) { u16 i; u16 j; record->secretBaseId = 0; - for (i=0; i<7; i++) - record->sbr_field_2[i] = 0xff; + for (i=0; i<OT_NAME_LENGTH; i++) + record->playerName[i] = 0xff; for (i=0; i<4; i++) record->trainerId[i] = 0x00; record->sbr_field_e = 0; @@ -184,32 +182,32 @@ void sub_80BB4AC(struct SecretBaseRecord *record) // 080bb4ac } } -void ResetSecretBase(u8 idx) // 80bb594 +void ResetSecretBase(u8 idx) { - sub_80BB4AC(&(gSaveBlock1.secretBases[idx])); + ClearSecretBase(&gSaveBlock1.secretBases[idx]); } -void ResetSecretBases(void) // 080bb5b4 +void ResetSecretBases(void) { u16 i; - for (i=0; i<20; i++) + for (i = 0; i < MAX_SECRET_BASES; i++) ResetSecretBase(i); } -void sub_80BB5D0(void) // 080bb5d0 +void sub_80BB5D0(void) { gUnknown_020387DC = gSpecialVar_0x8004; } -void sub_80BB5E4(void) // 80bb5e4 +void sub_80BB5E4(void) { - u16 idx; + u16 i; gScriptResult = 0; - for (idx=0; idx<20; idx++) { - if (gUnknown_020387DC != gSaveBlock1.secretBases[idx].secretBaseId) + for (i = 0; i < MAX_SECRET_BASES; i++) { + if (gUnknown_020387DC != gSaveBlock1.secretBases[i].secretBaseId) continue; gScriptResult = 1; - VarSet(VAR_0x4054, idx); + VarSet(VAR_0x4054, i); break; } } @@ -315,8 +313,8 @@ void sub_80BB8CC(void) } VarSet(VAR_0x4054, 0); nameLength = sub_80BB8A8(gSaveBlock2.playerName); - memset(gSaveBlock1.secretBases[0].sbr_field_2, 0xFF, 7); - StringCopyN(gSaveBlock1.secretBases[0].sbr_field_2, gSaveBlock2.playerName, nameLength); + memset(gSaveBlock1.secretBases[0].playerName, 0xFF, OT_NAME_LENGTH); + StringCopyN(gSaveBlock1.secretBases[0].playerName, gSaveBlock2.playerName, nameLength); gSaveBlock1.secretBases[0].gender = gSaveBlock2.playerGender; VarSet(VAR_SECRET_BASE_MAP, gMapHeader.regionMapSectionId); } @@ -327,7 +325,7 @@ void sub_80BB970(struct MapEvents *events) s16 tile_id; for (bgevidx=0; bgevidx<events->bgEventCount; bgevidx++) { if (events->bgEvents[bgevidx].kind == 8) { - for (jdx=0; jdx<20; jdx++) { + for (jdx=0; jdx<MAX_SECRET_BASES; jdx++) { if (gSaveBlock1.secretBases[jdx].secretBaseId == events->bgEvents[bgevidx].bgUnion.secretBaseId) { tile_id = MapGridGetMetatileIdAt(events->bgEvents[bgevidx].x + 7, events->bgEvents[bgevidx].y + 7); for (idx=0; idx<7; idx++) { @@ -364,7 +362,7 @@ void sub_80BBA48(u8 taskid) case 2: curbaseid = VarGet(VAR_0x4054); if (gSaveBlock1.secretBases[curbaseid].sbr_field_10 < 0xff) - gSaveBlock1.secretBases[curbaseid].sbr_field_10 ++; + gSaveBlock1.secretBases[curbaseid].sbr_field_10++; sub_80BBA14(); warp_in(); gFieldCallback = sub_8080990; @@ -503,7 +501,6 @@ void sub_80BBDD0(void) } } } - #else __attribute__((naked)) void sub_80BBDD0(void) @@ -808,7 +805,7 @@ void sub_80BC114(void) { u8 sub_80BC14C(u8 sbid) { s16 idx; - for (idx=0; idx<20; idx++) { + for (idx=0; idx<MAX_SECRET_BASES; idx++) { if (gSaveBlock1.secretBases[idx].secretBaseId == sbid) return idx; } @@ -819,9 +816,9 @@ u8 *sub_80BC190(u8 *dest, u8 arg1) { // 80bc190 u8 local1; u8 *str; - local1 = sub_80BB8A8(gSaveBlock1.secretBases[arg1].sbr_field_2); + local1 = sub_80BB8A8(gSaveBlock1.secretBases[arg1].playerName); - str = StringCopyN(dest, gSaveBlock1.secretBases[arg1].sbr_field_2, local1); + str = StringCopyN(dest, gSaveBlock1.secretBases[arg1].playerName, local1); str[0] = EOS; #if ENGLISH @@ -837,7 +834,7 @@ u8 *GetSecretBaseMapName(u8 *dest) { } void sub_80BC224(void) { - u8 *var0 = gSaveBlock1.secretBases[(u8)VarGet(VAR_0x4054)].sbr_field_2; + u8 *var0 = gSaveBlock1.secretBases[(u8)VarGet(VAR_0x4054)].playerName; u8 *var1 = gStringVar1; u8 var2 = sub_80BB8A8(var0); u8 *var3 = StringCopyN(var1, var0, var2); @@ -1107,7 +1104,7 @@ u8 sub_80BC538(void) s16 secretBaseIndex; u8 retVal = 0; - for (secretBaseIndex = 1; secretBaseIndex < 20; secretBaseIndex++) + for (secretBaseIndex = 1; secretBaseIndex < MAX_SECRET_BASES; secretBaseIndex++) { if (sub_80BC268(secretBaseIndex) == TRUE) { @@ -1159,7 +1156,7 @@ void Task_SecretBasePC_Registry(u8 taskId) sub_80F944C(); LoadScrollIndicatorPalette(); - taskData = &gTasks[taskId].data[0]; + taskData = gTasks[taskId].data; taskData[0] = sub_80BC538(); if (taskData[0] != 0) { @@ -1192,7 +1189,7 @@ void sub_80BC6B0(u8 taskId) u8 m = 0; u8 n = 0; - for (i = 1; i < 20; i++) + for (i = 1; i < MAX_SECRET_BASES; i++) { if (m == taskData[2]) { @@ -1204,7 +1201,7 @@ void sub_80BC6B0(u8 taskId) m++; } - for (i = m; i < 20; i++) + for (i = m; i < MAX_SECRET_BASES; i++) { if (sub_80BC268(i) == TRUE) { @@ -1307,7 +1304,7 @@ u8 sub_80BC948(u8 a) u8 secretBaseIndex; u8 count = 0; - for (secretBaseIndex = 1; secretBaseIndex < 20; secretBaseIndex++) + for (secretBaseIndex = 1; secretBaseIndex < MAX_SECRET_BASES; secretBaseIndex++) { if (sub_80BC268(secretBaseIndex) == TRUE) { @@ -1454,7 +1451,7 @@ void sub_80BCC54(u8 taskId) u8 sub_80BCCA4(u8 secretBaseIndex) { - return (gSaveBlock1.secretBases[secretBaseIndex].sbr_field_2[7] % 5) + return (gSaveBlock1.secretBases[secretBaseIndex].playerName[OT_NAME_LENGTH] % 5) + gSaveBlock1.secretBases[secretBaseIndex].gender * 5; } @@ -1509,7 +1506,7 @@ void sub_80BCE90() { u8 i; - for (i = 0; i < 20; i++) + for (i = 0; i < MAX_SECRET_BASES; i++) { gSaveBlock1.secretBases[i].sbr_field_1_5 = 0; } @@ -1593,9 +1590,9 @@ bool8 sub_80BD0A0(struct SecretBaseRecord *baseA, struct SecretBaseRecord *baseB { u8 i; - for (i = 0; i < 7 && (baseA->sbr_field_2[i] != 0xFF || baseB->sbr_field_2[i] != 0xFF); i++) + for (i = 0; i < OT_NAME_LENGTH && (baseA->playerName[i] != 0xFF || baseB->playerName[i] != 0xFF); i++) { - if (baseA->sbr_field_2[i] != baseB->sbr_field_2[i]) + if (baseA->playerName[i] != baseB->playerName[i]) { return FALSE; } @@ -1619,7 +1616,7 @@ s16 sub_80BD12C(u8 secretBaseId) { s16 i; - for (i = 0; i < 20; i++) + for (i = 0; i < MAX_SECRET_BASES; i++) { if (gSaveBlock1.secretBases[i].secretBaseId == secretBaseId) { @@ -1634,7 +1631,7 @@ u8 sub_80BD170(void) { s16 i; - for (i = 1; i < 20; i++) + for (i = 1; i < MAX_SECRET_BASES; i++) { if (gSaveBlock1.secretBases[i].secretBaseId == 0) { @@ -1649,7 +1646,7 @@ u8 sub_80BD1B0(void) { s16 i; - for (i = 1; i < 20; i++) + for (i = 1; i < MAX_SECRET_BASES; i++) { if (gSaveBlock1.secretBases[i].sbr_field_1_6 == 0 && gSaveBlock1.secretBases[i].sbr_field_1_0 == 0) { @@ -1659,3 +1656,388 @@ u8 sub_80BD1B0(void) return 0; } + +#ifdef NONMATCHING +u8 sub_80BD1FC(struct SecretBaseRecord *secretBase) +{ + s16 secretBaseIndex; + + if (!secretBase->secretBaseId) + { + return 0; + } + + secretBaseIndex = sub_80BD12C(secretBase->secretBaseId); + if (secretBaseIndex) + { + if (secretBaseIndex != -1) + { + if (gSaveBlock1.secretBases[secretBaseIndex].sbr_field_1_0 != 1) + { + if (gSaveBlock1.secretBases[secretBaseIndex].sbr_field_1_6 != 2 + || secretBase->sbr_field_1_0 == 1) + { + sub_80BD034(secretBaseIndex, secretBase); + return secretBaseIndex; + } + } + } + else + { + secretBaseIndex = sub_80BD170(); + if (secretBaseIndex == 0) + { + secretBaseIndex = sub_80BD1B0(); + if (secretBaseIndex) + { + sub_80BD034(secretBaseIndex, secretBase); + return secretBaseIndex; + } + } + else + { + sub_80BD034(secretBaseIndex, secretBase); + return secretBaseIndex; + } + } + } + + return 0; +} +#else +__attribute__((naked)) +u8 sub_80BD1FC(struct SecretBaseRecord *secretBase) +{ + asm(".syntax unified\n\ + push {r4,r5,lr}\n\ + adds r5, r0, 0\n\ + ldrb r0, [r5]\n\ + cmp r0, 0\n\ + beq _080BD278\n\ + ldrb r0, [r5]\n\ + bl sub_80BD12C\n\ + lsls r0, 16\n\ + lsrs r4, r0, 16\n\ + asrs r2, r0, 16\n\ + cmp r2, 0\n\ + beq _080BD278\n\ + movs r0, 0x1\n\ + negs r0, r0\n\ + cmp r2, r0\n\ + beq _080BD254\n\ + ldr r0, _080BD24C @ =gSaveBlock1\n\ + lsls r1, r2, 2\n\ + adds r1, r2\n\ + lsls r1, 5\n\ + adds r1, r0\n\ + ldr r0, _080BD250 @ =0x00001a09\n\ + adds r1, r0\n\ + ldrb r1, [r1]\n\ + lsls r0, r1, 28\n\ + lsrs r0, 28\n\ + cmp r0, 0x1\n\ + beq _080BD278\n\ + lsrs r0, r1, 6\n\ + cmp r0, 0x2\n\ + bne _080BD246\n\ + ldrb r1, [r5, 0x1]\n\ + movs r0, 0xF\n\ + ands r0, r1\n\ + cmp r0, 0x1\n\ + bne _080BD278\n\ +_080BD246:\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + b _080BD26C\n\ + .align 2, 0\n\ +_080BD24C: .4byte gSaveBlock1\n\ +_080BD250: .4byte 0x00001a09\n\ +_080BD254:\n\ + bl sub_80BD170\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + cmp r4, 0\n\ + bne _080BD26C\n\ + bl sub_80BD1B0\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + cmp r4, 0\n\ + beq _080BD278\n\ +_080BD26C:\n\ + adds r0, r4, 0\n\ + adds r1, r5, 0\n\ + bl sub_80BD034\n\ + adds r0, r4, 0\n\ + b _080BD27A\n\ +_080BD278:\n\ + movs r0, 0\n\ +_080BD27A:\n\ + pop {r4,r5}\n\ + pop {r1}\n\ + bx r1\n\ +.syntax divided\n"); +} +#endif + +void sub_80BD280(void) +{ + u8 i; + u8 j; + struct SecretBaseRecord temp; + struct SecretBaseRecord *secretBases = gSaveBlock1.secretBases; + + for (i = 1; i < MAX_SECRET_BASES - 1; i++) + { + for (j = i + 1; j < MAX_SECRET_BASES; j++) + { + if ((!secretBases[i].sbr_field_1_6 && secretBases[j].sbr_field_1_6 == 1) + || (secretBases[i].sbr_field_1_6 == 2 && secretBases[j].sbr_field_1_6 != 2)) + { + temp = secretBases[i]; + secretBases[i] = secretBases[j]; + secretBases[j] = temp; + } + } + } +} + +void sub_80BD328(struct SecretBaseRecord *secretBases, u8 b) +{ + u16 i; + + for (i = 1; i < MAX_SECRET_BASES; i++) + { + if (secretBases[i].sbr_field_1_6 == b) + { + sub_80BD1FC(&secretBases[i]); + } + } +} + +bool8 sub_80BD358(struct SecretBaseRecord *secretBase) +{ + u8 i; + + if (!secretBase->secretBaseId) + return FALSE; + + if (secretBase->secretBaseId && secretBase->gender != gSaveBlock2.playerGender) + return FALSE; + + // Check if the player's trainer Id matches the secret base's id. + for (i = 0; i < 4; i++) + { + if (secretBase->trainerId[i] != gSaveBlock2.playerTrainerId[i]) + return FALSE; + } + + for (i = 0; i < OT_NAME_LENGTH && (secretBase->playerName[i] != 0xFF || gSaveBlock2.playerName[i] != 0xFF); i++) + { + if (secretBase->playerName[i] != gSaveBlock2.playerName[i]) + return FALSE; + } + + return TRUE; +} + +void sub_80BD3DC(struct SecretBaseRecord *basesA, struct SecretBaseRecord *basesB, struct SecretBaseRecord *basesC) +{ + u8 i; + u8 var1 = 0; + + for (i = 0; i < MAX_SECRET_BASES; i++) + { + if ((var1 & 1) == 0) + { + if (sub_80BD358(&basesA[i]) == TRUE) + { + ClearSecretBase(&basesA[i]); + var1 |= 1; + } + } + + if ((var1 & 2) == 0) + { + if (sub_80BD358(&basesB[i]) == TRUE) + { + ClearSecretBase(&basesB[i]); + var1 |= 2; + } + } + + if ((var1 & 4) == 0) + { + if (sub_80BD358(&basesC[i]) == TRUE) + { + ClearSecretBase(&basesC[i]); + var1 |= 4; + } + } + + if (var1 == 7) + { + break; + } + } +} + +bool8 sub_80BD494(struct SecretBaseRecord *base, struct SecretBaseRecord *secretBases, u8 c) +{ + u8 i; + + for (i = 0; i < MAX_SECRET_BASES; i++) + { + if (secretBases[i].secretBaseId) + { + if (sub_80BD0EC(base, &secretBases[i]) == TRUE) + { + if (c == 0) + { + ClearSecretBase(&secretBases[i]); + return FALSE; + } + + if (base->sbr_field_e > secretBases[i].sbr_field_e) + { + ClearSecretBase(&secretBases[i]); + return FALSE; + } + + secretBases[i].sbr_field_1_0 = base->sbr_field_1_0; + + ClearSecretBase(base); + return TRUE; + } + } + } + + return FALSE; +} + +void sub_80BD514(struct SecretBaseRecord *basesA, struct SecretBaseRecord *basesB, struct SecretBaseRecord *basesC, struct SecretBaseRecord *basesD) +{ + u8 i; + + for (i = 1; i < MAX_SECRET_BASES; i++) + { + if (basesA[i].secretBaseId) + { + if (basesA[i].sbr_field_1_6 == 1) + { + basesA[i].sbr_field_1_0 = 1; + } + + if (!sub_80BD494(&basesA[i], basesB, i)) + { + if (!sub_80BD494(&basesA[i], basesC, i)) + { + sub_80BD494(&basesA[i], basesD, i); + } + } + } + } + + for (i = 0; i < MAX_SECRET_BASES; i++) + { + if (basesB[i].secretBaseId) + { + basesB[i].sbr_field_1_5 = 0; + + if (!sub_80BD494(&basesB[i], basesC, i)) + { + sub_80BD494(&basesB[i], basesD, i); + } + } + } + + for (i = 0; i < MAX_SECRET_BASES; i++) + { + if (basesC[i].secretBaseId) + { + basesC[i].sbr_field_1_5 = 0; + sub_80BD494(&basesC[i], basesD, i); + } + + if (basesD[i].secretBaseId) + { + basesD[i].sbr_field_1_5 = 0; + } + } +} + +void sub_80BD610(struct SecretBaseRecord *basesA, struct SecretBaseRecord *basesB, struct SecretBaseRecord *basesC) +{ + sub_80BD3DC(basesA, basesB, basesC); + sub_80BD514(gSaveBlock1.secretBases, basesA, basesB, basesC); + + sub_80BD1FC(basesA); + sub_80BD1FC(basesB); + sub_80BD1FC(basesC); + + sub_80BD328(basesA, 1); + sub_80BD328(basesB, 1); + sub_80BD328(basesC, 1); + + sub_80BD328(basesA, 0); + sub_80BD328(basesB, 0); + sub_80BD328(basesC, 0); +} + +void sub_80BD674(void *playerRecords, u32 size, u8 c) +{ + if (FlagGet(0x60)) + { + u16 i; + u8 numLinkedPlayers = GetLinkPlayerCount(); + switch (numLinkedPlayers) + { + case 2: + memset(playerRecords + size * 2, 0, size); + memset(playerRecords + size * 3, 0, size); + break; + case 3: + memset(playerRecords + size * 3, 0, size); + break; + } + + switch (c) + { + case 0: + sub_80BD610(playerRecords + size, playerRecords + size * 2, playerRecords + size * 3); + break; + case 1: + sub_80BD610(playerRecords + size * 2, playerRecords + size * 3, playerRecords); + break; + case 2: + sub_80BD610(playerRecords + size * 3, playerRecords, playerRecords + size); + break; + case 3: + sub_80BD610(playerRecords, playerRecords + size, playerRecords + size * 2); + break; + } + + for (i = 1; i < MAX_SECRET_BASES; i++) + { + if (gSaveBlock1.secretBases[i].sbr_field_1_0 == 1) + { + gSaveBlock1.secretBases[i].sbr_field_1_6 = 1; + gSaveBlock1.secretBases[i].sbr_field_1_0 = 0; + } + } + + sub_80BD280(); + + for (i = 1; i < MAX_SECRET_BASES; i++) + { + if (gSaveBlock1.secretBases[i].sbr_field_1_6 == 2) + { + gSaveBlock1.secretBases[i].sbr_field_1_6 = 0; + } + } + + if (gSaveBlock1.secretBases[0].sbr_field_e != 0xFFFF) + { + gSaveBlock1.secretBases[0].sbr_field_e++; + } + } +} |