papermario/src/filemenu/filemenu_common.c

1152 lines
34 KiB
C

#include "common.h"
#include "filemenu.h"
#include "hud_element.h"
#include "fio.h"
#include "ld_addrs.h"
#include "game_modes.h"
extern HudScript HES_AnimatedCursorHand;
extern MenuPanel filemenu_main_menuBP;
extern MenuPanel filemenu_yesno_menuBP;
extern MenuPanel filemenu_info_menuBP;
extern MenuPanel filemenu_createfile_menuBP;
extern MenuPanel filemenu_selectlanguage_menuBP;
HudScript* filemenu_cursor_hudElemScripts[] = { &HES_AnimatedCursorHand };
MenuPanel* filemenu_menus[] = {
&filemenu_main_menuBP,
&filemenu_yesno_menuBP,
&filemenu_info_menuBP,
&filemenu_createfile_menuBP,
#if VERSION_PAL
&filemenu_selectlanguage_menuBP,
#endif
};
s32 filemenu_cursor_posX = SCREEN_WIDTH / 2;
s32 filemenu_cursor_posY = -SCREEN_HEIGHT / 2;
s32 filemenu_cursor_alpha = 0;
s32 filemenu_cursor_targetX = SCREEN_WIDTH / 2;
s32 filemenu_cursor_targetY = -SCREEN_HEIGHT / 2;
s32 filemenu_cursorGoalAlpha = 0;
s32 filemenu_cursorGoalAlpha2 = 0;
s32 D_80249BB0 = TRUE;
#if !VERSION_PAL
s32 D_80249BB4 = 0;
#endif
s32 D_80249BB8 = 0;
s16 D_80249BBC[16] = { 315, 303, 283, 260, 235, 210, 185, 160, 135, 110, 85, 60, 37, 17, 5, 0 };
s16 D_80249BDC[16] = { 315, 303, 283, 260, 235, 210, 185, 160, 135, 110, 85, 60, 37, 17, 5, 0 };
s16 D_80249BFC[16] = { 157, 151, 141, 130, 117, 105, 92, 80, 67, 55, 42, 30, 18, 8, 2, 0 };
s16 D_80249C1C[16] = { 157, 151, 141, 130, 117, 105, 92, 80, 67, 55, 42, 30, 18, 8, 2, 0 };
s16 D_80249C3C[16] = { 63, 60, 56, 52, 47, 42, 37, 32, 27, 22, 17, 12, 7, 3, 1, 0 };
s16 D_80249C5C[16] = { 63, 60, 56, 52, 47, 42, 37, 32, 27, 22, 17, 12, 7, 3, 1, 0 };
s16 D_80249C7C[10] = { -5, -17, -37, -60, -85, -110, -135, -160, -185, -210 };
s16 D_80249C90[10] = { -5, -17, -37, -60, -85, -110, -135, -160, -185, -210 };
s16 D_80249CA4[10] = { -2, -8, -18, -30, -42, -55, -70, -85, -100, -115 };
s16 D_80249CB8[10] = { -2, -8, -18, -30, -42, -55, -70, -85, -100, -115 };
s16 D_80249CCC[10] = { -1, -3, -7, -12, -17, -22, -27, -32, -37, -42 };
s16 D_80249CE0[10] = { -1, -3, -7, -12, -17, -22, -27, -32, -37, -42 };
s16 D_80249CF4[16] = { 180, 173, 161, 148, 134, 120, 105, 91, 77, 62, 48, 34, 21, 9, 2, 0 };
s16 D_80249D14[16] = { 0, 2, 9, 21, 34, 48, 62, 77, 91, 105, 120, 134, 148, 161, 173, 180 };
s16 D_80249D34[10] = { 185, 160, 135, 110, 85, 60, 37, 17, 5, 0 };
s16 D_80249D48[10] = { 0, 5, 17, 37, 60, 85, 110, 135, 160, 185};
#if VERSION_PAL
s16 D_filemenu_8024EB5C[] = {
210,
182,
162,
145,
130,
117,
105,
92,
80,
67,
55,
42,
30,
18,
8,
2,
0,
};
s16 D_filemenu_8024EB80[] = {
-2,
-8,
-18,
-30,
-42,
-55,
-67,
-80,
-92,
-105,
-117,
-130,
-142,
-155,
-167,
-180,
-192,
-205,
};
#endif
s32 D_80249D4C = 0; // padding?
Vp D_80249D60 = {
.vp = {
.vscale = { 640, 480, 511, 0},
.vtrans = { 640, 480, 511, 0},
}
};
f32 D_80249D70[15] = { 7.0f, 12.5f, 13.0f, 14.5f, 14.0f, 13.0f, 11.5f, 9.5f, 7.5f, 5.5f, 3.5f, 2.0f, 1.0f, 0.5f, 0.0f };
MenuWindowBP filemenu_common_windowBPs[3] = {
{
.windowID = WINDOW_ID_FILEMENU_MAIN,
.pos = {
.x = 16,
.y = 24,
},
.width = 288,
.height = 192,
.priority = WINDOW_PRIORITY_0,
.fpDrawContents = NULL,
.tab = NULL,
.parentID = -1,
.fpUpdate = { WINDOW_UPDATE_SHOW },
.extraFlags = WINDOW_FLAG_40,
.style = { .customStyle = &filemenu_windowStyles[0] },
},
{
.windowID = WINDOW_ID_FILEMENU_COPYARROW,
.pos = {
.x = 0,
.y = 0,
},
.width = 288,
.height = 192,
.priority = WINDOW_PRIORITY_0,
.fpDrawContents = filemenu_draw_contents_copy_arrow,
.tab = NULL,
.parentID = WINDOW_ID_FILEMENU_MAIN,
.fpUpdate = { WINDOW_UPDATE_SHOW } ,
.extraFlags = 0,
.style = { .customStyle = &filemenu_windowStyles[1] },
},
{
.windowID = WINDOW_ID_FILEMENU_CURSOR,
.pos = {
.x = 0,
.y = 0,
},
.width = 320,
.height = 240,
.priority = WINDOW_PRIORITY_0,
.fpDrawContents = filemenu_draw_cursor,
.tab = NULL,
.parentID = -1,
.fpUpdate = { WINDOW_UPDATE_SHOW },
.extraFlags = 0,
.style = { .customStyle = &filemenu_windowStyles[1] },
},
};
extern Gfx filemenu_dl_copyarrow[];
extern Gfx D_8024B6F0[];
extern Gfx D_8024B708[];
BSS s32 filemenu_iterFileIdx;
BSS s32 filemenu_pressedButtons;
BSS s32 filemenu_cursorHudElem;
BSS s32 filemenu_heldButtons;
BSS s8 filemenu_filename_pos;
BSS s32 filemenu_loadedFileIdx;
BSS s8 filemenu_currentMenu;
BSS s32 filemenu_8024C09C;
BSS s32 filemenu_cursorHudElemID[1];
BSS s32 filemenu_8024C0A4[3];
BSS s32 filemenu_hudElemIDs[20];
BSS s32 filemenu_createfile_hudElems[4];
#if VERSION_PAL
BSS s32 D_802517D0[1];
BSS s32 D_802517D4[1];
BSS u16 D_802517E0[2][0x400] ALIGNED(16);
#endif
#if VERSION_IQUE
BSS u8 filemenu_glyphBuffer[20][0x80];
#endif
void filemenu_draw_rect(s32 ulx, s32 uly, s32 lrx, s32 lry, s32 tileIdx, s32 uls, s32 ult, s32 dsdx, s32 dtdy) {
if (ulx <= -2688 || uly <= -2688 || lrx <= 0 || lry <= 0) {
return;
}
if (ulx >= 1280 || uly >= 960 || lrx >= 2688 || lry >= 2688) {
return;
}
gSPScisTextureRectangle(gMainGfxPos++, ulx, uly, lrx, lry, tileIdx, uls, ult, dsdx, dtdy);
}
void filemenu_set_selected(MenuPanel* menu, s32 col, s32 row) {
menu->col = col;
menu->row = row;
menu->selected = menu->gridData[(menu->page * menu->numCols * menu->numRows) +
(menu->numCols * menu->row) + menu->col];
}
void filemenu_set_cursor_alpha(s32 alpha) {
filemenu_cursorGoalAlpha = alpha;
filemenu_cursorGoalAlpha2 = alpha;
}
void filemenu_set_cursor_goal_pos(s32 windowID, s32 posX, s32 posY) {
Window* window = &gWindows[windowID];
if (D_80249BB0
|| get_game_mode() == GAME_MODE_END_FILE_SELECT
|| get_game_mode() == GAME_MODE_END_LANGUAGE_SELECT) {
if (D_80249BB0) {
s32 i;
for (i = WINDOW_ID_FILEMENU_MAIN; i < ARRAY_COUNT(gWindows); i++) {
Window* window = &gWindows[i];
s8 parent = window->parent;
if ((parent == -1 || parent == WINDOW_ID_FILEMENU_MAIN) && (window->flags & WINDOW_FLAG_INITIAL_ANIMATION)) {
break;
}
}
if (i >= ARRAY_COUNT(gWindows)) {
D_80249BB0 = FALSE;
}
}
filemenu_cursor_targetX = posX;
filemenu_cursor_posX = posX;
filemenu_cursor_targetY = posY;
filemenu_cursor_posY = posY;
} else if (!(window->flags & WINDOW_FLAG_INITIAL_ANIMATION) &&
(window->parent == -1 || !(gWindows[window->parent].flags & WINDOW_FLAG_INITIAL_ANIMATION))) {
filemenu_cursor_targetX = posX;
filemenu_cursor_targetY = posY;
}
}
void filemenu_update_cursor(void) {
s32 targetPosX = filemenu_cursor_targetX;
s32 targetPosY = filemenu_cursor_targetY;
s32 xDelta;
s32 yDelta;
s32 i;
xDelta = (targetPosX - filemenu_cursor_posX) * 0.5;
yDelta = (targetPosY - filemenu_cursor_posY) * 0.5;
if ((targetPosX != filemenu_cursor_posX) || (targetPosY != filemenu_cursor_posY)) {
if ((xDelta == 0) && (yDelta == 0)) {
filemenu_cursor_posX = targetPosX;
filemenu_cursor_posY = targetPosY;
}
}
filemenu_cursor_posX += xDelta;
filemenu_cursor_posY += yDelta;
if (filemenu_cursorGoalAlpha == 0) {
filemenu_cursor_alpha -= 128;
if (filemenu_cursor_alpha < 0) {
filemenu_cursor_alpha = 0;
}
} else {
filemenu_cursor_alpha += 32;
if (filemenu_cursor_alpha > 255) {
filemenu_cursor_alpha = 255;
}
}
for (i = WINDOW_ID_FILEMENU_MAIN; i < ARRAY_COUNT(gWindows); i++) {
Window* window = &gWindows[i];
s8 parent = window->parent;
if ((parent == -1 || parent == WINDOW_ID_FILEMENU_MAIN) && (window->flags & WINDOW_FLAG_INITIAL_ANIMATION)) {
break;
}
}
if (D_80249BB8 == 0) {
if (filemenu_cursorGoalAlpha == 0) {
D_80249BB8 = 1;
}
}
if (i >= ARRAY_COUNT(gWindows)) {
if (filemenu_cursorGoalAlpha2 == 255) {
if (D_80249BB8 != 0) {
D_80249BB8--;
if (D_80249BB8 == 0) {
filemenu_cursor_posX = filemenu_cursor_targetX;
filemenu_cursor_posY = filemenu_cursor_targetY;
}
}
}
if (D_80249BB8 == 0) {
filemenu_cursorGoalAlpha = filemenu_cursorGoalAlpha2;
}
} else if (filemenu_cursorGoalAlpha == 0) {
D_80249BB8 = 1;
}
filemenu_cursorGoalAlpha2 = 255;
}
void filemenu_update(void) {
MenuPanel* menu = filemenu_menus[filemenu_currentMenu];
MenuPanel** menuIt;
s32 i;
for (i = WINDOW_ID_FILEMENU_MAIN; i < ARRAY_COUNT(gWindows); i++) {
if ((gWindows[i].parent == -1 || gWindows[i].parent == WINDOW_ID_FILEMENU_MAIN) &&
(gWindows[i].flags & WINDOW_FLAG_INITIAL_ANIMATION))
{
break;
}
}
if (i >= ARRAY_COUNT(gWindows)) {
filemenu_heldButtons = gGameStatusPtr->heldButtons[0];
filemenu_pressedButtons = gGameStatusPtr->pressedButtons[0];
} else {
filemenu_heldButtons = 0;
filemenu_pressedButtons = 0;
}
if (filemenu_pressedButtons & BUTTON_B) {
filemenu_pressedButtons &= ~BUTTON_A;
}
if (filemenu_heldButtons & BUTTON_B) {
filemenu_heldButtons &= ~BUTTON_A;
}
if (menu->initialized) {
if (menu->fpHandleInput != NULL) {
menu->fpHandleInput(menu);
}
}
// TODO clean up bad match
menuIt = filemenu_menus;
for (i = 0; i < ARRAY_COUNT(filemenu_menus); i++, menuIt++) {
menu = *menuIt;
if (menu->initialized && menu->fpUpdate != NULL) {
menu->fpUpdate(menu);
}
}
}
void func_8024330C(
s32 windowIdx,
s32* flags,
s32* posX, s32* posY, s32* posZ,
f32* scaleX, f32* scaleY,
f32* rotX, f32* rotY, f32* rotZ,
s32* darkening,
s32* opacity
) {
Window* window = &gWindows[windowIdx];
s32 updateCounter = window->updateCounter;
if (updateCounter == 0) {
window->flags &= ~WINDOW_FLAG_HIDDEN;
}
if (updateCounter < ARRAY_COUNT(D_80249BBC)) {
*posX -= D_80249BBC[updateCounter];
} else {
*posX -= D_80249BBC[ARRAY_COUNT(D_80249BBC) - 1];
window->flags &= ~WINDOW_FLAG_INITIAL_ANIMATION;
}
}
void filemenu_update_show_name_input(
s32 windowIdx,
s32* flags,
s32* posX, s32* posY, s32* posZ,
f32* scaleX, f32* scaleY,
f32* rotX, f32* rotY, f32* rotZ,
s32* darkening,
s32* opacity
) {
Window* window = &gWindows[windowIdx];
s32 updateCounter = window->updateCounter;
if (updateCounter == 0) {
window->flags &= ~WINDOW_FLAG_HIDDEN;
}
if (updateCounter < ARRAY_COUNT(D_80249BDC)) {
*posX += D_80249BDC[updateCounter];
} else {
*posX += D_80249BDC[ARRAY_COUNT(D_80249BDC) - 1];
window->flags &= ~WINDOW_FLAG_INITIAL_ANIMATION;
}
}
void filemenu_update_show_options_left(
s32 windowIdx,
s32* flags,
s32* posX, s32* posY, s32* posZ,
f32* scaleX, f32* scaleY,
f32* rotX, f32* rotY, f32* rotZ,
s32* darkening,
s32* opacity
) {
Window* window = &gWindows[windowIdx];
s32 updateCounter = window->updateCounter;
if (updateCounter == 0) {
window->flags &= ~WINDOW_FLAG_HIDDEN;
}
if (updateCounter < ARRAY_COUNT(D_80249BFC)) {
*posX -= D_80249BFC[updateCounter];
} else {
*posX -= D_80249BFC[ARRAY_COUNT(D_80249BFC) - 1];
window->flags &= ~WINDOW_FLAG_INITIAL_ANIMATION;
}
}
void filemenu_update_show_options_right(
s32 windowIdx,
s32* flags,
s32* posX, s32* posY, s32* posZ,
f32* scaleX, f32* scaleY,
f32* rotX, f32* rotY, f32* rotZ,
s32* darkening,
s32* opacity
) {
Window* window = &gWindows[windowIdx];
s32 updateCounter = window->updateCounter;
if (updateCounter == 0) {
window->flags &= ~WINDOW_FLAG_HIDDEN;
}
if (updateCounter < ARRAY_COUNT(D_80249C1C)) {
*posX += D_80249C1C[updateCounter];
} else {
*posX += D_80249C1C[ARRAY_COUNT(D_80249C1C) - 1];
window->flags &= ~WINDOW_FLAG_INITIAL_ANIMATION;
}
}
void filemenu_update_show_options_bottom(
s32 windowIdx,
s32* flags,
s32* posX, s32* posY, s32* posZ,
f32* scaleX, f32* scaleY,
f32* rotX, f32* rotY, f32* rotZ,
s32* darkening,
s32* opacity
) {
Window* window = &gWindows[windowIdx];
s32 updateCounter = window->updateCounter;
if (updateCounter == 0) {
window->flags &= ~WINDOW_FLAG_HIDDEN;
}
if (updateCounter < ARRAY_COUNT(D_80249C3C)) {
*posY += D_80249C3C[updateCounter];
} else {
*posY += D_80249C3C[ARRAY_COUNT(D_80249C3C) - 1];
window->flags &= ~WINDOW_FLAG_INITIAL_ANIMATION;
}
}
void filemenu_update_show_title(
s32 windowIdx,
s32* flags,
s32* posX, s32* posY, s32* posZ,
f32* scaleX, f32* scaleY,
f32* rotX, f32* rotY, f32* rotZ,
s32* darkening,
s32* opacity
) {
Window* window = &gWindows[windowIdx];
s32 updateCounter = window->updateCounter;
if (updateCounter == 0) {
window->flags &= ~WINDOW_FLAG_HIDDEN;
}
if (updateCounter < ARRAY_COUNT(D_80249C5C)) {
*posY -= D_80249C5C[updateCounter];
} else {
*posY -= D_80249C5C[ARRAY_COUNT(D_80249C5C) - 1];
window->flags &= ~WINDOW_FLAG_INITIAL_ANIMATION;
}
}
void func_802435C4(
s32 windowIdx,
s32* flags,
s32* posX, s32* posY, s32* posZ,
f32* scaleX, f32* scaleY,
f32* rotX, f32* rotY, f32* rotZ,
s32* darkening,
s32* opacity
) {
Window* window = &gWindows[windowIdx];
s32 updateCounter = window->updateCounter;
if (updateCounter < ARRAY_COUNT(D_80249C7C)) {
*posX += D_80249C7C[updateCounter];
} else {
*posX += D_80249C7C[ARRAY_COUNT(D_80249C7C) - 1];
window->flags &= ~WINDOW_FLAG_INITIAL_ANIMATION;
window->flags |= WINDOW_FLAG_HIDDEN;
}
}
void filemenu_update_hidden_name_input(
s32 windowIdx,
s32* flags,
s32* posX, s32* posY, s32* posZ,
f32* scaleX, f32* scaleY,
f32* rotX, f32* rotY, f32* rotZ,
s32* darkening,
s32* opacity
) {
Window* window = &gWindows[windowIdx];
s32 updateCounter = window->updateCounter;
if (updateCounter < ARRAY_COUNT(D_80249C90)) {
*posX -= D_80249C90[updateCounter];
} else {
*posX -= D_80249C90[ARRAY_COUNT(D_80249C90) - 1];
window->flags &= ~WINDOW_FLAG_INITIAL_ANIMATION;
window->flags |= WINDOW_FLAG_HIDDEN;
}
}
void filemenu_update_hidden_options_left(
s32 windowIdx,
s32* flags,
s32* posX, s32* posY, s32* posZ,
f32* scaleX, f32* scaleY,
f32* rotX, f32* rotY, f32* rotZ,
s32* darkening,
s32* opacity
) {
Window* window = &gWindows[windowIdx];
s32 updateCounter = window->updateCounter;
if (updateCounter < ARRAY_COUNT(D_80249CA4)) {
*posX += D_80249CA4[updateCounter];
} else {
*posX += D_80249CA4[ARRAY_COUNT(D_80249CA4) - 1];
window->flags &= ~WINDOW_FLAG_INITIAL_ANIMATION;
window->flags |= WINDOW_FLAG_HIDDEN;
}
}
void filemenu_update_hidden_options_right(
s32 windowIdx,
s32* flags,
s32* posX, s32* posY, s32* posZ,
f32* scaleX, f32* scaleY,
f32* rotX, f32* rotY, f32* rotZ,
s32* darkening,
s32* opacity
) {
Window* window = &gWindows[windowIdx];
s32 updateCounter = window->updateCounter;
if (updateCounter < ARRAY_COUNT(D_80249CB8)) {
*posX -= D_80249CB8[updateCounter];
} else {
*posX -= D_80249CB8[ARRAY_COUNT(D_80249CB8) - 1];
window->flags &= ~WINDOW_FLAG_INITIAL_ANIMATION;
window->flags |= WINDOW_FLAG_HIDDEN;
}
}
void filemenu_update_hidden_title(
s32 windowIdx,
s32* flags,
s32* posX, s32* posY, s32* posZ,
f32* scaleX, f32* scaleY,
f32* rotX, f32* rotY, f32* rotZ,
s32* darkening,
s32* opacity
) {
Window* window = &gWindows[windowIdx];
s32 updateCounter = window->updateCounter;
if (updateCounter < ARRAY_COUNT(D_80249CCC)) {
*posY += D_80249CCC[updateCounter];
} else {
*posY += D_80249CCC[ARRAY_COUNT(D_80249CCC) - 1];
window->flags &= ~WINDOW_FLAG_INITIAL_ANIMATION;
window->flags |= WINDOW_FLAG_HIDDEN;
}
}
void filemenu_update_hidden_options_bottom(
s32 windowIdx,
s32* flags,
s32* posX, s32* posY, s32* posZ,
f32* scaleX, f32* scaleY,
f32* rotX, f32* rotY, f32* rotZ,
s32* darkening,
s32* opacity
) {
Window* window = &gWindows[windowIdx];
s32 updateCounter = window->updateCounter;
if (updateCounter < ARRAY_COUNT(D_80249CE0)) {
*posY -= D_80249CE0[updateCounter];
} else {
*posY -= D_80249CE0[ARRAY_COUNT(D_80249CE0) - 1];
window->flags &= ~WINDOW_FLAG_INITIAL_ANIMATION;
window->flags |= WINDOW_FLAG_HIDDEN;
}
}
void filemenu_update_show_with_rotation(
s32 windowIdx,
s32* flags,
s32* posX, s32* posY, s32* posZ,
f32* scaleX, f32* scaleY,
f32* rotX, f32* rotY, f32* rotZ,
s32* darkening,
s32* opacity
) {
Window* window = &gWindows[windowIdx];
s32 updateCounter = window->updateCounter;
if (updateCounter == 0) {
window->flags &= ~WINDOW_FLAG_HIDDEN;
}
if (updateCounter < ARRAY_COUNT(D_80249CF4)) {
*rotY += D_80249CF4[updateCounter];
*flags = DRAW_FLAG_CULL_BACK | DRAW_FLAG_ROTSCALE;
} else {
*flags = 0;
window->flags &= ~WINDOW_FLAG_INITIAL_ANIMATION;
}
}
void filemenu_update_hidden_with_rotation(
s32 windowIdx,
s32* flags,
s32* posX, s32* posY, s32* posZ,
f32* scaleX, f32* scaleY,
f32* rotX, f32* rotY, f32* rotZ,
s32* darkening,
s32* opacity
) {
Window* window = &gWindows[windowIdx];
s32 updateCounter = window->updateCounter;
if (updateCounter < 10) { // TODO: array count?
*rotY += -D_80249D14[updateCounter];
*flags = DRAW_FLAG_CULL_BACK | DRAW_FLAG_ROTSCALE;
} else {
*flags = 0;
window->flags &= ~WINDOW_FLAG_INITIAL_ANIMATION;
window->flags |= WINDOW_FLAG_HIDDEN;
}
}
void filemenu_update_select_file(
s32 windowIdx,
s32* flags,
s32* posX, s32* posY, s32* posZ,
f32* scaleX, f32* scaleY,
f32* rotX, f32* rotY, f32* rotZ,
s32* darkening,
s32* opacity
) {
Window* window = &gWindows[windowIdx];
Window* parent = &gWindows[window->parent];
s32 updateCounter = window->updateCounter;
f32 temp_f4 = updateCounter / 16.0f;
s32 widthDelta = (parent->width / 2) - (window->width / 2);
s32 heightDelta = (parent->height / 2) - (window->height / 2) - 34;
if (updateCounter < 16) {
*posX += -window->pos.x + (((f32) (widthDelta - window->pos.x) * temp_f4) + window->pos.x);
*posY += -window->pos.y + (((f32) (heightDelta - window->pos.y) * temp_f4) + window->pos.y);
} else {
*posX += -window->pos.x + ((f32) (widthDelta - window->pos.x) + window->pos.x);
*posY += -window->pos.y + ((f32) (heightDelta - window->pos.y) + window->pos.y);
window->flags &= ~WINDOW_FLAG_INITIAL_ANIMATION;
}
}
void filemenu_update_deselect_file(
s32 windowIdx,
s32* flags,
s32* posX, s32* posY, s32* posZ,
f32* scaleX, f32* scaleY,
f32* rotX, f32* rotY, f32* rotZ,
s32* darkening,
s32* opacity
) {
Window* window = &gWindows[windowIdx];
s32 updateCounter = window->updateCounter;
f32 temp_f4 = 1.0f - (updateCounter / 16.0f);
if (updateCounter < 16) {
*posX += -window->pos.x + (((80 - window->pos.x) * temp_f4) + window->pos.x);
*posY += -window->pos.y + (((36 - window->pos.y) * temp_f4) + window->pos.y);
} else {
*posX += -window->pos.x + ((80 - window->pos.x) * 0.0f + window->pos.x);
*posY += -window->pos.y + ((36 - window->pos.y) * 0.0f + window->pos.y);
window->flags &= ~WINDOW_FLAG_INITIAL_ANIMATION;
}
}
void filemenu_update_show_name_confirm(
s32 windowIdx,
s32* flags,
s32* posX, s32* posY, s32* posZ,
f32* scaleX, f32* scaleY,
f32* rotX, f32* rotY, f32* rotZ,
s32* darkening,
s32* opacity
) {
Window* window = &gWindows[windowIdx];
s32 updateCounter = window->updateCounter;
u32 counter;
gDPPipeSync(gMainGfxPos++);
gDPSetCycleType(gMainGfxPos++, G_CYC_1CYCLE);
gDPSetCombineMode(gMainGfxPos++, G_CC_PRIMITIVE, G_CC_PRIMITIVE);
gDPSetRenderMode(gMainGfxPos++, G_RM_CLD_SURF, G_RM_CLD_SURF2);
gDPSetPrimColor(gMainGfxPos++, 0, 0, 0, 0, 0, 140);
if (updateCounter < 10) {
s32 x = updateCounter * 16;
s32 y = updateCounter * 12;
filemenu_draw_rect(0, 0, SCREEN_WIDTH * 4, y * 4, 0, 0, 0, 0, 0);
filemenu_draw_rect(0, (SCREEN_HEIGHT - y) * 4, SCREEN_WIDTH * 4, SCREEN_HEIGHT * 4, 0, 0, 0, 0, 0);
filemenu_draw_rect(0, y * 4, x * 4, (SCREEN_HEIGHT - y) * 4, 0, 0, 0, 0, 0);
filemenu_draw_rect((SCREEN_WIDTH - x) * 4, y * 4, SCREEN_WIDTH * 4, (SCREEN_HEIGHT - y) * 4, 0, 0, 0, 0, 0);
} else {
filemenu_draw_rect(0, 0, SCREEN_WIDTH * 4, SCREEN_HEIGHT * 4, 0, 0, 0, 0, 0);
}
counter = updateCounter - 10;
if (counter < 10) {
window->flags &= ~WINDOW_FLAG_HIDDEN;
*posY -= D_80249D34[counter];
}
if (updateCounter >= 20) {
window->flags &= ~WINDOW_FLAG_INITIAL_ANIMATION;
}
}
void filemenu_update_hidden_name_confirm(
s32 windowIdx,
s32* flags,
s32* posX, s32* posY, s32* posZ,
f32* scaleX, f32* scaleY,
f32* rotX, f32* rotY, f32* rotZ,
s32* darkening,
s32* opacity
) {
Window* window = &gWindows[windowIdx];
s32 updateCounter = window->updateCounter;
if (updateCounter < ARRAY_COUNT(D_80249D48)) {
gDPPipeSync(gMainGfxPos++);
gDPSetCycleType(gMainGfxPos++, G_CYC_1CYCLE);
gDPSetCombineMode(gMainGfxPos++, G_CC_PRIMITIVE, G_CC_PRIMITIVE);
gDPSetRenderMode(gMainGfxPos++, G_RM_CLD_SURF, G_RM_CLD_SURF2);
gDPSetPrimColor(gMainGfxPos++, 0, 0, 0, 0, 0, 140 - updateCounter * 14);
filemenu_draw_rect(0, 0, 1280, 960, 0, 0, 0, 0, 0);
*posY -= D_80249D48[updateCounter];
} else {
window->flags &= ~WINDOW_FLAG_INITIAL_ANIMATION;
window->flags |= WINDOW_FLAG_HIDDEN;
}
}
#if VERSION_PAL
void filemenu_update_pal_80247f40(
s32 windowIndex,
s32* flags,
s32* posX, s32* posY, s32* posZ,
f32* scaleX, f32* scaleY,
f32* rotX, f32* rotY, f32* rotZ,
s32* darkening,
s32* opacity
) {
Window* window = &gWindows[windowIndex];
s32 var_a1 = window->updateCounter;
s32 var_a3 = 0;
s32 var_v1;
switch (windowIndex) {
case WINDOW_ID_FILEMENU_FILE0_INFO:
var_a3 = 0;
break;
case WINDOW_ID_FILEMENU_FILE1_INFO:
var_a3 = 1;
break;
case WINDOW_ID_FILEMENU_FILE2_INFO:
var_a3 = 2;
break;
case WINDOW_ID_FILEMENU_FILE3_INFO:
var_a3 = 3;
break;
}
var_v1 = gCurrentLanguage;
var_v1 -= var_a3;
var_v1 = abs(var_v1);
var_a1 -= (var_v1 * 3);
if (var_a1 < 0) {
var_a1 = 0;
}
if (var_a1 == 0) {
window->flags &= ~WINDOW_FLAG_HIDDEN;
}
if (var_a1 < ARRAY_COUNT(D_filemenu_8024EB5C)) {
*posX -= D_filemenu_8024EB5C[var_a1];
} else {
*posX -= D_filemenu_8024EB5C[ARRAY_COUNT(D_filemenu_8024EB5C) - 1];
window->flags &= ~WINDOW_FLAG_INITIAL_ANIMATION;
}
}
void filemenu_selectlanguage_80248018(
s32 windowIndex,
s32* flags,
s32* posX, s32* posY, s32* posZ,
f32* scaleX, f32* scaleY,
f32* rotX, f32* rotY, f32* rotZ,
s32* darkening,
s32* opacity
) {
Window* window = &gWindows[windowIndex];
s32 var_a1 = window->updateCounter;
s32 var_a3 = 0;
s32 var_v1;
switch (windowIndex) {
case WINDOW_ID_FILEMENU_FILE0_INFO:
var_a3 = 0;
break;
case WINDOW_ID_FILEMENU_FILE1_INFO:
var_a3 = 1;
break;
case WINDOW_ID_FILEMENU_FILE2_INFO:
var_a3 = 2;
break;
case WINDOW_ID_FILEMENU_FILE3_INFO:
var_a3 = 3;
break;
}
var_v1 = gCurrentLanguage;
var_v1 -= var_a3;
if (var_v1 < 0) {
var_v1 = -var_v1;
}
var_a1 -= (var_v1 * 3);
if (var_a1 < 0) {
var_a1 = 0;
}
if (var_a1 < ARRAY_COUNT(D_filemenu_8024EB80)) {
*posX -= D_filemenu_8024EB80[var_a1];
} else {
*posX -= D_filemenu_8024EB80[ARRAY_COUNT(D_filemenu_8024EB80) - 1];
window->flags &= ~WINDOW_FLAG_INITIAL_ANIMATION;
window->flags |= WINDOW_FLAG_HIDDEN;
}
// TODO: ARRAY_COUNT?
if (var_a1 >= 0x10) {
filemenu_cursor_alpha = 0;
}
}
#endif
void filemenu_draw_cursor(MenuPanel* menu, s32 baseX, s32 baseY, s32 width, s32 height, s32 opacity, s32 darkening) {
s32 temp_a1;
filemenu_update_cursor();
temp_a1 = filemenu_cursor_alpha;
if (temp_a1 > 0) {
if (temp_a1 > 255) {
temp_a1 = 255;
}
hud_element_set_alpha(filemenu_cursorHudElemID[0], temp_a1);
hud_element_set_render_pos(filemenu_cursorHudElemID[0], baseX + filemenu_cursor_posX, baseY + filemenu_cursor_posY);
hud_element_draw_without_clipping(filemenu_cursorHudElemID[0]);
}
}
#if VERSION_PAL
#define PAGE_4 (3)
#else
#define PAGE_4 (4)
#endif
void filemenu_draw_contents_copy_arrow(MenuPanel* menu, s32 baseX, s32 baseY, s32 width, s32 height, s32 opacity,
s32 darkening)
{
Matrix4f sp20, sp60;
MenuPanel* menu0 = filemenu_menus[0];
f32 startX, startZ;
f32 endX, endZ;
f32 temp_f28;
if (menu0->page == PAGE_4 && menu0->selected < 4) {
if (menu0->selected != filemenu_loadedFileIdx && filemenu_currentMenu != 2) {
switch (filemenu_loadedFileIdx) {
case 0:
startX = 130.0f;
startZ = 90.0f;
break;
case 1:
startX = 190.0f;
startZ = 90.0f;
break;
case 2:
startX = 130.0f;
startZ = 150.0f;
break;
default:
startX = 190.0f;
startZ = 150.0f;
break;
}
switch (filemenu_menus[0]->selected) {
case 0:
endX = 130.0f;
endZ = 90.0f;
break;
case 1:
endX = 190.0f;
endZ = 90.0f;
break;
case 2:
endX = 130.0f;
endZ = 150.0f;
break;
default:
endX = 190.0f;
endZ = 150.0f;
break;
}
temp_f28 = -atan2(startX, startZ, endX, endZ) - 90.0f;
gSPViewport(gMainGfxPos++, &D_80249D60);
guOrthoF(sp20, 0.0f, SCREEN_WIDTH, SCREEN_HEIGHT, 0.0f, -100.0f, 100.0f, 1.0f);
guMtxF2L(sp20, &gDisplayContext->matrixStack[gMatrixListPos]);
gSPMatrix(gMainGfxPos++, &gDisplayContext->matrixStack[gMatrixListPos++],
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION);
gSPDisplayList(gMainGfxPos++, filemenu_dl_copyarrow);
gDPSetPrimColor(gMainGfxPos++, 0, 0, 0, 0, 0, 128);
gDPSetEnvColor(gMainGfxPos++, 0, 0, 0, 0);
guTranslateF(sp20, startX + 4.0f, startZ + 4.0f, 0.0f);
guScaleF(sp60, -1.0f, 1.0f, 1.0f);
guMtxCatF(sp60, sp20, sp20);
guRotateF(sp60, temp_f28, 0.0f, 0.0f, 1.0f);
guMtxCatF(sp60, sp20, sp20);
guMtxF2L(sp20, &gDisplayContext->matrixStack[gMatrixListPos]);
gSPMatrix(gMainGfxPos++, &gDisplayContext->matrixStack[gMatrixListPos++],
G_MTX_PUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(gMainGfxPos++, D_8024B6F0);
gSPPopMatrix(gMainGfxPos++, G_MTX_MODELVIEW);
guTranslateF(sp60, D_80249D70[gGameStatusPtr->frameCounter % ARRAY_COUNT(D_80249D70)], 0.0f, 0.0f);
guMtxCatF(sp60, sp20, sp20);
guMtxF2L(sp20, &gDisplayContext->matrixStack[gMatrixListPos]);
gSPMatrix(gMainGfxPos++, &gDisplayContext->matrixStack[gMatrixListPos++],
G_MTX_PUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetTileSize(gMainGfxPos++, 1, (gGameStatusPtr->frameCounter * 8) % 512, 0,
((gGameStatusPtr->frameCounter * 8) % 512) + 60, 0);
gSPDisplayList(gMainGfxPos++, D_8024B708);
gSPPopMatrix(gMainGfxPos++, G_MTX_MODELVIEW);
gDPSetPrimColor(gMainGfxPos++, 0, 0, 230, 230, 230, 255);
gDPSetEnvColor(gMainGfxPos++, 232, 40, 160, 0);
guTranslateF(sp20, startX, startZ, 0.0f);
guScaleF(sp60, -1.0f, 1.0f, 1.0f);
guMtxCatF(sp60, sp20, sp20);
guRotateF(sp60, temp_f28, 0.0f, 0.0f, 1.0f);
guMtxCatF(sp60, sp20, sp20);
guMtxF2L(sp20, &gDisplayContext->matrixStack[gMatrixListPos]);
gSPMatrix(gMainGfxPos++, &gDisplayContext->matrixStack[gMatrixListPos++],
G_MTX_PUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(gMainGfxPos++, D_8024B6F0);
gSPPopMatrix(gMainGfxPos++, G_MTX_MODELVIEW);
guTranslateF(sp60, D_80249D70[(gGameStatusPtr->frameCounter % ARRAY_COUNT(D_80249D70))], 0.0f, 0.0f);
guMtxCatF(sp60, sp20, sp20);
guMtxF2L(sp20, &gDisplayContext->matrixStack[gMatrixListPos]);
gSPMatrix(gMainGfxPos++, &gDisplayContext->matrixStack[gMatrixListPos++],
G_MTX_PUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetTileSize(gMainGfxPos++, 1, (gGameStatusPtr->frameCounter * 8) % 512, 0,
((gGameStatusPtr->frameCounter * 8) % 512) + 60, 0);
gSPDisplayList(gMainGfxPos++, D_8024B708);
gSPPopMatrix(gMainGfxPos++, G_MTX_MODELVIEW);
}
}
}
void func_PAL_8002B574(void); // TODO identify
// TODO bad match, look into
void filemenu_init(s32 arg0) {
MenuPanel** panelIt;
MenuPanel* menu;
s32 i;
DMA_COPY_SEGMENT(ui_images_filemenu_pause);
for (i = 0; i < ARRAY_COUNT(filemenu_cursorHudElemID); i++) {
filemenu_cursorHudElemID[i] = hud_element_create(filemenu_cursor_hudElemScripts[i]);
hud_element_set_flags(filemenu_cursorHudElemID[i], HUD_ELEMENT_FLAG_DROP_SHADOW | HUD_ELEMENT_FLAG_80);
}
filemenu_cursorHudElem = filemenu_cursorHudElemID[0];
if (arg0 == 0) {
filemenu_common_windowBPs[0].style.customStyle->background.imgData = NULL; // ???
}
setup_pause_menu_tab(filemenu_common_windowBPs, ARRAY_COUNT(filemenu_common_windowBPs));
#if VERSION_PAL
if (arg0 != 2) {
filemenu_currentMenu = 0;
menu = filemenu_menus[0];
menu->page = filemenu_currentMenu;
func_PAL_8002B574();
if (menu->page == 0) {
fio_load_globals();
if (gSaveGlobals.lastFileSelected >= 4) {
gSaveGlobals.lastFileSelected = 0;
}
gGameStatusPtr->saveSlot = gSaveGlobals.lastFileSelected;
}
filemenu_set_selected(menu, (gGameStatusPtr->saveSlot & 1) * 2, gGameStatusPtr->saveSlot >> 1);
panelIt = filemenu_menus;
for (i = 0; i < ARRAY_COUNT(filemenu_menus) - 1; i++, panelIt++) {
if ((*panelIt)->fpInit != NULL) {
(*panelIt)->fpInit((*panelIt));
}
}
update_window_hierarchy(WINDOW_ID_PAUSE_DECRIPTION, 64);
} else {
filemenu_currentMenu = 4;
filemenu_set_selected(filemenu_menus[4], 0, gCurrentLanguage);
panelIt = filemenu_menus;
for (i = 0; i < ARRAY_COUNT(filemenu_menus); i++, panelIt++) {
if (i == 4) {
if ((*panelIt)->fpInit != NULL) {
(*panelIt)->fpInit((*panelIt));
}
}
}
update_window_hierarchy(WINDOW_ID_PAUSE_DECRIPTION, 64);
}
#else
menu = filemenu_menus[0];
filemenu_currentMenu = 0;
if (arg0 == 0) {
menu->page = 0;
} else {
menu->page = 2;
}
if (menu->page == 0) {
for (i = 0; i < ARRAY_COUNT(filemenu_menus); i++) {
if (!fio_load_game(i)) {
gSaveSlotHasData[i] = FALSE;
} else {
gSaveSlotMetadata[i] = gCurrentSaveFile.metadata;
gSaveSlotHasData[i] = TRUE;
}
}
if (menu->page == 0) {
fio_load_globals();
if (gSaveGlobals.lastFileSelected >= 4) {
gSaveGlobals.lastFileSelected = 0;
}
gGameStatusPtr->saveSlot = gSaveGlobals.lastFileSelected;
}
}
filemenu_set_selected(menu, (gGameStatusPtr->saveSlot & 1) * 2, gGameStatusPtr->saveSlot >> 1);
panelIt = filemenu_menus;
for (i = 0; i < ARRAY_COUNT(filemenu_menus); i++, panelIt++) {
if ((*panelIt)->fpInit != NULL) {
(*panelIt)->fpInit((*panelIt));
}
}
update_window_hierarchy(WINDOW_ID_PAUSE_DECRIPTION, 64);
#endif
}
// TODO bad match, look into
void filemenu_cleanup(void) {
MenuPanel** panelIt;
s32 i;
for (i = 0; i < ARRAY_COUNT(filemenu_cursorHudElemID); i++) {
hud_element_free(filemenu_cursorHudElemID[i]);
}
panelIt = filemenu_menus;
for (i = 0; i < ARRAY_COUNT(filemenu_menus); i++, panelIt++) {
if ((*panelIt)->initialized) {
if ((*panelIt)->fpCleanup != NULL) {
(*panelIt)->fpCleanup(*panelIt);
}
}
}
for (i = WINDOW_ID_FILEMENU_MAIN; i < ARRAY_COUNT(gWindows); i++) {
set_window_update(i, WINDOW_UPDATE_HIDE);
}
set_window_update(WINDOW_ID_PAUSE_TUTORIAL, WINDOW_UPDATE_HIDE);
set_window_update(WINDOW_ID_PAUSE_DECRIPTION, WINDOW_UPDATE_HIDE);
func_80244BC4();
}
s32 func_80244BC4() {
if (filemenu_menus[0]->page == 0 && filemenu_currentMenu == 1 && filemenu_menus[1]->selected == 0) {
return 2;
} else if (filemenu_menus[0]->page == 0 && filemenu_menus[0]->selected < 4) {
return 1;
} else {
return 0;
}
}