summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Huderle <huderlem@gmail.com>2017-10-16 14:38:52 -0700
committerMarcus Huderle <huderlem@gmail.com>2017-10-16 21:37:36 -0700
commit687fee8891816c7d9b21670ba326edde8b15dce1 (patch)
tree40f8248de079d616af7b68f9f44f6f26e9466c55
parent0a28bd17a7e3210791f44778b013c3b999573ea7 (diff)
Finish secret_base decomp
-rw-r--r--asm/secret_base.s770
-rw-r--r--include/global.h4
-rw-r--r--include/secret_base.h15
-rw-r--r--ld_script.txt1
-rw-r--r--src/field/secret_base.c484
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++;
+ }
+ }
+}