#include "fileScreen.h" // copy, erase, start #define NUM_FILE_OPERATIONS 3 typedef enum { STATE_NONE, STATE_NEW, STATE_CHOOSE_LANG, STATE_OPTIONS, STATE_VIEW, STATE_COPY, STATE_ERASE, STATE_START, } FileSelectState; // todo: does this belong with gUnk_02019EE0? typedef enum { SAVE_EMPTY = 0, SAVE_VALID = 1, SAVE_DELETED = 0xFFFFFFFF, } SaveStatus; typedef enum { RESULT_INVALID = 0, RESULT_ASCII = 1, } CharResult; static void HandleFileScreenEnter(void); static void HandleFileScreenActive(void); static void HandleFileScreenExit(void); static void (*const sScreenHandlers[])(void) = { HandleFileScreenEnter, HandleFileScreenActive, HandleFileScreenExit, }; static void HandleFileSelect(void); extern void HandleFileNew(void); static void HandleFileLanguageSelect(void); extern void HandleFileOptions(void); static void HandleFileView(void); extern void HandleFileCopy(void); extern void HandleFileDelete(void); extern void HandleFileStart(void); static void (*const sFileScreenSubHandlers[])(void) = { HandleFileSelect, HandleFileNew, HandleFileLanguageSelect, HandleFileOptions, HandleFileView, HandleFileCopy, HandleFileDelete, HandleFileStart, }; static const KeyButtonLayout gUnk_080FC8D0 = { .aButtonX = 0xFF, .aButtonY = 0xD8, .aButtonText = 0x0, .bButtonX = 0xFF, .bButtonY = 0xD8, .bButtonText = 0x0, .rButtonX = 0xE0, .rButtonY = 0x10, .rButtonText = 0xF, .settingDict = { 0x5, 0x0, 0x2, 0x0, 0xFF }, }; static const u16 gUnk_080FC8DE[] = { 0x01, 0x00, 0x20, 0x40, 0x60, 0x80, 0xa0, 0xc0, 0xe0, 0xc0, 0xa0, 0x80, 0x60, 0x40, 0x20, }; static void sub_08050848(void); static void sub_0805086C(void); static void sub_08050940(void); static void (*const sFileSelectDefaultHandlers[])(void) = { sub_08050848, sub_0805086C, sub_08050940, }; extern void (*const gUnk_080FC944[])(void); extern void (*const gUnk_080FC950[])(void); extern void (*const gUnk_080FC960[])(void); extern void (*const gUnk_080FC9B0[])(void); extern void (*const gUnk_080FC9BC[])(void); extern void (*const gUnk_080FC9C8[])(void); static void sub_08050624(u32); static void sub_0805066C(void); static void HideButtonR(void); static void ShowButtonR(void); void sub_08051458(); void CreateDialogBox(u32 arg0, u32 arg1) { u32 sfx; struct_080FC844 var0; sub_08050384(); MemCopy(&gUnk_080FC844, &var0, sizeof(gUnk_080FC844)); sub_08056FEC(arg1, &gUnk_020227E8); var0.unk10 |= gUnk_080FC85C[arg0][0] << 0xC; sub_0805F46C(gUnk_080FC85C[arg0][1], &var0); sfx = gUnk_080FC85C[arg0][2]; if (sfx) { SoundReq(sfx); } gScreen.bg.bg0Updated = 1; } void sub_08050384(void) { sub_0801C4A0(0, 0); MemClear32(&gBG0Buffer, sizeof(gBG0Buffer)); gScreen.bg.bg0Updated = 1; } void sub_080503A8(u32 gfxGroup) { LoadGfxGroup(gfxGroup); gScreen.bg.bg1Updated = 1; gScreen.affine.bg2Updated = 1; } void SetFileSelectState(FileSelectState mode) { gUnk_02032EC0.state = mode; MemClear32(&gBG0Buffer, sizeof(gBG0Buffer)); MemClear32(&gBG1Buffer, sizeof(gBG1Buffer)); } void LoadOptionsFromSave(u32 idx) { u8 messageSpeed; u8 brightnessPref; if (idx >= NUM_SAVE_SLOTS) { // these apply to the language selection screen messageSpeed = 1; brightnessPref = 1; } else { SaveFile* saveFile = &gUnk_02019EE0.saves[idx]; messageSpeed = saveFile->messageSpeed; brightnessPref = saveFile->brightnessPref; } gUnk_02000000->messageSpeed = messageSpeed; gUnk_02000000->brightnessPref = brightnessPref; gUsedPalettes = 0xFFFFFFFF; } void SetActiveSave(u32 idx) { if (idx < NUM_SAVE_SLOTS) { gUnk_02000000->saveFileId = idx; MemCopy(&gUnk_02019EE0.saves[idx], &gSave, sizeof(gUnk_02019EE0.saves[idx])); } LoadOptionsFromSave(idx); } void HandleChooseFileScreen(void) { FlushSprites(); sScreenHandlers[gMain.funcIndex](); if (gUnk_02032EC0.lastState != gUnk_02032EC0.state) { gUnk_02032EC0.lastState = gUnk_02032EC0.state; gScreen.bg.bg0xOffset = 0; gScreen.bg.bg0yOffset = 0; gScreen.bg.bg1xOffset = 0; gScreen.bg.bg1yOffset = 0; gScreen.affine.bg2xOffset = 0; gScreen.affine.bg2yOffset = 0; MemClear32(&gChooseFileState, sizeof(gChooseFileState)); } HideButtonR(); sFileScreenSubHandlers[gUnk_02032EC0.lastState](); gUnk_02019EE0.isTransitioning = FALSE; sub_0805E5C0(); sub_0805066C(); sub_0801C1D4(); sub_0801C208(); sub_080AD9B0(); sub_080AD918(); if (gUnk_02019EE0.unk3 != gUnk_02000000->gameLanguage) { gUnk_02019EE0.unk3 = gUnk_02000000->gameLanguage; sub_080503A8(0x6); sub_080503A8(0xF); } } static void HandleFileScreenEnter(void) { u32 i; sub_0801DA90(1); sub_080A3210(); MemClear32((void*)VRAM, 0x80); // clear palettes MessageInitialize(); EraseAllEntities(); sub_08080668(); sub_080ADD30(); sub_0801CFA8(0); MemClear32(&gUnk_0200AF00, sizeof(gUnk_0200AF00)); MemClear32(&gUnk_02019EE0, sizeof(gUnk_02019EE0)); gUnk_02019EE0.unk3 = 7; gUnk_02019EE0.unk6 = gUnk_02000000->gameLanguage > LANGUAGE_EN ? 3 : 0; MemClear32(&gUnk_02032EC0, sizeof(gUnk_02032EC0)); gUnk_02032EC0.lastState = 8; SetFileSelectState(STATE_NONE); InitDMA(); sub_08050624(0); sub_08050624(1); sub_08050624(2); sub_08056208(); sub_080503A8(0x5); LoadPaletteGroup(0x9); for (i = 0; i < 26; i++) { CreateObject(0x48, i, 0); } sub_080A70AC(&gUnk_080FC8D0); HideButtonR(); gScreen.lcd.displayControl |= DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; gScreen.affine.bg3Control = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(30); gScreen.controls.layerFXControl = BLDCNT_TGT1_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_EFFECT_BLEND; gScreen.controls.alphaBlend = BLDALPHA_BLEND(15, 10); gUnk_02024490.unk0 = 1; gMain.funcIndex = 1; SoundReq(0x7); DoFade(4, 8); } static void HandleFileScreenActive(void) { } static void HandleFileScreenExit(void) { if (!gFadeControl.active) { InitScreen(SCREEN_GAMEPLAY); } } static void sub_08050624(u32 idx) { SaveFile* saveFile = &gUnk_02019EE0.saves[idx]; int status = ReadSaveFile(idx, saveFile); switch (status) { case SAVE_DELETED: SetFileStatusDeleted(idx); // fallthrough case SAVE_EMPTY: sub_0805194C(idx); break; } gUnk_02019EE0.saveStatus[idx] = status; } static void sub_0805066C(void) { u32 loadNewPalette; const u8* paletteOffset; loadNewPalette = FALSE; if (--gUnk_02019EE0.unk1 == 0) { gUnk_02019EE0.unk1 = 16; gUnk_02019EE0.unk2 = (gUnk_02019EE0.unk2 + 1) % 15; loadNewPalette = TRUE; } if (gUnk_02019EE0.unk2 == 0) { gUnk_02019EE0.unk2 = 1; gUnk_02019EE0.unk1 = (Random() & 0x7) * 16 + 8; loadNewPalette = TRUE; } if (loadNewPalette) { paletteOffset = &gGlobalGfxAndPalettes[gUnk_080FC8DE[gUnk_02019EE0.unk2]]; LoadPalettes(&paletteOffset[0x11AA0], 11, 1); LoadPalettes(&paletteOffset[0x11BA0], 12, 1); LoadPalettes(&paletteOffset[0x11CA0], 13, 1); LoadPalettes(&paletteOffset[0x11DA0], 14, 1); } } void sub_0805070C(void) { u32 i; int j; struct_02036540* var0; char* playerName; var0 = sub_0805F2C8(); if (var0) { var0->charColor = 0; var0->bgColor = 5; var0->unk1 = 1; var0->unk4 = 0x30; var0->unk8 = gUnk_02000D00; for (i = 0; i < NUM_SAVE_SLOTS; i++) { var0->unk6 = 0; MemClear32(var0->unk8, 0x200); playerName = &gUnk_02019EE0.saves[i].playerName[0]; for (j = 0; j < FILENAME_LENGTH; j++) { sub_0805F7DC(playerName[j], var0); } // i is a struct of size 0x200 MemCopy(var0->unk8, (void*)(OBJ_VRAM0 + 0x4000 + i * 0x200), 0x200); } sub_0805F300(var0); } } void sub_08050790(void) { u32 i, j; struct_02036540* var0; u32 var1; var0 = sub_0805F2C8(); if (var0) { var0->charColor = 0; var0->bgColor = 5; var0->unk1 = 1; var0->unk4 = 0x80; var0->unk8 = gUnk_02000D00; for (i = 0; i < 16; i++) { var0->unk6 = 0; var1 = i * 16; for (j = 0; j < 16; j++) { sub_0805F7DC(var1, var0); var1++; } MemCopy(gUnk_02000D00, (void*)(BG_VRAM + i * 0x400), 0x400); } sub_0805F300(var0); } } static void HideButtonR(void) { gUnk_0200AF00.rButtonX = 0x140; gUnk_0200AF00.rButtonY = 0x24; } static void ShowButtonR(void) { gUnk_0200AF00.rButtonX = 0xD0; gUnk_0200AF00.rButtonY = 0x24; } static void HandleFileSelect(void) { sFileSelectDefaultHandlers[gChooseFileState.state](); sub_08050A64(gUnk_02019EE0.unk6); } void sub_08050848(void) { sub_080503A8(0x7); sub_0805070C(); gUnk_02019EE0.unk7 = 0; sub_08050AFC(gUnk_02019EE0.unk6); sub_080A7114(1); } void sub_0805086C(void) { gUnk_080FC908[gChooseFileState.subState](); } // transitioning away from submenu void sub_08050888(void) { if (!gFadeControl.active) { switch (gUnk_02019EE0.saveStatus[gUnk_02019EE0.unk7]) { case SAVE_EMPTY: sub_0805194C(gUnk_02019EE0.unk7); gChooseFileState.subState = 2; break; case SAVE_VALID: gChooseFileState.subState = 2; break; default: sub_0805194C(gUnk_02019EE0.unk7); CreateDialogBox(0, gUnk_02019EE0.unk7 + 1); gChooseFileState.timer = 30; gChooseFileState.subState = 1; break; } } } void sub_080508E4(void) { if (gChooseFileState.timer == 0) { if (gInput.newKeys & (A_BUTTON | START_BUTTON)) { gChooseFileState.subState = 2; } } else { gChooseFileState.timer--; } } void sub_08050910(void) { sub_08050384(); if (++gUnk_02019EE0.unk7 > 2) { sub_080A7114(2); } else { gChooseFileState.subState = 0; } } void sub_08050940(void) { int row_idx; u32 keys; int num_rows; FileSelectState mode; if (gUnk_02019EE0.isTransitioning) { return; } row_idx = gUnk_02019EE0.unk6; keys = gInput.newKeys; if ((gInput.heldKeys & L_BUTTON) && gUnk_02019EE0.saveStatus[row_idx] == SAVE_VALID) { keys &= ~(DPAD_UP | DPAD_DOWN); } num_rows = gUnk_02000000->gameLanguage > GAME_LANGUAGE ? NUM_SAVE_SLOTS + 1 : NUM_SAVE_SLOTS; mode = gUnk_02032EC0.lastState; switch (keys) { case DPAD_UP: if (row_idx > 0) row_idx--; break; case DPAD_DOWN: if (num_rows - 1 > row_idx) row_idx++; break; case R_BUTTON: if (gUnk_02019EE0.saveStatus[row_idx] == SAVE_VALID) mode = STATE_OPTIONS; break; case A_BUTTON: case START_BUTTON: SetActiveSave(row_idx); if (row_idx == 3) mode = STATE_CHOOSE_LANG; else switch (gUnk_02019EE0.saveStatus[row_idx]) { case SAVE_EMPTY: mode = STATE_NEW; break; case SAVE_VALID: mode = STATE_VIEW; break; } break; } if (gUnk_02032EC0.lastState != mode) { SetFileSelectState(mode); SoundReq(0x6A); } row_idx = (row_idx + num_rows) % num_rows; if (gUnk_02019EE0.unk6 != row_idx) { gUnk_02019EE0.unk6 = row_idx; sub_08050AFC(row_idx); SoundReq(0x69); } if (gUnk_02019EE0.saveStatus[gUnk_02019EE0.unk6] == SAVE_VALID) { ShowButtonR(); } } void sub_08050A64(u32 idx) { if (gUnk_02019EE0.saveStatus[idx] != SAVE_VALID) { return; } gOamCmd._4 = 0; gOamCmd._6 = 0; gOamCmd._8 = 0x400; // Draw the save file's obtained elements. if (GetInventoryValue(0x40)) { gOamCmd.x = 0xA2; gOamCmd.y = 0x36; sub_080ADA14(0x145, 0x24); } if (GetInventoryValue(0x41)) { gOamCmd.x = 0x96; gOamCmd.y = 0x3D; sub_080ADA14(0x145, 0x22); } if (GetInventoryValue(0x42)) { gOamCmd.x = 0xAE; gOamCmd.y = 0x3D; sub_080ADA14(0x145, 0x23); } if (GetInventoryValue(0x43)) { gOamCmd.x = 0xA2; gOamCmd.y = 0x44; sub_080ADA14(0x145, 0x21); } } void sub_08050B3C(u16*); void sub_08050AFC(u32 idx) { SetActiveSave(idx); MemClear32(&gBG1Buffer, sizeof(gBG1Buffer)); if (gUnk_02019EE0.saveStatus[idx] == SAVE_VALID) { sub_08050B3C(&gBG1Buffer.unk29C); } gScreen.bg.bg1Updated = 1; } typedef struct { u16* unk0; u32 unk4; } unk_08050B3C; extern const u16 gUnk_080FC914[]; // Handles drawing of hearts NONMATCH("asm/non_matching/save/sub_08050B3C.inc", void sub_08050B3C(u16* arg0)) { unk_08050B3C sp; int var0; int var1; int var2; int var3; int var4; int var5; int var6; int var7; u16* var8; sp.unk0 = arg0; var0 = gSave.stats.health / 2; if (var0 == 0) { var0 = 1; } var1 = gSave.stats.maxHealth / 2; if (var1 == 0) { return; } if (var0 > var1) { var0 = var1; } sp.unk4 = var0 & 0x3; var2 = var0 * 2; var5 = var2; if (var2 > 10) { var5 = 10; } var6 = var2; var6 -= 10; var7 = var6; if (var6 < 0) { var7 = 0; } var1 = var1 >> 2; var4 = var1; if (var1 > 10) { var1 = 10; } var4 -= 10; sp.unk0[0] = 0xF24C; DmaCopy16(3, &gUnk_080FC914[10 - var5], &sp.unk0[1], var1 * 2); if (var4 > 0) { sp.unk0[0x20] = 0xF24C; DmaCopy16(3, &gUnk_080FC914[10 - var7], &sp.unk0[1], var4 * 2); } if (!sp.unk4) { return; } var8 = sp.unk0; if (var2 >= 10) { var2 = var6; var8 += 0x20; } var8[var2 + 1] = sp.unk4 - 0xDB3; } END_NONMATCH void HandleFileView(void) { gUnk_080FC93C[gMenu.menuType](); sub_08050A64(gUnk_02019EE0.unk6); } void sub_08050C54(void) { s32 column_idx; if (gUnk_02019EE0.isTransitioning) return; column_idx = gMenu.column_idx; switch (gInput.newKeys) { case A_BUTTON: case START_BUTTON: if (column_idx == 0) { SoundReq(0x80080000); } gMenu.transitionTimer = 0xf; sub_080A7114(1); SoundReq(0x6a); break; case B_BUTTON: SoundReq(0x6c); SetFileSelectState(STATE_NONE); break; case DPAD_LEFT: column_idx--; break; case DPAD_RIGHT: column_idx++; break; } if (column_idx < 0) { column_idx = 0; } if (column_idx >= NUM_FILE_OPERATIONS) { column_idx = NUM_FILE_OPERATIONS - 1; } if (gMenu.column_idx != column_idx) { gMenu.column_idx = column_idx; SoundReq(0x69); } } void sub_08050D68(void) { u32 state; if (gMenu.transitionTimer == 0) { switch (gMenu.column_idx) { default: case 0: state = STATE_START; break; case 1: state = STATE_COPY; break; case 2: state = STATE_ERASE; break; } SetFileSelectState(state); } else { gMenu.transitionTimer--; } } void HandleFileLanguageSelect(void) { gUnk_080FC944[gMenu.menuType](); } void sub_08050DB8(void) { MemClear32(&gBG2Buffer, sizeof(gBG2Buffer)); sub_080503A8(0xc); gMenu.field_0x4 = gUnk_02000000->gameLanguage; sub_080A7114(1); } void sub_08050DE4(void) { s32 row_idx; if (gUnk_02019EE0.isTransitioning) return; row_idx = gUnk_02000000->gameLanguage; switch (gInput.newKeys) { case DPAD_UP: row_idx--; break; case DPAD_DOWN: row_idx++; break; case A_BUTTON: case START_BUTTON: SoundReq(0x6a); if (gMenu.field_0x4 != row_idx) { sub_080A7114(2); CreateDialogBox(8, 0); } else { SetFileSelectState(STATE_NONE); } break; case B_BUTTON: row_idx = gMenu.field_0x4; gUnk_02000000->gameLanguage = gMenu.field_0x4; SoundReq(0x6c); SetFileSelectState(STATE_NONE); break; } // Lazy solution for positioning the rows lower on the screen if (row_idx < 2) { row_idx = 2; } if (row_idx > 6) { row_idx = 6; } if (gUnk_02000000->gameLanguage != row_idx) { gUnk_02000000->gameLanguage = row_idx; SoundReq(0x69); } } void sub_08050E88(void) { if (HandleSave(2)) SetFileSelectState(0); } void HandleFileOptions(void) { gUnk_080FC950[gMenu.menuType](); } void sub_08050EB8(void) { SaveFile* save; sub_080503A8(0xe); save = &gUnk_02019EE0.saves[gUnk_02019EE0.unk6]; gUnk_02019EE0.unk4 = save->messageSpeed; gUnk_02019EE0.unk5 = save->brightnessPref; gMenu.column_idx = 0; gMenu.transitionTimer = 0xff; sub_080A7114(1); } NONMATCH("asm/non_matching/fileScreen/sub_08050EF4.inc", void sub_08050EF4(void)) { u8* p_option; u32 option; char column_idx; int mode; if (gUnk_02019EE0.isTransitioning) return; p_option = &gUnk_02019EE0.saves[gUnk_02019EE0.unk6].brightnessPref; if (gMenu.column_idx == 0) { p_option = &gUnk_02019EE0.saves[gUnk_02019EE0.unk6].messageSpeed; } mode = 0; option = *p_option; column_idx = gMenu.column_idx; switch (gInput.newKeys) { case DPAD_RIGHT: if (*p_option < 2) { option = *p_option + 1; } break; case DPAD_LEFT: if (*p_option != 0) { option = *p_option - 1; } break; case DPAD_UP: column_idx = 0; break; case DPAD_DOWN: column_idx = 1; break; case A_BUTTON: case START_BUTTON: mode = 2; if (*(u16*)&gUnk_02019EE0.unk4 != *(u16*)&gUnk_02019EE0.saves[gUnk_02019EE0.unk6].messageSpeed) mode = 3; break; case B_BUTTON: mode = 2; break; } switch (mode) { case 3: gUnk_02019EE0.saves[gUnk_02019EE0.unk6].messageSpeed = gUnk_02019EE0.unk4; gUnk_02019EE0.saves[gUnk_02019EE0.unk6].brightnessPref = gUnk_02019EE0.unk5; SoundReq(0x6c); sub_080A7114(mode); SetActiveSave(gUnk_02019EE0.unk6); break; case 2: CreateDialogBox(8, 0); SoundReq(0x6a); default: case 1: sub_080A7114(mode); SetActiveSave(gUnk_02019EE0.unk6); break; case 0: if (gMenu.column_idx != column_idx) { gMenu.column_idx = column_idx; SoundReq(0x69); } else if (option != *p_option) { *p_option = option; LoadOptionsFromSave(gUnk_02019EE0.unk6); SoundReq(0x69); } break; } } END_NONMATCH void sub_08050FFC(void) { switch (HandleSave(0)) { case SAVE_ERROR: gMenu.transitionTimer = 0x1e; sub_0805194C(gUnk_02019EE0.unk6); CreateDialogBox(9, 0); case SAVE_OK: sub_080A7114(3); break; } } void sub_0805103C(void) { // this gets optimized as a ldrb switch (gMenu.transitionTimer % 256) { case 0: if (!(gInput.newKeys & (A_BUTTON | START_BUTTON))) return; default: gMenu.transitionTimer--; break; case 255: SetFileSelectState(STATE_NONE); break; } } void HandleFileNew(void) { gUnk_080FC960[gMenu.menuType](); } void sub_08051090(void) { sub_080503A8(8); sub_08050790(); sub_0805070C(); sub_08051458(); gScreen.bg.bg1yOffset = 0xff; gScreen.affine.bg2yOffset = 0xff; sub_080A7114(1); } NONMATCH("asm/non_matching/fileScreen/sub_080610B8.inc", void sub_080610B8(void)) { } END_NONMATCH void sub_08051358(void) { gMenu.field_0x12 = gUnk_02000000->gameLanguage == 0 ? 4 : 3; if (gMenu.focusCoords[0] != 0x0b || gMenu.focusCoords[1] != 0x5) { gMenu.focusCoords[1] = 0x5; gMenu.focusCoords[0] = 0xb; SoundReq(0x67); } } void sub_0805138C(void) { gUnk_080FC9B0[gMenu.overlayType](); } void sub_080513A8(void) { CreateDialogBox(5, 0); gMenu.overlayType = 1; } void sub_080513C0(void) { switch (HandleSave(0)) { case 1: gUnk_02019EE0.saveStatus[gUnk_02019EE0.unk6] = 1; sub_080A7114(3); break; case 0: break; case -1: sub_0805194C(gUnk_02019EE0.unk6); CreateDialogBox(6, 0); gMenu.transitionTimer = 0x1e; gMenu.overlayType = 2; break; } } void sub_0805141C(void) { switch (gMenu.transitionTimer) { case 0: if (gInput.newKeys & (A_BUTTON | START_BUTTON)) { sub_080A7114(3); } break; default: gMenu.transitionTimer--; break; } } void sub_0805144C(void) { SetFileSelectState(STATE_NONE); } void sub_08051458(void) { sub_080503A8(gMenu.column_idx + 9); MemCopy(&gUnk_02001B40, &gUnk_02022030, 0x400); } u32 sub_080514BC(u32); void sub_08051574(u32); void sub_08051480(u32 c) { CharResult result; u32 idx; result = sub_080514BC(c); idx = gMenu.unk13; if (result == RESULT_INVALID) { return; } if (result != RESULT_ASCII) { c = result; idx--; } if (idx > FILENAME_LENGTH - 1) { idx = FILENAME_LENGTH - 1; } gMenu.unk13 = idx + 1; gSave.playerName[idx] = c; sub_08051574(0x6b); } u32 sub_080514BC(u32 a1) { u32 c; u32 idx; if (gUnk_02000000->gameLanguage != 0) return 1; switch (a1) { case 0x0: case 0xe: case 0xf: break; default: return 1; } idx = gMenu.unk13; if (idx == 0) { return 0; } c = gSave.playerName[idx - 1]; if (c - 0xa4 < 0x29) { switch (a1) { case 0x0: if (c < 0xc3) { return c + 0x33; } else { return c + 10; } case 0xE: return c; case 0xF: if (c < 0xc3) { return 0; } else { return c + 10; } default: return c; } } if (c - 0xcd < 10) { switch (a1) { case 0xf: return c; case 0x0: return c + 0x29; case 0xe: return c - 10; } } if (c - 0xd7 < 0x29) { switch (a1) { default: case 0x0: return c - 0x33; case 0xe: return c - 0x33; case 0xf: if (c > 0xf5) { return c - 0x29; } } } return 0; } void sub_08051574(u32 sfx) { SoundReq(sfx); MemCopy(&gSave, &gUnk_02019EE0.saves[gUnk_02019EE0.unk6], sizeof(gUnk_02019EE0.saves[gUnk_02019EE0.unk6])); sub_0805070C(); } void HandleFileDelete(void) { gUnk_080FC9BC[gMenu.menuType](); sub_08050A64(gUnk_02019EE0.unk6); } void FUN_080515c8(void) { sub_080A7114(1); } void sub_080515D4(void) { u32 column_idx; if (gUnk_02019EE0.isTransitioning) return; gMenu.transitionTimer = 4; column_idx = gMenu.column_idx; switch (gInput.newKeys) { case B_BUTTON: gMenu.column_idx = 0; // ?? column_idx = 0; case A_BUTTON: case START_BUTTON: if (column_idx == 1) { CreateDialogBox(4, 0); sub_080A7114(2); SoundReq(0x6a); } else { SetFileSelectState(0); SoundReq(0x6c); } break; case DPAD_LEFT: column_idx = 0; break; case DPAD_RIGHT: column_idx = 1; break; } if (gMenu.column_idx != column_idx) { gMenu.column_idx = column_idx; SoundReq(0x69); } } void sub_080516E0(void) { if (HandleSave(1)) { sub_0805194C(gUnk_02019EE0.unk6); sub_08050AFC(gUnk_02019EE0.unk6); gMenu.transitionTimer = 2; SetFileSelectState(0); } } void HandleFileCopy(void) { gUnk_080FC9C8[gMenu.menuType](); sub_08050A64(gUnk_02019EE0.unk6); } // regalloc NONMATCH("asm/non_matching/fileScreen/sub_08051738.inc", void sub_08051738(void)) { s32 temp; u32 i; s32 uVar3; gUnk_02019EE0.unk7 = 4; uVar3 = 0; for (i = 0; i < 3; i++) { if (gUnk_02019EE0.saveStatus[i] == 1) { temp = gUnk_02019EE0.unk6 ^ i; uVar3 = BOOLCAST(temp) & 4; } else { uVar3++; } (&gMenu.selectMtx)[i] = uVar3; } if (uVar3 == 0) { gMenu.transitionTimer = 0x3c; CreateDialogBox(1, 0); sub_080A7114(3); } else { sub_080A7114(1); } uVar3++; gMenu.unk16 = uVar3; gMenu.unk13 = 4; gMenu.unk14 = uVar3; } END_NONMATCH NONMATCH("asm/non_matching/fileScreen/sub_080517B4.inc", s32 sub_080517B4(s32 a1)) { u32 i = gUnk_02019EE0.unk7; if (a1 != 0) { for (; i < 5; i += a1) { if ((&gMenu.selectMtx)[i] != 0 && (&gMenu.selectMtx)[i] != 4) return i; } } return i; } END_NONMATCH void sub_080517EC(void) { u32 temp; s32 delta; if (gUnk_02019EE0.isTransitioning) return; delta = 0; switch (gInput.newKeys) { case DPAD_UP: delta = -1; break; case DPAD_DOWN: delta = 1; break; case A_BUTTON: case START_BUTTON: if (gUnk_02019EE0.unk7 < 3) { CreateDialogBox(2, 0); sub_080A7114(2); SoundReq(0x6a); break; } // fallthrough case B_BUTTON: gUnk_02019EE0.unk7 = 4; SoundReq(0x6c); SetFileSelectState(0); break; } temp = sub_080517B4(delta); if (temp != gUnk_02019EE0.unk7) { gUnk_02019EE0.unk7 = temp; SoundReq(0x69); } } void sub_08051874(void) { s32 temp; gUnk_02000000->saveFileId = gUnk_02019EE0.unk7; temp = HandleSave(0); gUnk_02019EE0.saveStatus[gUnk_02019EE0.unk7] = temp; switch (temp) { case 1: MemCopy(&gSave, &gUnk_02019EE0.saves[gUnk_02019EE0.unk7], sizeof(gUnk_02019EE0.saves[gUnk_02019EE0.unk7])); SetFileSelectState(0); break; case -1: sub_0805194C(gUnk_02019EE0.unk7); CreateDialogBox(3, 0); gMenu.transitionTimer = 0x1e; sub_080A7114(3); break; } } void sub_080518E4(void) { switch (gMenu.transitionTimer) { case 0: if (gInput.newKeys & (A_BUTTON | START_BUTTON)) { SetFileSelectState(0); } break; default: gMenu.transitionTimer--; break; } } void HandleFileStart(void) { if (gMenu.menuType == 0) { gMenu.menuType = 1; gUnk_02000000->messageSpeed = gSave.messageSpeed; gUnk_02000000->brightnessPref = gSave.brightnessPref; gMain.funcIndex = 2; DoFade(5, 8); } } void sub_0805194C(u32 save_idx) { SaveFile* save; gUnk_02019EE0.saveStatus[save_idx] = 0; save = &gUnk_02019EE0.saves[save_idx]; MemClear32(save, sizeof(*save)); save->messageSpeed = 1; save->brightnessPref = 1; save->stats.health = 24; save->stats.maxHealth = 24; }