document filescreen

This commit is contained in:
theo3
2021-02-02 13:58:05 -08:00
parent f26c22b0bf
commit 32fc754306
39 changed files with 3159 additions and 3183 deletions
-557
View File
@@ -1,557 +0,0 @@
#include "global.h"
#include "functions.h"
#include "main.h"
#include "player.h"
#include "readKeyInput.h"
#include "screen.h"
typedef struct {
u8 filler0[0x5];
u8 state;
u8 subState;
u16 timer;
u8 fillerA[0x26];
} ChooseFileState;
// TODO: This occupies the same memory region as gMenu
extern ChooseFileState gChooseFileState;
typedef struct {
u8 filler0[0x1];
u8 unk1;
u8 unk2;
u8 unk3;
u16 unk4;
u16 unk6;
u8* unk8;
} struct_02036540;
typedef struct {
u8 filler0[0x10];
u16 unk10;
u8 filler12[0x6];
} struct_080FC844;
typedef struct {
u8 filler0[0x4];
} struct_020227E8;
extern struct_020227E8 gUnk_020227E8;
extern SaveFile gSaveFiles[];
extern u32 gUsedPalettes;
extern u8 gUnk_02000D00[];
extern u16 gUnk_03001010[5];
static void sub_08050624(u32);
static void sub_0805066C(void);
static void sub_080507FC(void);
extern void sub_08056FEC(u32, struct_020227E8*);
extern void sub_0805F46C(u32, struct_080FC844*);
extern void sub_0801C4A0(u32, u32);
extern void sub_08080668(void);
extern void sub_0805194C(u32);
extern void LoadPalettes(const u8*, int, int);
extern struct_02036540* sub_0805F2C8(void);
extern void sub_0805F7DC(u32, struct_02036540*);
extern void sub_0805F300(struct_02036540*);
extern void sub_08050A64(u32);
extern void sub_08050AFC(u32);
extern const struct_080FC844 gUnk_080FC844;
extern const u16 gUnk_080FC85C[][3];
extern void (*const gUnk_080FC8A4[])(void);
extern void (*const gUnk_080FC8B0[])(void);
extern void (*const gUnk_080FC8FC[])(void);
extern void (*const gUnk_080FC908[])(void);
extern const u8 gUnk_080FC8D0[];
extern const u16 gUnk_080FC8DE[];
extern const u8 gGlobalGfxAndPalettes[];
void sub_08050318(u32 arg0, u32 arg1) {
u32 sfx;
struct_080FC844 var0;
sub_08050384();
_DmaCopy(&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) {
PlaySFX(sfx);
}
gScreen.bg.bg3Control = 1;
}
void sub_08050384(void) {
sub_0801C4A0(0, 0);
_DmaZero(&gBG0Buffer, sizeof(gBG0Buffer));
gScreen.bg.bg3Control = 1;
}
void sub_080503A8(u32 gfxGroup) {
LoadGfxGroup(gfxGroup);
gScreen.bg.bg2yOffset = 1;
gScreen.affine.unk = 1;
}
void sub_080503BC(u8 state) {
gUnk_02032EC0.state = state;
_DmaZero(&gBG0Buffer, sizeof(gBG0Buffer));
_DmaZero(&gBG1Buffer, sizeof(gBG1Buffer));
}
void sub_080503E4(u32 saveFileId) {
u8 messageSpeed;
u8 brightnessPref;
if (saveFileId > 2) {
messageSpeed = 1;
brightnessPref = 1;
} else {
SaveFile* saveFile = &gSaveFiles[saveFileId];
messageSpeed = saveFile->messageSpeed;
brightnessPref = saveFile->brightnessPref;
}
((struct_02000000*)0x2000000)->messageSpeed = messageSpeed;
((struct_02000000*)0x2000000)->brightnessPref = brightnessPref;
gUsedPalettes = 0xFFFFFFFF;
}
void sub_0805041C(u32 saveFileId) {
SaveFile* saveFile;
if (saveFileId < 3) {
((struct_02000000*)0x2000000)->saveFileId = saveFileId;
saveFile = &gSaveFiles[saveFileId];
_DmaCopy(saveFile, &gUnk_02002A40, sizeof(*saveFile));
}
sub_080503E4(saveFileId);
}
void HandleChooseFileScreen(void) {
sub_080AD90C();
gUnk_080FC8A4[gUnk_03001000.funcIndex]();
if (gUnk_02032EC0.transitionType != gUnk_02032EC0.state) {
gUnk_02032EC0.transitionType = gUnk_02032EC0.state;
gScreen.bg.bg1Control = 0;
gScreen.bg.bg2Control = 0;
gScreen.bg.bg1yOffset = 0;
gScreen.bg.bg2xOffset = 0;
gScreen.affine.bg2xOffset = 0;
gScreen.affine.bg2yOffset = 0;
_DmaZero(&gChooseFileState, sizeof(gChooseFileState));
}
sub_080507FC();
gUnk_080FC8B0[gUnk_02032EC0.transitionType]();
gUnk_02019EE0.unk0 = 0;
sub_0805E5C0();
sub_0805066C();
sub_0801C1D4();
sub_0801C208();
sub_080AD9B0();
sub_080AD918();
if (gUnk_02019EE0.unk3 != ((struct_02000000*)0x2000000)->gameLanguage) {
gUnk_02019EE0.unk3 = ((struct_02000000*)0x2000000)->gameLanguage;
sub_080503A8(0x6);
sub_080503A8(0xF);
}
}
void sub_080504F4(void) {
u32 i;
sub_0801DA90(1);
sub_080A3210();
_DmaZero((void*)VRAM, 0x80);
sub_08056418();
EraseAllEntities();
sub_08080668();
sub_080ADD30();
sub_0801CFA8(0);
_DmaZero(&gUnk_0200AF00, sizeof(gUnk_0200AF00));
_DmaZero(&gUnk_02019EE0, sizeof(gUnk_02019EE0));
gUnk_02019EE0.unk3 = 7;
gUnk_02019EE0.unk6 = ((struct_02000000*)0x2000000)->gameLanguage > 1 ? 3 : 0;
_DmaZero(&gUnk_02032EC0, sizeof(gUnk_02032EC0));
gUnk_02032EC0.transitionType = 8;
sub_080503BC(0);
sub_0805616C();
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);
sub_080507FC();
gScreen.lcd.displayControl |= 0x1F00;
gScreen.affine.bg3Control = 0x1E0B;
gScreen.controls.layerFXControl = 0x844;
gScreen.controls.alphaBlend = BLDALPHA_BLEND(15, 10);
gUnk_02024490.unk0 = 1;
gUnk_03001000.funcIndex = 1;
PlaySFX(0x7);
DoFade(4, 8);
}
void nullsub_479(void) {
}
void sub_0805060C(void) {
if (!gFadeControl.active) {
InitScreen(SCREEN_GAMEPLAY);
}
}
static void sub_08050624(u32 saveFileId) {
SaveFile* saveFile = &gSaveFiles[saveFileId];
int var0 = sub_0807CF28(saveFileId, saveFile);
switch (var0) {
case -1:
sub_0807CF48(saveFileId);
// fallthrough
case 0:
sub_0805194C(saveFileId);
break;
}
gUnk_02019EE0.unk8[saveFileId] = var0;
}
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;
u8* playerName;
var0 = sub_0805F2C8();
if (var0) {
var0->unk2 = 0;
var0->unk3 = 5;
var0->unk1 = 1;
var0->unk4 = 0x30;
var0->unk8 = gUnk_02000D00;
for (i = 0; i < 3; i++) {
var0->unk6 = 0;
_DmaZero(var0->unk8, 0x200);
playerName = gSaveFiles[i].playerName;
for (j = 0; j < 6; j++) {
sub_0805F7DC(playerName[j], var0);
}
_DmaCopy(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->unk2 = 0;
var0->unk3 = 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++;
}
_DmaCopy(gUnk_02000D00, (void*)(BG_VRAM + i * 0x400), 0x400);
}
sub_0805F300(var0);
}
}
static void sub_080507FC(void) {
gUnk_0200AF00.unk1A = 0x140;
gUnk_0200AF00.unk20 = 0x24;
}
void sub_08050810(void) {
gUnk_0200AF00.unk1A = 0xD0;
gUnk_0200AF00.unk20 = 0x24;
}
void sub_08050820(void) {
gUnk_080FC8FC[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]();
}
void sub_08050888(void) {
if (!gFadeControl.active) {
switch (gUnk_02019EE0.unk8[gUnk_02019EE0.unk7]) {
case 0:
sub_0805194C(gUnk_02019EE0.unk7);
gChooseFileState.subState = 2;
break;
case 1:
gChooseFileState.subState = 2;
break;
default:
sub_0805194C(gUnk_02019EE0.unk7);
sub_08050318(0, gUnk_02019EE0.unk7 + 1);
gChooseFileState.timer = 30;
gChooseFileState.subState = 1;
break;
}
}
}
void sub_080508E4(void) {
if (gChooseFileState.timer == 0) {
if (gUnk_03000FF0.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 saveFileId;
u32 newKeys;
int var1;
u32 var2;
if (gUnk_02019EE0.unk0) {
return;
}
saveFileId = gUnk_02019EE0.unk6;
newKeys = gUnk_03000FF0.newKeys;
if ((gUnk_03000FF0.heldKeys & L_BUTTON) && gUnk_02019EE0.unk8[saveFileId] == 1) {
newKeys &= ~(DPAD_UP | DPAD_DOWN);
}
var1 = ((struct_02000000*)0x2000000)->gameLanguage > 1 ? 4 : 3;
var2 = gUnk_02032EC0.transitionType;
switch (newKeys) {
case DPAD_UP:
if (saveFileId > 0) {
saveFileId--;
}
break;
case DPAD_DOWN:
if (var1 - 1 > saveFileId) {
saveFileId++;
}
break;
case R_BUTTON:
if (gUnk_02019EE0.unk8[saveFileId] == 1) {
var2 = 3;
}
break;
case A_BUTTON:
case START_BUTTON:
sub_0805041C(saveFileId);
if (saveFileId == 3) {
var2 = 2;
} else {
switch (gUnk_02019EE0.unk8[saveFileId]) {
case 0:
var2 = 1;
break;
case 1:
var2 = 4;
break;
}
}
break;
}
if (gUnk_02032EC0.transitionType != var2) {
sub_080503BC(var2);
PlaySFX(0x6A);
}
saveFileId = (saveFileId + var1) % var1;
if (gUnk_02019EE0.unk6 != saveFileId) {
gUnk_02019EE0.unk6 = saveFileId;
sub_08050AFC(saveFileId);
PlaySFX(0x69);
}
if (gUnk_02019EE0.unk8[gUnk_02019EE0.unk6] == 1) {
sub_08050810();
}
}
void sub_08050A64(u32 saveFileId) {
if (gUnk_02019EE0.unk8[saveFileId] != 1) {
return;
}
gUnk_03001010[2] = 0;
gUnk_03001010[3] = 0;
gUnk_03001010[4] = 0x400;
// Draw the save file's obtained elements.
if (GetInventoryValue(0x40)) {
gUnk_03001010[0] = 0xA2;
gUnk_03001010[1] = 0x36;
sub_080ADA14(0x145, 0x24);
}
if (GetInventoryValue(0x41)) {
gUnk_03001010[0] = 0x96;
gUnk_03001010[1] = 0x3D;
sub_080ADA14(0x145, 0x22);
}
if (GetInventoryValue(0x42)) {
gUnk_03001010[0] = 0xAE;
gUnk_03001010[1] = 0x3D;
sub_080ADA14(0x145, 0x23);
}
if (GetInventoryValue(0x43)) {
gUnk_03001010[0] = 0xA2;
gUnk_03001010[1] = 0x44;
sub_080ADA14(0x145, 0x21);
}
}
void sub_08050B3C(u16*);
void sub_08050AFC(u32 saveFileId) {
sub_0805041C(saveFileId);
_DmaZero(&gBG1Buffer, sizeof(gBG1Buffer));
if (gUnk_02019EE0.unk8[saveFileId] == 1) {
sub_08050B3C(&gBG1Buffer.unk29C);
}
gScreen.bg.bg2yOffset = 1;
}
// typedef struct {
// u16* unk0;
// u32 unk4;
// } unk_08050B3C;
// extern const u16 gUnk_080FC914[];
// 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 = gUnk_02002A40.stats.health * 2;
// if (var0 == 0) {
// var0 = 1;
// }
// var1 = gUnk_02002A40.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;
// }
+1 -1
View File
@@ -47,7 +47,7 @@ void sub_0804AAD4(void) {
void sub_0804AB04(void) {
sub_0805E5C0();
if (gArea.field_0x10 != 0) {
sub_080AD90C();
FlushSprites();
sub_080AD9B0();
sub_080AD918();
}
-3
View File
@@ -39,7 +39,6 @@ void sub_08080910(void) {
void sub_0808091C(ScreenTransitionData* param_1, u32 param_2) {
DoExitTransition(param_1);
gScreenTransition.transitionType = param_2;
return;
}
void sub_08080930(void)
@@ -50,7 +49,6 @@ void sub_08080930(void)
gRoomControls.unk2 = 2;
gRoomControls.filler[0] = 0;
sub_0805E5A8();
return;
}
u32* GetLayerByIndex(u32 param_1) {
@@ -65,7 +63,6 @@ u32* GetLayerByIndex(u32 param_1) {
void sub_08080964(u32 time, u32 magnitude) {
gRoomControls.screenShakeTime = time;
gRoomControls.screenShakeMagnitude = magnitude & 7;
return;
}
void sub_08080974(u32 arg0, u32 arg1) {
+680
View File
@@ -0,0 +1,680 @@
#include "fileScreen.h"
// copy, erase, start
#define NUM_FILE_OPERATIONS 3
// todo: does this belong with gUnk_02019EE0?
typedef enum {
SAVE_EMPTY = 0,
SAVE_VALID = 1,
SAVE_DELETED = 0xFFFFFFFF,
} SaveStatus;
typedef enum {
STATE_NONE,
STATE_NEW,
STATE_CHOOSE_LANG,
STATE_OPTIONS,
STATE_VIEW,
STATE_COPY,
STATE_ERASE,
STATE_START,
} FileSelectState;
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,
};
extern KeyButtonLayout gUnk_080FC8D0;
// static const KeyButtonLayout gUnk_080FC8D0 = {
// 0xFF, 0xD8, 0x0, 0xFF, 0xD8, 0x0, 0xE0, 0x10, 0xF, {{0x5, 0x0}, { 0x2, 0x0 }}, 0xFF
// };
// main "file selection" screen
extern void (*const sFileSelectDefaultHandlers[])(void);
// handles submenus
extern void (*const sFileScreenSubHandlers[])(void);
extern void (*const gUnk_080FC944[])(void);
static void sub_08050624(u32);
static void sub_0805066C(void);
static void HideButtonR(void);
static void ShowButtonR(void);
void sub_08050318(u32 arg0, u32 arg1) {
u32 sfx;
struct_080FC844 var0;
sub_08050384();
_DmaCopy(&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) {
PlaySFX(sfx);
}
gScreen.bg.bg3Control = BGCNT_PRIORITY(1);
}
void sub_08050384(void) {
sub_0801C4A0(0, 0);
_DmaZero(&gBG0Buffer, sizeof(gBG0Buffer));
gScreen.bg.bg3Control = BGCNT_PRIORITY(1);
}
void sub_080503A8(u32 gfxGroup) {
LoadGfxGroup(gfxGroup);
gScreen.bg.bg2yOffset = 1;
gScreen.affine.unk = 1;
}
void SetFileSelectState(FileSelectState mode) {
gUnk_02032EC0.state = mode;
_DmaZero(&gBG0Buffer, sizeof(gBG0Buffer));
_DmaZero(&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 = &gSaveFiles[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;
_DmaCopy(&gSaveFiles[idx], &gUnk_02002A40, sizeof(gSaveFiles[idx]));
}
LoadOptionsFromSave(idx);
}
void HandleChooseFileScreen(void) {
FlushSprites();
sScreenHandlers[gUnk_03001000.funcIndex]();
if (gUnk_02032EC0.lastState != gUnk_02032EC0.state) {
gUnk_02032EC0.lastState = gUnk_02032EC0.state;
gScreen.bg.bg1Control = 0;
gScreen.bg.bg2Control = 0;
gScreen.bg.bg1yOffset = 0;
gScreen.bg.bg2xOffset = 0;
gScreen.affine.bg2xOffset = 0;
gScreen.affine.bg2yOffset = 0;
_DmaZero(&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();
_DmaZero((void*)VRAM, 0x80); // clear palettes
sub_08056418();
EraseAllEntities();
sub_08080668();
sub_080ADD30();
sub_0801CFA8(0);
_DmaZero(&gUnk_0200AF00, sizeof(gUnk_0200AF00));
_DmaZero(&gUnk_02019EE0, sizeof(gUnk_02019EE0));
gUnk_02019EE0.unk3 = 7;
gUnk_02019EE0.unk6 = gUnk_02000000->gameLanguage > LANGUAGE_EN ? 3 : 0;
_DmaZero(&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;
gUnk_03001000.funcIndex = 1;
PlaySFX(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 = &gSaveFiles[idx];
int status = sub_0807CF28(idx, saveFile);
switch (status) {
case SAVE_DELETED:
sub_0807CF48(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;
u8* 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 < 3; i++) {
var0->unk6 = 0;
_DmaZero(var0->unk8, 0x200);
playerName = gSaveFiles[i].playerName;
for (j = 0; j < 6; j++) {
sub_0805F7DC(playerName[j], var0);
}
// i is a struct of size 0x200
_DmaCopy(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++;
}
_DmaCopy(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);
sub_08050318(0, gUnk_02019EE0.unk7 + 1);
gChooseFileState.timer = 30;
gChooseFileState.subState = 1;
break;
}
}
}
void sub_080508E4(void) {
if (gChooseFileState.timer == 0) {
if (gUnk_03000FF0.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 = gUnk_03000FF0.newKeys;
if ((gUnk_03000FF0.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);
PlaySFX(0x6A);
}
row_idx = (row_idx + num_rows) % num_rows;
if (gUnk_02019EE0.unk6 != row_idx) {
gUnk_02019EE0.unk6 = row_idx;
sub_08050AFC(row_idx);
PlaySFX(0x69);
}
if (gUnk_02019EE0.saveStatus[gUnk_02019EE0.unk6] == SAVE_VALID) {
ShowButtonR();
}
}
void sub_08050A64(u32 idx) {
if (gUnk_02019EE0.saveStatus[idx] != SAVE_VALID) {
return;
}
gUnk_03001010._4 = 0;
gUnk_03001010._6 = 0;
gUnk_03001010._8 = 0x400;
// Draw the save file's obtained elements.
if (GetInventoryValue(0x40)) {
gUnk_03001010.x = 0xA2;
gUnk_03001010.y = 0x36;
sub_080ADA14(0x145, 0x24);
}
if (GetInventoryValue(0x41)) {
gUnk_03001010.x = 0x96;
gUnk_03001010.y = 0x3D;
sub_080ADA14(0x145, 0x22);
}
if (GetInventoryValue(0x42)) {
gUnk_03001010.x = 0xAE;
gUnk_03001010.y = 0x3D;
sub_080ADA14(0x145, 0x23);
}
if (GetInventoryValue(0x43)) {
gUnk_03001010.x = 0xA2;
gUnk_03001010.y = 0x44;
sub_080ADA14(0x145, 0x21);
}
}
void sub_08050B3C(u16*);
void sub_08050AFC(u32 idx) {
SetActiveSave(idx);
_DmaZero(&gBG1Buffer, sizeof(gBG1Buffer));
if (gUnk_02019EE0.saveStatus[idx] == SAVE_VALID) {
sub_08050B3C(&gBG1Buffer.unk29C);
}
gScreen.bg.bg2yOffset = 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 = gUnk_02002A40.stats.health / 2;
if (var0 == 0) {
var0 = 1;
}
var1 = gUnk_02002A40.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);
}
extern Input gUnk_03000FF0;
void sub_08050C54(void) {
s32 column_idx;
if (gUnk_02019EE0.isTransitioning)
return;
column_idx = gMenu.column_idx;
switch (gUnk_03000FF0.newKeys) {
case A_BUTTON:
case START_BUTTON:
if (column_idx == 0) {
PlaySFX(0x80080000);
}
gMenu.transitionTimer = 0xf;
sub_080A7114(1);
PlaySFX(0x6a);
break;
case B_BUTTON:
PlaySFX(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;
PlaySFX(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) {
_DmaZero(&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 (gUnk_03000FF0.newKeys) {
case DPAD_UP:
row_idx--;
break;
case DPAD_DOWN:
row_idx++;
break;
case A_BUTTON:
case START_BUTTON:
PlaySFX(0x6a);
if (gMenu.field_0x4 != row_idx) {
sub_080A7114(2);
sub_08050318(8, 0);
} else {
SetFileSelectState(STATE_NONE);
}
break;
case B_BUTTON:
row_idx = gMenu.field_0x4;
gUnk_02000000->gameLanguage = gMenu.field_0x4;
PlaySFX(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;
PlaySFX(0x69);
}
}
void sub_08050E88(void) {
if (sub_0807CDA4(SAVE_DONE))
SetFileSelectState(0);
}
+28 -26
View File
@@ -53,22 +53,22 @@ static const u16 sLightRaysAlphaBlends[] = {
};
static u32 AdvanceIntroSequence(u32 transition) {
gUnk_02032EC0.transitionType = transition;
gUnk_02032EC0.lastState = transition;
gUnk_03001000.funcIndex = 2;
_DmaZero(&gIntroState, sizeof(gIntroState));
DoFade(7, 8);
}
void HandleIntroScreen(void) {
sub_080AD90C();
FlushSprites();
switch (gUnk_03001000.funcIndex) {
case 0:
sub_08056418();
_DmaZero(&gUnk_02032EC0, 0x3b4);
_DmaZero(&gUnk_02032EC0, sizeof(gUnk_02032EC0));
AdvanceIntroSequence(0);
break;
case 1:
sIntroSequenceHandlers[gUnk_02032EC0.transitionType]();
sIntroSequenceHandlers[gUnk_02032EC0.lastState]();
break;
case 2:
if (gFadeControl.active) {
@@ -92,13 +92,13 @@ static void HandleNintendoCapcomLogos(void) {
gIntroState.timer = 120;
LoadGfxGroup(16);
LoadGfxGroup(1);
if (((struct_02000000*)0x2000000)->gameLanguage == 0) {
if (gUnk_02000000->gameLanguage == 0) {
paletteGroup = 1;
} else {
paletteGroup = 2;
}
LoadPaletteGroup(paletteGroup);
gScreen.lcd.displayControl |= 0x400;
gScreen.lcd.displayControl |= DISPCNT_BG2_ON;
gScreen.bg.bg2yOffset = 1;
DoFade(6, 8);
advance = ADVANCE_NONE;
@@ -132,28 +132,30 @@ static void HandleTitlescreen(void) {
sub_080ADD30();
gUnk_02024490.unk0 = 1;
LoadGfxGroup(2);
if (((struct_02000000*)0x2000000)->gameLanguage == 0) {
if (gUnk_02000000->gameLanguage == 0) {
paletteGroup = 3;
} else {
paletteGroup = 4;
}
LoadPaletteGroup(paletteGroup);
if (((struct_02000000*)0x2000000)->gameLanguage == 0) {
gScreen.controls.layerFXControl = 0x844;
if (gUnk_02000000->gameLanguage == 0) {
// Blend first and second layer
gScreen.controls.layerFXControl = BLDCNT_TGT1_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_EFFECT_BLEND;
gScreen.controls.alphaBlend = BLDALPHA_BLEND(9, 9);
gScreen.bg.bg1xOffset = 0x1c09;
gScreen.affine.bg2Control = 0x1d02;
gScreen.affine.bg3Control = 0x1e03;
gScreen.lcd.displayControl |= 0x1e00;
gScreen.affine.bg2Control = BGCNT_SCREENBASE(29) | BGCNT_PRIORITY(2);
gScreen.affine.bg3Control = BGCNT_SCREENBASE(30) | BGCNT_PRIORITY(3);
gScreen.lcd.displayControl |= DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON;
gScreen.bg.bg2xOffset = 0xff60;
} else {
gScreen.controls.layerFXControl = 0x241;
gScreen.controls.layerFXControl = BLDCNT_TGT1_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_EFFECT_BLEND;
gScreen.controls.alphaBlend = BLDALPHA_BLEND(9, 9);
gScreen.bg.bg0Control = 0x1d02;
gScreen.bg.bg0Control = BGCNT_SCREENBASE(29) | BGCNT_PRIORITY(2);
gScreen.bg.bg1xOffset = 0x1E03;
gScreen.affine.bg2Control = 0x7C89;
gScreen.lcd.displayControl |= 1;
gScreen.lcd.displayControl |= 0x1300;
gScreen.affine.bg2Control = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(2) | BGCNT_256COLOR |
BGCNT_SCREENBASE(28) | BGCNT_WRAP | BGCNT_TXT512x256;
gScreen.lcd.displayControl |= DISPCNT_MODE_1;
gScreen.lcd.displayControl |= DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_ON;
gIntroState.swordBgScaleRatio = 0x10;
UpdateSwordBgAffineData();
}
@@ -165,7 +167,7 @@ static void HandleTitlescreen(void) {
if (gFadeControl.active) {
return;
}
if (((struct_02000000*)0x2000000)->gameLanguage == 0) {
if (gUnk_02000000->gameLanguage == 0) {
HandleJapaneseTitlescreenAnimationIntro();
} else {
HandleTitlescreenAnimationIntro();
@@ -196,8 +198,8 @@ static void HandleTitlescreen(void) {
sub_080ADA14(0x1ff, 0);
}
}
if (gIntroState.gameLanguage != ((struct_02000000*)0x2000000)->gameLanguage) {
gIntroState.gameLanguage = ((struct_02000000*)0x2000000)->gameLanguage;
if (gIntroState.gameLanguage != gUnk_02000000->gameLanguage) {
gIntroState.gameLanguage = gUnk_02000000->gameLanguage;
LoadGfxGroup(3);
}
UpdateLightRays();
@@ -219,8 +221,8 @@ static void UpdateSwordBgAffineData(void) {
struct BgAffineSrcData aff;
aff.texY = 0x8000;
aff.texX = 0x8000;
aff.scrX = 0x78;
aff.scrY = 0x48;
aff.scrX = DISPLAY_WIDTH / 2;
aff.scrY = DISPLAY_HEIGHT / 2 - 8;
aff.alpha = 0;
aff.sy = aff.sx = gIntroState.swordBgScaleRatio;
BgAffineSet(&aff, (struct BgAffineDstData*)&gBgControls, 1);
@@ -254,7 +256,7 @@ static void HandleJapaneseTitlescreenAnimationIntro(void) {
pEVar2 = CreateObject(0xb4, 0, 0);
if (pEVar2 != NULL) {
pEVar2->x.HALF.HI = 0;
pEVar2->y.HALF.HI = 0x48;
pEVar2->y.HALF.HI = DISPLAY_HEIGHT / 2 - 8;
}
}
break;
@@ -271,7 +273,7 @@ static void HandleTitlescreenAnimationIntro(void) {
case 0:
if (!gFadeControl.active) {
gIntroState.subState = 1;
gScreen.lcd.displayControl |= 0x400;
gScreen.lcd.displayControl |= DISPCNT_BG2_ON;
PlaySFX(0xF6);
}
break;
@@ -334,14 +336,14 @@ static u32 GetAdvanceState(void) {
}
static void UpdateLightRays(void) {
// Periodically rotate the palette to give a shimmeriming effect.
// Periodically rotate the palette to give a shimmering effect.
if ((gIntroState.counter & 0x7) == 0) {
gIntroState.lightRaysPaletteGroup++;
gIntroState.lightRaysPaletteGroup &= 0x3;
LoadPaletteGroup(5 + gIntroState.lightRaysPaletteGroup);
}
// Periodiccally update the transparency of the light rays.
// Periodically update the transparency of the light rays.
if ((gIntroState.counter & 0x1F) == 0) {
gIntroState.lightRaysAlphaBlendIndex = (gIntroState.lightRaysAlphaBlendIndex + 1) & 0x7;
gScreen.controls.alphaBlend = sLightRaysAlphaBlends[gIntroState.lightRaysAlphaBlendIndex];
+10 -14
View File
@@ -6,16 +6,12 @@
#include "random.h"
#include "readKeyInput.h"
extern u8 gUnk_03003DE4;
extern void sub_0804FF84(u32);
extern u16 gPaletteBuffer[];
extern void VBlankInterruptWait(void);
extern void DisableInterruptsAndDMA(void);
extern void sub_08016B34(void);
static void sub_08055F70(void);
static bool32 SoftResetKeysPressed(void);
extern void HandleIntroScreen(void);
extern void HandleChooseFileScreen(void);
extern void HandleGameplayScreen(void);
extern void HandleGameOverScreen(void);
extern void HandleCreditsScreen(void);
extern void HandleDebugTextScreen(void);
static void (*const sScreenHandlers[])(void) = {
[SCREEN_INTRO] = HandleIntroScreen, [SCREEN_CHOOSE_FILE] = HandleChooseFileScreen,
@@ -27,8 +23,8 @@ void MainLoop(void) {
int var0;
sub_08055F70();
sub_080A3204();
sub_0805616C();
InitSound();
InitDMA();
sub_0807CE90();
sub_080560B8();
sub_08056208();
@@ -176,7 +172,7 @@ NONMATCH("asm/non_matching/sub_080560B8.inc", void sub_080560B8(void)) {
END_NONMATCH
u32 sub_08056134(void) {
if ((gUnk_02000000->signature != SIGNATURE) || (gUnk_02000000->saveFileId >= MAX_SAVE_FILES) ||
if ((gUnk_02000000->signature != SIGNATURE) || (gUnk_02000000->saveFileId >= NUM_SAVE_SLOTS) ||
(gUnk_02000000->messageSpeed >= MAX_MSG_SPEED) || (gUnk_02000000->brightnessPref >= MAX_BRIGHTNESS) ||
(gUnk_02000000->gameLanguage != GAME_LANGUAGE) || (gUnk_02000000->_e != 0))
return FALSE;
@@ -184,7 +180,7 @@ u32 sub_08056134(void) {
return TRUE;
}
void sub_0805616C() {
void InitDMA() {
PlaySFX(0x80040000);
gScreen._6d = gScreen._6c;
gScreen._6c = 0;
+2 -1
View File
@@ -2,6 +2,7 @@
#include "entity.h"
#include "object.h"
//clang-format off
void (*const gObjectFunctions[])(Entity*) = {
/*0x00*/ ItemOnGround,
/*0x01*/ DeathFx,
@@ -75,7 +76,7 @@ void (*const gObjectFunctions[])(Entity*) = {
/*0x45*/ Object45,
/*0x46*/ GiantBookLadder,
/*0x47*/ HeartContainer,
/*0x48*/ Object48,
/*0x48*/ FileScreenObjects,
/*0x49*/ Object49,
/*0x4a*/ BackgroundCloud,
/*0x4b*/ Object4B,
@@ -47,7 +47,7 @@ extern const u16 gUnk_08121D18[][8];
extern const u8 gUnk_08121D48[];
extern const struct_08121D54 gUnk_08121D54[];
void Object48(Entity* this) {
void FileScreenObjects(Entity* this) {
if (this->currentHealth == 0) {
sub_0808EFF0(this);
}
@@ -91,7 +91,7 @@ void sub_0808E818(Entity* this) {
LoadPalettes(&gGlobalGfxAndPalettes[var1], 31, 1);
}
if (gUnk_02032EC0.transitionType == 0) {
if (gUnk_02032EC0.lastState == 0) {
if (gUnk_03000FF0.heldKeys & L_BUTTON) {
switch (gUnk_03000FF0.newKeys) {
case DPAD_UP:
@@ -126,13 +126,13 @@ void sub_0808E818(Entity* this) {
static bool32 sub_0808E950(void) {
bool32 result = FALSE;
switch (gUnk_02032EC0.transitionType) {
switch (gUnk_02032EC0.lastState) {
case 0:
case 4:
case 5:
case 6:
case 7:
result = gUnk_02019EE0.unk8[gUnk_02019EE0.unk6] == 1;
result = gUnk_02019EE0.saveStatus[gUnk_02019EE0.unk6] == 1;
break;
}
return result;
@@ -179,7 +179,7 @@ void sub_0808EA28(Entity* this) {
u32 var1;
if (this->entityType.form == 3) {
if (((struct_02000000*)0x2000000)->gameLanguage > 1) {
if (gUnk_02000000->gameLanguage > LANGUAGE_EN) {
this->spriteSettings.b.draw = 2;
} else {
this->spriteSettings.b.draw = 0;
@@ -190,7 +190,7 @@ void sub_0808EA28(Entity* this) {
var0 = 12;
var1 = 1;
} else {
if (gUnk_02032EC0.transitionType == 5 && this->entityType.form == gUnk_02019EE0.unk7) {
if (gUnk_02032EC0.lastState == 5 && this->entityType.form == gUnk_02019EE0.unk7) {
var0 = 13;
var1 = 2;
} else {
@@ -202,14 +202,14 @@ void sub_0808EA28(Entity* this) {
this->palette.b.b0 = var0;
this->spriteRendering.b3 = var1;
sub_0808EABC(this);
gUnk_02019EE0.unk0 |= sub_0808EF6C(this);
gUnk_02019EE0.isTransitioning |= sub_0808EF6C(this);
}
void sub_0808EABC(Entity* this) {
int var0 = -72;
int var1 = this->entityType.form * 32 + 40;
int var2 = gUnk_02019EE0.unk6 == this->entityType.form;
switch (gUnk_02032EC0.transitionType) {
switch (gUnk_02032EC0.lastState) {
case 0:
var0 = 24;
break;
@@ -272,15 +272,15 @@ void sub_0808EBB8(Entity* this) {
u32 x, y;
Entity* entity;
switch (gUnk_02032EC0.transitionType) {
switch (gUnk_02032EC0.lastState) {
case 4:
var0 = gMenu.field_0x1 + 4;
var0 = gMenu.column_idx + 4;
break;
case 5:
var0 = 2;
break;
case 6:
var0 = gMenu.field_0x1 == 0 ? 7 : 6;
var0 = gMenu.column_idx == 0 ? 7 : 6;
break;
case 7:
var0 = 4;
@@ -341,8 +341,8 @@ void sub_0808ECBC(Entity* this) {
int var2;
const struct_08121CD4* var3;
var0 = gMenu.field_0x1;
switch (gUnk_02032EC0.transitionType) {
var0 = gMenu.column_idx;
switch (gUnk_02032EC0.lastState) {
case 4:
var1 = 1;
break;
@@ -371,12 +371,12 @@ void sub_0808ECBC(Entity* this) {
this->palette.b.b0 = 14;
}
gUnk_02019EE0.unk0 |= sub_0808EF6C(this);
gUnk_02019EE0.isTransitioning |= sub_0808EF6C(this);
}
void sub_0808ED64(Entity* this) {
int y = 255;
if (gUnk_02032EC0.transitionType == 1 && gMenu.focusCoords[1] != 5) {
if (gUnk_02032EC0.lastState == 1 && gMenu.focusCoords[1] != 5) {
this->x.HALF.HI = gMenu.focusCoords[0] * 16 + 28;
y = gMenu.focusCoords[1] * 16 + 58;
}
@@ -385,7 +385,7 @@ void sub_0808ED64(Entity* this) {
void sub_0808ED98(Entity* this) {
int y;
if (gUnk_02032EC0.transitionType != 1) {
if (gUnk_02032EC0.lastState != 1) {
this->field_0x68.HWORD = 27;
y = -10;
} else {
@@ -413,7 +413,7 @@ void sub_0808EE00(Entity* this) {
this->x.HALF.HI = gUnk_08121D18[var0][var1];
this->field_0x68.HWORD = gUnk_08121D18[var0][var1];
var1 -= var0;
if (gUnk_02032EC0.transitionType != 1) {
if (gUnk_02032EC0.lastState != 1) {
var1 = 128;
var2 = 176;
} else {
@@ -422,14 +422,14 @@ void sub_0808EE00(Entity* this) {
this->field_0x6a.HWORD = var2;
this->palette.b.b0 = gMenu.focusCoords[1] == 5 && var1 == gMenu.field_0x12 ? 11 : 9;
gUnk_02019EE0.unk0 |= sub_0808EF6C(this);
gUnk_02019EE0.isTransitioning |= sub_0808EF6C(this);
}
void nullsub_522(Entity* this) {
}
void sub_0808EE98(Entity* this) {
this->actionDelay = gUnk_02032EC0.transitionType;
this->actionDelay = gUnk_02032EC0.lastState;
this->frameIndex = gUnk_08121D48[this->actionDelay];
if (this->actionDelay != 2) {
this->field_0x68.HWORD = 96;
@@ -441,18 +441,18 @@ void sub_0808EE98(Entity* this) {
void sub_0808EED8(Entity* this) {
int var0;
if (gUnk_02032EC0.transitionType != 3) {
if (gUnk_02032EC0.lastState != 3) {
this->spriteSettings.b.draw = 0;
} else {
this->spriteSettings.b.draw = 2;
var0 = this->entityType.form - 19;
this->palette.b.b0 = gMenu.field_0x1 == var0 ? 4 : 3;
this->palette.b.b0 = gMenu.column_idx == var0 ? 4 : 3;
}
}
void sub_0808EF24(Entity* this) {
int var0;
if (gUnk_02032EC0.transitionType != 3) {
if (gUnk_02032EC0.lastState != 3) {
this->spriteSettings.b.draw = 0;
} else {
this->spriteSettings.b.draw = 2;
@@ -515,7 +515,7 @@ static u32 sub_0808EF6C(Entity* this) {
static void sub_0808EFF0(Entity* this) {
const struct_08121D54* var0;
int var1;
u8 var1;
this->spriteSettings.b.draw = 2;
this->nonPlanarMovement = 0x400;
@@ -533,7 +533,7 @@ static void sub_0808EFF0(Entity* this) {
this->field_0x6c.HWORD = var0->unk0;
var1 = var0->unk7;
if (var1 & 0x80) {
var1 &= 0x7F;
var1 &= ~(0x80);
this->frameIndex = var1;
this->lastFrameIndex = var1;
} else {
+46 -32
View File
@@ -1,38 +1,52 @@
#include "global.h"
#include "entity.h"
#include "functions.h"
#include "menu.h"
#include "structures.h"
#include "save.h"
extern void (*const gUnk_0811E478[])(u32);
extern u32 sub_0807D008(u32, SaveFile*);
const u16 gUnk_0811E454[] = { 0x0, 0x0, 0x100, 0x200, 0x300, 0x400, 0x500,
0x5C0, 0x680, 0x740, 0x800, 0x8C0, 0x9C0, 0xA80 };
const char gUnk_0811E470[6] = "LINK";
static SaveResult HandleSaveInit(u32);
static SaveResult HandleSaveInProgress(u32);
static SaveResult HandleSaveDone(u32);
static SaveResult (*const sSaveHandlers[])(u32) = { HandleSaveInit, HandleSaveInProgress, HandleSaveDone };
static const char sSignatureLong[32] = "AGBZELDA:THE MINISH CAP:ZELDA 5";
// Save file is untouched
static const char sSaveDescInit[8] = "\xFF\xFF\xFF\xFF"
"INIT";
// Save file is deleted
static const char sSaveDescDeleted[8] = "\xFF\xFF\xFF\xFF"
"DelF";
const char gUnk_0811E4B4[8] = "DAMEDAME";
extern s16 gUnk_02021EE0[6];
extern char gUnk_0811E484[];
extern char gUnk_0811E4AC[];
extern char gUnk_0811E4A4[];
void sub_0807CD9C() {
sub_080530C8();
}
void sub_0807CDA4(u32 arg0) {
gUnk_0811E478[gMenu.storyPanelIndex](arg0);
SaveResult sub_0807CDA4(SaveState state) {
return sSaveHandlers[gMenu.storyPanelIndex](state);
}
u32 sub_0807CDC0(void) {
SaveResult HandleSaveInit(u32 arg0) {
gUnk_02021EE0[5] -= 8;
if (gUnk_02021EE0[4] <= 0) {
gMenu.field_0xa = 8;
gMenu.storyPanelIndex = 1;
}
return 0;
return SAVE_BUSY;
}
u32 sub_0807CDE8(u32 arg0) {
SaveResult HandleSaveInProgress(u32 arg0) {
u32 temp;
if (gMenu.field_0xa == 0) {
sub_0805616C();
InitDMA();
switch (arg0) {
case 0:
temp = sub_0807CF08(gUnk_02000000->saveFileId, gUnk_02002A40.filler0);
@@ -51,25 +65,25 @@ u32 sub_0807CDE8(u32 arg0) {
} else {
gMenu.field_0xa--;
}
return 0;
return SAVE_BUSY;
}
s32 sub_0807CE54(void) {
u32 uVar1;
SaveResult HandleSaveDone(u32 arg0) {
SaveResult result;
uVar1 = 0;
result = SAVE_BUSY;
gUnk_02021EE0[5] += 8;
if (gUnk_02021EE0[3] <= gUnk_02021EE0[5]) {
gUnk_02021EE0[5] = gUnk_02021EE0[3];
sub_08050384();
gMenu.storyPanelIndex = 0;
if (gMenu.field_0xa == 1) {
uVar1 = 1;
result = SAVE_OK;
} else {
uVar1 = -1;
result = SAVE_ERROR;
}
}
return uVar1;
return result;
}
u32 sub_0807CE90(void) {
@@ -80,10 +94,10 @@ u32 sub_0807CE90(void) {
sub_080B1520(0x40);
puVar1 = sub_0807D1C4(4);
iVar3 = 0;
if (sub_0807D24C(puVar1->field_0x6, gUnk_0811E484, puVar1->field_0x0) == 0) {
if (sub_0807D24C(puVar1->field_0x6, sSignatureLong, puVar1->field_0x0) == 0) {
iVar3 += 1;
}
if (sub_0807D24C(puVar1->field_0x8, gUnk_0811E484, puVar1->field_0x0) == 0) {
if (sub_0807D24C(puVar1->field_0x8, sSignatureLong, puVar1->field_0x0) == 0) {
iVar3 += 2;
}
if (iVar3 != 0) {
@@ -94,8 +108,8 @@ u32 sub_0807CE90(void) {
sub_0807CF68(1);
sub_0807CF68(0);
}
sub_0807D20C(puVar1->field_0x8, gUnk_0811E484, puVar1->field_0x0);
sub_0807D20C(puVar1->field_0x6, gUnk_0811E484, puVar1->field_0x0);
sub_0807D20C(puVar1->field_0x8, sSignatureLong, puVar1->field_0x0);
sub_0807D20C(puVar1->field_0x6, sSignatureLong, puVar1->field_0x0);
}
return 1;
}
@@ -116,11 +130,11 @@ int sub_0807CF28(u32 arg0, SaveFile* arg1) {
return sub_0807D008(arg0, arg1);
}
u32 sub_0807CF30(void* arg0) {
u32 sub_0807CF30(SaveFile* arg0) {
return sub_0807D008(3, arg0);
}
u32 sub_0807CF3C(void* arg0) {
u32 sub_0807CF3C(SaveFile* arg0) {
return sub_0807D008(5, arg0);
}
@@ -128,16 +142,16 @@ void sub_0807CF48(u32 arg0) {
struct_0807D1C4* temp;
temp = sub_0807D1C4(arg0);
sub_0807D184(temp->field_0x4, gUnk_0811E4AC);
sub_0807D184(temp->field_0x2, gUnk_0811E4AC);
sub_0807D184(temp->field_0x4, sSaveDescDeleted);
sub_0807D184(temp->field_0x2, sSaveDescDeleted);
}
void sub_0807CF68(u32 arg0) {
struct_0807D1C4* temp;
char* str;
const char* str;
temp = sub_0807D1C4(arg0);
str = gUnk_0811E4A4;
str = sSaveDescInit;
sub_0807D184(temp->field_0x4, str);
sub_0807D184(temp->field_0x2, str);
}
+2 -2
View File
@@ -8,7 +8,7 @@ extern void (*const gUnk_081280C4[])();
void DrawKinstoneMenu(void) {
gScreenTransition.field_0x24[8] = 2;
sub_080AD90C();
FlushSprites();
gUnk_081280C4[gMenu.menuType]();
sub_080A3B74();
sub_080A4054();
@@ -26,7 +26,7 @@ void sub_080A3BD0(void) {
s32 iVar1;
s32 iVar2;
gMenu.field_0x1 = 1;
gMenu.column_idx = 1;
gMenu.unk2a = 0;
sub_080A4D34();
LoadPaletteGroup(0xcb);
+27 -45
View File
@@ -5,53 +5,34 @@
#include "textbox.h"
#include "structures.h"
void ShowTextbox();
void TextboxAtPosition();
u32 sub_080564DC(void);
u32 sub_080564EC(void);
u32 sub_08056654(void);
u32 sub_080565B4(void);
u32 sub_080565F8(void);
u32 sub_08056640(void);
typedef struct {
u8 _0;
u8 _1;
u8 _2;
u8 _3[5];
u16 _8;
u8 _b[0x16];
u8 _20;
u8 _21;
u8 _22[0xa];
void* _2c;
u8 _30[0x23];
u8 _53;
u16 _54;
u8 _56[0x2];
void* _58;
u8 _5c;
u8 _5d;
u8 _5e[24];
u8 _76;
u8 _77[0x11];
u8 _88;
u8 _89;
u8 _8a;
u8 _8b[0xe];
u8 _99;
u8 _9a;
u8 _9b;
u8 _9c;
u8 _9d;
u8 _9e[0xa];
} struct_02022780;
extern struct_02022780 gUnk_02022780;
static_assert(sizeof(struct_02022780) == 0xa8);
u32 (*const gUnk_08107BC8[])(void) = { sub_080564DC, sub_080564EC, sub_08056654,
sub_080565B4, sub_080565F8, sub_08056640 };
extern const s32 (*const gUnk_08107BC8[])();
extern const void (*const gUnk_08107BF4[])(struct_02022780*);
extern u8 gUnk_020227DC, gUnk_020227E8, gUnk_020227F0, gUnk_020227F8, gUnk_02022800;
u8* const gUnk_08107BE0[] = { &gUnk_020227DC, &gUnk_020227E8, &gUnk_020227F0, &gUnk_020227F8, &gUnk_02022800 };
void sub_08056684(struct_02022780*);
void sub_080566B8(struct_02022780*);
void sub_08056BA0(struct_02022780*);
void sub_08056B1C(struct_02022780*);
void sub_08056B7C(struct_02022780*);
void sub_080569D4(struct_02022780*);
void (*const gUnk_08107BF4[])(struct_02022780*) = { sub_08056684, sub_080566B8, sub_08056BA0,
sub_08056B1C, sub_08056B7C, sub_080569D4 };
extern u32 gUnk_02036A40;
extern u32 gUnk_02036A38;
extern u8 gUnk_02024030;
extern u8 gUnk_020227A0;
extern u8 gUnk_02000D00;
extern u8 gUnk_08107BE0;
s32 sub_08056338(void) {
s32 result;
@@ -100,7 +81,7 @@ void TextboxAtPosition(u32 index, u32 x, u32 y) {
gTextBox.textWindowPosY = y;
}
void ShowTextbox(u32 index, u32 param_2, u32* dest) {
void ShowTextbox(u32 index) {
_DmaZero(&gTextBox, 32);
gTextBox.textIndex = index;
gTextBox.textSpeed = 99;
@@ -158,10 +139,10 @@ NONMATCH("asm/non_matching/textbox/sub_080564EC.inc", u32 sub_080564EC(void)) {
char* dest;
u32 i;
char c;
_DmaZero((void *)&gUnk_02036A40, 8);
_DmaZero((void *)&gUnk_02024030, 0x18);
_DmaZero((void *)&gUnk_02022780, 0xa8);
_DmaZero((void*)&gUnk_02036A40, 8);
_DmaZero((void*)&gUnk_02024030, 0x18);
_DmaZero((void*)&gUnk_02022780, 0xa8);
_DmaCopy(&gTextBox, &gUnk_02022780, 32);
if (gUnk_02022780._2 == 0x63) {
gUnk_02022780._2 = gUnk_02000000->messageSpeed;
@@ -174,7 +155,8 @@ NONMATCH("asm/non_matching/textbox/sub_080564EC.inc", u32 sub_080564EC(void)) {
for (i = 0; i < 6; ++i) {
c = gUnk_02002A40.playerName[i];
if (c == '\0') break;
if (c == '\0')
break;
dest[i] = c;
}
+8 -1
View File
@@ -5,7 +5,14 @@
"ios": "c",
"functions.h": "c",
"textbox.h": "c",
"structures.h": "c"
"structures.h": "c",
"fileselect.h": "c",
"menu.h": "c",
"save.h": "c",
"main.h": "c",
"object.h": "c",
"filescreen.h": "c",
"screen.h": "c"
}
}
}