diff options
author | Marcus Huderle <huderlem@gmail.com> | 2017-10-15 14:36:53 -0700 |
---|---|---|
committer | Marcus Huderle <huderlem@gmail.com> | 2017-10-15 14:36:53 -0700 |
commit | fcd62bf39372bbb26e21f3dfb67ccf1782954834 (patch) | |
tree | 065d2081953cfbec1bfcca3f3f9b335f580290e8 /src | |
parent | 7d657ef56716fd01bacf4a47df50ad0ec3d03b10 (diff) |
Start decomp on rest of secret_base
Diffstat (limited to 'src')
-rw-r--r-- | src/field/secret_base.c | 684 |
1 files changed, 671 insertions, 13 deletions
diff --git a/src/field/secret_base.c b/src/field/secret_base.c index f221d7f16..d60938d1b 100644 --- a/src/field/secret_base.c +++ b/src/field/secret_base.c @@ -11,17 +11,31 @@ #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 "string_util.h" #include "strings.h" #include "task.h" #include "text.h" #include "vars.h" +extern void sub_80BCBF8(u8 taskId); +extern void sub_80BCC54(u8 taskId); +extern void sub_80BC824(u8 taskId); +extern void sub_80BC7D8(u8 taskId); +static void sub_80BCAEC(u8 taskId); +static void sub_80BC980(u8 taskId); +static void sub_80BC9E4(u8 taskId); +static u8 sub_80BC948(u8 a); +static void Task_SecretBasePC_Registry(u8 taskId); + +extern struct YesNoFuncTable gUnknown_083D13E4; +extern struct MenuAction gUnknown_083D13D4[]; extern u8 gUnknown_020387DC; extern u16 gSpecialVar_0x8004; extern u16 gSpecialVar_0x8005; @@ -36,14 +50,26 @@ extern const struct extern const u8 gUnknown_083D1374[4 * 16]; extern void *gUnknown_0300485C; extern const u8 gUnknown_083D13EC[12]; +extern u8 gUnknown_0815F399[]; +extern u8 gUnknown_0815F49A[]; 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 sub_80BB4AC(struct SecretBaseRecord *record) // 080bb4ac { u16 i; u16 j; - record->sbr_field_0 = 0; + record->secretBaseId = 0; for (i=0; i<7; i++) record->sbr_field_2[i] = 0xff; for (i=0; i<4; i++) @@ -93,7 +119,7 @@ void sub_80BB5E4(void) // 80bb5e4 u16 idx; gScriptResult = 0; for (idx=0; idx<20; idx++) { - if (gUnknown_020387DC != gSaveBlock1.secretBases[idx].sbr_field_0) + if (gUnknown_020387DC != gSaveBlock1.secretBases[idx].secretBaseId) continue; gScriptResult = 1; VarSet(VAR_0x4054, idx); @@ -103,7 +129,7 @@ void sub_80BB5E4(void) // 80bb5e4 void sub_80BB63C(void) // 80bb63c { - if (gSaveBlock1.secretBases[0].sbr_field_0) + if (gSaveBlock1.secretBases[0].secretBaseId) gScriptResult = 1; else gScriptResult = 0; @@ -196,7 +222,7 @@ void sub_80BB8CC(void) { u8 nameLength; u16 idx; - gSaveBlock1.secretBases[0].sbr_field_0 = gUnknown_020387DC; + gSaveBlock1.secretBases[0].secretBaseId = gUnknown_020387DC; for (idx=0; idx<4; idx++) { gSaveBlock1.secretBases[0].trainerId[idx] = gSaveBlock2.playerTrainerId[idx]; } @@ -215,7 +241,7 @@ void sub_80BB970(struct MapEvents *events) 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) { + 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++) { if (gUnknown_083D1358[idx].unk_083D1358_0 == tile_id) { @@ -811,7 +837,7 @@ void sub_80BC0F8(void) { } void sub_80BC114(void) { - if (gSaveBlock1.secretBases[0].sbr_field_0 != gUnknown_020387DC) + if (gSaveBlock1.secretBases[0].secretBaseId != gUnknown_020387DC) gScriptResult = 1; else gScriptResult = 0; @@ -821,7 +847,7 @@ u8 sub_80BC14C(u8 sbid) { s16 idx; for (idx=0; idx<20; idx++) { - if (gSaveBlock1.secretBases[idx].sbr_field_0 == sbid) + if (gSaveBlock1.secretBases[idx].secretBaseId == sbid) return idx; } return 0; @@ -844,7 +870,7 @@ u8 *sub_80BC190(u8 *dest, u8 arg1) { // 80bc190 } u8 *GetSecretBaseMapName(u8 *dest) { - gUnknown_020387DC = gSaveBlock1.secretBases[VarGet(VAR_0x4054)].sbr_field_0; + gUnknown_020387DC = gSaveBlock1.secretBases[VarGet(VAR_0x4054)].secretBaseId; return sub_80BC190(dest, VarGet(VAR_0x4054)); } @@ -856,10 +882,10 @@ void sub_80BC224(void) { *var3 = EOS; } -u8 sub_80BC268(u8 foo) { // 80bc268 - if (gSaveBlock1.secretBases[foo].sbr_field_1_6) - return 1; - return 0; +bool8 sub_80BC268(u8 i) { // 80bc268 + if (gSaveBlock1.secretBases[i].sbr_field_1_6) + return TRUE; + return FALSE; } u8 sub_80BC298(struct Pokemon *mon) { // 80bc298 @@ -1070,6 +1096,638 @@ void sub_80BC440(void) void SecretBasePC_PackUp(void) { - IncrementGameStat(20); + IncrementGameStat(GAME_STAT_MOVED_SECRET_BASE); sub_80BC440(); } + +void sub_80BC474(void) +{ + u16 eventId; + struct MapEvents *mapEvents = gMapHeader.events; + for (eventId = 0; eventId < mapEvents->bgEventCount; 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 < 20; 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[0]; + 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); + } +} + +#ifdef NONMATCHING +void sub_80BC6B0(u8 taskId) +{ + s16 *taskData = gTasks[taskId].data; + u8 count = 0; + u8 var1 = 0; + u8 i = 1; + + if (var1 == taskData[2]) + { + count = 1; + } + else + { + while (1) + { + if (sub_80BC268(i) == TRUE) + { + count++; + } + + i++; + if (i > 19) + { + break; + } + + if (count == taskData[2]) + { + count = i; + break; + } + } + } + + while (count < 20) + { + if (sub_80BC268(count) == TRUE) + { + sub_80BC190(gStringVar1, count); + MenuFillWindowRectWithBlankTile(18, var1 * 2 + 2, 28, var1 * 2 + 3); + MenuPrint(gStringVar1, 18, var1 * 2 + 2); + + var1++; + if (var1 == 8) + { + break; + } + } + + count++; + } + + if (var1 < 8) + { + MenuFillWindowRectWithBlankTile(18, var1 * 2 + 2, 28, var1 * 2 + 3); + MenuPrint(gUnknownText_Exit, 18, var1 * 2 + 2); + DestroyVerticalScrollIndicator(1); + + if (var1 != 7) + { + MenuFillWindowRectWithBlankTile(18, (((var1 << 25) + 0x4000000)) >> 24, 28, 18); + } + } + else + { + CreateVerticalScrollIndicators(1, 188, 152); + } + + if (taskData[2] == 0) + { + DestroyVerticalScrollIndicator(0); + } + else + { + CreateVerticalScrollIndicators(0, 188, 8); + } +} +#else +__attribute__((naked)) +void sub_80BC6B0(u8 taskId) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r1, r0, 2\n\ + adds r1, r0\n\ + lsls r1, 3\n\ + ldr r0, _080BC6D8 @ =gTasks + 0x8\n\ + adds r1, r0\n\ + mov r8, r1\n\ + movs r4, 0\n\ + movs r6, 0\n\ + movs r5, 0x1\n\ + movs r2, 0x4\n\ + ldrsh r0, [r1, r2]\n\ + cmp r6, r0\n\ + bne _080BC6DC\n\ + movs r4, 0x1\n\ + b _080BC706\n\ + .align 2, 0\n\ +_080BC6D8: .4byte gTasks + 0x8\n\ +_080BC6DC:\n\ + adds r0, r5, 0\n\ + bl sub_80BC268\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + bne _080BC6F0\n\ + adds r0, r4, 0x1\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ +_080BC6F0:\n\ + adds r0, r5, 0x1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + cmp r5, 0x13\n\ + bhi _080BC706\n\ + mov r1, r8\n\ + movs r2, 0x4\n\ + ldrsh r0, [r1, r2]\n\ + cmp r4, r0\n\ + bne _080BC6DC\n\ + adds r4, r5, 0\n\ +_080BC706:\n\ + adds r5, r4, 0\n\ + cmp r5, 0x13\n\ + bhi _080BC75A\n\ + ldr r7, _080BC7A0 @ =gStringVar1\n\ +_080BC70E:\n\ + adds r0, r5, 0\n\ + bl sub_80BC268\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + bne _080BC750\n\ + adds r0, r7, 0\n\ + adds r1, r5, 0\n\ + bl sub_80BC190\n\ + lsls r3, r6, 1\n\ + adds r4, r3, 0x2\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + adds r3, 0x3\n\ + lsls r3, 24\n\ + lsrs r3, 24\n\ + movs r0, 0x12\n\ + adds r1, r4, 0\n\ + movs r2, 0x1C\n\ + bl MenuFillWindowRectWithBlankTile\n\ + adds r0, r7, 0\n\ + movs r1, 0x12\n\ + adds r2, r4, 0\n\ + bl MenuPrint\n\ + adds r0, r6, 0x1\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + cmp r6, 0x8\n\ + beq _080BC75A\n\ +_080BC750:\n\ + adds r0, r5, 0x1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + cmp r5, 0x13\n\ + bls _080BC70E\n\ +_080BC75A:\n\ + cmp r6, 0x7\n\ + bhi _080BC7A8\n\ + lsls r3, r6, 1\n\ + adds r4, r3, 0x2\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + adds r3, 0x3\n\ + lsls r3, 24\n\ + lsrs r3, 24\n\ + movs r0, 0x12\n\ + adds r1, r4, 0\n\ + movs r2, 0x1C\n\ + bl MenuFillWindowRectWithBlankTile\n\ + ldr r0, _080BC7A4 @ =gUnknownText_Exit\n\ + movs r1, 0x12\n\ + adds r2, r4, 0\n\ + bl MenuPrint\n\ + movs r0, 0x1\n\ + bl DestroyVerticalScrollIndicator\n\ + cmp r6, 0x7\n\ + beq _080BC7B2\n\ + lsls r1, r6, 25\n\ + movs r0, 0x80\n\ + lsls r0, 19\n\ + adds r1, r0\n\ + lsrs r1, 24\n\ + movs r0, 0x12\n\ + movs r2, 0x1C\n\ + movs r3, 0x12\n\ + bl MenuFillWindowRectWithBlankTile\n\ + b _080BC7B2\n\ + .align 2, 0\n\ +_080BC7A0: .4byte gStringVar1\n\ +_080BC7A4: .4byte gUnknownText_Exit\n\ +_080BC7A8:\n\ + movs r0, 0x1\n\ + movs r1, 0xBC\n\ + movs r2, 0x98\n\ + bl CreateVerticalScrollIndicators\n\ +_080BC7B2:\n\ + mov r1, r8\n\ + movs r2, 0x4\n\ + ldrsh r0, [r1, r2]\n\ + cmp r0, 0\n\ + bne _080BC7C4\n\ + movs r0, 0\n\ + bl DestroyVerticalScrollIndicator\n\ + b _080BC7CE\n\ +_080BC7C4:\n\ + movs r0, 0\n\ + movs r1, 0xBC\n\ + movs r2, 0x8\n\ + bl CreateVerticalScrollIndicators\n\ +_080BC7CE:\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided\n"); +} +#endif + +void sub_80BC7D8(u8 taskId) +{ + u16 *taskData = &gTasks[taskId].data[0]; + 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 + { + return; + } + } + 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 < 20; secretBaseIndex++) + { + if (sub_80BC268(secretBaseIndex) == TRUE) + { + if (a == count) + { + return secretBaseIndex; + } + else + { + count++; + } + } + } + + return 0; +} + +void sub_80BC980(u8 taskId) +{ + PauseVerticalScrollIndicator(0); + PauseVerticalScrollIndicator(1); + MenuDrawTextWindow(1, 0, 12, 5); + PrintMenuItems(2, 1, 2, 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].sbr_field_2[7] % 5) + + gSaveBlock1.secretBases[secretBaseIndex].gender * 5; +} + +u8 *sub_80BCCE8(void) +{ + u8 var1 = sub_80BCCA4(VarGet(VAR_0x4054)); + + if (var1 == 0) + { + return UnknownString_81A1BB2; + } + else if (var1 == 1) + { + return UnknownString_81A1F67; + } + else if (var1 == 2) + { + return UnknownString_81A2254; + } + else if (var1 == 3) + { + return UnknownString_81A25C3; + } + else if (var1 == 4) + { + return UnknownString_81A2925; + } + else if (var1 == 5) + { + return UnknownString_81A1D74; + } + else if (var1 == 6) + { + return UnknownString_81A20C9; + } + else if (var1 == 7) + { + return UnknownString_81A2439; + } + else if (var1 == 8) + { + return UnknownString_81A2754; + } + else + { + return UnknownString_81A2B2A; + } +} |