diff --git a/assets/xml/overlays/ovl_file_choose_pal_n64.xml b/assets/xml/overlays/ovl_file_choose_pal_n64.xml index 55180bef9f..282fad0c37 100644 --- a/assets/xml/overlays/ovl_file_choose_pal_n64.xml +++ b/assets/xml/overlays/ovl_file_choose_pal_n64.xml @@ -3,6 +3,18 @@ + + + + + + + + + + + + @@ -12,6 +24,9 @@ + + + diff --git a/assets/xml/textures/title_static_pal_n64.xml b/assets/xml/textures/title_static_pal_n64.xml index 33a974a55e..ad3bf9dbbe 100644 --- a/assets/xml/textures/title_static_pal_n64.xml +++ b/assets/xml/textures/title_static_pal_n64.xml @@ -39,6 +39,14 @@ + + + + + + + + @@ -181,6 +189,14 @@ + + + + + + + + diff --git a/include/gfx_setupdl.h b/include/gfx_setupdl.h index 1eae1f6e2c..1ba9ba06f5 100644 --- a/include/gfx_setupdl.h +++ b/include/gfx_setupdl.h @@ -116,6 +116,7 @@ void Gfx_SetupDL_42Overlay(struct GraphicsContext* gfxCtx); void Gfx_SetupDL_27Xlu(struct GraphicsContext* gfxCtx); void Gfx_SetupDL_60NoCDXlu(struct GraphicsContext* gfxCtx); void Gfx_SetupDL_61Xlu(struct GraphicsContext* gfxCtx); +void Gfx_SetupDL_56Opa(struct GraphicsContext* gfxCtx); void Gfx_SetupDL_56Ptr(Gfx** gfxP); #endif diff --git a/include/z64.h b/include/z64.h index 27efb344c6..5a8e6a4a38 100644 --- a/include/z64.h +++ b/include/z64.h @@ -208,7 +208,7 @@ typedef struct FileSelectState { /* 0x000A8 */ u8* staticSegment; /* 0x000AC */ u8* parameterSegment; #if OOT_PAL - /* 0x000B0 */ char unk_B0[0x8]; + /* 0x000B0 */ u8* objectMagSegment; #endif /* 0x000B8 */ View view; /* 0x001E0 */ SramContext sramCtx; diff --git a/src/code/z_sram.c b/src/code/z_sram.c index b5d93f9902..9da2f405fb 100644 --- a/src/code/z_sram.c +++ b/src/code/z_sram.c @@ -919,13 +919,13 @@ void Sram_InitSram(GameState* gameState, SramContext* sramCtx) { for (i = 0; i < ARRAY_COUNTU(sZeldaMagic) - 3; i++) { if (sZeldaMagic[i + SRAM_HEADER_MAGIC] != sramCtx->readBuff[i + SRAM_HEADER_MAGIC]) { PRINTF(T("SRAM破壊!!!!!!\n", "SRAM destruction!!!!!!\n")); -#if OOT_PAL +#if PLATFORM_GC && OOT_PAL gSaveContext.language = sramCtx->readBuff[SRAM_HEADER_LANGUAGE]; #endif MemCpy(sramCtx->readBuff, sZeldaMagic, sizeof(sZeldaMagic)); -#if OOT_PAL +#if PLATFORM_GC && OOT_PAL sramCtx->readBuff[SRAM_HEADER_LANGUAGE] = gSaveContext.language; #endif Sram_WriteSramHeader(sramCtx); diff --git a/src/overlays/gamestates/ovl_file_choose/file_select.h b/src/overlays/gamestates/ovl_file_choose/file_select.h index 1bf1d79fb0..465d017ed0 100644 --- a/src/overlays/gamestates/ovl_file_choose/file_select.h +++ b/src/overlays/gamestates/ovl_file_choose/file_select.h @@ -4,6 +4,7 @@ #include "libc/stddef.h" #include "ultra64.h" #include "global.h" +#include "versions.h" #define GET_NEWF(sramCtx, slotNum, index) (sramCtx->readBuff[gSramSlotOffsets[slotNum] + offsetof(SaveContext, save.info.playerData.newf[index])]) @@ -16,7 +17,7 @@ (GET_NEWF(sramCtx, slotNum, 4) == 'A') || \ (GET_NEWF(sramCtx, slotNum, 5) == 'Z')) -// Init mode: Initial setup as the file select is starting up, fades and slides in various menu elements +// Init mode: Loads saves from SRAM, handles initial language selection in PAL N64 versions // Config mode: Handles the bulk of the file select, various configuration tasks like picking a file, copy/erase, and the options menu // Select mode: Displays the selected file with various details about it, and allows the player to confirm and open it typedef enum MenuMode { @@ -144,7 +145,11 @@ typedef enum ActionButtonIndex { typedef enum SettingIndex { /* 0 */ FS_SETTING_AUDIO, - /* 1 */ FS_SETTING_TARGET + /* 1 */ FS_SETTING_TARGET, +#if OOT_PAL_N64 + /* 2 */ FS_SETTING_LANGUAGE, +#endif + /* */ FS_SETTING_MAX } SettingIndex; typedef enum AudioOption { @@ -220,4 +225,8 @@ void FileSelect_DrawOptions(GameState* thisx); void FileSelect_DrawNameEntry(GameState* thisx); void FileSelect_DrawCharacter(GraphicsContext* gfxCtx, void* texture, s16 vtx); +#if OOT_VERSION == PAL_1_1 +extern s16 D_808124C0[]; +#endif + #endif diff --git a/src/overlays/gamestates/ovl_file_choose/z_file_choose.c b/src/overlays/gamestates/ovl_file_choose/z_file_choose.c index ac727a2970..61a2eb1f61 100644 --- a/src/overlays/gamestates/ovl_file_choose/z_file_choose.c +++ b/src/overlays/gamestates/ovl_file_choose/z_file_choose.c @@ -1,12 +1,54 @@ #include "file_select.h" #include "terminal.h" #include "versions.h" +#if OOT_PAL_N64 +#include "assets/objects/object_mag/object_mag.h" +#endif #include "assets/textures/title_static/title_static.h" #include "assets/textures/parameter_static/parameter_static.h" #if PLATFORM_N64 #include "n64dd.h" #endif +#if OOT_PAL_N64 +static s32 sInitialLanguageAlphaAsInt = 100; +static f32 sInitialLanguageAlphaStep = 8.0f; +static f32 sInitialLanguageAlpha = 100.0f; + +static s16 sInitialLanguageStickAdjX; +static s16 sInitialLanguageStickXDir; +static s16 sInitialLanguageInputTimerX; + +typedef struct InitialLanguageTextureInfo { + /* 0x00 */ void* texture; + /* 0x04 */ u16 width; + /* 0x06 */ u16 height; + /* 0x08 */ u32 x1; + /* 0x0C */ u32 y1; + /* 0x10 */ u32 x2; + /* 0x14 */ u32 y2; +} InitialLanguageTextureInfo; // size = 0x18 + +static InitialLanguageTextureInfo sInitialLanguageTextures[] = { + { gFileSelInitialLanguageChoiceENGTex, 80, 32, 40, 70, 120, 102 }, + { gFileSelInitialLanguageChoiceGERTex, 80, 32, 120, 70, 200, 102 }, + { gFileSelInitialLanguageChoiceFRATex, 80, 32, 200, 70, 280, 102 }, +}; + +typedef struct InitialLanguageCursorInfo { + /* 0x00 */ u32 x1; + /* 0x04 */ u32 y1; + /* 0x08 */ u32 x2; + /* 0x0C */ u32 y2; +} InitialLanguageCursorInfo; // size = 0x10 + +static InitialLanguageCursorInfo sInitialLanguageCursors[] = { + { 48, 52, 120, 124 }, + { 128, 52, 200, 124 }, + { 208, 52, 280, 124 }, +}; +#endif + static s16 sUnused = 106; static s16 sScreenFillAlpha = 255; @@ -29,6 +71,233 @@ static s16 sWindowContentColors[2][3] = { { 100, 100, 100 }, // gray }; +#if OOT_PAL_N64 +void FileSelect_UpdateInitialLanguageMenu(FileSelectState* this) { + SramContext* sramCtx = &this->sramCtx; + Input* input = &this->state.input[0]; + + if (gSaveContext.language >= LANGUAGE_MAX) { + gSaveContext.language = 0; + } + + sInitialLanguageAlpha += sInitialLanguageAlphaStep; + if (sInitialLanguageAlphaStep < 0.0f) { + if (sInitialLanguageAlpha < 100.0f) { + sInitialLanguageAlpha = 100.0f; + sInitialLanguageAlphaStep *= -1.0f; + } + } else if (sInitialLanguageAlphaStep > 0.0f) { + if (sInitialLanguageAlpha > 255.0f) { + sInitialLanguageAlpha = 255.0f; + sInitialLanguageAlphaStep *= -1.0f; + } + } + + sInitialLanguageAlphaAsInt = (s32)sInitialLanguageAlpha; + sInitialLanguageStickAdjX = (s16)input->rel.stick_x; + if (sInitialLanguageStickAdjX < -30) { + if (sInitialLanguageStickXDir == -1) { + sInitialLanguageInputTimerX -= 1; + if (sInitialLanguageInputTimerX < 0) { + sInitialLanguageInputTimerX = 2; + } else { + sInitialLanguageStickAdjX = 0; + } + } else { + sInitialLanguageInputTimerX = 10; + sInitialLanguageStickXDir = -1; + } + } else if (sInitialLanguageStickAdjX > 30) { + if (sInitialLanguageStickXDir == 1) { + sInitialLanguageInputTimerX -= 1; + if (sInitialLanguageInputTimerX < 0) { + sInitialLanguageInputTimerX = 2; + } else { + sInitialLanguageStickAdjX = 0; + } + } else { + sInitialLanguageInputTimerX = 10; + sInitialLanguageStickXDir = 1; + } + } else { + sInitialLanguageStickXDir = 0; + } + + if (CHECK_BTN_ALL(input->press.button, BTN_A) || CHECK_BTN_ALL(input->press.button, BTN_B) || + CHECK_BTN_ALL(input->press.button, BTN_START)) { + Audio_PlaySfxGeneral(NA_SE_SY_FSEL_DECIDE_L, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, + &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + Audio_PlaySfxGeneral(NA_SE_SY_FSEL_DECIDE_L, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, + &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + sramCtx->readBuff[2] = gSaveContext.language; + Sram_WriteSramHeader(sramCtx); + this->configMode++; + return; + } + + if (sInitialLanguageStickAdjX < -30) { + Audio_PlaySfxGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, + &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + gSaveContext.language--; + if (gSaveContext.language >= LANGUAGE_MAX) { + gSaveContext.language = LANGUAGE_MAX - 1; + } + } else if (sInitialLanguageStickAdjX > 30) { + Audio_PlaySfxGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, + &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + gSaveContext.language++; + if (gSaveContext.language >= LANGUAGE_MAX) { + gSaveContext.language = 0; + } + } +} + +void FileSelect_DrawImageRGBA32(GraphicsContext* gfxCtx, s16 centerX, s16 centerY, u8* source, u32 width, u32 height) { + u8* curTexture; + s32 textureCount; + s32 rectLeft; + s32 rectTop; + u32 textureHeight; + s32 remainingSize; + s32 textureSize; + s32 pad; + s32 i; + + OPEN_DISPS(gfxCtx, "../z_file_choose.c", 0); + + Gfx_SetupDL_56Opa(gfxCtx); + + curTexture = source; + rectLeft = centerX - (width / 2); + rectTop = centerY - (height / 2); + remainingSize = (width * height) << 2; + textureHeight = 4096 / (width << 2); + textureSize = (width * textureHeight) << 2; + textureCount = remainingSize / textureSize; + if ((remainingSize % textureSize) != 0) { + textureCount++; + } + + gDPSetTileCustom(POLY_OPA_DISP++, G_IM_FMT_RGBA, G_IM_SIZ_32b, 0, 0, width - 1, textureHeight - 1, 0, + G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, + G_TX_NOLOD); + + remainingSize -= textureSize; + + for (i = 0; i < textureCount; i++) { + gDPSetTextureImage(POLY_OPA_DISP++, G_IM_FMT_RGBA, G_IM_SIZ_32b, width, curTexture); + + gDPLoadSync(POLY_OPA_DISP++); + gDPLoadTile(POLY_OPA_DISP++, G_TX_LOADTILE, 0, 0, (width - 1) << 2, (textureHeight - 1) << 2); + + gSPTextureRectangle(POLY_OPA_DISP++, rectLeft << 2, rectTop << 2, (rectLeft + (s32)width) << 2, + (rectTop + textureHeight) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); + + curTexture += textureSize; + rectTop += textureHeight; + + if ((remainingSize - textureSize) < 0) { + if (remainingSize > 0) { + textureHeight = remainingSize / (s32)(width << 2); + remainingSize -= textureSize; + + gDPSetTileCustom(POLY_OPA_DISP++, G_IM_FMT_RGBA, G_IM_SIZ_32b, 0, 0, width - 1, textureHeight - 1, 0, + G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, + G_TX_NOLOD, G_TX_NOLOD); + } + } else { + remainingSize -= textureSize; + } + } + + CLOSE_DISPS(gfxCtx, "../z_file_choose.c", 0); +} + +void FileSelect_DrawInitialLanguageMenu(FileSelectState* this) { + u8* source; + s32 i; + s32 y1; + s32 y2; + + OPEN_DISPS(this->state.gfxCtx, "../z_file_choose.c", 0); + + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 70 + WREG(0)); + FileSelect_DrawImageRGBA32(this->state.gfxCtx, 160, 85 + WREG(1), (u8*)gTitleZeldaShieldLogoTex, 160, 160); + + Gfx_SetupDL_39Opa(this->state.gfxCtx); + + gDPSetAlphaCompare(POLY_OPA_DISP++, G_AC_NONE); + gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255); + + gDPLoadTextureBlock(POLY_OPA_DISP++, gTitleCopyright1998Tex, G_IM_FMT_IA, G_IM_SIZ_8b, 128, 16, 0, + G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, + G_TX_NOLOD); + + gSPTextureRectangle(POLY_OPA_DISP++, 94 << 2, 198 << 2, 222 << 2, 214 << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, + 1 << 10); + + Gfx_SetupDL_39Opa(this->state.gfxCtx); + + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 100, 100, 255, sInitialLanguageAlphaAsInt); + + gDPLoadTextureBlock_4b(POLY_OPA_DISP++, gFileSelInitialLanguageCursorTex, G_IM_FMT_I, 48, 48, 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, + G_TX_NOLOD); + + gSPTextureRectangle(POLY_OPA_DISP++, (sInitialLanguageCursors[gSaveContext.language].x1 + GREG(1)) << 2, + (sInitialLanguageCursors[gSaveContext.language].y1 + GREG(2)) << 2, + (sInitialLanguageCursors[gSaveContext.language].x2 + GREG(1)) << 2, + (sInitialLanguageCursors[gSaveContext.language].y2 + GREG(2)) << 2, G_TX_RENDERTILE, 0, 0, + 3 << 8, 3 << 8); + + gDPPipeSync(POLY_OPA_DISP++); + gDPSetRenderMode(POLY_OPA_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2); + gDPSetCombineMode(POLY_OPA_DISP++, G_CC_BLENDPEDECALA, G_CC_BLENDPEDECALA); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 50, 255); + + for (i = 0; i < LANGUAGE_MAX; i++) { + gDPPipeSync(POLY_OPA_DISP++); + + if (i == gSaveContext.language) { + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255); + } else { + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 50, 50, 100, 255); + } + + gDPLoadTextureBlock(POLY_OPA_DISP++, sInitialLanguageTextures[i].texture, G_IM_FMT_IA, G_IM_SIZ_8b, + sInitialLanguageTextures[i].width, sInitialLanguageTextures[i].height, 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, + G_TX_NOLOD); + + gSPTextureRectangle(POLY_OPA_DISP++, (sInitialLanguageTextures[i].x1 + GREG(1)) << 2, + (sInitialLanguageTextures[i].y1 + GREG(2)) << 2, + (sInitialLanguageTextures[i].x2 + GREG(1)) << 2, + (sInitialLanguageTextures[i].y2 + GREG(2)) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); + } + + gDPPipeSync(POLY_OPA_DISP++); + + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 220, 180, 30, 255); + gDPSetEnvColor(POLY_OPA_DISP++, 60, 20, 0, 255); + + source = (u8*)gFileSelSelectYourLanguageTex; + y1 = 120 + GREG(3); + for (i = 0; i < 8; i++, source += 0x500) { + y2 = y1 + 8; + gDPLoadTextureBlock(POLY_OPA_DISP++, source, G_IM_FMT_IA, G_IM_SIZ_8b, 160, 8, 0, G_TX_NOMIRROR | G_TX_WRAP, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + + gSPTextureRectangle(POLY_OPA_DISP++, (80 + GREG(4)) << 2, y1 << 2, (240 + GREG(4)) << 2, y2 << 2, + G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); + + y1 = y2; + } + + CLOSE_DISPS(this->state.gfxCtx, "../z_file_choose.c", 0); +} +#endif + void FileSelect_SetView(FileSelectState* this, f32 eyeX, f32 eyeY, f32 eyeZ) { Vec3f eye; Vec3f lookAt; @@ -58,18 +327,57 @@ Gfx* FileSelect_QuadTextureIA8(Gfx* gfx, void* texture, s16 width, s16 height, s void FileSelect_InitModeUpdate(GameState* thisx) { FileSelectState* this = (FileSelectState*)thisx; + SramContext* sramCtx = &this->sramCtx; +#if !OOT_PAL_N64 if (this->menuMode == FS_MENU_MODE_INIT) { this->menuMode = FS_MENU_MODE_CONFIG; this->configMode = CM_FADE_IN_START; this->nextTitleLabel = FS_TITLE_OPEN_FILE; PRINTF("Sram Start─Load 》》》》》 "); - Sram_VerifyAndLoadAllSaves(this, &this->sramCtx); + Sram_VerifyAndLoadAllSaves(this, sramCtx); PRINTF("終了!!!\n"); } +#else + if (this->configMode == CM_FADE_IN_START) { + Sram_VerifyAndLoadAllSaves(this, sramCtx); + + if (!SLOT_OCCUPIED(sramCtx, 0) && !SLOT_OCCUPIED(sramCtx, 1) && !SLOT_OCCUPIED(sramCtx, 2)) { + this->configMode++; // = CM_FADE_IN_END + } else { + this->menuMode = FS_MENU_MODE_CONFIG; + this->configMode = CM_FADE_IN_START; + this->nextTitleLabel = FS_TITLE_OPEN_FILE; + } + } + + if (this->configMode == CM_FADE_IN_END) { + sScreenFillAlpha -= 40; + if (sScreenFillAlpha <= 0) { + sScreenFillAlpha = 0; + this->configMode++; // = CM_MAIN_MENU + } + } else if (this->configMode == CM_MAIN_MENU) { + FileSelect_UpdateInitialLanguageMenu(this); + } else { + sScreenFillAlpha += 40; + if (sScreenFillAlpha >= 255) { + sScreenFillAlpha = 255; + this->menuMode = FS_MENU_MODE_CONFIG; + this->configMode = CM_FADE_IN_START; + this->nextTitleLabel = FS_TITLE_OPEN_FILE; + } + } +#endif } void FileSelect_InitModeDraw(GameState* thisx) { +#if OOT_PAL_N64 + FileSelectState* this = (FileSelectState*)thisx; + + Gfx_SetupDL_39Opa(this->state.gfxCtx); + FileSelect_DrawInitialLanguageMenu(this); +#endif } /** @@ -530,13 +838,16 @@ static s16 D_80812848[] = { 0x0274, 0x0278 }; void FileSelect_SetWindowContentVtx(GameState* thisx) { FileSelectState* this = (FileSelectState*)thisx; + SramContext* sramCtx = &this->sramCtx; s16 phi_t2; s16 phi_t0; s16 phi_t5; s16 phi_a1; s16 phi_ra; s16 temp_t1; - SramContext* sramCtx = &this->sramCtx; +#if OOT_PAL_N64 + u8 fileNameChar; +#endif this->windowContentVtx = GRAPH_ALLOC(this->state.gfxCtx, 0x288 * sizeof(Vtx)); @@ -689,8 +1000,14 @@ void FileSelect_SetWindowContentVtx(GameState* thisx) { temp_t1 += 2; for (phi_a1 = 0; phi_a1 < 8; phi_a1++, phi_t2 += 4, phi_t0 += WREG(40)) { +#if OOT_VERSION == PAL_1_1 + fileNameChar = this->fileNames[phi_t5][phi_a1]; this->windowContentVtx[phi_t2].v.ob[0] = this->windowContentVtx[phi_t2 + 2].v.ob[0] = - WREG(41) + phi_t0 + 0x40; + phi_t0 + 0x40 + WREG(41) + D_808124C0[fileNameChar]; +#else + this->windowContentVtx[phi_t2].v.ob[0] = this->windowContentVtx[phi_t2 + 2].v.ob[0] = + phi_t0 + 0x40 + WREG(41); +#endif this->windowContentVtx[phi_t2 + 1].v.ob[0] = this->windowContentVtx[phi_t2 + 3].v.ob[0] = this->windowContentVtx[phi_t2].v.ob[0] + WREG(42); this->windowContentVtx[phi_t2].v.ob[1] = this->windowContentVtx[phi_t2 + 1].v.ob[1] = temp_t1 - 3; @@ -825,18 +1142,33 @@ static void* sSaveXTextures[] = { gFileSelSaveXJPNTex, gFileSelSaveXENGTex }; #endif static s16 sNamePrimColors[2][3] = { { 255, 255, 255 }, { 100, 100, 100 } }; + +#if !OOT_PAL_N64 static void* sHeartTextures[] = { gHeartFullTex, gDefenseHeartFullTex }; +#else +static void* sHeartTextures[][5] = { + { gHeartEmptyTex, gHeartQuarterTex, gHeartHalfTex, gHeartThreeQuarterTex, gHeartFullTex }, + { gDefenseHeartEmptyTex, gDefenseHeartQuarterTex, gDefenseHeartHalfTex, gDefenseHeartThreeQuarterTex, + gDefenseHeartFullTex }, +}; +static u8 sHeartTextureIndices[16] = { 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3 }; +#endif + static s16 sHeartPrimColors[2][3] = { { 255, 70, 50 }, { 200, 0, 0 } }; static s16 sHeartEnvColors[2][3] = { { 50, 40, 60 }, { 255, 255, 255 } }; void FileSelect_DrawFileInfo(GameState* thisx, s16 fileIndex, s16 isActive) { FileSelectState* this = (FileSelectState*)thisx; Font* sp54 = &this->font; - s16 heartType; - s16 vtxOffset; s16 i; s16 j; s16 k; +#if OOT_PAL_N64 + s16 health; + s16 heartTextureIndex; +#endif + s16 heartType; + s16 vtxOffset; s16 deathCountSplit[3]; OPEN_DISPS(this->state.gfxCtx, "../z_file_choose.c", 1709); @@ -886,12 +1218,37 @@ void FileSelect_DrawFileInfo(GameState* thisx, s16 fileIndex, s16 isActive) { k = this->healthCapacities[fileIndex] / 0x10; +#if !OOT_PAL_N64 // draw hearts for (vtxOffset = 0, j = 0; j < k; j++, vtxOffset += 4) { gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[D_8081284C[fileIndex] + vtxOffset] + 0x30, 4, 0); - POLY_OPA_DISP = FileSelect_QuadTextureIA8(POLY_OPA_DISP, sHeartTextures[heartType], 0x10, 0x10, 0); } +#else + health = this->health[fileIndex]; + if (health <= 48) { // 3 hearts + health = 48; + } + heartTextureIndex = 4; + + // draw hearts + for (vtxOffset = 0, j = 0; j < k; j++, vtxOffset += 4) { + if (health < 16) { + if (health != 0) { + heartTextureIndex = sHeartTextureIndices[health]; + health = 0; + } else { + heartTextureIndex = 0; + } + } else { + health -= 16; + } + + gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[D_8081284C[fileIndex] + vtxOffset] + 0x30, 4, 0); + POLY_OPA_DISP = + FileSelect_QuadTextureIA8(POLY_OPA_DISP, sHeartTextures[heartType][heartTextureIndex], 0x10, 0x10, 0); + } +#endif gDPPipeSync(POLY_OPA_DISP++); @@ -1672,6 +2029,9 @@ void FileSelect_Main(GameState* thisx) { gSPSegment(POLY_OPA_DISP++, 0x00, NULL); gSPSegment(POLY_OPA_DISP++, 0x01, this->staticSegment); gSPSegment(POLY_OPA_DISP++, 0x02, this->parameterSegment); +#if OOT_PAL_N64 + gSPSegment(POLY_OPA_DISP++, 0x06, this->objectMagSegment); +#endif Gfx_SetupFrame(this->state.gfxCtx, 0, 0, 0); @@ -1766,7 +2126,7 @@ void FileSelect_Main(GameState* thisx) { void FileSelect_InitContext(GameState* thisx) { FileSelectState* this = (FileSelectState*)thisx; EnvironmentContext* envCtx = &this->envCtx; -#if OOT_PAL +#if PLATFORM_GC && OOT_PAL SramContext* sramCtx = &this->sramCtx; #endif @@ -1927,7 +2287,7 @@ void FileSelect_InitContext(GameState* thisx) { this->n64ddFlags[0] = this->n64ddFlags[1] = this->n64ddFlags[2] = this->defense[0] = this->defense[1] = this->defense[2] = 0; -#if OOT_PAL +#if PLATFORM_GC && OOT_PAL SsSram_ReadWrite(OS_K1_TO_PHYSICAL(0xA8000000), sramCtx->readBuff, SRAM_SIZE, OS_READ); gSaveContext.language = sramCtx->readBuff[SRAM_HEADER_LANGUAGE]; @@ -1943,8 +2303,8 @@ void FileSelect_Destroy(GameState* thisx) { void FileSelect_Init(GameState* thisx) { FileSelectState* this = (FileSelectState*)thisx; - u32 size = (uintptr_t)_title_staticSegmentRomEnd - (uintptr_t)_title_staticSegmentRomStart; s32 pad; + u32 size = (uintptr_t)_title_staticSegmentRomEnd - (uintptr_t)_title_staticSegmentRomStart; #if PLATFORM_N64 if (D_80121212 != 0) { @@ -1952,7 +2312,11 @@ void FileSelect_Init(GameState* thisx) { } #endif +#if !OOT_PAL_N64 SREG(30) = 1; +#else + SREG(30) = 2; +#endif PRINTF("SIZE=%x\n", size); this->staticSegment = GAME_STATE_ALLOC(&this->state, size, "../z_file_choose.c", 3392); @@ -1965,6 +2329,12 @@ void FileSelect_Init(GameState* thisx) { DMA_REQUEST_SYNC(this->parameterSegment, (uintptr_t)_parameter_staticSegmentRomStart, size, "../z_file_choose.c", 3400); +#if OOT_PAL_N64 + size = gObjectTable[OBJECT_MAG].vromEnd - gObjectTable[OBJECT_MAG].vromStart; + this->objectMagSegment = GAME_STATE_ALLOC(&this->state, size, "../z_file_choose.c", 0); + DMA_REQUEST_SYNC(this->objectMagSegment, gObjectTable[OBJECT_MAG].vromStart, size, "../z_file_choose.c", 0); +#endif + Matrix_Init(&this->state); View_Init(&this->view, this->state.gfxCtx); this->state.main = FileSelect_Main; diff --git a/src/overlays/gamestates/ovl_file_choose/z_file_nameset.c b/src/overlays/gamestates/ovl_file_choose/z_file_nameset.c index 39a107926c..c800fda301 100644 --- a/src/overlays/gamestates/ovl_file_choose/z_file_nameset.c +++ b/src/overlays/gamestates/ovl_file_choose/z_file_nameset.c @@ -29,21 +29,25 @@ void FileSelect_DrawCharacterTransition(GraphicsContext* gfxCtx, void* texture1, #endif #if OOT_PAL -static s16 D_808124C0[] = { - 0x0002, 0x0003, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0001, 0x0002, 0x0000, 0x0001, - 0x0001, 0x0002, 0x0001, 0x0001, 0x0004, 0x0002, 0x0002, 0x0002, 0x0001, 0x0001, 0x0000, 0x0002, 0x0000, 0x0001, - 0x0001, 0x0001, 0x0001, 0x0001, 0x0000, 0x0001, 0x0001, 0x0001, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0003, - 0x0002, 0x0002, 0x0004, 0x0003, 0x0002, 0x0004, 0x0001, 0x0002, 0x0002, 0x0001, 0x0001, 0x0002, 0x0002, 0x0003, - 0x0002, 0x0002, 0x0000, 0x0002, 0x0002, 0x0002, 0x0000, 0x0003, 0x0001, 0x0000, + +#if OOT_VERSION >= PAL_1_1 +s16 D_808124C0[] = { + 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 0, 1, 1, 2, 1, 1, 4, 2, 2, 2, 1, 1, 0, 2, 0, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 2, 2, 2, 2, 2, 3, 2, 2, 4, 3, 2, 4, 1, 2, 2, 1, 1, 2, 2, 3, 2, 2, 0, 2, 2, 2, 0, 3, 1, 0, +}; +#endif + +s16 D_80812544[] = { +#if OOT_VERSION < PAL_1_1 + 1, 2, 0, 1, 1, 2, 1, 2, 4, 2, 2, 2, 1, 1, 0, 2, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 2, 2, 2, 2, 3, + 2, 2, 4, 3, 2, 4, 1, 2, 2, 1, 1, 2, 2, 3, 2, 2, 0, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, +#else + // Differs only at index 7 + 1, 2, 0, 1, 1, 2, 1, 1, 4, 2, 2, 2, 1, 1, 0, 2, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 2, 2, 2, 2, 3, + 2, 2, 4, 3, 2, 4, 1, 2, 2, 1, 1, 2, 2, 3, 2, 2, 0, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, +#endif }; -static s16 D_80812544[] = { - 0x0001, 0x0002, 0x0000, 0x0001, 0x0001, 0x0002, 0x0001, 0x0001, 0x0004, 0x0002, 0x0002, 0x0002, 0x0001, - 0x0001, 0x0000, 0x0002, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000, 0x0001, 0x0001, 0x0001, - 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0003, 0x0002, 0x0002, 0x0004, 0x0003, 0x0002, 0x0004, 0x0001, - 0x0002, 0x0002, 0x0001, 0x0001, 0x0002, 0x0002, 0x0003, 0x0002, 0x0002, 0x0000, 0x0002, 0x0002, 0x0002, - 0x0003, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0001, 0x0003, -}; #endif void FileSelect_SetKeyboardVtx(GameState* thisx) { @@ -245,10 +249,15 @@ void FileSelect_SetNameEntryVtx(GameState* thisx) { this->nameEntryVtx[phi_t1].v.ob[0] + 0xA; #else if ((phi_s0 > 0) && (phi_s0 < 9)) { +#if OOT_VERSION >= PAL_1_1 temp = this->fileNames[this->buttonIndex][phi_s0 - 1]; this->nameEntryVtx[phi_t1].v.ob[0] = this->nameEntryVtx[phi_t1 + 2].v.ob[0] = D_808125EC[phi_s0] + this->nameEntryBoxPosX + D_808124C0[temp]; +#else + this->nameEntryVtx[phi_t1].v.ob[0] = this->nameEntryVtx[phi_t1 + 2].v.ob[0] = + D_808125EC[phi_s0] + this->nameEntryBoxPosX; +#endif this->nameEntryVtx[phi_t1 + 1].v.ob[0] = this->nameEntryVtx[phi_t1 + 3].v.ob[0] = this->nameEntryVtx[phi_t1].v.ob[0] + 0xA; @@ -985,11 +994,12 @@ void FileSelect_StartNameEntry(GameState* thisx) { void FileSelect_UpdateKeyboardCursor(GameState* thisx) { FileSelectState* this = (FileSelectState*)thisx; s16 prevKbdX; - -#if OOT_NTSC +#if !(PLATFORM_GC && OOT_PAL) Input* input = &this->state.input[0]; s32 pad; +#endif +#if OOT_NTSC if (this->charPage <= FS_CHAR_PAGE_ENG) { if (CHECK_BTN_ALL(input->press.button, BTN_R)) { if (gSaveContext.language == LANGUAGE_JPN) { @@ -1332,6 +1342,9 @@ void FileSelect_UpdateOptionsMenu(GameState* thisx) { this->configMode = CM_OPTIONS_TO_MAIN; sramCtx->readBuff[0] = gSaveContext.audioSetting; sramCtx->readBuff[1] = gSaveContext.zTargetSetting; +#if OOT_PAL_N64 + sramCtx->readBuff[2] = gSaveContext.language; +#endif PRINTF("SAVE"); Sram_WriteSramHeader(sramCtx); PRINTF(VT_FGCOL(YELLOW)); @@ -1358,7 +1371,18 @@ void FileSelect_UpdateOptionsMenu(GameState* thisx) { gSaveContext.audioSetting = FS_AUDIO_SURROUND; } } else { +#if !OOT_PAL_N64 gSaveContext.zTargetSetting ^= 1; +#else + if (sSelectedSetting == FS_SETTING_TARGET) { + gSaveContext.zTargetSetting ^= 1; + } else { + gSaveContext.language--; + if (gSaveContext.language >= LANGUAGE_MAX) { + gSaveContext.language = LANGUAGE_MAX - 1; + } + } +#endif } } else if (this->stickAdjX > 30) { Audio_PlaySfxGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, @@ -1371,10 +1395,22 @@ void FileSelect_UpdateOptionsMenu(GameState* thisx) { gSaveContext.audioSetting = FS_AUDIO_STEREO; } } else { +#if !OOT_PAL_N64 gSaveContext.zTargetSetting ^= 1; +#else + if (sSelectedSetting == FS_SETTING_TARGET) { + gSaveContext.zTargetSetting ^= 1; + } else { + gSaveContext.language++; + if (gSaveContext.language >= LANGUAGE_MAX) { + gSaveContext.language = 0; + } + } +#endif } } +#if !OOT_PAL_N64 if ((this->stickAdjY < -30) || (this->stickAdjY > 30)) { Audio_PlaySfxGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); @@ -1384,19 +1420,108 @@ void FileSelect_UpdateOptionsMenu(GameState* thisx) { &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); sSelectedSetting ^= 1; } +#else + if (this->stickAdjY < -30) { + Audio_PlaySfxGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, + &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + sSelectedSetting++; + if (sSelectedSetting >= FS_SETTING_MAX) { + sSelectedSetting = 0; + } + } else if (this->stickAdjY > 30) { + Audio_PlaySfxGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, + &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + sSelectedSetting--; + if (sSelectedSetting >= FS_SETTING_MAX) { + sSelectedSetting = FS_SETTING_MAX - 1; + } + } else if (CHECK_BTN_ALL(input->press.button, BTN_A)) { + Audio_PlaySfxGeneral(NA_SE_SY_FSEL_DECIDE_L, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, + &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + sSelectedSetting++; + if (sSelectedSetting >= FS_SETTING_MAX) { + sSelectedSetting = 0; + } + } +#endif } #if OOT_NTSC + typedef struct OptionsMenuTextureInfo { /* 0x00 */ void* texture[2]; /* 0x08 */ u16 width; /* 0x0A */ u16 height; } OptionsMenuTextureInfo; // size = 0x0C -#define OPTIONS_MENU_TEXTURE_WIDTHS(jpn, eng, ger, fra) jpn #define OPTIONS_MENU_TEXTURE_WIDTH(info) info.width #define OPTIONS_MENU_TEXTURE_HEIGHT(info) info.height + +static OptionsMenuTextureInfo sOptionsMenuHeaders[] = { + { { gFileSelOptionsJPNTex, gFileSelOptionsENGTex }, 128, 16 }, + { { gFileSelSOUNDENGTex, gFileSelSOUNDENGTex }, 64, 16 }, + { { gFileSelZTargetingJPNTex, gFileSelZTargetingENGTex }, 64, 16 }, + { { gFileSelCheckBrightnessJPNTex, gFileSelCheckBrightnessENGTex }, 96, 16 }, +}; + +static OptionsMenuTextureInfo sOptionsMenuSettings[] = { + { { gFileSelStereoJPNTex, gFileSelStereoENGTex }, 48, 16 }, + { { gFileSelMonoJPNTex, gFileSelMonoENGTex }, 48, 16 }, + { { gFileSelHeadsetJPNTex, gFileSelHeadsetENGTex }, 48, 16 }, + { { gFileSelSurroundJPNTex, gFileSelSurroundENGTex }, 48, 16 }, + { { gFileSelSwitchJPNTex, gFileSelSwitchENGTex }, 48, 16 }, + { { gFileSelHoldJPNTex, gFileSelHoldENGTex }, 48, 16 }, +}; + +#elif OOT_PAL_N64 + +static u16 sZTargetSettingWidths[2][3] = { + { 48, 80, 48 }, + { 48, 80, 48 }, +}; + +typedef struct LanguageChoiceTextureInfo { + /* 0x00 */ void* texture; + /* 0x04 */ u16 width; + /* 0x06 */ u16 height; +} LanguageChoiceTextureInfo; // size = 0x10 + +static LanguageChoiceTextureInfo sLanguageChoices[] = { + { gFileSelLanguageChoiceENGTex, 48, 16 }, + { gFileSelLanguageChoiceGERTex, 48, 16 }, + { gFileSelLanguageChoiceFRATex, 48, 16 }, +}; + +typedef struct OptionsMenuTextureInfo { + /* 0x00 */ void* texture[3]; + /* 0x0C */ u16 width; + /* 0x0E */ u16 height; +} OptionsMenuTextureInfo; // size = 0x10 + +#define OPTIONS_MENU_TEXTURE_WIDTH(info) info.width +#define OPTIONS_MENU_TEXTURE_HEIGHT(info) info.height + +static OptionsMenuTextureInfo sOptionsMenuHeaders[] = { + { { gFileSelOptionsENGTex, gFileSelOptionsGERTex, gFileSelOptionsENGTex }, 128, 16 }, + { { gFileSelSOUNDENGTex, gFileSelSOUNDENGTex, gFileSelSOUNDFRATex }, 64, 16 }, + { { gFileSelZTargetingENGTex, gFileSelZTargetingGERTex, gFileSelZTargetingFRATex }, 64, 16 }, + { { gFileSelCheckBrightnessENGTex, gFileSelCheckBrightnessGERTex, gFileSelCheckBrightnessFRATex }, 128, 16 }, + { { gFileSelLanguageENGTex, gFileSelLanguageGERTex, gFileSelLanguageFRATex }, 64, 16 }, +}; + +static OptionsMenuTextureInfo sOptionsMenuSettings[] = { + { { gFileSelStereoENGTex, gFileSelStereoENGTex, gFileSelStereoFRATex }, 48, 16 }, + { { gFileSelMonoENGTex, gFileSelMonoENGTex, gFileSelMonoENGTex }, 48, 16 }, + { { gFileSelHeadsetENGTex, gFileSelHeadsetGERTex, gFileSelHeadsetFRATex }, 48, 16 }, + { { gFileSelSurroundENGTex, gFileSelSurroundENGTex, gFileSelSurroundENGTex }, 48, 16 }, + { { gFileSelSwitchENGTex, gFileSelSwitchGERTex, gFileSelSwitchFRATex }, 48, 16 }, + { { gFileSelHoldENGTex, gFileSelHoldGERTex, gFileSelHoldFRATex }, 48, 16 }, + { { gFileSelSwitchENGTex, gFileSelSwitchGERTex, gFileSelSwitchFRATex }, 48, 16 }, + { { gFileSelHoldENGTex, gFileSelHoldGERTex, gFileSelHoldFRATex }, 48, 16 }, +}; + #else + typedef struct OptionsMenuTextureInfo { /* 0x00 */ void* texture[3]; /* 0x0C */ u16 width[3]; @@ -1407,66 +1532,27 @@ typedef struct OptionsMenuTextureInfo { { eng, ger, fra } #define OPTIONS_MENU_TEXTURE_WIDTH(info) info.width[gSaveContext.language] #define OPTIONS_MENU_TEXTURE_HEIGHT(info) info.height -#endif static OptionsMenuTextureInfo sOptionsMenuHeaders[] = { - { - LANGUAGE_ARRAY(gFileSelOptionsJPNTex, gFileSelOptionsENGTex, gFileSelOptionsGERTex, gFileSelOptionsENGTex), - OPTIONS_MENU_TEXTURE_WIDTHS(128, 128, 128, 128), - 16, - }, - { - LANGUAGE_ARRAY(gFileSelSOUNDENGTex, gFileSelSOUNDENGTex, gFileSelSOUNDENGTex, gFileSelSOUNDFRATex), - OPTIONS_MENU_TEXTURE_WIDTHS(64, 64, 64, 64), - 16, - }, - { - LANGUAGE_ARRAY(gFileSelZTargetingJPNTex, gFileSelZTargetingENGTex, gFileSelZTargetingGERTex, - gFileSelZTargetingFRATex), - OPTIONS_MENU_TEXTURE_WIDTHS(64, 64, 144, 64), - 16, - }, - { - LANGUAGE_ARRAY(gFileSelCheckBrightnessJPNTex, gFileSelCheckBrightnessENGTex, gFileSelCheckBrightnessGERTex, - gFileSelCheckBrightnessFRATex), - OPTIONS_MENU_TEXTURE_WIDTHS(96, 128, 128, 128), - 16, - }, + { { gFileSelOptionsENGTex, gFileSelOptionsGERTex, gFileSelOptionsENGTex }, { 128, 128, 128 }, 16 }, + { { gFileSelSOUNDENGTex, gFileSelSOUNDENGTex, gFileSelSOUNDFRATex }, { 64, 64, 64 }, 16 }, + { { gFileSelZTargetingENGTex, gFileSelZTargetingGERTex, gFileSelZTargetingFRATex }, { 64, 144, 64 }, 16 }, + { { gFileSelCheckBrightnessENGTex, gFileSelCheckBrightnessGERTex, gFileSelCheckBrightnessFRATex }, + { 128, 128, 128 }, + 16 }, }; static OptionsMenuTextureInfo sOptionsMenuSettings[] = { - { - LANGUAGE_ARRAY(gFileSelStereoJPNTex, gFileSelStereoENGTex, gFileSelStereoENGTex, gFileSelStereoFRATex), - OPTIONS_MENU_TEXTURE_WIDTHS(48, 48, 48, 48), - 16, - }, - { - LANGUAGE_ARRAY(gFileSelMonoJPNTex, gFileSelMonoENGTex, gFileSelMonoENGTex, gFileSelMonoENGTex), - OPTIONS_MENU_TEXTURE_WIDTHS(48, 48, 48, 48), - 16, - }, - { - LANGUAGE_ARRAY(gFileSelHeadsetJPNTex, gFileSelHeadsetENGTex, gFileSelHeadsetGERTex, gFileSelHeadsetFRATex), - OPTIONS_MENU_TEXTURE_WIDTHS(48, 48, 48, 48), - 16, - }, - { - LANGUAGE_ARRAY(gFileSelSurroundJPNTex, gFileSelSurroundENGTex, gFileSelSurroundENGTex, gFileSelSurroundENGTex), - OPTIONS_MENU_TEXTURE_WIDTHS(48, 48, 48, 48), - 16, - }, - { - LANGUAGE_ARRAY(gFileSelSwitchJPNTex, gFileSelSwitchENGTex, gFileSelSwitchGERTex, gFileSelSwitchFRATex), - OPTIONS_MENU_TEXTURE_WIDTHS(48, 48, 80, 48), - 16, - }, - { - LANGUAGE_ARRAY(gFileSelHoldJPNTex, gFileSelHoldENGTex, gFileSelHoldGERTex, gFileSelHoldFRATex), - OPTIONS_MENU_TEXTURE_WIDTHS(48, 48, 80, 48), - 16, - }, + { { gFileSelStereoENGTex, gFileSelStereoENGTex, gFileSelStereoFRATex }, { 48, 48, 48 }, 16 }, + { { gFileSelMonoENGTex, gFileSelMonoENGTex, gFileSelMonoENGTex }, { 48, 48, 48 }, 16 }, + { { gFileSelHeadsetENGTex, gFileSelHeadsetGERTex, gFileSelHeadsetFRATex }, { 48, 48, 48 }, 16 }, + { { gFileSelSurroundENGTex, gFileSelSurroundENGTex, gFileSelSurroundENGTex }, { 48, 48, 48 }, 16 }, + { { gFileSelSwitchENGTex, gFileSelSwitchGERTex, gFileSelSwitchFRATex }, { 48, 80, 48 }, 16 }, + { { gFileSelHoldENGTex, gFileSelHoldGERTex, gFileSelHoldFRATex }, { 48, 80, 48 }, 16 }, }; +#endif + void FileSelect_DrawOptionsImpl(GameState* thisx) { static s16 cursorPrimRed = 255; static s16 cursorPrimGreen = 255; @@ -1488,9 +1574,17 @@ void FileSelect_DrawOptionsImpl(GameState* thisx) { s16 cursorRed; s16 cursorGreen; s16 cursorBlue; +#if !OOT_PAL_N64 s16 i; s16 j; s16 vtx; +#else + s16 startIndex; + s32 endIndex; + s32 i; + s32 vtx; + s32 pad; +#endif OPEN_DISPS(this->state.gfxCtx, "../z_file_nameset_PAL.c", 848); @@ -1557,7 +1651,7 @@ void FileSelect_DrawOptionsImpl(GameState* thisx) { #if OOT_NTSC gSPVertex(POLY_OPA_DISP++, gOptionsMenuHeadersVtx, 32, 0); #elif OOT_PAL_N64 - // TODO: implement PAL N64 version + gSPVertex(POLY_OPA_DISP++, gOptionsMenuHeadersVtx, 24, 0); #else if (gSaveContext.language == LANGUAGE_GER) { gSPVertex(POLY_OPA_DISP++, gOptionsMenuHeadersGERVtx, 32, 0); @@ -1572,6 +1666,7 @@ void FileSelect_DrawOptionsImpl(GameState* thisx) { gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, this->titleAlpha[0]); gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255); +#if !OOT_PAL_N64 for (i = 0, vtx = 0; i < 4; i++, vtx += 4) { gDPLoadTextureBlock(POLY_OPA_DISP++, sOptionsMenuHeaders[i].texture[gSaveContext.language], G_IM_FMT_IA, G_IM_SIZ_8b, OPTIONS_MENU_TEXTURE_WIDTH(sOptionsMenuHeaders[i]), @@ -1579,11 +1674,28 @@ void FileSelect_DrawOptionsImpl(GameState* thisx) { G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); gSP1Quadrangle(POLY_OPA_DISP++, vtx, vtx + 2, vtx + 3, vtx + 1, 0); } +#else + for (i = 0, vtx = 0; i < 5; i++, vtx += 4) { + if (i == 2 && gSaveContext.language == LANGUAGE_GER) { + gDPLoadTextureBlock(POLY_OPA_DISP++, sOptionsMenuHeaders[i].texture[gSaveContext.language], G_IM_FMT_IA, + G_IM_SIZ_8b, 144, OPTIONS_MENU_TEXTURE_HEIGHT(sOptionsMenuHeaders[i]), 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, + G_TX_NOLOD, G_TX_NOLOD); + gSP1Quadrangle(POLY_OPA_DISP++, vtx + 12, vtx + 14, vtx + 15, vtx + 13, 0); + } else { + gDPLoadTextureBlock(POLY_OPA_DISP++, sOptionsMenuHeaders[i].texture[gSaveContext.language], G_IM_FMT_IA, + G_IM_SIZ_8b, OPTIONS_MENU_TEXTURE_WIDTH(sOptionsMenuHeaders[i]), + OPTIONS_MENU_TEXTURE_HEIGHT(sOptionsMenuHeaders[i]), 0, G_TX_NOMIRROR | G_TX_WRAP, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + gSP1Quadrangle(POLY_OPA_DISP++, vtx, vtx + 2, vtx + 3, vtx + 1, 0); + } + } +#endif #if OOT_NTSC gSPVertex(POLY_OPA_DISP++, gOptionsMenuSettingsVtx, 32, 0); #elif OOT_PAL_N64 - // TODO: implement PAL N64 version + gSPVertex(POLY_OPA_DISP++, gOptionsMenuSettingsVtx, 32, 0); #else if (gSaveContext.language == LANGUAGE_GER) { gSPVertex(POLY_OPA_DISP++, gOptionsMenuSettingsGERVtx, 32, 0); @@ -1617,6 +1729,7 @@ void FileSelect_DrawOptionsImpl(GameState* thisx) { gSP1Quadrangle(POLY_OPA_DISP++, vtx, vtx + 2, vtx + 3, vtx + 1, 0); } +#if !OOT_PAL_N64 for (; i < 6; i++, vtx += 4) { gDPPipeSync(POLY_OPA_DISP++); @@ -1643,6 +1756,46 @@ void FileSelect_DrawOptionsImpl(GameState* thisx) { G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); gSP1Quadrangle(POLY_OPA_DISP++, vtx, vtx + 2, vtx + 3, vtx + 1, 0); } +#else + if (gSaveContext.language == LANGUAGE_GER) { + endIndex = 8; + startIndex = 6; + i += 2; + vtx += 8; + } else { + endIndex = 6; + startIndex = 4; + } + + for (; i < endIndex; i++, vtx += 4) { + s32 j = i - startIndex; + + gDPPipeSync(POLY_OPA_DISP++); + + if (j == gSaveContext.zTargetSetting) { + if (sSelectedSetting == FS_SETTING_TARGET) { + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, cursorPrimRed, cursorPrimGreen, cursorPrimBlue, + this->titleAlpha[0]); + gDPSetEnvColor(POLY_OPA_DISP++, cursorEnvRed, cursorEnvGreen, cursorEnvBlue, 0xFF); + } else { + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, this->titleAlpha[0]); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255); + } + } else { + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 120, 120, 120, this->titleAlpha[0]); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255); + } + + gDPLoadTextureBlock(POLY_OPA_DISP++, sOptionsMenuSettings[i].texture[gSaveContext.language], G_IM_FMT_IA, + G_IM_SIZ_8b, sZTargetSettingWidths[j][gSaveContext.language], + OPTIONS_MENU_TEXTURE_HEIGHT(sOptionsMenuHeaders[i]), 0, G_TX_NOMIRROR | G_TX_WRAP, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + gSP1Quadrangle(POLY_OPA_DISP++, vtx, vtx + 2, vtx + 3, vtx + 1, 0); + } + + gSPVertex(POLY_OPA_DISP++, gOptionsMenuBrightnessVtx, 8, 0); + vtx = 0; +#endif gDPPipeSync(POLY_OPA_DISP++); @@ -1663,6 +1816,33 @@ void FileSelect_DrawOptionsImpl(GameState* thisx) { vtx += 4; +#if OOT_PAL_N64 + gSPVertex(POLY_OPA_DISP++, gOptionsMenuLanguageVtx, 12, 0); + + for (i = 0, vtx = 0; i != LANGUAGE_MAX; i++, vtx += 4) { + gDPPipeSync(POLY_OPA_DISP++); + + if (i == gSaveContext.language) { + if (sSelectedSetting == FS_SETTING_LANGUAGE) { + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, cursorPrimRed, cursorPrimGreen, cursorPrimBlue, + this->titleAlpha[0]); + gDPSetEnvColor(POLY_OPA_DISP++, cursorEnvRed, cursorEnvGreen, cursorEnvBlue, 0xFF); + } else { + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, this->titleAlpha[0]); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255); + } + } else { + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 120, 120, 120, this->titleAlpha[0]); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255); + } + + gDPLoadTextureBlock(POLY_OPA_DISP++, sLanguageChoices[i].texture, G_IM_FMT_IA, G_IM_SIZ_8b, + sLanguageChoices[i].width, sLanguageChoices[i].height, 0, G_TX_NOMIRROR | G_TX_WRAP, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + gSP1Quadrangle(POLY_OPA_DISP++, vtx, vtx + 2, vtx + 3, vtx + 1, 0); + } +#endif + // blue divider lines gDPPipeSync(POLY_OPA_DISP++); gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 0, 255, 255, this->titleAlpha[0]); @@ -1694,6 +1874,15 @@ void FileSelect_DrawOptionsImpl(GameState* thisx) { gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0); Matrix_Pop(); +#if OOT_PAL_N64 + Matrix_Push(); + Matrix_Translate(0.0f, 0.8f, 0.0f, MTXMODE_APPLY); + MATRIX_FINALIZE_AND_LOAD(POLY_OPA_DISP++, this->state.gfxCtx, "../z_file_nameset_PAL.c", 0); + gSPVertex(POLY_OPA_DISP++, gOptionsDividerLanguageVtx, 4, 0); + gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0); + Matrix_Pop(); +#endif + CLOSE_DISPS(this->state.gfxCtx, "../z_file_nameset_PAL.c", 1040); }