diff --git a/asm/secret_base.s b/asm/secret_base.s index 9f2ac01d42..19ec41be53 100644 --- a/asm/secret_base.s +++ b/asm/secret_base.s @@ -5,100 +5,6 @@ .text - thumb_func_start sub_80EAC5C -sub_80EAC5C: @ 80EAC5C - 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 -_080EAC70: - movs r0, 0x1 - ands r0, r5 - cmp r0, 0 - bne _080EAC9A - lsls r0, r6, 2 - adds r0, r6 - lsls r0, 5 - mov r1, r10 - adds r4, r1, r0 - adds r0, r4, 0 - bl sub_80EABDC - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _080EAC9A - adds r0, r4, 0 - bl sub_80E8AF0 - movs r0, 0x1 - orrs r5, r0 -_080EAC9A: - movs r7, 0x2 - movs r0, 0x2 - ands r0, r5 - cmp r0, 0 - bne _080EACC8 - lsls r0, r6, 2 - adds r0, r6 - lsls r0, 5 - mov r1, r9 - adds r4, r1, r0 - adds r0, r4, 0 - bl sub_80EABDC - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _080EACC8 - adds r0, r4, 0 - bl sub_80E8AF0 - orrs r5, r7 - lsls r0, r5, 24 - lsrs r5, r0, 24 -_080EACC8: - movs r7, 0x4 - movs r0, 0x4 - ands r0, r5 - cmp r0, 0 - bne _080EACF6 - lsls r0, r6, 2 - adds r0, r6 - lsls r0, 5 - mov r1, r8 - adds r4, r1, r0 - adds r0, r4, 0 - bl sub_80EABDC - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _080EACF6 - adds r0, r4, 0 - bl sub_80E8AF0 - orrs r5, r7 - lsls r0, r5, 24 - lsrs r5, r0, 24 -_080EACF6: - cmp r5, 0x7 - beq _080EAD04 - adds r0, r6, 0x1 - lsls r0, 24 - lsrs r6, r0, 24 - cmp r6, 0x13 - bls _080EAC70 -_080EAD04: - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_80EAC5C - thumb_func_start sub_80EAD14 sub_80EAD14: @ 80EAD14 push {r4-r7,lr} @@ -128,7 +34,7 @@ _080EAD24: cmp r7, 0 bne _080EAD50 adds r0, r4, 0 - bl sub_80E8AF0 + bl ClearSecretBase b _080EAD88 _080EAD50: ldrh r0, [r6, 0xE] @@ -136,7 +42,7 @@ _080EAD50: cmp r0, r3 bls _080EAD60 adds r0, r4, 0 - bl sub_80E8AF0 + bl ClearSecretBase b _080EAD88 _080EAD60: ldrb r0, [r6, 0x1] @@ -150,7 +56,7 @@ _080EAD60: orrs r1, r0 strb r1, [r4, 0x1] adds r0, r6, 0 - bl sub_80E8AF0 + bl ClearSecretBase movs r0, 0x1 b _080EAD8A _080EAD7E: @@ -314,7 +220,7 @@ sub_80EAE90: @ 80EAE90 adds r1, r3, 0 bl sub_80EAA64 adds r0, r4, 0 - bl sub_80E8AF0 + bl ClearSecretBase _080EAEAE: pop {r4} pop {r0} @@ -362,7 +268,7 @@ sub_80EAEF4: @ 80EAEF4 ldr r0, [r4] ldr r1, [r4, 0xC] ldr r2, [r4, 0x18] - bl sub_80EAC5C + bl DeleteFirstOldBaseFromPlayerInRecordMixingFriendsRecords ldr r0, =gSaveBlock1Ptr ldr r0, [r0] ldr r1, =0x00001a9c @@ -683,7 +589,7 @@ _080EB192: cmp r0, 0x1 bne _080EB19E adds r0, r4, 0 - bl sub_80E8AF0 + bl ClearSecretBase _080EB19E: adds r4, 0xA0 adds r5, 0x1 diff --git a/src/secret_base.c b/src/secret_base.c index 0434190d6d..508ea429fd 100644 --- a/src/secret_base.c +++ b/src/secret_base.c @@ -79,7 +79,7 @@ extern const struct YesNoFuncTable gUnknown_0858D058; // .text -void sub_80E8AF0(struct SecretBaseRecord *sbr) +void ClearSecretBase(struct SecretBaseRecord *sbr) { u16 i; @@ -96,7 +96,7 @@ void ResetSecretBases(void) for (i = 0; i < 20; i ++) { - sub_80E8AF0(&gSaveBlock1Ptr->secretBases[i]); + ClearSecretBase(&gSaveBlock1Ptr->secretBases[i]); } } @@ -881,7 +881,7 @@ void sub_80E9A90(void) u16 sbr_e; sbr_e = gSaveBlock1Ptr->secretBases[0].sbr_field_e; - sub_80E8AF0(&gSaveBlock1Ptr->secretBases[0]); + ClearSecretBase(&gSaveBlock1Ptr->secretBases[0]); gSaveBlock1Ptr->secretBases[0].sbr_field_e = sbr_e; sub_80E9728(); } @@ -926,7 +926,7 @@ void sub_80E9B70(void) sub_80E9AD0(); IncrementGameStat(GAME_STAT_MOVED_SECRET_BASE); sbr_e = gSaveBlock1Ptr->secretBases[0].sbr_field_e; - sub_80E8AF0(&gSaveBlock1Ptr->secretBases[0]); + ClearSecretBase(&gSaveBlock1Ptr->secretBases[0]); gSaveBlock1Ptr->secretBases[0].sbr_field_e = sbr_e; } @@ -1613,7 +1613,7 @@ void sub_80EABA4(u32 *args, u8 b) } } -bool8 sub_80EABDC(struct SecretBaseRecord *secretBase) +bool8 DoesSecretBaseBelongToPlayer(struct SecretBaseRecord *secretBase) { u8 i; @@ -1638,3 +1638,44 @@ bool8 sub_80EABDC(struct SecretBaseRecord *secretBase) return TRUE; } + +void DeleteFirstOldBaseFromPlayerInRecordMixingFriendsRecords(struct SecretBaseRecord *basesA, struct SecretBaseRecord *basesB, struct SecretBaseRecord *basesC) +{ + u8 i; + u8 sbFlags = 0x0; + + for (i = 0; i < 20; i++) + { + if (!(sbFlags & 0x1)) // 001 + { + if (DoesSecretBaseBelongToPlayer(&basesA[i]) == TRUE) + { + ClearSecretBase(&basesA[i]); + sbFlags |= 1; + } + } + + if (!(sbFlags & 0x2)) // 010 + { + if (DoesSecretBaseBelongToPlayer(&basesB[i]) == TRUE) + { + ClearSecretBase(&basesB[i]); + sbFlags |= 2; + } + } + + if (!(sbFlags & 0x4)) // 100 + { + if (DoesSecretBaseBelongToPlayer(&basesC[i]) == TRUE) + { + ClearSecretBase(&basesC[i]); + sbFlags |= 4; + } + } + + if (sbFlags == 0x7) // 111 + { + break; + } + } +}