#include "global.h" #include "secret_base.h" #include "decoration.h" #include "event_data.h" #include "field_camera.h" #include "field_fadetransition.h" #include "field_player_avatar.h" #include "field_weather.h" #include "fieldmap.h" #include "main.h" #include "map_constants.h" #include "map_name_popup.h" #include "menu.h" #include "metatile_behavior.h" #include "palette.h" #include "pokemon.h" #include "rom4.h" #include "script.h" #include "string_util.h" #include "strings.h" #include "task.h" #include "text.h" #include "vars.h" extern u8 gUnknown_020387DC; extern u16 gSpecialVar_0x8004; extern u16 gSpecialVar_0x8005; extern u16 gSpecialVar_0x8006; extern u16 gSpecialVar_0x8007; extern u16 gScriptResult; extern const struct { u16 unk_083D1358_0; u16 unk_083D1358_1; } gUnknown_083D1358[7]; extern const u8 gUnknown_083D1374[4 * 16]; extern void *gUnknown_0300485C; extern const u8 gUnknown_083D13EC[12]; extern u8 gUnknown_081A2E14[]; void sub_80BB4AC(struct SecretBaseRecord *record) // 080bb4ac { u16 i; u16 j; record->sbr_field_0 = 0; for (i=0; i<7; i++) record->sbr_field_2[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) // 80bb594 { sub_80BB4AC(&(gSaveBlock1.secretBases[idx])); } void ResetSecretBases(void) // 080bb5b4 { u16 i; for (i=0; i<20; i++) ResetSecretBase(i); } void sub_80BB5D0(void) // 080bb5d0 { gUnknown_020387DC = gSpecialVar_0x8004; } void sub_80BB5E4(void) // 80bb5e4 { u16 idx; gScriptResult = 0; for (idx=0; idx<20; idx++) { if (gUnknown_020387DC != gSaveBlock1.secretBases[idx].sbr_field_0) continue; gScriptResult = 1; VarSet(VAR_0x4054, idx); break; } } void sub_80BB63C(void) // 80bb63c { if (gSaveBlock1.secretBases[0].sbr_field_0) 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].sbr_field_0 = 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].sbr_field_2, 0xFF, 7); StringCopyN(gSaveBlock1.secretBases[0].sbr_field_2, 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; jdx<20; jdx++) { if (gSaveBlock1.secretBases[jdx].sbr_field_0 == events->bgEvents[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 == 9 && 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); warp1_set(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; } #ifdef NONMATCHING void sub_80BBCCC(u8 flagIn) { u16 curBaseId; u16 x, y; if (CurrentMapIsSecretBase()) { curBaseId = VarGet(VAR_0x4054); for (x=0; x<16; x++) { if ((u8)(gSaveBlock1.secretBases[curBaseId].decorations[x] - 1) <= 0x77 && gDecorations[gSaveBlock1.secretBases[curBaseId].decorations[x]].decor_field_11 != 4) { sub_80FF394((gSaveBlock1.secretBases[0].decorationPos[x] >> 4) + 7, (gSaveBlock1.secretBases[0].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); } } } 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) { gSpecialVar_0x8006 = roomdecorpos[decidx] >> 4; gSpecialVar_0x8007 = roomdecorpos[decidx] & 0xF; metatile = MapGridGetMetatileBehaviorAt(gSpecialVar_0x8006 + 7, gSpecialVar_0x8007 + 7); if (sub_80572D8(metatile) == 1 || sub_80572EC(metatile) == 1) { gScriptResult = gMapHeader.events->mapObjects[objid].graphicsId + 0x3f20; VarSet(gScriptResult, gDecorations[roomdecor[decidx]].tiles[0]); gScriptResult = gMapHeader.events->mapObjects[objid].localId; FlagReset(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_80BBCCC(u8 flagIn) { asm(".syntax unified\n\ push {r4-r7,lr}\n\ mov r7, r8\n\ push {r7}\n\ sub sp, 0x4\n\ lsls r0, 24\n\ lsrs r0, 24\n\ mov r8, r0\n\ bl CurrentMapIsSecretBase\n\ lsls r0, 24\n\ cmp r0, 0\n\ beq _080BBDBC\n\ ldr r0, _080BBD70 @ =0x00004054\n\ bl VarGet\n\ lsls r0, 16\n\ lsrs r5, r0, 16\n\ movs r1, 0\n\ mov r0, sp\n\ strh r1, [r0]\n\ ldr r6, _080BBD74 @ =gSaveBlock1\n\ mov r4, sp\n\ ldr r0, _080BBD78 @ =0x00001a2a\n\ adds r7, r6, r0\n\ _080BBCFC:\n\ lsls r0, r5, 2\n\ adds r0, r5\n\ lsls r0, 5\n\ ldrh r1, [r4]\n\ adds r2, r0, r1\n\ ldr r1, _080BBD7C @ =0x00001a1a\n\ adds r0, r6, r1\n\ adds r1, r2, r0\n\ ldrb r0, [r1]\n\ subs r0, 0x1\n\ lsls r0, 24\n\ lsrs r0, 24\n\ cmp r0, 0x77\n\ bhi _080BBD3A\n\ ldr r0, _080BBD80 @ =gDecorations\n\ ldrb r3, [r1]\n\ lsls r1, r3, 5\n\ adds r1, r0\n\ ldrb r0, [r1, 0x11]\n\ cmp r0, 0x4\n\ beq _080BBD3A\n\ adds r0, r2, r7\n\ ldrb r2, [r0]\n\ lsrs r0, r2, 4\n\ adds r0, 0x7\n\ movs r1, 0xF\n\ ands r1, r2\n\ adds r1, 0x7\n\ adds r2, r3, 0\n\ bl sub_80FF394\n\ _080BBD3A:\n\ ldrh r0, [r4]\n\ adds r0, 0x1\n\ lsls r0, 16\n\ lsrs r0, 16\n\ strh r0, [r4]\n\ cmp r0, 0xF\n\ bls _080BBCFC\n\ cmp r5, 0\n\ beq _080BBD88\n\ mov r4, sp\n\ adds r4, 0x2\n\ movs r2, 0x88\n\ lsls r2, 2\n\ mov r0, sp\n\ adds r1, r4, 0\n\ bl sub_80BB764\n\ mov r0, sp\n\ ldrh r0, [r0]\n\ adds r0, 0x7\n\ ldrh r1, [r4]\n\ adds r1, 0x7\n\ ldr r2, _080BBD84 @ =0x00000e21\n\ bl MapGridSetMetatileIdAt\n\ b _080BBDBC\n\ .align 2, 0\n\ _080BBD70: .4byte 0x00004054\n\ _080BBD74: .4byte gSaveBlock1\n\ _080BBD78: .4byte 0x00001a2a\n\ _080BBD7C: .4byte 0x00001a1a\n\ _080BBD80: .4byte gDecorations\n\ _080BBD84: .4byte 0x00000e21\n\ _080BBD88:\n\ mov r0, r8\n\ cmp r0, 0x1\n\ bne _080BBDBC\n\ ldr r0, _080BBDC8 @ =0x00004089\n\ bl VarGet\n\ lsls r0, 16\n\ lsrs r0, 16\n\ cmp r0, 0x1\n\ bne _080BBDBC\n\ mov r4, sp\n\ adds r4, 0x2\n\ movs r2, 0x88\n\ lsls r2, 2\n\ mov r0, sp\n\ adds r1, r4, 0\n\ bl sub_80BB764\n\ mov r0, sp\n\ ldrh r0, [r0]\n\ adds r0, 0x7\n\ ldrh r1, [r4]\n\ adds r1, 0x7\n\ ldr r2, _080BBDCC @ =0x00000e0a\n\ bl MapGridSetMetatileIdAt\n\ _080BBDBC:\n\ add sp, 0x4\n\ pop {r3}\n\ mov r8, r3\n\ pop {r4-r7}\n\ pop {r0}\n\ bx r0\n\ .align 2, 0\n\ _080BBDC8: .4byte 0x00004089\n\ _080BBDCC: .4byte 0x00000e0a\n\ .syntax divided\n"); } __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 FlagReset\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(s16 *position, struct MapEvents *events) { s16 bgevtidx; for (bgevtidx=0; bgevtidxbgEventCount; bgevtidx++) { if (events->bgEvents[bgevtidx].kind == 8 && position[0] == events->bgEvents[bgevtidx].x + 7 && position[1] == events->bgEvents[bgevtidx].y + 7) { gUnknown_020387DC = events->bgEvents[bgevtidx].bgUnion.secretBaseId; break; } } } void sub_80BC038(s16 *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].sbr_field_0 != gUnknown_020387DC) gScriptResult = 1; else gScriptResult = 0; } u8 sub_80BC14C(u8 sbid) { s16 idx; for (idx=0; idx<20; idx++) { if (gSaveBlock1.secretBases[idx].sbr_field_0 == sbid) return idx; } return 0; } u8 *sub_80BC190(u8 *dest, u8 arg1) { // 80bc190 u8 local1; u8 *str; local1 = sub_80BB8A8(gSaveBlock1.secretBases[arg1].sbr_field_2); str = StringCopyN(dest, gSaveBlock1.secretBases[arg1].sbr_field_2, local1); str[0] = EOS; #if ENGLISH return StringAppend(dest, gOtherText_PlayersBase); #elif GERMAN return de_sub_8073174(dest, gOtherText_PlayersBase); #endif } u8 *GetSecretBaseMapName(u8 *dest) { gUnknown_020387DC = gSaveBlock1.secretBases[VarGet(VAR_0x4054)].sbr_field_0; return sub_80BC190(dest, VarGet(VAR_0x4054)); } void sub_80BC224(void) { u8 *var0 = gSaveBlock1.secretBases[(u8)VarGet(VAR_0x4054)].sbr_field_2; u8 *var1 = gStringVar1; u8 var2 = sub_80BB8A8(var0); u8 *var3 = StringCopyN(var1, var0, var2); *var3 = EOS; } u8 sub_80BC268(u8 foo) { // 80bc268 if (gSaveBlock1.secretBases[foo].sbr_field_1_6) return 1; return 0; } u8 sub_80BC298(struct Pokemon *mon) { // 80bc298 u16 evsum = GetMonData(mon, MON_DATA_HP_EV); evsum += GetMonData(mon, MON_DATA_ATK_EV); evsum += GetMonData(mon, MON_DATA_DEF_EV); evsum += GetMonData(mon, MON_DATA_SPD_EV); evsum += GetMonData(mon, MON_DATA_SPATK_EV); evsum += GetMonData(mon, MON_DATA_SPDEF_EV); return (u8)(evsum / 6); } #ifdef NONMATCHING void sub_80BC300(void) { u16 moveidx; u16 sbpartyidx = 0; int resetVal = 0; u16 partyidx = 0; while (partyidx < 6) { partyidx ++; for (moveidx=0; moveidx<4; moveidx++) { gSaveBlock1.secretBases[0].partyMoves[(partyidx - 1) * 6 + moveidx] = resetVal; } gSaveBlock1.secretBases[0].partySpecies[partyidx - 1] = resetVal; gSaveBlock1.secretBases[0].partyHeldItems[partyidx - 1] = resetVal; gSaveBlock1.secretBases[0].partyLevels[partyidx - 1] = resetVal; gSaveBlock1.secretBases[0].partyPersonality[partyidx - 1] = resetVal; gSaveBlock1.secretBases[0].partyEVs[partyidx - 1] = resetVal; if (GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_SPECIES) != 0 && !GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_IS_EGG)) { sbpartyidx ++; for (moveidx=0; moveidx<4; moveidx++) { gSaveBlock1.secretBases[0].partyMoves[(sbpartyidx - 1) * 6 + moveidx] = GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_MOVE1 + moveidx); } gSaveBlock1.secretBases[0].partySpecies[sbpartyidx - 1] = GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_SPECIES); gSaveBlock1.secretBases[0].partyHeldItems[sbpartyidx - 1] = GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_HELD_ITEM); gSaveBlock1.secretBases[0].partyLevels[sbpartyidx - 1] = GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_LEVEL); gSaveBlock1.secretBases[0].partyPersonality[sbpartyidx - 1] = GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_PERSONALITY); gSaveBlock1.secretBases[0].partyEVs[sbpartyidx - 1] = sub_80BC298(&(gPlayerParty[partyidx - 1])); } } } #else __attribute__((naked)) void sub_80BC300(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, 0xC\n\ movs r0, 0\n\ mov r10, r0\n\ movs r6, 0\n\ mov r9, r6\n\ _080BC314:\n\ movs r4, 0\n\ lsls r3, r6, 2\n\ lsls r2, r6, 1\n\ ldr r7, _080BC424 @ =gPlayerParty\n\ adds r1, r6, 0x1\n\ str r1, [sp]\n\ adds r1, r3, 0\n\ _080BC322:\n\ adds r0, r1, r4\n\ lsls r0, 1\n\ ldr r5, _080BC428 @ =gSaveBlock1 + 0x1A54\n\ adds r0, r5, r0\n\ mov r5, r9\n\ strh r5, [r0]\n\ adds r0, r4, 0x1\n\ lsls r0, 16\n\ lsrs r4, r0, 16\n\ cmp r4, 0x3\n\ bls _080BC322\n\ ldr r1, _080BC42C @ =gSaveBlock1 + 0x1A84\n\ adds r0, r1, r2\n\ strh r5, [r0]\n\ ldr r5, _080BC430 @ =gSaveBlock1 + 0x1A90\n\ adds r0, r5, r2\n\ mov r1, r9\n\ strh r1, [r0]\n\ ldr r2, _080BC434 @ =gSaveBlock1 + 0x1A9C\n\ adds r0, r2, r6\n\ mov r5, r9\n\ strb r5, [r0]\n\ ldr r1, _080BC438 @ =gSaveBlock1 + 0x1A3C\n\ adds r0, r1, r3\n\ mov r2, r9\n\ str r2, [r0]\n\ ldr r3, _080BC43C @ =gSaveBlock1 + 0x1AA2\n\ adds r0, r3, r6\n\ strb r2, [r0]\n\ movs r0, 0x64\n\ adds r5, r6, 0\n\ muls r5, r0\n\ adds r4, r5, r7\n\ adds r0, r4, 0\n\ movs r1, 0xB\n\ bl GetMonData\n\ cmp r0, 0\n\ beq _080BC408\n\ adds r0, r4, 0\n\ movs r1, 0x2D\n\ bl GetMonData\n\ cmp r0, 0\n\ bne _080BC408\n\ movs r4, 0\n\ mov r0, r10\n\ lsls r0, 2\n\ mov r8, r0\n\ mov r1, r10\n\ lsls r7, r1, 1\n\ adds r1, 0x1\n\ str r1, [sp, 0x4]\n\ ldr r2, _080BC424 @ =gPlayerParty\n\ _080BC38E:\n\ adds r1, r4, 0\n\ adds r1, 0xD\n\ adds r0, r5, r2\n\ str r2, [sp, 0x8]\n\ bl GetMonData\n\ mov r3, r8\n\ adds r1, r3, r4\n\ lsls r1, 1\n\ ldr r3, _080BC428 @ =gSaveBlock1 + 0x1A54\n\ adds r1, r3, r1\n\ strh r0, [r1]\n\ adds r0, r4, 0x1\n\ lsls r0, 16\n\ lsrs r4, r0, 16\n\ ldr r2, [sp, 0x8]\n\ cmp r4, 0x3\n\ bls _080BC38E\n\ movs r0, 0x64\n\ adds r4, r6, 0\n\ muls r4, r0\n\ ldr r0, _080BC424 @ =gPlayerParty\n\ adds r4, r0\n\ adds r0, r4, 0\n\ movs r1, 0xB\n\ bl GetMonData\n\ ldr r5, _080BC42C @ =gSaveBlock1 + 0x1A84\n\ adds r1, r5, r7\n\ strh r0, [r1]\n\ adds r0, r4, 0\n\ movs r1, 0xC\n\ bl GetMonData\n\ ldr r2, _080BC430 @ =gSaveBlock1 + 0x1A90\n\ adds r1, r2, r7\n\ strh r0, [r1]\n\ adds r0, r4, 0\n\ movs r1, 0x38\n\ bl GetMonData\n\ ldr r1, _080BC434 @ =gSaveBlock1 + 0x1A9C\n\ add r1, r10\n\ strb r0, [r1]\n\ adds r0, r4, 0\n\ movs r1, 0\n\ bl GetMonData\n\ ldr r1, _080BC438 @ =gSaveBlock1 + 0x1A3C\n\ add r1, r8\n\ str r0, [r1]\n\ adds r0, r4, 0\n\ bl sub_80BC298\n\ ldr r1, _080BC43C @ =gSaveBlock1 + 0x1AA2\n\ add r1, r10\n\ strb r0, [r1]\n\ ldr r3, [sp, 0x4]\n\ lsls r0, r3, 16\n\ lsrs r0, 16\n\ mov r10, r0\n\ _080BC408:\n\ ldr r5, [sp]\n\ lsls r0, r5, 16\n\ lsrs r6, r0, 16\n\ cmp r6, 0x5\n\ bls _080BC314\n\ add sp, 0xC\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\ _080BC424: .4byte gPlayerParty\n\ _080BC428: .4byte gSaveBlock1 + 0x1A54\n\ _080BC42C: .4byte gSaveBlock1 + 0x1A84\n\ _080BC430: .4byte gSaveBlock1 + 0x1A90\n\ _080BC434: .4byte gSaveBlock1 + 0x1A9C\n\ _080BC438: .4byte gSaveBlock1 + 0x1A3C\n\ _080BC43C: .4byte gSaveBlock1 + 0x1AA2\n\ .syntax divided\n"); } #endif void sub_80BC440(void) { u16 backupValue = gSaveBlock1.secretBases[0].sbr_field_e; ResetSecretBase(0); gSaveBlock1.secretBases[0].sbr_field_e = backupValue; sub_80BC0F8(); } void SecretBasePC_PackUp(void) { IncrementGameStat(20); sub_80BC440(); }