diff --git a/BUILDING.md b/BUILDING.md index 726b8a99c..0a444ca4a 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -41,9 +41,9 @@ cp /usr/local/lib/libGLEW.a external cd soh # Extract the assets/Compile the exporter/Run the exporter -make setup -j$(nproc) OPTFLAGS=-O0 DEBUG=0 +make setup -j$(nproc) OPTFLAGS=-O2 DEBUG=0 # Compile the code -make -j $(nproc) OPTFLAGS=-O0 DEBUG=0 +make -j $(nproc) OPTFLAGS=-O2 DEBUG=0 ``` # Compatible Roms diff --git a/libultraship/libultraship/SohImGuiImpl.cpp b/libultraship/libultraship/SohImGuiImpl.cpp index 704ad0700..6a260160c 100644 --- a/libultraship/libultraship/SohImGuiImpl.cpp +++ b/libultraship/libultraship/SohImGuiImpl.cpp @@ -46,9 +46,9 @@ bool oldCursorState = true; #define EXPERIMENTAL() \ ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(255, 50, 50, 255)); \ - ImGui::Text("Experimental"); \ - ImGui::PopStyleColor(); \ - ImGui::Separator(); + ImGui::Text("Experimental"); \ + ImGui::PopStyleColor(); \ + ImGui::Separator(); #define TOGGLE_BTN ImGuiKey_F1 #define HOOK(b) if(b) needs_save = true; OSContPad* pads; @@ -348,10 +348,10 @@ namespace SohImGui { } for (size_t pixel = 0; pixel < texBuffer.size() / 4; pixel++) { - texBuffer[pixel * 4 + 0] *= tint.x; - texBuffer[pixel * 4 + 1] *= tint.y; - texBuffer[pixel * 4 + 2] *= tint.z; - texBuffer[pixel * 4 + 3] *= tint.w; + texBuffer[pixel * 4 + 0] *= (uint8_t)tint.x; + texBuffer[pixel * 4 + 1] *= (uint8_t)tint.y; + texBuffer[pixel * 4 + 2] *= (uint8_t)tint.z; + texBuffer[pixel * 4 + 3] *= (uint8_t)tint.w; } const auto asset = new GameAsset{ api->new_texture() }; @@ -436,7 +436,7 @@ namespace SohImGui { } } - void EnhancementRadioButton(std::string text, std::string cvarName, int id) { + void EnhancementRadioButton(const char* text, const char* cvarName, int id) { /*Usage : EnhancementRadioButton("My Visible Name","gMyCVarName", MyID); First arg is the visible name of the Radio button @@ -447,113 +447,117 @@ namespace SohImGui { EnhancementRadioButton("German", "gLanguages", 1); EnhancementRadioButton("French", "gLanguages", 2); */ - int val = CVar_GetS32(cvarName.c_str(), 0); - if (ImGui::RadioButton(text.c_str(), id == val)) { - CVar_SetS32(cvarName.c_str(), (int)id); + int val = CVar_GetS32(cvarName, 0); + if (ImGui::RadioButton(text, id == val)) { + CVar_SetS32(cvarName, id); needs_save = true; } } - void EnhancementCheckbox(std::string text, std::string cvarName) + void EnhancementCheckbox(const char* text, const char* cvarName) { - bool val = (bool)CVar_GetS32(cvarName.c_str(), 0); - if (ImGui::Checkbox(text.c_str(), &val)) { - CVar_SetS32(cvarName.c_str(), val); + bool val = (bool)CVar_GetS32(cvarName, 0); + if (ImGui::Checkbox(text, &val)) { + CVar_SetS32(cvarName, val); needs_save = true; } } - void EnhancementButton(std::string text, std::string cvarName) + void EnhancementButton(const char* text, const char* cvarName) { - bool val = (bool)CVar_GetS32(cvarName.c_str(), 0); - if (ImGui::Button(text.c_str())) { - CVar_SetS32(cvarName.c_str(), !val); + bool val = (bool)CVar_GetS32(cvarName, 0); + if (ImGui::Button(text)) { + CVar_SetS32(cvarName, !val); + CVar_SetS32(cvarName, !val); needs_save = true; } } - void EnhancementSliderInt(std::string text, std::string id, std::string cvarName, int min, int max, std::string format) + void EnhancementSliderInt(const char* text, const char* id, const char* cvarName, int min, int max, const char* format) { - int val = CVar_GetS32(cvarName.c_str(), 0); + int val = CVar_GetS32(cvarName, 0); - ImGui::Text(text.c_str(), val); + ImGui::Text(text, val); - if (ImGui::SliderInt(id.c_str(), &val, min, max, format.c_str())) + if (ImGui::SliderInt(id, &val, min, max, format)) { - CVar_SetS32(cvarName.c_str(), val); + CVar_SetS32(cvarName, val); needs_save = true; } if (val < min) { val = min; - CVar_SetS32(cvarName.c_str(), val); + CVar_SetS32(cvarName, val); needs_save = true; } if (val > max) { val = max; - CVar_SetS32(cvarName.c_str(), val); + CVar_SetS32(cvarName, val); needs_save = true; } } - void EnhancementSliderFloat(std::string text, std::string id, std::string cvarName, float min, float max, std::string format, float defaultValue, bool isPercentage) + void EnhancementSliderFloat(const char* text, const char* id, const char* cvarName, float min, float max, const char* format, float defaultValue, bool isPercentage) { - float val = CVar_GetFloat(cvarName.c_str(), defaultValue); + float val = CVar_GetFloat(cvarName, defaultValue); if (!isPercentage) - ImGui::Text(text.c_str(), val); + ImGui::Text(text, val); else - ImGui::Text(text.c_str(), static_cast(100 * val)); + ImGui::Text(text, static_cast(100 * val)); - if (ImGui::SliderFloat(id.c_str(), &val, min, max, format.c_str())) + if (ImGui::SliderFloat(id, &val, min, max, format)) { - CVar_SetFloat(cvarName.c_str(), val); + CVar_SetFloat(cvarName, val); needs_save = true; } if (val < min) { val = min; - CVar_SetFloat(cvarName.c_str(), val); + CVar_SetFloat(cvarName, val); needs_save = true; } if (val > max) { val = max; - CVar_SetFloat(cvarName.c_str(), val); + CVar_SetFloat(cvarName, val); needs_save = true; } } - int ClampFloatToInt(float value, int min, int max){ - return fmin(fmax(value,min),max); + int ClampFloatToInt(float value, int min, int max) { + return fmin(fmax(value, min), max); } - void EnhancementColor3(std::string text, std::string cvarName, float ColorRGB[3], bool TitleSameLine) { + void EnhancementColor3(const char* text, const char* cvarName, float ColorRGB[3], bool TitleSameLine) { //Simplified. + std::string cvarNameString(cvarName); ImGuiColorEditFlags flags = ImGuiColorEditFlags_None; - if (!TitleSameLine){ - ImGui::Text("%s", text.c_str()); + + if (!TitleSameLine) { + ImGui::Text("%s", text); flags = ImGuiColorEditFlags_NoLabel; } - if (ImGui::ColorEdit3(text.c_str(), ColorRGB, flags)) { - CVar_SetS32((cvarName+"R").c_str(), ClampFloatToInt(ColorRGB[0]*255,0,255)); - CVar_SetS32((cvarName+"G").c_str(), ClampFloatToInt(ColorRGB[1]*255,0,255)); - CVar_SetS32((cvarName+"B").c_str(), ClampFloatToInt(ColorRGB[2]*255,0,255)); + if (ImGui::ColorEdit3(text, ColorRGB, flags)) { + CVar_SetS32((cvarNameString + "R").c_str(), ClampFloatToInt(ColorRGB[0] * 255, 0, 255)); + CVar_SetS32((cvarNameString + "G").c_str(), ClampFloatToInt(ColorRGB[1] * 255, 0, 255)); + CVar_SetS32((cvarNameString + "B").c_str(), ClampFloatToInt(ColorRGB[2] * 255, 0, 255)); needs_save = true; } } - void Tooltip(std::string text) { + + void Tooltip(const char* text) { if (ImGui::IsItemHovered()) - ImGui::SetTooltip("%s", text.c_str()); + ImGui::SetTooltip("%s", text); } - void DrawMainMenuAndCalculateGameSize() { + void DrawMainMenuAndCalculateGameSize(void) { console->Update(); ImGuiBackendNewFrame(); ImGuiWMNewFrame(); @@ -633,7 +637,7 @@ namespace SohImGui { auto menuLabel = "Controller " + std::to_string(i + 1); if (ImGui::BeginMenu(menuLabel.c_str())) { - EnhancementSliderFloat("Gyro Sensitivity: %d %%", "##GYROSCOPE", StringHelper::Sprintf("gCont%i_GyroSensitivity", i), 0.0f, 1.0f, "", 1.0f, true); + EnhancementSliderFloat("Gyro Sensitivity: %d %%", "##GYROSCOPE", StringHelper::Sprintf("gCont%i_GyroSensitivity", i).c_str(), 0.0f, 1.0f, "", 1.0f, true); if (ImGui::Button("Recalibrate Gyro")) { @@ -644,7 +648,7 @@ namespace SohImGui { ImGui::Separator(); - EnhancementSliderFloat("Rumble Strength: %d %%", "##RUMBLE", StringHelper::Sprintf("gCont%i_RumbleStrength", i), 0.0f, 1.0f, "", 1.0f, true); + EnhancementSliderFloat("Rumble Strength: %d %%", "##RUMBLE", StringHelper::Sprintf("gCont%i_RumbleStrength", i).c_str(), 0.0f, 1.0f, "", 1.0f, true); ImGui::EndMenu(); } @@ -723,9 +727,10 @@ namespace SohImGui { Tooltip("Allows equiping the tunic and boots to c-buttons"); EnhancementCheckbox("MM Bunny Hood", "gMMBunnyHood"); Tooltip("Wearing the Bunny Hood grants a speed increase like in Majora's Mask"); + EnhancementCheckbox("Better Owl", "gBetterOwl"); + Tooltip("The default response to Kaepora Gaebora is always that you understood what he said"); EnhancementCheckbox("Disable Navi Call Audio", "gDisableNaviCallAudio"); Tooltip("Disables the voice audio when Navi calls you"); - ImGui::EndMenu(); } @@ -823,7 +828,12 @@ namespace SohImGui { { EnhancementCheckbox("OoT Debug Mode", "gDebugEnabled"); Tooltip("Enables Debug Mode, allowing you to select maps with L + R + Z, noclip with L + D-pad Right,\nand open the debug menu with L on the pause screen"); - ImGui::Separator(); + EnhancementCheckbox("Fast File Select", "gSkipLogoTitle"); + Tooltip("Directly load the game to selected slot bellow\nUse slot number 4 to load directly in Zelda Map Select\n(Do not require debug menu but you will be unable to save there)\n(you can also load Zelda map select with Debug mod + slot 0).\nWith Slot : 0 you can go directly in File Select menu\nAttention, Loading an empty save will result in crash"); + if (CVar_GetS32("gSkipLogoTitle",0)) { + EnhancementSliderInt("Loading %d", "##SaveFileID", "gSaveFileID", 0, 4, ""); + } + ImGui::Separator(); EnhancementCheckbox("Stats", "gStatsEnabled"); Tooltip("Shows the stats window, with your FPS and frametimes, and the OS you're playing on"); EnhancementCheckbox("Console", "gConsoleEnabled"); @@ -960,7 +970,7 @@ namespace SohImGui { varName.erase(std::ranges::remove_if(varName, isspace).begin(), varName.end()); std::string toggleName = "g" + varName + "Enabled"; - EnhancementCheckbox(name, toggleName); + EnhancementCheckbox(name.c_str(), toggleName.c_str()); customWindows[name].enabled = CVar_GetS32(toggleName.c_str(), 0); } ImGui::EndMenu(); @@ -1011,19 +1021,19 @@ namespace SohImGui { main_pos.y -= top_left_pos.y; ImVec2 size = ImGui::GetContentRegionAvail(); ImVec2 pos = ImVec2(0, 0); - gfx_current_dimensions.width = size.x * gfx_current_dimensions.internal_mul; - gfx_current_dimensions.height = size.y * gfx_current_dimensions.internal_mul; - gfx_current_game_window_viewport.x = main_pos.x; - gfx_current_game_window_viewport.y = main_pos.y; - gfx_current_game_window_viewport.width = size.x; - gfx_current_game_window_viewport.height = size.y; + gfx_current_dimensions.width = (uint32_t)(size.x * gfx_current_dimensions.internal_mul); + gfx_current_dimensions.height = (uint32_t)(size.y * gfx_current_dimensions.internal_mul); + gfx_current_game_window_viewport.x = (int16_t)main_pos.x; + gfx_current_game_window_viewport.y = (int16_t)main_pos.y; + gfx_current_game_window_viewport.width = (int16_t)size.x; + gfx_current_game_window_viewport.height = (int16_t)size.y; if (CVar_GetS32("gN64Mode", 0)) { gfx_current_dimensions.width = 320; gfx_current_dimensions.height = 240; const int sw = size.y * 320 / 240; - gfx_current_game_window_viewport.x += (size.x - sw) / 2; + gfx_current_game_window_viewport.x += ((int)size.x - sw) / 2; gfx_current_game_window_viewport.width = sw; pos = ImVec2(size.x / 2 - sw / 2, 0); size = ImVec2(sw, size.y); @@ -1032,12 +1042,12 @@ namespace SohImGui { overlay->Draw(); } - void DrawFramebufferAndGameInput() { - ImVec2 main_pos = ImGui::GetWindowPos(); + void DrawFramebufferAndGameInput(void) { + const ImVec2 main_pos = ImGui::GetWindowPos(); ImVec2 size = ImGui::GetContentRegionAvail(); ImVec2 pos = ImVec2(0, 0); if (CVar_GetS32("gN64Mode", 0)) { - const int sw = size.y * 320 / 240; + const float sw = size.y * 320.0f / 240.0f; pos = ImVec2(size.x / 2 - sw / 2, 0); size = ImVec2(sw, size.y); } diff --git a/libultraship/libultraship/SohImGuiImpl.h b/libultraship/libultraship/SohImGuiImpl.h index 210a26db9..2a192802d 100644 --- a/libultraship/libultraship/SohImGuiImpl.h +++ b/libultraship/libultraship/SohImGuiImpl.h @@ -64,11 +64,15 @@ namespace SohImGui { void Init(WindowImpl window_impl); void Update(EventImpl event); - void EnhancementRadioButton(std::string text, std::string cvarName, int value); - void EnhancementCheckbox(std::string text, std::string cvarName); - void EnhancementSliderInt(std::string text, std::string id, std::string cvarName, int min, int max, std::string format); - void EnhancementSliderFloat(std::string text, std::string id, std::string cvarName, float min, float max, std::string format, float defaultValue); - void EnhancementColor3(std::string text, std::string cvarName, float ColorRGB[3], bool TitleSameLine); + void EnhancementRadioButton(const char* text, const char* cvarName, int id); + void EnhancementCheckbox(const char* text, const char* cvarName); + void EnhancementButton(const char* text, const char* cvarName); + void EnhancementSliderInt(const char* text, const char* id, const char* cvarName, int min, int max, const char* format); + void EnhancementSliderFloat(const char* text, const char* id, const char* cvarName, float min, float max, const char* format, float defaultValue, bool isPercentage); + + void Tooltip(const char* text); + + void EnhancementColor3(const char* text, const char* cvarName, float defaultColors[3], bool TitleSameLine); void DrawMainMenuAndCalculateGameSize(void); diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_triforce_spot.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_triforce_spot.xml index a9d52dd96..87d449458 100644 --- a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_triforce_spot.xml +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_triforce_spot.xml @@ -1,6 +1,6 @@ - + diff --git a/soh/soh/z_message_OTR.cpp b/soh/soh/z_message_OTR.cpp index ac1f013c2..8c1d26a75 100644 --- a/soh/soh/z_message_OTR.cpp +++ b/soh/soh/z_message_OTR.cpp @@ -19,9 +19,50 @@ MessageTableEntry* OTRMessage_LoadTable(const char* filePath, bool isNES) { if (file == nullptr) return nullptr; - MessageTableEntry* table = (MessageTableEntry*)malloc(sizeof(MessageTableEntry) * file->messages.size()); + // Allocate room for an additional message + MessageTableEntry* table = (MessageTableEntry*)malloc(sizeof(MessageTableEntry) * (file->messages.size() + 1)); for (int i = 0; i < file->messages.size(); i++) { + // Look for Owl Text + if (file->messages[i].id == 0x2066) { + // Create a new message based on the Owl Text + char* kaeporaPatch = (char*)malloc(sizeof(char) * file->messages[i].msg.size()); + file->messages[i].msg.copy(kaeporaPatch, file->messages[i].msg.size(), 0); + + // Swap the order of yes and no in this new message + if (filePath == "text/nes_message_data_static/nes_message_data_static") { + kaeporaPatch[26] = 'Y'; + kaeporaPatch[27] = 'e'; + kaeporaPatch[28] = 's'; + kaeporaPatch[29] = 1; + kaeporaPatch[30] = 'N'; + kaeporaPatch[31] = 'o'; + } else if (filePath == "text/ger_message_data_static/ger_message_data_static") { + kaeporaPatch[30] = 'J'; + kaeporaPatch[31] = 'a'; + kaeporaPatch[32] = '!'; + kaeporaPatch[33] = 1; + kaeporaPatch[34] = 'N'; + kaeporaPatch[35] = 'e'; + kaeporaPatch[36] = 'i'; + kaeporaPatch[37] = 'n'; + } else { + kaeporaPatch[26] = 'O'; + kaeporaPatch[27] = 'u'; + kaeporaPatch[28] = 'i'; + kaeporaPatch[29] = 1; + kaeporaPatch[30] = 'N'; + kaeporaPatch[31] = 'o'; + kaeporaPatch[32] = 'n'; + } + + // load data into message + table[file->messages.size()].textId = 0x71B3; + table[file->messages.size()].typePos = (file->messages[i].textboxType << 4) | file->messages[i].textboxYPos; + table[file->messages.size()].segment = kaeporaPatch; + table[file->messages.size()].msgSize = file->messages[i].msg.size(); + } + table[i].textId = file->messages[i].id; table[i].typePos = (file->messages[i].textboxType << 4) | file->messages[i].textboxYPos; table[i].segment = file->messages[i].msg.c_str(); diff --git a/soh/src/code/z_message_PAL.c b/soh/src/code/z_message_PAL.c index 33bc9a95e..84cf20e71 100644 --- a/soh/src/code/z_message_PAL.c +++ b/soh/src/code/z_message_PAL.c @@ -272,6 +272,13 @@ void Message_FindMessage(GlobalContext* globalCtx, u16 textId) { const char** languageSegmentTable; Font* font; const char* seg; + u16 bufferId = textId; + // Use the better owl message if better owl is enabled + if (CVar_GetS32("gBetterOwl", 0) != 0 && (bufferId == 0x2066 || bufferId == 0x607B || + bufferId == 0x10C2 || bufferId == 0x10C6 || bufferId == 0x206A)) + { + bufferId = 0x71B3; + } if (gSaveContext.language == LANGUAGE_GER) messageTableEntry = sGerMessageEntryTablePtr; @@ -287,7 +294,7 @@ void Message_FindMessage(GlobalContext* globalCtx, u16 textId) { while (messageTableEntry->textId != 0xFFFF) { font = &globalCtx->msgCtx.font; - if (messageTableEntry->textId == textId) { + if (messageTableEntry->textId == bufferId) { foundSeg = messageTableEntry->segment; font->charTexBuf[0] = messageTableEntry->typePos; @@ -298,14 +305,14 @@ void Message_FindMessage(GlobalContext* globalCtx, u16 textId) { // "Message found!!!" osSyncPrintf(" メッセージが,見つかった!!! = %x " "(data=%x) (data0=%x) (data1=%x) (data2=%x) (data3=%x)\n", - textId, font->msgOffset, font->msgLength, foundSeg, seg, nextSeg); + bufferId, font->msgOffset, font->msgLength, foundSeg, seg, nextSeg); return; } messageTableEntry++; } // "Message not found!!!" - osSyncPrintf(" メッセージが,見つからなかった!!! = %x\n", textId); + osSyncPrintf(" メッセージが,見つからなかった!!! = %x\n", bufferId); font = &globalCtx->msgCtx.font; messageTableEntry = sNesMessageEntryTablePtr; diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index dcfcdb05b..a9e9e4f9e 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -2884,7 +2884,26 @@ void Interface_DrawItemButtons(GlobalContext* globalCtx) { gDPSetEnvColor(OVERLAY_DISP++, 0, 0, 0, 0); gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); - + + //There is probably a more elegant way to do it. + char* doAction = actionsTbl[3]; + char newName[512]; + if (gSaveContext.language != LANGUAGE_ENG) { + size_t length = strlen(doAction); + strcpy(newName, doAction); + if (gSaveContext.language == LANGUAGE_FRA) { + newName[length - 6] = 'F'; + newName[length - 5] = 'R'; + newName[length - 4] = 'A'; + } else if (gSaveContext.language == LANGUAGE_GER) { + newName[length - 6] = 'G'; + newName[length - 5] = 'E'; + newName[length - 4] = 'R'; + } + doAction = newName; + } + memcpy(interfaceCtx->doActionSegment + DO_ACTION_TEX_SIZE * 2, ResourceMgr_LoadTexByName(doAction), DO_ACTION_TEX_SIZE); + gDPLoadTextureBlock_4b(OVERLAY_DISP++, interfaceCtx->doActionSegment + DO_ACTION_TEX_SIZE * 2, G_IM_FMT_IA, DO_ACTION_TEX_WIDTH, DO_ACTION_TEX_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); diff --git a/soh/src/code/z_sram.c b/soh/src/code/z_sram.c index a774636f7..16835d7ad 100644 --- a/soh/src/code/z_sram.c +++ b/soh/src/code/z_sram.c @@ -836,7 +836,7 @@ 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]) { osSyncPrintf("SRAM破壊!!!!!!\n"); // "SRAM destruction! ! ! ! ! !" - gSaveContext.language = sramCtx->readBuff[SRAM_HEADER_LANGUAGE]; + gSaveContext.language = CVar_GetS32("gLanguages", 0); memcpy(sramCtx->readBuff, sZeldaMagic, sizeof(sZeldaMagic)); sramCtx->readBuff[SRAM_HEADER_LANGUAGE] = gSaveContext.language; Sram_WriteSramHeader(sramCtx); @@ -845,7 +845,7 @@ void Sram_InitSram(GameState* gameState, SramContext* sramCtx) { gSaveContext.audioSetting = sramCtx->readBuff[SRAM_HEADER_SOUND] & 3; gSaveContext.zTargetSetting = sramCtx->readBuff[SRAM_HEADER_ZTARGET] & 1; - gSaveContext.language = sramCtx->readBuff[SRAM_HEADER_LANGUAGE]; + gSaveContext.language = CVar_GetS32("gLanguages", 0); if (gSaveContext.language >= LANGUAGE_MAX) { gSaveContext.language = LANGUAGE_ENG; diff --git a/soh/src/overlays/actors/ovl_En_Owl/z_en_owl.c b/soh/src/overlays/actors/ovl_En_Owl/z_en_owl.c index 054f00b4d..aef838499 100644 --- a/soh/src/overlays/actors/ovl_En_Owl/z_en_owl.c +++ b/soh/src/overlays/actors/ovl_En_Owl/z_en_owl.c @@ -366,7 +366,9 @@ void func_80ACA7E0(EnOwl* this, GlobalContext* globalCtx) { void EnOwl_ConfirmKokiriMessage(EnOwl* this, GlobalContext* globalCtx) { if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(globalCtx)) { - switch (globalCtx->msgCtx.choiceIndex) { + // swap the order of the responses if better owl is enabled + uint8_t index = CVar_GetS32("gBetterOwl", 0) == 0 ? globalCtx->msgCtx.choiceIndex : (1 - globalCtx->msgCtx.choiceIndex); + switch (index) { case OWL_REPEAT: Message_ContinueTextbox(globalCtx, 0x2065); break; @@ -393,7 +395,9 @@ void EnOwl_WaitOutsideKokiri(EnOwl* this, GlobalContext* globalCtx) { void func_80ACA998(EnOwl* this, GlobalContext* globalCtx) { if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(globalCtx)) { - switch (globalCtx->msgCtx.choiceIndex) { + // swap the order of the responses if better owl is enabled + uint8_t index = CVar_GetS32("gBetterOwl", 0) == 0 ? globalCtx->msgCtx.choiceIndex : (1 - globalCtx->msgCtx.choiceIndex); + switch (index) { case OWL_REPEAT: Message_ContinueTextbox(globalCtx, 0x2069); this->actionFunc = func_80ACAA54; @@ -437,7 +441,9 @@ void EnOwl_WaitHyruleCastle(EnOwl* this, GlobalContext* globalCtx) { void func_80ACAB88(EnOwl* this, GlobalContext* globalCtx) { if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(globalCtx)) { - switch (globalCtx->msgCtx.choiceIndex) { + // swap the order of the responses if better owl is enabled + uint8_t index = CVar_GetS32("gBetterOwl", 0) == 0 ? globalCtx->msgCtx.choiceIndex : (1 - globalCtx->msgCtx.choiceIndex); + switch (index) { case OWL_REPEAT: // obtained zelda's letter if (gSaveContext.eventChkInf[4] & 1) { @@ -478,7 +484,9 @@ void EnOwl_WaitKakariko(EnOwl* this, GlobalContext* globalCtx) { void func_80ACAD34(EnOwl* this, GlobalContext* globalCtx) { if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(globalCtx)) { - switch (globalCtx->msgCtx.choiceIndex) { + // swap the order of the responses if better owl is enabled + uint8_t index = CVar_GetS32("gBetterOwl", 0) == 0 ? globalCtx->msgCtx.choiceIndex : (1 - globalCtx->msgCtx.choiceIndex); + switch (index) { case OWL_REPEAT: Message_ContinueTextbox(globalCtx, 0x206F); this->actionFunc = func_80ACADF0; @@ -514,7 +522,9 @@ void EnOwl_WaitGerudo(EnOwl* this, GlobalContext* globalCtx) { void func_80ACAEB8(EnOwl* this, GlobalContext* globalCtx) { if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(globalCtx)) { - switch (globalCtx->msgCtx.choiceIndex) { + // swap the order of the responses if better owl is enabled + uint8_t index = CVar_GetS32("gBetterOwl", 0) == 0 ? globalCtx->msgCtx.choiceIndex : (1 - globalCtx->msgCtx.choiceIndex); + switch (index) { case OWL_REPEAT: Message_ContinueTextbox(globalCtx, 0x2071); this->actionFunc = func_80ACAF74; @@ -634,7 +644,9 @@ void EnOwl_WaitDeathMountainShortcut(EnOwl* this, GlobalContext* globalCtx) { void func_80ACB344(EnOwl* this, GlobalContext* globalCtx) { if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(globalCtx)) { - switch (globalCtx->msgCtx.choiceIndex) { + // swap the order of the responses if better owl is enabled + uint8_t index = CVar_GetS32("gBetterOwl", 0) == 0 ? globalCtx->msgCtx.choiceIndex : (1 - globalCtx->msgCtx.choiceIndex); + switch (index) { case OWL_REPEAT: Message_ContinueTextbox(globalCtx, 0x607A); break; @@ -657,7 +669,9 @@ void func_80ACB3E0(EnOwl* this, GlobalContext* globalCtx) { void func_80ACB440(EnOwl* this, GlobalContext* globalCtx) { if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(globalCtx)) { - switch (globalCtx->msgCtx.choiceIndex) { + // swap the order of the responses if better owl is enabled + uint8_t index = CVar_GetS32("gBetterOwl", 0) == 0 ? globalCtx->msgCtx.choiceIndex : (1 - globalCtx->msgCtx.choiceIndex); + switch (index) { case OWL_REPEAT: Message_ContinueTextbox(globalCtx, 0x10C1); this->actionFunc = func_80ACB4FC; @@ -692,7 +706,9 @@ void EnOwl_WaitLWPreSaria(EnOwl* this, GlobalContext* globalCtx) { void func_80ACB5C4(EnOwl* this, GlobalContext* globalCtx) { if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(globalCtx)) { - switch (globalCtx->msgCtx.choiceIndex) { + // swap the order of the responses if better owl is enabled + uint8_t index = CVar_GetS32("gBetterOwl", 0) == 0 ? globalCtx->msgCtx.choiceIndex : (1 - globalCtx->msgCtx.choiceIndex); + switch (index) { case OWL_REPEAT: Message_ContinueTextbox(globalCtx, 0x10C5); this->actionFunc = func_80ACB680; diff --git a/soh/src/overlays/gamestates/ovl_title/z_title.c b/soh/src/overlays/gamestates/ovl_title/z_title.c index 18996f15e..c2657f345 100644 --- a/soh/src/overlays/gamestates/ovl_title/z_title.c +++ b/soh/src/overlays/gamestates/ovl_title/z_title.c @@ -222,6 +222,72 @@ void Title_Draw(TitleContext* this) { void Title_Main(GameState* thisx) { TitleContext* this = (TitleContext*)thisx; + if (CVar_GetS32("gSkipLogoTitle",0)!=0) { + gSaveContext.language = CVar_GetS32("gLanguages", 0); + Sram_InitSram(&this->state, &this->sramCtx); + s16 selectedfile = CVar_GetS32("gSaveFileID", 0); + if (selectedfile == 4) { + selectedfile = 0xFF; + } else if(selectedfile == 0){ + gSaveContext.fileNum = selectedfile; + gSaveContext.gameMode = 0; + this->state.running = false; + SET_NEXT_GAMESTATE(&this->state, FileChoose_Init, SelectContext); + return; + } else { + selectedfile--; + if (selectedfile < 0) { + selectedfile = 0xFF; + } + } + if (selectedfile == 0xFF) { + gSaveContext.fileNum = selectedfile; + Sram_OpenSave(&this->sramCtx); + gSaveContext.gameMode = 0; + this->state.running = false; + SET_NEXT_GAMESTATE(&this->state, Select_Init, SelectContext); + } else { + gSaveContext.fileNum = selectedfile; + Sram_OpenSave(&this->sramCtx); + gSaveContext.gameMode = 0; + this->state.running = false; + //return; + SET_NEXT_GAMESTATE(&this->state, Gameplay_Init, GlobalContext); + } + gSaveContext.respawn[0].entranceIndex = -1; + gSaveContext.respawnFlag = 0; + gSaveContext.seqId = (u8)NA_BGM_DISABLED; + gSaveContext.natureAmbienceId = 0xFF; + gSaveContext.showTitleCard = true; + gSaveContext.dogParams = 0; + gSaveContext.timer1State = 0; + gSaveContext.timer2State = 0; + gSaveContext.eventInf[0] = 0; + gSaveContext.eventInf[1] = 0; + gSaveContext.eventInf[2] = 0; + gSaveContext.eventInf[3] = 0; + gSaveContext.unk_13EE = 0x32; + gSaveContext.nayrusLoveTimer = 0; + gSaveContext.healthAccumulator = 0; + gSaveContext.unk_13F0 = 0; + gSaveContext.unk_13F2 = 0; + gSaveContext.forcedSeqId = NA_BGM_GENERAL_SFX; + gSaveContext.skyboxTime = 0; + gSaveContext.nextTransition = 0xFF; + gSaveContext.nextCutsceneIndex = 0xFFEF; + gSaveContext.cutsceneTrigger = 0; + gSaveContext.chamberCutsceneNum = 0; + gSaveContext.nextDayTime = 0xFFFF; + gSaveContext.unk_13C3 = 0; + gSaveContext.buttonStatus[0] = gSaveContext.buttonStatus[1] = gSaveContext.buttonStatus[2] = gSaveContext.buttonStatus[3] = gSaveContext.buttonStatus[4] = BTN_ENABLED; + gSaveContext.unk_13E7 = gSaveContext.unk_13E8 = gSaveContext.unk_13EA = gSaveContext.unk_13EC = gSaveContext.unk_13F4 = 0; + gSaveContext.unk_13F6 = gSaveContext.magic; + gSaveContext.magic = 0; + gSaveContext.magicLevel = gSaveContext.magic; + gSaveContext.naviTimer = 0; + return; + } + OPEN_DISPS(this->state.gfxCtx, "../z_title.c", 494); gSPSegment(POLY_OPA_DISP++, 0, NULL);