#include "global.h" #include "secret_base.h" #include "decoration.h" #include "species.h" #include "items.h" #include "moves.h" #include "event_data.h" #include "field_camera.h" #include "field_effect.h" #include "field_fadetransition.h" #include "field_player_avatar.h" #include "field_specials.h" #include "field_weather.h" #include "fieldmap.h" #include "link.h" #include "main.h" #include "sound.h" #include "songs.h" #include "map_constants.h" #include "map_name_popup.h" #include "menu.h" #include "menu_helpers.h" #include "metatile_behavior.h" #include "palette.h" #include "pokemon.h" #include "overworld.h" #include "script.h" #include "sound.h" #include "species.h" #include "string_util.h" #include "strings.h" #include "task.h" #include "text.h" #include "vars.h" static void sub_80BC7D8(u8 taskId); static void sub_80BC824(u8 taskId); static u8 sub_80BC948(u8 a); 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); extern u8 gUnknown_0815F399[]; extern u8 gUnknown_0815F49A[]; extern u8 gUnknown_020387DC; const struct { u16 unk_083D1358_0; u16 unk_083D1358_1; } gUnknown_083D1358[] = { {0x26, 0x36}, {0x27, 0x37}, {0x1a0, 0x1a1}, {0x1a8, 0x1a9}, {0x1b0, 0x1b1}, {0x208, 0x210}, {0x271, 0x278} }; const u8 gUnknown_083D1374[] = { MAP_ID_SECRET_BASE_RED_CAVE1, 0, MAP_ID_SECRET_BASE_BROWN_CAVE1, 3, MAP_ID_SECRET_BASE_RED_CAVE2, 0, MAP_ID_SECRET_BASE_SHRUB1, 9, MAP_ID_SECRET_BASE_RED_CAVE3, 0, MAP_ID_SECRET_BASE_BROWN_CAVE1, 3, MAP_ID_SECRET_BASE_RED_CAVE4, 0, MAP_ID_SECRET_BASE_BROWN_CAVE2, 13, MAP_ID_SECRET_BASE_BROWN_CAVE1, 0, MAP_ID_SECRET_BASE_BLUE_CAVE1, 3, MAP_ID_SECRET_BASE_BROWN_CAVE2, 0, MAP_ID_SECRET_BASE_YELLOW_CAVE2, 2, MAP_ID_SECRET_BASE_BROWN_CAVE3, 0, MAP_ID_SECRET_BASE_BROWN_CAVE3, 4, MAP_ID_SECRET_BASE_BROWN_CAVE4, 0, MAP_ID_SECRET_BASE_BROWN_CAVE1, 2, MAP_ID_SECRET_BASE_BLUE_CAVE1, 0, MAP_ID_SECRET_BASE_BROWN_CAVE1, 3, MAP_ID_SECRET_BASE_BLUE_CAVE2, 0, MAP_ID_SECRET_BASE_BROWN_CAVE1, 2, MAP_ID_SECRET_BASE_BLUE_CAVE3, 0, MAP_ID_SECRET_BASE_YELLOW_CAVE1, 15, MAP_ID_SECRET_BASE_BLUE_CAVE4, 0, MAP_ID_SECRET_BASE_YELLOW_CAVE1, 14, MAP_ID_SECRET_BASE_YELLOW_CAVE1, 0, MAP_ID_SECRET_BASE_YELLOW_CAVE2, 3, MAP_ID_SECRET_BASE_YELLOW_CAVE2, 0, MAP_ID_SECRET_BASE_BLUE_CAVE2, 7, MAP_ID_SECRET_BASE_YELLOW_CAVE3, 0, MAP_ID_SECRET_BASE_YELLOW_CAVE1, 6, MAP_ID_SECRET_BASE_YELLOW_CAVE4, 0, MAP_ID_SECRET_BASE_SHRUB1, 9, MAP_ID_SECRET_BASE_TREE1, 0, MAP_ID_SECRET_BASE_BLUE_CAVE1, 3, MAP_ID_SECRET_BASE_TREE2, 0, MAP_ID_SECRET_BASE_SHRUB1, 6, MAP_ID_SECRET_BASE_TREE3, 0, MAP_ID_SECRET_BASE_YELLOW_CAVE3, 3, MAP_ID_SECRET_BASE_TREE4, 0, MAP_ID_SECRET_BASE_TREE1, 10, MAP_ID_SECRET_BASE_SHRUB1, 0, MAP_ID_SECRET_BASE_YELLOW_CAVE1, 3, MAP_ID_SECRET_BASE_SHRUB2, 0, MAP_ID_SECRET_BASE_BROWN_CAVE1, 2, MAP_ID_SECRET_BASE_SHRUB3, 0, MAP_ID_SECRET_BASE_BROWN_CAVE2, 8, MAP_ID_SECRET_BASE_SHRUB4, 0, MAP_ID_SECRET_BASE_YELLOW_CAVE2, 6 }; const struct MenuAction2 gUnknown_083D13D4[] = { {SecretBaseText_DelRegist, sub_80BCA84}, {gUnknownText_Exit, sub_80BCBF8} }; const struct YesNoFuncTable gUnknown_083D13E4 = { sub_80BCB90, sub_80BCBC0 }; const u8 gUnknown_083D13EC[] = { 0x23,0x24,0xF,0x1F,0x21,0x2F,0xE,0x14,0x20,0x22,0x0,0x0 }; extern void *gUnknown_0300485C; extern u8 gUnknown_081A2E14[]; extern u8 UnknownString_81A1BB2[]; extern u8 UnknownString_81A1F67[]; extern u8 UnknownString_81A2254[]; extern u8 UnknownString_81A25C3[]; extern u8 UnknownString_81A2925[]; extern u8 UnknownString_81A1D74[]; extern u8 UnknownString_81A20C9[]; extern u8 UnknownString_81A2439[]; extern u8 UnknownString_81A2B2A[]; extern u8 UnknownString_81A2754[]; void ClearSecretBase(struct SecretBaseRecord *record) { u16 i; u16 j; record->secretBaseId = 0; for (i=0; iplayerName[i] = 0xff; for (i=0; i<4; i++) record->trainerId[i] = 0x00; record->sbr_field_e = 0; record->sbr_field_10 = 0; record->sbr_field_11 = 0; record->sbr_field_1_0 = 0; record->gender = 0; record->sbr_field_1_5 = 0; record->sbr_field_1_6 = 0; for (i=0; i<16; i++) { record->decorations[i] = 0; record->decorationPos[i] = 0; } for (i=0; i<6; i++) { for (j=0; j<4; j++) { record->partyMoves[i * 4 + j] = 0; } record->partyPersonality[i] = 0; record->partyEVs[i] = 0; record->partySpecies[i] = 0; record->partyHeldItems[i] = 0; record->partyLevels[i] = 0; } } void ResetSecretBase(u8 idx) { ClearSecretBase(&gSaveBlock1.secretBases[idx]); } void ResetSecretBases(void) { u16 i; for (i = 0; i < MAX_SECRET_BASES; i++) ResetSecretBase(i); } void sub_80BB5D0(void) { gUnknown_020387DC = gSpecialVar_0x8004; } void sub_80BB5E4(void) { u16 i; gScriptResult = 0; for (i = 0; i < MAX_SECRET_BASES; i++) { if (gUnknown_020387DC != gSaveBlock1.secretBases[i].secretBaseId) continue; gScriptResult = 1; VarSet(VAR_0x4054, i); break; } } void sub_80BB63C(void) // 80bb63c { if (gSaveBlock1.secretBases[0].secretBaseId) gScriptResult = 1; else gScriptResult = 0; } u8 sub_80BB66C(void) // 80bb66c { s16 x, y; s16 v0; GetXYCoordsOneStepInFrontOfPlayer(&x, &y); v0 = MapGridGetMetatileBehaviorAt(x, y) & 0xFFF; if (v0 == 0x90 || v0 == 0x91) return 1; else if (v0 == 0x92 || v0 == 0x93) return 2; else if (v0 == 0x9a || v0 == 0x9b) return 3; else if (v0 == 0x94 || v0 == 0x95) return 4; else if (v0 == 0x96 || v0 == 0x97 || v0 == 0x9c || v0 == 0x9d) return 5; else if (v0 == 0x98 || v0 == 0x99) return 6; return 0; } void sub_80BB70C(void) // 80bb70c { gSpecialVar_0x8007 = sub_80BB66C(); } s16 unref_sub_80BB724(u16 *a0, u8 a1) { u16 v2; for (v2=0; v2<0x200; v2++) { if ((a0[v2] & 0xFFF) == a1) return (s16)v2; } return -1; } void sub_80BB764(s16 *arg1, s16 *arg2, u16 arg3) { s16 x, y; for (y=0; yheight; y++) { for (x=0; xwidth; x++) { if ((gMapHeader.mapData->map[y * gMapHeader.mapData->width + x] & 0x3ff) == arg3) { *arg1 = x; *arg2 = y; return; } } } } void sub_80BB800(void) { s16 x, y; s16 tile_id; u16 idx; GetXYCoordsOneStepInFrontOfPlayer(&x, &y); tile_id = MapGridGetMetatileIdAt(x, y); for (idx=0; idx<7; idx++) { if (gUnknown_083D1358[idx].unk_083D1358_0 == tile_id) { MapGridSetMetatileIdAt(x, y, gUnknown_083D1358[idx].unk_083D1358_1 | 0xc00); CurrentMapDrawMetatileAt(x, y); return; } } for (idx=0; idx<7; idx++) { if (gUnknown_083D1358[idx].unk_083D1358_1 == tile_id) { MapGridSetMetatileIdAt(x, y, gUnknown_083D1358[idx].unk_083D1358_0 | 0xc00); CurrentMapDrawMetatileAt(x, y); return; } } } u8 sub_80BB8A8(u8 *arg1) { u8 idx; for (idx=0; idx<7; idx++) { if (arg1[idx] == EOS) return idx; } return 7; } void sub_80BB8CC(void) { u8 nameLength; u16 idx; gSaveBlock1.secretBases[0].secretBaseId = gUnknown_020387DC; for (idx=0; idx<4; idx++) { gSaveBlock1.secretBases[0].trainerId[idx] = gSaveBlock2.playerTrainerId[idx]; } VarSet(VAR_0x4054, 0); nameLength = sub_80BB8A8(gSaveBlock2.playerName); 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); } void sub_80BB970(struct MapEvents *events) { u16 bgevidx, idx, jdx; s16 tile_id; for (bgevidx=0; bgevidxbgEventCount; bgevidx++) { if (events->bgEvents[bgevidx].kind == 8) { for (jdx=0; jdxbgEvents[bgevidx].bgUnion.secretBaseId) { tile_id = MapGridGetMetatileIdAt(events->bgEvents[bgevidx].x + 7, events->bgEvents[bgevidx].y + 7); for (idx=0; idx<7; idx++) { if (gUnknown_083D1358[idx].unk_083D1358_0 == tile_id) { MapGridSetMetatileIdAt(events->bgEvents[bgevidx].x + 7, events->bgEvents[bgevidx].y + 7, gUnknown_083D1358[idx].unk_083D1358_1 | 0xc00); break; } } break; } } } } } void sub_80BBA14(void) { s8 idx = 4 * (gUnknown_020387DC / 10); warp1_set_2(MAP_GROUP_SECRET_BASE_RED_CAVE1, gUnknown_083D1374[idx], gUnknown_083D1374[idx + 1]); } void sub_80BBA48(u8 taskid) { u16 curbaseid; switch (gTasks[taskid].data[0]) { case 0: gTasks[taskid].data[0] = 1; break; case 1: if (!gPaletteFade.active) { gTasks[taskid].data[0] = 2; } break; case 2: curbaseid = VarGet(VAR_0x4054); if (gSaveBlock1.secretBases[curbaseid].sbr_field_10 < 0xff) gSaveBlock1.secretBases[curbaseid].sbr_field_10++; sub_80BBA14(); warp_in(); gFieldCallback = sub_8080990; SetMainCallback2(CB2_LoadMap); DestroyTask(taskid); break; } } void sub_80BBAF0(void) { CreateTask(sub_80BBA48, 0); fade_screen(1, 0); saved_warp2_set(0, gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1); } bool8 sub_80BBB24(void) { if (gMapHeader.mapType == MAP_TYPE_SECRET_BASE && VarGet(VAR_0x4097) == 0) return FALSE; return TRUE; } void sub_80BBB50(u8 taskid) { FieldObjectTurn(&(gMapObjects[gPlayerAvatar.mapObjectId]), 2); if (sub_807D770() == 1) { EnableBothScriptContexts(); DestroyTask(taskid); } } void sub_80BBB90(void) { s16 x, y; ScriptContext2_Enable(); HideMapNamePopup(); sub_80BB764(&x, &y, 0x220); MapGridSetMetatileIdAt(x + 7, y + 7, 0xe20); CurrentMapDrawMetatileAt(x + 7, y + 7); pal_fill_black(); CreateTask(sub_80BBB50, 0); } void sub_80BBBEC(u8 taskid) { s8 idx; if (!gPaletteFade.active) { idx = 4 * (gUnknown_020387DC / 10); Overworld_SetWarpDestination(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1, gUnknown_083D1374[idx + 2], gUnknown_083D1374[idx + 3]); warp_in(); gFieldCallback = sub_80BBB90; SetMainCallback2(CB2_LoadMap); DestroyTask(taskid); } } void sub_80BBC78(void) { u8 taskid = CreateTask(sub_80BBBEC, 0); gTasks[taskid].data[0] = 0; fade_screen(1, 0); } bool8 CurrentMapIsSecretBase(void) { if (gSaveBlock1.location.mapGroup == MAP_GROUP_SECRET_BASE_SHRUB4 && (u8)(gSaveBlock1.location.mapNum) <= MAP_ID_SECRET_BASE_SHRUB4) return TRUE; return FALSE; } void sub_80BBCCC(u8 flagIn) { u16 curBaseId; u16 x, y; if (CurrentMapIsSecretBase()) { curBaseId = VarGet(VAR_0x4054); for (x=0; x<16; x++) { if (gSaveBlock1.secretBases[curBaseId].decorations[x] > 0 && gSaveBlock1.secretBases[curBaseId].decorations[x] <= 0x78 && gDecorations[gSaveBlock1.secretBases[curBaseId].decorations[x]].permission != DECORPERM_SOLID_MAT) { sub_80FF394((gSaveBlock1.secretBases[curBaseId].decorationPos[x] >> 4) + 7, (gSaveBlock1.secretBases[curBaseId].decorationPos[x] & 0xF) + 7, gSaveBlock1.secretBases[curBaseId].decorations[x]); } } if (curBaseId != 0) { sub_80BB764(&x, &y, 0x220); MapGridSetMetatileIdAt(x + 7, y + 7, 0xe21); } else if (flagIn == 1 && VarGet(VAR_0x4089) == 1) { sub_80BB764(&x, &y, 0x220); MapGridSetMetatileIdAt(x + 7, y + 7, 0xe0a); } } } #ifdef NONMATCHING // The only nonmatching property of this function is that the implicit variables &gSaveBlock1 and &roomdecor[decidx] // are stored in the wrong registers. void sub_80BBDD0(void) { u8 *roomdecor; u8 *roomdecorpos; u8 ndecor; u8 decidx; u8 objid = 0; u8 metatile; u16 curBase = VarGet(VAR_0x4054); if (!CurrentMapIsSecretBase()) { roomdecor = gSaveBlock1.playerRoomDecor; roomdecorpos = gSaveBlock1.playerRoomDecorPos; ndecor = 12; } else { roomdecor = gSaveBlock1.secretBases[curBase].decorations; roomdecorpos = gSaveBlock1.secretBases[curBase].decorationPos; ndecor = 16; } for (decidx=0; decidxmapObjectCount; objid++) { if (gMapHeader.events->mapObjects[objid].flagId == gSpecialVar_0x8004 + 0xAE) break; } if (objid == gMapHeader.events->mapObjectCount) continue; gSpecialVar_0x8006 = roomdecorpos[decidx] >> 4; gSpecialVar_0x8007 = roomdecorpos[decidx] & 0xF; metatile = MapGridGetMetatileBehaviorAt(gSpecialVar_0x8006 + 7, gSpecialVar_0x8007 + 7); if (sub_80572D8(metatile) == TRUE || sub_80572EC(metatile) == TRUE) { gScriptResult = gMapHeader.events->mapObjects[objid].graphicsId + VAR_0x3F20; VarSet(gScriptResult, gDecorations[roomdecor[decidx]].tiles[0]); gScriptResult = gMapHeader.events->mapObjects[objid].localId; FlagClear(gSpecialVar_0x8004 + 0xAE); show_sprite(gScriptResult, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); sub_805C0F8(gScriptResult, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, gSpecialVar_0x8006, gSpecialVar_0x8007); sub_805C78C(gScriptResult, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); gSpecialVar_0x8004 ++; } } } } #else __attribute__((naked)) void sub_80BBDD0(void) { asm(".syntax unified\n\ push {r4-r7,lr}\n\ mov r7, r10\n\ mov r6, r9\n\ mov r5, r8\n\ push {r5-r7}\n\ sub sp, 0x14\n\ ldr r0, _080BBE00 @ =0x00004054\n\ bl VarGet\n\ lsls r0, 16\n\ lsrs r4, r0, 16\n\ bl CurrentMapIsSecretBase\n\ lsls r0, 24\n\ cmp r0, 0\n\ bne _080BBE08\n\ ldr r0, _080BBE04 @ =gSaveBlock1 + 0x2688\n\ str r0, [sp, 0x4]\n\ adds r0, 0xC\n\ str r0, [sp, 0x8]\n\ movs r1, 0xC\n\ str r1, [sp, 0xC]\n\ b _080BBE1E\n\ .align 2, 0\n\ _080BBE00: .4byte 0x00004054\n\ _080BBE04: .4byte gSaveBlock1 + 0x2688\n\ _080BBE08:\n\ lsls r1, r4, 2\n\ adds r1, r4\n\ lsls r1, 5\n\ ldr r0, _080BBF7C @ =gSaveBlock1 + 0x1A1A\n\ adds r2, r1, r0\n\ str r2, [sp, 0x4]\n\ adds r0, 0x10\n\ adds r1, r0\n\ str r1, [sp, 0x8]\n\ movs r3, 0x10\n\ str r3, [sp, 0xC]\n\ _080BBE1E:\n\ movs r6, 0\n\ ldr r4, [sp, 0xC]\n\ cmp r6, r4\n\ bcc _080BBE28\n\ b _080BBF6C\n\ _080BBE28:\n\ ldr r5, _080BBF80 @ =gSaveBlock1\n\ mov r10, r5\n\ _080BBE2C:\n\ ldr r1, [sp, 0x4]\n\ adds r0, r1, r6\n\ ldrb r1, [r0]\n\ mov r9, r0\n\ adds r2, r6, 0x1\n\ str r2, [sp, 0x10]\n\ cmp r1, 0\n\ bne _080BBE3E\n\ b _080BBF5E\n\ _080BBE3E:\n\ ldrb r0, [r0]\n\ lsls r0, 5\n\ ldr r3, _080BBF84 @ =gDecorations\n\ adds r0, r3\n\ ldrb r0, [r0, 0x11]\n\ cmp r0, 0x4\n\ beq _080BBE4E\n\ b _080BBF5E\n\ _080BBE4E:\n\ movs r5, 0\n\ ldr r0, _080BBF88 @ =gMapHeader\n\ ldr r2, [r0, 0x4]\n\ ldrb r3, [r2]\n\ mov r8, r0\n\ cmp r5, r3\n\ bcs _080BBE8E\n\ ldr r0, [r2, 0x4]\n\ ldrh r1, [r0, 0x14]\n\ ldr r4, _080BBF8C @ =gSpecialVar_0x8004\n\ ldrh r0, [r4]\n\ adds r0, 0xAE\n\ adds r7, r4, 0\n\ cmp r1, r0\n\ beq _080BBE8E\n\ adds r4, r2, 0\n\ adds r2, r3, 0\n\ _080BBE70:\n\ adds r0, r5, 0x1\n\ lsls r0, 24\n\ lsrs r5, r0, 24\n\ cmp r5, r2\n\ bcs _080BBE8E\n\ ldr r1, [r4, 0x4]\n\ lsls r0, r5, 1\n\ adds r0, r5\n\ lsls r0, 3\n\ adds r0, r1\n\ ldrh r1, [r0, 0x14]\n\ ldrh r0, [r7]\n\ adds r0, 0xAE\n\ cmp r1, r0\n\ bne _080BBE70\n\ _080BBE8E:\n\ mov r1, r8\n\ ldr r0, [r1, 0x4]\n\ ldrb r0, [r0]\n\ cmp r5, r0\n\ beq _080BBF5E\n\ ldr r7, _080BBF90 @ =gSpecialVar_0x8006\n\ ldr r2, [sp, 0x8]\n\ adds r1, r2, r6\n\ ldrb r0, [r1]\n\ lsrs r0, 4\n\ strh r0, [r7]\n\ ldr r6, _080BBF94 @ =gSpecialVar_0x8007\n\ ldrb r1, [r1]\n\ movs r0, 0xF\n\ ands r0, r1\n\ strh r0, [r6]\n\ ldrh r0, [r7]\n\ adds r0, 0x7\n\ ldrh r1, [r6]\n\ adds r1, 0x7\n\ bl MapGridGetMetatileBehaviorAt\n\ lsls r0, 24\n\ lsrs r4, r0, 24\n\ adds r0, r4, 0\n\ bl sub_80572D8\n\ lsls r0, 24\n\ lsrs r0, 24\n\ cmp r0, 0x1\n\ beq _080BBEDA\n\ adds r0, r4, 0\n\ bl sub_80572EC\n\ lsls r0, 24\n\ lsrs r0, 24\n\ cmp r0, 0x1\n\ bne _080BBF5E\n\ _080BBEDA:\n\ mov r3, r8\n\ ldr r0, [r3, 0x4]\n\ ldr r1, [r0, 0x4]\n\ lsls r4, r5, 1\n\ adds r4, r5\n\ lsls r4, 3\n\ adds r1, r4, r1\n\ ldr r5, _080BBF98 @ =0x00003f20\n\ adds r0, r5, 0\n\ ldrb r1, [r1, 0x1]\n\ adds r0, r1\n\ ldr r1, _080BBF9C @ =gScriptResult\n\ strh r0, [r1]\n\ ldrh r0, [r1]\n\ mov r2, r9\n\ ldrb r1, [r2]\n\ lsls r1, 5\n\ ldr r3, _080BBFA0 @ =gDecorations + 0x1C\n\ adds r1, r3\n\ ldr r1, [r1]\n\ ldrh r1, [r1]\n\ bl VarSet\n\ mov r5, r8\n\ ldr r0, [r5, 0x4]\n\ ldr r0, [r0, 0x4]\n\ adds r4, r0\n\ ldrb r0, [r4]\n\ ldr r1, _080BBF9C @ =gScriptResult\n\ strh r0, [r1]\n\ ldr r2, _080BBF8C @ =gSpecialVar_0x8004\n\ ldrh r0, [r2]\n\ adds r0, 0xAE\n\ lsls r0, 16\n\ lsrs r0, 16\n\ bl FlagClear\n\ ldr r3, _080BBF9C @ =gScriptResult\n\ ldrb r0, [r3]\n\ mov r4, r10\n\ ldrb r1, [r4, 0x5]\n\ ldrb r2, [r4, 0x4]\n\ bl show_sprite\n\ ldr r5, _080BBF9C @ =gScriptResult\n\ ldrb r0, [r5]\n\ ldrb r1, [r4, 0x5]\n\ ldrb r2, [r4, 0x4]\n\ movs r4, 0\n\ ldrsh r3, [r7, r4]\n\ movs r5, 0\n\ ldrsh r4, [r6, r5]\n\ str r4, [sp]\n\ bl sub_805C0F8\n\ ldr r1, _080BBF9C @ =gScriptResult\n\ ldrb r0, [r1]\n\ mov r2, r10\n\ ldrb r1, [r2, 0x5]\n\ ldrb r2, [r2, 0x4]\n\ bl sub_805C78C\n\ ldr r3, _080BBF8C @ =gSpecialVar_0x8004\n\ ldrh r0, [r3]\n\ adds r0, 0x1\n\ strh r0, [r3]\n\ _080BBF5E:\n\ ldr r4, [sp, 0x10]\n\ lsls r0, r4, 24\n\ lsrs r6, r0, 24\n\ ldr r5, [sp, 0xC]\n\ cmp r6, r5\n\ bcs _080BBF6C\n\ b _080BBE2C\n\ _080BBF6C:\n\ add sp, 0x14\n\ pop {r3-r5}\n\ mov r8, r3\n\ mov r9, r4\n\ mov r10, r5\n\ pop {r4-r7}\n\ pop {r0}\n\ bx r0\n\ .align 2, 0\n\ _080BBF7C: .4byte gSaveBlock1 + 0x1A1A\n\ _080BBF80: .4byte gSaveBlock1\n\ _080BBF84: .4byte gDecorations\n\ _080BBF88: .4byte gMapHeader\n\ _080BBF8C: .4byte gSpecialVar_0x8004\n\ _080BBF90: .4byte gSpecialVar_0x8006\n\ _080BBF94: .4byte gSpecialVar_0x8007\n\ _080BBF98: .4byte 0x00003f20\n\ _080BBF9C: .4byte gScriptResult\n\ _080BBFA0: .4byte gDecorations + 0x1C\n\ .syntax divided\n"); } #endif void sub_80BBFA4(void) { int curBase = VarGet(VAR_0x4054); VarSet(VAR_0x401F, gUnknown_083D13EC[sub_80BCCA4(curBase)]); } void sub_80BBFD8(struct MapPosition *position, struct MapEvents *events) { s16 bgevtidx; for (bgevtidx=0; bgevtidxbgEventCount; bgevtidx++) { if (events->bgEvents[bgevtidx].kind == 8 && position->x == events->bgEvents[bgevtidx].x + 7 && position->y == events->bgEvents[bgevtidx].y + 7) { gUnknown_020387DC = events->bgEvents[bgevtidx].bgUnion.secretBaseId; break; } } } void sub_80BC038(struct MapPosition *position, struct MapEvents *events) { sub_80BBFD8(position, events); sub_80BB5E4(); ScriptContext1_SetupScript(gUnknown_081A2E14); } bool8 sub_80BC050(void) { sub_80BB5D0(); sub_80BB5E4(); if (gScriptResult == 1) return FALSE; return TRUE; } void sub_80BC074(u8 taskid) { switch (gTasks[taskid].data[0]) { case 0: ScriptContext2_Enable(); gTasks[taskid].data[0] = 1; break; case 1: if (!gPaletteFade.active) { gTasks[taskid].data[0] = 2; } break; case 2: copy_saved_warp2_bank_and_enter_x_to_warp1(0x7E); warp_in(); gFieldCallback = mapldr_default; SetMainCallback2(CB2_LoadMap); ScriptContext2_Disable(); DestroyTask(taskid); break; } } void sub_80BC0F8(void) { CreateTask(sub_80BC074, 0); fade_screen(1, 0); } void sub_80BC114(void) { if (gSaveBlock1.secretBases[0].secretBaseId != gUnknown_020387DC) gScriptResult = 1; else gScriptResult = 0; } u8 sub_80BC14C(u8 sbid) { s16 idx; for (idx=0; idxbgEventCount; eventId++) { if (mapEvents->bgEvents[eventId].kind == 8 && gSaveBlock1.secretBases[0].secretBaseId == mapEvents->bgEvents[eventId].bgUnion.secretBaseId) { u16 i; s16 tileId = MapGridGetMetatileIdAt(mapEvents->bgEvents[eventId].x + 7, mapEvents->bgEvents[eventId].y + 7); for (i = 0; i < 7; i++) { if (gUnknown_083D1358[i].unk_083D1358_1 == tileId) { MapGridSetMetatileIdAt( mapEvents->bgEvents[eventId].x + 7, mapEvents->bgEvents[eventId].y + 7, gUnknown_083D1358[i].unk_083D1358_0 | 0xc00); break; } } DrawWholeMapView(); break; } } } void sub_80BC50C(void) { u16 backupValue; sub_80BC474(); IncrementGameStat(GAME_STAT_MOVED_SECRET_BASE); backupValue = gSaveBlock1.secretBases[0].sbr_field_e; ResetSecretBase(0); gSaveBlock1.secretBases[0].sbr_field_e = backupValue; } u8 sub_80BC538(void) { s16 secretBaseIndex; u8 retVal = 0; for (secretBaseIndex = 1; secretBaseIndex < MAX_SECRET_BASES; secretBaseIndex++) { if (sub_80BC268(secretBaseIndex) == TRUE) { retVal++; } } return retVal; } void sub_80BC56C(void) { u8 secretBaseIndex = sub_80BC14C(gUnknown_020387DC); if (sub_80BC268(secretBaseIndex) == TRUE) { gScriptResult = 1; } else if (sub_80BC538() > 9) { gScriptResult = 2; } else { gScriptResult = 0; } } void sub_80BC5BC(void) { gSaveBlock1.secretBases[sub_80BC14C(gUnknown_020387DC)].sbr_field_1_6 ^= 1; FlagSet(0x10C); } void SecretBasePC_Decoration(void) { CreateTask(Task_SecretBasePC_Decoration, 0); } void SecretBasePC_Registry(void) { CreateTask(Task_SecretBasePC_Registry, 0); } void Task_SecretBasePC_Registry(u8 taskId) { s16 *taskData; ScriptContext2_Enable(); sub_80F944C(); LoadScrollIndicatorPalette(); taskData = gTasks[taskId].data; taskData[0] = sub_80BC538(); if (taskData[0] != 0) { if (taskData[0] > 7) { taskData[3] = 7; } else { taskData[3] = taskData[0]; } taskData[1] = 0; taskData[2] = 0; MenuZeroFillWindowRect(0, 0, 29, 19); sub_80BC7D8(taskId); gTasks[taskId].func = sub_80BC824; } else { DisplayItemMessageOnField(taskId, gSecretBaseText_NoRegistry, sub_80BCC54, 0); } } void sub_80BC6B0(u8 taskId) { u8 i; s16 *taskData = gTasks[taskId].data; u8 m = 0; u8 n = 0; for (i = 1; i < MAX_SECRET_BASES; i++) { if (m == taskData[2]) { m = i; break; } if (sub_80BC268(i) == TRUE) m++; } for (i = m; i < MAX_SECRET_BASES; i++) { if (sub_80BC268(i) == TRUE) { sub_80BC190(gStringVar1, i); MenuFillWindowRectWithBlankTile(18, 2 * n + 2, 28, 2 * n + 3); MenuPrint(gStringVar1, 18, 2 * n + 2); if (++n == 8) break; } } if (n < 8) { MenuFillWindowRectWithBlankTile(18, 2 * n + 2, 28, 2 * n + 3); MenuPrint(gUnknownText_Exit, 18, 2 * n + 2); DestroyVerticalScrollIndicator(1); if (n != 7) MenuFillWindowRectWithBlankTile(18, ((n << 25) + (1 << 26)) >> 24, 28, 18); // the shifts are needed to match } else CreateVerticalScrollIndicators(1, 0xbc, 0x98); if (taskData[2] == 0) DestroyVerticalScrollIndicator(0); else CreateVerticalScrollIndicators(0, 0xbc, 0x08); } void sub_80BC7D8(u8 taskId) { u16 *taskData = gTasks[taskId].data; MenuDrawTextWindow(17, 0, 29, 19); InitMenu(0, 18, 2, taskData[3] + 1, taskData[1], 11); sub_80BC6B0(taskId); } void sub_80BC824(u8 taskId) { s16 *taskData = gTasks[taskId].data; if (gMain.newAndRepeatedKeys & DPAD_UP) { if (taskData[1]) { PlaySE(5); taskData[1] = MoveMenuCursor(-1); } else if (taskData[2]) { PlaySE(5); taskData[2]--; sub_80BC6B0(taskId); } } else if (gMain.newAndRepeatedKeys & DPAD_DOWN) { if (taskData[1] == taskData[3]) { if (taskData[2] + taskData[1] != taskData[0]) { PlaySE(5); taskData[2]++; sub_80BC6B0(taskId); } } else { PlaySE(5); taskData[1] = MoveMenuCursor(1); } } else if (gMain.newKeys & A_BUTTON) { PlaySE(5); if (taskData[1] + taskData[2] == taskData[0]) { HandleDestroyMenuCursors(); MenuZeroFillWindowRect(0, 0, 29, 19); sub_80BCC54(taskId); } else { HandleDestroyMenuCursors(); taskData[4] = sub_80BC948(taskData[1] + taskData[2]); sub_80BC980(taskId); } } else if (gMain.newKeys & B_BUTTON) { PlaySE(5); HandleDestroyMenuCursors(); MenuZeroFillWindowRect(0, 0, 29, 19); sub_80BCC54(taskId); } } u8 sub_80BC948(u8 a) { u8 secretBaseIndex; u8 count = 0; for (secretBaseIndex = 1; secretBaseIndex < MAX_SECRET_BASES; secretBaseIndex++) { if (sub_80BC268(secretBaseIndex) == TRUE) { if (a == count) { return secretBaseIndex; } count++; } } return 0; } void sub_80BC980(u8 taskId) { PauseVerticalScrollIndicator(0); PauseVerticalScrollIndicator(1); MenuDrawTextWindow(1, 0, 12, 5); PrintMenuItems(2, 1, 2, (const struct MenuAction *)gUnknown_083D13D4); InitMenu(0, 2, 1, 2, 0, 10); gTasks[taskId].func = sub_80BC9E4; } void sub_80BC9E4(u8 taskId) { if (gMain.newAndRepeatedKeys & DPAD_UP) { if (GetMenuCursorPos()) { PlaySE(5); MoveMenuCursor(-1); } } else if (gMain.newAndRepeatedKeys & DPAD_DOWN) { if (GetMenuCursorPos() != 1) { PlaySE(5); MoveMenuCursor(1); } } else if (gMain.newKeys & A_BUTTON) { PlaySE(5); gUnknown_083D13D4[GetMenuCursorPos()].func(taskId); } else if (gMain.newKeys & B_BUTTON) { PlaySE(5); sub_80BCBF8(taskId); } } void sub_80BCA84(u8 taskId) { s16 *taskData = gTasks[taskId].data; DestroyVerticalScrollIndicator(0); DestroyVerticalScrollIndicator(1); HandleDestroyMenuCursors(); MenuZeroFillWindowRect(0, 0, 29, 19); sub_80BC190(gStringVar1, taskData[4]); StringExpandPlaceholders(gStringVar4, gOtherText_OkayToDeleteFromRegistry); DisplayItemMessageOnField(taskId, gStringVar4, sub_80BCAEC, 0); } void sub_80BCAEC(u8 taskId) { DisplayYesNoMenu(20, 8, 1); DoYesNoFuncWithChoice(taskId, &gUnknown_083D13E4); } void sub_80BCB10(u8 taskId) { s16 *taskData = gTasks[taskId].data; MenuZeroFillWindowRect(0, 0, 29, 19); gSaveBlock1.secretBases[taskData[4]].sbr_field_1_6 = 0; taskData[0]--; if (taskData[2] > 0) { taskData[2]--; } if (taskData[0] < 8) { taskData[3]--; } sub_80BC7D8(taskId); gTasks[taskId].func = sub_80BC824; } void sub_80BCB90(u8 taskId) { MenuZeroFillWindowRect(20, 8, 26, 13); DisplayItemMessageOnField(taskId, gOtherText_RegisteredDataDeleted, sub_80BCB10, 0); } void sub_80BCBC0(u8 taskId) { MenuZeroFillWindowRect(0, 0, 29, 19); sub_80BC7D8(taskId); gTasks[taskId].func = sub_80BC824; } void sub_80BCBF8(u8 taskId) { s16 *taskData = gTasks[taskId].data; InitMenu(0, 18, 2, taskData[3] + 1, taskData[1], 11); MenuZeroFillWindowRect(1, 0, 12, 5); StartVerticalScrollIndicators(0); StartVerticalScrollIndicators(1); gTasks[taskId].func = sub_80BC824; } void sub_80BCC54(u8 taskId) { u16 curBaseIndex = VarGet(VAR_0x4054); BuyMenuFreeMemory(); DestroyVerticalScrollIndicator(0); DestroyVerticalScrollIndicator(1); if (curBaseIndex == 0) { ScriptContext1_SetupScript(gUnknown_0815F399); } else { ScriptContext1_SetupScript(gUnknown_0815F49A); } DestroyTask(taskId); } u8 sub_80BCCA4(u8 secretBaseIndex) { return (gSaveBlock1.secretBases[secretBaseIndex].playerName[OT_NAME_LENGTH] % 5) + gSaveBlock1.secretBases[secretBaseIndex].gender * 5; } const u8 *sub_80BCCE8(void) { u8 param = sub_80BCCA4(VarGet(VAR_0x4054)); if (param == 0) return UnknownString_81A1BB2; if (param == 1) return UnknownString_81A1F67; if (param == 2) return UnknownString_81A2254; if (param == 3) return UnknownString_81A25C3; if (param == 4) return UnknownString_81A2925; if (param == 5) return UnknownString_81A1D74; if (param == 6) return UnknownString_81A20C9; if (param == 7) return UnknownString_81A2439; if (param == 8) return UnknownString_81A2754; return UnknownString_81A2B2A; } // Debugging function to test secret base battles. void unref_sub_80BCD7C(u8 secretBaseIndex) { u16 i; for (i = 0; i == 0; i++) { gSaveBlock1.secretBases[secretBaseIndex].partyPersonality[i] = i + 1; gSaveBlock1.secretBases[secretBaseIndex].partyMoves[i * 4] = i + 1; gSaveBlock1.secretBases[secretBaseIndex].partySpecies[i] = SPECIES_TREECKO; gSaveBlock1.secretBases[secretBaseIndex].partyHeldItems[i] = i + 1; gSaveBlock1.secretBases[secretBaseIndex].partyLevels[i] = i + 5; gSaveBlock1.secretBases[secretBaseIndex].partyEVs[i] = i * 5; } } void sub_80BCE1C(void) { u16 curBaseIndex = VarGet(VAR_0x4054); sub_810FB10(1); CreateSecretBaseEnemyParty(&gSaveBlock1.secretBases[curBaseIndex]); } void sub_80BCE4C() { gSaveBlock1.secretBases[VarGet(VAR_0x4054)].sbr_field_1_5 = gScriptResult; } void sub_80BCE90() { u16 curBaseIndex = VarGet(VAR_0x4054); if (!FlagGet(0x8C2)) { u8 i; for (i = 0; i < MAX_SECRET_BASES; i++) { gSaveBlock1.secretBases[i].sbr_field_1_5 = 0; } FlagSet(0x8C2); } gSpecialVar_0x8004 = sub_80BCCA4(curBaseIndex); gScriptResult = gSaveBlock1.secretBases[curBaseIndex].sbr_field_1_5; } void sub_80BCF1C(u8 taskId) { s16 x, y; u32 behavior; s16 *taskData = gTasks[taskId].data; switch (taskData[1]) { case 0: PlayerGetDestCoords(&taskData[2], &taskData[3]); taskData[1] = 1; break; case 1: PlayerGetDestCoords(&x, &y); if (x != taskData[2] || y != taskData[3]) { taskData[2] = x; taskData[3] = y; behavior = MapGridGetMetatileBehaviorAt(x, y); if (sub_8057350(behavior) == TRUE) { DoYellowCave4Sparkle(); } else if (sub_8057314(behavior) == TRUE) { sub_80C68A4(MapGridGetMetatileIdAt(x, y), x, y); } else if (sub_8057328(behavior) == TRUE) { sub_80C6A54(x, y); } else if (sub_805733C(behavior) == TRUE) { DoDecorationSoundEffect(MapGridGetMetatileIdAt(x, y)); } } break; case 2: if (!FieldEffectActiveListContains(taskData[4])) { taskData[1] = 1; } break; } } void sub_80BD034(u8 i, struct SecretBaseRecord *secretBase) { gSaveBlock1.secretBases[i] = *secretBase; gSaveBlock1.secretBases[i].sbr_field_1_6 = 2; } bool8 sub_80BD070(struct SecretBaseRecord *baseA, struct SecretBaseRecord *baseB) { u8 i; for (i = 0; i < 4; i++) { if (baseA->trainerId[i] != baseB->trainerId[i]) { return FALSE; } } return TRUE; } bool8 sub_80BD0A0(struct SecretBaseRecord *baseA, struct SecretBaseRecord *baseB) { u8 i; for (i = 0; i < OT_NAME_LENGTH && (baseA->playerName[i] != 0xFF || baseB->playerName[i] != 0xFF); i++) { if (baseA->playerName[i] != baseB->playerName[i]) { return FALSE; } } return TRUE; } bool8 sub_80BD0EC(struct SecretBaseRecord *baseA, struct SecretBaseRecord *baseB) { if (baseA->gender == baseB->gender && sub_80BD070(baseA, baseB) && sub_80BD0A0(baseA, baseB)) { return TRUE; } return FALSE; } s16 sub_80BD12C(u8 secretBaseId) { s16 i; for (i = 0; i < MAX_SECRET_BASES; i++) { if (gSaveBlock1.secretBases[i].secretBaseId == secretBaseId) { return i; } } return -1; } u8 sub_80BD170(void) { s16 i; for (i = 1; i < MAX_SECRET_BASES; i++) { if (gSaveBlock1.secretBases[i].secretBaseId == 0) { return i; } } return 0; } u8 sub_80BD1B0(void) { s16 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) { return i; } } 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++; } } }