diff options
Diffstat (limited to 'src/secret_base.c')
-rw-r--r-- | src/secret_base.c | 1075 |
1 files changed, 1075 insertions, 0 deletions
diff --git a/src/secret_base.c b/src/secret_base.c new file mode 100644 index 000000000..d88d2c66a --- /dev/null +++ b/src/secret_base.c @@ -0,0 +1,1075 @@ +#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; y<gMapHeader.mapData->height; y++) { + for (x=0; x<gMapHeader.mapData->width; 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.name); +} + +void sub_80BB970(struct MapEvents *events) +{ + u16 bgevidx, idx, jdx; + s16 tile_id; + for (bgevidx=0; bgevidx<events->bgEventCount; 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; decidx<ndecor; decidx++) { + if (roomdecor[decidx] == 0) + continue; + if (gDecorations[roomdecor[decidx]].decor_field_11 != 4) + continue; + for (objid=0; objid<gMapHeader.events->mapObjectCount; 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; bgevtidx<events->bgEventCount; 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(); +} |