From 2a92ae52789ce96d5e82ea986c615dc6ad1559b5 Mon Sep 17 00:00:00 2001 From: MegaMech Date: Tue, 22 Mar 2022 22:00:02 -0700 Subject: [PATCH 01/83] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index cc5fce64d..aebd5b71b 100644 --- a/README.md +++ b/README.md @@ -7,9 +7,10 @@ The Ship does not include assets and as such requires a prior copy of the game t ## Quick Start 1) Download The Ship of Harkinian from Discord. -2) Get a ZRET OoT Debug ROM +2) Requires an `oot debug` rom (not Master Quest). ``` -Build date: `zelda@srd022j 03-02-21 00:49:18` +Build team: `zelda@srd022j` +Build date: `03-02-21 00:49:18` (year-month-day) sha1: cee6bc3c2a634b41728f2af8da54d9bf8cc14099 ``` 3) Use the OTRGui to generate an `oot.otr` archive file. From 2da6a2a78fe24626934ec4a3e8b71e7118ec63b1 Mon Sep 17 00:00:00 2001 From: MaikelChan Date: Thu, 24 Mar 2022 07:07:49 +0100 Subject: [PATCH 02/83] Improved window dragging. Fixed issues when dragging the window, like the window stopping its movement when moving the cursor too fast, or flickering all over the place. Also, the window position will be clamped to the area of the monitor/s to prevent it from going outside of them. Also, setting VSync instead of target FPS prevents possible stuttering and probably increased CPU usage. --- OTRGui/src/game/game.cpp | 135 ++++++++++++++++++++++++--------------- OTRGui/src/main.cpp | 2 +- 2 files changed, 85 insertions(+), 52 deletions(-) diff --git a/OTRGui/src/game/game.cpp b/OTRGui/src/game/game.cpp index 3fc6438a8..18226ae64 100644 --- a/OTRGui/src/game/game.cpp +++ b/OTRGui/src/game/game.cpp @@ -18,6 +18,7 @@ Shader shader = { 0 }; Light light = { 0 }; Vector3 lightPos = { -5.0f, 10.0f, 10.0f }; Vector2 dragOffset; +bool isDragging = false; std::string sohFolder = NULLSTR; bool extracting = false; bool rom_ready = false; @@ -95,69 +96,101 @@ void OTRGame::update(){ } void OTRGame::draw() { + Vector2 windowSize(GetScreenWidth(), GetScreenHeight()); + Rectangle titlebar = Rectangle(0, 0, windowSize.x - 50, 35); + Vector2 mousePos = GetMousePosition(); + Vector2 mouseDelta = GetMouseDelta(); + + if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT) && !isDragging && + mousePos.x >= titlebar.x && mousePos.y >= titlebar.y && mousePos.x <= titlebar.x + titlebar.width && mousePos.y <= titlebar.y + titlebar.height) { + isDragging = true; + dragOffset = mousePos; + } + else if (IsMouseButtonReleased(MOUSE_BUTTON_LEFT) && isDragging) { + isDragging = false; + dragOffset = Vector2(0, 0); + } + + if (isDragging && (mouseDelta.x != 0.0f || mouseDelta.y != 0.0f)) { + Vector2 wndPos = GetWindowPosition(); + wndPos = Vector2(wndPos.x + (mousePos.x - dragOffset.x), wndPos.y + (mousePos.y - dragOffset.y)); + + // Calculate virtual screen total size in case there are multiple monitors + + int vsX1 = 0, vsY1 = 0, vsX2 = 0, vsY2 = 0; + int monitorCount = GetMonitorCount(); + + for (int m = 0; m < monitorCount; m++) { + Vector2 monitorPos = GetMonitorPosition(m); + Vector2 monitorSize = Vector2(GetMonitorWidth(m), GetMonitorHeight(m)); + + if (monitorPos.x < vsX1) vsX1 = monitorPos.x; + if (monitorPos.y < vsY1) vsY1 = monitorPos.y; + if (monitorPos.x + monitorSize.x > vsX2) vsX2 = monitorPos.x + monitorSize.x; + if (monitorPos.y + monitorSize.y > vsY2) vsY2 = monitorPos.y + monitorSize.y; + } + + // Clamp the window to the borders of the monitors + + if (wndPos.x < vsX1) wndPos.x = vsX1; + if (wndPos.y < vsY1) wndPos.y = vsY1; + if (wndPos.x + windowSize.x > vsX2) wndPos.x = vsX2 - windowSize.x; + if (wndPos.y + windowSize.y > vsY2) wndPos.y = vsY2 - windowSize.y; + + SetWindowPosition(wndPos.x, wndPos.y); + } + BeginDrawing(); - ClearBackground(Color(40, 40, 40, 255)); - Vector3 windowSize(GetScreenWidth(), GetScreenHeight()); - Rectangle titlebar = Rectangle(0, 0, windowSize.x - 50, 35); - Vector2 mousePos = Vector2(GetMouseX(), GetMouseY()); - bool hoveredTitlebar = mousePos.x >= titlebar.x && mousePos.y >= titlebar.y && mousePos.x <= titlebar.x + titlebar.width && mousePos.y <= titlebar.y + titlebar.height; + ClearBackground(Color(40, 40, 40, 255)); - if (hoveredTitlebar && IsMouseButtonDown(MOUSE_BUTTON_LEFT)) { - if (dragOffset.x == 0 && dragOffset.y == 0) dragOffset = mousePos; - Vector2 wndPos = GetWindowPosition(); + DrawTexture(Textures["Frame"], 0, 0, WHITE); - SetWindowPosition(wndPos.x + (mousePos.x - dragOffset.x), wndPos.y + (mousePos.y - dragOffset.y)); - } - else dragOffset = Vector2(0, 0); + Texture2D titleTex = Textures["Title"]; + DrawTexture(titleTex, windowSize.x / 2 - titleTex.width / 2, titlebar.height / 2 - titleTex.height / 2, WHITE); - DrawTexture(Textures["Frame"], 0, 0, WHITE); + if (UIUtils::GuiIcon("Exit", windowSize.x - 36, titlebar.height / 2 - 10) && (extracting && currentStep.find("Done") != std::string::npos || !extracting)) { + CloseWindow(); + } - Texture2D titleTex = Textures["Title"]; - DrawTexture(titleTex, windowSize.x / 2 - titleTex.width / 2, titlebar.height / 2 - titleTex.height / 2, WHITE); + BeginMode3D(camera); + DrawModelEx(Models["Ship"], Vector3Zero(), Vector3(.0f, 1.0f, .0f), this->ModelRotation, SCALE(1.0f), WHITE); + EndMode3D(); - if (UIUtils::GuiIcon("Exit", windowSize.x - 36, titlebar.height / 2 - 10) && (extracting && currentStep.find("Done") != std::string::npos || !extracting)) { - CloseWindow(); - } + constexpr float text_y = 125.f; + UIUtils::GuiShadowText(("Rom Type: " + version.version).c_str(), 32, text_y, 10, WHITE, BLACK); + UIUtils::GuiShadowText("Tool Version: 1.0", 32, text_y + 15, 10, WHITE, BLACK); + UIUtils::GuiShadowText("OTR Version: 1.0", 32, text_y + 30, 10, WHITE, BLACK); + UIUtils::GuiToggle(&single_thread, "Single Thread", 32, text_y + 40, currentStep != NULLSTR); - BeginMode3D(camera); - DrawModelEx(Models["Ship"] ,Vector3Zero(), Vector3(.0f, 1.0f, .0f), this->ModelRotation, SCALE(1.0f), WHITE); - EndMode3D(); + if (!hide_second_btn && UIUtils::GuiIconButton("Folder", "Open\nShip Folder", 109, 50, currentStep != NULLSTR, "Select your Ship of Harkinian Folder\n\nYou could use another folder\nfor development purposes")) { + const std::string path = NativeFS->LaunchFileExplorer(LaunchType::FOLDER); + sohFolder = path; + } - constexpr float text_y = 125.f; - UIUtils::GuiShadowText(("Rom Type: " + version.version).c_str(), 32, text_y, 10, WHITE, BLACK); - UIUtils::GuiShadowText("Tool Version: 1.0", 32, text_y + 15, 10, WHITE, BLACK); - UIUtils::GuiShadowText("OTR Version: 1.0", 32, text_y + 30, 10, WHITE, BLACK); - UIUtils::GuiToggle(&single_thread, "Single Thread", 32, text_y + 40, currentStep != NULLSTR); - - if(!hide_second_btn && UIUtils::GuiIconButton("Folder", "Open\nShip Folder", 109, 50, currentStep != NULLSTR, "Select your Ship of Harkinian Folder\n\nYou could use another folder\nfor development purposes")) { - const std::string path = NativeFS->LaunchFileExplorer(LaunchType::FOLDER); - sohFolder = path; - } - - if (UIUtils::GuiIconButton("Cartridge", "Open\nOoT Rom", 32, 50, currentStep != NULLSTR, "Select an Ocarina of Time\nMaster Quest or Vanilla Debug Rom\n\nYou can dump it or lend one from Nintendo")) { - const std::string path = NativeFS->LaunchFileExplorer(LaunchType::FILE); - if (path != NULLSTR) { - const std::string patched_n64 = std::string(patched_rom); - MoonUtils::rm(patched_n64); - version = GetVersion(fopen(path.c_str(), "r")); - if (version.version != NULLSTR) { - MoonUtils::copy(path, patched_n64); - rom_ready = true; - return; - } - fix_baserom(path.c_str(), patched_rom); - version = GetVersion(fopen(patched_rom, "r")); - if (version.version != NULLSTR) rom_ready = true; + if (UIUtils::GuiIconButton("Cartridge", "Open\nOoT Rom", 32, 50, currentStep != NULLSTR, "Select an Ocarina of Time\nMaster Quest or Vanilla Debug Rom\n\nYou can dump it or lend one from Nintendo")) { + const std::string path = NativeFS->LaunchFileExplorer(LaunchType::FILE); + if (path != NULLSTR) { + const std::string patched_n64 = std::string(patched_rom); + MoonUtils::rm(patched_n64); + version = GetVersion(fopen(path.c_str(), "r")); + if (version.version != NULLSTR) { + MoonUtils::copy(path, patched_n64); + rom_ready = true; + return; } + fix_baserom(path.c_str(), patched_rom); + version = GetVersion(fopen(patched_rom, "r")); + if (version.version != NULLSTR) rom_ready = true; } + } - if(currentStep != NULLSTR) { - DrawRectangle(0, 0, windowSize.x, windowSize.y, Color(0, 0, 0, 160)); - DrawTexture(Textures["Modal"], windowSize.x / 2 - Textures["Modal"].width / 2, windowSize.y / 2 - Textures["Modal"].height / 2, WHITE); - UIUtils::GuiShadowText(currentStep.c_str(), 0, windowSize.y / 2, 10, WHITE, BLACK, windowSize.x, true); - } + if (currentStep != NULLSTR) { + DrawRectangle(0, 0, windowSize.x, windowSize.y, Color(0, 0, 0, 160)); + DrawTexture(Textures["Modal"], windowSize.x / 2 - Textures["Modal"].width / 2, windowSize.y / 2 - Textures["Modal"].height / 2, WHITE); + UIUtils::GuiShadowText(currentStep.c_str(), 0, windowSize.y / 2, 10, WHITE, BLACK, windowSize.x, true); + } - EndDrawing(); + EndDrawing(); } void setCurrentStep(const std::string& step) { diff --git a/OTRGui/src/main.cpp b/OTRGui/src/main.cpp index 87c9d26ee..a866673c5 100644 --- a/OTRGui/src/main.cpp +++ b/OTRGui/src/main.cpp @@ -18,7 +18,7 @@ void UpdateDrawFrame(void) { int main() { constexpr Vector2 windowSize = Vector2(400, 200); - SetTargetFPS(144); + SetConfigFlags(FLAG_VSYNC_HINT); SetConfigFlags(FLAG_WINDOW_HIGHDPI); SetConfigFlags(FLAG_WINDOW_UNDECORATED); SetConfigFlags(FLAG_MSAA_4X_HINT); From 3ab0c45bdb7e38798e394004b41286bf0747eb51 Mon Sep 17 00:00:00 2001 From: MaikelChan Date: Thu, 24 Mar 2022 19:48:22 +0100 Subject: [PATCH 03/83] Fixed window not properly disposing raylib and OpenGL when closing. (#59) Closing the window with the X button will not close it immediately during the rendering of a frame, causing it to actually crash, but will set the engine in a pending state until it finishes the current frame. --- OTRGui/src/game/game.cpp | 2 +- OTRGui/src/game/game.h | 5 +++++ OTRGui/src/main.cpp | 4 ++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/OTRGui/src/game/game.cpp b/OTRGui/src/game/game.cpp index 18226ae64..ff7e7a22b 100644 --- a/OTRGui/src/game/game.cpp +++ b/OTRGui/src/game/game.cpp @@ -149,7 +149,7 @@ void OTRGame::draw() { DrawTexture(titleTex, windowSize.x / 2 - titleTex.width / 2, titlebar.height / 2 - titleTex.height / 2, WHITE); if (UIUtils::GuiIcon("Exit", windowSize.x - 36, titlebar.height / 2 - 10) && (extracting && currentStep.find("Done") != std::string::npos || !extracting)) { - CloseWindow(); + closeRequested = true; } BeginMode3D(camera); diff --git a/OTRGui/src/game/game.h b/OTRGui/src/game/game.h index b284f857a..bd74b1c3f 100644 --- a/OTRGui/src/game/game.h +++ b/OTRGui/src/game/game.h @@ -19,6 +19,8 @@ public: void update(); void draw(); void exit(); + + inline bool CloseRequested() { return closeRequested; } protected: void LoadTexture(const std::string& name, const std::string& path) { const Image tmp = LoadImage(path.c_str()); @@ -32,6 +34,9 @@ protected: SetTextureFilter(font.texture, TEXTURE_FILTER_POINT); Fonts[name] = font; } + +private: + bool closeRequested = false; }; extern OTRGame* Game; diff --git a/OTRGui/src/main.cpp b/OTRGui/src/main.cpp index a866673c5..2b3e40a7c 100644 --- a/OTRGui/src/main.cpp +++ b/OTRGui/src/main.cpp @@ -17,7 +17,7 @@ void UpdateDrawFrame(void) { } int main() { - constexpr Vector2 windowSize = Vector2(400, 200); + constexpr Vector2 windowSize = Vector2(400, 200); SetConfigFlags(FLAG_VSYNC_HINT); SetConfigFlags(FLAG_WINDOW_HIGHDPI); SetConfigFlags(FLAG_WINDOW_UNDECORATED); @@ -32,7 +32,7 @@ int main() { Game = new OTRGame(); Game->preload(); Game->init(); - while(!WindowShouldClose()) { + while(!WindowShouldClose() && !Game->CloseRequested()) { UpdateDrawFrame(); } CloseWindow(); From d528160684b414bc5350237a7ca8c9401efa06ae Mon Sep 17 00:00:00 2001 From: Emil Lenngren Date: Sun, 27 Mar 2022 17:14:07 +0200 Subject: [PATCH 04/83] Fix triforce vertex count --- soh/assets/xml/objects/object_triforce_spot.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/assets/xml/objects/object_triforce_spot.xml b/soh/assets/xml/objects/object_triforce_spot.xml index a9d52dd96..87d449458 100644 --- a/soh/assets/xml/objects/object_triforce_spot.xml +++ b/soh/assets/xml/objects/object_triforce_spot.xml @@ -1,6 +1,6 @@ - + From a9b56e78e26a82c7c14082efff17d54a27556a00 Mon Sep 17 00:00:00 2001 From: Sirius902 <3645979-Sirius902@users.noreply.gitlab.com> Date: Mon, 28 Mar 2022 14:11:37 -0700 Subject: [PATCH 05/83] Fix aiming items --- soh/src/overlays/actors/ovl_player_actor/z_player.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index d02788a8e..91fcf81ad 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -2321,10 +2321,10 @@ s32 func_8083501C(Player* this, GlobalContext* globalCtx) { if ((!Player_HoldsHookshot(this) || func_80834FBC(this)) && !func_80834758(globalCtx, this) && !func_80834F2C(this, globalCtx)) { return 0; - } - else - { - this->unk_6AD = 2; // OTRTODO: THIS IS A BAD IDEA BUT IT FIXES THE HORSE FIRST PERSON? + } else { + if (this->rideActor != NULL) { + this->unk_6AD = 2; // OTRTODO: THIS IS A BAD IDEA BUT IT FIXES THE HORSE FIRST PERSON? + } } return 1; @@ -14806,4 +14806,4 @@ void func_80853148(GlobalContext* globalCtx, Actor* actor) { this->naviActor->flags |= ACTOR_FLAG_8; func_80835EA4(globalCtx, 0xB); } -} \ No newline at end of file +} From 4a24b5afb432cd24c36e85db8c6e6bf17dedd04a Mon Sep 17 00:00:00 2001 From: Sirius902 <3645979-Sirius902@users.noreply.gitlab.com> Date: Mon, 28 Mar 2022 22:57:32 -0700 Subject: [PATCH 06/83] Use else if --- soh/src/overlays/actors/ovl_player_actor/z_player.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 91fcf81ad..8ce8f1ae0 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -2321,10 +2321,8 @@ s32 func_8083501C(Player* this, GlobalContext* globalCtx) { if ((!Player_HoldsHookshot(this) || func_80834FBC(this)) && !func_80834758(globalCtx, this) && !func_80834F2C(this, globalCtx)) { return 0; - } else { - if (this->rideActor != NULL) { - this->unk_6AD = 2; // OTRTODO: THIS IS A BAD IDEA BUT IT FIXES THE HORSE FIRST PERSON? - } + } else if (this->rideActor != NULL) { + this->unk_6AD = 2; // OTRTODO: THIS IS A BAD IDEA BUT IT FIXES THE HORSE FIRST PERSON? } return 1; From dae8035314225b8c49999648f25c578b6bc53cbd Mon Sep 17 00:00:00 2001 From: Sirius902 <3645979-Sirius902@users.noreply.gitlab.com> Date: Sun, 27 Mar 2022 18:47:53 -0700 Subject: [PATCH 07/83] Load controller db from file --- libultraship/libultraship/Window.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/libultraship/libultraship/Window.cpp b/libultraship/libultraship/Window.cpp index 24fda1ade..665483b35 100644 --- a/libultraship/libultraship/Window.cpp +++ b/libultraship/libultraship/Window.cpp @@ -39,6 +39,14 @@ extern "C" { exit(EXIT_FAILURE); } + const char* controllerDb = "gamecontrollerdb.txt"; + int mappingsAdded = SDL_GameControllerAddMappingsFromFile(controllerDb); + if (mappingsAdded >= 0) { + SPDLOG_INFO("Added SDL game controllers from \"{}\" ({})", controllerDb, mappingsAdded); + } else { + SPDLOG_ERROR("Failed add SDL game controller mappings from \"{}\" ({})", controllerDb, SDL_GetError()); + } + // TODO: This for loop is debug. Burn it with fire. for (size_t i = 0; i < SDL_NumJoysticks(); i++) { if (SDL_IsGameController(i)) { From 25468cf7223e8343091e5e7e0a99fe8fb7c473ee Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Sun, 27 Mar 2022 21:18:05 -0400 Subject: [PATCH 08/83] Add cheats menu. --- libultraship/libultraship/GameSettings.cpp | 48 +++++++++++-- libultraship/libultraship/GameSettings.h | 16 ++++- libultraship/libultraship/SohImGuiImpl.cpp | 61 +++++++++++++--- soh/src/code/game.c | 69 +++++++++++++++++++ soh/src/code/z_bgcheck.c | 10 ++- soh/src/code/z_parameter.c | 4 +- soh/src/code/z_player_lib.c | 4 +- .../actors/ovl_player_actor/z_player.c | 12 ++-- 8 files changed, 200 insertions(+), 24 deletions(-) diff --git a/libultraship/libultraship/GameSettings.cpp b/libultraship/libultraship/GameSettings.cpp index 8599367a7..c638468af 100644 --- a/libultraship/libultraship/GameSettings.cpp +++ b/libultraship/libultraship/GameSettings.cpp @@ -27,6 +27,7 @@ namespace Game { const std::string AudioSection = AUDIO_SECTION; const std::string ControllerSection = CONTROLLER_SECTION; const std::string EnhancementSection = ENHANCEMENTS_SECTION; + const std::string CheatSection = CHEATS_SECTION; void UpdateAudio() { Audio_SetGameVolume(SEQ_BGM_MAIN, Settings.audio.music_main); @@ -57,9 +58,7 @@ namespace Game { Settings.enhancements.animated_pause_menu = stob(Conf[EnhancementSection]["animated_pause_menu"]); CVar_SetS32(const_cast("gPauseLiveLink"), Settings.enhancements.animated_pause_menu); - Settings.enhancements.debug_mode = stob(Conf[EnhancementSection]["debug_mode"]); - CVar_SetS32(const_cast("gDebugEnabled"), Settings.enhancements.debug_mode); - + // Audio Settings.audio.master = Ship::stof(Conf[AudioSection]["master"]); CVar_SetFloat(const_cast("gGameMasterVolume"), Settings.audio.master); @@ -75,6 +74,7 @@ namespace Game { Settings.audio.fanfare = Ship::stof(Conf[AudioSection]["fanfare"]); CVar_SetFloat(const_cast("gFanfareVolume"), Settings.audio.fanfare); + // Controllers Settings.controller.gyro_sensitivity = Ship::stof(Conf[ControllerSection]["gyro_sensitivity"]); CVar_SetFloat(const_cast("gGyroSensitivity"), Settings.controller.gyro_sensitivity); @@ -86,6 +86,34 @@ namespace Game { Settings.controller.input_enabled = stob(Conf[ControllerSection]["input_enabled"]); CVar_SetS32(const_cast("gInputEnabled"), Settings.controller.input_enabled); + + // Cheats + Settings.cheats.debug_mode = stob(Conf[CheatSection]["debug_mode"]); + CVar_SetS32(const_cast("gDebugEnabled"), Settings.cheats.debug_mode); + + Settings.cheats.infinite_money = stob(Conf[CheatSection]["infinite_money"]); + CVar_SetS32(const_cast("gInfiniteMoney"), Settings.cheats.infinite_money); + + Settings.cheats.infinite_health = stob(Conf[CheatSection]["infinite_health"]); + CVar_SetS32(const_cast("gInfiniteHealth"), Settings.cheats.infinite_health); + + Settings.cheats.infinite_ammo = stob(Conf[CheatSection]["infinite_ammo"]); + CVar_SetS32(const_cast("gInfiniteAmmo"), Settings.cheats.infinite_ammo); + + Settings.cheats.infinite_magic = stob(Conf[CheatSection]["infinite_magic"]); + CVar_SetS32(const_cast("gInfiniteMagic"), Settings.cheats.infinite_magic); + + Settings.cheats.no_clip = stob(Conf[CheatSection]["no_clip"]); + CVar_SetS32(const_cast("gNoClip"), Settings.cheats.no_clip); + + Settings.cheats.climb_everything = stob(Conf[CheatSection]["climb_everything"]); + CVar_SetS32(const_cast("gClimbEverything"), Settings.cheats.climb_everything); + + Settings.cheats.moon_jump_on_l = stob(Conf[CheatSection]["moon_jump_on_l"]); + CVar_SetS32(const_cast("gMoonJumpOnL"), Settings.cheats.moon_jump_on_l); + + Settings.cheats.super_tunic = stob(Conf[CheatSection]["super_tunic"]); + CVar_SetS32(const_cast("gSuperTunic"), Settings.cheats.super_tunic); UpdateAudio(); } @@ -111,13 +139,25 @@ namespace Game { Conf[EnhancementSection]["fast_text"] = std::to_string(Settings.enhancements.fast_text); Conf[EnhancementSection]["disable_lod"] = std::to_string(Settings.enhancements.disable_lod); Conf[EnhancementSection]["animated_pause_menu"] = std::to_string(Settings.enhancements.animated_pause_menu); - Conf[EnhancementSection]["debug_mode"] = std::to_string(Settings.enhancements.debug_mode); + + // Controllers Conf[ControllerSection]["gyro_sensitivity"] = std::to_string(Settings.controller.gyro_sensitivity); Conf[ControllerSection]["rumble_strength"] = std::to_string(Settings.controller.rumble_strength); Conf[ControllerSection]["input_scale"] = std::to_string(Settings.controller.input_scale); Conf[ControllerSection]["input_enabled"] = std::to_string(Settings.controller.input_enabled); + // Cheats + Conf[CheatSection]["debug_mode"] = std::to_string(Settings.cheats.debug_mode); + Conf[CheatSection]["infinite_money"] = std::to_string(Settings.cheats.infinite_money); + Conf[CheatSection]["infinite_health"] = std::to_string(Settings.cheats.infinite_health); + Conf[CheatSection]["infinite_ammo"] = std::to_string(Settings.cheats.infinite_ammo); + Conf[CheatSection]["infinite_magic"] = std::to_string(Settings.cheats.infinite_magic); + Conf[CheatSection]["no_clip"] = std::to_string(Settings.cheats.no_clip); + Conf[CheatSection]["climb_everything"] = std::to_string(Settings.cheats.climb_everything); + Conf[CheatSection]["moon_jump_on_l"] = std::to_string(Settings.cheats.moon_jump_on_l); + Conf[CheatSection]["super_tunic"] = std::to_string(Settings.cheats.super_tunic); + Conf.Save(); } diff --git a/libultraship/libultraship/GameSettings.h b/libultraship/libultraship/GameSettings.h index 35d948d89..8508baeae 100644 --- a/libultraship/libultraship/GameSettings.h +++ b/libultraship/libultraship/GameSettings.h @@ -23,15 +23,28 @@ struct SoHConfigType { bool fast_text = false; bool disable_lod = false; bool animated_pause_menu = false; - bool debug_mode = false; } enhancements; + // Controller struct { float gyro_sensitivity = 1.0f; float rumble_strength = 1.0f; float input_scale = 1.0f; bool input_enabled = false; } controller; + + // Cheats + struct { + bool debug_mode = false; + bool infinite_money = false; + bool infinite_health = false; + bool infinite_ammo = false; + bool infinite_magic = false; + bool no_clip = false; + bool climb_everything = false; + bool moon_jump_on_l = false; + bool super_tunic = false; + } cheats; }; enum SeqPlayers { @@ -46,6 +59,7 @@ enum SeqPlayers { #define AUDIO_SECTION "AUDIO SETTINGS" #define CONTROLLER_SECTION "CONTROLLER SECTION" #define ENHANCEMENTS_SECTION "ENHANCEMENT SETTINGS" +#define CHEATS_SECTION "CHEATS SETTINGS" namespace Game { extern SoHConfigType Settings; diff --git a/libultraship/libultraship/SohImGuiImpl.cpp b/libultraship/libultraship/SohImGuiImpl.cpp index 22b47f680..548b298ef 100644 --- a/libultraship/libultraship/SohImGuiImpl.cpp +++ b/libultraship/libultraship/SohImGuiImpl.cpp @@ -350,20 +350,65 @@ namespace SohImGui { needs_save = true; } - ImGui::Text("Debugging"); - ImGui::Separator(); - - if (ImGui::Checkbox("Debug Mode", &Game::Settings.enhancements.debug_mode)) { - CVar_SetS32(const_cast("gDebugEnabled"), Game::Settings.enhancements.debug_mode); - needs_save = true; - } - ImGui::EndMenu(); } if (ImGui::BeginMenu("Developer Tools")) { HOOK(ImGui::MenuItem("Stats", nullptr, &Game::Settings.debug.soh)); HOOK(ImGui::MenuItem("Console", nullptr, &console->opened)); + + ImGui::Text("Debug"); + ImGui::Separator(); + + if (ImGui::Checkbox("Debug Mode", &Game::Settings.cheats.debug_mode)) { + CVar_SetS32(const_cast("gDebugEnabled"), Game::Settings.cheats.debug_mode); + needs_save = true; + } + + ImGui::EndMenu(); + } + + if (ImGui::BeginMenu("Cheats")) { + if (ImGui::Checkbox("Infinite Money", &Game::Settings.cheats.infinite_money)) { + CVar_SetS32(const_cast("gInfiniteMoney"), Game::Settings.cheats.infinite_money); + needs_save = true; + } + + if (ImGui::Checkbox("Infinite Health", &Game::Settings.cheats.infinite_health)) { + CVar_SetS32(const_cast("gInfiniteHealth"), Game::Settings.cheats.infinite_health); + needs_save = true; + } + + if (ImGui::Checkbox("Infinite Ammo", &Game::Settings.cheats.infinite_ammo)) { + CVar_SetS32(const_cast("gInfiniteAmmo"), Game::Settings.cheats.infinite_ammo); + needs_save = true; + } + + if (ImGui::Checkbox("Infinite Magic", &Game::Settings.cheats.infinite_magic)) { + CVar_SetS32(const_cast("gInfiniteMagic"), Game::Settings.cheats.infinite_magic); + needs_save = true; + } + + if (ImGui::Checkbox("No Clip", &Game::Settings.cheats.no_clip)) { + CVar_SetS32(const_cast("gNoClip"), Game::Settings.cheats.no_clip); + needs_save = true; + } + + if (ImGui::Checkbox("Climb Everything", &Game::Settings.cheats.climb_everything)) { + CVar_SetS32(const_cast("gClimbEverything"), Game::Settings.cheats.climb_everything); + needs_save = true; + } + + if (ImGui::Checkbox("Moon Jump on L", &Game::Settings.cheats.moon_jump_on_l)) { + CVar_SetS32(const_cast("gMoonJumpOnL"), Game::Settings.cheats.moon_jump_on_l); + needs_save = true; + } + + if (ImGui::Checkbox("Super Tunic", &Game::Settings.cheats.super_tunic)) { + CVar_SetS32(const_cast("gSuperTunic"), Game::Settings.cheats.super_tunic); + needs_save = true; + } + ImGui::EndMenu(); } diff --git a/soh/src/code/game.c b/soh/src/code/game.c index ec8a0e9fa..9392cbc25 100644 --- a/soh/src/code/game.c +++ b/soh/src/code/game.c @@ -323,6 +323,75 @@ void GameState_Update(GameState* gameState) { GameState_Draw(gameState, gfxCtx); func_800C49F4(gfxCtx); } + + // ----------------------- + // Cheats hooks + // ----------------------- + + // Inf Money + if (CVar_GetS32("gInfiniteMoney", 0) != 0) { + if (gSaveContext.rupees < CUR_CAPACITY(UPG_WALLET)) { + gSaveContext.rupees = CUR_CAPACITY(UPG_WALLET); + } + } + + // Inf Health + if (CVar_GetS32("gInfiniteHealth", 0) != 0) { + if (gSaveContext.health < gSaveContext.healthCapacity) { + gSaveContext.health = gSaveContext.healthCapacity; + } + } + + // Inf Ammo + if (CVar_GetS32("gInfiniteAmmo", 0) != 0) { + // Deku Sticks + if (AMMO(ITEM_STICK) < CUR_CAPACITY(UPG_STICKS)) { + AMMO(ITEM_STICK) = CUR_CAPACITY(UPG_STICKS); + } + + // Deku Nuts + if (AMMO(ITEM_NUT) < CUR_CAPACITY(UPG_NUTS)) { + AMMO(ITEM_NUT) = CUR_CAPACITY(UPG_NUTS); + } + + // Bombs + if (AMMO(ITEM_BOMB) < CUR_CAPACITY(UPG_BOMB_BAG)) { + AMMO(ITEM_BOMB) = CUR_CAPACITY(UPG_BOMB_BAG); + } + + // Fairy Bow (Ammo) + if (AMMO(ITEM_BOW) < CUR_CAPACITY(UPG_QUIVER)) { + AMMO(ITEM_BOW) = CUR_CAPACITY(UPG_QUIVER); + } + + // Fairy Slingshot (Ammo) + if (AMMO(ITEM_SLINGSHOT) < CUR_CAPACITY(UPG_BULLET_BAG)) { + AMMO(ITEM_SLINGSHOT) = CUR_CAPACITY(UPG_BULLET_BAG); + } + + // Bombchus (max: 50, no upgrades) + if (AMMO(ITEM_BOMBCHU) < 50) { + AMMO(ITEM_BOMBCHU) = 50; + } + } + + // Inf Magic + if (CVar_GetS32("gInfiniteMagic", 0) != 0) { + if (gSaveContext.magicAcquired && gSaveContext.magic != (gSaveContext.doubleMagic + 1) * 0x30) { + gSaveContext.magic = (gSaveContext.doubleMagic + 1) * 0x30; + } + } + + // Moon Jump On L + if (CVar_GetS32("gMoonJumpOnL", 0) != 0) { + if (gGlobalCtx) { + Player* player = GET_PLAYER(gGlobalCtx); + + if (CHECK_BTN_ANY(gGlobalCtx->state.input[0].cur.button, BTN_L)) { + player->actor.velocity.y = 6.34375f; + } + } + } gameState->frames++; } diff --git a/soh/src/code/z_bgcheck.c b/soh/src/code/z_bgcheck.c index b736d0cf0..9ce139eed 100644 --- a/soh/src/code/z_bgcheck.c +++ b/soh/src/code/z_bgcheck.c @@ -1874,6 +1874,10 @@ s32 BgCheck_CheckWallImpl(CollisionContext* colCtx, u16 xpFlags, Vec3f* posResul s32 bgId2; f32 nx, ny, nz; // unit normal of polygon + if (CVar_GetS32("gNoClip", 0) != 0) { + return false; + } + result = false; *outBgId = BGCHECK_SCENE; *outPoly = NULL; @@ -3996,7 +4000,11 @@ u32 func_80041D94(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) { * SurfaceType Get Wall Flags */ s32 func_80041DB8(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) { - return D_80119D90[func_80041D94(colCtx, poly, bgId)]; + if (CVar_GetS32("gClimbEverything", 0) != 0) { + return (1 << 3) | D_80119D90[func_80041D94(colCtx, poly, bgId)]; + } else { + return D_80119D90[func_80041D94(colCtx, poly, bgId)]; + } } /** diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index 3219527a9..8bce65a7b 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -4078,11 +4078,11 @@ void Interface_Update(GlobalContext* globalCtx) { D_80125A58 = func_8008F2F8(globalCtx); if (D_80125A58 == 1) { - if (CUR_EQUIP_VALUE(EQUIP_TUNIC) == 2) { + if (CUR_EQUIP_VALUE(EQUIP_TUNIC) == 2 || CVar_GetS32("gSuperTunic", 0) != 0) { D_80125A58 = 0; } } else if ((func_8008F2F8(globalCtx) >= 2) && (func_8008F2F8(globalCtx) < 5)) { - if (CUR_EQUIP_VALUE(EQUIP_TUNIC) == 3) { + if (CUR_EQUIP_VALUE(EQUIP_TUNIC) == 3 || CVar_GetS32("gSuperTunic", 0) != 0) { D_80125A58 = 0; } } diff --git a/soh/src/code/z_player_lib.c b/soh/src/code/z_player_lib.c index e15cc81eb..82c1e42bf 100644 --- a/soh/src/code/z_player_lib.c +++ b/soh/src/code/z_player_lib.c @@ -631,9 +631,9 @@ s32 func_8008F2F8(GlobalContext* globalCtx) { if (0) {} if ((triggerEntry->flag != 0) && !(gSaveContext.textTriggerFlags & triggerEntry->flag) && - (((var == 0) && (this->currentTunic != PLAYER_TUNIC_GORON)) || + (((var == 0) && (this->currentTunic != PLAYER_TUNIC_GORON && CVar_GetS32("gSuperTunic", 0) == 0)) || (((var == 1) || (var == 3)) && (this->currentBoots == PLAYER_BOOTS_IRON) && - (this->currentTunic != PLAYER_TUNIC_ZORA)))) { + (this->currentTunic != PLAYER_TUNIC_ZORA && CVar_GetS32("gSuperTunic", 0) == 0)))) { Message_StartTextbox(globalCtx, triggerEntry->textId, NULL); gSaveContext.textTriggerFlags |= triggerEntry->flag; } diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index d02788a8e..4321ff3e0 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -3842,12 +3842,12 @@ s32 func_808382DC(Player* this, GlobalContext* globalCtx) { s32 sp48 = func_80838144(D_808535E4); if (((this->actor.wallPoly != NULL) && - SurfaceType_IsWallDamage(&globalCtx->colCtx, this->actor.wallPoly, this->actor.wallBgId)) || + SurfaceType_IsWallDamage(&globalCtx->colCtx, this->actor.wallPoly, this->actor.wallBgId)) || ((sp48 >= 0) && SurfaceType_IsWallDamage(&globalCtx->colCtx, this->actor.floorPoly, this->actor.floorBgId) && (this->unk_A79 >= D_808544F4[sp48])) || ((sp48 >= 0) && - ((this->currentTunic != PLAYER_TUNIC_GORON) || (this->unk_A79 >= D_808544F4[sp48])))) { + ((this->currentTunic != PLAYER_TUNIC_GORON && CVar_GetS32("gSuperTunic", 0) == 0) || (this->unk_A79 >= D_808544F4[sp48])))) { this->unk_A79 = 0; this->actor.colChkInfo.damage = 4; func_80837C0C(globalCtx, this, 0, 4.0f, 5.0f, this->actor.shape.rot.y, 20); @@ -4632,7 +4632,7 @@ s32 func_8083A6AC(Player* this, GlobalContext* globalCtx) { if (BgCheck_EntityLineTest1(&globalCtx->colCtx, &this->actor.world.pos, &sp74, &sp68, &sp84, true, false, false, true, &sp80) && - (ABS(sp84->normal.y) < 600)) { + ((ABS(sp84->normal.y) < 600) || (CVar_GetS32("gClimbEverything", 0) != 0))) { f32 nx = COLPOLY_GET_NORMAL(sp84->normal.x); f32 ny = COLPOLY_GET_NORMAL(sp84->normal.y); f32 nz = COLPOLY_GET_NORMAL(sp84->normal.z); @@ -8152,7 +8152,7 @@ static struct_80832924 D_808545F0[] = { }; void func_80843CEC(Player* this, GlobalContext* globalCtx) { - if (this->currentTunic != PLAYER_TUNIC_GORON) { + if (this->currentTunic != PLAYER_TUNIC_GORON && CVar_GetS32("gSuperTunic", 0) == 0) { if ((globalCtx->roomCtx.curRoom.unk_02 == 3) || (D_808535E4 == 9) || ((func_80838144(D_808535E4) >= 0) && !SurfaceType_IsWallDamage(&globalCtx->colCtx, this->actor.floorPoly, this->actor.floorBgId))) { @@ -9888,7 +9888,7 @@ void func_80847BA0(GlobalContext* globalCtx, Player* this) { if ((this->actor.bgCheckFlags & 0x200) && (D_80853608 < 0x3000)) { CollisionPoly* wallPoly = this->actor.wallPoly; - if (ABS(wallPoly->normal.y) < 600) { + if ((ABS(wallPoly->normal.y) < 600) || (CVar_GetS32("gClimbEverything", 0) != 0)) { f32 sp8C = COLPOLY_GET_NORMAL(wallPoly->normal.x); f32 sp88 = COLPOLY_GET_NORMAL(wallPoly->normal.y); f32 sp84 = COLPOLY_GET_NORMAL(wallPoly->normal.z); @@ -10188,7 +10188,7 @@ void func_80848C74(GlobalContext* globalCtx, Player* this) { s32 sp58; s32 sp54; - if (this->currentTunic == PLAYER_TUNIC_GORON) { + if (this->currentTunic == PLAYER_TUNIC_GORON || CVar_GetS32("gSuperTunic", 0) != 0) { sp54 = 20; } else { From f3fe43b912995cb593f18f041725d8de6dad2bf5 Mon Sep 17 00:00:00 2001 From: MaikelChan Date: Fri, 25 Mar 2022 04:00:59 +0100 Subject: [PATCH 09/83] Fixed Link's sword being cut in preview in pause menu. Apply the offset only when live Link is enabled. --- soh/src/code/z_player_lib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/src/code/z_player_lib.c b/soh/src/code/z_player_lib.c index 82c1e42bf..d7344d7c3 100644 --- a/soh/src/code/z_player_lib.c +++ b/soh/src/code/z_player_lib.c @@ -1590,7 +1590,7 @@ void func_80091A24(GlobalContext* globalCtx, void* seg04, void* seg06, SkelAnime sp12C[0] = sword; sp12C[1] = shield; - Matrix_SetTranslateRotateYXZ(pos->x - (LINK_AGE_IN_YEARS == YEARS_ADULT ? 25 : 0), + Matrix_SetTranslateRotateYXZ(pos->x - ((CVar_GetS32("gPauseLiveLink", 0) && LINK_AGE_IN_YEARS == YEARS_ADULT) ? 25 : 0), pos->y - (CVar_GetS32("gPauseTriforce", 0) ? 16 : 0), pos->z, rot); Matrix_Scale(scale, scale, scale, MTXMODE_APPLY); From e1be01cb6d7cb5a8149fff6041e3082a5be78739 Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Tue, 29 Mar 2022 11:59:24 -0400 Subject: [PATCH 10/83] Fixed rupee drops from bushes during title screen --- soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c b/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c index 1b89b7b8d..620463b04 100644 --- a/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c +++ b/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c @@ -300,7 +300,7 @@ void EnKusa_Main(EnKusa* this, GlobalContext* globalCtx) { if (Actor_HasParent(&this->actor, globalCtx)) { EnKusa_SetupLiftedUp(this); SoundSource_PlaySfxAtFixedWorldPos(globalCtx, &this->actor.world.pos, 20, NA_SE_PL_PULL_UP_PLANT); - } else if (this->collider.base.acFlags & AC_HIT) { + } else if (this->collider.base.acFlags & AC_HIT && gGlobalCtx->csCtx.state == 0) { this->collider.base.acFlags &= ~AC_HIT; EnKusa_SpawnFragments(this, globalCtx); EnKusa_DropCollectible(this, globalCtx); From 6aa88941253884213ed4638268ae3065b22f83c5 Mon Sep 17 00:00:00 2001 From: Torphedo <73564623+Torphedo@users.noreply.github.com> Date: Tue, 29 Mar 2022 22:21:53 -0400 Subject: [PATCH 11/83] Remove unnecessary warnings (#42) * Remove unnecessary warnings * Comment out error --- ZAPDTR/ZAPD/Main.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/ZAPDTR/ZAPD/Main.cpp b/ZAPDTR/ZAPD/Main.cpp index 440f6d504..250704993 100644 --- a/ZAPDTR/ZAPD/Main.cpp +++ b/ZAPDTR/ZAPD/Main.cpp @@ -188,14 +188,16 @@ int main(int argc, char* argv[]) } else if (arg == "-eh") // Enable Error Handler { -#if !defined(_MSC_VER) && !defined(__CYGWIN__) + #if !defined(_MSC_VER) && !defined(__CYGWIN__) signal(SIGSEGV, ErrorHandler); signal(SIGABRT, ErrorHandler); #else - HANDLE_WARNING(WarningType::Always, - "tried to set error handler, but this ZAPD build lacks support for one", - ""); + // HANDLE_WARNING(WarningType::Always, + // "tried to set error handler, but this ZAPD build lacks support for one", + // ""); #endif + + } else if (arg == "-v") // Verbose { From 98ddacef010b40d3f7039a9767b168af9c56ec00 Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Tue, 29 Mar 2022 22:23:02 -0400 Subject: [PATCH 12/83] Fixed PS5 gyro & Added GUI calibration button (#78) * Fixed PS5 gyro & Added GUI calibration button * Change PS4/PS5 LED to the tunic color --- libultraship/libultraship/GameSettings.h | 4 +- libultraship/libultraship/SDLController.cpp | 48 +++++++++++---------- libultraship/libultraship/SohImGuiImpl.cpp | 8 ++++ soh/src/code/padmgr.c | 14 +++++- 4 files changed, 49 insertions(+), 25 deletions(-) diff --git a/libultraship/libultraship/GameSettings.h b/libultraship/libultraship/GameSettings.h index 8508baeae..be974fd80 100644 --- a/libultraship/libultraship/GameSettings.h +++ b/libultraship/libultraship/GameSettings.h @@ -30,7 +30,9 @@ struct SoHConfigType { float gyro_sensitivity = 1.0f; float rumble_strength = 1.0f; float input_scale = 1.0f; - bool input_enabled = false; + float gyroDriftX = 0.0f; + float gyroDriftY = 0.0f; + bool input_enabled = false; } controller; // Cheats diff --git a/libultraship/libultraship/SDLController.cpp b/libultraship/libultraship/SDLController.cpp index 3d6d6800d..d1315c3e4 100644 --- a/libultraship/libultraship/SDLController.cpp +++ b/libultraship/libultraship/SDLController.cpp @@ -7,12 +7,8 @@ #include "Window.h" extern "C" uint8_t __osMaxControllers; -float gyroDriftX; -float gyroDriftY; namespace Ship { - - SDLController::SDLController(int32_t dwControllerNumber) : Controller(dwControllerNumber), Cont(nullptr), guid(INVALID_SDL_CONTROLLER_GUID) { } @@ -186,31 +182,31 @@ namespace Ship { SDL_GameControllerGetSensorData(Cont, SDL_SENSOR_GYRO, gyroData, 3); const char* contName = SDL_GameControllerName(Cont); - const int isSpecialController = strcmp("PS5 Controller", contName); + const int isSpecialController = !strcmp("PS5 Controller", contName); const float gyroSensitivity = Game::Settings.controller.gyro_sensitivity; - if (gyroDriftX == 0) { - if (isSpecialController == 0) { - gyroDriftX = gyroData[2]; + if (Game::Settings.controller.gyroDriftX == 0) { + Game::Settings.controller.gyroDriftX = gyroData[0]; + } + + if (Game::Settings.controller.gyroDriftY == 0) { + if (isSpecialController == 1) { + Game::Settings.controller.gyroDriftY = gyroData[2]; } else { - gyroDriftX = gyroData[0]; + Game::Settings.controller.gyroDriftY = gyroData[1]; } } - if (gyroDriftY == 0) { - gyroDriftY = gyroData[1]; - } - - if (isSpecialController == 0) { - wGyroX = gyroData[2] - gyroDriftX; + if (isSpecialController == 1) { + wGyroX = gyroData[0] - Game::Settings.controller.gyroDriftX; + wGyroY = -gyroData[2] - Game::Settings.controller.gyroDriftY; } else { - wGyroX = gyroData[0] - gyroDriftX; + wGyroX = gyroData[0] - Game::Settings.controller.gyroDriftX; + wGyroY = gyroData[1] - Game::Settings.controller.gyroDriftY; } - wGyroY = gyroData[1] - gyroDriftY; - wGyroX *= gyroSensitivity; wGyroY *= gyroSensitivity; } @@ -340,11 +336,19 @@ namespace Ship { } if (SDL_GameControllerHasLED(Cont)) { - if (controller->ledColor == 1) { + switch (controller->ledColor) { + case 0: SDL_JoystickSetLED(SDL_GameControllerGetJoystick(Cont), 255, 0, 0); - } - else { - SDL_JoystickSetLED(SDL_GameControllerGetJoystick(Cont), 0, 255, 0); + break; + case 1: + SDL_JoystickSetLED(SDL_GameControllerGetJoystick(Cont), 0x1E, 0x69, 0x1B); + break; + case 2: + SDL_JoystickSetLED(SDL_GameControllerGetJoystick(Cont), 0x64, 0x14, 0x00); + break; + case 3: + SDL_JoystickSetLED(SDL_GameControllerGetJoystick(Cont), 0x00, 0x3C, 0x64); + break; } } } diff --git a/libultraship/libultraship/SohImGuiImpl.cpp b/libultraship/libultraship/SohImGuiImpl.cpp index 548b298ef..abc51a535 100644 --- a/libultraship/libultraship/SohImGuiImpl.cpp +++ b/libultraship/libultraship/SohImGuiImpl.cpp @@ -306,6 +306,14 @@ namespace SohImGui { if (ImGui::SliderFloat("##GYROSCOPE", &Game::Settings.controller.gyro_sensitivity, 0.0f, 1.0f, "")) { needs_save = true; } + + if (ImGui::Button("Recalibrate Gyro")) { + Game::Settings.controller.gyroDriftX = 0; + Game::Settings.controller.gyroDriftY = 0; + } + + ImGui::Separator(); + ImGui::Text("Rumble Strength: %d %%", static_cast(100 * Game::Settings.controller.rumble_strength)); if (ImGui::SliderFloat("##RUMBLE", &Game::Settings.controller.rumble_strength, 0.0f, 1.0f, "")) { needs_save = true; diff --git a/soh/src/code/padmgr.c b/soh/src/code/padmgr.c index fb4ceb8e6..973c2b446 100644 --- a/soh/src/code/padmgr.c +++ b/soh/src/code/padmgr.c @@ -272,9 +272,19 @@ void PadMgr_ProcessInputs(PadMgr* padMgr) { controllerCallback.rumble = padMgr->rumbleEnable[0] > 0 ? 1 : 0; if (HealthMeter_IsCritical()) { - controllerCallback.ledColor = 1; - } else { controllerCallback.ledColor = 0; + } else if (gGlobalCtx) { + switch (CUR_EQUIP_VALUE(EQUIP_TUNIC) - 1) { + case PLAYER_TUNIC_KOKIRI: + controllerCallback.ledColor = 1; + break; + case PLAYER_TUNIC_GORON: + controllerCallback.ledColor = 2; + break; + case PLAYER_TUNIC_ZORA: + controllerCallback.ledColor = 3; + break; + } } OTRControllerCallback(&controllerCallback); From 5505336a8a02e2f957a6748ccf1527d38038db75 Mon Sep 17 00:00:00 2001 From: kev4cards Date: Tue, 29 Mar 2022 22:23:40 -0400 Subject: [PATCH 13/83] Replace uAxisThreshold with appropriate constant for octagon clamping (#83) --- libultraship/libultraship/SDLController.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libultraship/libultraship/SDLController.cpp b/libultraship/libultraship/SDLController.cpp index d1315c3e4..47fb57441 100644 --- a/libultraship/libultraship/SDLController.cpp +++ b/libultraship/libultraship/SDLController.cpp @@ -143,8 +143,8 @@ namespace Ship { //bound diagonals to an octagonal range {-68 ... +68} if (ax != 0.0 && ay != 0.0) { auto slope = ay / ax; - auto edgex = copysign(85.0 / (abs(slope) + wAxisThreshold / 69.0), ax); - auto edgey = copysign(std::min(abs(edgex * slope), 85.0 / (1.0 / abs(slope) + wAxisThreshold / 69.0)), ay); + auto edgex = copysign(85.0 / (abs(slope) + 16.0 / 69.0), ax); + auto edgey = copysign(std::min(abs(edgex * slope), 85.0 / (1.0 / abs(slope) + 16.0 / 69.0)), ay); edgex = edgey / slope; auto scale = sqrt(edgex * edgex + edgey * edgey) / 85.0; @@ -410,4 +410,4 @@ namespace Ship { std::string SDLController::GetBindingConfSection() { return GetControllerType() + " CONTROLLER BINDING " + guid; } -} \ No newline at end of file +} From 5d967f8e8c822565cb755ef95446cf7daf2b0b63 Mon Sep 17 00:00:00 2001 From: Emil Lenngren Date: Thu, 31 Mar 2022 02:30:48 +0200 Subject: [PATCH 14/83] Don't crash if glClipControl is not available --- libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp index 52815bc1c..16e750d14 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp @@ -673,7 +673,11 @@ static void gfx_opengl_resize_framebuffer(int fb, uint32_t width, uint32_t heigh void gfx_opengl_set_framebuffer(int fb) { - glClipControl(GL_UPPER_LEFT, GL_NEGATIVE_ONE_TO_ONE); // Set origin to upper left corner, to match N64 and DX11 + if (GLEW_ARB_clip_control || GLEW_VERSION_4_5) { + // Set origin to upper left corner, to match N64 and DX11 + // If this function is not supported, the texture will be upside down :( + glClipControl(GL_UPPER_LEFT, GL_NEGATIVE_ONE_TO_ONE); + } glBindFramebuffer(GL_FRAMEBUFFER_EXT, fb); glDepthMask(GL_TRUE); @@ -687,7 +691,9 @@ void gfx_opengl_reset_framebuffer(void) glBindFramebuffer(GL_FRAMEBUFFER, 0); glBindFramebuffer(GL_FRAMEBUFFER_EXT, framebuffer); - glClipControl(GL_LOWER_LEFT, GL_NEGATIVE_ONE_TO_ONE); + if (GLEW_ARB_clip_control || GLEW_VERSION_4_5) { + glClipControl(GL_LOWER_LEFT, GL_NEGATIVE_ONE_TO_ONE); + } } void gfx_opengl_select_texture_fb(int fbID) From 438fa8954c499fb4f65670873c37a51c7fbd7300 Mon Sep 17 00:00:00 2001 From: Kenix3 Date: Thu, 31 Mar 2022 17:39:12 -0400 Subject: [PATCH 15/83] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index aebd5b71b..ad6581078 100644 --- a/README.md +++ b/README.md @@ -95,6 +95,7 @@ Official Discord: https://discord.com/invite/BtBmd55HVH Rrrrry123 | Speedbunner, encouragement, and community moderation Fierce deity | Encouragement and community moderation mzxrules | For his contributions to decomp + zel. | For his contributions to decomp Aloxado | Developer - General Programmer MegaMech | Developer - General Programmer Revo | Tester - GCC support and General Testing From 8bb9dd8aba29a025cd2f5f9f413ef0740247ac52 Mon Sep 17 00:00:00 2001 From: Kenix3 Date: Thu, 31 Mar 2022 17:39:47 -0400 Subject: [PATCH 16/83] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ad6581078..5aac83267 100644 --- a/README.md +++ b/README.md @@ -95,7 +95,7 @@ Official Discord: https://discord.com/invite/BtBmd55HVH Rrrrry123 | Speedbunner, encouragement, and community moderation Fierce deity | Encouragement and community moderation mzxrules | For his contributions to decomp - zel. | For his contributions to decomp + zel. | For his contributions to decomp Aloxado | Developer - General Programmer MegaMech | Developer - General Programmer Revo | Tester - GCC support and General Testing From e7e80c2c956f5ab92a80982bd8ceb5e9c7c3a327 Mon Sep 17 00:00:00 2001 From: MegaMech Date: Thu, 31 Mar 2022 15:40:25 -0600 Subject: [PATCH 17/83] Clarified compiliation step (#127) * Update README.md * Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5aac83267..a002eee8a 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ Official Discord: https://discord.com/invite/BtBmd55HVH 2. Install [Visual Studio 2022 Community Edition](https://visualstudio.microsoft.com/vs/community/) 2b. In the Visual Studio Installer, install `MSVC v142 - VS 2019 C++`. 4. Clone the Ship of Harkinian repository. - 5. Put your 2020 OoT debug rom in the `soh` folder. + 5. Place `oot debug` rom (not Master Quest) in the `soh` folder named `baserom_original_non_mq`. 6. Launch `soh/fixbaserom.py`. 7. Launch `soh/extract_baserom.py`. 8. Copy the `baserom` folder from the `soh` folder into the `OTRExporter` folder. From 572e9fb9d0c6475f7bf9cf0801a50ff19c0567c5 Mon Sep 17 00:00:00 2001 From: Andrew Piper Date: Thu, 31 Mar 2022 18:32:32 -0400 Subject: [PATCH 18/83] Add an enhancement for a minimal ui. (#102) This removes the button backgrounds, hides the hearts when they are full and the magic when its not in use. It also hides the rupee / key counters. All this is still visible on the pause screen or when the minimap is visible. It also changes the minimap behavior to be hidden by default on a zone change. --- libultraship/libultraship/GameSettings.cpp | 5 +- libultraship/libultraship/GameSettings.h | 1 + libultraship/libultraship/SohImGuiImpl.cpp | 5 + soh/soh/Enhancements/bootcommands.c | 1 + soh/src/code/z_construct.c | 2 +- soh/src/code/z_parameter.c | 210 ++++++++++++--------- 6 files changed, 129 insertions(+), 95 deletions(-) diff --git a/libultraship/libultraship/GameSettings.cpp b/libultraship/libultraship/GameSettings.cpp index c638468af..1186fa27c 100644 --- a/libultraship/libultraship/GameSettings.cpp +++ b/libultraship/libultraship/GameSettings.cpp @@ -58,6 +58,9 @@ namespace Game { Settings.enhancements.animated_pause_menu = stob(Conf[EnhancementSection]["animated_pause_menu"]); CVar_SetS32(const_cast("gPauseLiveLink"), Settings.enhancements.animated_pause_menu); + Settings.enhancements.minimal_ui = stob(Conf[EnhancementSection]["minimal_ui"]); + CVar_SetS32(const_cast("gMinimalUI"), Settings.enhancements.minimal_ui); + // Audio Settings.audio.master = Ship::stof(Conf[AudioSection]["master"]); CVar_SetFloat(const_cast("gGameMasterVolume"), Settings.audio.master); @@ -139,7 +142,7 @@ namespace Game { Conf[EnhancementSection]["fast_text"] = std::to_string(Settings.enhancements.fast_text); Conf[EnhancementSection]["disable_lod"] = std::to_string(Settings.enhancements.disable_lod); Conf[EnhancementSection]["animated_pause_menu"] = std::to_string(Settings.enhancements.animated_pause_menu); - + Conf[EnhancementSection]["minimal_ui"] = std::to_string(Settings.enhancements.minimal_ui); // Controllers Conf[ControllerSection]["gyro_sensitivity"] = std::to_string(Settings.controller.gyro_sensitivity); diff --git a/libultraship/libultraship/GameSettings.h b/libultraship/libultraship/GameSettings.h index be974fd80..4f9bb4c99 100644 --- a/libultraship/libultraship/GameSettings.h +++ b/libultraship/libultraship/GameSettings.h @@ -23,6 +23,7 @@ struct SoHConfigType { bool fast_text = false; bool disable_lod = false; bool animated_pause_menu = false; + bool minimal_ui = false; } enhancements; // Controller diff --git a/libultraship/libultraship/SohImGuiImpl.cpp b/libultraship/libultraship/SohImGuiImpl.cpp index abc51a535..d95a27d08 100644 --- a/libultraship/libultraship/SohImGuiImpl.cpp +++ b/libultraship/libultraship/SohImGuiImpl.cpp @@ -341,6 +341,11 @@ namespace SohImGui { needs_save = true; } + if (ImGui::Checkbox("Minimal UI", &Game::Settings.enhancements.minimal_ui)) { + CVar_SetS32(const_cast("gMinimalUI"), Game::Settings.enhancements.minimal_ui); + needs_save = true; + } + ImGui::Text("Graphics"); ImGui::Separator(); diff --git a/soh/soh/Enhancements/bootcommands.c b/soh/soh/Enhancements/bootcommands.c index 6901c4644..685593179 100644 --- a/soh/soh/Enhancements/bootcommands.c +++ b/soh/soh/Enhancements/bootcommands.c @@ -24,6 +24,7 @@ void BootCommands_Init() CVar_RegisterS32("gDisableLOD", 0); CVar_RegisterS32("gDebugEnabled", 0); CVar_RegisterS32("gPauseLiveLink", 0); + CVar_RegisterS32("gMinimalUI", 0); } //void BootCommands_ParseBootArgs(char* str) diff --git a/soh/src/code/z_construct.c b/soh/src/code/z_construct.c index 2fd6d43ad..5149fd974 100644 --- a/soh/src/code/z_construct.c +++ b/soh/src/code/z_construct.c @@ -462,7 +462,7 @@ void func_80111070(void) { WREG(28) = 0; R_OW_MINIMAP_X = 238; R_OW_MINIMAP_Y = 164; - R_MINIMAP_DISABLED = false; + R_MINIMAP_DISABLED = CVar_GetS32("gMinimalUI", 0); WREG(32) = 122; WREG(33) = 60; WREG(35) = 0; diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index 8bce65a7b..1653cdaaf 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -3143,6 +3143,7 @@ void Interface_Draw(GlobalContext* globalCtx) { s16 svar4; s16 svar5; s16 svar6; + bool fullUi = !CVar_GetS32("gMinimalUI", 0) || !R_MINIMAP_DISABLED || globalCtx->pauseCtx.state != 0; OPEN_DISPS(globalCtx->state.gfxCtx, "../z_parameter.c", 3405); @@ -3158,111 +3159,123 @@ void Interface_Draw(GlobalContext* globalCtx) { if (pauseCtx->debugState == 0) { Interface_InitVertices(globalCtx); func_8008A994(interfaceCtx); - HealthMeter_Draw(globalCtx); + if (fullUi || gSaveContext.health != gSaveContext.healthCapacity) { + HealthMeter_Draw(globalCtx); + } func_80094520(globalCtx->state.gfxCtx); - // Rupee Icon - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 200, 255, 100, interfaceCtx->magicAlpha); - gDPSetEnvColor(OVERLAY_DISP++, 0, 80, 0, 255); - OVERLAY_DISP = Gfx_TextureIA8(OVERLAY_DISP, gRupeeCounterIconTex, 16, 16, OTRGetRectDimensionFromLeftEdge(26), - 206, 16, 16, 1 << 10, 1 << 10); + if (fullUi) { + // Rupee Icon + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 200, 255, 100, interfaceCtx->magicAlpha); + gDPSetEnvColor(OVERLAY_DISP++, 0, 80, 0, 255); + OVERLAY_DISP = Gfx_TextureIA8(OVERLAY_DISP, gRupeeCounterIconTex, 16, 16, OTRGetRectDimensionFromLeftEdge(26), + 206, 16, 16, 1 << 10, 1 << 10); - switch (globalCtx->sceneNum) { - case SCENE_BMORI1: - case SCENE_HIDAN: - case SCENE_MIZUSIN: - case SCENE_JYASINZOU: - case SCENE_HAKADAN: - case SCENE_HAKADANCH: - case SCENE_ICE_DOUKUTO: - case SCENE_GANON: - case SCENE_MEN: - case SCENE_GERUDOWAY: - case SCENE_GANONTIKA: - case SCENE_GANON_SONOGO: - case SCENE_GANONTIKA_SONOGO: - case SCENE_TAKARAYA: - if (gSaveContext.inventory.dungeonKeys[gSaveContext.mapIndex] >= 0) { - // Small Key Icon - gDPPipeSync(OVERLAY_DISP++); - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 200, 230, 255, interfaceCtx->magicAlpha); - gDPSetEnvColor(OVERLAY_DISP++, 0, 0, 20, 255); - OVERLAY_DISP = Gfx_TextureIA8(OVERLAY_DISP, gSmallKeyCounterIconTex, 16, 16, OTRGetRectDimensionFromLeftEdge(26), 190, 16, 16, - 1 << 10, 1 << 10); + switch (globalCtx->sceneNum) { + case SCENE_BMORI1: + case SCENE_HIDAN: + case SCENE_MIZUSIN: + case SCENE_JYASINZOU: + case SCENE_HAKADAN: + case SCENE_HAKADANCH: + case SCENE_ICE_DOUKUTO: + case SCENE_GANON: + case SCENE_MEN: + case SCENE_GERUDOWAY: + case SCENE_GANONTIKA: + case SCENE_GANON_SONOGO: + case SCENE_GANONTIKA_SONOGO: + case SCENE_TAKARAYA: + if (gSaveContext.inventory.dungeonKeys[gSaveContext.mapIndex] >= 0) { + // Small Key Icon + gDPPipeSync(OVERLAY_DISP++); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 200, 230, 255, interfaceCtx->magicAlpha); + gDPSetEnvColor(OVERLAY_DISP++, 0, 0, 20, 255); + OVERLAY_DISP = Gfx_TextureIA8(OVERLAY_DISP, gSmallKeyCounterIconTex, 16, 16, OTRGetRectDimensionFromLeftEdge(26), 190, 16, 16, + 1 << 10, 1 << 10); - // Small Key Counter - gDPPipeSync(OVERLAY_DISP++); - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->magicAlpha); - gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, - TEXEL0, 0, PRIMITIVE, 0); + // Small Key Counter + gDPPipeSync(OVERLAY_DISP++); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->magicAlpha); + gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, + TEXEL0, 0, PRIMITIVE, 0); - interfaceCtx->counterDigits[2] = 0; - interfaceCtx->counterDigits[3] = gSaveContext.inventory.dungeonKeys[gSaveContext.mapIndex]; + interfaceCtx->counterDigits[2] = 0; + interfaceCtx->counterDigits[3] = gSaveContext.inventory.dungeonKeys[gSaveContext.mapIndex]; - while (interfaceCtx->counterDigits[3] >= 10) { - interfaceCtx->counterDigits[2]++; - interfaceCtx->counterDigits[3] -= 10; + while (interfaceCtx->counterDigits[3] >= 10) { + interfaceCtx->counterDigits[2]++; + interfaceCtx->counterDigits[3] -= 10; + } + + svar3 = OTRGetRectDimensionFromLeftEdge(42); + + if (interfaceCtx->counterDigits[2] != 0) { + OVERLAY_DISP = Gfx_TextureI8(OVERLAY_DISP, ((u8*)((u8*)digitTextures[interfaceCtx->counterDigits[2]])), 8, + 16, svar3, 190, 8, 16, 1 << 10, 1 << 10); + svar3 += 8; + } + + OVERLAY_DISP = Gfx_TextureI8(OVERLAY_DISP, + ((u8*)digitTextures[interfaceCtx->counterDigits[3]]), 8, 16, + svar3, 190, 8, 16, 1 << 10, 1 << 10); } + break; + default: + break; + } - svar3 = OTRGetRectDimensionFromLeftEdge(42); + // Rupee Counter + gDPPipeSync(OVERLAY_DISP++); - if (interfaceCtx->counterDigits[2] != 0) { - OVERLAY_DISP = Gfx_TextureI8(OVERLAY_DISP, ((u8*)((u8*)digitTextures[interfaceCtx->counterDigits[2]])), 8, - 16, svar3, 190, 8, 16, 1 << 10, 1 << 10); - svar3 += 8; - } + if (gSaveContext.rupees == CUR_CAPACITY(UPG_WALLET)) { + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 120, 255, 0, interfaceCtx->magicAlpha); + } else if (gSaveContext.rupees != 0) { + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->magicAlpha); + } else { + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 100, 100, 100, interfaceCtx->magicAlpha); + } - OVERLAY_DISP = Gfx_TextureI8(OVERLAY_DISP, - ((u8*)digitTextures[interfaceCtx->counterDigits[3]]), 8, 16, - svar3, 190, 8, 16, 1 << 10, 1 << 10); - } - break; - default: - break; + gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, + PRIMITIVE, 0); + + interfaceCtx->counterDigits[0] = interfaceCtx->counterDigits[1] = 0; + interfaceCtx->counterDigits[2] = gSaveContext.rupees; + + if ((interfaceCtx->counterDigits[2] > 9999) || (interfaceCtx->counterDigits[2] < 0)) { + interfaceCtx->counterDigits[2] &= 0xDDD; + } + + while (interfaceCtx->counterDigits[2] >= 100) { + interfaceCtx->counterDigits[0]++; + interfaceCtx->counterDigits[2] -= 100; + } + + while (interfaceCtx->counterDigits[2] >= 10) { + interfaceCtx->counterDigits[1]++; + interfaceCtx->counterDigits[2] -= 10; + } + + svar2 = rupeeDigitsFirst[CUR_UPG_VALUE(UPG_WALLET)]; + svar5 = rupeeDigitsCount[CUR_UPG_VALUE(UPG_WALLET)]; + + for (svar1 = 0, svar3 = 42; svar1 < svar5; svar1++, svar2++, svar3 += 8) { + OVERLAY_DISP = + Gfx_TextureI8(OVERLAY_DISP, ((u8*)digitTextures[interfaceCtx->counterDigits[svar2]]), 8, 16, + OTRGetRectDimensionFromLeftEdge(svar3), 206, 8, 16, 1 << 10, 1 << 10); + } + } + else { + // Make sure item counts have black backgrounds + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 0, 0, interfaceCtx->magicAlpha); + gDPSetEnvColor(OVERLAY_DISP++, 0, 0, 0, 0); } - // Rupee Counter - gDPPipeSync(OVERLAY_DISP++); - - if (gSaveContext.rupees == CUR_CAPACITY(UPG_WALLET)) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 120, 255, 0, interfaceCtx->magicAlpha); - } else if (gSaveContext.rupees != 0) { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->magicAlpha); - } else { - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 100, 100, 100, interfaceCtx->magicAlpha); + if (fullUi || gSaveContext.unk_13F0 > 0) { + Interface_DrawMagicBar(globalCtx); } - gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, - PRIMITIVE, 0); - - interfaceCtx->counterDigits[0] = interfaceCtx->counterDigits[1] = 0; - interfaceCtx->counterDigits[2] = gSaveContext.rupees; - - if ((interfaceCtx->counterDigits[2] > 9999) || (interfaceCtx->counterDigits[2] < 0)) { - interfaceCtx->counterDigits[2] &= 0xDDD; - } - - while (interfaceCtx->counterDigits[2] >= 100) { - interfaceCtx->counterDigits[0]++; - interfaceCtx->counterDigits[2] -= 100; - } - - while (interfaceCtx->counterDigits[2] >= 10) { - interfaceCtx->counterDigits[1]++; - interfaceCtx->counterDigits[2] -= 10; - } - - svar2 = rupeeDigitsFirst[CUR_UPG_VALUE(UPG_WALLET)]; - svar5 = rupeeDigitsCount[CUR_UPG_VALUE(UPG_WALLET)]; - - for (svar1 = 0, svar3 = 42; svar1 < svar5; svar1++, svar2++, svar3 += 8) { - OVERLAY_DISP = - Gfx_TextureI8(OVERLAY_DISP, ((u8*)digitTextures[interfaceCtx->counterDigits[svar2]]), 8, 16, - OTRGetRectDimensionFromLeftEdge(svar3), 206, 8, 16, 1 << 10, 1 << 10); - } - - Interface_DrawMagicBar(globalCtx); Minimap_Draw(globalCtx); if ((R_PAUSE_MENU_MODE != 2) && (R_PAUSE_MENU_MODE != 3)) { @@ -3271,7 +3284,9 @@ void Interface_Draw(GlobalContext* globalCtx) { func_80094520(globalCtx->state.gfxCtx); - Interface_DrawItemButtons(globalCtx); + if (fullUi) { + Interface_DrawItemButtons(globalCtx); + } gDPPipeSync(OVERLAY_DISP++); gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->bAlpha); @@ -3281,10 +3296,17 @@ void Interface_Draw(GlobalContext* globalCtx) { // B Button Icon & Ammo Count if (gSaveContext.equips.buttonItems[0] != ITEM_NONE) { - Interface_DrawItemIconTexture(globalCtx, gItemIcons[gSaveContext.equips.buttonItems[0]], 0); + if (fullUi) { + Interface_DrawItemIconTexture(globalCtx, gItemIcons[gSaveContext.equips.buttonItems[0]], 0); + } if ((player->stateFlags1 & 0x00800000) || (globalCtx->shootingGalleryStatus > 1) || ((globalCtx->sceneNum == SCENE_BOWLING) && Flags_GetSwitch(globalCtx, 0x38))) { + + if (!fullUi) { + Interface_DrawItemIconTexture(globalCtx, gItemIcons[gSaveContext.equips.buttonItems[0]], 0); + } + gDPPipeSync(OVERLAY_DISP++); gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); @@ -3357,7 +3379,9 @@ void Interface_Draw(GlobalContext* globalCtx) { gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); gDPSetPrimColor(OVERLAY_DISP++, 0, 0, R_A_BTN_COLOR(0), R_A_BTN_COLOR(1), R_A_BTN_COLOR(2), interfaceCtx->aAlpha); - Interface_DrawActionButton(globalCtx, rABtnX, R_A_BTN_Y); + if (fullUi) { + Interface_DrawActionButton(globalCtx, rABtnX, R_A_BTN_Y); + } gDPPipeSync(OVERLAY_DISP++); const f32 rAIconX = OTRGetDimensionFromRightEdge(R_A_ICON_X); //func_8008A8B8(globalCtx, R_A_ICON_Y, R_A_ICON_Y + 45, rAIconX, rAIconX + 45); From c80f9fbd57d2ae90fa87a1e34d906a265de20e55 Mon Sep 17 00:00:00 2001 From: Nicholas Estelami Date: Thu, 31 Mar 2022 19:42:44 -0400 Subject: [PATCH 19/83] Added support for multiple game versions (#107) * WIP Multiversion support * GC PAL Non-MQ support complete * Updated OtrGui to handle different game versions * Added version file * Added new extract mode to ZAPD and optimized OTR gen time * Fixed bug causing crash * Further optimized OTRExporter, saving around ~20 seconds. * ZAPD is now multi-threaded. * Fixed merge issue * Fixed memory leak and fog issue on pause screen. * Additional fog fixes. Co-authored-by: Jack Walker <7463599+Jack-Walker@users.noreply.github.com> --- OTRExporter/.gitignore | 2 + OTRExporter/CFG/Config.xml | 2 +- OTRExporter/CFG/filelists/dbg.txt | 1532 ++++++++++++++++ OTRExporter/CFG/filelists/gamecube.txt | 1509 ++++++++++++++++ OTRExporter/CFG/filelists/gamecube_pal.txt | 1510 ++++++++++++++++ .../OTRExporter/DisplayListExporter.cpp | 128 +- OTRExporter/OTRExporter/Main.cpp | 36 +- OTRExporter/OTRExporter/Main.h | 3 +- OTRExporter/OTRExporter/OTRExporter.vcxproj | 18 + OTRExporter/OTRExporter/RoomExporter.cpp | 16 +- OTRExporter/OTRExporter/SkeletonExporter.cpp | 2 +- .../OTRExporter/SkeletonLimbExporter.cpp | 8 +- OTRExporter/extract_assets.py | 12 +- OTRExporter/extract_baserom_debug.py | 1608 +++++++++++++++++ OTRExporter/extract_baserom_gc.py | 1586 ++++++++++++++++ .../{Config.xml => Config_GC_MQ_D.xml} | 2 +- OTRGui/assets/extractor/Config_GC_NMQ_D.xml | 8 + .../assets/extractor/Config_GC_NMQ_PAL_F.xml | 8 + .../extractor/filelists/gamecube_pal.txt | 1510 ++++++++++++++++ OTRGui/src/game/game.cpp | 30 +- .../baserom_extractor/baserom_extractor.cpp | 25 +- .../baserom_extractor/baserom_extractor.h | 18 +- OTRGui/src/impl/extractor/extractor.cpp | 115 +- OTRGui/src/impl/extractor/extractor.h | 4 +- OTRGui/src/utils/mutils.cpp | 6 +- ZAPDTR/ZAPD/CRC32.h | 2 +- ZAPDTR/ZAPD/Declaration.cpp | 7 + ZAPDTR/ZAPD/Declaration.h | 6 + ZAPDTR/ZAPD/FileWorker.cpp | 0 ZAPDTR/ZAPD/FileWorker.h | 15 + ZAPDTR/ZAPD/Globals.cpp | 128 +- ZAPDTR/ZAPD/Globals.h | 24 +- ZAPDTR/ZAPD/Main.cpp | 188 +- ZAPDTR/ZAPD/OtherStructs/SkinLimbStructs.cpp | 11 +- ZAPDTR/ZAPD/OutputFormatter.cpp | 8 +- ZAPDTR/ZAPD/OutputFormatter.h | 2 +- ZAPDTR/ZAPD/Overlays/ZOverlay.cpp | 2 + ZAPDTR/ZAPD/Overlays/ZOverlay.h | 3 + ZAPDTR/ZAPD/ZAPD.vcxproj | 28 + ZAPDTR/ZAPD/ZAPD.vcxproj.filters | 30 + ZAPDTR/ZAPD/ZAnimation.cpp | 45 +- ZAPDTR/ZAPD/ZArray.cpp | 3 +- ZAPDTR/ZAPD/ZBackground.cpp | 7 +- ZAPDTR/ZAPD/ZCollision.cpp | 73 +- ZAPDTR/ZAPD/ZDisplayList.cpp | 67 +- ZAPDTR/ZAPD/ZFile.cpp | 38 +- ZAPDTR/ZAPD/ZFile.h | 7 +- ZAPDTR/ZAPD/ZLimb.cpp | 20 +- ZAPDTR/ZAPD/ZPath.cpp | 7 +- ZAPDTR/ZAPD/ZPlayerAnimationData.cpp | 4 + ZAPDTR/ZAPD/ZResource.cpp | 34 +- ZAPDTR/ZAPD/ZRom.cpp | 202 +++ ZAPDTR/ZAPD/ZRom.h | 27 + .../ZRoom/Commands/SetActorCutsceneList.cpp | 3 +- ZAPDTR/ZAPD/ZRoom/Commands/SetActorList.cpp | 3 +- .../ZRoom/Commands/SetAlternateHeaders.cpp | 6 +- .../Commands/SetAnimatedMaterialList.cpp | 3 +- .../ZRoom/Commands/SetCollisionHeader.cpp | 3 +- ZAPDTR/ZAPD/ZRoom/Commands/SetCsCamera.cpp | 5 +- ZAPDTR/ZAPD/ZRoom/Commands/SetCutscenes.cpp | 3 +- .../ZAPD/ZRoom/Commands/SetEntranceList.cpp | 3 +- ZAPDTR/ZAPD/ZRoom/Commands/SetExitList.cpp | 2 +- ZAPDTR/ZAPD/ZRoom/Commands/SetLightList.cpp | 3 +- .../ZRoom/Commands/SetLightingSettings.cpp | 3 +- ZAPDTR/ZAPD/ZRoom/Commands/SetMesh.cpp | 14 +- .../ZAPD/ZRoom/Commands/SetMinimapChests.cpp | 3 +- ZAPDTR/ZAPD/ZRoom/Commands/SetMinimapList.cpp | 6 +- ZAPDTR/ZAPD/ZRoom/Commands/SetObjectList.cpp | 2 +- ZAPDTR/ZAPD/ZRoom/Commands/SetPathways.cpp | 2 +- ZAPDTR/ZAPD/ZRoom/Commands/SetRoomList.cpp | 2 +- .../ZRoom/Commands/SetStartPositionList.cpp | 3 +- .../ZRoom/Commands/SetTransitionActorList.cpp | 3 +- ZAPDTR/ZAPD/ZSkeleton.cpp | 6 +- ZAPDTR/ZAPD/ZText.cpp | 9 +- ZAPDTR/ZAPD/ZTexture.cpp | 48 +- ZAPDTR/ZAPD/ZTextureAnimation.cpp | 20 +- ZAPDTR/ZAPD/ctpl_stl.h | 251 +++ ZAPDTR/ZAPD/yaz0/readwrite.h | 29 + ZAPDTR/ZAPD/yaz0/yaz0.cpp | 227 +++ ZAPDTR/ZAPD/yaz0/yaz0.h | 6 + ZAPDTR/ZAPDUtils/ZAPDUtils.vcxproj | 18 + ZAPDTR/ZAPDUtils/ZAPDUtils.vcxproj.filters | 16 +- ZAPDTR/lib/libgfxd/priv.h | 4 +- libultraship/libultraship/GameVersions.h | 20 + .../libultraship/Lib/Fast3D/gfx_pc.cpp | 12 +- libultraship/libultraship/Lib/Fast3D/gfx_pc.h | 2 +- libultraship/libultraship/ResourceMgr.cpp | 91 +- libultraship/libultraship/ResourceMgr.h | 3 + .../libultraship/libultraship.vcxproj | 25 + .../libultraship/libultraship.vcxproj.filters | 3 + .../xml/{ => GC_NMQ_D}/code/fbdemo_circle.xml | 0 .../{ => GC_NMQ_D}/code/fbdemo_triforce.xml | 0 .../xml/{ => GC_NMQ_D}/code/fbdemo_wipe1.xml | 0 .../{ => GC_NMQ_D}/misc/link_animetion.xml | 0 .../objects/gameplay_dangeon_keep.xml | 0 .../objects/gameplay_field_keep.xml | 0 .../{ => GC_NMQ_D}/objects/gameplay_keep.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_Bb.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_ahg.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_am.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_ane.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_ani.xml | 0 .../{ => GC_NMQ_D}/objects/object_anubice.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_aob.xml | 0 .../{ => GC_NMQ_D}/objects/object_b_heart.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_bba.xml | 0 .../objects/object_bdan_objects.xml | 0 .../{ => GC_NMQ_D}/objects/object_bdoor.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_bg.xml | 0 .../objects/object_bigokuta.xml | 0 .../{ => GC_NMQ_D}/objects/object_bird.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_bji.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_bl.xml | 0 .../{ => GC_NMQ_D}/objects/object_blkobj.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_bob.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_boj.xml | 0 .../{ => GC_NMQ_D}/objects/object_bombf.xml | 0 .../{ => GC_NMQ_D}/objects/object_bombiwa.xml | 0 .../{ => GC_NMQ_D}/objects/object_bowl.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_box.xml | 0 .../{ => GC_NMQ_D}/objects/object_brob.xml | 0 .../{ => GC_NMQ_D}/objects/object_bubble.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_bv.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_bw.xml | 0 .../{ => GC_NMQ_D}/objects/object_bwall.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_bxa.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_cne.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_cob.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_cow.xml | 0 .../{ => GC_NMQ_D}/objects/object_crow.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_cs.xml | 0 .../objects/object_d_elevator.xml | 0 .../objects/object_d_hsblock.xml | 0 .../{ => GC_NMQ_D}/objects/object_d_lift.xml | 0 .../{ => GC_NMQ_D}/objects/object_daiku.xml | 0 .../objects/object_ddan_objects.xml | 0 .../objects/object_dekubaba.xml | 0 .../{ => GC_NMQ_D}/objects/object_dekujr.xml | 0 .../objects/object_dekunuts.xml | 0 .../{ => GC_NMQ_D}/objects/object_demo_6k.xml | 0 .../objects/object_demo_kekkai.xml | 0 .../objects/object_demo_tre_lgt.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_dh.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_dnk.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_dns.xml | 0 .../{ => GC_NMQ_D}/objects/object_dodojr.xml | 0 .../{ => GC_NMQ_D}/objects/object_dodongo.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_dog.xml | 0 .../objects/object_door_gerudo.xml | 0 .../objects/object_door_killer.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_ds.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_ds2.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_du.xml | 0 .../{ => GC_NMQ_D}/objects/object_dy_obj.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_ec.xml | 0 .../objects/object_efc_crystal_light.xml | 0 .../objects/object_efc_doughnut.xml | 0 .../objects/object_efc_erupc.xml | 0 .../objects/object_efc_fire_ball.xml | 0 .../objects/object_efc_flash.xml | 0 .../objects/object_efc_lgt_shower.xml | 0 .../objects/object_efc_star_field.xml | 0 .../{ => GC_NMQ_D}/objects/object_efc_tw.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_ei.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_fa.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_fd.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_fd2.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_fhg.xml | 0 .../{ => GC_NMQ_D}/objects/object_fire.xml | 0 .../{ => GC_NMQ_D}/objects/object_firefly.xml | 0 .../{ => GC_NMQ_D}/objects/object_fish.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_fr.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_fu.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_fw.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_fz.xml | 0 .../{ => GC_NMQ_D}/objects/object_ganon.xml | 0 .../{ => GC_NMQ_D}/objects/object_ganon2.xml | 0 .../objects/object_ganon_anime1.xml | 0 .../objects/object_ganon_anime2.xml | 0 .../objects/object_ganon_anime3.xml | 0 .../objects/object_ganon_objects.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_ge1.xml | 0 .../{ => GC_NMQ_D}/objects/object_geff.xml | 0 .../{ => GC_NMQ_D}/objects/object_geldb.xml | 0 .../objects/object_gi_arrow.xml | 0 .../objects/object_gi_arrowcase.xml | 0 .../{ => GC_NMQ_D}/objects/object_gi_bean.xml | 0 .../objects/object_gi_bomb_1.xml | 0 .../objects/object_gi_bomb_2.xml | 0 .../objects/object_gi_bombpouch.xml | 0 .../objects/object_gi_boomerang.xml | 0 .../objects/object_gi_boots_2.xml | 0 .../objects/object_gi_bosskey.xml | 0 .../objects/object_gi_bottle.xml | 0 .../objects/object_gi_bottle_letter.xml | 0 .../{ => GC_NMQ_D}/objects/object_gi_bow.xml | 0 .../objects/object_gi_bracelet.xml | 0 .../objects/object_gi_brokensword.xml | 0 .../objects/object_gi_butterfly.xml | 0 .../objects/object_gi_clothes.xml | 0 .../{ => GC_NMQ_D}/objects/object_gi_coin.xml | 0 .../objects/object_gi_compass.xml | 0 .../objects/object_gi_dekupouch.xml | 0 .../{ => GC_NMQ_D}/objects/object_gi_egg.xml | 0 .../objects/object_gi_eye_lotion.xml | 0 .../{ => GC_NMQ_D}/objects/object_gi_fire.xml | 0 .../{ => GC_NMQ_D}/objects/object_gi_fish.xml | 0 .../{ => GC_NMQ_D}/objects/object_gi_frog.xml | 0 .../objects/object_gi_gerudo.xml | 0 .../objects/object_gi_gerudomask.xml | 0 .../objects/object_gi_ghost.xml | 0 .../objects/object_gi_glasses.xml | 0 .../objects/object_gi_gloves.xml | 0 .../objects/object_gi_goddess.xml | 0 .../objects/object_gi_golonmask.xml | 0 .../objects/object_gi_grass.xml | 0 .../objects/object_gi_hammer.xml | 0 .../objects/object_gi_heart.xml | 0 .../objects/object_gi_hearts.xml | 0 .../objects/object_gi_hookshot.xml | 0 .../objects/object_gi_hoverboots.xml | 0 .../objects/object_gi_insect.xml | 0 .../objects/object_gi_jewel.xml | 0 .../{ => GC_NMQ_D}/objects/object_gi_key.xml | 0 .../objects/object_gi_ki_tan_mask.xml | 0 .../objects/object_gi_letter.xml | 0 .../objects/object_gi_liquid.xml | 0 .../objects/object_gi_longsword.xml | 0 .../objects/object_gi_m_arrow.xml | 0 .../objects/object_gi_magicpot.xml | 0 .../{ => GC_NMQ_D}/objects/object_gi_map.xml | 0 .../objects/object_gi_medal.xml | 0 .../objects/object_gi_melody.xml | 0 .../{ => GC_NMQ_D}/objects/object_gi_milk.xml | 0 .../objects/object_gi_mushroom.xml | 0 .../objects/object_gi_niwatori.xml | 0 .../{ => GC_NMQ_D}/objects/object_gi_nuts.xml | 0 .../objects/object_gi_ocarina.xml | 0 .../objects/object_gi_ocarina_0.xml | 0 .../objects/object_gi_pachinko.xml | 0 .../objects/object_gi_powder.xml | 0 .../objects/object_gi_prescription.xml | 0 .../objects/object_gi_purse.xml | 0 .../objects/object_gi_rabit_mask.xml | 0 .../objects/object_gi_redead_mask.xml | 0 .../{ => GC_NMQ_D}/objects/object_gi_rupy.xml | 0 .../{ => GC_NMQ_D}/objects/object_gi_saw.xml | 0 .../objects/object_gi_scale.xml | 0 .../{ => GC_NMQ_D}/objects/object_gi_seed.xml | 0 .../objects/object_gi_shield_1.xml | 0 .../objects/object_gi_shield_2.xml | 0 .../objects/object_gi_shield_3.xml | 0 .../objects/object_gi_skj_mask.xml | 0 .../objects/object_gi_soldout.xml | 0 .../{ => GC_NMQ_D}/objects/object_gi_soul.xml | 0 .../objects/object_gi_stick.xml | 0 .../objects/object_gi_sutaru.xml | 0 .../objects/object_gi_sword_1.xml | 0 .../objects/object_gi_ticketstone.xml | 0 .../objects/object_gi_truth_mask.xml | 0 .../objects/object_gi_zoramask.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_gj.xml | 0 .../objects/object_gjyo_objects.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_gla.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_gm.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_gnd.xml | 0 .../objects/object_gnd_magic.xml | 0 .../{ => GC_NMQ_D}/objects/object_gndd.xml | 0 .../{ => GC_NMQ_D}/objects/object_god_lgt.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_gol.xml | 0 .../{ => GC_NMQ_D}/objects/object_goma.xml | 0 .../{ => GC_NMQ_D}/objects/object_goroiwa.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_gr.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_gs.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_gt.xml | 0 .../{ => GC_NMQ_D}/objects/object_haka.xml | 0 .../objects/object_haka_door.xml | 0 .../objects/object_haka_objects.xml | 0 .../objects/object_hakach_objects.xml | 0 .../{ => GC_NMQ_D}/objects/object_hata.xml | 0 .../objects/object_heavy_object.xml | 0 .../objects/object_hidan_objects.xml | 0 .../objects/object_hintnuts.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_hni.xml | 0 .../{ => GC_NMQ_D}/objects/object_horse.xml | 0 .../objects/object_horse_ganon.xml | 0 .../objects/object_horse_link_child.xml | 0 .../objects/object_horse_normal.xml | 0 .../objects/object_horse_zelda.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_hs.xml | 0 .../{ => GC_NMQ_D}/objects/object_human.xml | 0 .../objects/object_ice_objects.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_ik.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_im.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_in.xml | 0 .../{ => GC_NMQ_D}/objects/object_ingate.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_jj.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_js.xml | 0 .../objects/object_jya_door.xml | 0 .../objects/object_jya_iron.xml | 0 .../{ => GC_NMQ_D}/objects/object_jya_obj.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_ka.xml | 0 .../{ => GC_NMQ_D}/objects/object_kanban.xml | 0 .../{ => GC_NMQ_D}/objects/object_kibako2.xml | 0 .../objects/object_kingdodongo.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_km1.xml | 0 .../{ => GC_NMQ_D}/objects/object_kusa.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_kw1.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_kz.xml | 0 .../objects/object_light_ring.xml | 0 .../objects/object_lightbox.xml | 0 .../objects/object_lightswitch.xml | 0 .../objects/object_link_boy.xml | 0 .../objects/object_link_child.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_ma1.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_ma2.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_mag.xml | 0 .../objects/object_mamenoki.xml | 0 .../objects/object_mastergolon.xml | 0 .../objects/object_masterkokiri.xml | 0 .../objects/object_masterkokirihead.xml | 0 .../objects/object_masterzoora.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_mb.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_md.xml | 0 .../{ => GC_NMQ_D}/objects/object_medal.xml | 0 .../objects/object_menkuri_objects.xml | 0 .../{ => GC_NMQ_D}/objects/object_mir_ray.xml | 0 .../objects/object_mizu_objects.xml | 0 .../{ => GC_NMQ_D}/objects/object_mjin.xml | 0 .../objects/object_mjin_dark.xml | 0 .../objects/object_mjin_flame.xml | 0 .../objects/object_mjin_flash.xml | 0 .../objects/object_mjin_ice.xml | 0 .../objects/object_mjin_oka.xml | 0 .../objects/object_mjin_soul.xml | 0 .../objects/object_mjin_wind.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_mk.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_mm.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_mo.xml | 0 .../objects/object_mori_hineri1.xml | 0 .../objects/object_mori_hineri1a.xml | 0 .../objects/object_mori_hineri2.xml | 0 .../objects/object_mori_hineri2a.xml | 0 .../objects/object_mori_objects.xml | 0 .../objects/object_mori_tex.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_ms.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_mu.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_nb.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_niw.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_nwc.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_ny.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_oA1.xml | 0 .../{ => GC_NMQ_D}/objects/object_oA10.xml | 0 .../{ => GC_NMQ_D}/objects/object_oA11.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_oA2.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_oA3.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_oA4.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_oA5.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_oA6.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_oA7.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_oA8.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_oA9.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_oB1.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_oB2.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_oB3.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_oB4.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_oE1.xml | 0 .../{ => GC_NMQ_D}/objects/object_oE10.xml | 0 .../{ => GC_NMQ_D}/objects/object_oE11.xml | 0 .../{ => GC_NMQ_D}/objects/object_oE12.xml | 0 .../{ => GC_NMQ_D}/objects/object_oE1s.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_oE2.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_oE3.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_oE4.xml | 0 .../{ => GC_NMQ_D}/objects/object_oE4s.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_oE5.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_oE6.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_oE7.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_oE8.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_oE9.xml | 0 .../objects/object_oE_anime.xml | 0 .../objects/object_oF1d_map.xml | 0 .../{ => GC_NMQ_D}/objects/object_oF1s.xml | 0 .../{ => GC_NMQ_D}/objects/object_o_anime.xml | 0 .../{ => GC_NMQ_D}/objects/object_okuta.xml | 0 .../objects/object_opening_demo1.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_os.xml | 0 .../objects/object_os_anime.xml | 0 .../{ => GC_NMQ_D}/objects/object_ossan.xml | 0 .../objects/object_ouke_haka.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_owl.xml | 0 .../{ => GC_NMQ_D}/objects/object_peehat.xml | 0 .../objects/object_po_composer.xml | 0 .../objects/object_po_field.xml | 0 .../objects/object_po_sisters.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_poh.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_ps.xml | 0 .../{ => GC_NMQ_D}/objects/object_pu_box.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_rd.xml | 0 .../{ => GC_NMQ_D}/objects/object_reeba.xml | 0 .../objects/object_relay_objects.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_rl.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_rr.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_rs.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_ru1.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_ru2.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_sa.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_sb.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_sd.xml | 0 .../objects/object_shop_dungen.xml | 0 .../objects/object_shopnuts.xml | 0 .../{ => GC_NMQ_D}/objects/object_siofuki.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_sk2.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_skb.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_skj.xml | 0 .../objects/object_spot00_break.xml | 0 .../objects/object_spot00_objects.xml | 0 .../objects/object_spot01_matoya.xml | 0 .../objects/object_spot01_matoyab.xml | 0 .../objects/object_spot01_objects.xml | 0 .../objects/object_spot01_objects2.xml | 0 .../objects/object_spot02_objects.xml | 0 .../objects/object_spot03_object.xml | 0 .../objects/object_spot04_objects.xml | 0 .../objects/object_spot05_objects.xml | 0 .../objects/object_spot06_objects.xml | 0 .../objects/object_spot07_object.xml | 0 .../objects/object_spot08_obj.xml | 0 .../objects/object_spot09_obj.xml | 0 .../objects/object_spot11_obj.xml | 0 .../objects/object_spot12_obj.xml | 0 .../objects/object_spot15_obj.xml | 0 .../objects/object_spot16_obj.xml | 0 .../objects/object_spot17_obj.xml | 0 .../objects/object_spot18_obj.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_ssh.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_sst.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_st.xml | 0 .../{ => GC_NMQ_D}/objects/object_stream.xml | 0 .../objects/object_syokudai.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_ta.xml | 0 .../objects/object_timeblock.xml | 0 .../{ => GC_NMQ_D}/objects/object_tite.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_tk.xml | 0 .../objects/object_toki_objects.xml | 0 .../{ => GC_NMQ_D}/objects/object_torch2.xml | 0 .../{ => GC_NMQ_D}/objects/object_toryo.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_tp.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_tr.xml | 0 .../{ => GC_NMQ_D}/objects/object_trap.xml | 0 .../objects/object_triforce_spot.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_ts.xml | 0 .../{ => GC_NMQ_D}/objects/object_tsubo.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_tw.xml | 0 .../{ => GC_NMQ_D}/objects/object_umajump.xml | 0 .../{ => GC_NMQ_D}/objects/object_vali.xml | 0 .../{ => GC_NMQ_D}/objects/object_vase.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_vm.xml | 0 .../objects/object_wallmaster.xml | 0 .../{ => GC_NMQ_D}/objects/object_warp1.xml | 0 .../{ => GC_NMQ_D}/objects/object_warp2.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_wf.xml | 0 .../{ => GC_NMQ_D}/objects/object_wood02.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_xc.xml | 0 .../objects/object_yabusame_point.xml | 0 .../objects/object_ydan_objects.xml | 0 .../objects/object_yukabyun.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_zf.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_zg.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_zl1.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_zl2.xml | 0 .../objects/object_zl2_anime1.xml | 0 .../objects/object_zl2_anime2.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_zl4.xml | 0 .../xml/{ => GC_NMQ_D}/objects/object_zo.xml | 0 .../overlays/ovl_Arrow_Fire.xml | 0 .../{ => GC_NMQ_D}/overlays/ovl_Arrow_Ice.xml | 0 .../overlays/ovl_Arrow_Light.xml | 0 .../overlays/ovl_Bg_Ganon_Otyuka.xml | 0 .../overlays/ovl_Bg_Jya_Cobra.xml | 0 .../overlays/ovl_Boss_Dodongo.xml | 0 .../overlays/ovl_Boss_Ganon.xml | 0 .../overlays/ovl_Boss_Ganon2.xml | 0 .../{ => GC_NMQ_D}/overlays/ovl_Boss_Sst.xml | 0 .../{ => GC_NMQ_D}/overlays/ovl_Demo_Shd.xml | 0 .../{ => GC_NMQ_D}/overlays/ovl_Elf_Msg.xml | 0 .../{ => GC_NMQ_D}/overlays/ovl_Elf_Msg2.xml | 0 .../{ => GC_NMQ_D}/overlays/ovl_En_Bili.xml | 0 .../overlays/ovl_En_Clear_Tag.xml | 0 .../overlays/ovl_En_Ganon_Mant.xml | 0 .../overlays/ovl_En_Ganon_Organ.xml | 0 .../{ => GC_NMQ_D}/overlays/ovl_En_Holl.xml | 0 .../overlays/ovl_En_Jsjutan.xml | 0 .../{ => GC_NMQ_D}/overlays/ovl_En_Kanban.xml | 0 .../{ => GC_NMQ_D}/overlays/ovl_En_Sda.xml | 0 .../{ => GC_NMQ_D}/overlays/ovl_En_Ssh.xml | 0 .../xml/{ => GC_NMQ_D}/overlays/ovl_En_St.xml | 0 .../{ => GC_NMQ_D}/overlays/ovl_En_Sth.xml | 0 .../{ => GC_NMQ_D}/overlays/ovl_End_Title.xml | 0 .../overlays/ovl_File_Choose.xml | 0 .../overlays/ovl_Magic_Dark.xml | 0 .../overlays/ovl_Magic_Fire.xml | 0 .../overlays/ovl_Magic_Wind.xml | 0 .../overlays/ovl_Oceff_Spot.xml | 0 .../overlays/ovl_Oceff_Storm.xml | 0 .../overlays/ovl_Oceff_Wipe.xml | 0 .../overlays/ovl_Oceff_Wipe2.xml | 0 .../overlays/ovl_Oceff_Wipe3.xml | 0 .../overlays/ovl_Oceff_Wipe4.xml | 0 .../{ => GC_NMQ_D}/scenes/dungeons/Bmori1.xml | 0 .../scenes/dungeons/FIRE_bs.xml | 0 .../scenes/dungeons/HAKAdan.xml | 0 .../scenes/dungeons/HAKAdanCH.xml | 0 .../scenes/dungeons/HAKAdan_bs.xml | 0 .../{ => GC_NMQ_D}/scenes/dungeons/HIDAN.xml | 0 .../scenes/dungeons/MIZUsin.xml | 0 .../scenes/dungeons/MIZUsin_bs.xml | 0 .../{ => GC_NMQ_D}/scenes/dungeons/bdan.xml | 0 .../scenes/dungeons/bdan_boss.xml | 0 .../{ => GC_NMQ_D}/scenes/dungeons/ddan.xml | 0 .../scenes/dungeons/ddan_boss.xml | 0 .../{ => GC_NMQ_D}/scenes/dungeons/ganon.xml | 0 .../scenes/dungeons/ganon_boss.xml | 0 .../scenes/dungeons/ganon_demo.xml | 0 .../scenes/dungeons/ganon_final.xml | 0 .../scenes/dungeons/ganon_sonogo.xml | 0 .../scenes/dungeons/ganon_tou.xml | 0 .../scenes/dungeons/ganontika.xml | 0 .../scenes/dungeons/ganontikasonogo.xml | 0 .../scenes/dungeons/gerudoway.xml | 0 .../scenes/dungeons/ice_doukutu.xml | 0 .../scenes/dungeons/jyasinboss.xml | 0 .../scenes/dungeons/jyasinzou.xml | 0 .../{ => GC_NMQ_D}/scenes/dungeons/men.xml | 0 .../scenes/dungeons/moribossroom.xml | 0 .../{ => GC_NMQ_D}/scenes/dungeons/ydan.xml | 0 .../scenes/dungeons/ydan_boss.xml | 0 .../{ => GC_NMQ_D}/scenes/indoors/bowling.xml | 0 .../scenes/indoors/daiyousei_izumi.xml | 0 .../scenes/indoors/hairal_niwa.xml | 0 .../scenes/indoors/hairal_niwa2.xml | 0 .../scenes/indoors/hairal_niwa_n.xml | 0 .../scenes/indoors/hakasitarelay.xml | 0 .../xml/{ => GC_NMQ_D}/scenes/indoors/hut.xml | 0 .../scenes/indoors/hylia_labo.xml | 0 .../{ => GC_NMQ_D}/scenes/indoors/impa.xml | 0 .../scenes/indoors/kakariko.xml | 0 .../scenes/indoors/kenjyanoma.xml | 0 .../scenes/indoors/kokiri_home.xml | 0 .../scenes/indoors/kokiri_home3.xml | 0 .../scenes/indoors/kokiri_home4.xml | 0 .../scenes/indoors/kokiri_home5.xml | 0 .../{ => GC_NMQ_D}/scenes/indoors/labo.xml | 0 .../scenes/indoors/link_home.xml | 0 .../{ => GC_NMQ_D}/scenes/indoors/mahouya.xml | 0 .../scenes/indoors/malon_stable.xml | 0 .../scenes/indoors/miharigoya.xml | 0 .../scenes/indoors/nakaniwa.xml | 0 .../scenes/indoors/syatekijyou.xml | 0 .../scenes/indoors/takaraya.xml | 0 .../{ => GC_NMQ_D}/scenes/indoors/tent.xml | 0 .../scenes/indoors/tokinoma.xml | 0 .../scenes/indoors/yousei_izumi_tate.xml | 0 .../scenes/indoors/yousei_izumi_yoko.xml | 0 .../xml/{ => GC_NMQ_D}/scenes/misc/enrui.xml | 0 .../{ => GC_NMQ_D}/scenes/misc/entra_n.xml | 0 .../{ => GC_NMQ_D}/scenes/misc/hakaana.xml | 0 .../{ => GC_NMQ_D}/scenes/misc/hakaana2.xml | 0 .../scenes/misc/hakaana_ouke.xml | 0 .../{ => GC_NMQ_D}/scenes/misc/hiral_demo.xml | 0 .../{ => GC_NMQ_D}/scenes/misc/kakariko3.xml | 0 .../{ => GC_NMQ_D}/scenes/misc/kakusiana.xml | 0 .../{ => GC_NMQ_D}/scenes/misc/kinsuta.xml | 0 .../scenes/misc/market_alley.xml | 0 .../scenes/misc/market_alley_n.xml | 0 .../{ => GC_NMQ_D}/scenes/misc/market_day.xml | 0 .../scenes/misc/market_night.xml | 0 .../scenes/misc/market_ruins.xml | 0 .../xml/{ => GC_NMQ_D}/scenes/misc/shrine.xml | 0 .../{ => GC_NMQ_D}/scenes/misc/shrine_n.xml | 0 .../{ => GC_NMQ_D}/scenes/misc/shrine_r.xml | 0 .../{ => GC_NMQ_D}/scenes/misc/turibori.xml | 0 .../{ => GC_NMQ_D}/scenes/overworld/entra.xml | 0 .../{ => GC_NMQ_D}/scenes/overworld/souko.xml | 0 .../scenes/overworld/spot00.xml | 0 .../scenes/overworld/spot01.xml | 0 .../scenes/overworld/spot02.xml | 0 .../scenes/overworld/spot03.xml | 0 .../scenes/overworld/spot04.xml | 0 .../scenes/overworld/spot05.xml | 0 .../scenes/overworld/spot06.xml | 0 .../scenes/overworld/spot07.xml | 0 .../scenes/overworld/spot08.xml | 0 .../scenes/overworld/spot09.xml | 0 .../scenes/overworld/spot10.xml | 0 .../scenes/overworld/spot11.xml | 0 .../scenes/overworld/spot12.xml | 0 .../scenes/overworld/spot13.xml | 0 .../scenes/overworld/spot15.xml | 0 .../scenes/overworld/spot16.xml | 0 .../scenes/overworld/spot17.xml | 0 .../scenes/overworld/spot18.xml | 0 .../scenes/overworld/spot20.xml | 0 .../scenes/shops/alley_shop.xml | 0 .../xml/{ => GC_NMQ_D}/scenes/shops/drag.xml | 0 .../{ => GC_NMQ_D}/scenes/shops/face_shop.xml | 0 .../xml/{ => GC_NMQ_D}/scenes/shops/golon.xml | 0 .../scenes/shops/kokiri_shop.xml | 0 .../scenes/shops/night_shop.xml | 0 .../xml/{ => GC_NMQ_D}/scenes/shops/shop1.xml | 0 .../xml/{ => GC_NMQ_D}/scenes/shops/zoora.xml | 0 .../scenes/test_levels/besitu.xml | 0 .../scenes/test_levels/depth_test.xml | 0 .../scenes/test_levels/sasatest.xml | 0 .../scenes/test_levels/sutaru.xml | 0 .../scenes/test_levels/syotes.xml | 0 .../scenes/test_levels/syotes2.xml | 0 .../scenes/test_levels/test01.xml | 0 .../scenes/test_levels/testroom.xml | 0 .../{ => GC_NMQ_D}/text/elf_message_field.xml | 0 .../{ => GC_NMQ_D}/text/elf_message_ydan.xml | 0 .../text/nes_message_data_static.xml | 0 .../text/staff_message_data_static.xml | 0 .../{ => GC_NMQ_D}/textures/backgrounds.xml | 0 .../textures/do_action_static.xml | 0 .../textures/icon_item_24_static.xml | 0 .../textures/icon_item_dungeon_static.xml | 0 .../textures/icon_item_field_static.xml | 0 .../textures/icon_item_fra_static.xml | 0 .../textures/icon_item_gameover_static.xml | 0 .../textures/icon_item_ger_static.xml | 0 .../textures/icon_item_nes_static.xml | 0 .../textures/icon_item_static.xml | 0 .../textures/item_name_static.xml | 0 .../textures/map_48x85_static.xml | 0 .../textures/map_grand_static.xml | 0 .../{ => GC_NMQ_D}/textures/map_i_static.xml | 0 .../textures/map_name_static.xml | 0 .../textures/message_static.xml | 0 .../textures/message_texture_static.xml | 0 .../textures/nes_font_static.xml | 0 .../textures/nintendo_rogo_static.xml | 0 .../textures/parameter_static.xml | 0 .../textures/place_title_cards.xml | 0 .../xml/{ => GC_NMQ_D}/textures/skyboxes.xml | 0 .../{ => GC_NMQ_D}/textures/title_static.xml | 0 .../xml/GC_NMQ_PAL_F/code/fbdemo_circle.xml | 14 + .../xml/GC_NMQ_PAL_F/code/fbdemo_triforce.xml | 8 + .../xml/GC_NMQ_PAL_F/code/fbdemo_wipe1.xml | 10 + .../xml/GC_NMQ_PAL_F/misc/link_animetion.xml | 577 ++++++ .../objects/gameplay_dangeon_keep.xml | 52 + .../objects/gameplay_field_keep.xml | 62 + .../GC_NMQ_PAL_F/objects/gameplay_keep.xml | 960 ++++++++++ .../xml/GC_NMQ_PAL_F/objects/object_Bb.xml | 37 + .../xml/GC_NMQ_PAL_F/objects/object_ahg.xml | 59 + .../xml/GC_NMQ_PAL_F/objects/object_am.xml | 9 + .../xml/GC_NMQ_PAL_F/objects/object_ane.xml | 59 + .../xml/GC_NMQ_PAL_F/objects/object_ani.xml | 66 + .../GC_NMQ_PAL_F/objects/object_anubice.xml | 20 + .../xml/GC_NMQ_PAL_F/objects/object_aob.xml | 59 + .../GC_NMQ_PAL_F/objects/object_b_heart.xml | 8 + .../xml/GC_NMQ_PAL_F/objects/object_bba.xml | 45 + .../objects/object_bdan_objects.xml | 61 + .../xml/GC_NMQ_PAL_F/objects/object_bdoor.xml | 15 + .../xml/GC_NMQ_PAL_F/objects/object_bg.xml | 50 + .../GC_NMQ_PAL_F/objects/object_bigokuta.xml | 58 + .../xml/GC_NMQ_PAL_F/objects/object_bird.xml | 30 + .../xml/GC_NMQ_PAL_F/objects/object_bji.xml | 56 + .../xml/GC_NMQ_PAL_F/objects/object_bl.xml | 32 + .../GC_NMQ_PAL_F/objects/object_blkobj.xml | 15 + .../xml/GC_NMQ_PAL_F/objects/object_bob.xml | 47 + .../xml/GC_NMQ_PAL_F/objects/object_boj.xml | 62 + .../xml/GC_NMQ_PAL_F/objects/object_bombf.xml | 14 + .../GC_NMQ_PAL_F/objects/object_bombiwa.xml | 7 + .../xml/GC_NMQ_PAL_F/objects/object_bowl.xml | 18 + .../xml/GC_NMQ_PAL_F/objects/object_box.xml | 29 + .../xml/GC_NMQ_PAL_F/objects/object_brob.xml | 25 + .../GC_NMQ_PAL_F/objects/object_bubble.xml | 6 + .../xml/GC_NMQ_PAL_F/objects/object_bv.xml | 79 + .../xml/GC_NMQ_PAL_F/objects/object_bw.xml | 29 + .../xml/GC_NMQ_PAL_F/objects/object_bwall.xml | 7 + .../xml/GC_NMQ_PAL_F/objects/object_bxa.xml | 13 + .../xml/GC_NMQ_PAL_F/objects/object_cne.xml | 51 + .../xml/GC_NMQ_PAL_F/objects/object_cob.xml | 41 + .../xml/GC_NMQ_PAL_F/objects/object_cow.xml | 55 + .../xml/GC_NMQ_PAL_F/objects/object_crow.xml | 11 + .../xml/GC_NMQ_PAL_F/objects/object_cs.xml | 60 + .../objects/object_d_elevator.xml | 7 + .../GC_NMQ_PAL_F/objects/object_d_hsblock.xml | 10 + .../GC_NMQ_PAL_F/objects/object_d_lift.xml | 8 + .../xml/GC_NMQ_PAL_F/objects/object_daiku.xml | 60 + .../objects/object_ddan_objects.xml | 32 + .../GC_NMQ_PAL_F/objects/object_dekubaba.xml | 38 + .../GC_NMQ_PAL_F/objects/object_dekujr.xml | 13 + .../GC_NMQ_PAL_F/objects/object_dekunuts.xml | 32 + .../GC_NMQ_PAL_F/objects/object_demo_6k.xml | 13 + .../objects/object_demo_kekkai.xml | 41 + .../objects/object_demo_tre_lgt.xml | 6 + .../xml/GC_NMQ_PAL_F/objects/object_dh.xml | 59 + .../xml/GC_NMQ_PAL_F/objects/object_dnk.xml | 30 + .../xml/GC_NMQ_PAL_F/objects/object_dns.xml | 35 + .../GC_NMQ_PAL_F/objects/object_dodojr.xml | 33 + .../GC_NMQ_PAL_F/objects/object_dodongo.xml | 41 + .../xml/GC_NMQ_PAL_F/objects/object_dog.xml | 41 + .../objects/object_door_gerudo.xml | 7 + .../objects/object_door_killer.xml | 17 + .../xml/GC_NMQ_PAL_F/objects/object_ds.xml | 38 + .../xml/GC_NMQ_PAL_F/objects/object_ds2.xml | 34 + .../xml/GC_NMQ_PAL_F/objects/object_du.xml | 81 + .../GC_NMQ_PAL_F/objects/object_dy_obj.xml | 121 ++ .../xml/GC_NMQ_PAL_F/objects/object_ec.xml | 26 + .../objects/object_efc_crystal_light.xml | 6 + .../objects/object_efc_doughnut.xml | 8 + .../GC_NMQ_PAL_F/objects/object_efc_erupc.xml | 12 + .../objects/object_efc_fire_ball.xml | 7 + .../GC_NMQ_PAL_F/objects/object_efc_flash.xml | 6 + .../objects/object_efc_lgt_shower.xml | 6 + .../objects/object_efc_star_field.xml | 8 + .../GC_NMQ_PAL_F/objects/object_efc_tw.xml | 13 + .../xml/GC_NMQ_PAL_F/objects/object_ei.xml | 56 + .../xml/GC_NMQ_PAL_F/objects/object_fa.xml | 15 + .../xml/GC_NMQ_PAL_F/objects/object_fd.xml | 76 + .../xml/GC_NMQ_PAL_F/objects/object_fd2.xml | 41 + .../xml/GC_NMQ_PAL_F/objects/object_fhg.xml | 34 + .../xml/GC_NMQ_PAL_F/objects/object_fire.xml | 14 + .../GC_NMQ_PAL_F/objects/object_firefly.xml | 21 + .../xml/GC_NMQ_PAL_F/objects/object_fish.xml | 180 ++ .../xml/GC_NMQ_PAL_F/objects/object_fr.xml | 65 + .../xml/GC_NMQ_PAL_F/objects/object_fu.xml | 55 + .../xml/GC_NMQ_PAL_F/objects/object_fw.xml | 105 ++ .../xml/GC_NMQ_PAL_F/objects/object_fz.xml | 12 + .../xml/GC_NMQ_PAL_F/objects/object_ganon.xml | 96 + .../GC_NMQ_PAL_F/objects/object_ganon2.xml | 158 ++ .../objects/object_ganon_anime1.xml | 29 + .../objects/object_ganon_anime2.xml | 21 + .../objects/object_ganon_anime3.xml | 13 + .../objects/object_ganon_objects.xml | 6 + .../xml/GC_NMQ_PAL_F/objects/object_ge1.xml | 78 + .../xml/GC_NMQ_PAL_F/objects/object_geff.xml | 7 + .../xml/GC_NMQ_PAL_F/objects/object_geldb.xml | 28 + .../GC_NMQ_PAL_F/objects/object_gi_arrow.xml | 7 + .../objects/object_gi_arrowcase.xml | 12 + .../GC_NMQ_PAL_F/objects/object_gi_bean.xml | 5 + .../GC_NMQ_PAL_F/objects/object_gi_bomb_1.xml | 5 + .../GC_NMQ_PAL_F/objects/object_gi_bomb_2.xml | 5 + .../objects/object_gi_bombpouch.xml | 12 + .../objects/object_gi_boomerang.xml | 5 + .../objects/object_gi_boots_2.xml | 6 + .../objects/object_gi_bosskey.xml | 6 + .../GC_NMQ_PAL_F/objects/object_gi_bottle.xml | 6 + .../objects/object_gi_bottle_letter.xml | 6 + .../GC_NMQ_PAL_F/objects/object_gi_bow.xml | 5 + .../objects/object_gi_bracelet.xml | 5 + .../objects/object_gi_brokensword.xml | 5 + .../objects/object_gi_butterfly.xml | 6 + .../objects/object_gi_clothes.xml | 10 + .../GC_NMQ_PAL_F/objects/object_gi_coin.xml | 10 + .../objects/object_gi_compass.xml | 6 + .../objects/object_gi_dekupouch.xml | 11 + .../GC_NMQ_PAL_F/objects/object_gi_egg.xml | 6 + .../objects/object_gi_eye_lotion.xml | 6 + .../GC_NMQ_PAL_F/objects/object_gi_fire.xml | 6 + .../GC_NMQ_PAL_F/objects/object_gi_fish.xml | 5 + .../GC_NMQ_PAL_F/objects/object_gi_frog.xml | 6 + .../GC_NMQ_PAL_F/objects/object_gi_gerudo.xml | 5 + .../objects/object_gi_gerudomask.xml | 5 + .../GC_NMQ_PAL_F/objects/object_gi_ghost.xml | 9 + .../objects/object_gi_glasses.xml | 6 + .../GC_NMQ_PAL_F/objects/object_gi_gloves.xml | 10 + .../objects/object_gi_goddess.xml | 9 + .../objects/object_gi_golonmask.xml | 5 + .../GC_NMQ_PAL_F/objects/object_gi_grass.xml | 5 + .../GC_NMQ_PAL_F/objects/object_gi_hammer.xml | 5 + .../GC_NMQ_PAL_F/objects/object_gi_heart.xml | 5 + .../GC_NMQ_PAL_F/objects/object_gi_hearts.xml | 7 + .../objects/object_gi_hookshot.xml | 6 + .../objects/object_gi_hoverboots.xml | 5 + .../GC_NMQ_PAL_F/objects/object_gi_insect.xml | 6 + .../GC_NMQ_PAL_F/objects/object_gi_jewel.xml | 15 + .../GC_NMQ_PAL_F/objects/object_gi_key.xml | 5 + .../objects/object_gi_ki_tan_mask.xml | 6 + .../GC_NMQ_PAL_F/objects/object_gi_letter.xml | 6 + .../GC_NMQ_PAL_F/objects/object_gi_liquid.xml | 16 + .../objects/object_gi_longsword.xml | 5 + .../objects/object_gi_m_arrow.xml | 9 + .../objects/object_gi_magicpot.xml | 6 + .../GC_NMQ_PAL_F/objects/object_gi_map.xml | 6 + .../GC_NMQ_PAL_F/objects/object_gi_medal.xml | 11 + .../GC_NMQ_PAL_F/objects/object_gi_melody.xml | 11 + .../GC_NMQ_PAL_F/objects/object_gi_milk.xml | 6 + .../objects/object_gi_mushroom.xml | 5 + .../objects/object_gi_niwatori.xml | 8 + .../GC_NMQ_PAL_F/objects/object_gi_nuts.xml | 5 + .../objects/object_gi_ocarina.xml | 6 + .../objects/object_gi_ocarina_0.xml | 6 + .../objects/object_gi_pachinko.xml | 5 + .../GC_NMQ_PAL_F/objects/object_gi_powder.xml | 5 + .../objects/object_gi_prescription.xml | 6 + .../GC_NMQ_PAL_F/objects/object_gi_purse.xml | 16 + .../objects/object_gi_rabit_mask.xml | 6 + .../objects/object_gi_redead_mask.xml | 5 + .../GC_NMQ_PAL_F/objects/object_gi_rupy.xml | 16 + .../GC_NMQ_PAL_F/objects/object_gi_saw.xml | 5 + .../GC_NMQ_PAL_F/objects/object_gi_scale.xml | 10 + .../GC_NMQ_PAL_F/objects/object_gi_seed.xml | 5 + .../objects/object_gi_shield_1.xml | 5 + .../objects/object_gi_shield_2.xml | 5 + .../objects/object_gi_shield_3.xml | 6 + .../objects/object_gi_skj_mask.xml | 5 + .../objects/object_gi_soldout.xml | 5 + .../GC_NMQ_PAL_F/objects/object_gi_soul.xml | 7 + .../GC_NMQ_PAL_F/objects/object_gi_stick.xml | 5 + .../GC_NMQ_PAL_F/objects/object_gi_sutaru.xml | 6 + .../objects/object_gi_sword_1.xml | 5 + .../objects/object_gi_ticketstone.xml | 6 + .../objects/object_gi_truth_mask.xml | 6 + .../objects/object_gi_zoramask.xml | 5 + .../xml/GC_NMQ_PAL_F/objects/object_gj.xml | 35 + .../objects/object_gjyo_objects.xml | 7 + .../xml/GC_NMQ_PAL_F/objects/object_gla.xml | 85 + .../xml/GC_NMQ_PAL_F/objects/object_gm.xml | 5 + .../xml/GC_NMQ_PAL_F/objects/object_gnd.xml | 86 + .../GC_NMQ_PAL_F/objects/object_gnd_magic.xml | 7 + .../xml/GC_NMQ_PAL_F/objects/object_gndd.xml | 96 + .../GC_NMQ_PAL_F/objects/object_god_lgt.xml | 9 + .../xml/GC_NMQ_PAL_F/objects/object_gol.xml | 59 + .../xml/GC_NMQ_PAL_F/objects/object_goma.xml | 169 ++ .../GC_NMQ_PAL_F/objects/object_goroiwa.xml | 6 + .../xml/GC_NMQ_PAL_F/objects/object_gr.xml | 16 + .../xml/GC_NMQ_PAL_F/objects/object_gs.xml | 8 + .../xml/GC_NMQ_PAL_F/objects/object_gt.xml | 38 + .../xml/GC_NMQ_PAL_F/objects/object_haka.xml | 10 + .../GC_NMQ_PAL_F/objects/object_haka_door.xml | 12 + .../objects/object_haka_objects.xml | 85 + .../objects/object_hakach_objects.xml | 28 + .../xml/GC_NMQ_PAL_F/objects/object_hata.xml | 50 + .../objects/object_heavy_object.xml | 9 + .../objects/object_hidan_objects.xml | 89 + .../GC_NMQ_PAL_F/objects/object_hintnuts.xml | 23 + .../xml/GC_NMQ_PAL_F/objects/object_hni.xml | 51 + .../xml/GC_NMQ_PAL_F/objects/object_horse.xml | 67 + .../objects/object_horse_ganon.xml | 22 + .../objects/object_horse_link_child.xml | 21 + .../objects/object_horse_normal.xml | 26 + .../objects/object_horse_zelda.xml | 14 + .../xml/GC_NMQ_PAL_F/objects/object_hs.xml | 47 + .../xml/GC_NMQ_PAL_F/objects/object_human.xml | 213 +++ .../objects/object_ice_objects.xml | 26 + .../xml/GC_NMQ_PAL_F/objects/object_ik.xml | 104 ++ .../xml/GC_NMQ_PAL_F/objects/object_im.xml | 79 + .../xml/GC_NMQ_PAL_F/objects/object_in.xml | 142 ++ .../GC_NMQ_PAL_F/objects/object_ingate.xml | 7 + .../xml/GC_NMQ_PAL_F/objects/object_jj.xml | 77 + .../xml/GC_NMQ_PAL_F/objects/object_js.xml | 55 + .../GC_NMQ_PAL_F/objects/object_jya_door.xml | 8 + .../GC_NMQ_PAL_F/objects/object_jya_iron.xml | 13 + .../GC_NMQ_PAL_F/objects/object_jya_obj.xml | 80 + .../xml/GC_NMQ_PAL_F/objects/object_ka.xml | 64 + .../GC_NMQ_PAL_F/objects/object_kanban.xml | 18 + .../GC_NMQ_PAL_F/objects/object_kibako2.xml | 19 + .../objects/object_kingdodongo.xml | 130 ++ .../xml/GC_NMQ_PAL_F/objects/object_km1.xml | 39 + .../xml/GC_NMQ_PAL_F/objects/object_kusa.xml | 6 + .../xml/GC_NMQ_PAL_F/objects/object_kw1.xml | 63 + .../xml/GC_NMQ_PAL_F/objects/object_kz.xml | 45 + .../objects/object_light_ring.xml | 6 + .../GC_NMQ_PAL_F/objects/object_lightbox.xml | 15 + .../objects/object_lightswitch.xml | 14 + .../GC_NMQ_PAL_F/objects/object_link_boy.xml | 271 +++ .../objects/object_link_child.xml | 225 +++ .../xml/GC_NMQ_PAL_F/objects/object_ma1.xml | 67 + .../xml/GC_NMQ_PAL_F/objects/object_ma2.xml | 75 + .../xml/GC_NMQ_PAL_F/objects/object_mag.xml | 21 + .../GC_NMQ_PAL_F/objects/object_mamenoki.xml | 15 + .../objects/object_mastergolon.xml | 5 + .../objects/object_masterkokiri.xml | 5 + .../objects/object_masterkokirihead.xml | 14 + .../objects/object_masterzoora.xml | 5 + .../xml/GC_NMQ_PAL_F/objects/object_mb.xml | 59 + .../xml/GC_NMQ_PAL_F/objects/object_md.xml | 87 + .../xml/GC_NMQ_PAL_F/objects/object_medal.xml | 17 + .../objects/object_menkuri_objects.xml | 18 + .../GC_NMQ_PAL_F/objects/object_mir_ray.xml | 13 + .../objects/object_mizu_objects.xml | 41 + .../xml/GC_NMQ_PAL_F/objects/object_mjin.xml | 8 + .../GC_NMQ_PAL_F/objects/object_mjin_dark.xml | 5 + .../objects/object_mjin_flame.xml | 5 + .../objects/object_mjin_flash.xml | 5 + .../GC_NMQ_PAL_F/objects/object_mjin_ice.xml | 5 + .../GC_NMQ_PAL_F/objects/object_mjin_oka.xml | 8 + .../GC_NMQ_PAL_F/objects/object_mjin_soul.xml | 5 + .../GC_NMQ_PAL_F/objects/object_mjin_wind.xml | 5 + .../xml/GC_NMQ_PAL_F/objects/object_mk.xml | 44 + .../xml/GC_NMQ_PAL_F/objects/object_mm.xml | 16 + .../xml/GC_NMQ_PAL_F/objects/object_mo.xml | 82 + .../objects/object_mori_hineri1.xml | 7 + .../objects/object_mori_hineri1a.xml | 7 + .../objects/object_mori_hineri2.xml | 7 + .../objects/object_mori_hineri2a.xml | 7 + .../objects/object_mori_objects.xml | 25 + .../GC_NMQ_PAL_F/objects/object_mori_tex.xml | 30 + .../xml/GC_NMQ_PAL_F/objects/object_ms.xml | 43 + .../xml/GC_NMQ_PAL_F/objects/object_mu.xml | 96 + .../xml/GC_NMQ_PAL_F/objects/object_nb.xml | 118 ++ .../xml/GC_NMQ_PAL_F/objects/object_niw.xml | 49 + .../xml/GC_NMQ_PAL_F/objects/object_nwc.xml | 15 + .../xml/GC_NMQ_PAL_F/objects/object_ny.xml | 10 + .../xml/GC_NMQ_PAL_F/objects/object_oA1.xml | 69 + .../xml/GC_NMQ_PAL_F/objects/object_oA10.xml | 66 + .../xml/GC_NMQ_PAL_F/objects/object_oA11.xml | 66 + .../xml/GC_NMQ_PAL_F/objects/object_oA2.xml | 58 + .../xml/GC_NMQ_PAL_F/objects/object_oA3.xml | 11 + .../xml/GC_NMQ_PAL_F/objects/object_oA4.xml | 64 + .../xml/GC_NMQ_PAL_F/objects/object_oA5.xml | 64 + .../xml/GC_NMQ_PAL_F/objects/object_oA6.xml | 64 + .../xml/GC_NMQ_PAL_F/objects/object_oA7.xml | 62 + .../xml/GC_NMQ_PAL_F/objects/object_oA8.xml | 61 + .../xml/GC_NMQ_PAL_F/objects/object_oA9.xml | 7 + .../xml/GC_NMQ_PAL_F/objects/object_oB1.xml | 69 + .../xml/GC_NMQ_PAL_F/objects/object_oB2.xml | 76 + .../xml/GC_NMQ_PAL_F/objects/object_oB3.xml | 70 + .../xml/GC_NMQ_PAL_F/objects/object_oB4.xml | 64 + .../xml/GC_NMQ_PAL_F/objects/object_oE1.xml | 70 + .../xml/GC_NMQ_PAL_F/objects/object_oE10.xml | 15 + .../xml/GC_NMQ_PAL_F/objects/object_oE11.xml | 15 + .../xml/GC_NMQ_PAL_F/objects/object_oE12.xml | 15 + .../xml/GC_NMQ_PAL_F/objects/object_oE1s.xml | 50 + .../xml/GC_NMQ_PAL_F/objects/object_oE2.xml | 71 + .../xml/GC_NMQ_PAL_F/objects/object_oE3.xml | 73 + .../xml/GC_NMQ_PAL_F/objects/object_oE4.xml | 69 + .../xml/GC_NMQ_PAL_F/objects/object_oE4s.xml | 46 + .../xml/GC_NMQ_PAL_F/objects/object_oE5.xml | 64 + .../xml/GC_NMQ_PAL_F/objects/object_oE6.xml | 15 + .../xml/GC_NMQ_PAL_F/objects/object_oE7.xml | 14 + .../xml/GC_NMQ_PAL_F/objects/object_oE8.xml | 15 + .../xml/GC_NMQ_PAL_F/objects/object_oE9.xml | 15 + .../GC_NMQ_PAL_F/objects/object_oE_anime.xml | 10 + .../GC_NMQ_PAL_F/objects/object_oF1d_map.xml | 35 + .../xml/GC_NMQ_PAL_F/objects/object_oF1s.xml | 69 + .../GC_NMQ_PAL_F/objects/object_o_anime.xml | 11 + .../xml/GC_NMQ_PAL_F/objects/object_okuta.xml | 29 + .../objects/object_opening_demo1.xml | 11 + .../xml/GC_NMQ_PAL_F/objects/object_os.xml | 36 + .../GC_NMQ_PAL_F/objects/object_os_anime.xml | 69 + .../xml/GC_NMQ_PAL_F/objects/object_ossan.xml | 13 + .../GC_NMQ_PAL_F/objects/object_ouke_haka.xml | 6 + .../xml/GC_NMQ_PAL_F/objects/object_owl.xml | 65 + .../GC_NMQ_PAL_F/objects/object_peehat.xml | 53 + .../objects/object_po_composer.xml | 17 + .../GC_NMQ_PAL_F/objects/object_po_field.xml | 20 + .../objects/object_po_sisters.xml | 28 + .../xml/GC_NMQ_PAL_F/objects/object_poh.xml | 14 + .../xml/GC_NMQ_PAL_F/objects/object_ps.xml | 19 + .../GC_NMQ_PAL_F/objects/object_pu_box.xml | 13 + .../xml/GC_NMQ_PAL_F/objects/object_rd.xml | 106 ++ .../xml/GC_NMQ_PAL_F/objects/object_reeba.xml | 27 + .../objects/object_relay_objects.xml | 19 + .../xml/GC_NMQ_PAL_F/objects/object_rl.xml | 50 + .../xml/GC_NMQ_PAL_F/objects/object_rr.xml | 8 + .../xml/GC_NMQ_PAL_F/objects/object_rs.xml | 32 + .../xml/GC_NMQ_PAL_F/objects/object_ru1.xml | 83 + .../xml/GC_NMQ_PAL_F/objects/object_ru2.xml | 90 + .../xml/GC_NMQ_PAL_F/objects/object_sa.xml | 99 + .../xml/GC_NMQ_PAL_F/objects/object_sb.xml | 30 + .../xml/GC_NMQ_PAL_F/objects/object_sd.xml | 70 + .../objects/object_shop_dungen.xml | 10 + .../GC_NMQ_PAL_F/objects/object_shopnuts.xml | 67 + .../GC_NMQ_PAL_F/objects/object_siofuki.xml | 7 + .../xml/GC_NMQ_PAL_F/objects/object_sk2.xml | 130 ++ .../xml/GC_NMQ_PAL_F/objects/object_skb.xml | 64 + .../xml/GC_NMQ_PAL_F/objects/object_skj.xml | 69 + .../objects/object_spot00_break.xml | 13 + .../objects/object_spot00_objects.xml | 14 + .../objects/object_spot01_matoya.xml | 30 + .../objects/object_spot01_matoyab.xml | 18 + .../objects/object_spot01_objects.xml | 16 + .../objects/object_spot01_objects2.xml | 6 + .../objects/object_spot02_objects.xml | 44 + .../objects/object_spot03_object.xml | 16 + .../objects/object_spot04_objects.xml | 10 + .../objects/object_spot05_objects.xml | 10 + .../objects/object_spot06_objects.xml | 24 + .../objects/object_spot07_object.xml | 23 + .../objects/object_spot08_obj.xml | 27 + .../objects/object_spot09_obj.xml | 14 + .../objects/object_spot11_obj.xml | 9 + .../objects/object_spot12_obj.xml | 13 + .../objects/object_spot15_obj.xml | 13 + .../objects/object_spot16_obj.xml | 11 + .../objects/object_spot17_obj.xml | 12 + .../objects/object_spot18_obj.xml | 36 + .../xml/GC_NMQ_PAL_F/objects/object_ssh.xml | 61 + .../xml/GC_NMQ_PAL_F/objects/object_sst.xml | 55 + .../xml/GC_NMQ_PAL_F/objects/object_st.xml | 71 + .../GC_NMQ_PAL_F/objects/object_stream.xml | 6 + .../GC_NMQ_PAL_F/objects/object_syokudai.xml | 13 + .../xml/GC_NMQ_PAL_F/objects/object_ta.xml | 72 + .../GC_NMQ_PAL_F/objects/object_timeblock.xml | 7 + .../xml/GC_NMQ_PAL_F/objects/object_tite.xml | 55 + .../xml/GC_NMQ_PAL_F/objects/object_tk.xml | 18 + .../objects/object_toki_objects.xml | 25 + .../GC_NMQ_PAL_F/objects/object_torch2.xml | 11 + .../xml/GC_NMQ_PAL_F/objects/object_toryo.xml | 53 + .../xml/GC_NMQ_PAL_F/objects/object_tp.xml | 17 + .../xml/GC_NMQ_PAL_F/objects/object_tr.xml | 149 ++ .../xml/GC_NMQ_PAL_F/objects/object_trap.xml | 11 + .../objects/object_triforce_spot.xml | 14 + .../xml/GC_NMQ_PAL_F/objects/object_ts.xml | 34 + .../xml/GC_NMQ_PAL_F/objects/object_tsubo.xml | 9 + .../xml/GC_NMQ_PAL_F/objects/object_tw.xml | 332 ++++ .../GC_NMQ_PAL_F/objects/object_umajump.xml | 8 + .../xml/GC_NMQ_PAL_F/objects/object_vali.xml | 63 + .../xml/GC_NMQ_PAL_F/objects/object_vase.xml | 7 + .../xml/GC_NMQ_PAL_F/objects/object_vm.xml | 41 + .../objects/object_wallmaster.xml | 35 + .../xml/GC_NMQ_PAL_F/objects/object_warp1.xml | 39 + .../xml/GC_NMQ_PAL_F/objects/object_warp2.xml | 6 + .../xml/GC_NMQ_PAL_F/objects/object_wf.xml | 128 ++ .../GC_NMQ_PAL_F/objects/object_wood02.xml | 35 + .../xml/GC_NMQ_PAL_F/objects/object_xc.xml | 32 + .../objects/object_yabusame_point.xml | 8 + .../objects/object_ydan_objects.xml | 34 + .../GC_NMQ_PAL_F/objects/object_yukabyun.xml | 9 + .../xml/GC_NMQ_PAL_F/objects/object_zf.xml | 182 ++ .../xml/GC_NMQ_PAL_F/objects/object_zg.xml | 8 + .../xml/GC_NMQ_PAL_F/objects/object_zl1.xml | 114 ++ .../xml/GC_NMQ_PAL_F/objects/object_zl2.xml | 42 + .../objects/object_zl2_anime1.xml | 30 + .../objects/object_zl2_anime2.xml | 40 + .../xml/GC_NMQ_PAL_F/objects/object_zl4.xml | 60 + .../xml/GC_NMQ_PAL_F/objects/object_zo.xml | 88 + .../GC_NMQ_PAL_F/overlays/ovl_Arrow_Fire.xml | 11 + .../GC_NMQ_PAL_F/overlays/ovl_Arrow_Ice.xml | 11 + .../GC_NMQ_PAL_F/overlays/ovl_Arrow_Light.xml | 11 + .../overlays/ovl_Bg_Ganon_Otyuka.xml | 29 + .../overlays/ovl_Bg_Jya_Cobra.xml | 10 + .../overlays/ovl_Boss_Dodongo.xml | 6 + .../GC_NMQ_PAL_F/overlays/ovl_Boss_Ganon.xml | 52 + .../GC_NMQ_PAL_F/overlays/ovl_Boss_Ganon2.xml | 76 + .../GC_NMQ_PAL_F/overlays/ovl_Boss_Sst.xml | 8 + .../GC_NMQ_PAL_F/overlays/ovl_Demo_Shd.xml | 8 + .../xml/GC_NMQ_PAL_F/overlays/ovl_En_Bili.xml | 7 + .../overlays/ovl_En_Clear_Tag.xml | 14 + .../overlays/ovl_En_Ganon_Mant.xml | 22 + .../overlays/ovl_En_Ganon_Organ.xml | 19 + .../xml/GC_NMQ_PAL_F/overlays/ovl_En_Holl.xml | 8 + .../GC_NMQ_PAL_F/overlays/ovl_En_Jsjutan.xml | 38 + .../GC_NMQ_PAL_F/overlays/ovl_En_Kanban.xml | 8 + .../xml/GC_NMQ_PAL_F/overlays/ovl_En_Sda.xml | 9 + .../xml/GC_NMQ_PAL_F/overlays/ovl_En_Ssh.xml | 8 + .../xml/GC_NMQ_PAL_F/overlays/ovl_En_St.xml | 8 + .../xml/GC_NMQ_PAL_F/overlays/ovl_En_Sth.xml | 15 + .../GC_NMQ_PAL_F/overlays/ovl_End_Title.xml | 17 + .../GC_NMQ_PAL_F/overlays/ovl_File_Choose.xml | 28 + .../GC_NMQ_PAL_F/overlays/ovl_Magic_Dark.xml | 12 + .../GC_NMQ_PAL_F/overlays/ovl_Magic_Fire.xml | 10 + .../GC_NMQ_PAL_F/overlays/ovl_Magic_Wind.xml | 15 + .../GC_NMQ_PAL_F/overlays/ovl_Oceff_Spot.xml | 10 + .../GC_NMQ_PAL_F/overlays/ovl_Oceff_Storm.xml | 11 + .../GC_NMQ_PAL_F/overlays/ovl_Oceff_Wipe.xml | 10 + .../GC_NMQ_PAL_F/overlays/ovl_Oceff_Wipe2.xml | 11 + .../GC_NMQ_PAL_F/overlays/ovl_Oceff_Wipe3.xml | 10 + .../GC_NMQ_PAL_F/overlays/ovl_Oceff_Wipe4.xml | 11 + .../GC_NMQ_PAL_F/scenes/dungeons/Bmori1.xml | 76 + .../GC_NMQ_PAL_F/scenes/dungeons/FIRE_bs.xml | 11 + .../GC_NMQ_PAL_F/scenes/dungeons/HAKAdan.xml | 74 + .../scenes/dungeons/HAKAdanCH.xml | 26 + .../scenes/dungeons/HAKAdan_bs.xml | 11 + .../GC_NMQ_PAL_F/scenes/dungeons/HIDAN.xml | 87 + .../GC_NMQ_PAL_F/scenes/dungeons/MIZUsin.xml | 77 + .../scenes/dungeons/MIZUsin_bs.xml | 11 + .../xml/GC_NMQ_PAL_F/scenes/dungeons/bdan.xml | 54 + .../scenes/dungeons/bdan_boss.xml | 11 + .../xml/GC_NMQ_PAL_F/scenes/dungeons/ddan.xml | 70 + .../scenes/dungeons/ddan_boss.xml | 12 + .../GC_NMQ_PAL_F/scenes/dungeons/ganon.xml | 35 + .../scenes/dungeons/ganon_boss.xml | 8 + .../scenes/dungeons/ganon_demo.xml | 8 + .../scenes/dungeons/ganon_final.xml | 9 + .../scenes/dungeons/ganon_sonogo.xml | 21 + .../scenes/dungeons/ganon_tou.xml | 10 + .../scenes/dungeons/ganontika.xml | 82 + .../scenes/dungeons/ganontikasonogo.xml | 12 + .../scenes/dungeons/gerudoway.xml | 26 + .../scenes/dungeons/ice_doukutu.xml | 44 + .../scenes/dungeons/jyasinboss.xml | 19 + .../scenes/dungeons/jyasinzou.xml | 95 + .../xml/GC_NMQ_PAL_F/scenes/dungeons/men.xml | 43 + .../scenes/dungeons/moribossroom.xml | 11 + .../xml/GC_NMQ_PAL_F/scenes/dungeons/ydan.xml | 45 + .../scenes/dungeons/ydan_boss.xml | 11 + .../GC_NMQ_PAL_F/scenes/indoors/bowling.xml | 8 + .../scenes/indoors/daiyousei_izumi.xml | 11 + .../scenes/indoors/hairal_niwa.xml | 10 + .../scenes/indoors/hairal_niwa_n.xml | 8 + .../scenes/indoors/hakasitarelay.xml | 27 + .../xml/GC_NMQ_PAL_F/scenes/indoors/hut.xml | 8 + .../scenes/indoors/hylia_labo.xml | 8 + .../xml/GC_NMQ_PAL_F/scenes/indoors/impa.xml | 8 + .../GC_NMQ_PAL_F/scenes/indoors/kakariko.xml | 8 + .../scenes/indoors/kenjyanoma.xml | 8 + .../scenes/indoors/kokiri_home.xml | 8 + .../scenes/indoors/kokiri_home3.xml | 8 + .../scenes/indoors/kokiri_home4.xml | 8 + .../scenes/indoors/kokiri_home5.xml | 8 + .../xml/GC_NMQ_PAL_F/scenes/indoors/labo.xml | 8 + .../GC_NMQ_PAL_F/scenes/indoors/link_home.xml | 8 + .../GC_NMQ_PAL_F/scenes/indoors/mahouya.xml | 8 + .../scenes/indoors/malon_stable.xml | 8 + .../scenes/indoors/miharigoya.xml | 14 + .../GC_NMQ_PAL_F/scenes/indoors/nakaniwa.xml | 13 + .../scenes/indoors/syatekijyou.xml | 8 + .../GC_NMQ_PAL_F/scenes/indoors/takaraya.xml | 26 + .../xml/GC_NMQ_PAL_F/scenes/indoors/tent.xml | 8 + .../GC_NMQ_PAL_F/scenes/indoors/tokinoma.xml | 14 + .../scenes/indoors/yousei_izumi_tate.xml | 8 + .../scenes/indoors/yousei_izumi_yoko.xml | 11 + .../xml/GC_NMQ_PAL_F/scenes/misc/enrui.xml | 8 + .../xml/GC_NMQ_PAL_F/scenes/misc/entra_n.xml | 8 + .../xml/GC_NMQ_PAL_F/scenes/misc/hakaana.xml | 8 + .../xml/GC_NMQ_PAL_F/scenes/misc/hakaana2.xml | 8 + .../GC_NMQ_PAL_F/scenes/misc/hakaana_ouke.xml | 16 + .../GC_NMQ_PAL_F/scenes/misc/hiral_demo.xml | 8 + .../GC_NMQ_PAL_F/scenes/misc/kakariko3.xml | 8 + .../GC_NMQ_PAL_F/scenes/misc/kakusiana.xml | 47 + .../xml/GC_NMQ_PAL_F/scenes/misc/kinsuta.xml | 10 + .../GC_NMQ_PAL_F/scenes/misc/market_alley.xml | 8 + .../scenes/misc/market_alley_n.xml | 9 + .../GC_NMQ_PAL_F/scenes/misc/market_day.xml | 9 + .../GC_NMQ_PAL_F/scenes/misc/market_night.xml | 9 + .../GC_NMQ_PAL_F/scenes/misc/market_ruins.xml | 8 + .../xml/GC_NMQ_PAL_F/scenes/misc/shrine.xml | 8 + .../xml/GC_NMQ_PAL_F/scenes/misc/shrine_n.xml | 9 + .../xml/GC_NMQ_PAL_F/scenes/misc/shrine_r.xml | 8 + .../xml/GC_NMQ_PAL_F/scenes/misc/turibori.xml | 8 + .../GC_NMQ_PAL_F/scenes/overworld/entra.xml | 8 + .../GC_NMQ_PAL_F/scenes/overworld/souko.xml | 16 + .../GC_NMQ_PAL_F/scenes/overworld/spot00.xml | 18 + .../GC_NMQ_PAL_F/scenes/overworld/spot01.xml | 13 + .../GC_NMQ_PAL_F/scenes/overworld/spot02.xml | 17 + .../GC_NMQ_PAL_F/scenes/overworld/spot03.xml | 15 + .../GC_NMQ_PAL_F/scenes/overworld/spot04.xml | 21 + .../GC_NMQ_PAL_F/scenes/overworld/spot05.xml | 16 + .../GC_NMQ_PAL_F/scenes/overworld/spot06.xml | 15 + .../GC_NMQ_PAL_F/scenes/overworld/spot07.xml | 15 + .../GC_NMQ_PAL_F/scenes/overworld/spot08.xml | 9 + .../GC_NMQ_PAL_F/scenes/overworld/spot09.xml | 16 + .../GC_NMQ_PAL_F/scenes/overworld/spot10.xml | 36 + .../GC_NMQ_PAL_F/scenes/overworld/spot11.xml | 9 + .../GC_NMQ_PAL_F/scenes/overworld/spot12.xml | 15 + .../GC_NMQ_PAL_F/scenes/overworld/spot13.xml | 11 + .../GC_NMQ_PAL_F/scenes/overworld/spot15.xml | 9 + .../GC_NMQ_PAL_F/scenes/overworld/spot16.xml | 14 + .../GC_NMQ_PAL_F/scenes/overworld/spot17.xml | 13 + .../GC_NMQ_PAL_F/scenes/overworld/spot18.xml | 23 + .../GC_NMQ_PAL_F/scenes/overworld/spot20.xml | 14 + .../GC_NMQ_PAL_F/scenes/shops/alley_shop.xml | 8 + .../xml/GC_NMQ_PAL_F/scenes/shops/drag.xml | 8 + .../GC_NMQ_PAL_F/scenes/shops/face_shop.xml | 8 + .../xml/GC_NMQ_PAL_F/scenes/shops/golon.xml | 8 + .../GC_NMQ_PAL_F/scenes/shops/kokiri_shop.xml | 8 + .../GC_NMQ_PAL_F/scenes/shops/night_shop.xml | 8 + .../xml/GC_NMQ_PAL_F/scenes/shops/shop1.xml | 8 + .../xml/GC_NMQ_PAL_F/scenes/shops/zoora.xml | 8 + .../GC_NMQ_PAL_F/text/elf_message_field.xml | 5 + .../GC_NMQ_PAL_F/text/elf_message_ydan.xml | 5 + .../text/nes_message_data_static.xml | 5 + .../text/staff_message_data_static.xml | 5 + .../xml/GC_NMQ_PAL_F/textures/backgrounds.xml | 246 +++ .../textures/do_action_static.xml | 91 + .../textures/icon_item_24_static.xml | 24 + .../textures/icon_item_dungeon_static.xml | 23 + .../textures/icon_item_field_static.xml | 32 + .../textures/icon_item_fra_static.xml | 37 + .../textures/icon_item_gameover_static.xml | 11 + .../textures/icon_item_ger_static.xml | 36 + .../textures/icon_item_nes_static.xml | 35 + .../textures/icon_item_static.xml | 190 ++ .../textures/item_name_static.xml | 373 ++++ .../textures/map_48x85_static.xml | 72 + .../textures/map_grand_static.xml | 28 + .../GC_NMQ_PAL_F/textures/map_i_static.xml | 243 +++ .../GC_NMQ_PAL_F/textures/map_name_static.xml | 106 ++ .../GC_NMQ_PAL_F/textures/message_static.xml | 11 + .../textures/message_texture_static.xml | 6 + .../GC_NMQ_PAL_F/textures/nes_font_static.xml | 145 ++ .../textures/nintendo_rogo_static.xml | 8 + .../textures/parameter_static.xml | 60 + .../textures/place_title_cards.xml | 287 +++ .../xml/GC_NMQ_PAL_F/textures/skyboxes.xml | 113 ++ .../GC_NMQ_PAL_F/textures/title_static.xml | 194 ++ soh/build.c | 4 +- soh/soh.vcxproj | 2 +- soh/soh/OTRGlobals.cpp | 15 + soh/soh/OTRGlobals.h | 1 + soh/soh/z_play_otr.cpp | 10 + soh/src/code/z_play.c | 20 - soh/src/code/z_player_lib.c | 2 + soh/src/code/z_vr_box.c | 5 +- .../overlays/actors/ovl_Elf_Msg/z_elf_msg.c | 11 +- .../overlays/actors/ovl_Elf_Msg2/z_elf_msg2.c | 4 + .../overlays/gamestates/ovl_title/z_title.c | 38 + .../ovl_kaleido_scope/z_kaleido_scope_PAL.c | 31 - 1203 files changed, 30620 insertions(+), 501 deletions(-) create mode 100644 OTRExporter/CFG/filelists/dbg.txt create mode 100644 OTRExporter/CFG/filelists/gamecube.txt create mode 100644 OTRExporter/CFG/filelists/gamecube_pal.txt create mode 100644 OTRExporter/extract_baserom_debug.py create mode 100644 OTRExporter/extract_baserom_gc.py rename OTRGui/assets/extractor/{Config.xml => Config_GC_MQ_D.xml} (83%) create mode 100644 OTRGui/assets/extractor/Config_GC_NMQ_D.xml create mode 100644 OTRGui/assets/extractor/Config_GC_NMQ_PAL_F.xml create mode 100644 OTRGui/assets/extractor/filelists/gamecube_pal.txt create mode 100644 ZAPDTR/ZAPD/FileWorker.cpp create mode 100644 ZAPDTR/ZAPD/FileWorker.h create mode 100644 ZAPDTR/ZAPD/ZRom.cpp create mode 100644 ZAPDTR/ZAPD/ZRom.h create mode 100644 ZAPDTR/ZAPD/ctpl_stl.h create mode 100644 ZAPDTR/ZAPD/yaz0/readwrite.h create mode 100644 ZAPDTR/ZAPD/yaz0/yaz0.cpp create mode 100644 ZAPDTR/ZAPD/yaz0/yaz0.h create mode 100644 libultraship/libultraship/GameVersions.h rename soh/assets/xml/{ => GC_NMQ_D}/code/fbdemo_circle.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/code/fbdemo_triforce.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/code/fbdemo_wipe1.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/misc/link_animetion.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/gameplay_dangeon_keep.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/gameplay_field_keep.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/gameplay_keep.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_Bb.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_ahg.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_am.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_ane.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_ani.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_anubice.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_aob.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_b_heart.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_bba.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_bdan_objects.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_bdoor.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_bg.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_bigokuta.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_bird.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_bji.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_bl.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_blkobj.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_bob.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_boj.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_bombf.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_bombiwa.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_bowl.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_box.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_brob.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_bubble.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_bv.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_bw.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_bwall.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_bxa.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_cne.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_cob.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_cow.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_crow.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_cs.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_d_elevator.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_d_hsblock.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_d_lift.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_daiku.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_ddan_objects.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_dekubaba.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_dekujr.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_dekunuts.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_demo_6k.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_demo_kekkai.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_demo_tre_lgt.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_dh.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_dnk.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_dns.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_dodojr.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_dodongo.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_dog.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_door_gerudo.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_door_killer.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_ds.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_ds2.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_du.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_dy_obj.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_ec.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_efc_crystal_light.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_efc_doughnut.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_efc_erupc.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_efc_fire_ball.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_efc_flash.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_efc_lgt_shower.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_efc_star_field.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_efc_tw.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_ei.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_fa.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_fd.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_fd2.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_fhg.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_fire.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_firefly.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_fish.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_fr.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_fu.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_fw.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_fz.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_ganon.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_ganon2.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_ganon_anime1.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_ganon_anime2.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_ganon_anime3.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_ganon_objects.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_ge1.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_geff.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_geldb.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_arrow.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_arrowcase.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_bean.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_bomb_1.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_bomb_2.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_bombpouch.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_boomerang.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_boots_2.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_bosskey.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_bottle.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_bottle_letter.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_bow.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_bracelet.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_brokensword.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_butterfly.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_clothes.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_coin.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_compass.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_dekupouch.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_egg.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_eye_lotion.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_fire.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_fish.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_frog.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_gerudo.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_gerudomask.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_ghost.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_glasses.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_gloves.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_goddess.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_golonmask.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_grass.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_hammer.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_heart.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_hearts.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_hookshot.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_hoverboots.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_insect.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_jewel.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_key.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_ki_tan_mask.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_letter.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_liquid.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_longsword.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_m_arrow.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_magicpot.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_map.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_medal.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_melody.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_milk.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_mushroom.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_niwatori.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_nuts.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_ocarina.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_ocarina_0.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_pachinko.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_powder.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_prescription.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_purse.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_rabit_mask.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_redead_mask.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_rupy.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_saw.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_scale.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_seed.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_shield_1.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_shield_2.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_shield_3.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_skj_mask.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_soldout.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_soul.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_stick.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_sutaru.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_sword_1.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_ticketstone.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_truth_mask.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gi_zoramask.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gj.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gjyo_objects.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gla.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gm.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gnd.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gnd_magic.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gndd.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_god_lgt.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gol.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_goma.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_goroiwa.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gr.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gs.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_gt.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_haka.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_haka_door.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_haka_objects.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_hakach_objects.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_hata.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_heavy_object.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_hidan_objects.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_hintnuts.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_hni.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_horse.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_horse_ganon.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_horse_link_child.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_horse_normal.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_horse_zelda.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_hs.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_human.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_ice_objects.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_ik.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_im.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_in.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_ingate.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_jj.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_js.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_jya_door.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_jya_iron.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_jya_obj.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_ka.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_kanban.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_kibako2.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_kingdodongo.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_km1.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_kusa.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_kw1.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_kz.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_light_ring.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_lightbox.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_lightswitch.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_link_boy.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_link_child.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_ma1.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_ma2.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_mag.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_mamenoki.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_mastergolon.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_masterkokiri.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_masterkokirihead.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_masterzoora.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_mb.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_md.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_medal.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_menkuri_objects.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_mir_ray.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_mizu_objects.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_mjin.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_mjin_dark.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_mjin_flame.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_mjin_flash.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_mjin_ice.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_mjin_oka.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_mjin_soul.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_mjin_wind.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_mk.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_mm.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_mo.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_mori_hineri1.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_mori_hineri1a.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_mori_hineri2.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_mori_hineri2a.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_mori_objects.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_mori_tex.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_ms.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_mu.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_nb.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_niw.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_nwc.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_ny.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_oA1.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_oA10.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_oA11.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_oA2.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_oA3.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_oA4.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_oA5.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_oA6.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_oA7.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_oA8.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_oA9.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_oB1.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_oB2.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_oB3.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_oB4.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_oE1.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_oE10.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_oE11.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_oE12.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_oE1s.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_oE2.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_oE3.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_oE4.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_oE4s.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_oE5.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_oE6.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_oE7.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_oE8.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_oE9.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_oE_anime.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_oF1d_map.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_oF1s.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_o_anime.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_okuta.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_opening_demo1.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_os.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_os_anime.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_ossan.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_ouke_haka.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_owl.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_peehat.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_po_composer.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_po_field.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_po_sisters.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_poh.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_ps.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_pu_box.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_rd.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_reeba.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_relay_objects.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_rl.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_rr.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_rs.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_ru1.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_ru2.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_sa.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_sb.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_sd.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_shop_dungen.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_shopnuts.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_siofuki.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_sk2.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_skb.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_skj.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_spot00_break.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_spot00_objects.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_spot01_matoya.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_spot01_matoyab.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_spot01_objects.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_spot01_objects2.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_spot02_objects.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_spot03_object.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_spot04_objects.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_spot05_objects.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_spot06_objects.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_spot07_object.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_spot08_obj.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_spot09_obj.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_spot11_obj.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_spot12_obj.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_spot15_obj.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_spot16_obj.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_spot17_obj.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_spot18_obj.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_ssh.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_sst.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_st.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_stream.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_syokudai.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_ta.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_timeblock.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_tite.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_tk.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_toki_objects.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_torch2.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_toryo.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_tp.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_tr.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_trap.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_triforce_spot.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_ts.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_tsubo.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_tw.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_umajump.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_vali.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_vase.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_vm.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_wallmaster.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_warp1.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_warp2.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_wf.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_wood02.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_xc.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_yabusame_point.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_ydan_objects.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_yukabyun.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_zf.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_zg.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_zl1.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_zl2.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_zl2_anime1.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_zl2_anime2.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_zl4.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/objects/object_zo.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/overlays/ovl_Arrow_Fire.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/overlays/ovl_Arrow_Ice.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/overlays/ovl_Arrow_Light.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/overlays/ovl_Bg_Ganon_Otyuka.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/overlays/ovl_Bg_Jya_Cobra.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/overlays/ovl_Boss_Dodongo.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/overlays/ovl_Boss_Ganon.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/overlays/ovl_Boss_Ganon2.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/overlays/ovl_Boss_Sst.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/overlays/ovl_Demo_Shd.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/overlays/ovl_Elf_Msg.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/overlays/ovl_Elf_Msg2.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/overlays/ovl_En_Bili.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/overlays/ovl_En_Clear_Tag.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/overlays/ovl_En_Ganon_Mant.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/overlays/ovl_En_Ganon_Organ.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/overlays/ovl_En_Holl.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/overlays/ovl_En_Jsjutan.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/overlays/ovl_En_Kanban.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/overlays/ovl_En_Sda.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/overlays/ovl_En_Ssh.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/overlays/ovl_En_St.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/overlays/ovl_En_Sth.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/overlays/ovl_End_Title.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/overlays/ovl_File_Choose.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/overlays/ovl_Magic_Dark.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/overlays/ovl_Magic_Fire.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/overlays/ovl_Magic_Wind.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/overlays/ovl_Oceff_Spot.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/overlays/ovl_Oceff_Storm.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/overlays/ovl_Oceff_Wipe.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/overlays/ovl_Oceff_Wipe2.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/overlays/ovl_Oceff_Wipe3.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/overlays/ovl_Oceff_Wipe4.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/dungeons/Bmori1.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/dungeons/FIRE_bs.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/dungeons/HAKAdan.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/dungeons/HAKAdanCH.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/dungeons/HAKAdan_bs.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/dungeons/HIDAN.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/dungeons/MIZUsin.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/dungeons/MIZUsin_bs.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/dungeons/bdan.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/dungeons/bdan_boss.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/dungeons/ddan.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/dungeons/ddan_boss.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/dungeons/ganon.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/dungeons/ganon_boss.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/dungeons/ganon_demo.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/dungeons/ganon_final.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/dungeons/ganon_sonogo.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/dungeons/ganon_tou.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/dungeons/ganontika.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/dungeons/ganontikasonogo.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/dungeons/gerudoway.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/dungeons/ice_doukutu.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/dungeons/jyasinboss.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/dungeons/jyasinzou.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/dungeons/men.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/dungeons/moribossroom.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/dungeons/ydan.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/dungeons/ydan_boss.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/indoors/bowling.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/indoors/daiyousei_izumi.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/indoors/hairal_niwa.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/indoors/hairal_niwa2.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/indoors/hairal_niwa_n.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/indoors/hakasitarelay.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/indoors/hut.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/indoors/hylia_labo.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/indoors/impa.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/indoors/kakariko.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/indoors/kenjyanoma.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/indoors/kokiri_home.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/indoors/kokiri_home3.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/indoors/kokiri_home4.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/indoors/kokiri_home5.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/indoors/labo.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/indoors/link_home.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/indoors/mahouya.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/indoors/malon_stable.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/indoors/miharigoya.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/indoors/nakaniwa.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/indoors/syatekijyou.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/indoors/takaraya.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/indoors/tent.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/indoors/tokinoma.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/indoors/yousei_izumi_tate.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/indoors/yousei_izumi_yoko.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/misc/enrui.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/misc/entra_n.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/misc/hakaana.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/misc/hakaana2.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/misc/hakaana_ouke.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/misc/hiral_demo.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/misc/kakariko3.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/misc/kakusiana.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/misc/kinsuta.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/misc/market_alley.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/misc/market_alley_n.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/misc/market_day.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/misc/market_night.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/misc/market_ruins.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/misc/shrine.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/misc/shrine_n.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/misc/shrine_r.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/misc/turibori.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/overworld/entra.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/overworld/souko.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/overworld/spot00.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/overworld/spot01.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/overworld/spot02.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/overworld/spot03.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/overworld/spot04.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/overworld/spot05.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/overworld/spot06.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/overworld/spot07.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/overworld/spot08.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/overworld/spot09.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/overworld/spot10.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/overworld/spot11.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/overworld/spot12.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/overworld/spot13.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/overworld/spot15.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/overworld/spot16.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/overworld/spot17.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/overworld/spot18.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/overworld/spot20.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/shops/alley_shop.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/shops/drag.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/shops/face_shop.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/shops/golon.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/shops/kokiri_shop.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/shops/night_shop.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/shops/shop1.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/shops/zoora.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/test_levels/besitu.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/test_levels/depth_test.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/test_levels/sasatest.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/test_levels/sutaru.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/test_levels/syotes.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/test_levels/syotes2.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/test_levels/test01.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/scenes/test_levels/testroom.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/text/elf_message_field.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/text/elf_message_ydan.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/text/nes_message_data_static.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/text/staff_message_data_static.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/textures/backgrounds.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/textures/do_action_static.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/textures/icon_item_24_static.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/textures/icon_item_dungeon_static.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/textures/icon_item_field_static.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/textures/icon_item_fra_static.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/textures/icon_item_gameover_static.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/textures/icon_item_ger_static.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/textures/icon_item_nes_static.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/textures/icon_item_static.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/textures/item_name_static.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/textures/map_48x85_static.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/textures/map_grand_static.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/textures/map_i_static.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/textures/map_name_static.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/textures/message_static.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/textures/message_texture_static.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/textures/nes_font_static.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/textures/nintendo_rogo_static.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/textures/parameter_static.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/textures/place_title_cards.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/textures/skyboxes.xml (100%) rename soh/assets/xml/{ => GC_NMQ_D}/textures/title_static.xml (100%) create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/code/fbdemo_circle.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/code/fbdemo_triforce.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/code/fbdemo_wipe1.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/misc/link_animetion.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/gameplay_dangeon_keep.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/gameplay_field_keep.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/gameplay_keep.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_Bb.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_ahg.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_am.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_ane.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_ani.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_anubice.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_aob.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_b_heart.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_bba.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_bdan_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_bdoor.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_bg.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_bigokuta.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_bird.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_bji.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_bl.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_blkobj.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_bob.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_boj.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_bombf.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_bombiwa.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_bowl.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_box.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_brob.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_bubble.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_bv.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_bw.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_bwall.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_bxa.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_cne.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_cob.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_cow.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_crow.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_cs.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_d_elevator.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_d_hsblock.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_d_lift.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_daiku.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_ddan_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_dekubaba.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_dekujr.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_dekunuts.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_demo_6k.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_demo_kekkai.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_demo_tre_lgt.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_dh.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_dnk.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_dns.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_dodojr.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_dodongo.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_dog.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_door_gerudo.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_door_killer.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_ds.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_ds2.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_du.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_dy_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_ec.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_crystal_light.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_doughnut.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_erupc.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_fire_ball.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_flash.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_lgt_shower.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_star_field.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_tw.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_ei.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_fa.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_fd.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_fd2.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_fhg.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_fire.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_firefly.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_fish.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_fr.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_fu.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_fw.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_fz.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon2.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon_anime1.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon_anime2.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon_anime3.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_ge1.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_geff.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_geldb.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_arrow.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_arrowcase.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bean.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bomb_1.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bomb_2.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bombpouch.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_boomerang.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_boots_2.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bosskey.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bottle.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bottle_letter.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bow.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bracelet.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_brokensword.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_butterfly.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_clothes.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_coin.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_compass.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_dekupouch.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_egg.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_eye_lotion.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_fire.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_fish.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_frog.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_gerudo.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_gerudomask.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_ghost.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_glasses.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_gloves.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_goddess.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_golonmask.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_grass.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_hammer.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_heart.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_hearts.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_hookshot.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_hoverboots.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_insect.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_jewel.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_key.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_ki_tan_mask.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_letter.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_liquid.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_longsword.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_m_arrow.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_magicpot.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_map.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_medal.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_melody.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_milk.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_mushroom.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_niwatori.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_nuts.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_ocarina.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_ocarina_0.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_pachinko.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_powder.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_prescription.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_purse.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_rabit_mask.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_redead_mask.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_rupy.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_saw.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_scale.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_seed.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_shield_1.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_shield_2.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_shield_3.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_skj_mask.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_soldout.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_soul.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_stick.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_sutaru.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_sword_1.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_ticketstone.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_truth_mask.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_zoramask.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gj.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gjyo_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gla.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gm.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gnd.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gnd_magic.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gndd.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_god_lgt.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gol.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_goma.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_goroiwa.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gr.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gs.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_gt.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_haka.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_haka_door.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_haka_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_hakach_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_hata.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_heavy_object.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_hidan_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_hintnuts.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_hni.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_horse.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_horse_ganon.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_horse_link_child.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_horse_normal.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_horse_zelda.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_hs.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_human.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_ice_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_ik.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_im.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_in.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_ingate.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_jj.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_js.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_jya_door.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_jya_iron.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_jya_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_ka.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_kanban.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_kibako2.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_kingdodongo.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_km1.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_kusa.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_kw1.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_kz.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_light_ring.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_lightbox.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_lightswitch.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_link_boy.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_link_child.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_ma1.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_ma2.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_mag.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_mamenoki.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_mastergolon.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_masterkokiri.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_masterkokirihead.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_masterzoora.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_mb.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_md.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_medal.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_menkuri_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_mir_ray.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_mizu_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_dark.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_flame.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_flash.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_ice.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_oka.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_soul.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_wind.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_mk.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_mm.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_mo.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_hineri1.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_hineri1a.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_hineri2.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_hineri2a.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_tex.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_ms.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_mu.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_nb.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_niw.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_nwc.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_ny.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA1.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA10.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA11.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA2.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA3.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA4.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA5.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA6.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA7.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA8.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA9.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_oB1.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_oB2.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_oB3.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_oB4.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE1.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE10.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE11.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE12.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE1s.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE2.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE3.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE4.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE4s.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE5.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE6.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE7.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE8.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE9.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE_anime.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_oF1d_map.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_oF1s.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_o_anime.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_okuta.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_opening_demo1.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_os.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_os_anime.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_ossan.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_ouke_haka.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_owl.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_peehat.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_po_composer.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_po_field.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_po_sisters.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_poh.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_ps.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_pu_box.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_rd.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_reeba.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_relay_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_rl.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_rr.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_rs.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_ru1.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_ru2.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_sa.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_sb.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_sd.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_shop_dungen.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_shopnuts.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_siofuki.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_sk2.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_skb.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_skj.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot00_break.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot00_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot01_matoya.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot01_matoyab.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot01_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot01_objects2.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot02_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot03_object.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot04_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot05_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot06_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot07_object.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot08_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot09_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot11_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot12_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot15_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot16_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot17_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot18_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_ssh.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_sst.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_st.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_stream.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_syokudai.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_ta.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_timeblock.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_tite.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_tk.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_toki_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_torch2.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_toryo.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_tp.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_tr.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_trap.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_triforce_spot.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_ts.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_tsubo.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_tw.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_umajump.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_vali.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_vase.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_vm.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_wallmaster.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_warp1.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_warp2.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_wf.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_wood02.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_xc.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_yabusame_point.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_ydan_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_yukabyun.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_zf.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_zg.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_zl1.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_zl2.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_zl2_anime1.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_zl2_anime2.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_zl4.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/objects/object_zo.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Arrow_Fire.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Arrow_Ice.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Arrow_Light.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Bg_Ganon_Otyuka.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Bg_Jya_Cobra.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Boss_Dodongo.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Boss_Ganon.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Boss_Ganon2.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Boss_Sst.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Demo_Shd.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Bili.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Clear_Tag.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Ganon_Mant.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Ganon_Organ.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Holl.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Jsjutan.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Kanban.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Sda.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Ssh.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_St.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Sth.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_End_Title.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_File_Choose.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Magic_Dark.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Magic_Fire.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Magic_Wind.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Spot.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Storm.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Wipe.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Wipe2.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Wipe3.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Wipe4.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/Bmori1.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/FIRE_bs.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/HAKAdan.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/HAKAdanCH.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/HAKAdan_bs.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/HIDAN.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/MIZUsin.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/MIZUsin_bs.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/bdan.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/bdan_boss.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ddan.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ddan_boss.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon_boss.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon_demo.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon_final.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon_sonogo.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon_tou.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganontika.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganontikasonogo.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/gerudoway.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ice_doukutu.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/jyasinboss.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/jyasinzou.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/men.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/moribossroom.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ydan.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ydan_boss.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/bowling.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/daiyousei_izumi.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/hairal_niwa.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/hairal_niwa_n.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/hakasitarelay.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/hut.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/hylia_labo.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/impa.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kakariko.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kenjyanoma.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kokiri_home.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kokiri_home3.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kokiri_home4.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kokiri_home5.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/labo.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/link_home.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/mahouya.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/malon_stable.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/miharigoya.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/nakaniwa.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/syatekijyou.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/takaraya.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/tent.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/tokinoma.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/yousei_izumi_tate.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/yousei_izumi_yoko.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/enrui.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/entra_n.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/hakaana.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/hakaana2.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/hakaana_ouke.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/hiral_demo.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/kakariko3.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/kakusiana.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/kinsuta.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/market_alley.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/market_alley_n.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/market_day.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/market_night.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/market_ruins.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/shrine.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/shrine_n.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/shrine_r.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/turibori.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/entra.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/souko.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot00.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot01.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot02.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot03.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot04.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot05.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot06.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot07.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot08.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot09.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot10.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot11.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot12.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot13.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot15.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot16.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot17.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot18.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot20.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/alley_shop.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/drag.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/face_shop.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/golon.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/kokiri_shop.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/night_shop.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/shop1.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/zoora.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/text/elf_message_field.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/text/elf_message_ydan.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/text/nes_message_data_static.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/text/staff_message_data_static.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/textures/backgrounds.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/textures/do_action_static.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_24_static.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_dungeon_static.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_field_static.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_fra_static.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_gameover_static.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_ger_static.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_nes_static.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_static.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/textures/item_name_static.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/textures/map_48x85_static.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/textures/map_grand_static.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/textures/map_i_static.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/textures/map_name_static.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/textures/message_static.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/textures/message_texture_static.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/textures/nes_font_static.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/textures/nintendo_rogo_static.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/textures/parameter_static.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/textures/place_title_cards.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/textures/skyboxes.xml create mode 100644 soh/assets/xml/GC_NMQ_PAL_F/textures/title_static.xml diff --git a/OTRExporter/.gitignore b/OTRExporter/.gitignore index 2372a0cba..005fe6b8c 100644 --- a/OTRExporter/.gitignore +++ b/OTRExporter/.gitignore @@ -345,6 +345,8 @@ baserom/ *.otr *.swp *.a +*.z64 +*.n64 Extract/ tmp.txt diff --git a/OTRExporter/CFG/Config.xml b/OTRExporter/CFG/Config.xml index d9c3782e1..adec174ca 100644 --- a/OTRExporter/CFG/Config.xml +++ b/OTRExporter/CFG/Config.xml @@ -2,7 +2,7 @@ - + diff --git a/OTRExporter/CFG/filelists/dbg.txt b/OTRExporter/CFG/filelists/dbg.txt new file mode 100644 index 000000000..68af5e557 --- /dev/null +++ b/OTRExporter/CFG/filelists/dbg.txt @@ -0,0 +1,1532 @@ +makerom +boot +dmadata +Audiobank +Audioseq +Audiotable +link_animetion +icon_item_static +icon_item_24_static +icon_item_field_static +icon_item_dungeon_static +icon_item_gameover_static +icon_item_nes_static +icon_item_ger_static +icon_item_fra_static +item_name_static +map_name_static +do_action_static +message_static +message_texture_static +nes_font_static +nes_message_data_static +ger_message_data_static +fra_message_data_static +staff_message_data_static +map_grand_static +map_i_static +map_48x85_static +code +ovl_title +ovl_select +ovl_opening +ovl_file_choose +ovl_kaleido_scope +ovl_player_actor +ovl_map_mark_data +ovl_En_Test +ovl_Arms_Hook +ovl_Arrow_Fire +ovl_Arrow_Ice +ovl_Arrow_Light +ovl_Bg_Bdan_Objects +ovl_Bg_Bdan_Switch +ovl_Bg_Bom_Guard +ovl_Bg_Bombwall +ovl_Bg_Bowl_Wall +ovl_Bg_Breakwall +ovl_Bg_Ddan_Jd +ovl_Bg_Ddan_Kd +ovl_Bg_Dodoago +ovl_Bg_Dy_Yoseizo +ovl_Bg_Ganon_Otyuka +ovl_Bg_Gate_Shutter +ovl_Bg_Gjyo_Bridge +ovl_Bg_Gnd_Darkmeiro +ovl_Bg_Gnd_Firemeiro +ovl_Bg_Gnd_Iceblock +ovl_Bg_Gnd_Nisekabe +ovl_Bg_Gnd_Soulmeiro +ovl_Bg_Haka +ovl_Bg_Haka_Gate +ovl_Bg_Haka_Huta +ovl_Bg_Haka_Megane +ovl_Bg_Haka_MeganeBG +ovl_Bg_Haka_Sgami +ovl_Bg_Haka_Ship +ovl_Bg_Haka_Trap +ovl_Bg_Haka_Tubo +ovl_Bg_Haka_Water +ovl_Bg_Haka_Zou +ovl_Bg_Heavy_Block +ovl_Bg_Hidan_Curtain +ovl_Bg_Hidan_Dalm +ovl_Bg_Hidan_Firewall +ovl_Bg_Hidan_Fslift +ovl_Bg_Hidan_Fwbig +ovl_Bg_Hidan_Hamstep +ovl_Bg_Hidan_Hrock +ovl_Bg_Hidan_Kousi +ovl_Bg_Hidan_Kowarerukabe +ovl_Bg_Hidan_Rock +ovl_Bg_Hidan_Rsekizou +ovl_Bg_Hidan_Sekizou +ovl_Bg_Hidan_Sima +ovl_Bg_Hidan_Syoku +ovl_Bg_Ice_Objects +ovl_Bg_Ice_Shelter +ovl_Bg_Ice_Shutter +ovl_Bg_Ice_Turara +ovl_Bg_Ingate +ovl_Bg_Jya_1flift +ovl_Bg_Jya_Amishutter +ovl_Bg_Jya_Bigmirror +ovl_Bg_Jya_Block +ovl_Bg_Jya_Bombchuiwa +ovl_Bg_Jya_Bombiwa +ovl_Bg_Jya_Cobra +ovl_Bg_Jya_Goroiwa +ovl_Bg_Jya_Haheniron +ovl_Bg_Jya_Ironobj +ovl_Bg_Jya_Kanaami +ovl_Bg_Jya_Lift +ovl_Bg_Jya_Megami +ovl_Bg_Jya_Zurerukabe +ovl_Bg_Menkuri_Eye +ovl_Bg_Menkuri_Kaiten +ovl_Bg_Menkuri_Nisekabe +ovl_Bg_Mizu_Bwall +ovl_Bg_Mizu_Movebg +ovl_Bg_Mizu_Shutter +ovl_Bg_Mizu_Uzu +ovl_Bg_Mizu_Water +ovl_Bg_Mjin +ovl_Bg_Mori_Bigst +ovl_Bg_Mori_Elevator +ovl_Bg_Mori_Hashigo +ovl_Bg_Mori_Hashira4 +ovl_Bg_Mori_Hineri +ovl_Bg_Mori_Idomizu +ovl_Bg_Mori_Kaitenkabe +ovl_Bg_Mori_Rakkatenjo +ovl_Bg_Po_Event +ovl_Bg_Po_Syokudai +ovl_Bg_Pushbox +ovl_Bg_Relay_Objects +ovl_Bg_Spot00_Break +ovl_Bg_Spot00_Hanebasi +ovl_Bg_Spot01_Fusya +ovl_Bg_Spot01_Idohashira +ovl_Bg_Spot01_Idomizu +ovl_Bg_Spot01_Idosoko +ovl_Bg_Spot01_Objects2 +ovl_Bg_Spot02_Objects +ovl_Bg_Spot03_Taki +ovl_Bg_Spot05_Soko +ovl_Bg_Spot06_Objects +ovl_Bg_Spot07_Taki +ovl_Bg_Spot08_Bakudankabe +ovl_Bg_Spot08_Iceblock +ovl_Bg_Spot09_Obj +ovl_Bg_Spot11_Bakudankabe +ovl_Bg_Spot11_Oasis +ovl_Bg_Spot12_Gate +ovl_Bg_Spot12_Saku +ovl_Bg_Spot15_Rrbox +ovl_Bg_Spot15_Saku +ovl_Bg_Spot16_Bombstone +ovl_Bg_Spot16_Doughnut +ovl_Bg_Spot17_Bakudankabe +ovl_Bg_Spot17_Funen +ovl_Bg_Spot18_Basket +ovl_Bg_Spot18_Futa +ovl_Bg_Spot18_Obj +ovl_Bg_Spot18_Shutter +ovl_Bg_Sst_Floor +ovl_Bg_Toki_Hikari +ovl_Bg_Toki_Swd +ovl_Bg_Treemouth +ovl_Bg_Umajump +ovl_Bg_Vb_Sima +ovl_Bg_Ydan_Hasi +ovl_Bg_Ydan_Maruta +ovl_Bg_Ydan_Sp +ovl_Bg_Zg +ovl_Boss_Dodongo +ovl_Boss_Fd +ovl_Boss_Fd2 +ovl_Boss_Ganon +ovl_Boss_Ganon2 +ovl_Boss_Ganondrof +ovl_Boss_Goma +ovl_Boss_Mo +ovl_Boss_Sst +ovl_Boss_Tw +ovl_Boss_Va +ovl_Demo_6K +ovl_Demo_Du +ovl_Demo_Ec +ovl_Demo_Effect +ovl_Demo_Ext +ovl_Demo_Geff +ovl_Demo_Gj +ovl_Demo_Go +ovl_Demo_Gt +ovl_Demo_Ik +ovl_Demo_Im +ovl_Demo_Kankyo +ovl_Demo_Kekkai +ovl_Demo_Sa +ovl_Demo_Shd +ovl_Demo_Tre_Lgt +ovl_Door_Ana +ovl_Door_Gerudo +ovl_Door_Killer +ovl_Door_Shutter +ovl_Door_Toki +ovl_Door_Warp1 +ovl_Efc_Erupc +ovl_Eff_Dust +ovl_Effect_Ss_Blast +ovl_Effect_Ss_Bomb +ovl_Effect_Ss_Bomb2 +ovl_Effect_Ss_Bubble +ovl_Effect_Ss_D_Fire +ovl_Effect_Ss_Dead_Db +ovl_Effect_Ss_Dead_Dd +ovl_Effect_Ss_Dead_Ds +ovl_Effect_Ss_Dead_Sound +ovl_Effect_Ss_Dt_Bubble +ovl_Effect_Ss_Dust +ovl_Effect_Ss_En_Fire +ovl_Effect_Ss_En_Ice +ovl_Effect_Ss_Extra +ovl_Effect_Ss_Fcircle +ovl_Effect_Ss_Fhg_Flash +ovl_Effect_Ss_Fire_Tail +ovl_Effect_Ss_G_Fire +ovl_Effect_Ss_G_Magma +ovl_Effect_Ss_G_Magma2 +ovl_Effect_Ss_G_Ripple +ovl_Effect_Ss_G_Spk +ovl_Effect_Ss_G_Splash +ovl_Effect_Ss_Hahen +ovl_Effect_Ss_HitMark +ovl_Effect_Ss_Ice_Piece +ovl_Effect_Ss_Ice_Smoke +ovl_Effect_Ss_K_Fire +ovl_Effect_Ss_Kakera +ovl_Effect_Ss_KiraKira +ovl_Effect_Ss_Lightning +ovl_Effect_Ss_Sibuki +ovl_Effect_Ss_Sibuki2 +ovl_Effect_Ss_Solder_Srch_Ball +ovl_Effect_Ss_Stick +ovl_Effect_Ss_Stone1 +ovl_Elf_Msg +ovl_Elf_Msg2 +ovl_En_Am +ovl_En_Ani +ovl_En_Anubice +ovl_En_Anubice_Fire +ovl_En_Anubice_Tag +ovl_En_Arow_Trap +ovl_En_Arrow +ovl_En_Attack_Niw +ovl_En_Ba +ovl_En_Bb +ovl_En_Bdfire +ovl_En_Bigokuta +ovl_En_Bili +ovl_En_Bird +ovl_En_Blkobj +ovl_En_Bom +ovl_En_Bom_Bowl_Man +ovl_En_Bom_Bowl_Pit +ovl_En_Bom_Chu +ovl_En_Bombf +ovl_En_Boom +ovl_En_Box +ovl_En_Brob +ovl_En_Bubble +ovl_En_Butte +ovl_En_Bw +ovl_En_Bx +ovl_En_Changer +ovl_En_Clear_Tag +ovl_En_Cow +ovl_En_Crow +ovl_En_Cs +ovl_En_Daiku +ovl_En_Daiku_Kakariko +ovl_En_Dekubaba +ovl_En_Dekunuts +ovl_En_Dh +ovl_En_Dha +ovl_En_Diving_Game +ovl_En_Dns +ovl_En_Dnt_Demo +ovl_En_Dnt_Jiji +ovl_En_Dnt_Nomal +ovl_En_Dodojr +ovl_En_Dodongo +ovl_En_Dog +ovl_En_Door +ovl_En_Ds +ovl_En_Du +ovl_En_Dy_Extra +ovl_En_Eg +ovl_En_Eiyer +ovl_En_Elf +ovl_En_Encount1 +ovl_En_Encount2 +ovl_En_Ex_Item +ovl_En_Ex_Ruppy +ovl_En_Fd +ovl_En_Fd_Fire +ovl_En_Fhg_Fire +ovl_En_Fire_Rock +ovl_En_Firefly +ovl_En_Fish +ovl_En_Floormas +ovl_En_Fr +ovl_En_Fu +ovl_En_Fw +ovl_En_Fz +ovl_En_G_Switch +ovl_En_Ganon_Mant +ovl_En_Ganon_Organ +ovl_En_Gb +ovl_En_Ge1 +ovl_En_Ge2 +ovl_En_Ge3 +ovl_En_GeldB +ovl_En_GirlA +ovl_En_Gm +ovl_En_Go +ovl_En_Go2 +ovl_En_Goma +ovl_En_Goroiwa +ovl_En_Gs +ovl_En_Guest +ovl_En_Hata +ovl_En_Heishi1 +ovl_En_Heishi2 +ovl_En_Heishi3 +ovl_En_Heishi4 +ovl_En_Hintnuts +ovl_En_Holl +ovl_En_Honotrap +ovl_En_Horse +ovl_En_Horse_Game_Check +ovl_En_Horse_Ganon +ovl_En_Horse_Link_Child +ovl_En_Horse_Normal +ovl_En_Horse_Zelda +ovl_En_Hs +ovl_En_Hs2 +ovl_En_Hy +ovl_En_Ice_Hono +ovl_En_Ik +ovl_En_In +ovl_En_Insect +ovl_En_Ishi +ovl_En_It +ovl_En_Jj +ovl_En_Js +ovl_En_Jsjutan +ovl_En_Kakasi +ovl_En_Kakasi2 +ovl_En_Kakasi3 +ovl_En_Kanban +ovl_En_Karebaba +ovl_En_Ko +ovl_En_Kusa +ovl_En_Kz +ovl_En_Light +ovl_En_Lightbox +ovl_En_M_Fire1 +ovl_En_M_Thunder +ovl_En_Ma1 +ovl_En_Ma2 +ovl_En_Ma3 +ovl_En_Mag +ovl_En_Mb +ovl_En_Md +ovl_En_Mk +ovl_En_Mm +ovl_En_Mm2 +ovl_En_Ms +ovl_En_Mu +ovl_En_Nb +ovl_En_Niw +ovl_En_Niw_Girl +ovl_En_Niw_Lady +ovl_En_Nutsball +ovl_En_Nwc +ovl_En_Ny +ovl_En_OE2 +ovl_En_Okarina_Effect +ovl_En_Okarina_Tag +ovl_En_Okuta +ovl_En_Ossan +ovl_En_Owl +ovl_En_Part +ovl_En_Peehat +ovl_En_Po_Desert +ovl_En_Po_Field +ovl_En_Po_Relay +ovl_En_Po_Sisters +ovl_En_Poh +ovl_En_Pu_box +ovl_En_Rd +ovl_En_Reeba +ovl_En_River_Sound +ovl_En_Rl +ovl_En_Rr +ovl_En_Ru1 +ovl_En_Ru2 +ovl_En_Sa +ovl_En_Sb +ovl_En_Scene_Change +ovl_En_Sda +ovl_En_Shopnuts +ovl_En_Si +ovl_En_Siofuki +ovl_En_Skb +ovl_En_Skj +ovl_En_Skjneedle +ovl_En_Ssh +ovl_En_St +ovl_En_Sth +ovl_En_Stream +ovl_En_Sw +ovl_En_Syateki_Itm +ovl_En_Syateki_Man +ovl_En_Syateki_Niw +ovl_En_Ta +ovl_En_Takara_Man +ovl_En_Tana +ovl_En_Tg +ovl_En_Tite +ovl_En_Tk +ovl_En_Torch +ovl_En_Torch2 +ovl_En_Toryo +ovl_En_Tp +ovl_En_Tr +ovl_En_Trap +ovl_En_Tubo_Trap +ovl_En_Vali +ovl_En_Vase +ovl_En_Vb_Ball +ovl_En_Viewer +ovl_En_Vm +ovl_En_Wall_Tubo +ovl_En_Wallmas +ovl_En_Weather_Tag +ovl_En_Weiyer +ovl_En_Wf +ovl_En_Wonder_Item +ovl_En_Wonder_Talk +ovl_En_Wonder_Talk2 +ovl_En_Wood02 +ovl_En_Xc +ovl_En_Yabusame_Mark +ovl_En_Yukabyun +ovl_En_Zf +ovl_En_Zl1 +ovl_En_Zl2 +ovl_En_Zl3 +ovl_En_Zl4 +ovl_En_Zo +ovl_En_fHG +ovl_End_Title +ovl_Fishing +ovl_Item_B_Heart +ovl_Item_Etcetera +ovl_Item_Inbox +ovl_Item_Ocarina +ovl_Item_Shield +ovl_Magic_Dark +ovl_Magic_Fire +ovl_Magic_Wind +ovl_Mir_Ray +ovl_Obj_Bean +ovl_Obj_Blockstop +ovl_Obj_Bombiwa +ovl_Obj_Comb +ovl_Obj_Dekujr +ovl_Obj_Elevator +ovl_Obj_Hamishi +ovl_Obj_Hana +ovl_Obj_Hsblock +ovl_Obj_Ice_Poly +ovl_Obj_Kibako +ovl_Obj_Kibako2 +ovl_Obj_Lift +ovl_Obj_Lightswitch +ovl_Obj_Makekinsuta +ovl_Obj_Makeoshihiki +ovl_Obj_Mure +ovl_Obj_Mure2 +ovl_Obj_Mure3 +ovl_Obj_Oshihiki +ovl_Obj_Roomtimer +ovl_Obj_Switch +ovl_Obj_Syokudai +ovl_Obj_Timeblock +ovl_Obj_Tsubo +ovl_Obj_Warp2block +ovl_Object_Kankyo +ovl_Oceff_Spot +ovl_Oceff_Storm +ovl_Oceff_Wipe +ovl_Oceff_Wipe2 +ovl_Oceff_Wipe3 +ovl_Oceff_Wipe4 +ovl_Shot_Sun +gameplay_keep +gameplay_field_keep +gameplay_dangeon_keep +gameplay_object_exchange_static +object_link_boy +object_link_child +object_box +object_human +object_okuta +object_poh +object_wallmaster +object_dy_obj +object_firefly +object_dodongo +object_fire +object_niw +object_tite +object_reeba +object_peehat +object_kingdodongo +object_horse +object_zf +object_goma +object_zl1 +object_gol +object_bubble +object_dodojr +object_torch2 +object_bl +object_tp +object_oA1 +object_st +object_bw +object_ei +object_horse_normal +object_oB1 +object_o_anime +object_spot04_objects +object_ddan_objects +object_hidan_objects +object_horse_ganon +object_oA2 +object_spot00_objects +object_mb +object_bombf +object_sk2 +object_oE1 +object_oE_anime +object_oE2 +object_ydan_objects +object_gnd +object_am +object_dekubaba +object_oA3 +object_oA4 +object_oA5 +object_oA6 +object_oA7 +object_jj +object_oA8 +object_oA9 +object_oB2 +object_oB3 +object_oB4 +object_horse_zelda +object_opening_demo1 +object_warp1 +object_b_heart +object_dekunuts +object_oE3 +object_oE4 +object_menkuri_objects +object_oE5 +object_oE6 +object_oE7 +object_oE8 +object_oE9 +object_oE10 +object_oE11 +object_oE12 +object_vali +object_oA10 +object_oA11 +object_mizu_objects +object_fhg +object_ossan +object_mori_hineri1 +object_Bb +object_toki_objects +object_yukabyun +object_zl2 +object_mjin +object_mjin_flash +object_mjin_dark +object_mjin_flame +object_mjin_ice +object_mjin_soul +object_mjin_wind +object_mjin_oka +object_haka_objects +object_spot06_objects +object_ice_objects +object_relay_objects +object_mori_hineri1a +object_mori_hineri2 +object_mori_hineri2a +object_mori_objects +object_mori_tex +object_spot08_obj +object_warp2 +object_hata +object_bird +object_wood02 +object_lightbox +object_pu_box +object_trap +object_vase +object_im +object_ta +object_tk +object_xc +object_vm +object_bv +object_hakach_objects +object_efc_crystal_light +object_efc_fire_ball +object_efc_flash +object_efc_lgt_shower +object_efc_star_field +object_god_lgt +object_light_ring +object_triforce_spot +object_medal +object_bdan_objects +object_sd +object_rd +object_po_sisters +object_heavy_object +object_gndd +object_fd +object_du +object_fw +object_horse_link_child +object_spot02_objects +object_haka +object_ru1 +object_syokudai +object_fd2 +object_dh +object_rl +object_efc_tw +object_demo_tre_lgt +object_gi_key +object_mir_ray +object_brob +object_gi_jewel +object_spot09_obj +object_spot18_obj +object_bdoor +object_spot17_obj +object_shop_dungen +object_nb +object_mo +object_sb +object_gi_melody +object_gi_heart +object_gi_compass +object_gi_bosskey +object_gi_medal +object_gi_nuts +object_sa +object_gi_hearts +object_gi_arrowcase +object_gi_bombpouch +object_in +object_tr +object_spot16_obj +object_oE1s +object_oE4s +object_os_anime +object_gi_bottle +object_gi_stick +object_gi_map +object_oF1d_map +object_ru2 +object_gi_shield_1 +object_dekujr +object_gi_magicpot +object_gi_bomb_1 +object_oF1s +object_ma2 +object_gi_purse +object_hni +object_tw +object_rr +object_bxa +object_anubice +object_gi_gerudo +object_gi_arrow +object_gi_bomb_2 +object_gi_egg +object_gi_scale +object_gi_shield_2 +object_gi_hookshot +object_gi_ocarina +object_gi_milk +object_ma1 +object_ganon +object_sst +object_ny +object_fr +object_gi_pachinko +object_gi_boomerang +object_gi_bow +object_gi_glasses +object_gi_liquid +object_ani +object_demo_6k +object_gi_shield_3 +object_gi_letter +object_spot15_obj +object_jya_obj +object_gi_clothes +object_gi_bean +object_gi_fish +object_gi_saw +object_gi_hammer +object_gi_grass +object_gi_longsword +object_spot01_objects +object_md +object_km1 +object_kw1 +object_zo +object_kz +object_umajump +object_masterkokiri +object_masterkokirihead +object_mastergolon +object_masterzoora +object_aob +object_ik +object_ahg +object_cne +object_gi_niwatori +object_skj +object_gi_bottle_letter +object_bji +object_bba +object_gi_ocarina_0 +object_ds +object_ane +object_boj +object_spot03_object +object_spot07_object +object_fz +object_bob +object_ge1 +object_yabusame_point +object_gi_boots_2 +object_gi_seed +object_gnd_magic +object_d_elevator +object_d_hsblock +object_d_lift +object_mamenoki +object_goroiwa +object_toryo +object_daiku +object_nwc +object_blkobj +object_gm +object_ms +object_hs +object_ingate +object_lightswitch +object_kusa +object_tsubo +object_gi_gloves +object_gi_coin +object_kanban +object_gjyo_objects +object_owl +object_mk +object_fu +object_gi_ki_tan_mask +object_gi_redead_mask +object_gi_skj_mask +object_gi_rabit_mask +object_gi_truth_mask +object_ganon_objects +object_siofuki +object_stream +object_mm +object_fa +object_os +object_gi_eye_lotion +object_gi_powder +object_gi_mushroom +object_gi_ticketstone +object_gi_brokensword +object_js +object_cs +object_gi_prescription +object_gi_bracelet +object_gi_soldout +object_gi_frog +object_mag +object_door_gerudo +object_gt +object_efc_erupc +object_zl2_anime1 +object_zl2_anime2 +object_gi_golonmask +object_gi_zoramask +object_gi_gerudomask +object_ganon2 +object_ka +object_ts +object_zg +object_gi_hoverboots +object_gi_m_arrow +object_ds2 +object_ec +object_fish +object_gi_sutaru +object_gi_goddess +object_ssh +object_bigokuta +object_bg +object_spot05_objects +object_spot12_obj +object_bombiwa +object_hintnuts +object_rs +object_spot00_break +object_gla +object_shopnuts +object_geldb +object_gr +object_dog +object_jya_iron +object_jya_door +object_spot01_objects2 +object_spot11_obj +object_kibako2 +object_dns +object_dnk +object_gi_fire +object_gi_insect +object_gi_butterfly +object_gi_ghost +object_gi_soul +object_bowl +object_po_field +object_demo_kekkai +object_efc_doughnut +object_gi_dekupouch +object_ganon_anime1 +object_ganon_anime2 +object_ganon_anime3 +object_gi_rupy +object_spot01_matoya +object_spot01_matoyab +object_po_composer +object_mu +object_wf +object_skb +object_gj +object_geff +object_haka_door +object_gs +object_ps +object_bwall +object_crow +object_cow +object_cob +object_gi_sword_1 +object_door_killer +object_ouke_haka +object_timeblock +object_zl4 +g_pn_01 +g_pn_02 +g_pn_03 +g_pn_04 +g_pn_05 +g_pn_06 +g_pn_07 +g_pn_08 +g_pn_09 +g_pn_10 +g_pn_11 +g_pn_12 +g_pn_13 +g_pn_14 +g_pn_15 +g_pn_16 +g_pn_17 +g_pn_18 +g_pn_19 +g_pn_20 +g_pn_21 +g_pn_22 +g_pn_23 +g_pn_24 +g_pn_25 +g_pn_26 +g_pn_27 +g_pn_28 +g_pn_29 +g_pn_30 +g_pn_31 +g_pn_32 +g_pn_33 +g_pn_34 +g_pn_35 +g_pn_36 +g_pn_37 +g_pn_38 +g_pn_39 +g_pn_40 +g_pn_41 +g_pn_42 +g_pn_43 +g_pn_44 +g_pn_45 +g_pn_46 +g_pn_47 +g_pn_48 +g_pn_49 +g_pn_50 +g_pn_51 +g_pn_52 +g_pn_53 +g_pn_54 +g_pn_55 +g_pn_56 +g_pn_57 +z_select_static +nintendo_rogo_static +title_static +parameter_static +vr_fine0_static +vr_fine0_pal_static +vr_fine1_static +vr_fine1_pal_static +vr_fine2_static +vr_fine2_pal_static +vr_fine3_static +vr_fine3_pal_static +vr_cloud0_static +vr_cloud0_pal_static +vr_cloud1_static +vr_cloud1_pal_static +vr_cloud2_static +vr_cloud2_pal_static +vr_cloud3_static +vr_cloud3_pal_static +vr_holy0_static +vr_holy0_pal_static +vr_holy1_static +vr_holy1_pal_static +vr_MDVR_static +vr_MDVR_pal_static +vr_MNVR_static +vr_MNVR_pal_static +vr_RUVR_static +vr_RUVR_pal_static +vr_LHVR_static +vr_LHVR_pal_static +vr_KHVR_static +vr_KHVR_pal_static +vr_K3VR_static +vr_K3VR_pal_static +vr_K4VR_static +vr_K4VR_pal_static +vr_K5VR_static +vr_K5VR_pal_static +vr_SP1a_static +vr_SP1a_pal_static +vr_MLVR_static +vr_MLVR_pal_static +vr_KKRVR_static +vr_KKRVR_pal_static +vr_KR3VR_static +vr_KR3VR_pal_static +vr_IPVR_static +vr_IPVR_pal_static +vr_KSVR_static +vr_KSVR_pal_static +vr_GLVR_static +vr_GLVR_pal_static +vr_ZRVR_static +vr_ZRVR_pal_static +vr_DGVR_static +vr_DGVR_pal_static +vr_ALVR_static +vr_ALVR_pal_static +vr_NSVR_static +vr_NSVR_pal_static +vr_LBVR_static +vr_LBVR_pal_static +vr_TTVR_static +vr_TTVR_pal_static +vr_FCVR_static +vr_FCVR_pal_static +elf_message_field +elf_message_ydan +syotes_scene +syotes_room_0 +syotes2_scene +syotes2_room_0 +depth_test_scene +depth_test_room_0 +spot00_scene +spot00_room_0 +spot01_scene +spot01_room_0 +spot02_scene +spot02_room_0 +spot02_room_1 +spot03_scene +spot03_room_0 +spot03_room_1 +spot04_scene +spot04_room_0 +spot04_room_1 +spot04_room_2 +spot05_scene +spot05_room_0 +spot06_scene +spot06_room_0 +spot07_scene +spot07_room_0 +spot07_room_1 +spot08_scene +spot08_room_0 +spot09_scene +spot09_room_0 +spot10_scene +spot10_room_0 +spot10_room_1 +spot10_room_2 +spot10_room_3 +spot10_room_4 +spot10_room_5 +spot10_room_6 +spot10_room_7 +spot10_room_8 +spot10_room_9 +spot11_scene +spot11_room_0 +spot12_scene +spot12_room_0 +spot12_room_1 +spot13_scene +spot13_room_0 +spot13_room_1 +spot15_scene +spot15_room_0 +spot16_scene +spot16_room_0 +spot17_scene +spot17_room_0 +spot17_room_1 +spot18_scene +spot18_room_0 +spot18_room_1 +spot18_room_2 +spot18_room_3 +ydan_scene +ydan_room_0 +ydan_room_1 +ydan_room_2 +ydan_room_3 +ydan_room_4 +ydan_room_5 +ydan_room_6 +ydan_room_7 +ydan_room_8 +ydan_room_9 +ydan_room_10 +ydan_room_11 +ddan_scene +ddan_room_0 +ddan_room_1 +ddan_room_2 +ddan_room_3 +ddan_room_4 +ddan_room_5 +ddan_room_6 +ddan_room_7 +ddan_room_8 +ddan_room_9 +ddan_room_10 +ddan_room_11 +ddan_room_12 +ddan_room_13 +ddan_room_14 +ddan_room_15 +ddan_room_16 +bdan_scene +bdan_room_0 +bdan_room_1 +bdan_room_2 +bdan_room_3 +bdan_room_4 +bdan_room_5 +bdan_room_6 +bdan_room_7 +bdan_room_8 +bdan_room_9 +bdan_room_10 +bdan_room_11 +bdan_room_12 +bdan_room_13 +bdan_room_14 +bdan_room_15 +Bmori1_scene +Bmori1_room_0 +Bmori1_room_1 +Bmori1_room_2 +Bmori1_room_3 +Bmori1_room_4 +Bmori1_room_5 +Bmori1_room_6 +Bmori1_room_7 +Bmori1_room_8 +Bmori1_room_9 +Bmori1_room_10 +Bmori1_room_11 +Bmori1_room_12 +Bmori1_room_13 +Bmori1_room_14 +Bmori1_room_15 +Bmori1_room_16 +Bmori1_room_17 +Bmori1_room_18 +Bmori1_room_19 +Bmori1_room_20 +Bmori1_room_21 +Bmori1_room_22 +HIDAN_scene +HIDAN_room_0 +HIDAN_room_1 +HIDAN_room_2 +HIDAN_room_3 +HIDAN_room_4 +HIDAN_room_5 +HIDAN_room_6 +HIDAN_room_7 +HIDAN_room_8 +HIDAN_room_9 +HIDAN_room_10 +HIDAN_room_11 +HIDAN_room_12 +HIDAN_room_13 +HIDAN_room_14 +HIDAN_room_15 +HIDAN_room_16 +HIDAN_room_17 +HIDAN_room_18 +HIDAN_room_19 +HIDAN_room_20 +HIDAN_room_21 +HIDAN_room_22 +HIDAN_room_23 +HIDAN_room_24 +HIDAN_room_25 +HIDAN_room_26 +MIZUsin_scene +MIZUsin_room_0 +MIZUsin_room_1 +MIZUsin_room_2 +MIZUsin_room_3 +MIZUsin_room_4 +MIZUsin_room_5 +MIZUsin_room_6 +MIZUsin_room_7 +MIZUsin_room_8 +MIZUsin_room_9 +MIZUsin_room_10 +MIZUsin_room_11 +MIZUsin_room_12 +MIZUsin_room_13 +MIZUsin_room_14 +MIZUsin_room_15 +MIZUsin_room_16 +MIZUsin_room_17 +MIZUsin_room_18 +MIZUsin_room_19 +MIZUsin_room_20 +MIZUsin_room_21 +MIZUsin_room_22 +jyasinzou_scene +jyasinzou_room_0 +jyasinzou_room_1 +jyasinzou_room_2 +jyasinzou_room_3 +jyasinzou_room_4 +jyasinzou_room_5 +jyasinzou_room_6 +jyasinzou_room_7 +jyasinzou_room_8 +jyasinzou_room_9 +jyasinzou_room_10 +jyasinzou_room_11 +jyasinzou_room_12 +jyasinzou_room_13 +jyasinzou_room_14 +jyasinzou_room_15 +jyasinzou_room_16 +jyasinzou_room_17 +jyasinzou_room_18 +jyasinzou_room_19 +jyasinzou_room_20 +jyasinzou_room_21 +jyasinzou_room_22 +jyasinzou_room_23 +jyasinzou_room_24 +jyasinzou_room_25 +jyasinzou_room_26 +jyasinzou_room_27 +jyasinzou_room_28 +HAKAdan_scene +HAKAdan_room_0 +HAKAdan_room_1 +HAKAdan_room_2 +HAKAdan_room_3 +HAKAdan_room_4 +HAKAdan_room_5 +HAKAdan_room_6 +HAKAdan_room_7 +HAKAdan_room_8 +HAKAdan_room_9 +HAKAdan_room_10 +HAKAdan_room_11 +HAKAdan_room_12 +HAKAdan_room_13 +HAKAdan_room_14 +HAKAdan_room_15 +HAKAdan_room_16 +HAKAdan_room_17 +HAKAdan_room_18 +HAKAdan_room_19 +HAKAdan_room_20 +HAKAdan_room_21 +HAKAdan_room_22 +HAKAdanCH_scene +HAKAdanCH_room_0 +HAKAdanCH_room_1 +HAKAdanCH_room_2 +HAKAdanCH_room_3 +HAKAdanCH_room_4 +HAKAdanCH_room_5 +HAKAdanCH_room_6 +ice_doukutu_scene +ice_doukutu_room_0 +ice_doukutu_room_1 +ice_doukutu_room_2 +ice_doukutu_room_3 +ice_doukutu_room_4 +ice_doukutu_room_5 +ice_doukutu_room_6 +ice_doukutu_room_7 +ice_doukutu_room_8 +ice_doukutu_room_9 +ice_doukutu_room_10 +ice_doukutu_room_11 +men_scene +men_room_0 +men_room_1 +men_room_2 +men_room_3 +men_room_4 +men_room_5 +men_room_6 +men_room_7 +men_room_8 +men_room_9 +men_room_10 +ganontika_scene +ganontika_room_0 +ganontika_room_1 +ganontika_room_2 +ganontika_room_3 +ganontika_room_4 +ganontika_room_5 +ganontika_room_6 +ganontika_room_7 +ganontika_room_8 +ganontika_room_9 +ganontika_room_10 +ganontika_room_11 +ganontika_room_12 +ganontika_room_13 +ganontika_room_14 +ganontika_room_15 +ganontika_room_16 +ganontika_room_17 +ganontika_room_18 +ganontika_room_19 +market_day_scene +market_day_room_0 +market_night_scene +market_night_room_0 +testroom_scene +testroom_room_0 +testroom_room_1 +testroom_room_2 +testroom_room_3 +testroom_room_4 +kenjyanoma_scene +kenjyanoma_room_0 +tokinoma_scene +tokinoma_room_0 +tokinoma_room_1 +sutaru_scene +sutaru_room_0 +link_home_scene +link_home_room_0 +kokiri_shop_scene +kokiri_shop_room_0 +kokiri_home_scene +kokiri_home_room_0 +kakusiana_scene +kakusiana_room_0 +kakusiana_room_1 +kakusiana_room_2 +kakusiana_room_3 +kakusiana_room_4 +kakusiana_room_5 +kakusiana_room_6 +kakusiana_room_7 +kakusiana_room_8 +kakusiana_room_9 +kakusiana_room_10 +kakusiana_room_11 +kakusiana_room_12 +kakusiana_room_13 +entra_scene +entra_room_0 +moribossroom_scene +moribossroom_room_0 +moribossroom_room_1 +syatekijyou_scene +syatekijyou_room_0 +shop1_scene +shop1_room_0 +hairal_niwa_scene +hairal_niwa_room_0 +ganon_tou_scene +ganon_tou_room_0 +sasatest_scene +sasatest_room_0 +market_alley_scene +market_alley_room_0 +spot20_scene +spot20_room_0 +market_ruins_scene +market_ruins_room_0 +entra_n_scene +entra_n_room_0 +enrui_scene +enrui_room_0 +market_alley_n_scene +market_alley_n_room_0 +hiral_demo_scene +hiral_demo_room_0 +kokiri_home3_scene +kokiri_home3_room_0 +malon_stable_scene +malon_stable_room_0 +kakariko_scene +kakariko_room_0 +bdan_boss_scene +bdan_boss_room_0 +bdan_boss_room_1 +FIRE_bs_scene +FIRE_bs_room_0 +FIRE_bs_room_1 +hut_scene +hut_room_0 +daiyousei_izumi_scene +daiyousei_izumi_room_0 +hakaana_scene +hakaana_room_0 +yousei_izumi_tate_scene +yousei_izumi_tate_room_0 +yousei_izumi_yoko_scene +yousei_izumi_yoko_room_0 +golon_scene +golon_room_0 +zoora_scene +zoora_room_0 +drag_scene +drag_room_0 +alley_shop_scene +alley_shop_room_0 +night_shop_scene +night_shop_room_0 +impa_scene +impa_room_0 +labo_scene +labo_room_0 +tent_scene +tent_room_0 +nakaniwa_scene +nakaniwa_room_0 +ddan_boss_scene +ddan_boss_room_0 +ddan_boss_room_1 +ydan_boss_scene +ydan_boss_room_0 +ydan_boss_room_1 +HAKAdan_bs_scene +HAKAdan_bs_room_0 +HAKAdan_bs_room_1 +MIZUsin_bs_scene +MIZUsin_bs_room_0 +MIZUsin_bs_room_1 +ganon_scene +ganon_room_0 +ganon_room_1 +ganon_room_2 +ganon_room_3 +ganon_room_4 +ganon_room_5 +ganon_room_6 +ganon_room_7 +ganon_room_8 +ganon_room_9 +ganon_boss_scene +ganon_boss_room_0 +jyasinboss_scene +jyasinboss_room_0 +jyasinboss_room_1 +jyasinboss_room_2 +jyasinboss_room_3 +kokiri_home4_scene +kokiri_home4_room_0 +kokiri_home5_scene +kokiri_home5_room_0 +ganon_final_scene +ganon_final_room_0 +kakariko3_scene +kakariko3_room_0 +hairal_niwa2_scene +hairal_niwa2_room_0 +hakasitarelay_scene +hakasitarelay_room_0 +hakasitarelay_room_1 +hakasitarelay_room_2 +hakasitarelay_room_3 +hakasitarelay_room_4 +hakasitarelay_room_5 +hakasitarelay_room_6 +shrine_scene +shrine_room_0 +turibori_scene +turibori_room_0 +shrine_n_scene +shrine_n_room_0 +shrine_r_scene +shrine_r_room_0 +hakaana2_scene +hakaana2_room_0 +gerudoway_scene +gerudoway_room_0 +gerudoway_room_1 +gerudoway_room_2 +gerudoway_room_3 +gerudoway_room_4 +gerudoway_room_5 +hairal_niwa_n_scene +hairal_niwa_n_room_0 +bowling_scene +bowling_room_0 +hakaana_ouke_scene +hakaana_ouke_room_0 +hakaana_ouke_room_1 +hakaana_ouke_room_2 +hylia_labo_scene +hylia_labo_room_0 +souko_scene +souko_room_0 +souko_room_1 +souko_room_2 +miharigoya_scene +miharigoya_room_0 +mahouya_scene +mahouya_room_0 +takaraya_scene +takaraya_room_0 +takaraya_room_1 +takaraya_room_2 +takaraya_room_3 +takaraya_room_4 +takaraya_room_5 +takaraya_room_6 +ganon_sonogo_scene +ganon_sonogo_room_0 +ganon_sonogo_room_1 +ganon_sonogo_room_2 +ganon_sonogo_room_3 +ganon_sonogo_room_4 +ganon_demo_scene +ganon_demo_room_0 +besitu_scene +besitu_room_0 +face_shop_scene +face_shop_room_0 +kinsuta_scene +kinsuta_room_0 +ganontikasonogo_scene +ganontikasonogo_room_0 +ganontikasonogo_room_1 +test01_scene +test01_room_0 +bump_texture_static +anime_model_1_static +anime_model_2_static +anime_model_3_static +anime_model_4_static +anime_model_5_static +anime_model_6_static +anime_texture_1_static +anime_texture_2_static +anime_texture_3_static +anime_texture_4_static +anime_texture_5_static +anime_texture_6_static +softsprite_matrix_static \ No newline at end of file diff --git a/OTRExporter/CFG/filelists/gamecube.txt b/OTRExporter/CFG/filelists/gamecube.txt new file mode 100644 index 000000000..23794e1f6 --- /dev/null +++ b/OTRExporter/CFG/filelists/gamecube.txt @@ -0,0 +1,1509 @@ +makerom +boot +dmadata +Audiobank +Audioseq +Audiotable +kanji +link_animetion +icon_item_static +icon_item_24_static +icon_item_field_static +icon_item_dungeon_static +icon_item_gameover_static +icon_item_jpn_static +icon_item_nes_static +item_name_static +map_name_static +do_action_static +message_static +message_texture_static +nes_font_static +jpn_message_data_static +nes_message_data_static +staff_message_data_static +map_grand_static +map_48x85_static +map_i_static +code +ovl_title +ovl_select +ovl_opening +ovl_file_choose +ovl_kaleido_scope +ovl_player_actor +ovl_map_mark_data +ovl_En_Test +ovl_Arms_Hook +ovl_Arrow_Fire +ovl_Arrow_Ice +ovl_Arrow_Light +ovl_Bg_Bdan_Objects +ovl_Bg_Bdan_Switch +ovl_Bg_Bom_Guard +ovl_Bg_Bombwall +ovl_Bg_Bowl_Wall +ovl_Bg_Breakwall +ovl_Bg_Ddan_Jd +ovl_Bg_Ddan_Kd +ovl_Bg_Dodoago +ovl_Bg_Dy_Yoseizo +ovl_Bg_Ganon_Otyuka +ovl_Bg_Gate_Shutter +ovl_Bg_Gjyo_Bridge +ovl_Bg_Gnd_Darkmeiro +ovl_Bg_Gnd_Firemeiro +ovl_Bg_Gnd_Iceblock +ovl_Bg_Gnd_Nisekabe +ovl_Bg_Gnd_Soulmeiro +ovl_Bg_Haka +ovl_Bg_Haka_Gate +ovl_Bg_Haka_Huta +ovl_Bg_Haka_Megane +ovl_Bg_Haka_MeganeBG +ovl_Bg_Haka_Sgami +ovl_Bg_Haka_Ship +ovl_Bg_Haka_Trap +ovl_Bg_Haka_Tubo +ovl_Bg_Haka_Water +ovl_Bg_Haka_Zou +ovl_Bg_Heavy_Block +ovl_Bg_Hidan_Curtain +ovl_Bg_Hidan_Dalm +ovl_Bg_Hidan_Firewall +ovl_Bg_Hidan_Fslift +ovl_Bg_Hidan_Fwbig +ovl_Bg_Hidan_Hamstep +ovl_Bg_Hidan_Hrock +ovl_Bg_Hidan_Kousi +ovl_Bg_Hidan_Kowarerukabe +ovl_Bg_Hidan_Rock +ovl_Bg_Hidan_Rsekizou +ovl_Bg_Hidan_Sekizou +ovl_Bg_Hidan_Sima +ovl_Bg_Hidan_Syoku +ovl_Bg_Ice_Objects +ovl_Bg_Ice_Shelter +ovl_Bg_Ice_Shutter +ovl_Bg_Ice_Turara +ovl_Bg_Ingate +ovl_Bg_Jya_1flift +ovl_Bg_Jya_Amishutter +ovl_Bg_Jya_Bigmirror +ovl_Bg_Jya_Block +ovl_Bg_Jya_Bombchuiwa +ovl_Bg_Jya_Bombiwa +ovl_Bg_Jya_Cobra +ovl_Bg_Jya_Goroiwa +ovl_Bg_Jya_Haheniron +ovl_Bg_Jya_Ironobj +ovl_Bg_Jya_Kanaami +ovl_Bg_Jya_Lift +ovl_Bg_Jya_Megami +ovl_Bg_Jya_Zurerukabe +ovl_Bg_Menkuri_Eye +ovl_Bg_Menkuri_Kaiten +ovl_Bg_Menkuri_Nisekabe +ovl_Bg_Mizu_Bwall +ovl_Bg_Mizu_Movebg +ovl_Bg_Mizu_Shutter +ovl_Bg_Mizu_Uzu +ovl_Bg_Mizu_Water +ovl_Bg_Mjin +ovl_Bg_Mori_Bigst +ovl_Bg_Mori_Elevator +ovl_Bg_Mori_Hashigo +ovl_Bg_Mori_Hashira4 +ovl_Bg_Mori_Hineri +ovl_Bg_Mori_Idomizu +ovl_Bg_Mori_Kaitenkabe +ovl_Bg_Mori_Rakkatenjo +ovl_Bg_Po_Event +ovl_Bg_Po_Syokudai +ovl_Bg_Pushbox +ovl_Bg_Relay_Objects +ovl_Bg_Spot00_Break +ovl_Bg_Spot00_Hanebasi +ovl_Bg_Spot01_Fusya +ovl_Bg_Spot01_Idohashira +ovl_Bg_Spot01_Idomizu +ovl_Bg_Spot01_Idosoko +ovl_Bg_Spot01_Objects2 +ovl_Bg_Spot02_Objects +ovl_Bg_Spot03_Taki +ovl_Bg_Spot05_Soko +ovl_Bg_Spot06_Objects +ovl_Bg_Spot07_Taki +ovl_Bg_Spot08_Bakudankabe +ovl_Bg_Spot08_Iceblock +ovl_Bg_Spot09_Obj +ovl_Bg_Spot11_Bakudankabe +ovl_Bg_Spot11_Oasis +ovl_Bg_Spot12_Gate +ovl_Bg_Spot12_Saku +ovl_Bg_Spot15_Rrbox +ovl_Bg_Spot15_Saku +ovl_Bg_Spot16_Bombstone +ovl_Bg_Spot16_Doughnut +ovl_Bg_Spot17_Bakudankabe +ovl_Bg_Spot17_Funen +ovl_Bg_Spot18_Basket +ovl_Bg_Spot18_Futa +ovl_Bg_Spot18_Obj +ovl_Bg_Spot18_Shutter +ovl_Bg_Sst_Floor +ovl_Bg_Toki_Hikari +ovl_Bg_Toki_Swd +ovl_Bg_Treemouth +ovl_Bg_Umajump +ovl_Bg_Vb_Sima +ovl_Bg_Ydan_Hasi +ovl_Bg_Ydan_Maruta +ovl_Bg_Ydan_Sp +ovl_Bg_Zg +ovl_Boss_Dodongo +ovl_Boss_Fd +ovl_Boss_Fd2 +ovl_Boss_Ganon +ovl_Boss_Ganon2 +ovl_Boss_Ganondrof +ovl_Boss_Goma +ovl_Boss_Mo +ovl_Boss_Sst +ovl_Boss_Tw +ovl_Boss_Va +ovl_Demo_6K +ovl_Demo_Du +ovl_Demo_Ec +ovl_Demo_Effect +ovl_Demo_Ext +ovl_Demo_Geff +ovl_Demo_Gj +ovl_Demo_Go +ovl_Demo_Gt +ovl_Demo_Ik +ovl_Demo_Im +ovl_Demo_Kankyo +ovl_Demo_Kekkai +ovl_Demo_Sa +ovl_Demo_Shd +ovl_Demo_Tre_Lgt +ovl_Door_Ana +ovl_Door_Gerudo +ovl_Door_Killer +ovl_Door_Shutter +ovl_Door_Toki +ovl_Door_Warp1 +ovl_Efc_Erupc +ovl_Eff_Dust +ovl_Effect_Ss_Blast +ovl_Effect_Ss_Bomb +ovl_Effect_Ss_Bomb2 +ovl_Effect_Ss_Bubble +ovl_Effect_Ss_D_Fire +ovl_Effect_Ss_Dead_Db +ovl_Effect_Ss_Dead_Dd +ovl_Effect_Ss_Dead_Ds +ovl_Effect_Ss_Dead_Sound +ovl_Effect_Ss_Dt_Bubble +ovl_Effect_Ss_Dust +ovl_Effect_Ss_En_Fire +ovl_Effect_Ss_En_Ice +ovl_Effect_Ss_Extra +ovl_Effect_Ss_Fcircle +ovl_Effect_Ss_Fhg_Flash +ovl_Effect_Ss_Fire_Tail +ovl_Effect_Ss_G_Fire +ovl_Effect_Ss_G_Magma +ovl_Effect_Ss_G_Magma2 +ovl_Effect_Ss_G_Ripple +ovl_Effect_Ss_G_Spk +ovl_Effect_Ss_G_Splash +ovl_Effect_Ss_Hahen +ovl_Effect_Ss_HitMark +ovl_Effect_Ss_Ice_Piece +ovl_Effect_Ss_Ice_Smoke +ovl_Effect_Ss_K_Fire +ovl_Effect_Ss_Kakera +ovl_Effect_Ss_KiraKira +ovl_Effect_Ss_Lightning +ovl_Effect_Ss_Sibuki +ovl_Effect_Ss_Sibuki2 +ovl_Effect_Ss_Solder_Srch_Ball +ovl_Effect_Ss_Stick +ovl_Effect_Ss_Stone1 +ovl_Elf_Msg +ovl_Elf_Msg2 +ovl_En_Am +ovl_En_Ani +ovl_En_Anubice +ovl_En_Anubice_Fire +ovl_En_Anubice_Tag +ovl_En_Arow_Trap +ovl_En_Arrow +ovl_En_Attack_Niw +ovl_En_Ba +ovl_En_Bb +ovl_En_Bdfire +ovl_En_Bigokuta +ovl_En_Bili +ovl_En_Bird +ovl_En_Blkobj +ovl_En_Bom +ovl_En_Bom_Bowl_Man +ovl_En_Bom_Bowl_Pit +ovl_En_Bom_Chu +ovl_En_Bombf +ovl_En_Boom +ovl_En_Box +ovl_En_Brob +ovl_En_Bubble +ovl_En_Butte +ovl_En_Bw +ovl_En_Bx +ovl_En_Changer +ovl_En_Clear_Tag +ovl_En_Cow +ovl_En_Crow +ovl_En_Cs +ovl_En_Daiku +ovl_En_Daiku_Kakariko +ovl_En_Dekubaba +ovl_En_Dekunuts +ovl_En_Dh +ovl_En_Dha +ovl_En_Diving_Game +ovl_En_Dns +ovl_En_Dnt_Demo +ovl_En_Dnt_Jiji +ovl_En_Dnt_Nomal +ovl_En_Dodojr +ovl_En_Dodongo +ovl_En_Dog +ovl_En_Door +ovl_En_Ds +ovl_En_Du +ovl_En_Dy_Extra +ovl_En_Eg +ovl_En_Eiyer +ovl_En_Elf +ovl_En_Encount1 +ovl_En_Encount2 +ovl_En_Ex_Item +ovl_En_Ex_Ruppy +ovl_En_Fd +ovl_En_Fd_Fire +ovl_En_Fhg_Fire +ovl_En_Fire_Rock +ovl_En_Firefly +ovl_En_Fish +ovl_En_Floormas +ovl_En_Fr +ovl_En_Fu +ovl_En_Fw +ovl_En_Fz +ovl_En_G_Switch +ovl_En_Ganon_Mant +ovl_En_Ganon_Organ +ovl_En_Gb +ovl_En_Ge1 +ovl_En_Ge2 +ovl_En_Ge3 +ovl_En_GeldB +ovl_En_GirlA +ovl_En_Gm +ovl_En_Go +ovl_En_Go2 +ovl_En_Goma +ovl_En_Goroiwa +ovl_En_Gs +ovl_En_Guest +ovl_En_Hata +ovl_En_Heishi1 +ovl_En_Heishi2 +ovl_En_Heishi3 +ovl_En_Heishi4 +ovl_En_Hintnuts +ovl_En_Holl +ovl_En_Honotrap +ovl_En_Horse +ovl_En_Horse_Game_Check +ovl_En_Horse_Ganon +ovl_En_Horse_Link_Child +ovl_En_Horse_Normal +ovl_En_Horse_Zelda +ovl_En_Hs +ovl_En_Hs2 +ovl_En_Hy +ovl_En_Ice_Hono +ovl_En_Ik +ovl_En_In +ovl_En_Insect +ovl_En_Ishi +ovl_En_It +ovl_En_Jj +ovl_En_Js +ovl_En_Jsjutan +ovl_En_Kakasi +ovl_En_Kakasi2 +ovl_En_Kakasi3 +ovl_En_Kanban +ovl_En_Karebaba +ovl_En_Ko +ovl_En_Kusa +ovl_En_Kz +ovl_En_Light +ovl_En_Lightbox +ovl_En_M_Fire1 +ovl_En_M_Thunder +ovl_En_Ma1 +ovl_En_Ma2 +ovl_En_Ma3 +ovl_En_Mag +ovl_En_Mb +ovl_En_Md +ovl_En_Mk +ovl_En_Mm +ovl_En_Mm2 +ovl_En_Ms +ovl_En_Mu +ovl_En_Nb +ovl_En_Niw +ovl_En_Niw_Girl +ovl_En_Niw_Lady +ovl_En_Nutsball +ovl_En_Nwc +ovl_En_Ny +ovl_En_OE2 +ovl_En_Okarina_Effect +ovl_En_Okarina_Tag +ovl_En_Okuta +ovl_En_Ossan +ovl_En_Owl +ovl_En_Part +ovl_En_Peehat +ovl_En_Po_Desert +ovl_En_Po_Field +ovl_En_Po_Relay +ovl_En_Po_Sisters +ovl_En_Poh +ovl_En_Pu_box +ovl_En_Rd +ovl_En_Reeba +ovl_En_River_Sound +ovl_En_Rl +ovl_En_Rr +ovl_En_Ru1 +ovl_En_Ru2 +ovl_En_Sa +ovl_En_Sb +ovl_En_Scene_Change +ovl_En_Sda +ovl_En_Shopnuts +ovl_En_Si +ovl_En_Siofuki +ovl_En_Skb +ovl_En_Skj +ovl_En_Skjneedle +ovl_En_Ssh +ovl_En_St +ovl_En_Sth +ovl_En_Stream +ovl_En_Sw +ovl_En_Syateki_Itm +ovl_En_Syateki_Man +ovl_En_Syateki_Niw +ovl_En_Ta +ovl_En_Takara_Man +ovl_En_Tana +ovl_En_Tg +ovl_En_Tite +ovl_En_Tk +ovl_En_Torch +ovl_En_Torch2 +ovl_En_Toryo +ovl_En_Tp +ovl_En_Tr +ovl_En_Trap +ovl_En_Tubo_Trap +ovl_En_Vali +ovl_En_Vase +ovl_En_Vb_Ball +ovl_En_Viewer +ovl_En_Vm +ovl_En_Wall_Tubo +ovl_En_Wallmas +ovl_En_Weather_Tag +ovl_En_Weiyer +ovl_En_Wf +ovl_En_Wonder_Item +ovl_En_Wonder_Talk +ovl_En_Wonder_Talk2 +ovl_En_Wood02 +ovl_En_Xc +ovl_En_Yabusame_Mark +ovl_En_Yukabyun +ovl_En_Zf +ovl_En_Zl1 +ovl_En_Zl2 +ovl_En_Zl3 +ovl_En_Zl4 +ovl_En_Zo +ovl_En_fHG +ovl_End_Title +ovl_Fishing +ovl_Item_B_Heart +ovl_Item_Etcetera +ovl_Item_Inbox +ovl_Item_Ocarina +ovl_Item_Shield +ovl_Magic_Dark +ovl_Magic_Fire +ovl_Magic_Wind +ovl_Mir_Ray +ovl_Obj_Bean +ovl_Obj_Blockstop +ovl_Obj_Bombiwa +ovl_Obj_Comb +ovl_Obj_Dekujr +ovl_Obj_Elevator +ovl_Obj_Hamishi +ovl_Obj_Hana +ovl_Obj_Hsblock +ovl_Obj_Ice_Poly +ovl_Obj_Kibako +ovl_Obj_Kibako2 +ovl_Obj_Lift +ovl_Obj_Lightswitch +ovl_Obj_Makekinsuta +ovl_Obj_Makeoshihiki +ovl_Obj_Mure +ovl_Obj_Mure2 +ovl_Obj_Mure3 +ovl_Obj_Oshihiki +ovl_Obj_Roomtimer +ovl_Obj_Switch +ovl_Obj_Syokudai +ovl_Obj_Timeblock +ovl_Obj_Tsubo +ovl_Obj_Warp2block +ovl_Object_Kankyo +ovl_Oceff_Spot +ovl_Oceff_Storm +ovl_Oceff_Wipe +ovl_Oceff_Wipe2 +ovl_Oceff_Wipe3 +ovl_Oceff_Wipe4 +ovl_Shot_Sun +gameplay_keep +gameplay_field_keep +gameplay_dangeon_keep +gameplay_object_exchange_static +object_link_boy +object_link_child +object_box +object_human +object_okuta +object_poh +object_wallmaster +object_dy_obj +object_firefly +object_dodongo +object_fire +object_niw +object_tite +object_reeba +object_peehat +object_kingdodongo +object_horse +object_zf +object_goma +object_zl1 +object_gol +object_bubble +object_dodojr +object_torch2 +object_bl +object_tp +object_oA1 +object_st +object_bw +object_ei +object_horse_normal +object_oB1 +object_o_anime +object_spot04_objects +object_ddan_objects +object_hidan_objects +object_horse_ganon +object_oA2 +object_spot00_objects +object_mb +object_bombf +object_sk2 +object_oE1 +object_oE_anime +object_oE2 +object_ydan_objects +object_gnd +object_am +object_dekubaba +object_oA3 +object_oA4 +object_oA5 +object_oA6 +object_oA7 +object_jj +object_oA8 +object_oA9 +object_oB2 +object_oB3 +object_oB4 +object_horse_zelda +object_opening_demo1 +object_warp1 +object_b_heart +object_dekunuts +object_oE3 +object_oE4 +object_menkuri_objects +object_oE5 +object_oE6 +object_oE7 +object_oE8 +object_oE9 +object_oE10 +object_oE11 +object_oE12 +object_vali +object_oA10 +object_oA11 +object_mizu_objects +object_fhg +object_ossan +object_mori_hineri1 +object_Bb +object_toki_objects +object_yukabyun +object_zl2 +object_mjin +object_mjin_flash +object_mjin_dark +object_mjin_flame +object_mjin_ice +object_mjin_soul +object_mjin_wind +object_mjin_oka +object_haka_objects +object_spot06_objects +object_ice_objects +object_relay_objects +object_mori_hineri1a +object_mori_hineri2 +object_mori_hineri2a +object_mori_objects +object_mori_tex +object_spot08_obj +object_warp2 +object_hata +object_bird +object_wood02 +object_lightbox +object_pu_box +object_trap +object_vase +object_im +object_ta +object_tk +object_xc +object_vm +object_bv +object_hakach_objects +object_efc_crystal_light +object_efc_fire_ball +object_efc_flash +object_efc_lgt_shower +object_efc_star_field +object_god_lgt +object_light_ring +object_triforce_spot +object_medal +object_bdan_objects +object_sd +object_rd +object_po_sisters +object_heavy_object +object_gndd +object_fd +object_du +object_fw +object_horse_link_child +object_spot02_objects +object_haka +object_ru1 +object_syokudai +object_fd2 +object_dh +object_rl +object_efc_tw +object_demo_tre_lgt +object_gi_key +object_mir_ray +object_brob +object_gi_jewel +object_spot09_obj +object_spot18_obj +object_bdoor +object_spot17_obj +object_shop_dungen +object_nb +object_mo +object_sb +object_gi_melody +object_gi_heart +object_gi_compass +object_gi_bosskey +object_gi_medal +object_gi_nuts +object_sa +object_gi_hearts +object_gi_arrowcase +object_gi_bombpouch +object_in +object_tr +object_spot16_obj +object_oE1s +object_oE4s +object_os_anime +object_gi_bottle +object_gi_stick +object_gi_map +object_oF1d_map +object_ru2 +object_gi_shield_1 +object_dekujr +object_gi_magicpot +object_gi_bomb_1 +object_oF1s +object_ma2 +object_gi_purse +object_hni +object_tw +object_rr +object_bxa +object_anubice +object_gi_gerudo +object_gi_arrow +object_gi_bomb_2 +object_gi_egg +object_gi_scale +object_gi_shield_2 +object_gi_hookshot +object_gi_ocarina +object_gi_milk +object_ma1 +object_ganon +object_sst +object_ny +object_fr +object_gi_pachinko +object_gi_boomerang +object_gi_bow +object_gi_glasses +object_gi_liquid +object_ani +object_demo_6k +object_gi_shield_3 +object_gi_letter +object_spot15_obj +object_jya_obj +object_gi_clothes +object_gi_bean +object_gi_fish +object_gi_saw +object_gi_hammer +object_gi_grass +object_gi_longsword +object_spot01_objects +object_md +object_km1 +object_kw1 +object_zo +object_kz +object_umajump +object_masterkokiri +object_masterkokirihead +object_mastergolon +object_masterzoora +object_aob +object_ik +object_ahg +object_cne +object_gi_niwatori +object_skj +object_gi_bottle_letter +object_bji +object_bba +object_gi_ocarina_0 +object_ds +object_ane +object_boj +object_spot03_object +object_spot07_object +object_fz +object_bob +object_ge1 +object_yabusame_point +object_gi_boots_2 +object_gi_seed +object_gnd_magic +object_d_elevator +object_d_hsblock +object_d_lift +object_mamenoki +object_goroiwa +object_toryo +object_daiku +object_nwc +object_blkobj +object_gm +object_ms +object_hs +object_ingate +object_lightswitch +object_kusa +object_tsubo +object_gi_gloves +object_gi_coin +object_kanban +object_gjyo_objects +object_owl +object_mk +object_fu +object_gi_ki_tan_mask +object_gi_redead_mask +object_gi_skj_mask +object_gi_rabit_mask +object_gi_truth_mask +object_ganon_objects +object_siofuki +object_stream +object_mm +object_fa +object_os +object_gi_eye_lotion +object_gi_powder +object_gi_mushroom +object_gi_ticketstone +object_gi_brokensword +object_js +object_cs +object_gi_prescription +object_gi_bracelet +object_gi_soldout +object_gi_frog +object_mag +object_door_gerudo +object_gt +object_efc_erupc +object_zl2_anime1 +object_zl2_anime2 +object_gi_golonmask +object_gi_zoramask +object_gi_gerudomask +object_ganon2 +object_ka +object_ts +object_zg +object_gi_hoverboots +object_gi_m_arrow +object_ds2 +object_ec +object_fish +object_gi_sutaru +object_gi_goddess +object_ssh +object_bigokuta +object_bg +object_spot05_objects +object_spot12_obj +object_bombiwa +object_hintnuts +object_rs +object_spot00_break +object_gla +object_shopnuts +object_geldb +object_gr +object_dog +object_jya_iron +object_jya_door +object_spot01_objects2 +object_spot11_obj +object_kibako2 +object_dns +object_dnk +object_gi_fire +object_gi_insect +object_gi_butterfly +object_gi_ghost +object_gi_soul +object_bowl +object_po_field +object_demo_kekkai +object_efc_doughnut +object_gi_dekupouch +object_ganon_anime1 +object_ganon_anime2 +object_ganon_anime3 +object_gi_rupy +object_spot01_matoya +object_spot01_matoyab +object_po_composer +object_mu +object_wf +object_skb +object_gj +object_geff +object_haka_door +object_gs +object_ps +object_bwall +object_crow +object_cow +object_cob +object_gi_sword_1 +object_door_killer +object_ouke_haka +object_timeblock +object_zl4 +g_pn_01 +g_pn_02 +g_pn_03 +g_pn_04 +g_pn_05 +g_pn_06 +g_pn_07 +g_pn_08 +g_pn_09 +g_pn_10 +g_pn_11 +g_pn_12 +g_pn_13 +g_pn_14 +g_pn_15 +g_pn_16 +g_pn_17 +g_pn_18 +g_pn_19 +g_pn_20 +g_pn_21 +g_pn_22 +g_pn_23 +g_pn_24 +g_pn_25 +g_pn_26 +g_pn_27 +g_pn_28 +g_pn_29 +g_pn_30 +g_pn_31 +g_pn_32 +g_pn_33 +g_pn_34 +g_pn_35 +g_pn_36 +g_pn_37 +g_pn_38 +g_pn_39 +g_pn_40 +g_pn_41 +g_pn_42 +g_pn_43 +g_pn_44 +g_pn_45 +g_pn_46 +g_pn_47 +g_pn_48 +g_pn_49 +g_pn_50 +g_pn_51 +g_pn_52 +g_pn_53 +g_pn_54 +g_pn_55 +g_pn_56 +g_pn_57 +z_select_static +nintendo_rogo_static +title_static +parameter_static +vr_fine0_static +vr_fine0_pal_static +vr_fine1_static +vr_fine1_pal_static +vr_fine2_static +vr_fine2_pal_static +vr_fine3_static +vr_fine3_pal_static +vr_cloud0_static +vr_cloud0_pal_static +vr_cloud1_static +vr_cloud1_pal_static +vr_cloud2_static +vr_cloud2_pal_static +vr_cloud3_static +vr_cloud3_pal_static +vr_holy0_static +vr_holy0_pal_static +vr_holy1_static +vr_holy1_pal_static +vr_MDVR_static +vr_MDVR_pal_static +vr_MNVR_static +vr_MNVR_pal_static +vr_RUVR_static +vr_RUVR_pal_static +vr_LHVR_static +vr_LHVR_pal_static +vr_KHVR_static +vr_KHVR_pal_static +vr_K3VR_static +vr_K3VR_pal_static +vr_K4VR_static +vr_K4VR_pal_static +vr_K5VR_static +vr_K5VR_pal_static +vr_SP1a_static +vr_SP1a_pal_static +vr_MLVR_static +vr_MLVR_pal_static +vr_KKRVR_static +vr_KKRVR_pal_static +vr_KR3VR_static +vr_KR3VR_pal_static +vr_IPVR_static +vr_IPVR_pal_static +vr_KSVR_static +vr_KSVR_pal_static +vr_GLVR_static +vr_GLVR_pal_static +vr_ZRVR_static +vr_ZRVR_pal_static +vr_DGVR_static +vr_DGVR_pal_static +vr_ALVR_static +vr_ALVR_pal_static +vr_NSVR_static +vr_NSVR_pal_static +vr_LBVR_static +vr_LBVR_pal_static +vr_TTVR_static +vr_TTVR_pal_static +vr_FCVR_static +vr_FCVR_pal_static +elf_message_field +elf_message_ydan +ydan_scene +ydan_room_0 +ydan_room_1 +ydan_room_2 +ydan_room_3 +ydan_room_4 +ydan_room_5 +ydan_room_6 +ydan_room_7 +ydan_room_8 +ydan_room_9 +ydan_room_10 +ydan_room_11 +ddan_scene +ddan_room_0 +ddan_room_1 +ddan_room_2 +ddan_room_3 +ddan_room_4 +ddan_room_5 +ddan_room_6 +ddan_room_7 +ddan_room_8 +ddan_room_9 +ddan_room_10 +ddan_room_11 +ddan_room_12 +ddan_room_13 +ddan_room_14 +ddan_room_15 +ddan_room_16 +bdan_scene +bdan_room_0 +bdan_room_1 +bdan_room_2 +bdan_room_3 +bdan_room_4 +bdan_room_5 +bdan_room_6 +bdan_room_7 +bdan_room_8 +bdan_room_9 +bdan_room_10 +bdan_room_11 +bdan_room_12 +bdan_room_13 +bdan_room_14 +bdan_room_15 +Bmori1_scene +Bmori1_room_0 +Bmori1_room_1 +Bmori1_room_2 +Bmori1_room_3 +Bmori1_room_4 +Bmori1_room_5 +Bmori1_room_6 +Bmori1_room_7 +Bmori1_room_8 +Bmori1_room_9 +Bmori1_room_10 +Bmori1_room_11 +Bmori1_room_12 +Bmori1_room_13 +Bmori1_room_14 +Bmori1_room_15 +Bmori1_room_16 +Bmori1_room_17 +Bmori1_room_18 +Bmori1_room_19 +Bmori1_room_20 +Bmori1_room_21 +Bmori1_room_22 +HIDAN_scene +HIDAN_room_0 +HIDAN_room_1 +HIDAN_room_2 +HIDAN_room_3 +HIDAN_room_4 +HIDAN_room_5 +HIDAN_room_6 +HIDAN_room_7 +HIDAN_room_8 +HIDAN_room_9 +HIDAN_room_10 +HIDAN_room_11 +HIDAN_room_12 +HIDAN_room_13 +HIDAN_room_14 +HIDAN_room_15 +HIDAN_room_16 +HIDAN_room_17 +HIDAN_room_18 +HIDAN_room_19 +HIDAN_room_20 +HIDAN_room_21 +HIDAN_room_22 +HIDAN_room_23 +HIDAN_room_24 +HIDAN_room_25 +HIDAN_room_26 +MIZUsin_scene +MIZUsin_room_0 +MIZUsin_room_1 +MIZUsin_room_2 +MIZUsin_room_3 +MIZUsin_room_4 +MIZUsin_room_5 +MIZUsin_room_6 +MIZUsin_room_7 +MIZUsin_room_8 +MIZUsin_room_9 +MIZUsin_room_10 +MIZUsin_room_11 +MIZUsin_room_12 +MIZUsin_room_13 +MIZUsin_room_14 +MIZUsin_room_15 +MIZUsin_room_16 +MIZUsin_room_17 +MIZUsin_room_18 +MIZUsin_room_19 +MIZUsin_room_20 +MIZUsin_room_21 +MIZUsin_room_22 +jyasinzou_scene +jyasinzou_room_0 +jyasinzou_room_1 +jyasinzou_room_2 +jyasinzou_room_3 +jyasinzou_room_4 +jyasinzou_room_5 +jyasinzou_room_6 +jyasinzou_room_7 +jyasinzou_room_8 +jyasinzou_room_9 +jyasinzou_room_10 +jyasinzou_room_11 +jyasinzou_room_12 +jyasinzou_room_13 +jyasinzou_room_14 +jyasinzou_room_15 +jyasinzou_room_16 +jyasinzou_room_17 +jyasinzou_room_18 +jyasinzou_room_19 +jyasinzou_room_20 +jyasinzou_room_21 +jyasinzou_room_22 +jyasinzou_room_23 +jyasinzou_room_24 +jyasinzou_room_25 +jyasinzou_room_26 +jyasinzou_room_27 +jyasinzou_room_28 +HAKAdan_scene +HAKAdan_room_0 +HAKAdan_room_1 +HAKAdan_room_2 +HAKAdan_room_3 +HAKAdan_room_4 +HAKAdan_room_5 +HAKAdan_room_6 +HAKAdan_room_7 +HAKAdan_room_8 +HAKAdan_room_9 +HAKAdan_room_10 +HAKAdan_room_11 +HAKAdan_room_12 +HAKAdan_room_13 +HAKAdan_room_14 +HAKAdan_room_15 +HAKAdan_room_16 +HAKAdan_room_17 +HAKAdan_room_18 +HAKAdan_room_19 +HAKAdan_room_20 +HAKAdan_room_21 +HAKAdan_room_22 +HAKAdanCH_scene +HAKAdanCH_room_0 +HAKAdanCH_room_1 +HAKAdanCH_room_2 +HAKAdanCH_room_3 +HAKAdanCH_room_4 +HAKAdanCH_room_5 +HAKAdanCH_room_6 +ice_doukutu_scene +ice_doukutu_room_0 +ice_doukutu_room_1 +ice_doukutu_room_2 +ice_doukutu_room_3 +ice_doukutu_room_4 +ice_doukutu_room_5 +ice_doukutu_room_6 +ice_doukutu_room_7 +ice_doukutu_room_8 +ice_doukutu_room_9 +ice_doukutu_room_10 +ice_doukutu_room_11 +men_scene +men_room_0 +men_room_1 +men_room_2 +men_room_3 +men_room_4 +men_room_5 +men_room_6 +men_room_7 +men_room_8 +men_room_9 +men_room_10 +ganontika_scene +ganontika_room_0 +ganontika_room_1 +ganontika_room_2 +ganontika_room_3 +ganontika_room_4 +ganontika_room_5 +ganontika_room_6 +ganontika_room_7 +ganontika_room_8 +ganontika_room_9 +ganontika_room_10 +ganontika_room_11 +ganontika_room_12 +ganontika_room_13 +ganontika_room_14 +ganontika_room_15 +ganontika_room_16 +ganontika_room_17 +ganontika_room_18 +ganontika_room_19 +spot00_scene +spot00_room_0 +spot01_scene +spot01_room_0 +spot02_scene +spot02_room_0 +spot02_room_1 +spot03_scene +spot03_room_0 +spot03_room_1 +spot04_scene +spot04_room_0 +spot04_room_1 +spot04_room_2 +spot05_scene +spot05_room_0 +spot06_scene +spot06_room_0 +spot07_scene +spot07_room_0 +spot07_room_1 +spot08_scene +spot08_room_0 +spot09_scene +spot09_room_0 +spot10_scene +spot10_room_0 +spot10_room_1 +spot10_room_2 +spot10_room_3 +spot10_room_4 +spot10_room_5 +spot10_room_6 +spot10_room_7 +spot10_room_8 +spot10_room_9 +spot11_scene +spot11_room_0 +spot12_scene +spot12_room_0 +spot12_room_1 +spot13_scene +spot13_room_0 +spot13_room_1 +spot15_scene +spot15_room_0 +spot16_scene +spot16_room_0 +spot17_scene +spot17_room_0 +spot17_room_1 +spot18_scene +spot18_room_0 +spot18_room_1 +spot18_room_2 +spot18_room_3 +market_day_scene +market_day_room_0 +market_night_scene +market_night_room_0 +kenjyanoma_scene +kenjyanoma_room_0 +tokinoma_scene +tokinoma_room_0 +tokinoma_room_1 +link_home_scene +link_home_room_0 +kokiri_shop_scene +kokiri_shop_room_0 +kokiri_home_scene +kokiri_home_room_0 +kakusiana_scene +kakusiana_room_0 +kakusiana_room_1 +kakusiana_room_2 +kakusiana_room_3 +kakusiana_room_4 +kakusiana_room_5 +kakusiana_room_6 +kakusiana_room_7 +kakusiana_room_8 +kakusiana_room_9 +kakusiana_room_10 +kakusiana_room_11 +kakusiana_room_12 +kakusiana_room_13 +entra_scene +entra_room_0 +moribossroom_scene +moribossroom_room_0 +moribossroom_room_1 +syatekijyou_scene +syatekijyou_room_0 +shop1_scene +shop1_room_0 +hairal_niwa_scene +hairal_niwa_room_0 +ganon_tou_scene +ganon_tou_room_0 +market_alley_scene +market_alley_room_0 +spot20_scene +spot20_room_0 +market_ruins_scene +market_ruins_room_0 +entra_n_scene +entra_n_room_0 +enrui_scene +enrui_room_0 +market_alley_n_scene +market_alley_n_room_0 +hiral_demo_scene +hiral_demo_room_0 +kokiri_home3_scene +kokiri_home3_room_0 +malon_stable_scene +malon_stable_room_0 +kakariko_scene +kakariko_room_0 +bdan_boss_scene +bdan_boss_room_0 +bdan_boss_room_1 +FIRE_bs_scene +FIRE_bs_room_0 +FIRE_bs_room_1 +hut_scene +hut_room_0 +daiyousei_izumi_scene +daiyousei_izumi_room_0 +hakaana_scene +hakaana_room_0 +yousei_izumi_tate_scene +yousei_izumi_tate_room_0 +yousei_izumi_yoko_scene +yousei_izumi_yoko_room_0 +golon_scene +golon_room_0 +zoora_scene +zoora_room_0 +drag_scene +drag_room_0 +alley_shop_scene +alley_shop_room_0 +night_shop_scene +night_shop_room_0 +impa_scene +impa_room_0 +labo_scene +labo_room_0 +tent_scene +tent_room_0 +nakaniwa_scene +nakaniwa_room_0 +ddan_boss_scene +ddan_boss_room_0 +ddan_boss_room_1 +ydan_boss_scene +ydan_boss_room_0 +ydan_boss_room_1 +HAKAdan_bs_scene +HAKAdan_bs_room_0 +HAKAdan_bs_room_1 +MIZUsin_bs_scene +MIZUsin_bs_room_0 +MIZUsin_bs_room_1 +ganon_scene +ganon_room_0 +ganon_room_1 +ganon_room_2 +ganon_room_3 +ganon_room_4 +ganon_room_5 +ganon_room_6 +ganon_room_7 +ganon_room_8 +ganon_room_9 +ganon_boss_scene +ganon_boss_room_0 +jyasinboss_scene +jyasinboss_room_0 +jyasinboss_room_1 +jyasinboss_room_2 +jyasinboss_room_3 +kokiri_home4_scene +kokiri_home4_room_0 +kokiri_home5_scene +kokiri_home5_room_0 +ganon_final_scene +ganon_final_room_0 +kakariko3_scene +kakariko3_room_0 +hakasitarelay_scene +hakasitarelay_room_0 +hakasitarelay_room_1 +hakasitarelay_room_2 +hakasitarelay_room_3 +hakasitarelay_room_4 +hakasitarelay_room_5 +hakasitarelay_room_6 +shrine_scene +shrine_room_0 +turibori_scene +turibori_room_0 +shrine_n_scene +shrine_n_room_0 +shrine_r_scene +shrine_r_room_0 +hakaana2_scene +hakaana2_room_0 +gerudoway_scene +gerudoway_room_0 +gerudoway_room_1 +gerudoway_room_2 +gerudoway_room_3 +gerudoway_room_4 +gerudoway_room_5 +hairal_niwa_n_scene +hairal_niwa_n_room_0 +bowling_scene +bowling_room_0 +hakaana_ouke_scene +hakaana_ouke_room_0 +hakaana_ouke_room_1 +hakaana_ouke_room_2 +hylia_labo_scene +hylia_labo_room_0 +souko_scene +souko_room_0 +souko_room_1 +souko_room_2 +miharigoya_scene +miharigoya_room_0 +mahouya_scene +mahouya_room_0 +takaraya_scene +takaraya_room_0 +takaraya_room_1 +takaraya_room_2 +takaraya_room_3 +takaraya_room_4 +takaraya_room_5 +takaraya_room_6 +ganon_sonogo_scene +ganon_sonogo_room_0 +ganon_sonogo_room_1 +ganon_sonogo_room_2 +ganon_sonogo_room_3 +ganon_sonogo_room_4 +ganon_demo_scene +ganon_demo_room_0 +face_shop_scene +face_shop_room_0 +kinsuta_scene +kinsuta_room_0 +ganontikasonogo_scene +ganontikasonogo_room_0 +ganontikasonogo_room_1 +bump_texture_static +anime_model_1_static +anime_model_2_static +anime_model_3_static +anime_model_4_static +anime_model_5_static +anime_model_6_static +anime_texture_1_static +anime_texture_2_static +anime_texture_3_static +anime_texture_4_static +anime_texture_5_static +anime_texture_6_static +softsprite_matrix_static \ No newline at end of file diff --git a/OTRExporter/CFG/filelists/gamecube_pal.txt b/OTRExporter/CFG/filelists/gamecube_pal.txt new file mode 100644 index 000000000..c9746c1da --- /dev/null +++ b/OTRExporter/CFG/filelists/gamecube_pal.txt @@ -0,0 +1,1510 @@ +makerom +boot +dmadata +Audiobank +Audioseq +Audiotable +link_animetion +icon_item_static +icon_item_24_static +icon_item_field_static +icon_item_dungeon_static +icon_item_gameover_static +icon_item_nes_static +icon_item_ger_static +icon_item_fra_static +item_name_static +map_name_static +do_action_static +message_static +message_texture_static +nes_font_static +nes_message_data_static +ger_message_data_static +fra_message_data_static +staff_message_data_static +map_grand_static +map_48x85_static +map_i_static +code +ovl_title +ovl_select +ovl_opening +ovl_file_choose +ovl_kaleido_scope +ovl_player_actor +ovl_map_mark_data +ovl_En_Test +ovl_Arms_Hook +ovl_Arrow_Fire +ovl_Arrow_Ice +ovl_Arrow_Light +ovl_Bg_Bdan_Objects +ovl_Bg_Bdan_Switch +ovl_Bg_Bom_Guard +ovl_Bg_Bombwall +ovl_Bg_Bowl_Wall +ovl_Bg_Breakwall +ovl_Bg_Ddan_Jd +ovl_Bg_Ddan_Kd +ovl_Bg_Dodoago +ovl_Bg_Dy_Yoseizo +ovl_Bg_Ganon_Otyuka +ovl_Bg_Gate_Shutter +ovl_Bg_Gjyo_Bridge +ovl_Bg_Gnd_Darkmeiro +ovl_Bg_Gnd_Firemeiro +ovl_Bg_Gnd_Iceblock +ovl_Bg_Gnd_Nisekabe +ovl_Bg_Gnd_Soulmeiro +ovl_Bg_Haka +ovl_Bg_Haka_Gate +ovl_Bg_Haka_Huta +ovl_Bg_Haka_Megane +ovl_Bg_Haka_MeganeBG +ovl_Bg_Haka_Sgami +ovl_Bg_Haka_Ship +ovl_Bg_Haka_Trap +ovl_Bg_Haka_Tubo +ovl_Bg_Haka_Water +ovl_Bg_Haka_Zou +ovl_Bg_Heavy_Block +ovl_Bg_Hidan_Curtain +ovl_Bg_Hidan_Dalm +ovl_Bg_Hidan_Firewall +ovl_Bg_Hidan_Fslift +ovl_Bg_Hidan_Fwbig +ovl_Bg_Hidan_Hamstep +ovl_Bg_Hidan_Hrock +ovl_Bg_Hidan_Kousi +ovl_Bg_Hidan_Kowarerukabe +ovl_Bg_Hidan_Rock +ovl_Bg_Hidan_Rsekizou +ovl_Bg_Hidan_Sekizou +ovl_Bg_Hidan_Sima +ovl_Bg_Hidan_Syoku +ovl_Bg_Ice_Objects +ovl_Bg_Ice_Shelter +ovl_Bg_Ice_Shutter +ovl_Bg_Ice_Turara +ovl_Bg_Ingate +ovl_Bg_Jya_1flift +ovl_Bg_Jya_Amishutter +ovl_Bg_Jya_Bigmirror +ovl_Bg_Jya_Block +ovl_Bg_Jya_Bombchuiwa +ovl_Bg_Jya_Bombiwa +ovl_Bg_Jya_Cobra +ovl_Bg_Jya_Goroiwa +ovl_Bg_Jya_Haheniron +ovl_Bg_Jya_Ironobj +ovl_Bg_Jya_Kanaami +ovl_Bg_Jya_Lift +ovl_Bg_Jya_Megami +ovl_Bg_Jya_Zurerukabe +ovl_Bg_Menkuri_Eye +ovl_Bg_Menkuri_Kaiten +ovl_Bg_Menkuri_Nisekabe +ovl_Bg_Mizu_Bwall +ovl_Bg_Mizu_Movebg +ovl_Bg_Mizu_Shutter +ovl_Bg_Mizu_Uzu +ovl_Bg_Mizu_Water +ovl_Bg_Mjin +ovl_Bg_Mori_Bigst +ovl_Bg_Mori_Elevator +ovl_Bg_Mori_Hashigo +ovl_Bg_Mori_Hashira4 +ovl_Bg_Mori_Hineri +ovl_Bg_Mori_Idomizu +ovl_Bg_Mori_Kaitenkabe +ovl_Bg_Mori_Rakkatenjo +ovl_Bg_Po_Event +ovl_Bg_Po_Syokudai +ovl_Bg_Pushbox +ovl_Bg_Relay_Objects +ovl_Bg_Spot00_Break +ovl_Bg_Spot00_Hanebasi +ovl_Bg_Spot01_Fusya +ovl_Bg_Spot01_Idohashira +ovl_Bg_Spot01_Idomizu +ovl_Bg_Spot01_Idosoko +ovl_Bg_Spot01_Objects2 +ovl_Bg_Spot02_Objects +ovl_Bg_Spot03_Taki +ovl_Bg_Spot05_Soko +ovl_Bg_Spot06_Objects +ovl_Bg_Spot07_Taki +ovl_Bg_Spot08_Bakudankabe +ovl_Bg_Spot08_Iceblock +ovl_Bg_Spot09_Obj +ovl_Bg_Spot11_Bakudankabe +ovl_Bg_Spot11_Oasis +ovl_Bg_Spot12_Gate +ovl_Bg_Spot12_Saku +ovl_Bg_Spot15_Rrbox +ovl_Bg_Spot15_Saku +ovl_Bg_Spot16_Bombstone +ovl_Bg_Spot16_Doughnut +ovl_Bg_Spot17_Bakudankabe +ovl_Bg_Spot17_Funen +ovl_Bg_Spot18_Basket +ovl_Bg_Spot18_Futa +ovl_Bg_Spot18_Obj +ovl_Bg_Spot18_Shutter +ovl_Bg_Sst_Floor +ovl_Bg_Toki_Hikari +ovl_Bg_Toki_Swd +ovl_Bg_Treemouth +ovl_Bg_Umajump +ovl_Bg_Vb_Sima +ovl_Bg_Ydan_Hasi +ovl_Bg_Ydan_Maruta +ovl_Bg_Ydan_Sp +ovl_Bg_Zg +ovl_Boss_Dodongo +ovl_Boss_Fd +ovl_Boss_Fd2 +ovl_Boss_Ganon +ovl_Boss_Ganon2 +ovl_Boss_Ganondrof +ovl_Boss_Goma +ovl_Boss_Mo +ovl_Boss_Sst +ovl_Boss_Tw +ovl_Boss_Va +ovl_Demo_6K +ovl_Demo_Du +ovl_Demo_Ec +ovl_Demo_Effect +ovl_Demo_Ext +ovl_Demo_Geff +ovl_Demo_Gj +ovl_Demo_Go +ovl_Demo_Gt +ovl_Demo_Ik +ovl_Demo_Im +ovl_Demo_Kankyo +ovl_Demo_Kekkai +ovl_Demo_Sa +ovl_Demo_Shd +ovl_Demo_Tre_Lgt +ovl_Door_Ana +ovl_Door_Gerudo +ovl_Door_Killer +ovl_Door_Shutter +ovl_Door_Toki +ovl_Door_Warp1 +ovl_Efc_Erupc +ovl_Eff_Dust +ovl_Effect_Ss_Blast +ovl_Effect_Ss_Bomb +ovl_Effect_Ss_Bomb2 +ovl_Effect_Ss_Bubble +ovl_Effect_Ss_D_Fire +ovl_Effect_Ss_Dead_Db +ovl_Effect_Ss_Dead_Dd +ovl_Effect_Ss_Dead_Ds +ovl_Effect_Ss_Dead_Sound +ovl_Effect_Ss_Dt_Bubble +ovl_Effect_Ss_Dust +ovl_Effect_Ss_En_Fire +ovl_Effect_Ss_En_Ice +ovl_Effect_Ss_Extra +ovl_Effect_Ss_Fcircle +ovl_Effect_Ss_Fhg_Flash +ovl_Effect_Ss_Fire_Tail +ovl_Effect_Ss_G_Fire +ovl_Effect_Ss_G_Magma +ovl_Effect_Ss_G_Magma2 +ovl_Effect_Ss_G_Ripple +ovl_Effect_Ss_G_Spk +ovl_Effect_Ss_G_Splash +ovl_Effect_Ss_Hahen +ovl_Effect_Ss_HitMark +ovl_Effect_Ss_Ice_Piece +ovl_Effect_Ss_Ice_Smoke +ovl_Effect_Ss_K_Fire +ovl_Effect_Ss_Kakera +ovl_Effect_Ss_KiraKira +ovl_Effect_Ss_Lightning +ovl_Effect_Ss_Sibuki +ovl_Effect_Ss_Sibuki2 +ovl_Effect_Ss_Solder_Srch_Ball +ovl_Effect_Ss_Stick +ovl_Effect_Ss_Stone1 +ovl_Elf_Msg +ovl_Elf_Msg2 +ovl_En_Am +ovl_En_Ani +ovl_En_Anubice +ovl_En_Anubice_Fire +ovl_En_Anubice_Tag +ovl_En_Arow_Trap +ovl_En_Arrow +ovl_En_Attack_Niw +ovl_En_Ba +ovl_En_Bb +ovl_En_Bdfire +ovl_En_Bigokuta +ovl_En_Bili +ovl_En_Bird +ovl_En_Blkobj +ovl_En_Bom +ovl_En_Bom_Bowl_Man +ovl_En_Bom_Bowl_Pit +ovl_En_Bom_Chu +ovl_En_Bombf +ovl_En_Boom +ovl_En_Box +ovl_En_Brob +ovl_En_Bubble +ovl_En_Butte +ovl_En_Bw +ovl_En_Bx +ovl_En_Changer +ovl_En_Clear_Tag +ovl_En_Cow +ovl_En_Crow +ovl_En_Cs +ovl_En_Daiku +ovl_En_Daiku_Kakariko +ovl_En_Dekubaba +ovl_En_Dekunuts +ovl_En_Dh +ovl_En_Dha +ovl_En_Diving_Game +ovl_En_Dns +ovl_En_Dnt_Demo +ovl_En_Dnt_Jiji +ovl_En_Dnt_Nomal +ovl_En_Dodojr +ovl_En_Dodongo +ovl_En_Dog +ovl_En_Door +ovl_En_Ds +ovl_En_Du +ovl_En_Dy_Extra +ovl_En_Eg +ovl_En_Eiyer +ovl_En_Elf +ovl_En_Encount1 +ovl_En_Encount2 +ovl_En_Ex_Item +ovl_En_Ex_Ruppy +ovl_En_Fd +ovl_En_Fd_Fire +ovl_En_Fhg_Fire +ovl_En_Fire_Rock +ovl_En_Firefly +ovl_En_Fish +ovl_En_Floormas +ovl_En_Fr +ovl_En_Fu +ovl_En_Fw +ovl_En_Fz +ovl_En_G_Switch +ovl_En_Ganon_Mant +ovl_En_Ganon_Organ +ovl_En_Gb +ovl_En_Ge1 +ovl_En_Ge2 +ovl_En_Ge3 +ovl_En_GeldB +ovl_En_GirlA +ovl_En_Gm +ovl_En_Go +ovl_En_Go2 +ovl_En_Goma +ovl_En_Goroiwa +ovl_En_Gs +ovl_En_Guest +ovl_En_Hata +ovl_En_Heishi1 +ovl_En_Heishi2 +ovl_En_Heishi3 +ovl_En_Heishi4 +ovl_En_Hintnuts +ovl_En_Holl +ovl_En_Honotrap +ovl_En_Horse +ovl_En_Horse_Game_Check +ovl_En_Horse_Ganon +ovl_En_Horse_Link_Child +ovl_En_Horse_Normal +ovl_En_Horse_Zelda +ovl_En_Hs +ovl_En_Hs2 +ovl_En_Hy +ovl_En_Ice_Hono +ovl_En_Ik +ovl_En_In +ovl_En_Insect +ovl_En_Ishi +ovl_En_It +ovl_En_Jj +ovl_En_Js +ovl_En_Jsjutan +ovl_En_Kakasi +ovl_En_Kakasi2 +ovl_En_Kakasi3 +ovl_En_Kanban +ovl_En_Karebaba +ovl_En_Ko +ovl_En_Kusa +ovl_En_Kz +ovl_En_Light +ovl_En_Lightbox +ovl_En_M_Fire1 +ovl_En_M_Thunder +ovl_En_Ma1 +ovl_En_Ma2 +ovl_En_Ma3 +ovl_En_Mag +ovl_En_Mb +ovl_En_Md +ovl_En_Mk +ovl_En_Mm +ovl_En_Mm2 +ovl_En_Ms +ovl_En_Mu +ovl_En_Nb +ovl_En_Niw +ovl_En_Niw_Girl +ovl_En_Niw_Lady +ovl_En_Nutsball +ovl_En_Nwc +ovl_En_Ny +ovl_En_OE2 +ovl_En_Okarina_Effect +ovl_En_Okarina_Tag +ovl_En_Okuta +ovl_En_Ossan +ovl_En_Owl +ovl_En_Part +ovl_En_Peehat +ovl_En_Po_Desert +ovl_En_Po_Field +ovl_En_Po_Relay +ovl_En_Po_Sisters +ovl_En_Poh +ovl_En_Pu_box +ovl_En_Rd +ovl_En_Reeba +ovl_En_River_Sound +ovl_En_Rl +ovl_En_Rr +ovl_En_Ru1 +ovl_En_Ru2 +ovl_En_Sa +ovl_En_Sb +ovl_En_Scene_Change +ovl_En_Sda +ovl_En_Shopnuts +ovl_En_Si +ovl_En_Siofuki +ovl_En_Skb +ovl_En_Skj +ovl_En_Skjneedle +ovl_En_Ssh +ovl_En_St +ovl_En_Sth +ovl_En_Stream +ovl_En_Sw +ovl_En_Syateki_Itm +ovl_En_Syateki_Man +ovl_En_Syateki_Niw +ovl_En_Ta +ovl_En_Takara_Man +ovl_En_Tana +ovl_En_Tg +ovl_En_Tite +ovl_En_Tk +ovl_En_Torch +ovl_En_Torch2 +ovl_En_Toryo +ovl_En_Tp +ovl_En_Tr +ovl_En_Trap +ovl_En_Tubo_Trap +ovl_En_Vali +ovl_En_Vase +ovl_En_Vb_Ball +ovl_En_Viewer +ovl_En_Vm +ovl_En_Wall_Tubo +ovl_En_Wallmas +ovl_En_Weather_Tag +ovl_En_Weiyer +ovl_En_Wf +ovl_En_Wonder_Item +ovl_En_Wonder_Talk +ovl_En_Wonder_Talk2 +ovl_En_Wood02 +ovl_En_Xc +ovl_En_Yabusame_Mark +ovl_En_Yukabyun +ovl_En_Zf +ovl_En_Zl1 +ovl_En_Zl2 +ovl_En_Zl3 +ovl_En_Zl4 +ovl_En_Zo +ovl_En_fHG +ovl_End_Title +ovl_Fishing +ovl_Item_B_Heart +ovl_Item_Etcetera +ovl_Item_Inbox +ovl_Item_Ocarina +ovl_Item_Shield +ovl_Magic_Dark +ovl_Magic_Fire +ovl_Magic_Wind +ovl_Mir_Ray +ovl_Obj_Bean +ovl_Obj_Blockstop +ovl_Obj_Bombiwa +ovl_Obj_Comb +ovl_Obj_Dekujr +ovl_Obj_Elevator +ovl_Obj_Hamishi +ovl_Obj_Hana +ovl_Obj_Hsblock +ovl_Obj_Ice_Poly +ovl_Obj_Kibako +ovl_Obj_Kibako2 +ovl_Obj_Lift +ovl_Obj_Lightswitch +ovl_Obj_Makekinsuta +ovl_Obj_Makeoshihiki +ovl_Obj_Mure +ovl_Obj_Mure2 +ovl_Obj_Mure3 +ovl_Obj_Oshihiki +ovl_Obj_Roomtimer +ovl_Obj_Switch +ovl_Obj_Syokudai +ovl_Obj_Timeblock +ovl_Obj_Tsubo +ovl_Obj_Warp2block +ovl_Object_Kankyo +ovl_Oceff_Spot +ovl_Oceff_Storm +ovl_Oceff_Wipe +ovl_Oceff_Wipe2 +ovl_Oceff_Wipe3 +ovl_Oceff_Wipe4 +ovl_Shot_Sun +gameplay_keep +gameplay_field_keep +gameplay_dangeon_keep +gameplay_object_exchange_static +object_link_boy +object_link_child +object_box +object_human +object_okuta +object_poh +object_wallmaster +object_dy_obj +object_firefly +object_dodongo +object_fire +object_niw +object_tite +object_reeba +object_peehat +object_kingdodongo +object_horse +object_zf +object_goma +object_zl1 +object_gol +object_bubble +object_dodojr +object_torch2 +object_bl +object_tp +object_oA1 +object_st +object_bw +object_ei +object_horse_normal +object_oB1 +object_o_anime +object_spot04_objects +object_ddan_objects +object_hidan_objects +object_horse_ganon +object_oA2 +object_spot00_objects +object_mb +object_bombf +object_sk2 +object_oE1 +object_oE_anime +object_oE2 +object_ydan_objects +object_gnd +object_am +object_dekubaba +object_oA3 +object_oA4 +object_oA5 +object_oA6 +object_oA7 +object_jj +object_oA8 +object_oA9 +object_oB2 +object_oB3 +object_oB4 +object_horse_zelda +object_opening_demo1 +object_warp1 +object_b_heart +object_dekunuts +object_oE3 +object_oE4 +object_menkuri_objects +object_oE5 +object_oE6 +object_oE7 +object_oE8 +object_oE9 +object_oE10 +object_oE11 +object_oE12 +object_vali +object_oA10 +object_oA11 +object_mizu_objects +object_fhg +object_ossan +object_mori_hineri1 +object_Bb +object_toki_objects +object_yukabyun +object_zl2 +object_mjin +object_mjin_flash +object_mjin_dark +object_mjin_flame +object_mjin_ice +object_mjin_soul +object_mjin_wind +object_mjin_oka +object_haka_objects +object_spot06_objects +object_ice_objects +object_relay_objects +object_mori_hineri1a +object_mori_hineri2 +object_mori_hineri2a +object_mori_objects +object_mori_tex +object_spot08_obj +object_warp2 +object_hata +object_bird +object_wood02 +object_lightbox +object_pu_box +object_trap +object_vase +object_im +object_ta +object_tk +object_xc +object_vm +object_bv +object_hakach_objects +object_efc_crystal_light +object_efc_fire_ball +object_efc_flash +object_efc_lgt_shower +object_efc_star_field +object_god_lgt +object_light_ring +object_triforce_spot +object_medal +object_bdan_objects +object_sd +object_rd +object_po_sisters +object_heavy_object +object_gndd +object_fd +object_du +object_fw +object_horse_link_child +object_spot02_objects +object_haka +object_ru1 +object_syokudai +object_fd2 +object_dh +object_rl +object_efc_tw +object_demo_tre_lgt +object_gi_key +object_mir_ray +object_brob +object_gi_jewel +object_spot09_obj +object_spot18_obj +object_bdoor +object_spot17_obj +object_shop_dungen +object_nb +object_mo +object_sb +object_gi_melody +object_gi_heart +object_gi_compass +object_gi_bosskey +object_gi_medal +object_gi_nuts +object_sa +object_gi_hearts +object_gi_arrowcase +object_gi_bombpouch +object_in +object_tr +object_spot16_obj +object_oE1s +object_oE4s +object_os_anime +object_gi_bottle +object_gi_stick +object_gi_map +object_oF1d_map +object_ru2 +object_gi_shield_1 +object_dekujr +object_gi_magicpot +object_gi_bomb_1 +object_oF1s +object_ma2 +object_gi_purse +object_hni +object_tw +object_rr +object_bxa +object_anubice +object_gi_gerudo +object_gi_arrow +object_gi_bomb_2 +object_gi_egg +object_gi_scale +object_gi_shield_2 +object_gi_hookshot +object_gi_ocarina +object_gi_milk +object_ma1 +object_ganon +object_sst +object_ny +object_fr +object_gi_pachinko +object_gi_boomerang +object_gi_bow +object_gi_glasses +object_gi_liquid +object_ani +object_demo_6k +object_gi_shield_3 +object_gi_letter +object_spot15_obj +object_jya_obj +object_gi_clothes +object_gi_bean +object_gi_fish +object_gi_saw +object_gi_hammer +object_gi_grass +object_gi_longsword +object_spot01_objects +object_md +object_km1 +object_kw1 +object_zo +object_kz +object_umajump +object_masterkokiri +object_masterkokirihead +object_mastergolon +object_masterzoora +object_aob +object_ik +object_ahg +object_cne +object_gi_niwatori +object_skj +object_gi_bottle_letter +object_bji +object_bba +object_gi_ocarina_0 +object_ds +object_ane +object_boj +object_spot03_object +object_spot07_object +object_fz +object_bob +object_ge1 +object_yabusame_point +object_gi_boots_2 +object_gi_seed +object_gnd_magic +object_d_elevator +object_d_hsblock +object_d_lift +object_mamenoki +object_goroiwa +object_toryo +object_daiku +object_nwc +object_blkobj +object_gm +object_ms +object_hs +object_ingate +object_lightswitch +object_kusa +object_tsubo +object_gi_gloves +object_gi_coin +object_kanban +object_gjyo_objects +object_owl +object_mk +object_fu +object_gi_ki_tan_mask +object_gi_redead_mask +object_gi_skj_mask +object_gi_rabit_mask +object_gi_truth_mask +object_ganon_objects +object_siofuki +object_stream +object_mm +object_fa +object_os +object_gi_eye_lotion +object_gi_powder +object_gi_mushroom +object_gi_ticketstone +object_gi_brokensword +object_js +object_cs +object_gi_prescription +object_gi_bracelet +object_gi_soldout +object_gi_frog +object_mag +object_door_gerudo +object_gt +object_efc_erupc +object_zl2_anime1 +object_zl2_anime2 +object_gi_golonmask +object_gi_zoramask +object_gi_gerudomask +object_ganon2 +object_ka +object_ts +object_zg +object_gi_hoverboots +object_gi_m_arrow +object_ds2 +object_ec +object_fish +object_gi_sutaru +object_gi_goddess +object_ssh +object_bigokuta +object_bg +object_spot05_objects +object_spot12_obj +object_bombiwa +object_hintnuts +object_rs +object_spot00_break +object_gla +object_shopnuts +object_geldb +object_gr +object_dog +object_jya_iron +object_jya_door +object_spot01_objects2 +object_spot11_obj +object_kibako2 +object_dns +object_dnk +object_gi_fire +object_gi_insect +object_gi_butterfly +object_gi_ghost +object_gi_soul +object_bowl +object_po_field +object_demo_kekkai +object_efc_doughnut +object_gi_dekupouch +object_ganon_anime1 +object_ganon_anime2 +object_ganon_anime3 +object_gi_rupy +object_spot01_matoya +object_spot01_matoyab +object_po_composer +object_mu +object_wf +object_skb +object_gj +object_geff +object_haka_door +object_gs +object_ps +object_bwall +object_crow +object_cow +object_cob +object_gi_sword_1 +object_door_killer +object_ouke_haka +object_timeblock +object_zl4 +g_pn_01 +g_pn_02 +g_pn_03 +g_pn_04 +g_pn_05 +g_pn_06 +g_pn_07 +g_pn_08 +g_pn_09 +g_pn_10 +g_pn_11 +g_pn_12 +g_pn_13 +g_pn_14 +g_pn_15 +g_pn_16 +g_pn_17 +g_pn_18 +g_pn_19 +g_pn_20 +g_pn_21 +g_pn_22 +g_pn_23 +g_pn_24 +g_pn_25 +g_pn_26 +g_pn_27 +g_pn_28 +g_pn_29 +g_pn_30 +g_pn_31 +g_pn_32 +g_pn_33 +g_pn_34 +g_pn_35 +g_pn_36 +g_pn_37 +g_pn_38 +g_pn_39 +g_pn_40 +g_pn_41 +g_pn_42 +g_pn_43 +g_pn_44 +g_pn_45 +g_pn_46 +g_pn_47 +g_pn_48 +g_pn_49 +g_pn_50 +g_pn_51 +g_pn_52 +g_pn_53 +g_pn_54 +g_pn_55 +g_pn_56 +g_pn_57 +z_select_static +nintendo_rogo_static +title_static +parameter_static +vr_fine0_static +vr_fine0_pal_static +vr_fine1_static +vr_fine1_pal_static +vr_fine2_static +vr_fine2_pal_static +vr_fine3_static +vr_fine3_pal_static +vr_cloud0_static +vr_cloud0_pal_static +vr_cloud1_static +vr_cloud1_pal_static +vr_cloud2_static +vr_cloud2_pal_static +vr_cloud3_static +vr_cloud3_pal_static +vr_holy0_static +vr_holy0_pal_static +vr_holy1_static +vr_holy1_pal_static +vr_MDVR_static +vr_MDVR_pal_static +vr_MNVR_static +vr_MNVR_pal_static +vr_RUVR_static +vr_RUVR_pal_static +vr_LHVR_static +vr_LHVR_pal_static +vr_KHVR_static +vr_KHVR_pal_static +vr_K3VR_static +vr_K3VR_pal_static +vr_K4VR_static +vr_K4VR_pal_static +vr_K5VR_static +vr_K5VR_pal_static +vr_SP1a_static +vr_SP1a_pal_static +vr_MLVR_static +vr_MLVR_pal_static +vr_KKRVR_static +vr_KKRVR_pal_static +vr_KR3VR_static +vr_KR3VR_pal_static +vr_IPVR_static +vr_IPVR_pal_static +vr_KSVR_static +vr_KSVR_pal_static +vr_GLVR_static +vr_GLVR_pal_static +vr_ZRVR_static +vr_ZRVR_pal_static +vr_DGVR_static +vr_DGVR_pal_static +vr_ALVR_static +vr_ALVR_pal_static +vr_NSVR_static +vr_NSVR_pal_static +vr_LBVR_static +vr_LBVR_pal_static +vr_TTVR_static +vr_TTVR_pal_static +vr_FCVR_static +vr_FCVR_pal_static +elf_message_field +elf_message_ydan +ydan_scene +ydan_room_0 +ydan_room_1 +ydan_room_2 +ydan_room_3 +ydan_room_4 +ydan_room_5 +ydan_room_6 +ydan_room_7 +ydan_room_8 +ydan_room_9 +ydan_room_10 +ydan_room_11 +ddan_scene +ddan_room_0 +ddan_room_1 +ddan_room_2 +ddan_room_3 +ddan_room_4 +ddan_room_5 +ddan_room_6 +ddan_room_7 +ddan_room_8 +ddan_room_9 +ddan_room_10 +ddan_room_11 +ddan_room_12 +ddan_room_13 +ddan_room_14 +ddan_room_15 +ddan_room_16 +bdan_scene +bdan_room_0 +bdan_room_1 +bdan_room_2 +bdan_room_3 +bdan_room_4 +bdan_room_5 +bdan_room_6 +bdan_room_7 +bdan_room_8 +bdan_room_9 +bdan_room_10 +bdan_room_11 +bdan_room_12 +bdan_room_13 +bdan_room_14 +bdan_room_15 +Bmori1_scene +Bmori1_room_0 +Bmori1_room_1 +Bmori1_room_2 +Bmori1_room_3 +Bmori1_room_4 +Bmori1_room_5 +Bmori1_room_6 +Bmori1_room_7 +Bmori1_room_8 +Bmori1_room_9 +Bmori1_room_10 +Bmori1_room_11 +Bmori1_room_12 +Bmori1_room_13 +Bmori1_room_14 +Bmori1_room_15 +Bmori1_room_16 +Bmori1_room_17 +Bmori1_room_18 +Bmori1_room_19 +Bmori1_room_20 +Bmori1_room_21 +Bmori1_room_22 +HIDAN_scene +HIDAN_room_0 +HIDAN_room_1 +HIDAN_room_2 +HIDAN_room_3 +HIDAN_room_4 +HIDAN_room_5 +HIDAN_room_6 +HIDAN_room_7 +HIDAN_room_8 +HIDAN_room_9 +HIDAN_room_10 +HIDAN_room_11 +HIDAN_room_12 +HIDAN_room_13 +HIDAN_room_14 +HIDAN_room_15 +HIDAN_room_16 +HIDAN_room_17 +HIDAN_room_18 +HIDAN_room_19 +HIDAN_room_20 +HIDAN_room_21 +HIDAN_room_22 +HIDAN_room_23 +HIDAN_room_24 +HIDAN_room_25 +HIDAN_room_26 +MIZUsin_scene +MIZUsin_room_0 +MIZUsin_room_1 +MIZUsin_room_2 +MIZUsin_room_3 +MIZUsin_room_4 +MIZUsin_room_5 +MIZUsin_room_6 +MIZUsin_room_7 +MIZUsin_room_8 +MIZUsin_room_9 +MIZUsin_room_10 +MIZUsin_room_11 +MIZUsin_room_12 +MIZUsin_room_13 +MIZUsin_room_14 +MIZUsin_room_15 +MIZUsin_room_16 +MIZUsin_room_17 +MIZUsin_room_18 +MIZUsin_room_19 +MIZUsin_room_20 +MIZUsin_room_21 +MIZUsin_room_22 +jyasinzou_scene +jyasinzou_room_0 +jyasinzou_room_1 +jyasinzou_room_2 +jyasinzou_room_3 +jyasinzou_room_4 +jyasinzou_room_5 +jyasinzou_room_6 +jyasinzou_room_7 +jyasinzou_room_8 +jyasinzou_room_9 +jyasinzou_room_10 +jyasinzou_room_11 +jyasinzou_room_12 +jyasinzou_room_13 +jyasinzou_room_14 +jyasinzou_room_15 +jyasinzou_room_16 +jyasinzou_room_17 +jyasinzou_room_18 +jyasinzou_room_19 +jyasinzou_room_20 +jyasinzou_room_21 +jyasinzou_room_22 +jyasinzou_room_23 +jyasinzou_room_24 +jyasinzou_room_25 +jyasinzou_room_26 +jyasinzou_room_27 +jyasinzou_room_28 +HAKAdan_scene +HAKAdan_room_0 +HAKAdan_room_1 +HAKAdan_room_2 +HAKAdan_room_3 +HAKAdan_room_4 +HAKAdan_room_5 +HAKAdan_room_6 +HAKAdan_room_7 +HAKAdan_room_8 +HAKAdan_room_9 +HAKAdan_room_10 +HAKAdan_room_11 +HAKAdan_room_12 +HAKAdan_room_13 +HAKAdan_room_14 +HAKAdan_room_15 +HAKAdan_room_16 +HAKAdan_room_17 +HAKAdan_room_18 +HAKAdan_room_19 +HAKAdan_room_20 +HAKAdan_room_21 +HAKAdan_room_22 +HAKAdanCH_scene +HAKAdanCH_room_0 +HAKAdanCH_room_1 +HAKAdanCH_room_2 +HAKAdanCH_room_3 +HAKAdanCH_room_4 +HAKAdanCH_room_5 +HAKAdanCH_room_6 +ice_doukutu_scene +ice_doukutu_room_0 +ice_doukutu_room_1 +ice_doukutu_room_2 +ice_doukutu_room_3 +ice_doukutu_room_4 +ice_doukutu_room_5 +ice_doukutu_room_6 +ice_doukutu_room_7 +ice_doukutu_room_8 +ice_doukutu_room_9 +ice_doukutu_room_10 +ice_doukutu_room_11 +men_scene +men_room_0 +men_room_1 +men_room_2 +men_room_3 +men_room_4 +men_room_5 +men_room_6 +men_room_7 +men_room_8 +men_room_9 +men_room_10 +ganontika_scene +ganontika_room_0 +ganontika_room_1 +ganontika_room_2 +ganontika_room_3 +ganontika_room_4 +ganontika_room_5 +ganontika_room_6 +ganontika_room_7 +ganontika_room_8 +ganontika_room_9 +ganontika_room_10 +ganontika_room_11 +ganontika_room_12 +ganontika_room_13 +ganontika_room_14 +ganontika_room_15 +ganontika_room_16 +ganontika_room_17 +ganontika_room_18 +ganontika_room_19 +spot00_scene +spot00_room_0 +spot01_scene +spot01_room_0 +spot02_scene +spot02_room_0 +spot02_room_1 +spot03_scene +spot03_room_0 +spot03_room_1 +spot04_scene +spot04_room_0 +spot04_room_1 +spot04_room_2 +spot05_scene +spot05_room_0 +spot06_scene +spot06_room_0 +spot07_scene +spot07_room_0 +spot07_room_1 +spot08_scene +spot08_room_0 +spot09_scene +spot09_room_0 +spot10_scene +spot10_room_0 +spot10_room_1 +spot10_room_2 +spot10_room_3 +spot10_room_4 +spot10_room_5 +spot10_room_6 +spot10_room_7 +spot10_room_8 +spot10_room_9 +spot11_scene +spot11_room_0 +spot12_scene +spot12_room_0 +spot12_room_1 +spot13_scene +spot13_room_0 +spot13_room_1 +spot15_scene +spot15_room_0 +spot16_scene +spot16_room_0 +spot17_scene +spot17_room_0 +spot17_room_1 +spot18_scene +spot18_room_0 +spot18_room_1 +spot18_room_2 +spot18_room_3 +market_day_scene +market_day_room_0 +market_night_scene +market_night_room_0 +kenjyanoma_scene +kenjyanoma_room_0 +tokinoma_scene +tokinoma_room_0 +tokinoma_room_1 +link_home_scene +link_home_room_0 +kokiri_shop_scene +kokiri_shop_room_0 +kokiri_home_scene +kokiri_home_room_0 +kakusiana_scene +kakusiana_room_0 +kakusiana_room_1 +kakusiana_room_2 +kakusiana_room_3 +kakusiana_room_4 +kakusiana_room_5 +kakusiana_room_6 +kakusiana_room_7 +kakusiana_room_8 +kakusiana_room_9 +kakusiana_room_10 +kakusiana_room_11 +kakusiana_room_12 +kakusiana_room_13 +entra_scene +entra_room_0 +moribossroom_scene +moribossroom_room_0 +moribossroom_room_1 +syatekijyou_scene +syatekijyou_room_0 +shop1_scene +shop1_room_0 +hairal_niwa_scene +hairal_niwa_room_0 +ganon_tou_scene +ganon_tou_room_0 +market_alley_scene +market_alley_room_0 +spot20_scene +spot20_room_0 +market_ruins_scene +market_ruins_room_0 +entra_n_scene +entra_n_room_0 +enrui_scene +enrui_room_0 +market_alley_n_scene +market_alley_n_room_0 +hiral_demo_scene +hiral_demo_room_0 +kokiri_home3_scene +kokiri_home3_room_0 +malon_stable_scene +malon_stable_room_0 +kakariko_scene +kakariko_room_0 +bdan_boss_scene +bdan_boss_room_0 +bdan_boss_room_1 +FIRE_bs_scene +FIRE_bs_room_0 +FIRE_bs_room_1 +hut_scene +hut_room_0 +daiyousei_izumi_scene +daiyousei_izumi_room_0 +hakaana_scene +hakaana_room_0 +yousei_izumi_tate_scene +yousei_izumi_tate_room_0 +yousei_izumi_yoko_scene +yousei_izumi_yoko_room_0 +golon_scene +golon_room_0 +zoora_scene +zoora_room_0 +drag_scene +drag_room_0 +alley_shop_scene +alley_shop_room_0 +night_shop_scene +night_shop_room_0 +impa_scene +impa_room_0 +labo_scene +labo_room_0 +tent_scene +tent_room_0 +nakaniwa_scene +nakaniwa_room_0 +ddan_boss_scene +ddan_boss_room_0 +ddan_boss_room_1 +ydan_boss_scene +ydan_boss_room_0 +ydan_boss_room_1 +HAKAdan_bs_scene +HAKAdan_bs_room_0 +HAKAdan_bs_room_1 +MIZUsin_bs_scene +MIZUsin_bs_room_0 +MIZUsin_bs_room_1 +ganon_scene +ganon_room_0 +ganon_room_1 +ganon_room_2 +ganon_room_3 +ganon_room_4 +ganon_room_5 +ganon_room_6 +ganon_room_7 +ganon_room_8 +ganon_room_9 +ganon_boss_scene +ganon_boss_room_0 +jyasinboss_scene +jyasinboss_room_0 +jyasinboss_room_1 +jyasinboss_room_2 +jyasinboss_room_3 +kokiri_home4_scene +kokiri_home4_room_0 +kokiri_home5_scene +kokiri_home5_room_0 +ganon_final_scene +ganon_final_room_0 +kakariko3_scene +kakariko3_room_0 +hakasitarelay_scene +hakasitarelay_room_0 +hakasitarelay_room_1 +hakasitarelay_room_2 +hakasitarelay_room_3 +hakasitarelay_room_4 +hakasitarelay_room_5 +hakasitarelay_room_6 +shrine_scene +shrine_room_0 +turibori_scene +turibori_room_0 +shrine_n_scene +shrine_n_room_0 +shrine_r_scene +shrine_r_room_0 +hakaana2_scene +hakaana2_room_0 +gerudoway_scene +gerudoway_room_0 +gerudoway_room_1 +gerudoway_room_2 +gerudoway_room_3 +gerudoway_room_4 +gerudoway_room_5 +hairal_niwa_n_scene +hairal_niwa_n_room_0 +bowling_scene +bowling_room_0 +hakaana_ouke_scene +hakaana_ouke_room_0 +hakaana_ouke_room_1 +hakaana_ouke_room_2 +hylia_labo_scene +hylia_labo_room_0 +souko_scene +souko_room_0 +souko_room_1 +souko_room_2 +miharigoya_scene +miharigoya_room_0 +mahouya_scene +mahouya_room_0 +takaraya_scene +takaraya_room_0 +takaraya_room_1 +takaraya_room_2 +takaraya_room_3 +takaraya_room_4 +takaraya_room_5 +takaraya_room_6 +ganon_sonogo_scene +ganon_sonogo_room_0 +ganon_sonogo_room_1 +ganon_sonogo_room_2 +ganon_sonogo_room_3 +ganon_sonogo_room_4 +ganon_demo_scene +ganon_demo_room_0 +face_shop_scene +face_shop_room_0 +kinsuta_scene +kinsuta_room_0 +ganontikasonogo_scene +ganontikasonogo_room_0 +ganontikasonogo_room_1 +bump_texture_static +anime_model_1_static +anime_model_2_static +anime_model_3_static +anime_model_4_static +anime_model_5_static +anime_model_6_static +anime_texture_1_static +anime_texture_2_static +anime_texture_3_static +anime_texture_4_static +anime_texture_5_static +anime_texture_6_static +softsprite_matrix_static \ No newline at end of file diff --git a/OTRExporter/OTRExporter/DisplayListExporter.cpp b/OTRExporter/OTRExporter/DisplayListExporter.cpp index 4d4f067b1..dafa8eb72 100644 --- a/OTRExporter/OTRExporter/DisplayListExporter.cpp +++ b/OTRExporter/OTRExporter/DisplayListExporter.cpp @@ -209,7 +209,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina break; case G_MTX: { - if ((!Globals::Instance->HasSegment(GETSEGNUM(data))) || ((data & 0xFFFFFFFF) == 0x07000000)) // En_Zf and En_Ny place a DL in segment 7 + if ((!Globals::Instance->HasSegment(GETSEGNUM(data), res->parent->workerID)) || ((data & 0xFFFFFFFF) == 0x07000000)) // En_Zf and En_Ny place a DL in segment 7 { uint32_t pp = (data & 0x000000FF00000000) >> 32; uint32_t mm = (data & 0x00000000FFFFFFFF); @@ -370,7 +370,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina //std::string fName = StringHelper::Sprintf("%s\\%s", GetParentFolderName(res).c_str(), dListDecl2->varName.c_str()); std::string fName = OTRExporter_DisplayList::GetPathToRes(res, dListDecl2->varName.c_str()); - if (!File::Exists("Extract\\" + fName)) + if (files.find(fName) == files.end() && !File::Exists("Extract\\" + fName)) { MemoryStream* dlStream = new MemoryStream(); BinaryWriter dlWriter = BinaryWriter(dlStream); @@ -382,7 +382,10 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina //otrArchive->RemoveFile(fName); #endif - File::WriteAllBytes("Extract\\" + fName, dlStream->ToVector()); + if (Globals::Instance->fileMode != ZFileMode::ExtractDirectory) + File::WriteAllBytes("Extract\\" + fName, dlStream->ToVector()); + else + files[fName] = dlStream->ToVector(); //otrArchive->AddFile(fName, (uintptr_t)dlStream->ToVector().data(), dlWriter.GetBaseAddress()); } @@ -401,7 +404,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina //case G_BRANCH_Z: case G_DL: { - if ((!Globals::Instance->HasSegment(GETSEGNUM(data)) && (int)opF3D != G_BRANCH_Z) + if ((!Globals::Instance->HasSegment(GETSEGNUM(data), res->parent->workerID) && (int)opF3D != G_BRANCH_Z) || ((data & 0xFFFFFFFF) == 0x07000000)) // En_Zf and En_Ny place a DL in segment 7 { int32_t pp = (data & 0x00FF000000000000) >> 56; @@ -464,14 +467,17 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina //std::string fName = StringHelper::Sprintf("%s\\%s", GetParentFolderName(res).c_str(), dListDecl2->varName.c_str()); std::string fName = OTRExporter_DisplayList::GetPathToRes(res, dListDecl2->varName.c_str()); - if (!File::Exists("Extract\\" + fName)) + if (files.find(fName) == files.end() && !File::Exists("Extract\\" + fName)) { MemoryStream* dlStream = new MemoryStream(); BinaryWriter dlWriter = BinaryWriter(dlStream); Save(dList->otherDLists[i], outPath, &dlWriter); - File::WriteAllBytes("Extract\\" + fName, dlStream->ToVector()); + if (Globals::Instance->fileMode != ZFileMode::ExtractDirectory) + File::WriteAllBytes("Extract\\" + fName, dlStream->ToVector()); + else + files[fName] = dlStream->ToVector(); } } else @@ -675,7 +681,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina uint32_t seg = data & 0xFFFFFFFF; int32_t texAddress = Seg2Filespace(data, dList->parent->baseAddress); - if (!Globals::Instance->HasSegment(GETSEGNUM(seg))) + if (!Globals::Instance->HasSegment(GETSEGNUM(seg), res->parent->workerID)) { int32_t __ = (data & 0x00FF000000000000) >> 48; int32_t www = (data & 0x00000FFF00000000) >> 32; @@ -693,7 +699,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina else { std::string texName = ""; - bool foundDecl = Globals::Instance->GetSegmentedPtrName(seg, dList->parent, "", texName); + bool foundDecl = Globals::Instance->GetSegmentedPtrName(seg, dList->parent, "", texName, res->parent->workerID); int32_t __ = (data & 0x00FF000000000000) >> 48; int32_t www = (data & 0x00000FFF00000000) >> 32; @@ -712,7 +718,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina if (foundDecl) { - ZFile* assocFile = Globals::Instance->GetSegment(GETSEGNUM(seg)); + ZFile* assocFile = Globals::Instance->GetSegment(GETSEGNUM(seg), res->parent->workerID); std::string assocFileName = assocFile->GetName(); std::string fName = ""; @@ -750,42 +756,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina word1 = value.words.w1 | 0xF0000000; } else - //if (dList->vertices.size() > 0) { - // Connect neighboring vertex arrays - std::vector>> vertsKeys(dList->vertices.begin(), - dList->vertices.end()); - - if (vertsKeys.size() > 0) - { - auto lastItem = vertsKeys[0]; - - for (size_t i = 1; i < vertsKeys.size(); i++) - { - auto curItem = vertsKeys[i]; - - int32_t sizeDiff = curItem.first - (lastItem.first + (lastItem.second.size() * 16)); - - // Make sure there isn't an unaccounted inbetween these two - if (sizeDiff == 0) - { - for (auto v : curItem.second) - { - dList->vertices[lastItem.first].push_back(v); - lastItem.second.push_back(v); - } - - dList->vertices.erase(curItem.first); - vertsKeys.erase(vertsKeys.begin() + i); - - i--; - continue; - } - - lastItem = curItem; - } - } - // Write CRC64 of vtx file name uint32_t addr = data & 0xFFFFFFFF; @@ -793,10 +764,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina addr -= dList->parent->baseAddress; auto segOffset = GETSEGOFFSET(addr); - //uint32_t seg = data & 0xFFFFFFFF; Declaration* vtxDecl = dList->parent->GetDeclarationRanged(segOffset); - //std::string vtxName = ""; - //bool foundDecl = Globals::Instance->GetSegmentedPtrName(seg, dList->parent, "", vtxName); int32_t aa = (data & 0x000000FF00000000ULL) >> 32; int32_t nn = (data & 0x000FF00000000000ULL) >> 44; @@ -822,9 +790,8 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina word0 = hash >> 32; word1 = hash & 0xFFFFFFFF; - if (!File::Exists("Extract\\" + fName)) + if (files.find(fName) == files.end() && !File::Exists("Extract\\" + fName)) { - //printf("Exporting VTX Data %s\n", fName.c_str()); // Write vertices to file MemoryStream* vtxStream = new MemoryStream(); BinaryWriter vtxWriter = BinaryWriter(vtxStream); @@ -847,44 +814,40 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina vtxWriter.Write((uint32_t)ZResourceType::Vertex); vtxWriter.Write((uint32_t)arrCnt); - size_t sz = dList->vertices[vtxDecl->address].size(); + auto start = std::chrono::steady_clock::now(); - //if (sz > 0) + // God dammit this is so dumb + for (size_t i = 0; i < split.size(); i++) { - auto start = std::chrono::steady_clock::now(); + std::string line = split[i]; - // God dammit this is so dumb - for (size_t i = 0; i < split.size(); i++) + if (StringHelper::Contains(line, "VTX(")) { - std::string line = split[i]; + auto split2 = StringHelper::Split(StringHelper::Split(StringHelper::Split(line, "VTX(")[1], ")")[0], ","); - if (StringHelper::Contains(line, "VTX(")) - { - auto split2 = StringHelper::Split(StringHelper::Split(StringHelper::Split(line, "VTX(")[1], ")")[0], ","); + vtxWriter.Write((int16_t)std::stoi(split2[0], nullptr, 10)); // v.x + vtxWriter.Write((int16_t)std::stoi(split2[1], nullptr, 10)); // v.y + vtxWriter.Write((int16_t)std::stoi(split2[2], nullptr, 10)); // v.z - vtxWriter.Write((int16_t)std::stoi(split2[0], nullptr, 10)); // v.x - vtxWriter.Write((int16_t)std::stoi(split2[1], nullptr, 10)); // v.y - vtxWriter.Write((int16_t)std::stoi(split2[2], nullptr, 10)); // v.z + vtxWriter.Write((int16_t)0); // v.flag - vtxWriter.Write((int16_t)0); // v.flag - - vtxWriter.Write((int16_t)std::stoi(split2[3], nullptr, 10)); // v.s - vtxWriter.Write((int16_t)std::stoi(split2[4], nullptr, 10)); // v.t - - vtxWriter.Write((uint8_t)std::stoi(split2[5], nullptr, 10)); // v.r - vtxWriter.Write((uint8_t)std::stoi(split2[6], nullptr, 10)); // v.g - vtxWriter.Write((uint8_t)std::stoi(split2[7], nullptr, 10)); // v.b - vtxWriter.Write((uint8_t)std::stoi(split2[8], nullptr, 10)); // v.a - } + vtxWriter.Write((int16_t)std::stoi(split2[3], nullptr, 10)); // v.s + vtxWriter.Write((int16_t)std::stoi(split2[4], nullptr, 10)); // v.t + + vtxWriter.Write((uint8_t)std::stoi(split2[5], nullptr, 10)); // v.r + vtxWriter.Write((uint8_t)std::stoi(split2[6], nullptr, 10)); // v.g + vtxWriter.Write((uint8_t)std::stoi(split2[7], nullptr, 10)); // v.b + vtxWriter.Write((uint8_t)std::stoi(split2[8], nullptr, 10)); // v.a } - - File::WriteAllBytes("Extract\\" + fName, vtxStream->ToVector()); - - auto end = std::chrono::steady_clock::now(); - size_t diff = std::chrono::duration_cast(end - start).count(); - - //printf("Exported VTX Array %s in %zums\n", fName.c_str(), diff); } + + if (Globals::Instance->fileMode != ZFileMode::ExtractDirectory) + File::WriteAllBytes("Extract\\" + fName, vtxStream->ToVector()); + else + files[fName] = vtxStream->ToVector(); + + auto end = std::chrono::steady_clock::now(); + size_t diff = std::chrono::duration_cast(end - start).count(); } } else @@ -892,15 +855,6 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina spdlog::error("vtxDecl == nullptr!"); } } - /*else - { - writer->Write(word0); - writer->Write(word1); - word0 = 0; - word1 = 0; - - spdlog::error("dList->vertices.size() <= 0!"); - }*/ } break; } diff --git a/OTRExporter/OTRExporter/Main.cpp b/OTRExporter/OTRExporter/Main.cpp index 24a156fe9..e62ed5ef4 100644 --- a/OTRExporter/OTRExporter/Main.cpp +++ b/OTRExporter/OTRExporter/Main.cpp @@ -25,6 +25,7 @@ std::string otrFileName = "oot.otr"; std::shared_ptr otrArchive; BinaryWriter* fileWriter; std::chrono::steady_clock::time_point fileStart, resStart; +std::map> files; void InitVersionInfo(); @@ -39,6 +40,8 @@ static void ExporterParseFileMode(const std::string& buildMode, ZFileMode& fileM { fileMode = (ZFileMode)ExporterFileMode::BuildOTR; + printf("BOTR: Generating OTR Archive...\n"); + if (File::Exists(otrFileName)) otrArchive = std::shared_ptr(new Ship::Archive(otrFileName, true)); else @@ -54,6 +57,31 @@ static void ExporterParseFileMode(const std::string& buildMode, ZFileMode& fileM } } +static void ExporterProgramEnd() +{ + if (Globals::Instance->fileMode == ZFileMode::ExtractDirectory) + { + printf("Generating OTR Archive...\n"); + otrArchive = Ship::Archive::CreateArchive(otrFileName, 65536 / 2); + + for (auto item : files) + { + auto fileData = item.second; + otrArchive->AddFile(item.first, (uintptr_t)fileData.data(), fileData.size()); + } + + // Add any additional files that need to be manually copied... + auto lst = Directory::ListFiles("Extract"); + + for (auto item : lst) + { + auto fileData = File::ReadAllBytes(item); + otrArchive->AddFile(StringHelper::Split(item, "Extract\\")[1], (uintptr_t)fileData.data(), fileData.size()); + } + } +} + + static void ExporterParseArgs(int argc, char* argv[], int& i) { std::string arg = argv[i]; @@ -85,6 +113,7 @@ static void ExporterFileBegin(ZFile* file) static void ExporterFileEnd(ZFile* file) { + int bp = 0; } static void ExporterResourceEnd(ZResource* res, BinaryWriter& writer) @@ -124,7 +153,10 @@ static void ExporterResourceEnd(ZResource* res, BinaryWriter& writer) else fName = StringHelper::Sprintf("%s\\%s", oName.c_str(), rName.c_str()); - File::WriteAllBytes("Extract\\" + fName, strem->ToVector()); + if (Globals::Instance->fileMode == ZFileMode::ExtractDirectory) + files[fName] = strem->ToVector(); + else + File::WriteAllBytes("Extract\\" + fName, strem->ToVector()); } auto end = std::chrono::steady_clock::now(); @@ -155,6 +187,8 @@ static void ImportExporters() exporterSet->beginXMLFunc = ExporterXMLBegin; exporterSet->endXMLFunc = ExporterXMLEnd; exporterSet->resSaveFunc = ExporterResourceEnd; + exporterSet->endProgramFunc = ExporterProgramEnd; + exporterSet->exporters[ZResourceType::Background] = new OTRExporter_Background(); exporterSet->exporters[ZResourceType::Texture] = new OTRExporter_Texture(); exporterSet->exporters[ZResourceType::Room] = new OTRExporter_Room(); diff --git a/OTRExporter/OTRExporter/Main.h b/OTRExporter/OTRExporter/Main.h index a29e21859..af4ada763 100644 --- a/OTRExporter/OTRExporter/Main.h +++ b/OTRExporter/OTRExporter/Main.h @@ -2,4 +2,5 @@ #include -extern std::shared_ptr otrArchive; \ No newline at end of file +extern std::shared_ptr otrArchive; +extern std::map> files; \ No newline at end of file diff --git a/OTRExporter/OTRExporter/OTRExporter.vcxproj b/OTRExporter/OTRExporter/OTRExporter.vcxproj index 96531304b..4ed7d72e1 100644 --- a/OTRExporter/OTRExporter/OTRExporter.vcxproj +++ b/OTRExporter/OTRExporter/OTRExporter.vcxproj @@ -63,6 +63,12 @@ + + + {02d10590-9542-3f55-aaf8-6055677e2a2a} + false + + 16.0 Win32Proj @@ -118,19 +124,31 @@ true $(SolutionDir)otrlib;$(SolutionDir)\ZAPD\ZAPD\;$(SolutionDir)\ZAPD\lib\tinyxml2;$(SolutionDir)\ZAPD\lib\libgfxd;$(SolutionDir)\ZAPD\lib\elfio;$(SolutionDir)\ZAPD\lib\assimp\include;$(SolutionDir)\ZAPD\lib\stb;$(ProjectDir);$(IncludePath) + MinimumRecommendedRules.ruleset + + false + MinimumRecommendedRules.ruleset + + true $(ProjectDir)..\..\ZAPDTR\ZAPD;$(ProjectDir)..\..\ZAPDTR\lib\tinyxml2;$(ProjectDir)..\..\ZAPDTR\lib\libgfxd;$(ProjectDir)..\..\ZAPDTR\ZAPDUtils;$(ProjectDir)..\..\libultraship\libultraship;$(ProjectDir)..\..\libultraship\libultraship\lib\spdlog\include;$(ProjectDir)..\..\libultraship\libultraship\Lib\Fast3D\U64;$(IncludePath) $(ProjectDir)..\..\libultraship\libultraship;$(LibraryPath) + MinimumRecommendedRules.ruleset + + false $(ProjectDir)..\..\ZAPDTR\ZAPD;$(ProjectDir)..\..\ZAPDTR\lib\tinyxml2;$(ProjectDir)..\..\ZAPDTR\lib\libgfxd;$(ProjectDir)..\..\ZAPDTR\ZAPDUtils;$(ProjectDir)..\..\libultraship\libultraship;$(ProjectDir)..\..\libultraship\libultraship\lib\spdlog\include;$(ProjectDir)..\..\libultraship\libultraship\Lib\Fast3D\U64;$(IncludePath) $(ProjectDir)..\..\libultraship\libultraship;$(LibraryPath) + MinimumRecommendedRules.ruleset + + diff --git a/OTRExporter/OTRExporter/RoomExporter.cpp b/OTRExporter/OTRExporter/RoomExporter.cpp index 622901aff..5b7ce4323 100644 --- a/OTRExporter/OTRExporter/RoomExporter.cpp +++ b/OTRExporter/OTRExporter/RoomExporter.cpp @@ -407,7 +407,7 @@ void OTRExporter_Room::Save(ZResource* res, const fs::path& outPath, BinaryWrite { uint32_t seg = cmdHeaders->headers[i] & 0xFFFFFFFF; std::string headerName = ""; - bool foundDecl = Globals::Instance->GetSegmentedPtrName(seg, room->parent, "", headerName); + bool foundDecl = Globals::Instance->GetSegmentedPtrName(seg, room->parent, "", headerName, res->parent->workerID); if (headerName == "NULL") writer->Write(""); else @@ -443,7 +443,7 @@ void OTRExporter_Room::Save(ZResource* res, const fs::path& outPath, BinaryWrite SetCutscenes* cmdSetCutscenes = (SetCutscenes*)cmd; std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdSetCutscenes->cmdArg2, room->parent, "CutsceneData", listName); + Globals::Instance->GetSegmentedPtrName(cmdSetCutscenes->cmdArg2, room->parent, "CutsceneData", listName, res->parent->workerID); std::string fName = OTRExporter_DisplayList::GetPathToRes(room, listName); //std::string fName = StringHelper::Sprintf("%s\\%s", OTRExporter_DisplayList::GetParentFolderName(room).c_str(), listName.c_str()); writer->Write(fName); @@ -452,8 +452,11 @@ void OTRExporter_Room::Save(ZResource* res, const fs::path& outPath, BinaryWrite BinaryWriter csWriter = BinaryWriter(csStream); OTRExporter_Cutscene cs; cs.Save(cmdSetCutscenes->cutscenes[0], "", &csWriter); - - File::WriteAllBytes("Extract\\" + fName, csStream->ToVector()); + + if (Globals::Instance->fileMode != ZFileMode::ExtractDirectory) + File::WriteAllBytes("Extract\\" + fName, csStream->ToVector()); + else + files[fName] = csStream->ToVector(); //std::string fName = OTRExporter_DisplayList::GetPathToRes(res, vtxDecl->varName); //otrArchive->AddFile(fName, (uintptr_t)csStream->ToVector().data(), csWriter.GetBaseAddress()); @@ -477,7 +480,10 @@ void OTRExporter_Room::Save(ZResource* res, const fs::path& outPath, BinaryWrite OTRExporter_Path pathExp; pathExp.Save(&cmdSetPathways->pathwayList, outPath, &pathWriter); - File::WriteAllBytes("Extract\\" + path, pathStream->ToVector()); + if (Globals::Instance->fileMode != ZFileMode::ExtractDirectory) + File::WriteAllBytes("Extract\\" + path, pathStream->ToVector()); + else + files[path] = pathStream->ToVector(); //otrArchive->AddFile(path, (uintptr_t)pathStream->ToVector().data(), pathWriter.GetBaseAddress()); diff --git a/OTRExporter/OTRExporter/SkeletonExporter.cpp b/OTRExporter/OTRExporter/SkeletonExporter.cpp index cd9f7a8fd..3e0c58d06 100644 --- a/OTRExporter/OTRExporter/SkeletonExporter.cpp +++ b/OTRExporter/OTRExporter/SkeletonExporter.cpp @@ -23,7 +23,7 @@ void OTRExporter_Skeleton::Save(ZResource* res, const fs::path& outPath, BinaryW Declaration* skelDecl = skel->parent->GetDeclarationRanged(GETSEGOFFSET(skel->limbsTable.limbsAddresses[i])); std::string name; - bool foundDecl = Globals::Instance->GetSegmentedPtrName(skel->limbsTable.limbsAddresses[i], skel->parent, "", name); + bool foundDecl = Globals::Instance->GetSegmentedPtrName(skel->limbsTable.limbsAddresses[i], skel->parent, "", name, res->parent->workerID); if (foundDecl) { if (name.at(0) == '&') diff --git a/OTRExporter/OTRExporter/SkeletonLimbExporter.cpp b/OTRExporter/OTRExporter/SkeletonLimbExporter.cpp index d22c3d000..e29c9a425 100644 --- a/OTRExporter/OTRExporter/SkeletonLimbExporter.cpp +++ b/OTRExporter/OTRExporter/SkeletonLimbExporter.cpp @@ -86,7 +86,7 @@ void OTRExporter_SkeletonLimb::Save(ZResource* res, const fs::path& outPath, Bin if (limb->childPtr != 0) { std::string name; - bool foundDecl = Globals::Instance->GetSegmentedPtrName(limb->childPtr, limb->parent, "", name); + bool foundDecl = Globals::Instance->GetSegmentedPtrName(limb->childPtr, limb->parent, "", name, res->parent->workerID); if (foundDecl) { if (name.at(0) == '&') @@ -107,7 +107,7 @@ void OTRExporter_SkeletonLimb::Save(ZResource* res, const fs::path& outPath, Bin if (limb->siblingPtr != 0) { std::string name; - bool foundDecl = Globals::Instance->GetSegmentedPtrName(limb->siblingPtr, limb->parent, "", name); + bool foundDecl = Globals::Instance->GetSegmentedPtrName(limb->siblingPtr, limb->parent, "", name, res->parent->workerID); if (foundDecl) { if (name.at(0) == '&') @@ -128,7 +128,7 @@ void OTRExporter_SkeletonLimb::Save(ZResource* res, const fs::path& outPath, Bin if (limb->dListPtr != 0) { std::string name; - bool foundDecl = Globals::Instance->GetSegmentedPtrName(limb->dListPtr, limb->parent, "", name); + bool foundDecl = Globals::Instance->GetSegmentedPtrName(limb->dListPtr, limb->parent, "", name, res->parent->workerID); if (foundDecl) { if (name.at(0) == '&') @@ -149,7 +149,7 @@ void OTRExporter_SkeletonLimb::Save(ZResource* res, const fs::path& outPath, Bin if (limb->dList2Ptr != 0) { std::string name; - bool foundDecl = Globals::Instance->GetSegmentedPtrName(limb->dList2Ptr, limb->parent, "", name); + bool foundDecl = Globals::Instance->GetSegmentedPtrName(limb->dList2Ptr, limb->parent, "", name, res->parent->workerID); if (foundDecl) { if (name.at(0) == '&') diff --git a/OTRExporter/extract_assets.py b/OTRExporter/extract_assets.py index 404b49ced..2922bbf06 100755 --- a/OTRExporter/extract_assets.py +++ b/OTRExporter/extract_assets.py @@ -48,7 +48,7 @@ def ExtractFunc(fullPath): *pathList, xmlName = fullPath.split(os.sep) objectName = os.path.splitext(xmlName)[0] - outPath = os.path.join("..\\soh\\assets\\", *pathList[4:], objectName) + outPath = os.path.join("..\\soh\\assets\\", *pathList[5:], objectName) os.makedirs(outPath, exist_ok=True) outSourcePath = outPath @@ -64,6 +64,7 @@ def main(): parser.add_argument("-s", "--single", help="asset path relative to assets/, e.g. objects/gameplay_keep") parser.add_argument("-f", "--force", help="Force the extraction of every xml instead of checking the touched ones.", action="store_true") parser.add_argument("-u", "--unaccounted", help="Enables ZAPD unaccounted detector warning system.", action="store_true") + parser.add_argument("-v", "--version", help="Sets game version.") args = parser.parse_args() global mainAbort @@ -73,6 +74,13 @@ def main(): extractedAssetsTracker = manager.dict() + xmlVer = "GC_NMQ_D" + + if (args.version == "gc_pal_nmpq"): + xmlVer = "GC_NMQ_PAL_F" + elif (args.version == "dbg_mq"): + xmlVer = "GC_MQ_D" + asset_path = args.single if asset_path is not None: fullPath = os.path.join("..\\soh\\assets", "xml", asset_path + ".xml") @@ -90,7 +98,7 @@ def main(): extract_staff_text_path = None xmlFiles = [] - for currentPath, _, files in os.walk(os.path.join("..\\soh\\assets", "xml")): + for currentPath, _, files in os.walk(os.path.join("..\\soh\\assets\\xml\\", xmlVer)): for file in files: fullPath = os.path.join(currentPath, file) if file.endswith(".xml"): diff --git a/OTRExporter/extract_baserom_debug.py b/OTRExporter/extract_baserom_debug.py new file mode 100644 index 000000000..a3eb83a8f --- /dev/null +++ b/OTRExporter/extract_baserom_debug.py @@ -0,0 +1,1608 @@ +#!/usr/bin/python3 + +import os +import sys +import struct +from multiprocessing import Pool, cpu_count + + +ROM_FILE_NAME = 'baserom_non_mq.z64' +FILE_TABLE_OFFSET = 0x12F70 + +FILE_NAMES = [ + 'makerom', + 'boot', + 'dmadata', + 'Audiobank', + 'Audioseq', + 'Audiotable', + 'link_animetion', + 'icon_item_static', + 'icon_item_24_static', + 'icon_item_field_static', + 'icon_item_dungeon_static', + 'icon_item_gameover_static', + 'icon_item_nes_static', + 'icon_item_ger_static', + 'icon_item_fra_static', + 'item_name_static', + 'map_name_static', + 'do_action_static', + 'message_static', + 'message_texture_static', + 'nes_font_static', + 'nes_message_data_static', + 'ger_message_data_static', + 'fra_message_data_static', + 'staff_message_data_static', + 'map_grand_static', + 'map_i_static', + 'map_48x85_static', + 'code', + 'ovl_title', + 'ovl_select', + 'ovl_opening', + 'ovl_file_choose', + 'ovl_kaleido_scope', + 'ovl_player_actor', + 'ovl_map_mark_data', + 'ovl_En_Test', + 'ovl_Arms_Hook', + 'ovl_Arrow_Fire', + 'ovl_Arrow_Ice', + 'ovl_Arrow_Light', + 'ovl_Bg_Bdan_Objects', + 'ovl_Bg_Bdan_Switch', + 'ovl_Bg_Bom_Guard', + 'ovl_Bg_Bombwall', + 'ovl_Bg_Bowl_Wall', + 'ovl_Bg_Breakwall', + 'ovl_Bg_Ddan_Jd', + 'ovl_Bg_Ddan_Kd', + 'ovl_Bg_Dodoago', + 'ovl_Bg_Dy_Yoseizo', + 'ovl_Bg_Ganon_Otyuka', + 'ovl_Bg_Gate_Shutter', + 'ovl_Bg_Gjyo_Bridge', + 'ovl_Bg_Gnd_Darkmeiro', + 'ovl_Bg_Gnd_Firemeiro', + 'ovl_Bg_Gnd_Iceblock', + 'ovl_Bg_Gnd_Nisekabe', + 'ovl_Bg_Gnd_Soulmeiro', + 'ovl_Bg_Haka', + 'ovl_Bg_Haka_Gate', + 'ovl_Bg_Haka_Huta', + 'ovl_Bg_Haka_Megane', + 'ovl_Bg_Haka_MeganeBG', + 'ovl_Bg_Haka_Sgami', + 'ovl_Bg_Haka_Ship', + 'ovl_Bg_Haka_Trap', + 'ovl_Bg_Haka_Tubo', + 'ovl_Bg_Haka_Water', + 'ovl_Bg_Haka_Zou', + 'ovl_Bg_Heavy_Block', + 'ovl_Bg_Hidan_Curtain', + 'ovl_Bg_Hidan_Dalm', + 'ovl_Bg_Hidan_Firewall', + 'ovl_Bg_Hidan_Fslift', + 'ovl_Bg_Hidan_Fwbig', + 'ovl_Bg_Hidan_Hamstep', + 'ovl_Bg_Hidan_Hrock', + 'ovl_Bg_Hidan_Kousi', + 'ovl_Bg_Hidan_Kowarerukabe', + 'ovl_Bg_Hidan_Rock', + 'ovl_Bg_Hidan_Rsekizou', + 'ovl_Bg_Hidan_Sekizou', + 'ovl_Bg_Hidan_Sima', + 'ovl_Bg_Hidan_Syoku', + 'ovl_Bg_Ice_Objects', + 'ovl_Bg_Ice_Shelter', + 'ovl_Bg_Ice_Shutter', + 'ovl_Bg_Ice_Turara', + 'ovl_Bg_Ingate', + 'ovl_Bg_Jya_1flift', + 'ovl_Bg_Jya_Amishutter', + 'ovl_Bg_Jya_Bigmirror', + 'ovl_Bg_Jya_Block', + 'ovl_Bg_Jya_Bombchuiwa', + 'ovl_Bg_Jya_Bombiwa', + 'ovl_Bg_Jya_Cobra', + 'ovl_Bg_Jya_Goroiwa', + 'ovl_Bg_Jya_Haheniron', + 'ovl_Bg_Jya_Ironobj', + 'ovl_Bg_Jya_Kanaami', + 'ovl_Bg_Jya_Lift', + 'ovl_Bg_Jya_Megami', + 'ovl_Bg_Jya_Zurerukabe', + 'ovl_Bg_Menkuri_Eye', + 'ovl_Bg_Menkuri_Kaiten', + 'ovl_Bg_Menkuri_Nisekabe', + 'ovl_Bg_Mizu_Bwall', + 'ovl_Bg_Mizu_Movebg', + 'ovl_Bg_Mizu_Shutter', + 'ovl_Bg_Mizu_Uzu', + 'ovl_Bg_Mizu_Water', + 'ovl_Bg_Mjin', + 'ovl_Bg_Mori_Bigst', + 'ovl_Bg_Mori_Elevator', + 'ovl_Bg_Mori_Hashigo', + 'ovl_Bg_Mori_Hashira4', + 'ovl_Bg_Mori_Hineri', + 'ovl_Bg_Mori_Idomizu', + 'ovl_Bg_Mori_Kaitenkabe', + 'ovl_Bg_Mori_Rakkatenjo', + 'ovl_Bg_Po_Event', + 'ovl_Bg_Po_Syokudai', + 'ovl_Bg_Pushbox', + 'ovl_Bg_Relay_Objects', + 'ovl_Bg_Spot00_Break', + 'ovl_Bg_Spot00_Hanebasi', + 'ovl_Bg_Spot01_Fusya', + 'ovl_Bg_Spot01_Idohashira', + 'ovl_Bg_Spot01_Idomizu', + 'ovl_Bg_Spot01_Idosoko', + 'ovl_Bg_Spot01_Objects2', + 'ovl_Bg_Spot02_Objects', + 'ovl_Bg_Spot03_Taki', + 'ovl_Bg_Spot05_Soko', + 'ovl_Bg_Spot06_Objects', + 'ovl_Bg_Spot07_Taki', + 'ovl_Bg_Spot08_Bakudankabe', + 'ovl_Bg_Spot08_Iceblock', + 'ovl_Bg_Spot09_Obj', + 'ovl_Bg_Spot11_Bakudankabe', + 'ovl_Bg_Spot11_Oasis', + 'ovl_Bg_Spot12_Gate', + 'ovl_Bg_Spot12_Saku', + 'ovl_Bg_Spot15_Rrbox', + 'ovl_Bg_Spot15_Saku', + 'ovl_Bg_Spot16_Bombstone', + 'ovl_Bg_Spot16_Doughnut', + 'ovl_Bg_Spot17_Bakudankabe', + 'ovl_Bg_Spot17_Funen', + 'ovl_Bg_Spot18_Basket', + 'ovl_Bg_Spot18_Futa', + 'ovl_Bg_Spot18_Obj', + 'ovl_Bg_Spot18_Shutter', + 'ovl_Bg_Sst_Floor', + 'ovl_Bg_Toki_Hikari', + 'ovl_Bg_Toki_Swd', + 'ovl_Bg_Treemouth', + 'ovl_Bg_Umajump', + 'ovl_Bg_Vb_Sima', + 'ovl_Bg_Ydan_Hasi', + 'ovl_Bg_Ydan_Maruta', + 'ovl_Bg_Ydan_Sp', + 'ovl_Bg_Zg', + 'ovl_Boss_Dodongo', + 'ovl_Boss_Fd', + 'ovl_Boss_Fd2', + 'ovl_Boss_Ganon', + 'ovl_Boss_Ganon2', + 'ovl_Boss_Ganondrof', + 'ovl_Boss_Goma', + 'ovl_Boss_Mo', + 'ovl_Boss_Sst', + 'ovl_Boss_Tw', + 'ovl_Boss_Va', + 'ovl_Demo_6K', + 'ovl_Demo_Du', + 'ovl_Demo_Ec', + 'ovl_Demo_Effect', + 'ovl_Demo_Ext', + 'ovl_Demo_Geff', + 'ovl_Demo_Gj', + 'ovl_Demo_Go', + 'ovl_Demo_Gt', + 'ovl_Demo_Ik', + 'ovl_Demo_Im', + 'ovl_Demo_Kankyo', + 'ovl_Demo_Kekkai', + 'ovl_Demo_Sa', + 'ovl_Demo_Shd', + 'ovl_Demo_Tre_Lgt', + 'ovl_Door_Ana', + 'ovl_Door_Gerudo', + 'ovl_Door_Killer', + 'ovl_Door_Shutter', + 'ovl_Door_Toki', + 'ovl_Door_Warp1', + 'ovl_Efc_Erupc', + 'ovl_Eff_Dust', + 'ovl_Effect_Ss_Blast', + 'ovl_Effect_Ss_Bomb', + 'ovl_Effect_Ss_Bomb2', + 'ovl_Effect_Ss_Bubble', + 'ovl_Effect_Ss_D_Fire', + 'ovl_Effect_Ss_Dead_Db', + 'ovl_Effect_Ss_Dead_Dd', + 'ovl_Effect_Ss_Dead_Ds', + 'ovl_Effect_Ss_Dead_Sound', + 'ovl_Effect_Ss_Dt_Bubble', + 'ovl_Effect_Ss_Dust', + 'ovl_Effect_Ss_En_Fire', + 'ovl_Effect_Ss_En_Ice', + 'ovl_Effect_Ss_Extra', + 'ovl_Effect_Ss_Fcircle', + 'ovl_Effect_Ss_Fhg_Flash', + 'ovl_Effect_Ss_Fire_Tail', + 'ovl_Effect_Ss_G_Fire', + 'ovl_Effect_Ss_G_Magma', + 'ovl_Effect_Ss_G_Magma2', + 'ovl_Effect_Ss_G_Ripple', + 'ovl_Effect_Ss_G_Spk', + 'ovl_Effect_Ss_G_Splash', + 'ovl_Effect_Ss_Hahen', + 'ovl_Effect_Ss_HitMark', + 'ovl_Effect_Ss_Ice_Piece', + 'ovl_Effect_Ss_Ice_Smoke', + 'ovl_Effect_Ss_K_Fire', + 'ovl_Effect_Ss_Kakera', + 'ovl_Effect_Ss_KiraKira', + 'ovl_Effect_Ss_Lightning', + 'ovl_Effect_Ss_Sibuki', + 'ovl_Effect_Ss_Sibuki2', + 'ovl_Effect_Ss_Solder_Srch_Ball', + 'ovl_Effect_Ss_Stick', + 'ovl_Effect_Ss_Stone1', + 'ovl_Elf_Msg', + 'ovl_Elf_Msg2', + 'ovl_En_Am', + 'ovl_En_Ani', + 'ovl_En_Anubice', + 'ovl_En_Anubice_Fire', + 'ovl_En_Anubice_Tag', + 'ovl_En_Arow_Trap', + 'ovl_En_Arrow', + 'ovl_En_Attack_Niw', + 'ovl_En_Ba', + 'ovl_En_Bb', + 'ovl_En_Bdfire', + 'ovl_En_Bigokuta', + 'ovl_En_Bili', + 'ovl_En_Bird', + 'ovl_En_Blkobj', + 'ovl_En_Bom', + 'ovl_En_Bom_Bowl_Man', + 'ovl_En_Bom_Bowl_Pit', + 'ovl_En_Bom_Chu', + 'ovl_En_Bombf', + 'ovl_En_Boom', + 'ovl_En_Box', + 'ovl_En_Brob', + 'ovl_En_Bubble', + 'ovl_En_Butte', + 'ovl_En_Bw', + 'ovl_En_Bx', + 'ovl_En_Changer', + 'ovl_En_Clear_Tag', + 'ovl_En_Cow', + 'ovl_En_Crow', + 'ovl_En_Cs', + 'ovl_En_Daiku', + 'ovl_En_Daiku_Kakariko', + 'ovl_En_Dekubaba', + 'ovl_En_Dekunuts', + 'ovl_En_Dh', + 'ovl_En_Dha', + 'ovl_En_Diving_Game', + 'ovl_En_Dns', + 'ovl_En_Dnt_Demo', + 'ovl_En_Dnt_Jiji', + 'ovl_En_Dnt_Nomal', + 'ovl_En_Dodojr', + 'ovl_En_Dodongo', + 'ovl_En_Dog', + 'ovl_En_Door', + 'ovl_En_Ds', + 'ovl_En_Du', + 'ovl_En_Dy_Extra', + 'ovl_En_Eg', + 'ovl_En_Eiyer', + 'ovl_En_Elf', + 'ovl_En_Encount1', + 'ovl_En_Encount2', + 'ovl_En_Ex_Item', + 'ovl_En_Ex_Ruppy', + 'ovl_En_Fd', + 'ovl_En_Fd_Fire', + 'ovl_En_Fhg_Fire', + 'ovl_En_Fire_Rock', + 'ovl_En_Firefly', + 'ovl_En_Fish', + 'ovl_En_Floormas', + 'ovl_En_Fr', + 'ovl_En_Fu', + 'ovl_En_Fw', + 'ovl_En_Fz', + 'ovl_En_G_Switch', + 'ovl_En_Ganon_Mant', + 'ovl_En_Ganon_Organ', + 'ovl_En_Gb', + 'ovl_En_Ge1', + 'ovl_En_Ge2', + 'ovl_En_Ge3', + 'ovl_En_GeldB', + 'ovl_En_GirlA', + 'ovl_En_Gm', + 'ovl_En_Go', + 'ovl_En_Go2', + 'ovl_En_Goma', + 'ovl_En_Goroiwa', + 'ovl_En_Gs', + 'ovl_En_Guest', + 'ovl_En_Hata', + 'ovl_En_Heishi1', + 'ovl_En_Heishi2', + 'ovl_En_Heishi3', + 'ovl_En_Heishi4', + 'ovl_En_Hintnuts', + 'ovl_En_Holl', + 'ovl_En_Honotrap', + 'ovl_En_Horse', + 'ovl_En_Horse_Game_Check', + 'ovl_En_Horse_Ganon', + 'ovl_En_Horse_Link_Child', + 'ovl_En_Horse_Normal', + 'ovl_En_Horse_Zelda', + 'ovl_En_Hs', + 'ovl_En_Hs2', + 'ovl_En_Hy', + 'ovl_En_Ice_Hono', + 'ovl_En_Ik', + 'ovl_En_In', + 'ovl_En_Insect', + 'ovl_En_Ishi', + 'ovl_En_It', + 'ovl_En_Jj', + 'ovl_En_Js', + 'ovl_En_Jsjutan', + 'ovl_En_Kakasi', + 'ovl_En_Kakasi2', + 'ovl_En_Kakasi3', + 'ovl_En_Kanban', + 'ovl_En_Karebaba', + 'ovl_En_Ko', + 'ovl_En_Kusa', + 'ovl_En_Kz', + 'ovl_En_Light', + 'ovl_En_Lightbox', + 'ovl_En_M_Fire1', + 'ovl_En_M_Thunder', + 'ovl_En_Ma1', + 'ovl_En_Ma2', + 'ovl_En_Ma3', + 'ovl_En_Mag', + 'ovl_En_Mb', + 'ovl_En_Md', + 'ovl_En_Mk', + 'ovl_En_Mm', + 'ovl_En_Mm2', + 'ovl_En_Ms', + 'ovl_En_Mu', + 'ovl_En_Nb', + 'ovl_En_Niw', + 'ovl_En_Niw_Girl', + 'ovl_En_Niw_Lady', + 'ovl_En_Nutsball', + 'ovl_En_Nwc', + 'ovl_En_Ny', + 'ovl_En_OE2', + 'ovl_En_Okarina_Effect', + 'ovl_En_Okarina_Tag', + 'ovl_En_Okuta', + 'ovl_En_Ossan', + 'ovl_En_Owl', + 'ovl_En_Part', + 'ovl_En_Peehat', + 'ovl_En_Po_Desert', + 'ovl_En_Po_Field', + 'ovl_En_Po_Relay', + 'ovl_En_Po_Sisters', + 'ovl_En_Poh', + 'ovl_En_Pu_box', + 'ovl_En_Rd', + 'ovl_En_Reeba', + 'ovl_En_River_Sound', + 'ovl_En_Rl', + 'ovl_En_Rr', + 'ovl_En_Ru1', + 'ovl_En_Ru2', + 'ovl_En_Sa', + 'ovl_En_Sb', + 'ovl_En_Scene_Change', + 'ovl_En_Sda', + 'ovl_En_Shopnuts', + 'ovl_En_Si', + 'ovl_En_Siofuki', + 'ovl_En_Skb', + 'ovl_En_Skj', + 'ovl_En_Skjneedle', + 'ovl_En_Ssh', + 'ovl_En_St', + 'ovl_En_Sth', + 'ovl_En_Stream', + 'ovl_En_Sw', + 'ovl_En_Syateki_Itm', + 'ovl_En_Syateki_Man', + 'ovl_En_Syateki_Niw', + 'ovl_En_Ta', + 'ovl_En_Takara_Man', + 'ovl_En_Tana', + 'ovl_En_Tg', + 'ovl_En_Tite', + 'ovl_En_Tk', + 'ovl_En_Torch', + 'ovl_En_Torch2', + 'ovl_En_Toryo', + 'ovl_En_Tp', + 'ovl_En_Tr', + 'ovl_En_Trap', + 'ovl_En_Tubo_Trap', + 'ovl_En_Vali', + 'ovl_En_Vase', + 'ovl_En_Vb_Ball', + 'ovl_En_Viewer', + 'ovl_En_Vm', + 'ovl_En_Wall_Tubo', + 'ovl_En_Wallmas', + 'ovl_En_Weather_Tag', + 'ovl_En_Weiyer', + 'ovl_En_Wf', + 'ovl_En_Wonder_Item', + 'ovl_En_Wonder_Talk', + 'ovl_En_Wonder_Talk2', + 'ovl_En_Wood02', + 'ovl_En_Xc', + 'ovl_En_Yabusame_Mark', + 'ovl_En_Yukabyun', + 'ovl_En_Zf', + 'ovl_En_Zl1', + 'ovl_En_Zl2', + 'ovl_En_Zl3', + 'ovl_En_Zl4', + 'ovl_En_Zo', + 'ovl_En_fHG', + 'ovl_End_Title', + 'ovl_Fishing', + 'ovl_Item_B_Heart', + 'ovl_Item_Etcetera', + 'ovl_Item_Inbox', + 'ovl_Item_Ocarina', + 'ovl_Item_Shield', + 'ovl_Magic_Dark', + 'ovl_Magic_Fire', + 'ovl_Magic_Wind', + 'ovl_Mir_Ray', + 'ovl_Obj_Bean', + 'ovl_Obj_Blockstop', + 'ovl_Obj_Bombiwa', + 'ovl_Obj_Comb', + 'ovl_Obj_Dekujr', + 'ovl_Obj_Elevator', + 'ovl_Obj_Hamishi', + 'ovl_Obj_Hana', + 'ovl_Obj_Hsblock', + 'ovl_Obj_Ice_Poly', + 'ovl_Obj_Kibako', + 'ovl_Obj_Kibako2', + 'ovl_Obj_Lift', + 'ovl_Obj_Lightswitch', + 'ovl_Obj_Makekinsuta', + 'ovl_Obj_Makeoshihiki', + 'ovl_Obj_Mure', + 'ovl_Obj_Mure2', + 'ovl_Obj_Mure3', + 'ovl_Obj_Oshihiki', + 'ovl_Obj_Roomtimer', + 'ovl_Obj_Switch', + 'ovl_Obj_Syokudai', + 'ovl_Obj_Timeblock', + 'ovl_Obj_Tsubo', + 'ovl_Obj_Warp2block', + 'ovl_Object_Kankyo', + 'ovl_Oceff_Spot', + 'ovl_Oceff_Storm', + 'ovl_Oceff_Wipe', + 'ovl_Oceff_Wipe2', + 'ovl_Oceff_Wipe3', + 'ovl_Oceff_Wipe4', + 'ovl_Shot_Sun', + 'gameplay_keep', + 'gameplay_field_keep', + 'gameplay_dangeon_keep', + 'gameplay_object_exchange_static', + 'object_link_boy', + 'object_link_child', + 'object_box', + 'object_human', + 'object_okuta', + 'object_poh', + 'object_wallmaster', + 'object_dy_obj', + 'object_firefly', + 'object_dodongo', + 'object_fire', + 'object_niw', + 'object_tite', + 'object_reeba', + 'object_peehat', + 'object_kingdodongo', + 'object_horse', + 'object_zf', + 'object_goma', + 'object_zl1', + 'object_gol', + 'object_bubble', + 'object_dodojr', + 'object_torch2', + 'object_bl', + 'object_tp', + 'object_oA1', + 'object_st', + 'object_bw', + 'object_ei', + 'object_horse_normal', + 'object_oB1', + 'object_o_anime', + 'object_spot04_objects', + 'object_ddan_objects', + 'object_hidan_objects', + 'object_horse_ganon', + 'object_oA2', + 'object_spot00_objects', + 'object_mb', + 'object_bombf', + 'object_sk2', + 'object_oE1', + 'object_oE_anime', + 'object_oE2', + 'object_ydan_objects', + 'object_gnd', + 'object_am', + 'object_dekubaba', + 'object_oA3', + 'object_oA4', + 'object_oA5', + 'object_oA6', + 'object_oA7', + 'object_jj', + 'object_oA8', + 'object_oA9', + 'object_oB2', + 'object_oB3', + 'object_oB4', + 'object_horse_zelda', + 'object_opening_demo1', + 'object_warp1', + 'object_b_heart', + 'object_dekunuts', + 'object_oE3', + 'object_oE4', + 'object_menkuri_objects', + 'object_oE5', + 'object_oE6', + 'object_oE7', + 'object_oE8', + 'object_oE9', + 'object_oE10', + 'object_oE11', + 'object_oE12', + 'object_vali', + 'object_oA10', + 'object_oA11', + 'object_mizu_objects', + 'object_fhg', + 'object_ossan', + 'object_mori_hineri1', + 'object_Bb', + 'object_toki_objects', + 'object_yukabyun', + 'object_zl2', + 'object_mjin', + 'object_mjin_flash', + 'object_mjin_dark', + 'object_mjin_flame', + 'object_mjin_ice', + 'object_mjin_soul', + 'object_mjin_wind', + 'object_mjin_oka', + 'object_haka_objects', + 'object_spot06_objects', + 'object_ice_objects', + 'object_relay_objects', + 'object_mori_hineri1a', + 'object_mori_hineri2', + 'object_mori_hineri2a', + 'object_mori_objects', + 'object_mori_tex', + 'object_spot08_obj', + 'object_warp2', + 'object_hata', + 'object_bird', + 'object_wood02', + 'object_lightbox', + 'object_pu_box', + 'object_trap', + 'object_vase', + 'object_im', + 'object_ta', + 'object_tk', + 'object_xc', + 'object_vm', + 'object_bv', + 'object_hakach_objects', + 'object_efc_crystal_light', + 'object_efc_fire_ball', + 'object_efc_flash', + 'object_efc_lgt_shower', + 'object_efc_star_field', + 'object_god_lgt', + 'object_light_ring', + 'object_triforce_spot', + 'object_medal', + 'object_bdan_objects', + 'object_sd', + 'object_rd', + 'object_po_sisters', + 'object_heavy_object', + 'object_gndd', + 'object_fd', + 'object_du', + 'object_fw', + 'object_horse_link_child', + 'object_spot02_objects', + 'object_haka', + 'object_ru1', + 'object_syokudai', + 'object_fd2', + 'object_dh', + 'object_rl', + 'object_efc_tw', + 'object_demo_tre_lgt', + 'object_gi_key', + 'object_mir_ray', + 'object_brob', + 'object_gi_jewel', + 'object_spot09_obj', + 'object_spot18_obj', + 'object_bdoor', + 'object_spot17_obj', + 'object_shop_dungen', + 'object_nb', + 'object_mo', + 'object_sb', + 'object_gi_melody', + 'object_gi_heart', + 'object_gi_compass', + 'object_gi_bosskey', + 'object_gi_medal', + 'object_gi_nuts', + 'object_sa', + 'object_gi_hearts', + 'object_gi_arrowcase', + 'object_gi_bombpouch', + 'object_in', + 'object_tr', + 'object_spot16_obj', + 'object_oE1s', + 'object_oE4s', + 'object_os_anime', + 'object_gi_bottle', + 'object_gi_stick', + 'object_gi_map', + 'object_oF1d_map', + 'object_ru2', + 'object_gi_shield_1', + 'object_dekujr', + 'object_gi_magicpot', + 'object_gi_bomb_1', + 'object_oF1s', + 'object_ma2', + 'object_gi_purse', + 'object_hni', + 'object_tw', + 'object_rr', + 'object_bxa', + 'object_anubice', + 'object_gi_gerudo', + 'object_gi_arrow', + 'object_gi_bomb_2', + 'object_gi_egg', + 'object_gi_scale', + 'object_gi_shield_2', + 'object_gi_hookshot', + 'object_gi_ocarina', + 'object_gi_milk', + 'object_ma1', + 'object_ganon', + 'object_sst', + 'object_ny', + 'object_fr', + 'object_gi_pachinko', + 'object_gi_boomerang', + 'object_gi_bow', + 'object_gi_glasses', + 'object_gi_liquid', + 'object_ani', + 'object_demo_6k', + 'object_gi_shield_3', + 'object_gi_letter', + 'object_spot15_obj', + 'object_jya_obj', + 'object_gi_clothes', + 'object_gi_bean', + 'object_gi_fish', + 'object_gi_saw', + 'object_gi_hammer', + 'object_gi_grass', + 'object_gi_longsword', + 'object_spot01_objects', + 'object_md', + 'object_km1', + 'object_kw1', + 'object_zo', + 'object_kz', + 'object_umajump', + 'object_masterkokiri', + 'object_masterkokirihead', + 'object_mastergolon', + 'object_masterzoora', + 'object_aob', + 'object_ik', + 'object_ahg', + 'object_cne', + 'object_gi_niwatori', + 'object_skj', + 'object_gi_bottle_letter', + 'object_bji', + 'object_bba', + 'object_gi_ocarina_0', + 'object_ds', + 'object_ane', + 'object_boj', + 'object_spot03_object', + 'object_spot07_object', + 'object_fz', + 'object_bob', + 'object_ge1', + 'object_yabusame_point', + 'object_gi_boots_2', + 'object_gi_seed', + 'object_gnd_magic', + 'object_d_elevator', + 'object_d_hsblock', + 'object_d_lift', + 'object_mamenoki', + 'object_goroiwa', + 'object_toryo', + 'object_daiku', + 'object_nwc', + 'object_blkobj', + 'object_gm', + 'object_ms', + 'object_hs', + 'object_ingate', + 'object_lightswitch', + 'object_kusa', + 'object_tsubo', + 'object_gi_gloves', + 'object_gi_coin', + 'object_kanban', + 'object_gjyo_objects', + 'object_owl', + 'object_mk', + 'object_fu', + 'object_gi_ki_tan_mask', + 'object_gi_redead_mask', + 'object_gi_skj_mask', + 'object_gi_rabit_mask', + 'object_gi_truth_mask', + 'object_ganon_objects', + 'object_siofuki', + 'object_stream', + 'object_mm', + 'object_fa', + 'object_os', + 'object_gi_eye_lotion', + 'object_gi_powder', + 'object_gi_mushroom', + 'object_gi_ticketstone', + 'object_gi_brokensword', + 'object_js', + 'object_cs', + 'object_gi_prescription', + 'object_gi_bracelet', + 'object_gi_soldout', + 'object_gi_frog', + 'object_mag', + 'object_door_gerudo', + 'object_gt', + 'object_efc_erupc', + 'object_zl2_anime1', + 'object_zl2_anime2', + 'object_gi_golonmask', + 'object_gi_zoramask', + 'object_gi_gerudomask', + 'object_ganon2', + 'object_ka', + 'object_ts', + 'object_zg', + 'object_gi_hoverboots', + 'object_gi_m_arrow', + 'object_ds2', + 'object_ec', + 'object_fish', + 'object_gi_sutaru', + 'object_gi_goddess', + 'object_ssh', + 'object_bigokuta', + 'object_bg', + 'object_spot05_objects', + 'object_spot12_obj', + 'object_bombiwa', + 'object_hintnuts', + 'object_rs', + 'object_spot00_break', + 'object_gla', + 'object_shopnuts', + 'object_geldb', + 'object_gr', + 'object_dog', + 'object_jya_iron', + 'object_jya_door', + 'object_spot01_objects2', + 'object_spot11_obj', + 'object_kibako2', + 'object_dns', + 'object_dnk', + 'object_gi_fire', + 'object_gi_insect', + 'object_gi_butterfly', + 'object_gi_ghost', + 'object_gi_soul', + 'object_bowl', + 'object_po_field', + 'object_demo_kekkai', + 'object_efc_doughnut', + 'object_gi_dekupouch', + 'object_ganon_anime1', + 'object_ganon_anime2', + 'object_ganon_anime3', + 'object_gi_rupy', + 'object_spot01_matoya', + 'object_spot01_matoyab', + 'object_po_composer', + 'object_mu', + 'object_wf', + 'object_skb', + 'object_gj', + 'object_geff', + 'object_haka_door', + 'object_gs', + 'object_ps', + 'object_bwall', + 'object_crow', + 'object_cow', + 'object_cob', + 'object_gi_sword_1', + 'object_door_killer', + 'object_ouke_haka', + 'object_timeblock', + 'object_zl4', + 'g_pn_01', + 'g_pn_02', + 'g_pn_03', + 'g_pn_04', + 'g_pn_05', + 'g_pn_06', + 'g_pn_07', + 'g_pn_08', + 'g_pn_09', + 'g_pn_10', + 'g_pn_11', + 'g_pn_12', + 'g_pn_13', + 'g_pn_14', + 'g_pn_15', + 'g_pn_16', + 'g_pn_17', + 'g_pn_18', + 'g_pn_19', + 'g_pn_20', + 'g_pn_21', + 'g_pn_22', + 'g_pn_23', + 'g_pn_24', + 'g_pn_25', + 'g_pn_26', + 'g_pn_27', + 'g_pn_28', + 'g_pn_29', + 'g_pn_30', + 'g_pn_31', + 'g_pn_32', + 'g_pn_33', + 'g_pn_34', + 'g_pn_35', + 'g_pn_36', + 'g_pn_37', + 'g_pn_38', + 'g_pn_39', + 'g_pn_40', + 'g_pn_41', + 'g_pn_42', + 'g_pn_43', + 'g_pn_44', + 'g_pn_45', + 'g_pn_46', + 'g_pn_47', + 'g_pn_48', + 'g_pn_49', + 'g_pn_50', + 'g_pn_51', + 'g_pn_52', + 'g_pn_53', + 'g_pn_54', + 'g_pn_55', + 'g_pn_56', + 'g_pn_57', + 'z_select_static', + 'nintendo_rogo_static', + 'title_static', + 'parameter_static', + 'vr_fine0_static', + 'vr_fine0_pal_static', + 'vr_fine1_static', + 'vr_fine1_pal_static', + 'vr_fine2_static', + 'vr_fine2_pal_static', + 'vr_fine3_static', + 'vr_fine3_pal_static', + 'vr_cloud0_static', + 'vr_cloud0_pal_static', + 'vr_cloud1_static', + 'vr_cloud1_pal_static', + 'vr_cloud2_static', + 'vr_cloud2_pal_static', + 'vr_cloud3_static', + 'vr_cloud3_pal_static', + 'vr_holy0_static', + 'vr_holy0_pal_static', + 'vr_holy1_static', + 'vr_holy1_pal_static', + 'vr_MDVR_static', + 'vr_MDVR_pal_static', + 'vr_MNVR_static', + 'vr_MNVR_pal_static', + 'vr_RUVR_static', + 'vr_RUVR_pal_static', + 'vr_LHVR_static', + 'vr_LHVR_pal_static', + 'vr_KHVR_static', + 'vr_KHVR_pal_static', + 'vr_K3VR_static', + 'vr_K3VR_pal_static', + 'vr_K4VR_static', + 'vr_K4VR_pal_static', + 'vr_K5VR_static', + 'vr_K5VR_pal_static', + 'vr_SP1a_static', + 'vr_SP1a_pal_static', + 'vr_MLVR_static', + 'vr_MLVR_pal_static', + 'vr_KKRVR_static', + 'vr_KKRVR_pal_static', + 'vr_KR3VR_static', + 'vr_KR3VR_pal_static', + 'vr_IPVR_static', + 'vr_IPVR_pal_static', + 'vr_KSVR_static', + 'vr_KSVR_pal_static', + 'vr_GLVR_static', + 'vr_GLVR_pal_static', + 'vr_ZRVR_static', + 'vr_ZRVR_pal_static', + 'vr_DGVR_static', + 'vr_DGVR_pal_static', + 'vr_ALVR_static', + 'vr_ALVR_pal_static', + 'vr_NSVR_static', + 'vr_NSVR_pal_static', + 'vr_LBVR_static', + 'vr_LBVR_pal_static', + 'vr_TTVR_static', + 'vr_TTVR_pal_static', + 'vr_FCVR_static', + 'vr_FCVR_pal_static', + 'elf_message_field', + 'elf_message_ydan', + 'syotes_scene', + 'syotes_room_0', + 'syotes2_scene', + 'syotes2_room_0', + 'depth_test_scene', + 'depth_test_room_0', + 'spot00_scene', + 'spot00_room_0', + 'spot01_scene', + 'spot01_room_0', + 'spot02_scene', + 'spot02_room_0', + 'spot02_room_1', + 'spot03_scene', + 'spot03_room_0', + 'spot03_room_1', + 'spot04_scene', + 'spot04_room_0', + 'spot04_room_1', + 'spot04_room_2', + 'spot05_scene', + 'spot05_room_0', + 'spot06_scene', + 'spot06_room_0', + 'spot07_scene', + 'spot07_room_0', + 'spot07_room_1', + 'spot08_scene', + 'spot08_room_0', + 'spot09_scene', + 'spot09_room_0', + 'spot10_scene', + 'spot10_room_0', + 'spot10_room_1', + 'spot10_room_2', + 'spot10_room_3', + 'spot10_room_4', + 'spot10_room_5', + 'spot10_room_6', + 'spot10_room_7', + 'spot10_room_8', + 'spot10_room_9', + 'spot11_scene', + 'spot11_room_0', + 'spot12_scene', + 'spot12_room_0', + 'spot12_room_1', + 'spot13_scene', + 'spot13_room_0', + 'spot13_room_1', + 'spot15_scene', + 'spot15_room_0', + 'spot16_scene', + 'spot16_room_0', + 'spot17_scene', + 'spot17_room_0', + 'spot17_room_1', + 'spot18_scene', + 'spot18_room_0', + 'spot18_room_1', + 'spot18_room_2', + 'spot18_room_3', + 'ydan_scene', + 'ydan_room_0', + 'ydan_room_1', + 'ydan_room_2', + 'ydan_room_3', + 'ydan_room_4', + 'ydan_room_5', + 'ydan_room_6', + 'ydan_room_7', + 'ydan_room_8', + 'ydan_room_9', + 'ydan_room_10', + 'ydan_room_11', + 'ddan_scene', + 'ddan_room_0', + 'ddan_room_1', + 'ddan_room_2', + 'ddan_room_3', + 'ddan_room_4', + 'ddan_room_5', + 'ddan_room_6', + 'ddan_room_7', + 'ddan_room_8', + 'ddan_room_9', + 'ddan_room_10', + 'ddan_room_11', + 'ddan_room_12', + 'ddan_room_13', + 'ddan_room_14', + 'ddan_room_15', + 'ddan_room_16', + 'bdan_scene', + 'bdan_room_0', + 'bdan_room_1', + 'bdan_room_2', + 'bdan_room_3', + 'bdan_room_4', + 'bdan_room_5', + 'bdan_room_6', + 'bdan_room_7', + 'bdan_room_8', + 'bdan_room_9', + 'bdan_room_10', + 'bdan_room_11', + 'bdan_room_12', + 'bdan_room_13', + 'bdan_room_14', + 'bdan_room_15', + 'Bmori1_scene', + 'Bmori1_room_0', + 'Bmori1_room_1', + 'Bmori1_room_2', + 'Bmori1_room_3', + 'Bmori1_room_4', + 'Bmori1_room_5', + 'Bmori1_room_6', + 'Bmori1_room_7', + 'Bmori1_room_8', + 'Bmori1_room_9', + 'Bmori1_room_10', + 'Bmori1_room_11', + 'Bmori1_room_12', + 'Bmori1_room_13', + 'Bmori1_room_14', + 'Bmori1_room_15', + 'Bmori1_room_16', + 'Bmori1_room_17', + 'Bmori1_room_18', + 'Bmori1_room_19', + 'Bmori1_room_20', + 'Bmori1_room_21', + 'Bmori1_room_22', + 'HIDAN_scene', + 'HIDAN_room_0', + 'HIDAN_room_1', + 'HIDAN_room_2', + 'HIDAN_room_3', + 'HIDAN_room_4', + 'HIDAN_room_5', + 'HIDAN_room_6', + 'HIDAN_room_7', + 'HIDAN_room_8', + 'HIDAN_room_9', + 'HIDAN_room_10', + 'HIDAN_room_11', + 'HIDAN_room_12', + 'HIDAN_room_13', + 'HIDAN_room_14', + 'HIDAN_room_15', + 'HIDAN_room_16', + 'HIDAN_room_17', + 'HIDAN_room_18', + 'HIDAN_room_19', + 'HIDAN_room_20', + 'HIDAN_room_21', + 'HIDAN_room_22', + 'HIDAN_room_23', + 'HIDAN_room_24', + 'HIDAN_room_25', + 'HIDAN_room_26', + 'MIZUsin_scene', + 'MIZUsin_room_0', + 'MIZUsin_room_1', + 'MIZUsin_room_2', + 'MIZUsin_room_3', + 'MIZUsin_room_4', + 'MIZUsin_room_5', + 'MIZUsin_room_6', + 'MIZUsin_room_7', + 'MIZUsin_room_8', + 'MIZUsin_room_9', + 'MIZUsin_room_10', + 'MIZUsin_room_11', + 'MIZUsin_room_12', + 'MIZUsin_room_13', + 'MIZUsin_room_14', + 'MIZUsin_room_15', + 'MIZUsin_room_16', + 'MIZUsin_room_17', + 'MIZUsin_room_18', + 'MIZUsin_room_19', + 'MIZUsin_room_20', + 'MIZUsin_room_21', + 'MIZUsin_room_22', + 'jyasinzou_scene', + 'jyasinzou_room_0', + 'jyasinzou_room_1', + 'jyasinzou_room_2', + 'jyasinzou_room_3', + 'jyasinzou_room_4', + 'jyasinzou_room_5', + 'jyasinzou_room_6', + 'jyasinzou_room_7', + 'jyasinzou_room_8', + 'jyasinzou_room_9', + 'jyasinzou_room_10', + 'jyasinzou_room_11', + 'jyasinzou_room_12', + 'jyasinzou_room_13', + 'jyasinzou_room_14', + 'jyasinzou_room_15', + 'jyasinzou_room_16', + 'jyasinzou_room_17', + 'jyasinzou_room_18', + 'jyasinzou_room_19', + 'jyasinzou_room_20', + 'jyasinzou_room_21', + 'jyasinzou_room_22', + 'jyasinzou_room_23', + 'jyasinzou_room_24', + 'jyasinzou_room_25', + 'jyasinzou_room_26', + 'jyasinzou_room_27', + 'jyasinzou_room_28', + 'HAKAdan_scene', + 'HAKAdan_room_0', + 'HAKAdan_room_1', + 'HAKAdan_room_2', + 'HAKAdan_room_3', + 'HAKAdan_room_4', + 'HAKAdan_room_5', + 'HAKAdan_room_6', + 'HAKAdan_room_7', + 'HAKAdan_room_8', + 'HAKAdan_room_9', + 'HAKAdan_room_10', + 'HAKAdan_room_11', + 'HAKAdan_room_12', + 'HAKAdan_room_13', + 'HAKAdan_room_14', + 'HAKAdan_room_15', + 'HAKAdan_room_16', + 'HAKAdan_room_17', + 'HAKAdan_room_18', + 'HAKAdan_room_19', + 'HAKAdan_room_20', + 'HAKAdan_room_21', + 'HAKAdan_room_22', + 'HAKAdanCH_scene', + 'HAKAdanCH_room_0', + 'HAKAdanCH_room_1', + 'HAKAdanCH_room_2', + 'HAKAdanCH_room_3', + 'HAKAdanCH_room_4', + 'HAKAdanCH_room_5', + 'HAKAdanCH_room_6', + 'ice_doukutu_scene', + 'ice_doukutu_room_0', + 'ice_doukutu_room_1', + 'ice_doukutu_room_2', + 'ice_doukutu_room_3', + 'ice_doukutu_room_4', + 'ice_doukutu_room_5', + 'ice_doukutu_room_6', + 'ice_doukutu_room_7', + 'ice_doukutu_room_8', + 'ice_doukutu_room_9', + 'ice_doukutu_room_10', + 'ice_doukutu_room_11', + 'men_scene', + 'men_room_0', + 'men_room_1', + 'men_room_2', + 'men_room_3', + 'men_room_4', + 'men_room_5', + 'men_room_6', + 'men_room_7', + 'men_room_8', + 'men_room_9', + 'men_room_10', + 'ganontika_scene', + 'ganontika_room_0', + 'ganontika_room_1', + 'ganontika_room_2', + 'ganontika_room_3', + 'ganontika_room_4', + 'ganontika_room_5', + 'ganontika_room_6', + 'ganontika_room_7', + 'ganontika_room_8', + 'ganontika_room_9', + 'ganontika_room_10', + 'ganontika_room_11', + 'ganontika_room_12', + 'ganontika_room_13', + 'ganontika_room_14', + 'ganontika_room_15', + 'ganontika_room_16', + 'ganontika_room_17', + 'ganontika_room_18', + 'ganontika_room_19', + 'market_day_scene', + 'market_day_room_0', + 'market_night_scene', + 'market_night_room_0', + 'testroom_scene', + 'testroom_room_0', + 'testroom_room_1', + 'testroom_room_2', + 'testroom_room_3', + 'testroom_room_4', + 'kenjyanoma_scene', + 'kenjyanoma_room_0', + 'tokinoma_scene', + 'tokinoma_room_0', + 'tokinoma_room_1', + 'sutaru_scene', + 'sutaru_room_0', + 'link_home_scene', + 'link_home_room_0', + 'kokiri_shop_scene', + 'kokiri_shop_room_0', + 'kokiri_home_scene', + 'kokiri_home_room_0', + 'kakusiana_scene', + 'kakusiana_room_0', + 'kakusiana_room_1', + 'kakusiana_room_2', + 'kakusiana_room_3', + 'kakusiana_room_4', + 'kakusiana_room_5', + 'kakusiana_room_6', + 'kakusiana_room_7', + 'kakusiana_room_8', + 'kakusiana_room_9', + 'kakusiana_room_10', + 'kakusiana_room_11', + 'kakusiana_room_12', + 'kakusiana_room_13', + 'entra_scene', + 'entra_room_0', + 'moribossroom_scene', + 'moribossroom_room_0', + 'moribossroom_room_1', + 'syatekijyou_scene', + 'syatekijyou_room_0', + 'shop1_scene', + 'shop1_room_0', + 'hairal_niwa_scene', + 'hairal_niwa_room_0', + 'ganon_tou_scene', + 'ganon_tou_room_0', + 'sasatest_scene', + 'sasatest_room_0', + 'market_alley_scene', + 'market_alley_room_0', + 'spot20_scene', + 'spot20_room_0', + 'market_ruins_scene', + 'market_ruins_room_0', + 'entra_n_scene', + 'entra_n_room_0', + 'enrui_scene', + 'enrui_room_0', + 'market_alley_n_scene', + 'market_alley_n_room_0', + 'hiral_demo_scene', + 'hiral_demo_room_0', + 'kokiri_home3_scene', + 'kokiri_home3_room_0', + 'malon_stable_scene', + 'malon_stable_room_0', + 'kakariko_scene', + 'kakariko_room_0', + 'bdan_boss_scene', + 'bdan_boss_room_0', + 'bdan_boss_room_1', + 'FIRE_bs_scene', + 'FIRE_bs_room_0', + 'FIRE_bs_room_1', + 'hut_scene', + 'hut_room_0', + 'daiyousei_izumi_scene', + 'daiyousei_izumi_room_0', + 'hakaana_scene', + 'hakaana_room_0', + 'yousei_izumi_tate_scene', + 'yousei_izumi_tate_room_0', + 'yousei_izumi_yoko_scene', + 'yousei_izumi_yoko_room_0', + 'golon_scene', + 'golon_room_0', + 'zoora_scene', + 'zoora_room_0', + 'drag_scene', + 'drag_room_0', + 'alley_shop_scene', + 'alley_shop_room_0', + 'night_shop_scene', + 'night_shop_room_0', + 'impa_scene', + 'impa_room_0', + 'labo_scene', + 'labo_room_0', + 'tent_scene', + 'tent_room_0', + 'nakaniwa_scene', + 'nakaniwa_room_0', + 'ddan_boss_scene', + 'ddan_boss_room_0', + 'ddan_boss_room_1', + 'ydan_boss_scene', + 'ydan_boss_room_0', + 'ydan_boss_room_1', + 'HAKAdan_bs_scene', + 'HAKAdan_bs_room_0', + 'HAKAdan_bs_room_1', + 'MIZUsin_bs_scene', + 'MIZUsin_bs_room_0', + 'MIZUsin_bs_room_1', + 'ganon_scene', + 'ganon_room_0', + 'ganon_room_1', + 'ganon_room_2', + 'ganon_room_3', + 'ganon_room_4', + 'ganon_room_5', + 'ganon_room_6', + 'ganon_room_7', + 'ganon_room_8', + 'ganon_room_9', + 'ganon_boss_scene', + 'ganon_boss_room_0', + 'jyasinboss_scene', + 'jyasinboss_room_0', + 'jyasinboss_room_1', + 'jyasinboss_room_2', + 'jyasinboss_room_3', + 'kokiri_home4_scene', + 'kokiri_home4_room_0', + 'kokiri_home5_scene', + 'kokiri_home5_room_0', + 'ganon_final_scene', + 'ganon_final_room_0', + 'kakariko3_scene', + 'kakariko3_room_0', + 'hairal_niwa2_scene', + 'hairal_niwa2_room_0', + 'hakasitarelay_scene', + 'hakasitarelay_room_0', + 'hakasitarelay_room_1', + 'hakasitarelay_room_2', + 'hakasitarelay_room_3', + 'hakasitarelay_room_4', + 'hakasitarelay_room_5', + 'hakasitarelay_room_6', + 'shrine_scene', + 'shrine_room_0', + 'turibori_scene', + 'turibori_room_0', + 'shrine_n_scene', + 'shrine_n_room_0', + 'shrine_r_scene', + 'shrine_r_room_0', + 'hakaana2_scene', + 'hakaana2_room_0', + 'gerudoway_scene', + 'gerudoway_room_0', + 'gerudoway_room_1', + 'gerudoway_room_2', + 'gerudoway_room_3', + 'gerudoway_room_4', + 'gerudoway_room_5', + 'hairal_niwa_n_scene', + 'hairal_niwa_n_room_0', + 'bowling_scene', + 'bowling_room_0', + 'hakaana_ouke_scene', + 'hakaana_ouke_room_0', + 'hakaana_ouke_room_1', + 'hakaana_ouke_room_2', + 'hylia_labo_scene', + 'hylia_labo_room_0', + 'souko_scene', + 'souko_room_0', + 'souko_room_1', + 'souko_room_2', + 'miharigoya_scene', + 'miharigoya_room_0', + 'mahouya_scene', + 'mahouya_room_0', + 'takaraya_scene', + 'takaraya_room_0', + 'takaraya_room_1', + 'takaraya_room_2', + 'takaraya_room_3', + 'takaraya_room_4', + 'takaraya_room_5', + 'takaraya_room_6', + 'ganon_sonogo_scene', + 'ganon_sonogo_room_0', + 'ganon_sonogo_room_1', + 'ganon_sonogo_room_2', + 'ganon_sonogo_room_3', + 'ganon_sonogo_room_4', + 'ganon_demo_scene', + 'ganon_demo_room_0', + 'besitu_scene', + 'besitu_room_0', + 'face_shop_scene', + 'face_shop_room_0', + 'kinsuta_scene', + 'kinsuta_room_0', + 'ganontikasonogo_scene', + 'ganontikasonogo_room_0', + 'ganontikasonogo_room_1', + 'test01_scene', + 'test01_room_0', + 'bump_texture_static', + 'anime_model_1_static', + 'anime_model_2_static', + 'anime_model_3_static', + 'anime_model_4_static', + 'anime_model_5_static', + 'anime_model_6_static', + 'anime_texture_1_static', + 'anime_texture_2_static', + 'anime_texture_3_static', + 'anime_texture_4_static', + 'anime_texture_5_static', + 'anime_texture_6_static', + 'softsprite_matrix_static', +] + +romData = None + + +def initialize_worker(rom_data): + global romData + romData = rom_data + +def read_uint32_be(offset): + return struct.unpack('>I', romData[offset:offset+4])[0] + +def write_output_file(name, offset, size): + try: + with open(name, 'wb') as f: + f.write(romData[offset:offset+size]) + except IOError: + print('failed to write file ' + name) + +def ExtractFunc(i): + filename = 'baserom/' + FILE_NAMES[i] + entryOffset = FILE_TABLE_OFFSET + 16 * i + + virtStart = read_uint32_be(entryOffset + 0) + virtEnd = read_uint32_be(entryOffset + 4) + physStart = read_uint32_be(entryOffset + 8) + physEnd = read_uint32_be(entryOffset + 12) + + if physEnd == 0: # uncompressed + compressed = False + size = virtEnd - virtStart + else: # compressed + compressed = True + size = physEnd - physStart + + print('extracting ' + filename + " (0x%08X, 0x%08X)" % (virtStart, virtEnd)) + write_output_file(filename, physStart, size) + if compressed: + os.system('tools/yaz0 -d ' + filename + ' ' + filename) + +##################################################################### + +def main(): + try: + os.mkdir('baserom') + except: + pass + + # read baserom data + try: + with open(ROM_FILE_NAME, 'rb') as f: + rom_data = f.read() + except IOError: + print('failed to read ' + ROM_FILE_NAME) + sys.exit(1) + + # extract files + num_cores = cpu_count() + print("Extracting baserom with " + str(num_cores) + " CPU cores.") + with Pool(num_cores, initialize_worker, (rom_data,)) as p: + p.map(ExtractFunc, range(len(FILE_NAMES))) + +if __name__ == "__main__": + main() diff --git a/OTRExporter/extract_baserom_gc.py b/OTRExporter/extract_baserom_gc.py new file mode 100644 index 000000000..0bc324f81 --- /dev/null +++ b/OTRExporter/extract_baserom_gc.py @@ -0,0 +1,1586 @@ +#!/usr/bin/python3 + +import os +import sys +import struct +from multiprocessing import Pool, cpu_count + + +ROM_FILE_NAME = 'zlp_f.n64' +FILE_TABLE_OFFSET = 0x7170 + +FILE_NAMES = [ + 'makerom', + 'boot', + 'dmadata', + 'Audiobank', + 'Audioseq', + 'Audiotable', + 'link_animetion', + 'icon_item_static', + 'icon_item_24_static', + 'icon_item_field_static', + 'icon_item_dungeon_static', + 'icon_item_gameover_static', + 'icon_item_nes_static', + 'icon_item_ger_static', + 'icon_item_fra_static', + 'item_name_static', + 'map_name_static', + 'do_action_static', + 'message_static', + 'message_texture_static', + 'nes_font_static', + 'nes_message_data_static', + 'ger_message_data_static', + 'fra_message_data_static', + 'staff_message_data_static', + 'map_grand_static', + 'map_48x85_static', + 'map_i_static', + 'code', + 'ovl_title', + 'ovl_select', + 'ovl_opening', + 'ovl_file_choose', + 'ovl_kaleido_scope', + 'ovl_player_actor', + 'ovl_map_mark_data', + 'ovl_En_Test', + 'ovl_Arms_Hook', + 'ovl_Arrow_Fire', + 'ovl_Arrow_Ice', + 'ovl_Arrow_Light', + 'ovl_Bg_Bdan_Objects', + 'ovl_Bg_Bdan_Switch', + 'ovl_Bg_Bom_Guard', + 'ovl_Bg_Bombwall', + 'ovl_Bg_Bowl_Wall', + 'ovl_Bg_Breakwall', + 'ovl_Bg_Ddan_Jd', + 'ovl_Bg_Ddan_Kd', + 'ovl_Bg_Dodoago', + 'ovl_Bg_Dy_Yoseizo', + 'ovl_Bg_Ganon_Otyuka', + 'ovl_Bg_Gate_Shutter', + 'ovl_Bg_Gjyo_Bridge', + 'ovl_Bg_Gnd_Darkmeiro', + 'ovl_Bg_Gnd_Firemeiro', + 'ovl_Bg_Gnd_Iceblock', + 'ovl_Bg_Gnd_Nisekabe', + 'ovl_Bg_Gnd_Soulmeiro', + 'ovl_Bg_Haka', + 'ovl_Bg_Haka_Gate', + 'ovl_Bg_Haka_Huta', + 'ovl_Bg_Haka_Megane', + 'ovl_Bg_Haka_MeganeBG', + 'ovl_Bg_Haka_Sgami', + 'ovl_Bg_Haka_Ship', + 'ovl_Bg_Haka_Trap', + 'ovl_Bg_Haka_Tubo', + 'ovl_Bg_Haka_Water', + 'ovl_Bg_Haka_Zou', + 'ovl_Bg_Heavy_Block', + 'ovl_Bg_Hidan_Curtain', + 'ovl_Bg_Hidan_Dalm', + 'ovl_Bg_Hidan_Firewall', + 'ovl_Bg_Hidan_Fslift', + 'ovl_Bg_Hidan_Fwbig', + 'ovl_Bg_Hidan_Hamstep', + 'ovl_Bg_Hidan_Hrock', + 'ovl_Bg_Hidan_Kousi', + 'ovl_Bg_Hidan_Kowarerukabe', + 'ovl_Bg_Hidan_Rock', + 'ovl_Bg_Hidan_Rsekizou', + 'ovl_Bg_Hidan_Sekizou', + 'ovl_Bg_Hidan_Sima', + 'ovl_Bg_Hidan_Syoku', + 'ovl_Bg_Ice_Objects', + 'ovl_Bg_Ice_Shelter', + 'ovl_Bg_Ice_Shutter', + 'ovl_Bg_Ice_Turara', + 'ovl_Bg_Ingate', + 'ovl_Bg_Jya_1flift', + 'ovl_Bg_Jya_Amishutter', + 'ovl_Bg_Jya_Bigmirror', + 'ovl_Bg_Jya_Block', + 'ovl_Bg_Jya_Bombchuiwa', + 'ovl_Bg_Jya_Bombiwa', + 'ovl_Bg_Jya_Cobra', + 'ovl_Bg_Jya_Goroiwa', + 'ovl_Bg_Jya_Haheniron', + 'ovl_Bg_Jya_Ironobj', + 'ovl_Bg_Jya_Kanaami', + 'ovl_Bg_Jya_Lift', + 'ovl_Bg_Jya_Megami', + 'ovl_Bg_Jya_Zurerukabe', + 'ovl_Bg_Menkuri_Eye', + 'ovl_Bg_Menkuri_Kaiten', + 'ovl_Bg_Menkuri_Nisekabe', + 'ovl_Bg_Mizu_Bwall', + 'ovl_Bg_Mizu_Movebg', + 'ovl_Bg_Mizu_Shutter', + 'ovl_Bg_Mizu_Uzu', + 'ovl_Bg_Mizu_Water', + 'ovl_Bg_Mjin', + 'ovl_Bg_Mori_Bigst', + 'ovl_Bg_Mori_Elevator', + 'ovl_Bg_Mori_Hashigo', + 'ovl_Bg_Mori_Hashira4', + 'ovl_Bg_Mori_Hineri', + 'ovl_Bg_Mori_Idomizu', + 'ovl_Bg_Mori_Kaitenkabe', + 'ovl_Bg_Mori_Rakkatenjo', + 'ovl_Bg_Po_Event', + 'ovl_Bg_Po_Syokudai', + 'ovl_Bg_Pushbox', + 'ovl_Bg_Relay_Objects', + 'ovl_Bg_Spot00_Break', + 'ovl_Bg_Spot00_Hanebasi', + 'ovl_Bg_Spot01_Fusya', + 'ovl_Bg_Spot01_Idohashira', + 'ovl_Bg_Spot01_Idomizu', + 'ovl_Bg_Spot01_Idosoko', + 'ovl_Bg_Spot01_Objects2', + 'ovl_Bg_Spot02_Objects', + 'ovl_Bg_Spot03_Taki', + 'ovl_Bg_Spot05_Soko', + 'ovl_Bg_Spot06_Objects', + 'ovl_Bg_Spot07_Taki', + 'ovl_Bg_Spot08_Bakudankabe', + 'ovl_Bg_Spot08_Iceblock', + 'ovl_Bg_Spot09_Obj', + 'ovl_Bg_Spot11_Bakudankabe', + 'ovl_Bg_Spot11_Oasis', + 'ovl_Bg_Spot12_Gate', + 'ovl_Bg_Spot12_Saku', + 'ovl_Bg_Spot15_Rrbox', + 'ovl_Bg_Spot15_Saku', + 'ovl_Bg_Spot16_Bombstone', + 'ovl_Bg_Spot16_Doughnut', + 'ovl_Bg_Spot17_Bakudankabe', + 'ovl_Bg_Spot17_Funen', + 'ovl_Bg_Spot18_Basket', + 'ovl_Bg_Spot18_Futa', + 'ovl_Bg_Spot18_Obj', + 'ovl_Bg_Spot18_Shutter', + 'ovl_Bg_Sst_Floor', + 'ovl_Bg_Toki_Hikari', + 'ovl_Bg_Toki_Swd', + 'ovl_Bg_Treemouth', + 'ovl_Bg_Umajump', + 'ovl_Bg_Vb_Sima', + 'ovl_Bg_Ydan_Hasi', + 'ovl_Bg_Ydan_Maruta', + 'ovl_Bg_Ydan_Sp', + 'ovl_Bg_Zg', + 'ovl_Boss_Dodongo', + 'ovl_Boss_Fd', + 'ovl_Boss_Fd2', + 'ovl_Boss_Ganon', + 'ovl_Boss_Ganon2', + 'ovl_Boss_Ganondrof', + 'ovl_Boss_Goma', + 'ovl_Boss_Mo', + 'ovl_Boss_Sst', + 'ovl_Boss_Tw', + 'ovl_Boss_Va', + 'ovl_Demo_6K', + 'ovl_Demo_Du', + 'ovl_Demo_Ec', + 'ovl_Demo_Effect', + 'ovl_Demo_Ext', + 'ovl_Demo_Geff', + 'ovl_Demo_Gj', + 'ovl_Demo_Go', + 'ovl_Demo_Gt', + 'ovl_Demo_Ik', + 'ovl_Demo_Im', + 'ovl_Demo_Kankyo', + 'ovl_Demo_Kekkai', + 'ovl_Demo_Sa', + 'ovl_Demo_Shd', + 'ovl_Demo_Tre_Lgt', + 'ovl_Door_Ana', + 'ovl_Door_Gerudo', + 'ovl_Door_Killer', + 'ovl_Door_Shutter', + 'ovl_Door_Toki', + 'ovl_Door_Warp1', + 'ovl_Efc_Erupc', + 'ovl_Eff_Dust', + 'ovl_Effect_Ss_Blast', + 'ovl_Effect_Ss_Bomb', + 'ovl_Effect_Ss_Bomb2', + 'ovl_Effect_Ss_Bubble', + 'ovl_Effect_Ss_D_Fire', + 'ovl_Effect_Ss_Dead_Db', + 'ovl_Effect_Ss_Dead_Dd', + 'ovl_Effect_Ss_Dead_Ds', + 'ovl_Effect_Ss_Dead_Sound', + 'ovl_Effect_Ss_Dt_Bubble', + 'ovl_Effect_Ss_Dust', + 'ovl_Effect_Ss_En_Fire', + 'ovl_Effect_Ss_En_Ice', + 'ovl_Effect_Ss_Extra', + 'ovl_Effect_Ss_Fcircle', + 'ovl_Effect_Ss_Fhg_Flash', + 'ovl_Effect_Ss_Fire_Tail', + 'ovl_Effect_Ss_G_Fire', + 'ovl_Effect_Ss_G_Magma', + 'ovl_Effect_Ss_G_Magma2', + 'ovl_Effect_Ss_G_Ripple', + 'ovl_Effect_Ss_G_Spk', + 'ovl_Effect_Ss_G_Splash', + 'ovl_Effect_Ss_Hahen', + 'ovl_Effect_Ss_HitMark', + 'ovl_Effect_Ss_Ice_Piece', + 'ovl_Effect_Ss_Ice_Smoke', + 'ovl_Effect_Ss_K_Fire', + 'ovl_Effect_Ss_Kakera', + 'ovl_Effect_Ss_KiraKira', + 'ovl_Effect_Ss_Lightning', + 'ovl_Effect_Ss_Sibuki', + 'ovl_Effect_Ss_Sibuki2', + 'ovl_Effect_Ss_Solder_Srch_Ball', + 'ovl_Effect_Ss_Stick', + 'ovl_Effect_Ss_Stone1', + 'ovl_Elf_Msg', + 'ovl_Elf_Msg2', + 'ovl_En_Am', + 'ovl_En_Ani', + 'ovl_En_Anubice', + 'ovl_En_Anubice_Fire', + 'ovl_En_Anubice_Tag', + 'ovl_En_Arow_Trap', + 'ovl_En_Arrow', + 'ovl_En_Attack_Niw', + 'ovl_En_Ba', + 'ovl_En_Bb', + 'ovl_En_Bdfire', + 'ovl_En_Bigokuta', + 'ovl_En_Bili', + 'ovl_En_Bird', + 'ovl_En_Blkobj', + 'ovl_En_Bom', + 'ovl_En_Bom_Bowl_Man', + 'ovl_En_Bom_Bowl_Pit', + 'ovl_En_Bom_Chu', + 'ovl_En_Bombf', + 'ovl_En_Boom', + 'ovl_En_Box', + 'ovl_En_Brob', + 'ovl_En_Bubble', + 'ovl_En_Butte', + 'ovl_En_Bw', + 'ovl_En_Bx', + 'ovl_En_Changer', + 'ovl_En_Clear_Tag', + 'ovl_En_Cow', + 'ovl_En_Crow', + 'ovl_En_Cs', + 'ovl_En_Daiku', + 'ovl_En_Daiku_Kakariko', + 'ovl_En_Dekubaba', + 'ovl_En_Dekunuts', + 'ovl_En_Dh', + 'ovl_En_Dha', + 'ovl_En_Diving_Game', + 'ovl_En_Dns', + 'ovl_En_Dnt_Demo', + 'ovl_En_Dnt_Jiji', + 'ovl_En_Dnt_Nomal', + 'ovl_En_Dodojr', + 'ovl_En_Dodongo', + 'ovl_En_Dog', + 'ovl_En_Door', + 'ovl_En_Ds', + 'ovl_En_Du', + 'ovl_En_Dy_Extra', + 'ovl_En_Eg', + 'ovl_En_Eiyer', + 'ovl_En_Elf', + 'ovl_En_Encount1', + 'ovl_En_Encount2', + 'ovl_En_Ex_Item', + 'ovl_En_Ex_Ruppy', + 'ovl_En_Fd', + 'ovl_En_Fd_Fire', + 'ovl_En_Fhg_Fire', + 'ovl_En_Fire_Rock', + 'ovl_En_Firefly', + 'ovl_En_Fish', + 'ovl_En_Floormas', + 'ovl_En_Fr', + 'ovl_En_Fu', + 'ovl_En_Fw', + 'ovl_En_Fz', + 'ovl_En_G_Switch', + 'ovl_En_Ganon_Mant', + 'ovl_En_Ganon_Organ', + 'ovl_En_Gb', + 'ovl_En_Ge1', + 'ovl_En_Ge2', + 'ovl_En_Ge3', + 'ovl_En_GeldB', + 'ovl_En_GirlA', + 'ovl_En_Gm', + 'ovl_En_Go', + 'ovl_En_Go2', + 'ovl_En_Goma', + 'ovl_En_Goroiwa', + 'ovl_En_Gs', + 'ovl_En_Guest', + 'ovl_En_Hata', + 'ovl_En_Heishi1', + 'ovl_En_Heishi2', + 'ovl_En_Heishi3', + 'ovl_En_Heishi4', + 'ovl_En_Hintnuts', + 'ovl_En_Holl', + 'ovl_En_Honotrap', + 'ovl_En_Horse', + 'ovl_En_Horse_Game_Check', + 'ovl_En_Horse_Ganon', + 'ovl_En_Horse_Link_Child', + 'ovl_En_Horse_Normal', + 'ovl_En_Horse_Zelda', + 'ovl_En_Hs', + 'ovl_En_Hs2', + 'ovl_En_Hy', + 'ovl_En_Ice_Hono', + 'ovl_En_Ik', + 'ovl_En_In', + 'ovl_En_Insect', + 'ovl_En_Ishi', + 'ovl_En_It', + 'ovl_En_Jj', + 'ovl_En_Js', + 'ovl_En_Jsjutan', + 'ovl_En_Kakasi', + 'ovl_En_Kakasi2', + 'ovl_En_Kakasi3', + 'ovl_En_Kanban', + 'ovl_En_Karebaba', + 'ovl_En_Ko', + 'ovl_En_Kusa', + 'ovl_En_Kz', + 'ovl_En_Light', + 'ovl_En_Lightbox', + 'ovl_En_M_Fire1', + 'ovl_En_M_Thunder', + 'ovl_En_Ma1', + 'ovl_En_Ma2', + 'ovl_En_Ma3', + 'ovl_En_Mag', + 'ovl_En_Mb', + 'ovl_En_Md', + 'ovl_En_Mk', + 'ovl_En_Mm', + 'ovl_En_Mm2', + 'ovl_En_Ms', + 'ovl_En_Mu', + 'ovl_En_Nb', + 'ovl_En_Niw', + 'ovl_En_Niw_Girl', + 'ovl_En_Niw_Lady', + 'ovl_En_Nutsball', + 'ovl_En_Nwc', + 'ovl_En_Ny', + 'ovl_En_OE2', + 'ovl_En_Okarina_Effect', + 'ovl_En_Okarina_Tag', + 'ovl_En_Okuta', + 'ovl_En_Ossan', + 'ovl_En_Owl', + 'ovl_En_Part', + 'ovl_En_Peehat', + 'ovl_En_Po_Desert', + 'ovl_En_Po_Field', + 'ovl_En_Po_Relay', + 'ovl_En_Po_Sisters', + 'ovl_En_Poh', + 'ovl_En_Pu_box', + 'ovl_En_Rd', + 'ovl_En_Reeba', + 'ovl_En_River_Sound', + 'ovl_En_Rl', + 'ovl_En_Rr', + 'ovl_En_Ru1', + 'ovl_En_Ru2', + 'ovl_En_Sa', + 'ovl_En_Sb', + 'ovl_En_Scene_Change', + 'ovl_En_Sda', + 'ovl_En_Shopnuts', + 'ovl_En_Si', + 'ovl_En_Siofuki', + 'ovl_En_Skb', + 'ovl_En_Skj', + 'ovl_En_Skjneedle', + 'ovl_En_Ssh', + 'ovl_En_St', + 'ovl_En_Sth', + 'ovl_En_Stream', + 'ovl_En_Sw', + 'ovl_En_Syateki_Itm', + 'ovl_En_Syateki_Man', + 'ovl_En_Syateki_Niw', + 'ovl_En_Ta', + 'ovl_En_Takara_Man', + 'ovl_En_Tana', + 'ovl_En_Tg', + 'ovl_En_Tite', + 'ovl_En_Tk', + 'ovl_En_Torch', + 'ovl_En_Torch2', + 'ovl_En_Toryo', + 'ovl_En_Tp', + 'ovl_En_Tr', + 'ovl_En_Trap', + 'ovl_En_Tubo_Trap', + 'ovl_En_Vali', + 'ovl_En_Vase', + 'ovl_En_Vb_Ball', + 'ovl_En_Viewer', + 'ovl_En_Vm', + 'ovl_En_Wall_Tubo', + 'ovl_En_Wallmas', + 'ovl_En_Weather_Tag', + 'ovl_En_Weiyer', + 'ovl_En_Wf', + 'ovl_En_Wonder_Item', + 'ovl_En_Wonder_Talk', + 'ovl_En_Wonder_Talk2', + 'ovl_En_Wood02', + 'ovl_En_Xc', + 'ovl_En_Yabusame_Mark', + 'ovl_En_Yukabyun', + 'ovl_En_Zf', + 'ovl_En_Zl1', + 'ovl_En_Zl2', + 'ovl_En_Zl3', + 'ovl_En_Zl4', + 'ovl_En_Zo', + 'ovl_En_fHG', + 'ovl_End_Title', + 'ovl_Fishing', + 'ovl_Item_B_Heart', + 'ovl_Item_Etcetera', + 'ovl_Item_Inbox', + 'ovl_Item_Ocarina', + 'ovl_Item_Shield', + 'ovl_Magic_Dark', + 'ovl_Magic_Fire', + 'ovl_Magic_Wind', + 'ovl_Mir_Ray', + 'ovl_Obj_Bean', + 'ovl_Obj_Blockstop', + 'ovl_Obj_Bombiwa', + 'ovl_Obj_Comb', + 'ovl_Obj_Dekujr', + 'ovl_Obj_Elevator', + 'ovl_Obj_Hamishi', + 'ovl_Obj_Hana', + 'ovl_Obj_Hsblock', + 'ovl_Obj_Ice_Poly', + 'ovl_Obj_Kibako', + 'ovl_Obj_Kibako2', + 'ovl_Obj_Lift', + 'ovl_Obj_Lightswitch', + 'ovl_Obj_Makekinsuta', + 'ovl_Obj_Makeoshihiki', + 'ovl_Obj_Mure', + 'ovl_Obj_Mure2', + 'ovl_Obj_Mure3', + 'ovl_Obj_Oshihiki', + 'ovl_Obj_Roomtimer', + 'ovl_Obj_Switch', + 'ovl_Obj_Syokudai', + 'ovl_Obj_Timeblock', + 'ovl_Obj_Tsubo', + 'ovl_Obj_Warp2block', + 'ovl_Object_Kankyo', + 'ovl_Oceff_Spot', + 'ovl_Oceff_Storm', + 'ovl_Oceff_Wipe', + 'ovl_Oceff_Wipe2', + 'ovl_Oceff_Wipe3', + 'ovl_Oceff_Wipe4', + 'ovl_Shot_Sun', + 'gameplay_keep', + 'gameplay_field_keep', + 'gameplay_dangeon_keep', + 'gameplay_object_exchange_static', + 'object_link_boy', + 'object_link_child', + 'object_box', + 'object_human', + 'object_okuta', + 'object_poh', + 'object_wallmaster', + 'object_dy_obj', + 'object_firefly', + 'object_dodongo', + 'object_fire', + 'object_niw', + 'object_tite', + 'object_reeba', + 'object_peehat', + 'object_kingdodongo', + 'object_horse', + 'object_zf', + 'object_goma', + 'object_zl1', + 'object_gol', + 'object_bubble', + 'object_dodojr', + 'object_torch2', + 'object_bl', + 'object_tp', + 'object_oA1', + 'object_st', + 'object_bw', + 'object_ei', + 'object_horse_normal', + 'object_oB1', + 'object_o_anime', + 'object_spot04_objects', + 'object_ddan_objects', + 'object_hidan_objects', + 'object_horse_ganon', + 'object_oA2', + 'object_spot00_objects', + 'object_mb', + 'object_bombf', + 'object_sk2', + 'object_oE1', + 'object_oE_anime', + 'object_oE2', + 'object_ydan_objects', + 'object_gnd', + 'object_am', + 'object_dekubaba', + 'object_oA3', + 'object_oA4', + 'object_oA5', + 'object_oA6', + 'object_oA7', + 'object_jj', + 'object_oA8', + 'object_oA9', + 'object_oB2', + 'object_oB3', + 'object_oB4', + 'object_horse_zelda', + 'object_opening_demo1', + 'object_warp1', + 'object_b_heart', + 'object_dekunuts', + 'object_oE3', + 'object_oE4', + 'object_menkuri_objects', + 'object_oE5', + 'object_oE6', + 'object_oE7', + 'object_oE8', + 'object_oE9', + 'object_oE10', + 'object_oE11', + 'object_oE12', + 'object_vali', + 'object_oA10', + 'object_oA11', + 'object_mizu_objects', + 'object_fhg', + 'object_ossan', + 'object_mori_hineri1', + 'object_Bb', + 'object_toki_objects', + 'object_yukabyun', + 'object_zl2', + 'object_mjin', + 'object_mjin_flash', + 'object_mjin_dark', + 'object_mjin_flame', + 'object_mjin_ice', + 'object_mjin_soul', + 'object_mjin_wind', + 'object_mjin_oka', + 'object_haka_objects', + 'object_spot06_objects', + 'object_ice_objects', + 'object_relay_objects', + 'object_mori_hineri1a', + 'object_mori_hineri2', + 'object_mori_hineri2a', + 'object_mori_objects', + 'object_mori_tex', + 'object_spot08_obj', + 'object_warp2', + 'object_hata', + 'object_bird', + 'object_wood02', + 'object_lightbox', + 'object_pu_box', + 'object_trap', + 'object_vase', + 'object_im', + 'object_ta', + 'object_tk', + 'object_xc', + 'object_vm', + 'object_bv', + 'object_hakach_objects', + 'object_efc_crystal_light', + 'object_efc_fire_ball', + 'object_efc_flash', + 'object_efc_lgt_shower', + 'object_efc_star_field', + 'object_god_lgt', + 'object_light_ring', + 'object_triforce_spot', + 'object_medal', + 'object_bdan_objects', + 'object_sd', + 'object_rd', + 'object_po_sisters', + 'object_heavy_object', + 'object_gndd', + 'object_fd', + 'object_du', + 'object_fw', + 'object_horse_link_child', + 'object_spot02_objects', + 'object_haka', + 'object_ru1', + 'object_syokudai', + 'object_fd2', + 'object_dh', + 'object_rl', + 'object_efc_tw', + 'object_demo_tre_lgt', + 'object_gi_key', + 'object_mir_ray', + 'object_brob', + 'object_gi_jewel', + 'object_spot09_obj', + 'object_spot18_obj', + 'object_bdoor', + 'object_spot17_obj', + 'object_shop_dungen', + 'object_nb', + 'object_mo', + 'object_sb', + 'object_gi_melody', + 'object_gi_heart', + 'object_gi_compass', + 'object_gi_bosskey', + 'object_gi_medal', + 'object_gi_nuts', + 'object_sa', + 'object_gi_hearts', + 'object_gi_arrowcase', + 'object_gi_bombpouch', + 'object_in', + 'object_tr', + 'object_spot16_obj', + 'object_oE1s', + 'object_oE4s', + 'object_os_anime', + 'object_gi_bottle', + 'object_gi_stick', + 'object_gi_map', + 'object_oF1d_map', + 'object_ru2', + 'object_gi_shield_1', + 'object_dekujr', + 'object_gi_magicpot', + 'object_gi_bomb_1', + 'object_oF1s', + 'object_ma2', + 'object_gi_purse', + 'object_hni', + 'object_tw', + 'object_rr', + 'object_bxa', + 'object_anubice', + 'object_gi_gerudo', + 'object_gi_arrow', + 'object_gi_bomb_2', + 'object_gi_egg', + 'object_gi_scale', + 'object_gi_shield_2', + 'object_gi_hookshot', + 'object_gi_ocarina', + 'object_gi_milk', + 'object_ma1', + 'object_ganon', + 'object_sst', + 'object_ny', + 'object_fr', + 'object_gi_pachinko', + 'object_gi_boomerang', + 'object_gi_bow', + 'object_gi_glasses', + 'object_gi_liquid', + 'object_ani', + 'object_demo_6k', + 'object_gi_shield_3', + 'object_gi_letter', + 'object_spot15_obj', + 'object_jya_obj', + 'object_gi_clothes', + 'object_gi_bean', + 'object_gi_fish', + 'object_gi_saw', + 'object_gi_hammer', + 'object_gi_grass', + 'object_gi_longsword', + 'object_spot01_objects', + 'object_md', + 'object_km1', + 'object_kw1', + 'object_zo', + 'object_kz', + 'object_umajump', + 'object_masterkokiri', + 'object_masterkokirihead', + 'object_mastergolon', + 'object_masterzoora', + 'object_aob', + 'object_ik', + 'object_ahg', + 'object_cne', + 'object_gi_niwatori', + 'object_skj', + 'object_gi_bottle_letter', + 'object_bji', + 'object_bba', + 'object_gi_ocarina_0', + 'object_ds', + 'object_ane', + 'object_boj', + 'object_spot03_object', + 'object_spot07_object', + 'object_fz', + 'object_bob', + 'object_ge1', + 'object_yabusame_point', + 'object_gi_boots_2', + 'object_gi_seed', + 'object_gnd_magic', + 'object_d_elevator', + 'object_d_hsblock', + 'object_d_lift', + 'object_mamenoki', + 'object_goroiwa', + 'object_toryo', + 'object_daiku', + 'object_nwc', + 'object_blkobj', + 'object_gm', + 'object_ms', + 'object_hs', + 'object_ingate', + 'object_lightswitch', + 'object_kusa', + 'object_tsubo', + 'object_gi_gloves', + 'object_gi_coin', + 'object_kanban', + 'object_gjyo_objects', + 'object_owl', + 'object_mk', + 'object_fu', + 'object_gi_ki_tan_mask', + 'object_gi_redead_mask', + 'object_gi_skj_mask', + 'object_gi_rabit_mask', + 'object_gi_truth_mask', + 'object_ganon_objects', + 'object_siofuki', + 'object_stream', + 'object_mm', + 'object_fa', + 'object_os', + 'object_gi_eye_lotion', + 'object_gi_powder', + 'object_gi_mushroom', + 'object_gi_ticketstone', + 'object_gi_brokensword', + 'object_js', + 'object_cs', + 'object_gi_prescription', + 'object_gi_bracelet', + 'object_gi_soldout', + 'object_gi_frog', + 'object_mag', + 'object_door_gerudo', + 'object_gt', + 'object_efc_erupc', + 'object_zl2_anime1', + 'object_zl2_anime2', + 'object_gi_golonmask', + 'object_gi_zoramask', + 'object_gi_gerudomask', + 'object_ganon2', + 'object_ka', + 'object_ts', + 'object_zg', + 'object_gi_hoverboots', + 'object_gi_m_arrow', + 'object_ds2', + 'object_ec', + 'object_fish', + 'object_gi_sutaru', + 'object_gi_goddess', + 'object_ssh', + 'object_bigokuta', + 'object_bg', + 'object_spot05_objects', + 'object_spot12_obj', + 'object_bombiwa', + 'object_hintnuts', + 'object_rs', + 'object_spot00_break', + 'object_gla', + 'object_shopnuts', + 'object_geldb', + 'object_gr', + 'object_dog', + 'object_jya_iron', + 'object_jya_door', + 'object_spot01_objects2', + 'object_spot11_obj', + 'object_kibako2', + 'object_dns', + 'object_dnk', + 'object_gi_fire', + 'object_gi_insect', + 'object_gi_butterfly', + 'object_gi_ghost', + 'object_gi_soul', + 'object_bowl', + 'object_po_field', + 'object_demo_kekkai', + 'object_efc_doughnut', + 'object_gi_dekupouch', + 'object_ganon_anime1', + 'object_ganon_anime2', + 'object_ganon_anime3', + 'object_gi_rupy', + 'object_spot01_matoya', + 'object_spot01_matoyab', + 'object_po_composer', + 'object_mu', + 'object_wf', + 'object_skb', + 'object_gj', + 'object_geff', + 'object_haka_door', + 'object_gs', + 'object_ps', + 'object_bwall', + 'object_crow', + 'object_cow', + 'object_cob', + 'object_gi_sword_1', + 'object_door_killer', + 'object_ouke_haka', + 'object_timeblock', + 'object_zl4', + 'g_pn_01', + 'g_pn_02', + 'g_pn_03', + 'g_pn_04', + 'g_pn_05', + 'g_pn_06', + 'g_pn_07', + 'g_pn_08', + 'g_pn_09', + 'g_pn_10', + 'g_pn_11', + 'g_pn_12', + 'g_pn_13', + 'g_pn_14', + 'g_pn_15', + 'g_pn_16', + 'g_pn_17', + 'g_pn_18', + 'g_pn_19', + 'g_pn_20', + 'g_pn_21', + 'g_pn_22', + 'g_pn_23', + 'g_pn_24', + 'g_pn_25', + 'g_pn_26', + 'g_pn_27', + 'g_pn_28', + 'g_pn_29', + 'g_pn_30', + 'g_pn_31', + 'g_pn_32', + 'g_pn_33', + 'g_pn_34', + 'g_pn_35', + 'g_pn_36', + 'g_pn_37', + 'g_pn_38', + 'g_pn_39', + 'g_pn_40', + 'g_pn_41', + 'g_pn_42', + 'g_pn_43', + 'g_pn_44', + 'g_pn_45', + 'g_pn_46', + 'g_pn_47', + 'g_pn_48', + 'g_pn_49', + 'g_pn_50', + 'g_pn_51', + 'g_pn_52', + 'g_pn_53', + 'g_pn_54', + 'g_pn_55', + 'g_pn_56', + 'g_pn_57', + 'z_select_static', + 'nintendo_rogo_static', + 'title_static', + 'parameter_static', + 'vr_fine0_static', + 'vr_fine0_pal_static', + 'vr_fine1_static', + 'vr_fine1_pal_static', + 'vr_fine2_static', + 'vr_fine2_pal_static', + 'vr_fine3_static', + 'vr_fine3_pal_static', + 'vr_cloud0_static', + 'vr_cloud0_pal_static', + 'vr_cloud1_static', + 'vr_cloud1_pal_static', + 'vr_cloud2_static', + 'vr_cloud2_pal_static', + 'vr_cloud3_static', + 'vr_cloud3_pal_static', + 'vr_holy0_static', + 'vr_holy0_pal_static', + 'vr_holy1_static', + 'vr_holy1_pal_static', + 'vr_MDVR_static', + 'vr_MDVR_pal_static', + 'vr_MNVR_static', + 'vr_MNVR_pal_static', + 'vr_RUVR_static', + 'vr_RUVR_pal_static', + 'vr_LHVR_static', + 'vr_LHVR_pal_static', + 'vr_KHVR_static', + 'vr_KHVR_pal_static', + 'vr_K3VR_static', + 'vr_K3VR_pal_static', + 'vr_K4VR_static', + 'vr_K4VR_pal_static', + 'vr_K5VR_static', + 'vr_K5VR_pal_static', + 'vr_SP1a_static', + 'vr_SP1a_pal_static', + 'vr_MLVR_static', + 'vr_MLVR_pal_static', + 'vr_KKRVR_static', + 'vr_KKRVR_pal_static', + 'vr_KR3VR_static', + 'vr_KR3VR_pal_static', + 'vr_IPVR_static', + 'vr_IPVR_pal_static', + 'vr_KSVR_static', + 'vr_KSVR_pal_static', + 'vr_GLVR_static', + 'vr_GLVR_pal_static', + 'vr_ZRVR_static', + 'vr_ZRVR_pal_static', + 'vr_DGVR_static', + 'vr_DGVR_pal_static', + 'vr_ALVR_static', + 'vr_ALVR_pal_static', + 'vr_NSVR_static', + 'vr_NSVR_pal_static', + 'vr_LBVR_static', + 'vr_LBVR_pal_static', + 'vr_TTVR_static', + 'vr_TTVR_pal_static', + 'vr_FCVR_static', + 'vr_FCVR_pal_static', + 'elf_message_field', + 'elf_message_ydan', + 'ydan_scene', +'ydan_room_0', +'ydan_room_1', +'ydan_room_2', +'ydan_room_3', +'ydan_room_4', +'ydan_room_5', +'ydan_room_6', +'ydan_room_7', +'ydan_room_8', +'ydan_room_9', +'ydan_room_10', +'ydan_room_11', +'ddan_scene', +'ddan_room_0', +'ddan_room_1', +'ddan_room_2', +'ddan_room_3', +'ddan_room_4', +'ddan_room_5', +'ddan_room_6', +'ddan_room_7', +'ddan_room_8', +'ddan_room_9', +'ddan_room_10', +'ddan_room_11', +'ddan_room_12', +'ddan_room_13', +'ddan_room_14', +'ddan_room_15', +'ddan_room_16', +'bdan_scene', +'bdan_room_0', +'bdan_room_1', +'bdan_room_2', +'bdan_room_3', +'bdan_room_4', +'bdan_room_5', +'bdan_room_6', +'bdan_room_7', +'bdan_room_8', +'bdan_room_9', +'bdan_room_10', +'bdan_room_11', +'bdan_room_12', +'bdan_room_13', +'bdan_room_14', +'bdan_room_15', +'Bmori1_scene', +'Bmori1_room_0', +'Bmori1_room_1', +'Bmori1_room_2', +'Bmori1_room_3', +'Bmori1_room_4', +'Bmori1_room_5', +'Bmori1_room_6', +'Bmori1_room_7', +'Bmori1_room_8', +'Bmori1_room_9', +'Bmori1_room_10', +'Bmori1_room_11', +'Bmori1_room_12', +'Bmori1_room_13', +'Bmori1_room_14', +'Bmori1_room_15', +'Bmori1_room_16', +'Bmori1_room_17', +'Bmori1_room_18', +'Bmori1_room_19', +'Bmori1_room_20', +'Bmori1_room_21', +'Bmori1_room_22', +'HIDAN_scene', +'HIDAN_room_0', +'HIDAN_room_1', +'HIDAN_room_2', +'HIDAN_room_3', +'HIDAN_room_4', +'HIDAN_room_5', +'HIDAN_room_6', +'HIDAN_room_7', +'HIDAN_room_8', +'HIDAN_room_9', +'HIDAN_room_10', +'HIDAN_room_11', +'HIDAN_room_12', +'HIDAN_room_13', +'HIDAN_room_14', +'HIDAN_room_15', +'HIDAN_room_16', +'HIDAN_room_17', +'HIDAN_room_18', +'HIDAN_room_19', +'HIDAN_room_20', +'HIDAN_room_21', +'HIDAN_room_22', +'HIDAN_room_23', +'HIDAN_room_24', +'HIDAN_room_25', +'HIDAN_room_26', +'MIZUsin_scene', +'MIZUsin_room_0', +'MIZUsin_room_1', +'MIZUsin_room_2', +'MIZUsin_room_3', +'MIZUsin_room_4', +'MIZUsin_room_5', +'MIZUsin_room_6', +'MIZUsin_room_7', +'MIZUsin_room_8', +'MIZUsin_room_9', +'MIZUsin_room_10', +'MIZUsin_room_11', +'MIZUsin_room_12', +'MIZUsin_room_13', +'MIZUsin_room_14', +'MIZUsin_room_15', +'MIZUsin_room_16', +'MIZUsin_room_17', +'MIZUsin_room_18', +'MIZUsin_room_19', +'MIZUsin_room_20', +'MIZUsin_room_21', +'MIZUsin_room_22', +'jyasinzou_scene', +'jyasinzou_room_0', +'jyasinzou_room_1', +'jyasinzou_room_2', +'jyasinzou_room_3', +'jyasinzou_room_4', +'jyasinzou_room_5', +'jyasinzou_room_6', +'jyasinzou_room_7', +'jyasinzou_room_8', +'jyasinzou_room_9', +'jyasinzou_room_10', +'jyasinzou_room_11', +'jyasinzou_room_12', +'jyasinzou_room_13', +'jyasinzou_room_14', +'jyasinzou_room_15', +'jyasinzou_room_16', +'jyasinzou_room_17', +'jyasinzou_room_18', +'jyasinzou_room_19', +'jyasinzou_room_20', +'jyasinzou_room_21', +'jyasinzou_room_22', +'jyasinzou_room_23', +'jyasinzou_room_24', +'jyasinzou_room_25', +'jyasinzou_room_26', +'jyasinzou_room_27', +'jyasinzou_room_28', +'HAKAdan_scene', +'HAKAdan_room_0', +'HAKAdan_room_1', +'HAKAdan_room_2', +'HAKAdan_room_3', +'HAKAdan_room_4', +'HAKAdan_room_5', +'HAKAdan_room_6', +'HAKAdan_room_7', +'HAKAdan_room_8', +'HAKAdan_room_9', +'HAKAdan_room_10', +'HAKAdan_room_11', +'HAKAdan_room_12', +'HAKAdan_room_13', +'HAKAdan_room_14', +'HAKAdan_room_15', +'HAKAdan_room_16', +'HAKAdan_room_17', +'HAKAdan_room_18', +'HAKAdan_room_19', +'HAKAdan_room_20', +'HAKAdan_room_21', +'HAKAdan_room_22', +'HAKAdanCH_scene', +'HAKAdanCH_room_0', +'HAKAdanCH_room_1', +'HAKAdanCH_room_2', +'HAKAdanCH_room_3', +'HAKAdanCH_room_4', +'HAKAdanCH_room_5', +'HAKAdanCH_room_6', +'ice_doukutu_scene', +'ice_doukutu_room_0', +'ice_doukutu_room_1', +'ice_doukutu_room_2', +'ice_doukutu_room_3', +'ice_doukutu_room_4', +'ice_doukutu_room_5', +'ice_doukutu_room_6', +'ice_doukutu_room_7', +'ice_doukutu_room_8', +'ice_doukutu_room_9', +'ice_doukutu_room_10', +'ice_doukutu_room_11', +'men_scene', +'men_room_0', +'men_room_1', +'men_room_2', +'men_room_3', +'men_room_4', +'men_room_5', +'men_room_6', +'men_room_7', +'men_room_8', +'men_room_9', +'men_room_10', +'ganontika_scene', +'ganontika_room_0', +'ganontika_room_1', +'ganontika_room_2', +'ganontika_room_3', +'ganontika_room_4', +'ganontika_room_5', +'ganontika_room_6', +'ganontika_room_7', +'ganontika_room_8', +'ganontika_room_9', +'ganontika_room_10', +'ganontika_room_11', +'ganontika_room_12', +'ganontika_room_13', +'ganontika_room_14', +'ganontika_room_15', +'ganontika_room_16', +'ganontika_room_17', +'ganontika_room_18', +'ganontika_room_19', +'spot00_scene', +'spot00_room_0', +'spot01_scene', +'spot01_room_0', +'spot02_scene', +'spot02_room_0', +'spot02_room_1', +'spot03_scene', +'spot03_room_0', +'spot03_room_1', +'spot04_scene', +'spot04_room_0', +'spot04_room_1', +'spot04_room_2', +'spot05_scene', +'spot05_room_0', +'spot06_scene', +'spot06_room_0', +'spot07_scene', +'spot07_room_0', +'spot07_room_1', +'spot08_scene', +'spot08_room_0', +'spot09_scene', +'spot09_room_0', +'spot10_scene', +'spot10_room_0', +'spot10_room_1', +'spot10_room_2', +'spot10_room_3', +'spot10_room_4', +'spot10_room_5', +'spot10_room_6', +'spot10_room_7', +'spot10_room_8', +'spot10_room_9', +'spot11_scene', +'spot11_room_0', +'spot12_scene', +'spot12_room_0', +'spot12_room_1', +'spot13_scene', +'spot13_room_0', +'spot13_room_1', +'spot15_scene', +'spot15_room_0', +'spot16_scene', +'spot16_room_0', +'spot17_scene', +'spot17_room_0', +'spot17_room_1', +'spot18_scene', +'spot18_room_0', +'spot18_room_1', +'spot18_room_2', +'spot18_room_3', +'market_day_scene', +'market_day_room_0', +'market_night_scene', +'market_night_room_0', +'kenjyanoma_scene', +'kenjyanoma_room_0', +'tokinoma_scene', +'tokinoma_room_0', +'tokinoma_room_1', +'link_home_scene', +'link_home_room_0', +'kokiri_shop_scene', +'kokiri_shop_room_0', +'kokiri_home_scene', +'kokiri_home_room_0', +'kakusiana_scene', +'kakusiana_room_0', +'kakusiana_room_1', +'kakusiana_room_2', +'kakusiana_room_3', +'kakusiana_room_4', +'kakusiana_room_5', +'kakusiana_room_6', +'kakusiana_room_7', +'kakusiana_room_8', +'kakusiana_room_9', +'kakusiana_room_10', +'kakusiana_room_11', +'kakusiana_room_12', +'kakusiana_room_13', +'entra_scene', +'entra_room_0', +'moribossroom_scene', +'moribossroom_room_0', +'moribossroom_room_1', +'syatekijyou_scene', +'syatekijyou_room_0', +'shop1_scene', +'shop1_room_0', +'hairal_niwa_scene', +'hairal_niwa_room_0', +'ganon_tou_scene', +'ganon_tou_room_0', +'market_alley_scene', +'market_alley_room_0', +'spot20_scene', +'spot20_room_0', +'market_ruins_scene', +'market_ruins_room_0', +'entra_n_scene', +'entra_n_room_0', +'enrui_scene', +'enrui_room_0', +'market_alley_n_scene', +'market_alley_n_room_0', +'hiral_demo_scene', +'hiral_demo_room_0', +'kokiri_home3_scene', +'kokiri_home3_room_0', +'malon_stable_scene', +'malon_stable_room_0', +'kakariko_scene', +'kakariko_room_0', +'bdan_boss_scene', +'bdan_boss_room_0', +'bdan_boss_room_1', +'FIRE_bs_scene', +'FIRE_bs_room_0', +'FIRE_bs_room_1', +'hut_scene', +'hut_room_0', +'daiyousei_izumi_scene', +'daiyousei_izumi_room_0', +'hakaana_scene', +'hakaana_room_0', +'yousei_izumi_tate_scene', +'yousei_izumi_tate_room_0', +'yousei_izumi_yoko_scene', +'yousei_izumi_yoko_room_0', +'golon_scene', +'golon_room_0', +'zoora_scene', +'zoora_room_0', +'drag_scene', +'drag_room_0', +'alley_shop_scene', +'alley_shop_room_0', +'night_shop_scene', +'night_shop_room_0', +'impa_scene', +'impa_room_0', +'labo_scene', +'labo_room_0', +'tent_scene', +'tent_room_0', +'nakaniwa_scene', +'nakaniwa_room_0', +'ddan_boss_scene', +'ddan_boss_room_0', +'ddan_boss_room_1', +'ydan_boss_scene', +'ydan_boss_room_0', +'ydan_boss_room_1', +'HAKAdan_bs_scene', +'HAKAdan_bs_room_0', +'HAKAdan_bs_room_1', +'MIZUsin_bs_scene', +'MIZUsin_bs_room_0', +'MIZUsin_bs_room_1', +'ganon_scene', +'ganon_room_0', +'ganon_room_1', +'ganon_room_2', +'ganon_room_3', +'ganon_room_4', +'ganon_room_5', +'ganon_room_6', +'ganon_room_7', +'ganon_room_8', +'ganon_room_9', +'ganon_boss_scene', +'ganon_boss_room_0', +'jyasinboss_scene', +'jyasinboss_room_0', +'jyasinboss_room_1', +'jyasinboss_room_2', +'jyasinboss_room_3', +'kokiri_home4_scene', +'kokiri_home4_room_0', +'kokiri_home5_scene', +'kokiri_home5_room_0', +'ganon_final_scene', +'ganon_final_room_0', +'kakariko3_scene', +'kakariko3_room_0', +'hakasitarelay_scene', +'hakasitarelay_room_0', +'hakasitarelay_room_1', +'hakasitarelay_room_2', +'hakasitarelay_room_3', +'hakasitarelay_room_4', +'hakasitarelay_room_5', +'hakasitarelay_room_6', +'shrine_scene', +'shrine_room_0', +'turibori_scene', +'turibori_room_0', +'shrine_n_scene', +'shrine_n_room_0', +'shrine_r_scene', +'shrine_r_room_0', +'hakaana2_scene', +'hakaana2_room_0', +'gerudoway_scene', +'gerudoway_room_0', +'gerudoway_room_1', +'gerudoway_room_2', +'gerudoway_room_3', +'gerudoway_room_4', +'gerudoway_room_5', +'hairal_niwa_n_scene', +'hairal_niwa_n_room_0', +'bowling_scene', +'bowling_room_0', +'hakaana_ouke_scene', +'hakaana_ouke_room_0', +'hakaana_ouke_room_1', +'hakaana_ouke_room_2', +'hylia_labo_scene', +'hylia_labo_room_0', +'souko_scene', +'souko_room_0', +'souko_room_1', +'souko_room_2', +'miharigoya_scene', +'miharigoya_room_0', +'mahouya_scene', +'mahouya_room_0', +'takaraya_scene', +'takaraya_room_0', +'takaraya_room_1', +'takaraya_room_2', +'takaraya_room_3', +'takaraya_room_4', +'takaraya_room_5', +'takaraya_room_6', +'ganon_sonogo_scene', +'ganon_sonogo_room_0', +'ganon_sonogo_room_1', +'ganon_sonogo_room_2', +'ganon_sonogo_room_3', +'ganon_sonogo_room_4', +'ganon_demo_scene', +'ganon_demo_room_0', +'face_shop_scene', +'face_shop_room_0', +'kinsuta_scene', +'kinsuta_room_0', +'ganontikasonogo_scene', +'ganontikasonogo_room_0', +'ganontikasonogo_room_1', + 'bump_texture_static', + 'anime_model_1_static', + 'anime_model_2_static', + 'anime_model_3_static', + 'anime_model_4_static', + 'anime_model_5_static', + 'anime_model_6_static', + 'anime_texture_1_static', + 'anime_texture_2_static', + 'anime_texture_3_static', + 'anime_texture_4_static', + 'anime_texture_5_static', + 'anime_texture_6_static', + 'softsprite_matrix_static', +] + +romData = None + + +def initialize_worker(rom_data): + global romData + romData = rom_data + +def read_uint32_be(offset): + return struct.unpack('>I', romData[offset:offset+4])[0] + +def write_output_file(name, offset, size): + try: + with open(name, 'wb') as f: + f.write(romData[offset:offset+size]) + except IOError: + print('failed to write file ' + name) + +def ExtractFunc(i): + filename = 'baserom/' + FILE_NAMES[i] + entryOffset = FILE_TABLE_OFFSET + 16 * i + + virtStart = read_uint32_be(entryOffset + 0) + virtEnd = read_uint32_be(entryOffset + 4) + physStart = read_uint32_be(entryOffset + 8) + physEnd = read_uint32_be(entryOffset + 12) + + if physEnd == 0: # uncompressed + compressed = False + size = virtEnd - virtStart + else: # compressed + compressed = True + size = physEnd - physStart + + print('extracting ' + filename + " (0x%08X, 0x%08X)" % (virtStart, virtEnd)) + write_output_file(filename, physStart, size) + if compressed: + os.system('tools/yaz0 -d ' + filename + ' ' + filename) + +##################################################################### + +def main(): + try: + os.mkdir('baserom') + except: + pass + + # read baserom data + try: + with open(ROM_FILE_NAME, 'rb') as f: + rom_data = f.read() + except IOError: + print('failed to read ' + ROM_FILE_NAME) + sys.exit(1) + + # extract files + num_cores = cpu_count() + print("Extracting baserom with " + str(num_cores) + " CPU cores.") + with Pool(num_cores, initialize_worker, (rom_data,)) as p: + p.map(ExtractFunc, range(len(FILE_NAMES))) + +if __name__ == "__main__": + main() diff --git a/OTRGui/assets/extractor/Config.xml b/OTRGui/assets/extractor/Config_GC_MQ_D.xml similarity index 83% rename from OTRGui/assets/extractor/Config.xml rename to OTRGui/assets/extractor/Config_GC_MQ_D.xml index 6e86fa8d8..51e536292 100644 --- a/OTRGui/assets/extractor/Config.xml +++ b/OTRGui/assets/extractor/Config_GC_MQ_D.xml @@ -2,7 +2,7 @@ - + diff --git a/OTRGui/assets/extractor/Config_GC_NMQ_D.xml b/OTRGui/assets/extractor/Config_GC_NMQ_D.xml new file mode 100644 index 000000000..7cc11ac18 --- /dev/null +++ b/OTRGui/assets/extractor/Config_GC_NMQ_D.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/OTRGui/assets/extractor/Config_GC_NMQ_PAL_F.xml b/OTRGui/assets/extractor/Config_GC_NMQ_PAL_F.xml new file mode 100644 index 000000000..b98acfb00 --- /dev/null +++ b/OTRGui/assets/extractor/Config_GC_NMQ_PAL_F.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/OTRGui/assets/extractor/filelists/gamecube_pal.txt b/OTRGui/assets/extractor/filelists/gamecube_pal.txt new file mode 100644 index 000000000..c9746c1da --- /dev/null +++ b/OTRGui/assets/extractor/filelists/gamecube_pal.txt @@ -0,0 +1,1510 @@ +makerom +boot +dmadata +Audiobank +Audioseq +Audiotable +link_animetion +icon_item_static +icon_item_24_static +icon_item_field_static +icon_item_dungeon_static +icon_item_gameover_static +icon_item_nes_static +icon_item_ger_static +icon_item_fra_static +item_name_static +map_name_static +do_action_static +message_static +message_texture_static +nes_font_static +nes_message_data_static +ger_message_data_static +fra_message_data_static +staff_message_data_static +map_grand_static +map_48x85_static +map_i_static +code +ovl_title +ovl_select +ovl_opening +ovl_file_choose +ovl_kaleido_scope +ovl_player_actor +ovl_map_mark_data +ovl_En_Test +ovl_Arms_Hook +ovl_Arrow_Fire +ovl_Arrow_Ice +ovl_Arrow_Light +ovl_Bg_Bdan_Objects +ovl_Bg_Bdan_Switch +ovl_Bg_Bom_Guard +ovl_Bg_Bombwall +ovl_Bg_Bowl_Wall +ovl_Bg_Breakwall +ovl_Bg_Ddan_Jd +ovl_Bg_Ddan_Kd +ovl_Bg_Dodoago +ovl_Bg_Dy_Yoseizo +ovl_Bg_Ganon_Otyuka +ovl_Bg_Gate_Shutter +ovl_Bg_Gjyo_Bridge +ovl_Bg_Gnd_Darkmeiro +ovl_Bg_Gnd_Firemeiro +ovl_Bg_Gnd_Iceblock +ovl_Bg_Gnd_Nisekabe +ovl_Bg_Gnd_Soulmeiro +ovl_Bg_Haka +ovl_Bg_Haka_Gate +ovl_Bg_Haka_Huta +ovl_Bg_Haka_Megane +ovl_Bg_Haka_MeganeBG +ovl_Bg_Haka_Sgami +ovl_Bg_Haka_Ship +ovl_Bg_Haka_Trap +ovl_Bg_Haka_Tubo +ovl_Bg_Haka_Water +ovl_Bg_Haka_Zou +ovl_Bg_Heavy_Block +ovl_Bg_Hidan_Curtain +ovl_Bg_Hidan_Dalm +ovl_Bg_Hidan_Firewall +ovl_Bg_Hidan_Fslift +ovl_Bg_Hidan_Fwbig +ovl_Bg_Hidan_Hamstep +ovl_Bg_Hidan_Hrock +ovl_Bg_Hidan_Kousi +ovl_Bg_Hidan_Kowarerukabe +ovl_Bg_Hidan_Rock +ovl_Bg_Hidan_Rsekizou +ovl_Bg_Hidan_Sekizou +ovl_Bg_Hidan_Sima +ovl_Bg_Hidan_Syoku +ovl_Bg_Ice_Objects +ovl_Bg_Ice_Shelter +ovl_Bg_Ice_Shutter +ovl_Bg_Ice_Turara +ovl_Bg_Ingate +ovl_Bg_Jya_1flift +ovl_Bg_Jya_Amishutter +ovl_Bg_Jya_Bigmirror +ovl_Bg_Jya_Block +ovl_Bg_Jya_Bombchuiwa +ovl_Bg_Jya_Bombiwa +ovl_Bg_Jya_Cobra +ovl_Bg_Jya_Goroiwa +ovl_Bg_Jya_Haheniron +ovl_Bg_Jya_Ironobj +ovl_Bg_Jya_Kanaami +ovl_Bg_Jya_Lift +ovl_Bg_Jya_Megami +ovl_Bg_Jya_Zurerukabe +ovl_Bg_Menkuri_Eye +ovl_Bg_Menkuri_Kaiten +ovl_Bg_Menkuri_Nisekabe +ovl_Bg_Mizu_Bwall +ovl_Bg_Mizu_Movebg +ovl_Bg_Mizu_Shutter +ovl_Bg_Mizu_Uzu +ovl_Bg_Mizu_Water +ovl_Bg_Mjin +ovl_Bg_Mori_Bigst +ovl_Bg_Mori_Elevator +ovl_Bg_Mori_Hashigo +ovl_Bg_Mori_Hashira4 +ovl_Bg_Mori_Hineri +ovl_Bg_Mori_Idomizu +ovl_Bg_Mori_Kaitenkabe +ovl_Bg_Mori_Rakkatenjo +ovl_Bg_Po_Event +ovl_Bg_Po_Syokudai +ovl_Bg_Pushbox +ovl_Bg_Relay_Objects +ovl_Bg_Spot00_Break +ovl_Bg_Spot00_Hanebasi +ovl_Bg_Spot01_Fusya +ovl_Bg_Spot01_Idohashira +ovl_Bg_Spot01_Idomizu +ovl_Bg_Spot01_Idosoko +ovl_Bg_Spot01_Objects2 +ovl_Bg_Spot02_Objects +ovl_Bg_Spot03_Taki +ovl_Bg_Spot05_Soko +ovl_Bg_Spot06_Objects +ovl_Bg_Spot07_Taki +ovl_Bg_Spot08_Bakudankabe +ovl_Bg_Spot08_Iceblock +ovl_Bg_Spot09_Obj +ovl_Bg_Spot11_Bakudankabe +ovl_Bg_Spot11_Oasis +ovl_Bg_Spot12_Gate +ovl_Bg_Spot12_Saku +ovl_Bg_Spot15_Rrbox +ovl_Bg_Spot15_Saku +ovl_Bg_Spot16_Bombstone +ovl_Bg_Spot16_Doughnut +ovl_Bg_Spot17_Bakudankabe +ovl_Bg_Spot17_Funen +ovl_Bg_Spot18_Basket +ovl_Bg_Spot18_Futa +ovl_Bg_Spot18_Obj +ovl_Bg_Spot18_Shutter +ovl_Bg_Sst_Floor +ovl_Bg_Toki_Hikari +ovl_Bg_Toki_Swd +ovl_Bg_Treemouth +ovl_Bg_Umajump +ovl_Bg_Vb_Sima +ovl_Bg_Ydan_Hasi +ovl_Bg_Ydan_Maruta +ovl_Bg_Ydan_Sp +ovl_Bg_Zg +ovl_Boss_Dodongo +ovl_Boss_Fd +ovl_Boss_Fd2 +ovl_Boss_Ganon +ovl_Boss_Ganon2 +ovl_Boss_Ganondrof +ovl_Boss_Goma +ovl_Boss_Mo +ovl_Boss_Sst +ovl_Boss_Tw +ovl_Boss_Va +ovl_Demo_6K +ovl_Demo_Du +ovl_Demo_Ec +ovl_Demo_Effect +ovl_Demo_Ext +ovl_Demo_Geff +ovl_Demo_Gj +ovl_Demo_Go +ovl_Demo_Gt +ovl_Demo_Ik +ovl_Demo_Im +ovl_Demo_Kankyo +ovl_Demo_Kekkai +ovl_Demo_Sa +ovl_Demo_Shd +ovl_Demo_Tre_Lgt +ovl_Door_Ana +ovl_Door_Gerudo +ovl_Door_Killer +ovl_Door_Shutter +ovl_Door_Toki +ovl_Door_Warp1 +ovl_Efc_Erupc +ovl_Eff_Dust +ovl_Effect_Ss_Blast +ovl_Effect_Ss_Bomb +ovl_Effect_Ss_Bomb2 +ovl_Effect_Ss_Bubble +ovl_Effect_Ss_D_Fire +ovl_Effect_Ss_Dead_Db +ovl_Effect_Ss_Dead_Dd +ovl_Effect_Ss_Dead_Ds +ovl_Effect_Ss_Dead_Sound +ovl_Effect_Ss_Dt_Bubble +ovl_Effect_Ss_Dust +ovl_Effect_Ss_En_Fire +ovl_Effect_Ss_En_Ice +ovl_Effect_Ss_Extra +ovl_Effect_Ss_Fcircle +ovl_Effect_Ss_Fhg_Flash +ovl_Effect_Ss_Fire_Tail +ovl_Effect_Ss_G_Fire +ovl_Effect_Ss_G_Magma +ovl_Effect_Ss_G_Magma2 +ovl_Effect_Ss_G_Ripple +ovl_Effect_Ss_G_Spk +ovl_Effect_Ss_G_Splash +ovl_Effect_Ss_Hahen +ovl_Effect_Ss_HitMark +ovl_Effect_Ss_Ice_Piece +ovl_Effect_Ss_Ice_Smoke +ovl_Effect_Ss_K_Fire +ovl_Effect_Ss_Kakera +ovl_Effect_Ss_KiraKira +ovl_Effect_Ss_Lightning +ovl_Effect_Ss_Sibuki +ovl_Effect_Ss_Sibuki2 +ovl_Effect_Ss_Solder_Srch_Ball +ovl_Effect_Ss_Stick +ovl_Effect_Ss_Stone1 +ovl_Elf_Msg +ovl_Elf_Msg2 +ovl_En_Am +ovl_En_Ani +ovl_En_Anubice +ovl_En_Anubice_Fire +ovl_En_Anubice_Tag +ovl_En_Arow_Trap +ovl_En_Arrow +ovl_En_Attack_Niw +ovl_En_Ba +ovl_En_Bb +ovl_En_Bdfire +ovl_En_Bigokuta +ovl_En_Bili +ovl_En_Bird +ovl_En_Blkobj +ovl_En_Bom +ovl_En_Bom_Bowl_Man +ovl_En_Bom_Bowl_Pit +ovl_En_Bom_Chu +ovl_En_Bombf +ovl_En_Boom +ovl_En_Box +ovl_En_Brob +ovl_En_Bubble +ovl_En_Butte +ovl_En_Bw +ovl_En_Bx +ovl_En_Changer +ovl_En_Clear_Tag +ovl_En_Cow +ovl_En_Crow +ovl_En_Cs +ovl_En_Daiku +ovl_En_Daiku_Kakariko +ovl_En_Dekubaba +ovl_En_Dekunuts +ovl_En_Dh +ovl_En_Dha +ovl_En_Diving_Game +ovl_En_Dns +ovl_En_Dnt_Demo +ovl_En_Dnt_Jiji +ovl_En_Dnt_Nomal +ovl_En_Dodojr +ovl_En_Dodongo +ovl_En_Dog +ovl_En_Door +ovl_En_Ds +ovl_En_Du +ovl_En_Dy_Extra +ovl_En_Eg +ovl_En_Eiyer +ovl_En_Elf +ovl_En_Encount1 +ovl_En_Encount2 +ovl_En_Ex_Item +ovl_En_Ex_Ruppy +ovl_En_Fd +ovl_En_Fd_Fire +ovl_En_Fhg_Fire +ovl_En_Fire_Rock +ovl_En_Firefly +ovl_En_Fish +ovl_En_Floormas +ovl_En_Fr +ovl_En_Fu +ovl_En_Fw +ovl_En_Fz +ovl_En_G_Switch +ovl_En_Ganon_Mant +ovl_En_Ganon_Organ +ovl_En_Gb +ovl_En_Ge1 +ovl_En_Ge2 +ovl_En_Ge3 +ovl_En_GeldB +ovl_En_GirlA +ovl_En_Gm +ovl_En_Go +ovl_En_Go2 +ovl_En_Goma +ovl_En_Goroiwa +ovl_En_Gs +ovl_En_Guest +ovl_En_Hata +ovl_En_Heishi1 +ovl_En_Heishi2 +ovl_En_Heishi3 +ovl_En_Heishi4 +ovl_En_Hintnuts +ovl_En_Holl +ovl_En_Honotrap +ovl_En_Horse +ovl_En_Horse_Game_Check +ovl_En_Horse_Ganon +ovl_En_Horse_Link_Child +ovl_En_Horse_Normal +ovl_En_Horse_Zelda +ovl_En_Hs +ovl_En_Hs2 +ovl_En_Hy +ovl_En_Ice_Hono +ovl_En_Ik +ovl_En_In +ovl_En_Insect +ovl_En_Ishi +ovl_En_It +ovl_En_Jj +ovl_En_Js +ovl_En_Jsjutan +ovl_En_Kakasi +ovl_En_Kakasi2 +ovl_En_Kakasi3 +ovl_En_Kanban +ovl_En_Karebaba +ovl_En_Ko +ovl_En_Kusa +ovl_En_Kz +ovl_En_Light +ovl_En_Lightbox +ovl_En_M_Fire1 +ovl_En_M_Thunder +ovl_En_Ma1 +ovl_En_Ma2 +ovl_En_Ma3 +ovl_En_Mag +ovl_En_Mb +ovl_En_Md +ovl_En_Mk +ovl_En_Mm +ovl_En_Mm2 +ovl_En_Ms +ovl_En_Mu +ovl_En_Nb +ovl_En_Niw +ovl_En_Niw_Girl +ovl_En_Niw_Lady +ovl_En_Nutsball +ovl_En_Nwc +ovl_En_Ny +ovl_En_OE2 +ovl_En_Okarina_Effect +ovl_En_Okarina_Tag +ovl_En_Okuta +ovl_En_Ossan +ovl_En_Owl +ovl_En_Part +ovl_En_Peehat +ovl_En_Po_Desert +ovl_En_Po_Field +ovl_En_Po_Relay +ovl_En_Po_Sisters +ovl_En_Poh +ovl_En_Pu_box +ovl_En_Rd +ovl_En_Reeba +ovl_En_River_Sound +ovl_En_Rl +ovl_En_Rr +ovl_En_Ru1 +ovl_En_Ru2 +ovl_En_Sa +ovl_En_Sb +ovl_En_Scene_Change +ovl_En_Sda +ovl_En_Shopnuts +ovl_En_Si +ovl_En_Siofuki +ovl_En_Skb +ovl_En_Skj +ovl_En_Skjneedle +ovl_En_Ssh +ovl_En_St +ovl_En_Sth +ovl_En_Stream +ovl_En_Sw +ovl_En_Syateki_Itm +ovl_En_Syateki_Man +ovl_En_Syateki_Niw +ovl_En_Ta +ovl_En_Takara_Man +ovl_En_Tana +ovl_En_Tg +ovl_En_Tite +ovl_En_Tk +ovl_En_Torch +ovl_En_Torch2 +ovl_En_Toryo +ovl_En_Tp +ovl_En_Tr +ovl_En_Trap +ovl_En_Tubo_Trap +ovl_En_Vali +ovl_En_Vase +ovl_En_Vb_Ball +ovl_En_Viewer +ovl_En_Vm +ovl_En_Wall_Tubo +ovl_En_Wallmas +ovl_En_Weather_Tag +ovl_En_Weiyer +ovl_En_Wf +ovl_En_Wonder_Item +ovl_En_Wonder_Talk +ovl_En_Wonder_Talk2 +ovl_En_Wood02 +ovl_En_Xc +ovl_En_Yabusame_Mark +ovl_En_Yukabyun +ovl_En_Zf +ovl_En_Zl1 +ovl_En_Zl2 +ovl_En_Zl3 +ovl_En_Zl4 +ovl_En_Zo +ovl_En_fHG +ovl_End_Title +ovl_Fishing +ovl_Item_B_Heart +ovl_Item_Etcetera +ovl_Item_Inbox +ovl_Item_Ocarina +ovl_Item_Shield +ovl_Magic_Dark +ovl_Magic_Fire +ovl_Magic_Wind +ovl_Mir_Ray +ovl_Obj_Bean +ovl_Obj_Blockstop +ovl_Obj_Bombiwa +ovl_Obj_Comb +ovl_Obj_Dekujr +ovl_Obj_Elevator +ovl_Obj_Hamishi +ovl_Obj_Hana +ovl_Obj_Hsblock +ovl_Obj_Ice_Poly +ovl_Obj_Kibako +ovl_Obj_Kibako2 +ovl_Obj_Lift +ovl_Obj_Lightswitch +ovl_Obj_Makekinsuta +ovl_Obj_Makeoshihiki +ovl_Obj_Mure +ovl_Obj_Mure2 +ovl_Obj_Mure3 +ovl_Obj_Oshihiki +ovl_Obj_Roomtimer +ovl_Obj_Switch +ovl_Obj_Syokudai +ovl_Obj_Timeblock +ovl_Obj_Tsubo +ovl_Obj_Warp2block +ovl_Object_Kankyo +ovl_Oceff_Spot +ovl_Oceff_Storm +ovl_Oceff_Wipe +ovl_Oceff_Wipe2 +ovl_Oceff_Wipe3 +ovl_Oceff_Wipe4 +ovl_Shot_Sun +gameplay_keep +gameplay_field_keep +gameplay_dangeon_keep +gameplay_object_exchange_static +object_link_boy +object_link_child +object_box +object_human +object_okuta +object_poh +object_wallmaster +object_dy_obj +object_firefly +object_dodongo +object_fire +object_niw +object_tite +object_reeba +object_peehat +object_kingdodongo +object_horse +object_zf +object_goma +object_zl1 +object_gol +object_bubble +object_dodojr +object_torch2 +object_bl +object_tp +object_oA1 +object_st +object_bw +object_ei +object_horse_normal +object_oB1 +object_o_anime +object_spot04_objects +object_ddan_objects +object_hidan_objects +object_horse_ganon +object_oA2 +object_spot00_objects +object_mb +object_bombf +object_sk2 +object_oE1 +object_oE_anime +object_oE2 +object_ydan_objects +object_gnd +object_am +object_dekubaba +object_oA3 +object_oA4 +object_oA5 +object_oA6 +object_oA7 +object_jj +object_oA8 +object_oA9 +object_oB2 +object_oB3 +object_oB4 +object_horse_zelda +object_opening_demo1 +object_warp1 +object_b_heart +object_dekunuts +object_oE3 +object_oE4 +object_menkuri_objects +object_oE5 +object_oE6 +object_oE7 +object_oE8 +object_oE9 +object_oE10 +object_oE11 +object_oE12 +object_vali +object_oA10 +object_oA11 +object_mizu_objects +object_fhg +object_ossan +object_mori_hineri1 +object_Bb +object_toki_objects +object_yukabyun +object_zl2 +object_mjin +object_mjin_flash +object_mjin_dark +object_mjin_flame +object_mjin_ice +object_mjin_soul +object_mjin_wind +object_mjin_oka +object_haka_objects +object_spot06_objects +object_ice_objects +object_relay_objects +object_mori_hineri1a +object_mori_hineri2 +object_mori_hineri2a +object_mori_objects +object_mori_tex +object_spot08_obj +object_warp2 +object_hata +object_bird +object_wood02 +object_lightbox +object_pu_box +object_trap +object_vase +object_im +object_ta +object_tk +object_xc +object_vm +object_bv +object_hakach_objects +object_efc_crystal_light +object_efc_fire_ball +object_efc_flash +object_efc_lgt_shower +object_efc_star_field +object_god_lgt +object_light_ring +object_triforce_spot +object_medal +object_bdan_objects +object_sd +object_rd +object_po_sisters +object_heavy_object +object_gndd +object_fd +object_du +object_fw +object_horse_link_child +object_spot02_objects +object_haka +object_ru1 +object_syokudai +object_fd2 +object_dh +object_rl +object_efc_tw +object_demo_tre_lgt +object_gi_key +object_mir_ray +object_brob +object_gi_jewel +object_spot09_obj +object_spot18_obj +object_bdoor +object_spot17_obj +object_shop_dungen +object_nb +object_mo +object_sb +object_gi_melody +object_gi_heart +object_gi_compass +object_gi_bosskey +object_gi_medal +object_gi_nuts +object_sa +object_gi_hearts +object_gi_arrowcase +object_gi_bombpouch +object_in +object_tr +object_spot16_obj +object_oE1s +object_oE4s +object_os_anime +object_gi_bottle +object_gi_stick +object_gi_map +object_oF1d_map +object_ru2 +object_gi_shield_1 +object_dekujr +object_gi_magicpot +object_gi_bomb_1 +object_oF1s +object_ma2 +object_gi_purse +object_hni +object_tw +object_rr +object_bxa +object_anubice +object_gi_gerudo +object_gi_arrow +object_gi_bomb_2 +object_gi_egg +object_gi_scale +object_gi_shield_2 +object_gi_hookshot +object_gi_ocarina +object_gi_milk +object_ma1 +object_ganon +object_sst +object_ny +object_fr +object_gi_pachinko +object_gi_boomerang +object_gi_bow +object_gi_glasses +object_gi_liquid +object_ani +object_demo_6k +object_gi_shield_3 +object_gi_letter +object_spot15_obj +object_jya_obj +object_gi_clothes +object_gi_bean +object_gi_fish +object_gi_saw +object_gi_hammer +object_gi_grass +object_gi_longsword +object_spot01_objects +object_md +object_km1 +object_kw1 +object_zo +object_kz +object_umajump +object_masterkokiri +object_masterkokirihead +object_mastergolon +object_masterzoora +object_aob +object_ik +object_ahg +object_cne +object_gi_niwatori +object_skj +object_gi_bottle_letter +object_bji +object_bba +object_gi_ocarina_0 +object_ds +object_ane +object_boj +object_spot03_object +object_spot07_object +object_fz +object_bob +object_ge1 +object_yabusame_point +object_gi_boots_2 +object_gi_seed +object_gnd_magic +object_d_elevator +object_d_hsblock +object_d_lift +object_mamenoki +object_goroiwa +object_toryo +object_daiku +object_nwc +object_blkobj +object_gm +object_ms +object_hs +object_ingate +object_lightswitch +object_kusa +object_tsubo +object_gi_gloves +object_gi_coin +object_kanban +object_gjyo_objects +object_owl +object_mk +object_fu +object_gi_ki_tan_mask +object_gi_redead_mask +object_gi_skj_mask +object_gi_rabit_mask +object_gi_truth_mask +object_ganon_objects +object_siofuki +object_stream +object_mm +object_fa +object_os +object_gi_eye_lotion +object_gi_powder +object_gi_mushroom +object_gi_ticketstone +object_gi_brokensword +object_js +object_cs +object_gi_prescription +object_gi_bracelet +object_gi_soldout +object_gi_frog +object_mag +object_door_gerudo +object_gt +object_efc_erupc +object_zl2_anime1 +object_zl2_anime2 +object_gi_golonmask +object_gi_zoramask +object_gi_gerudomask +object_ganon2 +object_ka +object_ts +object_zg +object_gi_hoverboots +object_gi_m_arrow +object_ds2 +object_ec +object_fish +object_gi_sutaru +object_gi_goddess +object_ssh +object_bigokuta +object_bg +object_spot05_objects +object_spot12_obj +object_bombiwa +object_hintnuts +object_rs +object_spot00_break +object_gla +object_shopnuts +object_geldb +object_gr +object_dog +object_jya_iron +object_jya_door +object_spot01_objects2 +object_spot11_obj +object_kibako2 +object_dns +object_dnk +object_gi_fire +object_gi_insect +object_gi_butterfly +object_gi_ghost +object_gi_soul +object_bowl +object_po_field +object_demo_kekkai +object_efc_doughnut +object_gi_dekupouch +object_ganon_anime1 +object_ganon_anime2 +object_ganon_anime3 +object_gi_rupy +object_spot01_matoya +object_spot01_matoyab +object_po_composer +object_mu +object_wf +object_skb +object_gj +object_geff +object_haka_door +object_gs +object_ps +object_bwall +object_crow +object_cow +object_cob +object_gi_sword_1 +object_door_killer +object_ouke_haka +object_timeblock +object_zl4 +g_pn_01 +g_pn_02 +g_pn_03 +g_pn_04 +g_pn_05 +g_pn_06 +g_pn_07 +g_pn_08 +g_pn_09 +g_pn_10 +g_pn_11 +g_pn_12 +g_pn_13 +g_pn_14 +g_pn_15 +g_pn_16 +g_pn_17 +g_pn_18 +g_pn_19 +g_pn_20 +g_pn_21 +g_pn_22 +g_pn_23 +g_pn_24 +g_pn_25 +g_pn_26 +g_pn_27 +g_pn_28 +g_pn_29 +g_pn_30 +g_pn_31 +g_pn_32 +g_pn_33 +g_pn_34 +g_pn_35 +g_pn_36 +g_pn_37 +g_pn_38 +g_pn_39 +g_pn_40 +g_pn_41 +g_pn_42 +g_pn_43 +g_pn_44 +g_pn_45 +g_pn_46 +g_pn_47 +g_pn_48 +g_pn_49 +g_pn_50 +g_pn_51 +g_pn_52 +g_pn_53 +g_pn_54 +g_pn_55 +g_pn_56 +g_pn_57 +z_select_static +nintendo_rogo_static +title_static +parameter_static +vr_fine0_static +vr_fine0_pal_static +vr_fine1_static +vr_fine1_pal_static +vr_fine2_static +vr_fine2_pal_static +vr_fine3_static +vr_fine3_pal_static +vr_cloud0_static +vr_cloud0_pal_static +vr_cloud1_static +vr_cloud1_pal_static +vr_cloud2_static +vr_cloud2_pal_static +vr_cloud3_static +vr_cloud3_pal_static +vr_holy0_static +vr_holy0_pal_static +vr_holy1_static +vr_holy1_pal_static +vr_MDVR_static +vr_MDVR_pal_static +vr_MNVR_static +vr_MNVR_pal_static +vr_RUVR_static +vr_RUVR_pal_static +vr_LHVR_static +vr_LHVR_pal_static +vr_KHVR_static +vr_KHVR_pal_static +vr_K3VR_static +vr_K3VR_pal_static +vr_K4VR_static +vr_K4VR_pal_static +vr_K5VR_static +vr_K5VR_pal_static +vr_SP1a_static +vr_SP1a_pal_static +vr_MLVR_static +vr_MLVR_pal_static +vr_KKRVR_static +vr_KKRVR_pal_static +vr_KR3VR_static +vr_KR3VR_pal_static +vr_IPVR_static +vr_IPVR_pal_static +vr_KSVR_static +vr_KSVR_pal_static +vr_GLVR_static +vr_GLVR_pal_static +vr_ZRVR_static +vr_ZRVR_pal_static +vr_DGVR_static +vr_DGVR_pal_static +vr_ALVR_static +vr_ALVR_pal_static +vr_NSVR_static +vr_NSVR_pal_static +vr_LBVR_static +vr_LBVR_pal_static +vr_TTVR_static +vr_TTVR_pal_static +vr_FCVR_static +vr_FCVR_pal_static +elf_message_field +elf_message_ydan +ydan_scene +ydan_room_0 +ydan_room_1 +ydan_room_2 +ydan_room_3 +ydan_room_4 +ydan_room_5 +ydan_room_6 +ydan_room_7 +ydan_room_8 +ydan_room_9 +ydan_room_10 +ydan_room_11 +ddan_scene +ddan_room_0 +ddan_room_1 +ddan_room_2 +ddan_room_3 +ddan_room_4 +ddan_room_5 +ddan_room_6 +ddan_room_7 +ddan_room_8 +ddan_room_9 +ddan_room_10 +ddan_room_11 +ddan_room_12 +ddan_room_13 +ddan_room_14 +ddan_room_15 +ddan_room_16 +bdan_scene +bdan_room_0 +bdan_room_1 +bdan_room_2 +bdan_room_3 +bdan_room_4 +bdan_room_5 +bdan_room_6 +bdan_room_7 +bdan_room_8 +bdan_room_9 +bdan_room_10 +bdan_room_11 +bdan_room_12 +bdan_room_13 +bdan_room_14 +bdan_room_15 +Bmori1_scene +Bmori1_room_0 +Bmori1_room_1 +Bmori1_room_2 +Bmori1_room_3 +Bmori1_room_4 +Bmori1_room_5 +Bmori1_room_6 +Bmori1_room_7 +Bmori1_room_8 +Bmori1_room_9 +Bmori1_room_10 +Bmori1_room_11 +Bmori1_room_12 +Bmori1_room_13 +Bmori1_room_14 +Bmori1_room_15 +Bmori1_room_16 +Bmori1_room_17 +Bmori1_room_18 +Bmori1_room_19 +Bmori1_room_20 +Bmori1_room_21 +Bmori1_room_22 +HIDAN_scene +HIDAN_room_0 +HIDAN_room_1 +HIDAN_room_2 +HIDAN_room_3 +HIDAN_room_4 +HIDAN_room_5 +HIDAN_room_6 +HIDAN_room_7 +HIDAN_room_8 +HIDAN_room_9 +HIDAN_room_10 +HIDAN_room_11 +HIDAN_room_12 +HIDAN_room_13 +HIDAN_room_14 +HIDAN_room_15 +HIDAN_room_16 +HIDAN_room_17 +HIDAN_room_18 +HIDAN_room_19 +HIDAN_room_20 +HIDAN_room_21 +HIDAN_room_22 +HIDAN_room_23 +HIDAN_room_24 +HIDAN_room_25 +HIDAN_room_26 +MIZUsin_scene +MIZUsin_room_0 +MIZUsin_room_1 +MIZUsin_room_2 +MIZUsin_room_3 +MIZUsin_room_4 +MIZUsin_room_5 +MIZUsin_room_6 +MIZUsin_room_7 +MIZUsin_room_8 +MIZUsin_room_9 +MIZUsin_room_10 +MIZUsin_room_11 +MIZUsin_room_12 +MIZUsin_room_13 +MIZUsin_room_14 +MIZUsin_room_15 +MIZUsin_room_16 +MIZUsin_room_17 +MIZUsin_room_18 +MIZUsin_room_19 +MIZUsin_room_20 +MIZUsin_room_21 +MIZUsin_room_22 +jyasinzou_scene +jyasinzou_room_0 +jyasinzou_room_1 +jyasinzou_room_2 +jyasinzou_room_3 +jyasinzou_room_4 +jyasinzou_room_5 +jyasinzou_room_6 +jyasinzou_room_7 +jyasinzou_room_8 +jyasinzou_room_9 +jyasinzou_room_10 +jyasinzou_room_11 +jyasinzou_room_12 +jyasinzou_room_13 +jyasinzou_room_14 +jyasinzou_room_15 +jyasinzou_room_16 +jyasinzou_room_17 +jyasinzou_room_18 +jyasinzou_room_19 +jyasinzou_room_20 +jyasinzou_room_21 +jyasinzou_room_22 +jyasinzou_room_23 +jyasinzou_room_24 +jyasinzou_room_25 +jyasinzou_room_26 +jyasinzou_room_27 +jyasinzou_room_28 +HAKAdan_scene +HAKAdan_room_0 +HAKAdan_room_1 +HAKAdan_room_2 +HAKAdan_room_3 +HAKAdan_room_4 +HAKAdan_room_5 +HAKAdan_room_6 +HAKAdan_room_7 +HAKAdan_room_8 +HAKAdan_room_9 +HAKAdan_room_10 +HAKAdan_room_11 +HAKAdan_room_12 +HAKAdan_room_13 +HAKAdan_room_14 +HAKAdan_room_15 +HAKAdan_room_16 +HAKAdan_room_17 +HAKAdan_room_18 +HAKAdan_room_19 +HAKAdan_room_20 +HAKAdan_room_21 +HAKAdan_room_22 +HAKAdanCH_scene +HAKAdanCH_room_0 +HAKAdanCH_room_1 +HAKAdanCH_room_2 +HAKAdanCH_room_3 +HAKAdanCH_room_4 +HAKAdanCH_room_5 +HAKAdanCH_room_6 +ice_doukutu_scene +ice_doukutu_room_0 +ice_doukutu_room_1 +ice_doukutu_room_2 +ice_doukutu_room_3 +ice_doukutu_room_4 +ice_doukutu_room_5 +ice_doukutu_room_6 +ice_doukutu_room_7 +ice_doukutu_room_8 +ice_doukutu_room_9 +ice_doukutu_room_10 +ice_doukutu_room_11 +men_scene +men_room_0 +men_room_1 +men_room_2 +men_room_3 +men_room_4 +men_room_5 +men_room_6 +men_room_7 +men_room_8 +men_room_9 +men_room_10 +ganontika_scene +ganontika_room_0 +ganontika_room_1 +ganontika_room_2 +ganontika_room_3 +ganontika_room_4 +ganontika_room_5 +ganontika_room_6 +ganontika_room_7 +ganontika_room_8 +ganontika_room_9 +ganontika_room_10 +ganontika_room_11 +ganontika_room_12 +ganontika_room_13 +ganontika_room_14 +ganontika_room_15 +ganontika_room_16 +ganontika_room_17 +ganontika_room_18 +ganontika_room_19 +spot00_scene +spot00_room_0 +spot01_scene +spot01_room_0 +spot02_scene +spot02_room_0 +spot02_room_1 +spot03_scene +spot03_room_0 +spot03_room_1 +spot04_scene +spot04_room_0 +spot04_room_1 +spot04_room_2 +spot05_scene +spot05_room_0 +spot06_scene +spot06_room_0 +spot07_scene +spot07_room_0 +spot07_room_1 +spot08_scene +spot08_room_0 +spot09_scene +spot09_room_0 +spot10_scene +spot10_room_0 +spot10_room_1 +spot10_room_2 +spot10_room_3 +spot10_room_4 +spot10_room_5 +spot10_room_6 +spot10_room_7 +spot10_room_8 +spot10_room_9 +spot11_scene +spot11_room_0 +spot12_scene +spot12_room_0 +spot12_room_1 +spot13_scene +spot13_room_0 +spot13_room_1 +spot15_scene +spot15_room_0 +spot16_scene +spot16_room_0 +spot17_scene +spot17_room_0 +spot17_room_1 +spot18_scene +spot18_room_0 +spot18_room_1 +spot18_room_2 +spot18_room_3 +market_day_scene +market_day_room_0 +market_night_scene +market_night_room_0 +kenjyanoma_scene +kenjyanoma_room_0 +tokinoma_scene +tokinoma_room_0 +tokinoma_room_1 +link_home_scene +link_home_room_0 +kokiri_shop_scene +kokiri_shop_room_0 +kokiri_home_scene +kokiri_home_room_0 +kakusiana_scene +kakusiana_room_0 +kakusiana_room_1 +kakusiana_room_2 +kakusiana_room_3 +kakusiana_room_4 +kakusiana_room_5 +kakusiana_room_6 +kakusiana_room_7 +kakusiana_room_8 +kakusiana_room_9 +kakusiana_room_10 +kakusiana_room_11 +kakusiana_room_12 +kakusiana_room_13 +entra_scene +entra_room_0 +moribossroom_scene +moribossroom_room_0 +moribossroom_room_1 +syatekijyou_scene +syatekijyou_room_0 +shop1_scene +shop1_room_0 +hairal_niwa_scene +hairal_niwa_room_0 +ganon_tou_scene +ganon_tou_room_0 +market_alley_scene +market_alley_room_0 +spot20_scene +spot20_room_0 +market_ruins_scene +market_ruins_room_0 +entra_n_scene +entra_n_room_0 +enrui_scene +enrui_room_0 +market_alley_n_scene +market_alley_n_room_0 +hiral_demo_scene +hiral_demo_room_0 +kokiri_home3_scene +kokiri_home3_room_0 +malon_stable_scene +malon_stable_room_0 +kakariko_scene +kakariko_room_0 +bdan_boss_scene +bdan_boss_room_0 +bdan_boss_room_1 +FIRE_bs_scene +FIRE_bs_room_0 +FIRE_bs_room_1 +hut_scene +hut_room_0 +daiyousei_izumi_scene +daiyousei_izumi_room_0 +hakaana_scene +hakaana_room_0 +yousei_izumi_tate_scene +yousei_izumi_tate_room_0 +yousei_izumi_yoko_scene +yousei_izumi_yoko_room_0 +golon_scene +golon_room_0 +zoora_scene +zoora_room_0 +drag_scene +drag_room_0 +alley_shop_scene +alley_shop_room_0 +night_shop_scene +night_shop_room_0 +impa_scene +impa_room_0 +labo_scene +labo_room_0 +tent_scene +tent_room_0 +nakaniwa_scene +nakaniwa_room_0 +ddan_boss_scene +ddan_boss_room_0 +ddan_boss_room_1 +ydan_boss_scene +ydan_boss_room_0 +ydan_boss_room_1 +HAKAdan_bs_scene +HAKAdan_bs_room_0 +HAKAdan_bs_room_1 +MIZUsin_bs_scene +MIZUsin_bs_room_0 +MIZUsin_bs_room_1 +ganon_scene +ganon_room_0 +ganon_room_1 +ganon_room_2 +ganon_room_3 +ganon_room_4 +ganon_room_5 +ganon_room_6 +ganon_room_7 +ganon_room_8 +ganon_room_9 +ganon_boss_scene +ganon_boss_room_0 +jyasinboss_scene +jyasinboss_room_0 +jyasinboss_room_1 +jyasinboss_room_2 +jyasinboss_room_3 +kokiri_home4_scene +kokiri_home4_room_0 +kokiri_home5_scene +kokiri_home5_room_0 +ganon_final_scene +ganon_final_room_0 +kakariko3_scene +kakariko3_room_0 +hakasitarelay_scene +hakasitarelay_room_0 +hakasitarelay_room_1 +hakasitarelay_room_2 +hakasitarelay_room_3 +hakasitarelay_room_4 +hakasitarelay_room_5 +hakasitarelay_room_6 +shrine_scene +shrine_room_0 +turibori_scene +turibori_room_0 +shrine_n_scene +shrine_n_room_0 +shrine_r_scene +shrine_r_room_0 +hakaana2_scene +hakaana2_room_0 +gerudoway_scene +gerudoway_room_0 +gerudoway_room_1 +gerudoway_room_2 +gerudoway_room_3 +gerudoway_room_4 +gerudoway_room_5 +hairal_niwa_n_scene +hairal_niwa_n_room_0 +bowling_scene +bowling_room_0 +hakaana_ouke_scene +hakaana_ouke_room_0 +hakaana_ouke_room_1 +hakaana_ouke_room_2 +hylia_labo_scene +hylia_labo_room_0 +souko_scene +souko_room_0 +souko_room_1 +souko_room_2 +miharigoya_scene +miharigoya_room_0 +mahouya_scene +mahouya_room_0 +takaraya_scene +takaraya_room_0 +takaraya_room_1 +takaraya_room_2 +takaraya_room_3 +takaraya_room_4 +takaraya_room_5 +takaraya_room_6 +ganon_sonogo_scene +ganon_sonogo_room_0 +ganon_sonogo_room_1 +ganon_sonogo_room_2 +ganon_sonogo_room_3 +ganon_sonogo_room_4 +ganon_demo_scene +ganon_demo_room_0 +face_shop_scene +face_shop_room_0 +kinsuta_scene +kinsuta_room_0 +ganontikasonogo_scene +ganontikasonogo_room_0 +ganontikasonogo_room_1 +bump_texture_static +anime_model_1_static +anime_model_2_static +anime_model_3_static +anime_model_4_static +anime_model_5_static +anime_model_6_static +anime_texture_1_static +anime_texture_2_static +anime_texture_3_static +anime_texture_4_static +anime_texture_5_static +anime_texture_6_static +softsprite_matrix_static \ No newline at end of file diff --git a/OTRGui/src/game/game.cpp b/OTRGui/src/game/game.cpp index ff7e7a22b..2f5512385 100644 --- a/OTRGui/src/game/game.cpp +++ b/OTRGui/src/game/game.cpp @@ -26,6 +26,7 @@ bool single_thread = false; bool hide_second_btn = false; RomVersion version; const char* patched_rom = "tmp/rom.z64"; +extern bool oldExtractMode; static std::string currentStep = "None"; @@ -72,11 +73,28 @@ void OTRGame::init(){ } } -void ExtractRom() { - const WriteResult result = ExtractBaserom(patched_rom); +void ExtractRom() +{ + WriteResult result; + + if (oldExtractMode) + ExtractBaserom(patched_rom); + else + result.error = NULLSTR; + if (result.error == NULLSTR) { if (MoonUtils::exists("oot.otr")) MoonUtils::rm("oot.otr"); - startWorker(); + if (MoonUtils::exists("Extract")) MoonUtils::rm("Extract"); + + MoonUtils::mkdir("Extract"); + MoonUtils::copy("tmp/baserom/Audiobank", "Extract/Audiobank"); + MoonUtils::copy("tmp/baserom/Audioseq", "Extract/Audioseq"); + MoonUtils::copy("tmp/baserom/Audiotable", "Extract/Audiotable"); + MoonUtils::copy("tmp/baserom/version", "Extract/version"); + + MoonUtils::copy("assets/game/", "Extract/assets/"); + + startWorker(version); extracting = true; } } @@ -131,7 +149,7 @@ void OTRGame::draw() { } // Clamp the window to the borders of the monitors - + if (wndPos.x < vsX1) wndPos.x = vsX1; if (wndPos.x < vsX1) wndPos.x = vsX1; if (wndPos.y < vsY1) wndPos.y = vsY1; if (wndPos.x + windowSize.x > vsX2) wndPos.x = vsX2 - windowSize.x; @@ -160,7 +178,9 @@ void OTRGame::draw() { UIUtils::GuiShadowText(("Rom Type: " + version.version).c_str(), 32, text_y, 10, WHITE, BLACK); UIUtils::GuiShadowText("Tool Version: 1.0", 32, text_y + 15, 10, WHITE, BLACK); UIUtils::GuiShadowText("OTR Version: 1.0", 32, text_y + 30, 10, WHITE, BLACK); - UIUtils::GuiToggle(&single_thread, "Single Thread", 32, text_y + 40, currentStep != NULLSTR); + + if (oldExtractMode) + UIUtils::GuiToggle(&single_thread, "Single Thread", 32, text_y + 40, currentStep != NULLSTR); if (!hide_second_btn && UIUtils::GuiIconButton("Folder", "Open\nShip Folder", 109, 50, currentStep != NULLSTR, "Select your Ship of Harkinian Folder\n\nYou could use another folder\nfor development purposes")) { const std::string path = NativeFS->LaunchFileExplorer(LaunchType::FOLDER); diff --git a/OTRGui/src/impl/baserom_extractor/baserom_extractor.cpp b/OTRGui/src/impl/baserom_extractor/baserom_extractor.cpp index 86be26f6c..bd2fc42ea 100644 --- a/OTRGui/src/impl/baserom_extractor/baserom_extractor.cpp +++ b/OTRGui/src/impl/baserom_extractor/baserom_extractor.cpp @@ -83,37 +83,37 @@ RomVersion GetVersion(FILE* rom) { break; case OOT_NTSC_JP_GC: version.version = "JP GameCube (MQ Disk)"; - version.listPath = "gamecube_mq.txt"; + version.listPath = "gamecube.txt"; version.offset = OOT_OFF_JP_GC; break; case OOT_NTSC_JP_GC_CE: version.version = "GameCube (Collectors Edition Disk)"; - version.listPath = "gamecube_mq.txt"; + version.listPath = "gamecube.txt"; version.offset = OOT_OFF_JP_GC_CE; break; case OOT_NTSC_JP_MQ: version.version = "JP Master Quest"; - version.listPath = "gamecube_mq.txt"; + version.listPath = "gamecube.txt"; version.offset = OOT_OFF_JP_MQ; break; case OOT_NTSC_US_MQ: version.version = "NTSC Master Quest"; - version.listPath = "gamecube_mq.txt"; + version.listPath = "gamecube.txt"; version.offset = OOT_OFF_JP_MQ; break; case OOT_NTSC_US_GC: version.version = "NTSC GameCube"; - version.listPath = "gamecube_mq.txt"; + version.listPath = "gamecube.txt"; version.offset = OOT_OFF_US_MQ; break; case OOT_PAL_GC: version.version = "PAL GameCube"; - version.listPath = "gamecube_mq.txt"; + version.listPath = "gamecube_pal.txt"; version.offset = OOT_OFF_PAL_GC; break; case OOT_PAL_MQ: version.version = "PAL Master Quest"; - version.listPath = "pal_mq.txt"; + version.listPath = "gamecube_pal.txt"; version.offset = OOT_OFF_PAL_MQ; break; case OOT_PAL_GC_DBG1: @@ -179,6 +179,8 @@ WriteResult ExtractBaserom(const char* romPath) { const std::vector lines = MoonUtils::split(read(MoonUtils::join("assets/extractor/filelists", version.listPath)), '\n'); + std::vector decompressedData(1); + for (int i = 0; i < lines.size(); i++) { FILE* outFile = fopen(MoonUtils::join("tmp/baserom", lines[i]).c_str(), "wb"); const int romOffset = version.offset + (DMA_ENTRY_SIZE * i); @@ -196,10 +198,13 @@ WriteResult ExtractBaserom(const char* romPath) { auto outData = new uint8_t[size]; memcpy(outData, romData + physStart, size); + if (compressed) { - std::vector compressedData = yaz0_encode(outData, size); - outData = compressedData.data(); - size = compressedData.size(); + int decSize = virtEnd - virtStart; + decompressedData = std::vector(decSize); + yaz0_decode(outData, decompressedData.data(), decSize); + outData = decompressedData.data(); + size = decSize; } fwrite(outData, sizeof(char), size, outFile); diff --git a/OTRGui/src/impl/baserom_extractor/baserom_extractor.h b/OTRGui/src/impl/baserom_extractor/baserom_extractor.h index 8548f4eca..9538c87f6 100644 --- a/OTRGui/src/impl/baserom_extractor/baserom_extractor.h +++ b/OTRGui/src/impl/baserom_extractor/baserom_extractor.h @@ -1,23 +1,7 @@ #ifndef EXTRACT_BASEROM_H_ #define EXTRACT_BASEROM_H_ -#define OOT_NTSC_10 0xEC7011B7 -#define OOT_NTSC_11 0xD43DA81F -#define OOT_NTSC_12 0x693BA2AE -#define OOT_PAL_10 0xB044B569 -#define OOT_PAL_11 0xB2055FBD -#define OOT_NTSC_JP_GC_CE 0xF7F52DB8 -#define OOT_NTSC_JP_GC 0xF611F4BA -#define OOT_NTSC_US_GC 0xF3DD35BA -#define OOT_PAL_GC 0x09465AC3 -#define OOT_NTSC_JP_MQ 0xF43B45BA -#define OOT_NTSC_US_MQ 0xF034001A -#define OOT_PAL_MQ 0x1D4136F3 -#define OOT_PAL_GC_DBG1 0x871E1C92 // 03-21-2002 build -#define OOT_PAL_GC_DBG2 0x87121EFE // 03-13-2002 build -#define OOT_PAL_GC_MQ_DBG 0x917D18F6 -#define OOT_IQUE_TW 0x3D81FB3E -#define OOT_IQUE_CN 0xB1E1E07B +#include "../../libultraship/libultraship/GameVersions.h" #include #include diff --git a/OTRGui/src/impl/extractor/extractor.cpp b/OTRGui/src/impl/extractor/extractor.cpp index ec435a9e4..e28fa5513 100644 --- a/OTRGui/src/impl/extractor/extractor.cpp +++ b/OTRGui/src/impl/extractor/extractor.cpp @@ -5,6 +5,7 @@ #include "utils/mutils.h" #include "ctpl/ctpl_stl.h" #include +#include #ifdef _WIN32 #define PLATFORM Platforms::WINDOWS @@ -13,6 +14,7 @@ #endif namespace Util = MoonUtils; +bool oldExtractMode = false; static int maxResources = 0; static int extractedResources = 0; bool buildingOtr = false; @@ -22,19 +24,29 @@ bool isWindows() { return (PLATFORM == Platforms::WINDOWS); } -void BuildOTR(const std::string output) { - Util::copy("tmp/baserom/Audiobank", "Extract/Audiobank"); - Util::copy("tmp/baserom/Audioseq", "Extract/Audioseq"); - Util::copy("tmp/baserom/Audiotable", "Extract/Audiotable"); - - Util::copy("assets/game/", "Extract/assets/"); - - std::string execStr = Util::format("assets/extractor/%s", isWindows() ? "ZAPD.exe" : "ZAPD.out") + " botr -se OTR"; - ProcessResult result = NativeFS->LaunchProcess(execStr); - if(result.exitCode != 0) { - std::cout << "\nError when building the OTR file with error code: " << result.exitCode << " !" << std::endl; - std::cout << "Aborting...\n" << std::endl; +std::string GetXMLVersion(RomVersion version) +{ + switch (version.crc) + { + case OOT_PAL_GC_DBG1: return "GC_NMQ_D"; + case OOT_PAL_GC_DBG2: return "GC_MQ_D"; + case OOT_PAL_GC: return "GC_NMQ_PAL_F"; } + + return "ERROR"; +} + +void BuildOTR(const std::string output) { + if (oldExtractMode) + { + std::string execStr = Util::format("assets/extractor/%s", isWindows() ? "ZAPD.exe" : "ZAPD.out") + " botr -se OTR"; + ProcessResult result = NativeFS->LaunchProcess(execStr); + if (result.exitCode != 0) { + std::cout << "\nError when building the OTR file with error code: " << result.exitCode << " !" << std::endl; + std::cout << "Aborting...\n" << std::endl; + } + } + setCurrentStep("Done!"); if (output == ".") return; @@ -44,9 +56,9 @@ void BuildOTR(const std::string output) { MoonUtils::copy("oot.otr", outputPath); } -void ExtractFile(std::string xmlPath, std::string outPath, std::string outSrcPath) { +void ExtractFile(std::string xmlPath, std::string outPath, std::string outSrcPath, RomVersion version) { std::string execStr = Util::format("assets/extractor/%s", isWindows() ? "ZAPD.exe" : "ZAPD.out"); - std::string args = Util::format(" e -eh -i %s -b tmp/baserom/ -o %s -osf %s -gsf 1 -rconf assets/extractor/Config.xml -se OTR %s", xmlPath.c_str(), outPath.c_str(), outSrcPath.c_str(), xmlPath.find("overlays") != std::string::npos ? "--static" : ""); + std::string args = Util::format(" e -eh -i %s -b tmp/baserom/ -o %s -osf %s -gsf 1 -rconf assets/extractor/Config_%s.xml -se OTR %s", xmlPath.c_str(), outPath.c_str(), outSrcPath.c_str(), GetXMLVersion(version).c_str(), xmlPath.find("overlays") != std::string::npos ? "--static" : ""); ProcessResult result = NativeFS->LaunchProcess(execStr + args); if (result.exitCode != 0) { @@ -55,49 +67,78 @@ void ExtractFile(std::string xmlPath, std::string outPath, std::string outSrcPat } } -void ExtractFunc(std::string fullPath) { +void ExtractFunc(std::string fullPath, RomVersion version) { std::vector path = Util::split(fullPath, Util::pathSeparator()); std::string outPath = Util::join(Util::join("assets/extractor/xmls/output", path[4]), Util::basename(fullPath)); Util::mkdir(outPath); - ExtractFile(fullPath, outPath, outPath); + ExtractFile(fullPath, outPath, outPath, version); setCurrentStep("Extracting: " + Util::basename(fullPath)); extractedResources++; } -void startWorker() { - std::string path = "assets/extractor/xmls"; - std::vector files; - Util::dirscan(path, files); - std::vector xmlFiles; +void startWorker(RomVersion version) { + std::string path = "assets/extractor/xmls/"; - const int num_threads = std::thread::hardware_concurrency(); - ctpl::thread_pool pool(num_threads / 2); - for(auto &file : files) { - if (file.find(".xml") != std::string::npos) xmlFiles.push_back(file); - } + path += GetXMLVersion(version); - for (auto& file : xmlFiles) { - if(single_thread) { - ExtractFunc(file); - } else { - pool.push([file](int) { - ExtractFunc(file); - }); + Util::write("tmp/baserom/version", (char*)&version.crc, sizeof(version.crc)); + + + if (oldExtractMode) + { + std::vector files; + Util::dirscan(path, files); + std::vector xmlFiles; + + const int num_threads = std::thread::hardware_concurrency(); + ctpl::thread_pool pool(num_threads / 2); + for (auto& file : files) { + if (file.find(".xml") != std::string::npos) xmlFiles.push_back(file); } - } - maxResources = xmlFiles.size(); + for (auto& file : xmlFiles) { + if (single_thread) { + ExtractFunc(file, version); + } + else { + pool.push([file, version](int) { + ExtractFunc(file, version); + }); + } + } + + maxResources = xmlFiles.size(); + } + else + { + std::string execStr = Util::format("assets/extractor/%s", isWindows() ? "ZAPD.exe" : "ZAPD.out"); + std::string args = Util::format(" ed -eh -i %s -b tmp/rom.z64 -fl assets/extractor/filelists -o %s -osf %s -gsf 1 -rconf assets/extractor/Config_%s.xml -se OTR %s", path.c_str(), path + "../", path + "../", GetXMLVersion(version).c_str(), ""); + ProcessResult result = NativeFS->LaunchProcess(execStr + args); + + if (result.exitCode != 0) { + std::cout << "\nError when extracting the ROM with error code: " << result.exitCode << " !" << std::endl; + std::cout << "Aborting...\n" << std::endl; + } + else + { + printf("All done?\n"); + } + + maxResources = 1; + } } void updateWorker(const std::string& output) { - if (maxResources > 0 && !buildingOtr && extractedResources >= maxResources) { + if (maxResources > 0 && !buildingOtr && (extractedResources >= maxResources || !oldExtractMode)) + { setCurrentStep("Building OTR..."); if (skipFrames < 3) { skipFrames++; return; } buildingOtr = true; - if (single_thread){ + + if (single_thread || !oldExtractMode){ BuildOTR(output); return; } diff --git a/OTRGui/src/impl/extractor/extractor.h b/OTRGui/src/impl/extractor/extractor.h index 98dea147a..de48d7574 100644 --- a/OTRGui/src/impl/extractor/extractor.h +++ b/OTRGui/src/impl/extractor/extractor.h @@ -5,5 +5,7 @@ enum Platforms { WINDOWS, LINUX }; -void startWorker(); +struct RomVersion; + +void startWorker(RomVersion version); void updateWorker(const std::string& output); \ No newline at end of file diff --git a/OTRGui/src/utils/mutils.cpp b/OTRGui/src/utils/mutils.cpp index 770df8423..2a649452e 100644 --- a/OTRGui/src/utils/mutils.cpp +++ b/OTRGui/src/utils/mutils.cpp @@ -72,7 +72,11 @@ namespace MoonUtils { vector result; stringstream ss (s); string item; - while (getline(ss, item, delim)) { + while (getline(ss, item, delim)) + { + if (item.at(item.size() - 1) == '\r') + item = item.substr(0, item.size() - 1); + result.push_back (item); } return result; diff --git a/ZAPDTR/ZAPD/CRC32.h b/ZAPDTR/ZAPD/CRC32.h index 4158a5528..1f82c75c5 100644 --- a/ZAPDTR/ZAPD/CRC32.h +++ b/ZAPDTR/ZAPD/CRC32.h @@ -1,6 +1,6 @@ #pragma once -static uint32_t CRC32B(unsigned char* message, int32_t size) +static uint32_t CRC32B(const unsigned char* message, int32_t size) { int32_t byte, crc; int32_t mask; diff --git a/ZAPDTR/ZAPD/Declaration.cpp b/ZAPDTR/ZAPD/Declaration.cpp index eeb988db7..27494b866 100644 --- a/ZAPDTR/ZAPD/Declaration.cpp +++ b/ZAPDTR/ZAPD/Declaration.cpp @@ -1,6 +1,7 @@ #include "Declaration.h" #include "Globals.h" +#include "ZVtx.h" #include "Utils/StringHelper.h" Declaration::Declaration(offset_t nAddress, DeclarationAlignment nAlignment, size_t nSize, @@ -61,6 +62,12 @@ Declaration::Declaration(offset_t nAddress, const std::string& nIncludePath, siz varName = nVarName; } +Declaration::~Declaration() +{ + //for (auto item : vertexHack) + //delete item; +} + bool Declaration::IsStatic() const { switch (staticConf) diff --git a/ZAPDTR/ZAPD/Declaration.h b/ZAPDTR/ZAPD/Declaration.h index 4a743b50f..45d36f49e 100644 --- a/ZAPDTR/ZAPD/Declaration.h +++ b/ZAPDTR/ZAPD/Declaration.h @@ -22,6 +22,8 @@ enum class StaticConfig On }; +class ZVtx; + class Declaration { public: @@ -38,6 +40,8 @@ public: std::string varName; std::string includePath; + std::vector vertexHack; + bool isExternal = false; bool isArray = false; bool forceArrayCnt = false; @@ -65,6 +69,8 @@ public: Declaration(offset_t nAddress, const std::string& nIncludePath, size_t nSize, const std::string& nVarType, const std::string& nVarName); + ~Declaration(); + bool IsStatic() const; std::string GetNormalDeclarationStr() const; diff --git a/ZAPDTR/ZAPD/FileWorker.cpp b/ZAPDTR/ZAPD/FileWorker.cpp new file mode 100644 index 000000000..e69de29bb diff --git a/ZAPDTR/ZAPD/FileWorker.h b/ZAPDTR/ZAPD/FileWorker.h new file mode 100644 index 000000000..6ceae8076 --- /dev/null +++ b/ZAPDTR/ZAPD/FileWorker.h @@ -0,0 +1,15 @@ +#pragma once + +#include +#include +#include +#include "ZFile.h" + +class FileWorker +{ +public: + std::vector files; + std::vector externalFiles; + std::vector segments; + std::map> segmentRefFiles; +}; \ No newline at end of file diff --git a/ZAPDTR/ZAPD/Globals.cpp b/ZAPDTR/ZAPD/Globals.cpp index 0902b2c9e..f0df0e547 100644 --- a/ZAPDTR/ZAPD/Globals.cpp +++ b/ZAPDTR/ZAPD/Globals.cpp @@ -34,30 +34,88 @@ Globals::~Globals() } } -void Globals::AddSegment(int32_t segment, ZFile* file) +void Globals::AddSegment(int32_t segment, ZFile* file, int workerID) { - if (std::find(segments.begin(), segments.end(), segment) == segments.end()) - segments.push_back(segment); - if (cfg.segmentRefFiles.find(segment) == cfg.segmentRefFiles.end()) - cfg.segmentRefFiles[segment] = std::vector(); - - cfg.segmentRefFiles[segment].push_back(file); -} - -bool Globals::HasSegment(int32_t segment) -{ - return std::find(segments.begin(), segments.end(), segment) != segments.end(); -} - -ZFile* Globals::GetSegment(int32_t segment) -{ - if (HasSegment(segment)) + if (!Globals::Instance->singleThreaded) { - int idx = std::find(segments.begin(), segments.end(), segment) - segments.begin(); - return files[idx]; + auto worker = workerData[workerID]; + + if (std::find(worker->segments.begin(), worker->segments.end(), segment) == + worker->segments.end()) + worker->segments.push_back(segment); + if (worker->segmentRefFiles.find(segment) == worker->segmentRefFiles.end()) + worker->segmentRefFiles[segment] = std::vector(); + + worker->segmentRefFiles[segment].push_back(file); } else - return nullptr; + { + if (std::find(segments.begin(), segments.end(), segment) == segments.end()) + segments.push_back(segment); + if (cfg.segmentRefFiles.find(segment) == cfg.segmentRefFiles.end()) + cfg.segmentRefFiles[segment] = std::vector(); + + cfg.segmentRefFiles[segment].push_back(file); + } +} + +bool Globals::HasSegment(int32_t segment, int workerID) +{ + if (!Globals::Instance->singleThreaded) + return std::find(workerData[workerID]->segments.begin(), + workerData[workerID]->segments.end(), segment) != workerData[workerID]->segments.end(); + else + return std::find(segments.begin(), segments.end(), segment) != segments.end(); +} + +ZFile* Globals::GetSegment(int32_t segment, int workerID) +{ + if (!Globals::Instance->singleThreaded) + { + if (HasSegment(segment, workerID)) + { + int idx = std::find(workerData[workerID]->segments.begin(), + workerData[workerID]->segments.end(), segment) - + workerData[workerID]->segments.begin(); + return workerData[workerID]->files[idx]; + } + else + return nullptr; + } + else + { + if (HasSegment(segment, workerID)) + { + int idx = std::find(segments.begin(), segments.end(), segment) - segments.begin(); + return files[idx]; + } + else + return nullptr; + } +} + +std::map> Globals::GetSegmentRefFiles(int workerID) +{ + if (!Globals::Instance->singleThreaded) + return workerData[workerID]->segmentRefFiles; + else + return cfg.segmentRefFiles; +} + +void Globals::AddFile(ZFile* file, int workerID) +{ + if (singleThreaded) + files.push_back(file); + else + workerData[workerID]->files.push_back(file); +} + +void Globals::AddExternalFile(ZFile* file, int workerID) +{ + if (singleThreaded) + externalFiles.push_back(file); + else + workerData[workerID]->externalFiles.push_back(file); } std::map& Globals::GetExporterMap() @@ -93,8 +151,22 @@ ExporterSet* Globals::GetExporterSet() return nullptr; } +std::vector Globals::GetBaseromFile(std::string fileName) +{ + if (fileMode == ZFileMode::ExtractDirectory) + { + if (StringHelper::Contains(fileName, "baserom/")) + fileName = StringHelper::Split(fileName, "baserom/")[1]; + + return rom->GetFile(fileName); + + } + else + return File::ReadAllBytes(fileName); +} + bool Globals::GetSegmentedPtrName(segptr_t segAddress, ZFile* currentFile, - const std::string& expectedType, std::string& declName) + const std::string& expectedType, std::string& declName, int workerID) { if (segAddress == 0) { @@ -130,9 +202,11 @@ bool Globals::GetSegmentedPtrName(segptr_t segAddress, ZFile* currentFile, if (currentFile->GetDeclarationPtrName(segAddress, expectedType, declName)) return true; } - else if (HasSegment(segment)) + else if (HasSegment(segment, workerID)) { - for (auto file : cfg.segmentRefFiles[segment]) + // OTRTODO: Multithreading + auto segs = GetSegmentRefFiles(workerID); + for (auto file : segs[segment]) { offset = Seg2Filespace(segAddress, file->baseAddress); @@ -176,7 +250,7 @@ bool Globals::GetSegmentedPtrName(segptr_t segAddress, ZFile* currentFile, bool Globals::GetSegmentedArrayIndexedName(segptr_t segAddress, size_t elementSize, ZFile* currentFile, const std::string& expectedType, - std::string& declName) + std::string& declName, int workerID) { if (segAddress == 0) { @@ -193,9 +267,11 @@ bool Globals::GetSegmentedArrayIndexedName(segptr_t segAddress, size_t elementSi if (addressFound) return true; } - else if (HasSegment(segment)) + else if (HasSegment(segment, workerID)) { - for (auto file : cfg.segmentRefFiles[segment]) + // OTRTODO: Multithreading + auto segs = GetSegmentRefFiles(workerID); + for (auto file : segs[segment]) { if (file->IsSegmentedInFilespaceRange(segAddress)) { diff --git a/ZAPDTR/ZAPD/Globals.h b/ZAPDTR/ZAPD/Globals.h index 140de1f24..683fd6fcd 100644 --- a/ZAPDTR/ZAPD/Globals.h +++ b/ZAPDTR/ZAPD/Globals.h @@ -5,6 +5,8 @@ #include #include "GameConfig.h" #include "ZFile.h" +#include +#include class ZRoom; @@ -36,6 +38,7 @@ public: ExporterSetFuncVoid3 beginXMLFunc = nullptr; ExporterSetFuncVoid3 endXMLFunc = nullptr; ExporterSetResSave resSaveFunc = nullptr; + ExporterSetFuncVoid3 endProgramFunc = nullptr; }; class Globals @@ -49,9 +52,10 @@ public: bool outputCrc = false; bool profile; // Measure performance of certain operations bool useLegacyZDList; + bool singleThreaded; VerbosityLevel verbosity; // ZAPD outputs additional information ZFileMode fileMode; - fs::path baseRomPath, inputPath, outputPath, sourceOutputPath, cfgPath; + fs::path baseRomPath, inputPath, outputPath, sourceOutputPath, cfgPath, fileListPath; TextureType texType; ZGame game; GameConfig cfg; @@ -61,10 +65,13 @@ public: bool forceUnaccountedStatic = false; bool otrMode = true; + ZRom* rom; std::vector files; std::vector externalFiles; std::vector segments; + std::map workerData; + std::string currentExporter; static std::map& GetExporterMap(); static void AddExporter(std::string exporterName, ExporterSet* exporterSet); @@ -72,13 +79,18 @@ public: Globals(); ~Globals(); - void AddSegment(int32_t segment, ZFile* file); - bool HasSegment(int32_t segment); - ZFile* GetSegment(int32_t segment); + void AddSegment(int32_t segment, ZFile* file, int workerID); + bool HasSegment(int32_t segment, int workerID); + ZFile* GetSegment(int32_t segment, int workerID); + std::map> GetSegmentRefFiles(int workerID); + void AddFile(ZFile* file, int workerID); + void AddExternalFile(ZFile* file, int workerID); ZResourceExporter* GetExporter(ZResourceType resType); ExporterSet* GetExporterSet(); + std::vector GetBaseromFile(std::string fileName); + /** * Search in every file (and the symbol map) for the `segAddress` passed as parameter. * If the segment of `currentFile` is the same segment of `segAddress`, then that file will be @@ -88,8 +100,8 @@ public: * in which case `declName` will be set to the address formatted as a pointer. */ bool GetSegmentedPtrName(segptr_t segAddress, ZFile* currentFile, - const std::string& expectedType, std::string& declName); + const std::string& expectedType, std::string& declName, int workerID); bool GetSegmentedArrayIndexedName(segptr_t segAddress, size_t elementSize, ZFile* currentFile, - const std::string& expectedType, std::string& declName); + const std::string& expectedType, std::string& declName, int workerID); }; diff --git a/ZAPDTR/ZAPD/Main.cpp b/ZAPDTR/ZAPD/Main.cpp index 250704993..1a99d346a 100644 --- a/ZAPDTR/ZAPD/Main.cpp +++ b/ZAPDTR/ZAPD/Main.cpp @@ -23,16 +23,20 @@ #include #include #include "tinyxml2.h" +#include //extern const char gBuildHash[]; const char gBuildHash[] = ""; bool Parse(const fs::path& xmlFilePath, const fs::path& basePath, const fs::path& outPath, - ZFileMode fileMode); + ZFileMode fileMode, int workerID); void BuildAssetTexture(const fs::path& pngFilePath, TextureType texType, const fs::path& outPath); void BuildAssetBackground(const fs::path& imageFilePath, const fs::path& outPath); void BuildAssetBlob(const fs::path& blobFilePath, const fs::path& outPath); +int ExtractFunc(int workerID, int fileListSize, std::string fileListItem, ZFileMode fileMode); + +volatile int numWorkersLeft = 0; #if !defined(_MSC_VER) && !defined(__CYGWIN__) #define ARRAY_COUNT(arr) (sizeof(arr) / sizeof(arr[0])) @@ -182,6 +186,10 @@ int main(int argc, char* argv[]) { Globals::Instance->cfgPath = argv[++i]; } + else if (arg == "-fl") // Set baserom filelist path + { + Globals::Instance->fileListPath = argv[++i]; + } else if (arg == "-rconf") // Read Config File { Globals::Instance->cfg.ReadConfigFile(argv[++i]); @@ -242,6 +250,8 @@ int main(int argc, char* argv[]) fileMode = ZFileMode::BuildBlob; else if (buildMode == "e") fileMode = ZFileMode::Extract; + else if (buildMode == "ed") + fileMode = ZFileMode::ExtractDirectory; else if (exporterSet != nullptr && exporterSet->parseFileModeFunc != nullptr) exporterSet->parseFileModeFunc(buildMode, fileMode); @@ -251,6 +261,11 @@ int main(int argc, char* argv[]) return 1; } + Globals::Instance->fileMode = fileMode; + + if (fileMode == ZFileMode::ExtractDirectory) + Globals::Instance->rom = new ZRom(Globals::Instance->baseRomPath.string()); + // We've parsed through our commands once. If an exporter exists, it's been set by now. // Now we'll parse through them again but pass them on to our exporter if one is available. @@ -269,7 +284,7 @@ int main(int argc, char* argv[]) } // TODO: switch - if (fileMode == ZFileMode::Extract || fileMode == ZFileMode::BuildSourceFile) + if (fileMode == ZFileMode::Extract || fileMode == ZFileMode::BuildSourceFile || fileMode == ZFileMode::ExtractDirectory) { bool procFileModeSuccess = false; @@ -278,30 +293,85 @@ int main(int argc, char* argv[]) if (!procFileModeSuccess) { - bool parseSuccessful; - - for (auto& extFile : Globals::Instance->cfg.externalFiles) + if (fileMode == ZFileMode::ExtractDirectory) { - fs::path externalXmlFilePath = - Globals::Instance->cfg.externalXmlFolder / extFile.xmlPath; + std::vector fileList = + Directory::ListFiles(Globals::Instance->inputPath.string()); - if (Globals::Instance->verbosity >= VerbosityLevel::VERBOSITY_INFO) + const int num_threads = std::thread::hardware_concurrency(); + ctpl::thread_pool pool(num_threads / 2); + + bool parseSuccessful; + + auto start = std::chrono::steady_clock::now(); + int fileListSize = fileList.size(); + Globals::Instance->singleThreaded = false; + + for (int i = 0; i < fileListSize; i++) + Globals::Instance->workerData[i] = new FileWorker(); + + numWorkersLeft = fileListSize; + + for (int i = 0; i < fileListSize; i++) { - printf("Parsing external file from config: '%s'\n", - externalXmlFilePath.c_str()); + if (Globals::Instance->singleThreaded) + { + ExtractFunc(i, fileList.size(), fileList[i], fileMode); + } + else + { + std::string fileListItem = fileList[i]; + pool.push([i, fileListSize, fileListItem, fileMode](int) { + ExtractFunc(i, fileListSize, fileListItem, fileMode); + }); + } } - parseSuccessful = Parse(externalXmlFilePath, Globals::Instance->baseRomPath, - extFile.outPath, ZFileMode::ExternalFile); + if (!Globals::Instance->singleThreaded) + { + while (true) + { + if (numWorkersLeft <= 0) + break; + std::this_thread::sleep_for(std::chrono::milliseconds(250)); + } + } + + auto end = std::chrono::steady_clock::now(); + auto diff = + std::chrono::duration_cast(end - start).count(); + + printf("Generated OTR File Data in %i seconds\n", diff); + } + else + { + bool parseSuccessful; + + for (auto& extFile : Globals::Instance->cfg.externalFiles) + { + fs::path externalXmlFilePath = + Globals::Instance->cfg.externalXmlFolder / extFile.xmlPath; + + if (Globals::Instance->verbosity >= VerbosityLevel::VERBOSITY_INFO) + { + printf("Parsing external file from config: '%s'\n", + externalXmlFilePath.c_str()); + } + + parseSuccessful = Parse(externalXmlFilePath, Globals::Instance->baseRomPath, + extFile.outPath, ZFileMode::ExternalFile, 0); + + if (!parseSuccessful) + return 1; + } + + parseSuccessful = + Parse(Globals::Instance->inputPath, Globals::Instance->baseRomPath, + Globals::Instance->outputPath, fileMode, 0); if (!parseSuccessful) return 1; } - - parseSuccessful = Parse(Globals::Instance->inputPath, Globals::Instance->baseRomPath, - Globals::Instance->outputPath, fileMode); - if (!parseSuccessful) - return 1; } } else if (fileMode == ZFileMode::BuildTexture) @@ -317,6 +387,7 @@ int main(int argc, char* argv[]) { BuildAssetBlob(Globals::Instance->inputPath, Globals::Instance->outputPath); } + /* else if (fileMode == ZFileMode::BuildOverlay) { ZOverlay* overlay = @@ -327,13 +398,77 @@ int main(int argc, char* argv[]) File::WriteAllText(Globals::Instance->outputPath.string(), overlay->GetSourceOutputCode("")); } + */ + + if (exporterSet != nullptr && exporterSet->endProgramFunc != nullptr) + exporterSet->endProgramFunc(); delete g; return 0; } +int ExtractFunc(int workerID, int fileListSize, std::string fileListItem, ZFileMode fileMode) +{ + bool parseSuccessful; + + printf("(%i / %i): %s\n", (workerID + 1), fileListSize, fileListItem.c_str()); + + for (auto& extFile : Globals::Instance->cfg.externalFiles) + { + fs::path externalXmlFilePath = Globals::Instance->cfg.externalXmlFolder / extFile.xmlPath; + + if (Globals::Instance->verbosity >= VerbosityLevel::VERBOSITY_INFO) + { + printf("Parsing external file from config: '%s'\n", externalXmlFilePath.c_str()); + } + + parseSuccessful = Parse(externalXmlFilePath, Globals::Instance->baseRomPath, + extFile.outPath, ZFileMode::ExternalFile, workerID); + + if (!parseSuccessful) + return 1; + } + + parseSuccessful = Parse(fileListItem, Globals::Instance->baseRomPath, + Globals::Instance->outputPath, fileMode, workerID); + + if (!parseSuccessful) + return 1; + + if (Globals::Instance->singleThreaded) + { + for (int i = 0; i < Globals::Instance->files.size(); i++) + { + delete Globals::Instance->files[i]; + Globals::Instance->files.erase(Globals::Instance->files.begin() + i); + i--; + } + + Globals::Instance->externalFiles.clear(); + Globals::Instance->segments.clear(); + Globals::Instance->cfg.segmentRefFiles.clear(); + } + else + { + for (int i = 0; i < Globals::Instance->workerData[workerID]->files.size(); i++) + { + delete Globals::Instance->workerData[workerID]->files[i]; + Globals::Instance->workerData[workerID]->files.erase( + Globals::Instance->workerData[workerID]->files.begin() + + i); + i--; + } + + Globals::Instance->workerData[workerID]->externalFiles.clear(); + Globals::Instance->workerData[workerID]->segments.clear(); + Globals::Instance->workerData[workerID]->segmentRefFiles.clear(); + + numWorkersLeft--; + } +} + bool Parse(const fs::path& xmlFilePath, const fs::path& basePath, const fs::path& outPath, - ZFileMode fileMode) + ZFileMode fileMode, int workerID) { tinyxml2::XMLDocument doc; tinyxml2::XMLError eResult = doc.LoadFile(xmlFilePath.string().c_str()); @@ -361,11 +496,11 @@ bool Parse(const fs::path& xmlFilePath, const fs::path& basePath, const fs::path { if (std::string_view(child->Name()) == "File") { - ZFile* file = new ZFile(fileMode, child, basePath, outPath, "", xmlFilePath); - Globals::Instance->files.push_back(file); + ZFile* file = new ZFile(fileMode, child, basePath, outPath, "", xmlFilePath, workerID); + Globals::Instance->AddFile(file, workerID); if (fileMode == ZFileMode::ExternalFile) { - Globals::Instance->externalFiles.push_back(file); + Globals::Instance->AddExternalFile(file, workerID); file->isExternalFile = true; } } @@ -398,7 +533,7 @@ bool Parse(const fs::path& xmlFilePath, const fs::path& basePath, const fs::path } // Recursion. What can go wrong? - Parse(externalXmlFilePath, basePath, externalOutFilePath, ZFileMode::ExternalFile); + Parse(externalXmlFilePath, basePath, externalOutFilePath, ZFileMode::ExternalFile, workerID); } else { @@ -417,7 +552,14 @@ bool Parse(const fs::path& xmlFilePath, const fs::path& basePath, const fs::path if (exporterSet != nullptr && exporterSet->beginXMLFunc != nullptr) exporterSet->beginXMLFunc(); - for (ZFile* file : Globals::Instance->files) + std::vector files; + + if (Globals::Instance->singleThreaded) + files = Globals::Instance->files; + else + files = Globals::Instance->workerData[workerID]->files; + + for (ZFile* file : files) { if (fileMode == ZFileMode::BuildSourceFile) file->BuildSourceFile(); diff --git a/ZAPDTR/ZAPD/OtherStructs/SkinLimbStructs.cpp b/ZAPDTR/ZAPD/OtherStructs/SkinLimbStructs.cpp index 8ce215c97..c9a537ced 100644 --- a/ZAPDTR/ZAPD/OtherStructs/SkinLimbStructs.cpp +++ b/ZAPDTR/ZAPD/OtherStructs/SkinLimbStructs.cpp @@ -199,8 +199,10 @@ std::string Struct_800A598C::GetBodySourceCode() const { std::string unk_8_Str; std::string unk_C_Str; - Globals::Instance->GetSegmentedPtrName(unk_8, parent, "Struct_800A57C0", unk_8_Str); - Globals::Instance->GetSegmentedPtrName(unk_C, parent, "Struct_800A598C_2", unk_C_Str); + Globals::Instance->GetSegmentedPtrName(unk_8, parent, "Struct_800A57C0", unk_8_Str, + parent->workerID); + Globals::Instance->GetSegmentedPtrName(unk_C, parent, "Struct_800A598C_2", unk_C_Str, + parent->workerID); std::string entryStr = StringHelper::Sprintf("\n\t\tARRAY_COUNTU(%s), ARRAY_COUNTU(%s),\n", unk_8_Str.c_str(), unk_C_Str.c_str()); @@ -316,8 +318,9 @@ std::string Struct_800A5E28::GetBodySourceCode() const { std::string unk_4_Str; std::string unk_8_Str; - Globals::Instance->GetSegmentedPtrName(unk_4, parent, "Struct_800A598C", unk_4_Str); - Globals::Instance->GetSegmentedPtrName(unk_8, parent, "Gfx", unk_8_Str); + Globals::Instance->GetSegmentedPtrName(unk_4, parent, "Struct_800A598C", unk_4_Str, + parent->workerID); + Globals::Instance->GetSegmentedPtrName(unk_8, parent, "Gfx", unk_8_Str, parent->workerID); std::string entryStr = "\n"; entryStr += StringHelper::Sprintf("\t%i, ARRAY_COUNTU(%s),\n", unk_0, unk_4_Str.c_str()); diff --git a/ZAPDTR/ZAPD/OutputFormatter.cpp b/ZAPDTR/ZAPD/OutputFormatter.cpp index dbb8692c0..7fac434b2 100644 --- a/ZAPDTR/ZAPD/OutputFormatter.cpp +++ b/ZAPDTR/ZAPD/OutputFormatter.cpp @@ -3,7 +3,7 @@ void OutputFormatter::Flush() { - //if (!Globals::Instance->otrMode) + //if (!Globals::Instance->otrMode) // OTRTODO: MULTITHREADING { if (col > lineLimit && !Globals::Instance->otrMode) { @@ -31,6 +31,10 @@ void OutputFormatter::Flush() int OutputFormatter::Write(const char* buf, int count) { + // OTRTODO + //if (!Globals::Instance->singleThreaded) + //return 0; + for (int i = 0; i < count; i++) { char c = buf[i]; @@ -92,7 +96,7 @@ int OutputFormatter::Write(const std::string& buf) return Write(buf.data(), buf.size()); } -OutputFormatter* OutputFormatter::Instance; +__declspec(thread) OutputFormatter* OutputFormatter::Instance; int OutputFormatter::WriteStatic(const char* buf, int count) { diff --git a/ZAPDTR/ZAPD/OutputFormatter.h b/ZAPDTR/ZAPD/OutputFormatter.h index 28955b1cd..f008df2cb 100644 --- a/ZAPDTR/ZAPD/OutputFormatter.h +++ b/ZAPDTR/ZAPD/OutputFormatter.h @@ -25,7 +25,7 @@ private: void Flush(); - static OutputFormatter* Instance; + static __declspec(thread) OutputFormatter* Instance; static int WriteStatic(const char* buf, int count); public: diff --git a/ZAPDTR/ZAPD/Overlays/ZOverlay.cpp b/ZAPDTR/ZAPD/Overlays/ZOverlay.cpp index 113c4ef33..c3e7c68c7 100644 --- a/ZAPDTR/ZAPD/Overlays/ZOverlay.cpp +++ b/ZAPDTR/ZAPD/Overlays/ZOverlay.cpp @@ -1,3 +1,4 @@ +#if 0 #include "ZOverlay.h" #include @@ -350,3 +351,4 @@ ELFIO::Elf_Half ZOverlay::FindSymbolInSection(const std::string& curSymName, } return SHN_UNDEF; } +#endif \ No newline at end of file diff --git a/ZAPDTR/ZAPD/Overlays/ZOverlay.h b/ZAPDTR/ZAPD/Overlays/ZOverlay.h index 98ead9013..c1fadddca 100644 --- a/ZAPDTR/ZAPD/Overlays/ZOverlay.h +++ b/ZAPDTR/ZAPD/Overlays/ZOverlay.h @@ -1,5 +1,7 @@ #pragma once +#if 0 + #include "Utils/Directory.h" #include "ZResource.h" #include "elfio/elfio.hpp" @@ -73,3 +75,4 @@ private: ELFIO::Elf_Half FindSymbolInSection(const std::string& curSymName, ELFIO::section* sectionData, ELFIO::elfio& reader, size_t readerId); }; +#endif \ No newline at end of file diff --git a/ZAPDTR/ZAPD/ZAPD.vcxproj b/ZAPDTR/ZAPD/ZAPD.vcxproj index 95e89d8ff..91ff515a2 100644 --- a/ZAPDTR/ZAPD/ZAPD.vcxproj +++ b/ZAPDTR/ZAPD/ZAPD.vcxproj @@ -74,15 +74,29 @@ $(OutDir);$(ProjectDir)..\lib\libgfxd;$(ProjectDir)..\..\OTRExporter\packages\libpng-v142.1.6.37.2\build\native\lib\x64\v142\Debug\;$(ProjectDir)..\..\libultraship\libultraship\;$(LibraryPath) $(ProjectDir)..\ZAPDUtils;$(ProjectDir)..\lib\tinyxml2;$(ProjectDir)..\lib\libgfxd;$(ProjectDir)..\lib\elfio;$(ProjectDir)..\lib\stb;$(ProjectDir);$(IncludePath) + MinimumRecommendedRules.ruleset + + $(ProjectDir)..\ZAPDUtils;$(ProjectDir)..\lib\tinyxml2;$(ProjectDir)..\lib\libgfxd;$(ProjectDir)..\lib\elfio;$(ProjectDir)..\lib\stb;$(ProjectDir);$(IncludePath) $(OutDir);$(ProjectDir)..\lib\libgfxd;$(ProjectDir)..\..\OTRExporter\packages\libpng-v142.1.6.37.2\build\native\lib\x64\v142\Debug\;$(ProjectDir)..\..\libultraship\libultraship\;$(LibraryPath) false + MinimumRecommendedRules.ruleset + + $(SolutionDir)ZAPD\lib\tinyxml2;$(SolutionDir)ZAPD\lib\libgfxd;$(SolutionDir)ZAPD\lib\elfio;$(SolutionDir)ZAPD\lib\stb;$(ProjectDir);$(IncludePath) $(SolutionDir)ZAPD\lib\libgfxd;$(SolutionDir)x64\Debug;$(SolutionDir)packages\libpng.1.6.28.1\build\native\lib\x64\v140\dynamic\Debug;$(LibraryPath) + MinimumRecommendedRules.ruleset + + + + + MinimumRecommendedRules.ruleset + + @@ -170,6 +184,7 @@ + @@ -178,6 +193,7 @@ + @@ -185,6 +201,7 @@ + @@ -257,7 +274,9 @@ + + @@ -265,6 +284,8 @@ + + @@ -278,6 +299,7 @@ + @@ -334,6 +356,12 @@ + + + {02d10590-9542-3f55-aaf8-6055677e2a2a} + false + + diff --git a/ZAPDTR/ZAPD/ZAPD.vcxproj.filters b/ZAPDTR/ZAPD/ZAPD.vcxproj.filters index 2a004bf9d..c122b7e56 100644 --- a/ZAPDTR/ZAPD/ZAPD.vcxproj.filters +++ b/ZAPDTR/ZAPD/ZAPD.vcxproj.filters @@ -58,6 +58,12 @@ {730beb67-6d59-4849-9d9b-702c4a565fc0} + + {b26457d2-cdb8-4c92-9ed7-a55bf6d3619e} + + + {9651a041-1019-4486-9e90-1dccfa9471e9} + @@ -282,6 +288,15 @@ Source Files\Z64 + + Source Files\Z64 + + + Source Files\Yaz0 + + + Source Files + @@ -539,6 +554,21 @@ Header Files\Z64 + + Header Files\Z64 + + + Header Files\Yaz0 + + + Header Files\Yaz0 + + + Header Files + + + Header Files\Libraries + diff --git a/ZAPDTR/ZAPD/ZAnimation.cpp b/ZAPDTR/ZAPD/ZAnimation.cpp index dced31aff..ef4735e09 100644 --- a/ZAPDTR/ZAPD/ZAnimation.cpp +++ b/ZAPDTR/ZAPD/ZAnimation.cpp @@ -112,12 +112,15 @@ void ZNormalAnimation::DeclareReferences(const std::string& prefix) const uint8_t lineLength = 14; const uint8_t offset = 0; - for (size_t i = 0; i < rotationValues.size(); i++) + if (!Globals::Instance->otrMode) { - valuesStr += StringHelper::Sprintf("0x%04X, ", rotationValues[i]); + for (size_t i = 0; i < rotationValues.size(); i++) + { + valuesStr += StringHelper::Sprintf("0x%04X, ", rotationValues[i]); - if ((i - offset + 1) % lineLength == 0) - valuesStr += "\n "; + if ((i - offset + 1) % lineLength == 0) + valuesStr += "\n "; + } } parent->AddDeclarationArray(rotationValuesOffset, DeclarationAlignment::Align4, @@ -125,13 +128,17 @@ void ZNormalAnimation::DeclareReferences(const std::string& prefix) StringHelper::Sprintf("%sFrameData", defaultPrefix.c_str()), rotationValues.size(), valuesStr); - for (size_t i = 0; i < rotationIndices.size(); i++) + if (!Globals::Instance->otrMode) { - indicesStr += StringHelper::Sprintf(" { 0x%04X, 0x%04X, 0x%04X },", rotationIndices[i].x, - rotationIndices[i].y, rotationIndices[i].z); + for (size_t i = 0; i < rotationIndices.size(); i++) + { + indicesStr += + StringHelper::Sprintf(" { 0x%04X, 0x%04X, 0x%04X },", rotationIndices[i].x, + rotationIndices[i].y, rotationIndices[i].z); - if (i != (rotationIndices.size() - 1)) - indicesStr += "\n"; + if (i != (rotationIndices.size() - 1)) + indicesStr += "\n"; + } } parent->AddDeclarationArray(rotationIndicesOffset, DeclarationAlignment::Align4, @@ -143,10 +150,11 @@ void ZNormalAnimation::DeclareReferences(const std::string& prefix) std::string ZNormalAnimation::GetBodySourceCode() const { std::string frameDataName; - Globals::Instance->GetSegmentedPtrName(rotationValuesSeg, parent, "s16", frameDataName); + Globals::Instance->GetSegmentedPtrName(rotationValuesSeg, parent, "s16", frameDataName, + parent->workerID); std::string jointIndicesName; Globals::Instance->GetSegmentedPtrName(rotationIndicesSeg, parent, "JointIndex", - jointIndicesName); + jointIndicesName, parent->workerID); std::string headerStr = StringHelper::Sprintf("\n\t{ %i }, %s,\n", frameCount, frameDataName.c_str()); @@ -183,7 +191,7 @@ void ZLinkAnimation::ParseRawData() std::string ZLinkAnimation::GetBodySourceCode() const { std::string segSymbol; - Globals::Instance->GetSegmentedPtrName(segmentAddress, parent, "", segSymbol); + Globals::Instance->GetSegmentedPtrName(segmentAddress, parent, "", segSymbol, parent->workerID); return StringHelper::Sprintf("\n\t{ %i }, %s\n", frameCount, segSymbol.c_str()); } @@ -383,12 +391,13 @@ void ZCurveAnimation::DeclareReferences(const std::string& prefix) std::string ZCurveAnimation::GetBodySourceCode() const { std::string refIndexStr; - Globals::Instance->GetSegmentedPtrName(refIndex, parent, "u8", refIndexStr); + Globals::Instance->GetSegmentedPtrName(refIndex, parent, "u8", refIndexStr, parent->workerID); std::string transformDataStr; Globals::Instance->GetSegmentedPtrName(transformData, parent, "TransformData", - transformDataStr); + transformDataStr, parent->workerID); std::string copyValuesStr; - Globals::Instance->GetSegmentedPtrName(copyValues, parent, "s16", copyValuesStr); + Globals::Instance->GetSegmentedPtrName(copyValues, parent, "s16", copyValuesStr, + parent->workerID); return StringHelper::Sprintf("\n\t%s,\n\t%s,\n\t%s,\n\t%i, %i\n", refIndexStr.c_str(), transformDataStr.c_str(), copyValuesStr.c_str(), unk_0C, unk_10); @@ -510,8 +519,10 @@ std::string ZLegacyAnimation::GetBodySourceCode() const std::string frameDataName; std::string jointKeyName; - Globals::Instance->GetSegmentedPtrName(frameData, parent, "s16", frameDataName); - Globals::Instance->GetSegmentedPtrName(jointKey, parent, "JointKey", jointKeyName); + Globals::Instance->GetSegmentedPtrName(frameData, parent, "s16", frameDataName, + parent->workerID); + Globals::Instance->GetSegmentedPtrName(jointKey, parent, "JointKey", jointKeyName, + parent->workerID); body += StringHelper::Sprintf("\t%i, %i,\n", frameCount, limbCount); body += StringHelper::Sprintf("\t%s,\n", frameDataName.c_str()); diff --git a/ZAPDTR/ZAPD/ZArray.cpp b/ZAPDTR/ZAPD/ZArray.cpp index 341ade1cf..86d73e1e6 100644 --- a/ZAPDTR/ZAPD/ZArray.cpp +++ b/ZAPDTR/ZAPD/ZArray.cpp @@ -102,8 +102,7 @@ std::string ZArray::GetBodySourceCode() const const auto& res = resList[i]; output += "\t"; - if (res->GetResourceType() == ZResourceType::Scalar || - res->GetResourceType() == ZResourceType::Vertex) + if (res->GetResourceType() == ZResourceType::Scalar || res->GetResourceType() == ZResourceType::Vertex) output += resList.at(i)->GetBodySourceCode(); else output += StringHelper::Sprintf("{ %s }", resList.at(i)->GetBodySourceCode().c_str()); diff --git a/ZAPDTR/ZAPD/ZBackground.cpp b/ZAPDTR/ZAPD/ZBackground.cpp index 0ed1eb747..94efe06e9 100644 --- a/ZAPDTR/ZAPD/ZBackground.cpp +++ b/ZAPDTR/ZAPD/ZBackground.cpp @@ -150,8 +150,11 @@ std::string ZBackground::GetExternalExtension() const void ZBackground::Save(const fs::path& outFolder) { - fs::path filepath = outFolder / (outName + "." + GetExternalExtension()); - File::WriteAllBytes(filepath.string(), data); + if (!Globals::Instance->otrMode) + { + fs::path filepath = outFolder / (outName + "." + GetExternalExtension()); + File::WriteAllBytes(filepath.string(), data); + } } std::string ZBackground::GetBodySourceCode() const diff --git a/ZAPDTR/ZAPD/ZCollision.cpp b/ZAPDTR/ZAPD/ZCollision.cpp index 11efd47e8..2a282cf2f 100644 --- a/ZAPDTR/ZAPD/ZCollision.cpp +++ b/ZAPDTR/ZAPD/ZCollision.cpp @@ -97,12 +97,15 @@ void ZCollisionHeader::DeclareReferences(const std::string& prefix) if (waterBoxes.size() > 0) { - for (size_t i = 0; i < waterBoxes.size(); i++) + if (!Globals::Instance->otrMode) { - declaration += - StringHelper::Sprintf("\t{ %s },", waterBoxes[i].GetBodySourceCode().c_str()); - if (i + 1 < waterBoxes.size()) - declaration += "\n"; + for (size_t i = 0; i < waterBoxes.size(); i++) + { + declaration += + StringHelper::Sprintf("\t{ %s },", waterBoxes[i].GetBodySourceCode().c_str()); + if (i + 1 < waterBoxes.size()) + declaration += "\n"; + } } parent->AddDeclarationArray( @@ -115,14 +118,17 @@ void ZCollisionHeader::DeclareReferences(const std::string& prefix) { declaration.clear(); - for (size_t i = 0; i < polygons.size(); i++) + if (!Globals::Instance->otrMode) { - declaration += StringHelper::Sprintf( - "\t{ 0x%04X, 0x%04X, 0x%04X, 0x%04X, 0x%04X, 0x%04X, 0x%04X, 0x%04X },", - polygons[i].type, polygons[i].vtxA, polygons[i].vtxB, polygons[i].vtxC, - polygons[i].a, polygons[i].b, polygons[i].c, polygons[i].d); - if (i + 1 < polygons.size()) - declaration += "\n"; + for (size_t i = 0; i < polygons.size(); i++) + { + declaration += StringHelper::Sprintf( + "\t{ 0x%04X, 0x%04X, 0x%04X, 0x%04X, 0x%04X, 0x%04X, 0x%04X, 0x%04X },", + polygons[i].type, polygons[i].vtxA, polygons[i].vtxB, polygons[i].vtxC, + polygons[i].a, polygons[i].b, polygons[i].c, polygons[i].d); + if (i + 1 < polygons.size()) + declaration += "\n"; + } } parent->AddDeclarationArray( @@ -132,13 +138,16 @@ void ZCollisionHeader::DeclareReferences(const std::string& prefix) } declaration.clear(); - for (size_t i = 0; i < polygonTypes.size(); i++) + if (!Globals::Instance->otrMode) { - declaration += StringHelper::Sprintf("\t{ 0x%08lX, 0x%08lX },", polygonTypes[i] >> 32, - polygonTypes[i] & 0xFFFFFFFF); + for (size_t i = 0; i < polygonTypes.size(); i++) + { + declaration += StringHelper::Sprintf("\t{ 0x%08lX, 0x%08lX },", polygonTypes[i] >> 32, + polygonTypes[i] & 0xFFFFFFFF); - if (i < polygonTypes.size() - 1) - declaration += "\n"; + if (i < polygonTypes.size() - 1) + declaration += "\n"; + } } if (polyTypeDefAddress != 0) @@ -154,13 +163,16 @@ void ZCollisionHeader::DeclareReferences(const std::string& prefix) { declaration.clear(); - for (size_t i = 0; i < vertices.size(); i++) + if (!Globals::Instance->otrMode) { - declaration += - StringHelper::Sprintf("\t{ %s },", vertices[i].GetBodySourceCode().c_str()); + for (size_t i = 0; i < vertices.size(); i++) + { + declaration += + StringHelper::Sprintf("\t{ %s },", vertices[i].GetBodySourceCode().c_str()); - if (i < vertices.size() - 1) - declaration += "\n"; + if (i < vertices.size() - 1) + declaration += "\n"; + } } const auto& first = vertices.front(); @@ -177,29 +189,36 @@ std::string ZCollisionHeader::GetBodySourceCode() const { std::string declaration = ""; + if (Globals::Instance->otrMode) + return declaration; + declaration += "\n"; declaration += StringHelper::Sprintf("\t{ %i, %i, %i },\n", absMinX, absMinY, absMinZ); declaration += StringHelper::Sprintf("\t{ %i, %i, %i },\n", absMaxX, absMaxY, absMaxZ); std::string vtxName; - Globals::Instance->GetSegmentedPtrName(vtxAddress, parent, "Vec3s", vtxName); + Globals::Instance->GetSegmentedPtrName(vtxAddress, parent, "Vec3s", vtxName, parent->workerID); declaration += StringHelper::Sprintf("\t%i,\n\t%s,\n", numVerts, vtxName.c_str()); std::string polyName; - Globals::Instance->GetSegmentedPtrName(polyAddress, parent, "CollisionPoly", polyName); + Globals::Instance->GetSegmentedPtrName(polyAddress, parent, "CollisionPoly", polyName, + parent->workerID); declaration += StringHelper::Sprintf("\t%i,\n\t%s,\n", numPolygons, polyName.c_str()); std::string surfaceName; - Globals::Instance->GetSegmentedPtrName(polyTypeDefAddress, parent, "SurfaceType", surfaceName); + Globals::Instance->GetSegmentedPtrName(polyTypeDefAddress, parent, "SurfaceType", surfaceName, + parent->workerID); declaration += StringHelper::Sprintf("\t%s,\n", surfaceName.c_str()); std::string camName; - Globals::Instance->GetSegmentedPtrName(camDataAddress, parent, "CamData", camName); + Globals::Instance->GetSegmentedPtrName(camDataAddress, parent, "CamData", camName, + parent->workerID); declaration += StringHelper::Sprintf("\t%s,\n", camName.c_str()); std::string waterBoxName; - Globals::Instance->GetSegmentedPtrName(waterBoxAddress, parent, "WaterBox", waterBoxName); + Globals::Instance->GetSegmentedPtrName(waterBoxAddress, parent, "WaterBox", waterBoxName, + parent->workerID); declaration += StringHelper::Sprintf("\t%i,\n\t%s\n", numWaterBoxes, waterBoxName.c_str()); return declaration; diff --git a/ZAPDTR/ZAPD/ZDisplayList.cpp b/ZAPDTR/ZAPD/ZDisplayList.cpp index 4c7dd7c17..93269b65e 100644 --- a/ZAPDTR/ZAPD/ZDisplayList.cpp +++ b/ZAPDTR/ZAPD/ZDisplayList.cpp @@ -553,7 +553,8 @@ int32_t ZDisplayList::OptimizationCheck_LoadTextureBlock(int32_t startIndex, std lastTexSeg = segmentNumber; - Globals::Instance->GetSegmentedPtrName(data & 0xFFFFFFFF, parent, "", texStr); + Globals::Instance->GetSegmentedPtrName(data & 0xFFFFFFFF, parent, "", texStr, + parent->workerID); } // gsDPSetTile @@ -705,7 +706,7 @@ void ZDisplayList::Opcode_G_DL(uint64_t data, const std::string& prefix, char* l if (pp != 0) { - if (!Globals::Instance->HasSegment(segNum)) + if (!Globals::Instance->HasSegment(segNum, parent->workerID)) sprintf(line, "gsSPBranchList(0x%08" PRIX64 "),", data & 0xFFFFFFFF); else if (dListDecl != nullptr) sprintf(line, "gsSPBranchList(%s),", dListDecl->varName.c_str()); @@ -715,7 +716,7 @@ void ZDisplayList::Opcode_G_DL(uint64_t data, const std::string& prefix, char* l } else { - if (!Globals::Instance->HasSegment(segNum)) + if (!Globals::Instance->HasSegment(segNum, parent->workerID)) sprintf(line, "gsSPDisplayList(0x%08" PRIX64 "),", data & 0xFFFFFFFF); else if (dListDecl != nullptr) sprintf(line, "gsSPDisplayList(%s),", dListDecl->varName.c_str()); @@ -726,7 +727,7 @@ void ZDisplayList::Opcode_G_DL(uint64_t data, const std::string& prefix, char* l // if (segNum == 8 || segNum == 9 || segNum == 10 || segNum == 11 || segNum == 12 || segNum == // 13) // Used for runtime-generated display lists - if (!Globals::Instance->HasSegment(segNum)) + if (!Globals::Instance->HasSegment(segNum, parent->workerID)) { if (pp != 0) sprintf(line, "gsSPBranchList(0x%08" PRIX64 "),", data & 0xFFFFFFFF); @@ -847,7 +848,7 @@ void ZDisplayList::Opcode_G_VTX(uint64_t data, char* line) } // Hack: Don't extract vertices from a unknown segment. - if (!Globals::Instance->HasSegment(GETSEGNUM(data))) + if (!Globals::Instance->HasSegment(GETSEGNUM(data), parent->workerID)) { segptr_t segmented = data & 0xFFFFFFFF; references.push_back(segmented); @@ -951,7 +952,7 @@ void ZDisplayList::Opcode_G_SETTIMG(uint64_t data, const std::string& prefix, ch if (parent != nullptr) { - if (Globals::Instance->HasSegment(segmentNumber)) + if (Globals::Instance->HasSegment(segmentNumber, parent->workerID)) texDecl = parent->GetDeclaration(texAddress); else texDecl = parent->GetDeclaration(data); @@ -959,7 +960,7 @@ void ZDisplayList::Opcode_G_SETTIMG(uint64_t data, const std::string& prefix, ch if (texDecl != nullptr) sprintf(texStr, "%s", texDecl->varName.c_str()); - else if (data != 0 && Globals::Instance->HasSegment(segmentNumber)) + else if (data != 0 && Globals::Instance->HasSegment(segmentNumber, parent->workerID)) sprintf(texStr, "%sTex_%06X", prefix.c_str(), texAddress); else { @@ -972,7 +973,7 @@ void ZDisplayList::Opcode_G_SETTIMG(uint64_t data, const std::string& prefix, ch else { std::string texName; - Globals::Instance->GetSegmentedPtrName(data, parent, "", texName); + Globals::Instance->GetSegmentedPtrName(data, parent, "", texName, parent->workerID); sprintf(line, "gsDPSetTextureImage(%s, %s, %i, %s),", fmtTbl[fmt], sizTbl[siz], www + 1, texName.c_str()); } @@ -1647,7 +1648,9 @@ static int32_t GfxdCallback_Vtx(uint32_t seg, int32_t count) } self->references.push_back(seg); - gfxd_puts("@r"); + + if (!Globals::Instance->otrMode) + gfxd_puts("@r"); return 1; } @@ -1670,7 +1673,7 @@ static int32_t GfxdCallback_Texture(segptr_t seg, int32_t fmt, int32_t siz, int3 self->TextureGenCheck(); std::string texName; - Globals::Instance->GetSegmentedPtrName(seg, self->parent, "", texName); + Globals::Instance->GetSegmentedPtrName(seg, self->parent, "", texName, self->parent->workerID); gfxd_puts(texName.c_str()); @@ -1694,7 +1697,7 @@ static int32_t GfxdCallback_Palette(uint32_t seg, [[maybe_unused]] int32_t idx, self->TextureGenCheck(); std::string palName; - Globals::Instance->GetSegmentedPtrName(seg, self->parent, "", palName); + Globals::Instance->GetSegmentedPtrName(seg, self->parent, "", palName, self->parent->workerID); gfxd_puts(palName.c_str()); @@ -1708,7 +1711,8 @@ static int32_t GfxdCallback_DisplayList(uint32_t seg) uint32_t dListSegNum = GETSEGNUM(seg); std::string dListName = ""; - bool addressFound = Globals::Instance->GetSegmentedPtrName(seg, self->parent, "Gfx", dListName); + bool addressFound = Globals::Instance->GetSegmentedPtrName(seg, self->parent, "Gfx", dListName, + self->parent->workerID); if (!addressFound && self->parent->segment == dListSegNum) { @@ -1731,7 +1735,8 @@ static int32_t GfxdCallback_Matrix(uint32_t seg) std::string mtxName; ZDisplayList* self = static_cast(gfxd_udata_get()); - bool addressFound = Globals::Instance->GetSegmentedPtrName(seg, self->parent, "Mtx", mtxName); + bool addressFound = Globals::Instance->GetSegmentedPtrName(seg, self->parent, "Mtx", mtxName, + self->parent->workerID); if (!addressFound && GETSEGNUM(seg) == self->parent->segment) { Declaration* decl = @@ -1805,6 +1810,23 @@ void ZDisplayList::DeclareReferences(const std::string& prefix) curAddr, firstVtx.GetDeclarationAlignment(), item.second.size() * firstVtx.GetRawDataSize(), firstVtx.GetSourceTypeName(), firstVtx.GetDefaultName(name), item.second.size(), declaration); + + /*for (auto vtx : item.second) + { + ZVtx* nVtx = new ZVtx(vtx.parent); + nVtx->x = vtx.x; + nVtx->y = vtx.y; + nVtx->z = vtx.z; + nVtx->flag = vtx.flag; + nVtx->s = vtx.s; + nVtx->t = vtx.t; + nVtx->r = vtx.r; + nVtx->g = vtx.g; + nVtx->b = vtx.b; + nVtx->a = vtx.a; + decl->vertexHack.push_back(nVtx); + }*/ + decl->isExternal = true; } } @@ -1850,15 +1872,15 @@ void ZDisplayList::DeclareReferences(const std::string& prefix) { auto& item = vertices[vtxKeys[i]]; - std::string declaration; + //std::string declaration; - for (auto& vtx : item) - declaration += StringHelper::Sprintf("\t%s,\n", vtx.GetBodySourceCode().c_str()); + //for (auto& vtx : item) + //declaration += StringHelper::Sprintf("\t%s,\n", vtx.GetBodySourceCode().c_str()); // Ensure there's always a trailing line feed to prevent dumb warnings. // Please don't remove this line, unless you somehow made a way to prevent // that warning when building the OoT repo. - declaration += "\n"; + //declaration += "\n"; if (parent != nullptr) { @@ -1870,12 +1892,6 @@ void ZDisplayList::DeclareReferences(const std::string& prefix) else vtxName = StringHelper::Sprintf("%sVtx_%06X", prefix.c_str(), vtxKeys[i]); - - if (StringHelper::Contains(vtxName, "4B18")) - { - int bp = 0; - } - auto filepath = Globals::Instance->outputPath / vtxName; std::string incStr = StringHelper::Sprintf("%s.%s.inc", filepath.string().c_str(), "vtx"); @@ -1991,7 +2007,7 @@ bool ZDisplayList::TextureGenCheck(int32_t texWidth, int32_t texHeight, uint32_t texWidth, texHeight, texIsPalette, texAddr); if ((texSeg != 0 || texAddr != 0) && texWidth > 0 && texHeight > 0 && texLoaded && - Globals::Instance->HasSegment(segmentNumber)) + Globals::Instance->HasSegment(segmentNumber, self->parent->workerID)) { ZFile* auxParent = nullptr; if (segmentNumber == self->parent->segment) @@ -2002,7 +2018,8 @@ bool ZDisplayList::TextureGenCheck(int32_t texWidth, int32_t texHeight, uint32_t { // Try to find a non-external file (i.e., one we are actually extracting) // which has the same segment number we are looking for. - for (auto& otherFile : Globals::Instance->cfg.segmentRefFiles[segmentNumber]) + auto segs = Globals::Instance->GetSegmentRefFiles(self->parent->workerID); + for (auto& otherFile : segs[segmentNumber]) { if (!otherFile->isExternalFile) { diff --git a/ZAPDTR/ZAPD/ZFile.cpp b/ZAPDTR/ZAPD/ZFile.cpp index 13ab961f8..b706c1914 100644 --- a/ZAPDTR/ZAPD/ZFile.cpp +++ b/ZAPDTR/ZAPD/ZFile.cpp @@ -41,6 +41,7 @@ ZFile::ZFile() baseAddress = 0; rangeStart = 0x000000000; rangeEnd = 0xFFFFFFFF; + workerID = 0; } ZFile::ZFile(const fs::path& nOutPath, const std::string& nName) : ZFile() @@ -51,7 +52,7 @@ ZFile::ZFile(const fs::path& nOutPath, const std::string& nName) : ZFile() } ZFile::ZFile(ZFileMode nMode, tinyxml2::XMLElement* reader, const fs::path& nBasePath, - const fs::path& nOutPath, const std::string& filename, const fs::path& nXmlFilePath) + const fs::path& nOutPath, const std::string& filename, const fs::path& nXmlFilePath, int nWorkerID) : ZFile() { xmlFilePath = nXmlFilePath; @@ -66,6 +67,7 @@ ZFile::ZFile(ZFileMode nMode, tinyxml2::XMLElement* reader, const fs::path& nBas outputPath = nOutPath; mode = nMode; + workerID = nWorkerID; ParseXML(reader, filename); if (mode != ZFileMode::ExternalFile) @@ -167,7 +169,7 @@ void ZFile::ParseXML(tinyxml2::XMLElement* reader, const std::string& filename) } } } - Globals::Instance->AddSegment(segment, this); + Globals::Instance->AddSegment(segment, this, workerID); if (Globals::Instance->verbosity >= VerbosityLevel::VERBOSITY_INFO) { @@ -181,16 +183,22 @@ void ZFile::ParseXML(tinyxml2::XMLElement* reader, const std::string& filename) } } - if (mode == ZFileMode::Extract || mode == ZFileMode::ExternalFile) + if (mode == ZFileMode::Extract || mode == ZFileMode::ExternalFile || mode == ZFileMode::ExtractDirectory) { - if (!File::Exists((basePath / name).string())) + if (Globals::Instance->fileMode != ZFileMode::ExtractDirectory) { - std::string errorHeader = StringHelper::Sprintf("binary file '%s' does not exist.", - (basePath / name).c_str()); - HANDLE_ERROR_PROCESS(WarningType::Always, errorHeader, ""); + if (!File::Exists((basePath / name).string())) + { + std::string errorHeader = StringHelper::Sprintf("binary file '%s' does not exist.", + (basePath / name).c_str()); + HANDLE_ERROR_PROCESS(WarningType::Always, errorHeader, ""); + } } - rawData = File::ReadAllBytes((basePath / name).string()); + if (Globals::Instance->fileMode == ZFileMode::ExtractDirectory) + rawData = Globals::Instance->GetBaseromFile(name); + else + rawData = Globals::Instance->GetBaseromFile((basePath / name).string()); if (reader->Attribute("RangeEnd") == nullptr) rangeEnd = rawData.size(); @@ -260,7 +268,7 @@ void ZFile::ParseXML(tinyxml2::XMLElement* reader, const std::string& filename) { ZResource* nRes = nodeMap[nodeName](this); - if (mode == ZFileMode::Extract || mode == ZFileMode::ExternalFile) + if (mode == ZFileMode::Extract || mode == ZFileMode::ExternalFile || mode == ZFileMode::ExtractDirectory) nRes->ExtractFromXML(child, rawDataIndex); switch (nRes->GetResourceType()) @@ -813,7 +821,8 @@ void ZFile::GenerateSourceHeaderFiles() if (Globals::Instance->verbosity >= VerbosityLevel::VERBOSITY_INFO) printf("Writing H file: %s\n", headerFilename.c_str()); - File::WriteAllText(headerFilename, formatter.GetOutput()); + if (Globals::Instance->fileMode != ZFileMode::ExtractDirectory) + File::WriteAllText(headerFilename, formatter.GetOutput()); } std::string ZFile::GetHeaderInclude() const @@ -999,6 +1008,10 @@ std::string ZFile::ProcessDeclarations() lastItem.second->size += curItem.second->size; lastItem.second->arrayItemCnt += curItem.second->arrayItemCnt; lastItem.second->text += "\n" + curItem.second->text; + + for (auto vtx : curItem.second->vertexHack) + lastItem.second->vertexHack.push_back(vtx); + declarations.erase(curItem.first); declarationKeys.erase(declarationKeys.begin() + i); delete curItem.second; @@ -1087,7 +1100,7 @@ void ZFile::ProcessDeclarationText(Declaration* decl) { std::string vtxName; Globals::Instance->GetSegmentedArrayIndexedName(decl->references[refIndex], 0x10, this, - "Vtx", vtxName); + "Vtx", vtxName, workerID); decl->text.replace(i, 2, vtxName); refIndex++; @@ -1190,6 +1203,9 @@ void ZFile::HandleUnaccountedData() uint32_t lastSize = 0; std::vector declsAddresses; + if (Globals::Instance->otrMode) + return; + for (const auto& item : declarations) { declsAddresses.push_back(item.first); diff --git a/ZAPDTR/ZAPD/ZFile.h b/ZAPDTR/ZAPD/ZFile.h index ac4062d5b..7860aa4d3 100644 --- a/ZAPDTR/ZAPD/ZFile.h +++ b/ZAPDTR/ZAPD/ZFile.h @@ -16,6 +16,7 @@ enum class ZFileMode BuildBackground, Extract, ExternalFile, + ExtractDirectory, Invalid, Custom = 1000, // Used for exporter file modes }; @@ -34,6 +35,8 @@ public: std::string defines; std::vector resources; + int workerID; + // Default to using virtual addresses uint32_t segment = 0x80; uint32_t baseAddress, rangeStart, rangeEnd; @@ -41,7 +44,7 @@ public: ZFile(const fs::path& nOutPath, const std::string& nName); ZFile(ZFileMode nMode, tinyxml2::XMLElement* reader, const fs::path& nBasePath, - const fs::path& nOutPath, const std::string& filename, const fs::path& nXmlFilePath); + const fs::path& nOutPath, const std::string& filename, const fs::path& nXmlFilePath, int nWorkerID); ~ZFile(); std::string GetName() const; @@ -107,12 +110,12 @@ public: static void RegisterNode(std::string nodeName, ZResourceFactoryFunc* nodeFunc); protected: - std::vector rawData; std::string name; fs::path outName = ""; fs::path basePath; fs::path outputPath; fs::path xmlFilePath; + std::vector rawData; // Keep track of every texture of this ZFile. // The pointers declared here are "borrowed" (somebody else is the owner), diff --git a/ZAPDTR/ZAPD/ZLimb.cpp b/ZAPDTR/ZAPD/ZLimb.cpp index 330fbaf7c..9eb7eac8d 100644 --- a/ZAPDTR/ZAPD/ZLimb.cpp +++ b/ZAPDTR/ZAPD/ZLimb.cpp @@ -218,18 +218,25 @@ size_t ZLimb::GetRawDataSize() const std::string ZLimb::GetBodySourceCode() const { + if (Globals::Instance->otrMode) + return ""; + std::string dListStr; std::string dListStr2; - Globals::Instance->GetSegmentedArrayIndexedName(dListPtr, 8, parent, "Gfx", dListStr); - Globals::Instance->GetSegmentedArrayIndexedName(dList2Ptr, 8, parent, "Gfx", dListStr2); + Globals::Instance->GetSegmentedArrayIndexedName(dListPtr, 8, parent, "Gfx", dListStr, + parent->workerID); + Globals::Instance->GetSegmentedArrayIndexedName(dList2Ptr, 8, parent, "Gfx", dListStr2, + parent->workerID); std::string entryStr = "\n\t"; if (type == ZLimbType::Legacy) { std::string childName; std::string siblingName; - Globals::Instance->GetSegmentedPtrName(childPtr, parent, "LegacyLimb", childName); - Globals::Instance->GetSegmentedPtrName(siblingPtr, parent, "LegacyLimb", siblingName); + Globals::Instance->GetSegmentedPtrName(childPtr, parent, "LegacyLimb", childName, + parent->workerID); + Globals::Instance->GetSegmentedPtrName(siblingPtr, parent, "LegacyLimb", siblingName, + parent->workerID); entryStr += StringHelper::Sprintf("%s,\n", dListStr.c_str()); entryStr += @@ -261,7 +268,8 @@ std::string ZLimb::GetBodySourceCode() const case ZLimbType::Skin: { std::string skinSegmentStr; - Globals::Instance->GetSegmentedPtrName(skinSegment, parent, "", skinSegmentStr); + Globals::Instance->GetSegmentedPtrName(skinSegment, parent, "", skinSegmentStr, + parent->workerID); entryStr += StringHelper::Sprintf("\t0x%02X, %s\n", skinSegmentType, skinSegmentStr.c_str()); } @@ -367,7 +375,7 @@ void ZLimb::DeclareDList(segptr_t dListSegmentedPtr, const std::string& prefix, std::string dlistName; bool declFound = Globals::Instance->GetSegmentedArrayIndexedName(dListSegmentedPtr, 8, parent, - "Gfx", dlistName); + "Gfx", dlistName, parent->workerID); if (declFound) return; diff --git a/ZAPDTR/ZAPD/ZPath.cpp b/ZAPDTR/ZAPD/ZPath.cpp index e19513db3..660821ce8 100644 --- a/ZAPDTR/ZAPD/ZPath.cpp +++ b/ZAPDTR/ZAPD/ZPath.cpp @@ -142,8 +142,8 @@ void PathwayEntry::DeclareReferences(const std::string& prefix) return; std::string pointsName; - bool addressFound = - Globals::Instance->GetSegmentedPtrName(listSegmentAddress, parent, "Vec3s", pointsName); + bool addressFound = Globals::Instance->GetSegmentedPtrName(listSegmentAddress, parent, "Vec3s", + pointsName, parent->workerID); if (addressFound) return; @@ -177,7 +177,8 @@ std::string PathwayEntry::GetBodySourceCode() const { std::string declaration; std::string listName; - Globals::Instance->GetSegmentedPtrName(listSegmentAddress, parent, "Vec3s", listName); + Globals::Instance->GetSegmentedPtrName(listSegmentAddress, parent, "Vec3s", listName, + parent->workerID); if (Globals::Instance->game == ZGame::MM_RETAIL) declaration += diff --git a/ZAPDTR/ZAPD/ZPlayerAnimationData.cpp b/ZAPDTR/ZAPD/ZPlayerAnimationData.cpp index a96604fda..ab633c129 100644 --- a/ZAPDTR/ZAPD/ZPlayerAnimationData.cpp +++ b/ZAPDTR/ZAPD/ZPlayerAnimationData.cpp @@ -3,6 +3,7 @@ #include "Utils/BitConverter.h" #include "Utils/StringHelper.h" #include "ZFile.h" +#include REGISTER_ZFILENODE(PlayerAnimationData, ZPlayerAnimationData); @@ -54,6 +55,9 @@ std::string ZPlayerAnimationData::GetBodySourceCode() const { std::string declaration = ""; + if (Globals::Instance->otrMode) + return ""; + size_t index = 0; for (const auto& entry : limbRotData) { diff --git a/ZAPDTR/ZAPD/ZResource.cpp b/ZAPDTR/ZAPD/ZResource.cpp index a5ad4cf21..c6efef073 100644 --- a/ZAPDTR/ZAPD/ZResource.cpp +++ b/ZAPDTR/ZAPD/ZResource.cpp @@ -8,6 +8,7 @@ #include "ZFile.h" #include #include +#include ZResource::ZResource(ZFile* nParent) { @@ -18,6 +19,7 @@ ZResource::ZResource(ZFile* nParent) sourceOutput = ""; rawDataIndex = 0; outputDeclaration = true; + hash = 0; RegisterRequiredAttribute("Name"); RegisterOptionalAttribute("OutName"); @@ -119,14 +121,21 @@ void ZResource::ParseXML(tinyxml2::XMLElement* reader) name = registeredAttributes.at("Name").value; - static std::regex r("[a-zA-Z_]+[a-zA-Z0-9_]*", std::regex::icase | std::regex::optimize); - if (!isInner || (isInner && name != "")) + // Disable this check for OTR file generation for now since it takes up a considerable amount of CPU time + if (!Globals::Instance->otrMode) { - if (!std::regex_match(name, r)) + static std::regex r("[a-zA-Z_]+[a-zA-Z0-9_]*", + std::regex::icase | std::regex::optimize); + + if (!isInner || (isInner && name != "")) { - HANDLE_ERROR_RESOURCE(WarningType::InvalidAttributeValue, parent, this, - rawDataIndex, "invalid value found for 'Name' attribute", ""); + if (!std::regex_match(name, r)) + { + HANDLE_ERROR_RESOURCE(WarningType::InvalidAttributeValue, parent, this, + rawDataIndex, "invalid value found for 'Name' attribute", + ""); + } } } @@ -273,6 +282,21 @@ void ZResource::GetSourceOutputCode([[maybe_unused]] const std::string& prefix) else decl->text = bodyStr; + // OTRTODO: This is a hack and we need something more elegant in the future... + if (GetResourceType() == ZResourceType::Array) + { + ZArray* arr = (ZArray*)this; + if (arr->resList[0]->GetResourceType() == ZResourceType::Vertex) + { + for (int i = 0; i < arr->resList.size(); i++) + { + ZVtx* vtx = (ZVtx*)arr->resList[i]; + decl->vertexHack.push_back(vtx); + + } + } + } + if (decl != nullptr) decl->staticConf = staticConf; } diff --git a/ZAPDTR/ZAPD/ZRom.cpp b/ZAPDTR/ZAPD/ZRom.cpp new file mode 100644 index 000000000..2a1d3c8a1 --- /dev/null +++ b/ZAPDTR/ZAPD/ZRom.cpp @@ -0,0 +1,202 @@ +#include "ZRom.h" +#include "Utils/BitConverter.h" +#include "Utils/File.h" +#include "Utils/Directory.h" +#include "yaz0/yaz0.h" + +#ifndef _MSC_VER +#include +#endif +#include + +namespace fs = std::filesystem; + +#define DMA_ENTRY_SIZE 16 + +#if defined(_MSC_VER) +#define __bswap_32 _byteswap_ulong +#define bswap_32 _byteswap_ulong +#endif + +// ROM DMA Table Start +#define OOT_OFF_NTSC_10_RC 0x7430 +#define OOT_OFF_NTSC_10 0x7430 +#define OOT_OFF_NTSC_11 0x7430 +#define OOT_OFF_PAL_10 0x7950 +#define OOT_OFF_NTSC_12 0x7960 +#define OOT_OFF_PAL_11 0x7950 +#define OOT_OFF_JP_GC 0x7170 +#define OOT_OFF_JP_MQ 0x7170 +#define OOT_OFF_US_GC 0x7170 +#define OOT_OFF_US_MQ 0x7170 +#define OOT_OFF_PAL_GC_DBG1 0x12F70 +#define OOT_OFF_PAL_MQ_DBG 0x12F70 +#define OOT_OFF_PAL_GC_DBG2 0x12F70 +#define OOT_OFF_PAL_GC 0x7170 +#define OOT_OFF_PAL_MQ 0x7170 +#define OOT_OFF_JP_GC_CE 007170 +#define OOT_OFF_CN_IQUE 0xB7A0 +#define OOT_OFF_TW_IQUE 0xB240 + +#define MM_OFF_US_10 0x1A500 +#define MM_OFF_JP_10 0x1C110 +#define MM_OFF_JP_11 0x1C050 +#define MM_OFF_DBG 0x24F60 + +#define OOT_NTSC_10 0xEC7011B7 +#define OOT_NTSC_11 0xD43DA81F +#define OOT_NTSC_12 0x693BA2AE +#define OOT_PAL_10 0xB044B569 +#define OOT_PAL_11 0xB2055FBD +#define OOT_NTSC_JP_GC_CE 0xF7F52DB8 +#define OOT_NTSC_JP_GC 0xF611F4BA +#define OOT_NTSC_US_GC 0xF3DD35BA +#define OOT_PAL_GC 0x09465AC3 +#define OOT_NTSC_JP_MQ 0xF43B45BA +#define OOT_NTSC_US_MQ 0xF034001A +#define OOT_PAL_MQ 0x1D4136F3 +#define OOT_PAL_GC_DBG1 0x871E1C92 // 03-21-2002 build +#define OOT_PAL_GC_DBG2 0x87121EFE // 03-13-2002 build +#define OOT_PAL_GC_MQ_DBG 0x917D18F6 +#define OOT_IQUE_TW 0x3D81FB3E +#define OOT_IQUE_CN 0xB1E1E07B +#define OOT_UNKNOWN 0xFFFFFFFF + +ZRom::ZRom(std::string romPath) +{ + RomVersion version; + romData = File::ReadAllBytes(romPath); + + version.crc = BitConverter::ToInt32BE(romData, 0x10); + + switch (version.crc) + { + case OOT_NTSC_10: + version.version = "N64 NTSC 1.0"; + version.listPath = "ntsc_oot.txt"; + version.offset = OOT_OFF_NTSC_10; + break; + case OOT_NTSC_11: + version.version = "N64 NTSC 1.1"; + version.listPath = "ntsc_oot.txt"; + version.offset = OOT_OFF_NTSC_11; + break; + case OOT_NTSC_12: + version.version = "N64 NTSC 1.2"; + version.listPath = "ntsc_oot.txt"; + version.offset = OOT_OFF_NTSC_12; + break; + case OOT_PAL_10: + version.version = "N64 PAL 1.0"; + version.listPath = "pal_oot.txt"; + version.offset = OOT_OFF_PAL_10; + break; + case OOT_PAL_11: + version.version = "N64 PAL 1.1"; + version.listPath = "pal_oot.txt"; + version.offset = OOT_OFF_PAL_11; + break; + case OOT_NTSC_JP_GC: + version.version = "JP GameCube (MQ Disk)"; + version.listPath = "gamecube.txt"; + version.offset = OOT_OFF_JP_GC; + break; + case OOT_NTSC_JP_GC_CE: + version.version = "GameCube (Collectors Edition Disk)"; + version.listPath = "gamecube.txt"; + version.offset = OOT_OFF_JP_GC_CE; + break; + case OOT_NTSC_JP_MQ: + version.version = "JP Master Quest"; + version.listPath = "gamecube.txt"; + version.offset = OOT_OFF_JP_MQ; + break; + case OOT_NTSC_US_MQ: + version.version = "NTSC Master Quest"; + version.listPath = "gamecube.txt"; + version.offset = OOT_OFF_JP_MQ; + break; + case OOT_NTSC_US_GC: + version.version = "NTSC GameCube"; + version.listPath = "gamecube.txt"; + version.offset = OOT_OFF_US_MQ; + break; + case OOT_PAL_GC: + version.version = "PAL GameCube"; + version.listPath = "gamecube_pal.txt"; + version.offset = OOT_OFF_PAL_GC; + break; + case OOT_PAL_MQ: + version.version = "PAL Master Quest"; + version.listPath = "gamecube_pal.txt"; + version.offset = OOT_OFF_PAL_MQ; + break; + case OOT_PAL_GC_DBG1: + version.version = "GameCube Debug 1.0"; + version.listPath = "dbg.txt"; + version.offset = OOT_OFF_PAL_GC_DBG1; + break; + case OOT_PAL_GC_DBG2: + version.version = "GameCube Debug 2.0"; + version.listPath = "dbg.txt"; + version.offset = OOT_OFF_PAL_GC_DBG2; + break; + case OOT_PAL_GC_MQ_DBG: + version.version = "GameCube MQ-Debug"; + version.listPath = "dbg.txt"; + version.offset = OOT_OFF_PAL_MQ_DBG; + break; + case OOT_IQUE_CN: + version.version = "OoT IQue"; + version.listPath = "ique.txt"; + version.offset = OOT_OFF_CN_IQUE; + break; + case OOT_IQUE_TW: + version.version = "TW IQue"; + version.listPath = "ique.txt"; + version.offset = OOT_OFF_TW_IQUE; + break; + } + + auto path = StringHelper::Sprintf("%s/%s", Globals::Instance->fileListPath.string().c_str(), version.listPath.c_str()); + auto txt = File::ReadAllText(path); + std::vector lines = StringHelper::Split(txt, "\n"); + + std::vector decompressedData(1); + + for (int i = 0; i < lines.size(); i++) + { + lines[i] = StringHelper::Strip(lines[i], "\r"); + const int romOffset = version.offset + (DMA_ENTRY_SIZE * i); + + const int virtStart = BitConverter::ToInt32BE(romData, romOffset + 0); + const int virtEnd = BitConverter::ToInt32BE(romData, romOffset + 4); + const int physStart = BitConverter::ToInt32BE(romData, romOffset + 8); + const int physEnd = BitConverter::ToInt32BE(romData, romOffset + 12); + + const bool compressed = physEnd != 0; + int size = compressed ? physEnd - physStart : virtEnd - virtStart; + + auto outData = std::vector(); + outData.resize(size); + memcpy(outData.data(), romData.data() + physStart, size); + + if (compressed) + { + int decSize = virtEnd - virtStart; + decompressedData = std::vector(); + decompressedData.resize(decSize); + yaz0_decode(outData.data(), decompressedData.data(), decSize); + files[lines[i]] = decompressedData; + } + else + files[lines[i]] = outData; + } + + int bp = 0; +} + +std::vector ZRom::GetFile(std::string fileName) +{ + return files[fileName]; +} diff --git a/ZAPDTR/ZAPD/ZRom.h b/ZAPDTR/ZAPD/ZRom.h new file mode 100644 index 000000000..ae3cac156 --- /dev/null +++ b/ZAPDTR/ZAPD/ZRom.h @@ -0,0 +1,27 @@ +#pragma once + +#include +#include +#include +#include + +class ZRom +{ +public: + ZRom(std::string romPath); + + std::vector GetFile(std::string fileName); + +protected: + std::vector romData; + std::map> files; +}; + +struct RomVersion +{ + std::string version = "None"; + std::string error = "None"; + std::string listPath = "None"; + int offset; + uint32_t crc; +}; \ No newline at end of file diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetActorCutsceneList.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetActorCutsceneList.cpp index 60391a9d1..4c9e8fb5f 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetActorCutsceneList.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetActorCutsceneList.cpp @@ -54,7 +54,8 @@ void SetActorCutsceneList::DeclareReferences(const std::string& prefix) std::string SetActorCutsceneList::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "ActorCutscene", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "ActorCutscene", listName, + parent->workerID); return StringHelper::Sprintf("SCENE_CMD_ACTOR_CUTSCENE_LIST(%i, %s)", cutscenes.size(), listName.c_str()); } diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetActorList.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetActorList.cpp index 919d86f57..1cda3c2c6 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetActorList.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetActorList.cpp @@ -81,7 +81,8 @@ void SetActorList::DeclareReferencesLate(const std::string& prefix) std::string SetActorList::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "ActorEntry", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "ActorEntry", listName, + parent->workerID); if (numActors != actors.size()) { printf("%s: numActors(%i) ~ actors(%li)\n", parent->GetName().c_str(), numActors, diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetAlternateHeaders.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetAlternateHeaders.cpp index 629d4a0b0..a89c2b74d 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetAlternateHeaders.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetAlternateHeaders.cpp @@ -48,7 +48,8 @@ void SetAlternateHeaders::DeclareReferencesLate(const std::string& prefix) for (size_t i = 0; i < headers.size(); i++) { std::string altHeaderName; - Globals::Instance->GetSegmentedPtrName(headers.at(i), parent, "", altHeaderName); + Globals::Instance->GetSegmentedPtrName(headers.at(i), parent, "", altHeaderName, + parent->workerID); declaration += StringHelper::Sprintf("\t%s,", altHeaderName.c_str()); @@ -66,7 +67,8 @@ void SetAlternateHeaders::DeclareReferencesLate(const std::string& prefix) std::string SetAlternateHeaders::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "SceneCmd*", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "SceneCmd*", listName, + parent->workerID); return StringHelper::Sprintf("SCENE_CMD_ALTERNATE_HEADER_LIST(%s)", listName.c_str()); } diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetAnimatedMaterialList.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetAnimatedMaterialList.cpp index 0b9a67e0e..73f72136c 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetAnimatedMaterialList.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetAnimatedMaterialList.cpp @@ -33,7 +33,8 @@ void SetAnimatedMaterialList::DeclareReferences(const std::string& prefix) std::string SetAnimatedMaterialList::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "AnimatedMaterial", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "AnimatedMaterial", listName, + parent->workerID); return StringHelper::Sprintf("SCENE_CMD_ANIMATED_MATERIAL_LIST(%s)", listName.c_str()); } diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetCollisionHeader.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetCollisionHeader.cpp index 03aaa4bbb..4aafb7c70 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetCollisionHeader.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetCollisionHeader.cpp @@ -29,7 +29,8 @@ void SetCollisionHeader::DeclareReferences(const std::string& prefix) std::string SetCollisionHeader::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "CollisionHeader", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "CollisionHeader", listName, + parent->workerID); return StringHelper::Sprintf("SCENE_CMD_COL_HEADER(%s)", listName.c_str()); } diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetCsCamera.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetCsCamera.cpp index 5cf0a3d03..577a89cd1 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetCsCamera.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetCsCamera.cpp @@ -71,7 +71,7 @@ void SetCsCamera::DeclareReferences(const std::string& prefix) { std::string camPointsName; Globals::Instance->GetSegmentedPtrName(cameras.at(0).GetCamAddress(), parent, "Vec3s", - camPointsName); + camPointsName, parent->workerID); std::string declaration; size_t index = 0; @@ -103,7 +103,8 @@ void SetCsCamera::DeclareReferences(const std::string& prefix) std::string SetCsCamera::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "CsCameraEntry", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "CsCameraEntry", listName, + parent->workerID); return StringHelper::Sprintf("SCENE_CMD_ACTOR_CUTSCENE_CAM_LIST(%i, %s)", cameras.size(), listName.c_str()); } diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetCutscenes.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetCutscenes.cpp index e51e550b0..106f6f680 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetCutscenes.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetCutscenes.cpp @@ -86,7 +86,8 @@ void SetCutscenes::ParseRawData() std::string SetCutscenes::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "CutsceneData", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "CutsceneData", listName, + parent->workerID); if (Globals::Instance->game == ZGame::MM_RETAIL) return StringHelper::Sprintf("SCENE_CMD_CUTSCENE_LIST(%i, %s)", numCutscenes, diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetEntranceList.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetEntranceList.cpp index 8099bacf1..aa20102ff 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetEntranceList.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetEntranceList.cpp @@ -63,7 +63,8 @@ void SetEntranceList::DeclareReferencesLate([[maybe_unused]] const std::string& std::string SetEntranceList::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "EntranceEntry", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "EntranceEntry", listName, + parent->workerID); return StringHelper::Sprintf("SCENE_CMD_ENTRANCE_LIST(%s)", listName.c_str()); } diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetExitList.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetExitList.cpp index ddc4c5d43..34d2a6e56 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetExitList.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetExitList.cpp @@ -58,7 +58,7 @@ void SetExitList::DeclareReferencesLate([[maybe_unused]] const std::string& pref std::string SetExitList::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "u16", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "u16", listName, parent->workerID); return StringHelper::Sprintf("SCENE_CMD_EXIT_LIST(%s)", listName.c_str()); } diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetLightList.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetLightList.cpp index 2e023ff20..060fce0a2 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetLightList.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetLightList.cpp @@ -52,7 +52,8 @@ void SetLightList::DeclareReferences(const std::string& prefix) std::string SetLightList::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "LightInfo", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "LightInfo", listName, + parent->workerID); return StringHelper::Sprintf("SCENE_CMD_LIGHT_LIST(%i, %s)", numLights, listName.c_str()); } diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetLightingSettings.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetLightingSettings.cpp index 08cd83d14..4824f3f61 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetLightingSettings.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetLightingSettings.cpp @@ -44,7 +44,8 @@ void SetLightingSettings::DeclareReferences(const std::string& prefix) std::string SetLightingSettings::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "LightSettings", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "LightSettings", listName, + parent->workerID); return StringHelper::Sprintf("SCENE_CMD_ENV_LIGHT_SETTINGS(%i, %s)", settings.size(), listName.c_str()); } diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetMesh.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetMesh.cpp index ba0bbe2c2..0723fcf14 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetMesh.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetMesh.cpp @@ -78,7 +78,7 @@ std::string SetMesh::GenDListExterns(ZDisplayList* dList) std::string SetMesh::GetBodySourceCode() const { std::string list; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "", list); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "", list, parent->workerID); return StringHelper::Sprintf("SCENE_CMD_MESH(%s)", list.c_str()); } @@ -129,8 +129,8 @@ std::string PolygonDlist::GetBodySourceCode() const std::string bodyStr; std::string opaStr; std::string xluStr; - Globals::Instance->GetSegmentedPtrName(opa, parent, "Gfx", opaStr); - Globals::Instance->GetSegmentedPtrName(xlu, parent, "Gfx", xluStr); + Globals::Instance->GetSegmentedPtrName(opa, parent, "Gfx", opaStr, parent->workerID); + Globals::Instance->GetSegmentedPtrName(xlu, parent, "Gfx", xluStr, parent->workerID); if (polyType == 2) { @@ -294,7 +294,7 @@ std::string BgImage::GetBodySourceCode() const } std::string backgroundName; - Globals::Instance->GetSegmentedPtrName(source, parent, "", backgroundName); + Globals::Instance->GetSegmentedPtrName(source, parent, "", backgroundName, parent->workerID); bodyStr += StringHelper::Sprintf("%s, ", backgroundName.c_str()); bodyStr += "\n "; if (!isSubStruct) @@ -493,7 +493,7 @@ std::string PolygonType1::GetBodySourceCode() const bodyStr += StringHelper::Sprintf("%i, %i, ", type, format); std::string dlistStr; - Globals::Instance->GetSegmentedPtrName(dlist, parent, "", dlistStr); + Globals::Instance->GetSegmentedPtrName(dlist, parent, "", dlistStr, parent->workerID); bodyStr += StringHelper::Sprintf("%s, ", dlistStr.c_str()); bodyStr += "}, \n"; @@ -505,7 +505,7 @@ std::string PolygonType1::GetBodySourceCode() const bodyStr += single.GetBodySourceCode(); break; case 2: - Globals::Instance->GetSegmentedPtrName(list, parent, "BgImage", listStr); + Globals::Instance->GetSegmentedPtrName(list, parent, "BgImage", listStr, parent->workerID); bodyStr += StringHelper::Sprintf(" %i, %s, \n", count, listStr.c_str()); break; @@ -592,7 +592,7 @@ void PolygonType2::DeclareReferences(const std::string& prefix) std::string PolygonType2::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(start, parent, "", listName); + Globals::Instance->GetSegmentedPtrName(start, parent, "", listName, parent->workerID); std::string body = StringHelper::Sprintf("\n %i, %i,\n", type, polyDLists.size()); body += StringHelper::Sprintf(" %s,\n", listName.c_str()); diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetMinimapChests.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetMinimapChests.cpp index ec432b7d9..3e6c72a11 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetMinimapChests.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetMinimapChests.cpp @@ -50,7 +50,8 @@ void SetMinimapChests::DeclareReferences(const std::string& prefix) std::string SetMinimapChests::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "MinimapChest", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "MinimapChest", listName, + parent->workerID); return StringHelper::Sprintf("SCENE_CMD_MINIMAP_COMPASS_ICON_INFO(0x%02X, %s)", chests.size(), listName.c_str()); } diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetMinimapList.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetMinimapList.cpp index be5d8f15d..255bd4e3a 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetMinimapList.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetMinimapList.cpp @@ -52,7 +52,8 @@ void SetMinimapList::DeclareReferences(const std::string& prefix) { std::string listName; - Globals::Instance->GetSegmentedPtrName(listSegmentAddr, parent, "MinimapEntry", listName); + Globals::Instance->GetSegmentedPtrName(listSegmentAddr, parent, "MinimapEntry", listName, + parent->workerID); std::string declaration = StringHelper::Sprintf("\n\t%s, 0x%08X\n", listName.c_str(), unk4); parent->AddDeclaration( @@ -65,7 +66,8 @@ void SetMinimapList::DeclareReferences(const std::string& prefix) std::string SetMinimapList::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "MinimapList", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "MinimapList", listName, + parent->workerID); return StringHelper::Sprintf("SCENE_CMD_MINIMAP_INFO(%s)", listName.c_str()); } diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetObjectList.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetObjectList.cpp index fdd41e6cb..29519d3ce 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetObjectList.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetObjectList.cpp @@ -51,7 +51,7 @@ void SetObjectList::DeclareReferences(const std::string& prefix) std::string SetObjectList::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "s16", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "s16", listName, parent->workerID); return StringHelper::Sprintf("SCENE_CMD_OBJECT_LIST(%i, %s)", objects.size(), listName.c_str()); } diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetPathways.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetPathways.cpp index 468aad822..f3bdb0872 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetPathways.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetPathways.cpp @@ -50,7 +50,7 @@ void SetPathways::DeclareReferencesLate(const std::string& prefix) std::string SetPathways::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "Path", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "Path", listName, parent->workerID); return StringHelper::Sprintf("SCENE_CMD_PATH_LIST(%s)", listName.c_str()); } diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetRoomList.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetRoomList.cpp index 7027fa1f9..a63dd8772 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetRoomList.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetRoomList.cpp @@ -34,7 +34,7 @@ void SetRoomList::DeclareReferences(const std::string& prefix) std::string SetRoomList::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "RomFile", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "RomFile", listName, parent->workerID); return StringHelper::Sprintf("SCENE_CMD_ROOM_LIST(%i, %s)", romfile->rooms.size(), listName.c_str()); } diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetStartPositionList.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetStartPositionList.cpp index f75b5e0d5..32a2b7000 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetStartPositionList.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetStartPositionList.cpp @@ -51,7 +51,8 @@ void SetStartPositionList::DeclareReferences(const std::string& prefix) std::string SetStartPositionList::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "ActorEntry", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "ActorEntry", listName, + parent->workerID); return StringHelper::Sprintf("SCENE_CMD_SPAWN_LIST(%i, %s)", actors.size(), listName.c_str()); } diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetTransitionActorList.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetTransitionActorList.cpp index a33d1c6e1..2414f0d2f 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetTransitionActorList.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetTransitionActorList.cpp @@ -52,7 +52,8 @@ void SetTransitionActorList::DeclareReferences(const std::string& prefix) std::string SetTransitionActorList::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "TransitionActorEntry", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "TransitionActorEntry", listName, + parent->workerID); return StringHelper::Sprintf("SCENE_CMD_TRANSITION_ACTOR_LIST(%i, %s)", transitionActors.size(), listName.c_str()); } diff --git a/ZAPDTR/ZAPD/ZSkeleton.cpp b/ZAPDTR/ZAPD/ZSkeleton.cpp index bab1f9111..bff4b8263 100644 --- a/ZAPDTR/ZAPD/ZSkeleton.cpp +++ b/ZAPDTR/ZAPD/ZSkeleton.cpp @@ -89,7 +89,8 @@ void ZSkeleton::DeclareReferences(const std::string& prefix) std::string ZSkeleton::GetBodySourceCode() const { std::string limbArrayName; - Globals::Instance->GetSegmentedPtrName(limbsArrayAddress, parent, "", limbArrayName); + Globals::Instance->GetSegmentedPtrName(limbsArrayAddress, parent, "", limbArrayName, + parent->workerID); switch (type) { @@ -245,7 +246,8 @@ std::string ZLimbTable::GetBodySourceCode() const for (size_t i = 0; i < count; i++) { std::string limbName; - Globals::Instance->GetSegmentedPtrName(limbsAddresses[i], parent, "", limbName); + Globals::Instance->GetSegmentedPtrName(limbsAddresses[i], parent, "", limbName, + parent->workerID); body += StringHelper::Sprintf("\t%s,", limbName.c_str()); if (i + 1 < count) diff --git a/ZAPDTR/ZAPD/ZText.cpp b/ZAPDTR/ZAPD/ZText.cpp index 926761784..58af61bc9 100644 --- a/ZAPDTR/ZAPD/ZText.cpp +++ b/ZAPDTR/ZAPD/ZText.cpp @@ -21,11 +21,12 @@ void ZText::ParseRawData() const auto& rawData = parent->GetRawData(); uint32_t currentPtr = StringHelper::StrToL(registeredAttributes.at("CodeOffset").value, 16); - std::vector codeData = File::ReadAllBytes(Globals::Instance->baseRomPath.string() + "\\code"); + std::vector codeData; - // In some cases with the multi-process extractor it seems that it fails to read the code file if something else is reading from it at the same time. - while (codeData.size() == 0) - codeData = File::ReadAllBytes(Globals::Instance->baseRomPath.string() + "\\code"); + if (Globals::Instance->fileMode == ZFileMode::ExtractDirectory) + codeData = Globals::Instance->GetBaseromFile("code"); + else + codeData = Globals::Instance->GetBaseromFile(Globals::Instance->baseRomPath.string() + "code"); while (true) { diff --git a/ZAPDTR/ZAPD/ZTexture.cpp b/ZAPDTR/ZAPD/ZTexture.cpp index 46d7ce334..24f12702b 100644 --- a/ZAPDTR/ZAPD/ZTexture.cpp +++ b/ZAPDTR/ZAPD/ZTexture.cpp @@ -807,25 +807,30 @@ Declaration* ZTexture::DeclareVar(const std::string& prefix, std::string ZTexture::GetBodySourceCode() const { std::string sourceOutput; - size_t texSizeInc = (dWordAligned) ? 8 : 4; - for (size_t i = 0; i < textureDataRaw.size(); i += texSizeInc) - { - if (i % 32 == 0) - sourceOutput += " "; - if (dWordAligned) - sourceOutput += - StringHelper::Sprintf("0x%016llX, ", BitConverter::ToUInt64BE(textureDataRaw, i)); - else - sourceOutput += - StringHelper::Sprintf("0x%08llX, ", BitConverter::ToUInt32BE(textureDataRaw, i)); - if (i % 32 == 24) - sourceOutput += StringHelper::Sprintf(" // 0x%06X \n", rawDataIndex + ((i / 32) * 32)); - } - // Ensure there's always a trailing line feed to prevent dumb warnings. - // Please don't remove this line, unless you somehow made a way to prevent - // that warning when building the OoT repo. - sourceOutput += "\n"; + if (!Globals::Instance->otrMode) + { + size_t texSizeInc = (dWordAligned) ? 8 : 4; + for (size_t i = 0; i < textureDataRaw.size(); i += texSizeInc) + { + if (i % 32 == 0) + sourceOutput += " "; + if (dWordAligned) + sourceOutput += StringHelper::Sprintf("0x%016llX, ", + BitConverter::ToUInt64BE(textureDataRaw, i)); + else + sourceOutput += StringHelper::Sprintf("0x%08llX, ", + BitConverter::ToUInt32BE(textureDataRaw, i)); + if (i % 32 == 24) + sourceOutput += + StringHelper::Sprintf(" // 0x%06X \n", rawDataIndex + ((i / 32) * 32)); + } + + // Ensure there's always a trailing line feed to prevent dumb warnings. + // Please don't remove this line, unless you somehow made a way to prevent + // that warning when building the OoT repo. + sourceOutput += "\n"; + } return sourceOutput; } @@ -847,8 +852,11 @@ std::string ZTexture::GetSourceTypeName() const void ZTexture::CalcHash() { - auto parentRawData = parent->GetRawData(); - hash = CRC32B(parentRawData.data() + rawDataIndex, GetRawDataSize()); + //if (hash == 0) + { + const auto& parentRawData = parent->GetRawData(); + hash = CRC32B(parentRawData.data() + rawDataIndex, GetRawDataSize()); + } } std::string ZTexture::GetExternalExtension() const diff --git a/ZAPDTR/ZAPD/ZTextureAnimation.cpp b/ZAPDTR/ZAPD/ZTextureAnimation.cpp index 698054fa8..233a54dbb 100644 --- a/ZAPDTR/ZAPD/ZTextureAnimation.cpp +++ b/ZAPDTR/ZAPD/ZTextureAnimation.cpp @@ -349,9 +349,12 @@ std::string TextureColorChangingParams::GetBodySourceCode() const std::string envColorListName; std::string frameDataListName; - Globals::Instance->GetSegmentedPtrName(primColorListAddress, parent, "", primColorListName); - Globals::Instance->GetSegmentedPtrName(envColorListAddress, parent, "", envColorListName); - Globals::Instance->GetSegmentedPtrName(frameDataListAddress, parent, "", frameDataListName); + Globals::Instance->GetSegmentedPtrName(primColorListAddress, parent, "", primColorListName, + parent->workerID); + Globals::Instance->GetSegmentedPtrName(envColorListAddress, parent, "", envColorListName, + parent->workerID); + Globals::Instance->GetSegmentedPtrName(frameDataListAddress, parent, "", frameDataListName, + parent->workerID); std::string bodyStr = StringHelper::Sprintf( "\n %d, %d, %s, %s, %s,\n", animLength, colorListCount, primColorListName.c_str(), @@ -423,7 +426,8 @@ void TextureCyclingParams::DeclareReferences([[maybe_unused]] const std::string& for (const auto& tex : textureList) { - bool texFound = Globals::Instance->GetSegmentedPtrName(tex, parent, "", texName); + bool texFound = + Globals::Instance->GetSegmentedPtrName(tex, parent, "", texName, parent->workerID); // texName is a raw segmented pointer. This occurs if the texture is not declared // separately since we cannot read the format. In theory we could scan DLists for the @@ -477,9 +481,10 @@ std::string TextureCyclingParams::GetBodySourceCode() const std::string textureListName; std::string textureIndexListName; - Globals::Instance->GetSegmentedPtrName(textureListAddress, parent, "", textureListName); + Globals::Instance->GetSegmentedPtrName(textureListAddress, parent, "", textureListName, + parent->workerID); Globals::Instance->GetSegmentedPtrName(textureIndexListAddress, parent, "", - textureIndexListName); + textureIndexListName, parent->workerID); std::string bodyStr = StringHelper::Sprintf( "\n %d, %s, %s,\n", cycleLength, textureListName.c_str(), textureIndexListName.c_str()); @@ -652,7 +657,8 @@ std::string ZTextureAnimation::GetBodySourceCode() const for (const auto& entry : entries) { std::string paramName; - Globals::Instance->GetSegmentedPtrName(entry.paramsPtr, parent, "", paramName); + Globals::Instance->GetSegmentedPtrName(entry.paramsPtr, parent, "", paramName, + parent->workerID); bodyStr += StringHelper::Sprintf("\t{ %d, %d, %s },\n", entry.segment, entry.type, paramName.c_str()); diff --git a/ZAPDTR/ZAPD/ctpl_stl.h b/ZAPDTR/ZAPD/ctpl_stl.h new file mode 100644 index 000000000..8e2d9c908 --- /dev/null +++ b/ZAPDTR/ZAPD/ctpl_stl.h @@ -0,0 +1,251 @@ +/********************************************************* +* +* Copyright (C) 2014 by Vitaliy Vitsentiy +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*********************************************************/ + + +#ifndef __ctpl_stl_thread_pool_H__ +#define __ctpl_stl_thread_pool_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + + +// thread pool to run user's functors with signature +// ret func(int id, other_params) +// where id is the index of the thread that runs the functor +// ret is some return type + + +namespace ctpl { + + namespace detail { + template + class Queue { + public: + bool push(T const & value) { + std::unique_lock lock(this->mutex); + this->q.push(value); + return true; + } + // deletes the retrieved element, do not use for non integral types + bool pop(T & v) { + std::unique_lock lock(this->mutex); + if (this->q.empty()) + return false; + v = this->q.front(); + this->q.pop(); + return true; + } + bool empty() { + std::unique_lock lock(this->mutex); + return this->q.empty(); + } + private: + std::queue q; + std::mutex mutex; + }; + } + + class thread_pool { + + public: + + thread_pool() { this->init(); } + thread_pool(int nThreads) { this->init(); this->resize(nThreads); } + + // the destructor waits for all the functions in the queue to be finished + ~thread_pool() { + this->stop(true); + } + + // get the number of running threads in the pool + int size() { return static_cast(this->threads.size()); } + + // number of idle threads + int n_idle() { return this->nWaiting; } + std::thread & get_thread(int i) { return *this->threads[i]; } + + // change the number of threads in the pool + // should be called from one thread, otherwise be careful to not interleave, also with this->stop() + // nThreads must be >= 0 + void resize(int nThreads) { + if (!this->isStop && !this->isDone) { + int oldNThreads = static_cast(this->threads.size()); + if (oldNThreads <= nThreads) { // if the number of threads is increased + this->threads.resize(nThreads); + this->flags.resize(nThreads); + + for (int i = oldNThreads; i < nThreads; ++i) { + this->flags[i] = std::make_shared>(false); + this->set_thread(i); + } + } + else { // the number of threads is decreased + for (int i = oldNThreads - 1; i >= nThreads; --i) { + *this->flags[i] = true; // this thread will finish + this->threads[i]->detach(); + } + { + // stop the detached threads that were waiting + std::unique_lock lock(this->mutex); + this->cv.notify_all(); + } + this->threads.resize(nThreads); // safe to delete because the threads are detached + this->flags.resize(nThreads); // safe to delete because the threads have copies of shared_ptr of the flags, not originals + } + } + } + + // empty the queue + void clear_queue() { + std::function * _f; + while (this->q.pop(_f)) + delete _f; // empty the queue + } + + // pops a functional wrapper to the original function + std::function pop() { + std::function * _f = nullptr; + this->q.pop(_f); + std::unique_ptr> func(_f); // at return, delete the function even if an exception occurred + std::function f; + if (_f) + f = *_f; + return f; + } + + // wait for all computing threads to finish and stop all threads + // may be called asynchronously to not pause the calling thread while waiting + // if isWait == true, all the functions in the queue are run, otherwise the queue is cleared without running the functions + void stop(bool isWait = false) { + if (!isWait) { + if (this->isStop) + return; + this->isStop = true; + for (int i = 0, n = this->size(); i < n; ++i) { + *this->flags[i] = true; // command the threads to stop + } + this->clear_queue(); // empty the queue + } + else { + if (this->isDone || this->isStop) + return; + this->isDone = true; // give the waiting threads a command to finish + } + { + std::unique_lock lock(this->mutex); + this->cv.notify_all(); // stop all waiting threads + } + for (int i = 0; i < static_cast(this->threads.size()); ++i) { // wait for the computing threads to finish + if (this->threads[i]->joinable()) + this->threads[i]->join(); + } + // if there were no threads in the pool but some functors in the queue, the functors are not deleted by the threads + // therefore delete them here + this->clear_queue(); + this->threads.clear(); + this->flags.clear(); + } + + template + auto push(F && f, Rest&&... rest) ->std::future { + auto pck = std::make_shared>( + std::bind(std::forward(f), std::placeholders::_1, std::forward(rest)...) + ); + auto _f = new std::function([pck](int id) { + (*pck)(id); + }); + this->q.push(_f); + std::unique_lock lock(this->mutex); + this->cv.notify_one(); + return pck->get_future(); + } + + // run the user's function that excepts argument int - id of the running thread. returned value is templatized + // operator returns std::future, where the user can get the result and rethrow the catched exceptins + template + auto push(F && f) ->std::future { + auto pck = std::make_shared>(std::forward(f)); + auto _f = new std::function([pck](int id) { + (*pck)(id); + }); + this->q.push(_f); + std::unique_lock lock(this->mutex); + this->cv.notify_one(); + return pck->get_future(); + } + + + private: + + // deleted + thread_pool(const thread_pool &);// = delete; + thread_pool(thread_pool &&);// = delete; + thread_pool & operator=(const thread_pool &);// = delete; + thread_pool & operator=(thread_pool &&);// = delete; + + void set_thread(int i) { + std::shared_ptr> flag(this->flags[i]); // a copy of the shared ptr to the flag + auto f = [this, i, flag/* a copy of the shared ptr to the flag */]() { + std::atomic & _flag = *flag; + std::function * _f; + bool isPop = this->q.pop(_f); + while (true) { + while (isPop) { // if there is anything in the queue + std::unique_ptr> func(_f); // at return, delete the function even if an exception occurred + (*_f)(i); + if (_flag) + return; // the thread is wanted to stop, return even if the queue is not empty yet + else + isPop = this->q.pop(_f); + } + // the queue is empty here, wait for the next command + std::unique_lock lock(this->mutex); + ++this->nWaiting; + this->cv.wait(lock, [this, &_f, &isPop, &_flag](){ isPop = this->q.pop(_f); return isPop || this->isDone || _flag; }); + --this->nWaiting; + if (!isPop) + return; // if the queue is empty and this->isDone == true or *flag then return + } + }; + this->threads[i].reset(new std::thread(f)); // compiler may not support std::make_unique() + } + + void init() { this->nWaiting = 0; this->isStop = false; this->isDone = false; } + + std::vector> threads; + std::vector>> flags; + detail::Queue *> q; + std::atomic isDone; + std::atomic isStop; + std::atomic nWaiting; // how many threads are waiting + + std::mutex mutex; + std::condition_variable cv; + }; + +} + +#endif // __ctpl_stl_thread_pool_H__ \ No newline at end of file diff --git a/ZAPDTR/ZAPD/yaz0/readwrite.h b/ZAPDTR/ZAPD/yaz0/readwrite.h new file mode 100644 index 000000000..af3471590 --- /dev/null +++ b/ZAPDTR/ZAPD/yaz0/readwrite.h @@ -0,0 +1,29 @@ +#ifndef __READWRITE_H__ +#define __READWRITE_H__ + +#include + +/* variables */ +union { + uint32_t u; + float f; +} __u32_f32_union__; + +#define U32(x) \ + ((uint32_t)((((uint8_t*)(x))[0] << 24) | (((uint8_t*)(x))[1] << 16) | \ + (((uint8_t*)(x))[2] << 8) | ((uint8_t*)(x))[3])) +#define U16(x) ((uint16_t)(((*((uint8_t*)(x))) << 8) | ((uint8_t*)(x))[1])) +#define U8(x) ((uint8_t)((uint8_t*)(x))[0]) +#define S32(x) ((int32_t)(U32(x))) +#define S16(x) ((int16_t)(U16(x))) +#define F32(x) (((__u32_f32_union__.u = U32(x)) & 0) + __u32_f32_union__.f) + +#define W32(x, v) \ + { \ + *((uint8_t*)x + 3) = ((v)&0xFF); \ + *((uint8_t*)x + 2) = (((v) >> 8) & 0xFF); \ + *((uint8_t*)x + 1) = (((v) >> 16) & 0xFF); \ + *((uint8_t*)x + 0) = (((v) >> 24) & 0xFF); \ + } + +#endif \ No newline at end of file diff --git a/ZAPDTR/ZAPD/yaz0/yaz0.cpp b/ZAPDTR/ZAPD/yaz0/yaz0.cpp new file mode 100644 index 000000000..885f41d1d --- /dev/null +++ b/ZAPDTR/ZAPD/yaz0/yaz0.cpp @@ -0,0 +1,227 @@ +#include +#include +#include +#include +#include +#include "readwrite.h" + +#include "yaz0.h" + +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; + +/* internal declarations */ +int yaz0_encode_internal(const u8* src, int srcSize, u8* Data); + +int yaz0_get_size(u8* src) { return U32(src + 0x4); } + +u32 toDWORD(u32 d) { + u8 w1 = d & 0xFF; + u8 w2 = (d >> 8) & 0xFF; + u8 w3 = (d >> 16) & 0xFF; + u8 w4 = d >> 24; + return (w1 << 24) | (w2 << 16) | (w3 << 8) | w4; +} + +// simple and straight encoding scheme for Yaz0 +u32 longest_match_brute(const u8* src, int size, int pos, u32* pMatchPos) { + int startPos = pos - 0x1000; + int max_match_size = size - pos; + u32 best_match_size = 0; + u32 best_match_pos = 0; + + if (max_match_size < 3) return 0; + + if (startPos < 0) startPos = 0; + + if (max_match_size > 0x111) max_match_size = 0x111; + + for (int i = startPos; i < pos; i++) { + int current_size; + for (current_size = 0; current_size < max_match_size; current_size++) { + if (src[i + current_size] != src[pos + current_size]) { + break; + } + } + if (current_size > best_match_size) { + best_match_size = current_size; + best_match_pos = i; + if (best_match_size == 0x111) break; + } + } + *pMatchPos = best_match_pos; + return best_match_size; +} + +u32 longest_match_rabinkarp(const u8* src, int size, int pos, u32* match_pos) { + int startPos = pos - 0x1000; + int max_match_size = size - pos; + u32 best_match_size = 0; + u32 best_match_pos = 0; + + if (max_match_size < 3) return 0; + + if (startPos < 0) startPos = 0; + + if (max_match_size > 0x111) max_match_size = 0x111; + + int find_hash = src[pos] << 16 | src[pos + 1] << 8 | src[pos + 2]; + int current_hash = src[startPos] << 16 | src[startPos + 1] << 8 | src[startPos + 2]; + + for (int i = startPos; i < pos; i++) { + if(current_hash == find_hash) { + int current_size; + for (current_size = 3; current_size < max_match_size; current_size++) { + if (src[i + current_size] != src[pos + current_size]) { + break; + } + } + if (current_size > best_match_size) { + best_match_size = current_size; + best_match_pos = i; + if (best_match_size == 0x111) break; + } + } + current_hash = (current_hash << 8 | src[i + 3]) & 0xFFFFFF; + } + *match_pos = best_match_pos; + + return best_match_size; +} + +int yaz0_encode_internal(const u8* src, int srcSize, u8* Data) { + int srcPos = 0; + + int bitmask = 0x80; + u8 currCodeByte = 0; + int currCodeBytePos = 0; + int pos = currCodeBytePos + 1; + + while (srcPos < srcSize) { + u32 numBytes; + u32 matchPos; + + numBytes = longest_match_rabinkarp(src, srcSize, srcPos, &matchPos); + //fprintf(stderr, "pos %x len %x pos %x\n", srcPos, (int)numBytes, (int)matchPos); + if (numBytes < 3) { + //fprintf(stderr, "single byte %02x\n", src[srcPos]); + Data[pos++] = src[srcPos++]; + currCodeByte |= bitmask; + } else { + // RLE part + u32 dist = srcPos - matchPos - 1; + + if (numBytes >= 0x12) // 3 byte encoding + { + Data[pos++] = dist >> 8; // 0R + Data[pos++] = dist & 0xFF; // FF + if (numBytes > 0xFF + 0x12) numBytes = 0xFF + 0x12; + Data[pos++] = numBytes - 0x12; + } else // 2 byte encoding + { + Data[pos++] = ((numBytes - 2) << 4) | (dist >> 8); + Data[pos++] = dist & 0xFF; + } + srcPos += numBytes; + } + bitmask >>= 1; + // write eight codes + if (!bitmask) { + Data[currCodeBytePos] = currCodeByte; + currCodeBytePos = pos++; + + currCodeByte = 0; + bitmask = 0x80; + } + } + if (bitmask) { + Data[currCodeBytePos] = currCodeByte; + } + + return pos; +} + +std::vector yaz0_encode_fast(const u8* src, int src_size) { + std::vector buffer; + std::vector> lut; + lut.resize(0x1000000); + + for (int i = 0; i < src_size - 3; ++i) { + lut[src[i + 0] << 16 | src[i + 1] << 8 | src[i + 2]].push_back(i); + } + + return buffer; +} + +std::vector yaz0_encode(const u8* src, int src_size) { + std::vector buffer(src_size * 10 / 8 + 16); + u8* dst = buffer.data(); + + // write 4 bytes yaz0 header + memcpy(dst, "Yaz0", 4); + + // write 4 bytes uncompressed size + W32(dst + 4, src_size); + + // encode + int dst_size = yaz0_encode_internal(src, src_size, dst + 16); + int aligned_size = (dst_size + 31) & -16; + buffer.resize(aligned_size); + +#if 0 + std::vector decompressed(src_size); + yaz0_decode(buffer.data(), decompressed.data(), src_size); + if(memcmp(src, decompressed.data(), src_size)) { + fprintf(stderr, "Decompressed buffer is different from original\n"); + } +#endif + + return buffer; +} + +void yaz0_decode(const uint8_t* source, uint8_t* decomp, int32_t decompSize) { + uint32_t srcPlace = 0, dstPlace = 0; + uint32_t i, dist, copyPlace, numBytes; + uint8_t codeByte, byte1, byte2; + uint8_t bitCount = 0; + + source += 0x10; + while (dstPlace < decompSize) { + /* If there are no more bits to test, get a new byte */ + if (!bitCount) { + codeByte = source[srcPlace++]; + bitCount = 8; + } + + /* If bit 7 is a 1, just copy 1 byte from source to destination */ + /* Else do some decoding */ + if (codeByte & 0x80) { + decomp[dstPlace++] = source[srcPlace++]; + } else { + /* Get 2 bytes from source */ + byte1 = source[srcPlace++]; + byte2 = source[srcPlace++]; + + /* Calculate distance to move in destination */ + /* And the number of bytes to copy */ + dist = ((byte1 & 0xF) << 8) | byte2; + copyPlace = dstPlace - (dist + 1); + numBytes = byte1 >> 4; + + /* Do more calculations on the number of bytes to copy */ + if (!numBytes) + numBytes = source[srcPlace++] + 0x12; + else + numBytes += 2; + + /* Copy data from a previous point in destination */ + /* to current point in destination */ + for (i = 0; i < numBytes; i++) decomp[dstPlace++] = decomp[copyPlace++]; + } + + /* Set up for the next read cycle */ + codeByte = codeByte << 1; + bitCount--; + } +} \ No newline at end of file diff --git a/ZAPDTR/ZAPD/yaz0/yaz0.h b/ZAPDTR/ZAPD/yaz0/yaz0.h new file mode 100644 index 000000000..0d5cc3cfd --- /dev/null +++ b/ZAPDTR/ZAPD/yaz0/yaz0.h @@ -0,0 +1,6 @@ +#pragma once + +#include + +void yaz0_decode(const uint8_t* src, uint8_t* dest, int32_t destsize); +std::vector yaz0_encode(const uint8_t* src, int src_size); \ No newline at end of file diff --git a/ZAPDTR/ZAPDUtils/ZAPDUtils.vcxproj b/ZAPDTR/ZAPDUtils/ZAPDUtils.vcxproj index dd49779dc..b74fe75f9 100644 --- a/ZAPDTR/ZAPDUtils/ZAPDUtils.vcxproj +++ b/ZAPDTR/ZAPDUtils/ZAPDUtils.vcxproj @@ -72,15 +72,27 @@ true + MinimumRecommendedRules.ruleset + + false + MinimumRecommendedRules.ruleset + + true + MinimumRecommendedRules.ruleset + + false + MinimumRecommendedRules.ruleset + + @@ -174,6 +186,12 @@ + + + {02d10590-9542-3f55-aaf8-6055677e2a2a} + false + + diff --git a/ZAPDTR/ZAPDUtils/ZAPDUtils.vcxproj.filters b/ZAPDTR/ZAPDUtils/ZAPDUtils.vcxproj.filters index 218084e6d..3c46d19fe 100644 --- a/ZAPDTR/ZAPDUtils/ZAPDUtils.vcxproj.filters +++ b/ZAPDTR/ZAPDUtils/ZAPDUtils.vcxproj.filters @@ -12,14 +12,14 @@ {d8c2c1e7-b065-4b0f-86a2-46ab46eedc0b} - + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx - + {e047919d-7186-49ca-b115-e48fbb5c8743} - + {3de9dd46-0dfd-4d48-9f20-9f24e5b80fe0} @@ -69,19 +69,19 @@ - Header Files\Source Files\Utils + Source Files\Utils - Header Files\Source Files\Utils + Source Files\Utils - Header Files\Source Files\Utils + Source Files\Utils - Header Files\Source Files\Libraries + Source Files\Libraries - Header Files\Source Files\Utils + Source Files\Utils \ No newline at end of file diff --git a/ZAPDTR/lib/libgfxd/priv.h b/ZAPDTR/lib/libgfxd/priv.h index 37cb66b68..34d96f675 100644 --- a/ZAPDTR/lib/libgfxd/priv.h +++ b/ZAPDTR/lib/libgfxd/priv.h @@ -2,6 +2,8 @@ #define GFXD_PRIV_H #include "gfxd.h" +#define CONFIG_MT + #ifdef CONFIG_MT # ifdef _MSC_VER # define TLOCAL __declspec(thread) @@ -9,7 +11,7 @@ # define TLOCAL _Thread_local # endif #else -# define TLOCAL +#define TLOCAL #endif #define UCFUNC static inline diff --git a/libultraship/libultraship/GameVersions.h b/libultraship/libultraship/GameVersions.h new file mode 100644 index 000000000..a25463bf4 --- /dev/null +++ b/libultraship/libultraship/GameVersions.h @@ -0,0 +1,20 @@ +#pragma once + +#define OOT_NTSC_10 0xEC7011B7 +#define OOT_NTSC_11 0xD43DA81F +#define OOT_NTSC_12 0x693BA2AE +#define OOT_PAL_10 0xB044B569 +#define OOT_PAL_11 0xB2055FBD +#define OOT_NTSC_JP_GC_CE 0xF7F52DB8 +#define OOT_NTSC_JP_GC 0xF611F4BA +#define OOT_NTSC_US_GC 0xF3DD35BA +#define OOT_PAL_GC 0x09465AC3 +#define OOT_NTSC_JP_MQ 0xF43B45BA +#define OOT_NTSC_US_MQ 0xF034001A +#define OOT_PAL_MQ 0x1D4136F3 +#define OOT_PAL_GC_DBG1 0x871E1C92 // 03-21-2002 build +#define OOT_PAL_GC_DBG2 0x87121EFE // 03-13-2002 build +#define OOT_PAL_GC_MQ_DBG 0x917D18F6 +#define OOT_IQUE_TW 0x3D81FB3E +#define OOT_IQUE_CN 0xB1E1E07B +#define OOT_UNKNOWN 0xFFFFFFFF \ No newline at end of file diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp index 3f7bd7f9b..5739774ee 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp @@ -2381,12 +2381,14 @@ static void gfx_run_dl(Gfx* cmd) { cmd++; uint64_t hash = ((uint64_t)cmd->words.w0 << 32) + (uint64_t)cmd->words.w1; ResourceMgr_GetNameByCRC(hash, fileName); + + +#if _DEBUG && 0 char* tex = ResourceMgr_LoadTexByCRC(hash); - - -#if _DEBUG - //ResourceMgr_GetNameByCRC(hash, fileName); - //printf("G_SETTIMG_OTR: %s, %08X\n", fileName, hash); + ResourceMgr_GetNameByCRC(hash, fileName); + printf("G_SETTIMG_OTR: %s, %08X\n", fileName, hash); +#else + char* tex = NULL; #endif if (addr != NULL) diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_pc.h b/libultraship/libultraship/Lib/Fast3D/gfx_pc.h index 2e6a5a2a0..b3b8d9082 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_pc.h +++ b/libultraship/libultraship/Lib/Fast3D/gfx_pc.h @@ -21,7 +21,7 @@ struct TextureCacheKey { uint8_t palette_index; bool operator==(const TextureCacheKey&) const noexcept = default; - + struct Hasher { size_t operator()(const TextureCacheKey& key) const noexcept { uintptr_t addr = (uintptr_t)key.texture_addr; diff --git a/libultraship/libultraship/ResourceMgr.cpp b/libultraship/libultraship/ResourceMgr.cpp index 6c8b1a10c..e6f3c8a0a 100644 --- a/libultraship/libultraship/ResourceMgr.cpp +++ b/libultraship/libultraship/ResourceMgr.cpp @@ -3,6 +3,7 @@ #include "spdlog/spdlog.h" #include "File.h" #include "Archive.h" +#include "GameVersions.h" #include #include "Lib/StormLib/StormLib.h" @@ -11,6 +12,8 @@ namespace Ship { ResourceMgr::ResourceMgr(std::shared_ptr Context, std::string MainPath, std::string PatchesPath) : Context(Context), bIsRunning(false), FileLoadThread(nullptr) { OTR = std::make_shared(MainPath, PatchesPath, false); + gameVersion = OOT_UNKNOWN; + if (OTR->IsMainMPQValid()) Start(); } @@ -86,7 +89,10 @@ namespace Ship { OTR->LoadFile(ToLoad->path, true, ToLoad); //Lock.lock(); - FileCache[ToLoad->path] = ToLoad->bIsLoaded && !ToLoad->bHasLoadError ? ToLoad : nullptr; + + if (!ToLoad->bHasLoadError) + FileCache[ToLoad->path] = ToLoad->bIsLoaded && !ToLoad->bHasLoadError ? ToLoad : nullptr; + //Lock.unlock(); SPDLOG_DEBUG("Loaded File {} on ResourceMgr thread", ToLoad->path); @@ -124,44 +130,62 @@ namespace Ship { } } - auto UnmanagedRes = ResourceLoader::LoadResource(ToLoad->File); - - if (UnmanagedRes != nullptr) + if (!ToLoad->File->bHasLoadError) { - UnmanagedRes->resMgr = this; - auto Res = std::shared_ptr(UnmanagedRes); + auto UnmanagedRes = ResourceLoader::LoadResource(ToLoad->File); - if (Res != nullptr) { - std::unique_lock Lock(ToLoad->ResourceLoadMutex); + if (UnmanagedRes != nullptr) + { + UnmanagedRes->resMgr = this; + auto Res = std::shared_ptr(UnmanagedRes); - ToLoad->bHasResourceLoaded = true; - ToLoad->Resource = Res; - ResourceCache[Res->file->path] = Res; + if (Res != nullptr) { + std::unique_lock Lock(ToLoad->ResourceLoadMutex); - SPDLOG_DEBUG("Loaded Resource {} on ResourceMgr thread", ToLoad->File->path); + ToLoad->bHasResourceLoaded = true; + ToLoad->Resource = Res; + ResourceCache[Res->file->path] = Res; - // Disabled for now because it can cause random crashes - //FileCache[Res->File->path] = nullptr; - //FileCache.erase(FileCache.find(Res->File->path)); - Res->file = nullptr; + SPDLOG_DEBUG("Loaded Resource {} on ResourceMgr thread", ToLoad->File->path); + + // Disabled for now because it can cause random crashes + //FileCache[Res->File->path] = nullptr; + //FileCache.erase(FileCache.find(Res->File->path)); + Res->file = nullptr; + } + else { + ToLoad->bHasResourceLoaded = false; + ToLoad->Resource = nullptr; + + SPDLOG_ERROR("Resource load FAILED {} on ResourceMgr thread", ToLoad->File->path); + } + + //ResLock.lock(); + //ResLock.unlock(); } - else { - ToLoad->bHasResourceLoaded = false; - ToLoad->Resource = nullptr; - - SPDLOG_ERROR("Resource load FAILED {} on ResourceMgr thread", ToLoad->File->path); - } - - //ResLock.lock(); - //ResLock.unlock(); - - ToLoad->ResourceLoadNotifier.notify_all(); } + else + { + ToLoad->bHasResourceLoaded = false; + ToLoad->Resource = nullptr; + } + + ToLoad->ResourceLoadNotifier.notify_all(); } SPDLOG_INFO("Resource Manager LoadResourceThread ended"); } + uint32_t ResourceMgr::GetGameVersion() + { + return gameVersion; + } + + void ResourceMgr::SetGameVersion(uint32_t newGameVersion) + { + gameVersion = newGameVersion; + } + std::shared_ptr ResourceMgr::LoadFileAsync(std::string FilePath) { const std::lock_guard Lock(FileLoadMutex); // File NOT already loaded...? @@ -232,9 +256,16 @@ namespace Ship { std::shared_ptr FileData = LoadFile(FilePath); Promise->File = FileData; - Promise->bHasResourceLoaded = false; - ResourceLoadQueue.push(Promise); - ResourceLoadNotifier.notify_all(); + if (Promise->File->bHasLoadError) + { + Promise->bHasResourceLoaded = true; + } + else + { + Promise->bHasResourceLoaded = false; + ResourceLoadQueue.push(Promise); + ResourceLoadNotifier.notify_all(); + } } else { Promise->bHasResourceLoaded = true; Promise->Resource = resCacheFind->second; diff --git a/libultraship/libultraship/ResourceMgr.h b/libultraship/libultraship/ResourceMgr.h index 86e0cc268..5eae61abe 100644 --- a/libultraship/libultraship/ResourceMgr.h +++ b/libultraship/libultraship/ResourceMgr.h @@ -29,6 +29,8 @@ namespace Ship void InvalidateResourceCache(); + uint32_t GetGameVersion(); + void SetGameVersion(uint32_t newGameVersion); std::shared_ptr LoadFileAsync(std::string FilePath); std::shared_ptr LoadFile(std::string FilePath); std::shared_ptr GetCachedFile(std::string FilePath); @@ -58,5 +60,6 @@ namespace Ship std::condition_variable FileLoadNotifier; std::condition_variable ResourceLoadNotifier; volatile bool bIsRunning; + uint32_t gameVersion; }; } \ No newline at end of file diff --git a/libultraship/libultraship/libultraship.vcxproj b/libultraship/libultraship/libultraship.vcxproj index 8443b6b11..3bf81a67d 100644 --- a/libultraship/libultraship/libultraship.vcxproj +++ b/libultraship/libultraship/libultraship.vcxproj @@ -101,31 +101,49 @@ true $(ProjectDir)..\..\ZAPDTR\ZAPDUtils;$(ProjectDir)Lib\Fast3D\U64;$(ProjectDir)Lib\libjpeg\include;$(ProjectDir)Lib\spdlog\include;$(ProjectDir)Lib\SDL;$(ProjectDir)Lib\GLEW;$(IncludePath) $(ProjectDir)Lib\SDL\lib\x86;$(LibraryPath) + MinimumRecommendedRules.ruleset + + true $(ProjectDir)..\..\ZAPDTR\ZAPDUtils;$(ProjectDir)Lib\Fast3D\U64;$(ProjectDir)Lib\libjpeg\include;$(ProjectDir)Lib\spdlog\include;$(ProjectDir)Lib\SDL;$(ProjectDir)Lib\GLEW;$(IncludePath) $(ProjectDir)Lib\SDL\lib\x86;$(LibraryPath) + MinimumRecommendedRules.ruleset + + false $(ProjectDir)..\..\ZAPDTR\ZAPDUtils;$(ProjectDir)Lib\Fast3D\U64;$(ProjectDir)Lib\spdlog\include;$(ProjectDir)Lib\SDL;$(ProjectDir)Lib\GLEW;$(IncludePath) $(ProjectDir)Lib\SDL\lib\x86;$(LibraryPath) + MinimumRecommendedRules.ruleset + + true $(ProjectDir)..\..\ZAPDTR\ZAPDUtils;$(ProjectDir)Lib\Fast3D\U64;$(ProjectDir)Lib\spdlog\include;$(ProjectDir)Lib\SDL;$(ProjectDir)Lib\GLEW;$(IncludePath) $(ProjectDir)Lib\SDL\lib\x64;$(LibraryPath) + MinimumRecommendedRules.ruleset + + true $(ProjectDir)..\..\ZAPDTR\ZAPDUtils;$(ProjectDir)Lib\Fast3D\U64;$(ProjectDir)Lib\spdlog\include;$(ProjectDir)Lib\SDL;$(ProjectDir)Lib\GLEW;$(IncludePath) $(ProjectDir)Lib\SDL\lib\x64;$(LibraryPath) + MinimumRecommendedRules.ruleset + + false $(ProjectDir)..\..\ZAPDTR\ZAPDUtils;$(ProjectDir)Lib\Fast3D\U64;$(ProjectDir)Lib\spdlog\include;$(ProjectDir)Lib\SDL;$(ProjectDir)Lib\GLEW;$(IncludePath) $(ProjectDir)Lib\SDL\lib\x64;$(LibraryPath) + MinimumRecommendedRules.ruleset + + @@ -326,6 +344,7 @@ + @@ -416,6 +435,12 @@ + + + {02d10590-9542-3f55-aaf8-6055677e2a2a} + false + + diff --git a/libultraship/libultraship/libultraship.vcxproj.filters b/libultraship/libultraship/libultraship.vcxproj.filters index deed867c8..5079d826e 100644 --- a/libultraship/libultraship/libultraship.vcxproj.filters +++ b/libultraship/libultraship/libultraship.vcxproj.filters @@ -626,5 +626,8 @@ Source Files\CustomImpl + + Source Files\Resources + \ No newline at end of file diff --git a/soh/assets/xml/code/fbdemo_circle.xml b/soh/assets/xml/GC_NMQ_D/code/fbdemo_circle.xml similarity index 100% rename from soh/assets/xml/code/fbdemo_circle.xml rename to soh/assets/xml/GC_NMQ_D/code/fbdemo_circle.xml diff --git a/soh/assets/xml/code/fbdemo_triforce.xml b/soh/assets/xml/GC_NMQ_D/code/fbdemo_triforce.xml similarity index 100% rename from soh/assets/xml/code/fbdemo_triforce.xml rename to soh/assets/xml/GC_NMQ_D/code/fbdemo_triforce.xml diff --git a/soh/assets/xml/code/fbdemo_wipe1.xml b/soh/assets/xml/GC_NMQ_D/code/fbdemo_wipe1.xml similarity index 100% rename from soh/assets/xml/code/fbdemo_wipe1.xml rename to soh/assets/xml/GC_NMQ_D/code/fbdemo_wipe1.xml diff --git a/soh/assets/xml/misc/link_animetion.xml b/soh/assets/xml/GC_NMQ_D/misc/link_animetion.xml similarity index 100% rename from soh/assets/xml/misc/link_animetion.xml rename to soh/assets/xml/GC_NMQ_D/misc/link_animetion.xml diff --git a/soh/assets/xml/objects/gameplay_dangeon_keep.xml b/soh/assets/xml/GC_NMQ_D/objects/gameplay_dangeon_keep.xml similarity index 100% rename from soh/assets/xml/objects/gameplay_dangeon_keep.xml rename to soh/assets/xml/GC_NMQ_D/objects/gameplay_dangeon_keep.xml diff --git a/soh/assets/xml/objects/gameplay_field_keep.xml b/soh/assets/xml/GC_NMQ_D/objects/gameplay_field_keep.xml similarity index 100% rename from soh/assets/xml/objects/gameplay_field_keep.xml rename to soh/assets/xml/GC_NMQ_D/objects/gameplay_field_keep.xml diff --git a/soh/assets/xml/objects/gameplay_keep.xml b/soh/assets/xml/GC_NMQ_D/objects/gameplay_keep.xml similarity index 100% rename from soh/assets/xml/objects/gameplay_keep.xml rename to soh/assets/xml/GC_NMQ_D/objects/gameplay_keep.xml diff --git a/soh/assets/xml/objects/object_Bb.xml b/soh/assets/xml/GC_NMQ_D/objects/object_Bb.xml similarity index 100% rename from soh/assets/xml/objects/object_Bb.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_Bb.xml diff --git a/soh/assets/xml/objects/object_ahg.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ahg.xml similarity index 100% rename from soh/assets/xml/objects/object_ahg.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_ahg.xml diff --git a/soh/assets/xml/objects/object_am.xml b/soh/assets/xml/GC_NMQ_D/objects/object_am.xml similarity index 100% rename from soh/assets/xml/objects/object_am.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_am.xml diff --git a/soh/assets/xml/objects/object_ane.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ane.xml similarity index 100% rename from soh/assets/xml/objects/object_ane.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_ane.xml diff --git a/soh/assets/xml/objects/object_ani.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ani.xml similarity index 100% rename from soh/assets/xml/objects/object_ani.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_ani.xml diff --git a/soh/assets/xml/objects/object_anubice.xml b/soh/assets/xml/GC_NMQ_D/objects/object_anubice.xml similarity index 100% rename from soh/assets/xml/objects/object_anubice.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_anubice.xml diff --git a/soh/assets/xml/objects/object_aob.xml b/soh/assets/xml/GC_NMQ_D/objects/object_aob.xml similarity index 100% rename from soh/assets/xml/objects/object_aob.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_aob.xml diff --git a/soh/assets/xml/objects/object_b_heart.xml b/soh/assets/xml/GC_NMQ_D/objects/object_b_heart.xml similarity index 100% rename from soh/assets/xml/objects/object_b_heart.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_b_heart.xml diff --git a/soh/assets/xml/objects/object_bba.xml b/soh/assets/xml/GC_NMQ_D/objects/object_bba.xml similarity index 100% rename from soh/assets/xml/objects/object_bba.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_bba.xml diff --git a/soh/assets/xml/objects/object_bdan_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_bdan_objects.xml similarity index 100% rename from soh/assets/xml/objects/object_bdan_objects.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_bdan_objects.xml diff --git a/soh/assets/xml/objects/object_bdoor.xml b/soh/assets/xml/GC_NMQ_D/objects/object_bdoor.xml similarity index 100% rename from soh/assets/xml/objects/object_bdoor.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_bdoor.xml diff --git a/soh/assets/xml/objects/object_bg.xml b/soh/assets/xml/GC_NMQ_D/objects/object_bg.xml similarity index 100% rename from soh/assets/xml/objects/object_bg.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_bg.xml diff --git a/soh/assets/xml/objects/object_bigokuta.xml b/soh/assets/xml/GC_NMQ_D/objects/object_bigokuta.xml similarity index 100% rename from soh/assets/xml/objects/object_bigokuta.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_bigokuta.xml diff --git a/soh/assets/xml/objects/object_bird.xml b/soh/assets/xml/GC_NMQ_D/objects/object_bird.xml similarity index 100% rename from soh/assets/xml/objects/object_bird.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_bird.xml diff --git a/soh/assets/xml/objects/object_bji.xml b/soh/assets/xml/GC_NMQ_D/objects/object_bji.xml similarity index 100% rename from soh/assets/xml/objects/object_bji.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_bji.xml diff --git a/soh/assets/xml/objects/object_bl.xml b/soh/assets/xml/GC_NMQ_D/objects/object_bl.xml similarity index 100% rename from soh/assets/xml/objects/object_bl.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_bl.xml diff --git a/soh/assets/xml/objects/object_blkobj.xml b/soh/assets/xml/GC_NMQ_D/objects/object_blkobj.xml similarity index 100% rename from soh/assets/xml/objects/object_blkobj.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_blkobj.xml diff --git a/soh/assets/xml/objects/object_bob.xml b/soh/assets/xml/GC_NMQ_D/objects/object_bob.xml similarity index 100% rename from soh/assets/xml/objects/object_bob.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_bob.xml diff --git a/soh/assets/xml/objects/object_boj.xml b/soh/assets/xml/GC_NMQ_D/objects/object_boj.xml similarity index 100% rename from soh/assets/xml/objects/object_boj.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_boj.xml diff --git a/soh/assets/xml/objects/object_bombf.xml b/soh/assets/xml/GC_NMQ_D/objects/object_bombf.xml similarity index 100% rename from soh/assets/xml/objects/object_bombf.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_bombf.xml diff --git a/soh/assets/xml/objects/object_bombiwa.xml b/soh/assets/xml/GC_NMQ_D/objects/object_bombiwa.xml similarity index 100% rename from soh/assets/xml/objects/object_bombiwa.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_bombiwa.xml diff --git a/soh/assets/xml/objects/object_bowl.xml b/soh/assets/xml/GC_NMQ_D/objects/object_bowl.xml similarity index 100% rename from soh/assets/xml/objects/object_bowl.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_bowl.xml diff --git a/soh/assets/xml/objects/object_box.xml b/soh/assets/xml/GC_NMQ_D/objects/object_box.xml similarity index 100% rename from soh/assets/xml/objects/object_box.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_box.xml diff --git a/soh/assets/xml/objects/object_brob.xml b/soh/assets/xml/GC_NMQ_D/objects/object_brob.xml similarity index 100% rename from soh/assets/xml/objects/object_brob.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_brob.xml diff --git a/soh/assets/xml/objects/object_bubble.xml b/soh/assets/xml/GC_NMQ_D/objects/object_bubble.xml similarity index 100% rename from soh/assets/xml/objects/object_bubble.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_bubble.xml diff --git a/soh/assets/xml/objects/object_bv.xml b/soh/assets/xml/GC_NMQ_D/objects/object_bv.xml similarity index 100% rename from soh/assets/xml/objects/object_bv.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_bv.xml diff --git a/soh/assets/xml/objects/object_bw.xml b/soh/assets/xml/GC_NMQ_D/objects/object_bw.xml similarity index 100% rename from soh/assets/xml/objects/object_bw.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_bw.xml diff --git a/soh/assets/xml/objects/object_bwall.xml b/soh/assets/xml/GC_NMQ_D/objects/object_bwall.xml similarity index 100% rename from soh/assets/xml/objects/object_bwall.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_bwall.xml diff --git a/soh/assets/xml/objects/object_bxa.xml b/soh/assets/xml/GC_NMQ_D/objects/object_bxa.xml similarity index 100% rename from soh/assets/xml/objects/object_bxa.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_bxa.xml diff --git a/soh/assets/xml/objects/object_cne.xml b/soh/assets/xml/GC_NMQ_D/objects/object_cne.xml similarity index 100% rename from soh/assets/xml/objects/object_cne.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_cne.xml diff --git a/soh/assets/xml/objects/object_cob.xml b/soh/assets/xml/GC_NMQ_D/objects/object_cob.xml similarity index 100% rename from soh/assets/xml/objects/object_cob.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_cob.xml diff --git a/soh/assets/xml/objects/object_cow.xml b/soh/assets/xml/GC_NMQ_D/objects/object_cow.xml similarity index 100% rename from soh/assets/xml/objects/object_cow.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_cow.xml diff --git a/soh/assets/xml/objects/object_crow.xml b/soh/assets/xml/GC_NMQ_D/objects/object_crow.xml similarity index 100% rename from soh/assets/xml/objects/object_crow.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_crow.xml diff --git a/soh/assets/xml/objects/object_cs.xml b/soh/assets/xml/GC_NMQ_D/objects/object_cs.xml similarity index 100% rename from soh/assets/xml/objects/object_cs.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_cs.xml diff --git a/soh/assets/xml/objects/object_d_elevator.xml b/soh/assets/xml/GC_NMQ_D/objects/object_d_elevator.xml similarity index 100% rename from soh/assets/xml/objects/object_d_elevator.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_d_elevator.xml diff --git a/soh/assets/xml/objects/object_d_hsblock.xml b/soh/assets/xml/GC_NMQ_D/objects/object_d_hsblock.xml similarity index 100% rename from soh/assets/xml/objects/object_d_hsblock.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_d_hsblock.xml diff --git a/soh/assets/xml/objects/object_d_lift.xml b/soh/assets/xml/GC_NMQ_D/objects/object_d_lift.xml similarity index 100% rename from soh/assets/xml/objects/object_d_lift.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_d_lift.xml diff --git a/soh/assets/xml/objects/object_daiku.xml b/soh/assets/xml/GC_NMQ_D/objects/object_daiku.xml similarity index 100% rename from soh/assets/xml/objects/object_daiku.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_daiku.xml diff --git a/soh/assets/xml/objects/object_ddan_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ddan_objects.xml similarity index 100% rename from soh/assets/xml/objects/object_ddan_objects.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_ddan_objects.xml diff --git a/soh/assets/xml/objects/object_dekubaba.xml b/soh/assets/xml/GC_NMQ_D/objects/object_dekubaba.xml similarity index 100% rename from soh/assets/xml/objects/object_dekubaba.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_dekubaba.xml diff --git a/soh/assets/xml/objects/object_dekujr.xml b/soh/assets/xml/GC_NMQ_D/objects/object_dekujr.xml similarity index 100% rename from soh/assets/xml/objects/object_dekujr.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_dekujr.xml diff --git a/soh/assets/xml/objects/object_dekunuts.xml b/soh/assets/xml/GC_NMQ_D/objects/object_dekunuts.xml similarity index 100% rename from soh/assets/xml/objects/object_dekunuts.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_dekunuts.xml diff --git a/soh/assets/xml/objects/object_demo_6k.xml b/soh/assets/xml/GC_NMQ_D/objects/object_demo_6k.xml similarity index 100% rename from soh/assets/xml/objects/object_demo_6k.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_demo_6k.xml diff --git a/soh/assets/xml/objects/object_demo_kekkai.xml b/soh/assets/xml/GC_NMQ_D/objects/object_demo_kekkai.xml similarity index 100% rename from soh/assets/xml/objects/object_demo_kekkai.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_demo_kekkai.xml diff --git a/soh/assets/xml/objects/object_demo_tre_lgt.xml b/soh/assets/xml/GC_NMQ_D/objects/object_demo_tre_lgt.xml similarity index 100% rename from soh/assets/xml/objects/object_demo_tre_lgt.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_demo_tre_lgt.xml diff --git a/soh/assets/xml/objects/object_dh.xml b/soh/assets/xml/GC_NMQ_D/objects/object_dh.xml similarity index 100% rename from soh/assets/xml/objects/object_dh.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_dh.xml diff --git a/soh/assets/xml/objects/object_dnk.xml b/soh/assets/xml/GC_NMQ_D/objects/object_dnk.xml similarity index 100% rename from soh/assets/xml/objects/object_dnk.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_dnk.xml diff --git a/soh/assets/xml/objects/object_dns.xml b/soh/assets/xml/GC_NMQ_D/objects/object_dns.xml similarity index 100% rename from soh/assets/xml/objects/object_dns.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_dns.xml diff --git a/soh/assets/xml/objects/object_dodojr.xml b/soh/assets/xml/GC_NMQ_D/objects/object_dodojr.xml similarity index 100% rename from soh/assets/xml/objects/object_dodojr.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_dodojr.xml diff --git a/soh/assets/xml/objects/object_dodongo.xml b/soh/assets/xml/GC_NMQ_D/objects/object_dodongo.xml similarity index 100% rename from soh/assets/xml/objects/object_dodongo.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_dodongo.xml diff --git a/soh/assets/xml/objects/object_dog.xml b/soh/assets/xml/GC_NMQ_D/objects/object_dog.xml similarity index 100% rename from soh/assets/xml/objects/object_dog.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_dog.xml diff --git a/soh/assets/xml/objects/object_door_gerudo.xml b/soh/assets/xml/GC_NMQ_D/objects/object_door_gerudo.xml similarity index 100% rename from soh/assets/xml/objects/object_door_gerudo.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_door_gerudo.xml diff --git a/soh/assets/xml/objects/object_door_killer.xml b/soh/assets/xml/GC_NMQ_D/objects/object_door_killer.xml similarity index 100% rename from soh/assets/xml/objects/object_door_killer.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_door_killer.xml diff --git a/soh/assets/xml/objects/object_ds.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ds.xml similarity index 100% rename from soh/assets/xml/objects/object_ds.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_ds.xml diff --git a/soh/assets/xml/objects/object_ds2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ds2.xml similarity index 100% rename from soh/assets/xml/objects/object_ds2.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_ds2.xml diff --git a/soh/assets/xml/objects/object_du.xml b/soh/assets/xml/GC_NMQ_D/objects/object_du.xml similarity index 100% rename from soh/assets/xml/objects/object_du.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_du.xml diff --git a/soh/assets/xml/objects/object_dy_obj.xml b/soh/assets/xml/GC_NMQ_D/objects/object_dy_obj.xml similarity index 100% rename from soh/assets/xml/objects/object_dy_obj.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_dy_obj.xml diff --git a/soh/assets/xml/objects/object_ec.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ec.xml similarity index 100% rename from soh/assets/xml/objects/object_ec.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_ec.xml diff --git a/soh/assets/xml/objects/object_efc_crystal_light.xml b/soh/assets/xml/GC_NMQ_D/objects/object_efc_crystal_light.xml similarity index 100% rename from soh/assets/xml/objects/object_efc_crystal_light.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_efc_crystal_light.xml diff --git a/soh/assets/xml/objects/object_efc_doughnut.xml b/soh/assets/xml/GC_NMQ_D/objects/object_efc_doughnut.xml similarity index 100% rename from soh/assets/xml/objects/object_efc_doughnut.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_efc_doughnut.xml diff --git a/soh/assets/xml/objects/object_efc_erupc.xml b/soh/assets/xml/GC_NMQ_D/objects/object_efc_erupc.xml similarity index 100% rename from soh/assets/xml/objects/object_efc_erupc.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_efc_erupc.xml diff --git a/soh/assets/xml/objects/object_efc_fire_ball.xml b/soh/assets/xml/GC_NMQ_D/objects/object_efc_fire_ball.xml similarity index 100% rename from soh/assets/xml/objects/object_efc_fire_ball.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_efc_fire_ball.xml diff --git a/soh/assets/xml/objects/object_efc_flash.xml b/soh/assets/xml/GC_NMQ_D/objects/object_efc_flash.xml similarity index 100% rename from soh/assets/xml/objects/object_efc_flash.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_efc_flash.xml diff --git a/soh/assets/xml/objects/object_efc_lgt_shower.xml b/soh/assets/xml/GC_NMQ_D/objects/object_efc_lgt_shower.xml similarity index 100% rename from soh/assets/xml/objects/object_efc_lgt_shower.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_efc_lgt_shower.xml diff --git a/soh/assets/xml/objects/object_efc_star_field.xml b/soh/assets/xml/GC_NMQ_D/objects/object_efc_star_field.xml similarity index 100% rename from soh/assets/xml/objects/object_efc_star_field.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_efc_star_field.xml diff --git a/soh/assets/xml/objects/object_efc_tw.xml b/soh/assets/xml/GC_NMQ_D/objects/object_efc_tw.xml similarity index 100% rename from soh/assets/xml/objects/object_efc_tw.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_efc_tw.xml diff --git a/soh/assets/xml/objects/object_ei.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ei.xml similarity index 100% rename from soh/assets/xml/objects/object_ei.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_ei.xml diff --git a/soh/assets/xml/objects/object_fa.xml b/soh/assets/xml/GC_NMQ_D/objects/object_fa.xml similarity index 100% rename from soh/assets/xml/objects/object_fa.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_fa.xml diff --git a/soh/assets/xml/objects/object_fd.xml b/soh/assets/xml/GC_NMQ_D/objects/object_fd.xml similarity index 100% rename from soh/assets/xml/objects/object_fd.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_fd.xml diff --git a/soh/assets/xml/objects/object_fd2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_fd2.xml similarity index 100% rename from soh/assets/xml/objects/object_fd2.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_fd2.xml diff --git a/soh/assets/xml/objects/object_fhg.xml b/soh/assets/xml/GC_NMQ_D/objects/object_fhg.xml similarity index 100% rename from soh/assets/xml/objects/object_fhg.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_fhg.xml diff --git a/soh/assets/xml/objects/object_fire.xml b/soh/assets/xml/GC_NMQ_D/objects/object_fire.xml similarity index 100% rename from soh/assets/xml/objects/object_fire.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_fire.xml diff --git a/soh/assets/xml/objects/object_firefly.xml b/soh/assets/xml/GC_NMQ_D/objects/object_firefly.xml similarity index 100% rename from soh/assets/xml/objects/object_firefly.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_firefly.xml diff --git a/soh/assets/xml/objects/object_fish.xml b/soh/assets/xml/GC_NMQ_D/objects/object_fish.xml similarity index 100% rename from soh/assets/xml/objects/object_fish.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_fish.xml diff --git a/soh/assets/xml/objects/object_fr.xml b/soh/assets/xml/GC_NMQ_D/objects/object_fr.xml similarity index 100% rename from soh/assets/xml/objects/object_fr.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_fr.xml diff --git a/soh/assets/xml/objects/object_fu.xml b/soh/assets/xml/GC_NMQ_D/objects/object_fu.xml similarity index 100% rename from soh/assets/xml/objects/object_fu.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_fu.xml diff --git a/soh/assets/xml/objects/object_fw.xml b/soh/assets/xml/GC_NMQ_D/objects/object_fw.xml similarity index 100% rename from soh/assets/xml/objects/object_fw.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_fw.xml diff --git a/soh/assets/xml/objects/object_fz.xml b/soh/assets/xml/GC_NMQ_D/objects/object_fz.xml similarity index 100% rename from soh/assets/xml/objects/object_fz.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_fz.xml diff --git a/soh/assets/xml/objects/object_ganon.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ganon.xml similarity index 100% rename from soh/assets/xml/objects/object_ganon.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_ganon.xml diff --git a/soh/assets/xml/objects/object_ganon2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ganon2.xml similarity index 100% rename from soh/assets/xml/objects/object_ganon2.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_ganon2.xml diff --git a/soh/assets/xml/objects/object_ganon_anime1.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ganon_anime1.xml similarity index 100% rename from soh/assets/xml/objects/object_ganon_anime1.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_ganon_anime1.xml diff --git a/soh/assets/xml/objects/object_ganon_anime2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ganon_anime2.xml similarity index 100% rename from soh/assets/xml/objects/object_ganon_anime2.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_ganon_anime2.xml diff --git a/soh/assets/xml/objects/object_ganon_anime3.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ganon_anime3.xml similarity index 100% rename from soh/assets/xml/objects/object_ganon_anime3.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_ganon_anime3.xml diff --git a/soh/assets/xml/objects/object_ganon_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ganon_objects.xml similarity index 100% rename from soh/assets/xml/objects/object_ganon_objects.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_ganon_objects.xml diff --git a/soh/assets/xml/objects/object_ge1.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ge1.xml similarity index 100% rename from soh/assets/xml/objects/object_ge1.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_ge1.xml diff --git a/soh/assets/xml/objects/object_geff.xml b/soh/assets/xml/GC_NMQ_D/objects/object_geff.xml similarity index 100% rename from soh/assets/xml/objects/object_geff.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_geff.xml diff --git a/soh/assets/xml/objects/object_geldb.xml b/soh/assets/xml/GC_NMQ_D/objects/object_geldb.xml similarity index 100% rename from soh/assets/xml/objects/object_geldb.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_geldb.xml diff --git a/soh/assets/xml/objects/object_gi_arrow.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_arrow.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_arrow.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_arrow.xml diff --git a/soh/assets/xml/objects/object_gi_arrowcase.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_arrowcase.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_arrowcase.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_arrowcase.xml diff --git a/soh/assets/xml/objects/object_gi_bean.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_bean.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_bean.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_bean.xml diff --git a/soh/assets/xml/objects/object_gi_bomb_1.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_bomb_1.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_bomb_1.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_bomb_1.xml diff --git a/soh/assets/xml/objects/object_gi_bomb_2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_bomb_2.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_bomb_2.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_bomb_2.xml diff --git a/soh/assets/xml/objects/object_gi_bombpouch.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_bombpouch.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_bombpouch.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_bombpouch.xml diff --git a/soh/assets/xml/objects/object_gi_boomerang.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_boomerang.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_boomerang.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_boomerang.xml diff --git a/soh/assets/xml/objects/object_gi_boots_2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_boots_2.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_boots_2.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_boots_2.xml diff --git a/soh/assets/xml/objects/object_gi_bosskey.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_bosskey.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_bosskey.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_bosskey.xml diff --git a/soh/assets/xml/objects/object_gi_bottle.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_bottle.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_bottle.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_bottle.xml diff --git a/soh/assets/xml/objects/object_gi_bottle_letter.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_bottle_letter.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_bottle_letter.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_bottle_letter.xml diff --git a/soh/assets/xml/objects/object_gi_bow.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_bow.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_bow.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_bow.xml diff --git a/soh/assets/xml/objects/object_gi_bracelet.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_bracelet.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_bracelet.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_bracelet.xml diff --git a/soh/assets/xml/objects/object_gi_brokensword.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_brokensword.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_brokensword.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_brokensword.xml diff --git a/soh/assets/xml/objects/object_gi_butterfly.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_butterfly.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_butterfly.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_butterfly.xml diff --git a/soh/assets/xml/objects/object_gi_clothes.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_clothes.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_clothes.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_clothes.xml diff --git a/soh/assets/xml/objects/object_gi_coin.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_coin.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_coin.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_coin.xml diff --git a/soh/assets/xml/objects/object_gi_compass.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_compass.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_compass.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_compass.xml diff --git a/soh/assets/xml/objects/object_gi_dekupouch.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_dekupouch.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_dekupouch.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_dekupouch.xml diff --git a/soh/assets/xml/objects/object_gi_egg.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_egg.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_egg.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_egg.xml diff --git a/soh/assets/xml/objects/object_gi_eye_lotion.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_eye_lotion.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_eye_lotion.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_eye_lotion.xml diff --git a/soh/assets/xml/objects/object_gi_fire.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_fire.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_fire.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_fire.xml diff --git a/soh/assets/xml/objects/object_gi_fish.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_fish.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_fish.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_fish.xml diff --git a/soh/assets/xml/objects/object_gi_frog.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_frog.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_frog.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_frog.xml diff --git a/soh/assets/xml/objects/object_gi_gerudo.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_gerudo.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_gerudo.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_gerudo.xml diff --git a/soh/assets/xml/objects/object_gi_gerudomask.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_gerudomask.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_gerudomask.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_gerudomask.xml diff --git a/soh/assets/xml/objects/object_gi_ghost.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_ghost.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_ghost.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_ghost.xml diff --git a/soh/assets/xml/objects/object_gi_glasses.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_glasses.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_glasses.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_glasses.xml diff --git a/soh/assets/xml/objects/object_gi_gloves.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_gloves.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_gloves.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_gloves.xml diff --git a/soh/assets/xml/objects/object_gi_goddess.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_goddess.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_goddess.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_goddess.xml diff --git a/soh/assets/xml/objects/object_gi_golonmask.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_golonmask.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_golonmask.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_golonmask.xml diff --git a/soh/assets/xml/objects/object_gi_grass.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_grass.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_grass.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_grass.xml diff --git a/soh/assets/xml/objects/object_gi_hammer.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_hammer.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_hammer.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_hammer.xml diff --git a/soh/assets/xml/objects/object_gi_heart.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_heart.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_heart.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_heart.xml diff --git a/soh/assets/xml/objects/object_gi_hearts.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_hearts.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_hearts.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_hearts.xml diff --git a/soh/assets/xml/objects/object_gi_hookshot.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_hookshot.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_hookshot.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_hookshot.xml diff --git a/soh/assets/xml/objects/object_gi_hoverboots.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_hoverboots.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_hoverboots.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_hoverboots.xml diff --git a/soh/assets/xml/objects/object_gi_insect.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_insect.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_insect.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_insect.xml diff --git a/soh/assets/xml/objects/object_gi_jewel.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_jewel.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_jewel.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_jewel.xml diff --git a/soh/assets/xml/objects/object_gi_key.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_key.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_key.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_key.xml diff --git a/soh/assets/xml/objects/object_gi_ki_tan_mask.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_ki_tan_mask.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_ki_tan_mask.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_ki_tan_mask.xml diff --git a/soh/assets/xml/objects/object_gi_letter.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_letter.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_letter.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_letter.xml diff --git a/soh/assets/xml/objects/object_gi_liquid.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_liquid.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_liquid.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_liquid.xml diff --git a/soh/assets/xml/objects/object_gi_longsword.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_longsword.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_longsword.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_longsword.xml diff --git a/soh/assets/xml/objects/object_gi_m_arrow.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_m_arrow.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_m_arrow.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_m_arrow.xml diff --git a/soh/assets/xml/objects/object_gi_magicpot.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_magicpot.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_magicpot.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_magicpot.xml diff --git a/soh/assets/xml/objects/object_gi_map.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_map.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_map.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_map.xml diff --git a/soh/assets/xml/objects/object_gi_medal.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_medal.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_medal.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_medal.xml diff --git a/soh/assets/xml/objects/object_gi_melody.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_melody.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_melody.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_melody.xml diff --git a/soh/assets/xml/objects/object_gi_milk.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_milk.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_milk.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_milk.xml diff --git a/soh/assets/xml/objects/object_gi_mushroom.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_mushroom.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_mushroom.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_mushroom.xml diff --git a/soh/assets/xml/objects/object_gi_niwatori.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_niwatori.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_niwatori.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_niwatori.xml diff --git a/soh/assets/xml/objects/object_gi_nuts.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_nuts.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_nuts.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_nuts.xml diff --git a/soh/assets/xml/objects/object_gi_ocarina.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_ocarina.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_ocarina.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_ocarina.xml diff --git a/soh/assets/xml/objects/object_gi_ocarina_0.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_ocarina_0.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_ocarina_0.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_ocarina_0.xml diff --git a/soh/assets/xml/objects/object_gi_pachinko.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_pachinko.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_pachinko.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_pachinko.xml diff --git a/soh/assets/xml/objects/object_gi_powder.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_powder.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_powder.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_powder.xml diff --git a/soh/assets/xml/objects/object_gi_prescription.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_prescription.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_prescription.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_prescription.xml diff --git a/soh/assets/xml/objects/object_gi_purse.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_purse.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_purse.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_purse.xml diff --git a/soh/assets/xml/objects/object_gi_rabit_mask.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_rabit_mask.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_rabit_mask.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_rabit_mask.xml diff --git a/soh/assets/xml/objects/object_gi_redead_mask.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_redead_mask.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_redead_mask.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_redead_mask.xml diff --git a/soh/assets/xml/objects/object_gi_rupy.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_rupy.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_rupy.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_rupy.xml diff --git a/soh/assets/xml/objects/object_gi_saw.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_saw.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_saw.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_saw.xml diff --git a/soh/assets/xml/objects/object_gi_scale.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_scale.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_scale.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_scale.xml diff --git a/soh/assets/xml/objects/object_gi_seed.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_seed.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_seed.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_seed.xml diff --git a/soh/assets/xml/objects/object_gi_shield_1.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_shield_1.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_shield_1.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_shield_1.xml diff --git a/soh/assets/xml/objects/object_gi_shield_2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_shield_2.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_shield_2.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_shield_2.xml diff --git a/soh/assets/xml/objects/object_gi_shield_3.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_shield_3.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_shield_3.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_shield_3.xml diff --git a/soh/assets/xml/objects/object_gi_skj_mask.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_skj_mask.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_skj_mask.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_skj_mask.xml diff --git a/soh/assets/xml/objects/object_gi_soldout.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_soldout.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_soldout.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_soldout.xml diff --git a/soh/assets/xml/objects/object_gi_soul.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_soul.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_soul.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_soul.xml diff --git a/soh/assets/xml/objects/object_gi_stick.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_stick.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_stick.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_stick.xml diff --git a/soh/assets/xml/objects/object_gi_sutaru.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_sutaru.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_sutaru.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_sutaru.xml diff --git a/soh/assets/xml/objects/object_gi_sword_1.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_sword_1.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_sword_1.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_sword_1.xml diff --git a/soh/assets/xml/objects/object_gi_ticketstone.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_ticketstone.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_ticketstone.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_ticketstone.xml diff --git a/soh/assets/xml/objects/object_gi_truth_mask.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_truth_mask.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_truth_mask.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_truth_mask.xml diff --git a/soh/assets/xml/objects/object_gi_zoramask.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_zoramask.xml similarity index 100% rename from soh/assets/xml/objects/object_gi_zoramask.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_zoramask.xml diff --git a/soh/assets/xml/objects/object_gj.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gj.xml similarity index 100% rename from soh/assets/xml/objects/object_gj.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gj.xml diff --git a/soh/assets/xml/objects/object_gjyo_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gjyo_objects.xml similarity index 100% rename from soh/assets/xml/objects/object_gjyo_objects.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gjyo_objects.xml diff --git a/soh/assets/xml/objects/object_gla.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gla.xml similarity index 100% rename from soh/assets/xml/objects/object_gla.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gla.xml diff --git a/soh/assets/xml/objects/object_gm.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gm.xml similarity index 100% rename from soh/assets/xml/objects/object_gm.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gm.xml diff --git a/soh/assets/xml/objects/object_gnd.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gnd.xml similarity index 100% rename from soh/assets/xml/objects/object_gnd.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gnd.xml diff --git a/soh/assets/xml/objects/object_gnd_magic.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gnd_magic.xml similarity index 100% rename from soh/assets/xml/objects/object_gnd_magic.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gnd_magic.xml diff --git a/soh/assets/xml/objects/object_gndd.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gndd.xml similarity index 100% rename from soh/assets/xml/objects/object_gndd.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gndd.xml diff --git a/soh/assets/xml/objects/object_god_lgt.xml b/soh/assets/xml/GC_NMQ_D/objects/object_god_lgt.xml similarity index 100% rename from soh/assets/xml/objects/object_god_lgt.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_god_lgt.xml diff --git a/soh/assets/xml/objects/object_gol.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gol.xml similarity index 100% rename from soh/assets/xml/objects/object_gol.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gol.xml diff --git a/soh/assets/xml/objects/object_goma.xml b/soh/assets/xml/GC_NMQ_D/objects/object_goma.xml similarity index 100% rename from soh/assets/xml/objects/object_goma.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_goma.xml diff --git a/soh/assets/xml/objects/object_goroiwa.xml b/soh/assets/xml/GC_NMQ_D/objects/object_goroiwa.xml similarity index 100% rename from soh/assets/xml/objects/object_goroiwa.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_goroiwa.xml diff --git a/soh/assets/xml/objects/object_gr.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gr.xml similarity index 100% rename from soh/assets/xml/objects/object_gr.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gr.xml diff --git a/soh/assets/xml/objects/object_gs.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gs.xml similarity index 100% rename from soh/assets/xml/objects/object_gs.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gs.xml diff --git a/soh/assets/xml/objects/object_gt.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gt.xml similarity index 100% rename from soh/assets/xml/objects/object_gt.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_gt.xml diff --git a/soh/assets/xml/objects/object_haka.xml b/soh/assets/xml/GC_NMQ_D/objects/object_haka.xml similarity index 100% rename from soh/assets/xml/objects/object_haka.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_haka.xml diff --git a/soh/assets/xml/objects/object_haka_door.xml b/soh/assets/xml/GC_NMQ_D/objects/object_haka_door.xml similarity index 100% rename from soh/assets/xml/objects/object_haka_door.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_haka_door.xml diff --git a/soh/assets/xml/objects/object_haka_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_haka_objects.xml similarity index 100% rename from soh/assets/xml/objects/object_haka_objects.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_haka_objects.xml diff --git a/soh/assets/xml/objects/object_hakach_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_hakach_objects.xml similarity index 100% rename from soh/assets/xml/objects/object_hakach_objects.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_hakach_objects.xml diff --git a/soh/assets/xml/objects/object_hata.xml b/soh/assets/xml/GC_NMQ_D/objects/object_hata.xml similarity index 100% rename from soh/assets/xml/objects/object_hata.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_hata.xml diff --git a/soh/assets/xml/objects/object_heavy_object.xml b/soh/assets/xml/GC_NMQ_D/objects/object_heavy_object.xml similarity index 100% rename from soh/assets/xml/objects/object_heavy_object.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_heavy_object.xml diff --git a/soh/assets/xml/objects/object_hidan_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_hidan_objects.xml similarity index 100% rename from soh/assets/xml/objects/object_hidan_objects.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_hidan_objects.xml diff --git a/soh/assets/xml/objects/object_hintnuts.xml b/soh/assets/xml/GC_NMQ_D/objects/object_hintnuts.xml similarity index 100% rename from soh/assets/xml/objects/object_hintnuts.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_hintnuts.xml diff --git a/soh/assets/xml/objects/object_hni.xml b/soh/assets/xml/GC_NMQ_D/objects/object_hni.xml similarity index 100% rename from soh/assets/xml/objects/object_hni.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_hni.xml diff --git a/soh/assets/xml/objects/object_horse.xml b/soh/assets/xml/GC_NMQ_D/objects/object_horse.xml similarity index 100% rename from soh/assets/xml/objects/object_horse.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_horse.xml diff --git a/soh/assets/xml/objects/object_horse_ganon.xml b/soh/assets/xml/GC_NMQ_D/objects/object_horse_ganon.xml similarity index 100% rename from soh/assets/xml/objects/object_horse_ganon.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_horse_ganon.xml diff --git a/soh/assets/xml/objects/object_horse_link_child.xml b/soh/assets/xml/GC_NMQ_D/objects/object_horse_link_child.xml similarity index 100% rename from soh/assets/xml/objects/object_horse_link_child.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_horse_link_child.xml diff --git a/soh/assets/xml/objects/object_horse_normal.xml b/soh/assets/xml/GC_NMQ_D/objects/object_horse_normal.xml similarity index 100% rename from soh/assets/xml/objects/object_horse_normal.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_horse_normal.xml diff --git a/soh/assets/xml/objects/object_horse_zelda.xml b/soh/assets/xml/GC_NMQ_D/objects/object_horse_zelda.xml similarity index 100% rename from soh/assets/xml/objects/object_horse_zelda.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_horse_zelda.xml diff --git a/soh/assets/xml/objects/object_hs.xml b/soh/assets/xml/GC_NMQ_D/objects/object_hs.xml similarity index 100% rename from soh/assets/xml/objects/object_hs.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_hs.xml diff --git a/soh/assets/xml/objects/object_human.xml b/soh/assets/xml/GC_NMQ_D/objects/object_human.xml similarity index 100% rename from soh/assets/xml/objects/object_human.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_human.xml diff --git a/soh/assets/xml/objects/object_ice_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ice_objects.xml similarity index 100% rename from soh/assets/xml/objects/object_ice_objects.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_ice_objects.xml diff --git a/soh/assets/xml/objects/object_ik.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ik.xml similarity index 100% rename from soh/assets/xml/objects/object_ik.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_ik.xml diff --git a/soh/assets/xml/objects/object_im.xml b/soh/assets/xml/GC_NMQ_D/objects/object_im.xml similarity index 100% rename from soh/assets/xml/objects/object_im.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_im.xml diff --git a/soh/assets/xml/objects/object_in.xml b/soh/assets/xml/GC_NMQ_D/objects/object_in.xml similarity index 100% rename from soh/assets/xml/objects/object_in.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_in.xml diff --git a/soh/assets/xml/objects/object_ingate.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ingate.xml similarity index 100% rename from soh/assets/xml/objects/object_ingate.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_ingate.xml diff --git a/soh/assets/xml/objects/object_jj.xml b/soh/assets/xml/GC_NMQ_D/objects/object_jj.xml similarity index 100% rename from soh/assets/xml/objects/object_jj.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_jj.xml diff --git a/soh/assets/xml/objects/object_js.xml b/soh/assets/xml/GC_NMQ_D/objects/object_js.xml similarity index 100% rename from soh/assets/xml/objects/object_js.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_js.xml diff --git a/soh/assets/xml/objects/object_jya_door.xml b/soh/assets/xml/GC_NMQ_D/objects/object_jya_door.xml similarity index 100% rename from soh/assets/xml/objects/object_jya_door.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_jya_door.xml diff --git a/soh/assets/xml/objects/object_jya_iron.xml b/soh/assets/xml/GC_NMQ_D/objects/object_jya_iron.xml similarity index 100% rename from soh/assets/xml/objects/object_jya_iron.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_jya_iron.xml diff --git a/soh/assets/xml/objects/object_jya_obj.xml b/soh/assets/xml/GC_NMQ_D/objects/object_jya_obj.xml similarity index 100% rename from soh/assets/xml/objects/object_jya_obj.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_jya_obj.xml diff --git a/soh/assets/xml/objects/object_ka.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ka.xml similarity index 100% rename from soh/assets/xml/objects/object_ka.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_ka.xml diff --git a/soh/assets/xml/objects/object_kanban.xml b/soh/assets/xml/GC_NMQ_D/objects/object_kanban.xml similarity index 100% rename from soh/assets/xml/objects/object_kanban.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_kanban.xml diff --git a/soh/assets/xml/objects/object_kibako2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_kibako2.xml similarity index 100% rename from soh/assets/xml/objects/object_kibako2.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_kibako2.xml diff --git a/soh/assets/xml/objects/object_kingdodongo.xml b/soh/assets/xml/GC_NMQ_D/objects/object_kingdodongo.xml similarity index 100% rename from soh/assets/xml/objects/object_kingdodongo.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_kingdodongo.xml diff --git a/soh/assets/xml/objects/object_km1.xml b/soh/assets/xml/GC_NMQ_D/objects/object_km1.xml similarity index 100% rename from soh/assets/xml/objects/object_km1.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_km1.xml diff --git a/soh/assets/xml/objects/object_kusa.xml b/soh/assets/xml/GC_NMQ_D/objects/object_kusa.xml similarity index 100% rename from soh/assets/xml/objects/object_kusa.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_kusa.xml diff --git a/soh/assets/xml/objects/object_kw1.xml b/soh/assets/xml/GC_NMQ_D/objects/object_kw1.xml similarity index 100% rename from soh/assets/xml/objects/object_kw1.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_kw1.xml diff --git a/soh/assets/xml/objects/object_kz.xml b/soh/assets/xml/GC_NMQ_D/objects/object_kz.xml similarity index 100% rename from soh/assets/xml/objects/object_kz.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_kz.xml diff --git a/soh/assets/xml/objects/object_light_ring.xml b/soh/assets/xml/GC_NMQ_D/objects/object_light_ring.xml similarity index 100% rename from soh/assets/xml/objects/object_light_ring.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_light_ring.xml diff --git a/soh/assets/xml/objects/object_lightbox.xml b/soh/assets/xml/GC_NMQ_D/objects/object_lightbox.xml similarity index 100% rename from soh/assets/xml/objects/object_lightbox.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_lightbox.xml diff --git a/soh/assets/xml/objects/object_lightswitch.xml b/soh/assets/xml/GC_NMQ_D/objects/object_lightswitch.xml similarity index 100% rename from soh/assets/xml/objects/object_lightswitch.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_lightswitch.xml diff --git a/soh/assets/xml/objects/object_link_boy.xml b/soh/assets/xml/GC_NMQ_D/objects/object_link_boy.xml similarity index 100% rename from soh/assets/xml/objects/object_link_boy.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_link_boy.xml diff --git a/soh/assets/xml/objects/object_link_child.xml b/soh/assets/xml/GC_NMQ_D/objects/object_link_child.xml similarity index 100% rename from soh/assets/xml/objects/object_link_child.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_link_child.xml diff --git a/soh/assets/xml/objects/object_ma1.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ma1.xml similarity index 100% rename from soh/assets/xml/objects/object_ma1.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_ma1.xml diff --git a/soh/assets/xml/objects/object_ma2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ma2.xml similarity index 100% rename from soh/assets/xml/objects/object_ma2.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_ma2.xml diff --git a/soh/assets/xml/objects/object_mag.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mag.xml similarity index 100% rename from soh/assets/xml/objects/object_mag.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_mag.xml diff --git a/soh/assets/xml/objects/object_mamenoki.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mamenoki.xml similarity index 100% rename from soh/assets/xml/objects/object_mamenoki.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_mamenoki.xml diff --git a/soh/assets/xml/objects/object_mastergolon.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mastergolon.xml similarity index 100% rename from soh/assets/xml/objects/object_mastergolon.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_mastergolon.xml diff --git a/soh/assets/xml/objects/object_masterkokiri.xml b/soh/assets/xml/GC_NMQ_D/objects/object_masterkokiri.xml similarity index 100% rename from soh/assets/xml/objects/object_masterkokiri.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_masterkokiri.xml diff --git a/soh/assets/xml/objects/object_masterkokirihead.xml b/soh/assets/xml/GC_NMQ_D/objects/object_masterkokirihead.xml similarity index 100% rename from soh/assets/xml/objects/object_masterkokirihead.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_masterkokirihead.xml diff --git a/soh/assets/xml/objects/object_masterzoora.xml b/soh/assets/xml/GC_NMQ_D/objects/object_masterzoora.xml similarity index 100% rename from soh/assets/xml/objects/object_masterzoora.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_masterzoora.xml diff --git a/soh/assets/xml/objects/object_mb.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mb.xml similarity index 100% rename from soh/assets/xml/objects/object_mb.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_mb.xml diff --git a/soh/assets/xml/objects/object_md.xml b/soh/assets/xml/GC_NMQ_D/objects/object_md.xml similarity index 100% rename from soh/assets/xml/objects/object_md.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_md.xml diff --git a/soh/assets/xml/objects/object_medal.xml b/soh/assets/xml/GC_NMQ_D/objects/object_medal.xml similarity index 100% rename from soh/assets/xml/objects/object_medal.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_medal.xml diff --git a/soh/assets/xml/objects/object_menkuri_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_menkuri_objects.xml similarity index 100% rename from soh/assets/xml/objects/object_menkuri_objects.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_menkuri_objects.xml diff --git a/soh/assets/xml/objects/object_mir_ray.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mir_ray.xml similarity index 100% rename from soh/assets/xml/objects/object_mir_ray.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_mir_ray.xml diff --git a/soh/assets/xml/objects/object_mizu_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mizu_objects.xml similarity index 100% rename from soh/assets/xml/objects/object_mizu_objects.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_mizu_objects.xml diff --git a/soh/assets/xml/objects/object_mjin.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mjin.xml similarity index 100% rename from soh/assets/xml/objects/object_mjin.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_mjin.xml diff --git a/soh/assets/xml/objects/object_mjin_dark.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mjin_dark.xml similarity index 100% rename from soh/assets/xml/objects/object_mjin_dark.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_mjin_dark.xml diff --git a/soh/assets/xml/objects/object_mjin_flame.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mjin_flame.xml similarity index 100% rename from soh/assets/xml/objects/object_mjin_flame.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_mjin_flame.xml diff --git a/soh/assets/xml/objects/object_mjin_flash.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mjin_flash.xml similarity index 100% rename from soh/assets/xml/objects/object_mjin_flash.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_mjin_flash.xml diff --git a/soh/assets/xml/objects/object_mjin_ice.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mjin_ice.xml similarity index 100% rename from soh/assets/xml/objects/object_mjin_ice.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_mjin_ice.xml diff --git a/soh/assets/xml/objects/object_mjin_oka.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mjin_oka.xml similarity index 100% rename from soh/assets/xml/objects/object_mjin_oka.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_mjin_oka.xml diff --git a/soh/assets/xml/objects/object_mjin_soul.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mjin_soul.xml similarity index 100% rename from soh/assets/xml/objects/object_mjin_soul.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_mjin_soul.xml diff --git a/soh/assets/xml/objects/object_mjin_wind.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mjin_wind.xml similarity index 100% rename from soh/assets/xml/objects/object_mjin_wind.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_mjin_wind.xml diff --git a/soh/assets/xml/objects/object_mk.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mk.xml similarity index 100% rename from soh/assets/xml/objects/object_mk.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_mk.xml diff --git a/soh/assets/xml/objects/object_mm.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mm.xml similarity index 100% rename from soh/assets/xml/objects/object_mm.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_mm.xml diff --git a/soh/assets/xml/objects/object_mo.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mo.xml similarity index 100% rename from soh/assets/xml/objects/object_mo.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_mo.xml diff --git a/soh/assets/xml/objects/object_mori_hineri1.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mori_hineri1.xml similarity index 100% rename from soh/assets/xml/objects/object_mori_hineri1.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_mori_hineri1.xml diff --git a/soh/assets/xml/objects/object_mori_hineri1a.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mori_hineri1a.xml similarity index 100% rename from soh/assets/xml/objects/object_mori_hineri1a.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_mori_hineri1a.xml diff --git a/soh/assets/xml/objects/object_mori_hineri2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mori_hineri2.xml similarity index 100% rename from soh/assets/xml/objects/object_mori_hineri2.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_mori_hineri2.xml diff --git a/soh/assets/xml/objects/object_mori_hineri2a.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mori_hineri2a.xml similarity index 100% rename from soh/assets/xml/objects/object_mori_hineri2a.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_mori_hineri2a.xml diff --git a/soh/assets/xml/objects/object_mori_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mori_objects.xml similarity index 100% rename from soh/assets/xml/objects/object_mori_objects.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_mori_objects.xml diff --git a/soh/assets/xml/objects/object_mori_tex.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mori_tex.xml similarity index 100% rename from soh/assets/xml/objects/object_mori_tex.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_mori_tex.xml diff --git a/soh/assets/xml/objects/object_ms.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ms.xml similarity index 100% rename from soh/assets/xml/objects/object_ms.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_ms.xml diff --git a/soh/assets/xml/objects/object_mu.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mu.xml similarity index 100% rename from soh/assets/xml/objects/object_mu.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_mu.xml diff --git a/soh/assets/xml/objects/object_nb.xml b/soh/assets/xml/GC_NMQ_D/objects/object_nb.xml similarity index 100% rename from soh/assets/xml/objects/object_nb.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_nb.xml diff --git a/soh/assets/xml/objects/object_niw.xml b/soh/assets/xml/GC_NMQ_D/objects/object_niw.xml similarity index 100% rename from soh/assets/xml/objects/object_niw.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_niw.xml diff --git a/soh/assets/xml/objects/object_nwc.xml b/soh/assets/xml/GC_NMQ_D/objects/object_nwc.xml similarity index 100% rename from soh/assets/xml/objects/object_nwc.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_nwc.xml diff --git a/soh/assets/xml/objects/object_ny.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ny.xml similarity index 100% rename from soh/assets/xml/objects/object_ny.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_ny.xml diff --git a/soh/assets/xml/objects/object_oA1.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oA1.xml similarity index 100% rename from soh/assets/xml/objects/object_oA1.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_oA1.xml diff --git a/soh/assets/xml/objects/object_oA10.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oA10.xml similarity index 100% rename from soh/assets/xml/objects/object_oA10.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_oA10.xml diff --git a/soh/assets/xml/objects/object_oA11.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oA11.xml similarity index 100% rename from soh/assets/xml/objects/object_oA11.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_oA11.xml diff --git a/soh/assets/xml/objects/object_oA2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oA2.xml similarity index 100% rename from soh/assets/xml/objects/object_oA2.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_oA2.xml diff --git a/soh/assets/xml/objects/object_oA3.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oA3.xml similarity index 100% rename from soh/assets/xml/objects/object_oA3.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_oA3.xml diff --git a/soh/assets/xml/objects/object_oA4.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oA4.xml similarity index 100% rename from soh/assets/xml/objects/object_oA4.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_oA4.xml diff --git a/soh/assets/xml/objects/object_oA5.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oA5.xml similarity index 100% rename from soh/assets/xml/objects/object_oA5.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_oA5.xml diff --git a/soh/assets/xml/objects/object_oA6.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oA6.xml similarity index 100% rename from soh/assets/xml/objects/object_oA6.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_oA6.xml diff --git a/soh/assets/xml/objects/object_oA7.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oA7.xml similarity index 100% rename from soh/assets/xml/objects/object_oA7.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_oA7.xml diff --git a/soh/assets/xml/objects/object_oA8.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oA8.xml similarity index 100% rename from soh/assets/xml/objects/object_oA8.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_oA8.xml diff --git a/soh/assets/xml/objects/object_oA9.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oA9.xml similarity index 100% rename from soh/assets/xml/objects/object_oA9.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_oA9.xml diff --git a/soh/assets/xml/objects/object_oB1.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oB1.xml similarity index 100% rename from soh/assets/xml/objects/object_oB1.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_oB1.xml diff --git a/soh/assets/xml/objects/object_oB2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oB2.xml similarity index 100% rename from soh/assets/xml/objects/object_oB2.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_oB2.xml diff --git a/soh/assets/xml/objects/object_oB3.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oB3.xml similarity index 100% rename from soh/assets/xml/objects/object_oB3.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_oB3.xml diff --git a/soh/assets/xml/objects/object_oB4.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oB4.xml similarity index 100% rename from soh/assets/xml/objects/object_oB4.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_oB4.xml diff --git a/soh/assets/xml/objects/object_oE1.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oE1.xml similarity index 100% rename from soh/assets/xml/objects/object_oE1.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_oE1.xml diff --git a/soh/assets/xml/objects/object_oE10.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oE10.xml similarity index 100% rename from soh/assets/xml/objects/object_oE10.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_oE10.xml diff --git a/soh/assets/xml/objects/object_oE11.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oE11.xml similarity index 100% rename from soh/assets/xml/objects/object_oE11.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_oE11.xml diff --git a/soh/assets/xml/objects/object_oE12.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oE12.xml similarity index 100% rename from soh/assets/xml/objects/object_oE12.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_oE12.xml diff --git a/soh/assets/xml/objects/object_oE1s.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oE1s.xml similarity index 100% rename from soh/assets/xml/objects/object_oE1s.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_oE1s.xml diff --git a/soh/assets/xml/objects/object_oE2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oE2.xml similarity index 100% rename from soh/assets/xml/objects/object_oE2.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_oE2.xml diff --git a/soh/assets/xml/objects/object_oE3.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oE3.xml similarity index 100% rename from soh/assets/xml/objects/object_oE3.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_oE3.xml diff --git a/soh/assets/xml/objects/object_oE4.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oE4.xml similarity index 100% rename from soh/assets/xml/objects/object_oE4.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_oE4.xml diff --git a/soh/assets/xml/objects/object_oE4s.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oE4s.xml similarity index 100% rename from soh/assets/xml/objects/object_oE4s.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_oE4s.xml diff --git a/soh/assets/xml/objects/object_oE5.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oE5.xml similarity index 100% rename from soh/assets/xml/objects/object_oE5.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_oE5.xml diff --git a/soh/assets/xml/objects/object_oE6.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oE6.xml similarity index 100% rename from soh/assets/xml/objects/object_oE6.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_oE6.xml diff --git a/soh/assets/xml/objects/object_oE7.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oE7.xml similarity index 100% rename from soh/assets/xml/objects/object_oE7.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_oE7.xml diff --git a/soh/assets/xml/objects/object_oE8.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oE8.xml similarity index 100% rename from soh/assets/xml/objects/object_oE8.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_oE8.xml diff --git a/soh/assets/xml/objects/object_oE9.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oE9.xml similarity index 100% rename from soh/assets/xml/objects/object_oE9.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_oE9.xml diff --git a/soh/assets/xml/objects/object_oE_anime.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oE_anime.xml similarity index 100% rename from soh/assets/xml/objects/object_oE_anime.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_oE_anime.xml diff --git a/soh/assets/xml/objects/object_oF1d_map.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oF1d_map.xml similarity index 100% rename from soh/assets/xml/objects/object_oF1d_map.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_oF1d_map.xml diff --git a/soh/assets/xml/objects/object_oF1s.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oF1s.xml similarity index 100% rename from soh/assets/xml/objects/object_oF1s.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_oF1s.xml diff --git a/soh/assets/xml/objects/object_o_anime.xml b/soh/assets/xml/GC_NMQ_D/objects/object_o_anime.xml similarity index 100% rename from soh/assets/xml/objects/object_o_anime.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_o_anime.xml diff --git a/soh/assets/xml/objects/object_okuta.xml b/soh/assets/xml/GC_NMQ_D/objects/object_okuta.xml similarity index 100% rename from soh/assets/xml/objects/object_okuta.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_okuta.xml diff --git a/soh/assets/xml/objects/object_opening_demo1.xml b/soh/assets/xml/GC_NMQ_D/objects/object_opening_demo1.xml similarity index 100% rename from soh/assets/xml/objects/object_opening_demo1.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_opening_demo1.xml diff --git a/soh/assets/xml/objects/object_os.xml b/soh/assets/xml/GC_NMQ_D/objects/object_os.xml similarity index 100% rename from soh/assets/xml/objects/object_os.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_os.xml diff --git a/soh/assets/xml/objects/object_os_anime.xml b/soh/assets/xml/GC_NMQ_D/objects/object_os_anime.xml similarity index 100% rename from soh/assets/xml/objects/object_os_anime.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_os_anime.xml diff --git a/soh/assets/xml/objects/object_ossan.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ossan.xml similarity index 100% rename from soh/assets/xml/objects/object_ossan.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_ossan.xml diff --git a/soh/assets/xml/objects/object_ouke_haka.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ouke_haka.xml similarity index 100% rename from soh/assets/xml/objects/object_ouke_haka.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_ouke_haka.xml diff --git a/soh/assets/xml/objects/object_owl.xml b/soh/assets/xml/GC_NMQ_D/objects/object_owl.xml similarity index 100% rename from soh/assets/xml/objects/object_owl.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_owl.xml diff --git a/soh/assets/xml/objects/object_peehat.xml b/soh/assets/xml/GC_NMQ_D/objects/object_peehat.xml similarity index 100% rename from soh/assets/xml/objects/object_peehat.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_peehat.xml diff --git a/soh/assets/xml/objects/object_po_composer.xml b/soh/assets/xml/GC_NMQ_D/objects/object_po_composer.xml similarity index 100% rename from soh/assets/xml/objects/object_po_composer.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_po_composer.xml diff --git a/soh/assets/xml/objects/object_po_field.xml b/soh/assets/xml/GC_NMQ_D/objects/object_po_field.xml similarity index 100% rename from soh/assets/xml/objects/object_po_field.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_po_field.xml diff --git a/soh/assets/xml/objects/object_po_sisters.xml b/soh/assets/xml/GC_NMQ_D/objects/object_po_sisters.xml similarity index 100% rename from soh/assets/xml/objects/object_po_sisters.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_po_sisters.xml diff --git a/soh/assets/xml/objects/object_poh.xml b/soh/assets/xml/GC_NMQ_D/objects/object_poh.xml similarity index 100% rename from soh/assets/xml/objects/object_poh.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_poh.xml diff --git a/soh/assets/xml/objects/object_ps.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ps.xml similarity index 100% rename from soh/assets/xml/objects/object_ps.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_ps.xml diff --git a/soh/assets/xml/objects/object_pu_box.xml b/soh/assets/xml/GC_NMQ_D/objects/object_pu_box.xml similarity index 100% rename from soh/assets/xml/objects/object_pu_box.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_pu_box.xml diff --git a/soh/assets/xml/objects/object_rd.xml b/soh/assets/xml/GC_NMQ_D/objects/object_rd.xml similarity index 100% rename from soh/assets/xml/objects/object_rd.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_rd.xml diff --git a/soh/assets/xml/objects/object_reeba.xml b/soh/assets/xml/GC_NMQ_D/objects/object_reeba.xml similarity index 100% rename from soh/assets/xml/objects/object_reeba.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_reeba.xml diff --git a/soh/assets/xml/objects/object_relay_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_relay_objects.xml similarity index 100% rename from soh/assets/xml/objects/object_relay_objects.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_relay_objects.xml diff --git a/soh/assets/xml/objects/object_rl.xml b/soh/assets/xml/GC_NMQ_D/objects/object_rl.xml similarity index 100% rename from soh/assets/xml/objects/object_rl.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_rl.xml diff --git a/soh/assets/xml/objects/object_rr.xml b/soh/assets/xml/GC_NMQ_D/objects/object_rr.xml similarity index 100% rename from soh/assets/xml/objects/object_rr.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_rr.xml diff --git a/soh/assets/xml/objects/object_rs.xml b/soh/assets/xml/GC_NMQ_D/objects/object_rs.xml similarity index 100% rename from soh/assets/xml/objects/object_rs.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_rs.xml diff --git a/soh/assets/xml/objects/object_ru1.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ru1.xml similarity index 100% rename from soh/assets/xml/objects/object_ru1.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_ru1.xml diff --git a/soh/assets/xml/objects/object_ru2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ru2.xml similarity index 100% rename from soh/assets/xml/objects/object_ru2.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_ru2.xml diff --git a/soh/assets/xml/objects/object_sa.xml b/soh/assets/xml/GC_NMQ_D/objects/object_sa.xml similarity index 100% rename from soh/assets/xml/objects/object_sa.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_sa.xml diff --git a/soh/assets/xml/objects/object_sb.xml b/soh/assets/xml/GC_NMQ_D/objects/object_sb.xml similarity index 100% rename from soh/assets/xml/objects/object_sb.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_sb.xml diff --git a/soh/assets/xml/objects/object_sd.xml b/soh/assets/xml/GC_NMQ_D/objects/object_sd.xml similarity index 100% rename from soh/assets/xml/objects/object_sd.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_sd.xml diff --git a/soh/assets/xml/objects/object_shop_dungen.xml b/soh/assets/xml/GC_NMQ_D/objects/object_shop_dungen.xml similarity index 100% rename from soh/assets/xml/objects/object_shop_dungen.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_shop_dungen.xml diff --git a/soh/assets/xml/objects/object_shopnuts.xml b/soh/assets/xml/GC_NMQ_D/objects/object_shopnuts.xml similarity index 100% rename from soh/assets/xml/objects/object_shopnuts.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_shopnuts.xml diff --git a/soh/assets/xml/objects/object_siofuki.xml b/soh/assets/xml/GC_NMQ_D/objects/object_siofuki.xml similarity index 100% rename from soh/assets/xml/objects/object_siofuki.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_siofuki.xml diff --git a/soh/assets/xml/objects/object_sk2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_sk2.xml similarity index 100% rename from soh/assets/xml/objects/object_sk2.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_sk2.xml diff --git a/soh/assets/xml/objects/object_skb.xml b/soh/assets/xml/GC_NMQ_D/objects/object_skb.xml similarity index 100% rename from soh/assets/xml/objects/object_skb.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_skb.xml diff --git a/soh/assets/xml/objects/object_skj.xml b/soh/assets/xml/GC_NMQ_D/objects/object_skj.xml similarity index 100% rename from soh/assets/xml/objects/object_skj.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_skj.xml diff --git a/soh/assets/xml/objects/object_spot00_break.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot00_break.xml similarity index 100% rename from soh/assets/xml/objects/object_spot00_break.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_spot00_break.xml diff --git a/soh/assets/xml/objects/object_spot00_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot00_objects.xml similarity index 100% rename from soh/assets/xml/objects/object_spot00_objects.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_spot00_objects.xml diff --git a/soh/assets/xml/objects/object_spot01_matoya.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot01_matoya.xml similarity index 100% rename from soh/assets/xml/objects/object_spot01_matoya.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_spot01_matoya.xml diff --git a/soh/assets/xml/objects/object_spot01_matoyab.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot01_matoyab.xml similarity index 100% rename from soh/assets/xml/objects/object_spot01_matoyab.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_spot01_matoyab.xml diff --git a/soh/assets/xml/objects/object_spot01_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot01_objects.xml similarity index 100% rename from soh/assets/xml/objects/object_spot01_objects.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_spot01_objects.xml diff --git a/soh/assets/xml/objects/object_spot01_objects2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot01_objects2.xml similarity index 100% rename from soh/assets/xml/objects/object_spot01_objects2.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_spot01_objects2.xml diff --git a/soh/assets/xml/objects/object_spot02_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot02_objects.xml similarity index 100% rename from soh/assets/xml/objects/object_spot02_objects.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_spot02_objects.xml diff --git a/soh/assets/xml/objects/object_spot03_object.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot03_object.xml similarity index 100% rename from soh/assets/xml/objects/object_spot03_object.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_spot03_object.xml diff --git a/soh/assets/xml/objects/object_spot04_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot04_objects.xml similarity index 100% rename from soh/assets/xml/objects/object_spot04_objects.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_spot04_objects.xml diff --git a/soh/assets/xml/objects/object_spot05_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot05_objects.xml similarity index 100% rename from soh/assets/xml/objects/object_spot05_objects.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_spot05_objects.xml diff --git a/soh/assets/xml/objects/object_spot06_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot06_objects.xml similarity index 100% rename from soh/assets/xml/objects/object_spot06_objects.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_spot06_objects.xml diff --git a/soh/assets/xml/objects/object_spot07_object.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot07_object.xml similarity index 100% rename from soh/assets/xml/objects/object_spot07_object.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_spot07_object.xml diff --git a/soh/assets/xml/objects/object_spot08_obj.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot08_obj.xml similarity index 100% rename from soh/assets/xml/objects/object_spot08_obj.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_spot08_obj.xml diff --git a/soh/assets/xml/objects/object_spot09_obj.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot09_obj.xml similarity index 100% rename from soh/assets/xml/objects/object_spot09_obj.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_spot09_obj.xml diff --git a/soh/assets/xml/objects/object_spot11_obj.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot11_obj.xml similarity index 100% rename from soh/assets/xml/objects/object_spot11_obj.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_spot11_obj.xml diff --git a/soh/assets/xml/objects/object_spot12_obj.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot12_obj.xml similarity index 100% rename from soh/assets/xml/objects/object_spot12_obj.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_spot12_obj.xml diff --git a/soh/assets/xml/objects/object_spot15_obj.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot15_obj.xml similarity index 100% rename from soh/assets/xml/objects/object_spot15_obj.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_spot15_obj.xml diff --git a/soh/assets/xml/objects/object_spot16_obj.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot16_obj.xml similarity index 100% rename from soh/assets/xml/objects/object_spot16_obj.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_spot16_obj.xml diff --git a/soh/assets/xml/objects/object_spot17_obj.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot17_obj.xml similarity index 100% rename from soh/assets/xml/objects/object_spot17_obj.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_spot17_obj.xml diff --git a/soh/assets/xml/objects/object_spot18_obj.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot18_obj.xml similarity index 100% rename from soh/assets/xml/objects/object_spot18_obj.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_spot18_obj.xml diff --git a/soh/assets/xml/objects/object_ssh.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ssh.xml similarity index 100% rename from soh/assets/xml/objects/object_ssh.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_ssh.xml diff --git a/soh/assets/xml/objects/object_sst.xml b/soh/assets/xml/GC_NMQ_D/objects/object_sst.xml similarity index 100% rename from soh/assets/xml/objects/object_sst.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_sst.xml diff --git a/soh/assets/xml/objects/object_st.xml b/soh/assets/xml/GC_NMQ_D/objects/object_st.xml similarity index 100% rename from soh/assets/xml/objects/object_st.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_st.xml diff --git a/soh/assets/xml/objects/object_stream.xml b/soh/assets/xml/GC_NMQ_D/objects/object_stream.xml similarity index 100% rename from soh/assets/xml/objects/object_stream.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_stream.xml diff --git a/soh/assets/xml/objects/object_syokudai.xml b/soh/assets/xml/GC_NMQ_D/objects/object_syokudai.xml similarity index 100% rename from soh/assets/xml/objects/object_syokudai.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_syokudai.xml diff --git a/soh/assets/xml/objects/object_ta.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ta.xml similarity index 100% rename from soh/assets/xml/objects/object_ta.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_ta.xml diff --git a/soh/assets/xml/objects/object_timeblock.xml b/soh/assets/xml/GC_NMQ_D/objects/object_timeblock.xml similarity index 100% rename from soh/assets/xml/objects/object_timeblock.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_timeblock.xml diff --git a/soh/assets/xml/objects/object_tite.xml b/soh/assets/xml/GC_NMQ_D/objects/object_tite.xml similarity index 100% rename from soh/assets/xml/objects/object_tite.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_tite.xml diff --git a/soh/assets/xml/objects/object_tk.xml b/soh/assets/xml/GC_NMQ_D/objects/object_tk.xml similarity index 100% rename from soh/assets/xml/objects/object_tk.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_tk.xml diff --git a/soh/assets/xml/objects/object_toki_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_toki_objects.xml similarity index 100% rename from soh/assets/xml/objects/object_toki_objects.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_toki_objects.xml diff --git a/soh/assets/xml/objects/object_torch2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_torch2.xml similarity index 100% rename from soh/assets/xml/objects/object_torch2.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_torch2.xml diff --git a/soh/assets/xml/objects/object_toryo.xml b/soh/assets/xml/GC_NMQ_D/objects/object_toryo.xml similarity index 100% rename from soh/assets/xml/objects/object_toryo.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_toryo.xml diff --git a/soh/assets/xml/objects/object_tp.xml b/soh/assets/xml/GC_NMQ_D/objects/object_tp.xml similarity index 100% rename from soh/assets/xml/objects/object_tp.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_tp.xml diff --git a/soh/assets/xml/objects/object_tr.xml b/soh/assets/xml/GC_NMQ_D/objects/object_tr.xml similarity index 100% rename from soh/assets/xml/objects/object_tr.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_tr.xml diff --git a/soh/assets/xml/objects/object_trap.xml b/soh/assets/xml/GC_NMQ_D/objects/object_trap.xml similarity index 100% rename from soh/assets/xml/objects/object_trap.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_trap.xml diff --git a/soh/assets/xml/objects/object_triforce_spot.xml b/soh/assets/xml/GC_NMQ_D/objects/object_triforce_spot.xml similarity index 100% rename from soh/assets/xml/objects/object_triforce_spot.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_triforce_spot.xml diff --git a/soh/assets/xml/objects/object_ts.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ts.xml similarity index 100% rename from soh/assets/xml/objects/object_ts.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_ts.xml diff --git a/soh/assets/xml/objects/object_tsubo.xml b/soh/assets/xml/GC_NMQ_D/objects/object_tsubo.xml similarity index 100% rename from soh/assets/xml/objects/object_tsubo.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_tsubo.xml diff --git a/soh/assets/xml/objects/object_tw.xml b/soh/assets/xml/GC_NMQ_D/objects/object_tw.xml similarity index 100% rename from soh/assets/xml/objects/object_tw.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_tw.xml diff --git a/soh/assets/xml/objects/object_umajump.xml b/soh/assets/xml/GC_NMQ_D/objects/object_umajump.xml similarity index 100% rename from soh/assets/xml/objects/object_umajump.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_umajump.xml diff --git a/soh/assets/xml/objects/object_vali.xml b/soh/assets/xml/GC_NMQ_D/objects/object_vali.xml similarity index 100% rename from soh/assets/xml/objects/object_vali.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_vali.xml diff --git a/soh/assets/xml/objects/object_vase.xml b/soh/assets/xml/GC_NMQ_D/objects/object_vase.xml similarity index 100% rename from soh/assets/xml/objects/object_vase.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_vase.xml diff --git a/soh/assets/xml/objects/object_vm.xml b/soh/assets/xml/GC_NMQ_D/objects/object_vm.xml similarity index 100% rename from soh/assets/xml/objects/object_vm.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_vm.xml diff --git a/soh/assets/xml/objects/object_wallmaster.xml b/soh/assets/xml/GC_NMQ_D/objects/object_wallmaster.xml similarity index 100% rename from soh/assets/xml/objects/object_wallmaster.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_wallmaster.xml diff --git a/soh/assets/xml/objects/object_warp1.xml b/soh/assets/xml/GC_NMQ_D/objects/object_warp1.xml similarity index 100% rename from soh/assets/xml/objects/object_warp1.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_warp1.xml diff --git a/soh/assets/xml/objects/object_warp2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_warp2.xml similarity index 100% rename from soh/assets/xml/objects/object_warp2.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_warp2.xml diff --git a/soh/assets/xml/objects/object_wf.xml b/soh/assets/xml/GC_NMQ_D/objects/object_wf.xml similarity index 100% rename from soh/assets/xml/objects/object_wf.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_wf.xml diff --git a/soh/assets/xml/objects/object_wood02.xml b/soh/assets/xml/GC_NMQ_D/objects/object_wood02.xml similarity index 100% rename from soh/assets/xml/objects/object_wood02.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_wood02.xml diff --git a/soh/assets/xml/objects/object_xc.xml b/soh/assets/xml/GC_NMQ_D/objects/object_xc.xml similarity index 100% rename from soh/assets/xml/objects/object_xc.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_xc.xml diff --git a/soh/assets/xml/objects/object_yabusame_point.xml b/soh/assets/xml/GC_NMQ_D/objects/object_yabusame_point.xml similarity index 100% rename from soh/assets/xml/objects/object_yabusame_point.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_yabusame_point.xml diff --git a/soh/assets/xml/objects/object_ydan_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ydan_objects.xml similarity index 100% rename from soh/assets/xml/objects/object_ydan_objects.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_ydan_objects.xml diff --git a/soh/assets/xml/objects/object_yukabyun.xml b/soh/assets/xml/GC_NMQ_D/objects/object_yukabyun.xml similarity index 100% rename from soh/assets/xml/objects/object_yukabyun.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_yukabyun.xml diff --git a/soh/assets/xml/objects/object_zf.xml b/soh/assets/xml/GC_NMQ_D/objects/object_zf.xml similarity index 100% rename from soh/assets/xml/objects/object_zf.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_zf.xml diff --git a/soh/assets/xml/objects/object_zg.xml b/soh/assets/xml/GC_NMQ_D/objects/object_zg.xml similarity index 100% rename from soh/assets/xml/objects/object_zg.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_zg.xml diff --git a/soh/assets/xml/objects/object_zl1.xml b/soh/assets/xml/GC_NMQ_D/objects/object_zl1.xml similarity index 100% rename from soh/assets/xml/objects/object_zl1.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_zl1.xml diff --git a/soh/assets/xml/objects/object_zl2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_zl2.xml similarity index 100% rename from soh/assets/xml/objects/object_zl2.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_zl2.xml diff --git a/soh/assets/xml/objects/object_zl2_anime1.xml b/soh/assets/xml/GC_NMQ_D/objects/object_zl2_anime1.xml similarity index 100% rename from soh/assets/xml/objects/object_zl2_anime1.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_zl2_anime1.xml diff --git a/soh/assets/xml/objects/object_zl2_anime2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_zl2_anime2.xml similarity index 100% rename from soh/assets/xml/objects/object_zl2_anime2.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_zl2_anime2.xml diff --git a/soh/assets/xml/objects/object_zl4.xml b/soh/assets/xml/GC_NMQ_D/objects/object_zl4.xml similarity index 100% rename from soh/assets/xml/objects/object_zl4.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_zl4.xml diff --git a/soh/assets/xml/objects/object_zo.xml b/soh/assets/xml/GC_NMQ_D/objects/object_zo.xml similarity index 100% rename from soh/assets/xml/objects/object_zo.xml rename to soh/assets/xml/GC_NMQ_D/objects/object_zo.xml diff --git a/soh/assets/xml/overlays/ovl_Arrow_Fire.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Arrow_Fire.xml similarity index 100% rename from soh/assets/xml/overlays/ovl_Arrow_Fire.xml rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Arrow_Fire.xml diff --git a/soh/assets/xml/overlays/ovl_Arrow_Ice.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Arrow_Ice.xml similarity index 100% rename from soh/assets/xml/overlays/ovl_Arrow_Ice.xml rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Arrow_Ice.xml diff --git a/soh/assets/xml/overlays/ovl_Arrow_Light.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Arrow_Light.xml similarity index 100% rename from soh/assets/xml/overlays/ovl_Arrow_Light.xml rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Arrow_Light.xml diff --git a/soh/assets/xml/overlays/ovl_Bg_Ganon_Otyuka.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Bg_Ganon_Otyuka.xml similarity index 100% rename from soh/assets/xml/overlays/ovl_Bg_Ganon_Otyuka.xml rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Bg_Ganon_Otyuka.xml diff --git a/soh/assets/xml/overlays/ovl_Bg_Jya_Cobra.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Bg_Jya_Cobra.xml similarity index 100% rename from soh/assets/xml/overlays/ovl_Bg_Jya_Cobra.xml rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Bg_Jya_Cobra.xml diff --git a/soh/assets/xml/overlays/ovl_Boss_Dodongo.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Boss_Dodongo.xml similarity index 100% rename from soh/assets/xml/overlays/ovl_Boss_Dodongo.xml rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Boss_Dodongo.xml diff --git a/soh/assets/xml/overlays/ovl_Boss_Ganon.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Boss_Ganon.xml similarity index 100% rename from soh/assets/xml/overlays/ovl_Boss_Ganon.xml rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Boss_Ganon.xml diff --git a/soh/assets/xml/overlays/ovl_Boss_Ganon2.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Boss_Ganon2.xml similarity index 100% rename from soh/assets/xml/overlays/ovl_Boss_Ganon2.xml rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Boss_Ganon2.xml diff --git a/soh/assets/xml/overlays/ovl_Boss_Sst.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Boss_Sst.xml similarity index 100% rename from soh/assets/xml/overlays/ovl_Boss_Sst.xml rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Boss_Sst.xml diff --git a/soh/assets/xml/overlays/ovl_Demo_Shd.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Demo_Shd.xml similarity index 100% rename from soh/assets/xml/overlays/ovl_Demo_Shd.xml rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Demo_Shd.xml diff --git a/soh/assets/xml/overlays/ovl_Elf_Msg.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Elf_Msg.xml similarity index 100% rename from soh/assets/xml/overlays/ovl_Elf_Msg.xml rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Elf_Msg.xml diff --git a/soh/assets/xml/overlays/ovl_Elf_Msg2.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Elf_Msg2.xml similarity index 100% rename from soh/assets/xml/overlays/ovl_Elf_Msg2.xml rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Elf_Msg2.xml diff --git a/soh/assets/xml/overlays/ovl_En_Bili.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Bili.xml similarity index 100% rename from soh/assets/xml/overlays/ovl_En_Bili.xml rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Bili.xml diff --git a/soh/assets/xml/overlays/ovl_En_Clear_Tag.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Clear_Tag.xml similarity index 100% rename from soh/assets/xml/overlays/ovl_En_Clear_Tag.xml rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Clear_Tag.xml diff --git a/soh/assets/xml/overlays/ovl_En_Ganon_Mant.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Ganon_Mant.xml similarity index 100% rename from soh/assets/xml/overlays/ovl_En_Ganon_Mant.xml rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Ganon_Mant.xml diff --git a/soh/assets/xml/overlays/ovl_En_Ganon_Organ.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Ganon_Organ.xml similarity index 100% rename from soh/assets/xml/overlays/ovl_En_Ganon_Organ.xml rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Ganon_Organ.xml diff --git a/soh/assets/xml/overlays/ovl_En_Holl.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Holl.xml similarity index 100% rename from soh/assets/xml/overlays/ovl_En_Holl.xml rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Holl.xml diff --git a/soh/assets/xml/overlays/ovl_En_Jsjutan.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Jsjutan.xml similarity index 100% rename from soh/assets/xml/overlays/ovl_En_Jsjutan.xml rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Jsjutan.xml diff --git a/soh/assets/xml/overlays/ovl_En_Kanban.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Kanban.xml similarity index 100% rename from soh/assets/xml/overlays/ovl_En_Kanban.xml rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Kanban.xml diff --git a/soh/assets/xml/overlays/ovl_En_Sda.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Sda.xml similarity index 100% rename from soh/assets/xml/overlays/ovl_En_Sda.xml rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Sda.xml diff --git a/soh/assets/xml/overlays/ovl_En_Ssh.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Ssh.xml similarity index 100% rename from soh/assets/xml/overlays/ovl_En_Ssh.xml rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Ssh.xml diff --git a/soh/assets/xml/overlays/ovl_En_St.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_En_St.xml similarity index 100% rename from soh/assets/xml/overlays/ovl_En_St.xml rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_En_St.xml diff --git a/soh/assets/xml/overlays/ovl_En_Sth.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Sth.xml similarity index 100% rename from soh/assets/xml/overlays/ovl_En_Sth.xml rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Sth.xml diff --git a/soh/assets/xml/overlays/ovl_End_Title.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_End_Title.xml similarity index 100% rename from soh/assets/xml/overlays/ovl_End_Title.xml rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_End_Title.xml diff --git a/soh/assets/xml/overlays/ovl_File_Choose.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_File_Choose.xml similarity index 100% rename from soh/assets/xml/overlays/ovl_File_Choose.xml rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_File_Choose.xml diff --git a/soh/assets/xml/overlays/ovl_Magic_Dark.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Magic_Dark.xml similarity index 100% rename from soh/assets/xml/overlays/ovl_Magic_Dark.xml rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Magic_Dark.xml diff --git a/soh/assets/xml/overlays/ovl_Magic_Fire.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Magic_Fire.xml similarity index 100% rename from soh/assets/xml/overlays/ovl_Magic_Fire.xml rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Magic_Fire.xml diff --git a/soh/assets/xml/overlays/ovl_Magic_Wind.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Magic_Wind.xml similarity index 100% rename from soh/assets/xml/overlays/ovl_Magic_Wind.xml rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Magic_Wind.xml diff --git a/soh/assets/xml/overlays/ovl_Oceff_Spot.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Oceff_Spot.xml similarity index 100% rename from soh/assets/xml/overlays/ovl_Oceff_Spot.xml rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Oceff_Spot.xml diff --git a/soh/assets/xml/overlays/ovl_Oceff_Storm.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Oceff_Storm.xml similarity index 100% rename from soh/assets/xml/overlays/ovl_Oceff_Storm.xml rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Oceff_Storm.xml diff --git a/soh/assets/xml/overlays/ovl_Oceff_Wipe.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Oceff_Wipe.xml similarity index 100% rename from soh/assets/xml/overlays/ovl_Oceff_Wipe.xml rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Oceff_Wipe.xml diff --git a/soh/assets/xml/overlays/ovl_Oceff_Wipe2.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Oceff_Wipe2.xml similarity index 100% rename from soh/assets/xml/overlays/ovl_Oceff_Wipe2.xml rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Oceff_Wipe2.xml diff --git a/soh/assets/xml/overlays/ovl_Oceff_Wipe3.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Oceff_Wipe3.xml similarity index 100% rename from soh/assets/xml/overlays/ovl_Oceff_Wipe3.xml rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Oceff_Wipe3.xml diff --git a/soh/assets/xml/overlays/ovl_Oceff_Wipe4.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Oceff_Wipe4.xml similarity index 100% rename from soh/assets/xml/overlays/ovl_Oceff_Wipe4.xml rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Oceff_Wipe4.xml diff --git a/soh/assets/xml/scenes/dungeons/Bmori1.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/Bmori1.xml similarity index 100% rename from soh/assets/xml/scenes/dungeons/Bmori1.xml rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/Bmori1.xml diff --git a/soh/assets/xml/scenes/dungeons/FIRE_bs.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/FIRE_bs.xml similarity index 100% rename from soh/assets/xml/scenes/dungeons/FIRE_bs.xml rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/FIRE_bs.xml diff --git a/soh/assets/xml/scenes/dungeons/HAKAdan.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/HAKAdan.xml similarity index 100% rename from soh/assets/xml/scenes/dungeons/HAKAdan.xml rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/HAKAdan.xml diff --git a/soh/assets/xml/scenes/dungeons/HAKAdanCH.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/HAKAdanCH.xml similarity index 100% rename from soh/assets/xml/scenes/dungeons/HAKAdanCH.xml rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/HAKAdanCH.xml diff --git a/soh/assets/xml/scenes/dungeons/HAKAdan_bs.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/HAKAdan_bs.xml similarity index 100% rename from soh/assets/xml/scenes/dungeons/HAKAdan_bs.xml rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/HAKAdan_bs.xml diff --git a/soh/assets/xml/scenes/dungeons/HIDAN.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/HIDAN.xml similarity index 100% rename from soh/assets/xml/scenes/dungeons/HIDAN.xml rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/HIDAN.xml diff --git a/soh/assets/xml/scenes/dungeons/MIZUsin.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/MIZUsin.xml similarity index 100% rename from soh/assets/xml/scenes/dungeons/MIZUsin.xml rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/MIZUsin.xml diff --git a/soh/assets/xml/scenes/dungeons/MIZUsin_bs.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/MIZUsin_bs.xml similarity index 100% rename from soh/assets/xml/scenes/dungeons/MIZUsin_bs.xml rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/MIZUsin_bs.xml diff --git a/soh/assets/xml/scenes/dungeons/bdan.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/bdan.xml similarity index 100% rename from soh/assets/xml/scenes/dungeons/bdan.xml rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/bdan.xml diff --git a/soh/assets/xml/scenes/dungeons/bdan_boss.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/bdan_boss.xml similarity index 100% rename from soh/assets/xml/scenes/dungeons/bdan_boss.xml rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/bdan_boss.xml diff --git a/soh/assets/xml/scenes/dungeons/ddan.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/ddan.xml similarity index 100% rename from soh/assets/xml/scenes/dungeons/ddan.xml rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/ddan.xml diff --git a/soh/assets/xml/scenes/dungeons/ddan_boss.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/ddan_boss.xml similarity index 100% rename from soh/assets/xml/scenes/dungeons/ddan_boss.xml rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/ddan_boss.xml diff --git a/soh/assets/xml/scenes/dungeons/ganon.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/ganon.xml similarity index 100% rename from soh/assets/xml/scenes/dungeons/ganon.xml rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/ganon.xml diff --git a/soh/assets/xml/scenes/dungeons/ganon_boss.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/ganon_boss.xml similarity index 100% rename from soh/assets/xml/scenes/dungeons/ganon_boss.xml rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/ganon_boss.xml diff --git a/soh/assets/xml/scenes/dungeons/ganon_demo.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/ganon_demo.xml similarity index 100% rename from soh/assets/xml/scenes/dungeons/ganon_demo.xml rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/ganon_demo.xml diff --git a/soh/assets/xml/scenes/dungeons/ganon_final.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/ganon_final.xml similarity index 100% rename from soh/assets/xml/scenes/dungeons/ganon_final.xml rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/ganon_final.xml diff --git a/soh/assets/xml/scenes/dungeons/ganon_sonogo.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/ganon_sonogo.xml similarity index 100% rename from soh/assets/xml/scenes/dungeons/ganon_sonogo.xml rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/ganon_sonogo.xml diff --git a/soh/assets/xml/scenes/dungeons/ganon_tou.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/ganon_tou.xml similarity index 100% rename from soh/assets/xml/scenes/dungeons/ganon_tou.xml rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/ganon_tou.xml diff --git a/soh/assets/xml/scenes/dungeons/ganontika.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/ganontika.xml similarity index 100% rename from soh/assets/xml/scenes/dungeons/ganontika.xml rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/ganontika.xml diff --git a/soh/assets/xml/scenes/dungeons/ganontikasonogo.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/ganontikasonogo.xml similarity index 100% rename from soh/assets/xml/scenes/dungeons/ganontikasonogo.xml rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/ganontikasonogo.xml diff --git a/soh/assets/xml/scenes/dungeons/gerudoway.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/gerudoway.xml similarity index 100% rename from soh/assets/xml/scenes/dungeons/gerudoway.xml rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/gerudoway.xml diff --git a/soh/assets/xml/scenes/dungeons/ice_doukutu.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/ice_doukutu.xml similarity index 100% rename from soh/assets/xml/scenes/dungeons/ice_doukutu.xml rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/ice_doukutu.xml diff --git a/soh/assets/xml/scenes/dungeons/jyasinboss.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/jyasinboss.xml similarity index 100% rename from soh/assets/xml/scenes/dungeons/jyasinboss.xml rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/jyasinboss.xml diff --git a/soh/assets/xml/scenes/dungeons/jyasinzou.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/jyasinzou.xml similarity index 100% rename from soh/assets/xml/scenes/dungeons/jyasinzou.xml rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/jyasinzou.xml diff --git a/soh/assets/xml/scenes/dungeons/men.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/men.xml similarity index 100% rename from soh/assets/xml/scenes/dungeons/men.xml rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/men.xml diff --git a/soh/assets/xml/scenes/dungeons/moribossroom.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/moribossroom.xml similarity index 100% rename from soh/assets/xml/scenes/dungeons/moribossroom.xml rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/moribossroom.xml diff --git a/soh/assets/xml/scenes/dungeons/ydan.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/ydan.xml similarity index 100% rename from soh/assets/xml/scenes/dungeons/ydan.xml rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/ydan.xml diff --git a/soh/assets/xml/scenes/dungeons/ydan_boss.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/ydan_boss.xml similarity index 100% rename from soh/assets/xml/scenes/dungeons/ydan_boss.xml rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/ydan_boss.xml diff --git a/soh/assets/xml/scenes/indoors/bowling.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/bowling.xml similarity index 100% rename from soh/assets/xml/scenes/indoors/bowling.xml rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/bowling.xml diff --git a/soh/assets/xml/scenes/indoors/daiyousei_izumi.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/daiyousei_izumi.xml similarity index 100% rename from soh/assets/xml/scenes/indoors/daiyousei_izumi.xml rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/daiyousei_izumi.xml diff --git a/soh/assets/xml/scenes/indoors/hairal_niwa.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/hairal_niwa.xml similarity index 100% rename from soh/assets/xml/scenes/indoors/hairal_niwa.xml rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/hairal_niwa.xml diff --git a/soh/assets/xml/scenes/indoors/hairal_niwa2.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/hairal_niwa2.xml similarity index 100% rename from soh/assets/xml/scenes/indoors/hairal_niwa2.xml rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/hairal_niwa2.xml diff --git a/soh/assets/xml/scenes/indoors/hairal_niwa_n.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/hairal_niwa_n.xml similarity index 100% rename from soh/assets/xml/scenes/indoors/hairal_niwa_n.xml rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/hairal_niwa_n.xml diff --git a/soh/assets/xml/scenes/indoors/hakasitarelay.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/hakasitarelay.xml similarity index 100% rename from soh/assets/xml/scenes/indoors/hakasitarelay.xml rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/hakasitarelay.xml diff --git a/soh/assets/xml/scenes/indoors/hut.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/hut.xml similarity index 100% rename from soh/assets/xml/scenes/indoors/hut.xml rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/hut.xml diff --git a/soh/assets/xml/scenes/indoors/hylia_labo.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/hylia_labo.xml similarity index 100% rename from soh/assets/xml/scenes/indoors/hylia_labo.xml rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/hylia_labo.xml diff --git a/soh/assets/xml/scenes/indoors/impa.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/impa.xml similarity index 100% rename from soh/assets/xml/scenes/indoors/impa.xml rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/impa.xml diff --git a/soh/assets/xml/scenes/indoors/kakariko.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/kakariko.xml similarity index 100% rename from soh/assets/xml/scenes/indoors/kakariko.xml rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/kakariko.xml diff --git a/soh/assets/xml/scenes/indoors/kenjyanoma.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/kenjyanoma.xml similarity index 100% rename from soh/assets/xml/scenes/indoors/kenjyanoma.xml rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/kenjyanoma.xml diff --git a/soh/assets/xml/scenes/indoors/kokiri_home.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/kokiri_home.xml similarity index 100% rename from soh/assets/xml/scenes/indoors/kokiri_home.xml rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/kokiri_home.xml diff --git a/soh/assets/xml/scenes/indoors/kokiri_home3.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/kokiri_home3.xml similarity index 100% rename from soh/assets/xml/scenes/indoors/kokiri_home3.xml rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/kokiri_home3.xml diff --git a/soh/assets/xml/scenes/indoors/kokiri_home4.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/kokiri_home4.xml similarity index 100% rename from soh/assets/xml/scenes/indoors/kokiri_home4.xml rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/kokiri_home4.xml diff --git a/soh/assets/xml/scenes/indoors/kokiri_home5.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/kokiri_home5.xml similarity index 100% rename from soh/assets/xml/scenes/indoors/kokiri_home5.xml rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/kokiri_home5.xml diff --git a/soh/assets/xml/scenes/indoors/labo.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/labo.xml similarity index 100% rename from soh/assets/xml/scenes/indoors/labo.xml rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/labo.xml diff --git a/soh/assets/xml/scenes/indoors/link_home.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/link_home.xml similarity index 100% rename from soh/assets/xml/scenes/indoors/link_home.xml rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/link_home.xml diff --git a/soh/assets/xml/scenes/indoors/mahouya.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/mahouya.xml similarity index 100% rename from soh/assets/xml/scenes/indoors/mahouya.xml rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/mahouya.xml diff --git a/soh/assets/xml/scenes/indoors/malon_stable.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/malon_stable.xml similarity index 100% rename from soh/assets/xml/scenes/indoors/malon_stable.xml rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/malon_stable.xml diff --git a/soh/assets/xml/scenes/indoors/miharigoya.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/miharigoya.xml similarity index 100% rename from soh/assets/xml/scenes/indoors/miharigoya.xml rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/miharigoya.xml diff --git a/soh/assets/xml/scenes/indoors/nakaniwa.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/nakaniwa.xml similarity index 100% rename from soh/assets/xml/scenes/indoors/nakaniwa.xml rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/nakaniwa.xml diff --git a/soh/assets/xml/scenes/indoors/syatekijyou.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/syatekijyou.xml similarity index 100% rename from soh/assets/xml/scenes/indoors/syatekijyou.xml rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/syatekijyou.xml diff --git a/soh/assets/xml/scenes/indoors/takaraya.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/takaraya.xml similarity index 100% rename from soh/assets/xml/scenes/indoors/takaraya.xml rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/takaraya.xml diff --git a/soh/assets/xml/scenes/indoors/tent.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/tent.xml similarity index 100% rename from soh/assets/xml/scenes/indoors/tent.xml rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/tent.xml diff --git a/soh/assets/xml/scenes/indoors/tokinoma.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/tokinoma.xml similarity index 100% rename from soh/assets/xml/scenes/indoors/tokinoma.xml rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/tokinoma.xml diff --git a/soh/assets/xml/scenes/indoors/yousei_izumi_tate.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/yousei_izumi_tate.xml similarity index 100% rename from soh/assets/xml/scenes/indoors/yousei_izumi_tate.xml rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/yousei_izumi_tate.xml diff --git a/soh/assets/xml/scenes/indoors/yousei_izumi_yoko.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/yousei_izumi_yoko.xml similarity index 100% rename from soh/assets/xml/scenes/indoors/yousei_izumi_yoko.xml rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/yousei_izumi_yoko.xml diff --git a/soh/assets/xml/scenes/misc/enrui.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/enrui.xml similarity index 100% rename from soh/assets/xml/scenes/misc/enrui.xml rename to soh/assets/xml/GC_NMQ_D/scenes/misc/enrui.xml diff --git a/soh/assets/xml/scenes/misc/entra_n.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/entra_n.xml similarity index 100% rename from soh/assets/xml/scenes/misc/entra_n.xml rename to soh/assets/xml/GC_NMQ_D/scenes/misc/entra_n.xml diff --git a/soh/assets/xml/scenes/misc/hakaana.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/hakaana.xml similarity index 100% rename from soh/assets/xml/scenes/misc/hakaana.xml rename to soh/assets/xml/GC_NMQ_D/scenes/misc/hakaana.xml diff --git a/soh/assets/xml/scenes/misc/hakaana2.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/hakaana2.xml similarity index 100% rename from soh/assets/xml/scenes/misc/hakaana2.xml rename to soh/assets/xml/GC_NMQ_D/scenes/misc/hakaana2.xml diff --git a/soh/assets/xml/scenes/misc/hakaana_ouke.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/hakaana_ouke.xml similarity index 100% rename from soh/assets/xml/scenes/misc/hakaana_ouke.xml rename to soh/assets/xml/GC_NMQ_D/scenes/misc/hakaana_ouke.xml diff --git a/soh/assets/xml/scenes/misc/hiral_demo.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/hiral_demo.xml similarity index 100% rename from soh/assets/xml/scenes/misc/hiral_demo.xml rename to soh/assets/xml/GC_NMQ_D/scenes/misc/hiral_demo.xml diff --git a/soh/assets/xml/scenes/misc/kakariko3.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/kakariko3.xml similarity index 100% rename from soh/assets/xml/scenes/misc/kakariko3.xml rename to soh/assets/xml/GC_NMQ_D/scenes/misc/kakariko3.xml diff --git a/soh/assets/xml/scenes/misc/kakusiana.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/kakusiana.xml similarity index 100% rename from soh/assets/xml/scenes/misc/kakusiana.xml rename to soh/assets/xml/GC_NMQ_D/scenes/misc/kakusiana.xml diff --git a/soh/assets/xml/scenes/misc/kinsuta.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/kinsuta.xml similarity index 100% rename from soh/assets/xml/scenes/misc/kinsuta.xml rename to soh/assets/xml/GC_NMQ_D/scenes/misc/kinsuta.xml diff --git a/soh/assets/xml/scenes/misc/market_alley.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/market_alley.xml similarity index 100% rename from soh/assets/xml/scenes/misc/market_alley.xml rename to soh/assets/xml/GC_NMQ_D/scenes/misc/market_alley.xml diff --git a/soh/assets/xml/scenes/misc/market_alley_n.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/market_alley_n.xml similarity index 100% rename from soh/assets/xml/scenes/misc/market_alley_n.xml rename to soh/assets/xml/GC_NMQ_D/scenes/misc/market_alley_n.xml diff --git a/soh/assets/xml/scenes/misc/market_day.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/market_day.xml similarity index 100% rename from soh/assets/xml/scenes/misc/market_day.xml rename to soh/assets/xml/GC_NMQ_D/scenes/misc/market_day.xml diff --git a/soh/assets/xml/scenes/misc/market_night.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/market_night.xml similarity index 100% rename from soh/assets/xml/scenes/misc/market_night.xml rename to soh/assets/xml/GC_NMQ_D/scenes/misc/market_night.xml diff --git a/soh/assets/xml/scenes/misc/market_ruins.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/market_ruins.xml similarity index 100% rename from soh/assets/xml/scenes/misc/market_ruins.xml rename to soh/assets/xml/GC_NMQ_D/scenes/misc/market_ruins.xml diff --git a/soh/assets/xml/scenes/misc/shrine.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/shrine.xml similarity index 100% rename from soh/assets/xml/scenes/misc/shrine.xml rename to soh/assets/xml/GC_NMQ_D/scenes/misc/shrine.xml diff --git a/soh/assets/xml/scenes/misc/shrine_n.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/shrine_n.xml similarity index 100% rename from soh/assets/xml/scenes/misc/shrine_n.xml rename to soh/assets/xml/GC_NMQ_D/scenes/misc/shrine_n.xml diff --git a/soh/assets/xml/scenes/misc/shrine_r.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/shrine_r.xml similarity index 100% rename from soh/assets/xml/scenes/misc/shrine_r.xml rename to soh/assets/xml/GC_NMQ_D/scenes/misc/shrine_r.xml diff --git a/soh/assets/xml/scenes/misc/turibori.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/turibori.xml similarity index 100% rename from soh/assets/xml/scenes/misc/turibori.xml rename to soh/assets/xml/GC_NMQ_D/scenes/misc/turibori.xml diff --git a/soh/assets/xml/scenes/overworld/entra.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/entra.xml similarity index 100% rename from soh/assets/xml/scenes/overworld/entra.xml rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/entra.xml diff --git a/soh/assets/xml/scenes/overworld/souko.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/souko.xml similarity index 100% rename from soh/assets/xml/scenes/overworld/souko.xml rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/souko.xml diff --git a/soh/assets/xml/scenes/overworld/spot00.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot00.xml similarity index 100% rename from soh/assets/xml/scenes/overworld/spot00.xml rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot00.xml diff --git a/soh/assets/xml/scenes/overworld/spot01.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot01.xml similarity index 100% rename from soh/assets/xml/scenes/overworld/spot01.xml rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot01.xml diff --git a/soh/assets/xml/scenes/overworld/spot02.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot02.xml similarity index 100% rename from soh/assets/xml/scenes/overworld/spot02.xml rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot02.xml diff --git a/soh/assets/xml/scenes/overworld/spot03.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot03.xml similarity index 100% rename from soh/assets/xml/scenes/overworld/spot03.xml rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot03.xml diff --git a/soh/assets/xml/scenes/overworld/spot04.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot04.xml similarity index 100% rename from soh/assets/xml/scenes/overworld/spot04.xml rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot04.xml diff --git a/soh/assets/xml/scenes/overworld/spot05.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot05.xml similarity index 100% rename from soh/assets/xml/scenes/overworld/spot05.xml rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot05.xml diff --git a/soh/assets/xml/scenes/overworld/spot06.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot06.xml similarity index 100% rename from soh/assets/xml/scenes/overworld/spot06.xml rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot06.xml diff --git a/soh/assets/xml/scenes/overworld/spot07.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot07.xml similarity index 100% rename from soh/assets/xml/scenes/overworld/spot07.xml rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot07.xml diff --git a/soh/assets/xml/scenes/overworld/spot08.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot08.xml similarity index 100% rename from soh/assets/xml/scenes/overworld/spot08.xml rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot08.xml diff --git a/soh/assets/xml/scenes/overworld/spot09.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot09.xml similarity index 100% rename from soh/assets/xml/scenes/overworld/spot09.xml rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot09.xml diff --git a/soh/assets/xml/scenes/overworld/spot10.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot10.xml similarity index 100% rename from soh/assets/xml/scenes/overworld/spot10.xml rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot10.xml diff --git a/soh/assets/xml/scenes/overworld/spot11.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot11.xml similarity index 100% rename from soh/assets/xml/scenes/overworld/spot11.xml rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot11.xml diff --git a/soh/assets/xml/scenes/overworld/spot12.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot12.xml similarity index 100% rename from soh/assets/xml/scenes/overworld/spot12.xml rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot12.xml diff --git a/soh/assets/xml/scenes/overworld/spot13.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot13.xml similarity index 100% rename from soh/assets/xml/scenes/overworld/spot13.xml rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot13.xml diff --git a/soh/assets/xml/scenes/overworld/spot15.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot15.xml similarity index 100% rename from soh/assets/xml/scenes/overworld/spot15.xml rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot15.xml diff --git a/soh/assets/xml/scenes/overworld/spot16.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot16.xml similarity index 100% rename from soh/assets/xml/scenes/overworld/spot16.xml rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot16.xml diff --git a/soh/assets/xml/scenes/overworld/spot17.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot17.xml similarity index 100% rename from soh/assets/xml/scenes/overworld/spot17.xml rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot17.xml diff --git a/soh/assets/xml/scenes/overworld/spot18.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot18.xml similarity index 100% rename from soh/assets/xml/scenes/overworld/spot18.xml rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot18.xml diff --git a/soh/assets/xml/scenes/overworld/spot20.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot20.xml similarity index 100% rename from soh/assets/xml/scenes/overworld/spot20.xml rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot20.xml diff --git a/soh/assets/xml/scenes/shops/alley_shop.xml b/soh/assets/xml/GC_NMQ_D/scenes/shops/alley_shop.xml similarity index 100% rename from soh/assets/xml/scenes/shops/alley_shop.xml rename to soh/assets/xml/GC_NMQ_D/scenes/shops/alley_shop.xml diff --git a/soh/assets/xml/scenes/shops/drag.xml b/soh/assets/xml/GC_NMQ_D/scenes/shops/drag.xml similarity index 100% rename from soh/assets/xml/scenes/shops/drag.xml rename to soh/assets/xml/GC_NMQ_D/scenes/shops/drag.xml diff --git a/soh/assets/xml/scenes/shops/face_shop.xml b/soh/assets/xml/GC_NMQ_D/scenes/shops/face_shop.xml similarity index 100% rename from soh/assets/xml/scenes/shops/face_shop.xml rename to soh/assets/xml/GC_NMQ_D/scenes/shops/face_shop.xml diff --git a/soh/assets/xml/scenes/shops/golon.xml b/soh/assets/xml/GC_NMQ_D/scenes/shops/golon.xml similarity index 100% rename from soh/assets/xml/scenes/shops/golon.xml rename to soh/assets/xml/GC_NMQ_D/scenes/shops/golon.xml diff --git a/soh/assets/xml/scenes/shops/kokiri_shop.xml b/soh/assets/xml/GC_NMQ_D/scenes/shops/kokiri_shop.xml similarity index 100% rename from soh/assets/xml/scenes/shops/kokiri_shop.xml rename to soh/assets/xml/GC_NMQ_D/scenes/shops/kokiri_shop.xml diff --git a/soh/assets/xml/scenes/shops/night_shop.xml b/soh/assets/xml/GC_NMQ_D/scenes/shops/night_shop.xml similarity index 100% rename from soh/assets/xml/scenes/shops/night_shop.xml rename to soh/assets/xml/GC_NMQ_D/scenes/shops/night_shop.xml diff --git a/soh/assets/xml/scenes/shops/shop1.xml b/soh/assets/xml/GC_NMQ_D/scenes/shops/shop1.xml similarity index 100% rename from soh/assets/xml/scenes/shops/shop1.xml rename to soh/assets/xml/GC_NMQ_D/scenes/shops/shop1.xml diff --git a/soh/assets/xml/scenes/shops/zoora.xml b/soh/assets/xml/GC_NMQ_D/scenes/shops/zoora.xml similarity index 100% rename from soh/assets/xml/scenes/shops/zoora.xml rename to soh/assets/xml/GC_NMQ_D/scenes/shops/zoora.xml diff --git a/soh/assets/xml/scenes/test_levels/besitu.xml b/soh/assets/xml/GC_NMQ_D/scenes/test_levels/besitu.xml similarity index 100% rename from soh/assets/xml/scenes/test_levels/besitu.xml rename to soh/assets/xml/GC_NMQ_D/scenes/test_levels/besitu.xml diff --git a/soh/assets/xml/scenes/test_levels/depth_test.xml b/soh/assets/xml/GC_NMQ_D/scenes/test_levels/depth_test.xml similarity index 100% rename from soh/assets/xml/scenes/test_levels/depth_test.xml rename to soh/assets/xml/GC_NMQ_D/scenes/test_levels/depth_test.xml diff --git a/soh/assets/xml/scenes/test_levels/sasatest.xml b/soh/assets/xml/GC_NMQ_D/scenes/test_levels/sasatest.xml similarity index 100% rename from soh/assets/xml/scenes/test_levels/sasatest.xml rename to soh/assets/xml/GC_NMQ_D/scenes/test_levels/sasatest.xml diff --git a/soh/assets/xml/scenes/test_levels/sutaru.xml b/soh/assets/xml/GC_NMQ_D/scenes/test_levels/sutaru.xml similarity index 100% rename from soh/assets/xml/scenes/test_levels/sutaru.xml rename to soh/assets/xml/GC_NMQ_D/scenes/test_levels/sutaru.xml diff --git a/soh/assets/xml/scenes/test_levels/syotes.xml b/soh/assets/xml/GC_NMQ_D/scenes/test_levels/syotes.xml similarity index 100% rename from soh/assets/xml/scenes/test_levels/syotes.xml rename to soh/assets/xml/GC_NMQ_D/scenes/test_levels/syotes.xml diff --git a/soh/assets/xml/scenes/test_levels/syotes2.xml b/soh/assets/xml/GC_NMQ_D/scenes/test_levels/syotes2.xml similarity index 100% rename from soh/assets/xml/scenes/test_levels/syotes2.xml rename to soh/assets/xml/GC_NMQ_D/scenes/test_levels/syotes2.xml diff --git a/soh/assets/xml/scenes/test_levels/test01.xml b/soh/assets/xml/GC_NMQ_D/scenes/test_levels/test01.xml similarity index 100% rename from soh/assets/xml/scenes/test_levels/test01.xml rename to soh/assets/xml/GC_NMQ_D/scenes/test_levels/test01.xml diff --git a/soh/assets/xml/scenes/test_levels/testroom.xml b/soh/assets/xml/GC_NMQ_D/scenes/test_levels/testroom.xml similarity index 100% rename from soh/assets/xml/scenes/test_levels/testroom.xml rename to soh/assets/xml/GC_NMQ_D/scenes/test_levels/testroom.xml diff --git a/soh/assets/xml/text/elf_message_field.xml b/soh/assets/xml/GC_NMQ_D/text/elf_message_field.xml similarity index 100% rename from soh/assets/xml/text/elf_message_field.xml rename to soh/assets/xml/GC_NMQ_D/text/elf_message_field.xml diff --git a/soh/assets/xml/text/elf_message_ydan.xml b/soh/assets/xml/GC_NMQ_D/text/elf_message_ydan.xml similarity index 100% rename from soh/assets/xml/text/elf_message_ydan.xml rename to soh/assets/xml/GC_NMQ_D/text/elf_message_ydan.xml diff --git a/soh/assets/xml/text/nes_message_data_static.xml b/soh/assets/xml/GC_NMQ_D/text/nes_message_data_static.xml similarity index 100% rename from soh/assets/xml/text/nes_message_data_static.xml rename to soh/assets/xml/GC_NMQ_D/text/nes_message_data_static.xml diff --git a/soh/assets/xml/text/staff_message_data_static.xml b/soh/assets/xml/GC_NMQ_D/text/staff_message_data_static.xml similarity index 100% rename from soh/assets/xml/text/staff_message_data_static.xml rename to soh/assets/xml/GC_NMQ_D/text/staff_message_data_static.xml diff --git a/soh/assets/xml/textures/backgrounds.xml b/soh/assets/xml/GC_NMQ_D/textures/backgrounds.xml similarity index 100% rename from soh/assets/xml/textures/backgrounds.xml rename to soh/assets/xml/GC_NMQ_D/textures/backgrounds.xml diff --git a/soh/assets/xml/textures/do_action_static.xml b/soh/assets/xml/GC_NMQ_D/textures/do_action_static.xml similarity index 100% rename from soh/assets/xml/textures/do_action_static.xml rename to soh/assets/xml/GC_NMQ_D/textures/do_action_static.xml diff --git a/soh/assets/xml/textures/icon_item_24_static.xml b/soh/assets/xml/GC_NMQ_D/textures/icon_item_24_static.xml similarity index 100% rename from soh/assets/xml/textures/icon_item_24_static.xml rename to soh/assets/xml/GC_NMQ_D/textures/icon_item_24_static.xml diff --git a/soh/assets/xml/textures/icon_item_dungeon_static.xml b/soh/assets/xml/GC_NMQ_D/textures/icon_item_dungeon_static.xml similarity index 100% rename from soh/assets/xml/textures/icon_item_dungeon_static.xml rename to soh/assets/xml/GC_NMQ_D/textures/icon_item_dungeon_static.xml diff --git a/soh/assets/xml/textures/icon_item_field_static.xml b/soh/assets/xml/GC_NMQ_D/textures/icon_item_field_static.xml similarity index 100% rename from soh/assets/xml/textures/icon_item_field_static.xml rename to soh/assets/xml/GC_NMQ_D/textures/icon_item_field_static.xml diff --git a/soh/assets/xml/textures/icon_item_fra_static.xml b/soh/assets/xml/GC_NMQ_D/textures/icon_item_fra_static.xml similarity index 100% rename from soh/assets/xml/textures/icon_item_fra_static.xml rename to soh/assets/xml/GC_NMQ_D/textures/icon_item_fra_static.xml diff --git a/soh/assets/xml/textures/icon_item_gameover_static.xml b/soh/assets/xml/GC_NMQ_D/textures/icon_item_gameover_static.xml similarity index 100% rename from soh/assets/xml/textures/icon_item_gameover_static.xml rename to soh/assets/xml/GC_NMQ_D/textures/icon_item_gameover_static.xml diff --git a/soh/assets/xml/textures/icon_item_ger_static.xml b/soh/assets/xml/GC_NMQ_D/textures/icon_item_ger_static.xml similarity index 100% rename from soh/assets/xml/textures/icon_item_ger_static.xml rename to soh/assets/xml/GC_NMQ_D/textures/icon_item_ger_static.xml diff --git a/soh/assets/xml/textures/icon_item_nes_static.xml b/soh/assets/xml/GC_NMQ_D/textures/icon_item_nes_static.xml similarity index 100% rename from soh/assets/xml/textures/icon_item_nes_static.xml rename to soh/assets/xml/GC_NMQ_D/textures/icon_item_nes_static.xml diff --git a/soh/assets/xml/textures/icon_item_static.xml b/soh/assets/xml/GC_NMQ_D/textures/icon_item_static.xml similarity index 100% rename from soh/assets/xml/textures/icon_item_static.xml rename to soh/assets/xml/GC_NMQ_D/textures/icon_item_static.xml diff --git a/soh/assets/xml/textures/item_name_static.xml b/soh/assets/xml/GC_NMQ_D/textures/item_name_static.xml similarity index 100% rename from soh/assets/xml/textures/item_name_static.xml rename to soh/assets/xml/GC_NMQ_D/textures/item_name_static.xml diff --git a/soh/assets/xml/textures/map_48x85_static.xml b/soh/assets/xml/GC_NMQ_D/textures/map_48x85_static.xml similarity index 100% rename from soh/assets/xml/textures/map_48x85_static.xml rename to soh/assets/xml/GC_NMQ_D/textures/map_48x85_static.xml diff --git a/soh/assets/xml/textures/map_grand_static.xml b/soh/assets/xml/GC_NMQ_D/textures/map_grand_static.xml similarity index 100% rename from soh/assets/xml/textures/map_grand_static.xml rename to soh/assets/xml/GC_NMQ_D/textures/map_grand_static.xml diff --git a/soh/assets/xml/textures/map_i_static.xml b/soh/assets/xml/GC_NMQ_D/textures/map_i_static.xml similarity index 100% rename from soh/assets/xml/textures/map_i_static.xml rename to soh/assets/xml/GC_NMQ_D/textures/map_i_static.xml diff --git a/soh/assets/xml/textures/map_name_static.xml b/soh/assets/xml/GC_NMQ_D/textures/map_name_static.xml similarity index 100% rename from soh/assets/xml/textures/map_name_static.xml rename to soh/assets/xml/GC_NMQ_D/textures/map_name_static.xml diff --git a/soh/assets/xml/textures/message_static.xml b/soh/assets/xml/GC_NMQ_D/textures/message_static.xml similarity index 100% rename from soh/assets/xml/textures/message_static.xml rename to soh/assets/xml/GC_NMQ_D/textures/message_static.xml diff --git a/soh/assets/xml/textures/message_texture_static.xml b/soh/assets/xml/GC_NMQ_D/textures/message_texture_static.xml similarity index 100% rename from soh/assets/xml/textures/message_texture_static.xml rename to soh/assets/xml/GC_NMQ_D/textures/message_texture_static.xml diff --git a/soh/assets/xml/textures/nes_font_static.xml b/soh/assets/xml/GC_NMQ_D/textures/nes_font_static.xml similarity index 100% rename from soh/assets/xml/textures/nes_font_static.xml rename to soh/assets/xml/GC_NMQ_D/textures/nes_font_static.xml diff --git a/soh/assets/xml/textures/nintendo_rogo_static.xml b/soh/assets/xml/GC_NMQ_D/textures/nintendo_rogo_static.xml similarity index 100% rename from soh/assets/xml/textures/nintendo_rogo_static.xml rename to soh/assets/xml/GC_NMQ_D/textures/nintendo_rogo_static.xml diff --git a/soh/assets/xml/textures/parameter_static.xml b/soh/assets/xml/GC_NMQ_D/textures/parameter_static.xml similarity index 100% rename from soh/assets/xml/textures/parameter_static.xml rename to soh/assets/xml/GC_NMQ_D/textures/parameter_static.xml diff --git a/soh/assets/xml/textures/place_title_cards.xml b/soh/assets/xml/GC_NMQ_D/textures/place_title_cards.xml similarity index 100% rename from soh/assets/xml/textures/place_title_cards.xml rename to soh/assets/xml/GC_NMQ_D/textures/place_title_cards.xml diff --git a/soh/assets/xml/textures/skyboxes.xml b/soh/assets/xml/GC_NMQ_D/textures/skyboxes.xml similarity index 100% rename from soh/assets/xml/textures/skyboxes.xml rename to soh/assets/xml/GC_NMQ_D/textures/skyboxes.xml diff --git a/soh/assets/xml/textures/title_static.xml b/soh/assets/xml/GC_NMQ_D/textures/title_static.xml similarity index 100% rename from soh/assets/xml/textures/title_static.xml rename to soh/assets/xml/GC_NMQ_D/textures/title_static.xml diff --git a/soh/assets/xml/GC_NMQ_PAL_F/code/fbdemo_circle.xml b/soh/assets/xml/GC_NMQ_PAL_F/code/fbdemo_circle.xml new file mode 100644 index 000000000..a3add03bc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/code/fbdemo_circle.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/code/fbdemo_triforce.xml b/soh/assets/xml/GC_NMQ_PAL_F/code/fbdemo_triforce.xml new file mode 100644 index 000000000..f4eff13ae --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/code/fbdemo_triforce.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/code/fbdemo_wipe1.xml b/soh/assets/xml/GC_NMQ_PAL_F/code/fbdemo_wipe1.xml new file mode 100644 index 000000000..537706cd1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/code/fbdemo_wipe1.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/misc/link_animetion.xml b/soh/assets/xml/GC_NMQ_PAL_F/misc/link_animetion.xml new file mode 100644 index 000000000..9de1e92d3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/misc/link_animetion.xml @@ -0,0 +1,577 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/gameplay_dangeon_keep.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/gameplay_dangeon_keep.xml new file mode 100644 index 000000000..d16eb4c41 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/gameplay_dangeon_keep.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/gameplay_field_keep.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/gameplay_field_keep.xml new file mode 100644 index 000000000..28fa975d7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/gameplay_field_keep.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/gameplay_keep.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/gameplay_keep.xml new file mode 100644 index 000000000..45c669307 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/gameplay_keep.xml @@ -0,0 +1,960 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_Bb.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_Bb.xml new file mode 100644 index 000000000..5d04bde45 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_Bb.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ahg.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ahg.xml new file mode 100644 index 000000000..a32c00914 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ahg.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_am.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_am.xml new file mode 100644 index 000000000..0a4b88ddf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_am.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ane.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ane.xml new file mode 100644 index 000000000..1e29b351e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ane.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ani.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ani.xml new file mode 100644 index 000000000..c69656043 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ani.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_anubice.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_anubice.xml new file mode 100644 index 000000000..2140187e4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_anubice.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_aob.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_aob.xml new file mode 100644 index 000000000..e6202d0cf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_aob.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_b_heart.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_b_heart.xml new file mode 100644 index 000000000..00f7cd677 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_b_heart.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bba.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bba.xml new file mode 100644 index 000000000..ccc5c2136 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bba.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bdan_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bdan_objects.xml new file mode 100644 index 000000000..dcd56d385 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bdan_objects.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bdoor.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bdoor.xml new file mode 100644 index 000000000..644c06ea8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bdoor.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bg.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bg.xml new file mode 100644 index 000000000..791226b71 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bg.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bigokuta.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bigokuta.xml new file mode 100644 index 000000000..1c7d39e31 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bigokuta.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bird.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bird.xml new file mode 100644 index 000000000..167a5022d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bird.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bji.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bji.xml new file mode 100644 index 000000000..e6b6c4221 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bji.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bl.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bl.xml new file mode 100644 index 000000000..1c2ef4ec6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bl.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_blkobj.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_blkobj.xml new file mode 100644 index 000000000..a073077b8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_blkobj.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bob.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bob.xml new file mode 100644 index 000000000..289e994e4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bob.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_boj.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_boj.xml new file mode 100644 index 000000000..4cc39906e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_boj.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bombf.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bombf.xml new file mode 100644 index 000000000..83e60248d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bombf.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bombiwa.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bombiwa.xml new file mode 100644 index 000000000..26ab6b4f3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bombiwa.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bowl.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bowl.xml new file mode 100644 index 000000000..ffe6d43db --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bowl.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_box.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_box.xml new file mode 100644 index 000000000..efcec619b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_box.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_brob.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_brob.xml new file mode 100644 index 000000000..718dcd561 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_brob.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bubble.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bubble.xml new file mode 100644 index 000000000..f5de18692 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bubble.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bv.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bv.xml new file mode 100644 index 000000000..83ff039f5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bv.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bw.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bw.xml new file mode 100644 index 000000000..f7d5ecead --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bw.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bwall.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bwall.xml new file mode 100644 index 000000000..d4f43ddc1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bwall.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bxa.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bxa.xml new file mode 100644 index 000000000..fb78c117e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bxa.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_cne.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_cne.xml new file mode 100644 index 000000000..ce9c16082 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_cne.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_cob.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_cob.xml new file mode 100644 index 000000000..ba051cfa7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_cob.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_cow.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_cow.xml new file mode 100644 index 000000000..5d067c329 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_cow.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_crow.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_crow.xml new file mode 100644 index 000000000..77337c644 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_crow.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_cs.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_cs.xml new file mode 100644 index 000000000..83804ccaf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_cs.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_d_elevator.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_d_elevator.xml new file mode 100644 index 000000000..6be59c154 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_d_elevator.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_d_hsblock.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_d_hsblock.xml new file mode 100644 index 000000000..b9111b38b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_d_hsblock.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_d_lift.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_d_lift.xml new file mode 100644 index 000000000..291238519 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_d_lift.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_daiku.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_daiku.xml new file mode 100644 index 000000000..1524c7a26 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_daiku.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ddan_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ddan_objects.xml new file mode 100644 index 000000000..3fc563b96 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ddan_objects.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dekubaba.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dekubaba.xml new file mode 100644 index 000000000..7202a833f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dekubaba.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dekujr.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dekujr.xml new file mode 100644 index 000000000..e906bf61c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dekujr.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dekunuts.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dekunuts.xml new file mode 100644 index 000000000..5fceef416 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dekunuts.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_demo_6k.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_demo_6k.xml new file mode 100644 index 000000000..73058d5e4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_demo_6k.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_demo_kekkai.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_demo_kekkai.xml new file mode 100644 index 000000000..1b9c9b402 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_demo_kekkai.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_demo_tre_lgt.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_demo_tre_lgt.xml new file mode 100644 index 000000000..9ea19012b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_demo_tre_lgt.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dh.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dh.xml new file mode 100644 index 000000000..7a52d7dbe --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dh.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dnk.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dnk.xml new file mode 100644 index 000000000..b1e79464b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dnk.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dns.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dns.xml new file mode 100644 index 000000000..086c4bd11 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dns.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dodojr.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dodojr.xml new file mode 100644 index 000000000..4dfd7d6e4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dodojr.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dodongo.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dodongo.xml new file mode 100644 index 000000000..779e20e9d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dodongo.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dog.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dog.xml new file mode 100644 index 000000000..ef00442b6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dog.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_door_gerudo.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_door_gerudo.xml new file mode 100644 index 000000000..2f1726204 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_door_gerudo.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_door_killer.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_door_killer.xml new file mode 100644 index 000000000..a37f590d6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_door_killer.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ds.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ds.xml new file mode 100644 index 000000000..0413a9e2e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ds.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ds2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ds2.xml new file mode 100644 index 000000000..683bcc68d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ds2.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_du.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_du.xml new file mode 100644 index 000000000..44bbd1aa0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_du.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dy_obj.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dy_obj.xml new file mode 100644 index 000000000..4d141d546 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dy_obj.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ec.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ec.xml new file mode 100644 index 000000000..7ec83e284 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ec.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_crystal_light.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_crystal_light.xml new file mode 100644 index 000000000..9215b6a39 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_crystal_light.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_doughnut.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_doughnut.xml new file mode 100644 index 000000000..7f12c56f5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_doughnut.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_erupc.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_erupc.xml new file mode 100644 index 000000000..800d9535f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_erupc.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_fire_ball.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_fire_ball.xml new file mode 100644 index 000000000..2fc65b16f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_fire_ball.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_flash.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_flash.xml new file mode 100644 index 000000000..5f962f162 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_flash.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_lgt_shower.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_lgt_shower.xml new file mode 100644 index 000000000..67ef5ce7e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_lgt_shower.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_star_field.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_star_field.xml new file mode 100644 index 000000000..00b47c460 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_star_field.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_tw.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_tw.xml new file mode 100644 index 000000000..de5376569 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_tw.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ei.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ei.xml new file mode 100644 index 000000000..e4132491f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ei.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fa.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fa.xml new file mode 100644 index 000000000..2f1bf9a5e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fa.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fd.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fd.xml new file mode 100644 index 000000000..1b96e9f22 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fd.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fd2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fd2.xml new file mode 100644 index 000000000..8689098b9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fd2.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fhg.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fhg.xml new file mode 100644 index 000000000..f3a4a55ca --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fhg.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fire.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fire.xml new file mode 100644 index 000000000..49bf620cb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fire.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_firefly.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_firefly.xml new file mode 100644 index 000000000..8c26a4341 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_firefly.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fish.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fish.xml new file mode 100644 index 000000000..f5ad4f6da --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fish.xml @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fr.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fr.xml new file mode 100644 index 000000000..25ee2ad42 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fr.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fu.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fu.xml new file mode 100644 index 000000000..82c449e3d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fu.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fw.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fw.xml new file mode 100644 index 000000000..e71f83092 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fw.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fz.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fz.xml new file mode 100644 index 000000000..dad6fec5c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fz.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon.xml new file mode 100644 index 000000000..96adabb2b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon2.xml new file mode 100644 index 000000000..8b66cfcc2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon2.xml @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon_anime1.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon_anime1.xml new file mode 100644 index 000000000..6021fdd9b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon_anime1.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon_anime2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon_anime2.xml new file mode 100644 index 000000000..96121689e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon_anime2.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon_anime3.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon_anime3.xml new file mode 100644 index 000000000..2af1e94f9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon_anime3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon_objects.xml new file mode 100644 index 000000000..5e32610ff --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon_objects.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ge1.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ge1.xml new file mode 100644 index 000000000..79e0768b8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ge1.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_geff.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_geff.xml new file mode 100644 index 000000000..f0667743b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_geff.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_geldb.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_geldb.xml new file mode 100644 index 000000000..a1dbd18f4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_geldb.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_arrow.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_arrow.xml new file mode 100644 index 000000000..4b58787a9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_arrow.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_arrowcase.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_arrowcase.xml new file mode 100644 index 000000000..267b0a734 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_arrowcase.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bean.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bean.xml new file mode 100644 index 000000000..e74247816 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bean.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bomb_1.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bomb_1.xml new file mode 100644 index 000000000..bae86c11d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bomb_1.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bomb_2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bomb_2.xml new file mode 100644 index 000000000..1400c4a4d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bomb_2.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bombpouch.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bombpouch.xml new file mode 100644 index 000000000..07134748c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bombpouch.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_boomerang.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_boomerang.xml new file mode 100644 index 000000000..3c1a0fe7f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_boomerang.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_boots_2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_boots_2.xml new file mode 100644 index 000000000..8e9cd1028 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_boots_2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bosskey.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bosskey.xml new file mode 100644 index 000000000..e5e4bc86c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bosskey.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bottle.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bottle.xml new file mode 100644 index 000000000..3b0884a03 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bottle.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bottle_letter.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bottle_letter.xml new file mode 100644 index 000000000..443219caf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bottle_letter.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bow.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bow.xml new file mode 100644 index 000000000..946e9c496 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bow.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bracelet.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bracelet.xml new file mode 100644 index 000000000..5a0b62a60 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bracelet.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_brokensword.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_brokensword.xml new file mode 100644 index 000000000..408741ac5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_brokensword.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_butterfly.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_butterfly.xml new file mode 100644 index 000000000..76ac70609 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_butterfly.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_clothes.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_clothes.xml new file mode 100644 index 000000000..2a10dce11 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_clothes.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_coin.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_coin.xml new file mode 100644 index 000000000..22e29f255 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_coin.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_compass.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_compass.xml new file mode 100644 index 000000000..076229b11 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_compass.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_dekupouch.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_dekupouch.xml new file mode 100644 index 000000000..3d6d95d98 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_dekupouch.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_egg.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_egg.xml new file mode 100644 index 000000000..2b2e2847d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_egg.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_eye_lotion.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_eye_lotion.xml new file mode 100644 index 000000000..5128c5f6f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_eye_lotion.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_fire.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_fire.xml new file mode 100644 index 000000000..a57fba6e8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_fire.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_fish.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_fish.xml new file mode 100644 index 000000000..edb39dc29 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_fish.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_frog.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_frog.xml new file mode 100644 index 000000000..f180fd267 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_frog.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_gerudo.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_gerudo.xml new file mode 100644 index 000000000..3be8d3462 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_gerudo.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_gerudomask.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_gerudomask.xml new file mode 100644 index 000000000..b53bf24af --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_gerudomask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_ghost.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_ghost.xml new file mode 100644 index 000000000..186f4c74b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_ghost.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_glasses.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_glasses.xml new file mode 100644 index 000000000..63d32ab5a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_glasses.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_gloves.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_gloves.xml new file mode 100644 index 000000000..1b4282dca --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_gloves.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_goddess.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_goddess.xml new file mode 100644 index 000000000..50cbdd891 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_goddess.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_golonmask.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_golonmask.xml new file mode 100644 index 000000000..98f53f1c2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_golonmask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_grass.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_grass.xml new file mode 100644 index 000000000..ae7834201 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_grass.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_hammer.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_hammer.xml new file mode 100644 index 000000000..feb5c8659 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_hammer.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_heart.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_heart.xml new file mode 100644 index 000000000..48e78b1b5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_heart.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_hearts.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_hearts.xml new file mode 100644 index 000000000..d2e763e63 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_hearts.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_hookshot.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_hookshot.xml new file mode 100644 index 000000000..a6b3b0fda --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_hookshot.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_hoverboots.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_hoverboots.xml new file mode 100644 index 000000000..c4a67877b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_hoverboots.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_insect.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_insect.xml new file mode 100644 index 000000000..7af5b5b3b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_insect.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_jewel.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_jewel.xml new file mode 100644 index 000000000..e83c65116 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_jewel.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_key.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_key.xml new file mode 100644 index 000000000..a37d45a71 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_key.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_ki_tan_mask.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_ki_tan_mask.xml new file mode 100644 index 000000000..f66535af3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_ki_tan_mask.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_letter.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_letter.xml new file mode 100644 index 000000000..167a7ff5d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_letter.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_liquid.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_liquid.xml new file mode 100644 index 000000000..5eeeca0fd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_liquid.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_longsword.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_longsword.xml new file mode 100644 index 000000000..7161e42e3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_longsword.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_m_arrow.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_m_arrow.xml new file mode 100644 index 000000000..0fd659ae9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_m_arrow.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_magicpot.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_magicpot.xml new file mode 100644 index 000000000..7623e6353 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_magicpot.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_map.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_map.xml new file mode 100644 index 000000000..8887dd22c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_map.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_medal.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_medal.xml new file mode 100644 index 000000000..28e5b1e68 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_medal.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_melody.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_melody.xml new file mode 100644 index 000000000..b01fca953 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_melody.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_milk.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_milk.xml new file mode 100644 index 000000000..00b9530d9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_milk.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_mushroom.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_mushroom.xml new file mode 100644 index 000000000..5b19bca74 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_mushroom.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_niwatori.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_niwatori.xml new file mode 100644 index 000000000..713cc1ce5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_niwatori.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_nuts.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_nuts.xml new file mode 100644 index 000000000..5508fe856 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_nuts.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_ocarina.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_ocarina.xml new file mode 100644 index 000000000..7693cc122 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_ocarina.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_ocarina_0.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_ocarina_0.xml new file mode 100644 index 000000000..336d33894 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_ocarina_0.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_pachinko.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_pachinko.xml new file mode 100644 index 000000000..5f808baf9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_pachinko.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_powder.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_powder.xml new file mode 100644 index 000000000..fb7dc0155 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_powder.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_prescription.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_prescription.xml new file mode 100644 index 000000000..081de301c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_prescription.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_purse.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_purse.xml new file mode 100644 index 000000000..3034942ff --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_purse.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_rabit_mask.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_rabit_mask.xml new file mode 100644 index 000000000..75f855550 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_rabit_mask.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_redead_mask.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_redead_mask.xml new file mode 100644 index 000000000..7de08487f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_redead_mask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_rupy.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_rupy.xml new file mode 100644 index 000000000..0a1af96d0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_rupy.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_saw.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_saw.xml new file mode 100644 index 000000000..dcc038b7c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_saw.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_scale.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_scale.xml new file mode 100644 index 000000000..1cf5de5b9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_scale.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_seed.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_seed.xml new file mode 100644 index 000000000..82c15c82d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_seed.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_shield_1.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_shield_1.xml new file mode 100644 index 000000000..2e9369569 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_shield_1.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_shield_2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_shield_2.xml new file mode 100644 index 000000000..176ae025f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_shield_2.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_shield_3.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_shield_3.xml new file mode 100644 index 000000000..250bf7fea --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_shield_3.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_skj_mask.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_skj_mask.xml new file mode 100644 index 000000000..e6c90f76f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_skj_mask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_soldout.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_soldout.xml new file mode 100644 index 000000000..ae3f4685f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_soldout.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_soul.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_soul.xml new file mode 100644 index 000000000..76ffc5685 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_soul.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_stick.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_stick.xml new file mode 100644 index 000000000..fed89f465 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_stick.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_sutaru.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_sutaru.xml new file mode 100644 index 000000000..a2606afbe --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_sutaru.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_sword_1.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_sword_1.xml new file mode 100644 index 000000000..e1119abca --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_sword_1.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_ticketstone.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_ticketstone.xml new file mode 100644 index 000000000..0fa37fe11 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_ticketstone.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_truth_mask.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_truth_mask.xml new file mode 100644 index 000000000..f28c7cbca --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_truth_mask.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_zoramask.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_zoramask.xml new file mode 100644 index 000000000..096fdeedf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_zoramask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gj.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gj.xml new file mode 100644 index 000000000..50d6337b4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gj.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gjyo_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gjyo_objects.xml new file mode 100644 index 000000000..ea4f8444f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gjyo_objects.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gla.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gla.xml new file mode 100644 index 000000000..499a3720d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gla.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gm.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gm.xml new file mode 100644 index 000000000..91b10cc42 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gm.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gnd.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gnd.xml new file mode 100644 index 000000000..dfbe02315 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gnd.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gnd_magic.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gnd_magic.xml new file mode 100644 index 000000000..a88d419d7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gnd_magic.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gndd.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gndd.xml new file mode 100644 index 000000000..96e264c34 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gndd.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_god_lgt.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_god_lgt.xml new file mode 100644 index 000000000..60df9e469 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_god_lgt.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gol.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gol.xml new file mode 100644 index 000000000..7e04508cb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gol.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_goma.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_goma.xml new file mode 100644 index 000000000..e7a6d0a54 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_goma.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_goroiwa.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_goroiwa.xml new file mode 100644 index 000000000..5d406e957 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_goroiwa.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gr.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gr.xml new file mode 100644 index 000000000..103d4412e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gr.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gs.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gs.xml new file mode 100644 index 000000000..145be1665 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gs.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gt.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gt.xml new file mode 100644 index 000000000..1d79d4e39 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gt.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_haka.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_haka.xml new file mode 100644 index 000000000..f6b263c37 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_haka.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_haka_door.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_haka_door.xml new file mode 100644 index 000000000..753492445 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_haka_door.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_haka_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_haka_objects.xml new file mode 100644 index 000000000..3ca6d27c0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_haka_objects.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hakach_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hakach_objects.xml new file mode 100644 index 000000000..b978e77a3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hakach_objects.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hata.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hata.xml new file mode 100644 index 000000000..b0324c3be --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hata.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_heavy_object.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_heavy_object.xml new file mode 100644 index 000000000..ecc795321 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_heavy_object.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hidan_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hidan_objects.xml new file mode 100644 index 000000000..5c54244bb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hidan_objects.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hintnuts.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hintnuts.xml new file mode 100644 index 000000000..f419f7546 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hintnuts.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hni.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hni.xml new file mode 100644 index 000000000..6b317eb7a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hni.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_horse.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_horse.xml new file mode 100644 index 000000000..74619e597 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_horse.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_horse_ganon.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_horse_ganon.xml new file mode 100644 index 000000000..98babb080 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_horse_ganon.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_horse_link_child.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_horse_link_child.xml new file mode 100644 index 000000000..1491189a1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_horse_link_child.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_horse_normal.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_horse_normal.xml new file mode 100644 index 000000000..2bc2cb0c6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_horse_normal.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_horse_zelda.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_horse_zelda.xml new file mode 100644 index 000000000..9595c3245 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_horse_zelda.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hs.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hs.xml new file mode 100644 index 000000000..cf5d06e1a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hs.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_human.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_human.xml new file mode 100644 index 000000000..c52398446 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_human.xml @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ice_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ice_objects.xml new file mode 100644 index 000000000..a4e2e9b12 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ice_objects.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ik.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ik.xml new file mode 100644 index 000000000..95606e6df --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ik.xml @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_im.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_im.xml new file mode 100644 index 000000000..a628a113a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_im.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_in.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_in.xml new file mode 100644 index 000000000..84c114047 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_in.xml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ingate.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ingate.xml new file mode 100644 index 000000000..e6be42beb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ingate.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_jj.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_jj.xml new file mode 100644 index 000000000..62bae8cb9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_jj.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_js.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_js.xml new file mode 100644 index 000000000..ff7bd3efa --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_js.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_jya_door.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_jya_door.xml new file mode 100644 index 000000000..60a7b3788 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_jya_door.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_jya_iron.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_jya_iron.xml new file mode 100644 index 000000000..c6f6773c6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_jya_iron.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_jya_obj.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_jya_obj.xml new file mode 100644 index 000000000..4a203b0b9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_jya_obj.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ka.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ka.xml new file mode 100644 index 000000000..eb952732b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ka.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kanban.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kanban.xml new file mode 100644 index 000000000..9ffc7a2ce --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kanban.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kibako2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kibako2.xml new file mode 100644 index 000000000..a701b294d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kibako2.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kingdodongo.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kingdodongo.xml new file mode 100644 index 000000000..9b104b3ea --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kingdodongo.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_km1.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_km1.xml new file mode 100644 index 000000000..0a918a798 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_km1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kusa.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kusa.xml new file mode 100644 index 000000000..67291a554 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kusa.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kw1.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kw1.xml new file mode 100644 index 000000000..eab561b1f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kw1.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kz.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kz.xml new file mode 100644 index 000000000..20aeec4d9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kz.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_light_ring.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_light_ring.xml new file mode 100644 index 000000000..babe7d2aa --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_light_ring.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_lightbox.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_lightbox.xml new file mode 100644 index 000000000..552a79d7c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_lightbox.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_lightswitch.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_lightswitch.xml new file mode 100644 index 000000000..cfd5dcfb4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_lightswitch.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_link_boy.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_link_boy.xml new file mode 100644 index 000000000..2f3cd943c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_link_boy.xml @@ -0,0 +1,271 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_link_child.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_link_child.xml new file mode 100644 index 000000000..0de400373 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_link_child.xml @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ma1.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ma1.xml new file mode 100644 index 000000000..63eeb3895 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ma1.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ma2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ma2.xml new file mode 100644 index 000000000..ce5910fb8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ma2.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mag.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mag.xml new file mode 100644 index 000000000..e691fbeb3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mag.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mamenoki.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mamenoki.xml new file mode 100644 index 000000000..819d89022 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mamenoki.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mastergolon.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mastergolon.xml new file mode 100644 index 000000000..6dd9d1659 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mastergolon.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_masterkokiri.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_masterkokiri.xml new file mode 100644 index 000000000..af5a9ec15 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_masterkokiri.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_masterkokirihead.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_masterkokirihead.xml new file mode 100644 index 000000000..1e489323c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_masterkokirihead.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_masterzoora.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_masterzoora.xml new file mode 100644 index 000000000..2c703274e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_masterzoora.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mb.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mb.xml new file mode 100644 index 000000000..a8471429d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mb.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_md.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_md.xml new file mode 100644 index 000000000..0c80fb780 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_md.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_medal.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_medal.xml new file mode 100644 index 000000000..533872a55 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_medal.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_menkuri_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_menkuri_objects.xml new file mode 100644 index 000000000..4c2b51df5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_menkuri_objects.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mir_ray.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mir_ray.xml new file mode 100644 index 000000000..2acc9391a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mir_ray.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mizu_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mizu_objects.xml new file mode 100644 index 000000000..1abd73bc0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mizu_objects.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin.xml new file mode 100644 index 000000000..daf9b0541 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_dark.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_dark.xml new file mode 100644 index 000000000..2fa0bdbe4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_dark.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_flame.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_flame.xml new file mode 100644 index 000000000..6274feaee --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_flame.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_flash.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_flash.xml new file mode 100644 index 000000000..c1040ea11 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_flash.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_ice.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_ice.xml new file mode 100644 index 000000000..1aaeea193 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_ice.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_oka.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_oka.xml new file mode 100644 index 000000000..0f823b923 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_oka.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_soul.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_soul.xml new file mode 100644 index 000000000..6386f7f9e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_soul.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_wind.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_wind.xml new file mode 100644 index 000000000..8bba7eb91 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_wind.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mk.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mk.xml new file mode 100644 index 000000000..0b4aaae8a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mk.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mm.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mm.xml new file mode 100644 index 000000000..834afe5ef --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mm.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mo.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mo.xml new file mode 100644 index 000000000..526fa94dd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mo.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_hineri1.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_hineri1.xml new file mode 100644 index 000000000..bb1b31e2f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_hineri1.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_hineri1a.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_hineri1a.xml new file mode 100644 index 000000000..c750ce20d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_hineri1a.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_hineri2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_hineri2.xml new file mode 100644 index 000000000..785b85857 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_hineri2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_hineri2a.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_hineri2a.xml new file mode 100644 index 000000000..ad1bb4d5f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_hineri2a.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_objects.xml new file mode 100644 index 000000000..58ea8c085 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_objects.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_tex.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_tex.xml new file mode 100644 index 000000000..b1a4b803c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_tex.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ms.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ms.xml new file mode 100644 index 000000000..a87d0e6b3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ms.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mu.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mu.xml new file mode 100644 index 000000000..7251ff721 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mu.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_nb.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_nb.xml new file mode 100644 index 000000000..74de9e285 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_nb.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_niw.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_niw.xml new file mode 100644 index 000000000..a74cbe7da --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_niw.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_nwc.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_nwc.xml new file mode 100644 index 000000000..96ffa3238 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_nwc.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ny.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ny.xml new file mode 100644 index 000000000..e2e8187ff --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ny.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA1.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA1.xml new file mode 100644 index 000000000..1d665f101 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA1.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA10.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA10.xml new file mode 100644 index 000000000..65d080834 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA10.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA11.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA11.xml new file mode 100644 index 000000000..92ae474b6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA11.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA2.xml new file mode 100644 index 000000000..ffdcd7989 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA2.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA3.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA3.xml new file mode 100644 index 000000000..a492bd875 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA3.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA4.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA4.xml new file mode 100644 index 000000000..dcdbbfff9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA4.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA5.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA5.xml new file mode 100644 index 000000000..55072176d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA5.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA6.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA6.xml new file mode 100644 index 000000000..c17a51088 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA6.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA7.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA7.xml new file mode 100644 index 000000000..52c68f639 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA7.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA8.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA8.xml new file mode 100644 index 000000000..8ed2d3df5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA8.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA9.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA9.xml new file mode 100644 index 000000000..d5c16abfc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA9.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oB1.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oB1.xml new file mode 100644 index 000000000..2f50c967b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oB1.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oB2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oB2.xml new file mode 100644 index 000000000..230783cea --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oB2.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oB3.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oB3.xml new file mode 100644 index 000000000..1c42ddacc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oB3.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oB4.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oB4.xml new file mode 100644 index 000000000..2924c9e75 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oB4.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE1.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE1.xml new file mode 100644 index 000000000..4d5b1663f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE1.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE10.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE10.xml new file mode 100644 index 000000000..04ce91437 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE10.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE11.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE11.xml new file mode 100644 index 000000000..04f6f186d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE11.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE12.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE12.xml new file mode 100644 index 000000000..a5fa39fd2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE12.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE1s.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE1s.xml new file mode 100644 index 000000000..faf6ab734 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE1s.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE2.xml new file mode 100644 index 000000000..af62ad6d1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE2.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE3.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE3.xml new file mode 100644 index 000000000..95227da38 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE3.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE4.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE4.xml new file mode 100644 index 000000000..ae48d2ade --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE4.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE4s.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE4s.xml new file mode 100644 index 000000000..584019568 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE4s.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE5.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE5.xml new file mode 100644 index 000000000..f5edf745a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE5.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE6.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE6.xml new file mode 100644 index 000000000..95bb602b6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE6.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE7.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE7.xml new file mode 100644 index 000000000..b3e588d4c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE7.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE8.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE8.xml new file mode 100644 index 000000000..be5de2494 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE8.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE9.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE9.xml new file mode 100644 index 000000000..8ea7ee18c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE9.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE_anime.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE_anime.xml new file mode 100644 index 000000000..f6b4659e2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE_anime.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oF1d_map.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oF1d_map.xml new file mode 100644 index 000000000..c4f3a41f8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oF1d_map.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oF1s.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oF1s.xml new file mode 100644 index 000000000..11359eff5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oF1s.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_o_anime.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_o_anime.xml new file mode 100644 index 000000000..4ef4ac44c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_o_anime.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_okuta.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_okuta.xml new file mode 100644 index 000000000..b4fccea6f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_okuta.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_opening_demo1.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_opening_demo1.xml new file mode 100644 index 000000000..fd0323027 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_opening_demo1.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_os.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_os.xml new file mode 100644 index 000000000..7c3029443 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_os.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_os_anime.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_os_anime.xml new file mode 100644 index 000000000..c90e37b37 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_os_anime.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ossan.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ossan.xml new file mode 100644 index 000000000..963053f3f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ossan.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ouke_haka.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ouke_haka.xml new file mode 100644 index 000000000..11da9b26e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ouke_haka.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_owl.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_owl.xml new file mode 100644 index 000000000..fdc64b3aa --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_owl.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_peehat.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_peehat.xml new file mode 100644 index 000000000..42ee66cde --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_peehat.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_po_composer.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_po_composer.xml new file mode 100644 index 000000000..2ab8d64d8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_po_composer.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_po_field.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_po_field.xml new file mode 100644 index 000000000..10b402e2c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_po_field.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_po_sisters.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_po_sisters.xml new file mode 100644 index 000000000..e0c9f0834 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_po_sisters.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_poh.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_poh.xml new file mode 100644 index 000000000..009d0fca3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_poh.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ps.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ps.xml new file mode 100644 index 000000000..043e232d6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ps.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_pu_box.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_pu_box.xml new file mode 100644 index 000000000..e1d686e97 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_pu_box.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_rd.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_rd.xml new file mode 100644 index 000000000..05fa416d7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_rd.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_reeba.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_reeba.xml new file mode 100644 index 000000000..32c697bd9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_reeba.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_relay_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_relay_objects.xml new file mode 100644 index 000000000..47b92fcd2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_relay_objects.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_rl.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_rl.xml new file mode 100644 index 000000000..625ab83a1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_rl.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_rr.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_rr.xml new file mode 100644 index 000000000..98726b14b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_rr.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_rs.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_rs.xml new file mode 100644 index 000000000..1da1488af --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_rs.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ru1.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ru1.xml new file mode 100644 index 000000000..3d413619f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ru1.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ru2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ru2.xml new file mode 100644 index 000000000..2a8d70af3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ru2.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_sa.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_sa.xml new file mode 100644 index 000000000..a19446453 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_sa.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_sb.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_sb.xml new file mode 100644 index 000000000..64d3bb005 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_sb.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_sd.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_sd.xml new file mode 100644 index 000000000..c72efeae1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_sd.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_shop_dungen.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_shop_dungen.xml new file mode 100644 index 000000000..594c43d39 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_shop_dungen.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_shopnuts.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_shopnuts.xml new file mode 100644 index 000000000..a4e12e38a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_shopnuts.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_siofuki.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_siofuki.xml new file mode 100644 index 000000000..a23240a72 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_siofuki.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_sk2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_sk2.xml new file mode 100644 index 000000000..f2e7ef6d8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_sk2.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_skb.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_skb.xml new file mode 100644 index 000000000..5b5efb484 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_skb.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_skj.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_skj.xml new file mode 100644 index 000000000..3abdd610f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_skj.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot00_break.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot00_break.xml new file mode 100644 index 000000000..d3be88315 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot00_break.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot00_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot00_objects.xml new file mode 100644 index 000000000..10fb13aea --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot00_objects.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot01_matoya.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot01_matoya.xml new file mode 100644 index 000000000..d44b944e0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot01_matoya.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot01_matoyab.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot01_matoyab.xml new file mode 100644 index 000000000..720f50cd3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot01_matoyab.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot01_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot01_objects.xml new file mode 100644 index 000000000..413e032a9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot01_objects.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot01_objects2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot01_objects2.xml new file mode 100644 index 000000000..36741a949 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot01_objects2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot02_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot02_objects.xml new file mode 100644 index 000000000..65f45ff51 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot02_objects.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot03_object.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot03_object.xml new file mode 100644 index 000000000..f182e7d99 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot03_object.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot04_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot04_objects.xml new file mode 100644 index 000000000..66293d752 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot04_objects.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot05_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot05_objects.xml new file mode 100644 index 000000000..6e7079149 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot05_objects.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot06_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot06_objects.xml new file mode 100644 index 000000000..e3da63b0f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot06_objects.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot07_object.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot07_object.xml new file mode 100644 index 000000000..5bc2bfb6b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot07_object.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot08_obj.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot08_obj.xml new file mode 100644 index 000000000..4d71f3473 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot08_obj.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot09_obj.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot09_obj.xml new file mode 100644 index 000000000..b4d9ae42a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot09_obj.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot11_obj.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot11_obj.xml new file mode 100644 index 000000000..257298f7c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot11_obj.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot12_obj.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot12_obj.xml new file mode 100644 index 000000000..d619c781e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot12_obj.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot15_obj.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot15_obj.xml new file mode 100644 index 000000000..bd59b8cd1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot15_obj.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot16_obj.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot16_obj.xml new file mode 100644 index 000000000..d39de812a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot16_obj.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot17_obj.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot17_obj.xml new file mode 100644 index 000000000..d4239d8d2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot17_obj.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot18_obj.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot18_obj.xml new file mode 100644 index 000000000..cc12b7894 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot18_obj.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ssh.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ssh.xml new file mode 100644 index 000000000..6283f8e9f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ssh.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_sst.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_sst.xml new file mode 100644 index 000000000..a80780741 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_sst.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_st.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_st.xml new file mode 100644 index 000000000..fe617cf14 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_st.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_stream.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_stream.xml new file mode 100644 index 000000000..59b0838e4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_stream.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_syokudai.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_syokudai.xml new file mode 100644 index 000000000..c1670edec --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_syokudai.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ta.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ta.xml new file mode 100644 index 000000000..5e446bf5c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ta.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_timeblock.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_timeblock.xml new file mode 100644 index 000000000..1d6b9e698 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_timeblock.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tite.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tite.xml new file mode 100644 index 000000000..1be65c495 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tite.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tk.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tk.xml new file mode 100644 index 000000000..6869280e6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tk.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_toki_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_toki_objects.xml new file mode 100644 index 000000000..cd07e60d2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_toki_objects.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_torch2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_torch2.xml new file mode 100644 index 000000000..ec55bbe26 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_torch2.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_toryo.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_toryo.xml new file mode 100644 index 000000000..73f3dcb1e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_toryo.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tp.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tp.xml new file mode 100644 index 000000000..8ea908825 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tp.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tr.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tr.xml new file mode 100644 index 000000000..e84d0896d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tr.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_trap.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_trap.xml new file mode 100644 index 000000000..56195cf41 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_trap.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + 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 new file mode 100644 index 000000000..a9d52dd96 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_triforce_spot.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ts.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ts.xml new file mode 100644 index 000000000..567277bc3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ts.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tsubo.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tsubo.xml new file mode 100644 index 000000000..ee2c5e184 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tsubo.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tw.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tw.xml new file mode 100644 index 000000000..66cd3a7c2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tw.xml @@ -0,0 +1,332 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_umajump.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_umajump.xml new file mode 100644 index 000000000..2ee4ade46 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_umajump.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_vali.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_vali.xml new file mode 100644 index 000000000..2bab5efaa --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_vali.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_vase.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_vase.xml new file mode 100644 index 000000000..091d4c51e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_vase.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_vm.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_vm.xml new file mode 100644 index 000000000..c5b949b36 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_vm.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_wallmaster.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_wallmaster.xml new file mode 100644 index 000000000..fbbc4f4af --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_wallmaster.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_warp1.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_warp1.xml new file mode 100644 index 000000000..1497d7a10 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_warp1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_warp2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_warp2.xml new file mode 100644 index 000000000..b6d1b3624 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_warp2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_wf.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_wf.xml new file mode 100644 index 000000000..ebfb708d2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_wf.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_wood02.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_wood02.xml new file mode 100644 index 000000000..47ec342ca --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_wood02.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_xc.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_xc.xml new file mode 100644 index 000000000..030ae9394 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_xc.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_yabusame_point.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_yabusame_point.xml new file mode 100644 index 000000000..bed9e8a60 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_yabusame_point.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ydan_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ydan_objects.xml new file mode 100644 index 000000000..e2adf307f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ydan_objects.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_yukabyun.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_yukabyun.xml new file mode 100644 index 000000000..d594ebbb8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_yukabyun.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zf.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zf.xml new file mode 100644 index 000000000..7f20eb786 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zf.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zg.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zg.xml new file mode 100644 index 000000000..79005516c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zg.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zl1.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zl1.xml new file mode 100644 index 000000000..c7082a3db --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zl1.xml @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zl2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zl2.xml new file mode 100644 index 000000000..9af0a6527 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zl2.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zl2_anime1.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zl2_anime1.xml new file mode 100644 index 000000000..cada50486 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zl2_anime1.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zl2_anime2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zl2_anime2.xml new file mode 100644 index 000000000..47016e2e0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zl2_anime2.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zl4.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zl4.xml new file mode 100644 index 000000000..b43e5ba34 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zl4.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zo.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zo.xml new file mode 100644 index 000000000..77465760e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zo.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Arrow_Fire.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Arrow_Fire.xml new file mode 100644 index 000000000..0f91c80be --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Arrow_Fire.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Arrow_Ice.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Arrow_Ice.xml new file mode 100644 index 000000000..001ac51d5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Arrow_Ice.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Arrow_Light.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Arrow_Light.xml new file mode 100644 index 000000000..e6e5c9776 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Arrow_Light.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Bg_Ganon_Otyuka.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Bg_Ganon_Otyuka.xml new file mode 100644 index 000000000..e1ea84996 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Bg_Ganon_Otyuka.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Bg_Jya_Cobra.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Bg_Jya_Cobra.xml new file mode 100644 index 000000000..857a14922 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Bg_Jya_Cobra.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Boss_Dodongo.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Boss_Dodongo.xml new file mode 100644 index 000000000..f2ee5b7b8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Boss_Dodongo.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Boss_Ganon.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Boss_Ganon.xml new file mode 100644 index 000000000..9f0e6e1f4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Boss_Ganon.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Boss_Ganon2.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Boss_Ganon2.xml new file mode 100644 index 000000000..dfb01ba07 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Boss_Ganon2.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Boss_Sst.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Boss_Sst.xml new file mode 100644 index 000000000..4e08c34f1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Boss_Sst.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Demo_Shd.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Demo_Shd.xml new file mode 100644 index 000000000..1682fd16a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Demo_Shd.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Bili.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Bili.xml new file mode 100644 index 000000000..8a77b7bd3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Bili.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Clear_Tag.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Clear_Tag.xml new file mode 100644 index 000000000..fee5c6302 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Clear_Tag.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Ganon_Mant.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Ganon_Mant.xml new file mode 100644 index 000000000..900ec46ac --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Ganon_Mant.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Ganon_Organ.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Ganon_Organ.xml new file mode 100644 index 000000000..91a5e31ac --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Ganon_Organ.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Holl.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Holl.xml new file mode 100644 index 000000000..65673c5ea --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Holl.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Jsjutan.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Jsjutan.xml new file mode 100644 index 000000000..d7f2859cb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Jsjutan.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Kanban.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Kanban.xml new file mode 100644 index 000000000..c2f8f7c23 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Kanban.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Sda.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Sda.xml new file mode 100644 index 000000000..91321c648 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Sda.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Ssh.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Ssh.xml new file mode 100644 index 000000000..f12c4ee19 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Ssh.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_St.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_St.xml new file mode 100644 index 000000000..d7b6b20cf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_St.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Sth.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Sth.xml new file mode 100644 index 000000000..13daffa63 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Sth.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_End_Title.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_End_Title.xml new file mode 100644 index 000000000..77c39c63a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_End_Title.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_File_Choose.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_File_Choose.xml new file mode 100644 index 000000000..f9aad776d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_File_Choose.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Magic_Dark.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Magic_Dark.xml new file mode 100644 index 000000000..e6315effd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Magic_Dark.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Magic_Fire.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Magic_Fire.xml new file mode 100644 index 000000000..0ddfe4cfc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Magic_Fire.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Magic_Wind.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Magic_Wind.xml new file mode 100644 index 000000000..3736e985e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Magic_Wind.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Spot.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Spot.xml new file mode 100644 index 000000000..9a53952f0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Spot.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Storm.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Storm.xml new file mode 100644 index 000000000..cb043eeb8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Storm.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Wipe.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Wipe.xml new file mode 100644 index 000000000..4ca01b04c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Wipe.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Wipe2.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Wipe2.xml new file mode 100644 index 000000000..051f2177e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Wipe2.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Wipe3.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Wipe3.xml new file mode 100644 index 000000000..11f278866 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Wipe3.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Wipe4.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Wipe4.xml new file mode 100644 index 000000000..a4e410eba --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Wipe4.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/Bmori1.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/Bmori1.xml new file mode 100644 index 000000000..70aac3464 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/Bmori1.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/FIRE_bs.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/FIRE_bs.xml new file mode 100644 index 000000000..9e65ba617 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/FIRE_bs.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/HAKAdan.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/HAKAdan.xml new file mode 100644 index 000000000..cc2935a1c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/HAKAdan.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/HAKAdanCH.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/HAKAdanCH.xml new file mode 100644 index 000000000..eb55a19f5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/HAKAdanCH.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/HAKAdan_bs.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/HAKAdan_bs.xml new file mode 100644 index 000000000..d3280ffe6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/HAKAdan_bs.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/HIDAN.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/HIDAN.xml new file mode 100644 index 000000000..dc4d56849 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/HIDAN.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/MIZUsin.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/MIZUsin.xml new file mode 100644 index 000000000..beb765c85 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/MIZUsin.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/MIZUsin_bs.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/MIZUsin_bs.xml new file mode 100644 index 000000000..b64089530 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/MIZUsin_bs.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/bdan.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/bdan.xml new file mode 100644 index 000000000..c4edc9bea --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/bdan.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/bdan_boss.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/bdan_boss.xml new file mode 100644 index 000000000..12d8d3e12 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/bdan_boss.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ddan.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ddan.xml new file mode 100644 index 000000000..f6572b9f8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ddan.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ddan_boss.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ddan_boss.xml new file mode 100644 index 000000000..03eb73ea3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ddan_boss.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon.xml new file mode 100644 index 000000000..0582da79f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon_boss.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon_boss.xml new file mode 100644 index 000000000..c75914c29 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon_boss.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon_demo.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon_demo.xml new file mode 100644 index 000000000..779cb9335 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon_demo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon_final.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon_final.xml new file mode 100644 index 000000000..afe1cffdf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon_final.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon_sonogo.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon_sonogo.xml new file mode 100644 index 000000000..70313c8cf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon_sonogo.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon_tou.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon_tou.xml new file mode 100644 index 000000000..6642a8902 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon_tou.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganontika.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganontika.xml new file mode 100644 index 000000000..de24b26ff --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganontika.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganontikasonogo.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganontikasonogo.xml new file mode 100644 index 000000000..60020188f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganontikasonogo.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/gerudoway.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/gerudoway.xml new file mode 100644 index 000000000..531724ead --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/gerudoway.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ice_doukutu.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ice_doukutu.xml new file mode 100644 index 000000000..4d25aa74f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ice_doukutu.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/jyasinboss.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/jyasinboss.xml new file mode 100644 index 000000000..0f81c26fb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/jyasinboss.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/jyasinzou.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/jyasinzou.xml new file mode 100644 index 000000000..ca5d0024a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/jyasinzou.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/men.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/men.xml new file mode 100644 index 000000000..acba3e7cb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/men.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/moribossroom.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/moribossroom.xml new file mode 100644 index 000000000..9c4552e9e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/moribossroom.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ydan.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ydan.xml new file mode 100644 index 000000000..465c5f0ca --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ydan.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ydan_boss.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ydan_boss.xml new file mode 100644 index 000000000..f4971e7fe --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ydan_boss.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/bowling.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/bowling.xml new file mode 100644 index 000000000..e12fd269a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/bowling.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/daiyousei_izumi.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/daiyousei_izumi.xml new file mode 100644 index 000000000..3c1fafb8d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/daiyousei_izumi.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/hairal_niwa.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/hairal_niwa.xml new file mode 100644 index 000000000..04547ab21 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/hairal_niwa.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/hairal_niwa_n.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/hairal_niwa_n.xml new file mode 100644 index 000000000..a33d77b07 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/hairal_niwa_n.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/hakasitarelay.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/hakasitarelay.xml new file mode 100644 index 000000000..bc1e2b966 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/hakasitarelay.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/hut.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/hut.xml new file mode 100644 index 000000000..a4ef5715f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/hut.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/hylia_labo.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/hylia_labo.xml new file mode 100644 index 000000000..829708604 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/hylia_labo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/impa.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/impa.xml new file mode 100644 index 000000000..db757e3d3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/impa.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kakariko.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kakariko.xml new file mode 100644 index 000000000..e4e9b102c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kakariko.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kenjyanoma.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kenjyanoma.xml new file mode 100644 index 000000000..e6bcef90a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kenjyanoma.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kokiri_home.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kokiri_home.xml new file mode 100644 index 000000000..8c0305493 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kokiri_home.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kokiri_home3.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kokiri_home3.xml new file mode 100644 index 000000000..9f36eb41c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kokiri_home3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kokiri_home4.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kokiri_home4.xml new file mode 100644 index 000000000..eb861aedb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kokiri_home4.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kokiri_home5.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kokiri_home5.xml new file mode 100644 index 000000000..974987fed --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kokiri_home5.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/labo.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/labo.xml new file mode 100644 index 000000000..c0a9d2eb8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/labo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/link_home.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/link_home.xml new file mode 100644 index 000000000..2fb88ae34 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/link_home.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/mahouya.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/mahouya.xml new file mode 100644 index 000000000..653cffc3b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/mahouya.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/malon_stable.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/malon_stable.xml new file mode 100644 index 000000000..aff97eeb8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/malon_stable.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/miharigoya.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/miharigoya.xml new file mode 100644 index 000000000..41ff2db9f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/miharigoya.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/nakaniwa.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/nakaniwa.xml new file mode 100644 index 000000000..49ff4a29c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/nakaniwa.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/syatekijyou.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/syatekijyou.xml new file mode 100644 index 000000000..5490e84f1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/syatekijyou.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/takaraya.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/takaraya.xml new file mode 100644 index 000000000..ddee91543 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/takaraya.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/tent.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/tent.xml new file mode 100644 index 000000000..de72cc5f4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/tent.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/tokinoma.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/tokinoma.xml new file mode 100644 index 000000000..e43f0a933 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/tokinoma.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/yousei_izumi_tate.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/yousei_izumi_tate.xml new file mode 100644 index 000000000..990e1763b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/yousei_izumi_tate.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/yousei_izumi_yoko.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/yousei_izumi_yoko.xml new file mode 100644 index 000000000..98923c569 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/yousei_izumi_yoko.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/enrui.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/enrui.xml new file mode 100644 index 000000000..d8c06e545 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/enrui.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/entra_n.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/entra_n.xml new file mode 100644 index 000000000..5b408ac3a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/entra_n.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/hakaana.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/hakaana.xml new file mode 100644 index 000000000..b13273bed --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/hakaana.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/hakaana2.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/hakaana2.xml new file mode 100644 index 000000000..146d0ce45 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/hakaana2.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/hakaana_ouke.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/hakaana_ouke.xml new file mode 100644 index 000000000..1d31d66a4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/hakaana_ouke.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/hiral_demo.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/hiral_demo.xml new file mode 100644 index 000000000..1331fdd4c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/hiral_demo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/kakariko3.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/kakariko3.xml new file mode 100644 index 000000000..07b62c44d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/kakariko3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/kakusiana.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/kakusiana.xml new file mode 100644 index 000000000..e4254b750 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/kakusiana.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/kinsuta.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/kinsuta.xml new file mode 100644 index 000000000..d5dbacdb7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/kinsuta.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/market_alley.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/market_alley.xml new file mode 100644 index 000000000..c30467303 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/market_alley.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/market_alley_n.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/market_alley_n.xml new file mode 100644 index 000000000..65db60411 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/market_alley_n.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/market_day.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/market_day.xml new file mode 100644 index 000000000..00887e69c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/market_day.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/market_night.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/market_night.xml new file mode 100644 index 000000000..c58e38744 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/market_night.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/market_ruins.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/market_ruins.xml new file mode 100644 index 000000000..f0ec75e75 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/market_ruins.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/shrine.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/shrine.xml new file mode 100644 index 000000000..b9ddf2cf7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/shrine.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/shrine_n.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/shrine_n.xml new file mode 100644 index 000000000..4878338aa --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/shrine_n.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/shrine_r.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/shrine_r.xml new file mode 100644 index 000000000..122036791 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/shrine_r.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/turibori.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/turibori.xml new file mode 100644 index 000000000..ef6848edf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/turibori.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/entra.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/entra.xml new file mode 100644 index 000000000..92ee57f59 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/entra.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/souko.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/souko.xml new file mode 100644 index 000000000..508beb85d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/souko.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot00.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot00.xml new file mode 100644 index 000000000..4e933910c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot00.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot01.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot01.xml new file mode 100644 index 000000000..e2da37e2d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot01.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot02.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot02.xml new file mode 100644 index 000000000..334d0e599 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot02.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot03.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot03.xml new file mode 100644 index 000000000..bf4039249 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot03.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot04.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot04.xml new file mode 100644 index 000000000..c5824727f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot04.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot05.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot05.xml new file mode 100644 index 000000000..7c2c012bf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot05.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot06.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot06.xml new file mode 100644 index 000000000..c369533bb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot06.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot07.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot07.xml new file mode 100644 index 000000000..e083e336d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot07.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot08.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot08.xml new file mode 100644 index 000000000..136727c6d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot08.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot09.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot09.xml new file mode 100644 index 000000000..175fac890 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot09.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot10.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot10.xml new file mode 100644 index 000000000..06349cf1e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot10.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot11.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot11.xml new file mode 100644 index 000000000..99bf24c82 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot11.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot12.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot12.xml new file mode 100644 index 000000000..77b0cfb07 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot12.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot13.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot13.xml new file mode 100644 index 000000000..5686bbde5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot13.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot15.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot15.xml new file mode 100644 index 000000000..f17e76d55 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot15.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot16.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot16.xml new file mode 100644 index 000000000..026da9fd2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot16.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot17.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot17.xml new file mode 100644 index 000000000..3aecc15a6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot17.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot18.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot18.xml new file mode 100644 index 000000000..513e67cbc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot18.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot20.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot20.xml new file mode 100644 index 000000000..b75f3f5c0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot20.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/alley_shop.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/alley_shop.xml new file mode 100644 index 000000000..95548de1b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/alley_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/drag.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/drag.xml new file mode 100644 index 000000000..acb6515fb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/drag.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/face_shop.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/face_shop.xml new file mode 100644 index 000000000..16a974608 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/face_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/golon.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/golon.xml new file mode 100644 index 000000000..c58672798 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/golon.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/kokiri_shop.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/kokiri_shop.xml new file mode 100644 index 000000000..50cd633e5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/kokiri_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/night_shop.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/night_shop.xml new file mode 100644 index 000000000..5954d9c83 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/night_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/shop1.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/shop1.xml new file mode 100644 index 000000000..525a06d63 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/shop1.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/zoora.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/zoora.xml new file mode 100644 index 000000000..0e4ac18f8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/zoora.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/text/elf_message_field.xml b/soh/assets/xml/GC_NMQ_PAL_F/text/elf_message_field.xml new file mode 100644 index 000000000..789a554ce --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/text/elf_message_field.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_PAL_F/text/elf_message_ydan.xml b/soh/assets/xml/GC_NMQ_PAL_F/text/elf_message_ydan.xml new file mode 100644 index 000000000..f784afcf4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/text/elf_message_ydan.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_PAL_F/text/nes_message_data_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/text/nes_message_data_static.xml new file mode 100644 index 000000000..d77bf0ff8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/text/nes_message_data_static.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_PAL_F/text/staff_message_data_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/text/staff_message_data_static.xml new file mode 100644 index 000000000..395a6b7bd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/text/staff_message_data_static.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/backgrounds.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/backgrounds.xml new file mode 100644 index 000000000..474734e71 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/backgrounds.xml @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/do_action_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/do_action_static.xml new file mode 100644 index 000000000..9ae8d9815 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/do_action_static.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_24_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_24_static.xml new file mode 100644 index 000000000..0c5f7621e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_24_static.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_dungeon_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_dungeon_static.xml new file mode 100644 index 000000000..873c490fc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_dungeon_static.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_field_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_field_static.xml new file mode 100644 index 000000000..ed991406b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_field_static.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_fra_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_fra_static.xml new file mode 100644 index 000000000..2c8ccad5b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_fra_static.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_gameover_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_gameover_static.xml new file mode 100644 index 000000000..fc2a50642 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_gameover_static.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_ger_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_ger_static.xml new file mode 100644 index 000000000..ea71dda35 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_ger_static.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_nes_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_nes_static.xml new file mode 100644 index 000000000..6cd92acfc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_nes_static.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_static.xml new file mode 100644 index 000000000..7b61cf35c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_static.xml @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/item_name_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/item_name_static.xml new file mode 100644 index 000000000..00c497490 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/item_name_static.xml @@ -0,0 +1,373 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/map_48x85_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/map_48x85_static.xml new file mode 100644 index 000000000..b5b1d1a85 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/map_48x85_static.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/map_grand_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/map_grand_static.xml new file mode 100644 index 000000000..201955bfc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/map_grand_static.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/map_i_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/map_i_static.xml new file mode 100644 index 000000000..1721f6d84 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/map_i_static.xml @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/map_name_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/map_name_static.xml new file mode 100644 index 000000000..7f9d31589 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/map_name_static.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/message_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/message_static.xml new file mode 100644 index 000000000..afdde60de --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/message_static.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/message_texture_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/message_texture_static.xml new file mode 100644 index 000000000..bbf7e1259 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/message_texture_static.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/nes_font_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/nes_font_static.xml new file mode 100644 index 000000000..b01646cb5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/nes_font_static.xml @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/nintendo_rogo_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/nintendo_rogo_static.xml new file mode 100644 index 000000000..7a60524b2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/nintendo_rogo_static.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/parameter_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/parameter_static.xml new file mode 100644 index 000000000..bd4173431 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/parameter_static.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/place_title_cards.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/place_title_cards.xml new file mode 100644 index 000000000..c1771d4c8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/place_title_cards.xml @@ -0,0 +1,287 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/skyboxes.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/skyboxes.xml new file mode 100644 index 000000000..9ff554c94 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/skyboxes.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/title_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/title_static.xml new file mode 100644 index 000000000..422b60cdc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/title_static.xml @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/build.c b/soh/build.c index acb8d151d..f3f9bdae6 100644 --- a/soh/build.c +++ b/soh/build.c @@ -1,8 +1,8 @@ -const char gBuildVersion[] = "DECKARD"; +const char gBuildVersion[] = "DECKARD ALFA (1.0.0)"; const char gBuildTeam[] = "github.com/harbourmasters"; #ifdef __TIMESTAMP__ const char gBuildDate[] = __TIMESTAMP__; #else const char gBuildDate[] = __DATE__ " " __TIME__; #endif -const char gBuildMakeOption[] = ""; \ No newline at end of file +const char gBuildMakeOption[] = ""; diff --git a/soh/soh.vcxproj b/soh/soh.vcxproj index 9d5b509f2..aa6dee304 100644 --- a/soh/soh.vcxproj +++ b/soh/soh.vcxproj @@ -144,7 +144,7 @@ false INCLUDE_GAME_PRINTF;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;ENABLE_DX11;%(PreprocessorDefinitions)GLEW_STATIC true - stdcpp17 + stdcpp20 MultiThreadedDebug true diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 0732a80e1..c000ce8e1 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -22,6 +22,7 @@ #include "Lib/stb/stb_image.h" #include "AudioPlayer.h" #include "../soh/Enhancements/debugconsole.h" +#include "Utils/BitConverter.h" OTRGlobals* OTRGlobals::Instance; @@ -41,6 +42,15 @@ extern "C" void OTRMessage_Init(); // C->C++ Bridge extern "C" void InitOTR() { OTRGlobals::Instance = new OTRGlobals(); + auto t = OTRGlobals::Instance->context->GetResourceManager()->LoadFile("version"); + + if (!t->bHasLoadError) + { + //uint32_t gameVersion = BitConverter::ToUInt32BE((uint8_t*)t->buffer.get(), 0); + uint32_t gameVersion = *((uint32_t*)t->buffer.get()); + OTRGlobals::Instance->context->GetResourceManager()->SetGameVersion(gameVersion); + } + clearMtx = (uintptr_t)&gMtxClear; OTRMessage_Init(); DebugConsole_Init(); @@ -96,6 +106,11 @@ extern "C" void OTRResetScancode() OTRGlobals::Instance->context->GetWindow()->lastScancode = -1; } +extern "C" uint32_t ResourceMgr_GetGameVersion() +{ + return OTRGlobals::Instance->context->GetResourceManager()->GetGameVersion(); +} + extern "C" void ResourceMgr_CacheDirectory(const char* resName) { OTRGlobals::Instance->context->GetResourceManager()->CacheDirectory(resName); } diff --git a/soh/soh/OTRGlobals.h b/soh/soh/OTRGlobals.h index f7e525834..4a439fc6d 100644 --- a/soh/soh/OTRGlobals.h +++ b/soh/soh/OTRGlobals.h @@ -27,6 +27,7 @@ void OTRGfxPrint(const char* str, void* printer, void (*printImpl)(void*, char)) void OTRSetFrameDivisor(int divisor); uint16_t OTRGetPixelDepth(float x, float y); int32_t OTRGetLastScancode(); +uint32_t ResourceMgr_GetGameVersion(); void ResourceMgr_CacheDirectory(const char* resName); void ResourceMgr_LoadFile(const char* resName); char* ResourceMgr_LoadFileFromDisk(const char* filePath); diff --git a/soh/soh/z_play_otr.cpp b/soh/soh/z_play_otr.cpp index 6d6c4bb30..c84e37482 100644 --- a/soh/soh/z_play_otr.cpp +++ b/soh/soh/z_play_otr.cpp @@ -31,6 +31,16 @@ extern "C" void OTRGameplay_SpawnScene(GlobalContext* globalCtx, s32 sceneNum, s std::string scenePath = StringHelper::Sprintf("scenes\\%s\\%s", scene->sceneFile.fileName, scene->sceneFile.fileName); globalCtx->sceneSegment = (Ship::Scene*)OTRGameplay_LoadFile(globalCtx, scenePath.c_str()); + + // Failed to load scene... default to doodongs cavern + if (globalCtx->sceneSegment == nullptr) + { + lusprintf(__FILE__, __LINE__, 2, "Unable to load scene %s... Defaulting to Doodong's Cavern!\n", + scenePath.c_str()); + OTRGameplay_SpawnScene(globalCtx, 0x01, 0); + return; + } + scene->unk_13 = 0; //ASSERT(globalCtx->sceneSegment != NULL, "this->sceneSegment != NULL", "../z_play.c", 4960); diff --git a/soh/src/code/z_play.c b/soh/src/code/z_play.c index f0880b3da..193b14164 100644 --- a/soh/src/code/z_play.c +++ b/soh/src/code/z_play.c @@ -1495,26 +1495,6 @@ void Gameplay_InitScene(GlobalContext* globalCtx, s32 spawn) void Gameplay_SpawnScene(GlobalContext* globalCtx, s32 sceneNum, s32 spawn) { OTRGameplay_SpawnScene(globalCtx, sceneNum, spawn); - return; - - SceneTableEntry* scene = &gSceneTable[sceneNum]; - - scene->unk_13 = 0; - globalCtx->loadedScene = scene; - globalCtx->sceneNum = sceneNum; - globalCtx->sceneConfig = scene->config; - - osSyncPrintf("\nSCENE SIZE %fK\n", (scene->sceneFile.vromEnd - scene->sceneFile.vromStart) / 1024.0f); - - globalCtx->sceneSegment = Gameplay_LoadFile(globalCtx, &scene->sceneFile); - scene->unk_13 = 0; - ASSERT(globalCtx->sceneSegment != NULL, "this->sceneSegment != NULL", "../z_play.c", 4960); - - gSegments[2] = VIRTUAL_TO_PHYSICAL(globalCtx->sceneSegment); - - Gameplay_InitScene(globalCtx, spawn); - - osSyncPrintf("ROOM SIZE=%fK\n", func_80096FE8(globalCtx, &globalCtx->roomCtx) / 1024.0f); } void func_800C016C(GlobalContext* globalCtx, Vec3f* src, Vec3f* dest) { diff --git a/soh/src/code/z_player_lib.c b/soh/src/code/z_player_lib.c index d7344d7c3..87a7009ec 100644 --- a/soh/src/code/z_player_lib.c +++ b/soh/src/code/z_player_lib.c @@ -1625,6 +1625,8 @@ void func_80091A24(GlobalContext* globalCtx, void* seg04, void* seg06, SkelAnime POLY_XLU_DISP = ohNo; } + POLY_OPA_DISP = Gameplay_SetFog(globalCtx, POLY_OPA_DISP++); + CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_player_lib.c", 3288); } diff --git a/soh/src/code/z_vr_box.c b/soh/src/code/z_vr_box.c index 7925e5cb9..e532edf31 100644 --- a/soh/src/code/z_vr_box.c +++ b/soh/src/code/z_vr_box.c @@ -1001,9 +1001,8 @@ void Skybox_Setup(GlobalContext* globalCtx, SkyboxContext* skyboxCtx, s16 skybox LoadSkyboxPalette(globalCtx, skyboxCtx, 2, gBackAlleyHouseBg3Tlut, 16, 16); break; default: - skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 8, "../z_vr_box.c", 1226); - //skyboxCtx->staticSegments[1] = GameState_Alloc(&globalCtx->state, 0x10000 * 8, "../z_vr_box.c", 1226); - skyboxCtx->staticSegments[1] = malloc(0x10000 * 8); // OTRTODO + skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 4, "../z_vr_box.c", 1226); + skyboxCtx->staticSegments[1] = GameState_Alloc(&globalCtx->state, 0x10000 * 4, "../z_vr_box.c", 1226); skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x1000, "../z_vr_box.c", 1226); break; } diff --git a/soh/src/overlays/actors/ovl_Elf_Msg/z_elf_msg.c b/soh/src/overlays/actors/ovl_Elf_Msg/z_elf_msg.c index 2e8858a94..5e0a780fd 100644 --- a/soh/src/overlays/actors/ovl_Elf_Msg/z_elf_msg.c +++ b/soh/src/overlays/actors/ovl_Elf_Msg/z_elf_msg.c @@ -138,6 +138,10 @@ void ElfMsg_CallNaviCylinder(ElfMsg* this, GlobalContext* globalCtx) { Player* player = GET_PLAYER(globalCtx); EnElf* navi = (EnElf*)player->naviActor; + // This fixes a crash when using a grotto exit when you never properly entered + if (navi == NULL) + return; + if (ElfMsg_WithinXZDistance(&player->actor.world.pos, &this->actor.world.pos, this->actor.scale.x * 100.0f) && (this->actor.world.pos.y <= player->actor.world.pos.y) && ((player->actor.world.pos.y - this->actor.world.pos.y) < (100.0f * this->actor.scale.y))) { @@ -164,9 +168,13 @@ void ElfMsg_Update(Actor* thisx, GlobalContext* globalCtx) { } } +#ifdef ZELDA_DEBUG #include "overlays/ovl_Elf_Msg/ovl_Elf_Msg.h" +#endif -void ElfMsg_Draw(Actor* thisx, GlobalContext* globalCtx) { +void ElfMsg_Draw(Actor* thisx, GlobalContext* globalCtx) +{ +#ifdef ZELDA_DEBUG OPEN_DISPS(globalCtx->state.gfxCtx, "../z_elf_msg.c", 436); if (R_NAVI_MSG_REGION_ALPHA == 0) { @@ -191,4 +199,5 @@ void ElfMsg_Draw(Actor* thisx, GlobalContext* globalCtx) { } CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_elf_msg.c", 457); + #endif } diff --git a/soh/src/overlays/actors/ovl_Elf_Msg2/z_elf_msg2.c b/soh/src/overlays/actors/ovl_Elf_Msg2/z_elf_msg2.c index f23f49e10..73b6785c8 100644 --- a/soh/src/overlays/actors/ovl_Elf_Msg2/z_elf_msg2.c +++ b/soh/src/overlays/actors/ovl_Elf_Msg2/z_elf_msg2.c @@ -148,9 +148,12 @@ void ElfMsg2_Update(Actor* thisx, GlobalContext* globalCtx) { } } +#if ZELDA_DEBUG #include "overlays/ovl_Elf_Msg2/ovl_Elf_Msg2.h" +#endif void ElfMsg2_Draw(Actor* thisx, GlobalContext* globalCtx) { +#if ZELDA_DEBUG OPEN_DISPS(globalCtx->state.gfxCtx, "../z_elf_msg2.c", 355); if (R_NAVI_MSG_REGION_ALPHA == 0) { @@ -165,4 +168,5 @@ void ElfMsg2_Draw(Actor* thisx, GlobalContext* globalCtx) { gSPDisplayList(POLY_XLU_DISP++, sCubeDL); CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_elf_msg2.c", 367); + #endif } diff --git a/soh/src/overlays/gamestates/ovl_title/z_title.c b/soh/src/overlays/gamestates/ovl_title/z_title.c index e45cdf27b..942962f2e 100644 --- a/soh/src/overlays/gamestates/ovl_title/z_title.c +++ b/soh/src/overlays/gamestates/ovl_title/z_title.c @@ -10,6 +10,9 @@ #include "alloca.h" #include "textures/nintendo_rogo_static/nintendo_rogo_static.h" #include +#include "GameVersions.h" + +const char* GetGameVersionString(); char* quote; @@ -18,6 +21,8 @@ void Title_PrintBuildInfo(Gfx** gfxp) { //GfxPrint* printer; GfxPrint printer; + const char* gameVersionStr = GetGameVersionString(); + g = *gfxp; g = func_8009411C(g); //printer = alloca(sizeof(GfxPrint)); @@ -32,6 +37,9 @@ void Title_PrintBuildInfo(Gfx** gfxp) { GfxPrint_Printf(printer, "GCC SHIP"); #endif + GfxPrint_SetPos(&printer, 5, 4); + GfxPrint_Printf(&printer, "Game Version: %s", gameVersionStr); + GfxPrint_SetColor(&printer, 255, 255, 255, 255); GfxPrint_SetPos(&printer, 2, 22); GfxPrint_Printf(&printer, quote); @@ -66,6 +74,36 @@ char* SetQuote() { return quotes[randomQuote]; } +const char* GetGameVersionString() { + uint32_t gameVersion = ResourceMgr_GetGameVersion(); + switch (gameVersion) { + case OOT_NTSC_10: + return "N64 NTSC 1.0"; + case OOT_NTSC_11: + return "N64 NTSC 1.1"; + case OOT_NTSC_12: + return "N64 NTSC 1.2"; + case OOT_PAL_10: + return "N64 PAL 1.0"; + case OOT_PAL_11: + return "N64 PAL 1.1"; + case OOT_PAL_GC: + return "GC PAL"; + case OOT_PAL_MQ: + return "GC PAL MQ"; + case OOT_PAL_GC_DBG1: + return "GC PAL DEBUG"; + case OOT_PAL_GC_DBG2: + return "GC PAL DEBUG MQ"; + case OOT_IQUE_CN: + return "IQUE CN"; + case OOT_IQUE_TW: + return "IQUE TW"; + default: + return "UNKNOWN"; + } +} + // Note: In other rom versions this function also updates unk_1D4, coverAlpha, addAlpha, visibleDuration to calculate // the fade-in/fade-out + the duration of the n64 logo animation void Title_Calc(TitleContext* this) { diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c index a5c160700..140aa7734 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c @@ -789,40 +789,10 @@ static PreRender sPlayerPreRender; static void* sPreRenderCvg; extern int fbTest; -// OTRTODO: This function is no longer used. We could probably remove it. -void KaleidoScope_SetupPlayerPreRender(GlobalContext* globalCtx) { - Gfx* gfx; - Gfx* gfxRef; - void* fbuf; - static Gfx testBuffer[2048]; - - //return; - - fbuf = globalCtx->state.gfxCtx->curFrameBuffer; - - OPEN_DISPS(globalCtx->state.gfxCtx, "../z_kaleido_scope_PAL.c", 496); - - gfx = &testBuffer[0]; - - PreRender_SetValues(&sPlayerPreRender, 64, 112, fbuf, NULL); - func_800C1F20(&sPlayerPreRender, &gfx); - func_800C20B4(&sPlayerPreRender, &gfx); - - gSPEndDisplayList(gfx++); - gSPDisplayList(POLY_KAL_DISP++, &testBuffer[0]); - - SREG(33) |= 1; - - CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_kaleido_scope_PAL.c", 509); -} -//OTRTODO - Player on pause -#if 1 void KaleidoScope_ProcessPlayerPreRender(void) { - //Sleep_Msec(50); PreRender_Calc(&sPlayerPreRender); PreRender_Destroy(&sPlayerPreRender); } -#endif Gfx* KaleidoScope_QuadTextureIA4(Gfx* gfx, void* texture, s16 width, s16 height, u16 point) { gDPLoadTextureBlock_4b(gfx++, texture, G_IM_FMT_IA, width, height, 0, G_TX_NOMIRROR | G_TX_WRAP, @@ -4026,7 +3996,6 @@ void KaleidoScope_Update(GlobalContext* globalCtx) ResourceMgr_DirtyDirectory("textures/icon_item_24_static*"); ResourceMgr_DirtyDirectory("textures/icon_item_static*"); CVar_SetS32("gPauseTriforce", 0); - //ResourceMgr_InvalidateCache(); func_800981B8(&globalCtx->objectCtx); func_800418D0(&globalCtx->colCtx, globalCtx); From 529c5f642d803d74feb4070b66aab85fc02a6bef Mon Sep 17 00:00:00 2001 From: Emill Date: Sat, 2 Apr 2022 19:57:20 +0200 Subject: [PATCH 20/83] Don't copy skybox textures (#129) * Don't copy skybox textures * Remove unnecessary parameter in skybox functions * Make palette address part of texture cache key * Support loading TLUT from two different memory locations --- .../Lib/Fast3D/U64/PR/ultra64/gbi.h | 11 + .../libultraship/Lib/Fast3D/gfx_pc.cpp | 44 +- libultraship/libultraship/Lib/Fast3D/gfx_pc.h | 1 + libultraship/libultraship/TextureMod.cpp | 2 +- soh/include/z64.h | 22 +- soh/src/code/z_kankyo.c | 20 +- soh/src/code/z_vr_box.c | 431 ++++++++---------- soh/src/code/z_vr_box_draw.c | 23 +- 8 files changed, 274 insertions(+), 280 deletions(-) diff --git a/libultraship/libultraship/Lib/Fast3D/U64/PR/ultra64/gbi.h b/libultraship/libultraship/Lib/Fast3D/U64/PR/ultra64/gbi.h index 843cb3cd6..83cc9a55c 100644 --- a/libultraship/libultraship/Lib/Fast3D/U64/PR/ultra64/gbi.h +++ b/libultraship/libultraship/Lib/Fast3D/U64/PR/ultra64/gbi.h @@ -4223,6 +4223,17 @@ _DW({ \ gDPPipeSync(pkt); \ }) +#define gDPLoadTLUT_pal128(pkt, pal, dram) \ +_DW({ \ + gDPSetTextureImage(pkt, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, dram); \ + gDPTileSync(pkt); \ + gDPSetTile(pkt, 0, 0, 0, 256 + ((pal)&1)*128, \ + G_TX_LOADTILE, 0 , 0, 0, 0, 0, 0, 0); \ + gDPLoadSync(pkt); \ + gDPLoadTLUTCmd(pkt, G_TX_LOADTILE, 127); \ + gDPPipeSync(pkt); \ +}) + #else /* **** WORKAROUND hardware 1 load_tlut bug ****** */ #define gDPLoadTLUT_pal256(pkt, dram) \ diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp index 5739774ee..28debd120 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp @@ -125,7 +125,7 @@ static struct RSP { } rsp; static struct RDP { - const uint8_t *palette; + const uint8_t *palettes[2]; struct { const uint8_t *addr; uint8_t siz; @@ -145,6 +145,7 @@ static struct RDP { uint8_t cms, cmt; uint8_t shifts, shiftt; uint16_t uls, ult, lrs, lrt; // U10.2 + uint16_t tmem; // 0-511, in 64-bit word units uint32_t line_size_bytes; uint8_t palette; uint8_t tmem_index; // 0 or 1 for offset 0 kB or offset 2 kB, respectively @@ -490,8 +491,22 @@ void gfx_texture_cache_clear() gfx_texture_cache.lru.clear(); } -static bool gfx_texture_cache_lookup(int i, TextureCacheNode **n, const uint8_t *orig_addr, uint32_t fmt, uint32_t siz, uint32_t palette_index) { - TextureCacheKey key = { orig_addr, fmt, siz, palette_index }; +static bool gfx_texture_cache_lookup(int i, int tile) { + uint8_t fmt = rdp.texture_tile[tile].fmt; + uint8_t siz = rdp.texture_tile[tile].siz; + uint32_t tmem_index = rdp.texture_tile[tile].tmem_index; + + TextureCacheNode** n = &rendering_state.textures[i]; + const uint8_t* orig_addr = rdp.loaded_texture[tmem_index].addr; + uint8_t palette_index = rdp.texture_tile[tile].palette; + + TextureCacheKey key; + if (fmt == G_IM_FMT_CI) { + key = { orig_addr, { rdp.palettes[0], rdp.palettes[1] }, fmt, siz, palette_index }; + } else { + key = { orig_addr, { }, fmt, siz, palette_index }; + } + auto it = gfx_texture_cache.map.find(key); if (it != gfx_texture_cache.map.end()) { @@ -735,7 +750,8 @@ static void import_texture_ci4(int tile) { uint32_t size_bytes = rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].size_bytes; uint32_t full_image_line_size_bytes = rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].full_image_line_size_bytes; uint32_t line_size_bytes = rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].line_size_bytes; - const uint8_t *palette = rdp.palette + rdp.texture_tile[tile].palette * 16 * 2; // 16 pixel entries, 16 bits each + uint32_t pal_idx = rdp.texture_tile[tile].palette; // 0-15 + const uint8_t *palette = rdp.palettes[pal_idx / 8] + (pal_idx % 8) * 16 * 2; // 16 pixel entries, 16 bits each SUPPORT_CHECK(full_image_line_size_bytes == line_size_bytes); for (uint32_t i = 0; i < size_bytes * 2; i++) { @@ -770,7 +786,7 @@ static void import_texture_ci8(int tile) { { for (uint32_t k = 0; k < line_size_bytes; i++, k++, j++) { uint8_t idx = addr[j]; - uint16_t col16 = (rdp.palette[idx * 2] << 8) | rdp.palette[idx * 2 + 1]; // Big endian load + uint16_t col16 = (rdp.palettes[idx / 128][(idx % 128) * 2] << 8) | rdp.palettes[idx / 128][(idx % 128) * 2 + 1]; // Big endian load uint8_t a = col16 & 1; uint8_t r = col16 >> 11; uint8_t g = (col16 >> 6) & 0x1f; @@ -815,7 +831,7 @@ static void import_texture(int i, int tile) { // if (ModInternal::callBindHook(0)) // return; - if (gfx_texture_cache_lookup(i, &rendering_state.textures[i], rdp.loaded_texture[tmem_index].addr, fmt, siz, rdp.texture_tile[tile].palette)) + if (gfx_texture_cache_lookup(i, tile)) { return; } @@ -1638,6 +1654,7 @@ static void gfx_dp_set_tile(uint8_t fmt, uint32_t siz, uint32_t line, uint32_t t int bp = 0; } + rdp.texture_tile[tile].tmem = tmem; //rdp.texture_tile[tile].tmem_index = tmem / 256; // tmem is the 64-bit word offset, so 256 words means 2 kB rdp.texture_tile[tile].tmem_index = tmem != 0; // assume one texture is loaded at address 0 and another texture at any other address rdp.textures_changed[0] = true; @@ -1654,10 +1671,19 @@ static void gfx_dp_set_tile_size(uint8_t tile, uint16_t uls, uint16_t ult, uint1 } static void gfx_dp_load_tlut(uint8_t tile, uint32_t high_index) { - //SUPPORT_CHECK(tile == G_TX_LOADTILE); - //SUPPORT_CHECK(rdp.texture_to_load.siz == G_IM_SIZ_16b); + SUPPORT_CHECK(tile == G_TX_LOADTILE); + SUPPORT_CHECK(rdp.texture_to_load.siz == G_IM_SIZ_16b); - rdp.palette = rdp.texture_to_load.addr; + SUPPORT_CHECK((rdp.texture_tile[tile].tmem == 256 && (high_index <= 127 || high_index == 255)) || (rdp.texture_tile[tile].tmem == 384 && high_index == 127)); + + if (rdp.texture_tile[tile].tmem == 256) { + rdp.palettes[0] = rdp.texture_to_load.addr; + if (high_index == 255) { + rdp.palettes[1] = rdp.texture_to_load.addr + 2 * 128; + } + } else { + rdp.palettes[1] = rdp.texture_to_load.addr; + } } static void gfx_dp_load_block(uint8_t tile, uint32_t uls, uint32_t ult, uint32_t lrs, uint32_t dxt) { diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_pc.h b/libultraship/libultraship/Lib/Fast3D/gfx_pc.h index b3b8d9082..446c0b6a4 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_pc.h +++ b/libultraship/libultraship/Lib/Fast3D/gfx_pc.h @@ -17,6 +17,7 @@ struct GfxDimensions struct TextureCacheKey { const uint8_t* texture_addr; + const uint8_t* palette_addrs[2]; uint8_t fmt, siz; uint8_t palette_index; diff --git a/libultraship/libultraship/TextureMod.cpp b/libultraship/libultraship/TextureMod.cpp index dd2d6fc3a..2a7e39511 100644 --- a/libultraship/libultraship/TextureMod.cpp +++ b/libultraship/libultraship/TextureMod.cpp @@ -80,7 +80,7 @@ namespace Ship { if (!this->TextureCache.contains(path)) this->TextureCache[path].resize(10); - TextureCacheKey key = { orig_addr, static_cast(fmt), static_cast(siz), static_cast(palette) }; + TextureCacheKey key = { orig_addr, { }, static_cast(fmt), static_cast(siz), static_cast(palette) }; TextureCacheValue value = { api->new_texture(), 0, 0, false }; const auto entry = new TextureCacheNode(key, value); api->select_texture(tile, entry->second.texture_id); diff --git a/soh/include/z64.h b/soh/include/z64.h index 6e783eeb9..24ec79946 100644 --- a/soh/include/z64.h +++ b/soh/include/z64.h @@ -336,16 +336,18 @@ typedef enum { } SkyboxId; typedef struct { - /* 0x000 */ char unk_00[0x128]; - /* 0x128 */ void* staticSegments[2]; - /* 0x130 */ u16 (*palettes)[256]; - /* 0x134 */ Gfx (*dListBuf)[150]; - /* 0x138 */ Gfx* unk_138; - /* 0x13C */ Vtx* roomVtx; - /* 0x140 */ s16 unk_140; - /* 0x144 */ Vec3f rot; - /* 0x150 */ char unk_150[0x10]; -} SkyboxContext; // size = 0x160 + char unk_00[0x128]; + s16 skyboxId; + void* textures[2][6]; + void* palettes[6]; + u16 palette_size; + Gfx (*dListBuf)[150]; + Gfx* unk_138; + Vtx* roomVtx; + s16 unk_140; + Vec3f rot; + char unk_150[0x10]; +} SkyboxContext; typedef enum { /* 0 */ OCARINA_SONG_MINUET, diff --git a/soh/src/code/z_kankyo.c b/soh/src/code/z_kankyo.c index 90194835e..afcd0f4fa 100644 --- a/soh/src/code/z_kankyo.c +++ b/soh/src/code/z_kankyo.c @@ -677,7 +677,9 @@ void Environment_UpdateSkybox(GlobalContext* globalCtx, u8 skyboxId, Environment SkyboxTableEntry entryA = sSkyboxTable[newSkybox1Index]; for (int i = 0; i < 5; i++) - LoadSkyboxTex(globalCtx, skyboxCtx, 0, i, entryA.textures[i], 128, i == 4 ? 128 : 64, 128, 64); + LoadSkyboxTex(skyboxCtx, 0, i, entryA.textures[i], 128, i == 4 ? 128 : 64, 128, 64); + + Skybox_Update(skyboxCtx); envCtx->skybox1Index = newSkybox1Index; @@ -695,7 +697,9 @@ void Environment_UpdateSkybox(GlobalContext* globalCtx, u8 skyboxId, Environment SkyboxTableEntry entryA = sSkyboxTable[newSkybox2Index]; for (int i = 0; i < 5; i++) - LoadSkyboxTex(globalCtx, skyboxCtx, 1, i, entryA.textures[i], 128, i == 4 ? 128 : 64, 128, 64); + LoadSkyboxTex(skyboxCtx, 1, i, entryA.textures[i], 128, i == 4 ? 128 : 64, 128, 64); + + Skybox_Update(skyboxCtx); envCtx->skybox2Index = newSkybox2Index; @@ -712,7 +716,7 @@ void Environment_UpdateSkybox(GlobalContext* globalCtx, u8 skyboxId, Environment if ((newSkybox1Index & 1) ^ ((newSkybox1Index & 4) >> 2)) { SkyboxTableEntry entryA = sSkyboxTable[newSkybox1Index]; - LoadSkyboxPalette(globalCtx, skyboxCtx, 0, entryA.palettes[0], 16, 8); + LoadSkyboxPalette(skyboxCtx, 0, entryA.palettes[0], 16, 8); //size = gSkyboxFiles[newSkybox1Index].palette.vromEnd - gSkyboxFiles[newSkybox1Index].palette.vromStart; //osCreateMesgQueue(&envCtx->loadQueue, &envCtx->loadMsg, 1); @@ -721,7 +725,7 @@ void Environment_UpdateSkybox(GlobalContext* globalCtx, u8 skyboxId, Environment //"../z_kankyo.c", 1307); } else { SkyboxTableEntry entryA = sSkyboxTable[newSkybox1Index]; - LoadSkyboxPalette(globalCtx, skyboxCtx, 1, entryA.palettes[0], 16, 8); + LoadSkyboxPalette(skyboxCtx, 1, entryA.palettes[0], 16, 8); //size = gSkyboxFiles[newSkybox1Index].palette.vromEnd - gSkyboxFiles[newSkybox1Index].palette.vromStart; //osCreateMesgQueue(&envCtx->loadQueue, &envCtx->loadMsg, 1); @@ -729,6 +733,8 @@ void Environment_UpdateSkybox(GlobalContext* globalCtx, u8 skyboxId, Environment //gSkyboxFiles[newSkybox1Index].palette.vromStart, size, 0, &envCtx->loadQueue, NULL, //"../z_kankyo.c", 1320); } + + Skybox_Update(skyboxCtx); } if (envCtx->skyboxDmaState == SKYBOX_DMA_FILE2_DONE) { @@ -737,7 +743,7 @@ void Environment_UpdateSkybox(GlobalContext* globalCtx, u8 skyboxId, Environment if ((newSkybox2Index & 1) ^ ((newSkybox2Index & 4) >> 2)) { SkyboxTableEntry entryA = sSkyboxTable[newSkybox2Index]; - LoadSkyboxPalette(globalCtx, skyboxCtx, 0, entryA.palettes[0], 16, 8); + LoadSkyboxPalette(skyboxCtx, 0, entryA.palettes[0], 16, 8); /*size = gSkyboxFiles[newSkybox2Index].palette.vromEnd - gSkyboxFiles[newSkybox2Index].palette.vromStart; osCreateMesgQueue(&envCtx->loadQueue, &envCtx->loadMsg, 1); @@ -747,7 +753,7 @@ void Environment_UpdateSkybox(GlobalContext* globalCtx, u8 skyboxId, Environment } else { SkyboxTableEntry entryA = sSkyboxTable[newSkybox2Index]; - LoadSkyboxPalette(globalCtx, skyboxCtx, 1, entryA.palettes[0], 16, 8); + LoadSkyboxPalette(skyboxCtx, 1, entryA.palettes[0], 16, 8); /*size = gSkyboxFiles[newSkybox2Index].palette.vromEnd - gSkyboxFiles[newSkybox2Index].palette.vromStart; osCreateMesgQueue(&envCtx->loadQueue, &envCtx->loadMsg, 1); @@ -755,6 +761,8 @@ void Environment_UpdateSkybox(GlobalContext* globalCtx, u8 skyboxId, Environment gSkyboxFiles[newSkybox2Index].palette.vromStart, size, 0, &envCtx->loadQueue, NULL, "../z_kankyo.c", 1355);*/ } + + Skybox_Update(skyboxCtx); } if ((envCtx->skyboxDmaState == SKYBOX_DMA_FILE1_START) || (envCtx->skyboxDmaState == SKYBOX_DMA_FILE2_START)) { diff --git a/soh/src/code/z_vr_box.c b/soh/src/code/z_vr_box.c index e532edf31..76753e096 100644 --- a/soh/src/code/z_vr_box.c +++ b/soh/src/code/z_vr_box.c @@ -248,7 +248,7 @@ s32 func_800ADBB0(SkyboxContext* skyboxCtx, Vtx* roomVtx, s32 arg2, s32 arg3, s3 for (phi_t2_4 = 0, phi_ra = 0; phi_ra < 4; phi_ra++, phi_a2_4 += 0x1F) { for (phi_a0_4 = 0, phi_t1 = 0; phi_t1 < 4; phi_t1++, phi_a0_4 += 0x3F, phi_t2_4 += 4) { - gDPLoadTextureTile(skyboxCtx->unk_138++, (uintptr_t)skyboxCtx->staticSegments[0] + D_8012AC90[arg8], + gDPLoadTextureTile(skyboxCtx->unk_138++, skyboxCtx->textures[0][arg8], G_IM_FMT_CI, G_IM_SIZ_8b, 256, 0, phi_a0_4, phi_a2_4, phi_a0_4 + 0x3F, phi_a2_4 + 0x1F, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD); @@ -360,11 +360,11 @@ s32 func_800AE2C0(SkyboxContext* skyboxCtx, Vtx* roomVtx, s32 arg2, s32 arg3, s3 phi_a2_4 = 0; for (phi_t2_4 = 0, phi_ra = 0; phi_ra < 4; phi_ra++, phi_a2_4 += 0x1F) { for (phi_a0_4 = 0, phi_t1 = 0; phi_t1 < 4; phi_t1++, phi_a0_4 += 0x1F, phi_t2_4 += 4) { - gDPLoadMultiTile(skyboxCtx->unk_138++, (uintptr_t)skyboxCtx->staticSegments[0] + D_8012ADC0[arg8], 0, + gDPLoadMultiTile(skyboxCtx->unk_138++, skyboxCtx->textures[0][arg8], 0, G_TX_RENDERTILE, G_IM_FMT_CI, G_IM_SIZ_8b, 128, 0, phi_a0_4, phi_a2_4, phi_a0_4 + 0x1F, phi_a2_4 + 0x1F, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD); - gDPLoadMultiTile(skyboxCtx->unk_138++, (uintptr_t)skyboxCtx->staticSegments[1] + D_8012ADC0[arg8], 0x80, 1, + gDPLoadMultiTile(skyboxCtx->unk_138++, skyboxCtx->textures[1][arg8], 0x80, 1, G_IM_FMT_CI, G_IM_SIZ_8b, 128, 0, phi_a0_4, phi_a2_4, phi_a0_4 + 0x1F, phi_a2_4 + 0x1F, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD); @@ -379,11 +379,11 @@ s32 func_800AE2C0(SkyboxContext* skyboxCtx, Vtx* roomVtx, s32 arg2, s32 arg3, s3 phi_a2_4 = 0; for (phi_t2_4 = 0, phi_ra = 0; phi_ra < 2; phi_ra++, phi_a2_4 += 0x1F) { for (phi_a0_4 = 0, phi_t1 = 0; phi_t1 < 4; phi_t1++, phi_a0_4 += 0x1F, phi_t2_4 += 4) { - gDPLoadMultiTile(skyboxCtx->unk_138++, (uintptr_t)skyboxCtx->staticSegments[0] + D_8012ADC0[arg8], 0, + gDPLoadMultiTile(skyboxCtx->unk_138++, skyboxCtx->textures[0][arg8], 0, G_TX_RENDERTILE, G_IM_FMT_CI, G_IM_SIZ_8b, 128, 0, phi_a0_4, phi_a2_4, phi_a0_4 + 0x1F, phi_a2_4 + 0x1F, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD); - gDPLoadMultiTile(skyboxCtx->unk_138++, (uintptr_t)skyboxCtx->staticSegments[1] + D_8012ADC0[arg8], 0x80, 1, + gDPLoadMultiTile(skyboxCtx->unk_138++, skyboxCtx->textures[1][arg8], 0x80, 1, G_IM_FMT_CI, G_IM_SIZ_8b, 128, 0, phi_a0_4, phi_a2_4, phi_a0_4 + 0x1F, phi_a2_4 + 0x1F, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD); @@ -394,11 +394,11 @@ s32 func_800AE2C0(SkyboxContext* skyboxCtx, Vtx* roomVtx, s32 arg2, s32 arg3, s3 phi_a2_4 -= 0x1F; for (phi_ra = 0; phi_ra < 2; phi_ra++, phi_a2_4 -= 0x1F) { for (phi_a0_4 = 0, phi_t1 = 0; phi_t1 < 4; phi_t1++, phi_a0_4 += 0x1F, phi_t2_4 += 4) { - gDPLoadMultiTile(skyboxCtx->unk_138++, (uintptr_t)skyboxCtx->staticSegments[0] + D_8012ADC0[arg8], 0, + gDPLoadMultiTile(skyboxCtx->unk_138++, skyboxCtx->textures[0][arg8], 0, G_TX_RENDERTILE, G_IM_FMT_CI, G_IM_SIZ_8b, 128, 0, phi_a0_4, phi_a2_4, phi_a0_4 + 0x1F, phi_a2_4 + 0x1F, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD); - gDPLoadMultiTile(skyboxCtx->unk_138++, (uintptr_t)skyboxCtx->staticSegments[1] + D_8012ADC0[arg8], 0x80, 1, + gDPLoadMultiTile(skyboxCtx->unk_138++, skyboxCtx->textures[1][arg8], 0x80, 1, G_IM_FMT_CI, G_IM_SIZ_8b, 128, 0, phi_a0_4, phi_a2_4, phi_a0_4 + 0x1F, phi_a2_4 + 0x1F, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD); @@ -444,25 +444,20 @@ void func_800AF178(SkyboxContext* skyboxCtx, s32 arg1) { } } -void LoadSkyboxTex(GlobalContext* globalCtx, SkyboxContext* skyboxCtx, int segmentIndex, int imageIndex, char* tex, int width, int height, int offsetW, int offsetH) +void LoadSkyboxTex(SkyboxContext* skyboxCtx, int segmentIndex, int imageIndex, char* tex, int width, int height, int offsetW, int offsetH) { - if (globalCtx != NULL && globalCtx->state.gfxCtx != NULL && globalCtx->state.gfxCtx != 0xABABABAB) - gSPInvalidateTexCache(globalCtx->state.gfxCtx->polyOpa.p++, ((uintptr_t)skyboxCtx->staticSegments[segmentIndex] + (imageIndex * (offsetW * offsetH)))); - - memcpy((uintptr_t)skyboxCtx->staticSegments[segmentIndex] + (imageIndex * (offsetW * offsetH)), ResourceMgr_LoadTexByName(tex), width * height); + skyboxCtx->textures[segmentIndex][imageIndex] = tex; } -void LoadSkyboxTexAtOffset(SkyboxContext* skyboxCtx, int segmentIndex, char* tex, int width, int height, int offset) +void LoadSkyboxTexAtOffset(SkyboxContext* skyboxCtx, int segmentIndex, int imageIndex, char* tex, int width, int height, int offset) { - memcpy((uintptr_t)skyboxCtx->staticSegments[segmentIndex] + offset, ResourceMgr_LoadTexByName(tex), width * height); + skyboxCtx->textures[segmentIndex][imageIndex] = tex; } -void LoadSkyboxPalette(GlobalContext* globalCtx, SkyboxContext* skyboxCtx, int paletteIndex, char* palTex, int width, +void LoadSkyboxPalette(SkyboxContext* skyboxCtx, int paletteIndex, char* palTex, int width, int height) { - if (globalCtx != NULL && globalCtx->state.gfxCtx != NULL && globalCtx->state.gfxCtx != 0xABABABAB) - gSPInvalidateTexCache(globalCtx->state.gfxCtx->polyOpa.p++, (uintptr_t)skyboxCtx->palettes + (paletteIndex * (width * height * 2))); - - memcpy((uintptr_t)skyboxCtx->palettes + (paletteIndex * (width * height * 2)), ResourceMgr_LoadTexByName(palTex), width * height * 2); + skyboxCtx->palettes[paletteIndex] = palTex; + skyboxCtx->palette_size = width * height; } static const char* sSBVRFine0Tex[] = @@ -634,376 +629,316 @@ void Skybox_Setup(GlobalContext* globalCtx, SkyboxContext* skyboxCtx, s16 skybox } - skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, (128 * 64 * 4) + (128 * 128), "../z_vr_box.c", 1054); - SkyboxTableEntry entryA = sSkyboxTable[sp41]; for (int i = 0; i < 5; i++) - LoadSkyboxTex(globalCtx, skyboxCtx, 0, i, entryA.textures[i], 128, i == 4 ? 128 : 64, 128, 64); + LoadSkyboxTex(skyboxCtx, 0, i, entryA.textures[i], 128, i == 4 ? 128 : 64, 128, 64); SkyboxTableEntry entryB = sSkyboxTable[sp40]; - skyboxCtx->staticSegments[1] = GameState_Alloc(&globalCtx->state, (128 * 64 * 4) + (128 * 128), "../z_vr_box.c", 1060); - for (int i = 0; i < 5; i++) - LoadSkyboxTex(globalCtx, skyboxCtx, 1, i, entryB.textures[i], 128, i == 4 ? 128 : 64, 128, 64); + LoadSkyboxTex(skyboxCtx, 1, i, entryB.textures[i], 128, i == 4 ? 128 : 64, 128, 64); if ((sp41 & 1) ^ ((sp41 & 4) >> 2)) { - skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 256 * 2, "../z_vr_box.c", 1072); - LoadSkyboxPalette(globalCtx, skyboxCtx, 0, entryA.palettes[0], 16, 8); - LoadSkyboxPalette(globalCtx, skyboxCtx, 1, entryB.palettes[0], 16, 8); + LoadSkyboxPalette(skyboxCtx, 0, entryA.palettes[0], 16, 8); + LoadSkyboxPalette(skyboxCtx, 1, entryB.palettes[0], 16, 8); } else { - skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 256 * 2, "../z_vr_box.c", 1085); - LoadSkyboxPalette(globalCtx, skyboxCtx, 0, entryB.palettes[0], 16, 8); - LoadSkyboxPalette(globalCtx, skyboxCtx, 1, entryA.palettes[0], 16, 8); + LoadSkyboxPalette(skyboxCtx, 0, entryB.palettes[0], 16, 8); + LoadSkyboxPalette(skyboxCtx, 1, entryA.palettes[0], 16, 8); } break; case SKYBOX_BAZAAR: skyboxCtx->unk_140 = 1; - skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 2, "../z_vr_box.c", 1226); + LoadSkyboxTex(skyboxCtx, 0, 0, gBazaarBgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 1, gBazaar2BgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gBazaarBgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gBazaar2BgTex, 256, 256, 256, 256); - - skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 2, "../z_vr_box.c", 1231); - - LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gBazaarBgTlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gBazaarBg2Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 0, gBazaarBgTlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 1, gBazaarBg2Tlut, 16, 16); skyboxCtx->rot.y = 0.8f; break; case SKYBOX_HOUSE_LINK: skyboxCtx->unk_140 = 1; - skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 4, "../z_vr_box.c", 1226); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gLinksHouseBgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gLinksHouse2BgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 2, gLinksHouse3BgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 3, gLinksHouse4BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 0, gLinksHouseBgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 1, gLinksHouse2BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 2, gLinksHouse3BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 3, gLinksHouse4BgTex, 256, 256, 256, 256); - skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 4, "../z_vr_box.c", 1231); - LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gLinksHouseBgTlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gLinksHouseBg2Tlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 2, gLinksHouseBg3Tlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 3, gLinksHouseBg4Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 0, gLinksHouseBgTlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 1, gLinksHouseBg2Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 2, gLinksHouseBg3Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 3, gLinksHouseBg4Tlut, 16, 16); break; case SKYBOX_OVERCAST_SUNSET: - skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0xC000, "../z_vr_box.c", 1226); - LoadSkyboxTexAtOffset(skyboxCtx, 0, gSunsetOvercastSkybox1Tex, 128, 64, 0x0); - LoadSkyboxTexAtOffset(skyboxCtx, 0, gSunsetOvercastSkybox2Tex, 128, 64, 0x2000); - LoadSkyboxTexAtOffset(skyboxCtx, 0, gSunsetOvercastSkybox3Tex, 128, 64, 0x4000); - LoadSkyboxTexAtOffset(skyboxCtx, 0, gSunsetOvercastSkybox4Tex, 128, 64, 0x6000); - LoadSkyboxTexAtOffset(skyboxCtx, 0, gSunsetOvercastSkybox5Tex, 128, 128, 0x8000); + LoadSkyboxTexAtOffset(skyboxCtx, 0, 0, gSunsetOvercastSkybox1Tex, 128, 64, 0x0); + LoadSkyboxTexAtOffset(skyboxCtx, 0, 1, gSunsetOvercastSkybox2Tex, 128, 64, 0x2000); + LoadSkyboxTexAtOffset(skyboxCtx, 0, 2, gSunsetOvercastSkybox3Tex, 128, 64, 0x4000); + LoadSkyboxTexAtOffset(skyboxCtx, 0, 3, gSunsetOvercastSkybox4Tex, 128, 64, 0x6000); + LoadSkyboxTexAtOffset(skyboxCtx, 0, 4, gSunsetOvercastSkybox5Tex, 128, 128, 0x8000); - skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x100, "../z_vr_box.c", 1231); - LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gSunsetOvercastSkyboxTlut, 16, 8); + LoadSkyboxPalette(skyboxCtx, 0, gSunsetOvercastSkyboxTlut, 16, 8); break; case SKYBOX_MARKET_ADULT: skyboxCtx->unk_140 = 1; - skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 4, "../z_vr_box.c", 1226); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gMarketRuinsBgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gMarketRuins2BgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 2, gMarketRuins3BgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 3, gMarketRuins4BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 0, gMarketRuinsBgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 1, gMarketRuins2BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 2, gMarketRuins3BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 3, gMarketRuins4BgTex, 256, 256, 256, 256); - skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 4, "../z_vr_box.c", 1231); - LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gMarketRuinsBgTlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gMarketRuinsBg2Tlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 2, gMarketRuinsBg3Tlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 3, gMarketRuinsBg4Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 0, gMarketRuinsBgTlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 1, gMarketRuinsBg2Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 2, gMarketRuinsBg3Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 3, gMarketRuinsBg4Tlut, 16, 16); break; case SKYBOX_CUTSCENE_MAP: - skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000, "../z_vr_box.c", 1226); - LoadSkyboxTexAtOffset(skyboxCtx, 0, gHoly0Skybox1Tex, 128, 64, 0x0); - LoadSkyboxTexAtOffset(skyboxCtx, 0, gHoly0Skybox2Tex, 128, 64, 0x2000); - LoadSkyboxTexAtOffset(skyboxCtx, 0, gHoly0Skybox3Tex, 128, 64, 0x4000); - LoadSkyboxTexAtOffset(skyboxCtx, 0, gHoly0Skybox4Tex, 128, 64, 0x6000); - LoadSkyboxTexAtOffset(skyboxCtx, 0, gHoly0Skybox5Tex, 128, 128, 0x8000); - LoadSkyboxTexAtOffset(skyboxCtx, 0, gHoly0Skybox6Tex, 128, 128, 0xC000); + LoadSkyboxTexAtOffset(skyboxCtx, 0, 0, gHoly0Skybox1Tex, 128, 64, 0x0); + LoadSkyboxTexAtOffset(skyboxCtx, 0, 1, gHoly0Skybox2Tex, 128, 64, 0x2000); + LoadSkyboxTexAtOffset(skyboxCtx, 0, 2, gHoly0Skybox3Tex, 128, 64, 0x4000); + LoadSkyboxTexAtOffset(skyboxCtx, 0, 3, gHoly0Skybox4Tex, 128, 64, 0x6000); + LoadSkyboxTexAtOffset(skyboxCtx, 0, 4, gHoly0Skybox5Tex, 128, 128, 0x8000); + LoadSkyboxTexAtOffset(skyboxCtx, 0, 5, gHoly0Skybox6Tex, 128, 128, 0xC000); - skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x100 * 2, "../z_vr_box.c", 1231); - LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gHoly0SkyboxTlut, 16, 8); + LoadSkyboxPalette(skyboxCtx, 0, gHoly0SkyboxTlut, 16, 8); - skyboxCtx->staticSegments[1] = GameState_Alloc(&globalCtx->state, 0x10000, "../z_vr_box.c", 1226); - LoadSkyboxTexAtOffset(skyboxCtx, 1, gHoly1Skybox1Tex, 128, 64, 0x0); - LoadSkyboxTexAtOffset(skyboxCtx, 1, gHoly1Skybox2Tex, 128, 64, 0x2000); - LoadSkyboxTexAtOffset(skyboxCtx, 1, gHoly1Skybox3Tex, 128, 64, 0x4000); - LoadSkyboxTexAtOffset(skyboxCtx, 1, gHoly1Skybox4Tex, 128, 64, 0x6000); - LoadSkyboxTexAtOffset(skyboxCtx, 1, gHoly1Skybox5Tex, 128, 128, 0x8000); - LoadSkyboxTexAtOffset(skyboxCtx, 1, gHoly1Skybox6Tex, 128, 128, 0xC000); + LoadSkyboxTexAtOffset(skyboxCtx, 1, 0, gHoly1Skybox1Tex, 128, 64, 0x0); + LoadSkyboxTexAtOffset(skyboxCtx, 1, 1, gHoly1Skybox2Tex, 128, 64, 0x2000); + LoadSkyboxTexAtOffset(skyboxCtx, 1, 2, gHoly1Skybox3Tex, 128, 64, 0x4000); + LoadSkyboxTexAtOffset(skyboxCtx, 1, 3, gHoly1Skybox4Tex, 128, 64, 0x6000); + LoadSkyboxTexAtOffset(skyboxCtx, 1, 4, gHoly1Skybox5Tex, 128, 128, 0x8000); + LoadSkyboxTexAtOffset(skyboxCtx, 1, 5, gHoly1Skybox6Tex, 128, 128, 0xC000); - LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gHoly1SkyboxTlut, 16, 8); + LoadSkyboxPalette(skyboxCtx, 1, gHoly1SkyboxTlut, 16, 8); break; case SKYBOX_MARKET_CHILD_DAY: skyboxCtx->unk_140 = 1; - skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 4, "../z_vr_box.c", 1226); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gMarketDayBgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gMarketDay2BgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 2, gMarketDay3BgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 3, gMarketDay4BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 0, gMarketDayBgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 1, gMarketDay2BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 2, gMarketDay3BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 3, gMarketDay4BgTex, 256, 256, 256, 256); - skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 4, "../z_vr_box.c", 1231); - LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gMarketDayBgTlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gMarketDayBg2Tlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 2, gMarketDayBg3Tlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 3, gMarketDayBg4Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 0, gMarketDayBgTlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 1, gMarketDayBg2Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 2, gMarketDayBg3Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 3, gMarketDayBg4Tlut, 16, 16); break; case SKYBOX_MARKET_CHILD_NIGHT: skyboxCtx->unk_140 = 1; - skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 4, "../z_vr_box.c", 1226); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gMarketNightBgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gMarketNight2BgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 2, gMarketNight3BgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 3, gMarketNight4BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 0, gMarketNightBgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 1, gMarketNight2BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 2, gMarketNight3BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 3, gMarketNight4BgTex, 256, 256, 256, 256); - skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 4, "../z_vr_box.c", 1231); - LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gMarketNightBgTlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gMarketNightBg2Tlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 2, gMarketNightBg3Tlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 3, gMarketNightBg4Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 0, gMarketNightBgTlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 1, gMarketNightBg2Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 2, gMarketNightBg3Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 3, gMarketNightBg4Tlut, 16, 16); break; case SKYBOX_HAPPY_MASK_SHOP: skyboxCtx->unk_140 = 1; - skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 2, "../z_vr_box.c", 1226); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gMaskShopBgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gMaskShop2BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 0, gMaskShopBgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 1, gMaskShop2BgTex, 256, 256, 256, 256); - skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 2, "../z_vr_box.c", 1231); - LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gMaskShopBgTlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gMaskShopBg2Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 0, gMaskShopBgTlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 1, gMaskShopBg2Tlut, 16, 16); skyboxCtx->rot.y = 0.8f; break; case SKYBOX_HOUSE_KNOW_IT_ALL_BROTHERS: skyboxCtx->unk_140 = 1; - skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 4, "../z_vr_box.c", 1226); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gKnowItAllBrosHouseBgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gKnowItAllBrosHouse2BgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 2, gKnowItAllBrosHouse3BgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 3, gKnowItAllBrosHouse4BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 0, gKnowItAllBrosHouseBgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 1, gKnowItAllBrosHouse2BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 2, gKnowItAllBrosHouse3BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 3, gKnowItAllBrosHouse4BgTex, 256, 256, 256, 256); - skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 4, "../z_vr_box.c", 1231); - LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gKnowItAllBrosHouseBgTlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gKnowItAllBrosHouseBg2Tlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 2, gKnowItAllBrosHouseBg3Tlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 3, gKnowItAllBrosHouseBg4Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 0, gKnowItAllBrosHouseBgTlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 1, gKnowItAllBrosHouseBg2Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 2, gKnowItAllBrosHouseBg3Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 3, gKnowItAllBrosHouseBg4Tlut, 16, 16); break; case SKYBOX_HOUSE_OF_TWINS: skyboxCtx->unk_140 = 2; - skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 3, "../z_vr_box.c", 1226); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gHouseOfTwinsBgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gHouseOfTwins2BgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 2, gHouseOfTwins3BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 0, gHouseOfTwinsBgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 1, gHouseOfTwins2BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 2, gHouseOfTwins3BgTex, 256, 256, 256, 256); - skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 3, "../z_vr_box.c", 1231); - LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gHouseOfTwinsBgTlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gHouseOfTwinsBg2Tlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 2, gHouseOfTwinsBg3Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 0, gHouseOfTwinsBgTlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 1, gHouseOfTwinsBg2Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 2, gHouseOfTwinsBg3Tlut, 16, 16); break; case SKYBOX_STABLES: skyboxCtx->unk_140 = 1; - skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 4, "../z_vr_box.c", 1226); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gStableBgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gStable2BgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 2, gStable3BgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 3, gStable4BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 0, gStableBgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 1, gStable2BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 2, gStable3BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 3, gStable4BgTex, 256, 256, 256, 256); - skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 4, "../z_vr_box.c", 1231); - LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gStableBgTlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gStableBg2Tlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 2, gStableBg3Tlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 3, gStableBg4Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 0, gStableBgTlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 1, gStableBg2Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 2, gStableBg3Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 3, gStableBg4Tlut, 16, 16); break; case SKYBOX_HOUSE_KAKARIKO: skyboxCtx->unk_140 = 1; - skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 4, "../z_vr_box.c", 1226); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gCarpentersHouseBgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gCarpentersHouse2BgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 2, gCarpentersHouse3BgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 3, gCarpentersHouse4BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 0, gCarpentersHouseBgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 1, gCarpentersHouse2BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 2, gCarpentersHouse3BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 3, gCarpentersHouse4BgTex, 256, 256, 256, 256); - skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 4, "../z_vr_box.c", 1231); - LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gCarpentersHouseBgTlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gCarpentersHouseBg2Tlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 2, gCarpentersHouseBg3Tlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 3, gCarpentersHouseBg4Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 0, gCarpentersHouseBgTlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 1, gCarpentersHouseBg2Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 2, gCarpentersHouseBg3Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 3, gCarpentersHouseBg4Tlut, 16, 16); break; case SKYBOX_KOKIRI_SHOP: skyboxCtx->unk_140 = 1; - skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 2, "../z_vr_box.c", 1226); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gKokiriShopBgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gKokiriShop2BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 0, gKokiriShopBgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 1, gKokiriShop2BgTex, 256, 256, 256, 256); - skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 2, "../z_vr_box.c", 1231); - LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gKokiriShopBgTlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gKokiriShopBg2Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 0, gKokiriShopBgTlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 1, gKokiriShopBg2Tlut, 16, 16); skyboxCtx->rot.y = 0.8f; break; case SKYBOX_GORON_SHOP: skyboxCtx->unk_140 = 1; - skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 2, "../z_vr_box.c", 1226); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gGoronShopBgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gGoronShop2BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 0, gGoronShopBgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 1, gGoronShop2BgTex, 256, 256, 256, 256); - skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 2, "../z_vr_box.c", 1231); - LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gGoronShopBgTlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gGoronShopBg2Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 0, gGoronShopBgTlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 1, gGoronShopBg2Tlut, 16, 16); skyboxCtx->rot.y = 0.8f; break; case SKYBOX_ZORA_SHOP: skyboxCtx->unk_140 = 1; - skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 2, "../z_vr_box.c", 1226); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gZoraShopBgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gZoraShop2BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 0, gZoraShopBgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 1, gZoraShop2BgTex, 256, 256, 256, 256); - skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 2, "../z_vr_box.c", 1231); - LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gZoraShopBgTlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gZoraShopBg2Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 0, gZoraShopBgTlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 1, gZoraShopBg2Tlut, 16, 16); skyboxCtx->rot.y = 0.8f; break; case SKYBOX_POTION_SHOP_KAKARIKO: skyboxCtx->unk_140 = 1; - skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 2, "../z_vr_box.c", 1226); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gKakPotionShopBgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gKakPotionShop2BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 0, gKakPotionShopBgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 1, gKakPotionShop2BgTex, 256, 256, 256, 256); - skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 2, "../z_vr_box.c", 1231); - LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gKakPotionShopBgTlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gKakPotionShopBg2Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 0, gKakPotionShopBgTlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 1, gKakPotionShopBg2Tlut, 16, 16); skyboxCtx->rot.y = 0.8f; break; case SKYBOX_POTION_SHOP_MARKET: skyboxCtx->unk_140 = 1; - skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 2, "../z_vr_box.c", 1226); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gMarketPotionShopBgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gMarketPotionShop2BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 0, gMarketPotionShopBgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 1, gMarketPotionShop2BgTex, 256, 256, 256, 256); - skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 2, "../z_vr_box.c", 1231); - LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gMarketPotionShopBgTlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gMarketPotionShopBg2Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 0, gMarketPotionShopBgTlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 1, gMarketPotionShopBg2Tlut, 16, 16); skyboxCtx->rot.y = 0.8f; break; case SKYBOX_BOMBCHU_SHOP: skyboxCtx->unk_140 = 1; - skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 2, "../z_vr_box.c", 1226); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gBombchuShopBgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gBombchuShop2BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 0, gBombchuShopBgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 1, gBombchuShop2BgTex, 256, 256, 256, 256); - skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 2, "../z_vr_box.c", 1231); - LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gBombchuShopBgTlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gBombchuShopBg2Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 0, gBombchuShopBgTlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 1, gBombchuShopBg2Tlut, 16, 16); skyboxCtx->rot.y = 0.8f; break; case SKYBOX_HOUSE_RICHARD: skyboxCtx->unk_140 = 1; - skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 4, "../z_vr_box.c", 1226); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gRichardsHouseBgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gRichardsHouse2BgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 2, gRichardsHouse3BgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 3, gRichardsHouse4BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 0, gRichardsHouseBgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 1, gRichardsHouse2BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 2, gRichardsHouse3BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 3, gRichardsHouse4BgTex, 256, 256, 256, 256); - skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 4, "../z_vr_box.c", 1231); - LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gRichardsHouseBgTlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gRichardsHouseBg2Tlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 2, gRichardsHouseBg3Tlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 3, gRichardsHouseBg4Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 0, gRichardsHouseBgTlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 1, gRichardsHouseBg2Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 2, gRichardsHouseBg3Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 3, gRichardsHouseBg4Tlut, 16, 16); break; case SKYBOX_HOUSE_IMPA: skyboxCtx->unk_140 = 1; - skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 4, "../z_vr_box.c", 1226); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gCowHouseBgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gCowHouse2BgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 2, gCowHouse3BgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 3, gCowHouse4BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 0, gCowHouseBgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 1, gCowHouse2BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 2, gCowHouse3BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 3, gCowHouse4BgTex, 256, 256, 256, 256); - skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 4, "../z_vr_box.c", 1231); - LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gCowHouseBgTlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gCowHouseBg2Tlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 2, gCowHouseBg3Tlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 3, gCowHouseBg4Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 0, gCowHouseBgTlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 1, gCowHouseBg2Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 2, gCowHouseBg3Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 3, gCowHouseBg4Tlut, 16, 16); break; case SKYBOX_TENT: skyboxCtx->unk_140 = 2; - skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 3, "../z_vr_box.c", 1226); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gCarpentersTentBgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gCarpentersTent2BgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 2, gCarpentersTent3BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 0, gCarpentersTentBgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 1, gCarpentersTent2BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 2, gCarpentersTent3BgTex, 256, 256, 256, 256); - skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 3, "../z_vr_box.c", 1231); - LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gCarpentersTentBgTlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gCarpentersTentBg2Tlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 2, gCarpentersTentBg3Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 0, gCarpentersTentBgTlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 1, gCarpentersTentBg2Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 2, gCarpentersTentBg3Tlut, 16, 16); break; case SKYBOX_HOUSE_MIDO: skyboxCtx->unk_140 = 2; - skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 3, "../z_vr_box.c", 1226); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gMidosHouseBgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gMidosHouse2BgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 2, gMidosHouse3BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 0, gMidosHouseBgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 1, gMidosHouse2BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 2, gMidosHouse3BgTex, 256, 256, 256, 256); - skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 3, "../z_vr_box.c", 1231); - LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gMidosHouseBgTlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gMidosHouseBg2Tlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 2, gMidosHouseBg3Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 0, gMidosHouseBgTlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 1, gMidosHouseBg2Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 2, gMidosHouseBg3Tlut, 16, 16); break; case SKYBOX_HOUSE_SARIA: skyboxCtx->unk_140 = 2; - skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 3, "../z_vr_box.c", 1226); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gSariasHouseBgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gSariasHouse2BgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 2, gSariasHouse3BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 0, gSariasHouseBgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 1, gSariasHouse2BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 2, gSariasHouse3BgTex, 256, 256, 256, 256); - skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 3, "../z_vr_box.c", 1231); - LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gSariasHouseBgTlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gSariasHouseBg2Tlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 2, gSariasHouseBg3Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 0, gSariasHouseBgTlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 1, gSariasHouseBg2Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 2, gSariasHouseBg3Tlut, 16, 16); break; case SKYBOX_HOUSE_ALLEY: skyboxCtx->unk_140 = 2; - skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 3, "../z_vr_box.c", 1226); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gBackAlleyHouseBgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gBackAlleyHouse2BgTex, 256, 256, 256, 256); - LoadSkyboxTex(globalCtx, skyboxCtx, 0, 2, gBackAlleyHouse3BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 0, gBackAlleyHouseBgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 1, gBackAlleyHouse2BgTex, 256, 256, 256, 256); + LoadSkyboxTex(skyboxCtx, 0, 2, gBackAlleyHouse3BgTex, 256, 256, 256, 256); - skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 3, "../z_vr_box.c", 1231); - LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gBackAlleyHouseBgTlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gBackAlleyHouseBg2Tlut, 16, 16); - LoadSkyboxPalette(globalCtx, skyboxCtx, 2, gBackAlleyHouseBg3Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 0, gBackAlleyHouseBgTlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 1, gBackAlleyHouseBg2Tlut, 16, 16); + LoadSkyboxPalette(skyboxCtx, 2, gBackAlleyHouseBg3Tlut, 16, 16); break; default: - skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 4, "../z_vr_box.c", 1226); - skyboxCtx->staticSegments[1] = GameState_Alloc(&globalCtx->state, 0x10000 * 4, "../z_vr_box.c", 1226); - skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x1000, "../z_vr_box.c", 1226); break; } } @@ -1011,6 +946,7 @@ void Skybox_Setup(GlobalContext* globalCtx, SkyboxContext* skyboxCtx, s16 skybox void Skybox_Init(GameState* state, SkyboxContext* skyboxCtx, s16 skyboxId) { GlobalContext* globalCtx = (GlobalContext*)state; + skyboxCtx->skyboxId = skyboxId; skyboxCtx->unk_140 = 0; skyboxCtx->rot.x = skyboxCtx->rot.y = skyboxCtx->rot.z = 0.0f; @@ -1050,3 +986,20 @@ void Skybox_Init(GameState* state, SkyboxContext* skyboxCtx, s16 skyboxId) { osSyncPrintf(VT_RST); } } + +void Skybox_Update(SkyboxContext* skyboxCtx) { + if (skyboxCtx->skyboxId != SKYBOX_NONE) { + osSyncPrintf(VT_FGCOL(GREEN)); + + if (skyboxCtx->unk_140 != 0) { + func_800AEFC8(skyboxCtx, skyboxCtx->skyboxId); + } else { + if (skyboxCtx->skyboxId == SKYBOX_CUTSCENE_MAP) { + func_800AF178(skyboxCtx, 6); + } else { + func_800AF178(skyboxCtx, 5); + } + } + osSyncPrintf(VT_RST); + } +} diff --git a/soh/src/code/z_vr_box_draw.c b/soh/src/code/z_vr_box_draw.c index a5c0610f7..292789333 100644 --- a/soh/src/code/z_vr_box_draw.c +++ b/soh/src/code/z_vr_box_draw.c @@ -17,22 +17,10 @@ void SkyboxDraw_Draw(SkyboxContext* skyboxCtx, GraphicsContext* gfxCtx, s16 skyb func_800945A0(gfxCtx); //gsSPShaderTest(POLY_OPA_DISP++); - gSPInvalidateTexCache(POLY_OPA_DISP++, 0); - - // OTRTODO: Not working... - /*for (int i = 0; i < 8; i++) - { - if (skyboxCtx->staticSegments[0] != NULL) - gSPInvalidateTexCache(POLY_OPA_DISP++, (uintptr_t)skyboxCtx->staticSegments[0] + (0x10000 * i)); - - if (skyboxCtx->staticSegments[1] != NULL) - gSPInvalidateTexCache(POLY_OPA_DISP++, (uintptr_t)skyboxCtx->staticSegments[1] + (0x10000 * i)); - }*/ - - gSPSegment(POLY_OPA_DISP++, 0x7, skyboxCtx->staticSegments[0]); + /*gSPSegment(POLY_OPA_DISP++, 0x7, skyboxCtx->staticSegments[0]); gSPSegment(POLY_OPA_DISP++, 0x8, skyboxCtx->staticSegments[1]); - gSPSegment(POLY_OPA_DISP++, 0x9, skyboxCtx->palettes); + gSPSegment(POLY_OPA_DISP++, 0x9, skyboxCtx->palettes);*/ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 0, 0, 0, blend); gSPTexture(POLY_OPA_DISP++, 0x8000, 0x8000, 0, G_TX_RENDERTILE, G_ON); @@ -50,7 +38,12 @@ void SkyboxDraw_Draw(SkyboxContext* skyboxCtx, GraphicsContext* gfxCtx, s16 skyb gDPSetColorDither(POLY_OPA_DISP++, G_CD_MAGICSQ); gDPSetTextureFilter(POLY_OPA_DISP++, G_TF_BILERP); - gDPLoadTLUT_pal256(POLY_OPA_DISP++, skyboxCtx->palettes[0]); + if (skyboxCtx->palette_size == 256) { + gDPLoadTLUT_pal256(POLY_OPA_DISP++, skyboxCtx->palettes[0]); + } else { + gDPLoadTLUT_pal128(POLY_OPA_DISP++, 0, skyboxCtx->palettes[0]); + gDPLoadTLUT_pal128(POLY_OPA_DISP++, 1, skyboxCtx->palettes[1]); + } gDPSetTextureLUT(POLY_OPA_DISP++, G_TT_RGBA16); gDPSetTextureConvert(POLY_OPA_DISP++, G_TC_FILT); From 6f49bc9a56f8cd4c4659fa26b01b9601f83b806f Mon Sep 17 00:00:00 2001 From: MegaMech Date: Fri, 1 Apr 2022 22:44:03 -0700 Subject: [PATCH 21/83] Update Globals.cpp --- ZAPDTR/ZAPD/Globals.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/ZAPDTR/ZAPD/Globals.cpp b/ZAPDTR/ZAPD/Globals.cpp index f0df0e547..455205b2a 100644 --- a/ZAPDTR/ZAPD/Globals.cpp +++ b/ZAPDTR/ZAPD/Globals.cpp @@ -20,6 +20,7 @@ Globals::Globals() profile = false; useLegacyZDList = false; useExternalResources = true; + singleThreaded = true; verbosity = VerbosityLevel::VERBOSITY_SILENT; outputPath = Directory::GetCurrentDirectory(); } From ea91d36351fc62ba0196180de7aa82d8b51f7b65 Mon Sep 17 00:00:00 2001 From: MegaMech Date: Fri, 1 Apr 2022 22:46:08 -0700 Subject: [PATCH 22/83] Update nes_message_data_static.xml --- soh/assets/xml/GC_NMQ_D/text/nes_message_data_static.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/soh/assets/xml/GC_NMQ_D/text/nes_message_data_static.xml b/soh/assets/xml/GC_NMQ_D/text/nes_message_data_static.xml index d7c0559c5..e2d39a916 100644 --- a/soh/assets/xml/GC_NMQ_D/text/nes_message_data_static.xml +++ b/soh/assets/xml/GC_NMQ_D/text/nes_message_data_static.xml @@ -1,5 +1,5 @@ - + - \ No newline at end of file + From 6acb8d20b40a654e8c4494654161d82e09c90813 Mon Sep 17 00:00:00 2001 From: MegaMech Date: Fri, 1 Apr 2022 22:46:28 -0700 Subject: [PATCH 23/83] Update staff_message_data_static.xml --- soh/assets/xml/GC_NMQ_D/text/staff_message_data_static.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/soh/assets/xml/GC_NMQ_D/text/staff_message_data_static.xml b/soh/assets/xml/GC_NMQ_D/text/staff_message_data_static.xml index 447b91ccd..f675929e1 100644 --- a/soh/assets/xml/GC_NMQ_D/text/staff_message_data_static.xml +++ b/soh/assets/xml/GC_NMQ_D/text/staff_message_data_static.xml @@ -1,5 +1,5 @@ - + - \ No newline at end of file + From 1e938866ac2d52845c55bf6fd42cf9e68a8b7e84 Mon Sep 17 00:00:00 2001 From: MegaMech Date: Fri, 1 Apr 2022 22:48:52 -0700 Subject: [PATCH 24/83] Update nes_message_data_static.xml --- soh/assets/xml/GC_NMQ_PAL_F/text/nes_message_data_static.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/soh/assets/xml/GC_NMQ_PAL_F/text/nes_message_data_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/text/nes_message_data_static.xml index d77bf0ff8..e1e6dd148 100644 --- a/soh/assets/xml/GC_NMQ_PAL_F/text/nes_message_data_static.xml +++ b/soh/assets/xml/GC_NMQ_PAL_F/text/nes_message_data_static.xml @@ -1,5 +1,5 @@ - + - \ No newline at end of file + From a02982794418af1b2aefe1e0bf98630b3763be35 Mon Sep 17 00:00:00 2001 From: MegaMech Date: Fri, 1 Apr 2022 22:49:14 -0700 Subject: [PATCH 25/83] Update staff_message_data_static.xml --- .../xml/GC_NMQ_PAL_F/text/staff_message_data_static.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/soh/assets/xml/GC_NMQ_PAL_F/text/staff_message_data_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/text/staff_message_data_static.xml index 395a6b7bd..55d935fb3 100644 --- a/soh/assets/xml/GC_NMQ_PAL_F/text/staff_message_data_static.xml +++ b/soh/assets/xml/GC_NMQ_PAL_F/text/staff_message_data_static.xml @@ -1,5 +1,5 @@ - + - \ No newline at end of file + From 2b4b44f698b14f472aec13d48c70b10a053fb2f9 Mon Sep 17 00:00:00 2001 From: MegaMech Date: Sat, 2 Apr 2022 15:00:16 -0700 Subject: [PATCH 26/83] Update staff_message_data_static.xml --- soh/assets/xml/GC_NMQ_PAL_F/text/staff_message_data_static.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/assets/xml/GC_NMQ_PAL_F/text/staff_message_data_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/text/staff_message_data_static.xml index 55d935fb3..0a7efda81 100644 --- a/soh/assets/xml/GC_NMQ_PAL_F/text/staff_message_data_static.xml +++ b/soh/assets/xml/GC_NMQ_PAL_F/text/staff_message_data_static.xml @@ -1,5 +1,5 @@ - + From 407a9c5371e60f8972b7a364bc54a86cdbbcb85e Mon Sep 17 00:00:00 2001 From: MegaMech Date: Sat, 2 Apr 2022 15:00:47 -0700 Subject: [PATCH 27/83] Update nes_message_data_static.xml --- soh/assets/xml/GC_NMQ_PAL_F/text/nes_message_data_static.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/assets/xml/GC_NMQ_PAL_F/text/nes_message_data_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/text/nes_message_data_static.xml index e1e6dd148..4cf46d252 100644 --- a/soh/assets/xml/GC_NMQ_PAL_F/text/nes_message_data_static.xml +++ b/soh/assets/xml/GC_NMQ_PAL_F/text/nes_message_data_static.xml @@ -1,5 +1,5 @@ - + From e8837cf2475e5ffb3e136b629c904e4bd050c7f4 Mon Sep 17 00:00:00 2001 From: Sirius902 <3645979-Sirius902@users.noreply.gitlab.com> Date: Sun, 3 Apr 2022 16:06:31 -0700 Subject: [PATCH 28/83] Fix title card --- soh/src/overlays/actors/ovl_player_actor/z_player.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 37ab3ed74..a2a810175 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -9434,7 +9434,7 @@ void Player_Init(Actor* thisx, GlobalContext* globalCtx2) { if ((sp50 == 0) || (sp50 < -1)) { titleFileSize = scene->titleFile.vromEnd - scene->titleFile.vromStart; - if ((titleFileSize != 0) && gSaveContext.showTitleCard) { + if (gSaveContext.showTitleCard) { if ((gSaveContext.sceneSetupIndex < 4) && (gEntranceTable[((void)0, gSaveContext.entranceIndex) + ((void)0, gSaveContext.sceneSetupIndex)].field & 0x4000) && From a59317627fe78b4dfe9e0482187ea5b497e3c5bc Mon Sep 17 00:00:00 2001 From: Sirius902 <3645979-Sirius902@users.noreply.gitlab.com> Date: Sun, 3 Apr 2022 16:45:02 -0700 Subject: [PATCH 29/83] Fix Shadow Temple title card --- soh/src/code/z_actor.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c index 92702f866..fee697055 100644 --- a/soh/src/code/z_actor.c +++ b/soh/src/code/z_actor.c @@ -766,9 +766,9 @@ void TitleCard_InitPlaceName(GlobalContext* globalCtx, TitleCardContext* titleCt break; case SCENE_JYASINZOU: texture = gSpiritTempleTitleCardENGTex; - break; + break; case SCENE_HAKADAN: - texture = gSpiritTempleTitleCardENGTex; + texture = gShadowTempleTitleCardENGTex; break; case SCENE_HAKADANCH: texture = gBottomOfTheWellTitleCardENGTex; From c1eb71fa3342ab44f7bf91648afc1e3a126c4485 Mon Sep 17 00:00:00 2001 From: Nicholas Estelami Date: Sun, 3 Apr 2022 15:48:44 -0400 Subject: [PATCH 30/83] Updated python script to use new "extract directory" mode. Additionally fixed oversight with audio files and bug in OTRGui. --- OTRExporter/OTRExporter/Main.cpp | 4 + OTRExporter/extract_assets.py | 99 ++----------------- OTRExporter/extract_assets_old.py | 125 ++++++++++++++++++++++++ OTRGui/src/game/game.cpp | 9 +- OTRGui/src/impl/extractor/extractor.cpp | 1 - ZAPDTR/ZAPD/Main.cpp | 12 --- ZAPDTR/ZAPD/ZFile.cpp | 26 +++++ 7 files changed, 167 insertions(+), 109 deletions(-) create mode 100644 OTRExporter/extract_assets_old.py diff --git a/OTRExporter/OTRExporter/Main.cpp b/OTRExporter/OTRExporter/Main.cpp index e62ed5ef4..a58f94ae3 100644 --- a/OTRExporter/OTRExporter/Main.cpp +++ b/OTRExporter/OTRExporter/Main.cpp @@ -78,6 +78,10 @@ static void ExporterProgramEnd() auto fileData = File::ReadAllBytes(item); otrArchive->AddFile(StringHelper::Split(item, "Extract\\")[1], (uintptr_t)fileData.data(), fileData.size()); } + + otrArchive->AddFile("Audiobank", (uintptr_t)Globals::Instance->GetBaseromFile("Audiobank").data(), Globals::Instance->GetBaseromFile("Audiobank").size()); + otrArchive->AddFile("Audioseq", (uintptr_t)Globals::Instance->GetBaseromFile("Audioseq").data(), Globals::Instance->GetBaseromFile("Audioseq").size()); + otrArchive->AddFile("Audiotable", (uintptr_t)Globals::Instance->GetBaseromFile("Audiotable").data(), Globals::Instance->GetBaseromFile("Audiotable").size()); } } diff --git a/OTRExporter/extract_assets.py b/OTRExporter/extract_assets.py index 2922bbf06..bb9ed177c 100755 --- a/OTRExporter/extract_assets.py +++ b/OTRExporter/extract_assets.py @@ -4,21 +4,11 @@ import argparse, json, os, signal, time, sys, shutil from multiprocessing import Pool, cpu_count, Event, Manager, ProcessError import shutil -def SignalHandler(sig, frame): - print(f'Signal {sig} received. Aborting...') - mainAbort.set() - # Don't exit immediately to update the extracted assets file. - -def BuildOTR(): - shutil.copyfile("baserom/Audiobank", "Extract/Audiobank") - shutil.copyfile("baserom/Audioseq", "Extract/Audioseq") - shutil.copyfile("baserom/Audiotable", "Extract/Audiotable") - +def BuildOTR(xmlPath): shutil.copytree("assets", "Extract/assets") execStr = "x64\\Release\\ZAPD.exe" if sys.platform == "win32" else "../ZAPD/ZAPD.out" - - execStr += " botr -se OTR" + execStr += " ed -i %s -b baserom.z64 -fl CFG\\filelists -o placeholder -osf placeholder -gsf 1 -rconf CFG/Config.xml -se OTR" % (xmlPath) print(execStr) exitValue = os.system(execStr) @@ -28,52 +18,12 @@ def BuildOTR(): print("Aborting...", file=os.sys.stderr) print("\n") -def ExtractFile(xmlPath, outputPath, outputSourcePath): - execStr = "x64\\Release\\ZAPD.exe" if sys.platform == "win32" else "../ZAPD/ZAPD.out" - execStr += " e -eh -i %s -b baserom/ -o %s -osf %s -gsf 1 -rconf CFG/Config.xml -se OTR" % (xmlPath, outputPath, outputSourcePath) - - if "overlays" in xmlPath: - execStr += " --static" - - print(execStr) - exitValue = os.system(execStr) - #exitValue = 0 - if exitValue != 0: - print("\n") - print("Error when extracting from file " + xmlPath, file=os.sys.stderr) - print("Aborting...", file=os.sys.stderr) - print("\n") - -def ExtractFunc(fullPath): - *pathList, xmlName = fullPath.split(os.sep) - objectName = os.path.splitext(xmlName)[0] - - outPath = os.path.join("..\\soh\\assets\\", *pathList[5:], objectName) - os.makedirs(outPath, exist_ok=True) - outSourcePath = outPath - - ExtractFile(fullPath, outPath, outSourcePath) - -def initializeWorker(abort, test): - global globalAbort - globalAbort = abort - - def main(): parser = argparse.ArgumentParser(description="baserom asset extractor") - parser.add_argument("-s", "--single", help="asset path relative to assets/, e.g. objects/gameplay_keep") - parser.add_argument("-f", "--force", help="Force the extraction of every xml instead of checking the touched ones.", action="store_true") - parser.add_argument("-u", "--unaccounted", help="Enables ZAPD unaccounted detector warning system.", action="store_true") parser.add_argument("-v", "--version", help="Sets game version.") args = parser.parse_args() - - global mainAbort - mainAbort = Event() - manager = Manager() - signal.signal(signal.SIGINT, SignalHandler) - - extractedAssetsTracker = manager.dict() - + + # TODO: Read from makerom file to automatically determine game version xmlVer = "GC_NMQ_D" if (args.version == "gc_pal_nmpq"): @@ -81,45 +31,10 @@ def main(): elif (args.version == "dbg_mq"): xmlVer = "GC_MQ_D" - asset_path = args.single - if asset_path is not None: - fullPath = os.path.join("..\\soh\\assets", "xml", asset_path + ".xml") - if not os.path.exists(fullPath): - print(f"Error. File {fullPath} doesn't exists.", file=os.sys.stderr) - exit(1) - - ExtractFunc(fullPath) - else: - extract_text_path = "assets/text/message_data.h" - if os.path.isfile(extract_text_path): - extract_text_path = None - extract_staff_text_path = "assets/text/message_data_staff.h" - if os.path.isfile(extract_staff_text_path): - extract_staff_text_path = None - - xmlFiles = [] - for currentPath, _, files in os.walk(os.path.join("..\\soh\\assets\\xml\\", xmlVer)): - for file in files: - fullPath = os.path.join(currentPath, file) - if file.endswith(".xml"): - xmlFiles.append(fullPath) - - try: - numCores = 2 - print("Extracting assets with " + str(numCores) + " CPU cores.") - with Pool(numCores, initializer=initializeWorker, initargs=(mainAbort, 0)) as p: - p.map(ExtractFunc, xmlFiles) - except Exception as e: - print("Warning: Multiprocessing exception ocurred.", file=os.sys.stderr) - print("Disabling mutliprocessing.", file=os.sys.stderr) - - initializeWorker(mainAbort, 0) - for singlePath in xmlFiles: - ExtractFunc(singlePath) - - - BuildOTR() + if (os.path.exists("Extract")): shutil.rmtree("Extract") + + BuildOTR("..\\soh\\assets\\xml\\" + xmlVer + "\\") if __name__ == "__main__": main() \ No newline at end of file diff --git a/OTRExporter/extract_assets_old.py b/OTRExporter/extract_assets_old.py new file mode 100644 index 000000000..2922bbf06 --- /dev/null +++ b/OTRExporter/extract_assets_old.py @@ -0,0 +1,125 @@ +#!/usr/bin/env python3 + +import argparse, json, os, signal, time, sys, shutil +from multiprocessing import Pool, cpu_count, Event, Manager, ProcessError +import shutil + +def SignalHandler(sig, frame): + print(f'Signal {sig} received. Aborting...') + mainAbort.set() + # Don't exit immediately to update the extracted assets file. + +def BuildOTR(): + shutil.copyfile("baserom/Audiobank", "Extract/Audiobank") + shutil.copyfile("baserom/Audioseq", "Extract/Audioseq") + shutil.copyfile("baserom/Audiotable", "Extract/Audiotable") + + shutil.copytree("assets", "Extract/assets") + + execStr = "x64\\Release\\ZAPD.exe" if sys.platform == "win32" else "../ZAPD/ZAPD.out" + + execStr += " botr -se OTR" + + print(execStr) + exitValue = os.system(execStr) + if exitValue != 0: + print("\n") + print("Error when building the OTR file...", file=os.sys.stderr) + print("Aborting...", file=os.sys.stderr) + print("\n") + +def ExtractFile(xmlPath, outputPath, outputSourcePath): + execStr = "x64\\Release\\ZAPD.exe" if sys.platform == "win32" else "../ZAPD/ZAPD.out" + execStr += " e -eh -i %s -b baserom/ -o %s -osf %s -gsf 1 -rconf CFG/Config.xml -se OTR" % (xmlPath, outputPath, outputSourcePath) + + if "overlays" in xmlPath: + execStr += " --static" + + print(execStr) + exitValue = os.system(execStr) + #exitValue = 0 + if exitValue != 0: + print("\n") + print("Error when extracting from file " + xmlPath, file=os.sys.stderr) + print("Aborting...", file=os.sys.stderr) + print("\n") + +def ExtractFunc(fullPath): + *pathList, xmlName = fullPath.split(os.sep) + objectName = os.path.splitext(xmlName)[0] + + outPath = os.path.join("..\\soh\\assets\\", *pathList[5:], objectName) + os.makedirs(outPath, exist_ok=True) + outSourcePath = outPath + + ExtractFile(fullPath, outPath, outSourcePath) + +def initializeWorker(abort, test): + global globalAbort + globalAbort = abort + + +def main(): + parser = argparse.ArgumentParser(description="baserom asset extractor") + parser.add_argument("-s", "--single", help="asset path relative to assets/, e.g. objects/gameplay_keep") + parser.add_argument("-f", "--force", help="Force the extraction of every xml instead of checking the touched ones.", action="store_true") + parser.add_argument("-u", "--unaccounted", help="Enables ZAPD unaccounted detector warning system.", action="store_true") + parser.add_argument("-v", "--version", help="Sets game version.") + args = parser.parse_args() + + global mainAbort + mainAbort = Event() + manager = Manager() + signal.signal(signal.SIGINT, SignalHandler) + + extractedAssetsTracker = manager.dict() + + xmlVer = "GC_NMQ_D" + + if (args.version == "gc_pal_nmpq"): + xmlVer = "GC_NMQ_PAL_F" + elif (args.version == "dbg_mq"): + xmlVer = "GC_MQ_D" + + asset_path = args.single + if asset_path is not None: + fullPath = os.path.join("..\\soh\\assets", "xml", asset_path + ".xml") + if not os.path.exists(fullPath): + print(f"Error. File {fullPath} doesn't exists.", file=os.sys.stderr) + exit(1) + + ExtractFunc(fullPath) + else: + extract_text_path = "assets/text/message_data.h" + if os.path.isfile(extract_text_path): + extract_text_path = None + extract_staff_text_path = "assets/text/message_data_staff.h" + if os.path.isfile(extract_staff_text_path): + extract_staff_text_path = None + + xmlFiles = [] + for currentPath, _, files in os.walk(os.path.join("..\\soh\\assets\\xml\\", xmlVer)): + for file in files: + fullPath = os.path.join(currentPath, file) + if file.endswith(".xml"): + xmlFiles.append(fullPath) + + try: + numCores = 2 + print("Extracting assets with " + str(numCores) + " CPU cores.") + with Pool(numCores, initializer=initializeWorker, initargs=(mainAbort, 0)) as p: + p.map(ExtractFunc, xmlFiles) + except Exception as e: + print("Warning: Multiprocessing exception ocurred.", file=os.sys.stderr) + print("Disabling mutliprocessing.", file=os.sys.stderr) + + initializeWorker(mainAbort, 0) + for singlePath in xmlFiles: + ExtractFunc(singlePath) + + + BuildOTR() + shutil.rmtree("Extract") + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/OTRGui/src/game/game.cpp b/OTRGui/src/game/game.cpp index 2f5512385..88bd7201f 100644 --- a/OTRGui/src/game/game.cpp +++ b/OTRGui/src/game/game.cpp @@ -87,10 +87,11 @@ void ExtractRom() if (MoonUtils::exists("Extract")) MoonUtils::rm("Extract"); MoonUtils::mkdir("Extract"); - MoonUtils::copy("tmp/baserom/Audiobank", "Extract/Audiobank"); - MoonUtils::copy("tmp/baserom/Audioseq", "Extract/Audioseq"); - MoonUtils::copy("tmp/baserom/Audiotable", "Extract/Audiotable"); - MoonUtils::copy("tmp/baserom/version", "Extract/version"); + //MoonUtils::copy("tmp/baserom/Audiobank", "Extract/Audiobank"); + //MoonUtils::copy("tmp/baserom/Audioseq", "Extract/Audioseq"); + //MoonUtils::copy("tmp/baserom/Audiotable", "Extract/Audiotable"); + //MoonUtils::copy("tmp/baserom/version", "Extract/version"); + MoonUtils::write("Extract/version", (char*)&version.crc, sizeof(version.crc)); MoonUtils::copy("assets/game/", "Extract/assets/"); diff --git a/OTRGui/src/impl/extractor/extractor.cpp b/OTRGui/src/impl/extractor/extractor.cpp index e28fa5513..a2eab1bb6 100644 --- a/OTRGui/src/impl/extractor/extractor.cpp +++ b/OTRGui/src/impl/extractor/extractor.cpp @@ -83,7 +83,6 @@ void startWorker(RomVersion version) { Util::write("tmp/baserom/version", (char*)&version.crc, sizeof(version.crc)); - if (oldExtractMode) { std::vector files; diff --git a/ZAPDTR/ZAPD/Main.cpp b/ZAPDTR/ZAPD/Main.cpp index 1a99d346a..dd53b9c67 100644 --- a/ZAPDTR/ZAPD/Main.cpp +++ b/ZAPDTR/ZAPD/Main.cpp @@ -387,18 +387,6 @@ int main(int argc, char* argv[]) { BuildAssetBlob(Globals::Instance->inputPath, Globals::Instance->outputPath); } - /* - else if (fileMode == ZFileMode::BuildOverlay) - { - ZOverlay* overlay = - ZOverlay::FromBuild(Path::GetDirectoryName(Globals::Instance->inputPath), - Path::GetDirectoryName(Globals::Instance->cfgPath)); - - if (overlay != nullptr) - File::WriteAllText(Globals::Instance->outputPath.string(), - overlay->GetSourceOutputCode("")); - } - */ if (exporterSet != nullptr && exporterSet->endProgramFunc != nullptr) exporterSet->endProgramFunc(); diff --git a/ZAPDTR/ZAPD/ZFile.cpp b/ZAPDTR/ZAPD/ZFile.cpp index b706c1914..9ff7a6823 100644 --- a/ZAPDTR/ZAPD/ZFile.cpp +++ b/ZAPDTR/ZAPD/ZFile.cpp @@ -823,6 +823,32 @@ void ZFile::GenerateSourceHeaderFiles() if (Globals::Instance->fileMode != ZFileMode::ExtractDirectory) File::WriteAllText(headerFilename, formatter.GetOutput()); + else if (Globals::Instance->sourceOutputPath != "") + { + std::string xmlPath = xmlFilePath.string(); + xmlPath = StringHelper::Replace(xmlPath, "\\", "/"); + auto pathList = StringHelper::Split(xmlPath, "/"); + std::string outPath = ""; + + for (int i = 0; i < 3; i++) + outPath += pathList[i] + "/"; + + for (int i = 5; i < pathList.size(); i++) + { + if (i == pathList.size() - 1) + { + outPath += Path::GetFileNameWithoutExtension(pathList[i]) + "/"; + outPath += outName.string() + ".h"; + } + else + outPath += pathList[i]; + + if (i < pathList.size() - 1) + outPath += "/"; + } + + File::WriteAllText(outPath, formatter.GetOutput()); + } } std::string ZFile::GetHeaderInclude() const From 64327fafb1a71c897006f4980d5231178641432a Mon Sep 17 00:00:00 2001 From: Sirius902 <10891979+Sirius902@users.noreply.github.com> Date: Wed, 6 Apr 2022 17:42:23 -0700 Subject: [PATCH 31/83] Make ResourceMgr and CVar more const correct, remove unnecessary const_cast (#118) --- libultraship/libultraship/Cvar.cpp | 24 ++++++------ libultraship/libultraship/Cvar.h | 24 ++++++------ libultraship/libultraship/GameSettings.cpp | 44 +++++++++++----------- libultraship/libultraship/SohConsole.cpp | 2 +- libultraship/libultraship/SohImGuiImpl.cpp | 30 +++++++-------- soh/soh/OTRGlobals.cpp | 36 +++++++++--------- soh/soh/OTRGlobals.h | 14 +++---- 7 files changed, 87 insertions(+), 87 deletions(-) diff --git a/libultraship/libultraship/Cvar.cpp b/libultraship/libultraship/Cvar.cpp index 306a18e83..91788fd48 100644 --- a/libultraship/libultraship/Cvar.cpp +++ b/libultraship/libultraship/Cvar.cpp @@ -5,16 +5,16 @@ std::map cvars; -CVar* CVar_GetVar(char* name) { +CVar* CVar_GetVar(const char* name) { std::string key(name); return cvars.contains(key) ? cvars[key] : nullptr; } -extern "C" CVar* CVar_Get(char* name) { +extern "C" CVar* CVar_Get(const char* name) { return CVar_GetVar(name); } -extern "C" s32 CVar_GetS32(char* name, s32 defaultValue) { +extern "C" s32 CVar_GetS32(const char* name, s32 defaultValue) { CVar* cvar = CVar_Get(name); if (cvar != nullptr) { @@ -25,7 +25,7 @@ extern "C" s32 CVar_GetS32(char* name, s32 defaultValue) { return defaultValue; } -extern "C" float CVar_GetFloat(char* name, float defaultValue) { +extern "C" float CVar_GetFloat(const char* name, float defaultValue) { CVar* cvar = CVar_Get(name); if (cvar != nullptr) { @@ -36,7 +36,7 @@ extern "C" float CVar_GetFloat(char* name, float defaultValue) { return defaultValue; } -extern "C" char* CVar_GetString(char* name, char* defaultValue) { +extern "C" char* CVar_GetString(const char* name, char* defaultValue) { CVar* cvar = CVar_Get(name); if (cvar != nullptr) { @@ -47,7 +47,7 @@ extern "C" char* CVar_GetString(char* name, char* defaultValue) { return defaultValue; } -extern "C" void CVar_SetS32(char* name, s32 value) { +extern "C" void CVar_SetS32(const char* name, s32 value) { CVar* cvar = CVar_Get(name); if (!cvar) { cvar = new CVar; @@ -57,7 +57,7 @@ extern "C" void CVar_SetS32(char* name, s32 value) { cvar->value.valueS32 = value; } -void CVar_SetFloat(char* name, float value) { +void CVar_SetFloat(const char* name, float value) { CVar* cvar = CVar_Get(name); if (!cvar) { cvar = new CVar; @@ -67,7 +67,7 @@ void CVar_SetFloat(char* name, float value) { cvar->value.valueFloat = value; } -void CVar_SetString(char* name, char* value) { +void CVar_SetString(const char* name, char* value) { CVar* cvar = CVar_Get(name); if (!cvar) { cvar = new CVar; @@ -78,23 +78,23 @@ void CVar_SetString(char* name, char* value) { } -extern "C" void CVar_RegisterS32(char* name, s32 defaultValue) { +extern "C" void CVar_RegisterS32(const char* name, s32 defaultValue) { CVar* cvar = CVar_Get(name); if (cvar == nullptr) CVar_SetS32(name, defaultValue); } -extern "C" void CVar_RegisterFloat(char* name, float defaultValue) { +extern "C" void CVar_RegisterFloat(const char* name, float defaultValue) { CVar* cvar = CVar_Get(name); if (cvar == nullptr) CVar_SetFloat(name, defaultValue); } -extern "C" void CVar_RegisterString(char* name, char* defaultValue) { +extern "C" void CVar_RegisterString(const char* name, char* defaultValue) { CVar* cvar = CVar_Get(name); if (cvar == nullptr) CVar_SetString(name, defaultValue); -} \ No newline at end of file +} diff --git a/libultraship/libultraship/Cvar.h b/libultraship/libultraship/Cvar.h index 7bac8f20b..a85bb8fd3 100644 --- a/libultraship/libultraship/Cvar.h +++ b/libultraship/libultraship/Cvar.h @@ -23,15 +23,15 @@ extern "C" //#include -CVar* CVar_Get(char* name); -s32 CVar_GetS32(char* name, s32 defaultValue); -float CVar_GetFloat(char* name, float defaultValue); -char* CVar_GetString(char* name, char* defaultValue); -void CVar_SetS32(char* name, s32 value); +CVar* CVar_Get(const char* name); +s32 CVar_GetS32(const char* name, s32 defaultValue); +float CVar_GetFloat(const char* name, float defaultValue); +char* CVar_GetString(const char* name, char* defaultValue); +void CVar_SetS32(const char* name, s32 value); -void CVar_RegisterS32(char* name, s32 defaultValue); -void CVar_RegisterFloat(char* name, float defaultValue); -void CVar_RegisterString(char* name, char* defaultValue); +void CVar_RegisterS32(const char* name, s32 defaultValue); +void CVar_RegisterFloat(const char* name, float defaultValue); +void CVar_RegisterString(const char* name, char* defaultValue); #ifdef __cplusplus }; @@ -42,8 +42,8 @@ void CVar_RegisterString(char* name, char* defaultValue); #include extern std::map cvars; -CVar* CVar_GetVar(char* name); -void CVar_SetFloat(char* name, float value); -void CVar_SetString(char* name, char* value); +CVar* CVar_GetVar(const char* name); +void CVar_SetFloat(const char* name, float value); +void CVar_SetString(const char* name, char* value); +#endif #endif -#endif \ No newline at end of file diff --git a/libultraship/libultraship/GameSettings.cpp b/libultraship/libultraship/GameSettings.cpp index 1186fa27c..f12042bc0 100644 --- a/libultraship/libultraship/GameSettings.cpp +++ b/libultraship/libultraship/GameSettings.cpp @@ -50,73 +50,73 @@ namespace Game { // Enhancements Settings.enhancements.fast_text = stob(Conf[EnhancementSection]["fast_text"]); - CVar_SetS32(const_cast("gFastText"), Settings.enhancements.fast_text); + CVar_SetS32("gFastText", Settings.enhancements.fast_text); Settings.enhancements.disable_lod = stob(Conf[EnhancementSection]["disable_lod"]); - CVar_SetS32(const_cast("gDisableLOD"), Settings.enhancements.disable_lod); + CVar_SetS32("gDisableLOD", Settings.enhancements.disable_lod); Settings.enhancements.animated_pause_menu = stob(Conf[EnhancementSection]["animated_pause_menu"]); - CVar_SetS32(const_cast("gPauseLiveLink"), Settings.enhancements.animated_pause_menu); + CVar_SetS32("gPauseLiveLink", Settings.enhancements.animated_pause_menu); Settings.enhancements.minimal_ui = stob(Conf[EnhancementSection]["minimal_ui"]); CVar_SetS32(const_cast("gMinimalUI"), Settings.enhancements.minimal_ui); // Audio Settings.audio.master = Ship::stof(Conf[AudioSection]["master"]); - CVar_SetFloat(const_cast("gGameMasterVolume"), Settings.audio.master); + CVar_SetFloat("gGameMasterVolume", Settings.audio.master); Settings.audio.music_main = Ship::stof(Conf[AudioSection]["music_main"]); - CVar_SetFloat(const_cast("gMainMusicVolume"), Settings.audio.music_main); + CVar_SetFloat("gMainMusicVolume", Settings.audio.music_main); Settings.audio.music_sub = Ship::stof(Conf[AudioSection]["music_sub"]); - CVar_SetFloat(const_cast("gSubMusicVolume"), Settings.audio.music_sub); + CVar_SetFloat("gSubMusicVolume", Settings.audio.music_sub); Settings.audio.sfx = Ship::stof(Conf[AudioSection]["sfx"]); - CVar_SetFloat(const_cast("gSFXMusicVolume"), Settings.audio.sfx); + CVar_SetFloat("gSFXMusicVolume", Settings.audio.sfx); Settings.audio.fanfare = Ship::stof(Conf[AudioSection]["fanfare"]); - CVar_SetFloat(const_cast("gFanfareVolume"), Settings.audio.fanfare); + CVar_SetFloat("gFanfareVolume", Settings.audio.fanfare); // Controllers Settings.controller.gyro_sensitivity = Ship::stof(Conf[ControllerSection]["gyro_sensitivity"]); - CVar_SetFloat(const_cast("gGyroSensitivity"), Settings.controller.gyro_sensitivity); + CVar_SetFloat("gGyroSensitivity", Settings.controller.gyro_sensitivity); Settings.controller.rumble_strength = Ship::stof(Conf[ControllerSection]["rumble_strength"]); - CVar_SetFloat(const_cast("gRumbleStrength"), Settings.controller.rumble_strength); + CVar_SetFloat("gRumbleStrength", Settings.controller.rumble_strength); Settings.controller.input_scale = Ship::stof(Conf[ControllerSection]["input_scale"]); - CVar_SetFloat(const_cast("gInputScale"), Settings.controller.input_scale); + CVar_SetFloat("gInputScale", Settings.controller.input_scale); Settings.controller.input_enabled = stob(Conf[ControllerSection]["input_enabled"]); - CVar_SetS32(const_cast("gInputEnabled"), Settings.controller.input_enabled); + CVar_SetS32("gInputEnabled", Settings.controller.input_enabled); // Cheats Settings.cheats.debug_mode = stob(Conf[CheatSection]["debug_mode"]); - CVar_SetS32(const_cast("gDebugEnabled"), Settings.cheats.debug_mode); + CVar_SetS32("gDebugEnabled", Settings.cheats.debug_mode); Settings.cheats.infinite_money = stob(Conf[CheatSection]["infinite_money"]); - CVar_SetS32(const_cast("gInfiniteMoney"), Settings.cheats.infinite_money); + CVar_SetS32("gInfiniteMoney", Settings.cheats.infinite_money); Settings.cheats.infinite_health = stob(Conf[CheatSection]["infinite_health"]); - CVar_SetS32(const_cast("gInfiniteHealth"), Settings.cheats.infinite_health); + CVar_SetS32("gInfiniteHealth", Settings.cheats.infinite_health); Settings.cheats.infinite_ammo = stob(Conf[CheatSection]["infinite_ammo"]); - CVar_SetS32(const_cast("gInfiniteAmmo"), Settings.cheats.infinite_ammo); + CVar_SetS32("gInfiniteAmmo", Settings.cheats.infinite_ammo); Settings.cheats.infinite_magic = stob(Conf[CheatSection]["infinite_magic"]); - CVar_SetS32(const_cast("gInfiniteMagic"), Settings.cheats.infinite_magic); + CVar_SetS32("gInfiniteMagic", Settings.cheats.infinite_magic); Settings.cheats.no_clip = stob(Conf[CheatSection]["no_clip"]); - CVar_SetS32(const_cast("gNoClip"), Settings.cheats.no_clip); + CVar_SetS32("gNoClip", Settings.cheats.no_clip); Settings.cheats.climb_everything = stob(Conf[CheatSection]["climb_everything"]); - CVar_SetS32(const_cast("gClimbEverything"), Settings.cheats.climb_everything); + CVar_SetS32("gClimbEverything", Settings.cheats.climb_everything); Settings.cheats.moon_jump_on_l = stob(Conf[CheatSection]["moon_jump_on_l"]); - CVar_SetS32(const_cast("gMoonJumpOnL"), Settings.cheats.moon_jump_on_l); + CVar_SetS32("gMoonJumpOnL", Settings.cheats.moon_jump_on_l); Settings.cheats.super_tunic = stob(Conf[CheatSection]["super_tunic"]); - CVar_SetS32(const_cast("gSuperTunic"), Settings.cheats.super_tunic); + CVar_SetS32("gSuperTunic", Settings.cheats.super_tunic); UpdateAudio(); } @@ -173,4 +173,4 @@ namespace Game { void SetSeqPlayerVolume(SeqPlayers playerId, float volume) { Audio_SetGameVolume(playerId, volume); } -} \ No newline at end of file +} diff --git a/libultraship/libultraship/SohConsole.cpp b/libultraship/libultraship/SohConsole.cpp index 71a067196..618cd1e1d 100644 --- a/libultraship/libultraship/SohConsole.cpp +++ b/libultraship/libultraship/SohConsole.cpp @@ -92,7 +92,7 @@ void Console::Update() { } for (auto [key, var] : BindingToggle) { if (ImGui::IsKeyPressed(key)) { - CVar* cvar = CVar_GetVar(const_cast(var.c_str())); + CVar* cvar = CVar_GetVar(var.c_str()); Dispatch("set " + var + " " + std::to_string(cvar == nullptr ? 0 : !static_cast(cvar->value.valueS32))); } } diff --git a/libultraship/libultraship/SohImGuiImpl.cpp b/libultraship/libultraship/SohImGuiImpl.cpp index d95a27d08..bdf9c267b 100644 --- a/libultraship/libultraship/SohImGuiImpl.cpp +++ b/libultraship/libultraship/SohImGuiImpl.cpp @@ -225,7 +225,7 @@ namespace SohImGui { ImGui::Text(name, static_cast(100 * *(value))); if (ImGui::SliderFloat((std::string("##") + key).c_str(), value, 0.0f, 1.0f, "")) { const float volume = floorf(*(value) * 100) / 100; - CVar_SetFloat(const_cast(key), volume); + CVar_SetFloat(key, volume); needs_save = true; Game::SetSeqPlayerVolume(playerId, volume); } @@ -289,7 +289,7 @@ namespace SohImGui { const float volume = Game::Settings.audio.master; ImGui::Text("Master Volume: %d %%", static_cast(100 * volume)); if (ImGui::SliderFloat("##Master_Vol", &Game::Settings.audio.master, 0.0f, 1.0f, "")) { - CVar_SetFloat(const_cast("gGameMasterVolume"), volume); + CVar_SetFloat("gGameMasterVolume", volume); needs_save = true; } @@ -337,7 +337,7 @@ namespace SohImGui { ImGui::Separator(); if (ImGui::Checkbox("Fast Text", &Game::Settings.enhancements.fast_text)) { - CVar_SetS32(const_cast("gFastText"), Game::Settings.enhancements.fast_text); + CVar_SetS32("gFastText", Game::Settings.enhancements.fast_text); needs_save = true; } @@ -354,12 +354,12 @@ namespace SohImGui { } if (ImGui::Checkbox("Animated Link in Pause Menu", &Game::Settings.enhancements.animated_pause_menu)) { - CVar_SetS32(const_cast("gPauseLiveLink"), Game::Settings.enhancements.animated_pause_menu); + CVar_SetS32("gPauseLiveLink", Game::Settings.enhancements.animated_pause_menu); needs_save = true; } if (ImGui::Checkbox("Disable LOD", &Game::Settings.enhancements.disable_lod)) { - CVar_SetS32(const_cast("gDisableLOD"), Game::Settings.enhancements.disable_lod); + CVar_SetS32("gDisableLOD", Game::Settings.enhancements.disable_lod); needs_save = true; } @@ -374,7 +374,7 @@ namespace SohImGui { ImGui::Separator(); if (ImGui::Checkbox("Debug Mode", &Game::Settings.cheats.debug_mode)) { - CVar_SetS32(const_cast("gDebugEnabled"), Game::Settings.cheats.debug_mode); + CVar_SetS32("gDebugEnabled", Game::Settings.cheats.debug_mode); needs_save = true; } @@ -383,42 +383,42 @@ namespace SohImGui { if (ImGui::BeginMenu("Cheats")) { if (ImGui::Checkbox("Infinite Money", &Game::Settings.cheats.infinite_money)) { - CVar_SetS32(const_cast("gInfiniteMoney"), Game::Settings.cheats.infinite_money); + CVar_SetS32("gInfiniteMoney", Game::Settings.cheats.infinite_money); needs_save = true; } if (ImGui::Checkbox("Infinite Health", &Game::Settings.cheats.infinite_health)) { - CVar_SetS32(const_cast("gInfiniteHealth"), Game::Settings.cheats.infinite_health); + CVar_SetS32("gInfiniteHealth", Game::Settings.cheats.infinite_health); needs_save = true; } if (ImGui::Checkbox("Infinite Ammo", &Game::Settings.cheats.infinite_ammo)) { - CVar_SetS32(const_cast("gInfiniteAmmo"), Game::Settings.cheats.infinite_ammo); + CVar_SetS32("gInfiniteAmmo", Game::Settings.cheats.infinite_ammo); needs_save = true; } if (ImGui::Checkbox("Infinite Magic", &Game::Settings.cheats.infinite_magic)) { - CVar_SetS32(const_cast("gInfiniteMagic"), Game::Settings.cheats.infinite_magic); + CVar_SetS32("gInfiniteMagic", Game::Settings.cheats.infinite_magic); needs_save = true; } if (ImGui::Checkbox("No Clip", &Game::Settings.cheats.no_clip)) { - CVar_SetS32(const_cast("gNoClip"), Game::Settings.cheats.no_clip); + CVar_SetS32("gNoClip", Game::Settings.cheats.no_clip); needs_save = true; } if (ImGui::Checkbox("Climb Everything", &Game::Settings.cheats.climb_everything)) { - CVar_SetS32(const_cast("gClimbEverything"), Game::Settings.cheats.climb_everything); + CVar_SetS32("gClimbEverything", Game::Settings.cheats.climb_everything); needs_save = true; } if (ImGui::Checkbox("Moon Jump on L", &Game::Settings.cheats.moon_jump_on_l)) { - CVar_SetS32(const_cast("gMoonJumpOnL"), Game::Settings.cheats.moon_jump_on_l); + CVar_SetS32("gMoonJumpOnL", Game::Settings.cheats.moon_jump_on_l); needs_save = true; } if (ImGui::Checkbox("Super Tunic", &Game::Settings.cheats.super_tunic)) { - CVar_SetS32(const_cast("gSuperTunic"), Game::Settings.cheats.super_tunic); + CVar_SetS32("gSuperTunic", Game::Settings.cheats.super_tunic); needs_save = true; } @@ -538,4 +538,4 @@ namespace SohImGui { void BindCmd(const std::string& cmd, CommandEntry entry) { console->Commands[cmd] = std::move(entry); } -} \ No newline at end of file +} diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index c000ce8e1..d10600bce 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -183,9 +183,9 @@ extern "C" char* ResourceMgr_LoadJPEG(char* data, int dataSize) return (char*)finalBuffer; } -extern "C" char* ResourceMgr_LoadTexByName(char* texPath); +extern "C" char* ResourceMgr_LoadTexByName(const char* texPath); -extern "C" char* ResourceMgr_LoadTexOrDListByName(char* filePath) { +extern "C" char* ResourceMgr_LoadTexOrDListByName(const char* filePath) { auto res = OTRGlobals::Instance->context->GetResourceManager()->LoadResource(filePath); if (res->resType == Ship::ResourceType::DisplayList) @@ -196,28 +196,28 @@ extern "C" char* ResourceMgr_LoadTexOrDListByName(char* filePath) { return ResourceMgr_LoadTexByName(filePath); } -extern "C" char* ResourceMgr_LoadPlayerAnimByName(char* animPath) { +extern "C" char* ResourceMgr_LoadPlayerAnimByName(const char* animPath) { auto anim = std::static_pointer_cast( OTRGlobals::Instance->context->GetResourceManager()->LoadResource(animPath)); return (char*)&anim->limbRotData[0]; } -extern "C" Gfx* ResourceMgr_LoadGfxByName(char* path) +extern "C" Gfx* ResourceMgr_LoadGfxByName(const char* path) { auto res = std::static_pointer_cast( OTRGlobals::Instance->context->GetResourceManager()->LoadResource(path)); return (Gfx*)&res->instructions[0]; } -extern "C" char* ResourceMgr_LoadArrayByName(char* path) +extern "C" char* ResourceMgr_LoadArrayByName(const char* path) { auto res = std::static_pointer_cast(OTRGlobals::Instance->context->GetResourceManager()->LoadResource(path)); return (char*)res->scalars.data(); } -extern "C" char* ResourceMgr_LoadArrayByNameAsVec3s(char* path) { +extern "C" char* ResourceMgr_LoadArrayByNameAsVec3s(const char* path) { auto res = std::static_pointer_cast(OTRGlobals::Instance->context->GetResourceManager()->LoadResource(path)); @@ -239,7 +239,7 @@ extern "C" char* ResourceMgr_LoadArrayByNameAsVec3s(char* path) { } } -extern "C" CollisionHeader* ResourceMgr_LoadColByName(char* path) +extern "C" CollisionHeader* ResourceMgr_LoadColByName(const char* path) { auto colRes = std::static_pointer_cast(OTRGlobals::Instance->context->GetResourceManager()->LoadResource(path)); @@ -333,7 +333,7 @@ extern "C" CollisionHeader* ResourceMgr_LoadColByName(char* path) return (CollisionHeader*)colHeader; } -extern "C" Vtx * ResourceMgr_LoadVtxByName(char* path) +extern "C" Vtx * ResourceMgr_LoadVtxByName(const char* path) { auto res = std::static_pointer_cast(OTRGlobals::Instance->context->GetResourceManager()->LoadResource(path)); return (Vtx*)res->vertices.data(); @@ -355,7 +355,7 @@ extern "C" int ResourceMgr_OTRSigCheck(char* imgData) return 0; } -extern "C" AnimationHeaderCommon* ResourceMgr_LoadAnimByName(char* path) { +extern "C" AnimationHeaderCommon* ResourceMgr_LoadAnimByName(const char* path) { auto res = std::static_pointer_cast( OTRGlobals::Instance->context->GetResourceManager()->LoadResource(path)); @@ -424,7 +424,7 @@ extern "C" AnimationHeaderCommon* ResourceMgr_LoadAnimByName(char* path) { return anim; } -extern "C" SkeletonHeader* ResourceMgr_LoadSkeletonByName(char* path) { +extern "C" SkeletonHeader* ResourceMgr_LoadSkeletonByName(const char* path) { auto res = std::static_pointer_cast(OTRGlobals::Instance->context->GetResourceManager()->LoadResource(path)); if (res->cachedGameAsset != nullptr) @@ -470,14 +470,14 @@ extern "C" SkeletonHeader* ResourceMgr_LoadSkeletonByName(char* path) { limbC->sibling = limb->siblingIndex; if (limb->dListPtr != "") { - auto dList = ResourceMgr_LoadGfxByName((char*)limb->dListPtr.c_str()); + auto dList = ResourceMgr_LoadGfxByName(limb->dListPtr.c_str()); limbC->dLists[0] = dList; } else { limbC->dLists[0] = nullptr; } if (limb->dList2Ptr != "") { - auto dList = ResourceMgr_LoadGfxByName((char*)limb->dList2Ptr.c_str()); + auto dList = ResourceMgr_LoadGfxByName(limb->dList2Ptr.c_str()); limbC->dLists[1] = dList; } else { limbC->dLists[1] = nullptr; @@ -496,7 +496,7 @@ extern "C" SkeletonHeader* ResourceMgr_LoadSkeletonByName(char* path) { limbC->dList = nullptr; if (!limb->dListPtr.empty()) { - const auto dList = ResourceMgr_LoadGfxByName(const_cast(limb->dListPtr.c_str())); + const auto dList = ResourceMgr_LoadGfxByName(limb->dListPtr.c_str()); limbC->dList = dList; } @@ -512,12 +512,12 @@ extern "C" SkeletonHeader* ResourceMgr_LoadSkeletonByName(char* path) { limbC->dList[1] = nullptr; if (!limb->dListPtr.empty()) { - const auto dList = ResourceMgr_LoadGfxByName(const_cast(limb->dListPtr.c_str())); + const auto dList = ResourceMgr_LoadGfxByName(limb->dListPtr.c_str()); limbC->dList[0] = dList; } if (!limb->dList2Ptr.empty()) { - const auto dList = ResourceMgr_LoadGfxByName(const_cast(limb->dList2Ptr.c_str())); + const auto dList = ResourceMgr_LoadGfxByName(limb->dList2Ptr.c_str()); limbC->dList[1] = dList; } @@ -543,7 +543,7 @@ extern "C" SkeletonHeader* ResourceMgr_LoadSkeletonByName(char* path) { limbC->segmentType = 0; if (limb->skinSegmentType == Ship::ZLimbSkinType::SkinType_DList) - limbC->segment = ResourceMgr_LoadGfxByName(const_cast(limb->skinDList.c_str())); + limbC->segment = ResourceMgr_LoadGfxByName(limb->skinDList.c_str()); else if (limb->skinSegmentType == Ship::ZLimbSkinType::SkinType_4) { const auto animData = new SkinAnimatedLimbData; const int skinDataSize = limb->skinData.size(); @@ -551,7 +551,7 @@ extern "C" SkeletonHeader* ResourceMgr_LoadSkeletonByName(char* path) { animData->totalVtxCount = limb->skinVtxCnt; animData->limbModifCount = skinDataSize; animData->limbModifications = new SkinLimbModif[animData->limbModifCount]; - animData->dlist = ResourceMgr_LoadGfxByName(const_cast(limb->skinDList2.c_str())); + animData->dlist = ResourceMgr_LoadGfxByName(limb->skinDList2.c_str()); for (int i = 0; i < skinDataSize; i++) { @@ -611,7 +611,7 @@ extern "C" SkeletonHeader* ResourceMgr_LoadSkeletonByName(char* path) { return baseHeader; } -extern "C" s32* ResourceMgr_LoadCSByName(char* path) +extern "C" s32* ResourceMgr_LoadCSByName(const char* path) { auto res = std::static_pointer_cast(OTRGlobals::Instance->context->GetResourceManager()->LoadResource(path)); return (s32*)res->commands.data(); diff --git a/soh/soh/OTRGlobals.h b/soh/soh/OTRGlobals.h index 4a439fc6d..4f62f0694 100644 --- a/soh/soh/OTRGlobals.h +++ b/soh/soh/OTRGlobals.h @@ -31,17 +31,17 @@ uint32_t ResourceMgr_GetGameVersion(); void ResourceMgr_CacheDirectory(const char* resName); void ResourceMgr_LoadFile(const char* resName); char* ResourceMgr_LoadFileFromDisk(const char* filePath); -char* ResourceMgr_LoadTexByName(char* texPath); -char* ResourceMgr_LoadTexOrDListByName(char* filePath); -char* ResourceMgr_LoadPlayerAnimByName(char* animPath); +char* ResourceMgr_LoadTexByName(const char* texPath); +char* ResourceMgr_LoadTexOrDListByName(const char* filePath); +char* ResourceMgr_LoadPlayerAnimByName(const char* animPath); char* ResourceMgr_GetNameByCRC(uint64_t crc, char* alloc); Gfx* ResourceMgr_LoadGfxByCRC(uint64_t crc); -Gfx* ResourceMgr_LoadGfxByName(char* path); +Gfx* ResourceMgr_LoadGfxByName(const char* path); Vtx* ResourceMgr_LoadVtxByCRC(uint64_t crc); -Vtx* ResourceMgr_LoadVtxByName(char* path); -CollisionHeader* ResourceMgr_LoadColByName(char* path); +Vtx* ResourceMgr_LoadVtxByName(const char* path); +CollisionHeader* ResourceMgr_LoadColByName(const char* path); uint64_t GetPerfCounter(); -struct SkeletonHeader* ResourceMgr_LoadSkeletonByName(char* path); +struct SkeletonHeader* ResourceMgr_LoadSkeletonByName(const char* path); int ResourceMgr_OTRSigCheck(char* imgData); uint64_t osGetTime(void); uint32_t osGetCount(void); From f20ab2c2600d9e07b342a226f07fc98721dbc8fc Mon Sep 17 00:00:00 2001 From: MaikelChan Date: Fri, 8 Apr 2022 23:23:24 +0200 Subject: [PATCH 32/83] Fixed transparent texture making framebuffers also transparent in D3D11. (#84) This happened with the Mirror Shield in the inventory screen preview. --- libultraship/libultraship/Lib/Fast3D/gfx_direct3d11.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_direct3d11.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_direct3d11.cpp index c989290c6..3481a4db2 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_direct3d11.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_direct3d11.cpp @@ -531,8 +531,8 @@ static struct ShaderProgram *gfx_d3d11_create_and_load_new_shader(uint64_t shade blend_desc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA; blend_desc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA; blend_desc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD; - blend_desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE; - blend_desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO; + blend_desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_SRC_ALPHA; + blend_desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA; blend_desc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; blend_desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; } else { From 3e8c48c1162b004f160e727ea8704885dc0d1dd5 Mon Sep 17 00:00:00 2001 From: rozlette Date: Sun, 3 Apr 2022 14:47:24 -0500 Subject: [PATCH 33/83] Add save editor --- .../Lib/Fast3D/gfx_direct3d11.cpp | 4 +- libultraship/libultraship/SohImGuiImpl.cpp | 67 ++- libultraship/libultraship/SohImGuiImpl.h | 14 +- soh/soh.vcxproj | 4 + soh/soh.vcxproj.filters | 18 + .../Enhancements/debugger/debugSaveEditor.cpp | 527 ++++++++++++++++++ .../Enhancements/debugger/debugSaveEditor.h | 3 + soh/soh/Enhancements/debugger/debugger.cpp | 6 + soh/soh/Enhancements/debugger/debugger.h | 3 + soh/soh/OTRGlobals.cpp | 2 + 10 files changed, 641 insertions(+), 7 deletions(-) create mode 100644 soh/soh/Enhancements/debugger/debugSaveEditor.cpp create mode 100644 soh/soh/Enhancements/debugger/debugSaveEditor.h create mode 100644 soh/soh/Enhancements/debugger/debugger.cpp create mode 100644 soh/soh/Enhancements/debugger/debugger.h diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_direct3d11.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_direct3d11.cpp index 3481a4db2..9c2f46422 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_direct3d11.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_direct3d11.cpp @@ -977,8 +977,8 @@ uint16_t gfx_d3d11_get_pixel_depth_old(float x, float y) { } // namespace -void* SohImGui::GetTextureByID(int id) { - return d3d.textures[id].resource_view.Get(); +ImTextureID SohImGui::GetTextureByID(int id) { + return impl.backend == Backend::DX11 ? d3d.textures[id].resource_view.Get() : reinterpret_cast(id); } struct GfxRenderingAPI gfx_direct3d11_api = { diff --git a/libultraship/libultraship/SohImGuiImpl.cpp b/libultraship/libultraship/SohImGuiImpl.cpp index bdf9c267b..7489d14a2 100644 --- a/libultraship/libultraship/SohImGuiImpl.cpp +++ b/libultraship/libultraship/SohImGuiImpl.cpp @@ -1,6 +1,7 @@ #include "SohImGuiImpl.h" #include +#include #include #include "Archive.h" @@ -14,9 +15,11 @@ #include "TextureMod.h" #include "Window.h" #include "Cvar.h" +#include "Texture.h" #include "../Fast3D/gfx_pc.h" #include "Lib/stb/stb_image.h" #include "Lib/Fast3D/gfx_rendering_api.h" +#include "Lib/spdlog/include/spdlog/common.h" #include "Utils/StringHelper.h" #ifdef ENABLE_OPENGL @@ -51,6 +54,9 @@ namespace SohImGui { bool p_open = false; bool needs_save = false; + std::map> windowCategories; + std::map customWindows; + void ImGuiWMInit() { switch (impl.backend) { case Backend::SDL: @@ -153,7 +159,7 @@ namespace SohImGui { } } - void LoadTexture(std::string name, std::string path) { + void LoadTexture(const std::string& name, const std::string& path) { GfxRenderingAPI* api = gfx_get_current_rendering_api(); const auto res = GlobalCtx2::GetInstance()->GetResourceManager()->LoadFile(normalize(path)); @@ -173,6 +179,25 @@ namespace SohImGui { stbi_image_free(img_data); } + void LoadResource(const std::string& name, const std::string& path) { + GfxRenderingAPI* api = gfx_get_current_rendering_api(); + const auto res = static_cast(GlobalCtx2::GetInstance()->GetResourceManager()->LoadResource(normalize(path)).get()); + + if (res->texType != Ship::TextureType::RGBA32bpp) { + // TODO convert other image types + SPDLOG_WARN("SohImGui::LoadResource: Attempting to load unsupporting image type %s", path.c_str()); + return; + } + + const auto asset = new GameAsset{ api->new_texture() }; + + api->select_texture(0, asset->textureId); + api->set_sampler_parameters(0, false, 0, 0); + api->upload_texture(res->imageData, res->width, res->height); + + DefaultAssets[name] = asset; + } + void Init(WindowImpl window_impl) { impl = window_impl; Game::LoadSettings(); @@ -219,7 +244,7 @@ namespace SohImGui { ImGuiProcessEvent(event); } -#define BindButton(btn, status) ImGui::Image(impl.backend == Backend::DX11 ? GetTextureByID(DefaultAssets[btn]->textureId) : (ImTextureID)(DefaultAssets[btn]->textureId), ImVec2(16.0f * scale, 16.0f * scale), ImVec2(0, 0), ImVec2(1.0f, 1.0f), ImVec4(255, 255, 255, (status) ? 255 : 0)); +#define BindButton(btn, status) ImGui::Image(GetTextureByID(DefaultAssets[btn]->textureId), ImVec2(16.0f * scale, 16.0f * scale), ImVec2(0, 0), ImVec2(1.0f, 1.0f), ImVec4(255, 255, 255, (status) ? 255 : 0)); void BindAudioSlider(const char* name, const char* key, float* value, SeqPlayers playerId) { ImGui::Text(name, static_cast(100 * *(value))); @@ -278,7 +303,7 @@ namespace SohImGui { if (ImGui::BeginMenuBar()) { if (DefaultAssets.contains("Game_Icon")) { ImGui::SetCursorPos(ImVec2(5, 2.5f)); - ImGui::Image(impl.backend == Backend::DX11 ? GetTextureByID(DefaultAssets["Game_Icon"]->textureId) : reinterpret_cast(DefaultAssets["Game_Icon"]->textureId), ImVec2(16.0f, 16.0f)); + ImGui::Image(GetTextureByID(DefaultAssets["Game_Icon"]->textureId), ImVec2(16.0f, 16.0f)); ImGui::SameLine(); ImGui::SetCursorPos(ImVec2(25, 0)); } @@ -425,6 +450,15 @@ namespace SohImGui { ImGui::EndMenu(); } + for (const auto& category : windowCategories) { + if (ImGui::BeginMenu(category.first.c_str())) { + for (const std::string& name : category.second) { + HOOK(ImGui::MenuItem(name.c_str(), nullptr, &customWindows[name].enabled)); + } + ImGui::EndMenu(); + } + } + ImGui::EndMenuBar(); } @@ -527,6 +561,13 @@ namespace SohImGui { console->Draw(); + for (auto& windowIter : customWindows) { + CustomWindow& window = windowIter.second; + if (window.drawFunc != nullptr) { + window.drawFunc(window.enabled); + } + } + ImGui::Render(); ImGuiRenderDrawData(ImGui::GetDrawData()); if (UseViewports()) { @@ -538,4 +579,22 @@ namespace SohImGui { void BindCmd(const std::string& cmd, CommandEntry entry) { console->Commands[cmd] = std::move(entry); } -} + + void AddWindow(const std::string& category, const std::string& name, WindowDrawFunc drawFunc) { + if (customWindows.contains(name)) { + SPDLOG_ERROR("SohImGui::AddWindow: Attempting to add duplicate window name %s", name.c_str()); + return; + } + + customWindows[name] = { + .enabled = false, + .drawFunc = drawFunc + }; + + windowCategories[category].emplace_back(name); + } + + ImTextureID GetTextureByName(const std::string& name) { + return GetTextureByID(DefaultAssets[name]->textureId); + } +} \ No newline at end of file diff --git a/libultraship/libultraship/SohImGuiImpl.h b/libultraship/libultraship/SohImGuiImpl.h index b7c946eff..8275e4735 100644 --- a/libultraship/libultraship/SohImGuiImpl.h +++ b/libultraship/libultraship/SohImGuiImpl.h @@ -47,11 +47,23 @@ namespace SohImGui { } sdl; } EventImpl; + extern WindowImpl impl; + + using WindowDrawFunc = void(*)(bool& enabled); + + typedef struct { + bool enabled; + WindowDrawFunc drawFunc; + } CustomWindow; + extern Console* console; void Init(WindowImpl window_impl); void Update(EventImpl event); void Draw(void); void ShowCursor(bool hide, Dialogues w); void BindCmd(const std::string& cmd, CommandEntry entry); - void* GetTextureByID(int id); + void AddWindow(const std::string& category, const std::string& name, WindowDrawFunc drawFunc); + void LoadResource(const std::string& name, const std::string& path); + ImTextureID GetTextureByID(int id); + ImTextureID GetTextureByName(const std::string& name); } diff --git a/soh/soh.vcxproj b/soh/soh.vcxproj index aa6dee304..5560bde76 100644 --- a/soh/soh.vcxproj +++ b/soh/soh.vcxproj @@ -178,6 +178,8 @@ + + @@ -922,6 +924,8 @@ + + diff --git a/soh/soh.vcxproj.filters b/soh/soh.vcxproj.filters index 30ca9d4ed..de9ad6f96 100644 --- a/soh/soh.vcxproj.filters +++ b/soh/soh.vcxproj.filters @@ -76,6 +76,12 @@ {18b9727f-30de-4ab8-a317-916090d4a110} + + {9a4378ec-e30f-47b6-9ad6-5ce738b4cf99} + + + {04fc1c52-49ff-48e2-ae23-2c00867374f8} + @@ -2169,6 +2175,12 @@ Source Files\src\overlays\actors + + Source Files\soh\Enhancements\debugger + + + Source Files\soh\Enhancements\debugger + @@ -3710,6 +3722,12 @@ Header Files + + Header Files\soh\Enhancements\debugger + + + Header Files\soh\Enhancements\debugger + diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp new file mode 100644 index 000000000..95e2f912c --- /dev/null +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp @@ -0,0 +1,527 @@ +#include "debugSaveEditor.h" +#include "../libultraship/SohImGuiImpl.h" + +#include +#include +#include + +extern "C" { +#include +#include "variables.h" +#include "functions.h" +#include "macros.h" +extern GlobalContext* gGlobalCtx; + +#include "textures/icon_item_static/icon_item_static.h" +} + +typedef struct { + uint32_t id; + std::string name; + std::string texturePath; +} ItemMapEntry; + +#define ITEM_MAP_ENTRY(id) \ + { \ + id, { \ + id, #id, static_cast(gItemIcons[id]) \ + } \ + } + +// Maps items ids to info for use in ImGui +std::map itemMapping = { + ITEM_MAP_ENTRY(ITEM_STICK), + ITEM_MAP_ENTRY(ITEM_NUT), + ITEM_MAP_ENTRY(ITEM_BOMB), + ITEM_MAP_ENTRY(ITEM_BOW), + ITEM_MAP_ENTRY(ITEM_ARROW_FIRE), + ITEM_MAP_ENTRY(ITEM_DINS_FIRE), + ITEM_MAP_ENTRY(ITEM_SLINGSHOT), + ITEM_MAP_ENTRY(ITEM_OCARINA_FAIRY), + ITEM_MAP_ENTRY(ITEM_OCARINA_TIME), + ITEM_MAP_ENTRY(ITEM_BOMBCHU), + ITEM_MAP_ENTRY(ITEM_HOOKSHOT), + ITEM_MAP_ENTRY(ITEM_LONGSHOT), + ITEM_MAP_ENTRY(ITEM_ARROW_ICE), + ITEM_MAP_ENTRY(ITEM_FARORES_WIND), + ITEM_MAP_ENTRY(ITEM_BOOMERANG), + ITEM_MAP_ENTRY(ITEM_LENS), + ITEM_MAP_ENTRY(ITEM_BEAN), + ITEM_MAP_ENTRY(ITEM_HAMMER), + ITEM_MAP_ENTRY(ITEM_ARROW_LIGHT), + ITEM_MAP_ENTRY(ITEM_NAYRUS_LOVE), + ITEM_MAP_ENTRY(ITEM_BOTTLE), + ITEM_MAP_ENTRY(ITEM_POTION_RED), + ITEM_MAP_ENTRY(ITEM_POTION_GREEN), + ITEM_MAP_ENTRY(ITEM_POTION_BLUE), + ITEM_MAP_ENTRY(ITEM_FAIRY), + ITEM_MAP_ENTRY(ITEM_FISH), + ITEM_MAP_ENTRY(ITEM_MILK_BOTTLE), + ITEM_MAP_ENTRY(ITEM_LETTER_RUTO), + ITEM_MAP_ENTRY(ITEM_BLUE_FIRE), + ITEM_MAP_ENTRY(ITEM_BUG), + ITEM_MAP_ENTRY(ITEM_BIG_POE), + ITEM_MAP_ENTRY(ITEM_MILK_HALF), + ITEM_MAP_ENTRY(ITEM_POE), + ITEM_MAP_ENTRY(ITEM_WEIRD_EGG), + ITEM_MAP_ENTRY(ITEM_CHICKEN), + ITEM_MAP_ENTRY(ITEM_LETTER_ZELDA), + ITEM_MAP_ENTRY(ITEM_MASK_KEATON), + ITEM_MAP_ENTRY(ITEM_MASK_SKULL), + ITEM_MAP_ENTRY(ITEM_MASK_SPOOKY), + ITEM_MAP_ENTRY(ITEM_MASK_BUNNY), + ITEM_MAP_ENTRY(ITEM_MASK_GORON), + ITEM_MAP_ENTRY(ITEM_MASK_ZORA), + ITEM_MAP_ENTRY(ITEM_MASK_GERUDO), + ITEM_MAP_ENTRY(ITEM_MASK_TRUTH), + ITEM_MAP_ENTRY(ITEM_SOLD_OUT), + ITEM_MAP_ENTRY(ITEM_POCKET_EGG), + ITEM_MAP_ENTRY(ITEM_POCKET_CUCCO), + ITEM_MAP_ENTRY(ITEM_COJIRO), + ITEM_MAP_ENTRY(ITEM_ODD_MUSHROOM), + ITEM_MAP_ENTRY(ITEM_ODD_POTION), + ITEM_MAP_ENTRY(ITEM_SAW), + ITEM_MAP_ENTRY(ITEM_SWORD_BROKEN), + ITEM_MAP_ENTRY(ITEM_PRESCRIPTION), + ITEM_MAP_ENTRY(ITEM_FROG), + ITEM_MAP_ENTRY(ITEM_EYEDROPS), + ITEM_MAP_ENTRY(ITEM_CLAIM_CHECK), + ITEM_MAP_ENTRY(ITEM_BOW_ARROW_FIRE), + ITEM_MAP_ENTRY(ITEM_BOW_ARROW_ICE), + ITEM_MAP_ENTRY(ITEM_BOW_ARROW_LIGHT), + ITEM_MAP_ENTRY(ITEM_SWORD_KOKIRI), + ITEM_MAP_ENTRY(ITEM_SWORD_MASTER), + ITEM_MAP_ENTRY(ITEM_SWORD_BGS), + ITEM_MAP_ENTRY(ITEM_SHIELD_DEKU), + ITEM_MAP_ENTRY(ITEM_SHIELD_HYLIAN), + ITEM_MAP_ENTRY(ITEM_SHIELD_MIRROR), + ITEM_MAP_ENTRY(ITEM_TUNIC_KOKIRI), + ITEM_MAP_ENTRY(ITEM_TUNIC_GORON), + ITEM_MAP_ENTRY(ITEM_TUNIC_ZORA), + ITEM_MAP_ENTRY(ITEM_BOOTS_KOKIRI), + ITEM_MAP_ENTRY(ITEM_BOOTS_IRON), + ITEM_MAP_ENTRY(ITEM_BOOTS_HOVER), + ITEM_MAP_ENTRY(ITEM_BULLET_BAG_30), + ITEM_MAP_ENTRY(ITEM_BULLET_BAG_40), + ITEM_MAP_ENTRY(ITEM_BULLET_BAG_50), + ITEM_MAP_ENTRY(ITEM_QUIVER_30), + ITEM_MAP_ENTRY(ITEM_QUIVER_40), + ITEM_MAP_ENTRY(ITEM_QUIVER_50), + ITEM_MAP_ENTRY(ITEM_BOMB_BAG_20), + ITEM_MAP_ENTRY(ITEM_BOMB_BAG_30), + ITEM_MAP_ENTRY(ITEM_BOMB_BAG_40), + ITEM_MAP_ENTRY(ITEM_BRACELET), + ITEM_MAP_ENTRY(ITEM_GAUNTLETS_SILVER), + ITEM_MAP_ENTRY(ITEM_GAUNTLETS_GOLD), + ITEM_MAP_ENTRY(ITEM_SCALE_SILVER), + ITEM_MAP_ENTRY(ITEM_SCALE_GOLDEN), + ITEM_MAP_ENTRY(ITEM_SWORD_KNIFE), + ITEM_MAP_ENTRY(ITEM_WALLET_ADULT), + ITEM_MAP_ENTRY(ITEM_WALLET_GIANT), + ITEM_MAP_ENTRY(ITEM_SEEDS), + ITEM_MAP_ENTRY(ITEM_FISHING_POLE), +}; + +// Maps entries in the GS flag array to the area name it represents +std::vector gsMapping = { + "Deku Tree", + "Dodongo's Cavern", + "Inside Jabu-Jabu's Belly", + "Forest Temple", + "Fire Temple", + "Water Temple", + "Spirit Temple", + "Shadow Temple", + "Bottom of the Well", + "Ice Cavern", + "Hyrule Field", + "Lon Lon Ranch", + "Kokiri Forest", + "Lost Woods, Sacred Forest Meadow", + "Castle Town and Ganon's Castle", + "Death Mountain Trail, Goron City", + "Kakariko Village", + "Zora Fountain, River", + "Lake Hylia", + "Gerudo Valley", + "Gerudo Fortress", + "Desert Colossus, Haunted Wasteland", +}; +extern "C" u8 gAreaGsFlags[]; + +extern "C" u8 gAmmoItems[]; + +// Modification of gAmmoItems that replaces ITEM_NONE with the item in inventory slot it represents +u8 gAllAmmoItems[] = { + ITEM_STICK, ITEM_NUT, ITEM_BOMB, ITEM_BOW, ITEM_ARROW_FIRE, ITEM_DINS_FIRE, + ITEM_SLINGSHOT, ITEM_OCARINA_TIME, ITEM_BOMBCHU, ITEM_LONGSHOT, ITEM_ARROW_ICE, ITEM_FARORES_WIND, + ITEM_BOOMERANG, ITEM_LENS, ITEM_BEAN, ITEM_HAMMER, +}; + +// Adds a text tooltip for the previous ImGui item +void SetLastItemHoverText(const std::string& text) { + if (ImGui::IsItemHovered()) { + ImGui::BeginTooltip(); + ImGui::Text(text.c_str()); + ImGui::EndTooltip(); + } +} + +// Adds a "?" next to the previous ImGui item with a custom tooltip +void InsertHelpHoverText(const std::string& text) { + ImGui::SameLine(); + ImGui::TextColored(ImVec4(0.7f, 0.7f, 0.7f, 1.0f), "?"); + if (ImGui::IsItemHovered()) { + ImGui::BeginTooltip(); + ImGui::Text(text.c_str()); + ImGui::EndTooltip(); + } +} + +void DrawSaveEditor(bool& open) { + if (!open) { + return; + } + + ImGui::SetNextWindowSize(ImVec2(520, 600), ImGuiCond_FirstUseEver); + if (!ImGui::Begin("Save Editor", &open)) { + ImGui::End(); + return; + } + + // TODO This is the bare minimum to get the player name showing + // There will need to be more effort to get it robust and editable + std::string name; + for (int i = 0; i < 8; i++) { + char letter = gSaveContext.playerName[i] + 0x3D; + if (letter == '{') { + letter = '\0'; + } + name += letter; + } + name += '\0'; + + if (ImGui::BeginTabBar("SaveContextTabBar", ImGuiTabBarFlags_NoCloseWithMiddleMouseButton)) { + if (ImGui::BeginTabItem("Info")) { + ImGui::PushItemWidth(ImGui::GetFontSize() * 6); + + ImGui::Text("Name: %s", name.c_str()); + InsertHelpHoverText("Player Name"); + + // Use an intermediary to keep the health from updating (and potentially killing the player) + // until it is done being edited + int16_t healthIntermediary = gSaveContext.healthCapacity; + ImGui::InputScalar("Max Health", ImGuiDataType_S16, &healthIntermediary); + if (ImGui::IsItemDeactivated()) { + gSaveContext.healthCapacity = healthIntermediary; + } + InsertHelpHoverText("Maximum health. 16 units per full heart"); + if (gSaveContext.health > gSaveContext.healthCapacity) { + gSaveContext.health = gSaveContext.healthCapacity; // Clamp health to new max + } + + const uint16_t healthMin = 0; + const uint16_t healthMax = gSaveContext.healthCapacity; + ImGui::SetNextItemWidth(ImGui::GetFontSize() * 15); + ImGui::SliderScalar("Health", ImGuiDataType_S16, &gSaveContext.health, &healthMin, &healthMax); + InsertHelpHoverText("Current health. 16 units per full heart"); + + bool doubleDefense = gSaveContext.doubleDefense != 0; + if (ImGui::Checkbox("Double Defense", &doubleDefense)) { + gSaveContext.doubleDefense = doubleDefense; + gSaveContext.inventory.defenseHearts = + gSaveContext.doubleDefense ? 20 : 0; // Set to get the border drawn in the UI + } + InsertHelpHoverText("Is double defense unlocked?"); + + std::string magicName; + if (gSaveContext.magicLevel == 2) { + magicName = "Double"; + } else if (gSaveContext.magicLevel == 1) { + magicName = "Single"; + } else { + magicName = "None"; + } + ImGui::SetNextItemWidth(ImGui::GetFontSize() * 6); + if (ImGui::BeginCombo("Magic Level", magicName.c_str())) { + if (ImGui::Selectable("Double")) { + gSaveContext.magicLevel = 2; + gSaveContext.magicAcquired = true; + gSaveContext.doubleMagic = true; + } + if (ImGui::Selectable("Single")) { + gSaveContext.magicLevel = 1; + gSaveContext.magicAcquired = true; + gSaveContext.doubleMagic = false; + } + if (ImGui::Selectable("None")) { + gSaveContext.magicLevel = 0; + gSaveContext.magicAcquired = false; + gSaveContext.doubleMagic = false; + } + + ImGui::EndCombo(); + } + InsertHelpHoverText("Current magic level"); + gSaveContext.unk_13F4 = gSaveContext.magicLevel * 0x30; // Set to get the bar drawn in the UI + if (gSaveContext.magic > gSaveContext.unk_13F4) { + gSaveContext.magic = gSaveContext.unk_13F4; // Clamp magic to new max + } + + const uint8_t magicMin = 0; + const uint8_t magicMax = gSaveContext.unk_13F4; + ImGui::SetNextItemWidth(ImGui::GetFontSize() * 15); + ImGui::SliderScalar("Magic", ImGuiDataType_S8, &gSaveContext.magic, &magicMin, &magicMax); + InsertHelpHoverText("Current magic. 48 units per magic level"); + + ImGui::InputScalar("Rupees", ImGuiDataType_S16, &gSaveContext.rupees); + InsertHelpHoverText("Current rupees"); + + const uint16_t dayTimeMin = 0; + const uint16_t dayTimeMax = 0xFFFF; + ImGui::SetNextItemWidth(ImGui::GetFontSize() * 15); + ImGui::SliderScalar("Time", ImGuiDataType_U16, &gSaveContext.dayTime, &dayTimeMin, &dayTimeMax); + InsertHelpHoverText("Time of day"); + if (ImGui::Button("Dawn")) { + gSaveContext.dayTime = 0x4000; + } + ImGui::SameLine(); + if (ImGui::Button("Noon")) { + gSaveContext.dayTime = 0x8000; + } + ImGui::SameLine(); + if (ImGui::Button("Sunset")) { + gSaveContext.dayTime = 0xC000; + } + ImGui::SameLine(); + if (ImGui::Button("Midnight")) { + gSaveContext.dayTime = 0; + } + + ImGui::InputScalar("Total Days", ImGuiDataType_S32, &gSaveContext.totalDays); + InsertHelpHoverText("Total number of days elapsed since the start of the game"); + + ImGui::InputScalar("Deaths", ImGuiDataType_U16, &gSaveContext.deaths); + InsertHelpHoverText("Total number of deaths"); + + // TODO Move to quest status screen once the page is created + ImGui::InputScalar("GS Count", ImGuiDataType_S16, &gSaveContext.inventory.gsTokens); + InsertHelpHoverText("Number of gold skulltula tokens aquired"); + + bool bgsFlag = gSaveContext.bgsFlag != 0; + if (ImGui::Checkbox("Has BGS", &bgsFlag)) { + gSaveContext.bgsFlag = bgsFlag; + } + InsertHelpHoverText("Is Biggoron sword unlocked? Replaces Giant's knife"); + + ImGui::InputScalar("Sword Health", ImGuiDataType_U16, &gSaveContext.swordHealth); + InsertHelpHoverText("Giant's knife health. Default is 8. Must be >0 for Biggoron sword to work"); + + ImGui::InputScalar("Bgs Day Count", ImGuiDataType_S32, &gSaveContext.bgsDayCount); + InsertHelpHoverText("Total number of days elapsed since giving Biggoron the claim check"); + + // TODO Changing Link's age is more involved than just setting gSaveContext.linkAge + // It might not fit here and instead should be only changable when changing scenes + /* + if (ImGui::BeginCombo("Link Age", LINK_IS_ADULT ? "Adult" : "Child")) { + if (ImGui::Selectable("Adult")) { + gSaveContext.linkAge = 0; + } + if (ImGui::Selectable("Child")) { + gSaveContext.linkAge = 1; + } + + ImGui::EndCombo(); + } + */ + + ImGui::PopItemWidth(); + ImGui::EndTabItem(); + } + + if (ImGui::BeginTabItem("Inventory")) { + static bool restrictToValid = true; + + ImGui::Checkbox("Restrict to valid items", &restrictToValid); + InsertHelpHoverText("Restricts items and ammo to only what is possible to legally acquire in-game"); + + for (int32_t y = 0; y < 4; y++) { + for (int32_t x = 0; x < 6; x++) { + int32_t index = x + y * 6; + static int32_t selectedIndex = -1; + static const char* itemPopupPicker = "itemPopupPicker"; + + ImGui::PushID(index); + + if (x != 0) { + ImGui::SameLine(); + } + + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(1, 1, 1, 0)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0f); + uint8_t item = gSaveContext.inventory.items[index]; + if (item != ITEM_NONE) { + const ItemMapEntry& slotEntry = itemMapping.find(item)->second; + if (ImGui::ImageButton(SohImGui::GetTextureByName(slotEntry.name), ImVec2(32.0f, 32.0f), + ImVec2(0, 0), ImVec2(1, 1), 0)) { + selectedIndex = index; + ImGui::OpenPopup(itemPopupPicker); + } + } else { + if (ImGui::Button("##itemNone", ImVec2(32.0f, 32.0f))) { + selectedIndex = index; + ImGui::OpenPopup(itemPopupPicker); + } + } + ImGui::PopStyleVar(); + ImGui::PopStyleColor(); + + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0)); + if (ImGui::BeginPopup(itemPopupPicker)) { + if (ImGui::Button("##itemNonePicker", ImVec2(32.0f, 32.0f))) { + gSaveContext.inventory.items[selectedIndex] = ITEM_NONE; + ImGui::CloseCurrentPopup(); + } + SetLastItemHoverText("ITEM_NONE"); + + std::vector possibleItems; + if (restrictToValid) { + // Scan gItemSlots to find legal items for this slot. Bottles are a special case + for (int slotIndex = 0; slotIndex < 56; slotIndex++) { + int testIndex = (selectedIndex == SLOT_BOTTLE_1 || selectedIndex == SLOT_BOTTLE_2 || + selectedIndex == SLOT_BOTTLE_3 || selectedIndex == SLOT_BOTTLE_4) + ? SLOT_BOTTLE_1 + : selectedIndex; + if (gItemSlots[slotIndex] == testIndex) { + possibleItems.push_back(itemMapping[slotIndex]); + } + } + } else { + for (const auto& entry : itemMapping) { + possibleItems.push_back(entry.second); + } + } + + for (int32_t pickerIndex = 0; pickerIndex < possibleItems.size(); pickerIndex++) { + if (((pickerIndex + 1) % 8) != 0) { + ImGui::SameLine(); + } + const ItemMapEntry& slotEntry = possibleItems[pickerIndex]; + if (ImGui::ImageButton(SohImGui::GetTextureByName(slotEntry.name), ImVec2(32.0f, 32.0f), + ImVec2(0, 0), ImVec2(1, 1), 0)) { + gSaveContext.inventory.items[selectedIndex] = slotEntry.id; + ImGui::CloseCurrentPopup(); + } + SetLastItemHoverText(slotEntry.name); + } + + ImGui::EndPopup(); + } + ImGui::PopStyleVar(); + + ImGui::PopID(); + } + } + + ImGui::Text("Ammo"); + for (uint32_t ammoIndex = 0, drawnAmmoItems = 0; ammoIndex < 16; ammoIndex++) { + uint8_t item = (restrictToValid) ? gAmmoItems[ammoIndex] : gAllAmmoItems[ammoIndex]; + if (item != ITEM_NONE) { + // For legal items, display as 1 row of 7. For unrestricted items, display rows of 6 to match + // inventory + if ((restrictToValid && (drawnAmmoItems != 0)) || ((drawnAmmoItems % 6) != 0)) { + ImGui::SameLine(); + } + drawnAmmoItems++; + + ImGui::PushID(ammoIndex); + ImGui::PushItemWidth(32.0f); + ImGui::BeginGroup(); + + ImGui::Image(SohImGui::GetTextureByName(itemMapping[item].name), ImVec2(32.0f, 32.0f)); + ImGui::InputScalar("##ammoInput", ImGuiDataType_S8, &AMMO(item)); + + ImGui::EndGroup(); + ImGui::PopItemWidth(); + ImGui::PopID(); + } + } + + ImGui::EndTabItem(); + } + + if (ImGui::BeginTabItem("Flags")) { + static uint32_t selectedGsMap = 0; + ImGui::Text("Gold Skulltulas"); + ImGui::Text("Map"); + ImGui::SameLine(); + if (ImGui::BeginCombo("##Gold Skulltula Map", gsMapping[selectedGsMap].c_str())) { + for (int32_t gsIndex = 0; gsIndex < gsMapping.size(); gsIndex++) { + if (ImGui::Selectable(gsMapping[gsIndex].c_str())) { + selectedGsMap = gsIndex; + } + } + + ImGui::EndCombo(); + } + + // TODO We should write out descriptions for each one... ugh + ImGui::Text("Flags"); + uint32_t currentFlags = GET_GS_FLAGS(selectedGsMap); + uint32_t allFlags = gAreaGsFlags[selectedGsMap]; + uint32_t setMask = 1; + // Iterate over bitfield and create a checkbox for each skulltula + while (allFlags != 0) { + bool isThisSet = (currentFlags & 0x1) == 0x1; + + ImGui::SameLine(); + ImGui::PushID(allFlags); + if (ImGui::Checkbox("##gs", &isThisSet)) { + if (isThisSet) { + SET_GS_FLAGS(selectedGsMap, setMask); + } else { + // Have to do this roundabout method as the macro does not support clearing flags + uint32_t currentFlagsBase = GET_GS_FLAGS(selectedGsMap); + gSaveContext.gsFlags[selectedGsMap >> 2] &= ~gGsFlagsMasks[selectedGsMap & 3]; + SET_GS_FLAGS(selectedGsMap, currentFlagsBase & ~setMask); + } + } + + ImGui::PopID(); + + allFlags >>= 1; + currentFlags >>= 1; + setMask <<= 1; + } + + static bool keepGsCountUpdated = true; + ImGui::Checkbox("Keep GS Count Updated", &keepGsCountUpdated); + InsertHelpHoverText("Automatically adjust the number of gold skulltula tokens acquired based on set flags"); + int32_t gsCount = 0; + if (keepGsCountUpdated) { + for (int32_t gsFlagIndex = 0; gsFlagIndex < 6; gsFlagIndex++) { + gsCount += std::popcount(static_cast(gSaveContext.gsFlags[gsFlagIndex])); + } + gSaveContext.inventory.gsTokens = gsCount; + } + + // TODO other flag types, like switch, clear, etc. + // These flags interact with the actor context, so it's a bit more complicated + + ImGui::EndTabItem(); + } + + ImGui::EndTabBar(); + } + + ImGui::End(); +} + +void InitSaveEditor() { + SohImGui::AddWindow("Debug", "Save Editor", DrawSaveEditor); + + // Load item icons into ImGui + for (const auto& entry : itemMapping) { + SohImGui::LoadResource(entry.second.name, entry.second.texturePath); + } +} diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.h b/soh/soh/Enhancements/debugger/debugSaveEditor.h new file mode 100644 index 000000000..084f7cadc --- /dev/null +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.h @@ -0,0 +1,3 @@ +#pragma once + +void InitSaveEditor(); diff --git a/soh/soh/Enhancements/debugger/debugger.cpp b/soh/soh/Enhancements/debugger/debugger.cpp new file mode 100644 index 000000000..e493375cd --- /dev/null +++ b/soh/soh/Enhancements/debugger/debugger.cpp @@ -0,0 +1,6 @@ +#include "debugger.h" +#include "debugSaveEditor.h" + +void Debug_Init(void) { + InitSaveEditor(); +} diff --git a/soh/soh/Enhancements/debugger/debugger.h b/soh/soh/Enhancements/debugger/debugger.h new file mode 100644 index 000000000..4bc0f985b --- /dev/null +++ b/soh/soh/Enhancements/debugger/debugger.h @@ -0,0 +1,3 @@ +#pragma once + +void Debug_Init(void); diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index d10600bce..007afd702 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -22,6 +22,7 @@ #include "Lib/stb/stb_image.h" #include "AudioPlayer.h" #include "../soh/Enhancements/debugconsole.h" +#include "../soh/Enhancements/debugger/debugger.h" #include "Utils/BitConverter.h" OTRGlobals* OTRGlobals::Instance; @@ -54,6 +55,7 @@ extern "C" void InitOTR() { clearMtx = (uintptr_t)&gMtxClear; OTRMessage_Init(); DebugConsole_Init(); + Debug_Init(); } extern "C" uint64_t GetFrequency() { From 06fd7f662af4358e9a6111270ce0cd311a9af9ea Mon Sep 17 00:00:00 2001 From: Josh Bodner <30329717+jbodner09@users.noreply.github.com> Date: Sun, 10 Apr 2022 15:19:26 -0700 Subject: [PATCH 34/83] Added DPad support to file selection and pause screens (#124) * Added DPad support to file selection and pause screens * Wrap changes behind CVar * Fix merge conflict for real * Remove unnecessary const_cast * Fixed transparent texture making framebuffers also transparent in D3D11. (#84) This happened with the Mirror Shield in the inventory screen preview. * Add save editor * Added DPad support to file selection and pause screens * Fixing rebase conflict * Remove unnecessary const_cast Co-authored-by: MaikelChan Co-authored-by: rozlette --- libultraship/libultraship/GameSettings.cpp | 6 +- libultraship/libultraship/GameSettings.h | 1 + libultraship/libultraship/SohImGuiImpl.cpp | 9 +- .../ovl_file_choose/z_file_choose.c | 8 +- .../ovl_file_choose/z_file_copy_erase.c | 21 ++- .../ovl_file_choose/z_file_nameset_PAL.c | 21 ++- .../ovl_kaleido_scope/z_kaleido_collect.c | 163 +++++++++--------- .../ovl_kaleido_scope/z_kaleido_equipment.c | 13 +- .../misc/ovl_kaleido_scope/z_kaleido_item.c | 17 +- .../ovl_kaleido_scope/z_kaleido_map_PAL.c | 30 ++-- .../misc/ovl_kaleido_scope/z_kaleido_prompt.c | 5 +- .../ovl_kaleido_scope/z_kaleido_scope_PAL.c | 5 +- 12 files changed, 163 insertions(+), 136 deletions(-) diff --git a/libultraship/libultraship/GameSettings.cpp b/libultraship/libultraship/GameSettings.cpp index f12042bc0..28f4b23cb 100644 --- a/libultraship/libultraship/GameSettings.cpp +++ b/libultraship/libultraship/GameSettings.cpp @@ -59,7 +59,7 @@ namespace Game { CVar_SetS32("gPauseLiveLink", Settings.enhancements.animated_pause_menu); Settings.enhancements.minimal_ui = stob(Conf[EnhancementSection]["minimal_ui"]); - CVar_SetS32(const_cast("gMinimalUI"), Settings.enhancements.minimal_ui); + CVar_SetS32("gMinimalUI", Settings.enhancements.minimal_ui); // Audio Settings.audio.master = Ship::stof(Conf[AudioSection]["master"]); @@ -89,6 +89,9 @@ namespace Game { Settings.controller.input_enabled = stob(Conf[ControllerSection]["input_enabled"]); CVar_SetS32("gInputEnabled", Settings.controller.input_enabled); + + Settings.controller.dpad_pause_name = stob(Conf[ControllerSection]["dpad_pause_name"]); + CVar_SetS32("gDpadPauseName", Settings.controller.dpad_pause_name); // Cheats Settings.cheats.debug_mode = stob(Conf[CheatSection]["debug_mode"]); @@ -149,6 +152,7 @@ namespace Game { Conf[ControllerSection]["rumble_strength"] = std::to_string(Settings.controller.rumble_strength); Conf[ControllerSection]["input_scale"] = std::to_string(Settings.controller.input_scale); Conf[ControllerSection]["input_enabled"] = std::to_string(Settings.controller.input_enabled); + Conf[ControllerSection]["dpad_pause_name"] = std::to_string(Settings.controller.dpad_pause_name); // Cheats Conf[CheatSection]["debug_mode"] = std::to_string(Settings.cheats.debug_mode); diff --git a/libultraship/libultraship/GameSettings.h b/libultraship/libultraship/GameSettings.h index 4f9bb4c99..15ebdad16 100644 --- a/libultraship/libultraship/GameSettings.h +++ b/libultraship/libultraship/GameSettings.h @@ -34,6 +34,7 @@ struct SoHConfigType { float gyroDriftX = 0.0f; float gyroDriftY = 0.0f; bool input_enabled = false; + bool dpad_pause_name = false; } controller; // Cheats diff --git a/libultraship/libultraship/SohImGuiImpl.cpp b/libultraship/libultraship/SohImGuiImpl.cpp index 7489d14a2..cef156246 100644 --- a/libultraship/libultraship/SohImGuiImpl.cpp +++ b/libultraship/libultraship/SohImGuiImpl.cpp @@ -353,6 +353,13 @@ namespace SohImGui { needs_save = true; } + ImGui::Separator(); + + if (ImGui::Checkbox("Dpad Support on Pause and File Select", &Game::Settings.controller.dpad_pause_name)) { + CVar_SetS32("gDpadPauseName", Game::Settings.controller.dpad_pause_name); + needs_save = true; + } + ImGui::EndMenu(); } @@ -367,7 +374,7 @@ namespace SohImGui { } if (ImGui::Checkbox("Minimal UI", &Game::Settings.enhancements.minimal_ui)) { - CVar_SetS32(const_cast("gMinimalUI"), Game::Settings.enhancements.minimal_ui); + CVar_SetS32("gMinimalUI", Game::Settings.enhancements.minimal_ui); needs_save = true; } diff --git a/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c b/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c index ca5154567..84543fa26 100644 --- a/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c +++ b/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c @@ -179,6 +179,7 @@ void FileChoose_UpdateMainMenu(GameState* thisx) { FileChooseContext* this = (FileChooseContext*)thisx; SramContext* sramCtx = &this->sramCtx; Input* input = &this->state.input[0]; + bool dpad = CVar_GetS32("gDpadPauseName", 0); if (CHECK_BTN_ALL(input->press.button, BTN_START) || CHECK_BTN_ALL(input->press.button, BTN_A)) { if (this->buttonIndex <= FS_BTN_MAIN_FILE_3) { @@ -237,10 +238,10 @@ void FileChoose_UpdateMainMenu(GameState* thisx) { } } } else { - if (ABS(this->stickRelY) > 30) { + if ((ABS(this->stickRelY) > 30) || (dpad && CHECK_BTN_ANY(input->press.button, BTN_DDOWN | BTN_DUP))) { Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); - if (this->stickRelY > 30) { + if ((this->stickRelY > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DUP))) { this->buttonIndex--; if (this->buttonIndex < FS_BTN_MAIN_FILE_1) { this->buttonIndex = FS_BTN_MAIN_OPTIONS; @@ -1318,6 +1319,7 @@ void FileChoose_FadeInFileInfo(GameState* thisx) { void FileChoose_ConfirmFile(GameState* thisx) { FileChooseContext* this = (FileChooseContext*)thisx; Input* input = &this->state.input[0]; + bool dpad = CVar_GetS32("gDpadPauseName", 0); if (CHECK_BTN_ALL(input->press.button, BTN_START) || (CHECK_BTN_ALL(input->press.button, BTN_A))) { if (this->confirmButtonIndex == FS_BTN_CONFIRM_YES) { @@ -1332,7 +1334,7 @@ void FileChoose_ConfirmFile(GameState* thisx) { } else if (CHECK_BTN_ALL(input->press.button, BTN_B)) { Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CLOSE, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); this->selectMode++; - } else if (ABS(this->stickRelY) >= 30) { + } else if ((ABS(this->stickRelY) >= 30) || (dpad && CHECK_BTN_ANY(input->press.button, BTN_DDOWN | BTN_DUP))) { Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); this->confirmButtonIndex ^= 1; } diff --git a/soh/src/overlays/gamestates/ovl_file_choose/z_file_copy_erase.c b/soh/src/overlays/gamestates/ovl_file_choose/z_file_copy_erase.c index 5d13c408d..1f44abe95 100644 --- a/soh/src/overlays/gamestates/ovl_file_choose/z_file_copy_erase.c +++ b/soh/src/overlays/gamestates/ovl_file_choose/z_file_copy_erase.c @@ -62,6 +62,7 @@ void FileChoose_SelectCopySource(GameState* thisx) { FileChooseContext* this = (FileChooseContext*)thisx; SramContext* sramCtx = &this->sramCtx; Input* input = &this->state.input[0]; + bool dpad = CVar_GetS32("gDpadPauseName", 0); if (((this->buttonIndex == FS_BTN_COPY_QUIT) && CHECK_BTN_ANY(input->press.button, BTN_A | BTN_START)) || CHECK_BTN_ALL(input->press.button, BTN_B)) { @@ -82,10 +83,10 @@ void FileChoose_SelectCopySource(GameState* thisx) { Audio_PlaySoundGeneral(NA_SE_SY_FSEL_ERROR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); } } else { - if (ABS(this->stickRelY) >= 30) { + if ((ABS(this->stickRelY) >= 30) || (dpad && CHECK_BTN_ANY(input->press.button, BTN_DDOWN | BTN_DUP))) { Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); - if (this->stickRelY >= 30) { + if ((this->stickRelY >= 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DUP))) { this->buttonIndex--; if (this->buttonIndex < FS_BTN_COPY_FILE_1) { @@ -174,6 +175,7 @@ void FileChoose_SelectCopyDest(GameState* thisx) { FileChooseContext* this = (FileChooseContext*)thisx; SramContext* sramCtx = &this->sramCtx; Input* input = &this->state.input[0]; + bool dpad = CVar_GetS32("gDpadPauseName", 0); if (((this->buttonIndex == FS_BTN_COPY_QUIT) && CHECK_BTN_ANY(input->press.button, BTN_A | BTN_START)) || CHECK_BTN_ALL(input->press.button, BTN_B)) { @@ -194,10 +196,10 @@ void FileChoose_SelectCopyDest(GameState* thisx) { } } else { - if (ABS(this->stickRelY) >= 30) { + if ((ABS(this->stickRelY) >= 30) || (dpad && CHECK_BTN_ANY(input->press.button, BTN_DDOWN | BTN_DUP))) { Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); - if (this->stickRelY >= 30) { + if ((this->stickRelY >= 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DUP))) { this->buttonIndex--; if ((this->buttonIndex == this->selectedFileIndex)) { @@ -360,6 +362,7 @@ void FileChoose_CopyConfirm(GameState* thisx) { SramContext* sramCtx = &this->sramCtx; Input* input = &this->state.input[0]; u16 dayTime; + bool dpad = CVar_GetS32("gDpadPauseName", 0); if (((this->buttonIndex != FS_BTN_CONFIRM_YES) && CHECK_BTN_ANY(input->press.button, BTN_A | BTN_START)) || CHECK_BTN_ALL(input->press.button, BTN_B)) { @@ -377,7 +380,7 @@ void FileChoose_CopyConfirm(GameState* thisx) { this->configMode = CM_COPY_ANIM_1; func_800AA000(300.0f, 0xB4, 0x14, 0x64); Audio_PlaySoundGeneral(NA_SE_SY_FSEL_DECIDE_L, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); - } else if (ABS(this->stickRelY) >= 30) { + } else if ((ABS(this->stickRelY) >= 30) || (dpad && CHECK_BTN_ANY(input->press.button, BTN_DDOWN | BTN_DUP))) { Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); this->buttonIndex ^= 1; } @@ -680,6 +683,7 @@ void FileChoose_EraseSelect(GameState* thisx) { FileChooseContext* this = (FileChooseContext*)thisx; SramContext* sramCtx = &this->sramCtx; Input* input = &this->state.input[0]; + bool dpad = CVar_GetS32("gDpadPauseName", 0); if (((this->buttonIndex == FS_BTN_COPY_QUIT) && CHECK_BTN_ANY(input->press.button, BTN_A | BTN_START)) || CHECK_BTN_ALL(input->press.button, BTN_B)) { @@ -700,10 +704,10 @@ void FileChoose_EraseSelect(GameState* thisx) { Audio_PlaySoundGeneral(NA_SE_SY_FSEL_ERROR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); } } else { - if (ABS(this->stickRelY) >= 30) { + if ((ABS(this->stickRelY) >= 30) || (dpad && CHECK_BTN_ANY(input->press.button, BTN_DDOWN | BTN_DUP))) { Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); - if (this->stickRelY >= 30) { + if ((this->stickRelY >= 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DUP))) { this->buttonIndex--; if (this->buttonIndex < FS_BTN_ERASE_FILE_1) { this->buttonIndex = FS_BTN_ERASE_QUIT; @@ -817,6 +821,7 @@ void FileChoose_SetupEraseConfirm2(GameState* thisx) { void FileChoose_EraseConfirm(GameState* thisx) { FileChooseContext* this = (FileChooseContext*)thisx; Input* input = &this->state.input[0]; + bool dpad = CVar_GetS32("gDpadPauseName", 0); if (((this->buttonIndex != FS_BTN_CONFIRM_YES) && CHECK_BTN_ANY(input->press.button, BTN_A | BTN_START)) || CHECK_BTN_ALL(input->press.button, BTN_B)) { @@ -833,7 +838,7 @@ void FileChoose_EraseConfirm(GameState* thisx) { this->nextTitleLabel = FS_TITLE_ERASE_COMPLETE; func_800AA000(200.0f, 0xFF, 0x14, 0x96); sEraseDelayTimer = 15; - } else if (ABS(this->stickRelY) >= 30) { + } else if ((ABS(this->stickRelY) >= 30) || (dpad && CHECK_BTN_ANY(input->press.button, BTN_DDOWN | BTN_DUP))) { Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); this->buttonIndex ^= 1; } diff --git a/soh/src/overlays/gamestates/ovl_file_choose/z_file_nameset_PAL.c b/soh/src/overlays/gamestates/ovl_file_choose/z_file_nameset_PAL.c index 73aa5e6d1..501986d2b 100644 --- a/soh/src/overlays/gamestates/ovl_file_choose/z_file_nameset_PAL.c +++ b/soh/src/overlays/gamestates/ovl_file_choose/z_file_nameset_PAL.c @@ -509,12 +509,14 @@ void FileChoose_StartNameEntry(GameState* thisx) { */ void FileChoose_UpdateKeyboardCursor(GameState* thisx) { FileChooseContext* this = (FileChooseContext*)thisx; + Input* input = &this->state.input[0]; s16 prevKbdX; + bool dpad = CVar_GetS32("gDpadPauseName", 0); this->kbdButton = 99; if (this->kbdY != 5) { - if (this->stickRelX < -30) { + if ((this->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) { Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); this->charIndex--; this->kbdX--; @@ -522,7 +524,7 @@ void FileChoose_UpdateKeyboardCursor(GameState* thisx) { this->kbdX = 12; this->charIndex = (this->kbdY * 13) + this->kbdX; } - } else if (this->stickRelX > 30) { + } else if ((this->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) { Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); this->charIndex++; this->kbdX++; @@ -532,13 +534,13 @@ void FileChoose_UpdateKeyboardCursor(GameState* thisx) { } } } else { - if (this->stickRelX < -30) { + if ((this->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) { Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); this->kbdX--; if (this->kbdX < 3) { this->kbdX = 4; } - } else if (this->stickRelX > 30) { + } else if ((this->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) { Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); this->kbdX++; if (this->kbdX > 4) { @@ -547,7 +549,7 @@ void FileChoose_UpdateKeyboardCursor(GameState* thisx) { } } - if (this->stickRelY > 30) { + if ((this->stickRelY > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DUP))) { Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); this->kbdY--; @@ -578,7 +580,7 @@ void FileChoose_UpdateKeyboardCursor(GameState* thisx) { this->charIndex += this->kbdX; } } - } else if (this->stickRelY < -30) { + } else if ((this->stickRelY < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DDOWN))) { Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); this->kbdY++; @@ -655,6 +657,7 @@ void FileChoose_UpdateOptionsMenu(GameState* thisx) { FileChooseContext* this = (FileChooseContext*)thisx; SramContext* sramCtx = &this->sramCtx; Input* input = &this->state.input[0]; + bool dpad = CVar_GetS32("gDpadPauseName", 0); if (CHECK_BTN_ALL(input->press.button, BTN_B)) { Audio_PlaySoundGeneral(NA_SE_SY_FSEL_DECIDE_L, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); @@ -675,7 +678,7 @@ void FileChoose_UpdateOptionsMenu(GameState* thisx) { return; } - if (this->stickRelX < -30) { + if ((this->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) { Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); if (sSelectedSetting == FS_SETTING_AUDIO) { @@ -688,7 +691,7 @@ void FileChoose_UpdateOptionsMenu(GameState* thisx) { } else { gSaveContext.zTargetSetting ^= 1; } - } else if (this->stickRelX > 30) { + } else if ((this->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) { Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); if (sSelectedSetting == FS_SETTING_AUDIO) { @@ -702,7 +705,7 @@ void FileChoose_UpdateOptionsMenu(GameState* thisx) { } } - if ((this->stickRelY < -30) || (this->stickRelY > 30)) { + if ((ABS(this->stickRelY) > 30) || (dpad && CHECK_BTN_ANY(input->press.button, BTN_DDOWN | BTN_DUP))) { Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); sSelectedSetting ^= 1; } else if (CHECK_BTN_ALL(input->press.button, BTN_A)) { diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_collect.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_collect.c index 46be1154f..80ffe8d4a 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_collect.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_collect.c @@ -74,6 +74,7 @@ void KaleidoScope_DrawQuestStatus(GlobalContext* globalCtx, GraphicsContext* gfx s16 pad2; s16 phi_s0_2; s16 sp208[3]; + bool dpad = CVar_GetS32("gDpadPauseName", 0); OPEN_DISPS(gfxCtx, "../z_kaleido_collect.c", 248); @@ -83,96 +84,92 @@ void KaleidoScope_DrawQuestStatus(GlobalContext* globalCtx, GraphicsContext* gfx if (pauseCtx->cursorSpecialPos == 0) { pauseCtx->nameColorSet = 0; + sp216 = pauseCtx->cursorSlot[PAUSE_QUEST]; + phi_s3 = pauseCtx->cursorPoint[PAUSE_QUEST]; - if ((pauseCtx->state != 6) || ((pauseCtx->stickRelX == 0) && (pauseCtx->stickRelY == 0))) { - sp216 = pauseCtx->cursorSlot[PAUSE_QUEST]; - } else { - phi_s3 = pauseCtx->cursorPoint[PAUSE_QUEST]; - - if (pauseCtx->stickRelX < -30) { - phi_s0 = D_8082A1AC[phi_s3][2]; - if (phi_s0 == -3) { - KaleidoScope_MoveCursorToSpecialPos(globalCtx, PAUSE_CURSOR_PAGE_LEFT); - pauseCtx->unk_1E4 = 0; - } else { - while (phi_s0 >= 0) { - if ((s16)KaleidoScope_UpdateQuestStatusPoint(pauseCtx, phi_s0) != 0) { - break; - } - phi_s0 = D_8082A1AC[phi_s0][2]; - } - } - } else if (pauseCtx->stickRelX > 30) { - phi_s0 = D_8082A1AC[phi_s3][3]; - if (phi_s0 == -2) { - KaleidoScope_MoveCursorToSpecialPos(globalCtx, PAUSE_CURSOR_PAGE_RIGHT); - pauseCtx->unk_1E4 = 0; - } else { - while (phi_s0 >= 0) { - if ((s16)KaleidoScope_UpdateQuestStatusPoint(pauseCtx, phi_s0) != 0) { - break; - } - phi_s0 = D_8082A1AC[phi_s0][3]; - } - } - } - - if (pauseCtx->stickRelY < -30) { - phi_s0 = D_8082A1AC[phi_s3][1]; - while (phi_s0 >= 0) { - if ((s16)KaleidoScope_UpdateQuestStatusPoint(pauseCtx, phi_s0) != 0) { - break; - } - phi_s0 = D_8082A1AC[phi_s0][1]; - } - } else if (pauseCtx->stickRelY > 30) { - phi_s0 = D_8082A1AC[phi_s3][0]; - while (phi_s0 >= 0) { - if ((s16)KaleidoScope_UpdateQuestStatusPoint(pauseCtx, phi_s0) != 0) { - break; - } - phi_s0 = D_8082A1AC[phi_s0][0]; - } - } - - if (phi_s3 != pauseCtx->cursorPoint[PAUSE_QUEST]) { + if ((pauseCtx->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) { + phi_s0 = D_8082A1AC[phi_s3][2]; + if (phi_s0 == -3) { + KaleidoScope_MoveCursorToSpecialPos(globalCtx, PAUSE_CURSOR_PAGE_LEFT); pauseCtx->unk_1E4 = 0; - Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); - } - - if (pauseCtx->cursorPoint[PAUSE_QUEST] != 0x18) { - if (CHECK_QUEST_ITEM(pauseCtx->cursorPoint[PAUSE_QUEST])) { - if (pauseCtx->cursorPoint[PAUSE_QUEST] < 6) { - phi_s0_2 = pauseCtx->cursorPoint[PAUSE_QUEST] + 0x66; - osSyncPrintf("000 ccc=%d\n", phi_s0_2); - } else if (pauseCtx->cursorPoint[PAUSE_QUEST] < 0x12) { - phi_s0_2 = pauseCtx->cursorPoint[PAUSE_QUEST] + 0x54; - osSyncPrintf("111 ccc=%d\n", phi_s0_2); - } else { - phi_s0_2 = pauseCtx->cursorPoint[PAUSE_QUEST] + 0x5A; - osSyncPrintf("222 ccc=%d (%d, %d, %d)\n", phi_s0_2, pauseCtx->cursorPoint[PAUSE_QUEST], - 0x12, 0x6C); + } else { + while (phi_s0 >= 0) { + if ((s16)KaleidoScope_UpdateQuestStatusPoint(pauseCtx, phi_s0) != 0) { + break; } + phi_s0 = D_8082A1AC[phi_s0][2]; + } + } + } else if ((pauseCtx->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) { + phi_s0 = D_8082A1AC[phi_s3][3]; + if (phi_s0 == -2) { + KaleidoScope_MoveCursorToSpecialPos(globalCtx, PAUSE_CURSOR_PAGE_RIGHT); + pauseCtx->unk_1E4 = 0; + } else { + while (phi_s0 >= 0) { + if ((s16)KaleidoScope_UpdateQuestStatusPoint(pauseCtx, phi_s0) != 0) { + break; + } + phi_s0 = D_8082A1AC[phi_s0][3]; + } + } + } + + if ((pauseCtx->stickRelY < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DDOWN))) { + phi_s0 = D_8082A1AC[phi_s3][1]; + while (phi_s0 >= 0) { + if ((s16)KaleidoScope_UpdateQuestStatusPoint(pauseCtx, phi_s0) != 0) { + break; + } + phi_s0 = D_8082A1AC[phi_s0][1]; + } + } else if ((pauseCtx->stickRelY > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DUP))) { + phi_s0 = D_8082A1AC[phi_s3][0]; + while (phi_s0 >= 0) { + if ((s16)KaleidoScope_UpdateQuestStatusPoint(pauseCtx, phi_s0) != 0) { + break; + } + phi_s0 = D_8082A1AC[phi_s0][0]; + } + } + + if (phi_s3 != pauseCtx->cursorPoint[PAUSE_QUEST]) { + pauseCtx->unk_1E4 = 0; + Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); + } + + if (pauseCtx->cursorPoint[PAUSE_QUEST] != 0x18) { + if (CHECK_QUEST_ITEM(pauseCtx->cursorPoint[PAUSE_QUEST])) { + if (pauseCtx->cursorPoint[PAUSE_QUEST] < 6) { + phi_s0_2 = pauseCtx->cursorPoint[PAUSE_QUEST] + 0x66; + osSyncPrintf("000 ccc=%d\n", phi_s0_2); + } else if (pauseCtx->cursorPoint[PAUSE_QUEST] < 0x12) { + phi_s0_2 = pauseCtx->cursorPoint[PAUSE_QUEST] + 0x54; + osSyncPrintf("111 ccc=%d\n", phi_s0_2); } else { - phi_s0_2 = PAUSE_ITEM_NONE; - osSyncPrintf("999 ccc=%d (%d, %d)\n", PAUSE_ITEM_NONE, pauseCtx->cursorPoint[PAUSE_QUEST], - 0x18); + phi_s0_2 = pauseCtx->cursorPoint[PAUSE_QUEST] + 0x5A; + osSyncPrintf("222 ccc=%d (%d, %d, %d)\n", phi_s0_2, pauseCtx->cursorPoint[PAUSE_QUEST], + 0x12, 0x6C); } } else { - if ((gSaveContext.inventory.questItems & 0xF0000000) != 0) { - phi_s0_2 = 0x72; - } else { - phi_s0_2 = PAUSE_ITEM_NONE; - } - osSyncPrintf("888 ccc=%d (%d, %d, %x)\n", phi_s0_2, pauseCtx->cursorPoint[PAUSE_QUEST], 0x72, - gSaveContext.inventory.questItems & 0xF0000000); + phi_s0_2 = PAUSE_ITEM_NONE; + osSyncPrintf("999 ccc=%d (%d, %d)\n", PAUSE_ITEM_NONE, pauseCtx->cursorPoint[PAUSE_QUEST], + 0x18); } - - sp216 = pauseCtx->cursorPoint[PAUSE_QUEST]; - pauseCtx->cursorItem[pauseCtx->pageIndex] = phi_s0_2; - pauseCtx->cursorSlot[pauseCtx->pageIndex] = sp216; + } else { + if ((gSaveContext.inventory.questItems & 0xF0000000) != 0) { + phi_s0_2 = 0x72; + } else { + phi_s0_2 = PAUSE_ITEM_NONE; + } + osSyncPrintf("888 ccc=%d (%d, %d, %x)\n", phi_s0_2, pauseCtx->cursorPoint[PAUSE_QUEST], 0x72, + gSaveContext.inventory.questItems & 0xF0000000); } + sp216 = pauseCtx->cursorPoint[PAUSE_QUEST]; + pauseCtx->cursorItem[pauseCtx->pageIndex] = phi_s0_2; + pauseCtx->cursorSlot[pauseCtx->pageIndex] = sp216; + KaleidoScope_SetCursorVtx(pauseCtx, sp216 * 4, pauseCtx->questVtx); if ((pauseCtx->state == 6) && (pauseCtx->unk_1E4 == 0) && (pauseCtx->cursorSpecialPos == 0)) { @@ -215,7 +212,7 @@ void KaleidoScope_DrawQuestStatus(GlobalContext* globalCtx, GraphicsContext* gfx } } } else if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) { - if (pauseCtx->stickRelX > 30) { + if ((pauseCtx->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) { pauseCtx->cursorPoint[PAUSE_QUEST] = 0x15; pauseCtx->nameDisplayTimer = 0; pauseCtx->cursorSpecialPos = 0; @@ -232,7 +229,7 @@ void KaleidoScope_DrawQuestStatus(GlobalContext* globalCtx, GraphicsContext* gfx pauseCtx->cursorSlot[pauseCtx->pageIndex] = sp216; } } else { - if (pauseCtx->stickRelX < -30) { + if ((pauseCtx->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) { pauseCtx->cursorPoint[PAUSE_QUEST] = 0; pauseCtx->nameDisplayTimer = 0; pauseCtx->cursorSpecialPos = 0; diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c index 3c236637b..52019dcb2 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c @@ -140,6 +140,7 @@ void KaleidoScope_DrawEquipment(GlobalContext* globalCtx) { s16 cursorX; s16 cursorY; volatile s16 oldCursorPoint; + bool dpad = CVar_GetS32("gDpadPauseName", 0); OPEN_DISPS(globalCtx->state.gfxCtx, "../z_kaleido_equipment.c", 219); @@ -174,7 +175,7 @@ void KaleidoScope_DrawEquipment(GlobalContext* globalCtx) { cursorMoveResult = 0; while (cursorMoveResult == 0) { - if (pauseCtx->stickRelX < -30) { + if ((pauseCtx->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) { if (pauseCtx->cursorX[PAUSE_EQUIP] != 0) { pauseCtx->cursorX[PAUSE_EQUIP] -= 1; pauseCtx->cursorPoint[PAUSE_EQUIP] -= 1; @@ -216,7 +217,7 @@ void KaleidoScope_DrawEquipment(GlobalContext* globalCtx) { cursorMoveResult = 3; } } - } else if (pauseCtx->stickRelX > 30) { + } else if ((pauseCtx->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) { if (pauseCtx->cursorX[PAUSE_EQUIP] < 3) { pauseCtx->cursorX[PAUSE_EQUIP] += 1; pauseCtx->cursorPoint[PAUSE_EQUIP] += 1; @@ -264,7 +265,7 @@ void KaleidoScope_DrawEquipment(GlobalContext* globalCtx) { cursorMoveResult = 0; while (cursorMoveResult == 0) { - if (pauseCtx->stickRelY > 30) { + if ((pauseCtx->stickRelY > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DUP))) { if (pauseCtx->cursorY[PAUSE_EQUIP] != 0) { pauseCtx->cursorY[PAUSE_EQUIP] -= 1; pauseCtx->cursorPoint[PAUSE_EQUIP] -= 4; @@ -286,7 +287,7 @@ void KaleidoScope_DrawEquipment(GlobalContext* globalCtx) { pauseCtx->cursorPoint[PAUSE_EQUIP] = cursorPoint; cursorMoveResult = 3; } - } else if (pauseCtx->stickRelY < -30) { + } else if ((pauseCtx->stickRelY < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DDOWN))) { if (pauseCtx->cursorY[PAUSE_EQUIP] < 3) { pauseCtx->cursorY[PAUSE_EQUIP] += 1; pauseCtx->cursorPoint[PAUSE_EQUIP] += 4; @@ -309,7 +310,7 @@ void KaleidoScope_DrawEquipment(GlobalContext* globalCtx) { } } } else if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) { - if (pauseCtx->stickRelX > 30) { + if ((pauseCtx->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) { pauseCtx->nameDisplayTimer = 0; pauseCtx->cursorSpecialPos = 0; @@ -356,7 +357,7 @@ void KaleidoScope_DrawEquipment(GlobalContext* globalCtx) { } } } else { - if (pauseCtx->stickRelX < -30) { + if ((pauseCtx->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) { pauseCtx->nameDisplayTimer = 0; pauseCtx->cursorSpecialPos = 0; Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c index bb42ff711..d39a90e16 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c @@ -96,6 +96,7 @@ void KaleidoScope_DrawItemSelect(GlobalContext* globalCtx) { s16 cursorY; s16 oldCursorPoint; s16 moveCursorResult; + bool dpad = CVar_GetS32("gDpadPauseName", 0); OPEN_DISPS(globalCtx->state.gfxCtx, "../z_kaleido_item.c", 234); @@ -120,7 +121,7 @@ void KaleidoScope_DrawItemSelect(GlobalContext* globalCtx) { pauseCtx->stickRelX = 40; } - if (ABS(pauseCtx->stickRelX) > 30) { + if ((ABS(pauseCtx->stickRelX) > 30) || (dpad && CHECK_BTN_ANY(input->press.button, BTN_DLEFT | BTN_DRIGHT))) { cursorPoint = pauseCtx->cursorPoint[PAUSE_ITEM]; cursorX = pauseCtx->cursorX[PAUSE_ITEM]; cursorY = pauseCtx->cursorY[PAUSE_ITEM]; @@ -132,7 +133,7 @@ void KaleidoScope_DrawItemSelect(GlobalContext* globalCtx) { if (gSaveContext.inventory.items[pauseCtx->cursorPoint[PAUSE_ITEM]]) {} while (moveCursorResult == 0) { - if (pauseCtx->stickRelX < -30) { + if ((pauseCtx->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) { if (pauseCtx->cursorX[PAUSE_ITEM] != 0) { pauseCtx->cursorX[PAUSE_ITEM] -= 1; pauseCtx->cursorPoint[PAUSE_ITEM] -= 1; @@ -164,7 +165,7 @@ void KaleidoScope_DrawItemSelect(GlobalContext* globalCtx) { moveCursorResult = 2; } } - } else if (pauseCtx->stickRelX > 30) { + } else if ((pauseCtx->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) { if (pauseCtx->cursorX[PAUSE_ITEM] < 5) { pauseCtx->cursorX[PAUSE_ITEM] += 1; pauseCtx->cursorPoint[PAUSE_ITEM] += 1; @@ -208,7 +209,7 @@ void KaleidoScope_DrawItemSelect(GlobalContext* globalCtx) { cursorItem, pauseCtx->cursorSpecialPos); } } else if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) { - if (pauseCtx->stickRelX > 30) { + if ((pauseCtx->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) { pauseCtx->nameDisplayTimer = 0; pauseCtx->cursorSpecialPos = 0; @@ -242,7 +243,7 @@ void KaleidoScope_DrawItemSelect(GlobalContext* globalCtx) { } } } else { - if (pauseCtx->stickRelX < -30) { + if ((pauseCtx->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) { pauseCtx->nameDisplayTimer = 0; pauseCtx->cursorSpecialPos = 0; @@ -280,13 +281,13 @@ void KaleidoScope_DrawItemSelect(GlobalContext* globalCtx) { if (pauseCtx->cursorSpecialPos == 0) { if (cursorItem != PAUSE_ITEM_NONE) { - if (ABS(pauseCtx->stickRelY) > 30) { + if ((ABS(pauseCtx->stickRelY) > 30) || (dpad && CHECK_BTN_ANY(input->press.button, BTN_DDOWN | BTN_DUP))) { moveCursorResult = 0; cursorPoint = pauseCtx->cursorPoint[PAUSE_ITEM]; cursorY = pauseCtx->cursorY[PAUSE_ITEM]; while (moveCursorResult == 0) { - if (pauseCtx->stickRelY > 30) { + if ((pauseCtx->stickRelY > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DUP))) { if (pauseCtx->cursorY[PAUSE_ITEM] != 0) { pauseCtx->cursorY[PAUSE_ITEM] -= 1; pauseCtx->cursorPoint[PAUSE_ITEM] -= 6; @@ -300,7 +301,7 @@ void KaleidoScope_DrawItemSelect(GlobalContext* globalCtx) { moveCursorResult = 2; } - } else if (pauseCtx->stickRelY < -30) { + } else if ((pauseCtx->stickRelY < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DDOWN))) { if (pauseCtx->cursorY[PAUSE_ITEM] < 3) { pauseCtx->cursorY[PAUSE_ITEM] += 1; pauseCtx->cursorPoint[PAUSE_ITEM] += 6; diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_map_PAL.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_map_PAL.c index af5c2b424..022fdd41d 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_map_PAL.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_map_PAL.c @@ -36,6 +36,7 @@ void KaleidoScope_DrawDungeonMap(GlobalContext* globalCtx, GraphicsContext* gfxC static u16 mapBgPulseStage = 0; InterfaceContext* interfaceCtx = &globalCtx->interfaceCtx; PauseContext* pauseCtx = &globalCtx->pauseCtx; + Input* input = &globalCtx->state.input[0]; s16 i; s16 j; s16 oldCursorPoint; @@ -43,6 +44,7 @@ void KaleidoScope_DrawDungeonMap(GlobalContext* globalCtx, GraphicsContext* gfxC s16 stepG; s16 stepB; u16 rgba16; + bool dpad = CVar_GetS32("gDpadPauseName", 0); OPEN_DISPS(gfxCtx, "../z_kaleido_map_PAL.c", 123); @@ -51,7 +53,7 @@ void KaleidoScope_DrawDungeonMap(GlobalContext* globalCtx, GraphicsContext* gfxC oldCursorPoint = pauseCtx->cursorPoint[PAUSE_MAP]; if (pauseCtx->cursorSpecialPos == 0) { - if (pauseCtx->stickRelX > 30) { + if ((pauseCtx->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) { if (pauseCtx->cursorX[PAUSE_MAP] != 0) { KaleidoScope_MoveCursorToSpecialPos(globalCtx, PAUSE_CURSOR_PAGE_RIGHT); } else { @@ -67,7 +69,7 @@ void KaleidoScope_DrawDungeonMap(GlobalContext* globalCtx, GraphicsContext* gfxC } } } - } else if (pauseCtx->stickRelX < -30) { + } else if ((pauseCtx->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) { if (pauseCtx->cursorX[PAUSE_MAP] == 0) { KaleidoScope_MoveCursorToSpecialPos(globalCtx, PAUSE_CURSOR_PAGE_LEFT); } else { @@ -82,7 +84,7 @@ void KaleidoScope_DrawDungeonMap(GlobalContext* globalCtx, GraphicsContext* gfxC } if (pauseCtx->cursorPoint[PAUSE_MAP] < 3) { - if (pauseCtx->stickRelY > 30) { + if ((pauseCtx->stickRelY > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DUP))) { if (pauseCtx->cursorPoint[PAUSE_MAP] != 0) { for (i = pauseCtx->cursorPoint[PAUSE_MAP] - 1; i >= 0; i--) { if (CHECK_DUNGEON_ITEM(i, gSaveContext.mapIndex)) { @@ -92,7 +94,7 @@ void KaleidoScope_DrawDungeonMap(GlobalContext* globalCtx, GraphicsContext* gfxC } } } else { - if (pauseCtx->stickRelY < -30) { + if ((pauseCtx->stickRelY < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DDOWN))) { if (pauseCtx->cursorPoint[PAUSE_MAP] != 2) { for (i = pauseCtx->cursorPoint[PAUSE_MAP] + 1; i < 3; i++) { if (CHECK_DUNGEON_ITEM(i, gSaveContext.mapIndex)) { @@ -104,7 +106,7 @@ void KaleidoScope_DrawDungeonMap(GlobalContext* globalCtx, GraphicsContext* gfxC } } } else { - if (pauseCtx->stickRelY > 30) { + if ((pauseCtx->stickRelY > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DUP))) { if (pauseCtx->cursorPoint[PAUSE_MAP] >= 4) { for (i = pauseCtx->cursorPoint[PAUSE_MAP] - 3 - 1; i >= 0; i--) { if ((gSaveContext.sceneFlags[gSaveContext.mapIndex].floors & gBitFlags[i]) || @@ -115,7 +117,7 @@ void KaleidoScope_DrawDungeonMap(GlobalContext* globalCtx, GraphicsContext* gfxC } } } - } else if (pauseCtx->stickRelY < -30) { + } else if ((pauseCtx->stickRelY < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DDOWN))) { if (pauseCtx->cursorPoint[PAUSE_MAP] != 10) { for (i = pauseCtx->cursorPoint[PAUSE_MAP] - 3 + 1; i < 11; i++) { if ((gSaveContext.sceneFlags[gSaveContext.mapIndex].floors & gBitFlags[i]) || @@ -138,7 +140,7 @@ void KaleidoScope_DrawDungeonMap(GlobalContext* globalCtx, GraphicsContext* gfxC } } } else if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) { - if (pauseCtx->stickRelX > 30) { + if ((pauseCtx->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) { pauseCtx->nameDisplayTimer = 0; pauseCtx->cursorSpecialPos = 0; pauseCtx->cursorSlot[PAUSE_MAP] = pauseCtx->cursorPoint[PAUSE_MAP] = pauseCtx->dungeonMapSlot; @@ -148,7 +150,7 @@ void KaleidoScope_DrawDungeonMap(GlobalContext* globalCtx, GraphicsContext* gfxC Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); } } else { - if (pauseCtx->stickRelX < -30) { + if ((pauseCtx->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) { pauseCtx->nameDisplayTimer = 0; pauseCtx->cursorSpecialPos = 0; pauseCtx->cursorX[PAUSE_MAP] = 1; @@ -396,6 +398,7 @@ void KaleidoScope_DrawWorldMap(GlobalContext* globalCtx, GraphicsContext* gfxCtx }; static u16 D_8082A6D4 = 0; PauseContext* pauseCtx = &globalCtx->pauseCtx; + Input* input = &globalCtx->state.input[0]; s16 i; s16 j; s16 t; @@ -404,6 +407,7 @@ void KaleidoScope_DrawWorldMap(GlobalContext* globalCtx, GraphicsContext* gfxCtx s16 stepR; s16 stepG; s16 stepB; + bool dpad = CVar_GetS32("gDpadPauseName", 0); OPEN_DISPS(gfxCtx, "../z_kaleido_map_PAL.c", 556); @@ -412,7 +416,7 @@ void KaleidoScope_DrawWorldMap(GlobalContext* globalCtx, GraphicsContext* gfxCtx oldCursorPoint = pauseCtx->cursorPoint[PAUSE_WORLD_MAP]; if (pauseCtx->cursorSpecialPos == 0) { - if (pauseCtx->stickRelX > 30) { + if ((pauseCtx->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) { D_8082A6D4 = 0; do { @@ -423,7 +427,7 @@ void KaleidoScope_DrawWorldMap(GlobalContext* globalCtx, GraphicsContext* gfxCtx break; } } while (pauseCtx->worldMapPoints[pauseCtx->cursorPoint[PAUSE_WORLD_MAP]] == 0); - } else if (pauseCtx->stickRelX < -30) { + } else if ((pauseCtx->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) { D_8082A6D4 = 0; do { @@ -444,7 +448,7 @@ void KaleidoScope_DrawWorldMap(GlobalContext* globalCtx, GraphicsContext* gfxCtx } else { pauseCtx->cursorItem[PAUSE_MAP] = gSaveContext.worldMapArea + 0x18; if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) { - if (pauseCtx->stickRelX > 30) { + if ((pauseCtx->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) { pauseCtx->cursorPoint[PAUSE_WORLD_MAP] = 0; pauseCtx->cursorSpecialPos = 0; @@ -459,7 +463,7 @@ void KaleidoScope_DrawWorldMap(GlobalContext* globalCtx, GraphicsContext* gfxCtx D_8082A6D4 = 0; } } else { - if (pauseCtx->stickRelX < -30) { + if ((pauseCtx->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) { pauseCtx->cursorPoint[PAUSE_WORLD_MAP] = 11; pauseCtx->cursorSpecialPos = 0; @@ -663,7 +667,7 @@ void KaleidoScope_DrawWorldMap(GlobalContext* globalCtx, GraphicsContext* gfxCtx gDPLoadTextureBlock(POLY_KAL_DISP++, gWorldMapDotTex, G_IM_FMT_IA, G_IM_SIZ_8b, 8, 8, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); - for (j = i = 0; i < 12; i++, t++, j += 4) { + for (j = t = i = 0; i < 12; i++, t++, j += 4) { if (pauseCtx->worldMapPoints[i] != 0) { gDPPipeSync(POLY_KAL_DISP++); diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_prompt.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_prompt.c index c16404fb2..bfb4897d8 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_prompt.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_prompt.c @@ -7,12 +7,13 @@ void KaleidoScope_UpdatePrompt(GlobalContext* globalCtx) { Input* input = &globalCtx->state.input[0]; s8 relStickX = input->rel.stick_x; s16 step; + bool dpad = CVar_GetS32("gDpadPauseName", 0); if (((pauseCtx->state == 7) && (pauseCtx->unk_1EC == 1)) || (pauseCtx->state == 0xE) || (pauseCtx->state == 0x10)) { - if ((pauseCtx->promptChoice == 0) && (relStickX >= 30)) { + if ((pauseCtx->promptChoice == 0) && ((relStickX >= 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT)))) { Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); pauseCtx->promptChoice = 4; - } else if ((pauseCtx->promptChoice != 0) && (relStickX <= -30)) { + } else if ((pauseCtx->promptChoice != 0) && ((relStickX <= -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT)))) { Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); pauseCtx->promptChoice = 0; } diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c index 140aa7734..9db5399a4 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c @@ -936,8 +936,9 @@ void KaleidoScope_HandlePageToggles(PauseContext* pauseCtx, Input* input) { return; } + bool dpad = CVar_GetS32("gDpadPauseName", 0); if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) { - if (pauseCtx->stickRelX < -30) { + if ((pauseCtx->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) { pauseCtx->pageSwitchTimer++; if ((pauseCtx->pageSwitchTimer >= 10) || (pauseCtx->pageSwitchTimer == 0)) { KaleidoScope_SwitchPage(pauseCtx, 0); @@ -946,7 +947,7 @@ void KaleidoScope_HandlePageToggles(PauseContext* pauseCtx, Input* input) { pauseCtx->pageSwitchTimer = -1; } } else if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_RIGHT) { - if (pauseCtx->stickRelX > 30) { + if ((pauseCtx->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) { pauseCtx->pageSwitchTimer++; if ((pauseCtx->pageSwitchTimer >= 10) || (pauseCtx->pageSwitchTimer == 0)) { KaleidoScope_SwitchPage(pauseCtx, 2); From 9a7c63c46cfcb3531c8ae1c0a555b4978556537f Mon Sep 17 00:00:00 2001 From: GaryOderNichts <12049776+GaryOderNichts@users.noreply.github.com> Date: Sat, 2 Apr 2022 13:47:22 +0200 Subject: [PATCH 35/83] Allocate aligned heaps --- soh/include/functions.h | 3 +++ soh/include/variables.h | 4 ++-- soh/src/buffers/heaps.c | 45 +++++++++++++++++++++++++++++++++++++---- soh/src/code/main.c | 3 +++ 4 files changed, 49 insertions(+), 6 deletions(-) diff --git a/soh/include/functions.h b/soh/include/functions.h index 060022ac9..a4b1a9a99 100644 --- a/soh/include/functions.h +++ b/soh/include/functions.h @@ -2397,6 +2397,9 @@ void FileChoose_Destroy(GameState* thisx); char* SetQuote(); +void Heaps_Alloc(void); +void Heaps_Free(void); + #ifdef __cplusplus }; #endif diff --git a/soh/include/variables.h b/soh/include/variables.h index 80e3b792d..b58166b60 100644 --- a/soh/include/variables.h +++ b/soh/include/variables.h @@ -237,8 +237,8 @@ extern void(*D_801755D0)(void); extern u8 gGfxSPTaskYieldBuffer[OS_YIELD_DATA_SIZE]; // 0xC00 bytes extern u8 gGfxSPTaskStack[0x400]; // 0x400 bytes extern GfxPool gGfxPools[2]; // 0x24820 bytes - extern u8 gAudioHeap[0x38000]; // 0x38000 bytes - extern u8 gSystemHeap[]; + extern u8* gAudioHeap; + extern u8* gSystemHeap; #ifdef __cplusplus }; diff --git a/soh/src/buffers/heaps.c b/soh/src/buffers/heaps.c index 4309acd18..6d162bc9e 100644 --- a/soh/src/buffers/heaps.c +++ b/soh/src/buffers/heaps.c @@ -1,7 +1,44 @@ #include "z64.h" +#include +#include -// 0x38000 bytes -u8 gAudioHeap[0x38000]; +#ifndef _MSC_VER +#include +#endif -//u8 gSystemHeap[UNK_SIZE]; -u8 gSystemHeap[1024 * 1024 * 128]; +#define AUDIO_HEAP_SIZE 0x38000 +#define SYSTEM_HEAP_SIZE (1024 * 1024 * 128) + +u8* gAudioHeap; + +u8* gSystemHeap; + +void Heaps_Alloc(void) +{ +#ifdef _MSC_VER + gAudioHeap = (u8*)_aligned_malloc(AUDIO_HEAP_SIZE, 16); + gSystemHeap = (u8*)_aligned_malloc(SYSTEM_HEAP_SIZE, 16); +#elif defined(_POSIX_VERSION) && (_POSIX_VERSION >= 200112L) + if (posix_memalign((void**)&gAudioHeap, 16, AUDIO_HEAP_SIZE) != 0) + gAudioHeap = NULL; + if (posix_memalign((void**)&gSystemHeap, 16, SYSTEM_HEAP_SIZE) != 0) + gSystemHeap = NULL; +#else + gAudioHeap = (u8*)memalign(16, AUDIO_HEAP_SIZE); + gSystemHeap = (u8*)memalign(16, SYSTEM_HEAP_SIZE); +#endif + + assert(gAudioHeap != NULL); + assert(gSystemHeap != NULL); +} + +void Heaps_Free(void) +{ +#ifdef _MSC_VER + _aligned_free(gAudioHeap); + _aligned_free(gSystemHeap); +#else + free(gAudioHeap); + free(gSystemHeap); +#endif +} diff --git a/soh/src/code/main.c b/soh/src/code/main.c index eaaa7b388..0680aad3e 100644 --- a/soh/src/code/main.c +++ b/soh/src/code/main.c @@ -63,6 +63,7 @@ void Main(void* arg) { PreNmiBuff_Init(gAppNmiBufferPtr); Fault_Init(); SysCfb_Init(0); + Heaps_Alloc(); sysHeap = gSystemHeap; fb = SysCfb_GetFbPtr(0); gSystemHeapSize = 1024 * 1024 * 4; @@ -131,4 +132,6 @@ void Main(void* arg) { osDestroyThread(&sGraphThread); func_800FBFD8(); osSyncPrintf("mainproc 実行終了\n"); // "End of execution" + + Heaps_Free(); } From beb454d0002c9e6ef5c7f708ae7f088c15aa59eb Mon Sep 17 00:00:00 2001 From: GaryOderNichts <12049776+GaryOderNichts@users.noreply.github.com> Date: Mon, 11 Apr 2022 19:46:42 +0200 Subject: [PATCH 36/83] Formatting fixes --- soh/src/buffers/heaps.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/soh/src/buffers/heaps.c b/soh/src/buffers/heaps.c index 6d162bc9e..d09f86e72 100644 --- a/soh/src/buffers/heaps.c +++ b/soh/src/buffers/heaps.c @@ -10,22 +10,21 @@ #define SYSTEM_HEAP_SIZE (1024 * 1024 * 128) u8* gAudioHeap; - u8* gSystemHeap; void Heaps_Alloc(void) { #ifdef _MSC_VER - gAudioHeap = (u8*)_aligned_malloc(AUDIO_HEAP_SIZE, 16); - gSystemHeap = (u8*)_aligned_malloc(SYSTEM_HEAP_SIZE, 16); + gAudioHeap = (u8*)_aligned_malloc(AUDIO_HEAP_SIZE, 0x10); + gSystemHeap = (u8*)_aligned_malloc(SYSTEM_HEAP_SIZE, 0x10); #elif defined(_POSIX_VERSION) && (_POSIX_VERSION >= 200112L) - if (posix_memalign((void**)&gAudioHeap, 16, AUDIO_HEAP_SIZE) != 0) + if (posix_memalign((void**)&gAudioHeap, 0x10, AUDIO_HEAP_SIZE) != 0) gAudioHeap = NULL; - if (posix_memalign((void**)&gSystemHeap, 16, SYSTEM_HEAP_SIZE) != 0) + if (posix_memalign((void**)&gSystemHeap, 0x10, SYSTEM_HEAP_SIZE) != 0) gSystemHeap = NULL; #else - gAudioHeap = (u8*)memalign(16, AUDIO_HEAP_SIZE); - gSystemHeap = (u8*)memalign(16, SYSTEM_HEAP_SIZE); + gAudioHeap = (u8*)memalign(0x10, AUDIO_HEAP_SIZE); + gSystemHeap = (u8*)memalign(0x10, SYSTEM_HEAP_SIZE); #endif assert(gAudioHeap != NULL); From 03a5c7ed29db889344a8275c4c0a8c7ae1480779 Mon Sep 17 00:00:00 2001 From: Josh Bodner <30329717+jbodner09@users.noreply.github.com> Date: Mon, 11 Apr 2022 14:06:55 -0700 Subject: [PATCH 37/83] Added DPad support to ocarina and text prompts (#137) * Added DPad support to ocarina playing and text choice selection. * Wrap changes in CVar * Fix mapping not updating if CVar is changed in-game * Remove unnecessary const_cast * Fixed transparent texture making framebuffers also transparent in D3D11. (#84) This happened with the Mirror Shield in the inventory screen preview. * Add save editor * Added DPad support to ocarina playing and text choice selection. * Fixing rebase conflict * Fix mapping not updating if CVar is changed in-game * Remove unnecessary const_cast * Added DPad support to file selection and pause screens (#124) * Added DPad support to file selection and pause screens * Wrap changes behind CVar * Fix merge conflict for real * Remove unnecessary const_cast * Fixed transparent texture making framebuffers also transparent in D3D11. (#84) This happened with the Mirror Shield in the inventory screen preview. * Add save editor * Added DPad support to file selection and pause screens * Fixing rebase conflict * Remove unnecessary const_cast Co-authored-by: MaikelChan Co-authored-by: rozlette * Added DPad support to ocarina playing and text choice selection. * Fixing rebase conflict again * Fix mapping not updating if CVar is changed in-game Co-authored-by: MaikelChan Co-authored-by: rozlette --- libultraship/libultraship/GameSettings.cpp | 4 ++ libultraship/libultraship/GameSettings.h | 1 + libultraship/libultraship/SohImGuiImpl.cpp | 5 +++ soh/src/code/code_800EC960.c | 46 +++++++++++++--------- soh/src/code/z_message_PAL.c | 7 ++-- 5 files changed, 41 insertions(+), 22 deletions(-) diff --git a/libultraship/libultraship/GameSettings.cpp b/libultraship/libultraship/GameSettings.cpp index 28f4b23cb..c3294d9e3 100644 --- a/libultraship/libultraship/GameSettings.cpp +++ b/libultraship/libultraship/GameSettings.cpp @@ -92,6 +92,9 @@ namespace Game { Settings.controller.dpad_pause_name = stob(Conf[ControllerSection]["dpad_pause_name"]); CVar_SetS32("gDpadPauseName", Settings.controller.dpad_pause_name); + + Settings.controller.dpad_ocarina_text = stob(Conf[ControllerSection]["dpad_ocarina_text"]); + CVar_SetS32("gDpadOcarinaText", Settings.controller.dpad_ocarina_text); // Cheats Settings.cheats.debug_mode = stob(Conf[CheatSection]["debug_mode"]); @@ -153,6 +156,7 @@ namespace Game { Conf[ControllerSection]["input_scale"] = std::to_string(Settings.controller.input_scale); Conf[ControllerSection]["input_enabled"] = std::to_string(Settings.controller.input_enabled); Conf[ControllerSection]["dpad_pause_name"] = std::to_string(Settings.controller.dpad_pause_name); + Conf[ControllerSection]["dpad_ocarina_text"] = std::to_string(Settings.controller.dpad_ocarina_text); // Cheats Conf[CheatSection]["debug_mode"] = std::to_string(Settings.cheats.debug_mode); diff --git a/libultraship/libultraship/GameSettings.h b/libultraship/libultraship/GameSettings.h index 15ebdad16..8e1293c65 100644 --- a/libultraship/libultraship/GameSettings.h +++ b/libultraship/libultraship/GameSettings.h @@ -35,6 +35,7 @@ struct SoHConfigType { float gyroDriftY = 0.0f; bool input_enabled = false; bool dpad_pause_name = false; + bool dpad_ocarina_text = false; } controller; // Cheats diff --git a/libultraship/libultraship/SohImGuiImpl.cpp b/libultraship/libultraship/SohImGuiImpl.cpp index cef156246..7bdf4859a 100644 --- a/libultraship/libultraship/SohImGuiImpl.cpp +++ b/libultraship/libultraship/SohImGuiImpl.cpp @@ -360,6 +360,11 @@ namespace SohImGui { needs_save = true; } + if (ImGui::Checkbox("DPad Support in Ocarina and Text Choice", &Game::Settings.controller.dpad_ocarina_text)) { + CVar_SetS32("gDpadOcarinaText", Game::Settings.controller.dpad_ocarina_text); + needs_save = true; + } + ImGui::EndMenu(); } diff --git a/soh/src/code/code_800EC960.c b/soh/src/code/code_800EC960.c index 5efa93167..23d1ba375 100644 --- a/soh/src/code/code_800EC960.c +++ b/soh/src/code/code_800EC960.c @@ -824,10 +824,12 @@ NatureAmbienceDataIO sNatureAmbienceDataIO[20] = { }, }; -u32 sOcarinaAllowedBtnMask = 0x800F; -s32 sOcarinaABtnMap = 0x8000; -s32 sOcarinaCUPBtnMap = 8; -s32 sOcarinaCDownBtnMap = 4; +u32 sOcarinaAllowedBtnMask = (BTN_A | BTN_CUP | BTN_CDOWN | BTN_CLEFT | BTN_CRIGHT); +s32 sOcarinaABtnMap = BTN_A; +s32 sOcarinaCUPBtnMap = BTN_CUP; +s32 sOcarinaCDownBtnMap = BTN_CDOWN; +s32 sOcarinaCLeftBtnMap = BTN_CLEFT; +s32 sOcarinaCRightBtnMap = BTN_CRIGHT; u8 sOcarinaInpEnabled = 0; s8 D_80130F10 = 0; // "OCA", ocarina active? u8 sCurOcarinaBtnVal = 0xFF; @@ -1245,19 +1247,23 @@ void func_800F56A8(void); void Audio_PlayNatureAmbienceSequence(u8 natureAmbienceId); s32 Audio_SetGanonDistVol(u8 targetVol); -void func_800EC960(u8 custom) { - if (!custom) { - osSyncPrintf("AUDIO : Ocarina Control Assign Normal\n"); +// Function originally not called, so repurposing for DPad input +void func_800EC960(u8 dpad) { + if (dpad) { + sOcarinaAllowedBtnMask = + (BTN_A | BTN_CUP | BTN_CDOWN | BTN_CLEFT | BTN_CRIGHT | BTN_DUP | BTN_DDOWN | BTN_DLEFT | BTN_DRIGHT); + sOcarinaABtnMap = BTN_A; + sOcarinaCUPBtnMap = BTN_CUP | BTN_DUP; + sOcarinaCDownBtnMap = BTN_CDOWN | BTN_DDOWN; + sOcarinaCLeftBtnMap = BTN_CLEFT | BTN_DLEFT; + sOcarinaCRightBtnMap = BTN_CRIGHT | BTN_DRIGHT; + } else { sOcarinaAllowedBtnMask = (BTN_A | BTN_CUP | BTN_CDOWN | BTN_CLEFT | BTN_CRIGHT); sOcarinaABtnMap = BTN_A; sOcarinaCUPBtnMap = BTN_CUP; sOcarinaCDownBtnMap = BTN_CDOWN; - } else { - osSyncPrintf("AUDIO : Ocarina Control Assign Custom\n"); - sOcarinaAllowedBtnMask = (BTN_A | BTN_B | BTN_CDOWN | BTN_CLEFT | BTN_CRIGHT); - sOcarinaABtnMap = BTN_B; - sOcarinaCUPBtnMap = BTN_CDOWN; - sOcarinaCDownBtnMap = BTN_A; + sOcarinaCLeftBtnMap = BTN_CLEFT; + sOcarinaCRightBtnMap = BTN_CRIGHT; } } @@ -1542,6 +1548,7 @@ void func_800ED200(void) { void func_800ED458(s32 arg0) { u32 phi_v1_2; + bool dpad = CVar_GetS32("gDpadOcarinaText", 0); if (D_80130F3C != 0 && D_80131880 != 0) { D_80131880--; @@ -1561,6 +1568,7 @@ void func_800ED458(s32 arg0) { D_8016BA18 &= phi_v1_2; } + func_800EC960(dpad); if (D_8016BA18 & sOcarinaABtnMap) { osSyncPrintf("Presss NA_KEY_D4 %08x\n", sOcarinaABtnMap); sCurOcarinaBtnVal = 2; @@ -1569,12 +1577,12 @@ void func_800ED458(s32 arg0) { osSyncPrintf("Presss NA_KEY_F4 %08x\n", sOcarinaCDownBtnMap); sCurOcarinaBtnVal = 5; sCurOcarinaBtnIdx = 1; - } else if (D_8016BA18 & 1) { - osSyncPrintf("Presss NA_KEY_A4 %08x\n", 1); + } else if (D_8016BA18 & sOcarinaCRightBtnMap) { + osSyncPrintf("Presss NA_KEY_A4 %08x\n", sOcarinaCRightBtnMap); sCurOcarinaBtnVal = 9; sCurOcarinaBtnIdx = 2; - } else if (D_8016BA18 & 2) { - osSyncPrintf("Presss NA_KEY_B4 %08x\n", 2); + } else if (D_8016BA18 & sOcarinaCLeftBtnMap) { + osSyncPrintf("Presss NA_KEY_B4 %08x\n", sOcarinaCRightBtnMap); sCurOcarinaBtnVal = 0xB; sCurOcarinaBtnIdx = 3; } else if (D_8016BA18 & sOcarinaCUPBtnMap) { @@ -1671,7 +1679,7 @@ void Audio_OcaSetSongPlayback(s8 songIdxPlusOne, s8 playbackState) { void Audio_OcaPlayback(void) { u32 noteTimerStep; - u32 nextNoteTimerStep; + u32 nextNoteTimerStep = 0; if (sPlaybackState != 0) { if (sStaffPlaybackPos == 0) { @@ -4772,7 +4780,7 @@ void Audio_SetCodeReverb(s8 reverb) { } void func_800F6700(s8 arg0) { - s8 sp1F; + s8 sp1F = 0; switch (arg0) { case 0: diff --git a/soh/src/code/z_message_PAL.c b/soh/src/code/z_message_PAL.c index 4979f047c..43b0fcc12 100644 --- a/soh/src/code/z_message_PAL.c +++ b/soh/src/code/z_message_PAL.c @@ -203,8 +203,9 @@ void Message_HandleChoiceSelection(GlobalContext* globalCtx, u8 numChoices) { static s16 sAnalogStickHeld = false; MessageContext* msgCtx = &globalCtx->msgCtx; Input* input = &globalCtx->state.input[0]; + bool dpad = CVar_GetS32("gDpadOcarinaText", 0); - if (input->rel.stick_y >= 30 && !sAnalogStickHeld) { + if ((input->rel.stick_y >= 30 && !sAnalogStickHeld) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DUP))) { sAnalogStickHeld = true; msgCtx->choiceIndex--; if (msgCtx->choiceIndex > 128) { @@ -212,7 +213,7 @@ void Message_HandleChoiceSelection(GlobalContext* globalCtx, u8 numChoices) { } else { Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); } - } else if (input->rel.stick_y <= -30 && !sAnalogStickHeld) { + } else if ((input->rel.stick_y <= -30 && !sAnalogStickHeld) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DDOWN))) { sAnalogStickHeld = true; msgCtx->choiceIndex++; if (msgCtx->choiceIndex > numChoices) { @@ -3032,7 +3033,7 @@ void Message_Update(GlobalContext* globalCtx) { Input* input = &globalCtx->state.input[0]; s16 var; s16 focusScreenPosX; - s16 averageY; + s16 averageY = 0; s16 playerFocusScreenPosY; s16 actorFocusScreenPosY; From e16481933965a46dd2f2a9394394193cab27a5bf Mon Sep 17 00:00:00 2001 From: Josh Bodner <30329717+jbodner09@users.noreply.github.com> Date: Tue, 12 Apr 2022 18:38:08 -0700 Subject: [PATCH 38/83] Added DPad support to shops (#139) * Added DPad support to shops * Wrap changes in CVar * Remove unnesseccary const_cast * Fixed transparent texture making framebuffers also transparent in D3D11. (#84) This happened with the Mirror Shield in the inventory screen preview. * Add save editor * Added DPad support to shops * Fixing rebase conflict * Remove unnesseccary const_cast * Added DPad support to file selection and pause screens (#124) * Added DPad support to file selection and pause screens * Wrap changes behind CVar * Fix merge conflict for real * Remove unnecessary const_cast * Fixed transparent texture making framebuffers also transparent in D3D11. (#84) This happened with the Mirror Shield in the inventory screen preview. * Add save editor * Added DPad support to file selection and pause screens * Fixing rebase conflict * Remove unnecessary const_cast Co-authored-by: MaikelChan Co-authored-by: rozlette * Added DPad support to shops * Fixing rebase conflict again * Allocate aligned heaps * Formatting fixes * Added DPad support to ocarina and text prompts (#137) * Added DPad support to ocarina playing and text choice selection. * Wrap changes in CVar * Fix mapping not updating if CVar is changed in-game * Remove unnecessary const_cast * Fixed transparent texture making framebuffers also transparent in D3D11. (#84) This happened with the Mirror Shield in the inventory screen preview. * Add save editor * Added DPad support to ocarina playing and text choice selection. * Fixing rebase conflict * Fix mapping not updating if CVar is changed in-game * Remove unnecessary const_cast * Added DPad support to file selection and pause screens (#124) * Added DPad support to file selection and pause screens * Wrap changes behind CVar * Fix merge conflict for real * Remove unnecessary const_cast * Fixed transparent texture making framebuffers also transparent in D3D11. (#84) This happened with the Mirror Shield in the inventory screen preview. * Add save editor * Added DPad support to file selection and pause screens * Fixing rebase conflict * Remove unnecessary const_cast Co-authored-by: MaikelChan Co-authored-by: rozlette * Added DPad support to ocarina playing and text choice selection. * Fixing rebase conflict again * Fix mapping not updating if CVar is changed in-game Co-authored-by: MaikelChan Co-authored-by: rozlette * Added DPad support to shops * Fixing rebase conflict for the last time * Totally Fixing rebase conflict again I promise * This has to be the last time I fix this rebase conflict Co-authored-by: MaikelChan Co-authored-by: rozlette Co-authored-by: GaryOderNichts <12049776+GaryOderNichts@users.noreply.github.com> --- libultraship/libultraship/GameSettings.cpp | 4 ++ libultraship/libultraship/GameSettings.h | 1 + libultraship/libultraship/SohImGuiImpl.cpp | 5 +++ .../overlays/actors/ovl_En_Ossan/z_en_ossan.c | 38 +++++++++++-------- 4 files changed, 33 insertions(+), 15 deletions(-) diff --git a/libultraship/libultraship/GameSettings.cpp b/libultraship/libultraship/GameSettings.cpp index c3294d9e3..678555c7d 100644 --- a/libultraship/libultraship/GameSettings.cpp +++ b/libultraship/libultraship/GameSettings.cpp @@ -95,6 +95,9 @@ namespace Game { Settings.controller.dpad_ocarina_text = stob(Conf[ControllerSection]["dpad_ocarina_text"]); CVar_SetS32("gDpadOcarinaText", Settings.controller.dpad_ocarina_text); + + Settings.controller.dpad_shop = stob(Conf[ControllerSection]["dpad_shop"]); + CVar_SetS32("gDpadShop", Settings.controller.dpad_shop); // Cheats Settings.cheats.debug_mode = stob(Conf[CheatSection]["debug_mode"]); @@ -157,6 +160,7 @@ namespace Game { Conf[ControllerSection]["input_enabled"] = std::to_string(Settings.controller.input_enabled); Conf[ControllerSection]["dpad_pause_name"] = std::to_string(Settings.controller.dpad_pause_name); Conf[ControllerSection]["dpad_ocarina_text"] = std::to_string(Settings.controller.dpad_ocarina_text); + Conf[ControllerSection]["dpad_shop"] = std::to_string(Settings.controller.dpad_shop); // Cheats Conf[CheatSection]["debug_mode"] = std::to_string(Settings.cheats.debug_mode); diff --git a/libultraship/libultraship/GameSettings.h b/libultraship/libultraship/GameSettings.h index 8e1293c65..17079c9bf 100644 --- a/libultraship/libultraship/GameSettings.h +++ b/libultraship/libultraship/GameSettings.h @@ -36,6 +36,7 @@ struct SoHConfigType { bool input_enabled = false; bool dpad_pause_name = false; bool dpad_ocarina_text = false; + bool dpad_shop = false; } controller; // Cheats diff --git a/libultraship/libultraship/SohImGuiImpl.cpp b/libultraship/libultraship/SohImGuiImpl.cpp index 7bdf4859a..9ba3184d8 100644 --- a/libultraship/libultraship/SohImGuiImpl.cpp +++ b/libultraship/libultraship/SohImGuiImpl.cpp @@ -365,6 +365,11 @@ namespace SohImGui { needs_save = true; } + if (ImGui::Checkbox("DPad Support for Browsing Shop Items", &Game::Settings.controller.dpad_shop)) { + CVar_SetS32("gDpadShop", Game::Settings.controller.dpad_shop); + needs_save = true; + } + ImGui::EndMenu(); } diff --git a/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c b/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c index 04975d910..4d5fefec6 100644 --- a/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c +++ b/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c @@ -948,7 +948,9 @@ s32 EnOssan_FacingShopkeeperDialogResult(EnOssan* this, GlobalContext* globalCtx } void EnOssan_State_FacingShopkeeper(EnOssan* this, GlobalContext* globalCtx, Player* player) { + Input* input = &globalCtx->state.input[0]; u8 nextIndex; + bool dpad = CVar_GetS32("gDpadShop", 0); if ((Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CHOICE) && !EnOssan_TestEndInteraction(this, globalCtx, &globalCtx->state.input[0])) { @@ -957,7 +959,7 @@ void EnOssan_State_FacingShopkeeper(EnOssan* this, GlobalContext* globalCtx, Pla return; } // Stick Left - if (this->stickAccumX < 0) { + if ((this->stickAccumX < 0) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) { nextIndex = EnOssan_SetCursorIndexFromNeutral(this, 4); if (nextIndex != CURSOR_INVALID) { this->cursorIndex = nextIndex; @@ -966,7 +968,7 @@ void EnOssan_State_FacingShopkeeper(EnOssan* this, GlobalContext* globalCtx, Pla this->stickLeftPrompt.isEnabled = false; func_80078884(NA_SE_SY_CURSOR); } - } else if (this->stickAccumX > 0) { + } else if ((this->stickAccumX > 0) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) { nextIndex = EnOssan_SetCursorIndexFromNeutral(this, 0); if (nextIndex != CURSOR_INVALID) { this->cursorIndex = nextIndex; @@ -1023,11 +1025,13 @@ void EnOssan_State_LookToRightShelf(EnOssan* this, GlobalContext* globalCtx, Pla } } -void EnOssan_CursorUpDown(EnOssan* this) { +void EnOssan_CursorUpDown(EnOssan* this, GlobalContext* globalCtx) { + Input* input = &globalCtx->state.input[0]; u8 curTemp = this->cursorIndex; u8 curScanTemp; + bool dpad = CVar_GetS32("gDpadShop", 0); - if (this->stickAccumY < 0) { + if ((this->stickAccumY < 0) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DDOWN))) { curTemp &= 0xFE; if (this->shelfSlots[curTemp] != NULL) { this->cursorIndex = curTemp; @@ -1066,7 +1070,7 @@ void EnOssan_CursorUpDown(EnOssan* this) { } } } - } else if (this->stickAccumY > 0) { + } else if ((this->stickAccumY > 0) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DUP))) { curTemp |= 1; if (this->shelfSlots[curTemp] != NULL) { this->cursorIndex = curTemp; @@ -1172,11 +1176,13 @@ s32 EnOssan_HasPlayerSelectedItem(GlobalContext* globalCtx, EnOssan* this, Input } void EnOssan_State_BrowseLeftShelf(EnOssan* this, GlobalContext* globalCtx, Player* player) { + Input* input = &globalCtx->state.input[0]; s32 a; s32 b; u8 prevIndex = this->cursorIndex; s32 c; s32 d; + bool dpad = CVar_GetS32("gDpadShop", 0); if (!EnOssan_ReturnItemToShelf(this)) { osSyncPrintf("%s[%d]:" VT_FGCOL(GREEN) "ズーム中ï¼ï¼" VT_RST "\n", "../z_en_oB1.c", 2152); @@ -1193,7 +1199,7 @@ void EnOssan_State_BrowseLeftShelf(EnOssan* this, GlobalContext* globalCtx, Play if ((Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_EVENT) && !EnOssan_HasPlayerSelectedItem(globalCtx, this, &globalCtx->state.input[0])) { if (this->moveHorizontal) { - if (this->stickAccumX > 0) { + if ((this->stickAccumX > 0) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) { a = EnOssan_CursorRight(this, this->cursorIndex, 4); if (a != CURSOR_INVALID) { this->cursorIndex = a; @@ -1201,14 +1207,14 @@ void EnOssan_State_BrowseLeftShelf(EnOssan* this, GlobalContext* globalCtx, Play EnOssan_SetLookToShopkeeperFromShelf(globalCtx, this); return; } - } else if (this->stickAccumX < 0) { + } else if ((this->stickAccumX < 0) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) { b = EnOssan_CursorLeft(this, this->cursorIndex, 8); if (b != CURSOR_INVALID) { this->cursorIndex = b; } } } else { - if (this->stickAccumX > 0 && this->stickAccumX > 500) { + if ((this->stickAccumX > 0 && this->stickAccumX > 500) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) { c = EnOssan_CursorRight(this, this->cursorIndex, 4); if (c != CURSOR_INVALID) { this->cursorIndex = c; @@ -1216,14 +1222,14 @@ void EnOssan_State_BrowseLeftShelf(EnOssan* this, GlobalContext* globalCtx, Play EnOssan_SetLookToShopkeeperFromShelf(globalCtx, this); return; } - } else if (this->stickAccumX < 0 && this->stickAccumX < -500) { + } else if ((this->stickAccumX < 0 && this->stickAccumX < -500) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) { d = EnOssan_CursorLeft(this, this->cursorIndex, 8); if (d != CURSOR_INVALID) { this->cursorIndex = d; } } } - EnOssan_CursorUpDown(this); + EnOssan_CursorUpDown(this, globalCtx); if (this->cursorIndex != prevIndex) { Message_ContinueTextbox(globalCtx, this->shelfSlots[this->cursorIndex]->actor.textId); func_80078884(NA_SE_SY_CURSOR); @@ -1232,9 +1238,11 @@ void EnOssan_State_BrowseLeftShelf(EnOssan* this, GlobalContext* globalCtx, Play } void EnOssan_State_BrowseRightShelf(EnOssan* this, GlobalContext* globalCtx, Player* player) { + Input* input = &globalCtx->state.input[0]; s32 pad[2]; u8 prevIndex; u8 nextIndex; + bool dpad = CVar_GetS32("gDpadShop", 0); prevIndex = this->cursorIndex; if (!EnOssan_ReturnItemToShelf(this)) { @@ -1252,7 +1260,7 @@ void EnOssan_State_BrowseRightShelf(EnOssan* this, GlobalContext* globalCtx, Pla if ((Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_EVENT) && !EnOssan_HasPlayerSelectedItem(globalCtx, this, &globalCtx->state.input[0])) { if (this->moveHorizontal) { - if (this->stickAccumX < 0) { + if ((this->stickAccumX < 0) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) { nextIndex = EnOssan_CursorRight(this, this->cursorIndex, 0); if (nextIndex != CURSOR_INVALID) { this->cursorIndex = nextIndex; @@ -1260,14 +1268,14 @@ void EnOssan_State_BrowseRightShelf(EnOssan* this, GlobalContext* globalCtx, Pla EnOssan_SetLookToShopkeeperFromShelf(globalCtx, this); return; } - } else if (this->stickAccumX > 0) { + } else if ((this->stickAccumX > 0) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) { nextIndex = EnOssan_CursorLeft(this, this->cursorIndex, 4); if (nextIndex != CURSOR_INVALID) { this->cursorIndex = nextIndex; } } } else { - if (this->stickAccumX < 0 && this->stickAccumX < -500) { + if ((this->stickAccumX < 0 && this->stickAccumX < -500) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) { nextIndex = EnOssan_CursorRight(this, this->cursorIndex, 0); if (nextIndex != CURSOR_INVALID) { this->cursorIndex = nextIndex; @@ -1275,14 +1283,14 @@ void EnOssan_State_BrowseRightShelf(EnOssan* this, GlobalContext* globalCtx, Pla EnOssan_SetLookToShopkeeperFromShelf(globalCtx, this); return; } - } else if (this->stickAccumX > 0 && this->stickAccumX > 500) { + } else if ((this->stickAccumX > 0 && this->stickAccumX > 500) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) { nextIndex = EnOssan_CursorLeft(this, this->cursorIndex, 4); if (nextIndex != CURSOR_INVALID) { this->cursorIndex = nextIndex; } } } - EnOssan_CursorUpDown(this); + EnOssan_CursorUpDown(this, globalCtx); if (this->cursorIndex != prevIndex) { Message_ContinueTextbox(globalCtx, this->shelfSlots[this->cursorIndex]->actor.textId); func_80078884(NA_SE_SY_CURSOR); From 0ef2d0c750fec74716d9113a68a4c0181640028d Mon Sep 17 00:00:00 2001 From: rozlette Date: Wed, 13 Apr 2022 23:53:04 -0500 Subject: [PATCH 39/83] Remove leftover debug code (fixes #60) --- soh/src/overlays/actors/ovl_Boss_Ganondrof/z_boss_ganondrof.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/src/overlays/actors/ovl_Boss_Ganondrof/z_boss_ganondrof.c b/soh/src/overlays/actors/ovl_Boss_Ganondrof/z_boss_ganondrof.c index 6f0c3dc30..94ea16422 100644 --- a/soh/src/overlays/actors/ovl_Boss_Ganondrof/z_boss_ganondrof.c +++ b/soh/src/overlays/actors/ovl_Boss_Ganondrof/z_boss_ganondrof.c @@ -1274,7 +1274,7 @@ void BossGanondrof_CollisionCheck(BossGanondrof* this, GlobalContext* globalCtx) this->actor.colChkInfo.health -= dmg; } - if ((s8)this->actor.colChkInfo.health <= 0 || 1) { + if ((s8)this->actor.colChkInfo.health <= 0) { BossGanondrof_SetupDeath(this, globalCtx); Enemy_StartFinishingBlow(globalCtx, &this->actor); return; From 1aa08caade5bcb8a840eced6a71a74abddbc81cf Mon Sep 17 00:00:00 2001 From: Sparkling Shampoo Date: Wed, 6 Apr 2022 23:33:32 -0400 Subject: [PATCH 40/83] Prevent cached resource from being acquired while it is being destroyed Fixes #158 --- libultraship/libultraship/ResourceMgr.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/libultraship/libultraship/ResourceMgr.cpp b/libultraship/libultraship/ResourceMgr.cpp index e6f3c8a0a..b4d7b76a8 100644 --- a/libultraship/libultraship/ResourceMgr.cpp +++ b/libultraship/libultraship/ResourceMgr.cpp @@ -217,9 +217,12 @@ namespace Ship { std::shared_ptr ResourceMgr::GetCachedFile(std::string FilePath) { auto resCacheFind = ResourceCache.find(FilePath); - - if (resCacheFind != ResourceCache.end()) + + if (resCacheFind != ResourceCache.end() && + resCacheFind->second.use_count() > 0) + { return resCacheFind->second; + } else return nullptr; } From 1dcd24e7e2aad2b22d2bfdb398e3a05e8a808eef Mon Sep 17 00:00:00 2001 From: "Sparkling.Shampoo" <102923452+sparklingshampoo@users.noreply.github.com> Date: Sun, 17 Apr 2022 11:19:45 -0400 Subject: [PATCH 41/83] Fix cylinder-tri intersection for GCC due to FLT_EVAL_METHOD (#157) --- soh/src/code/sys_math3d.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/src/code/sys_math3d.c b/soh/src/code/sys_math3d.c index d442b7c4a..39ffea881 100644 --- a/soh/src/code/sys_math3d.c +++ b/soh/src/code/sys_math3d.c @@ -1857,7 +1857,7 @@ s32 Math3D_CylTriVsIntersect(Cylinder16* cyl, TriNorm* tri, Vec3f* intersect) { } } - if (minDistSq != 1.e38f) { + if (minDistSq != (f32)1.e38f) { return true; } From a11038f51555aa57e82ae241fc52e3164e937512 Mon Sep 17 00:00:00 2001 From: Rozelette Date: Sun, 17 Apr 2022 10:24:43 -0500 Subject: [PATCH 42/83] Add flag, equipment, and quest status editors (#164) --- libultraship/libultraship/SohImGuiImpl.cpp | 31 +- libultraship/libultraship/SohImGuiImpl.h | 3 +- soh/soh.vcxproj | 2 + soh/soh.vcxproj.filters | 6 + .../Enhancements/debugger/debugSaveEditor.cpp | 1223 +++++++++++++---- soh/soh/util.cpp | 314 +++++ soh/soh/util.h | 11 + 7 files changed, 1281 insertions(+), 309 deletions(-) create mode 100644 soh/soh/util.cpp create mode 100644 soh/soh/util.h diff --git a/libultraship/libultraship/SohImGuiImpl.cpp b/libultraship/libultraship/SohImGuiImpl.cpp index 9ba3184d8..b7e6e01ab 100644 --- a/libultraship/libultraship/SohImGuiImpl.cpp +++ b/libultraship/libultraship/SohImGuiImpl.cpp @@ -179,21 +179,46 @@ namespace SohImGui { stbi_image_free(img_data); } - void LoadResource(const std::string& name, const std::string& path) { + void LoadResource(const std::string& name, const std::string& path, const ImVec4& tint) { GfxRenderingAPI* api = gfx_get_current_rendering_api(); const auto res = static_cast(GlobalCtx2::GetInstance()->GetResourceManager()->LoadResource(normalize(path)).get()); - if (res->texType != Ship::TextureType::RGBA32bpp) { + std::vector texBuffer; + texBuffer.reserve(res->width * res->height * 4); + + switch (res->texType) { + case Ship::TextureType::RGBA32bpp: + texBuffer.assign(res->imageData, res->imageData + (res->width * res->height * 4)); + break; + case Ship::TextureType::GrayscaleAlpha8bpp: + for (int32_t i = 0; i < res->width * res->height; i++) { + uint8_t ia = res->imageData[i]; + uint8_t color = ((ia >> 4) & 0xF) * 255 / 15; + uint8_t alpha = (ia & 0xF) * 255 / 15; + texBuffer.push_back(color); + texBuffer.push_back(color); + texBuffer.push_back(color); + texBuffer.push_back(alpha); + } + break; + default: // TODO convert other image types SPDLOG_WARN("SohImGui::LoadResource: Attempting to load unsupporting image type %s", path.c_str()); return; } + 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; + } + const auto asset = new GameAsset{ api->new_texture() }; api->select_texture(0, asset->textureId); api->set_sampler_parameters(0, false, 0, 0); - api->upload_texture(res->imageData, res->width, res->height); + api->upload_texture(texBuffer.data(), res->width, res->height); DefaultAssets[name] = asset; } diff --git a/libultraship/libultraship/SohImGuiImpl.h b/libultraship/libultraship/SohImGuiImpl.h index 8275e4735..58dac7a1b 100644 --- a/libultraship/libultraship/SohImGuiImpl.h +++ b/libultraship/libultraship/SohImGuiImpl.h @@ -1,5 +1,6 @@ #pragma once +#include "Lib/ImGui/imgui.h" #include "SohConsole.h" struct GameAsset { @@ -63,7 +64,7 @@ namespace SohImGui { void ShowCursor(bool hide, Dialogues w); void BindCmd(const std::string& cmd, CommandEntry entry); void AddWindow(const std::string& category, const std::string& name, WindowDrawFunc drawFunc); - void LoadResource(const std::string& name, const std::string& path); + void LoadResource(const std::string& name, const std::string& path, const ImVec4& tint = ImVec4(1, 1, 1, 1)); ImTextureID GetTextureByID(int id); ImTextureID GetTextureByName(const std::string& name); } diff --git a/soh/soh.vcxproj b/soh/soh.vcxproj index 5560bde76..adf205f14 100644 --- a/soh/soh.vcxproj +++ b/soh/soh.vcxproj @@ -185,6 +185,7 @@ + @@ -928,6 +929,7 @@ + diff --git a/soh/soh.vcxproj.filters b/soh/soh.vcxproj.filters index de9ad6f96..c31a78b19 100644 --- a/soh/soh.vcxproj.filters +++ b/soh/soh.vcxproj.filters @@ -2181,6 +2181,9 @@ Source Files\soh\Enhancements\debugger + + Source Files\soh + @@ -3728,6 +3731,9 @@ Header Files\soh\Enhancements\debugger + + Header Files\soh + diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp index 95e2f912c..2aaac5a1b 100644 --- a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp @@ -1,6 +1,8 @@ #include "debugSaveEditor.h" +#include "../../util.h" #include "../libultraship/SohImGuiImpl.h" +#include #include #include #include @@ -13,18 +15,20 @@ extern "C" { extern GlobalContext* gGlobalCtx; #include "textures/icon_item_static/icon_item_static.h" +#include "textures/icon_item_24_static/icon_item_24_static.h" } typedef struct { uint32_t id; std::string name; + std::string nameFaded; std::string texturePath; } ItemMapEntry; #define ITEM_MAP_ENTRY(id) \ { \ id, { \ - id, #id, static_cast(gItemIcons[id]) \ + id, #id, #id "_Faded", static_cast(gItemIcons[id]) \ } \ } @@ -120,6 +124,10 @@ std::map itemMapping = { ITEM_MAP_ENTRY(ITEM_WALLET_GIANT), ITEM_MAP_ENTRY(ITEM_SEEDS), ITEM_MAP_ENTRY(ITEM_FISHING_POLE), + ITEM_MAP_ENTRY(ITEM_KEY_BOSS), + ITEM_MAP_ENTRY(ITEM_COMPASS), + ITEM_MAP_ENTRY(ITEM_DUNGEON_MAP), + ITEM_MAP_ENTRY(ITEM_KEY_SMALL), }; // Maps entries in the GS flag array to the area name it represents @@ -147,6 +155,7 @@ std::vector gsMapping = { "Gerudo Fortress", "Desert Colossus, Haunted Wasteland", }; + extern "C" u8 gAreaGsFlags[]; extern "C" u8 gAmmoItems[]; @@ -158,6 +167,63 @@ u8 gAllAmmoItems[] = { ITEM_BOOMERANG, ITEM_LENS, ITEM_BEAN, ITEM_HAMMER, }; +typedef struct { + uint32_t id; + std::string name; + std::string nameFaded; + std::string texturePath; +} QuestMapEntry; + +#define QUEST_MAP_ENTRY(id, tex) \ + { \ + id, { \ + id, #id, #id "_Faded", tex \ + } \ + } + +// Maps quest items ids to info for use in ImGui +std::map questMapping = { + QUEST_MAP_ENTRY(QUEST_MEDALLION_FOREST, gForestMedallionIconTex), + QUEST_MAP_ENTRY(QUEST_MEDALLION_FIRE, gFireMedallionIconTex), + QUEST_MAP_ENTRY(QUEST_MEDALLION_WATER, gWaterMedallionIconTex), + QUEST_MAP_ENTRY(QUEST_MEDALLION_SPIRIT, gSpiritMedallionIconTex), + QUEST_MAP_ENTRY(QUEST_MEDALLION_SHADOW, gShadowMedallionIconTex), + QUEST_MAP_ENTRY(QUEST_MEDALLION_LIGHT, gLightMedallionIconTex), + QUEST_MAP_ENTRY(QUEST_KOKIRI_EMERALD, gKokiriEmeraldIconTex), + QUEST_MAP_ENTRY(QUEST_GORON_RUBY, gGoronRubyIconTex), + QUEST_MAP_ENTRY(QUEST_ZORA_SAPPHIRE, gZoraSapphireIconTex), + QUEST_MAP_ENTRY(QUEST_STONE_OF_AGONY, gStoneOfAgonyIconTex), + QUEST_MAP_ENTRY(QUEST_GERUDO_CARD, gGerudosCardIconTex), +}; + +typedef struct { + uint32_t id; + std::string name; + std::string nameFaded; + ImVec4 color; +} SongMapEntry; + +#define SONG_MAP_ENTRY(id, r, g, b) \ + { \ + id, #id, #id "_Faded", ImVec4(r / 255.0f, g / 255.0f, b / 255.0f, 1.0f) \ + } + +// Maps song ids to info for use in ImGui +std::array songMapping = { { + SONG_MAP_ENTRY(QUEST_SONG_LULLABY, 255, 255, 255), + SONG_MAP_ENTRY(QUEST_SONG_EPONA, 255, 255, 255), + SONG_MAP_ENTRY(QUEST_SONG_SARIA, 255, 255, 255), + SONG_MAP_ENTRY(QUEST_SONG_SUN, 255, 255, 255), + SONG_MAP_ENTRY(QUEST_SONG_TIME, 255, 255, 255), + SONG_MAP_ENTRY(QUEST_SONG_STORMS, 255, 255, 255), + SONG_MAP_ENTRY(QUEST_SONG_MINUET, 150, 255, 100), + SONG_MAP_ENTRY(QUEST_SONG_BOLERO, 255, 80, 40), + SONG_MAP_ENTRY(QUEST_SONG_SERENADE, 100, 150, 255), + SONG_MAP_ENTRY(QUEST_SONG_REQUIEM, 255, 160, 0), + SONG_MAP_ENTRY(QUEST_SONG_NOCTURNE, 255, 100, 255), + SONG_MAP_ENTRY(QUEST_SONG_PRELUDE, 255, 240, 100), +} }; + // Adds a text tooltip for the previous ImGui item void SetLastItemHoverText(const std::string& text) { if (ImGui::IsItemHovered()) { @@ -178,17 +244,33 @@ void InsertHelpHoverText(const std::string& text) { } } -void DrawSaveEditor(bool& open) { - if (!open) { - return; - } +// Encapsulates what is drawn by the passed-in function within a border +template +void DrawGroupWithBorder(T&& drawFunc) { + // First group encapsulates the inner portion and border + ImGui::BeginGroup(); - ImGui::SetNextWindowSize(ImVec2(520, 600), ImGuiCond_FirstUseEver); - if (!ImGui::Begin("Save Editor", &open)) { - ImGui::End(); - return; - } + ImVec2 padding = ImGui::GetStyle().FramePadding; + ImVec2 p0 = ImGui::GetCursorScreenPos(); + ImGui::SetCursorScreenPos(ImVec2(p0.x + padding.x, p0.y + padding.y)); + // Second group encapsulates just the inner portion + ImGui::BeginGroup(); + + drawFunc(); + + ImGui::Dummy(padding); + ImGui::EndGroup(); + + ImVec2 p1 = ImGui::GetItemRectMax(); + p1.x += padding.x; + ImVec4 borderCol = ImGui::GetStyle().Colors[ImGuiCol_Border]; + ImGui::GetWindowDrawList()->AddRect(p0, p1, IM_COL32(borderCol.x * 255, borderCol.y * 255, borderCol.z * 255, borderCol.w * 255)); + + ImGui::EndGroup(); +} + +void DrawInfoTab() { // TODO This is the bare minimum to get the player name showing // There will need to be more effort to get it robust and editable std::string name; @@ -201,313 +283,833 @@ void DrawSaveEditor(bool& open) { } name += '\0'; + ImGui::PushItemWidth(ImGui::GetFontSize() * 6); + + ImGui::Text("Name: %s", name.c_str()); + InsertHelpHoverText("Player Name"); + + // Use an intermediary to keep the health from updating (and potentially killing the player) + // until it is done being edited + int16_t healthIntermediary = gSaveContext.healthCapacity; + ImGui::InputScalar("Max Health", ImGuiDataType_S16, &healthIntermediary); + if (ImGui::IsItemDeactivated()) { + gSaveContext.healthCapacity = healthIntermediary; + } + InsertHelpHoverText("Maximum health. 16 units per full heart"); + if (gSaveContext.health > gSaveContext.healthCapacity) { + gSaveContext.health = gSaveContext.healthCapacity; // Clamp health to new max + } + + const uint16_t healthMin = 0; + const uint16_t healthMax = gSaveContext.healthCapacity; + ImGui::SetNextItemWidth(ImGui::GetFontSize() * 15); + ImGui::SliderScalar("Health", ImGuiDataType_S16, &gSaveContext.health, &healthMin, &healthMax); + InsertHelpHoverText("Current health. 16 units per full heart"); + + bool doubleDefense = gSaveContext.doubleDefense != 0; + if (ImGui::Checkbox("Double Defense", &doubleDefense)) { + gSaveContext.doubleDefense = doubleDefense; + gSaveContext.inventory.defenseHearts = + gSaveContext.doubleDefense ? 20 : 0; // Set to get the border drawn in the UI + } + InsertHelpHoverText("Is double defense unlocked?"); + + std::string magicName; + if (gSaveContext.magicLevel == 2) { + magicName = "Double"; + } else if (gSaveContext.magicLevel == 1) { + magicName = "Single"; + } else { + magicName = "None"; + } + ImGui::SetNextItemWidth(ImGui::GetFontSize() * 6); + if (ImGui::BeginCombo("Magic Level", magicName.c_str())) { + if (ImGui::Selectable("Double")) { + gSaveContext.magicLevel = 2; + gSaveContext.magicAcquired = true; + gSaveContext.doubleMagic = true; + } + if (ImGui::Selectable("Single")) { + gSaveContext.magicLevel = 1; + gSaveContext.magicAcquired = true; + gSaveContext.doubleMagic = false; + } + if (ImGui::Selectable("None")) { + gSaveContext.magicLevel = 0; + gSaveContext.magicAcquired = false; + gSaveContext.doubleMagic = false; + } + + ImGui::EndCombo(); + } + InsertHelpHoverText("Current magic level"); + gSaveContext.unk_13F4 = gSaveContext.magicLevel * 0x30; // Set to get the bar drawn in the UI + if (gSaveContext.magic > gSaveContext.unk_13F4) { + gSaveContext.magic = gSaveContext.unk_13F4; // Clamp magic to new max + } + + const uint8_t magicMin = 0; + const uint8_t magicMax = gSaveContext.unk_13F4; + ImGui::SetNextItemWidth(ImGui::GetFontSize() * 15); + ImGui::SliderScalar("Magic", ImGuiDataType_S8, &gSaveContext.magic, &magicMin, &magicMax); + InsertHelpHoverText("Current magic. 48 units per magic level"); + + ImGui::InputScalar("Rupees", ImGuiDataType_S16, &gSaveContext.rupees); + InsertHelpHoverText("Current rupees"); + + const uint16_t dayTimeMin = 0; + const uint16_t dayTimeMax = 0xFFFF; + ImGui::SetNextItemWidth(ImGui::GetFontSize() * 15); + ImGui::SliderScalar("Time", ImGuiDataType_U16, &gSaveContext.dayTime, &dayTimeMin, &dayTimeMax); + InsertHelpHoverText("Time of day"); + if (ImGui::Button("Dawn")) { + gSaveContext.dayTime = 0x4000; + } + ImGui::SameLine(); + if (ImGui::Button("Noon")) { + gSaveContext.dayTime = 0x8000; + } + ImGui::SameLine(); + if (ImGui::Button("Sunset")) { + gSaveContext.dayTime = 0xC000; + } + ImGui::SameLine(); + if (ImGui::Button("Midnight")) { + gSaveContext.dayTime = 0; + } + + ImGui::InputScalar("Total Days", ImGuiDataType_S32, &gSaveContext.totalDays); + InsertHelpHoverText("Total number of days elapsed since the start of the game"); + + ImGui::InputScalar("Deaths", ImGuiDataType_U16, &gSaveContext.deaths); + InsertHelpHoverText("Total number of deaths"); + + bool bgsFlag = gSaveContext.bgsFlag != 0; + if (ImGui::Checkbox("Has BGS", &bgsFlag)) { + gSaveContext.bgsFlag = bgsFlag; + } + InsertHelpHoverText("Is Biggoron sword unlocked? Replaces Giant's knife"); + + ImGui::InputScalar("Sword Health", ImGuiDataType_U16, &gSaveContext.swordHealth); + InsertHelpHoverText("Giant's knife health. Default is 8. Must be >0 for Biggoron sword to work"); + + ImGui::InputScalar("Bgs Day Count", ImGuiDataType_S32, &gSaveContext.bgsDayCount); + InsertHelpHoverText("Total number of days elapsed since giving Biggoron the claim check"); + + // TODO Changing Link's age is more involved than just setting gSaveContext.linkAge + // It might not fit here and instead should be only changable when changing scenes + /* + if (ImGui::BeginCombo("Link Age", LINK_IS_ADULT ? "Adult" : "Child")) { + if (ImGui::Selectable("Adult")) { + gSaveContext.linkAge = 0; + } + if (ImGui::Selectable("Child")) { + gSaveContext.linkAge = 1; + } + + ImGui::EndCombo(); + } + */ + + ImGui::PopItemWidth(); +} + +void DrawInventoryTab() { + static bool restrictToValid = true; + + ImGui::Checkbox("Restrict to valid items", &restrictToValid); + InsertHelpHoverText("Restricts items and ammo to only what is possible to legally acquire in-game"); + + for (int32_t y = 0; y < 4; y++) { + for (int32_t x = 0; x < 6; x++) { + int32_t index = x + y * 6; + static int32_t selectedIndex = -1; + static const char* itemPopupPicker = "itemPopupPicker"; + + ImGui::PushID(index); + + if (x != 0) { + ImGui::SameLine(); + } + + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(1, 1, 1, 0)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0f); + uint8_t item = gSaveContext.inventory.items[index]; + if (item != ITEM_NONE) { + const ItemMapEntry& slotEntry = itemMapping.find(item)->second; + if (ImGui::ImageButton(SohImGui::GetTextureByName(slotEntry.name), ImVec2(32.0f, 32.0f), ImVec2(0, 0), + ImVec2(1, 1), 0)) { + selectedIndex = index; + ImGui::OpenPopup(itemPopupPicker); + } + } else { + if (ImGui::Button("##itemNone", ImVec2(32.0f, 32.0f))) { + selectedIndex = index; + ImGui::OpenPopup(itemPopupPicker); + } + } + ImGui::PopStyleVar(); + ImGui::PopStyleColor(); + + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0)); + if (ImGui::BeginPopup(itemPopupPicker)) { + if (ImGui::Button("##itemNonePicker", ImVec2(32.0f, 32.0f))) { + gSaveContext.inventory.items[selectedIndex] = ITEM_NONE; + ImGui::CloseCurrentPopup(); + } + SetLastItemHoverText("None"); + + std::vector possibleItems; + if (restrictToValid) { + // Scan gItemSlots to find legal items for this slot. Bottles are a special case + for (int slotIndex = 0; slotIndex < 56; slotIndex++) { + int testIndex = (selectedIndex == SLOT_BOTTLE_1 || selectedIndex == SLOT_BOTTLE_2 || + selectedIndex == SLOT_BOTTLE_3 || selectedIndex == SLOT_BOTTLE_4) + ? SLOT_BOTTLE_1 + : selectedIndex; + if (gItemSlots[slotIndex] == testIndex) { + possibleItems.push_back(itemMapping[slotIndex]); + } + } + } else { + for (const auto& entry : itemMapping) { + possibleItems.push_back(entry.second); + } + } + + for (int32_t pickerIndex = 0; pickerIndex < possibleItems.size(); pickerIndex++) { + if (((pickerIndex + 1) % 8) != 0) { + ImGui::SameLine(); + } + const ItemMapEntry& slotEntry = possibleItems[pickerIndex]; + if (ImGui::ImageButton(SohImGui::GetTextureByName(slotEntry.name), ImVec2(32.0f, 32.0f), + ImVec2(0, 0), ImVec2(1, 1), 0)) { + gSaveContext.inventory.items[selectedIndex] = slotEntry.id; + ImGui::CloseCurrentPopup(); + } + SetLastItemHoverText(SohUtils::GetItemName(slotEntry.id)); + } + + ImGui::EndPopup(); + } + ImGui::PopStyleVar(); + + ImGui::PopID(); + } + } + + ImGui::Text("Ammo"); + for (uint32_t ammoIndex = 0, drawnAmmoItems = 0; ammoIndex < 16; ammoIndex++) { + uint8_t item = (restrictToValid) ? gAmmoItems[ammoIndex] : gAllAmmoItems[ammoIndex]; + if (item != ITEM_NONE) { + // For legal items, display as 1 row of 7. For unrestricted items, display rows of 6 to match + // inventory + if ((restrictToValid && (drawnAmmoItems != 0)) || ((drawnAmmoItems % 6) != 0)) { + ImGui::SameLine(); + } + drawnAmmoItems++; + + ImGui::PushID(ammoIndex); + ImGui::PushItemWidth(32.0f); + ImGui::BeginGroup(); + + ImGui::Image(SohImGui::GetTextureByName(itemMapping[item].name), ImVec2(32.0f, 32.0f)); + ImGui::InputScalar("##ammoInput", ImGuiDataType_S8, &AMMO(item)); + + ImGui::EndGroup(); + ImGui::PopItemWidth(); + ImGui::PopID(); + } + } +} + +// Draw a flag bitfield as an grid of checkboxes +void DrawFlagArray(const std::string& name, uint32_t& flags) { + ImGui::PushID(name.c_str()); + for (int32_t flagIndex = 0; flagIndex < 32; flagIndex++) { + if ((flagIndex % 8) != 0) { + ImGui::SameLine(); + } + ImGui::PushID(flagIndex); + uint32_t bitMask = 1 << flagIndex; + bool flag = (flags & bitMask) != 0; + if (ImGui::Checkbox("##check", &flag)) { + if (flag) { + flags |= bitMask; + } else { + flags &= ~bitMask; + } + } + ImGui::PopID(); + } + ImGui::PopID(); +} + +void DrawFlagsTab() { + if (ImGui::TreeNode("Current Scene")) { + if (gGlobalCtx != nullptr) { + ActorContext* act = &gGlobalCtx->actorCtx; + + DrawGroupWithBorder([&]() { + ImGui::Text("Switch"); + InsertHelpHoverText("Permanently-saved switch flags"); + DrawFlagArray("Switch", act->flags.swch); + }); + + ImGui::SameLine(); + + DrawGroupWithBorder([&]() { + ImGui::Text("Temp Switch"); + InsertHelpHoverText("Temporary switch flags. Unset on scene transitions"); + DrawFlagArray("Temp Switch", act->flags.tempSwch); + }); + + DrawGroupWithBorder([&]() { + ImGui::Text("Clear"); + InsertHelpHoverText("Permanently-saved room-clear flags"); + DrawFlagArray("Clear", act->flags.clear); + }); + + ImGui::SameLine(); + + DrawGroupWithBorder([&]() { + ImGui::Text("Temp Clear"); + InsertHelpHoverText("Temporary room-clear flags. Unset on scene transitions"); + DrawFlagArray("Temp Clear", act->flags.tempClear); + }); + + DrawGroupWithBorder([&]() { + ImGui::Text("Collect"); + InsertHelpHoverText("Permanently-saved collect flags"); + DrawFlagArray("Collect", act->flags.collect); + }); + + ImGui::SameLine(); + + DrawGroupWithBorder([&]() { + ImGui::Text("Temp Collect"); + InsertHelpHoverText("Temporary collect flags. Unset on scene transitions"); + DrawFlagArray("Temp Collect", act->flags.tempCollect); + }); + + DrawGroupWithBorder([&]() { + ImGui::Text("Chest"); + InsertHelpHoverText("Permanently-saved chest flags"); + DrawFlagArray("Chest", act->flags.chest); + }); + + ImGui::SameLine(); + + ImGui::BeginGroup(); + + if (ImGui::Button("Reload Flags")) { + act->flags.swch = gSaveContext.sceneFlags[gGlobalCtx->sceneNum].swch; + act->flags.clear = gSaveContext.sceneFlags[gGlobalCtx->sceneNum].clear; + act->flags.collect = gSaveContext.sceneFlags[gGlobalCtx->sceneNum].collect; + act->flags.chest = gSaveContext.sceneFlags[gGlobalCtx->sceneNum].chest; + } + SetLastItemHoverText("Load flags from saved scene flags. Normally happens on scene load"); + + if (ImGui::Button("Save Flags")) { + gSaveContext.sceneFlags[gGlobalCtx->sceneNum].swch = act->flags.swch; + gSaveContext.sceneFlags[gGlobalCtx->sceneNum].clear = act->flags.clear; + gSaveContext.sceneFlags[gGlobalCtx->sceneNum].collect = act->flags.collect; + gSaveContext.sceneFlags[gGlobalCtx->sceneNum].chest = act->flags.chest; + } + SetLastItemHoverText("Save current scene flags. Normally happens on scene exit"); + + ImGui::EndGroup(); + } else { + ImGui::Text("Current game state does not have an active scene"); + } + + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Saved Scene Flags")) { + static uint32_t selectedSceneFlagMap = 0; + ImGui::Text("Map"); + ImGui::SameLine(); + if (ImGui::BeginCombo("##Map", SohUtils::GetSceneName(selectedSceneFlagMap).c_str())) { + for (int32_t sceneIndex = 0; sceneIndex < SCENE_ID_MAX; sceneIndex++) { + if (ImGui::Selectable(SohUtils::GetSceneName(sceneIndex).c_str())) { + selectedSceneFlagMap = sceneIndex; + } + } + + ImGui::EndCombo(); + } + + // Don't show current scene button if there is no current scene + if (gGlobalCtx != nullptr) { + ImGui::SameLine(); + if (ImGui::Button("Current")) { + selectedSceneFlagMap = gGlobalCtx->sceneNum; + } + SetLastItemHoverText("Open flags for current scene"); + } + + DrawGroupWithBorder([&]() { + ImGui::Text("Switch"); + InsertHelpHoverText("Switch flags"); + DrawFlagArray("Switch", gSaveContext.sceneFlags[selectedSceneFlagMap].swch); + }); + + ImGui::SameLine(); + + DrawGroupWithBorder([&]() { + ImGui::Text("Clear"); + InsertHelpHoverText("Room-clear flags"); + DrawFlagArray("Clear", gSaveContext.sceneFlags[selectedSceneFlagMap].clear); + }); + + DrawGroupWithBorder([&]() { + ImGui::Text("Collect"); + InsertHelpHoverText("Collect flags"); + DrawFlagArray("Collect", gSaveContext.sceneFlags[selectedSceneFlagMap].collect); + }); + + ImGui::SameLine(); + + DrawGroupWithBorder([&]() { + ImGui::Text("Chest"); + InsertHelpHoverText("Chest flags"); + DrawFlagArray("Chest", gSaveContext.sceneFlags[selectedSceneFlagMap].chest); + }); + + DrawGroupWithBorder([&]() { + ImGui::Text("Rooms"); + InsertHelpHoverText("Flags for visted rooms"); + DrawFlagArray("Rooms", gSaveContext.sceneFlags[selectedSceneFlagMap].rooms); + }); + + ImGui::SameLine(); + + DrawGroupWithBorder([&]() { + ImGui::Text("Floors"); + InsertHelpHoverText("Flags for visted floors"); + DrawFlagArray("Floors", gSaveContext.sceneFlags[selectedSceneFlagMap].floors); + }); + + ImGui::TreePop(); + } + + DrawGroupWithBorder([&]() { + static uint32_t selectedGsMap = 0; + ImGui::Text("Gold Skulltulas"); + ImGui::Text("Map"); + ImGui::SameLine(); + if (ImGui::BeginCombo("##Gold Skulltula Map", gsMapping[selectedGsMap].c_str())) { + for (int32_t gsIndex = 0; gsIndex < gsMapping.size(); gsIndex++) { + if (ImGui::Selectable(gsMapping[gsIndex].c_str())) { + selectedGsMap = gsIndex; + } + } + + ImGui::EndCombo(); + } + + // TODO We should write out descriptions for each one... ugh + ImGui::Text("Flags"); + uint32_t currentFlags = GET_GS_FLAGS(selectedGsMap); + uint32_t allFlags = gAreaGsFlags[selectedGsMap]; + uint32_t setMask = 1; + // Iterate over bitfield and create a checkbox for each skulltula + while (allFlags != 0) { + bool isThisSet = (currentFlags & 0x1) == 0x1; + + ImGui::SameLine(); + ImGui::PushID(allFlags); + if (ImGui::Checkbox("##gs", &isThisSet)) { + if (isThisSet) { + SET_GS_FLAGS(selectedGsMap, setMask); + } else { + // Have to do this roundabout method as the macro does not support clearing flags + uint32_t currentFlagsBase = GET_GS_FLAGS(selectedGsMap); + gSaveContext.gsFlags[selectedGsMap >> 2] &= ~gGsFlagsMasks[selectedGsMap & 3]; + SET_GS_FLAGS(selectedGsMap, currentFlagsBase & ~setMask); + } + } + + ImGui::PopID(); + + allFlags >>= 1; + currentFlags >>= 1; + setMask <<= 1; + } + + static bool keepGsCountUpdated = true; + ImGui::Checkbox("Keep GS Count Updated", &keepGsCountUpdated); + InsertHelpHoverText("Automatically adjust the number of gold skulltula tokens acquired based on set flags"); + int32_t gsCount = 0; + if (keepGsCountUpdated) { + for (int32_t gsFlagIndex = 0; gsFlagIndex < 6; gsFlagIndex++) { + gsCount += std::popcount(static_cast(gSaveContext.gsFlags[gsFlagIndex])); + } + gSaveContext.inventory.gsTokens = gsCount; + } + }); +} + +// Draws a combo that lets you choose and upgrade value from a drop-down of text values +void DrawUpgrade(const std::string& categoryName, int32_t categoryId, const std::vector& names) { + ImGui::Text(categoryName.c_str()); + ImGui::SameLine(); + ImGui::PushID(categoryName.c_str()); + if (ImGui::BeginCombo("##upgrade", names[CUR_UPG_VALUE(categoryId)].c_str())) { + for (int32_t i = 0; i < names.size(); i++) { + if (ImGui::Selectable(names[i].c_str())) { + Inventory_ChangeUpgrade(categoryId, i); + } + } + + ImGui::EndCombo(); + } + ImGui::PopID(); + SetLastItemHoverText(categoryName.c_str()); +} + +// Draws a combo that lets you choose and upgrade value from a popup grid of icons +void DrawUpgradeIcon(const std::string& categoryName, int32_t categoryId, const std::vector& items) { + static const char* upgradePopupPicker = "upgradePopupPicker"; + + ImGui::PushID(categoryName.c_str()); + + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(1, 1, 1, 0)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0f); + uint8_t item = items[CUR_UPG_VALUE(categoryId)]; + if (item != ITEM_NONE) { + const ItemMapEntry& slotEntry = itemMapping[item]; + if (ImGui::ImageButton(SohImGui::GetTextureByName(slotEntry.name), ImVec2(32.0f, 32.0f), ImVec2(0, 0), + ImVec2(1, 1), 0)) { + ImGui::OpenPopup(upgradePopupPicker); + } + } else { + if (ImGui::Button("##itemNone", ImVec2(32.0f, 32.0f))) { + ImGui::OpenPopup(upgradePopupPicker); + } + } + ImGui::PopStyleVar(); + ImGui::PopStyleColor(); + SetLastItemHoverText(categoryName.c_str()); + + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0)); + if (ImGui::BeginPopup(upgradePopupPicker)) { + for (int32_t pickerIndex = 0; pickerIndex < items.size(); pickerIndex++) { + if ((pickerIndex % 8) != 0) { + ImGui::SameLine(); + } + + if (items[pickerIndex] == ITEM_NONE) { + if (ImGui::Button("##upgradePopupPicker", ImVec2(32.0f, 32.0f))) { + Inventory_ChangeUpgrade(categoryId, pickerIndex); + ImGui::CloseCurrentPopup(); + } + SetLastItemHoverText("None"); + } else { + const ItemMapEntry& slotEntry = itemMapping[items[pickerIndex]]; + if (ImGui::ImageButton(SohImGui::GetTextureByName(slotEntry.name), ImVec2(32.0f, 32.0f), ImVec2(0, 0), + ImVec2(1, 1), 0)) { + Inventory_ChangeUpgrade(categoryId, pickerIndex); + ImGui::CloseCurrentPopup(); + } + SetLastItemHoverText(SohUtils::GetItemName(slotEntry.id)); + } + } + + ImGui::EndPopup(); + } + ImGui::PopStyleVar(); + + ImGui::PopID(); +} + +void DrawEquipmentTab() { + const std::vector equipmentValues = { + ITEM_SWORD_KOKIRI, ITEM_SWORD_MASTER, ITEM_SWORD_BGS, ITEM_SWORD_BROKEN, + ITEM_SHIELD_DEKU, ITEM_SHIELD_HYLIAN, ITEM_SHIELD_MIRROR, ITEM_NONE, + ITEM_TUNIC_KOKIRI, ITEM_TUNIC_GORON, ITEM_TUNIC_ZORA, ITEM_NONE, + ITEM_BOOTS_KOKIRI, ITEM_BOOTS_IRON, ITEM_BOOTS_HOVER, ITEM_NONE, + }; + for (int32_t i = 0; i < equipmentValues.size(); i++) { + // Skip over unused 4th slots for shields, boots, and tunics + if (equipmentValues[i] == ITEM_NONE) { + continue; + } + if ((i % 4) != 0) { + ImGui::SameLine(); + } + + ImGui::PushID(i); + uint32_t bitMask = 1 << i; + bool hasEquip = (bitMask & gSaveContext.inventory.equipment) != 0; + const ItemMapEntry& entry = itemMapping[equipmentValues[i]]; + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0)); + if (ImGui::ImageButton(SohImGui::GetTextureByName(hasEquip ? entry.name : entry.nameFaded), + ImVec2(32.0f, 32.0f), ImVec2(0, 0), ImVec2(1, 1), 0)) { + if (hasEquip) { + gSaveContext.inventory.equipment &= ~bitMask; + } else { + gSaveContext.inventory.equipment |= bitMask; + } + } + ImGui::PopStyleColor(); + ImGui::PopID(); + SetLastItemHoverText(SohUtils::GetItemName(entry.id)); + } + + const std::vector bulletBagValues = { + ITEM_NONE, + ITEM_BULLET_BAG_30, + ITEM_BULLET_BAG_40, + ITEM_BULLET_BAG_50, + }; + DrawUpgradeIcon("Bullet Bag", UPG_BULLET_BAG, bulletBagValues); + + ImGui::SameLine(); + + const std::vector quiverValues = { + ITEM_NONE, + ITEM_QUIVER_30, + ITEM_QUIVER_40, + ITEM_QUIVER_50, + }; + DrawUpgradeIcon("Quiver", UPG_QUIVER, quiverValues); + + ImGui::SameLine(); + + const std::vector bombBagValues = { + ITEM_NONE, + ITEM_BOMB_BAG_20, + ITEM_BOMB_BAG_30, + ITEM_BOMB_BAG_40, + }; + DrawUpgradeIcon("Bomb Bag", UPG_BOMB_BAG, bombBagValues); + + ImGui::SameLine(); + + const std::vector scaleValues = { + ITEM_NONE, + ITEM_SCALE_SILVER, + ITEM_SCALE_GOLDEN, + }; + DrawUpgradeIcon("Scale", UPG_SCALE, scaleValues); + + ImGui::SameLine(); + + const std::vector strengthValues = { + ITEM_NONE, + ITEM_BRACELET, + ITEM_GAUNTLETS_SILVER, + ITEM_GAUNTLETS_GOLD, + }; + DrawUpgradeIcon("Strength", UPG_STRENGTH, strengthValues); + + // There is no icon for child wallet, so default to a text list + const std::vector walletNames = { + "Child (99)", + "Adult (200)", + "Giant (500)", + }; + DrawUpgrade("Wallet", UPG_WALLET, walletNames); + + const std::vector stickNames = { + "None", + "10", + "20", + "30", + }; + DrawUpgrade("Sticks", UPG_STICKS, stickNames); + + const std::vector nutNames = { + "None", + "20", + "30", + "40", + }; + DrawUpgrade("Deku Nuts", UPG_NUTS, nutNames); +} + +// Draws a toggleable icon for a quest item that is faded when disabled +void DrawQuestItemButton(uint32_t item) { + const QuestMapEntry& entry = questMapping[item]; + uint32_t bitMask = 1 << entry.id; + bool hasQuestItem = (bitMask & gSaveContext.inventory.questItems) != 0; + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0)); + if (ImGui::ImageButton(SohImGui::GetTextureByName(hasQuestItem ? entry.name : entry.nameFaded), + ImVec2(32.0f, 32.0f), ImVec2(0, 0), ImVec2(1, 1), 0)) { + if (hasQuestItem) { + gSaveContext.inventory.questItems &= ~bitMask; + } else { + gSaveContext.inventory.questItems |= bitMask; + } + } + ImGui::PopStyleColor(); + SetLastItemHoverText(SohUtils::GetQuestItemName(entry.id)); +} + +// Draws a toggleable icon for a dungeon item that is faded when disabled +void DrawDungeonItemButton(uint32_t item, uint32_t scene) { + const ItemMapEntry& entry = itemMapping[item]; + uint32_t bitMask = 1 << (entry.id - ITEM_KEY_BOSS); // Bitset starts at ITEM_KEY_BOSS == 0. the rest are sequential + bool hasItem = (bitMask & gSaveContext.inventory.dungeonItems[scene]) != 0; + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0)); + if (ImGui::ImageButton(SohImGui::GetTextureByName(hasItem ? entry.name : entry.nameFaded), + ImVec2(32.0f, 32.0f), ImVec2(0, 0), ImVec2(1, 1), 0)) { + if (hasItem) { + gSaveContext.inventory.dungeonItems[scene] &= ~bitMask; + } else { + gSaveContext.inventory.dungeonItems[scene] |= bitMask; + } + } + ImGui::PopStyleColor(); + SetLastItemHoverText(SohUtils::GetItemName(entry.id)); +} + +void DrawQuestStatusTab() { + ImGui::PushItemWidth(ImGui::GetFontSize() * 6); + + for (int32_t i = QUEST_MEDALLION_FOREST; i < QUEST_MEDALLION_LIGHT + 1; i++) { + if (i != QUEST_MEDALLION_FOREST) { + ImGui::SameLine(); + } + DrawQuestItemButton(i); + } + + for (int32_t i = QUEST_KOKIRI_EMERALD; i < QUEST_ZORA_SAPPHIRE + 1; i++) { + if (i != QUEST_KOKIRI_EMERALD) { + ImGui::SameLine(); + } + DrawQuestItemButton(i); + } + + // Put Stone of Agony and Gerudo Card on the same line with a little space between them + ImGui::SameLine(); + ImGui::Dummy(ImVec2(20, 0)); + + ImGui::SameLine(); + DrawQuestItemButton(QUEST_STONE_OF_AGONY); + + ImGui::SameLine(); + DrawQuestItemButton(QUEST_GERUDO_CARD); + + for (const SongMapEntry& entry : songMapping) { + if ((entry.id != QUEST_SONG_MINUET) && (entry.id != QUEST_SONG_LULLABY)) { + ImGui::SameLine(); + } + + uint32_t bitMask = 1 << entry.id; + bool hasQuestItem = (bitMask & gSaveContext.inventory.questItems) != 0; + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0)); + if (ImGui::ImageButton(SohImGui::GetTextureByName(hasQuestItem ? entry.name : entry.nameFaded), + ImVec2(16.0f, 24.0f), ImVec2(0, 0), ImVec2(1, 1), 0)) { + if (hasQuestItem) { + gSaveContext.inventory.questItems &= ~bitMask; + } else { + gSaveContext.inventory.questItems |= bitMask; + } + } + ImGui::PopStyleColor(); + SetLastItemHoverText(SohUtils::GetQuestItemName(entry.id)); + } + + ImGui::InputScalar("GS Count", ImGuiDataType_S16, &gSaveContext.inventory.gsTokens); + InsertHelpHoverText("Number of gold skulltula tokens aquired"); + + uint32_t bitMask = 1 << QUEST_SKULL_TOKEN; + bool gsUnlocked = (bitMask & gSaveContext.inventory.questItems) != 0; + if (ImGui::Checkbox("GS unlocked", &gsUnlocked)) { + if (gsUnlocked) { + gSaveContext.inventory.questItems |= bitMask; + } else { + gSaveContext.inventory.questItems &= ~bitMask; + } + } + InsertHelpHoverText("If unlocked, enables showing the gold skulltula count in the quest status menu"); + + int32_t pohCount = (gSaveContext.inventory.questItems & 0xF0000000) >> 28; + if (ImGui::BeginCombo("PoH count", std::to_string(pohCount).c_str())) { + for (int32_t i = 0; i < 4; i++) { + if (ImGui::Selectable(std::to_string(i).c_str(), pohCount == i)) { + gSaveContext.inventory.questItems &= ~0xF0000000; + gSaveContext.inventory.questItems |= (i << 28); + } + } + ImGui::EndCombo(); + } + InsertHelpHoverText("The number of pieces of heart acquired towards the next heart container"); + + DrawGroupWithBorder([&]() { + ImGui::Text("Dungeon Items"); + + static int32_t dungeonItemsScene = SCENE_YDAN; + ImGui::PushItemWidth(-ImGui::GetWindowWidth() * 0.35f); + if (ImGui::BeginCombo("##DungeonSelect", SohUtils::GetSceneName(dungeonItemsScene).c_str())) { + for (int32_t dungeonIndex = SCENE_YDAN; dungeonIndex < SCENE_BDAN_BOSS + 1; dungeonIndex++) { + if (ImGui::Selectable(SohUtils::GetSceneName(dungeonIndex).c_str(), + dungeonIndex == dungeonItemsScene)) { + dungeonItemsScene = dungeonIndex; + } + } + + ImGui::EndCombo(); + } + ImGui::PopItemWidth(); + + DrawDungeonItemButton(ITEM_KEY_BOSS, dungeonItemsScene); + ImGui::SameLine(); + DrawDungeonItemButton(ITEM_COMPASS, dungeonItemsScene); + ImGui::SameLine(); + DrawDungeonItemButton(ITEM_DUNGEON_MAP, dungeonItemsScene); + + if (dungeonItemsScene != SCENE_BDAN_BOSS) { + float lineHeight = ImGui::GetTextLineHeightWithSpacing(); + ImGui::Image(SohImGui::GetTextureByName(itemMapping[ITEM_KEY_SMALL].name), ImVec2(lineHeight, lineHeight)); + ImGui::SameLine(); + ImGui::InputScalar("##Keys", ImGuiDataType_S8, gSaveContext.inventory.dungeonKeys + dungeonItemsScene); + } else { + // dungeonItems is size 20 but dungeonKeys is size 19, so there are no keys for the last scene (Barinade's Lair) + ImGui::Text("Barinade's Lair does not have small keys"); + } + }); + + ImGui::PopItemWidth(); +} + +void DrawSaveEditor(bool& open) { + if (!open) { + return; + } + + ImGui::SetNextWindowSize(ImVec2(520, 600), ImGuiCond_FirstUseEver); + if (!ImGui::Begin("Save Editor", &open)) { + ImGui::End(); + return; + } + if (ImGui::BeginTabBar("SaveContextTabBar", ImGuiTabBarFlags_NoCloseWithMiddleMouseButton)) { if (ImGui::BeginTabItem("Info")) { - ImGui::PushItemWidth(ImGui::GetFontSize() * 6); - - ImGui::Text("Name: %s", name.c_str()); - InsertHelpHoverText("Player Name"); - - // Use an intermediary to keep the health from updating (and potentially killing the player) - // until it is done being edited - int16_t healthIntermediary = gSaveContext.healthCapacity; - ImGui::InputScalar("Max Health", ImGuiDataType_S16, &healthIntermediary); - if (ImGui::IsItemDeactivated()) { - gSaveContext.healthCapacity = healthIntermediary; - } - InsertHelpHoverText("Maximum health. 16 units per full heart"); - if (gSaveContext.health > gSaveContext.healthCapacity) { - gSaveContext.health = gSaveContext.healthCapacity; // Clamp health to new max - } - - const uint16_t healthMin = 0; - const uint16_t healthMax = gSaveContext.healthCapacity; - ImGui::SetNextItemWidth(ImGui::GetFontSize() * 15); - ImGui::SliderScalar("Health", ImGuiDataType_S16, &gSaveContext.health, &healthMin, &healthMax); - InsertHelpHoverText("Current health. 16 units per full heart"); - - bool doubleDefense = gSaveContext.doubleDefense != 0; - if (ImGui::Checkbox("Double Defense", &doubleDefense)) { - gSaveContext.doubleDefense = doubleDefense; - gSaveContext.inventory.defenseHearts = - gSaveContext.doubleDefense ? 20 : 0; // Set to get the border drawn in the UI - } - InsertHelpHoverText("Is double defense unlocked?"); - - std::string magicName; - if (gSaveContext.magicLevel == 2) { - magicName = "Double"; - } else if (gSaveContext.magicLevel == 1) { - magicName = "Single"; - } else { - magicName = "None"; - } - ImGui::SetNextItemWidth(ImGui::GetFontSize() * 6); - if (ImGui::BeginCombo("Magic Level", magicName.c_str())) { - if (ImGui::Selectable("Double")) { - gSaveContext.magicLevel = 2; - gSaveContext.magicAcquired = true; - gSaveContext.doubleMagic = true; - } - if (ImGui::Selectable("Single")) { - gSaveContext.magicLevel = 1; - gSaveContext.magicAcquired = true; - gSaveContext.doubleMagic = false; - } - if (ImGui::Selectable("None")) { - gSaveContext.magicLevel = 0; - gSaveContext.magicAcquired = false; - gSaveContext.doubleMagic = false; - } - - ImGui::EndCombo(); - } - InsertHelpHoverText("Current magic level"); - gSaveContext.unk_13F4 = gSaveContext.magicLevel * 0x30; // Set to get the bar drawn in the UI - if (gSaveContext.magic > gSaveContext.unk_13F4) { - gSaveContext.magic = gSaveContext.unk_13F4; // Clamp magic to new max - } - - const uint8_t magicMin = 0; - const uint8_t magicMax = gSaveContext.unk_13F4; - ImGui::SetNextItemWidth(ImGui::GetFontSize() * 15); - ImGui::SliderScalar("Magic", ImGuiDataType_S8, &gSaveContext.magic, &magicMin, &magicMax); - InsertHelpHoverText("Current magic. 48 units per magic level"); - - ImGui::InputScalar("Rupees", ImGuiDataType_S16, &gSaveContext.rupees); - InsertHelpHoverText("Current rupees"); - - const uint16_t dayTimeMin = 0; - const uint16_t dayTimeMax = 0xFFFF; - ImGui::SetNextItemWidth(ImGui::GetFontSize() * 15); - ImGui::SliderScalar("Time", ImGuiDataType_U16, &gSaveContext.dayTime, &dayTimeMin, &dayTimeMax); - InsertHelpHoverText("Time of day"); - if (ImGui::Button("Dawn")) { - gSaveContext.dayTime = 0x4000; - } - ImGui::SameLine(); - if (ImGui::Button("Noon")) { - gSaveContext.dayTime = 0x8000; - } - ImGui::SameLine(); - if (ImGui::Button("Sunset")) { - gSaveContext.dayTime = 0xC000; - } - ImGui::SameLine(); - if (ImGui::Button("Midnight")) { - gSaveContext.dayTime = 0; - } - - ImGui::InputScalar("Total Days", ImGuiDataType_S32, &gSaveContext.totalDays); - InsertHelpHoverText("Total number of days elapsed since the start of the game"); - - ImGui::InputScalar("Deaths", ImGuiDataType_U16, &gSaveContext.deaths); - InsertHelpHoverText("Total number of deaths"); - - // TODO Move to quest status screen once the page is created - ImGui::InputScalar("GS Count", ImGuiDataType_S16, &gSaveContext.inventory.gsTokens); - InsertHelpHoverText("Number of gold skulltula tokens aquired"); - - bool bgsFlag = gSaveContext.bgsFlag != 0; - if (ImGui::Checkbox("Has BGS", &bgsFlag)) { - gSaveContext.bgsFlag = bgsFlag; - } - InsertHelpHoverText("Is Biggoron sword unlocked? Replaces Giant's knife"); - - ImGui::InputScalar("Sword Health", ImGuiDataType_U16, &gSaveContext.swordHealth); - InsertHelpHoverText("Giant's knife health. Default is 8. Must be >0 for Biggoron sword to work"); - - ImGui::InputScalar("Bgs Day Count", ImGuiDataType_S32, &gSaveContext.bgsDayCount); - InsertHelpHoverText("Total number of days elapsed since giving Biggoron the claim check"); - - // TODO Changing Link's age is more involved than just setting gSaveContext.linkAge - // It might not fit here and instead should be only changable when changing scenes - /* - if (ImGui::BeginCombo("Link Age", LINK_IS_ADULT ? "Adult" : "Child")) { - if (ImGui::Selectable("Adult")) { - gSaveContext.linkAge = 0; - } - if (ImGui::Selectable("Child")) { - gSaveContext.linkAge = 1; - } - - ImGui::EndCombo(); - } - */ - - ImGui::PopItemWidth(); + DrawInfoTab(); ImGui::EndTabItem(); } if (ImGui::BeginTabItem("Inventory")) { - static bool restrictToValid = true; - - ImGui::Checkbox("Restrict to valid items", &restrictToValid); - InsertHelpHoverText("Restricts items and ammo to only what is possible to legally acquire in-game"); - - for (int32_t y = 0; y < 4; y++) { - for (int32_t x = 0; x < 6; x++) { - int32_t index = x + y * 6; - static int32_t selectedIndex = -1; - static const char* itemPopupPicker = "itemPopupPicker"; - - ImGui::PushID(index); - - if (x != 0) { - ImGui::SameLine(); - } - - ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(1, 1, 1, 0)); - ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0f); - uint8_t item = gSaveContext.inventory.items[index]; - if (item != ITEM_NONE) { - const ItemMapEntry& slotEntry = itemMapping.find(item)->second; - if (ImGui::ImageButton(SohImGui::GetTextureByName(slotEntry.name), ImVec2(32.0f, 32.0f), - ImVec2(0, 0), ImVec2(1, 1), 0)) { - selectedIndex = index; - ImGui::OpenPopup(itemPopupPicker); - } - } else { - if (ImGui::Button("##itemNone", ImVec2(32.0f, 32.0f))) { - selectedIndex = index; - ImGui::OpenPopup(itemPopupPicker); - } - } - ImGui::PopStyleVar(); - ImGui::PopStyleColor(); - - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0)); - if (ImGui::BeginPopup(itemPopupPicker)) { - if (ImGui::Button("##itemNonePicker", ImVec2(32.0f, 32.0f))) { - gSaveContext.inventory.items[selectedIndex] = ITEM_NONE; - ImGui::CloseCurrentPopup(); - } - SetLastItemHoverText("ITEM_NONE"); - - std::vector possibleItems; - if (restrictToValid) { - // Scan gItemSlots to find legal items for this slot. Bottles are a special case - for (int slotIndex = 0; slotIndex < 56; slotIndex++) { - int testIndex = (selectedIndex == SLOT_BOTTLE_1 || selectedIndex == SLOT_BOTTLE_2 || - selectedIndex == SLOT_BOTTLE_3 || selectedIndex == SLOT_BOTTLE_4) - ? SLOT_BOTTLE_1 - : selectedIndex; - if (gItemSlots[slotIndex] == testIndex) { - possibleItems.push_back(itemMapping[slotIndex]); - } - } - } else { - for (const auto& entry : itemMapping) { - possibleItems.push_back(entry.second); - } - } - - for (int32_t pickerIndex = 0; pickerIndex < possibleItems.size(); pickerIndex++) { - if (((pickerIndex + 1) % 8) != 0) { - ImGui::SameLine(); - } - const ItemMapEntry& slotEntry = possibleItems[pickerIndex]; - if (ImGui::ImageButton(SohImGui::GetTextureByName(slotEntry.name), ImVec2(32.0f, 32.0f), - ImVec2(0, 0), ImVec2(1, 1), 0)) { - gSaveContext.inventory.items[selectedIndex] = slotEntry.id; - ImGui::CloseCurrentPopup(); - } - SetLastItemHoverText(slotEntry.name); - } - - ImGui::EndPopup(); - } - ImGui::PopStyleVar(); - - ImGui::PopID(); - } - } - - ImGui::Text("Ammo"); - for (uint32_t ammoIndex = 0, drawnAmmoItems = 0; ammoIndex < 16; ammoIndex++) { - uint8_t item = (restrictToValid) ? gAmmoItems[ammoIndex] : gAllAmmoItems[ammoIndex]; - if (item != ITEM_NONE) { - // For legal items, display as 1 row of 7. For unrestricted items, display rows of 6 to match - // inventory - if ((restrictToValid && (drawnAmmoItems != 0)) || ((drawnAmmoItems % 6) != 0)) { - ImGui::SameLine(); - } - drawnAmmoItems++; - - ImGui::PushID(ammoIndex); - ImGui::PushItemWidth(32.0f); - ImGui::BeginGroup(); - - ImGui::Image(SohImGui::GetTextureByName(itemMapping[item].name), ImVec2(32.0f, 32.0f)); - ImGui::InputScalar("##ammoInput", ImGuiDataType_S8, &AMMO(item)); - - ImGui::EndGroup(); - ImGui::PopItemWidth(); - ImGui::PopID(); - } - } - + DrawInventoryTab(); ImGui::EndTabItem(); } if (ImGui::BeginTabItem("Flags")) { - static uint32_t selectedGsMap = 0; - ImGui::Text("Gold Skulltulas"); - ImGui::Text("Map"); - ImGui::SameLine(); - if (ImGui::BeginCombo("##Gold Skulltula Map", gsMapping[selectedGsMap].c_str())) { - for (int32_t gsIndex = 0; gsIndex < gsMapping.size(); gsIndex++) { - if (ImGui::Selectable(gsMapping[gsIndex].c_str())) { - selectedGsMap = gsIndex; - } - } + DrawFlagsTab(); + ImGui::EndTabItem(); + } - ImGui::EndCombo(); - } - - // TODO We should write out descriptions for each one... ugh - ImGui::Text("Flags"); - uint32_t currentFlags = GET_GS_FLAGS(selectedGsMap); - uint32_t allFlags = gAreaGsFlags[selectedGsMap]; - uint32_t setMask = 1; - // Iterate over bitfield and create a checkbox for each skulltula - while (allFlags != 0) { - bool isThisSet = (currentFlags & 0x1) == 0x1; - - ImGui::SameLine(); - ImGui::PushID(allFlags); - if (ImGui::Checkbox("##gs", &isThisSet)) { - if (isThisSet) { - SET_GS_FLAGS(selectedGsMap, setMask); - } else { - // Have to do this roundabout method as the macro does not support clearing flags - uint32_t currentFlagsBase = GET_GS_FLAGS(selectedGsMap); - gSaveContext.gsFlags[selectedGsMap >> 2] &= ~gGsFlagsMasks[selectedGsMap & 3]; - SET_GS_FLAGS(selectedGsMap, currentFlagsBase & ~setMask); - } - } - - ImGui::PopID(); - - allFlags >>= 1; - currentFlags >>= 1; - setMask <<= 1; - } - - static bool keepGsCountUpdated = true; - ImGui::Checkbox("Keep GS Count Updated", &keepGsCountUpdated); - InsertHelpHoverText("Automatically adjust the number of gold skulltula tokens acquired based on set flags"); - int32_t gsCount = 0; - if (keepGsCountUpdated) { - for (int32_t gsFlagIndex = 0; gsFlagIndex < 6; gsFlagIndex++) { - gsCount += std::popcount(static_cast(gSaveContext.gsFlags[gsFlagIndex])); - } - gSaveContext.inventory.gsTokens = gsCount; - } - - // TODO other flag types, like switch, clear, etc. - // These flags interact with the actor context, so it's a bit more complicated + if (ImGui::BeginTabItem("Equipment")) { + DrawEquipmentTab(); + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("Quest Status")) { + DrawQuestStatusTab(); ImGui::EndTabItem(); } @@ -523,5 +1125,16 @@ void InitSaveEditor() { // Load item icons into ImGui for (const auto& entry : itemMapping) { SohImGui::LoadResource(entry.second.name, entry.second.texturePath); + SohImGui::LoadResource(entry.second.nameFaded, entry.second.texturePath, ImVec4(1, 1, 1, 0.3f)); + } + for (const auto& entry : questMapping) { + SohImGui::LoadResource(entry.second.name, entry.second.texturePath); + SohImGui::LoadResource(entry.second.nameFaded, entry.second.texturePath, ImVec4(1, 1, 1, 0.3f)); + } + for (const auto& entry : songMapping) { + SohImGui::LoadResource(entry.name, gSongNoteTex, entry.color); + ImVec4 fadedCol = entry.color; + fadedCol.w = 0.3f; + SohImGui::LoadResource(entry.nameFaded, gSongNoteTex, fadedCol); } } diff --git a/soh/soh/util.cpp b/soh/soh/util.cpp new file mode 100644 index 000000000..7a5d0205d --- /dev/null +++ b/soh/soh/util.cpp @@ -0,0 +1,314 @@ +#include "util.h" + +#include + +std::vector sceneNames = { + "Inside the Deku Tree", + "Dodongo's Cavern", + "Inside Jabu-Jabu's Belly", + "Forest Temple", + "Fire Temple", + "Water Temple", + "Spirit Temple", + "Shadow Temple", + "Bottom of the Well", + "Ice Cavern", + "Ganon's Tower", + "Gerudo Training Ground", + "Thieves' Hideout", + "Inside Ganon's Castle", + "Ganon's Tower (Collapsing)", + "Inside Ganon's Castle (Collapsing)", + "Treasure Box Shop", + "Gohma's Lair", + "King Dodongo's Lair", + "Barinade's Lair", + "Phantom Ganon's Lair", + "Volvagia's Lair", + "Morpha's Lair", + "Twinrova's Lair & Nabooru's Mini-Boss Room", + "Bongo Bongo's Lair", + "Ganondorf's Lair", + "Tower Collapse Exterior", + "Market Entrance (Child - Day)", + "Market Entrance (Child - Night)", + "Market Entrance (Ruins)", + "Back Alley (Child - Day)", + "Back Alley (Child - Night)", + "Market (Child - Day)", + "Market (Child - Night)", + "Market (Ruins)", + "Temple of Time Exterior (Child - Day)", + "Temple of Time Exterior (Child - Night)", + "Temple of Time Exterior (Ruins)", + "Know-It-All Brothers' House", + "House of Twins", + "Mido's House", + "Saria's House", + "Carpenter Boss's House", + "Back Alley House (Man in Green)", + "Bazaar", + "Kokiri Shop", + "Goron Shop", + "Zora Shop", + "Kakariko Potion Shop", + "Market Potion Shop", + "Bombchu Shop", + "Happy Mask Shop", + "Link's House", + "Back Alley House (Dog Lady)", + "Stable", + "Impa's House", + "Lakeside Laboratory", + "Carpenters' Tent", + "Gravekeeper's Hut", + "Great Fairy's Fountain (Upgrades)", + "Fairy's Fountain", + "Great Fairy's Fountain (Spells)", + "Grottos", + "Grave (Redead)", + "Grave (Fairy's Fountain)", + "Royal Family's Tomb", + "Shooting Gallery", + "Temple of Time", + "Chamber of the Sages", + "Castle Hedge Maze (Day)", + "Castle Hedge Maze (Night)", + "Cutscene Map", + "Dampé's Grave & Windmill", + "Fishing Pond", + "Castle Courtyard", + "Bombchu Bowling Alley", + "Ranch House & Silo", + "Guard House", + "Granny's Potion Shop", + "Ganon's Tower Collapse & Battle Arena", + "House of Skulltula", + "Spot 00 - Hyrule Field", + "Spot 01 - Kakariko Village", + "Spot 02 - Graveyard", + "Spot 03 - Zora's River", + "Spot 04 - Kokiri Forest", + "Spot 05 - Sacred Forest Meadow", + "Spot 06 - Lake Hylia", + "Spot 07 - Zora's Domain", + "Spot 08 - Zora's Fountain", + "Spot 09 - Gerudo Valley", + "Spot 10 - Lost Woods", + "Spot 11 - Desert Colossus", + "Spot 12 - Gerudo's Fortress", + "Spot 13 - Haunted Wasteland", + "Spot 15 - Hyrule Castle", + "Spot 16 - Death Mountain Trail", + "Spot 17 - Death Mountain Crater", + "Spot 18 - Goron City", + "Spot 20 - Lon Lon Ranch", + "Ganon's Castle Exterior", + "Jungle Gym", + "Ganondorf Test Room", + "Depth Test", + "Stalfos Mini-Boss Room", + "Stalfos Boss Room", + "Sutaru", + "Castle Hedge Maze (Early)", + "Sasa Test", + "Treasure Chest Room", +}; + +std::vector itemNames = { + "Deku Stick", + "Deku Nut", + "Bomb", + "Fairy Bow", + "Fire Arrow", + "Din's Fire", + "Fairy Slingshot", + "Fairy Ocarina", + "Ocarina of Time", + "Bombchu", + "Hookshot", + "Longshot", + "Ice Arrow", + "Farore's Wind", + "Boomerang", + "Lens of Truth", + "Magic Bean", + "Megaton Hammer", + "Light Arrow", + "Nayru's Love", + "Empty Bottle", + "Red Potion", + "Green Potion", + "Blue Potion", + "Bottled Fairy", + "Fish", + "Lon Lon Milk & Bottle", + "Ruto's Letter", + "Blue Fire", + "Bug", + "Big Poe", + "Lon Lon Milk (Half)", + "Poe", + "Weird Egg", + "Chicken", + "Zelda's Letter", + "Keaton Mask", + "Skull Mask", + "Spooky Mask", + "Bunny Hood", + "Goron Mask", + "Zora Mask", + "Gerudo Mask", + "Mask of Truth", + "SOLD OUT", + "Pocket Egg", + "Pocket Cucco", + "Cojiro", + "Odd Mushroom", + "Odd Potion", + "Poacher's Saw", + "Goron's Sword (Broken)", + "Prescription", + "Eyeball Frog", + "Eye Drops", + "Claim Check", + "Fairy Bow & Fire Arrow", + "Fairy Bow & Ice Arrow", + "Fairy Bow & Light Arrow", + "Kokiri Sword", + "Master Sword", + "Giant's Knife & Biggoron's Sword", + "Deku Shield", + "Hylian Shield", + "Mirror Shield", + "Kokiri Tunic", + "Goron Tunic", + "Zora Tunic", + "Kokiri Boots", + "Iron Boots", + "Hover Boots", + "Bullet Bag (30)", + "Bullet Bag (40)", + "Bullet Bag (50)", + "Quiver (30)", + "Big Quiver (40)", + "Biggest Quiver (50)", + "Bomb Bag (20)", + "Big Bomb Bag (30)", + "Biggest Bomb Bag (40)", + "Goron's Bracelet", + "Silver Gauntlets", + "Golden Gauntlets", + "Silver Scale", + "Golden Scale", + "Giant's Knife (Broken)", + "Adult's Wallet", + "Giant's Wallet", + "Deku Seeds (5)", + "Fishing Pole", + "Minuet of Forest", + "Bolero of Fire", + "Serenade of Water", + "Requiem of Spirit", + "Nocturne of Shadow", + "Prelude of Light", + "Zelda's Lullaby", + "Epona's Song", + "Saria's Song", + "Sun's Song", + "Song of Time", + "Song of Storms", + "Forest Medallion", + "Fire Medallion", + "Water Medallion", + "Spirit Medallion", + "Shadow Medallion", + "Light Medallion", + "Kokiri's Emerald", + "Goron's Ruby", + "Zora's Sapphire", + "Stone of Agony", + "Gerudo's Card", + "Gold Skulltula Token", + "Heart Container", + "Piece of Heart [?]", + "Big Key", + "Compass", + "Dungeon Map", + "Small Key", + "Small Magic Jar", + "Large Magic Jar", + "Piece of Heart", + "[Removed]", + "[Removed]", + "[Removed]", + "[Removed]", + "[Removed]", + "[Removed]", + "[Removed]", + "Lon Lon Milk", + "Recovery Heart", + "Green Rupee", + "Blue Rupee", + "Red Rupee", + "Purple Rupee", + "Huge Rupee", + "[Removed]", + "Deku Sticks (5)", + "Deku Sticks (10)", + "Deku Nuts (5)", + "Deku Nuts (10)", + "Bombs (5)", + "Bombs (10)", + "Bombs (20)", + "Bombs (30)", + "Arrows (Small)", + "Arrows (Medium)", + "Arrows (Large)", + "Deku Seeds (30)", + "Bombchu (5)", + "Bombchu (20)", + "Deku Stick Upgrade (20)", + "Deku Stick Upgrade (30)", + "Deku Nut Upgrade (30)", + "Deku Nut Upgrade (40)", +}; + +std::vector questItemNames = { + "Forest Medallion", + "Fire Medallion", + "Water Medallion", + "Spirit Medallion", + "Shadow Medallion", + "Light Medallion", + "Minuet of Forest", + "Bolero of Fire", + "Serenade of Water", + "Requiem of Spirit", + "Nocturne of Shadow", + "Prelude of Light", + "Zelda's Lullaby", + "Epona's Song", + "Saria's Song", + "Sun's Song", + "Song of Time", + "Song of Storms", + "Kokiri's Emerald", + "Goron's Ruby", + "Zora's Sapphire", + "Stone of Agony", + "Gerudo's Card", + "Gold Skulltula Token", +}; + +const std::string& SohUtils::GetSceneName(int32_t scene) { + return sceneNames[scene]; +} + +const std::string& SohUtils::GetItemName(int32_t item) { + return itemNames[item]; +} + +const std::string& SohUtils::GetQuestItemName(int32_t item) { + return questItemNames[item]; +} diff --git a/soh/soh/util.h b/soh/soh/util.h new file mode 100644 index 000000000..9fd806f18 --- /dev/null +++ b/soh/soh/util.h @@ -0,0 +1,11 @@ +#pragma once +#include +#include + +namespace SohUtils { + const std::string& GetSceneName(int32_t scene); + + const std::string& GetItemName(int32_t item); + + const std::string& GetQuestItemName(int32_t item); +} // namespace SohUtils From fe6dbd2a5b38e63db5fde84091a68803892cc0f1 Mon Sep 17 00:00:00 2001 From: Sirius902 <10891979+Sirius902@users.noreply.github.com> Date: Sun, 17 Apr 2022 08:26:49 -0700 Subject: [PATCH 43/83] MM Bunny Hood enhancement (#181) Allow bunny hood in boss rooms Use math instead of array Allow other masks with enhancement because why not --- libultraship/libultraship/GameSettings.cpp | 4 +++ libultraship/libultraship/GameSettings.h | 1 + libultraship/libultraship/SohImGuiImpl.cpp | 7 ++++- soh/src/code/z_parameter.c | 6 ++++- .../actors/ovl_player_actor/z_player.c | 27 +++++++++++++++---- 5 files changed, 38 insertions(+), 7 deletions(-) diff --git a/libultraship/libultraship/GameSettings.cpp b/libultraship/libultraship/GameSettings.cpp index 678555c7d..1b8d473b2 100644 --- a/libultraship/libultraship/GameSettings.cpp +++ b/libultraship/libultraship/GameSettings.cpp @@ -61,6 +61,9 @@ namespace Game { Settings.enhancements.minimal_ui = stob(Conf[EnhancementSection]["minimal_ui"]); CVar_SetS32("gMinimalUI", Settings.enhancements.minimal_ui); + Settings.enhancements.mm_bunny_hood = stob(Conf[EnhancementSection]["mm_bunny_hood"]); + CVar_SetS32("gMMBunnyHood", Settings.enhancements.mm_bunny_hood); + // Audio Settings.audio.master = Ship::stof(Conf[AudioSection]["master"]); CVar_SetFloat("gGameMasterVolume", Settings.audio.master); @@ -152,6 +155,7 @@ namespace Game { Conf[EnhancementSection]["disable_lod"] = std::to_string(Settings.enhancements.disable_lod); Conf[EnhancementSection]["animated_pause_menu"] = std::to_string(Settings.enhancements.animated_pause_menu); Conf[EnhancementSection]["minimal_ui"] = std::to_string(Settings.enhancements.minimal_ui); + Conf[EnhancementSection]["mm_bunny_hood"] = std::to_string(Settings.enhancements.mm_bunny_hood); // Controllers Conf[ControllerSection]["gyro_sensitivity"] = std::to_string(Settings.controller.gyro_sensitivity); diff --git a/libultraship/libultraship/GameSettings.h b/libultraship/libultraship/GameSettings.h index 17079c9bf..340e93d26 100644 --- a/libultraship/libultraship/GameSettings.h +++ b/libultraship/libultraship/GameSettings.h @@ -24,6 +24,7 @@ struct SoHConfigType { bool disable_lod = false; bool animated_pause_menu = false; bool minimal_ui = false; + bool mm_bunny_hood = false; } enhancements; // Controller diff --git a/libultraship/libultraship/SohImGuiImpl.cpp b/libultraship/libultraship/SohImGuiImpl.cpp index b7e6e01ab..93dcd2492 100644 --- a/libultraship/libultraship/SohImGuiImpl.cpp +++ b/libultraship/libultraship/SohImGuiImpl.cpp @@ -413,6 +413,11 @@ namespace SohImGui { needs_save = true; } + if (ImGui::Checkbox("MM Bunny Hood", &Game::Settings.enhancements.mm_bunny_hood)) { + CVar_SetS32("gMMBunnyHood", Game::Settings.enhancements.mm_bunny_hood); + needs_save = true; + } + ImGui::Text("Graphics"); ImGui::Separator(); @@ -639,4 +644,4 @@ namespace SohImGui { ImTextureID GetTextureByName(const std::string& name) { return GetTextureByID(DefaultAssets[name]->textureId); } -} \ No newline at end of file +} diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index 1653cdaaf..dc96ba133 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -919,7 +919,11 @@ void func_80083108(GlobalContext* globalCtx) { if (interfaceCtx->restrictions.tradeItems != 0) { for (i = 1; i < 4; i++) { - if ((gSaveContext.equips.buttonItems[i] >= ITEM_WEIRD_EGG) && + if ((CVar_GetS32("gMMBunnyHood", 0) != 0) + && (gSaveContext.equips.buttonItems[i] >= ITEM_MASK_KEATON) + && (gSaveContext.equips.buttonItems[i] <= ITEM_MASK_TRUTH)) { + gSaveContext.buttonStatus[i] = BTN_ENABLED; + } else if ((gSaveContext.equips.buttonItems[i] >= ITEM_WEIRD_EGG) && (gSaveContext.equips.buttonItems[i] <= ITEM_CLAIM_CHECK)) { if (gSaveContext.buttonStatus[i] == BTN_ENABLED) { sp28 = 1; diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index a2a810175..734ba015e 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -1875,10 +1875,20 @@ void func_80833DF8(Player* this, GlobalContext* globalCtx) { s32 i; if (this->currentMask != PLAYER_MASK_NONE) { - maskActionParam = this->currentMask - 1 + PLAYER_AP_MASK_KEATON; - if (!func_80833C98(C_BTN_ITEM(0), maskActionParam) && !func_80833C98(C_BTN_ITEM(1), maskActionParam) && - !func_80833C98(C_BTN_ITEM(2), maskActionParam)) { - this->currentMask = PLAYER_MASK_NONE; + if (CVar_GetS32("gMMBunnyHood", 0) != 0) { + s32 maskItem = this->currentMask - PLAYER_MASK_KEATON + ITEM_MASK_KEATON; + + if (gSaveContext.equips.buttonItems[0] != maskItem && gSaveContext.equips.buttonItems[1] != maskItem && + gSaveContext.equips.buttonItems[2] != maskItem && gSaveContext.equips.buttonItems[3] != maskItem) { + this->currentMask = PLAYER_MASK_NONE; + func_808328EC(this, NA_SE_PL_CHANGE_ARMS); + } + } else { + maskActionParam = this->currentMask - 1 + PLAYER_AP_MASK_KEATON; + if (!func_80833C98(C_BTN_ITEM(0), maskActionParam) && !func_80833C98(C_BTN_ITEM(1), maskActionParam) && + !func_80833C98(C_BTN_ITEM(2), maskActionParam)) { + this->currentMask = PLAYER_MASK_NONE; + } } } @@ -5942,7 +5952,11 @@ void func_8083DFE0(Player* this, f32* arg1, s16* arg2) { s16 yawDiff = this->currentYaw - *arg2; if (this->swordState == 0) { - this->linearVelocity = CLAMP(this->linearVelocity, -(R_RUN_SPEED_LIMIT / 100.0f), (R_RUN_SPEED_LIMIT / 100.0f)); + float maxSpeed = R_RUN_SPEED_LIMIT / 100.0f; + if (CVar_GetS32("gMMBunnyHood", 0) != 0 && this->currentMask == PLAYER_MASK_BUNNY) { + maxSpeed *= 1.5f; + } + this->linearVelocity = CLAMP(this->linearVelocity, -maxSpeed, maxSpeed); } if (ABS(yawDiff) > 0x6000) { @@ -7523,6 +7537,9 @@ void func_80842180(Player* this, GlobalContext* globalCtx) { func_80837268(this, &sp2C, &sp2A, 0.018f, globalCtx); if (!func_8083C484(this, &sp2C, &sp2A)) { + if (CVar_GetS32("gMMBunnyHood", 0) != 0 && this->currentMask == PLAYER_MASK_BUNNY) { + sp2C *= 1.5f; + } func_8083DF68(this, sp2C, sp2A); func_8083DDC8(this, globalCtx); From ceef4a94537a9b6fd14b5ff1b58f4605fd4c64fd Mon Sep 17 00:00:00 2001 From: Emill Date: Mon, 18 Apr 2022 11:37:47 +0200 Subject: [PATCH 44/83] Graphics backend enhancements etc. (#163) --- libultraship/libultraship/GameSettings.h | 5 + .../Lib/Fast3D/gfx_direct3d11.cpp | 541 +++++++++--------- .../Lib/Fast3D/gfx_direct3d_common.cpp | 16 +- .../libultraship/Lib/Fast3D/gfx_dxgi.cpp | 27 +- .../libultraship/Lib/Fast3D/gfx_opengl.cpp | 292 ++++++---- .../libultraship/Lib/Fast3D/gfx_pc.cpp | 186 ++++-- libultraship/libultraship/Lib/Fast3D/gfx_pc.h | 13 +- .../Lib/Fast3D/gfx_rendering_api.h | 24 +- libultraship/libultraship/Lib/ImGui/imgui.h | 1 - .../libultraship/Lib/ImGui/imgui_widgets.cpp | 27 - libultraship/libultraship/SohImGuiImpl.cpp | 169 +++--- libultraship/libultraship/SohImGuiImpl.h | 5 +- libultraship/libultraship/Window.cpp | 4 + libultraship/libultraship/Window.h | 1 + soh/include/functions.h | 1 + soh/soh/GbiWrap.cpp | 1 + soh/soh/OTRGlobals.cpp | 75 ++- soh/soh/OTRGlobals.h | 2 +- soh/src/code/graph.c | 29 - soh/src/code/z_kankyo.c | 3 + soh/src/code/z_lights.c | 38 ++ 21 files changed, 872 insertions(+), 588 deletions(-) diff --git a/libultraship/libultraship/GameSettings.h b/libultraship/libultraship/GameSettings.h index 340e93d26..fe6087494 100644 --- a/libultraship/libultraship/GameSettings.h +++ b/libultraship/libultraship/GameSettings.h @@ -52,6 +52,11 @@ struct SoHConfigType { bool moon_jump_on_l = false; bool super_tunic = false; } cheats; + + // Graphics + struct { + bool show = false; + } graphics; }; enum SeqPlayers { diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_direct3d11.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_direct3d11.cpp index 9c2f46422..04d777e7e 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_direct3d11.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_direct3d11.cpp @@ -37,9 +37,8 @@ namespace { struct PerFrameCB { uint32_t noise_frame; - float noise_scale_x; - float noise_scale_y; - uint32_t padding; + float noise_scale; + uint32_t padding[2]; // constant buffers must be multiples of 16 bytes in size }; struct PerDrawCB { @@ -51,12 +50,12 @@ struct PerDrawCB { } textures[2]; }; -struct CoordCB { - float x, y; - float padding[2]; // structure size must be multiple of 16 +struct Coord { + int x, y; }; struct TextureData { + ComPtr texture; ComPtr resource_view; ComPtr sampler_state; uint32_t width; @@ -64,10 +63,13 @@ struct TextureData { bool linear_filtering; }; -struct FramebufferData { +struct Framebuffer { ComPtr render_target_view; ComPtr depth_stencil_view; + ComPtr depth_stencil_srv; uint32_t texture_id; + bool has_depth_buffer; + uint32_t msaa_level; }; struct ShaderProgramD3D11 { @@ -91,34 +93,30 @@ static struct { pD3DCompile D3DCompile; D3D_FEATURE_LEVEL feature_level; + uint32_t msaa_num_quality_levels[D3D11_MAX_MULTISAMPLE_SAMPLE_COUNT]; ComPtr device; ComPtr swap_chain; ComPtr context; - ComPtr backbuffer_view; - ComPtr depth_stencil_view; - ComPtr depth_stencil_srv; ComPtr rasterizer_state; ComPtr depth_stencil_state; ComPtr vertex_buffer; ComPtr per_frame_cb; ComPtr per_draw_cb; - ComPtr depth_stencil_texture; - ComPtr depth_stencil_copy_texture; ComPtr coord_buffer; + ComPtr coord_buffer_srv; ComPtr depth_value_output_buffer; ComPtr depth_value_output_buffer_copy; ComPtr depth_value_output_uav; - ComPtr depth_value_sampler; ComPtr compute_shader; - bool copied_depth_buffer; + ComPtr compute_shader_msaa; + ComPtr compute_shader_msaa_blob; + size_t coord_buffer_size; #if DEBUG_D3D ComPtr debug; #endif - DXGI_SAMPLE_DESC sample_description; - PerFrameCB per_frame_cb_data; PerDrawCB per_draw_cb_data; @@ -128,14 +126,15 @@ static struct { int current_tile; uint32_t current_texture_ids[2]; - std::vector framebuffers; + std::vector framebuffers; // Current state struct ShaderProgramD3D11 *shader_program; - uint32_t current_width, current_height; + //uint32_t current_width, current_height; uint32_t render_target_height; + int current_framebuffer; int8_t depth_test; int8_t depth_mask; @@ -156,7 +155,9 @@ static struct { static LARGE_INTEGER last_time, accumulated_time, frequency; -void create_depth_stencil_objects(uint32_t width, uint32_t height, ID3D11Texture2D **texture, ID3D11DepthStencilView **view, ID3D11ShaderResourceView **srv) { +int gfx_d3d11_create_framebuffer(void); + +void create_depth_stencil_objects(uint32_t width, uint32_t height, uint32_t msaa_count, ID3D11DepthStencilView **view, ID3D11ShaderResourceView **srv) { D3D11_TEXTURE2D_DESC texture_desc; texture_desc.Width = width; texture_desc.Height = height; @@ -164,93 +165,42 @@ void create_depth_stencil_objects(uint32_t width, uint32_t height, ID3D11Texture texture_desc.ArraySize = 1; texture_desc.Format = d3d.feature_level >= D3D_FEATURE_LEVEL_10_0 ? DXGI_FORMAT_R32_TYPELESS : DXGI_FORMAT_R24G8_TYPELESS; - texture_desc.SampleDesc.Count = 1; + texture_desc.SampleDesc.Count = msaa_count; texture_desc.SampleDesc.Quality = 0; texture_desc.Usage = D3D11_USAGE_DEFAULT; texture_desc.BindFlags = D3D11_BIND_DEPTH_STENCIL | (srv != nullptr ? D3D11_BIND_SHADER_RESOURCE : 0); texture_desc.CPUAccessFlags = 0; texture_desc.MiscFlags = 0; - ThrowIfFailed(d3d.device->CreateTexture2D(&texture_desc, nullptr, texture)); + ComPtr texture; + ThrowIfFailed(d3d.device->CreateTexture2D(&texture_desc, nullptr, texture.GetAddressOf())); D3D11_DEPTH_STENCIL_VIEW_DESC view_desc; view_desc.Format = d3d.feature_level >= D3D_FEATURE_LEVEL_10_0 ? DXGI_FORMAT_D32_FLOAT : DXGI_FORMAT_D24_UNORM_S8_UINT; - view_desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; view_desc.Flags = 0; - view_desc.Texture2D.MipSlice = 0; + if (msaa_count > 1) { + view_desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DMS; + view_desc.Texture2DMS.UnusedField_NothingToDefine = 0; + } else { + view_desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; + view_desc.Texture2D.MipSlice = 0; + } - ThrowIfFailed(d3d.device->CreateDepthStencilView(*texture, &view_desc, view)); + ThrowIfFailed(d3d.device->CreateDepthStencilView(texture.Get(), &view_desc, view)); if (srv != nullptr) { D3D11_SHADER_RESOURCE_VIEW_DESC srv_desc; srv_desc.Format = d3d.feature_level >= D3D_FEATURE_LEVEL_10_0 ? DXGI_FORMAT_R32_FLOAT : DXGI_FORMAT_R24_UNORM_X8_TYPELESS; - srv_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + srv_desc.ViewDimension = msaa_count > 1 ? D3D11_SRV_DIMENSION_TEXTURE2DMS : D3D11_SRV_DIMENSION_TEXTURE2D; srv_desc.Texture2D.MostDetailedMip = 0; srv_desc.Texture2D.MipLevels = -1; - ThrowIfFailed(d3d.device->CreateShaderResourceView(*texture, &srv_desc, srv)); + ThrowIfFailed(d3d.device->CreateShaderResourceView(texture.Get(), &srv_desc, srv)); } } -static void create_render_target_views(bool is_resize) { - DXGI_SWAP_CHAIN_DESC1 desc1; - - if (is_resize) { - // Release previous stuff (if any) - - d3d.backbuffer_view.Reset(); - d3d.depth_stencil_texture.Reset(); - d3d.depth_stencil_view.Reset(); - d3d.depth_stencil_srv.Reset(); - d3d.depth_stencil_copy_texture.Reset(); - - // Resize swap chain buffers - - ThrowIfFailed(d3d.swap_chain->GetDesc1(&desc1)); - ThrowIfFailed(d3d.swap_chain->ResizeBuffers(0, 0, 0, DXGI_FORMAT_UNKNOWN, desc1.Flags), - gfx_dxgi_get_h_wnd(), "Failed to resize IDXGISwapChain buffers."); - } - - // Get new size - - ThrowIfFailed(d3d.swap_chain->GetDesc1(&desc1)); - - // Create back buffer - - ComPtr backbuffer_texture; - ThrowIfFailed(d3d.swap_chain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID *) backbuffer_texture.GetAddressOf()), - gfx_dxgi_get_h_wnd(), "Failed to get backbuffer from IDXGISwapChain."); - - ThrowIfFailed(d3d.device->CreateRenderTargetView(backbuffer_texture.Get(), nullptr, d3d.backbuffer_view.GetAddressOf()), - gfx_dxgi_get_h_wnd(), "Failed to create render target view."); - - // Create depth buffer - create_depth_stencil_objects(desc1.Width, desc1.Height, d3d.depth_stencil_texture.GetAddressOf(), d3d.depth_stencil_view.GetAddressOf(), d3d.depth_stencil_srv.GetAddressOf()); - - // Create texture that can be used to retrieve depth value - - D3D11_TEXTURE2D_DESC depth_texture = {}; - depth_texture.Width = desc1.Width; - depth_texture.Height = desc1.Height; - depth_texture.MipLevels = 1; - depth_texture.ArraySize = 1; - depth_texture.Format = DXGI_FORMAT_D32_FLOAT; - depth_texture.SampleDesc.Count = 1; - depth_texture.SampleDesc.Quality = 0; - depth_texture.Usage = D3D11_USAGE_STAGING; - depth_texture.BindFlags = 0; - depth_texture.CPUAccessFlags = D3D11_CPU_ACCESS_READ; - depth_texture.MiscFlags = 0; - ThrowIfFailed(d3d.device->CreateTexture2D(&depth_texture, nullptr, d3d.depth_stencil_copy_texture.GetAddressOf())); - - // Save resolution - - d3d.current_width = desc1.Width; - d3d.current_height = desc1.Height; -} - static void gfx_d3d11_init(void) { // Load d3d11.dll d3d.d3d11_module = LoadLibraryW(L"d3d11.dll"); @@ -300,11 +250,6 @@ static void gfx_d3d11_init(void) { } }); - // Sample description to be used in back buffer and depth buffer - - d3d.sample_description.Count = 1; - d3d.sample_description.Quality = 0; - // Create the swap chain d3d.swap_chain = gfx_dxgi_create_swap_chain(d3d.device.Get()); @@ -315,9 +260,19 @@ static void gfx_d3d11_init(void) { gfx_dxgi_get_h_wnd(), "Failed to get ID3D11Debug device."); #endif - // Create views + // Create the default framebuffer which represents the window + Framebuffer& fb = d3d.framebuffers[gfx_d3d11_create_framebuffer()]; - create_render_target_views(false); + // Check the size of the window + DXGI_SWAP_CHAIN_DESC1 swap_chain_desc; + ThrowIfFailed(d3d.swap_chain->GetDesc1(&swap_chain_desc)); + d3d.textures[fb.texture_id].width = swap_chain_desc.Width; + d3d.textures[fb.texture_id].height = swap_chain_desc.Height; + fb.msaa_level = 1; + + for (uint32_t sample_count = 1; sample_count <= D3D11_MAX_MULTISAMPLE_SAMPLE_COUNT; sample_count++) { + ThrowIfFailed(d3d.device->CheckMultisampleQualityLevels(DXGI_FORMAT_R8G8B8A8_UNORM, sample_count, &d3d.msaa_num_quality_levels[sample_count - 1])); + } // Create main vertex buffer @@ -364,61 +319,30 @@ static void gfx_d3d11_init(void) { // Create compute shader that can be used to retrieve depth buffer values - D3D11_BUFFER_DESC coord_cb_desc; - coord_cb_desc.Usage = D3D11_USAGE_DYNAMIC; - coord_cb_desc.ByteWidth = sizeof(CoordCB); - coord_cb_desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; - coord_cb_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - coord_cb_desc.MiscFlags = 0; - coord_cb_desc.StructureByteStride = 0; - - ThrowIfFailed(d3d.device->CreateBuffer(&coord_cb_desc, nullptr, d3d.coord_buffer.GetAddressOf())); - - D3D11_SAMPLER_DESC sampler_desc = {}; - sampler_desc.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT; - sampler_desc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; - sampler_desc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; - sampler_desc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; - sampler_desc.MinLOD = 0; - sampler_desc.MaxLOD = D3D11_FLOAT32_MAX; - ThrowIfFailed(d3d.device->CreateSamplerState(&sampler_desc, d3d.depth_value_sampler.GetAddressOf())); - - D3D11_BUFFER_DESC output_buffer_desc; - output_buffer_desc.Usage = D3D11_USAGE_DEFAULT; - output_buffer_desc.ByteWidth = sizeof(float); - output_buffer_desc.BindFlags = D3D11_BIND_UNORDERED_ACCESS; - output_buffer_desc.CPUAccessFlags = 0; - output_buffer_desc.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED; - output_buffer_desc.StructureByteStride = sizeof(float); - ThrowIfFailed(d3d.device->CreateBuffer(&output_buffer_desc, nullptr, d3d.depth_value_output_buffer.GetAddressOf())); - - D3D11_UNORDERED_ACCESS_VIEW_DESC output_buffer_uav_desc; - output_buffer_uav_desc.Format = DXGI_FORMAT_UNKNOWN; - output_buffer_uav_desc.ViewDimension = D3D11_UAV_DIMENSION_BUFFER; - output_buffer_uav_desc.Buffer.FirstElement = 0; - output_buffer_uav_desc.Buffer.NumElements = 1; - output_buffer_uav_desc.Buffer.Flags = 0; - ThrowIfFailed(d3d.device->CreateUnorderedAccessView(d3d.depth_value_output_buffer.Get(), &output_buffer_uav_desc, d3d.depth_value_output_uav.GetAddressOf())); - - output_buffer_desc.Usage = D3D11_USAGE_STAGING; - output_buffer_desc.BindFlags = 0; - output_buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; - ThrowIfFailed(d3d.device->CreateBuffer(&output_buffer_desc, nullptr, d3d.depth_value_output_buffer_copy.GetAddressOf())); - const char* shader_source = R"( sampler my_sampler : register(s0); Texture2D tex : register(t0); -cbuffer coordCB : register(b0) { - float2 coord; -} - +StructuredBuffer coord : register(t1); RWStructuredBuffer output : register(u0); [numthreads(1, 1, 1)] void CSMain(uint3 DTid : SV_DispatchThreadID) { - output[0] = tex.SampleLevel(my_sampler, coord, 0); + output[DTid.x] = tex.Load(int3(coord[DTid.x], 0)); } )"; + + const char* shader_source_msaa = R"( +sampler my_sampler : register(s0); +Texture2DMS tex : register(t0); +StructuredBuffer coord : register(t1); +RWStructuredBuffer output : register(u0); + +[numthreads(1, 1, 1)] +void CSMain(uint3 DTid : SV_DispatchThreadID) { + output[DTid.x] = tex.Load(coord[DTid.x], 0); +} +)"; + #if DEBUG_D3D UINT compile_flags = D3DCOMPILE_DEBUG; #else @@ -426,7 +350,9 @@ void CSMain(uint3 DTid : SV_DispatchThreadID) { #endif ComPtr cs, error_blob; - HRESULT hr = d3d.D3DCompile(shader_source, strlen(shader_source), nullptr, nullptr, nullptr, "CSMain", "cs_4_0", compile_flags, 0, cs.GetAddressOf(), error_blob.GetAddressOf()); + HRESULT hr; + + hr = d3d.D3DCompile(shader_source, strlen(shader_source), nullptr, nullptr, nullptr, "CSMain", "cs_4_0", compile_flags, 0, cs.GetAddressOf(), error_blob.GetAddressOf()); if (FAILED(hr)) { char* err = (char*)error_blob->GetBufferPointer(); @@ -436,6 +362,14 @@ void CSMain(uint3 DTid : SV_DispatchThreadID) { ThrowIfFailed(d3d.device->CreateComputeShader(cs->GetBufferPointer(), cs->GetBufferSize(), nullptr, d3d.compute_shader.GetAddressOf())); + hr = d3d.D3DCompile(shader_source_msaa, strlen(shader_source_msaa), nullptr, nullptr, nullptr, "CSMain", "cs_4_1", compile_flags, 0, d3d.compute_shader_msaa_blob.GetAddressOf(), error_blob.ReleaseAndGetAddressOf()); + + if (FAILED(hr)) { + char* err = (char*)error_blob->GetBufferPointer(); + MessageBoxA(gfx_dxgi_get_h_wnd(), err, "Error", MB_OK | MB_ICONERROR); + throw hr; + } + // Create ImGui SohImGui::WindowImpl window_impl; @@ -445,8 +379,8 @@ void CSMain(uint3 DTid : SV_DispatchThreadID) { } -static bool gfx_d3d11_z_is_from_0_to_1(void) { - return true; +static struct GfxClipParameters gfx_d3d11_get_clip_parameters(void) { + return { true, false }; } static void gfx_d3d11_unload_shader(struct ShaderProgram *old_prg) { @@ -531,8 +465,8 @@ static struct ShaderProgram *gfx_d3d11_create_and_load_new_shader(uint64_t shade blend_desc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA; blend_desc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA; blend_desc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD; - blend_desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_SRC_ALPHA; - blend_desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA; + blend_desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ZERO; + blend_desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ONE; // We initially clear alpha to 1.0f and want to keep it at 1.0f blend_desc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; blend_desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; } else { @@ -592,6 +526,10 @@ static D3D11_TEXTURE_ADDRESS_MODE gfx_cm_to_d3d11(uint32_t val) { static void gfx_d3d11_upload_texture(const uint8_t *rgba32_buf, uint32_t width, uint32_t height) { // Create texture + TextureData *texture_data = &d3d.textures[d3d.current_texture_ids[d3d.current_tile]]; + texture_data->width = width; + texture_data->height = height; + D3D11_TEXTURE2D_DESC texture_desc; ZeroMemory(&texture_desc, sizeof(D3D11_TEXTURE2D_DESC)); @@ -612,21 +550,11 @@ static void gfx_d3d11_upload_texture(const uint8_t *rgba32_buf, uint32_t width, resource_data.SysMemPitch = width * 4; resource_data.SysMemSlicePitch = resource_data.SysMemPitch * height; - ComPtr texture; - ThrowIfFailed(d3d.device->CreateTexture2D(&texture_desc, &resource_data, texture.GetAddressOf())); - - TextureData *texture_data = &d3d.textures[d3d.current_texture_ids[d3d.current_tile]]; - texture_data->width = width; - texture_data->height = height; + ThrowIfFailed(d3d.device->CreateTexture2D(&texture_desc, &resource_data, texture_data->texture.ReleaseAndGetAddressOf())); // Create shader resource view from texture - if (texture_data->resource_view.Get() != nullptr) { - // Free the previous texture in this slot - texture_data->resource_view.Reset(); - } - - ThrowIfFailed(d3d.device->CreateShaderResourceView(texture.Get(), nullptr, texture_data->resource_view.GetAddressOf())); + ThrowIfFailed(d3d.device->CreateShaderResourceView(texture_data->texture.Get(), nullptr, texture_data->resource_view.ReleaseAndGetAddressOf())); } static void gfx_d3d11_set_sampler_parameters(int tile, bool linear_filter, uint32_t cms, uint32_t cmt) { @@ -803,20 +731,10 @@ static void gfx_d3d11_draw_triangles(float buf_vbo[], size_t buf_vbo_len, size_t } static void gfx_d3d11_on_resize(void) { - create_render_target_views(true); + //create_render_target_views(true); } static void gfx_d3d11_start_frame(void) { - // Set render targets - - d3d.context->OMSetRenderTargets(1, d3d.backbuffer_view.GetAddressOf(), d3d.depth_stencil_view.Get()); - - // Clear render targets - - const float clearColor[] = { 0.0f, 0.0f, 0.0f, 1.0f }; - d3d.context->ClearRenderTargetView(d3d.backbuffer_view.Get(), clearColor); - d3d.context->ClearDepthStencilView(d3d.depth_stencil_view.Get(), D3D11_CLEAR_DEPTH, 1.0f, 0); - // Set per-frame constant buffer d3d.per_frame_cb_data.noise_frame++; @@ -824,22 +742,9 @@ static void gfx_d3d11_start_frame(void) { // No high values, as noise starts to look ugly d3d.per_frame_cb_data.noise_frame = 0; } - float aspect_ratio = (float) d3d.current_width / (float) d3d.current_height; - d3d.render_target_height = d3d.current_height; - d3d.per_frame_cb_data.noise_scale_x = 120 * aspect_ratio; // 120 = N64 height resolution (240) / 2 - d3d.per_frame_cb_data.noise_scale_y = 120; - - D3D11_MAPPED_SUBRESOURCE ms; - ZeroMemory(&ms, sizeof(D3D11_MAPPED_SUBRESOURCE)); - d3d.context->Map(d3d.per_frame_cb.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &ms); - memcpy(ms.pData, &d3d.per_frame_cb_data, sizeof(PerFrameCB)); - d3d.context->Unmap(d3d.per_frame_cb.Get(), 0); - - d3d.copied_depth_buffer = false; } static void gfx_d3d11_end_frame(void) { - SohImGui::Draw(); d3d.context->Flush(); } @@ -847,43 +752,13 @@ static void gfx_d3d11_finish_render(void) { d3d.context->Flush(); } -void gfx_d3d11_resize_framebuffer(int fb, uint32_t width, uint32_t height) { - FramebufferData& fd = d3d.framebuffers[fb]; - TextureData& td = d3d.textures[fd.texture_id]; - - ComPtr texture, depth_stencil_texture; - - D3D11_TEXTURE2D_DESC texture_desc; - texture_desc.Width = width; - texture_desc.Height = height; - texture_desc.Usage = D3D11_USAGE_DEFAULT; - texture_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET; - texture_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; - texture_desc.CPUAccessFlags = 0; - texture_desc.MiscFlags = 0; - texture_desc.ArraySize = 1; - texture_desc.MipLevels = 1; - texture_desc.SampleDesc.Count = 1; - texture_desc.SampleDesc.Quality = 0; - - ThrowIfFailed(d3d.device->CreateTexture2D(&texture_desc, nullptr, texture.GetAddressOf())); - create_depth_stencil_objects(width, height, depth_stencil_texture.GetAddressOf(), fd.depth_stencil_view.ReleaseAndGetAddressOf(), nullptr); - ThrowIfFailed(d3d.device->CreateRenderTargetView(texture.Get(), nullptr, fd.render_target_view.ReleaseAndGetAddressOf())); - ThrowIfFailed(d3d.device->CreateShaderResourceView(texture.Get(), nullptr, td.resource_view.ReleaseAndGetAddressOf())); - - td.width = width; - td.height = height; -} - -int gfx_d3d11_create_framebuffer(uint32_t width, uint32_t height) { +int gfx_d3d11_create_framebuffer(void) { uint32_t texture_id = gfx_d3d11_new_texture(); TextureData& t = d3d.textures[texture_id]; - t.width = width; - t.height = height; size_t index = d3d.framebuffers.size(); d3d.framebuffers.resize(d3d.framebuffers.size() + 1); - FramebufferData& data = d3d.framebuffers.back(); + Framebuffer& data = d3d.framebuffers.back(); data.texture_id = texture_id; uint32_t tile = 0; @@ -892,24 +767,109 @@ int gfx_d3d11_create_framebuffer(uint32_t width, uint32_t height) { gfx_d3d11_set_sampler_parameters(0, true, G_TX_WRAP, G_TX_WRAP); d3d.current_texture_ids[tile] = saved; - gfx_d3d11_resize_framebuffer(index, width, height); - return (int)index; } -void gfx_d3d11_set_framebuffer(int fb) { - d3d.render_target_height = d3d.textures[d3d.framebuffers[fb].texture_id].height; +static void gfx_d3d11_update_framebuffer_parameters(int fb_id, uint32_t width, uint32_t height, uint32_t msaa_level, bool opengl_invert_y, bool render_target, bool has_depth_buffer, bool can_extract_depth) { + Framebuffer& fb = d3d.framebuffers[fb_id]; + TextureData& tex = d3d.textures[fb.texture_id]; - d3d.context->OMSetRenderTargets(1, d3d.framebuffers[fb].render_target_view.GetAddressOf(), d3d.framebuffers[fb].depth_stencil_view.Get()); + width = max(width, 1U); + height = max(height, 1U); + while (msaa_level > 1 && d3d.msaa_num_quality_levels[msaa_level - 1] == 0) { + --msaa_level; + } - const float clearColor[] = { 0.0f, 0.0f, 0.0f, 1.0f }; - d3d.context->ClearRenderTargetView(d3d.framebuffers[fb].render_target_view.Get(), clearColor); - d3d.context->ClearDepthStencilView(d3d.framebuffers[fb].depth_stencil_view.Get(), D3D11_CLEAR_DEPTH, 1.0f, 0); + bool diff = tex.width != width || tex.height != height || fb.msaa_level != msaa_level; + + if (diff || (fb.render_target_view.Get() != nullptr) != render_target) { + if (fb_id != 0) { + D3D11_TEXTURE2D_DESC texture_desc; + texture_desc.Width = width; + texture_desc.Height = height; + texture_desc.Usage = D3D11_USAGE_DEFAULT; + texture_desc.BindFlags = (msaa_level <= 1 ? D3D11_BIND_SHADER_RESOURCE : 0) | (render_target ? D3D11_BIND_RENDER_TARGET : 0); + texture_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + texture_desc.CPUAccessFlags = 0; + texture_desc.MiscFlags = 0; + texture_desc.ArraySize = 1; + texture_desc.MipLevels = 1; + texture_desc.SampleDesc.Count = msaa_level; + texture_desc.SampleDesc.Quality = 0; + + ThrowIfFailed(d3d.device->CreateTexture2D(&texture_desc, nullptr, tex.texture.ReleaseAndGetAddressOf())); + + if (msaa_level <= 1) { + ThrowIfFailed(d3d.device->CreateShaderResourceView(tex.texture.Get(), nullptr, tex.resource_view.ReleaseAndGetAddressOf())); + } + } else if (diff) { + DXGI_SWAP_CHAIN_DESC1 desc1; + ThrowIfFailed(d3d.swap_chain->GetDesc1(&desc1)); + if (desc1.Width != width || desc1.Height != height) { + fb.render_target_view.Reset(); + tex.texture.Reset(); + ThrowIfFailed(d3d.swap_chain->ResizeBuffers(0, 0, 0, DXGI_FORMAT_UNKNOWN, desc1.Flags)); + } + ThrowIfFailed(d3d.swap_chain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID *)tex.texture.ReleaseAndGetAddressOf())); + } + if (render_target) { + ThrowIfFailed(d3d.device->CreateRenderTargetView(tex.texture.Get(), nullptr, fb.render_target_view.ReleaseAndGetAddressOf())); + } + + tex.width = width; + tex.height = height; + } + + if (has_depth_buffer && (diff || !fb.has_depth_buffer || (fb.depth_stencil_srv.Get() != nullptr) != can_extract_depth)) { + fb.depth_stencil_srv.Reset(); + create_depth_stencil_objects(width, height, msaa_level, fb.depth_stencil_view.ReleaseAndGetAddressOf(), can_extract_depth ? fb.depth_stencil_srv.GetAddressOf() : nullptr); + } + if (!has_depth_buffer) { + fb.depth_stencil_view.Reset(); + fb.depth_stencil_srv.Reset(); + } + + fb.has_depth_buffer = has_depth_buffer; + fb.msaa_level = msaa_level; } -void gfx_d3d11_reset_framebuffer(void) { - d3d.render_target_height = d3d.current_height; - d3d.context->OMSetRenderTargets(1, d3d.backbuffer_view.GetAddressOf(), d3d.depth_stencil_view.Get()); +void gfx_d3d11_start_draw_to_framebuffer(int fb_id, float noise_scale) { + Framebuffer& fb = d3d.framebuffers[fb_id]; + d3d.render_target_height = d3d.textures[fb.texture_id].height; + + d3d.context->OMSetRenderTargets(1, fb.render_target_view.GetAddressOf(), fb.has_depth_buffer ? fb.depth_stencil_view.Get() : nullptr); + + d3d.current_framebuffer = fb_id; + + if (noise_scale != 0.0f) { + d3d.per_frame_cb_data.noise_scale = 1.0f / noise_scale; + } + + D3D11_MAPPED_SUBRESOURCE ms; + ZeroMemory(&ms, sizeof(D3D11_MAPPED_SUBRESOURCE)); + d3d.context->Map(d3d.per_frame_cb.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &ms); + memcpy(ms.pData, &d3d.per_frame_cb_data, sizeof(PerFrameCB)); + d3d.context->Unmap(d3d.per_frame_cb.Get(), 0); +} + +void gfx_d3d11_clear_framebuffer(void) { + Framebuffer& fb = d3d.framebuffers[d3d.current_framebuffer]; + const float clearColor[] = { 0.0f, 0.0f, 0.0f, 1.0f }; + d3d.context->ClearRenderTargetView(fb.render_target_view.Get(), clearColor); + if (fb.has_depth_buffer) { + d3d.context->ClearDepthStencilView(fb.depth_stencil_view.Get(), D3D11_CLEAR_DEPTH, 1.0f, 0); + } +} + +void gfx_d3d11_resolve_msaa_color_buffer(int fb_id_target, int fb_id_source) { + Framebuffer& fb_dst = d3d.framebuffers[fb_id_target]; + Framebuffer& fb_src = d3d.framebuffers[fb_id_source]; + + d3d.context->ResolveSubresource(d3d.textures[fb_dst.texture_id].texture.Get(), 0, d3d.textures[fb_src.texture_id].texture.Get(), 0, DXGI_FORMAT_R8G8B8A8_UNORM); +} + +void *gfx_d3d11_get_framebuffer_texture_id(int fb_id) { + return (void *)d3d.textures[d3d.framebuffers[fb_id].texture_id].resource_view.Get(); } void gfx_d3d11_select_texture_fb(int fbID) { @@ -917,62 +877,107 @@ void gfx_d3d11_select_texture_fb(int fbID) { gfx_d3d11_select_texture(tile, d3d.framebuffers[fbID].texture_id); } -uint16_t gfx_d3d11_get_pixel_depth(float x, float y) { +std::map, uint16_t> gfx_d3d11_get_pixel_depth(int fb_id, const std::set>& coordinates) { + Framebuffer& fb = d3d.framebuffers[fb_id]; + TextureData& td = d3d.textures[fb.texture_id]; + + if (coordinates.size() > d3d.coord_buffer_size) { + d3d.coord_buffer.Reset(); + d3d.coord_buffer_srv.Reset(); + d3d.depth_value_output_buffer.Reset(); + d3d.depth_value_output_uav.Reset(); + d3d.depth_value_output_buffer_copy.Reset(); + + D3D11_BUFFER_DESC coord_buf_desc; + coord_buf_desc.Usage = D3D11_USAGE_DYNAMIC; + coord_buf_desc.ByteWidth = sizeof(Coord) * coordinates.size(); + coord_buf_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + coord_buf_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + coord_buf_desc.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED; + coord_buf_desc.StructureByteStride = sizeof(Coord); + + ThrowIfFailed(d3d.device->CreateBuffer(&coord_buf_desc, nullptr, d3d.coord_buffer.GetAddressOf())); + + D3D11_SHADER_RESOURCE_VIEW_DESC coord_buf_srv_desc; + coord_buf_srv_desc.Format = DXGI_FORMAT_UNKNOWN; + coord_buf_srv_desc.ViewDimension = D3D11_SRV_DIMENSION_BUFFER; + coord_buf_srv_desc.Buffer.FirstElement = 0; + coord_buf_srv_desc.Buffer.NumElements = coordinates.size(); + + ThrowIfFailed(d3d.device->CreateShaderResourceView(d3d.coord_buffer.Get(), &coord_buf_srv_desc, d3d.coord_buffer_srv.GetAddressOf())); + + D3D11_BUFFER_DESC output_buffer_desc; + output_buffer_desc.Usage = D3D11_USAGE_DEFAULT; + output_buffer_desc.ByteWidth = sizeof(float) * coordinates.size(); + output_buffer_desc.BindFlags = D3D11_BIND_UNORDERED_ACCESS; + output_buffer_desc.CPUAccessFlags = 0; + output_buffer_desc.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED; + output_buffer_desc.StructureByteStride = sizeof(float); + ThrowIfFailed(d3d.device->CreateBuffer(&output_buffer_desc, nullptr, d3d.depth_value_output_buffer.GetAddressOf())); + + D3D11_UNORDERED_ACCESS_VIEW_DESC output_buffer_uav_desc; + output_buffer_uav_desc.Format = DXGI_FORMAT_UNKNOWN; + output_buffer_uav_desc.ViewDimension = D3D11_UAV_DIMENSION_BUFFER; + output_buffer_uav_desc.Buffer.FirstElement = 0; + output_buffer_uav_desc.Buffer.NumElements = coordinates.size(); + output_buffer_uav_desc.Buffer.Flags = 0; + ThrowIfFailed(d3d.device->CreateUnorderedAccessView(d3d.depth_value_output_buffer.Get(), &output_buffer_uav_desc, d3d.depth_value_output_uav.GetAddressOf())); + + output_buffer_desc.Usage = D3D11_USAGE_STAGING; + output_buffer_desc.BindFlags = 0; + output_buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; + ThrowIfFailed(d3d.device->CreateBuffer(&output_buffer_desc, nullptr, d3d.depth_value_output_buffer_copy.GetAddressOf())); + + d3d.coord_buffer_size = coordinates.size(); + } + D3D11_MAPPED_SUBRESOURCE ms; + if (fb.msaa_level > 1 && d3d.compute_shader_msaa.Get() == nullptr) { + ThrowIfFailed(d3d.device->CreateComputeShader(d3d.compute_shader_msaa_blob->GetBufferPointer(), d3d.compute_shader_msaa_blob->GetBufferSize(), nullptr, d3d.compute_shader_msaa.GetAddressOf())); + } + // ImGui overwrites these values, so we cannot set them once at init - d3d.context->CSSetShader(d3d.compute_shader.Get(), nullptr, 0); - d3d.context->CSSetConstantBuffers(0, 1, d3d.coord_buffer.GetAddressOf()); - d3d.context->CSSetSamplers(0, 1, d3d.depth_value_sampler.GetAddressOf()); + d3d.context->CSSetShader(fb.msaa_level > 1 ? d3d.compute_shader_msaa.Get() : d3d.compute_shader.Get(), nullptr, 0); d3d.context->CSSetUnorderedAccessViews(0, 1, d3d.depth_value_output_uav.GetAddressOf(), nullptr); ThrowIfFailed(d3d.context->Map(d3d.coord_buffer.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &ms)); - CoordCB* coord_cb = (CoordCB*)ms.pData; - coord_cb->x = x / d3d.current_width; - // We invert y because the game assumes OpenGL coordinates (bottom-left corner is origin), while DX's origin is top-left corner - coord_cb->y = 1 - y / d3d.current_height; + Coord *coord_cb = (Coord *)ms.pData; + { + size_t i = 0; + for (const auto& coord : coordinates) { + coord_cb[i].x = coord.first; + // We invert y because the gfx_pc assumes OpenGL coordinates (bottom-left corner is origin), while DX's origin is top-left corner + coord_cb[i].y = td.height - 1 - coord.second; + ++i; + } + } d3d.context->Unmap(d3d.coord_buffer.Get(), 0); - // The depth stencil texture can only have one mapping at a time, so temporarily unbind from the OM - d3d.context->OMSetRenderTargets(1, d3d.backbuffer_view.GetAddressOf(), nullptr); - d3d.context->CSSetShaderResources(0, 1, d3d.depth_stencil_srv.GetAddressOf()); + // The depth stencil texture can only have one mapping at a time, so unbind from the OM + ID3D11RenderTargetView* null_arr1[1] = { nullptr }; + d3d.context->OMSetRenderTargets(1, null_arr1, nullptr); - d3d.context->Dispatch(1, 1, 1); + ID3D11ShaderResourceView *srvs[] = { fb.depth_stencil_srv.Get(), d3d.coord_buffer_srv.Get() }; + d3d.context->CSSetShaderResources(0, 2, srvs); + + d3d.context->Dispatch(coordinates.size(), 1, 1); d3d.context->CopyResource(d3d.depth_value_output_buffer_copy.Get(), d3d.depth_value_output_buffer.Get()); ThrowIfFailed(d3d.context->Map(d3d.depth_value_output_buffer_copy.Get(), 0, D3D11_MAP_READ, 0, &ms)); - float res = *(float *)ms.pData; - d3d.context->Unmap(d3d.depth_value_output_buffer_copy.Get(), 0); - - ID3D11ShaderResourceView *null_arr[1] = { nullptr }; - d3d.context->CSSetShaderResources(0, 1, null_arr); - d3d.context->OMSetRenderTargets(1, d3d.backbuffer_view.GetAddressOf(), d3d.depth_stencil_view.Get()); - - return res * 65532.0f; -} - -uint16_t gfx_d3d11_get_pixel_depth_old(float x, float y) { - // This approach, compared to using a compute shader, might have better performance on nvidia cards - - if (!d3d.copied_depth_buffer) { - d3d.context->CopyResource(d3d.depth_stencil_copy_texture.Get(), d3d.depth_stencil_texture.Get()); - d3d.copied_depth_buffer = true; - } - - D3D11_MAPPED_SUBRESOURCE mapping_desc; - d3d.context->Map(d3d.depth_stencil_copy_texture.Get(), 0, D3D11_MAP_READ, 0, &mapping_desc); - float res = 0; - if (mapping_desc.pData != nullptr) { - float *addr = (float *)mapping_desc.pData; - uint32_t num_pixels = mapping_desc.DepthPitch / sizeof(float); - uint32_t width = mapping_desc.RowPitch / sizeof(float); - uint32_t height = width == 0 ? 0 : num_pixels / width; - if (x >= 0 && x < width && y >= 0 && y < height) { - res = addr[width * (height - 1 - (int)y) + (int)x]; + std::map, uint16_t> res; + { + size_t i = 0; + for (const auto& coord : coordinates) { + res.emplace(coord, ((float *)ms.pData)[i++] * 65532.0f); } } - d3d.context->Unmap(d3d.depth_stencil_copy_texture.Get(), 0); - return res * 65532.0f; + d3d.context->Unmap(d3d.depth_value_output_buffer_copy.Get(), 0); + + ID3D11ShaderResourceView *null_arr[2] = { nullptr, nullptr }; + d3d.context->CSSetShaderResources(0, 2, null_arr); + + return res; } } // namespace @@ -982,7 +987,7 @@ ImTextureID SohImGui::GetTextureByID(int id) { } struct GfxRenderingAPI gfx_direct3d11_api = { - gfx_d3d11_z_is_from_0_to_1, + gfx_d3d11_get_clip_parameters, gfx_d3d11_unload_shader, gfx_d3d11_load_shader, gfx_d3d11_create_and_load_new_shader, @@ -993,7 +998,6 @@ struct GfxRenderingAPI gfx_direct3d11_api = { gfx_d3d11_upload_texture, gfx_d3d11_set_sampler_parameters, gfx_d3d11_set_depth_test_and_mask, - gfx_d3d11_get_pixel_depth, gfx_d3d11_set_zmode_decal, gfx_d3d11_set_viewport, gfx_d3d11_set_scissor, @@ -1005,9 +1009,12 @@ struct GfxRenderingAPI gfx_direct3d11_api = { gfx_d3d11_end_frame, gfx_d3d11_finish_render, gfx_d3d11_create_framebuffer, - gfx_d3d11_resize_framebuffer, - gfx_d3d11_set_framebuffer, - gfx_d3d11_reset_framebuffer, + gfx_d3d11_update_framebuffer_parameters, + gfx_d3d11_start_draw_to_framebuffer, + gfx_d3d11_clear_framebuffer, + gfx_d3d11_resolve_msaa_color_buffer, + gfx_d3d11_get_pixel_depth, + gfx_d3d11_get_framebuffer_texture_id, gfx_d3d11_select_texture_fb, gfx_d3d11_delete_texture }; diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_direct3d_common.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_direct3d_common.cpp index ca60aef8b..f778812d1 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_direct3d_common.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_direct3d_common.cpp @@ -134,9 +134,6 @@ void gfx_direct3d_common_build_shader(char buf[4096], size_t& len, size_t& num_f } } } - if (cc_features.opt_alpha && cc_features.opt_noise) { - append_line(buf, &len, " float4 screenPos : TEXCOORD2;"); - } if (cc_features.opt_fog) { append_line(buf, &len, " float4 fog : FOG;"); num_floats += 4; @@ -163,7 +160,7 @@ void gfx_direct3d_common_build_shader(char buf[4096], size_t& len, size_t& num_f if (cc_features.opt_alpha && cc_features.opt_noise) { append_line(buf, &len, "cbuffer PerFrameCB : register(b0) {"); append_line(buf, &len, " uint noise_frame;"); - append_line(buf, &len, " float2 noise_scale;"); + append_line(buf, &len, " float noise_scale;"); append_line(buf, &len, "}"); append_line(buf, &len, "float random(in float3 value) {"); @@ -217,9 +214,6 @@ void gfx_direct3d_common_build_shader(char buf[4096], size_t& len, size_t& num_f append_line(buf, &len, ") {"); append_line(buf, &len, " PSInput result;"); append_line(buf, &len, " result.position = position;"); - if (cc_features.opt_alpha && cc_features.opt_noise) { - append_line(buf, &len, " result.screenPos = position;"); - } for (int i = 0; i < 2; i++) { if (cc_features.used_textures[i]) { len += sprintf(buf + len, " result.uv%d = uv%d;\r\n", i, i); @@ -244,7 +238,11 @@ void gfx_direct3d_common_build_shader(char buf[4096], size_t& len, size_t& num_f if (include_root_signature) { append_line(buf, &len, "[RootSignature(RS)]"); } - append_line(buf, &len, "float4 PSMain(PSInput input) : SV_TARGET {"); + if (cc_features.opt_alpha && cc_features.opt_noise) { + append_line(buf, &len, "float4 PSMain(PSInput input, float4 screenSpace : SV_Position) : SV_TARGET {"); + } else { + append_line(buf, &len, "float4 PSMain(PSInput input) : SV_TARGET {"); + } for (int i = 0; i < 2; i++) { if (cc_features.used_textures[i]) { len += sprintf(buf + len, " float2 tc%d = input.uv%d;\r\n", i, i); @@ -301,7 +299,7 @@ void gfx_direct3d_common_build_shader(char buf[4096], size_t& len, size_t& num_f } if (cc_features.opt_alpha && cc_features.opt_noise) { - append_line(buf, &len, " float2 coords = (input.screenPos.xy / input.screenPos.w) * noise_scale;"); + append_line(buf, &len, " float2 coords = screenSpace.xy * noise_scale;"); append_line(buf, &len, " texel.a *= round(saturate(random(float3(floor(coords), noise_frame)) + texel.a - 0.5));"); } diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_dxgi.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_dxgi.cpp index 6cfc3cf32..49abe0b28 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_dxgi.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_dxgi.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -61,6 +62,7 @@ static struct { RECT last_window_rect; bool is_full_screen, last_maximized_state; + bool dxgi1_4; ComPtr factory; ComPtr swap_chain; HANDLE waitable_object; @@ -197,17 +199,6 @@ static void toggle_borderless_window_full_screen(bool enable, bool call_callback } } -static void gfx_dxgi_on_resize(void) { - if (dxgi.swap_chain.Get() != nullptr) { - gfx_get_current_rendering_api()->on_resize(); - - DXGI_SWAP_CHAIN_DESC1 desc1; - ThrowIfFailed(dxgi.swap_chain->GetDesc1(&desc1)); - dxgi.current_width = desc1.Width; - dxgi.current_height = desc1.Height; - } -} - static void onkeydown(WPARAM w_param, LPARAM l_param) { int key = ((l_param >> 16) & 0x1ff); if (dxgi.on_key_down != nullptr) { @@ -227,7 +218,8 @@ static LRESULT CALLBACK gfx_dxgi_wnd_proc(HWND h_wnd, UINT message, WPARAM w_par SohImGui::Update(event_impl); switch (message) { case WM_SIZE: - gfx_dxgi_on_resize(); + dxgi.current_width = (uint32_t)(l_param & 0xffff); + dxgi.current_height = (uint32_t)(l_param >> 16); break; case WM_DESTROY: exit(0); @@ -573,6 +565,13 @@ void gfx_dxgi_create_factory_and_device(bool debug, int d3d_version, bool (*crea ThrowIfFailed(dxgi.CreateDXGIFactory1(__uuidof(IDXGIFactory2), &dxgi.factory)); } + { + ComPtr factory4; + if (dxgi.factory->QueryInterface(__uuidof(IDXGIFactory4), &factory4) == S_OK) { + dxgi.dxgi1_4 = true; + } + } + ComPtr adapter; for (UINT i = 0; dxgi.factory->EnumAdapters1(i, &adapter) != DXGI_ERROR_NOT_FOUND; i++) { DXGI_ADAPTER_DESC1 desc; @@ -604,7 +603,9 @@ ComPtr gfx_dxgi_create_swap_chain(IUnknown *device) { swap_chain_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; swap_chain_desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; swap_chain_desc.Scaling = win8 ? DXGI_SCALING_NONE : DXGI_SCALING_STRETCH; - swap_chain_desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; // Apparently this was backported to Win 7 Platform Update + swap_chain_desc.SwapEffect = dxgi.dxgi1_4 ? + DXGI_SWAP_EFFECT_FLIP_DISCARD : // Introduced in DXGI 1.4 and Windows 10 + DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; // Apparently flip sequential was also backported to Win 7 Platform Update swap_chain_desc.Flags = dxgi_13 ? DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT : 0; swap_chain_desc.SampleDesc.Count = 1; diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp index 16e750d14..5373f8799 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp @@ -52,19 +52,33 @@ struct ShaderProgram { uint8_t num_attribs; bool used_noise; GLint frame_count_location; - GLint window_height_location; + GLint noise_scale_location; +}; + +struct Framebuffer { + uint32_t width, height; + bool has_depth_buffer; + uint32_t msaa_level; + bool invert_y; + + GLuint fbo, clrbuf, clrbuf_msaa, rbo; }; static map, struct ShaderProgram> shader_program_pool; static GLuint opengl_vbo; - -static uint32_t frame_count; -static uint32_t current_height; -static map> fb2tex; static bool current_depth_mask; -static bool gfx_opengl_z_is_from_0_to_1(void) { - return false; +static uint32_t frame_count; + +static vector framebuffers; +static size_t current_framebuffer; +static float current_noise_scale; + +GLuint pixel_depth_rb, pixel_depth_fb; +size_t pixel_depth_rb_size; + +static struct GfxClipParameters gfx_opengl_get_clip_parameters(void) { + return { false, framebuffers[current_framebuffer].invert_y }; } static void gfx_opengl_vertex_array_set_attribs(struct ShaderProgram *prg) { @@ -81,7 +95,7 @@ static void gfx_opengl_vertex_array_set_attribs(struct ShaderProgram *prg) { static void gfx_opengl_set_uniforms(struct ShaderProgram *prg) { if (prg->used_noise) { glUniform1i(prg->frame_count_location, frame_count); - glUniform1i(prg->window_height_location, current_height); + glUniform1f(prg->noise_scale_location, current_noise_scale); } } @@ -277,7 +291,7 @@ static struct ShaderProgram* gfx_opengl_create_and_load_new_shader(uint64_t shad if (cc_features.opt_alpha && cc_features.opt_noise) { append_line(fs_buf, &fs_len, "uniform int frame_count;"); - append_line(fs_buf, &fs_len, "uniform int window_height;"); + append_line(fs_buf, &fs_len, "uniform float noise_scale;"); append_line(fs_buf, &fs_len, "float random(in vec3 value) {"); append_line(fs_buf, &fs_len, " float random = dot(sin(value), vec3(12.9898, 78.233, 37.719));"); @@ -338,7 +352,7 @@ static struct ShaderProgram* gfx_opengl_create_and_load_new_shader(uint64_t shad } if (cc_features.opt_alpha && cc_features.opt_noise) { - append_line(fs_buf, &fs_len, "texel.a *= floor(clamp(random(vec3(floor(gl_FragCoord.xy * (240.0 / float(window_height))), float(frame_count))) + texel.a, 0.0, 1.0));"); + append_line(fs_buf, &fs_len, "texel.a *= floor(clamp(random(vec3(floor(gl_FragCoord.xy * noise_scale), float(frame_count))) + texel.a, 0.0, 1.0));"); } if (cc_features.opt_alpha) { @@ -460,7 +474,7 @@ static struct ShaderProgram* gfx_opengl_create_and_load_new_shader(uint64_t shad if (cc_features.opt_alpha && cc_features.opt_noise) { prg->frame_count_location = glGetUniformLocation(shader_program, "frame_count"); - prg->window_height_location = glGetUniformLocation(shader_program, "window_height"); + prg->noise_scale_location = glGetUniformLocation(shader_program, "noise_scale"); prg->used_noise = true; } else { prg->used_noise = false; @@ -496,7 +510,7 @@ static void gfx_opengl_select_texture(int tile, GLuint texture_id) { } static void gfx_opengl_upload_texture(const uint8_t *rgba32_buf, uint32_t width, uint32_t height) { - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgba32_buf); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgba32_buf); } static uint32_t gfx_cm_to_opengl(uint32_t val) { @@ -543,7 +557,6 @@ static void gfx_opengl_set_zmode_decal(bool zmode_decal) { static void gfx_opengl_set_viewport(int x, int y, int width, int height) { glViewport(x, y, width, height); - current_height = height; } static void gfx_opengl_set_scissor(int x, int y, int width, int height) { @@ -564,10 +577,6 @@ static void gfx_opengl_draw_triangles(float buf_vbo[], size_t buf_vbo_len, size_ glDrawArrays(GL_TRIANGLES, 0, 3 * buf_vbo_num_tris); } -static unsigned int framebuffer; -static unsigned int textureColorbuffer; -static unsigned int rbo; - static void gfx_opengl_init(void) { //#if FOR_WINDOWS glewInit(); @@ -576,143 +585,214 @@ static void gfx_opengl_init(void) { glGenBuffers(1, &opengl_vbo); glBindBuffer(GL_ARRAY_BUFFER, opengl_vbo); - glGenFramebuffers(1, &framebuffer); - glGenTextures(1, &textureColorbuffer); - glGenRenderbuffers(1, &rbo); - - SohUtils::saveEnvironmentVar("framebuffer", std::to_string(textureColorbuffer)); glDepthFunc(GL_LEQUAL); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + framebuffers.resize(1); // for the default screen buffer + + glGenRenderbuffers(1, &pixel_depth_rb); + glBindRenderbuffer(GL_RENDERBUFFER, pixel_depth_rb); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 1, 1); + glBindRenderbuffer(GL_RENDERBUFFER, 0); + + glGenFramebuffers(1, &pixel_depth_fb); + glBindFramebuffer(GL_FRAMEBUFFER, pixel_depth_fb); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, pixel_depth_rb); + glBindFramebuffer(GL_FRAMEBUFFER, 0); + + pixel_depth_rb_size = 1; } static void gfx_opengl_on_resize(void) { } static void gfx_opengl_start_frame(void) { - GLsizei framebuffer_width = gfx_current_dimensions.width; - GLsizei framebuffer_height = gfx_current_dimensions.height; - glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); - std::shared_ptr wnd = Ship::GlobalCtx2::GetInstance()->GetWindow(); - glBindTexture(GL_TEXTURE_2D, textureColorbuffer); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, framebuffer_width, framebuffer_height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureColorbuffer, 0); - glBindRenderbuffer(GL_RENDERBUFFER, rbo); - glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, framebuffer_width, framebuffer_height); // use a single renderbuffer object for both a depth AND stencil buffer. - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo); // now actually attach it - glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); - frame_count++; - - glDisable(GL_SCISSOR_TEST); - glDepthMask(GL_TRUE); - glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glEnable(GL_SCISSOR_TEST); - glEnable(GL_DEPTH_CLAMP); - current_depth_mask = true; } static void gfx_opengl_end_frame(void) { - - glBindFramebuffer(GL_FRAMEBUFFER, 0); - glClearColor(1.0f, 1.0f, 1.0f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT); - - GLint last_program; - glGetIntegerv(GL_CURRENT_PROGRAM, &last_program); - glUseProgram(0); - SohImGui::Draw(); - glUseProgram(last_program); + glFlush(); } static void gfx_opengl_finish_render(void) { } -static int gfx_opengl_create_framebuffer(uint32_t width, uint32_t height) { - GLuint textureColorbuffer; - - glGenTextures(1, &textureColorbuffer); - glBindTexture(GL_TEXTURE_2D, textureColorbuffer); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); +static int gfx_opengl_create_framebuffer() { + GLuint clrbuf; + glGenTextures(1, &clrbuf); + glBindTexture(GL_TEXTURE_2D, clrbuf); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glBindTexture(GL_TEXTURE_2D, 0); + GLuint clrbuf_msaa; + glGenRenderbuffers(1, &clrbuf_msaa); + GLuint rbo; glGenRenderbuffers(1, &rbo); glBindRenderbuffer(GL_RENDERBUFFER, rbo); - glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 1, 1); glBindRenderbuffer(GL_RENDERBUFFER, 0); GLuint fbo; glGenFramebuffers(1, &fbo); - glBindFramebuffer(GL_FRAMEBUFFER, fbo); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureColorbuffer, 0); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo); - glBindFramebuffer(GL_FRAMEBUFFER, fbo); + size_t i = framebuffers.size(); + framebuffers.resize(i + 1); - fb2tex[fbo] = make_pair(textureColorbuffer, rbo); - - //glBindFramebuffer(GL_FRAMEBUFFER, 0); + framebuffers[i].fbo = fbo; + framebuffers[i].clrbuf = clrbuf; + framebuffers[i].clrbuf_msaa = clrbuf_msaa; + framebuffers[i].rbo = rbo; return fbo; } -static void gfx_opengl_resize_framebuffer(int fb, uint32_t width, uint32_t height) { - glBindTexture(GL_TEXTURE_2D, fb2tex[fb].first); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); - glBindTexture(GL_TEXTURE_2D, 0); +static void gfx_opengl_update_framebuffer_parameters(int fb_id, uint32_t width, uint32_t height, uint32_t msaa_level, bool opengl_invert_y, bool render_target, bool has_depth_buffer, bool can_extract_depth) { + Framebuffer& fb = framebuffers[fb_id]; - glBindRenderbuffer(GL_RENDERBUFFER, fb2tex[fb].second); - glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height); - glBindRenderbuffer(GL_RENDERBUFFER, 0); + width = max(width, 1U); + height = max(height, 1U); + + glBindFramebuffer(GL_FRAMEBUFFER, fb.fbo); + + if (fb_id != 0) { + if (fb.width != width || fb.height != height || fb.msaa_level != msaa_level) { + if (msaa_level <= 1) { + glBindTexture(GL_TEXTURE_2D, fb.clrbuf); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); + glBindTexture(GL_TEXTURE_2D, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fb.clrbuf, 0); + } else { + glBindRenderbuffer(GL_RENDERBUFFER, fb.clrbuf_msaa); + glRenderbufferStorageMultisample(GL_RENDERBUFFER, msaa_level, GL_RGB8, width, height); + glBindRenderbuffer(GL_RENDERBUFFER, 0); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, fb.clrbuf_msaa); + } + } + + if (has_depth_buffer && (fb.width != width || fb.height != height || fb.msaa_level != msaa_level || !fb.has_depth_buffer)) { + glBindRenderbuffer(GL_RENDERBUFFER, fb.rbo); + if (msaa_level <= 1) { + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height); + } else { + glRenderbufferStorageMultisample(GL_RENDERBUFFER, msaa_level, GL_DEPTH24_STENCIL8, width, height); + } + glBindRenderbuffer(GL_RENDERBUFFER, 0); + } + + if (!fb.has_depth_buffer && has_depth_buffer) { + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, fb.rbo); + } else if (fb.has_depth_buffer && !has_depth_buffer) { + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 0); + } + } + + fb.width = width; + fb.height = height; + fb.has_depth_buffer = has_depth_buffer; + fb.msaa_level = msaa_level; + fb.invert_y = opengl_invert_y; } -void gfx_opengl_set_framebuffer(int fb) -{ - if (GLEW_ARB_clip_control || GLEW_VERSION_4_5) { - // Set origin to upper left corner, to match N64 and DX11 - // If this function is not supported, the texture will be upside down :( - glClipControl(GL_UPPER_LEFT, GL_NEGATIVE_ONE_TO_ONE); - } - glBindFramebuffer(GL_FRAMEBUFFER_EXT, fb); +void gfx_opengl_start_draw_to_framebuffer(int fb_id, float noise_scale) { + Framebuffer& fb = framebuffers[fb_id]; + if (noise_scale != 0.0f) { + current_noise_scale = 1.0f / noise_scale; + } + + glBindFramebuffer(GL_FRAMEBUFFER, fb.fbo); + + current_framebuffer = fb_id; +} + +void gfx_opengl_clear_framebuffer() { + glDisable(GL_SCISSOR_TEST); glDepthMask(GL_TRUE); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glDepthMask(current_depth_mask ? GL_TRUE : GL_FALSE); + glEnable(GL_SCISSOR_TEST); } -void gfx_opengl_reset_framebuffer(void) -{ - glBindFramebuffer(GL_FRAMEBUFFER, 0); - - glBindFramebuffer(GL_FRAMEBUFFER_EXT, framebuffer); - if (GLEW_ARB_clip_control || GLEW_VERSION_4_5) { - glClipControl(GL_LOWER_LEFT, GL_NEGATIVE_ONE_TO_ONE); - } +void gfx_opengl_resolve_msaa_color_buffer(int fb_id_target, int fb_id_source) { + Framebuffer& fb_dst = framebuffers[fb_id_target]; + Framebuffer& fb_src = framebuffers[fb_id_source]; + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fb_dst.fbo); + glBindFramebuffer(GL_READ_FRAMEBUFFER, fb_src.fbo); + glBlitFramebuffer(0, 0, fb_src.width, fb_src.height, 0, 0, fb_dst.width, fb_dst.height, GL_COLOR_BUFFER_BIT, GL_NEAREST); + glBindFramebuffer(GL_FRAMEBUFFER, current_framebuffer); } -void gfx_opengl_select_texture_fb(int fbID) -{ +void *gfx_opengl_get_framebuffer_texture_id(int fb_id) { + return (void *)(uintptr_t)framebuffers[fb_id].clrbuf; +} + +void gfx_opengl_select_texture_fb(int fb_id) { //glDisable(GL_DEPTH_TEST); glActiveTexture(GL_TEXTURE0 + 0); - glBindTexture(GL_TEXTURE_2D, fb2tex[fbID].first); + glBindTexture(GL_TEXTURE_2D, framebuffers[fb_id].clrbuf); } -static uint16_t gfx_opengl_get_pixel_depth(float x, float y) { - float depth; - glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); - glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth); - glBindFramebuffer(GL_FRAMEBUFFER, 0); - return depth * 65532.0f; +static std::map, uint16_t> gfx_opengl_get_pixel_depth(int fb_id, const std::set>& coordinates) { + std::map, uint16_t> res; + + Framebuffer& fb = framebuffers[fb_id]; + + if (coordinates.size() == 1) { + uint32_t depth_stencil_value; + glBindFramebuffer(GL_FRAMEBUFFER, fb.fbo); + int x = coordinates.begin()->first; + int y = coordinates.begin()->second; + glReadPixels(x, fb.invert_y ? fb.height - y : y, 1, 1, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, &depth_stencil_value); + res.emplace(*coordinates.begin(), (depth_stencil_value >> 18) << 2); + } else { + if (pixel_depth_rb_size < coordinates.size()) { + glBindRenderbuffer(GL_RENDERBUFFER, pixel_depth_rb); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, coordinates.size(), 1); + glBindRenderbuffer(GL_RENDERBUFFER, 0); + + pixel_depth_rb_size = coordinates.size(); + } + + glBindFramebuffer(GL_READ_FRAMEBUFFER, fb.fbo); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, pixel_depth_fb); + + glDisable(GL_SCISSOR_TEST); // needed for the blit operation + + { + size_t i = 0; + for (const auto& coord : coordinates) { + int x = coord.first; + int y = coord.second; + if (fb.invert_y) { + y = fb.height - y; + } + glBlitFramebuffer(x, y, x + 1, y + 1, i, 0, i + 1, 1, GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST); + ++i; + } + } + + glBindFramebuffer(GL_READ_FRAMEBUFFER, pixel_depth_fb); + vector depth_stencil_values(coordinates.size()); + glReadPixels(0, 0, coordinates.size(), 1, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, depth_stencil_values.data()); + + { + size_t i = 0; + for (const auto& coord : coordinates) { + res.emplace(coord, (depth_stencil_values[i++] >> 18) << 2); + } + } + } + + glBindFramebuffer(GL_FRAMEBUFFER, current_framebuffer); + return res; } struct GfxRenderingAPI gfx_opengl_api = { - gfx_opengl_z_is_from_0_to_1, + gfx_opengl_get_clip_parameters, gfx_opengl_unload_shader, gfx_opengl_load_shader, gfx_opengl_create_and_load_new_shader, @@ -723,7 +803,6 @@ struct GfxRenderingAPI gfx_opengl_api = { gfx_opengl_upload_texture, gfx_opengl_set_sampler_parameters, gfx_opengl_set_depth_test_and_mask, - gfx_opengl_get_pixel_depth, gfx_opengl_set_zmode_decal, gfx_opengl_set_viewport, gfx_opengl_set_scissor, @@ -735,9 +814,12 @@ struct GfxRenderingAPI gfx_opengl_api = { gfx_opengl_end_frame, gfx_opengl_finish_render, gfx_opengl_create_framebuffer, - gfx_opengl_resize_framebuffer, - gfx_opengl_set_framebuffer, - gfx_opengl_reset_framebuffer, + gfx_opengl_update_framebuffer_parameters, + gfx_opengl_start_draw_to_framebuffer, + gfx_opengl_clear_framebuffer, + gfx_opengl_resolve_msaa_color_buffer, + gfx_opengl_get_pixel_depth, + gfx_opengl_get_framebuffer_texture_id, gfx_opengl_select_texture_fb, gfx_opengl_delete_texture }; diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp index 28debd120..5918ccaf7 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -27,6 +28,8 @@ #include "../../luslog.h" #include "../StrHash64.h" +#include "../../SohImGuiImpl.h" +#include "../../Environment.h" // OTRTODO: fix header files for these extern "C" { @@ -71,10 +74,6 @@ struct RGBA { uint8_t r, g, b, a; }; -struct XYWidthHeight { - uint16_t x, y, width, height; -}; - struct LoadedVertex { float x, y, z, w; float u, v; @@ -174,8 +173,16 @@ static struct RenderingState { TextureCacheNode *textures[2]; } rendering_state; +struct GfxDimensions gfx_current_window_dimensions; struct GfxDimensions gfx_current_dimensions; static struct GfxDimensions gfx_prev_dimensions; +struct XYWidthHeight gfx_current_game_window_viewport; + +static bool game_renders_to_framebuffer; +static int game_framebuffer; +static int game_framebuffer_msaa_resolved; + +uint32_t gfx_msaa_level = 1; static bool dropped_frame; @@ -198,6 +205,9 @@ static bool fbActive = 0; static map::iterator active_fb; static map framebuffers; +static set> get_pixel_depth_pending; +static map, uint16_t> get_pixel_depth_cached; + #ifdef _MSC_VER // TODO: Properly implement for MSVC static unsigned long get_time(void) @@ -1326,11 +1336,11 @@ static void gfx_sp_tri1(uint8_t vtx1_idx, uint8_t vtx2_idx, uint8_t vtx3_idx, bo gfx_rapi->shader_get_info(prg, &num_inputs, used_textures); - bool z_is_from_0_to_1 = gfx_rapi->z_is_from_0_to_1(); + struct GfxClipParameters clip_parameters = gfx_rapi->get_clip_parameters(); for (int i = 0; i < 3; i++) { float z = v_arr[i]->z, w = v_arr[i]->w; - if (z_is_from_0_to_1) { + if (clip_parameters.z_is_from_0_to_1) { z = (z + w) / 2.0f; } @@ -1340,7 +1350,7 @@ static void gfx_sp_tri1(uint8_t vtx1_idx, uint8_t vtx2_idx, uint8_t vtx3_idx, bo } buf_vbo[buf_vbo_len++] = v_arr[i]->x; - buf_vbo[buf_vbo_len++] = v_arr[i]->y; + buf_vbo[buf_vbo_len++] = clip_parameters.invert_y ? -v_arr[i]->y : v_arr[i]->y; buf_vbo[buf_vbo_len++] = z; buf_vbo[buf_vbo_len++] = w; @@ -1491,6 +1501,27 @@ static void gfx_sp_geometry_mode(uint32_t clear, uint32_t set) { rsp.geometry_mode |= set; } +static void gfx_adjust_viewport_or_scissor(XYWidthHeight *area) { + if (!fbActive) { + area->width *= RATIO_X; + area->height *= RATIO_Y; + area->x *= RATIO_X; + area->y = SCREEN_HEIGHT - area->y; + area->y *= RATIO_Y; + + if (!game_renders_to_framebuffer || (gfx_msaa_level > 1 && gfx_current_dimensions.width == gfx_current_game_window_viewport.width && gfx_current_dimensions.height == gfx_current_game_window_viewport.height)) { + area->x += gfx_current_game_window_viewport.x; + area->y += gfx_current_window_dimensions.height - (gfx_current_game_window_viewport.y + gfx_current_game_window_viewport.height); + } + } else { + area->width *= RATIO_Y; + area->height *= RATIO_Y; + area->x *= RATIO_Y; + area->y = active_fb->second.orig_height - area->y; + area->y *= RATIO_Y; + } +} + static void gfx_calc_and_set_viewport(const Vp_t *viewport) { // 2 bits fraction float width = 2.0f * viewport->vscale[0] / 4.0f; @@ -1498,25 +1529,13 @@ static void gfx_calc_and_set_viewport(const Vp_t *viewport) { float x = (viewport->vtrans[0] / 4.0f) - width / 2.0f; float y = ((viewport->vtrans[1] / 4.0f) + height / 2.0f); - if (!fbActive) { - width *= RATIO_X; - height *= RATIO_Y; - x *= RATIO_X; - y = SCREEN_HEIGHT - y; - y *= RATIO_Y; - } else { - width *= RATIO_Y; - height *= RATIO_Y; - x *= RATIO_Y; - y = active_fb->second.orig_height - y; - y *= RATIO_Y; - } - rdp.viewport.x = x; rdp.viewport.y = y; rdp.viewport.width = width; rdp.viewport.height = height; + gfx_adjust_viewport_or_scissor(&rdp.viewport); + rdp.viewport_or_scissor_changed = true; } @@ -1585,11 +1604,6 @@ static void gfx_sp_texture(uint16_t sc, uint16_t tc, uint8_t level, uint8_t tile rdp.textures_changed[1] = true; } - if (tile > 8) - { - int bp = 0; - } - rdp.first_tile_index = tile; } @@ -1599,25 +1613,13 @@ static void gfx_dp_set_scissor(uint32_t mode, uint32_t ulx, uint32_t uly, uint32 float width = (lrx - ulx) / 4.0f; float height = (lry - uly) / 4.0f; - if (!fbActive) { - x *= RATIO_X; - y = SCREEN_HEIGHT - y; - y *= RATIO_Y; - width *= RATIO_X; - height *= RATIO_Y; - } else { - width *= RATIO_Y; - height *= RATIO_Y; - x *= RATIO_Y; - y = active_fb->second.orig_height - y; - y *= RATIO_Y; - } - rdp.scissor.x = x; rdp.scissor.y = y; rdp.scissor.width = width; rdp.scissor.height = height; + gfx_adjust_viewport_or_scissor(&rdp.scissor); + rdp.viewport_or_scissor_changed = true; } @@ -1887,10 +1889,12 @@ static void gfx_draw_rectangle(int32_t ulx, int32_t uly, int32_t lrx, int32_t lr ur->w = 1.0f; // The coordinates for texture rectangle shall bypass the viewport setting - struct XYWidthHeight default_viewport = { 0, 0, gfx_current_dimensions.width, gfx_current_dimensions.height }; + struct XYWidthHeight default_viewport = { 0, SCREEN_HEIGHT, SCREEN_WIDTH, SCREEN_HEIGHT }; struct XYWidthHeight viewport_saved = rdp.viewport; uint32_t geometry_mode_saved = rsp.geometry_mode; + gfx_adjust_viewport_or_scissor(&default_viewport); + rdp.viewport = default_viewport; rdp.viewport_or_scissor_changed = true; rsp.geometry_mode = 0; @@ -2456,14 +2460,15 @@ static void gfx_run_dl(Gfx* cmd) { gfx_flush(); fbActive = 1; active_fb = framebuffers.find(cmd->words.w1); - gfx_rapi->set_framebuffer(active_fb->first); + gfx_rapi->start_draw_to_framebuffer(active_fb->first, (float)active_fb->second.applied_height / active_fb->second.orig_height); + gfx_rapi->clear_framebuffer(); } break; case G_RESETFB: { gfx_flush(); fbActive = 0; - gfx_rapi->reset_framebuffer(); + gfx_rapi->start_draw_to_framebuffer(game_renders_to_framebuffer ? game_framebuffer : 0, (float)gfx_current_dimensions.height / SCREEN_HEIGHT); break; } break; @@ -2547,7 +2552,7 @@ static void gfx_run_dl(Gfx* cmd) { gfx_dp_texture_rectangle(ulx, uly, lrx, lry, tile, uls, ult, dsdx, dtdy, opcode == G_TEXRECTFLIP); break; } - case G_TEXRECT_WIDE: + case G_TEXRECT_WIDE: { int32_t lrx, lry, tile, ulx, uly; uint32_t uls, ult, dsdx, dtdy; @@ -2630,9 +2635,12 @@ void gfx_init(struct GfxWindowManagerAPI *wapi, struct GfxRenderingAPI *rapi, co gfx_rapi = rapi; gfx_wapi->init(game_name, start_in_fullscreen); gfx_rapi->init(); + gfx_rapi->update_framebuffer_parameters(0, SCREEN_WIDTH, SCREEN_HEIGHT, 1, false, true, true, true); gfx_current_dimensions.internal_mul = 1; gfx_current_dimensions.width = SCREEN_WIDTH; gfx_current_dimensions.height = SCREEN_HEIGHT; + game_framebuffer = gfx_rapi->create_framebuffer(); + game_framebuffer_msaa_resolved = gfx_rapi->create_framebuffer(); for (int i = 0; i < 16; i++) segmentPointers[i] = NULL; @@ -2681,7 +2689,8 @@ struct GfxRenderingAPI *gfx_get_current_rendering_api(void) { void gfx_start_frame(void) { gfx_wapi->handle_events(); - // gfx_wapi->get_dimensions(&gfx_current_dimensions.width, &gfx_current_dimensions.height); + gfx_wapi->get_dimensions(&gfx_current_window_dimensions.width, &gfx_current_window_dimensions.height); + SohImGui::DrawMainMenuAndCalculateGameSize(); if (gfx_current_dimensions.height == 0) { // Avoid division by zero gfx_current_dimensions.height = 1; @@ -2693,7 +2702,7 @@ void gfx_start_frame(void) { uint32_t width = fb.second.orig_width, height = fb.second.orig_height; gfx_adjust_width_height_for_scale(width, height); if (width != fb.second.applied_width || height != fb.second.applied_height) { - gfx_rapi->resize_framebuffer(fb.first, width, height); + gfx_rapi->update_framebuffer_parameters(fb.first, width, height, 1, true, true, true, true); fb.second.applied_width = width; fb.second.applied_height = height; } @@ -2701,6 +2710,22 @@ void gfx_start_frame(void) { } gfx_prev_dimensions = gfx_current_dimensions; + bool different_size = gfx_current_dimensions.width != gfx_current_game_window_viewport.width || gfx_current_dimensions.height != gfx_current_game_window_viewport.height; + if (different_size || gfx_msaa_level > 1) { + game_renders_to_framebuffer = true; + if (different_size) { + gfx_rapi->update_framebuffer_parameters(game_framebuffer, gfx_current_dimensions.width, gfx_current_dimensions.height, gfx_msaa_level, true, true, true, true); + } else { + // MSAA framebuffer needs to be resolved to an equally sized target when complete, which must therefore match the window size + gfx_rapi->update_framebuffer_parameters(game_framebuffer, gfx_current_window_dimensions.width, gfx_current_window_dimensions.height, gfx_msaa_level, false, true, true, true); + } + if (gfx_msaa_level > 1 && different_size) { + gfx_rapi->update_framebuffer_parameters(game_framebuffer_msaa_resolved, gfx_current_dimensions.width, gfx_current_dimensions.height, 1, false, false, false, false); + } + } else { + game_renders_to_framebuffer = false; + } + fbActive = 0; } @@ -2708,17 +2733,44 @@ void gfx_run(Gfx *commands) { gfx_sp_reset(); //puts("New frame"); + get_pixel_depth_pending.clear(); + get_pixel_depth_cached.clear(); if (!gfx_wapi->start_frame()) { dropped_frame = true; + SohImGui::DrawFramebufferAndGameInput(); + SohImGui::CancelFrame(); return; } dropped_frame = false; double t0 = gfx_wapi->get_time(); + gfx_rapi->update_framebuffer_parameters(0, gfx_current_window_dimensions.width, gfx_current_window_dimensions.height, 1, false, true, true, !game_renders_to_framebuffer); gfx_rapi->start_frame(); + gfx_rapi->start_draw_to_framebuffer(game_renders_to_framebuffer ? game_framebuffer : 0, (float)gfx_current_dimensions.height / SCREEN_HEIGHT); + gfx_rapi->clear_framebuffer(); gfx_run_dl(commands); gfx_flush(); + SohUtils::saveEnvironmentVar("framebuffer", string()); + if (game_renders_to_framebuffer) { + gfx_rapi->start_draw_to_framebuffer(0, 1); + gfx_rapi->clear_framebuffer(); + + if (gfx_msaa_level > 1) { + bool different_size = gfx_current_dimensions.width != gfx_current_game_window_viewport.width || gfx_current_dimensions.height != gfx_current_game_window_viewport.height; + + if (different_size) { + gfx_rapi->resolve_msaa_color_buffer(game_framebuffer_msaa_resolved, game_framebuffer); + SohUtils::saveEnvironmentVar("framebuffer", std::to_string((uintptr_t)gfx_rapi->get_framebuffer_texture_id(game_framebuffer_msaa_resolved))); + } else { + gfx_rapi->resolve_msaa_color_buffer(0, game_framebuffer); + } + } else { + SohUtils::saveEnvironmentVar("framebuffer", std::to_string((uintptr_t)gfx_rapi->get_framebuffer_texture_id(game_framebuffer))); + } + } + SohImGui::DrawFramebufferAndGameInput(); + SohImGui::Render(); double t1 = gfx_wapi->get_time(); //printf("Process %f %f\n", t1, t1 - t0); gfx_rapi->end_frame(); @@ -2739,21 +2791,47 @@ void gfx_set_framedivisor(int divisor) { int gfx_create_framebuffer(uint32_t width, uint32_t height) { uint32_t orig_width = width, orig_height = height; gfx_adjust_width_height_for_scale(width, height); - int fb = gfx_rapi->create_framebuffer(width, height); + int fb = gfx_rapi->create_framebuffer(); + gfx_rapi->update_framebuffer_parameters(fb, width, height, 1, true, true, true, true); framebuffers[fb] = { orig_width, orig_height, width, height }; return fb; } -void gfx_set_framebuffer(int fb) -{ - gfx_rapi->set_framebuffer(fb); +void gfx_set_framebuffer(int fb, float noise_scale) { + gfx_rapi->start_draw_to_framebuffer(fb, noise_scale); + gfx_rapi->clear_framebuffer(); } -void gfx_reset_framebuffer() -{ - gfx_rapi->reset_framebuffer(); +void gfx_reset_framebuffer() { + gfx_rapi->start_draw_to_framebuffer(0, (float)gfx_current_dimensions.height / SCREEN_HEIGHT); +} + +static void adjust_pixel_depth_coordinates(float& x, float& y) { + x = x * RATIO_Y - (SCREEN_WIDTH * RATIO_Y - gfx_current_dimensions.width) / 2; + y *= RATIO_Y; + if (!game_renders_to_framebuffer || (gfx_msaa_level > 1 && gfx_current_dimensions.width == gfx_current_game_window_viewport.width && gfx_current_dimensions.height == gfx_current_game_window_viewport.height)) { + x += gfx_current_game_window_viewport.x; + y += gfx_current_window_dimensions.height - (gfx_current_game_window_viewport.y + gfx_current_game_window_viewport.height); + } +} + +void gfx_get_pixel_depth_prepare(float x, float y) { + adjust_pixel_depth_coordinates(x, y); + get_pixel_depth_pending.emplace(x, y); } uint16_t gfx_get_pixel_depth(float x, float y) { - return gfx_rapi->get_pixel_depth(x * RATIO_Y - (SCREEN_WIDTH * RATIO_Y - gfx_current_dimensions.width) / 2, y * RATIO_Y); + adjust_pixel_depth_coordinates(x, y); + + if (auto it = get_pixel_depth_cached.find(make_pair(x, y)); it != get_pixel_depth_cached.end()) { + return it->second; + } + + get_pixel_depth_pending.emplace(x, y); + + map, uint16_t> res = gfx_rapi->get_pixel_depth(game_renders_to_framebuffer ? game_framebuffer : 0, get_pixel_depth_pending); + get_pixel_depth_cached.merge(res); + get_pixel_depth_pending.clear(); + + return get_pixel_depth_cached.find(make_pair(x, y))->second; } \ No newline at end of file diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_pc.h b/libultraship/libultraship/Lib/Fast3D/gfx_pc.h index 446c0b6a4..d682991d9 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_pc.h +++ b/libultraship/libultraship/Lib/Fast3D/gfx_pc.h @@ -8,8 +8,11 @@ struct GfxRenderingAPI; struct GfxWindowManagerAPI; -struct GfxDimensions -{ +struct XYWidthHeight { + int16_t x, y, width, height; +}; + +struct GfxDimensions { uint32_t internal_mul; uint32_t width, height; float aspect_ratio; @@ -50,7 +53,10 @@ struct TextureCacheValue { #ifdef __cplusplus extern "C" { #endif -extern struct GfxDimensions gfx_current_dimensions; +extern struct GfxDimensions gfx_current_window_dimensions; // The dimensions of the window +extern struct GfxDimensions gfx_current_dimensions; // The dimensions of the draw area the game draws to, before scaling (if applicable) +extern struct XYWidthHeight gfx_current_game_window_viewport; // The area of the window the game is drawn to, (0, 0) is top-left corner +extern uint32_t gfx_msaa_level; void gfx_init(struct GfxWindowManagerAPI* wapi, struct GfxRenderingAPI* rapi, const char* game_name, bool start_in_fullscreen); struct GfxRenderingAPI* gfx_get_current_rendering_api(void); @@ -60,6 +66,7 @@ void gfx_end_frame(void); void gfx_set_framedivisor(int); void gfx_texture_cache_clear(); int gfx_create_framebuffer(uint32_t width, uint32_t height); +void gfx_get_pixel_depth_prepare(float x, float y); uint16_t gfx_get_pixel_depth(float x, float y); #ifdef __cplusplus diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_rendering_api.h b/libultraship/libultraship/Lib/Fast3D/gfx_rendering_api.h index 9283ee236..84247fe60 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_rendering_api.h +++ b/libultraship/libultraship/Lib/Fast3D/gfx_rendering_api.h @@ -5,10 +5,18 @@ #include #include +#include +#include + struct ShaderProgram; +struct GfxClipParameters { + bool z_is_from_0_to_1; + bool invert_y; +}; + struct GfxRenderingAPI { - bool (*z_is_from_0_to_1)(void); + struct GfxClipParameters (*get_clip_parameters)(void); void (*unload_shader)(struct ShaderProgram *old_prg); void (*load_shader)(struct ShaderProgram *new_prg); struct ShaderProgram *(*create_and_load_new_shader)(uint64_t shader_id0, uint32_t shader_id1); @@ -19,7 +27,6 @@ struct GfxRenderingAPI { void (*upload_texture)(const uint8_t *rgba32_buf, uint32_t width, uint32_t height); void (*set_sampler_parameters)(int sampler, bool linear_filter, uint32_t cms, uint32_t cmt); void (*set_depth_test_and_mask)(bool depth_test, bool z_upd); - uint16_t (*get_pixel_depth)(float x, float y); void (*set_zmode_decal)(bool zmode_decal); void (*set_viewport)(int x, int y, int width, int height); void (*set_scissor)(int x, int y, int width, int height); @@ -30,11 +37,14 @@ struct GfxRenderingAPI { void (*start_frame)(void); void (*end_frame)(void); void (*finish_render)(void); - int (*create_framebuffer)(uint32_t width, uint32_t height); - void (*resize_framebuffer)(int fb, uint32_t width, uint32_t height); - void (*set_framebuffer)(int fb); - void (*reset_framebuffer)(); - void (*select_texture_fb)(int fbID); + int (*create_framebuffer)(); + void (*update_framebuffer_parameters)(int fb_id, uint32_t width, uint32_t height, uint32_t msaa_level, bool opengl_invert_y, bool render_target, bool has_depth_buffer, bool can_extract_depth); + void (*start_draw_to_framebuffer)(int fb_id, float noise_scale); + void (*clear_framebuffer)(void); + void (*resolve_msaa_color_buffer)(int fb_id_target, int fb_id_source); + std::map, uint16_t> (*get_pixel_depth)(int fb_id, const std::set>& coordinates); + void *(*get_framebuffer_texture_id)(int fb_id); + void (*select_texture_fb)(int fb_id); void (*delete_texture)(uint32_t texID); }; diff --git a/libultraship/libultraship/Lib/ImGui/imgui.h b/libultraship/libultraship/Lib/ImGui/imgui.h index fa2dadcda..323832071 100644 --- a/libultraship/libultraship/Lib/ImGui/imgui.h +++ b/libultraship/libultraship/Lib/ImGui/imgui.h @@ -502,7 +502,6 @@ namespace ImGui IMGUI_API bool SmallButton(const char* label); // button with FramePadding=(0,0) to easily embed within text IMGUI_API bool InvisibleButton(const char* str_id, const ImVec2& size, ImGuiButtonFlags flags = 0); // flexible button behavior without the visuals, frequently useful to build custom behaviors using the public api (along with IsItemActive, IsItemHovered, etc.) IMGUI_API bool ArrowButton(const char* str_id, ImGuiDir dir); // square button with an arrow shape - IMGUI_API void ImageRotated(ImTextureID tex_id, ImVec2 center, ImVec2 size, float angle); IMGUI_API void Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1,1), const ImVec4& tint_col = ImVec4(1,1,1,1), const ImVec4& border_col = ImVec4(0,0,0,0)); IMGUI_API bool ImageButton(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1,1), int frame_padding = -1, const ImVec4& bg_col = ImVec4(0,0,0,0), const ImVec4& tint_col = ImVec4(1,1,1,1)); // <0 frame_padding uses default frame padding settings. 0 for no padding IMGUI_API bool Checkbox(const char* label, bool* v); diff --git a/libultraship/libultraship/Lib/ImGui/imgui_widgets.cpp b/libultraship/libultraship/Lib/ImGui/imgui_widgets.cpp index 3d165580b..8e4210002 100644 --- a/libultraship/libultraship/Lib/ImGui/imgui_widgets.cpp +++ b/libultraship/libultraship/Lib/ImGui/imgui_widgets.cpp @@ -1007,33 +1007,6 @@ bool ImGui::ScrollbarEx(const ImRect& bb_frame, ImGuiID id, ImGuiAxis axis, ImS6 return held; } -void ImGui::ImageRotated(ImTextureID tex_id, ImVec2 center, ImVec2 size, float angle) { - - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return; - - ImDrawList* draw_list = ImGui::GetWindowDrawList(); - ImRect bb(window->DC.CursorPos + ImVec2(size.x / 2, size.y / 2), window->DC.CursorPos + size); - - ImVec2 pos[4] = - { - center + bb.Min + ImVec2(-size.x * 0.5f, -size.y * 0.5f), - center + bb.Min + ImVec2(+size.x * 0.5f, -size.y * 0.5f), - center + bb.Min + ImVec2(+size.x * 0.5f, +size.y * 0.5f), - center + bb.Min + ImVec2(-size.x * 0.5f, +size.y * 0.5f) - }; - ImVec2 uvs[4] = - { - ImVec2(0.0f, 1.0f), - ImVec2(1.0f, 1.0f), - ImVec2(1.0f, 0.0f), - ImVec2(0.0f, 0.0f) - }; - - draw_list->AddImageQuad(tex_id, pos[0], pos[1], pos[2], pos[3], uvs[0], uvs[1], uvs[2], uvs[3], IM_COL32_WHITE); -} - void ImGui::Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& tint_col, const ImVec4& border_col) { ImGuiWindow* window = GetCurrentWindow(); diff --git a/libultraship/libultraship/SohImGuiImpl.cpp b/libultraship/libultraship/SohImGuiImpl.cpp index 93dcd2492..860720433 100644 --- a/libultraship/libultraship/SohImGuiImpl.cpp +++ b/libultraship/libultraship/SohImGuiImpl.cpp @@ -123,14 +123,6 @@ namespace SohImGui { } } - bool UseInternalRes() { - switch (impl.backend) { - case Backend::SDL: - return true; - } - return false; - } - bool UseViewports() { switch (impl.backend) { case Backend::DX11: @@ -281,20 +273,16 @@ namespace SohImGui { } } - void Draw() { - + void DrawMainMenuAndCalculateGameSize() { console->Update(); ImGuiBackendNewFrame(); ImGuiWMNewFrame(); ImGui::NewFrame(); const std::shared_ptr wnd = GlobalCtx2::GetInstance()->GetWindow(); - ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoDocking | + ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoNavFocus | ImGuiWindowFlags_NoResize; - if (UseViewports()) { - window_flags |= ImGuiWindowFlags_NoBackground; - } if (Game::Settings.debug.menu_bar) window_flags |= ImGuiWindowFlags_MenuBar; const ImGuiViewport* viewport = ImGui::GetMainViewport(); @@ -302,8 +290,12 @@ namespace SohImGui { ImGui::SetNextWindowSize(ImVec2(wnd->GetCurrentWidth(), wnd->GetCurrentHeight())); ImGui::SetNextWindowViewport(viewport->ID); ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_ChildBorderSize, 0.0f); ImGui::Begin("Main - Deck", nullptr, window_flags); - ImGui::PopStyleVar(); + ImGui::PopStyleVar(3); + + ImVec2 top_left_pos = ImGui::GetWindowPos(); const ImGuiID dockId = ImGui::GetID("main_dock"); @@ -421,9 +413,7 @@ namespace SohImGui { ImGui::Text("Graphics"); ImGui::Separator(); - if (UseInternalRes()) { - HOOK(ImGui::Checkbox("N64 Mode", &Game::Settings.debug.n64mode)); - } + HOOK(ImGui::Checkbox("N64 Mode", &Game::Settings.debug.n64mode)); if (ImGui::Checkbox("Animated Link in Pause Menu", &Game::Settings.enhancements.animated_pause_menu)) { CVar_SetS32("gPauseLiveLink", Game::Settings.enhancements.animated_pause_menu); @@ -441,10 +431,10 @@ namespace SohImGui { if (ImGui::BeginMenu("Developer Tools")) { HOOK(ImGui::MenuItem("Stats", nullptr, &Game::Settings.debug.soh)); HOOK(ImGui::MenuItem("Console", nullptr, &console->opened)); - + ImGui::Text("Debug"); ImGui::Separator(); - + if (ImGui::Checkbox("Debug Mode", &Game::Settings.cheats.debug_mode)) { CVar_SetS32("gDebugEnabled", Game::Settings.cheats.debug_mode); needs_save = true; @@ -452,7 +442,12 @@ namespace SohImGui { ImGui::EndMenu(); } - + + if (ImGui::BeginMenu("Graphics")) { + HOOK(ImGui::MenuItem("Anti-aliasing", nullptr, &Game::Settings.graphics.show)); + ImGui::EndMenu(); + } + if (ImGui::BeginMenu("Cheats")) { if (ImGui::Checkbox("Infinite Money", &Game::Settings.cheats.infinite_money)) { CVar_SetS32("gInfiniteMoney", Game::Settings.cheats.infinite_money); @@ -473,22 +468,22 @@ namespace SohImGui { CVar_SetS32("gInfiniteMagic", Game::Settings.cheats.infinite_magic); needs_save = true; } - + if (ImGui::Checkbox("No Clip", &Game::Settings.cheats.no_clip)) { CVar_SetS32("gNoClip", Game::Settings.cheats.no_clip); needs_save = true; } - + if (ImGui::Checkbox("Climb Everything", &Game::Settings.cheats.climb_everything)) { CVar_SetS32("gClimbEverything", Game::Settings.cheats.climb_everything); needs_save = true; } - + if (ImGui::Checkbox("Moon Jump on L", &Game::Settings.cheats.moon_jump_on_l)) { CVar_SetS32("gMoonJumpOnL", Game::Settings.cheats.moon_jump_on_l); needs_save = true; } - + if (ImGui::Checkbox("Super Tunic", &Game::Settings.cheats.super_tunic)) { CVar_SetS32("gSuperTunic", Game::Settings.cheats.super_tunic); needs_save = true; @@ -509,36 +504,6 @@ namespace SohImGui { ImGui::EndMenuBar(); } - ImGui::End(); - ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0)); - ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(0.0f, 0.0f, 0.0f, 0.0f)); - ImGuiWindowFlags flags = ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove; - if (UseViewports()) { - flags |= ImGuiWindowFlags_NoBackground; - } - ImGui::Begin("OoT Master Quest", nullptr, flags); - ImGui::PopStyleVar(); - ImGui::PopStyleColor(); - - ImVec2 main_pos = ImGui::GetWindowPos(); - 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; - if (UseInternalRes()) { - if (Game::Settings.debug.n64mode) { - gfx_current_dimensions.width = 320; - gfx_current_dimensions.height = 240; - const int sw = size.y * 320 / 240; - pos = ImVec2(size.x / 2 - sw / 2, 0); - size = ImVec2(sw, size.y); - } - } - - if (UseInternalRes()) { - int fbuf = std::stoi(SohUtils::getEnvironmentVar("framebuffer")); - ImGui::ImageRotated(reinterpret_cast(fbuf), pos, size, 0.0f); - } ImGui::End(); if (Game::Settings.debug.soh) { @@ -548,18 +513,84 @@ namespace SohImGui { ImGui::Text("Platform: Windows"); ImGui::Text("Status: %.3f ms/frame (%.1f FPS)", 1000.0f / framerate, framerate); - if (UseInternalRes()) { - ImGui::Text("Internal Resolution:"); - ImGui::SliderInt("Mul", reinterpret_cast(&gfx_current_dimensions.internal_mul), 1, 8); - } ImGui::End(); ImGui::PopStyleColor(); } + if (Game::Settings.graphics.show) { + ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0, 0, 0, 0)); + ImGui::Begin("Anti-aliasing settings", nullptr, ImGuiWindowFlags_None); + ImGui::Text("Internal Resolution:"); + ImGui::SliderInt("Mul", reinterpret_cast(&gfx_current_dimensions.internal_mul), 1, 8); + ImGui::Text("MSAA:"); + ImGui::SliderInt("MSAA", reinterpret_cast(&gfx_msaa_level), 1, 8); + ImGui::End(); + ImGui::PopStyleColor(); + } + + console->Draw(); + + for (auto& windowIter : customWindows) { + CustomWindow& window = windowIter.second; + if (window.drawFunc != nullptr) { + window.drawFunc(window.enabled); + } + } + + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_ChildBorderSize, 0.0f); + ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(0.0f, 0.0f, 0.0f, 0.0f)); + ImGuiWindowFlags flags = ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoBackground; + ImGui::Begin("OoT Master Quest", nullptr, flags); + ImGui::PopStyleVar(3); + ImGui::PopStyleColor(); + + ImVec2 main_pos = ImGui::GetWindowPos(); + main_pos.x -= top_left_pos.x; + 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; + if (Game::Settings.debug.n64mode) { + 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.width = sw; + pos = ImVec2(size.x / 2 - sw / 2, 0); + size = ImVec2(sw, size.y); + } + } + + void DrawFramebufferAndGameInput() { + ImVec2 main_pos = ImGui::GetWindowPos(); + ImVec2 size = ImGui::GetContentRegionAvail(); + ImVec2 pos = ImVec2(0, 0); + if (Game::Settings.debug.n64mode) { + const int sw = size.y * 320 / 240; + pos = ImVec2(size.x / 2 - sw / 2, 0); + size = ImVec2(sw, size.y); + } + std::string fb_str = SohUtils::getEnvironmentVar("framebuffer"); + if (!fb_str.empty()) { + uintptr_t fbuf = (uintptr_t)std::stoull(fb_str); + //ImGui::ImageSimple(reinterpret_cast(fbuf), pos, size); + ImGui::SetCursorPos(pos); + ImGui::Image(reinterpret_cast(fbuf), size); + } + + ImGui::End(); + const float scale = Game::Settings.controller.input_scale; ImVec2 BtnPos = ImVec2(160 * scale, 85 * scale); - if(Game::Settings.controller.input_enabled) { + if (Game::Settings.controller.input_enabled) { ImGui::SetNextWindowSize(BtnPos); ImGui::SetNextWindowPos(ImVec2(main_pos.x + size.x - BtnPos.x - 20, main_pos.y + size.y - BtnPos.y - 20)); @@ -605,16 +636,9 @@ namespace SohImGui { ImGui::End(); } } + } - console->Draw(); - - for (auto& windowIter : customWindows) { - CustomWindow& window = windowIter.second; - if (window.drawFunc != nullptr) { - window.drawFunc(window.enabled); - } - } - + void Render() { ImGui::Render(); ImGuiRenderDrawData(ImGui::GetDrawData()); if (UseViewports()) { @@ -623,6 +647,13 @@ namespace SohImGui { } } + void CancelFrame() { + ImGui::EndFrame(); + if (UseViewports()) { + ImGui::UpdatePlatformWindows(); + } + } + void BindCmd(const std::string& cmd, CommandEntry entry) { console->Commands[cmd] = std::move(entry); } diff --git a/libultraship/libultraship/SohImGuiImpl.h b/libultraship/libultraship/SohImGuiImpl.h index 58dac7a1b..dc6e24ee1 100644 --- a/libultraship/libultraship/SohImGuiImpl.h +++ b/libultraship/libultraship/SohImGuiImpl.h @@ -60,7 +60,10 @@ namespace SohImGui { extern Console* console; void Init(WindowImpl window_impl); void Update(EventImpl event); - void Draw(void); + void DrawMainMenuAndCalculateGameSize(void); + void DrawFramebufferAndGameInput(void); + void Render(void); + void CancelFrame(void); void ShowCursor(bool hide, Dialogues w); void BindCmd(const std::string& cmd, CommandEntry entry); void AddWindow(const std::string& category, const std::string& name, WindowDrawFunc drawFunc); diff --git a/libultraship/libultraship/Window.cpp b/libultraship/libultraship/Window.cpp index 665483b35..2b57c547e 100644 --- a/libultraship/libultraship/Window.cpp +++ b/libultraship/libultraship/Window.cpp @@ -286,6 +286,10 @@ namespace Ship { //gfx_set_framedivisor(0); } + void Window::GetPixelDepthPrepare(float x, float y) { + gfx_get_pixel_depth_prepare(x, y); + } + uint16_t Window::GetPixelDepth(float x, float y) { return gfx_get_pixel_depth(x, y); } diff --git a/libultraship/libultraship/Window.h b/libultraship/libultraship/Window.h index 6046ca4ae..0d12211b0 100644 --- a/libultraship/libultraship/Window.h +++ b/libultraship/libultraship/Window.h @@ -20,6 +20,7 @@ namespace Ship { void Init(); void RunCommands(Gfx* Commands); void SetFrameDivisor(int divisor); + void GetPixelDepthPrepare(float x, float y); uint16_t GetPixelDepth(float x, float y); void ToggleFullscreen(); void SetFullscreen(bool bIsFullscreen); diff --git a/soh/include/functions.h b/soh/include/functions.h index a4b1a9a99..13e3a7055 100644 --- a/soh/include/functions.h +++ b/soh/include/functions.h @@ -977,6 +977,7 @@ void LightContext_RemoveLight(GlobalContext* globalCtx, LightContext* lightCtx, Lights* Lights_NewAndDraw(GraphicsContext* gfxCtx, u8 ambientR, u8 ambientG, u8 ambientB, u8 numLights, u8 r, u8 g, u8 b, s8 x, s8 y, s8 z); Lights* Lights_New(GraphicsContext* gfxCtx, u8 ambientR, u8 ambientG, u8 ambientB); +void Lights_GlowCheckPrepare(GlobalContext* globalCtx); void Lights_GlowCheck(GlobalContext* globalCtx); void Lights_DrawGlow(GlobalContext* globalCtx); void ZeldaArena_CheckPointer(void* ptr, size_t size, const char* name, const char* action); diff --git a/soh/soh/GbiWrap.cpp b/soh/soh/GbiWrap.cpp index 1f6a8003c..c7f69f1a9 100644 --- a/soh/soh/GbiWrap.cpp +++ b/soh/soh/GbiWrap.cpp @@ -9,6 +9,7 @@ void Graph_ProcessGfxCommands(Gfx* commands); void OTRLogString(const char* src); void OTRGfxPrint(const char* str, void* printer, void (*printImpl)(void*, char)); void OTRSetFrameDivisor(int divisor); +void OTRGetPixelDepthPrepare(float x, float y); uint16_t OTRGetPixelDepth(float x, float y); int32_t OTRGetLastScancode(); void ResourceMgr_CacheDirectory(const char* resName); diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 007afd702..fca6d6b7d 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -24,9 +24,17 @@ #include "../soh/Enhancements/debugconsole.h" #include "../soh/Enhancements/debugger/debugger.h" #include "Utils/BitConverter.h" +#include "variables.h" OTRGlobals* OTRGlobals::Instance; +static struct { + std::condition_variable cv_to_thread, cv_from_thread; + std::mutex mutex; + bool initialized; + bool processing; +} audio; + OTRGlobals::OTRGlobals() { context = Ship::GlobalCtx2::CreateInstance("Ship of Harkinian"); context->GetWindow()->Init(); @@ -39,6 +47,10 @@ extern uintptr_t clearMtx; extern "C" Mtx gMtxClear; extern "C" MtxF gMtxFClear; extern "C" void OTRMessage_Init(); +extern "C" void AudioMgr_CreateNextAudioBuffer(s16* samples, u32 num_samples); +extern "C" void AudioPlayer_Play(const uint8_t* buf, uint32_t len); +extern "C" int AudioPlayer_Buffered(void); +extern "C" int AudioPlayer_GetDesiredBuffered(void); // C->C++ Bridge extern "C" void InitOTR() { @@ -80,8 +92,67 @@ extern "C" void Graph_ProcessFrame(void (*run_one_game_iter)(void)) { // C->C++ Bridge extern "C" void Graph_ProcessGfxCommands(Gfx* commands) { + OTRGlobals::Instance->context->GetWindow()->SetFrameDivisor(R_UPDATE_RATE); + + if (!audio.initialized) { + audio.initialized = true; + std::thread([]() { + for (;;) { + { + std::unique_lock Lock(audio.mutex); + while (!audio.processing) { + audio.cv_to_thread.wait(Lock); + } + } + //AudioMgr_ThreadEntry(&gAudioMgr); + // 528 and 544 relate to 60 fps at 32 kHz 32000/60 = 533.333.. + // in an ideal world, one third of the calls should use num_samples=544 and two thirds num_samples=528 + #define SAMPLES_HIGH 560 + #define SAMPLES_LOW 528 + // PAL values + //#define SAMPLES_HIGH 656 + //#define SAMPLES_LOW 624 + #define AUDIO_FRAMES_PER_UPDATE (R_UPDATE_RATE > 0 ? R_UPDATE_RATE : 1 ) + #define NUM_AUDIO_CHANNELS 2 + int samples_left = AudioPlayer_Buffered(); + u32 num_audio_samples = samples_left < AudioPlayer_GetDesiredBuffered() ? SAMPLES_HIGH : SAMPLES_LOW; + // printf("Audio samples: %d %u\n", samples_left, num_audio_samples); + + // 3 is the maximum authentic frame divisor. + s16 audio_buffer[SAMPLES_HIGH * NUM_AUDIO_CHANNELS * 3]; + for (int i = 0; i < AUDIO_FRAMES_PER_UPDATE; i++) { + AudioMgr_CreateNextAudioBuffer(audio_buffer + i * (num_audio_samples * NUM_AUDIO_CHANNELS), num_audio_samples); + } + //for (uint32_t i = 0; i < 2 * num_audio_samples; i++) { + // audio_buffer[i] = Rand_Next() & 0xFF; + //} + // printf("Audio samples before submitting: %d\n", audio_api->buffered()); + AudioPlayer_Play((u8*)audio_buffer, num_audio_samples * (sizeof(int16_t) * NUM_AUDIO_CHANNELS * AUDIO_FRAMES_PER_UPDATE)); + + { + std::unique_lock Lock(audio.mutex); + audio.processing = false; + } + audio.cv_from_thread.notify_one(); + } + }).detach(); + } + + { + std::unique_lock Lock(audio.mutex); + audio.processing = true; + } + audio.cv_to_thread.notify_one(); + OTRGlobals::Instance->context->GetWindow()->RunCommands(commands); + { + std::unique_lock Lock(audio.mutex); + while (audio.processing) { + audio.cv_from_thread.wait(Lock); + } + } + // OTRTODO: FIGURE OUT END FRAME POINT /* if (OTRGlobals::Instance->context->GetWindow()->lastScancode != -1) OTRGlobals::Instance->context->GetWindow()->lastScancode = -1;*/ @@ -90,8 +161,8 @@ extern "C" void Graph_ProcessGfxCommands(Gfx* commands) { float divisor_num = 0.0f; -extern "C" void OTRSetFrameDivisor(int divisor) { - OTRGlobals::Instance->context->GetWindow()->SetFrameDivisor(divisor); +extern "C" void OTRGetPixelDepthPrepare(float x, float y) { + OTRGlobals::Instance->context->GetWindow()->GetPixelDepthPrepare(x, y); } extern "C" uint16_t OTRGetPixelDepth(float x, float y) { diff --git a/soh/soh/OTRGlobals.h b/soh/soh/OTRGlobals.h index 4f62f0694..20080fcb1 100644 --- a/soh/soh/OTRGlobals.h +++ b/soh/soh/OTRGlobals.h @@ -24,7 +24,7 @@ void Graph_ProcessFrame(void (*run_one_game_iter)(void)); void Graph_ProcessGfxCommands(Gfx* commands); void OTRLogString(const char* src); void OTRGfxPrint(const char* str, void* printer, void (*printImpl)(void*, char)); -void OTRSetFrameDivisor(int divisor); +void OTRGetPixelDepthPrepare(float x, float y); uint16_t OTRGetPixelDepth(float x, float y); int32_t OTRGetLastScancode(); uint32_t ResourceMgr_GetGameVersion(); diff --git a/soh/src/code/graph.c b/soh/src/code/graph.c index 9d2886ef1..34283f342 100644 --- a/soh/src/code/graph.c +++ b/soh/src/code/graph.c @@ -468,35 +468,6 @@ static void RunFrame() { uint64_t ticksA, ticksB; ticksA = GetPerfCounter(); - - OTRSetFrameDivisor(R_UPDATE_RATE); - //OTRSetFrameDivisor(0); - - - //AudioMgr_ThreadEntry(&gAudioMgr); - // 528 and 544 relate to 60 fps at 32 kHz 32000/60 = 533.333.. - // in an ideal world, one third of the calls should use num_samples=544 and two thirds num_samples=528 - #define SAMPLES_HIGH 560 - #define SAMPLES_LOW 528 - // PAL values - //#define SAMPLES_HIGH 656 - //#define SAMPLES_LOW 624 - #define AUDIO_FRAMES_PER_UPDATE (R_UPDATE_RATE > 0 ? R_UPDATE_RATE : 1 ) - #define NUM_AUDIO_CHANNELS 2 - int samples_left = AudioPlayer_Buffered(); - u32 num_audio_samples = samples_left < AudioPlayer_GetDesiredBuffered() ? SAMPLES_HIGH : SAMPLES_LOW; - // printf("Audio samples: %d %u\n", samples_left, num_audio_samples); - - // 3 is the maximum authentic frame divisor. - s16 audio_buffer[SAMPLES_HIGH * NUM_AUDIO_CHANNELS * 3]; - for (int i = 0; i < AUDIO_FRAMES_PER_UPDATE; i++) { - AudioMgr_CreateNextAudioBuffer(audio_buffer + i * (num_audio_samples * NUM_AUDIO_CHANNELS), num_audio_samples); - } - //for (uint32_t i = 0; i < 2 * num_audio_samples; i++) { - // audio_buffer[i] = Rand_Next() & 0xFF; - //} - // printf("Audio samples before submitting: %d\n", audio_api->buffered()); - AudioPlayer_Play((u8*)audio_buffer, num_audio_samples * (sizeof(int16_t) * NUM_AUDIO_CHANNELS * AUDIO_FRAMES_PER_UPDATE)); PadMgr_ThreadEntry(&gPadMgr); diff --git a/soh/src/code/z_kankyo.c b/soh/src/code/z_kankyo.c index afcd0f4fa..f3ac083ab 100644 --- a/soh/src/code/z_kankyo.c +++ b/soh/src/code/z_kankyo.c @@ -226,6 +226,9 @@ u16 Environment_GetPixelDepth(s32 x, s32 y) { void Environment_GraphCallback(GraphicsContext* gfxCtx, void* param) { GlobalContext* globalCtx = (GlobalContext*)param; + OTRGetPixelDepthPrepare(D_8015FD7E, D_8015FD80); + Lights_GlowCheckPrepare(globalCtx); + D_8011FB44 = Environment_GetPixelDepth(D_8015FD7E, D_8015FD80); Lights_GlowCheck(globalCtx); } diff --git a/soh/src/code/z_lights.c b/soh/src/code/z_lights.c index 2c7140c73..c9b60ceca 100644 --- a/soh/src/code/z_lights.c +++ b/soh/src/code/z_lights.c @@ -323,6 +323,44 @@ Lights* Lights_New(GraphicsContext* gfxCtx, u8 ambientR, u8 ambientG, u8 ambient return lights; } +void Lights_GlowCheckPrepare(GlobalContext* globalCtx) { + LightNode* node; + LightPoint* params; + Vec3f pos; + Vec3f multDest; + f32 wDest; + f32 wX; + f32 wY; + + node = globalCtx->lightCtx.listHead; + + while (node != NULL) { + params = &node->info->params.point; + + if (node->info->type == LIGHT_POINT_GLOW) { + f32 x, y; + u32 shrink; + uint32_t height; + + pos.x = params->x; + pos.y = params->y; + pos.z = params->z; + func_8002BE04(globalCtx, &pos, &multDest, &wDest); + wX = multDest.x * wDest; + wY = multDest.y * wDest; + + x = wX * 160 + 160; + y = wY * 120 + 120; + shrink = ShrinkWindow_GetCurrentVal(); + + if ((multDest.z > 1.0f) && y >= shrink && y <= SCREEN_HEIGHT - shrink) { + OTRGetPixelDepthPrepare(x, y); + } + } + node = node->next; + } +} + void Lights_GlowCheck(GlobalContext* globalCtx) { LightNode* node; LightPoint* params; From a01392c40e59991d02f7e058bc4d9c7838386e3d Mon Sep 17 00:00:00 2001 From: MegaMech Date: Tue, 19 Apr 2022 11:16:06 -0600 Subject: [PATCH 45/83] Implement todo in extract_assets.py (#154) * Update extract_assets.py * Update extract_assets.py * Update extract_assets.py * Update extract_assets.py * Update extract_assets.py * Update README.md * Update extract_assets.py --- OTRExporter/extract_assets.py | 141 ++++++++++++++++++++++++++++++---- README.md | 28 +++---- 2 files changed, 140 insertions(+), 29 deletions(-) diff --git a/OTRExporter/extract_assets.py b/OTRExporter/extract_assets.py index bb9ed177c..f15cb1beb 100755 --- a/OTRExporter/extract_assets.py +++ b/OTRExporter/extract_assets.py @@ -1,14 +1,51 @@ #!/usr/bin/env python3 -import argparse, json, os, signal, time, sys, shutil +# How to use: +# Place a rom in this directory then run the script. +# If you are using multiple roms, the script will let you choose one. +# To choose with a commandline argument: +# Python3 extract_assets.py +# Invalid input results in the first rom being selected + +import json, os, signal, time, sys, shutil, glob from multiprocessing import Pool, cpu_count, Event, Manager, ProcessError +from enum import Enum import shutil -def BuildOTR(xmlPath): +romVer = "..\\soh\\baserom_non_mq.z64" +roms = []; +checksums = ["", "", ""]; + +class Checksums(Enum): + OOT_NTSC_10 = "EC7011B7" + OOT_NTSC_11 = "D43DA81F" + OOT_NTSC_12 = "693BA2AE" + OOT_PAL_10 = "B044B569" + OOT_PAL_11 = "B2055FBD" + OOT_NTSC_JP_GC_CE = "F7F52DB8" + OOT_NTSC_JP_GC = "F611F4BA" + OOT_NTSC_US_GC = "F3DD35BA" + OOT_PAL_GC = "09465AC3" + OOT_NTSC_JP_MQ = "F43B45BA" + OOT_NTSC_US_MQ = "F034001A" + OOT_PAL_MQ = "1D4136F3" + OOT_PAL_GC_DBG1 = "871E1C92" + OOT_PAL_GC_DBG2 = "87121EFE" + OOT_PAL_GC_MQ_DBG = "917D18F6" + OOT_IQUE_TW = "3D81FB3E" + OOT_IQUE_CN = "B1E1E07B" + OOT_UNKNOWN = "FFFFFFFF" + +CompatibleChecksums = [ + Checksums.OOT_PAL_GC, + Checksums.OOT_PAL_GC_DBG1 +] + +def BuildOTR(xmlPath, rom): shutil.copytree("assets", "Extract/assets") - execStr = "x64\\Release\\ZAPD.exe" if sys.platform == "win32" else "../ZAPD/ZAPD.out" - execStr += " ed -i %s -b baserom.z64 -fl CFG\\filelists -o placeholder -osf placeholder -gsf 1 -rconf CFG/Config.xml -se OTR" % (xmlPath) + execStr = "x64\\Release\\ZAPD.exe" if sys.platform == "win32" else "../ZAPD/ZAPD.out" + execStr += " ed -i %s -b %s -fl CFG\\filelists -o placeholder -osf placeholder -gsf 1 -rconf CFG/Config.xml -se OTR" % (xmlPath, rom) print(execStr) exitValue = os.system(execStr) @@ -18,23 +55,95 @@ def BuildOTR(xmlPath): print("Aborting...", file=os.sys.stderr) print("\n") -def main(): - parser = argparse.ArgumentParser(description="baserom asset extractor") - parser.add_argument("-v", "--version", help="Sets game version.") - args = parser.parse_args() +def checkChecksum(rom): + r = open(rom, "rb") + r.seek(16) + bytes = r.read(4).hex().upper() + r.close() - # TODO: Read from makerom file to automatically determine game version - xmlVer = "GC_NMQ_D" + for checksum in Checksums: + if (checksum.value == bytes): + + for compat in CompatibleChecksums: + if (checksum.name == compat.name): + print("Compatible rom found!") + return checksum + print("Valid oot rom found. However, not compatible with SoH.") + print("Compatible roms:") + for compat in CompatibleChecksums: + print(compat.name+" | 0x"+compat.value) + sys.exit(1) + + print("Wrong rom! No valid checksum found") + sys.exit(1) - if (args.version == "gc_pal_nmpq"): - xmlVer = "GC_NMQ_PAL_F" - elif (args.version == "dbg_mq"): - xmlVer = "GC_MQ_D" +def main(): + + romToUse = ""; + + for file in glob.glob("*.z64"): + roms.append(file) + + if not (roms): + print("Error: No roms located, place one in the OTRExporter directory", file=os.sys.stderr) + sys.exit(1) + + if (len(roms) > 1): + + # If commandline args exist + if (len(sys.argv) > 1): + try: + if ((int(sys.argv[1]) - 1) < 1): + romToUse = roms[0] + + elif ((int(sys.argv[1]) - 1) > len(roms)): + romToUse = roms[len(roms) - 1] + + else: + romToUse = roms[int(sys.argv[1]) - 1] + except: + romToUse = roms[0] + + # No commandline args, select rom using user input + else: + + print(str(len(roms))+" roms found, please select one by pressing 1-"+str(len(roms))) + + count = 1 + for list in range(len(roms)): + print(str(count)+". "+roms[list]) + count += 1 + + while(1): + try: + selection = int(input()) + except: + print("Bad input. Try again with the number keys.") + continue + + if (selection < 1 or selection > len(roms)): + print("Bad input. Try again.") + continue + + else: break + + romToUse = roms[selection - 1] + + else: + romToUse = roms[0] + + match checkChecksum(romToUse).name: + case Checksums.OOT_PAL_GC: + xmlVer = "GC_NMQ_PAL_F" + case Checksums.OOT_PAL_GC_DBG1: + xmlVer = "GC_MQ_D" + case _: # default case + xmlVer = "GC_NMQ_D" if (os.path.exists("Extract")): shutil.rmtree("Extract") - BuildOTR("..\\soh\\assets\\xml\\" + xmlVer + "\\") + BuildOTR("..\\soh\\assets\\xml\\" + xmlVer + "\\", romToUse) if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/README.md b/README.md index a002eee8a..e9e7b9070 100644 --- a/README.md +++ b/README.md @@ -55,20 +55,22 @@ Official Discord: https://discord.com/invite/BtBmd55HVH 2. Install [Visual Studio 2022 Community Edition](https://visualstudio.microsoft.com/vs/community/) 2b. In the Visual Studio Installer, install `MSVC v142 - VS 2019 C++`. 4. Clone the Ship of Harkinian repository. - 5. Place `oot debug` rom (not Master Quest) in the `soh` folder named `baserom_original_non_mq`. - 6. Launch `soh/fixbaserom.py`. - 7. Launch `soh/extract_baserom.py`. - 8. Copy the `baserom` folder from the `soh` folder into the `OTRExporter` folder. - 9. Run `OTRExporter/OTRExporter.sln`. - 10. Switch the solution to `Release x64`. - 11. Build the solution. - 12. Launching `OTRExporter/extract_assets.py` will generate an `oot.otr` archive file in `OTRExporter/oot.otr`. - 13. Run `soh/soh.sln` - 14. Switch the solution to `Release x86`. - 15. Build the solution. - 16. Copy the `OTRExporter/oot.otr` archive file to `soh/Release`. - 17. Launch `soh.exe`. + 5. Place one or more [compatible](#compatible-roms) roms in the `OTRExporter` directory with namings of your choice. + 6. Run `OTRExporter/OTRExporter.sln`. + 7. Switch the solution to `Release x64`. + 8. Build the solution. + 9. Launching `OTRExporter/extract_assets.py` will generate an `oot.otr` archive file in `OTRExporter/oot.otr`. + 10. Run `soh/soh.sln` + 11. Switch the solution to `Release x86`. + 12. Build the solution. + 13. Copy the `OTRExporter/oot.otr` archive file to `soh/Release`. + 14. Launch `soh.exe`. +## Compatible Roms +``` +OOT_PAL_GC checksum 0x09465AC3 +OOT_PAL_GC_DBG1 checksum 0x871E1C92 (debug non-master quest) +``` ## Troubleshooting The Exporter - Affirm that you have an `/assets` folder filled with XMLs in the same directory as OTRGui.exe - Affirm that `zapd.exe` exists in the `/assets/extractor` folder From a36243f95ff990279848c29dc243ff31c8707c2d Mon Sep 17 00:00:00 2001 From: GaryOderNichts <12049776+GaryOderNichts@users.noreply.github.com> Date: Mon, 18 Apr 2022 21:03:20 +0200 Subject: [PATCH 46/83] Fix shift for G_LOADTILE --- OTRExporter/OTRExporter/DisplayListExporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OTRExporter/OTRExporter/DisplayListExporter.cpp b/OTRExporter/OTRExporter/DisplayListExporter.cpp index dafa8eb72..4e68d8f13 100644 --- a/OTRExporter/OTRExporter/DisplayListExporter.cpp +++ b/OTRExporter/OTRExporter/DisplayListExporter.cpp @@ -667,7 +667,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina { int sss = (data & 0x00FFF00000000000) >> 44; int ttt = (data & 0x00000FFF00000000) >> 32; - int i = (data & 0x000000000F000000) >> 16; + int i = (data & 0x000000000F000000) >> 24; int uuu = (data & 0x0000000000FFF000) >> 12; int vvv= (data & 0x0000000000000FFF); From 0ec9fc2ecf46a1337ebac519b0a33f07d502d7c5 Mon Sep 17 00:00:00 2001 From: Sirius902 <10891979+Sirius902@users.noreply.github.com> Date: Wed, 20 Apr 2022 02:13:51 -0700 Subject: [PATCH 47/83] Fix OpenGL framebuffer index (#195) --- libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp index 5373f8799..e19e9538c 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp @@ -646,7 +646,7 @@ static int gfx_opengl_create_framebuffer() { framebuffers[i].clrbuf_msaa = clrbuf_msaa; framebuffers[i].rbo = rbo; - return fbo; + return i; } static void gfx_opengl_update_framebuffer_parameters(int fb_id, uint32_t width, uint32_t height, uint32_t msaa_level, bool opengl_invert_y, bool render_target, bool has_depth_buffer, bool can_extract_depth) { From f66178772dae4a296ae38fae54fdff97cd9c5869 Mon Sep 17 00:00:00 2001 From: Thomas Achatz <30968528+shadeRed@users.noreply.github.com> Date: Thu, 21 Apr 2022 17:33:05 -0500 Subject: [PATCH 48/83] Dynamic Wallet Rupee Icon Color (#123) * dynamic rupee rgb * dynamic_wallet_icon cvar * update blue rgb * update blue rgb to match rando * refactor * Update z_parameter.c * update rupeeWalletColors dimensions --- libultraship/libultraship/GameSettings.cpp | 4 ++++ libultraship/libultraship/GameSettings.h | 1 + libultraship/libultraship/SohImGuiImpl.cpp | 5 +++++ soh/src/code/z_parameter.c | 20 ++++++++++++++++++-- 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/libultraship/libultraship/GameSettings.cpp b/libultraship/libultraship/GameSettings.cpp index 1b8d473b2..1d510c7cd 100644 --- a/libultraship/libultraship/GameSettings.cpp +++ b/libultraship/libultraship/GameSettings.cpp @@ -58,6 +58,9 @@ namespace Game { Settings.enhancements.animated_pause_menu = stob(Conf[EnhancementSection]["animated_pause_menu"]); CVar_SetS32("gPauseLiveLink", Settings.enhancements.animated_pause_menu); + Settings.enhancements.dynamic_wallet_icon = stob(Conf[EnhancementSection]["dynamic_wallet_icon"]); + CVar_SetS32(const_cast("gDynamicWalletIcon"), Settings.enhancements.dynamic_wallet_icon); + Settings.enhancements.minimal_ui = stob(Conf[EnhancementSection]["minimal_ui"]); CVar_SetS32("gMinimalUI", Settings.enhancements.minimal_ui); @@ -154,6 +157,7 @@ namespace Game { Conf[EnhancementSection]["fast_text"] = std::to_string(Settings.enhancements.fast_text); Conf[EnhancementSection]["disable_lod"] = std::to_string(Settings.enhancements.disable_lod); Conf[EnhancementSection]["animated_pause_menu"] = std::to_string(Settings.enhancements.animated_pause_menu); + Conf[EnhancementSection]["dynamic_wallet_icon"] = std::to_string(Settings.enhancements.dynamic_wallet_icon); Conf[EnhancementSection]["minimal_ui"] = std::to_string(Settings.enhancements.minimal_ui); Conf[EnhancementSection]["mm_bunny_hood"] = std::to_string(Settings.enhancements.mm_bunny_hood); diff --git a/libultraship/libultraship/GameSettings.h b/libultraship/libultraship/GameSettings.h index fe6087494..18f978386 100644 --- a/libultraship/libultraship/GameSettings.h +++ b/libultraship/libultraship/GameSettings.h @@ -23,6 +23,7 @@ struct SoHConfigType { bool fast_text = false; bool disable_lod = false; bool animated_pause_menu = false; + bool dynamic_wallet_icon = false; bool minimal_ui = false; bool mm_bunny_hood = false; } enhancements; diff --git a/libultraship/libultraship/SohImGuiImpl.cpp b/libultraship/libultraship/SohImGuiImpl.cpp index 860720433..93343b8dd 100644 --- a/libultraship/libultraship/SohImGuiImpl.cpp +++ b/libultraship/libultraship/SohImGuiImpl.cpp @@ -425,6 +425,11 @@ namespace SohImGui { needs_save = true; } + if (ImGui::Checkbox("Dynamic Wallet Icon", &Game::Settings.enhancements.dynamic_wallet_icon)) { + CVar_SetS32(const_cast("gDynamicWalletIcon"), Game::Settings.enhancements.dynamic_wallet_icon); + needs_save = true; + } + ImGui::EndMenu(); } diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index dc96ba133..edc4348b9 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -3129,6 +3129,14 @@ void Interface_Draw(GlobalContext* globalCtx) { }; static s16 rupeeDigitsFirst[] = { 1, 0, 0 }; static s16 rupeeDigitsCount[] = { 2, 3, 3 }; + + // courtesy of https://github.com/TestRunnerSRL/OoT-Randomizer/blob/Dev/ASM/c/hud_colors.c + static s16 rupeeWalletColors[3][3] = { + { 0xC8, 0xFF, 0x64 }, // Base Wallet (Green) + { 0x82, 0x82, 0xFF }, // Adult's Wallet (Blue) + { 0xFF, 0x64, 0x64 }, // Giant's Wallet (Red) + }; + static s16 spoilingItemEntrances[] = { 0x01AD, 0x0153, 0x0153 }; static f32 D_80125B54[] = { -40.0f, -35.0f }; // unused static s16 D_80125B5C[] = { 91, 91 }; // unused @@ -3171,7 +3179,15 @@ void Interface_Draw(GlobalContext* globalCtx) { if (fullUi) { // Rupee Icon - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 200, 255, 100, interfaceCtx->magicAlpha); + s16* rColor; + + if (CVar_GetS32("gDynamicWalletIcon", 0)) { + rColor = &rupeeWalletColors[CUR_UPG_VALUE(UPG_WALLET)]; + } else { + rColor = &rupeeWalletColors[0]; + } + + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, rColor[0], rColor[1], rColor[2], interfaceCtx->magicAlpha); gDPSetEnvColor(OVERLAY_DISP++, 0, 80, 0, 255); OVERLAY_DISP = Gfx_TextureIA8(OVERLAY_DISP, gRupeeCounterIconTex, 16, 16, OTRGetRectDimensionFromLeftEdge(26), 206, 16, 16, 1 << 10, 1 << 10); @@ -3269,7 +3285,7 @@ void Interface_Draw(GlobalContext* globalCtx) { Gfx_TextureI8(OVERLAY_DISP, ((u8*)digitTextures[interfaceCtx->counterDigits[svar2]]), 8, 16, OTRGetRectDimensionFromLeftEdge(svar3), 206, 8, 16, 1 << 10, 1 << 10); } - } + } else { // Make sure item counts have black backgrounds gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 0, 0, interfaceCtx->magicAlpha); From f5a3d3c4bf2523ddf46a9895aab49b225a2b0784 Mon Sep 17 00:00:00 2001 From: Rozelette Date: Thu, 21 Apr 2022 17:36:21 -0500 Subject: [PATCH 49/83] Invalidate texture cache when loading dungeon maps (fixes #21) (#168) * Invalidate texture cache when loading dungeon maps (fixes #21) * Adjust point of dungeon map invalidation to account for constant updates each frame --- soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c | 1 - soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_map_PAL.c | 4 ++++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c index 52019dcb2..2003a8b14 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c @@ -595,7 +595,6 @@ void KaleidoScope_DrawEquipment(GlobalContext* globalCtx) { gSPInvalidateTexCache(POLY_KAL_DISP++, pauseCtx->iconItemSegment); //gSPInvalidateTexCache(POLY_KAL_DISP++, pauseCtx->iconItem24Segment); gSPInvalidateTexCache(POLY_KAL_DISP++, pauseCtx->nameSegment); - gSPInvalidateTexCache(POLY_KAL_DISP++, globalCtx->interfaceCtx.mapSegment); //gSPSegment(POLY_KAL_DISP++, 0x07, pauseCtx->playerSegment); gSPSegment(POLY_KAL_DISP++, 0x08, pauseCtx->iconItemSegment); diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_map_PAL.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_map_PAL.c index 022fdd41d..bd5277286 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_map_PAL.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_map_PAL.c @@ -332,6 +332,10 @@ void KaleidoScope_DrawDungeonMap(GlobalContext* globalCtx, GraphicsContext* gfxC gSPVertex(POLY_KAL_DISP++, &pauseCtx->mapPageVtx[60], 8, 0); + // The dungeon map textures are recreated each frame, so always invalidate them + gSPInvalidateTexCache(POLY_KAL_DISP++, interfaceCtx->mapSegment); + gSPInvalidateTexCache(POLY_KAL_DISP++, interfaceCtx->mapSegment + 0x800); + gDPLoadTextureBlock_4b(POLY_KAL_DISP++, interfaceCtx->mapSegment, G_IM_FMT_CI, 48, 85, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); From ffeb2afcb758ecb024dc4af2ebcb6ac528ae3bdb Mon Sep 17 00:00:00 2001 From: Ada <60364512+GreatArgorath@users.noreply.github.com> Date: Thu, 21 Apr 2022 23:38:56 +0100 Subject: [PATCH 50/83] Changes fast text option to skip text, and makes text speed adjustable via a slider (#173) * Adds fast text option Changes previous "fast text" option to "skip text", and adds a new "fast text" option, which makes text appear 5 times faster. * Fixes magic numbers * Changes text speed to a slider (unfinished) Got most of the code working, but only works upon reloading the game, unsure of how to fix this. * Makes text speed adjustable via a slider * Cleans up changes to z_message_PAL.c --- libultraship/libultraship/GameSettings.cpp | 10 +++++++--- libultraship/libultraship/GameSettings.h | 3 ++- libultraship/libultraship/SohImGuiImpl.cpp | 10 ++++++++-- soh/src/code/z_message_PAL.c | 14 +++++++------- 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/libultraship/libultraship/GameSettings.cpp b/libultraship/libultraship/GameSettings.cpp index 1d510c7cd..f396b8f36 100644 --- a/libultraship/libultraship/GameSettings.cpp +++ b/libultraship/libultraship/GameSettings.cpp @@ -49,8 +49,11 @@ namespace Game { Settings.debug.n64mode = stob(Conf[ConfSection]["n64_mode"]); // Enhancements - Settings.enhancements.fast_text = stob(Conf[EnhancementSection]["fast_text"]); - CVar_SetS32("gFastText", Settings.enhancements.fast_text); + Settings.enhancements.skip_text = stob(Conf[EnhancementSection]["skip_text"]); + CVar_SetS32("gSkipText", Settings.enhancements.skip_text); + + Settings.enhancements.text_speed = Ship::stoi(Conf[EnhancementSection]["text_speed"]); + CVar_SetS32("gTextSpeed", Settings.enhancements.text_speed); Settings.enhancements.disable_lod = stob(Conf[EnhancementSection]["disable_lod"]); CVar_SetS32("gDisableLOD", Settings.enhancements.disable_lod); @@ -154,7 +157,8 @@ namespace Game { Conf[AudioSection]["fanfare"] = std::to_string(Settings.audio.fanfare); // Enhancements - Conf[EnhancementSection]["fast_text"] = std::to_string(Settings.enhancements.fast_text); + Conf[EnhancementSection]["skip_text"] = std::to_string(Settings.enhancements.skip_text); + Conf[EnhancementSection]["text_speed"] = std::to_string(Settings.enhancements.text_speed); Conf[EnhancementSection]["disable_lod"] = std::to_string(Settings.enhancements.disable_lod); Conf[EnhancementSection]["animated_pause_menu"] = std::to_string(Settings.enhancements.animated_pause_menu); Conf[EnhancementSection]["dynamic_wallet_icon"] = std::to_string(Settings.enhancements.dynamic_wallet_icon); diff --git a/libultraship/libultraship/GameSettings.h b/libultraship/libultraship/GameSettings.h index 18f978386..1b371fa7e 100644 --- a/libultraship/libultraship/GameSettings.h +++ b/libultraship/libultraship/GameSettings.h @@ -20,7 +20,8 @@ struct SoHConfigType { // Enhancements struct { - bool fast_text = false; + int text_speed = 1; + bool skip_text = false; bool disable_lod = false; bool animated_pause_menu = false; bool dynamic_wallet_icon = false; diff --git a/libultraship/libultraship/SohImGuiImpl.cpp b/libultraship/libultraship/SohImGuiImpl.cpp index 93343b8dd..7eca28ede 100644 --- a/libultraship/libultraship/SohImGuiImpl.cpp +++ b/libultraship/libultraship/SohImGuiImpl.cpp @@ -395,8 +395,14 @@ namespace SohImGui { ImGui::Text("Gameplay"); ImGui::Separator(); - if (ImGui::Checkbox("Fast Text", &Game::Settings.enhancements.fast_text)) { - CVar_SetS32("gFastText", Game::Settings.enhancements.fast_text); + ImGui::Text("Text Speed", Game::Settings.enhancements.text_speed); + if (ImGui::SliderInt("##TEXTSPEED", &Game::Settings.enhancements.text_speed, 1, 5)) { + CVar_SetS32("gTextSpeed", Game::Settings.enhancements.text_speed); + needs_save = true; + } + + if (ImGui::Checkbox("Skip Text", &Game::Settings.enhancements.skip_text)) { + CVar_SetS32("gSkipText", Game::Settings.enhancements.skip_text); needs_save = true; } diff --git a/soh/src/code/z_message_PAL.c b/soh/src/code/z_message_PAL.c index 43b0fcc12..a767ede79 100644 --- a/soh/src/code/z_message_PAL.c +++ b/soh/src/code/z_message_PAL.c @@ -166,7 +166,7 @@ void Message_UpdateOcarinaGame(GlobalContext* globalCtx) { u8 Message_ShouldAdvance(GlobalContext* globalCtx) { Input* input = &globalCtx->state.input[0]; - bool isB_Held = CVar_GetS32("gFastText", 0) != 0 ? CHECK_BTN_ALL(input->cur.button, BTN_B) + bool isB_Held = CVar_GetS32("gSkipText", 0) != 0 ? CHECK_BTN_ALL(input->cur.button, BTN_B) : CHECK_BTN_ALL(input->press.button, BTN_B); if (CHECK_BTN_ALL(input->press.button, BTN_A) || isB_Held || CHECK_BTN_ALL(input->press.button, BTN_CUP)) { @@ -178,7 +178,7 @@ u8 Message_ShouldAdvance(GlobalContext* globalCtx) { u8 Message_ShouldAdvanceSilent(GlobalContext* globalCtx) { Input* input = &globalCtx->state.input[0]; - bool isB_Held = CVar_GetS32("gFastText", 0) != 0 ? CHECK_BTN_ALL(input->cur.button, BTN_B) + bool isB_Held = CVar_GetS32("gSkipText", 0) != 0 ? CHECK_BTN_ALL(input->cur.button, BTN_B) : CHECK_BTN_ALL(input->press.button, BTN_B); return CHECK_BTN_ALL(input->press.button, BTN_A) || isB_Held || CHECK_BTN_ALL(input->press.button, BTN_CUP); @@ -951,7 +951,7 @@ void Message_DrawText(GlobalContext* globalCtx, Gfx** gfxP) { } } i = j - 1; - msgCtx->textDrawPos = i + 1; + msgCtx->textDrawPos = i + CVar_GetS32("gTextSpeed", 1); if (character) {} } @@ -1061,7 +1061,7 @@ void Message_DrawText(GlobalContext* globalCtx, Gfx** gfxP) { msgCtx->textDelay = msgCtx->msgBufDecoded[++i]; break; case MESSAGE_UNSKIPPABLE: - msgCtx->textUnskippable = CVar_GetS32("gFastText", 0) != 1; + msgCtx->textUnskippable = CVar_GetS32("gSkipText", 0) != 1; break; case MESSAGE_TWO_CHOICE: msgCtx->textboxEndType = TEXTBOX_ENDTYPE_2_CHOICE; @@ -1144,7 +1144,7 @@ void Message_DrawText(GlobalContext* globalCtx, Gfx** gfxP) { } } if (msgCtx->textDelayTimer == 0) { - msgCtx->textDrawPos = i + 1; + msgCtx->textDrawPos = i + CVar_GetS32("gTextSpeed", 1); msgCtx->textDelayTimer = msgCtx->textDelay; } else { msgCtx->textDelayTimer--; @@ -2026,7 +2026,7 @@ void Message_DrawMain(GlobalContext* globalCtx, Gfx** p) { gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0); - bool isB_Held = CVar_GetS32("gFastText", 0) != 0 ? CHECK_BTN_ALL(globalCtx->state.input[0].cur.button, BTN_B) + bool isB_Held = CVar_GetS32("gSkipText", 0) != 0 ? CHECK_BTN_ALL(globalCtx->state.input[0].cur.button, BTN_B) : CHECK_BTN_ALL(globalCtx->state.input[0].press.button, BTN_B); switch (msgCtx->msgMode) { @@ -3067,7 +3067,7 @@ void Message_Update(GlobalContext* globalCtx) { return; } - bool isB_Held = CVar_GetS32("gFastText", 0) != 0 ? CHECK_BTN_ALL(input->cur.button, BTN_B) && !sTextboxSkipped + bool isB_Held = CVar_GetS32("gSkipText", 0) != 0 ? CHECK_BTN_ALL(input->cur.button, BTN_B) && !sTextboxSkipped : CHECK_BTN_ALL(input->press.button, BTN_B); switch (msgCtx->msgMode) { From f65486d82dfece3b305697e0fd258cdfaa9c6252 Mon Sep 17 00:00:00 2001 From: Ralphie Morell Date: Thu, 21 Apr 2022 18:39:39 -0400 Subject: [PATCH 51/83] Cheats Menu expansion (#176) * Added extra cheats; compacted cheats menu * fixed flag oversight --- .gitignore | 402 +++++++++++++++++++++ libultraship/libultraship/GameSettings.cpp | 12 + libultraship/libultraship/GameSettings.h | 4 + libultraship/libultraship/SohImGuiImpl.cpp | 54 ++- soh/src/code/game.c | 31 ++ 5 files changed, 488 insertions(+), 15 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..fafae443d --- /dev/null +++ b/.gitignore @@ -0,0 +1,402 @@ +# Cache files +__pycache__/ +.pyc +.DS_Store + +# Text editor remnants +.vscode/ +.vs/ +.idea/ +CMakeLists.txt +cmake-build-debug +venv/ + +# Project-specific ignores +build/ +expected/ +notes/ +baserom/ +docs/doxygen/ +*.elf +*.sra +*.z64 +*.n64 +*.v64 +*.map +*.dump +out.txt + +# Tool artifacts +tools/mipspro7.2_compiler/ +tools/overlayhelpers/batchdisasm/output/* +tools/overlayhelpers/batchdisasm/output2/* +tools/overlayhelpers/batchdisasm/mipsdisasm/* +tools/disasm/output/* +tools/asmsplitter/asm/* +tools/asmsplitter/c/* +ctx.c +tools/*dSYM/ +graphs/ + +# Assets +*.png +*.jpg +*.mdli +*.anmi +*.obj +*.mtl +*.fbx +!*_custom* +.extracted-assets.json + +# Docs +!docs/tutorial/ + +# Per-user configuration +.python-version + + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ +**/Properties/launchSettings.json + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +*.out +*.o +*.d +lib/libgfxd/libgfxd.a +ExporterTest/ExporterTest.a +ZAPDUtils/ZAPDUtils.a +.vscode/ +build/ +ZAPDUtils/build/ +ZAPD/BuildInfo.h + +DebugObj/* +ReleaseObj/* \ No newline at end of file diff --git a/libultraship/libultraship/GameSettings.cpp b/libultraship/libultraship/GameSettings.cpp index f396b8f36..5f19d3c4d 100644 --- a/libultraship/libultraship/GameSettings.cpp +++ b/libultraship/libultraship/GameSettings.cpp @@ -124,6 +124,9 @@ namespace Game { Settings.cheats.infinite_magic = stob(Conf[CheatSection]["infinite_magic"]); CVar_SetS32("gInfiniteMagic", Settings.cheats.infinite_magic); + Settings.cheats.infinite_nayru = stob(Conf[CheatSection]["infinite_nayru"]); + CVar_SetS32("gInfiniteNayru", Settings.cheats.infinite_nayru); + Settings.cheats.no_clip = stob(Conf[CheatSection]["no_clip"]); CVar_SetS32("gNoClip", Settings.cheats.no_clip); @@ -136,6 +139,15 @@ namespace Game { Settings.cheats.super_tunic = stob(Conf[CheatSection]["super_tunic"]); CVar_SetS32("gSuperTunic", Settings.cheats.super_tunic); + Settings.cheats.ez_isg = stob(Conf[CheatSection]["ez_isg"]); + CVar_SetS32("gEzISG", Settings.cheats.ez_isg); + + Settings.cheats.no_restrict_item = stob(Conf[CheatSection]["no_restrict_item"]); + CVar_SetS32("gNoRestrictItems", Settings.cheats.no_restrict_item); + + Settings.cheats.freeze_time = stob(Conf[CheatSection]["freeze_time"]); + CVar_SetS32("gFreezeTime", Settings.cheats.freeze_time); + UpdateAudio(); } diff --git a/libultraship/libultraship/GameSettings.h b/libultraship/libultraship/GameSettings.h index 1b371fa7e..33e0c8b3d 100644 --- a/libultraship/libultraship/GameSettings.h +++ b/libultraship/libultraship/GameSettings.h @@ -49,10 +49,14 @@ struct SoHConfigType { bool infinite_health = false; bool infinite_ammo = false; bool infinite_magic = false; + bool infinite_nayru = false; bool no_clip = false; bool climb_everything = false; bool moon_jump_on_l = false; bool super_tunic = false; + bool ez_isg = false; + bool no_restrict_item = false; + bool freeze_time = false; } cheats; // Graphics diff --git a/libultraship/libultraship/SohImGuiImpl.cpp b/libultraship/libultraship/SohImGuiImpl.cpp index 7eca28ede..7355d16a2 100644 --- a/libultraship/libultraship/SohImGuiImpl.cpp +++ b/libultraship/libultraship/SohImGuiImpl.cpp @@ -460,24 +460,33 @@ namespace SohImGui { } if (ImGui::BeginMenu("Cheats")) { - if (ImGui::Checkbox("Infinite Money", &Game::Settings.cheats.infinite_money)) { - CVar_SetS32("gInfiniteMoney", Game::Settings.cheats.infinite_money); - needs_save = true; - } + if (ImGui::BeginMenu("Infinite...")) { + if (ImGui::Checkbox("Money", &Game::Settings.cheats.infinite_money)) { + CVar_SetS32("gInfiniteMoney", Game::Settings.cheats.infinite_money); + needs_save = true; + } - if (ImGui::Checkbox("Infinite Health", &Game::Settings.cheats.infinite_health)) { - CVar_SetS32("gInfiniteHealth", Game::Settings.cheats.infinite_health); - needs_save = true; - } + if (ImGui::Checkbox("Health", &Game::Settings.cheats.infinite_health)) { + CVar_SetS32("gInfiniteHealth", Game::Settings.cheats.infinite_health); + needs_save = true; + } - if (ImGui::Checkbox("Infinite Ammo", &Game::Settings.cheats.infinite_ammo)) { - CVar_SetS32("gInfiniteAmmo", Game::Settings.cheats.infinite_ammo); - needs_save = true; - } + if (ImGui::Checkbox("Ammo", &Game::Settings.cheats.infinite_ammo)) { + CVar_SetS32("gInfiniteAmmo", Game::Settings.cheats.infinite_ammo); + needs_save = true; + } - if (ImGui::Checkbox("Infinite Magic", &Game::Settings.cheats.infinite_magic)) { - CVar_SetS32("gInfiniteMagic", Game::Settings.cheats.infinite_magic); - needs_save = true; + if (ImGui::Checkbox("Magic", &Game::Settings.cheats.infinite_magic)) { + CVar_SetS32("gInfiniteMagic", Game::Settings.cheats.infinite_magic); + needs_save = true; + } + + if (ImGui::Checkbox("Nayru's Love", &Game::Settings.cheats.infinite_nayru)) { + CVar_SetS32("gInfiniteNayru", Game::Settings.cheats.infinite_nayru); + needs_save = true; + } + + ImGui::EndMenu(); } if (ImGui::Checkbox("No Clip", &Game::Settings.cheats.no_clip)) { @@ -500,6 +509,21 @@ namespace SohImGui { needs_save = true; } + if (ImGui::Checkbox("Easy ISG", &Game::Settings.cheats.ez_isg)) { + CVar_SetS32("gEzISG", Game::Settings.cheats.ez_isg); + needs_save = true; + } + + if (ImGui::Checkbox("Unrestricted Items", &Game::Settings.cheats.no_restrict_item)) { + CVar_SetS32("gNoRestrictItems", Game::Settings.cheats.no_restrict_item); + needs_save = true; + } + + if (ImGui::Checkbox("Freeze Time", &Game::Settings.cheats.freeze_time)) { + CVar_SetS32("gFreezeTime", Game::Settings.cheats.freeze_time); + needs_save = true; + } + ImGui::EndMenu(); } diff --git a/soh/src/code/game.c b/soh/src/code/game.c index 9392cbc25..b69537fd8 100644 --- a/soh/src/code/game.c +++ b/soh/src/code/game.c @@ -381,6 +381,11 @@ void GameState_Update(GameState* gameState) { gSaveContext.magic = (gSaveContext.doubleMagic + 1) * 0x30; } } + + // Inf Nayru's Love Timer + if (CVar_GetS32("gInfiniteNayru", 0) != 0) { + gSaveContext.nayrusLoveTimer = 0x44B; + } // Moon Jump On L if (CVar_GetS32("gMoonJumpOnL", 0) != 0) { @@ -393,6 +398,32 @@ void GameState_Update(GameState* gameState) { } } + // Permanent infinite sword glitch (ISG) + if (CVar_GetS32("gEzISG", 0) != 0) { + if (gGlobalCtx) { + Player* player = GET_PLAYER(gGlobalCtx); + player->swordState = 1; + } + } + + // Unrestricted Items + if (CVar_GetS32("gNoRestrictItems", 0) != 0) { + if (gGlobalCtx) { + memset(&gGlobalCtx->interfaceCtx.restrictions, 0, sizeof(gGlobalCtx->interfaceCtx.restrictions)); + } + } + + // Freeze Time + if (CVar_GetS32("gFreezeTime", 0) != 0) { + if (CVar_GetS32("gPrevTime", -1) == -1) { + CVar_SetS32("gPrevTime", gSaveContext.dayTime); + } + + int32_t prevTime = CVar_GetS32("gPrevTime", gSaveContext.dayTime); + gSaveContext.dayTime = prevTime; + } + + gameState->frames++; } From f05d006479217efab7ff37d184b0e71fc971d58a Mon Sep 17 00:00:00 2001 From: Baoulettes Date: Fri, 22 Apr 2022 00:40:22 +0200 Subject: [PATCH 52/83] [MOD]Visual & audio Stone of agony (#177) * Visual / Audio Stone of Agony This add Sound and blinking icon for the item Stone of Agony. Useful for peoples that have issues with rumble anything other person that is also blind or deaf. This is made with these second person in mind, home they will like it :) * Adding bool there Yes I do fiels one by one to be sure * Adding the Cvar register 1 file left :D * Adding the main change in func_80848EF8 And that the last file :) --- libultraship/libultraship/GameSettings.cpp | 5 +++ libultraship/libultraship/GameSettings.h | 2 + soh/soh/Enhancements/bootcommands.c | 1 + .../actors/ovl_player_actor/z_player.c | 37 +++++++++++++++++++ 4 files changed, 45 insertions(+) diff --git a/libultraship/libultraship/GameSettings.cpp b/libultraship/libultraship/GameSettings.cpp index 5f19d3c4d..2ce22d6f9 100644 --- a/libultraship/libultraship/GameSettings.cpp +++ b/libultraship/libultraship/GameSettings.cpp @@ -67,6 +67,9 @@ namespace Game { Settings.enhancements.minimal_ui = stob(Conf[EnhancementSection]["minimal_ui"]); CVar_SetS32("gMinimalUI", Settings.enhancements.minimal_ui); + Settings.enhancements.visualagony = stob(Conf[EnhancementSection]["visualagony"]); + CVar_SetS32("gVisualAgony", Settings.enhancements.visualagony); + Settings.enhancements.mm_bunny_hood = stob(Conf[EnhancementSection]["mm_bunny_hood"]); CVar_SetS32("gMMBunnyHood", Settings.enhancements.mm_bunny_hood); @@ -175,8 +178,10 @@ namespace Game { Conf[EnhancementSection]["animated_pause_menu"] = std::to_string(Settings.enhancements.animated_pause_menu); Conf[EnhancementSection]["dynamic_wallet_icon"] = std::to_string(Settings.enhancements.dynamic_wallet_icon); Conf[EnhancementSection]["minimal_ui"] = std::to_string(Settings.enhancements.minimal_ui); + Conf[EnhancementSection]["visualagony"] = std::to_string(Settings.enhancements.visualagony); Conf[EnhancementSection]["mm_bunny_hood"] = std::to_string(Settings.enhancements.mm_bunny_hood); + // Controllers Conf[ControllerSection]["gyro_sensitivity"] = std::to_string(Settings.controller.gyro_sensitivity); Conf[ControllerSection]["rumble_strength"] = std::to_string(Settings.controller.rumble_strength); diff --git a/libultraship/libultraship/GameSettings.h b/libultraship/libultraship/GameSettings.h index 33e0c8b3d..070bdce38 100644 --- a/libultraship/libultraship/GameSettings.h +++ b/libultraship/libultraship/GameSettings.h @@ -26,7 +26,9 @@ struct SoHConfigType { bool animated_pause_menu = false; bool dynamic_wallet_icon = false; bool minimal_ui = false; + bool visualagony = false; bool mm_bunny_hood = false; + } enhancements; // Controller diff --git a/soh/soh/Enhancements/bootcommands.c b/soh/soh/Enhancements/bootcommands.c index 685593179..c58a11b6b 100644 --- a/soh/soh/Enhancements/bootcommands.c +++ b/soh/soh/Enhancements/bootcommands.c @@ -25,6 +25,7 @@ void BootCommands_Init() CVar_RegisterS32("gDebugEnabled", 0); CVar_RegisterS32("gPauseLiveLink", 0); CVar_RegisterS32("gMinimalUI", 0); + CVar_RegisterS32("gVisualAgony", 0); } //void BootCommands_ParseBootArgs(char* str) diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 734ba015e..5ff08df85 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -10274,8 +10274,45 @@ void func_80848EF8(Player* this) { } this->unk_6A0 += temp; + + /*Prevent it on horse, while jumping and on title screen. + If you fly around no stone of agony for you! */ + if (CVar_GetS32("gVisualAgony", 0) !=0 && !this->stateFlags1) { + int rectLeft = OTRGetRectDimensionFromLeftEdge(26); //Left X Pos + int rectTop = 60; //Top Y Pos + int rectWidth = 24; //Texture Width + int rectHeight = 24; //Texture Heigh + int DefaultIconA= 50; //Default icon alphe (55 on 255) + + OPEN_DISPS(globalCtx->state.gfxCtx, "../z_player.c", 2824); + gDPPipeSync(OVERLAY_DISP++); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, DefaultIconA); + gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); + if (this->unk_6A0 > 4000000.0f) { + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, 255); + } else { + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, DefaultIconA); + } + if (temp == 0 || temp <= 0.1f) { + /*Fail check, it is used to draw off the icon when + link is standing out range but do not refresh unk_6A0. + Also used to make a default value in my case.*/ + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, DefaultIconA); + } + gDPSetEnvColor(OVERLAY_DISP++, 0, 0, 0, 255); + gDPSetOtherMode(OVERLAY_DISP++, G_AD_DISABLE | G_CD_DISABLE | G_CK_NONE | G_TC_FILT | G_TF_POINT | G_TT_IA16 | G_TL_TILE | G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE, G_AC_NONE | G_ZS_PRIM | G_RM_XLU_SURF | G_RM_XLU_SURF2); + gDPLoadTextureBlock(OVERLAY_DISP++, gStoneOfAgonyIconTex, G_IM_FMT_RGBA, G_IM_SIZ_32b, 24, 24, 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); + gDPSetOtherMode(OVERLAY_DISP++, G_AD_DISABLE | G_CD_DISABLE | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_IA16 | G_TL_TILE | G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE, G_AC_NONE | G_ZS_PRIM | G_RM_XLU_SURF | G_RM_XLU_SURF2); + gSPWideTextureRectangle(OVERLAY_DISP++, rectLeft << 2, rectTop << 2, (rectLeft + rectWidth) << 2, (rectTop + rectHeight) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); + CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_player.c", 3500); + } + if (this->unk_6A0 > 4000000.0f) { this->unk_6A0 = 0.0f; + if (CVar_GetS32("gVisualAgony", 0) !=0 && !this->stateFlags1) { + //This audio is placed here and not in previous CVar check to prevent ears ra.. :) + Audio_PlaySoundGeneral(NA_SE_SY_MESSAGE_WOMAN, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E0); + } func_8083264C(this, 120, 20, 10, 0); } } From 8db83099bb6b66bb731bd9850ed40b1fe311b0b2 Mon Sep 17 00:00:00 2001 From: GaryOderNichts <12049776+GaryOderNichts@users.noreply.github.com> Date: Fri, 22 Apr 2022 00:44:33 +0200 Subject: [PATCH 53/83] Fix hardcoded keySegment address (#185) --- soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c b/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c index 91c059bee..54b93277c 100644 --- a/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c +++ b/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c @@ -496,7 +496,7 @@ void EnExItem_DrawMagic(EnExItem* this, GlobalContext* globalCtx, s16 magicIndex } void EnExItem_DrawKey(EnExItem* this, GlobalContext* globalCtx, s32 index) { - static s32 keySegments[] = { 0x0403F140 }; + static void* keySegments[] = { gDropKeySmallTex }; OPEN_DISPS(globalCtx->state.gfxCtx, "../z_en_ex_item.c", 880); From 0ee779f94adbe99c8ff19b04ebe93dddf4f91879 Mon Sep 17 00:00:00 2001 From: Sirius902 <3645979-Sirius902@users.noreply.gitlab.com> Date: Thu, 21 Apr 2022 16:17:27 -0700 Subject: [PATCH 54/83] Make develop compile --- soh/src/overlays/actors/ovl_player_actor/z_player.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 5ff08df85..aa11b6d7e 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -19,6 +19,7 @@ #include "overlays/effects/ovl_Effect_Ss_Fhg_Flash/z_eff_ss_fhg_flash.h" #include "objects/gameplay_keep/gameplay_keep.h" #include "objects/object_link_child/object_link_child.h" +#include "textures/icon_item_24_static/icon_item_24_static.h" typedef struct { /* 0x00 */ u8 itemId; @@ -10265,7 +10266,7 @@ void func_80848C74(GlobalContext* globalCtx, Player* this) { } } -void func_80848EF8(Player* this) { +void func_80848EF8(Player* this, GlobalContext* globalCtx) { if (CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)) { f32 temp = 200000.0f - (this->unk_6A4 * 5.0f); @@ -10584,7 +10585,7 @@ void Player_UpdateCommon(Player* this, GlobalContext* globalCtx, Input* input) { else { this->fallStartHeight = this->actor.world.pos.y; } - func_80848EF8(this); + func_80848EF8(this, globalCtx); } } From b540b7fcfcaca50ddaa42f9018232c8634cfd2fa Mon Sep 17 00:00:00 2001 From: Baoulettes Date: Sun, 24 Apr 2022 16:50:41 +0200 Subject: [PATCH 55/83] Add Enhancement 3D Dropped Items (#144) * Add Enhancement 3D Dropped Items It will change most of dropped item to there 3D models variant, Exclude Rupee from Hyrule Castle (when you are child and in quest to see Zelda.) * Fix z_kaleido_scope_PAL.c L and R button color issues This fix an issue in IF and gDPSetPrimColor for button L & R icon. making it with an else to place the on hover and normal color properly in both button so they both have exact same colour * Fix quite a big logic issue for 3D item drops In short,case logic required to be different with break; old version make it all fucked up with improper values. * Clean Const that was present nor not. * Update z_kaleido_scope_PAL.c * Update z_kaleido_scope_PAL.c --- libultraship/libultraship/GameSettings.cpp | 4 + libultraship/libultraship/GameSettings.h | 1 + libultraship/libultraship/SohImGuiImpl.cpp | 6 + soh/soh/Enhancements/bootcommands.c | 2 + soh/src/code/z_en_item00.c | 326 ++++++++++++++++++--- 5 files changed, 293 insertions(+), 46 deletions(-) diff --git a/libultraship/libultraship/GameSettings.cpp b/libultraship/libultraship/GameSettings.cpp index 2ce22d6f9..c056dec71 100644 --- a/libultraship/libultraship/GameSettings.cpp +++ b/libultraship/libultraship/GameSettings.cpp @@ -73,6 +73,9 @@ namespace Game { Settings.enhancements.mm_bunny_hood = stob(Conf[EnhancementSection]["mm_bunny_hood"]); CVar_SetS32("gMMBunnyHood", Settings.enhancements.mm_bunny_hood); + Settings.enhancements.newdrops = stob(Conf[EnhancementSection]["newdrops"]); + CVar_SetS32("gNewDrops", Settings.enhancements.newdrops); + // Audio Settings.audio.master = Ship::stof(Conf[AudioSection]["master"]); CVar_SetFloat("gGameMasterVolume", Settings.audio.master); @@ -178,6 +181,7 @@ namespace Game { Conf[EnhancementSection]["animated_pause_menu"] = std::to_string(Settings.enhancements.animated_pause_menu); Conf[EnhancementSection]["dynamic_wallet_icon"] = std::to_string(Settings.enhancements.dynamic_wallet_icon); Conf[EnhancementSection]["minimal_ui"] = std::to_string(Settings.enhancements.minimal_ui); + Conf[EnhancementSection]["newdrops"] = std::to_string(Settings.enhancements.newdrops); Conf[EnhancementSection]["visualagony"] = std::to_string(Settings.enhancements.visualagony); Conf[EnhancementSection]["mm_bunny_hood"] = std::to_string(Settings.enhancements.mm_bunny_hood); diff --git a/libultraship/libultraship/GameSettings.h b/libultraship/libultraship/GameSettings.h index 070bdce38..990132f4e 100644 --- a/libultraship/libultraship/GameSettings.h +++ b/libultraship/libultraship/GameSettings.h @@ -26,6 +26,7 @@ struct SoHConfigType { bool animated_pause_menu = false; bool dynamic_wallet_icon = false; bool minimal_ui = false; + bool newdrops = false; bool visualagony = false; bool mm_bunny_hood = false; diff --git a/libultraship/libultraship/SohImGuiImpl.cpp b/libultraship/libultraship/SohImGuiImpl.cpp index 7355d16a2..72a44162e 100644 --- a/libultraship/libultraship/SohImGuiImpl.cpp +++ b/libultraship/libultraship/SohImGuiImpl.cpp @@ -431,8 +431,14 @@ namespace SohImGui { needs_save = true; } + if (ImGui::Checkbox("Enable 3D Dropped items", &Game::Settings.enhancements.newdrops)) { + CVar_SetS32("gNewDrops", Game::Settings.enhancements.newdrops); + needs_save = true; + } + if (ImGui::Checkbox("Dynamic Wallet Icon", &Game::Settings.enhancements.dynamic_wallet_icon)) { CVar_SetS32(const_cast("gDynamicWalletIcon"), Game::Settings.enhancements.dynamic_wallet_icon); + needs_save = true; } diff --git a/soh/soh/Enhancements/bootcommands.c b/soh/soh/Enhancements/bootcommands.c index c58a11b6b..f3ad9aaac 100644 --- a/soh/soh/Enhancements/bootcommands.c +++ b/soh/soh/Enhancements/bootcommands.c @@ -25,7 +25,9 @@ void BootCommands_Init() CVar_RegisterS32("gDebugEnabled", 0); CVar_RegisterS32("gPauseLiveLink", 0); CVar_RegisterS32("gMinimalUI", 0); + CVar_RegisterS32("gNewDrops", 0); CVar_RegisterS32("gVisualAgony", 0); + } //void BootCommands_ParseBootArgs(char* str) diff --git a/soh/src/code/z_en_item00.c b/soh/src/code/z_en_item00.c index 2693c4b0f..d0179a5e1 100644 --- a/soh/src/code/z_en_item00.c +++ b/soh/src/code/z_en_item00.c @@ -5,6 +5,9 @@ #define FLAGS 0 +//Used to force variable to be used in different function, feel free to correct me if you have a better way +static s16 DroppedItemRot = 0; + void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx); void EnItem00_Destroy(Actor* thisx, GlobalContext* globalCtx); void EnItem00_Update(Actor* thisx, GlobalContext* globalCtx); @@ -355,11 +358,34 @@ void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx) { switch (this->actor.params) { case ITEM00_RUPEE_GREEN: + if (CVar_GetS32("gNewDrops", 0) !=0) { + Actor_SetScale(&this->actor, 0.3f); + this->scale = 0.3f; + yOffset = 50.0f; + shadowScale = 0.3f; + this->actor.world.rot.x = 0x4000; + break; + } case ITEM00_RUPEE_BLUE: + if (CVar_GetS32("gNewDrops", 0) !=0) { + Actor_SetScale(&this->actor, 0.3f); + this->scale = 0.3f; + yOffset = 50.0f; + shadowScale = 0.3f; + this->actor.world.rot.x = 0x4000; + } case ITEM00_RUPEE_RED: - Actor_SetScale(&this->actor, 0.015f); - this->scale = 0.015f; - yOffset = 750.0f; + if (CVar_GetS32("gNewDrops", 0) !=0) { + Actor_SetScale(&this->actor, 0.3f); + this->scale = 0.3f; + yOffset = 50.0f; + shadowScale = 0.3f; + this->actor.world.rot.x = 0x4000; + } else { + Actor_SetScale(&this->actor, 0.015f); + this->scale = 0.015f; + yOffset = 750.0f; + } break; case ITEM00_SMALL_KEY: this->unk_158 = 0; @@ -374,10 +400,18 @@ void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx) { this->scale = 0.02f; break; case ITEM00_HEART: - this->actor.home.rot.z = Rand_CenteredFloat(65535.0f); - yOffset = 430.0f; - Actor_SetScale(&this->actor, 0.02f); - this->scale = 0.02f; + if (CVar_GetS32("gNewDrops", 0) !=0) { + this->actor.home.rot.z = Rand_CenteredFloat(65535.0f); + yOffset = 25.0f; + Actor_SetScale(&this->actor, 0.3f); + this->scale = 0.3f; + shadowScale = 0.5f; + } else { + this->actor.home.rot.z = Rand_CenteredFloat(65535.0f); + yOffset = 430.0f; + Actor_SetScale(&this->actor, 0.02f); + this->scale = 0.02f; + } break; case ITEM00_HEART_CONTAINER: yOffset = 430.0f; @@ -386,42 +420,154 @@ void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx) { this->scale = 0.02f; break; case ITEM00_ARROWS_SINGLE: - yOffset = 400.0f; - Actor_SetScale(&this->actor, 0.02f); - this->scale = 0.02f; - break; + if (CVar_GetS32("gNewDrops", 0) !=0) { + Actor_SetScale(&this->actor, 0.2f); + this->scale = 0.2f; + yOffset = 50.0f; + shadowScale = 0.5f; + this->actor.world.rot.x = 0x4000; + } else { + yOffset = 400.0f; + Actor_SetScale(&this->actor, 0.02f); + this->scale = 0.02f; + } + break; case ITEM00_ARROWS_SMALL: + if (CVar_GetS32("gNewDrops", 0) !=0) { + Actor_SetScale(&this->actor, 0.2f); + this->scale = 0.2f; + yOffset = 50.0f; + shadowScale = 0.5f; + this->actor.world.rot.x = 0x4000; + break; + } case ITEM00_ARROWS_MEDIUM: + if (CVar_GetS32("gNewDrops", 0) !=0) { + Actor_SetScale(&this->actor, 0.2f); + this->scale = 0.2f; + yOffset = 50.0f; + shadowScale = 0.5f; + this->actor.world.rot.x = 0x4000; + break; + } case ITEM00_ARROWS_LARGE: - Actor_SetScale(&this->actor, 0.035f); - this->scale = 0.035f; - yOffset = 250.0f; - break; + if (CVar_GetS32("gNewDrops", 0) !=0) { + Actor_SetScale(&this->actor, 0.2f); + this->scale = 0.2f; + yOffset = 50.0f; + shadowScale = 0.5f; + this->actor.world.rot.x = 0x4000; + } else { + Actor_SetScale(&this->actor, 0.035f); + this->scale = 0.035f; + yOffset = 250.0f; + } + break; case ITEM00_BOMBS_A: + if (CVar_GetS32("gNewDrops", 0) !=0) { + Actor_SetScale(&this->actor, 0.2f); + this->scale = 0.2f; + yOffset = 50.0f; + shadowScale = 0.5f; + this->actor.world.rot.x = 0x4000; + break; + } case ITEM00_BOMBS_B: + if (CVar_GetS32("gNewDrops", 0) !=0) { + Actor_SetScale(&this->actor, 0.2f); + this->scale = 0.2f; + yOffset = 50.0f; + shadowScale = 0.5f; + this->actor.world.rot.x = 0x4000; + break; + } case ITEM00_NUTS: + if (CVar_GetS32("gNewDrops", 0) !=0) { + Actor_SetScale(&this->actor, 0.2f); + this->scale = 0.2f; + yOffset = 50.0f; + shadowScale = 0.5f; + this->actor.world.rot.x = 0x4000; + break; + } case ITEM00_STICK: + if (CVar_GetS32("gNewDrops", 0) !=0) { + Actor_SetScale(&this->actor, 0.2f); + this->scale = 0.2f; + yOffset = 50.0f; + shadowScale = 0.5f; + this->actor.world.rot.x = 0x4000; + break; + } case ITEM00_MAGIC_SMALL: + if (CVar_GetS32("gNewDrops", 0) !=0) { + Actor_SetScale(&this->actor, 0.2f); + this->scale = 0.2f; + yOffset = 50.0f; + shadowScale = 0.5f; + this->actor.world.rot.x = 0x4000; + break; + } case ITEM00_SEEDS: + if (CVar_GetS32("gNewDrops", 0) !=0) { + Actor_SetScale(&this->actor, 0.2f); + this->scale = 0.2f; + yOffset = 50.0f; + shadowScale = 0.5f; + this->actor.world.rot.x = 0x4000; + break; + } case ITEM00_BOMBS_SPECIAL: - Actor_SetScale(&this->actor, 0.03f); - this->scale = 0.03f; - yOffset = 320.0f; - break; + if (CVar_GetS32("gNewDrops", 0) !=0) { + Actor_SetScale(&this->actor, 0.2f); + this->scale = 0.2f; + yOffset = 50.0f; + shadowScale = 0.5f; + this->actor.world.rot.x = 0x4000; + } else { + Actor_SetScale(&this->actor, 0.03f); + this->scale = 0.03f; + yOffset = 320.0f; + } + break; case ITEM00_MAGIC_LARGE: - Actor_SetScale(&this->actor, 0.045 - 1e-10); - this->scale = 0.045 - 1e-10; - yOffset = 320.0f; - break; + if (CVar_GetS32("gNewDrops", 0) !=0) { + Actor_SetScale(&this->actor, 0.2f); + this->scale = 0.2f; + yOffset = 50.0f; + shadowScale = 0.5f; + this->actor.world.rot.x = 0x4000; + } else { + Actor_SetScale(&this->actor, 0.045 - 1e-10); + this->scale = 0.045 - 1e-10; + yOffset = 320.0f; + } + break; case ITEM00_RUPEE_ORANGE: - Actor_SetScale(&this->actor, 0.045 - 1e-10); - this->scale = 0.045 - 1e-10; - yOffset = 750.0f; + if (CVar_GetS32("gNewDrops", 0) !=0) { + Actor_SetScale(&this->actor, 0.45f); + this->scale = 0.45f; + yOffset = 50.0f; + shadowScale = 0.3f; + this->actor.world.rot.x = 0x4000; + } else { + Actor_SetScale(&this->actor, 0.045 - 1e-10); + this->scale = 0.045 - 1e-10; + yOffset = 750.0f; + } break; case ITEM00_RUPEE_PURPLE: - Actor_SetScale(&this->actor, 0.03f); - this->scale = 0.03f; - yOffset = 750.0f; + if (CVar_GetS32("gNewDrops", 0) !=0) { + Actor_SetScale(&this->actor, 0.4f); + this->scale = 0.4f; + yOffset = 50.0f; + shadowScale = 0.3f; + this->actor.world.rot.x = 0x4000; + } else { + Actor_SetScale(&this->actor, 0.03f); + this->scale = 0.03f; + yOffset = 750.0f; + } break; case ITEM00_FLEXIBLE: yOffset = 500.0f; @@ -558,6 +704,19 @@ void EnItem00_Destroy(Actor* thisx, GlobalContext* globalCtx) { } void func_8001DFC8(EnItem00* this, GlobalContext* globalCtx) { + + if (CVar_GetS32("gNewDrops", 0) !=0) { //set the rotation system on selected model only :) + if ((this->actor.params == ITEM_RUPEE_GOLD) || (this->actor.params == ITEM_RUPEE_PURPLE) || + (this->actor.params == ITEM00_ARROWS_SINGLE) || (this->actor.params == ITEM00_ARROWS_SMALL) || + (this->actor.params == ITEM00_ARROWS_MEDIUM) || (this->actor.params == ITEM00_ARROWS_LARGE) || + (this->actor.params == ITEM00_BOMBS_A) || (this->actor.params == ITEM00_BOMBS_B) || + (this->actor.params == ITEM00_NUTS) || (this->actor.params == ITEM00_STICK) || + (this->actor.params == ITEM00_MAGIC_SMALL) || (this->actor.params == ITEM00_SEEDS) || + (this->actor.params == ITEM00_MAGIC_LARGE) || (this->actor.params == ITEM00_HEART) || (this->actor.params == ITEM00_BOMBS_SPECIAL)) { + this->actor.shape.rot.y = DroppedItemRot; + } + } + if ((this->actor.params <= ITEM00_RUPEE_RED) || ((this->actor.params == ITEM00_HEART) && (this->unk_15A < 0)) || (this->actor.params == ITEM00_HEART_PIECE)) { this->actor.shape.rot.y += 960; @@ -731,6 +890,10 @@ void EnItem00_Update(Actor* thisx, GlobalContext* globalCtx) { EnItem00* this = (EnItem00*)thisx; s32 pad; + if (CVar_GetS32("gNewDrops", 0) !=0) { //Update 3D Model rotation on frame update :) + DroppedItemRot += 100; + } + if (this->unk_15A > 0) { this->unk_15A--; } @@ -934,15 +1097,35 @@ void EnItem00_Update(Actor* thisx, GlobalContext* globalCtx) { void EnItem00_Draw(Actor* thisx, GlobalContext* globalCtx) { EnItem00* this = (EnItem00*)thisx; f32 mtxScale; - + if (!(this->unk_156 & this->unk_158)) { switch (this->actor.params) { case ITEM00_RUPEE_GREEN: + if (CVar_GetS32("gNewDrops", 0) !=0) { + GetItem_Draw(globalCtx, GID_RUPEE_GREEN); + break; + } case ITEM00_RUPEE_BLUE: + if (CVar_GetS32("gNewDrops", 0) !=0) { + GetItem_Draw(globalCtx, GID_RUPEE_BLUE); + break; + } case ITEM00_RUPEE_RED: + if (CVar_GetS32("gNewDrops", 0) !=0) { + GetItem_Draw(globalCtx, GID_RUPEE_RED); + break; + } case ITEM00_RUPEE_ORANGE: + if (CVar_GetS32("gNewDrops", 0) !=0) { + GetItem_Draw(globalCtx, GID_RUPEE_GOLD); + break; + } case ITEM00_RUPEE_PURPLE: - EnItem00_DrawRupee(this, globalCtx); + if (CVar_GetS32("gNewDrops", 0) !=0) { + GetItem_Draw(globalCtx, GID_RUPEE_PURPLE); + } else { + EnItem00_DrawRupee(this, globalCtx); + } break; case ITEM00_HEART_PIECE: EnItem00_DrawHeartPiece(this, globalCtx); @@ -951,34 +1134,85 @@ void EnItem00_Draw(Actor* thisx, GlobalContext* globalCtx) { EnItem00_DrawHeartContainer(this, globalCtx); break; case ITEM00_HEART: - if (this->unk_15A < 0) { - if (this->unk_15A == -1) { - s8 bankIndex = Object_GetIndex(&globalCtx->objectCtx, OBJECT_GI_HEART); - - if (Object_IsLoaded(&globalCtx->objectCtx, bankIndex)) { - this->actor.objBankIndex = bankIndex; - Actor_SetObjectDependency(globalCtx, &this->actor); - this->unk_15A = -2; - } - } else { - mtxScale = 16.0f; - Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY); - GetItem_Draw(globalCtx, GID_HEART); - } - break; + if (CVar_GetS32("gNewDrops", 0) !=0) { + GetItem_Draw(globalCtx, GID_HEART); + mtxScale = 16.0f; + Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY); + break; + } else { + if (this->unk_15A < 0) { + if (this->unk_15A == -1) { + s8 bankIndex = Object_GetIndex(&globalCtx->objectCtx, OBJECT_GI_HEART); + + if (Object_IsLoaded(&globalCtx->objectCtx, bankIndex)) { + this->actor.objBankIndex = bankIndex; + Actor_SetObjectDependency(globalCtx, &this->actor); + this->unk_15A = -2; + } + } else { + mtxScale = 16.0f; + Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY); + GetItem_Draw(globalCtx, GID_HEART); + } + break; + } } case ITEM00_BOMBS_A: + if (CVar_GetS32("gNewDrops", 0) !=0) { + GetItem_Draw(globalCtx, GID_BOMB); + break; + } case ITEM00_BOMBS_B: + if (CVar_GetS32("gNewDrops", 0) !=0) { + GetItem_Draw(globalCtx, GID_BOMB); + break; + } case ITEM00_BOMBS_SPECIAL: case ITEM00_ARROWS_SINGLE: + if (CVar_GetS32("gNewDrops", 0) !=0) { + GetItem_Draw(globalCtx, GID_ARROWS_SMALL); + break; + } case ITEM00_ARROWS_SMALL: + if (CVar_GetS32("gNewDrops", 0) !=0) { + GetItem_Draw(globalCtx, GID_ARROWS_SMALL); + break; + } case ITEM00_ARROWS_MEDIUM: + if (CVar_GetS32("gNewDrops", 0) !=0) { + GetItem_Draw(globalCtx, GID_ARROWS_MEDIUM); + break; + } case ITEM00_ARROWS_LARGE: + if (CVar_GetS32("gNewDrops", 0) !=0) { + GetItem_Draw(globalCtx, GID_ARROWS_LARGE); + break; + } case ITEM00_NUTS: + if (CVar_GetS32("gNewDrops", 0) !=0) { + GetItem_Draw(globalCtx, GID_NUTS); + break; + } case ITEM00_STICK: + if (CVar_GetS32("gNewDrops", 0) !=0) { + GetItem_Draw(globalCtx, GID_STICK); + break; + } case ITEM00_MAGIC_LARGE: + if (CVar_GetS32("gNewDrops", 0) !=0) { + GetItem_Draw(globalCtx, GID_MAGIC_LARGE); + break; + } case ITEM00_MAGIC_SMALL: + if (CVar_GetS32("gNewDrops", 0) !=0) { + GetItem_Draw(globalCtx, GID_MAGIC_SMALL); + break; + } case ITEM00_SEEDS: + if (CVar_GetS32("gNewDrops", 0) !=0) { + GetItem_Draw(globalCtx, GID_SEEDS); + break; + } case ITEM00_SMALL_KEY: EnItem00_DrawCollectible(this, globalCtx); break; From 6860600648b06778b5ff57e0aab5f2fd48749a1b Mon Sep 17 00:00:00 2001 From: Baoulettes Date: Sun, 24 Apr 2022 16:51:29 +0200 Subject: [PATCH 56/83] Potential fix for Title being over Kaleido. (#162) * Potential fix for Title being over Kaleido. Changing "OVERLAY_DISP" to "POLY_XLU_DISP" seem to fix and do not bring any errors (I did tried scene one by one and walked around in game) It may be no correct but it could point to the right direction if that is not correct. * Update z_actor.c * Update graph.c * Update z64.h * Update macros.h --- soh/include/macros.h | 1 + soh/include/z64.h | 3 +++ soh/src/code/graph.c | 5 +++++ soh/src/code/z_actor.c | 13 +++++++------ 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/soh/include/macros.h b/soh/include/macros.h index 0d86c56c3..8563449b1 100644 --- a/soh/include/macros.h +++ b/soh/include/macros.h @@ -129,6 +129,7 @@ extern GraphicsContext* __gfxCtx; #define WORK_DISP __gfxCtx->work.p #define POLY_OPA_DISP __gfxCtx->polyOpa.p #define POLY_XLU_DISP __gfxCtx->polyXlu.p +#define TITLE_CARD_DISP __gfxCtx->titlecard.p #define POLY_KAL_DISP __gfxCtx->polyKal.p #define OVERLAY_DISP __gfxCtx->overlay.p diff --git a/soh/include/z64.h b/soh/include/z64.h index 24ec79946..92966f239 100644 --- a/soh/include/z64.h +++ b/soh/include/z64.h @@ -83,6 +83,7 @@ typedef struct { /* 0x00000 */ u16 headMagic; // GFXPOOL_HEAD_MAGIC /* 0x00008 */ Gfx polyOpaBuffer[0x2FC0]; /* 0x0BF08 */ Gfx polyXluBuffer[0x1000]; + /* 0xXXXXX */ Gfx titlecardBuffer[0x1000]; /* 0x0BF08 */ Gfx polyKalBuffer[0x1000]; /* 0x0FF08 */ Gfx overlayBuffer[0x800]; /* 0x11F08 */ Gfx workBuffer[0x100]; @@ -130,6 +131,7 @@ typedef struct OSScTask { typedef struct GraphicsContext { /* 0x0000 */ Gfx* polyOpaBuffer; // Pointer to "Zelda 0" /* 0x0004 */ Gfx* polyXluBuffer; // Pointer to "Zelda 1" + /* 0xXXX */ Gfx* titlecardBuffer; // Pointer to "Paris" /* 0xXXX */ Gfx* polyKalBuffer; // Pointer to "Rome" /* 0x0008 */ char unk_008[0x08]; // Unused, could this be pointers to "Zelda 2" / "Zelda 3" /* 0x0010 */ Gfx* overlayBuffer; // Pointer to "Zelda 4" @@ -149,6 +151,7 @@ typedef struct GraphicsContext { /* 0x02A8 */ TwoHeadGfxArena overlay; // "Zelda 4" /* 0x02B8 */ TwoHeadGfxArena polyOpa; // "Zelda 0" /* 0x02C8 */ TwoHeadGfxArena polyXlu; // "Zelda 1" + /* 0x0XXX */ TwoHeadGfxArena titlecard; // When in Paris... /* 0x0XXX */ TwoHeadGfxArena polyKal; // When in Rome... /* 0x02D8 */ u32 gfxPoolIdx; /* 0x02DC */ u16* curFrameBuffer; diff --git a/soh/src/code/graph.c b/soh/src/code/graph.c index 34283f342..3a1719731 100644 --- a/soh/src/code/graph.c +++ b/soh/src/code/graph.c @@ -95,12 +95,14 @@ void Graph_InitTHGA(GraphicsContext* gfxCtx) { pool->tailMagic = GFXPOOL_TAIL_MAGIC; THGA_Ct(&gfxCtx->polyOpa, pool->polyOpaBuffer, sizeof(pool->polyOpaBuffer)); THGA_Ct(&gfxCtx->polyXlu, pool->polyXluBuffer, sizeof(pool->polyXluBuffer)); + THGA_Ct(&gfxCtx->titlecard, pool->titlecardBuffer, sizeof(pool->titlecardBuffer)); THGA_Ct(&gfxCtx->polyKal, pool->polyKalBuffer, sizeof(pool->polyKalBuffer)); THGA_Ct(&gfxCtx->overlay, pool->overlayBuffer, sizeof(pool->overlayBuffer)); THGA_Ct(&gfxCtx->work, pool->workBuffer, sizeof(pool->workBuffer)); gfxCtx->polyOpaBuffer = pool->polyOpaBuffer; gfxCtx->polyXluBuffer = pool->polyXluBuffer; + gfxCtx->titlecardBuffer = pool->titlecardBuffer; gfxCtx->polyKalBuffer = pool->polyKalBuffer; gfxCtx->overlayBuffer = pool->overlayBuffer; gfxCtx->workBuffer = pool->workBuffer; @@ -274,6 +276,7 @@ void Graph_Update(GraphicsContext* gfxCtx, GameState* gameState) { gDPNoOpString(WORK_DISP++, "WORK_DISP é–‹å§‹", 0); gDPNoOpString(POLY_OPA_DISP++, "POLY_OPA_DISP é–‹å§‹", 0); gDPNoOpString(POLY_XLU_DISP++, "POLY_XLU_DISP é–‹å§‹", 0); + gDPNoOpString(TITLE_CARD_DISP++, "TITLE_CARD_DISP é–‹å§‹", 0);//unsure if needed gDPNoOpString(OVERLAY_DISP++, "OVERLAY_DISP é–‹å§‹", 0); CLOSE_DISPS(gfxCtx, "../graph.c", 975); @@ -286,6 +289,7 @@ void Graph_Update(GraphicsContext* gfxCtx, GameState* gameState) { gDPNoOpString(WORK_DISP++, "WORK_DISP 終了", 0); gDPNoOpString(POLY_OPA_DISP++, "POLY_OPA_DISP 終了", 0); gDPNoOpString(POLY_XLU_DISP++, "POLY_XLU_DISP 終了", 0); + gDPNoOpString(TITLE_CARD_DISP++, "TITLE_CARD_DISP 終了", 0); gDPNoOpString(OVERLAY_DISP++, "OVERLAY_DISP 終了", 0); CLOSE_DISPS(gfxCtx, "../graph.c", 996); @@ -294,6 +298,7 @@ void Graph_Update(GraphicsContext* gfxCtx, GameState* gameState) { gSPBranchList(WORK_DISP++, gfxCtx->polyOpaBuffer); gSPBranchList(POLY_OPA_DISP++, gfxCtx->polyXluBuffer); + gSPBranchList(POLY_XLU_DISP++, gfxCtx->titlecardBuffer); gSPBranchList(POLY_XLU_DISP++, gfxCtx->polyKalBuffer); gSPBranchList(POLY_KAL_DISP++, gfxCtx->overlayBuffer); gDPPipeSync(OVERLAY_DISP++); diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c index fee697055..eee9d8882 100644 --- a/soh/src/code/z_actor.c +++ b/soh/src/code/z_actor.c @@ -992,29 +992,30 @@ void TitleCard_Draw(GlobalContext* globalCtx, TitleCardContext* titleCtx) { height = (width * height > 0x1000) ? 0x1000 / width : height; titleSecondY = titleY + (height * 4); - OVERLAY_DISP = func_80093808(OVERLAY_DISP); + //TITLE_CARD_DISP Goes over POLY_XLU_DISP but under POLY_KAL_DISP + TITLE_CARD_DISP = func_80093808(TITLE_CARD_DISP); - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, (u8)titleCtx->intensity, (u8)titleCtx->intensity, (u8)titleCtx->intensity, + gDPSetPrimColor(TITLE_CARD_DISP++, 0, 0, (u8)titleCtx->intensity, (u8)titleCtx->intensity, (u8)titleCtx->intensity, (u8)titleCtx->alpha); - gDPLoadTextureBlock(OVERLAY_DISP++, (uintptr_t)titleCtx->texture + textureLanguageOffset, G_IM_FMT_IA, + gDPLoadTextureBlock(TITLE_CARD_DISP++, (uintptr_t)titleCtx->texture + textureLanguageOffset, G_IM_FMT_IA, G_IM_SIZ_8b, width, 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(OVERLAY_DISP++, titleX, titleY, ((doubleWidth * 2) + titleX) - 4, titleY + (height * 4) - 1, + gSPTextureRectangle(TITLE_CARD_DISP++, titleX, titleY, ((doubleWidth * 2) + titleX) - 4, titleY + (height * 4) - 1, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); height = titleCtx->height - height; // If texture is bigger than 0x1000, display the rest if (height > 0) { - gDPLoadTextureBlock(OVERLAY_DISP++, (uintptr_t)titleCtx->texture + textureLanguageOffset + 0x1000, + gDPLoadTextureBlock(TITLE_CARD_DISP++, (uintptr_t)titleCtx->texture + textureLanguageOffset + 0x1000, G_IM_FMT_IA, G_IM_SIZ_8b, width, 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(OVERLAY_DISP++, titleX, titleSecondY, ((doubleWidth * 2) + titleX) - 4, + gSPTextureRectangle(TITLE_CARD_DISP++, titleX, titleSecondY, ((doubleWidth * 2) + titleX) - 4, titleSecondY + (height * 4) - 1, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); } From 7d26b322f580e29855dba20a71670cbcfbfd423f Mon Sep 17 00:00:00 2001 From: Baoulettes Date: Sun, 24 Apr 2022 16:51:54 +0200 Subject: [PATCH 57/83] Fix minimap update in dungeon (#171) Thanks to Rozelette for this method ! --- soh/src/code/z_map_exp.c | 1 + 1 file changed, 1 insertion(+) diff --git a/soh/src/code/z_map_exp.c b/soh/src/code/z_map_exp.c index 734209770..cfef800c9 100644 --- a/soh/src/code/z_map_exp.c +++ b/soh/src/code/z_map_exp.c @@ -664,6 +664,7 @@ void Minimap_Draw(GlobalContext* globalCtx) { if (CHECK_DUNGEON_ITEM(DUNGEON_MAP, mapIndex)) { gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 100, 255, 255, interfaceCtx->minimapAlpha); + gSPInvalidateTexCache(OVERLAY_DISP++, interfaceCtx->mapSegment); gDPLoadTextureBlock_4b(OVERLAY_DISP++, interfaceCtx->mapSegment, G_IM_FMT_I, 96, 85, 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); From 73ede53447c842c1c48d82a6636d9288490dbf71 Mon Sep 17 00:00:00 2001 From: sholdee <102821812+sholdee@users.noreply.github.com> Date: Sun, 24 Apr 2022 09:58:29 -0500 Subject: [PATCH 58/83] Fix build dates (#194) * Delete build.c * Update build.c * Update soh.vcxproj --- soh/build.c | 8 -------- soh/soh.vcxproj | 5 +---- soh/src/boot/build.c | 4 ---- 3 files changed, 1 insertion(+), 16 deletions(-) delete mode 100644 soh/build.c diff --git a/soh/build.c b/soh/build.c deleted file mode 100644 index f3f9bdae6..000000000 --- a/soh/build.c +++ /dev/null @@ -1,8 +0,0 @@ -const char gBuildVersion[] = "DECKARD ALFA (1.0.0)"; -const char gBuildTeam[] = "github.com/harbourmasters"; -#ifdef __TIMESTAMP__ -const char gBuildDate[] = __TIMESTAMP__; -#else -const char gBuildDate[] = __DATE__ " " __TIME__; -#endif -const char gBuildMakeOption[] = ""; diff --git a/soh/soh.vcxproj b/soh/soh.vcxproj index adf205f14..d35dd18b3 100644 --- a/soh/soh.vcxproj +++ b/soh/soh.vcxproj @@ -112,9 +112,6 @@ true true - - copy /b $(ProjectDir)src\boot\build.c +,, - @@ -1407,4 +1404,4 @@ - \ No newline at end of file + diff --git a/soh/src/boot/build.c b/soh/src/boot/build.c index f3f9bdae6..f60380467 100644 --- a/soh/src/boot/build.c +++ b/soh/src/boot/build.c @@ -1,8 +1,4 @@ const char gBuildVersion[] = "DECKARD ALFA (1.0.0)"; const char gBuildTeam[] = "github.com/harbourmasters"; -#ifdef __TIMESTAMP__ -const char gBuildDate[] = __TIMESTAMP__; -#else const char gBuildDate[] = __DATE__ " " __TIME__; -#endif const char gBuildMakeOption[] = ""; From 5a40f394944a69c1fa16d993eee3a2ae8752cd04 Mon Sep 17 00:00:00 2001 From: Ada <60364512+GreatArgorath@users.noreply.github.com> Date: Sun, 24 Apr 2022 15:59:41 +0100 Subject: [PATCH 59/83] Adds checkbox for visual stone of agony (#200) --- libultraship/libultraship/SohImGuiImpl.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libultraship/libultraship/SohImGuiImpl.cpp b/libultraship/libultraship/SohImGuiImpl.cpp index 72a44162e..3556177d7 100644 --- a/libultraship/libultraship/SohImGuiImpl.cpp +++ b/libultraship/libultraship/SohImGuiImpl.cpp @@ -416,6 +416,11 @@ namespace SohImGui { needs_save = true; } + if (ImGui::Checkbox("Visual Stone of Agony", &Game::Settings.enhancements.visualagony)) { + CVar_SetS32("gVisualAgony", Game::Settings.enhancements.visualagony); + needs_save = true; + } + ImGui::Text("Graphics"); ImGui::Separator(); From eb97186f73187089d6b5134f639b5942b2295cbd Mon Sep 17 00:00:00 2001 From: MegaMech Date: Sun, 24 Apr 2022 09:00:14 -0600 Subject: [PATCH 60/83] readme build instructions split (#201) * Create BUILDING.md * Update README.md * Update README.md * Update README.md --- BUILDING.md | 22 ++++++++++++++++++++++ README.md | 20 +------------------- 2 files changed, 23 insertions(+), 19 deletions(-) create mode 100644 BUILDING.md diff --git a/BUILDING.md b/BUILDING.md new file mode 100644 index 000000000..82c26bff4 --- /dev/null +++ b/BUILDING.md @@ -0,0 +1,22 @@ +# Building Ship of Harkinian + + 1. Install [Python](https://www.python.org/ftp/python/3.10.2/python-3.10.2-amd64.exe) + 2. Install [Visual Studio 2022 Community Edition](https://visualstudio.microsoft.com/vs/community/) + 2b. In the Visual Studio Installer, install `MSVC v142 - VS 2019 C++`. + 4. Clone the Ship of Harkinian repository. + 5. Place one or more [compatible](#compatible-roms) roms in the `OTRExporter` directory with namings of your choice. + 6. Run `OTRExporter/OTRExporter.sln`. + 7. Switch the solution to `Release x64`. + 8. Build the solution. + 9. Launching `OTRExporter/extract_assets.py` will generate an `oot.otr` archive file in `OTRExporter/oot.otr`. + 10. Run `soh/soh.sln` + 11. Switch the solution to `Release x86`. + 12. Build the solution. + 13. Copy the `OTRExporter/oot.otr` archive file to `soh/Release`. + 14. Launch `soh.exe`. + +## Compatible Roms +``` +OOT_PAL_GC checksum 0x09465AC3 +OOT_PAL_GC_DBG1 checksum 0x871E1C92 (debug non-master quest) +``` diff --git a/README.md b/README.md index e9e7b9070..65a6b90e0 100644 --- a/README.md +++ b/README.md @@ -51,26 +51,8 @@ Official Discord: https://discord.com/invite/BtBmd55HVH ## Building The Ship of Harkinian - 1. Install [Python](https://www.python.org/ftp/python/3.10.2/python-3.10.2-amd64.exe) - 2. Install [Visual Studio 2022 Community Edition](https://visualstudio.microsoft.com/vs/community/) - 2b. In the Visual Studio Installer, install `MSVC v142 - VS 2019 C++`. - 4. Clone the Ship of Harkinian repository. - 5. Place one or more [compatible](#compatible-roms) roms in the `OTRExporter` directory with namings of your choice. - 6. Run `OTRExporter/OTRExporter.sln`. - 7. Switch the solution to `Release x64`. - 8. Build the solution. - 9. Launching `OTRExporter/extract_assets.py` will generate an `oot.otr` archive file in `OTRExporter/oot.otr`. - 10. Run `soh/soh.sln` - 11. Switch the solution to `Release x86`. - 12. Build the solution. - 13. Copy the `OTRExporter/oot.otr` archive file to `soh/Release`. - 14. Launch `soh.exe`. +Refer to the [building instructions](https://github.com/HarbourMasters/Shipwright/BUILDING.md) to compile SoH. -## Compatible Roms -``` -OOT_PAL_GC checksum 0x09465AC3 -OOT_PAL_GC_DBG1 checksum 0x871E1C92 (debug non-master quest) -``` ## Troubleshooting The Exporter - Affirm that you have an `/assets` folder filled with XMLs in the same directory as OTRGui.exe - Affirm that `zapd.exe` exists in the `/assets/extractor` folder From 17858fb67c6aee7813e3e4310785803815b9ff08 Mon Sep 17 00:00:00 2001 From: Baoulettes Date: Sun, 24 Apr 2022 17:00:46 +0200 Subject: [PATCH 61/83] Fix languages Zone name on Kaleido (#203) This fix town/village and zone on maps in Kaleido menu. --- .../misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c index 9db5399a4..3c023105f 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c @@ -3177,15 +3177,9 @@ void KaleidoScope_Update(GlobalContext* globalCtx) if (gSaveContext.language == LANGUAGE_ENG) { memcpy(pauseCtx->nameSegment + 0x400, ResourceMgr_LoadTexByName(mapNameTextures[36 + gSaveContext.worldMapArea]), 0xA00); } else if (gSaveContext.language == LANGUAGE_GER) { - DmaMgr_SendRequest1(pauseCtx->nameSegment + 0x400, - (uintptr_t)_map_name_staticSegmentRomStart + - (((void)0, gSaveContext.worldMapArea) * 0xA00) + 0x16C00, - 0xA00, "../z_kaleido_scope_PAL.c", 3780); + memcpy(pauseCtx->nameSegment + 0x400, ResourceMgr_LoadTexByName(mapNameTextures[59 + gSaveContext.worldMapArea]), 0xA00); } else { - DmaMgr_SendRequest1(pauseCtx->nameSegment + 0x400, - (uintptr_t)_map_name_staticSegmentRomStart + - (((void)0, gSaveContext.worldMapArea) * 0xA00) + 0x24800, - 0xA00, "../z_kaleido_scope_PAL.c", 3784); + memcpy(pauseCtx->nameSegment + 0x400, ResourceMgr_LoadTexByName(mapNameTextures[81 + gSaveContext.worldMapArea]), 0xA00); } } // OTRTODO - player on pause From bb3227a7c20c0a6ddbac285a4047ccab3e29b1ea Mon Sep 17 00:00:00 2001 From: Ada <60364512+GreatArgorath@users.noreply.github.com> Date: Sun, 24 Apr 2022 16:02:15 +0100 Subject: [PATCH 62/83] Fixes default text speed (#207) * Fixes text speed * Adds text speed default to ConfigFile.cpp + removes workaround --- libultraship/libultraship/ConfigFile.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libultraship/libultraship/ConfigFile.cpp b/libultraship/libultraship/ConfigFile.cpp index 1b4952139..2e9a8cc94 100644 --- a/libultraship/libultraship/ConfigFile.cpp +++ b/libultraship/libultraship/ConfigFile.cpp @@ -2,6 +2,7 @@ #include "spdlog/spdlog.h" #include "GlobalCtx2.h" #include "Window.h" +#include "GameSettings.h" namespace Ship { ConfigFile::ConfigFile(std::shared_ptr Context, const std::string& Path) : Context(Context), Path(Path), File(Path.c_str()) { @@ -149,6 +150,8 @@ namespace Ship { (*this)["KEYBOARD CONTROLLER BINDING 4"][STR(BTN_STICKDOWN)] = std::to_string(0x01F); (*this)["KEYBOARD CONTROLLER BINDING 4"][STR(BTN_STICKUP)] = std::to_string(0x011); + (*this)["ENHANCEMENT SETTINGS"]["TEXT_SPEED"] = "1"; + (*this)["SDL CONTROLLER 1"]["GUID"] = ""; (*this)["SDL CONTROLLER 2"]["GUID"] = ""; (*this)["SDL CONTROLLER 3"]["GUID"] = ""; From 576842ac74f2e18c2ad75d345be68ea446ad2d2f Mon Sep 17 00:00:00 2001 From: Ada <60364512+GreatArgorath@users.noreply.github.com> Date: Sun, 24 Apr 2022 16:03:25 +0100 Subject: [PATCH 63/83] Makes text speed slider consistent with the rest of the UI (#208) --- libultraship/libultraship/SohImGuiImpl.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libultraship/libultraship/SohImGuiImpl.cpp b/libultraship/libultraship/SohImGuiImpl.cpp index 3556177d7..7af532a09 100644 --- a/libultraship/libultraship/SohImGuiImpl.cpp +++ b/libultraship/libultraship/SohImGuiImpl.cpp @@ -395,8 +395,8 @@ namespace SohImGui { ImGui::Text("Gameplay"); ImGui::Separator(); - ImGui::Text("Text Speed", Game::Settings.enhancements.text_speed); - if (ImGui::SliderInt("##TEXTSPEED", &Game::Settings.enhancements.text_speed, 1, 5)) { + ImGui::Text("Text Speed: %dx", Game::Settings.enhancements.text_speed); + if (ImGui::SliderInt("##TEXTSPEED", &Game::Settings.enhancements.text_speed, 1, 5, "")) { CVar_SetS32("gTextSpeed", Game::Settings.enhancements.text_speed); needs_save = true; } From ffa4a111484cd95cb20985e8f378e59af30eb5dc Mon Sep 17 00:00:00 2001 From: Ada <60364512+GreatArgorath@users.noreply.github.com> Date: Sun, 24 Apr 2022 16:04:06 +0100 Subject: [PATCH 64/83] Fixes visual bug in shops when above 2x text speed (#211) --- soh/src/code/z_message_PAL.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/src/code/z_message_PAL.c b/soh/src/code/z_message_PAL.c index a767ede79..4780044a6 100644 --- a/soh/src/code/z_message_PAL.c +++ b/soh/src/code/z_message_PAL.c @@ -1144,7 +1144,7 @@ void Message_DrawText(GlobalContext* globalCtx, Gfx** gfxP) { } } if (msgCtx->textDelayTimer == 0) { - msgCtx->textDrawPos = i + CVar_GetS32("gTextSpeed", 1); + msgCtx->textDrawPos = i + 1; msgCtx->textDelayTimer = msgCtx->textDelay; } else { msgCtx->textDelayTimer--; From 1f3a6b928f4025c12d3ec72263bb6a6bb39c45af Mon Sep 17 00:00:00 2001 From: KiritoDev <36680385+KiritoDv@users.noreply.github.com> Date: Mon, 25 Apr 2022 15:19:00 -0500 Subject: [PATCH 65/83] Moved grayscale effect to the gpu and replaced some texture loads (#221) --- .../Lib/Fast3D/U64/PR/ultra64/gbi.h | 17 +++++- .../libultraship/Lib/Fast3D/gfx_cc.cpp | 1 + libultraship/libultraship/Lib/Fast3D/gfx_cc.h | 10 ++-- .../Lib/Fast3D/gfx_direct3d11.cpp | 9 ++- .../Lib/Fast3D/gfx_direct3d_common.cpp | 15 +++++ .../libultraship/Lib/Fast3D/gfx_opengl.cpp | 24 ++++++++ .../libultraship/Lib/Fast3D/gfx_pc.cpp | 55 ++++++++++--------- soh/include/variables.h | 1 + soh/src/code/z_fbdemo_circle.c | 2 - .../overlays/actors/ovl_En_Part/z_en_part.c | 12 ++-- .../ovl_file_choose/z_file_choose.c | 9 +-- .../overlays/gamestates/ovl_title/z_title.c | 2 +- .../ovl_kaleido_scope/z_kaleido_equipment.c | 11 +++- .../misc/ovl_kaleido_scope/z_kaleido_item.c | 9 ++- .../ovl_kaleido_scope/z_kaleido_scope_PAL.c | 8 --- 15 files changed, 126 insertions(+), 59 deletions(-) diff --git a/libultraship/libultraship/Lib/Fast3D/U64/PR/ultra64/gbi.h b/libultraship/libultraship/Lib/Fast3D/U64/PR/ultra64/gbi.h index 83cc9a55c..3b4b8f7d8 100644 --- a/libultraship/libultraship/Lib/Fast3D/U64/PR/ultra64/gbi.h +++ b/libultraship/libultraship/Lib/Fast3D/U64/PR/ultra64/gbi.h @@ -170,6 +170,12 @@ #define G_TEXRECT_WIDE 0x37 #define G_FILLWIDERECT 0x38 +/* GFX Effects */ + +// RDP Cmd +#define G_SETGRAYSCALE 0x39 +#define G_SETINTENSITY 0x40 + /* * The following commands are the "generated" RDP commands; the user * never sees them, the RSP microcode generates them. @@ -2821,6 +2827,14 @@ _DW({ \ _g->words.w1 = 0; \ } +#define gsSPGrayscale(pkt, state) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_SETGRAYSCALE, 24, 8); \ + _g->words.w1 = state; \ +} + #ifdef F3DEX_GBI_2 /* * One gSPGeometryMode(pkt,c,s) GBI is equal to these two GBIs. @@ -3161,6 +3175,8 @@ _DW({ \ (_SHIFTL(r, 24, 8) | _SHIFTL(g, 16, 8) | \ _SHIFTL(b, 8, 8) | _SHIFTL(a, 0, 8))) +#define gsDPSetGrayscaleColor(pkt, r, g, b) \ + DPRGBColor(pkt, G_SETINTENSITY, r, g, b, 255) #define gDPSetEnvColor(pkt, r, g, b, a) \ DPRGBColor(pkt, G_SETENVCOLOR, r,g,b,a) #define gsDPSetEnvColor(r, g, b, a) \ @@ -3177,7 +3193,6 @@ _DW({ \ gDPSetColor(pkt, G_SETFILLCOLOR, (d)) #define gsDPSetFillColor(d) \ gsDPSetColor(G_SETFILLCOLOR, (d)) - #define gDPSetPrimDepth(pkt, z, dz) \ gDPSetColor(pkt, G_SETPRIMDEPTH, \ _SHIFTL(z, 16, 16) | _SHIFTL(dz, 0, 16)) diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_cc.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_cc.cpp index 25ae8b324..c92a05b8b 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_cc.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_cc.cpp @@ -16,6 +16,7 @@ void gfx_cc_get_features(uint64_t shader_id0, uint32_t shader_id1, struct CCFeat cc_features->opt_2cyc = (shader_id1 & SHADER_OPT_2CYC) != 0; cc_features->opt_alpha_threshold = (shader_id1 & SHADER_OPT_ALPHA_THRESHOLD) != 0; cc_features->opt_invisible = (shader_id1 & SHADER_OPT_INVISIBLE) != 0; + cc_features->opt_grayscale = (shader_id1 & SHADER_OPT_GRAYSCALE) != 0; cc_features->clamp[0][0] = (shader_id1 & SHADER_OPT_TEXEL0_CLAMP_S); cc_features->clamp[0][1] = (shader_id1 & SHADER_OPT_TEXEL0_CLAMP_T); diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_cc.h b/libultraship/libultraship/Lib/Fast3D/gfx_cc.h index 7bf415f84..f0a9f2eca 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_cc.h +++ b/libultraship/libultraship/Lib/Fast3D/gfx_cc.h @@ -39,10 +39,11 @@ enum { #define SHADER_OPT_2CYC (1 << 4) #define SHADER_OPT_ALPHA_THRESHOLD (1 << 5) #define SHADER_OPT_INVISIBLE (1 << 6) -#define SHADER_OPT_TEXEL0_CLAMP_S (1 << 7) -#define SHADER_OPT_TEXEL0_CLAMP_T (1 << 8) -#define SHADER_OPT_TEXEL1_CLAMP_S (1 << 9) -#define SHADER_OPT_TEXEL1_CLAMP_T (1 << 10) +#define SHADER_OPT_GRAYSCALE (1 << 7) +#define SHADER_OPT_TEXEL0_CLAMP_S (1 << 8) +#define SHADER_OPT_TEXEL0_CLAMP_T (1 << 9) +#define SHADER_OPT_TEXEL1_CLAMP_S (1 << 10) +#define SHADER_OPT_TEXEL1_CLAMP_T (1 << 11) #define CC_SHADER_OPT_POS 56 struct CCFeatures { @@ -54,6 +55,7 @@ struct CCFeatures { bool opt_2cyc; bool opt_alpha_threshold; bool opt_invisible; + bool opt_grayscale; bool used_textures[2]; bool clamp[2][2]; int num_inputs; diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_direct3d11.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_direct3d11.cpp index 04d777e7e..cea82e09e 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_direct3d11.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_direct3d11.cpp @@ -88,13 +88,13 @@ struct ShaderProgramD3D11 { static struct { HMODULE d3d11_module; PFN_D3D11_CREATE_DEVICE D3D11CreateDevice; - + HMODULE d3dcompiler_module; pD3DCompile D3DCompile; - + D3D_FEATURE_LEVEL feature_level; uint32_t msaa_num_quality_levels[D3D11_MAX_MULTISAMPLE_SAMPLE_COUNT]; - + ComPtr device; ComPtr swap_chain; ComPtr context; @@ -448,6 +448,9 @@ static struct ShaderProgram *gfx_d3d11_create_and_load_new_shader(uint64_t shade if (cc_features.opt_fog) { ied[ied_index++] = { "FOG", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }; } + if (cc_features.opt_grayscale) { + ied[ied_index++] = { "GRAYSCALE", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }; + } for (unsigned int i = 0; i < cc_features.num_inputs; i++) { DXGI_FORMAT format = cc_features.opt_alpha ? DXGI_FORMAT_R32G32B32A32_FLOAT : DXGI_FORMAT_R32G32B32_FLOAT; ied[ied_index++] = { "INPUT", i, format, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }; diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_direct3d_common.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_direct3d_common.cpp index f778812d1..8df273be7 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_direct3d_common.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_direct3d_common.cpp @@ -138,6 +138,10 @@ void gfx_direct3d_common_build_shader(char buf[4096], size_t& len, size_t& num_f append_line(buf, &len, " float4 fog : FOG;"); num_floats += 4; } + if (cc_features.opt_grayscale) { + append_line(buf, &len, " float4 grayscale : GRAYSCALE;"); + num_floats += 4; + } for (int i = 0; i < cc_features.num_inputs; i++) { len += sprintf(buf + len, " float%d input%d : INPUT%d;\r\n", cc_features.opt_alpha ? 4 : 3, i + 1, i); num_floats += cc_features.opt_alpha ? 4 : 3; @@ -208,6 +212,9 @@ void gfx_direct3d_common_build_shader(char buf[4096], size_t& len, size_t& num_f if (cc_features.opt_fog) { append_str(buf, &len, ", float4 fog : FOG"); } + if (cc_features.opt_grayscale) { + append_str(buf, &len, ", float4 grayscale : GRAYSCALE"); + } for (int i = 0; i < cc_features.num_inputs; i++) { len += sprintf(buf + len, ", float%d input%d : INPUT%d", cc_features.opt_alpha ? 4 : 3, i + 1, i); } @@ -228,6 +235,9 @@ void gfx_direct3d_common_build_shader(char buf[4096], size_t& len, size_t& num_f if (cc_features.opt_fog) { append_line(buf, &len, " result.fog = fog;"); } + if (cc_features.opt_grayscale) { + append_line(buf, &len, " result.grayscale = grayscale;"); + } for (int i = 0; i < cc_features.num_inputs; i++) { len += sprintf(buf + len, " result.input%d = input%d;\r\n", i + 1, i + 1); } @@ -298,6 +308,11 @@ void gfx_direct3d_common_build_shader(char buf[4096], size_t& len, size_t& num_f } } + if (cc_features.opt_grayscale) { + append_line(buf, &len, "float intensity = (texel.r + texel.g + texel.b) / 3.0;"); + append_line(buf, &len, "texel.rgb = input.grayscale.rgb * intensity;"); + } + if (cc_features.opt_alpha && cc_features.opt_noise) { append_line(buf, &len, " float2 coords = screenSpace.xy * noise_scale;"); append_line(buf, &len, " texel.a *= round(saturate(random(float3(floor(coords), noise_frame)) + texel.a - 0.5));"); diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp index e19e9538c..808b0a558 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp @@ -238,6 +238,13 @@ static struct ShaderProgram* gfx_opengl_create_and_load_new_shader(uint64_t shad append_line(vs_buf, &vs_len, "varying vec4 vFog;"); num_floats += 4; } + + if (cc_features.opt_grayscale) { + append_line(vs_buf, &vs_len, "attribute vec4 aGrayscaleColor;"); + append_line(vs_buf, &vs_len, "varying vec4 vGrayscaleColor;"); + num_floats += 4; + } + for (int i = 0; i < cc_features.num_inputs; i++) { vs_len += sprintf(vs_buf + vs_len, "attribute vec%d aInput%d;\n", cc_features.opt_alpha ? 4 : 3, i + 1); vs_len += sprintf(vs_buf + vs_len, "varying vec%d vInput%d;\n", cc_features.opt_alpha ? 4 : 3, i + 1); @@ -257,6 +264,9 @@ static struct ShaderProgram* gfx_opengl_create_and_load_new_shader(uint64_t shad if (cc_features.opt_fog) { append_line(vs_buf, &vs_len, "vFog = aFog;"); } + if (cc_features.opt_grayscale) { + append_line(vs_buf, &vs_len, "vGrayscaleColor = aGrayscaleColor;"); + } for (int i = 0; i < cc_features.num_inputs; i++) { vs_len += sprintf(vs_buf + vs_len, "vInput%d = aInput%d;\n", i + 1, i + 1); } @@ -279,6 +289,9 @@ static struct ShaderProgram* gfx_opengl_create_and_load_new_shader(uint64_t shad if (cc_features.opt_fog) { append_line(fs_buf, &fs_len, "varying vec4 vFog;"); } + if (cc_features.opt_grayscale) { + append_line(fs_buf, &fs_len, "varying vec4 vGrayscaleColor;"); + } for (int i = 0; i < cc_features.num_inputs; i++) { fs_len += sprintf(fs_buf + fs_len, "varying vec%d vInput%d;\n", cc_features.opt_alpha ? 4 : 3, i + 1); } @@ -355,6 +368,11 @@ static struct ShaderProgram* gfx_opengl_create_and_load_new_shader(uint64_t shad append_line(fs_buf, &fs_len, "texel.a *= floor(clamp(random(vec3(floor(gl_FragCoord.xy * noise_scale), float(frame_count))) + texel.a, 0.0, 1.0));"); } + if (cc_features.opt_grayscale) { + append_line(fs_buf, &fs_len, "float intensity = (texel.r + texel.g + texel.b) / 3.0;"); + append_line(fs_buf, &fs_len, "texel.rgb = vGrayscaleColor.rgb * intensity;"); + } + if (cc_features.opt_alpha) { if (cc_features.opt_alpha_threshold) { append_line(fs_buf, &fs_len, "if (texel.a < 8.0 / 256.0) discard;"); @@ -446,6 +464,12 @@ static struct ShaderProgram* gfx_opengl_create_and_load_new_shader(uint64_t shad ++cnt; } + if (cc_features.opt_grayscale) { + prg->attrib_locations[cnt] = glGetAttribLocation(shader_program, "aGrayscaleColor"); + prg->attrib_sizes[cnt] = 4; + ++cnt; + } + for (int i = 0; i < cc_features.num_inputs; i++) { char name[16]; sprintf(name, "aInput%d", i + 1); diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp index 5918ccaf7..130d07b73 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp @@ -155,9 +155,10 @@ static struct RDP { uint32_t other_mode_l, other_mode_h; uint64_t combine_mode; + bool grayscale; uint8_t prim_lod_fraction; - struct RGBA env_color, prim_color, fog_color, fill_color; + struct RGBA env_color, prim_color, fog_color, fill_color, grayscale_color; struct XYWidthHeight viewport, scissor; bool viewport_or_scissor_changed; void *z_buf_address; @@ -825,22 +826,6 @@ static void import_texture(int i, int tile) { uint8_t siz = rdp.texture_tile[tile].siz; uint32_t tmem_index = rdp.texture_tile[tile].tmem_index; - // OTRTODO: Move it to a function to be faster - // ModInternal::bindHook(LOOKUP_TEXTURE); - // ModInternal::initBindHook(8, - // HOOK_PARAMETER("gfx_api", gfx_get_current_rendering_api()), - // HOOK_PARAMETER("path", rdp.loaded_texture[tmem_index].otr_path), - // HOOK_PARAMETER("node", &rendering_state.textures[i]), - // HOOK_PARAMETER("fmt", &fmt), - // HOOK_PARAMETER("siz", &siz), - // HOOK_PARAMETER("tile", &i), - // HOOK_PARAMETER("palette", &rdp.texture_tile[tile].palette), - // HOOK_PARAMETER("addr", const_cast(rdp.loaded_texture[tmem_index].addr)) - // ); - // - // if (ModInternal::callBindHook(0)) - // return; - if (gfx_texture_cache_lookup(i, tile)) { return; @@ -1220,7 +1205,6 @@ static void gfx_sp_tri1(uint8_t vtx1_idx, uint8_t vtx2_idx, uint8_t vtx3_idx, bo uint64_t cc_id = rdp.combine_mode; - //bool use_alpha = (rdp.other_mode_l & (3 << 18)) == G_BL_1MA || (rdp.other_mode_l & (3 << 16)) == G_BL_1MA; bool use_alpha = (rdp.other_mode_l & (3 << 20)) == (G_BL_CLR_MEM << 20) && (rdp.other_mode_l & (3 << 16)) == (G_BL_1MA << 16); bool use_fog = (rdp.other_mode_l >> 30) == G_BL_CLR_FOG; bool texture_edge = (rdp.other_mode_l & CVG_X_ALPHA) == CVG_X_ALPHA; @@ -1228,6 +1212,7 @@ static void gfx_sp_tri1(uint8_t vtx1_idx, uint8_t vtx2_idx, uint8_t vtx3_idx, bo bool use_2cyc = (rdp.other_mode_h & (3U << G_MDSFT_CYCLETYPE)) == G_CYC_2CYCLE; bool alpha_threshold = (rdp.other_mode_l & (3U << G_MDSFT_ALPHACOMPARE)) == G_AC_THRESHOLD; bool invisible = (rdp.other_mode_l & (3 << 24)) == (G_BL_0 << 24) && (rdp.other_mode_l & (3 << 20)) == (G_BL_CLR_MEM << 20); + bool use_grayscale = rdp.grayscale; if (texture_edge) { use_alpha = true; @@ -1240,12 +1225,13 @@ static void gfx_sp_tri1(uint8_t vtx1_idx, uint8_t vtx2_idx, uint8_t vtx3_idx, bo if (use_2cyc) cc_id |= (uint64_t)SHADER_OPT_2CYC << CC_SHADER_OPT_POS; if (alpha_threshold) cc_id |= (uint64_t)SHADER_OPT_ALPHA_THRESHOLD << CC_SHADER_OPT_POS; if (invisible) cc_id |= (uint64_t)SHADER_OPT_INVISIBLE << CC_SHADER_OPT_POS; + if (use_grayscale) cc_id |= (uint64_t)SHADER_OPT_GRAYSCALE << CC_SHADER_OPT_POS; if (!use_alpha) { cc_id &= ~((0xfff << 16) | ((uint64_t)0xfff << 44)); } - struct ColorCombiner* comb = gfx_lookup_or_create_color_combiner(cc_id); + ColorCombiner* comb = gfx_lookup_or_create_color_combiner(cc_id); uint32_t tm = 0; uint32_t tex_width[2], tex_height[2], tex_width2[2], tex_height2[2]; @@ -1407,6 +1393,13 @@ static void gfx_sp_tri1(uint8_t vtx1_idx, uint8_t vtx2_idx, uint8_t vtx3_idx, bo buf_vbo[buf_vbo_len++] = v_arr[i]->color.a / 255.0f; // fog factor (not alpha) } + if (use_grayscale) { + buf_vbo[buf_vbo_len++] = rdp.grayscale_color.r / 255.0f; + buf_vbo[buf_vbo_len++] = rdp.grayscale_color.g / 255.0f; + buf_vbo[buf_vbo_len++] = rdp.grayscale_color.b / 255.0f; + buf_vbo[buf_vbo_len++] = rdp.grayscale_color.a / 255.0f; // Unused + } + for (int j = 0; j < num_inputs; j++) { struct RGBA* color = 0; struct RGBA tmp; @@ -1807,6 +1800,13 @@ static inline uint32_t alpha_comb(uint32_t a, uint32_t b, uint32_t c, uint32_t d return (a & 7) | ((b & 7) << 3) | ((c & 7) << 6) | ((d & 7) << 9); } +static void gfx_dp_set_grayscale_color(uint8_t r, uint8_t g, uint8_t b, uint8_t a) { + rdp.grayscale_color.r = r; + rdp.grayscale_color.g = g; + rdp.grayscale_color.b = b; + rdp.grayscale_color.a = a; +} + static void gfx_dp_set_env_color(uint8_t r, uint8_t g, uint8_t b, uint8_t a) { rdp.env_color.r = r; rdp.env_color.g = g; @@ -2411,8 +2411,6 @@ static void gfx_run_dl(Gfx* cmd) { cmd++; uint64_t hash = ((uint64_t)cmd->words.w0 << 32) + (uint64_t)cmd->words.w1; ResourceMgr_GetNameByCRC(hash, fileName); - - #if _DEBUG && 0 char* tex = ResourceMgr_LoadTexByCRC(hash); ResourceMgr_GetNameByCRC(hash, fileName); @@ -2453,8 +2451,8 @@ static void gfx_run_dl(Gfx* cmd) { gfx_dp_set_texture_image(fmt, size, width, tex, fileName); cmd++; - } break; + } case G_SETFB: { gfx_flush(); @@ -2462,8 +2460,8 @@ static void gfx_run_dl(Gfx* cmd) { active_fb = framebuffers.find(cmd->words.w1); gfx_rapi->start_draw_to_framebuffer(active_fb->first, (float)active_fb->second.applied_height / active_fb->second.orig_height); gfx_rapi->clear_framebuffer(); - } break; + } case G_RESETFB: { gfx_flush(); @@ -2471,7 +2469,6 @@ static void gfx_run_dl(Gfx* cmd) { gfx_rapi->start_draw_to_framebuffer(game_renders_to_framebuffer ? game_framebuffer : 0, (float)gfx_current_dimensions.height / SCREEN_HEIGHT); break; } - break; case G_SETTIMG_FB: { gfx_flush(); @@ -2481,8 +2478,13 @@ static void gfx_run_dl(Gfx* cmd) { //if (texPtr != NULL) //gfx_dp_set_texture_image(C0(21, 3), C0(19, 2), C0(0, 10), texPtr); + break; + } + case G_SETGRAYSCALE: + { + rdp.grayscale = cmd->words.w1; + break; } - break; case G_LOADBLOCK: gfx_dp_load_block(C1(24, 3), C0(12, 12), C0(0, 12), C1(12, 12), C1(0, 12)); break; @@ -2510,6 +2512,9 @@ static void gfx_run_dl(Gfx* cmd) { case G_SETFILLCOLOR: gfx_dp_set_fill_color(cmd->words.w1); break; + case G_SETINTENSITY: + gfx_dp_set_grayscale_color(C1(24, 8), C1(16, 8), C1(8, 8), C1(0, 8)); + break; case G_SETCOMBINE: gfx_dp_set_combine_mode( color_comb(C0(20, 4), C1(28, 4), C0(15, 5), C1(15, 3)), diff --git a/soh/include/variables.h b/soh/include/variables.h index b58166b60..64b8c75c7 100644 --- a/soh/include/variables.h +++ b/soh/include/variables.h @@ -99,6 +99,7 @@ extern "C" extern u32 gGsFlagsMasks[4]; extern u32 gGsFlagsShifts[4]; extern void* gItemIcons[0x82]; + extern u8 gItemAgeReqs[]; extern u8 gItemSlots[56]; extern void (*gSceneCmdHandlers[26])(GlobalContext*, SceneCmd*); extern s16 gLinkObjectIds[2]; diff --git a/soh/src/code/z_fbdemo_circle.c b/soh/src/code/z_fbdemo_circle.c index 630f198d1..b19948737 100644 --- a/soh/src/code/z_fbdemo_circle.c +++ b/soh/src/code/z_fbdemo_circle.c @@ -56,8 +56,6 @@ void TransitionCircle_Start(void* thisx) { break; } - this->texture = ResourceMgr_LoadTexByName(this->texture); - if (this->speed == 0) { this->step = 0x14; } else { diff --git a/soh/src/overlays/actors/ovl_En_Part/z_en_part.c b/soh/src/overlays/actors/ovl_En_Part/z_en_part.c index ec4079887..bdf29aa52 100644 --- a/soh/src/overlays/actors/ovl_En_Part/z_en_part.c +++ b/soh/src/overlays/actors/ovl_En_Part/z_en_part.c @@ -298,13 +298,13 @@ void EnPart_Draw(Actor* thisx, GlobalContext* globalCtx) { gSPSegment(POLY_OPA_DISP++, 0x09, func_80ACEAC0(globalCtx->state.gfxCtx, 225, 205, 115, 25, 20, 0)); gSPSegment(POLY_OPA_DISP++, 0x0A, func_80ACEAC0(globalCtx->state.gfxCtx, 225, 205, 115, 25, 20, 0)); } else if ((thisx->params == 9) && (this->displayList == ResourceMgr_LoadGfxByName(object_tite_DL_002FF0))) { - gSPSegment(POLY_OPA_DISP++, 0x08, ResourceMgr_LoadTexByName(SEGMENTED_TO_VIRTUAL(object_tite_Tex_001300))); - gSPSegment(POLY_OPA_DISP++, 0x09, ResourceMgr_LoadTexByName(SEGMENTED_TO_VIRTUAL(object_tite_Tex_001700))); - gSPSegment(POLY_OPA_DISP++, 0x0A, ResourceMgr_LoadTexByName(SEGMENTED_TO_VIRTUAL(object_tite_Tex_001900))); + gSPSegment(POLY_OPA_DISP++, 0x08, object_tite_Tex_001300); + gSPSegment(POLY_OPA_DISP++, 0x09, object_tite_Tex_001700); + gSPSegment(POLY_OPA_DISP++, 0x0A, object_tite_Tex_001900); } else if ((thisx->params == 10) && (this->displayList == ResourceMgr_LoadGfxByName(object_tite_DL_002FF0))) { - gSPSegment(POLY_OPA_DISP++, 0x08, ResourceMgr_LoadTexByName(SEGMENTED_TO_VIRTUAL(object_tite_Tex_001B00))); - gSPSegment(POLY_OPA_DISP++, 0x09, ResourceMgr_LoadTexByName(SEGMENTED_TO_VIRTUAL(object_tite_Tex_001F00))); - gSPSegment(POLY_OPA_DISP++, 0x0A, ResourceMgr_LoadTexByName(SEGMENTED_TO_VIRTUAL(object_tite_Tex_002100))); + gSPSegment(POLY_OPA_DISP++, 0x08, object_tite_Tex_001B00); + gSPSegment(POLY_OPA_DISP++, 0x09, object_tite_Tex_001F00); + gSPSegment(POLY_OPA_DISP++, 0x0A, object_tite_Tex_002100); } if (this->displayList != NULL) { diff --git a/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c b/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c index 84543fa26..dc48b277d 100644 --- a/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c +++ b/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c @@ -45,11 +45,8 @@ void FileChoose_SetView(FileChooseContext* this, f32 eyeX, f32 eyeY, f32 eyeZ) { func_800AAA50(&this->view, 0x7F); } -Gfx* FileChoose_QuadTextureIA8(Gfx* gfx, void* texture, s16 width, s16 height, s16 point) +Gfx* FileChoose_QuadTextureIA8(Gfx* gfx, void* texture, s16 width, s16 height, s16 point) { - if (ResourceMgr_OTRSigCheck(texture)) - texture = ResourceMgr_LoadTexByName(texture); - gDPLoadTextureBlock(gfx++, texture, G_IM_FMT_IA, G_IM_SIZ_8b, width, 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); @@ -1500,13 +1497,13 @@ void FileChoose_LoadGame(GameState* thisx) { gSaveContext.naviTimer = 0; // SWORDLESS LINK IS BACK BABY - if (CVar_GetS32("gSwordlessLink", 0) != 0) + if (CVar_GetS32("gSwordlessLink", 0) != 0) { if ((gSaveContext.equips.buttonItems[0] != ITEM_SWORD_KOKIRI) && (gSaveContext.equips.buttonItems[0] != ITEM_SWORD_MASTER) && (gSaveContext.equips.buttonItems[0] != ITEM_SWORD_BGS) && (gSaveContext.equips.buttonItems[0] != ITEM_SWORD_KNIFE)) { - + gSaveContext.equips.buttonItems[0] = ITEM_NONE; swordEquipMask = _byteswap_ushort(gEquipMasks[EQUIP_SWORD]) & gSaveContext.equips.equipment; gSaveContext.equips.equipment &= gEquipNegMasks[EQUIP_SWORD]; diff --git a/soh/src/overlays/gamestates/ovl_title/z_title.c b/soh/src/overlays/gamestates/ovl_title/z_title.c index 942962f2e..3b7cfe84c 100644 --- a/soh/src/overlays/gamestates/ovl_title/z_title.c +++ b/soh/src/overlays/gamestates/ovl_title/z_title.c @@ -199,7 +199,7 @@ void Title_Draw(TitleContext* this) { gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 170, 255, 255, 255); gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 255, 128); - gDPLoadMultiBlock(POLY_OPA_DISP++, ResourceMgr_LoadTexByName(nintendo_rogo_static_Tex_001800), 0x100, 1, G_IM_FMT_I, G_IM_SIZ_8b, 32, 32, 0, + gDPLoadMultiBlock(POLY_OPA_DISP++, nintendo_rogo_static_Tex_001800, 0x100, 1, G_IM_FMT_I, G_IM_SIZ_8b, 32, 32, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 5, 5, 2, 11); for (idx = 0, y = 94; idx < 16; idx++, y += 2) diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c index 2003a8b14..c21ef4ca7 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c @@ -64,7 +64,7 @@ void KaleidoScope_DrawEquipmentImage(GlobalContext* globalCtx, void* source, u32 gDPLoadSync(POLY_KAL_DISP++); gDPLoadTile(POLY_KAL_DISP++, G_TX_LOADTILE, 0, 0, (width - 1) << 2, (textureHeight - 1) << 2); - + gDPSetTextureImageFB(POLY_KAL_DISP++, G_IM_FMT_RGBA, G_IM_SIZ_16b, width, fbTest); gSP1Quadrangle(POLY_KAL_DISP++, 0, 2, 3, 1, 0); @@ -575,7 +575,14 @@ void KaleidoScope_DrawEquipment(GlobalContext* globalCtx) { } else if ((i == 0) && (k == 2) && (gBitFlags[bit + 1] & gSaveContext.inventory.equipment)) { KaleidoScope_DrawQuadTextureRGBA32(globalCtx->state.gfxCtx, gBrokenGiantsKnifeIconTex, 32, 32, point); } else if (gBitFlags[bit] & gSaveContext.inventory.equipment) { - KaleidoScope_DrawQuadTextureRGBA32(globalCtx->state.gfxCtx, gItemIcons[ITEM_SWORD_KOKIRI + temp], 32, 32, point); + int itemId = ITEM_SWORD_KOKIRI + temp; + bool not_acquired = (gItemAgeReqs[itemId] != 9) && (gItemAgeReqs[itemId] != gSaveContext.linkAge); + if (not_acquired) { + gsDPSetGrayscaleColor(POLY_KAL_DISP++, 100, 100, 100); + gsSPGrayscale(POLY_KAL_DISP++, true); + } + KaleidoScope_DrawQuadTextureRGBA32(globalCtx->state.gfxCtx, gItemIcons[itemId], 32, 32, point); + gsSPGrayscale(POLY_KAL_DISP++, false); } } } diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c index d39a90e16..7f7d81075 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c @@ -467,8 +467,15 @@ void KaleidoScope_DrawItemSelect(GlobalContext* globalCtx) { } gSPVertex(POLY_KAL_DISP++, &pauseCtx->itemVtx[j + 0], 4, 0); - KaleidoScope_DrawQuadTextureRGBA32(globalCtx->state.gfxCtx, gItemIcons[gSaveContext.inventory.items[i]], 32, + int itemId = gSaveContext.inventory.items[i]; + bool not_acquired = (gItemAgeReqs[itemId] != 9) && (gItemAgeReqs[itemId] != gSaveContext.linkAge); + if (not_acquired) { + gsDPSetGrayscaleColor(POLY_KAL_DISP++, 100, 100, 100); + gsSPGrayscale(POLY_KAL_DISP++, true); + } + KaleidoScope_DrawQuadTextureRGBA32(globalCtx->state.gfxCtx, gItemIcons[itemId], 32, 32, 0); + gsSPGrayscale(POLY_KAL_DISP++, false); } } diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c index 3c023105f..60d3595aa 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c @@ -3081,14 +3081,6 @@ void KaleidoScope_Update(GlobalContext* globalCtx) gSegments[8] = VIRTUAL_TO_PHYSICAL(pauseCtx->iconItemSegment); - for (i = 0; i < ARRAY_COUNTU(gItemAgeReqs); i++) { - if ((gItemAgeReqs[i] != 9) && (gItemAgeReqs[i] != ((void)0, gSaveContext.linkAge))) - { - gSPInvalidateTexCache(globalCtx->state.gfxCtx->polyKal.p++, ResourceMgr_LoadTexByName(gItemIcons[i])); - KaleidoScope_GrayOutTextureRGBA32(SEGMENTED_TO_VIRTUAL(gItemIcons[i]), 0x400); - } - } - pauseCtx->iconItem24Segment = (void*)(((uintptr_t)pauseCtx->iconItemSegment + size0 + 0xF) & ~0xF); #if 1 From 3c471f2fc5ae45082682b66ed077312501c64fbd Mon Sep 17 00:00:00 2001 From: Baoulettes Date: Sun, 24 Apr 2022 18:26:49 +0200 Subject: [PATCH 66/83] Quick fix for Title cards issues Funny on linux it show properly but windows require it --- soh/src/code/graph.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/src/code/graph.c b/soh/src/code/graph.c index 3a1719731..dbbbb9df1 100644 --- a/soh/src/code/graph.c +++ b/soh/src/code/graph.c @@ -299,7 +299,7 @@ void Graph_Update(GraphicsContext* gfxCtx, GameState* gameState) { gSPBranchList(WORK_DISP++, gfxCtx->polyOpaBuffer); gSPBranchList(POLY_OPA_DISP++, gfxCtx->polyXluBuffer); gSPBranchList(POLY_XLU_DISP++, gfxCtx->titlecardBuffer); - gSPBranchList(POLY_XLU_DISP++, gfxCtx->polyKalBuffer); + gSPBranchList(TITLE_CARD_DISP++, gfxCtx->polyKalBuffer); gSPBranchList(POLY_KAL_DISP++, gfxCtx->overlayBuffer); gDPPipeSync(OVERLAY_DISP++); gDPFullSync(OVERLAY_DISP++); From 53e45e879ed1bf18748d28b2bb9d94a2c1725ba4 Mon Sep 17 00:00:00 2001 From: GaryOderNichts <12049776+GaryOderNichts@users.noreply.github.com> Date: Mon, 18 Apr 2022 21:04:35 +0200 Subject: [PATCH 67/83] Fix texture width for G_SETTIMG --- OTRExporter/OTRExporter/DisplayListExporter.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OTRExporter/OTRExporter/DisplayListExporter.cpp b/OTRExporter/OTRExporter/DisplayListExporter.cpp index 4e68d8f13..1fe7cb44a 100644 --- a/OTRExporter/OTRExporter/DisplayListExporter.cpp +++ b/OTRExporter/OTRExporter/DisplayListExporter.cpp @@ -689,7 +689,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina uint32_t fmt = (__ & 0xE0) >> 5; uint32_t siz = (__ & 0x18) >> 3; - Gfx value = gsDPSetTextureImage(fmt, siz, www - 1, (seg & 0x0FFFFFFF) + 0xF0000000); + Gfx value = gsDPSetTextureImage(fmt, siz, www + 1, (seg & 0x0FFFFFFF) + 0xF0000000); word0 = value.words.w0; word1 = value.words.w1; @@ -707,7 +707,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina uint32_t fmt = (__ & 0xE0) >> 5; uint32_t siz = (__ & 0x18) >> 3; - Gfx value = gsDPSetTextureImage(fmt, siz, www - 1, __); + Gfx value = gsDPSetTextureImage(fmt, siz, www + 1, __); word0 = value.words.w0 & 0x00FFFFFF; word0 += (G_SETTIMG_OTR << 24); //word1 = value.words.w1; From caebcc4f9ab156acb15736225907ad47e99be1eb Mon Sep 17 00:00:00 2001 From: Nicholas Estelami Date: Sun, 24 Apr 2022 17:10:38 -0400 Subject: [PATCH 68/83] Fixed bug in extract_assets.py that caused wrong XML folder to be used Also removed duplicate python script in soh folder. --- OTRExporter/extract_assets.py | 6 +- soh/extract_baserom.py | 1608 --------------------------------- 2 files changed, 3 insertions(+), 1611 deletions(-) delete mode 100755 soh/extract_baserom.py diff --git a/OTRExporter/extract_assets.py b/OTRExporter/extract_assets.py index f15cb1beb..e33b65f0e 100755 --- a/OTRExporter/extract_assets.py +++ b/OTRExporter/extract_assets.py @@ -132,13 +132,13 @@ def main(): else: romToUse = roms[0] - match checkChecksum(romToUse).name: + match checkChecksum(romToUse): case Checksums.OOT_PAL_GC: xmlVer = "GC_NMQ_PAL_F" case Checksums.OOT_PAL_GC_DBG1: - xmlVer = "GC_MQ_D" - case _: # default case xmlVer = "GC_NMQ_D" + case _: # default case + xmlVer = "GC_MQ_D" if (os.path.exists("Extract")): shutil.rmtree("Extract") diff --git a/soh/extract_baserom.py b/soh/extract_baserom.py deleted file mode 100755 index a3eb83a8f..000000000 --- a/soh/extract_baserom.py +++ /dev/null @@ -1,1608 +0,0 @@ -#!/usr/bin/python3 - -import os -import sys -import struct -from multiprocessing import Pool, cpu_count - - -ROM_FILE_NAME = 'baserom_non_mq.z64' -FILE_TABLE_OFFSET = 0x12F70 - -FILE_NAMES = [ - 'makerom', - 'boot', - 'dmadata', - 'Audiobank', - 'Audioseq', - 'Audiotable', - 'link_animetion', - 'icon_item_static', - 'icon_item_24_static', - 'icon_item_field_static', - 'icon_item_dungeon_static', - 'icon_item_gameover_static', - 'icon_item_nes_static', - 'icon_item_ger_static', - 'icon_item_fra_static', - 'item_name_static', - 'map_name_static', - 'do_action_static', - 'message_static', - 'message_texture_static', - 'nes_font_static', - 'nes_message_data_static', - 'ger_message_data_static', - 'fra_message_data_static', - 'staff_message_data_static', - 'map_grand_static', - 'map_i_static', - 'map_48x85_static', - 'code', - 'ovl_title', - 'ovl_select', - 'ovl_opening', - 'ovl_file_choose', - 'ovl_kaleido_scope', - 'ovl_player_actor', - 'ovl_map_mark_data', - 'ovl_En_Test', - 'ovl_Arms_Hook', - 'ovl_Arrow_Fire', - 'ovl_Arrow_Ice', - 'ovl_Arrow_Light', - 'ovl_Bg_Bdan_Objects', - 'ovl_Bg_Bdan_Switch', - 'ovl_Bg_Bom_Guard', - 'ovl_Bg_Bombwall', - 'ovl_Bg_Bowl_Wall', - 'ovl_Bg_Breakwall', - 'ovl_Bg_Ddan_Jd', - 'ovl_Bg_Ddan_Kd', - 'ovl_Bg_Dodoago', - 'ovl_Bg_Dy_Yoseizo', - 'ovl_Bg_Ganon_Otyuka', - 'ovl_Bg_Gate_Shutter', - 'ovl_Bg_Gjyo_Bridge', - 'ovl_Bg_Gnd_Darkmeiro', - 'ovl_Bg_Gnd_Firemeiro', - 'ovl_Bg_Gnd_Iceblock', - 'ovl_Bg_Gnd_Nisekabe', - 'ovl_Bg_Gnd_Soulmeiro', - 'ovl_Bg_Haka', - 'ovl_Bg_Haka_Gate', - 'ovl_Bg_Haka_Huta', - 'ovl_Bg_Haka_Megane', - 'ovl_Bg_Haka_MeganeBG', - 'ovl_Bg_Haka_Sgami', - 'ovl_Bg_Haka_Ship', - 'ovl_Bg_Haka_Trap', - 'ovl_Bg_Haka_Tubo', - 'ovl_Bg_Haka_Water', - 'ovl_Bg_Haka_Zou', - 'ovl_Bg_Heavy_Block', - 'ovl_Bg_Hidan_Curtain', - 'ovl_Bg_Hidan_Dalm', - 'ovl_Bg_Hidan_Firewall', - 'ovl_Bg_Hidan_Fslift', - 'ovl_Bg_Hidan_Fwbig', - 'ovl_Bg_Hidan_Hamstep', - 'ovl_Bg_Hidan_Hrock', - 'ovl_Bg_Hidan_Kousi', - 'ovl_Bg_Hidan_Kowarerukabe', - 'ovl_Bg_Hidan_Rock', - 'ovl_Bg_Hidan_Rsekizou', - 'ovl_Bg_Hidan_Sekizou', - 'ovl_Bg_Hidan_Sima', - 'ovl_Bg_Hidan_Syoku', - 'ovl_Bg_Ice_Objects', - 'ovl_Bg_Ice_Shelter', - 'ovl_Bg_Ice_Shutter', - 'ovl_Bg_Ice_Turara', - 'ovl_Bg_Ingate', - 'ovl_Bg_Jya_1flift', - 'ovl_Bg_Jya_Amishutter', - 'ovl_Bg_Jya_Bigmirror', - 'ovl_Bg_Jya_Block', - 'ovl_Bg_Jya_Bombchuiwa', - 'ovl_Bg_Jya_Bombiwa', - 'ovl_Bg_Jya_Cobra', - 'ovl_Bg_Jya_Goroiwa', - 'ovl_Bg_Jya_Haheniron', - 'ovl_Bg_Jya_Ironobj', - 'ovl_Bg_Jya_Kanaami', - 'ovl_Bg_Jya_Lift', - 'ovl_Bg_Jya_Megami', - 'ovl_Bg_Jya_Zurerukabe', - 'ovl_Bg_Menkuri_Eye', - 'ovl_Bg_Menkuri_Kaiten', - 'ovl_Bg_Menkuri_Nisekabe', - 'ovl_Bg_Mizu_Bwall', - 'ovl_Bg_Mizu_Movebg', - 'ovl_Bg_Mizu_Shutter', - 'ovl_Bg_Mizu_Uzu', - 'ovl_Bg_Mizu_Water', - 'ovl_Bg_Mjin', - 'ovl_Bg_Mori_Bigst', - 'ovl_Bg_Mori_Elevator', - 'ovl_Bg_Mori_Hashigo', - 'ovl_Bg_Mori_Hashira4', - 'ovl_Bg_Mori_Hineri', - 'ovl_Bg_Mori_Idomizu', - 'ovl_Bg_Mori_Kaitenkabe', - 'ovl_Bg_Mori_Rakkatenjo', - 'ovl_Bg_Po_Event', - 'ovl_Bg_Po_Syokudai', - 'ovl_Bg_Pushbox', - 'ovl_Bg_Relay_Objects', - 'ovl_Bg_Spot00_Break', - 'ovl_Bg_Spot00_Hanebasi', - 'ovl_Bg_Spot01_Fusya', - 'ovl_Bg_Spot01_Idohashira', - 'ovl_Bg_Spot01_Idomizu', - 'ovl_Bg_Spot01_Idosoko', - 'ovl_Bg_Spot01_Objects2', - 'ovl_Bg_Spot02_Objects', - 'ovl_Bg_Spot03_Taki', - 'ovl_Bg_Spot05_Soko', - 'ovl_Bg_Spot06_Objects', - 'ovl_Bg_Spot07_Taki', - 'ovl_Bg_Spot08_Bakudankabe', - 'ovl_Bg_Spot08_Iceblock', - 'ovl_Bg_Spot09_Obj', - 'ovl_Bg_Spot11_Bakudankabe', - 'ovl_Bg_Spot11_Oasis', - 'ovl_Bg_Spot12_Gate', - 'ovl_Bg_Spot12_Saku', - 'ovl_Bg_Spot15_Rrbox', - 'ovl_Bg_Spot15_Saku', - 'ovl_Bg_Spot16_Bombstone', - 'ovl_Bg_Spot16_Doughnut', - 'ovl_Bg_Spot17_Bakudankabe', - 'ovl_Bg_Spot17_Funen', - 'ovl_Bg_Spot18_Basket', - 'ovl_Bg_Spot18_Futa', - 'ovl_Bg_Spot18_Obj', - 'ovl_Bg_Spot18_Shutter', - 'ovl_Bg_Sst_Floor', - 'ovl_Bg_Toki_Hikari', - 'ovl_Bg_Toki_Swd', - 'ovl_Bg_Treemouth', - 'ovl_Bg_Umajump', - 'ovl_Bg_Vb_Sima', - 'ovl_Bg_Ydan_Hasi', - 'ovl_Bg_Ydan_Maruta', - 'ovl_Bg_Ydan_Sp', - 'ovl_Bg_Zg', - 'ovl_Boss_Dodongo', - 'ovl_Boss_Fd', - 'ovl_Boss_Fd2', - 'ovl_Boss_Ganon', - 'ovl_Boss_Ganon2', - 'ovl_Boss_Ganondrof', - 'ovl_Boss_Goma', - 'ovl_Boss_Mo', - 'ovl_Boss_Sst', - 'ovl_Boss_Tw', - 'ovl_Boss_Va', - 'ovl_Demo_6K', - 'ovl_Demo_Du', - 'ovl_Demo_Ec', - 'ovl_Demo_Effect', - 'ovl_Demo_Ext', - 'ovl_Demo_Geff', - 'ovl_Demo_Gj', - 'ovl_Demo_Go', - 'ovl_Demo_Gt', - 'ovl_Demo_Ik', - 'ovl_Demo_Im', - 'ovl_Demo_Kankyo', - 'ovl_Demo_Kekkai', - 'ovl_Demo_Sa', - 'ovl_Demo_Shd', - 'ovl_Demo_Tre_Lgt', - 'ovl_Door_Ana', - 'ovl_Door_Gerudo', - 'ovl_Door_Killer', - 'ovl_Door_Shutter', - 'ovl_Door_Toki', - 'ovl_Door_Warp1', - 'ovl_Efc_Erupc', - 'ovl_Eff_Dust', - 'ovl_Effect_Ss_Blast', - 'ovl_Effect_Ss_Bomb', - 'ovl_Effect_Ss_Bomb2', - 'ovl_Effect_Ss_Bubble', - 'ovl_Effect_Ss_D_Fire', - 'ovl_Effect_Ss_Dead_Db', - 'ovl_Effect_Ss_Dead_Dd', - 'ovl_Effect_Ss_Dead_Ds', - 'ovl_Effect_Ss_Dead_Sound', - 'ovl_Effect_Ss_Dt_Bubble', - 'ovl_Effect_Ss_Dust', - 'ovl_Effect_Ss_En_Fire', - 'ovl_Effect_Ss_En_Ice', - 'ovl_Effect_Ss_Extra', - 'ovl_Effect_Ss_Fcircle', - 'ovl_Effect_Ss_Fhg_Flash', - 'ovl_Effect_Ss_Fire_Tail', - 'ovl_Effect_Ss_G_Fire', - 'ovl_Effect_Ss_G_Magma', - 'ovl_Effect_Ss_G_Magma2', - 'ovl_Effect_Ss_G_Ripple', - 'ovl_Effect_Ss_G_Spk', - 'ovl_Effect_Ss_G_Splash', - 'ovl_Effect_Ss_Hahen', - 'ovl_Effect_Ss_HitMark', - 'ovl_Effect_Ss_Ice_Piece', - 'ovl_Effect_Ss_Ice_Smoke', - 'ovl_Effect_Ss_K_Fire', - 'ovl_Effect_Ss_Kakera', - 'ovl_Effect_Ss_KiraKira', - 'ovl_Effect_Ss_Lightning', - 'ovl_Effect_Ss_Sibuki', - 'ovl_Effect_Ss_Sibuki2', - 'ovl_Effect_Ss_Solder_Srch_Ball', - 'ovl_Effect_Ss_Stick', - 'ovl_Effect_Ss_Stone1', - 'ovl_Elf_Msg', - 'ovl_Elf_Msg2', - 'ovl_En_Am', - 'ovl_En_Ani', - 'ovl_En_Anubice', - 'ovl_En_Anubice_Fire', - 'ovl_En_Anubice_Tag', - 'ovl_En_Arow_Trap', - 'ovl_En_Arrow', - 'ovl_En_Attack_Niw', - 'ovl_En_Ba', - 'ovl_En_Bb', - 'ovl_En_Bdfire', - 'ovl_En_Bigokuta', - 'ovl_En_Bili', - 'ovl_En_Bird', - 'ovl_En_Blkobj', - 'ovl_En_Bom', - 'ovl_En_Bom_Bowl_Man', - 'ovl_En_Bom_Bowl_Pit', - 'ovl_En_Bom_Chu', - 'ovl_En_Bombf', - 'ovl_En_Boom', - 'ovl_En_Box', - 'ovl_En_Brob', - 'ovl_En_Bubble', - 'ovl_En_Butte', - 'ovl_En_Bw', - 'ovl_En_Bx', - 'ovl_En_Changer', - 'ovl_En_Clear_Tag', - 'ovl_En_Cow', - 'ovl_En_Crow', - 'ovl_En_Cs', - 'ovl_En_Daiku', - 'ovl_En_Daiku_Kakariko', - 'ovl_En_Dekubaba', - 'ovl_En_Dekunuts', - 'ovl_En_Dh', - 'ovl_En_Dha', - 'ovl_En_Diving_Game', - 'ovl_En_Dns', - 'ovl_En_Dnt_Demo', - 'ovl_En_Dnt_Jiji', - 'ovl_En_Dnt_Nomal', - 'ovl_En_Dodojr', - 'ovl_En_Dodongo', - 'ovl_En_Dog', - 'ovl_En_Door', - 'ovl_En_Ds', - 'ovl_En_Du', - 'ovl_En_Dy_Extra', - 'ovl_En_Eg', - 'ovl_En_Eiyer', - 'ovl_En_Elf', - 'ovl_En_Encount1', - 'ovl_En_Encount2', - 'ovl_En_Ex_Item', - 'ovl_En_Ex_Ruppy', - 'ovl_En_Fd', - 'ovl_En_Fd_Fire', - 'ovl_En_Fhg_Fire', - 'ovl_En_Fire_Rock', - 'ovl_En_Firefly', - 'ovl_En_Fish', - 'ovl_En_Floormas', - 'ovl_En_Fr', - 'ovl_En_Fu', - 'ovl_En_Fw', - 'ovl_En_Fz', - 'ovl_En_G_Switch', - 'ovl_En_Ganon_Mant', - 'ovl_En_Ganon_Organ', - 'ovl_En_Gb', - 'ovl_En_Ge1', - 'ovl_En_Ge2', - 'ovl_En_Ge3', - 'ovl_En_GeldB', - 'ovl_En_GirlA', - 'ovl_En_Gm', - 'ovl_En_Go', - 'ovl_En_Go2', - 'ovl_En_Goma', - 'ovl_En_Goroiwa', - 'ovl_En_Gs', - 'ovl_En_Guest', - 'ovl_En_Hata', - 'ovl_En_Heishi1', - 'ovl_En_Heishi2', - 'ovl_En_Heishi3', - 'ovl_En_Heishi4', - 'ovl_En_Hintnuts', - 'ovl_En_Holl', - 'ovl_En_Honotrap', - 'ovl_En_Horse', - 'ovl_En_Horse_Game_Check', - 'ovl_En_Horse_Ganon', - 'ovl_En_Horse_Link_Child', - 'ovl_En_Horse_Normal', - 'ovl_En_Horse_Zelda', - 'ovl_En_Hs', - 'ovl_En_Hs2', - 'ovl_En_Hy', - 'ovl_En_Ice_Hono', - 'ovl_En_Ik', - 'ovl_En_In', - 'ovl_En_Insect', - 'ovl_En_Ishi', - 'ovl_En_It', - 'ovl_En_Jj', - 'ovl_En_Js', - 'ovl_En_Jsjutan', - 'ovl_En_Kakasi', - 'ovl_En_Kakasi2', - 'ovl_En_Kakasi3', - 'ovl_En_Kanban', - 'ovl_En_Karebaba', - 'ovl_En_Ko', - 'ovl_En_Kusa', - 'ovl_En_Kz', - 'ovl_En_Light', - 'ovl_En_Lightbox', - 'ovl_En_M_Fire1', - 'ovl_En_M_Thunder', - 'ovl_En_Ma1', - 'ovl_En_Ma2', - 'ovl_En_Ma3', - 'ovl_En_Mag', - 'ovl_En_Mb', - 'ovl_En_Md', - 'ovl_En_Mk', - 'ovl_En_Mm', - 'ovl_En_Mm2', - 'ovl_En_Ms', - 'ovl_En_Mu', - 'ovl_En_Nb', - 'ovl_En_Niw', - 'ovl_En_Niw_Girl', - 'ovl_En_Niw_Lady', - 'ovl_En_Nutsball', - 'ovl_En_Nwc', - 'ovl_En_Ny', - 'ovl_En_OE2', - 'ovl_En_Okarina_Effect', - 'ovl_En_Okarina_Tag', - 'ovl_En_Okuta', - 'ovl_En_Ossan', - 'ovl_En_Owl', - 'ovl_En_Part', - 'ovl_En_Peehat', - 'ovl_En_Po_Desert', - 'ovl_En_Po_Field', - 'ovl_En_Po_Relay', - 'ovl_En_Po_Sisters', - 'ovl_En_Poh', - 'ovl_En_Pu_box', - 'ovl_En_Rd', - 'ovl_En_Reeba', - 'ovl_En_River_Sound', - 'ovl_En_Rl', - 'ovl_En_Rr', - 'ovl_En_Ru1', - 'ovl_En_Ru2', - 'ovl_En_Sa', - 'ovl_En_Sb', - 'ovl_En_Scene_Change', - 'ovl_En_Sda', - 'ovl_En_Shopnuts', - 'ovl_En_Si', - 'ovl_En_Siofuki', - 'ovl_En_Skb', - 'ovl_En_Skj', - 'ovl_En_Skjneedle', - 'ovl_En_Ssh', - 'ovl_En_St', - 'ovl_En_Sth', - 'ovl_En_Stream', - 'ovl_En_Sw', - 'ovl_En_Syateki_Itm', - 'ovl_En_Syateki_Man', - 'ovl_En_Syateki_Niw', - 'ovl_En_Ta', - 'ovl_En_Takara_Man', - 'ovl_En_Tana', - 'ovl_En_Tg', - 'ovl_En_Tite', - 'ovl_En_Tk', - 'ovl_En_Torch', - 'ovl_En_Torch2', - 'ovl_En_Toryo', - 'ovl_En_Tp', - 'ovl_En_Tr', - 'ovl_En_Trap', - 'ovl_En_Tubo_Trap', - 'ovl_En_Vali', - 'ovl_En_Vase', - 'ovl_En_Vb_Ball', - 'ovl_En_Viewer', - 'ovl_En_Vm', - 'ovl_En_Wall_Tubo', - 'ovl_En_Wallmas', - 'ovl_En_Weather_Tag', - 'ovl_En_Weiyer', - 'ovl_En_Wf', - 'ovl_En_Wonder_Item', - 'ovl_En_Wonder_Talk', - 'ovl_En_Wonder_Talk2', - 'ovl_En_Wood02', - 'ovl_En_Xc', - 'ovl_En_Yabusame_Mark', - 'ovl_En_Yukabyun', - 'ovl_En_Zf', - 'ovl_En_Zl1', - 'ovl_En_Zl2', - 'ovl_En_Zl3', - 'ovl_En_Zl4', - 'ovl_En_Zo', - 'ovl_En_fHG', - 'ovl_End_Title', - 'ovl_Fishing', - 'ovl_Item_B_Heart', - 'ovl_Item_Etcetera', - 'ovl_Item_Inbox', - 'ovl_Item_Ocarina', - 'ovl_Item_Shield', - 'ovl_Magic_Dark', - 'ovl_Magic_Fire', - 'ovl_Magic_Wind', - 'ovl_Mir_Ray', - 'ovl_Obj_Bean', - 'ovl_Obj_Blockstop', - 'ovl_Obj_Bombiwa', - 'ovl_Obj_Comb', - 'ovl_Obj_Dekujr', - 'ovl_Obj_Elevator', - 'ovl_Obj_Hamishi', - 'ovl_Obj_Hana', - 'ovl_Obj_Hsblock', - 'ovl_Obj_Ice_Poly', - 'ovl_Obj_Kibako', - 'ovl_Obj_Kibako2', - 'ovl_Obj_Lift', - 'ovl_Obj_Lightswitch', - 'ovl_Obj_Makekinsuta', - 'ovl_Obj_Makeoshihiki', - 'ovl_Obj_Mure', - 'ovl_Obj_Mure2', - 'ovl_Obj_Mure3', - 'ovl_Obj_Oshihiki', - 'ovl_Obj_Roomtimer', - 'ovl_Obj_Switch', - 'ovl_Obj_Syokudai', - 'ovl_Obj_Timeblock', - 'ovl_Obj_Tsubo', - 'ovl_Obj_Warp2block', - 'ovl_Object_Kankyo', - 'ovl_Oceff_Spot', - 'ovl_Oceff_Storm', - 'ovl_Oceff_Wipe', - 'ovl_Oceff_Wipe2', - 'ovl_Oceff_Wipe3', - 'ovl_Oceff_Wipe4', - 'ovl_Shot_Sun', - 'gameplay_keep', - 'gameplay_field_keep', - 'gameplay_dangeon_keep', - 'gameplay_object_exchange_static', - 'object_link_boy', - 'object_link_child', - 'object_box', - 'object_human', - 'object_okuta', - 'object_poh', - 'object_wallmaster', - 'object_dy_obj', - 'object_firefly', - 'object_dodongo', - 'object_fire', - 'object_niw', - 'object_tite', - 'object_reeba', - 'object_peehat', - 'object_kingdodongo', - 'object_horse', - 'object_zf', - 'object_goma', - 'object_zl1', - 'object_gol', - 'object_bubble', - 'object_dodojr', - 'object_torch2', - 'object_bl', - 'object_tp', - 'object_oA1', - 'object_st', - 'object_bw', - 'object_ei', - 'object_horse_normal', - 'object_oB1', - 'object_o_anime', - 'object_spot04_objects', - 'object_ddan_objects', - 'object_hidan_objects', - 'object_horse_ganon', - 'object_oA2', - 'object_spot00_objects', - 'object_mb', - 'object_bombf', - 'object_sk2', - 'object_oE1', - 'object_oE_anime', - 'object_oE2', - 'object_ydan_objects', - 'object_gnd', - 'object_am', - 'object_dekubaba', - 'object_oA3', - 'object_oA4', - 'object_oA5', - 'object_oA6', - 'object_oA7', - 'object_jj', - 'object_oA8', - 'object_oA9', - 'object_oB2', - 'object_oB3', - 'object_oB4', - 'object_horse_zelda', - 'object_opening_demo1', - 'object_warp1', - 'object_b_heart', - 'object_dekunuts', - 'object_oE3', - 'object_oE4', - 'object_menkuri_objects', - 'object_oE5', - 'object_oE6', - 'object_oE7', - 'object_oE8', - 'object_oE9', - 'object_oE10', - 'object_oE11', - 'object_oE12', - 'object_vali', - 'object_oA10', - 'object_oA11', - 'object_mizu_objects', - 'object_fhg', - 'object_ossan', - 'object_mori_hineri1', - 'object_Bb', - 'object_toki_objects', - 'object_yukabyun', - 'object_zl2', - 'object_mjin', - 'object_mjin_flash', - 'object_mjin_dark', - 'object_mjin_flame', - 'object_mjin_ice', - 'object_mjin_soul', - 'object_mjin_wind', - 'object_mjin_oka', - 'object_haka_objects', - 'object_spot06_objects', - 'object_ice_objects', - 'object_relay_objects', - 'object_mori_hineri1a', - 'object_mori_hineri2', - 'object_mori_hineri2a', - 'object_mori_objects', - 'object_mori_tex', - 'object_spot08_obj', - 'object_warp2', - 'object_hata', - 'object_bird', - 'object_wood02', - 'object_lightbox', - 'object_pu_box', - 'object_trap', - 'object_vase', - 'object_im', - 'object_ta', - 'object_tk', - 'object_xc', - 'object_vm', - 'object_bv', - 'object_hakach_objects', - 'object_efc_crystal_light', - 'object_efc_fire_ball', - 'object_efc_flash', - 'object_efc_lgt_shower', - 'object_efc_star_field', - 'object_god_lgt', - 'object_light_ring', - 'object_triforce_spot', - 'object_medal', - 'object_bdan_objects', - 'object_sd', - 'object_rd', - 'object_po_sisters', - 'object_heavy_object', - 'object_gndd', - 'object_fd', - 'object_du', - 'object_fw', - 'object_horse_link_child', - 'object_spot02_objects', - 'object_haka', - 'object_ru1', - 'object_syokudai', - 'object_fd2', - 'object_dh', - 'object_rl', - 'object_efc_tw', - 'object_demo_tre_lgt', - 'object_gi_key', - 'object_mir_ray', - 'object_brob', - 'object_gi_jewel', - 'object_spot09_obj', - 'object_spot18_obj', - 'object_bdoor', - 'object_spot17_obj', - 'object_shop_dungen', - 'object_nb', - 'object_mo', - 'object_sb', - 'object_gi_melody', - 'object_gi_heart', - 'object_gi_compass', - 'object_gi_bosskey', - 'object_gi_medal', - 'object_gi_nuts', - 'object_sa', - 'object_gi_hearts', - 'object_gi_arrowcase', - 'object_gi_bombpouch', - 'object_in', - 'object_tr', - 'object_spot16_obj', - 'object_oE1s', - 'object_oE4s', - 'object_os_anime', - 'object_gi_bottle', - 'object_gi_stick', - 'object_gi_map', - 'object_oF1d_map', - 'object_ru2', - 'object_gi_shield_1', - 'object_dekujr', - 'object_gi_magicpot', - 'object_gi_bomb_1', - 'object_oF1s', - 'object_ma2', - 'object_gi_purse', - 'object_hni', - 'object_tw', - 'object_rr', - 'object_bxa', - 'object_anubice', - 'object_gi_gerudo', - 'object_gi_arrow', - 'object_gi_bomb_2', - 'object_gi_egg', - 'object_gi_scale', - 'object_gi_shield_2', - 'object_gi_hookshot', - 'object_gi_ocarina', - 'object_gi_milk', - 'object_ma1', - 'object_ganon', - 'object_sst', - 'object_ny', - 'object_fr', - 'object_gi_pachinko', - 'object_gi_boomerang', - 'object_gi_bow', - 'object_gi_glasses', - 'object_gi_liquid', - 'object_ani', - 'object_demo_6k', - 'object_gi_shield_3', - 'object_gi_letter', - 'object_spot15_obj', - 'object_jya_obj', - 'object_gi_clothes', - 'object_gi_bean', - 'object_gi_fish', - 'object_gi_saw', - 'object_gi_hammer', - 'object_gi_grass', - 'object_gi_longsword', - 'object_spot01_objects', - 'object_md', - 'object_km1', - 'object_kw1', - 'object_zo', - 'object_kz', - 'object_umajump', - 'object_masterkokiri', - 'object_masterkokirihead', - 'object_mastergolon', - 'object_masterzoora', - 'object_aob', - 'object_ik', - 'object_ahg', - 'object_cne', - 'object_gi_niwatori', - 'object_skj', - 'object_gi_bottle_letter', - 'object_bji', - 'object_bba', - 'object_gi_ocarina_0', - 'object_ds', - 'object_ane', - 'object_boj', - 'object_spot03_object', - 'object_spot07_object', - 'object_fz', - 'object_bob', - 'object_ge1', - 'object_yabusame_point', - 'object_gi_boots_2', - 'object_gi_seed', - 'object_gnd_magic', - 'object_d_elevator', - 'object_d_hsblock', - 'object_d_lift', - 'object_mamenoki', - 'object_goroiwa', - 'object_toryo', - 'object_daiku', - 'object_nwc', - 'object_blkobj', - 'object_gm', - 'object_ms', - 'object_hs', - 'object_ingate', - 'object_lightswitch', - 'object_kusa', - 'object_tsubo', - 'object_gi_gloves', - 'object_gi_coin', - 'object_kanban', - 'object_gjyo_objects', - 'object_owl', - 'object_mk', - 'object_fu', - 'object_gi_ki_tan_mask', - 'object_gi_redead_mask', - 'object_gi_skj_mask', - 'object_gi_rabit_mask', - 'object_gi_truth_mask', - 'object_ganon_objects', - 'object_siofuki', - 'object_stream', - 'object_mm', - 'object_fa', - 'object_os', - 'object_gi_eye_lotion', - 'object_gi_powder', - 'object_gi_mushroom', - 'object_gi_ticketstone', - 'object_gi_brokensword', - 'object_js', - 'object_cs', - 'object_gi_prescription', - 'object_gi_bracelet', - 'object_gi_soldout', - 'object_gi_frog', - 'object_mag', - 'object_door_gerudo', - 'object_gt', - 'object_efc_erupc', - 'object_zl2_anime1', - 'object_zl2_anime2', - 'object_gi_golonmask', - 'object_gi_zoramask', - 'object_gi_gerudomask', - 'object_ganon2', - 'object_ka', - 'object_ts', - 'object_zg', - 'object_gi_hoverboots', - 'object_gi_m_arrow', - 'object_ds2', - 'object_ec', - 'object_fish', - 'object_gi_sutaru', - 'object_gi_goddess', - 'object_ssh', - 'object_bigokuta', - 'object_bg', - 'object_spot05_objects', - 'object_spot12_obj', - 'object_bombiwa', - 'object_hintnuts', - 'object_rs', - 'object_spot00_break', - 'object_gla', - 'object_shopnuts', - 'object_geldb', - 'object_gr', - 'object_dog', - 'object_jya_iron', - 'object_jya_door', - 'object_spot01_objects2', - 'object_spot11_obj', - 'object_kibako2', - 'object_dns', - 'object_dnk', - 'object_gi_fire', - 'object_gi_insect', - 'object_gi_butterfly', - 'object_gi_ghost', - 'object_gi_soul', - 'object_bowl', - 'object_po_field', - 'object_demo_kekkai', - 'object_efc_doughnut', - 'object_gi_dekupouch', - 'object_ganon_anime1', - 'object_ganon_anime2', - 'object_ganon_anime3', - 'object_gi_rupy', - 'object_spot01_matoya', - 'object_spot01_matoyab', - 'object_po_composer', - 'object_mu', - 'object_wf', - 'object_skb', - 'object_gj', - 'object_geff', - 'object_haka_door', - 'object_gs', - 'object_ps', - 'object_bwall', - 'object_crow', - 'object_cow', - 'object_cob', - 'object_gi_sword_1', - 'object_door_killer', - 'object_ouke_haka', - 'object_timeblock', - 'object_zl4', - 'g_pn_01', - 'g_pn_02', - 'g_pn_03', - 'g_pn_04', - 'g_pn_05', - 'g_pn_06', - 'g_pn_07', - 'g_pn_08', - 'g_pn_09', - 'g_pn_10', - 'g_pn_11', - 'g_pn_12', - 'g_pn_13', - 'g_pn_14', - 'g_pn_15', - 'g_pn_16', - 'g_pn_17', - 'g_pn_18', - 'g_pn_19', - 'g_pn_20', - 'g_pn_21', - 'g_pn_22', - 'g_pn_23', - 'g_pn_24', - 'g_pn_25', - 'g_pn_26', - 'g_pn_27', - 'g_pn_28', - 'g_pn_29', - 'g_pn_30', - 'g_pn_31', - 'g_pn_32', - 'g_pn_33', - 'g_pn_34', - 'g_pn_35', - 'g_pn_36', - 'g_pn_37', - 'g_pn_38', - 'g_pn_39', - 'g_pn_40', - 'g_pn_41', - 'g_pn_42', - 'g_pn_43', - 'g_pn_44', - 'g_pn_45', - 'g_pn_46', - 'g_pn_47', - 'g_pn_48', - 'g_pn_49', - 'g_pn_50', - 'g_pn_51', - 'g_pn_52', - 'g_pn_53', - 'g_pn_54', - 'g_pn_55', - 'g_pn_56', - 'g_pn_57', - 'z_select_static', - 'nintendo_rogo_static', - 'title_static', - 'parameter_static', - 'vr_fine0_static', - 'vr_fine0_pal_static', - 'vr_fine1_static', - 'vr_fine1_pal_static', - 'vr_fine2_static', - 'vr_fine2_pal_static', - 'vr_fine3_static', - 'vr_fine3_pal_static', - 'vr_cloud0_static', - 'vr_cloud0_pal_static', - 'vr_cloud1_static', - 'vr_cloud1_pal_static', - 'vr_cloud2_static', - 'vr_cloud2_pal_static', - 'vr_cloud3_static', - 'vr_cloud3_pal_static', - 'vr_holy0_static', - 'vr_holy0_pal_static', - 'vr_holy1_static', - 'vr_holy1_pal_static', - 'vr_MDVR_static', - 'vr_MDVR_pal_static', - 'vr_MNVR_static', - 'vr_MNVR_pal_static', - 'vr_RUVR_static', - 'vr_RUVR_pal_static', - 'vr_LHVR_static', - 'vr_LHVR_pal_static', - 'vr_KHVR_static', - 'vr_KHVR_pal_static', - 'vr_K3VR_static', - 'vr_K3VR_pal_static', - 'vr_K4VR_static', - 'vr_K4VR_pal_static', - 'vr_K5VR_static', - 'vr_K5VR_pal_static', - 'vr_SP1a_static', - 'vr_SP1a_pal_static', - 'vr_MLVR_static', - 'vr_MLVR_pal_static', - 'vr_KKRVR_static', - 'vr_KKRVR_pal_static', - 'vr_KR3VR_static', - 'vr_KR3VR_pal_static', - 'vr_IPVR_static', - 'vr_IPVR_pal_static', - 'vr_KSVR_static', - 'vr_KSVR_pal_static', - 'vr_GLVR_static', - 'vr_GLVR_pal_static', - 'vr_ZRVR_static', - 'vr_ZRVR_pal_static', - 'vr_DGVR_static', - 'vr_DGVR_pal_static', - 'vr_ALVR_static', - 'vr_ALVR_pal_static', - 'vr_NSVR_static', - 'vr_NSVR_pal_static', - 'vr_LBVR_static', - 'vr_LBVR_pal_static', - 'vr_TTVR_static', - 'vr_TTVR_pal_static', - 'vr_FCVR_static', - 'vr_FCVR_pal_static', - 'elf_message_field', - 'elf_message_ydan', - 'syotes_scene', - 'syotes_room_0', - 'syotes2_scene', - 'syotes2_room_0', - 'depth_test_scene', - 'depth_test_room_0', - 'spot00_scene', - 'spot00_room_0', - 'spot01_scene', - 'spot01_room_0', - 'spot02_scene', - 'spot02_room_0', - 'spot02_room_1', - 'spot03_scene', - 'spot03_room_0', - 'spot03_room_1', - 'spot04_scene', - 'spot04_room_0', - 'spot04_room_1', - 'spot04_room_2', - 'spot05_scene', - 'spot05_room_0', - 'spot06_scene', - 'spot06_room_0', - 'spot07_scene', - 'spot07_room_0', - 'spot07_room_1', - 'spot08_scene', - 'spot08_room_0', - 'spot09_scene', - 'spot09_room_0', - 'spot10_scene', - 'spot10_room_0', - 'spot10_room_1', - 'spot10_room_2', - 'spot10_room_3', - 'spot10_room_4', - 'spot10_room_5', - 'spot10_room_6', - 'spot10_room_7', - 'spot10_room_8', - 'spot10_room_9', - 'spot11_scene', - 'spot11_room_0', - 'spot12_scene', - 'spot12_room_0', - 'spot12_room_1', - 'spot13_scene', - 'spot13_room_0', - 'spot13_room_1', - 'spot15_scene', - 'spot15_room_0', - 'spot16_scene', - 'spot16_room_0', - 'spot17_scene', - 'spot17_room_0', - 'spot17_room_1', - 'spot18_scene', - 'spot18_room_0', - 'spot18_room_1', - 'spot18_room_2', - 'spot18_room_3', - 'ydan_scene', - 'ydan_room_0', - 'ydan_room_1', - 'ydan_room_2', - 'ydan_room_3', - 'ydan_room_4', - 'ydan_room_5', - 'ydan_room_6', - 'ydan_room_7', - 'ydan_room_8', - 'ydan_room_9', - 'ydan_room_10', - 'ydan_room_11', - 'ddan_scene', - 'ddan_room_0', - 'ddan_room_1', - 'ddan_room_2', - 'ddan_room_3', - 'ddan_room_4', - 'ddan_room_5', - 'ddan_room_6', - 'ddan_room_7', - 'ddan_room_8', - 'ddan_room_9', - 'ddan_room_10', - 'ddan_room_11', - 'ddan_room_12', - 'ddan_room_13', - 'ddan_room_14', - 'ddan_room_15', - 'ddan_room_16', - 'bdan_scene', - 'bdan_room_0', - 'bdan_room_1', - 'bdan_room_2', - 'bdan_room_3', - 'bdan_room_4', - 'bdan_room_5', - 'bdan_room_6', - 'bdan_room_7', - 'bdan_room_8', - 'bdan_room_9', - 'bdan_room_10', - 'bdan_room_11', - 'bdan_room_12', - 'bdan_room_13', - 'bdan_room_14', - 'bdan_room_15', - 'Bmori1_scene', - 'Bmori1_room_0', - 'Bmori1_room_1', - 'Bmori1_room_2', - 'Bmori1_room_3', - 'Bmori1_room_4', - 'Bmori1_room_5', - 'Bmori1_room_6', - 'Bmori1_room_7', - 'Bmori1_room_8', - 'Bmori1_room_9', - 'Bmori1_room_10', - 'Bmori1_room_11', - 'Bmori1_room_12', - 'Bmori1_room_13', - 'Bmori1_room_14', - 'Bmori1_room_15', - 'Bmori1_room_16', - 'Bmori1_room_17', - 'Bmori1_room_18', - 'Bmori1_room_19', - 'Bmori1_room_20', - 'Bmori1_room_21', - 'Bmori1_room_22', - 'HIDAN_scene', - 'HIDAN_room_0', - 'HIDAN_room_1', - 'HIDAN_room_2', - 'HIDAN_room_3', - 'HIDAN_room_4', - 'HIDAN_room_5', - 'HIDAN_room_6', - 'HIDAN_room_7', - 'HIDAN_room_8', - 'HIDAN_room_9', - 'HIDAN_room_10', - 'HIDAN_room_11', - 'HIDAN_room_12', - 'HIDAN_room_13', - 'HIDAN_room_14', - 'HIDAN_room_15', - 'HIDAN_room_16', - 'HIDAN_room_17', - 'HIDAN_room_18', - 'HIDAN_room_19', - 'HIDAN_room_20', - 'HIDAN_room_21', - 'HIDAN_room_22', - 'HIDAN_room_23', - 'HIDAN_room_24', - 'HIDAN_room_25', - 'HIDAN_room_26', - 'MIZUsin_scene', - 'MIZUsin_room_0', - 'MIZUsin_room_1', - 'MIZUsin_room_2', - 'MIZUsin_room_3', - 'MIZUsin_room_4', - 'MIZUsin_room_5', - 'MIZUsin_room_6', - 'MIZUsin_room_7', - 'MIZUsin_room_8', - 'MIZUsin_room_9', - 'MIZUsin_room_10', - 'MIZUsin_room_11', - 'MIZUsin_room_12', - 'MIZUsin_room_13', - 'MIZUsin_room_14', - 'MIZUsin_room_15', - 'MIZUsin_room_16', - 'MIZUsin_room_17', - 'MIZUsin_room_18', - 'MIZUsin_room_19', - 'MIZUsin_room_20', - 'MIZUsin_room_21', - 'MIZUsin_room_22', - 'jyasinzou_scene', - 'jyasinzou_room_0', - 'jyasinzou_room_1', - 'jyasinzou_room_2', - 'jyasinzou_room_3', - 'jyasinzou_room_4', - 'jyasinzou_room_5', - 'jyasinzou_room_6', - 'jyasinzou_room_7', - 'jyasinzou_room_8', - 'jyasinzou_room_9', - 'jyasinzou_room_10', - 'jyasinzou_room_11', - 'jyasinzou_room_12', - 'jyasinzou_room_13', - 'jyasinzou_room_14', - 'jyasinzou_room_15', - 'jyasinzou_room_16', - 'jyasinzou_room_17', - 'jyasinzou_room_18', - 'jyasinzou_room_19', - 'jyasinzou_room_20', - 'jyasinzou_room_21', - 'jyasinzou_room_22', - 'jyasinzou_room_23', - 'jyasinzou_room_24', - 'jyasinzou_room_25', - 'jyasinzou_room_26', - 'jyasinzou_room_27', - 'jyasinzou_room_28', - 'HAKAdan_scene', - 'HAKAdan_room_0', - 'HAKAdan_room_1', - 'HAKAdan_room_2', - 'HAKAdan_room_3', - 'HAKAdan_room_4', - 'HAKAdan_room_5', - 'HAKAdan_room_6', - 'HAKAdan_room_7', - 'HAKAdan_room_8', - 'HAKAdan_room_9', - 'HAKAdan_room_10', - 'HAKAdan_room_11', - 'HAKAdan_room_12', - 'HAKAdan_room_13', - 'HAKAdan_room_14', - 'HAKAdan_room_15', - 'HAKAdan_room_16', - 'HAKAdan_room_17', - 'HAKAdan_room_18', - 'HAKAdan_room_19', - 'HAKAdan_room_20', - 'HAKAdan_room_21', - 'HAKAdan_room_22', - 'HAKAdanCH_scene', - 'HAKAdanCH_room_0', - 'HAKAdanCH_room_1', - 'HAKAdanCH_room_2', - 'HAKAdanCH_room_3', - 'HAKAdanCH_room_4', - 'HAKAdanCH_room_5', - 'HAKAdanCH_room_6', - 'ice_doukutu_scene', - 'ice_doukutu_room_0', - 'ice_doukutu_room_1', - 'ice_doukutu_room_2', - 'ice_doukutu_room_3', - 'ice_doukutu_room_4', - 'ice_doukutu_room_5', - 'ice_doukutu_room_6', - 'ice_doukutu_room_7', - 'ice_doukutu_room_8', - 'ice_doukutu_room_9', - 'ice_doukutu_room_10', - 'ice_doukutu_room_11', - 'men_scene', - 'men_room_0', - 'men_room_1', - 'men_room_2', - 'men_room_3', - 'men_room_4', - 'men_room_5', - 'men_room_6', - 'men_room_7', - 'men_room_8', - 'men_room_9', - 'men_room_10', - 'ganontika_scene', - 'ganontika_room_0', - 'ganontika_room_1', - 'ganontika_room_2', - 'ganontika_room_3', - 'ganontika_room_4', - 'ganontika_room_5', - 'ganontika_room_6', - 'ganontika_room_7', - 'ganontika_room_8', - 'ganontika_room_9', - 'ganontika_room_10', - 'ganontika_room_11', - 'ganontika_room_12', - 'ganontika_room_13', - 'ganontika_room_14', - 'ganontika_room_15', - 'ganontika_room_16', - 'ganontika_room_17', - 'ganontika_room_18', - 'ganontika_room_19', - 'market_day_scene', - 'market_day_room_0', - 'market_night_scene', - 'market_night_room_0', - 'testroom_scene', - 'testroom_room_0', - 'testroom_room_1', - 'testroom_room_2', - 'testroom_room_3', - 'testroom_room_4', - 'kenjyanoma_scene', - 'kenjyanoma_room_0', - 'tokinoma_scene', - 'tokinoma_room_0', - 'tokinoma_room_1', - 'sutaru_scene', - 'sutaru_room_0', - 'link_home_scene', - 'link_home_room_0', - 'kokiri_shop_scene', - 'kokiri_shop_room_0', - 'kokiri_home_scene', - 'kokiri_home_room_0', - 'kakusiana_scene', - 'kakusiana_room_0', - 'kakusiana_room_1', - 'kakusiana_room_2', - 'kakusiana_room_3', - 'kakusiana_room_4', - 'kakusiana_room_5', - 'kakusiana_room_6', - 'kakusiana_room_7', - 'kakusiana_room_8', - 'kakusiana_room_9', - 'kakusiana_room_10', - 'kakusiana_room_11', - 'kakusiana_room_12', - 'kakusiana_room_13', - 'entra_scene', - 'entra_room_0', - 'moribossroom_scene', - 'moribossroom_room_0', - 'moribossroom_room_1', - 'syatekijyou_scene', - 'syatekijyou_room_0', - 'shop1_scene', - 'shop1_room_0', - 'hairal_niwa_scene', - 'hairal_niwa_room_0', - 'ganon_tou_scene', - 'ganon_tou_room_0', - 'sasatest_scene', - 'sasatest_room_0', - 'market_alley_scene', - 'market_alley_room_0', - 'spot20_scene', - 'spot20_room_0', - 'market_ruins_scene', - 'market_ruins_room_0', - 'entra_n_scene', - 'entra_n_room_0', - 'enrui_scene', - 'enrui_room_0', - 'market_alley_n_scene', - 'market_alley_n_room_0', - 'hiral_demo_scene', - 'hiral_demo_room_0', - 'kokiri_home3_scene', - 'kokiri_home3_room_0', - 'malon_stable_scene', - 'malon_stable_room_0', - 'kakariko_scene', - 'kakariko_room_0', - 'bdan_boss_scene', - 'bdan_boss_room_0', - 'bdan_boss_room_1', - 'FIRE_bs_scene', - 'FIRE_bs_room_0', - 'FIRE_bs_room_1', - 'hut_scene', - 'hut_room_0', - 'daiyousei_izumi_scene', - 'daiyousei_izumi_room_0', - 'hakaana_scene', - 'hakaana_room_0', - 'yousei_izumi_tate_scene', - 'yousei_izumi_tate_room_0', - 'yousei_izumi_yoko_scene', - 'yousei_izumi_yoko_room_0', - 'golon_scene', - 'golon_room_0', - 'zoora_scene', - 'zoora_room_0', - 'drag_scene', - 'drag_room_0', - 'alley_shop_scene', - 'alley_shop_room_0', - 'night_shop_scene', - 'night_shop_room_0', - 'impa_scene', - 'impa_room_0', - 'labo_scene', - 'labo_room_0', - 'tent_scene', - 'tent_room_0', - 'nakaniwa_scene', - 'nakaniwa_room_0', - 'ddan_boss_scene', - 'ddan_boss_room_0', - 'ddan_boss_room_1', - 'ydan_boss_scene', - 'ydan_boss_room_0', - 'ydan_boss_room_1', - 'HAKAdan_bs_scene', - 'HAKAdan_bs_room_0', - 'HAKAdan_bs_room_1', - 'MIZUsin_bs_scene', - 'MIZUsin_bs_room_0', - 'MIZUsin_bs_room_1', - 'ganon_scene', - 'ganon_room_0', - 'ganon_room_1', - 'ganon_room_2', - 'ganon_room_3', - 'ganon_room_4', - 'ganon_room_5', - 'ganon_room_6', - 'ganon_room_7', - 'ganon_room_8', - 'ganon_room_9', - 'ganon_boss_scene', - 'ganon_boss_room_0', - 'jyasinboss_scene', - 'jyasinboss_room_0', - 'jyasinboss_room_1', - 'jyasinboss_room_2', - 'jyasinboss_room_3', - 'kokiri_home4_scene', - 'kokiri_home4_room_0', - 'kokiri_home5_scene', - 'kokiri_home5_room_0', - 'ganon_final_scene', - 'ganon_final_room_0', - 'kakariko3_scene', - 'kakariko3_room_0', - 'hairal_niwa2_scene', - 'hairal_niwa2_room_0', - 'hakasitarelay_scene', - 'hakasitarelay_room_0', - 'hakasitarelay_room_1', - 'hakasitarelay_room_2', - 'hakasitarelay_room_3', - 'hakasitarelay_room_4', - 'hakasitarelay_room_5', - 'hakasitarelay_room_6', - 'shrine_scene', - 'shrine_room_0', - 'turibori_scene', - 'turibori_room_0', - 'shrine_n_scene', - 'shrine_n_room_0', - 'shrine_r_scene', - 'shrine_r_room_0', - 'hakaana2_scene', - 'hakaana2_room_0', - 'gerudoway_scene', - 'gerudoway_room_0', - 'gerudoway_room_1', - 'gerudoway_room_2', - 'gerudoway_room_3', - 'gerudoway_room_4', - 'gerudoway_room_5', - 'hairal_niwa_n_scene', - 'hairal_niwa_n_room_0', - 'bowling_scene', - 'bowling_room_0', - 'hakaana_ouke_scene', - 'hakaana_ouke_room_0', - 'hakaana_ouke_room_1', - 'hakaana_ouke_room_2', - 'hylia_labo_scene', - 'hylia_labo_room_0', - 'souko_scene', - 'souko_room_0', - 'souko_room_1', - 'souko_room_2', - 'miharigoya_scene', - 'miharigoya_room_0', - 'mahouya_scene', - 'mahouya_room_0', - 'takaraya_scene', - 'takaraya_room_0', - 'takaraya_room_1', - 'takaraya_room_2', - 'takaraya_room_3', - 'takaraya_room_4', - 'takaraya_room_5', - 'takaraya_room_6', - 'ganon_sonogo_scene', - 'ganon_sonogo_room_0', - 'ganon_sonogo_room_1', - 'ganon_sonogo_room_2', - 'ganon_sonogo_room_3', - 'ganon_sonogo_room_4', - 'ganon_demo_scene', - 'ganon_demo_room_0', - 'besitu_scene', - 'besitu_room_0', - 'face_shop_scene', - 'face_shop_room_0', - 'kinsuta_scene', - 'kinsuta_room_0', - 'ganontikasonogo_scene', - 'ganontikasonogo_room_0', - 'ganontikasonogo_room_1', - 'test01_scene', - 'test01_room_0', - 'bump_texture_static', - 'anime_model_1_static', - 'anime_model_2_static', - 'anime_model_3_static', - 'anime_model_4_static', - 'anime_model_5_static', - 'anime_model_6_static', - 'anime_texture_1_static', - 'anime_texture_2_static', - 'anime_texture_3_static', - 'anime_texture_4_static', - 'anime_texture_5_static', - 'anime_texture_6_static', - 'softsprite_matrix_static', -] - -romData = None - - -def initialize_worker(rom_data): - global romData - romData = rom_data - -def read_uint32_be(offset): - return struct.unpack('>I', romData[offset:offset+4])[0] - -def write_output_file(name, offset, size): - try: - with open(name, 'wb') as f: - f.write(romData[offset:offset+size]) - except IOError: - print('failed to write file ' + name) - -def ExtractFunc(i): - filename = 'baserom/' + FILE_NAMES[i] - entryOffset = FILE_TABLE_OFFSET + 16 * i - - virtStart = read_uint32_be(entryOffset + 0) - virtEnd = read_uint32_be(entryOffset + 4) - physStart = read_uint32_be(entryOffset + 8) - physEnd = read_uint32_be(entryOffset + 12) - - if physEnd == 0: # uncompressed - compressed = False - size = virtEnd - virtStart - else: # compressed - compressed = True - size = physEnd - physStart - - print('extracting ' + filename + " (0x%08X, 0x%08X)" % (virtStart, virtEnd)) - write_output_file(filename, physStart, size) - if compressed: - os.system('tools/yaz0 -d ' + filename + ' ' + filename) - -##################################################################### - -def main(): - try: - os.mkdir('baserom') - except: - pass - - # read baserom data - try: - with open(ROM_FILE_NAME, 'rb') as f: - rom_data = f.read() - except IOError: - print('failed to read ' + ROM_FILE_NAME) - sys.exit(1) - - # extract files - num_cores = cpu_count() - print("Extracting baserom with " + str(num_cores) + " CPU cores.") - with Pool(num_cores, initialize_worker, (rom_data,)) as p: - p.map(ExtractFunc, range(len(FILE_NAMES))) - -if __name__ == "__main__": - main() From baf366c0864c154c7bc6c739ea3f3ba3099392a9 Mon Sep 17 00:00:00 2001 From: Emil Lenngren Date: Mon, 25 Apr 2022 22:53:06 +0200 Subject: [PATCH 69/83] Modify grayscale intensity for item icons to match original --- soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c | 2 +- soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c index c21ef4ca7..1e778663d 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c @@ -578,7 +578,7 @@ void KaleidoScope_DrawEquipment(GlobalContext* globalCtx) { int itemId = ITEM_SWORD_KOKIRI + temp; bool not_acquired = (gItemAgeReqs[itemId] != 9) && (gItemAgeReqs[itemId] != gSaveContext.linkAge); if (not_acquired) { - gsDPSetGrayscaleColor(POLY_KAL_DISP++, 100, 100, 100); + gsDPSetGrayscaleColor(POLY_KAL_DISP++, 109, 109, 109); gsSPGrayscale(POLY_KAL_DISP++, true); } KaleidoScope_DrawQuadTextureRGBA32(globalCtx->state.gfxCtx, gItemIcons[itemId], 32, 32, point); diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c index 7f7d81075..2ce63cf51 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c @@ -470,7 +470,7 @@ void KaleidoScope_DrawItemSelect(GlobalContext* globalCtx) { int itemId = gSaveContext.inventory.items[i]; bool not_acquired = (gItemAgeReqs[itemId] != 9) && (gItemAgeReqs[itemId] != gSaveContext.linkAge); if (not_acquired) { - gsDPSetGrayscaleColor(POLY_KAL_DISP++, 100, 100, 100); + gsDPSetGrayscaleColor(POLY_KAL_DISP++, 109, 109, 109); gsSPGrayscale(POLY_KAL_DISP++, true); } KaleidoScope_DrawQuadTextureRGBA32(globalCtx->state.gfxCtx, gItemIcons[itemId], 32, From eecad3dc1513f0dd62e8022c86ae1f07c1598a76 Mon Sep 17 00:00:00 2001 From: vaguerant Date: Sat, 23 Apr 2022 16:31:02 +1000 Subject: [PATCH 70/83] Credits message order fix by rink --- soh/src/code/z_message_PAL.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/src/code/z_message_PAL.c b/soh/src/code/z_message_PAL.c index 4780044a6..8b9410018 100644 --- a/soh/src/code/z_message_PAL.c +++ b/soh/src/code/z_message_PAL.c @@ -391,7 +391,7 @@ void Message_FindCreditsMessage(GlobalContext* globalCtx, u16 textId) { if (messageTableEntry->textId == textId) { foundSeg = messageTableEntry->segment; font->charTexBuf[0] = messageTableEntry->typePos; - messageTableEntry++; + //messageTableEntry++; nextSeg = messageTableEntry->segment; font->msgOffset = messageTableEntry->segment; font->msgLength = messageTableEntry->msgSize; From 0ea9612b7e1ea82b771b0d85a42a86f9bd530b4a Mon Sep 17 00:00:00 2001 From: KiritoDev <36680385+KiritoDv@users.noreply.github.com> Date: Mon, 25 Apr 2022 17:04:15 -0500 Subject: [PATCH 71/83] Moved vismono effect to the gpu --- .../libultraship/Lib/Fast3D/U64/PR/ultra64/gbi.h | 4 ++-- .../libultraship/Lib/Fast3D/gfx_direct3d_common.cpp | 3 ++- libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp | 3 ++- soh/src/code/z_play.c | 11 +++++++---- soh/src/overlays/actors/ovl_End_Title/z_end_title.c | 5 ++++- soh/src/overlays/gamestates/ovl_title/z_title.c | 2 ++ .../misc/ovl_kaleido_scope/z_kaleido_equipment.c | 2 +- .../overlays/misc/ovl_kaleido_scope/z_kaleido_item.c | 2 +- 8 files changed, 21 insertions(+), 11 deletions(-) diff --git a/libultraship/libultraship/Lib/Fast3D/U64/PR/ultra64/gbi.h b/libultraship/libultraship/Lib/Fast3D/U64/PR/ultra64/gbi.h index 3b4b8f7d8..b91856ef6 100644 --- a/libultraship/libultraship/Lib/Fast3D/U64/PR/ultra64/gbi.h +++ b/libultraship/libultraship/Lib/Fast3D/U64/PR/ultra64/gbi.h @@ -3175,8 +3175,8 @@ _DW({ \ (_SHIFTL(r, 24, 8) | _SHIFTL(g, 16, 8) | \ _SHIFTL(b, 8, 8) | _SHIFTL(a, 0, 8))) -#define gsDPSetGrayscaleColor(pkt, r, g, b) \ - DPRGBColor(pkt, G_SETINTENSITY, r, g, b, 255) +#define gsDPSetGrayscaleColor(pkt, r, g, b, lerp) \ + DPRGBColor(pkt, G_SETINTENSITY, r, g, b, lerp) #define gDPSetEnvColor(pkt, r, g, b, a) \ DPRGBColor(pkt, G_SETENVCOLOR, r,g,b,a) #define gsDPSetEnvColor(r, g, b, a) \ diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_direct3d_common.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_direct3d_common.cpp index 8df273be7..a8197b321 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_direct3d_common.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_direct3d_common.cpp @@ -310,7 +310,8 @@ void gfx_direct3d_common_build_shader(char buf[4096], size_t& len, size_t& num_f if (cc_features.opt_grayscale) { append_line(buf, &len, "float intensity = (texel.r + texel.g + texel.b) / 3.0;"); - append_line(buf, &len, "texel.rgb = input.grayscale.rgb * intensity;"); + append_line(buf, &len, "float3 new_texel = input.grayscale.rgb * intensity;"); + append_line(buf, &len, "texel.rgb = input.grayscale.a > 0 ? lerp(texel.rgb, new_texel, input.grayscale.a) : new_texel;"); } if (cc_features.opt_alpha && cc_features.opt_noise) { diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp index 808b0a558..c8dc4666e 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp @@ -370,7 +370,8 @@ static struct ShaderProgram* gfx_opengl_create_and_load_new_shader(uint64_t shad if (cc_features.opt_grayscale) { append_line(fs_buf, &fs_len, "float intensity = (texel.r + texel.g + texel.b) / 3.0;"); - append_line(fs_buf, &fs_len, "texel.rgb = vGrayscaleColor.rgb * intensity;"); + append_line(fs_buf, &fs_len, "vec3 new_texel = vGrayscaleColor.rgb * intensity;"); + append_line(fs_buf, &fs_len, "texel.rgb = vGrayscaleColor.a > 0 ? mix(texel.rgb, new_texel, vGrayscaleColor.a) : new_texel;"); } if (cc_features.opt_alpha) { diff --git a/soh/src/code/z_play.c b/soh/src/code/z_play.c index 193b14164..f62e719ba 100644 --- a/soh/src/code/z_play.c +++ b/soh/src/code/z_play.c @@ -1,3 +1,5 @@ +#include + #include "global.h" #include "vt.h" @@ -1119,6 +1121,7 @@ void Gameplay_Draw(GlobalContext* globalCtx) { gfxP = Graph_GfxPlusOne(sp1CC); gSPDisplayList(OVERLAY_DISP++, gfxP); + gsSPGrayscale(gfxP++, false); if ((globalCtx->transitionMode == 3) || (globalCtx->transitionMode == 11) || (globalCtx->transitionCtx.transitionType >= 56)) { @@ -1136,8 +1139,8 @@ void Gameplay_Draw(GlobalContext* globalCtx) { TransitionFade_Draw(&globalCtx->transitionFade, &gfxP); if (D_801614B0.a > 0) { - D_80161498.primColor.rgba = D_801614B0.rgba; - VisMono_Draw(&D_80161498, &gfxP); + gsDPSetGrayscaleColor(gfxP++, D_801614B0.r, D_801614B0.g, D_801614B0.b, D_801614B0.a); + gsSPGrayscale(gfxP++, true); } gSPEndDisplayList(gfxP++); @@ -1171,7 +1174,7 @@ void Gameplay_Draw(GlobalContext* globalCtx) { //goto Gameplay_Draw_DrawOverlayElements; } - //else + //else { s32 sp80; @@ -1472,7 +1475,7 @@ void Gameplay_InitEnvironment(GlobalContext* globalCtx, s16 skyboxId) { Environment_Init(globalCtx, &globalCtx->envCtx, 0); } -void Gameplay_InitScene(GlobalContext* globalCtx, s32 spawn) +void Gameplay_InitScene(GlobalContext* globalCtx, s32 spawn) { globalCtx->curSpawn = spawn; globalCtx->linkActorEntry = NULL; diff --git a/soh/src/overlays/actors/ovl_End_Title/z_end_title.c b/soh/src/overlays/actors/ovl_End_Title/z_end_title.c index f76ac084d..0c903bb80 100644 --- a/soh/src/overlays/actors/ovl_End_Title/z_end_title.c +++ b/soh/src/overlays/actors/ovl_End_Title/z_end_title.c @@ -84,6 +84,8 @@ void EndTitle_DrawFull(Actor* thisx, GlobalContext* globalCtx) { } OVERLAY_DISP = func_80093F34(OVERLAY_DISP); + if (D_801614B0.a > 0) + gsSPGrayscale(OVERLAY_DISP++, false); gDPSetTextureLUT(OVERLAY_DISP++, G_TT_NONE); gDPSetEnvColor(OVERLAY_DISP++, 255, 120, 30, 0); gDPSetRenderMode(OVERLAY_DISP++, G_RM_PASS, G_RM_XLU_SURF2); @@ -108,7 +110,8 @@ void EndTitle_DrawFull(Actor* thisx, GlobalContext* globalCtx) { G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 0, 0, 0, 0); gSPTextureRectangle(OVERLAY_DISP++, 104 << 2, 177 << 2, 216 << 2, 192 << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); - + if (D_801614B0.a > 0) + gsSPGrayscale(OVERLAY_DISP++, true); CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_end_title.c", 515); } diff --git a/soh/src/overlays/gamestates/ovl_title/z_title.c b/soh/src/overlays/gamestates/ovl_title/z_title.c index 3b7cfe84c..380720dd1 100644 --- a/soh/src/overlays/gamestates/ovl_title/z_title.c +++ b/soh/src/overlays/gamestates/ovl_title/z_title.c @@ -271,6 +271,8 @@ void Title_Init(GameState* thisx) { //ResourceMgr_CacheDirectory("nintendo_rogo_static*"); + // Disable vismono + D_801614B0.a = 0; R_UPDATE_RATE = 1; Matrix_Init(&this->state); View_Init(&this->view, this->state.gfxCtx); diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c index 1e778663d..ba981c58f 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c @@ -578,7 +578,7 @@ void KaleidoScope_DrawEquipment(GlobalContext* globalCtx) { int itemId = ITEM_SWORD_KOKIRI + temp; bool not_acquired = (gItemAgeReqs[itemId] != 9) && (gItemAgeReqs[itemId] != gSaveContext.linkAge); if (not_acquired) { - gsDPSetGrayscaleColor(POLY_KAL_DISP++, 109, 109, 109); + gsDPSetGrayscaleColor(POLY_KAL_DISP++, 109, 109, 109, 0); gsSPGrayscale(POLY_KAL_DISP++, true); } KaleidoScope_DrawQuadTextureRGBA32(globalCtx->state.gfxCtx, gItemIcons[itemId], 32, 32, point); diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c index 2ce63cf51..26f37deb9 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c @@ -470,7 +470,7 @@ void KaleidoScope_DrawItemSelect(GlobalContext* globalCtx) { int itemId = gSaveContext.inventory.items[i]; bool not_acquired = (gItemAgeReqs[itemId] != 9) && (gItemAgeReqs[itemId] != gSaveContext.linkAge); if (not_acquired) { - gsDPSetGrayscaleColor(POLY_KAL_DISP++, 109, 109, 109); + gsDPSetGrayscaleColor(POLY_KAL_DISP++, 109, 109, 109, 0); gsSPGrayscale(POLY_KAL_DISP++, true); } KaleidoScope_DrawQuadTextureRGBA32(globalCtx->state.gfxCtx, gItemIcons[itemId], 32, From f5f2205d0f0a1f2fcbedaa8b648d83113e7ab3d7 Mon Sep 17 00:00:00 2001 From: KiritoDev <36680385+KiritoDv@users.noreply.github.com> Date: Mon, 25 Apr 2022 17:07:40 -0500 Subject: [PATCH 72/83] Removed stdio and added documentation --- libultraship/libultraship/Lib/Fast3D/U64/PR/ultra64/gbi.h | 2 +- libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp | 2 +- soh/src/code/z_play.c | 2 -- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/libultraship/libultraship/Lib/Fast3D/U64/PR/ultra64/gbi.h b/libultraship/libultraship/Lib/Fast3D/U64/PR/ultra64/gbi.h index b91856ef6..8af624e8f 100644 --- a/libultraship/libultraship/Lib/Fast3D/U64/PR/ultra64/gbi.h +++ b/libultraship/libultraship/Lib/Fast3D/U64/PR/ultra64/gbi.h @@ -3175,7 +3175,7 @@ _DW({ \ (_SHIFTL(r, 24, 8) | _SHIFTL(g, 16, 8) | \ _SHIFTL(b, 8, 8) | _SHIFTL(a, 0, 8))) -#define gsDPSetGrayscaleColor(pkt, r, g, b, lerp) \ +#define gsDPSetGrayscaleColor(pkt, r, g, b, lerp) \ DPRGBColor(pkt, G_SETINTENSITY, r, g, b, lerp) #define gDPSetEnvColor(pkt, r, g, b, a) \ DPRGBColor(pkt, G_SETENVCOLOR, r,g,b,a) diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp index 130d07b73..1d03befe6 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp @@ -1397,7 +1397,7 @@ static void gfx_sp_tri1(uint8_t vtx1_idx, uint8_t vtx2_idx, uint8_t vtx3_idx, bo buf_vbo[buf_vbo_len++] = rdp.grayscale_color.r / 255.0f; buf_vbo[buf_vbo_len++] = rdp.grayscale_color.g / 255.0f; buf_vbo[buf_vbo_len++] = rdp.grayscale_color.b / 255.0f; - buf_vbo[buf_vbo_len++] = rdp.grayscale_color.a / 255.0f; // Unused + buf_vbo[buf_vbo_len++] = rdp.grayscale_color.a / 255.0f; // lerp interpolation factor (not alpha) } for (int j = 0; j < num_inputs; j++) { diff --git a/soh/src/code/z_play.c b/soh/src/code/z_play.c index f62e719ba..6218b7d76 100644 --- a/soh/src/code/z_play.c +++ b/soh/src/code/z_play.c @@ -1,5 +1,3 @@ -#include - #include "global.h" #include "vt.h" From 6991549cde13791a094cecd383ba38baf80d3719 Mon Sep 17 00:00:00 2001 From: KiritoDev <36680385+KiritoDv@users.noreply.github.com> Date: Mon, 25 Apr 2022 17:56:52 -0500 Subject: [PATCH 73/83] Removed ternary operator --- libultraship/libultraship/Lib/Fast3D/gfx_direct3d_common.cpp | 2 +- libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp | 2 +- soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c | 2 +- soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_direct3d_common.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_direct3d_common.cpp index a8197b321..2c10e6605 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_direct3d_common.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_direct3d_common.cpp @@ -311,7 +311,7 @@ void gfx_direct3d_common_build_shader(char buf[4096], size_t& len, size_t& num_f if (cc_features.opt_grayscale) { append_line(buf, &len, "float intensity = (texel.r + texel.g + texel.b) / 3.0;"); append_line(buf, &len, "float3 new_texel = input.grayscale.rgb * intensity;"); - append_line(buf, &len, "texel.rgb = input.grayscale.a > 0 ? lerp(texel.rgb, new_texel, input.grayscale.a) : new_texel;"); + append_line(buf, &len, "texel.rgb = lerp(texel.rgb, new_texel, input.grayscale.a);"); } if (cc_features.opt_alpha && cc_features.opt_noise) { diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp index c8dc4666e..6f3017c15 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp @@ -371,7 +371,7 @@ static struct ShaderProgram* gfx_opengl_create_and_load_new_shader(uint64_t shad if (cc_features.opt_grayscale) { append_line(fs_buf, &fs_len, "float intensity = (texel.r + texel.g + texel.b) / 3.0;"); append_line(fs_buf, &fs_len, "vec3 new_texel = vGrayscaleColor.rgb * intensity;"); - append_line(fs_buf, &fs_len, "texel.rgb = vGrayscaleColor.a > 0 ? mix(texel.rgb, new_texel, vGrayscaleColor.a) : new_texel;"); + append_line(fs_buf, &fs_len, "texel.rgb = mix(texel.rgb, new_texel, vGrayscaleColor.a);"); } if (cc_features.opt_alpha) { diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c index ba981c58f..5b90725e1 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c @@ -578,7 +578,7 @@ void KaleidoScope_DrawEquipment(GlobalContext* globalCtx) { int itemId = ITEM_SWORD_KOKIRI + temp; bool not_acquired = (gItemAgeReqs[itemId] != 9) && (gItemAgeReqs[itemId] != gSaveContext.linkAge); if (not_acquired) { - gsDPSetGrayscaleColor(POLY_KAL_DISP++, 109, 109, 109, 0); + gsDPSetGrayscaleColor(POLY_KAL_DISP++, 109, 109, 109, 255); gsSPGrayscale(POLY_KAL_DISP++, true); } KaleidoScope_DrawQuadTextureRGBA32(globalCtx->state.gfxCtx, gItemIcons[itemId], 32, 32, point); diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c index 26f37deb9..52c04908f 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c @@ -470,7 +470,7 @@ void KaleidoScope_DrawItemSelect(GlobalContext* globalCtx) { int itemId = gSaveContext.inventory.items[i]; bool not_acquired = (gItemAgeReqs[itemId] != 9) && (gItemAgeReqs[itemId] != gSaveContext.linkAge); if (not_acquired) { - gsDPSetGrayscaleColor(POLY_KAL_DISP++, 109, 109, 109, 0); + gsDPSetGrayscaleColor(POLY_KAL_DISP++, 109, 109, 109, 255); gsSPGrayscale(POLY_KAL_DISP++, true); } KaleidoScope_DrawQuadTextureRGBA32(globalCtx->state.gfxCtx, gItemIcons[itemId], 32, From 4869eea9686d3f28f79d8af67fb09efd16e34c22 Mon Sep 17 00:00:00 2001 From: Emil Lenngren Date: Tue, 26 Apr 2022 00:24:21 +0200 Subject: [PATCH 74/83] Fix random crash in z_construct --- soh/src/code/z_construct.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/soh/src/code/z_construct.c b/soh/src/code/z_construct.c index 5149fd974..c74d3c14c 100644 --- a/soh/src/code/z_construct.c +++ b/soh/src/code/z_construct.c @@ -56,7 +56,8 @@ void func_801109B0(GlobalContext* globalCtx) { doActionOffset = 0x5700; } - memcpy(interfaceCtx->doActionSegment, ResourceMgr_LoadTexByName(gAttackDoActionENGTex), 0x300); + memcpy(interfaceCtx->doActionSegment, ResourceMgr_LoadTexByName(gAttackDoActionENGTex), 0x180); + memcpy(interfaceCtx->doActionSegment + 0x180, ResourceMgr_LoadTexByName(gCheckDoActionENGTex), 0x180); //DmaMgr_SendRequest1(interfaceCtx->doActionSegment, (uintptr_t)_do_action_staticSegmentRomStart + doActionOffset, 0x300, //"../z_construct.c", 174); From b82871e62f4934787e9585116469c161816c9670 Mon Sep 17 00:00:00 2001 From: IShallRiseAgain <49771132+IShallRiseAgain@users.noreply.github.com> Date: Tue, 26 Apr 2022 18:33:18 -0400 Subject: [PATCH 75/83] Added custom color support for Tunic and Navi (#98) --- libultraship/libultraship/GameSettings.cpp | 123 ++++++++++++++ libultraship/libultraship/GameSettings.h | 42 +++++ libultraship/libultraship/SohImGuiImpl.cpp | 178 +++++++++++++++++++++ soh/src/code/z_actor.c | 32 ++++ soh/src/code/z_player_lib.c | 23 ++- 5 files changed, 396 insertions(+), 2 deletions(-) diff --git a/libultraship/libultraship/GameSettings.cpp b/libultraship/libultraship/GameSettings.cpp index c056dec71..5e02037de 100644 --- a/libultraship/libultraship/GameSettings.cpp +++ b/libultraship/libultraship/GameSettings.cpp @@ -27,8 +27,10 @@ namespace Game { const std::string AudioSection = AUDIO_SECTION; const std::string ControllerSection = CONTROLLER_SECTION; const std::string EnhancementSection = ENHANCEMENTS_SECTION; + const std::string CosmeticsSection = COSMETICS_SECTION; const std::string CheatSection = CHEATS_SECTION; + void UpdateAudio() { Audio_SetGameVolume(SEQ_BGM_MAIN, Settings.audio.music_main); Audio_SetGameVolume(SEQ_BGM_SUB, Settings.audio.music_sub); @@ -103,6 +105,84 @@ namespace Game { CVar_SetFloat("gInputScale", Settings.controller.input_scale); Settings.controller.input_enabled = stob(Conf[ControllerSection]["input_enabled"]); + + CVar_SetS32(const_cast("gInputEnabled"), Settings.controller.input_enabled); + //Tunics + Settings.cosmetic.tunic_kokiri_red = (Conf[CosmeticsSection]["tunic_kokiri_red"] != "") ? Ship::stoi(Conf[CosmeticsSection]["tunic_kokiri_red"]) : Settings.cosmetic.tunic_kokiri_red; + CVar_SetS32(const_cast("gTunic_Kokiri_Red"), Settings.cosmetic.tunic_kokiri_red); + Settings.cosmetic.tunic_kokiri_green = (Conf[CosmeticsSection]["tunic_kokiri_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["tunic_kokiri_green"]) : Settings.cosmetic.tunic_kokiri_green; + CVar_SetS32(const_cast("gTunic_Kokiri_Green"), Settings.cosmetic.tunic_kokiri_green); + Settings.cosmetic.tunic_kokiri_blue = (Conf[CosmeticsSection]["tunic_kokiri_blue"] != "") ? Ship::stoi(Conf[CosmeticsSection]["tunic_kokiri_blue"]) : Settings.cosmetic.tunic_kokiri_blue; + CVar_SetS32(const_cast("gTunic_Kokiri_Blue"), Settings.cosmetic.tunic_kokiri_blue); + + Settings.cosmetic.tunic_goron_red = (Conf[CosmeticsSection]["tunic_goron_red"] != "") ? Ship::stoi(Conf[CosmeticsSection]["tunic_goron_red"]) : Settings.cosmetic.tunic_goron_red; + CVar_SetS32(const_cast("gTunic_Goron_Red"), Settings.cosmetic.tunic_goron_red); + Settings.cosmetic.tunic_goron_green = (Conf[CosmeticsSection]["tunic_goron_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["tunic_goron_green"]) : Settings.cosmetic.tunic_goron_green; + CVar_SetS32(const_cast("gTunic_Goron_Green"), Settings.cosmetic.tunic_goron_green); + Settings.cosmetic.tunic_goron_blue = (Conf[CosmeticsSection]["tunic_goron_blue"] != "") ? Ship::stoi(Conf[CosmeticsSection]["tunic_goron_blue"]) : Settings.cosmetic.tunic_goron_blue; + CVar_SetS32(const_cast("gTunic_Goron_Blue"), Settings.cosmetic.tunic_goron_blue); + + Settings.cosmetic.tunic_zora_red = (Conf[CosmeticsSection]["tunic_zora_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["tunic_zora_red"]) : Settings.cosmetic.tunic_zora_red; + CVar_SetS32(const_cast("gTunic_Zora_Red"), Settings.cosmetic.tunic_zora_red); + Settings.cosmetic.tunic_zora_green = (Conf[CosmeticsSection]["tunic_zora_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["tunic_zora_green"]) : Settings.cosmetic.tunic_zora_green; + CVar_SetS32(const_cast("gTunic_Zora_Green"), Settings.cosmetic.tunic_zora_green); + Settings.cosmetic.tunic_zora_blue = (Conf[CosmeticsSection]["tunic_zora_blue"] != "" ) ? Ship::stoi(Conf[CosmeticsSection]["tunic_zora_blue"]) : Settings.cosmetic.tunic_zora_blue; + CVar_SetS32(const_cast("gTunic_Zora_Blue"), Settings.cosmetic.tunic_zora_blue); + //Navi + Settings.cosmetic.navi_idle_inner_red = (Conf[CosmeticsSection]["navi_idle_inner_red"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_idle_inner_red"]) : Settings.cosmetic.navi_idle_inner_red; + CVar_SetS32(const_cast("gNavi_Idle_Inner_Red"), Settings.cosmetic.navi_idle_inner_red); + Settings.cosmetic.navi_idle_inner_green = (Conf[CosmeticsSection]["navi_idle_inner_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_idle_inner_green"]) : Settings.cosmetic.navi_idle_inner_green; + CVar_SetS32(const_cast("gNavi_Idle_Inner_Green"), Settings.cosmetic.navi_idle_inner_green); + Settings.cosmetic.navi_idle_inner_blue = (Conf[CosmeticsSection]["navi_idle_inner_blue"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_idle_inner_blue"]) : Settings.cosmetic.navi_idle_inner_blue; + CVar_SetS32(const_cast("gNavi_Idle_Inner_Blue"), Settings.cosmetic.navi_idle_inner_blue); + Settings.cosmetic.navi_idle_outer_red = (Conf[CosmeticsSection]["navi_idle_outer_red"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_idle_outer_red"]) : Settings.cosmetic.navi_idle_outer_red; + CVar_SetS32(const_cast("gNavi_Idle_Outer_Red"), Settings.cosmetic.navi_idle_outer_red); + Settings.cosmetic.navi_idle_outer_green = (Conf[CosmeticsSection]["navi_idle_outer_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_idle_outer_green"]) : Settings.cosmetic.navi_idle_outer_green; + CVar_SetS32(const_cast("gNavi_Idle_Outer_Green"), Settings.cosmetic.navi_idle_outer_green); + Settings.cosmetic.navi_idle_outer_blue = (Conf[CosmeticsSection]["navi_idle_outer_blue"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_idle_outer_blue"]) : Settings.cosmetic.navi_idle_outer_blue; + CVar_SetS32(const_cast("gNavi_Idle_Outer_Blue"), Settings.cosmetic.navi_idle_outer_blue); + + Settings.cosmetic.navi_npc_inner_red = (Conf[CosmeticsSection]["navi_npc_inner_red"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_npc_inner_red"]) : Settings.cosmetic.navi_npc_inner_red; + CVar_SetS32(const_cast("gNavi_NPC_Inner_Red"), Settings.cosmetic.navi_npc_inner_red); + Settings.cosmetic.navi_npc_inner_green = (Conf[CosmeticsSection]["navi_npc_inner_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_npc_inner_green"]) : Settings.cosmetic.navi_npc_inner_green; + CVar_SetS32(const_cast("gNavi_NPC_Inner_Green"), Settings.cosmetic.navi_npc_inner_green); + Settings.cosmetic.navi_npc_inner_blue = (Conf[CosmeticsSection]["navi_npc_inner_blue"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_npc_inner_blue"]) : Settings.cosmetic.navi_npc_inner_blue; + CVar_SetS32(const_cast("gNavi_NPC_Inner_Blue"), Settings.cosmetic.navi_npc_inner_blue); + Settings.cosmetic.navi_npc_outer_red = (Conf[CosmeticsSection]["navi_npc_outer_red"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_npc_outer_red"]) : Settings.cosmetic.navi_npc_outer_red; + CVar_SetS32(const_cast("gNavi_NPC_Outer_Red"), Settings.cosmetic.navi_npc_outer_red); + Settings.cosmetic.navi_npc_outer_green = (Conf[CosmeticsSection]["navi_npc_outer_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_npc_outer_green"]) : Settings.cosmetic.navi_npc_outer_green; + CVar_SetS32(const_cast("gNavi_NPC_Outer_Green"), Settings.cosmetic.navi_npc_outer_green); + Settings.cosmetic.navi_npc_outer_blue = (Conf[CosmeticsSection]["navi_npc_outer_blue"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_npc_outer_blue"]) : Settings.cosmetic.navi_npc_outer_blue; + CVar_SetS32(const_cast("gNavi_NPC_Outer_Blue"), Settings.cosmetic.navi_npc_outer_blue); + + Settings.cosmetic.navi_enemy_inner_red = (Conf[CosmeticsSection]["navi_enemy_inner_red"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_enemy_inner_red"]) : Settings.cosmetic.navi_enemy_inner_red; + CVar_SetS32(const_cast("gNavi_Enemy_Inner_Red"), Settings.cosmetic.navi_enemy_inner_red); + Settings.cosmetic.navi_enemy_inner_green = (Conf[CosmeticsSection]["navi_enemy_inner_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_enemy_inner_green"]) : Settings.cosmetic.navi_enemy_inner_green; + CVar_SetS32(const_cast("gNavi_Enemy_Inner_Green"), Settings.cosmetic.navi_enemy_inner_green); + Settings.cosmetic.navi_enemy_inner_blue = (Conf[CosmeticsSection]["navi_enemy_inner_blue"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_enemy_inner_blue"]) : Settings.cosmetic.navi_enemy_inner_blue; + CVar_SetS32(const_cast("gNavi_Enemy_Inner_Blue"), Settings.cosmetic.navi_enemy_inner_blue); + Settings.cosmetic.navi_enemy_outer_red = (Conf[CosmeticsSection]["navi_enemy_outer_red"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_enemy_outer_red"]) : Settings.cosmetic.navi_enemy_outer_red; + CVar_SetS32(const_cast("gNavi_Enemy_Outer_Red"), Settings.cosmetic.navi_enemy_outer_red); + Settings.cosmetic.navi_enemy_outer_green = (Conf[CosmeticsSection]["navi_enemy_outer_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_enemy_outer_green"]) : Settings.cosmetic.navi_enemy_outer_green; + CVar_SetS32(const_cast("gNavi_Enemy_Outer_Green"), Settings.cosmetic.navi_enemy_outer_green); + Settings.cosmetic.navi_enemy_outer_blue = (Conf[CosmeticsSection]["navi_enemy_outer_blue"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_enemy_outer_blue"]) : Settings.cosmetic.navi_enemy_outer_blue; + CVar_SetS32(const_cast("gNavi_Enemy_Outer_Blue"), Settings.cosmetic.navi_enemy_outer_blue); + + Settings.cosmetic.navi_prop_inner_red = (Conf[CosmeticsSection]["navi_prop_inner_red"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_prop_inner_red"]) : Settings.cosmetic.navi_prop_inner_red; + CVar_SetS32(const_cast("gNavi_Prop_Inner_Red"), Settings.cosmetic.navi_prop_inner_red); + Settings.cosmetic.navi_prop_inner_green = (Conf[CosmeticsSection]["navi_prop_inner_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_prop_inner_green"]) : Settings.cosmetic.navi_prop_inner_green; + CVar_SetS32(const_cast("gNavi_Prop_Inner_Green"), Settings.cosmetic.navi_prop_inner_green); + Settings.cosmetic.navi_prop_inner_blue = (Conf[CosmeticsSection]["navi_prop_inner_blue"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_prop_inner_blue"]) : Settings.cosmetic.navi_prop_inner_blue; + CVar_SetS32(const_cast("gNavi_Prop_Inner_Blue"), Settings.cosmetic.navi_prop_inner_blue); + Settings.cosmetic.navi_prop_outer_red = (Conf[CosmeticsSection]["navi_prop_outer_red"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_prop_outer_red"]) : Settings.cosmetic.navi_prop_outer_red; + CVar_SetS32(const_cast("gNavi_Prop_Outer_Red"), Settings.cosmetic.navi_prop_outer_red); + Settings.cosmetic.navi_prop_outer_green = (Conf[CosmeticsSection]["navi_prop_outer_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_prop_outer_green"]) : Settings.cosmetic.navi_prop_outer_green; + CVar_SetS32(const_cast("gNavi_Prop_Outer_Green"), Settings.cosmetic.navi_prop_outer_green); + Settings.cosmetic.navi_prop_outer_blue = (Conf[CosmeticsSection]["navi_prop_outer_blue"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_prop_outer_blue"]) : Settings.cosmetic.navi_prop_outer_blue; + CVar_SetS32(const_cast("gNavi_Prop_Outer_Blue"), Settings.cosmetic.navi_prop_outer_blue); + + + CVar_SetS32("gInputEnabled", Settings.controller.input_enabled); Settings.controller.dpad_pause_name = stob(Conf[ControllerSection]["dpad_pause_name"]); @@ -195,6 +275,48 @@ namespace Game { Conf[ControllerSection]["dpad_ocarina_text"] = std::to_string(Settings.controller.dpad_ocarina_text); Conf[ControllerSection]["dpad_shop"] = std::to_string(Settings.controller.dpad_shop); + + // Cosmetics + Conf[CosmeticsSection]["tunic_kokiri_red"] = std::to_string(Settings.cosmetic.tunic_kokiri_red); + Conf[CosmeticsSection]["tunic_kokiri_green"] = std::to_string(Settings.cosmetic.tunic_kokiri_green); + Conf[CosmeticsSection]["tunic_kokiri_blue"] = std::to_string(Settings.cosmetic.tunic_kokiri_blue); + + Conf[CosmeticsSection]["tunic_goron_red"] = std::to_string(Settings.cosmetic.tunic_goron_red); + Conf[CosmeticsSection]["tunic_goron_green"] = std::to_string(Settings.cosmetic.tunic_goron_green); + Conf[CosmeticsSection]["tunic_goron_blue"] = std::to_string(Settings.cosmetic.tunic_goron_blue); + + Conf[CosmeticsSection]["tunic_zora_red"] = std::to_string(Settings.cosmetic.tunic_zora_red); + Conf[CosmeticsSection]["tunic_zora_green"] = std::to_string(Settings.cosmetic.tunic_zora_green); + Conf[CosmeticsSection]["tunic_zora_blue"] = std::to_string(Settings.cosmetic.tunic_zora_blue); + + Conf[CosmeticsSection]["navi_idle_inner_red"] = std::to_string(Settings.cosmetic.navi_idle_inner_red); + Conf[CosmeticsSection]["navi_idle_inner_green"] = std::to_string(Settings.cosmetic.navi_idle_inner_green); + Conf[CosmeticsSection]["navi_idle_inner_blue"] = std::to_string(Settings.cosmetic.navi_idle_inner_blue); + Conf[CosmeticsSection]["navi_idle_outer_red"] = std::to_string(Settings.cosmetic.navi_idle_outer_red); + Conf[CosmeticsSection]["navi_idle_outer_green"] = std::to_string(Settings.cosmetic.navi_idle_outer_green); + Conf[CosmeticsSection]["navi_idle_outer_blue"] = std::to_string(Settings.cosmetic.navi_idle_outer_blue); + + Conf[CosmeticsSection]["navi_npc_inner_red"] = std::to_string(Settings.cosmetic.navi_npc_inner_red); + Conf[CosmeticsSection]["navi_npc_inner_green"] = std::to_string(Settings.cosmetic.navi_npc_inner_green); + Conf[CosmeticsSection]["navi_npc_inner_blue"] = std::to_string(Settings.cosmetic.navi_npc_inner_blue); + Conf[CosmeticsSection]["navi_npc_outer_red"] = std::to_string(Settings.cosmetic.navi_npc_outer_red); + Conf[CosmeticsSection]["navi_npc_outer_green"] = std::to_string(Settings.cosmetic.navi_npc_outer_green); + Conf[CosmeticsSection]["navi_npc_outer_blue"] = std::to_string(Settings.cosmetic.navi_npc_outer_blue); + + Conf[CosmeticsSection]["navi_enemy_inner_red"] = std::to_string(Settings.cosmetic.navi_enemy_inner_red); + Conf[CosmeticsSection]["navi_enemy_inner_green"] = std::to_string(Settings.cosmetic.navi_enemy_inner_green); + Conf[CosmeticsSection]["navi_enemy_inner_blue"] = std::to_string(Settings.cosmetic.navi_enemy_inner_blue); + Conf[CosmeticsSection]["navi_enemy_outer_red"] = std::to_string(Settings.cosmetic.navi_enemy_outer_red); + Conf[CosmeticsSection]["navi_enemy_outer_green"] = std::to_string(Settings.cosmetic.navi_enemy_outer_green); + Conf[CosmeticsSection]["navi_enemy_outer_blue"] = std::to_string(Settings.cosmetic.navi_enemy_outer_blue); + + Conf[CosmeticsSection]["navi_prop_inner_red"] = std::to_string(Settings.cosmetic.navi_prop_inner_red); + Conf[CosmeticsSection]["navi_prop_inner_green"] = std::to_string(Settings.cosmetic.navi_prop_inner_green); + Conf[CosmeticsSection]["navi_prop_inner_blue"] = std::to_string(Settings.cosmetic.navi_prop_inner_blue); + Conf[CosmeticsSection]["navi_prop_outer_red"] = std::to_string(Settings.cosmetic.navi_prop_outer_red); + Conf[CosmeticsSection]["navi_prop_outer_green"] = std::to_string(Settings.cosmetic.navi_prop_outer_green); + Conf[CosmeticsSection]["navi_prop_outer_blue"] = std::to_string(Settings.cosmetic.navi_prop_outer_blue); + // Cheats Conf[CheatSection]["debug_mode"] = std::to_string(Settings.cheats.debug_mode); Conf[CheatSection]["infinite_money"] = std::to_string(Settings.cheats.infinite_money); @@ -206,6 +328,7 @@ namespace Game { Conf[CheatSection]["moon_jump_on_l"] = std::to_string(Settings.cheats.moon_jump_on_l); Conf[CheatSection]["super_tunic"] = std::to_string(Settings.cheats.super_tunic); + Conf.Save(); } diff --git a/libultraship/libultraship/GameSettings.h b/libultraship/libultraship/GameSettings.h index 990132f4e..c2d2107e0 100644 --- a/libultraship/libultraship/GameSettings.h +++ b/libultraship/libultraship/GameSettings.h @@ -45,6 +45,47 @@ struct SoHConfigType { bool dpad_shop = false; } controller; + struct { + int tunic_kokiri_red = 30; + int tunic_kokiri_green = 105; + int tunic_kokiri_blue = 27; + int tunic_goron_red = 100; + int tunic_goron_green = 20; + int tunic_goron_blue = 0; + int tunic_zora_red = 0; + int tunic_zora_green = 60; + int tunic_zora_blue = 100; + + int navi_idle_inner_red = 255; + int navi_idle_inner_green = 255; + int navi_idle_inner_blue = 255; + int navi_idle_outer_red = 0; + int navi_idle_outer_green = 0; + int navi_idle_outer_blue = 255; + + int navi_enemy_inner_red = 255; + int navi_enemy_inner_green = 255; + int navi_enemy_inner_blue = 0; + int navi_enemy_outer_red = 200; + int navi_enemy_outer_green = 155; + int navi_enemy_outer_blue = 0; + + int navi_npc_inner_red = 150; + int navi_npc_inner_green = 150; + int navi_npc_inner_blue = 255; + int navi_npc_outer_red = 150; + int navi_npc_outer_green = 150; + int navi_npc_outer_blue = 255; + + int navi_prop_inner_red = 0; + int navi_prop_inner_green = 250; + int navi_prop_inner_blue = 0; + int navi_prop_outer_red = 0; + int navi_prop_outer_green = 250; + int navi_prop_outer_blue = 0; + + } cosmetic; + // Cheats struct { bool debug_mode = false; @@ -80,6 +121,7 @@ enum SeqPlayers { #define AUDIO_SECTION "AUDIO SETTINGS" #define CONTROLLER_SECTION "CONTROLLER SECTION" #define ENHANCEMENTS_SECTION "ENHANCEMENT SETTINGS" +#define COSMETICS_SECTION "COSMETIC SETTINGS" #define CHEATS_SECTION "CHEATS SETTINGS" namespace Game { diff --git a/libultraship/libultraship/SohImGuiImpl.cpp b/libultraship/libultraship/SohImGuiImpl.cpp index 7af532a09..a2a648bc8 100644 --- a/libultraship/libultraship/SohImGuiImpl.cpp +++ b/libultraship/libultraship/SohImGuiImpl.cpp @@ -53,6 +53,21 @@ namespace SohImGui { Console* console = new Console; bool p_open = false; bool needs_save = false; + float kokiri_col[3] = { 0.118f, 0.41f, 0.106f }; + float goron_col[3] = { 0.392f, 0.078f, 0.0f }; + float zora_col[3] = { 0.0f, 0.235f, 0.392f }; + + float navi_idle_i_col[3] = { 0.0f, 0.0f, 0.0f }; + float navi_idle_o_col[3] = { 0.0f, 0.0f, 0.0f }; + + float navi_npc_i_col[3] = { 0.0f, 0.0f, 0.0f }; + float navi_npc_o_col[3] = { 0.0f, 0.0f, 0.0f }; + + float navi_enemy_i_col[3] = { 0.0f, 0.0f, 0.0f }; + float navi_enemy_o_col[3] = { 0.0f, 0.0f, 0.0f }; + + float navi_prop_i_col[3] = { 0.0f, 0.0f, 0.0f }; + float navi_prop_o_col[3] = { 0.0f, 0.0f, 0.0f }; std::map> windowCategories; std::map customWindows; @@ -66,6 +81,49 @@ namespace SohImGui { ImGui_ImplWin32_Init(impl.dx11.window); break; } + kokiri_col[0] = std::clamp((float) CVar_GetS32((char*)"gTunic_Kokiri_Red", 30)/255, 0.0f, 1.0f); + kokiri_col[1] = std::clamp((float)CVar_GetS32((char*)"gTunic_Kokiri_Green", 105) / 255, 0.0f, 1.0f); + kokiri_col[2] = std::clamp((float)CVar_GetS32((char*)"gTunic_Kokiri_Blue", 27) / 255, 0.0f, 1.0f); + + goron_col[0] = std::clamp((float)CVar_GetS32((char*)"gTunic_Goron_Red", 100) / 255, 0.0f, 1.0f); + goron_col[1] = std::clamp((float)CVar_GetS32((char*)"gTunic_Goron_Green", 20) / 255, 0.0f, 1.0f); + goron_col[2] = std::clamp((float)CVar_GetS32((char*)"gTunic_Goron_Blue", 0) / 255, 0.0f, 1.0f); + + zora_col[0] = std::clamp((float)CVar_GetS32((char*)"gTunic_Zora_Red", 0) / 255, 0.0f, 1.0f); + zora_col[1] = std::clamp((float)CVar_GetS32((char*)"gTunic_Zora_Green", 60) / 255, 0.0f, 1.0f); + zora_col[2] = std::clamp((float)CVar_GetS32((char*)"gTunic_Zora_Blue", 100) / 255, 0.0f, 1.0f); + + navi_idle_i_col[0] = std::clamp((float)CVar_GetS32((char*)"gNavi_Idle_Inner_Red", 0) / 255, 0.0f, 1.0f); + navi_idle_i_col[1] = std::clamp((float)CVar_GetS32((char*)"gNavi_Idle_Inner_Green", 0) / 255, 0.0f, 1.0f); + navi_idle_i_col[2] = std::clamp((float)CVar_GetS32((char*)"gNavi_Idle_Inner_Blue", 0) / 255, 0.0f, 1.0f); + + navi_idle_o_col[0] = std::clamp((float)CVar_GetS32((char*)"gNavi_Idle_Outer_Red", 0) / 255, 0.0f, 1.0f); + navi_idle_o_col[1] = std::clamp((float)CVar_GetS32((char*)"gNavi_Idle_Outer_Green", 0) / 255, 0.0f, 1.0f); + navi_idle_o_col[2] = std::clamp((float)CVar_GetS32((char*)"gNavi_Idle_Outer_Blue", 0) / 255, 0.0f, 1.0f); + + navi_npc_i_col[0] = std::clamp((float)CVar_GetS32((char*)"gNavi_NPC_Inner_Red", 0) / 255, 0.0f, 1.0f); + navi_npc_i_col[1] = std::clamp((float)CVar_GetS32((char*)"gNavi_NPC_Inner_Green", 0) / 255, 0.0f, 1.0f); + navi_npc_i_col[2] = std::clamp((float)CVar_GetS32((char*)"gNavi_NPC_Inner_Blue", 0) / 255, 0.0f, 1.0f); + + navi_npc_o_col[0] = std::clamp((float)CVar_GetS32((char*)"gNavi_NPC_Outer_Red", 0) / 255, 0.0f, 1.0f); + navi_npc_o_col[1] = std::clamp((float)CVar_GetS32((char*)"gNavi_NPC_Outer_Green", 0) / 255, 0.0f, 1.0f); + navi_npc_o_col[2] = std::clamp((float)CVar_GetS32((char*)"gNavi_NPC_Outer_Blue", 0) / 255, 0.0f, 1.0f); + + navi_enemy_i_col[0] = std::clamp((float)CVar_GetS32((char*)"gNavi_Enemy_Inner_Red", 0) / 255, 0.0f, 1.0f); + navi_enemy_i_col[1] = std::clamp((float)CVar_GetS32((char*)"gNavi_Enemy_Inner_Green", 0) / 255, 0.0f, 1.0f); + navi_enemy_i_col[2] = std::clamp((float)CVar_GetS32((char*)"gNavi_Enemy_Inner_Blue", 0) / 255, 0.0f, 1.0f); + + navi_enemy_o_col[0] = std::clamp((float)CVar_GetS32((char*)"gNavi_Enemy_Outer_Red", 0) / 255, 0.0f, 1.0f); + navi_enemy_o_col[1] = std::clamp((float)CVar_GetS32((char*)"gNavi_Enemy_Outer_Green", 0) / 255, 0.0f, 1.0f); + navi_enemy_o_col[2] = std::clamp((float)CVar_GetS32((char*)"gNavi_Enemy_Outer_Blue", 0) / 255, 0.0f, 1.0f); + + navi_prop_i_col[0] = std::clamp((float)CVar_GetS32((char*)"gNavi_Prop_Inner_Red", 0) / 255, 0.0f, 1.0f); + navi_prop_i_col[1] = std::clamp((float)CVar_GetS32((char*)"gNavi_Prop_Inner_Green", 0) / 255, 0.0f, 1.0f); + navi_prop_i_col[2] = std::clamp((float)CVar_GetS32((char*)"gNavi_Prop_Inner_Blue", 0) / 255, 0.0f, 1.0f); + + navi_prop_o_col[0] = std::clamp((float)CVar_GetS32((char*)"gNavi_Prop_Outer_Red", 0) / 255, 0.0f, 1.0f); + navi_prop_o_col[1] = std::clamp((float)CVar_GetS32((char*)"gNavi_Prop_Outer_Green", 0) / 255, 0.0f, 1.0f); + navi_prop_o_col[2] = std::clamp((float)CVar_GetS32((char*)"gNavi_Prop_Outer_Blue", 0) / 255, 0.0f, 1.0f); } void ImGuiBackendInit() { @@ -520,6 +578,126 @@ namespace SohImGui { needs_save = true; } + + if (ImGui::BeginMenu("Cosmetics")) { + ImGui::Text("Tunics"); + ImGui::Separator(); + if (ImGui::ColorEdit3("Kokiri Tunic", kokiri_col)) { + Game::Settings.cosmetic.tunic_kokiri_red = (int) (kokiri_col[0] * 255); + Game::Settings.cosmetic.tunic_kokiri_green = (int) (kokiri_col[1] * 255); + Game::Settings.cosmetic.tunic_kokiri_blue = (int) (kokiri_col[2] * 255); + CVar_SetS32(const_cast("gTunic_Kokiri_Red"), Game::Settings.cosmetic.tunic_kokiri_red); + CVar_SetS32(const_cast("gTunic_Kokiri_Green"), Game::Settings.cosmetic.tunic_kokiri_green); + CVar_SetS32(const_cast("gTunic_Kokiri_Blue"), Game::Settings.cosmetic.tunic_kokiri_blue); + needs_save = true; + } + if (ImGui::ColorEdit3("Goron Tunic", goron_col)) { + Game::Settings.cosmetic.tunic_goron_red = (int)(goron_col[0] * 255); + Game::Settings.cosmetic.tunic_goron_green = (int)(goron_col[1] * 255); + Game::Settings.cosmetic.tunic_goron_blue = (int)(goron_col[2] * 255); + CVar_SetS32(const_cast("gTunic_Goron_Red"), Game::Settings.cosmetic.tunic_goron_red); + CVar_SetS32(const_cast("gTunic_Goron_Green"), Game::Settings.cosmetic.tunic_goron_green); + CVar_SetS32(const_cast("gTunic_Goron_Blue"), Game::Settings.cosmetic.tunic_goron_blue); + needs_save = true; + } + if (ImGui::ColorEdit3("Zora Tunic", zora_col)) { + Game::Settings.cosmetic.tunic_zora_red = (int)(zora_col[0] * 255); + Game::Settings.cosmetic.tunic_zora_green = (int)(zora_col[1] * 255); + Game::Settings.cosmetic.tunic_zora_blue = (int)(zora_col[2] * 255); + CVar_SetS32(const_cast("gTunic_Zora_Red"), Game::Settings.cosmetic.tunic_zora_red); + CVar_SetS32(const_cast("gTunic_Zora_Green"), Game::Settings.cosmetic.tunic_zora_green); + CVar_SetS32(const_cast("gTunic_Zora_Blue"), Game::Settings.cosmetic.tunic_zora_blue); + needs_save = true; + } + ImGui::Text("Navi"); + ImGui::Separator(); + if (ImGui::ColorEdit3("Navi Idle Inner", navi_idle_i_col)) { + Game::Settings.cosmetic.navi_idle_inner_red = (int)(navi_idle_i_col[0] * 255); + Game::Settings.cosmetic.navi_idle_inner_green = (int)(navi_idle_i_col[1] * 255); + Game::Settings.cosmetic.navi_idle_inner_blue = (int)(navi_idle_i_col[2] * 255); + CVar_SetS32(const_cast("gNavi_Idle_Inner_Red"), Game::Settings.cosmetic.navi_idle_inner_red); + CVar_SetS32(const_cast("gNavi_Idle_Inner_Green"), Game::Settings.cosmetic.navi_idle_inner_green); + CVar_SetS32(const_cast("gNavi_Idle_Inner_Blue"), Game::Settings.cosmetic.navi_idle_inner_blue); + needs_save = true; + } + + if (ImGui::ColorEdit3("Navi Idle Outer", navi_idle_o_col)) { + Game::Settings.cosmetic.navi_idle_outer_red = (int)(navi_idle_o_col[0] * 255); + Game::Settings.cosmetic.navi_idle_outer_green = (int)(navi_idle_o_col[1] * 255); + Game::Settings.cosmetic.navi_idle_outer_blue = (int)(navi_idle_o_col[2] * 255); + CVar_SetS32(const_cast("gNavi_Idle_Outer_Red"), Game::Settings.cosmetic.navi_idle_outer_red); + CVar_SetS32(const_cast("gNavi_Idle_Outer_Green"), Game::Settings.cosmetic.navi_idle_outer_green); + CVar_SetS32(const_cast("gNavi_Idle_Outer_Blue"), Game::Settings.cosmetic.navi_idle_outer_blue); + needs_save = true; + } + + if (ImGui::ColorEdit3("Navi NPC Inner", navi_npc_i_col)) { + Game::Settings.cosmetic.navi_npc_inner_red = (int)(navi_npc_i_col[0] * 255); + Game::Settings.cosmetic.navi_npc_inner_green = (int)(navi_npc_i_col[1] * 255); + Game::Settings.cosmetic.navi_npc_inner_blue = (int)(navi_npc_i_col[2] * 255); + CVar_SetS32(const_cast("gNavi_NPC_Inner_Red"), Game::Settings.cosmetic.navi_npc_inner_red); + CVar_SetS32(const_cast("gNavi_NPC_Inner_Green"), Game::Settings.cosmetic.navi_npc_inner_green); + CVar_SetS32(const_cast("gNavi_NPC_Inner_Blue"), Game::Settings.cosmetic.navi_npc_inner_blue); + needs_save = true; + } + + if (ImGui::ColorEdit3("Navi NPC Outer", navi_npc_o_col)) { + Game::Settings.cosmetic.navi_npc_outer_red = (int)(navi_npc_o_col[0] * 255); + Game::Settings.cosmetic.navi_npc_outer_green = (int)(navi_npc_o_col[1] * 255); + Game::Settings.cosmetic.navi_npc_outer_blue = (int)(navi_npc_o_col[2] * 255); + CVar_SetS32(const_cast("gNavi_NPC_Outer_Red"), Game::Settings.cosmetic.navi_npc_outer_red); + CVar_SetS32(const_cast("gNavi_NPC_Outer_Green"), Game::Settings.cosmetic.navi_npc_outer_green); + CVar_SetS32(const_cast("gNavi_NPC_Outer_Blue"), Game::Settings.cosmetic.navi_npc_outer_blue); + needs_save = true; + } + + if (ImGui::ColorEdit3("Navi Enemy Inner", navi_enemy_i_col)) { + Game::Settings.cosmetic.navi_enemy_inner_red = (int)(navi_enemy_i_col[0] * 255); + Game::Settings.cosmetic.navi_enemy_inner_green = (int)(navi_enemy_i_col[1] * 255); + Game::Settings.cosmetic.navi_enemy_inner_blue = (int)(navi_enemy_i_col[2] * 255); + CVar_SetS32(const_cast("gNavi_Enemy_Inner_Red"), Game::Settings.cosmetic.navi_enemy_inner_red); + CVar_SetS32(const_cast("gNavi_Enemy_Inner_Green"), Game::Settings.cosmetic.navi_enemy_inner_green); + CVar_SetS32(const_cast("gNavi_Enemy_Inner_Blue"), Game::Settings.cosmetic.navi_enemy_inner_blue); + needs_save = true; + } + + if (ImGui::ColorEdit3("Navi Enemy Outer", navi_enemy_o_col)) { + Game::Settings.cosmetic.navi_enemy_outer_red = (int)(navi_enemy_o_col[0] * 255); + Game::Settings.cosmetic.navi_enemy_outer_green = (int)(navi_enemy_o_col[1] * 255); + Game::Settings.cosmetic.navi_enemy_outer_blue = (int)(navi_enemy_o_col[2] * 255); + CVar_SetS32(const_cast("gNavi_Enemy_Outer_Red"), Game::Settings.cosmetic.navi_enemy_outer_red); + CVar_SetS32(const_cast("gNavi_Enemy_Outer_Green"), Game::Settings.cosmetic.navi_enemy_outer_green); + CVar_SetS32(const_cast("gNavi_Enemy_Outer_Blue"), Game::Settings.cosmetic.navi_enemy_outer_blue); + needs_save = true; + } + + if (ImGui::ColorEdit3("Navi Prop Inner", navi_prop_i_col)) { + Game::Settings.cosmetic.navi_prop_inner_red = (int)(navi_prop_i_col[0] * 255); + Game::Settings.cosmetic.navi_prop_inner_green = (int)(navi_prop_i_col[1] * 255); + Game::Settings.cosmetic.navi_prop_inner_blue = (int)(navi_prop_i_col[2] * 255); + CVar_SetS32(const_cast("gNavi_Prop_Inner_Red"), Game::Settings.cosmetic.navi_prop_inner_red); + CVar_SetS32(const_cast("gNavi_Prop_Inner_Green"), Game::Settings.cosmetic.navi_prop_inner_green); + CVar_SetS32(const_cast("gNavi_Prop_Inner_Blue"), Game::Settings.cosmetic.navi_prop_inner_blue); + needs_save = true; + } + + if (ImGui::ColorEdit3("Navi Prop Outer", navi_prop_o_col)) { + Game::Settings.cosmetic.navi_prop_outer_red = (int)(navi_prop_o_col[0] * 255); + Game::Settings.cosmetic.navi_prop_outer_green = (int)(navi_prop_o_col[1] * 255); + Game::Settings.cosmetic.navi_prop_outer_blue = (int)(navi_prop_o_col[2] * 255); + CVar_SetS32(const_cast("gNavi_Prop_Outer_Red"), Game::Settings.cosmetic.navi_prop_outer_red); + CVar_SetS32(const_cast("gNavi_Prop_Outer_Green"), Game::Settings.cosmetic.navi_prop_outer_green); + CVar_SetS32(const_cast("gNavi_Prop_Outer_Blue"), Game::Settings.cosmetic.navi_prop_outer_blue); + needs_save = true; + } + + ImGui::EndMenu(); + } + + + if (ImGui::BeginMenu("Developer Tools")) { + HOOK(ImGui::MenuItem("Stats", nullptr, &Game::Settings.debug.soh)); + HOOK(ImGui::MenuItem("Console", nullptr, &console->opened)); if (ImGui::Checkbox("Easy ISG", &Game::Settings.cheats.ez_isg)) { CVar_SetS32("gEzISG", Game::Settings.cheats.ez_isg); needs_save = true; diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c index eee9d8882..640429515 100644 --- a/soh/src/code/z_actor.c +++ b/soh/src/code/z_actor.c @@ -334,6 +334,38 @@ void func_8002BE98(TargetContext* targetCtx, s32 actorCategory, GlobalContext* g void func_8002BF60(TargetContext* targetCtx, Actor* actor, s32 actorCategory, GlobalContext* globalCtx) { NaviColor* naviColor = &sNaviColorList[actorCategory]; + if (actorCategory == ACTORCAT_PLAYER) { + naviColor->inner.r = CVar_GetS32("gNavi_Idle_Inner_Red", naviColor->inner.r); + naviColor->inner.g = CVar_GetS32("gNavi_Idle_Inner_Green", naviColor->inner.g); + naviColor->inner.b = CVar_GetS32("gNavi_Idle_Inner_Blue", naviColor->inner.b); + naviColor->outer.r = CVar_GetS32("gNavi_Idle_Outer_Red", naviColor->outer.r); + naviColor->outer.g = CVar_GetS32("gNavi_Idle_Outer_Green", naviColor->outer.g); + naviColor->outer.b = CVar_GetS32("gNavi_Idle_Outer_Blue", naviColor->outer.b); + } + if (actorCategory == ACTORCAT_NPC) { + naviColor->inner.r = CVar_GetS32("gNavi_NPC_Inner_Red", naviColor->inner.r); + naviColor->inner.g = CVar_GetS32("gNavi_NPC_Inner_Green", naviColor->inner.g); + naviColor->inner.b = CVar_GetS32("gNavi_NPC_Inner_Blue", naviColor->inner.b); + naviColor->outer.r = CVar_GetS32("gNavi_NPC_Outer_Red", naviColor->outer.r); + naviColor->outer.g = CVar_GetS32("gNavi_NPC_Outer_Green", naviColor->outer.g); + naviColor->outer.b = CVar_GetS32("gNavi_NPC_Outer_Blue", naviColor->outer.b); + } + if (actorCategory == ACTORCAT_BOSS || actorCategory == ACTORCAT_ENEMY) { + naviColor->inner.r = CVar_GetS32("gNavi_Enemy_Inner_Red", naviColor->inner.r); + naviColor->inner.g = CVar_GetS32("gNavi_Enemy_Inner_Green", naviColor->inner.g); + naviColor->inner.b = CVar_GetS32("gNavi_Enemy_Inner_Blue", naviColor->inner.b); + naviColor->outer.r = CVar_GetS32("gNavi_Enemy_Outer_Red", naviColor->outer.r); + naviColor->outer.g = CVar_GetS32("gNavi_Enemy_Outer_Green", naviColor->outer.g); + naviColor->outer.b = CVar_GetS32("gNavi_Enemy_Outer_Blue", naviColor->outer.b); + } + if (actorCategory == ACTORCAT_PROP) { + naviColor->inner.r = CVar_GetS32("gNavi_Prop_Inner_Red", naviColor->inner.r); + naviColor->inner.g = CVar_GetS32("gNavi_Prop_Inner_Green", naviColor->inner.g); + naviColor->inner.b = CVar_GetS32("gNavi_Prop_Inner_Blue", naviColor->inner.b); + naviColor->outer.r = CVar_GetS32("gNavi_Prop_Outer_Red", naviColor->outer.r); + naviColor->outer.g = CVar_GetS32("gNavi_Prop_Outer_Green", naviColor->outer.g); + naviColor->outer.b = CVar_GetS32("gNavi_Prop_Outer_Blue", naviColor->outer.b); + } targetCtx->naviRefPos.x = actor->focus.pos.x; targetCtx->naviRefPos.y = actor->focus.pos.y + (actor->targetArrowOffset * actor->scale.y); targetCtx->naviRefPos.z = actor->focus.pos.z; diff --git a/soh/src/code/z_player_lib.c b/soh/src/code/z_player_lib.c index 87a7009ec..4adbb75ce 100644 --- a/soh/src/code/z_player_lib.c +++ b/soh/src/code/z_player_lib.c @@ -743,8 +743,27 @@ void func_8008F470(GlobalContext* globalCtx, void** skeleton, Vec3s* jointTable, #else gSPSegment(POLY_OPA_DISP++, 0x09, SEGMENTED_TO_VIRTUAL(sMouthTextures[eyeIndex])); #endif - - color = &sTunicColors[tunic]; + if (tunic == PLAYER_TUNIC_KOKIRI) { + Color_RGB8 sTemp = { CVar_GetS32("gTunic_Kokiri_Red", &sTunicColors[PLAYER_TUNIC_KOKIRI].r), + CVar_GetS32("gTunic_Kokiri_Green", &sTunicColors[PLAYER_TUNIC_KOKIRI].g), + CVar_GetS32("gTunic_Kokiri_Blue", &sTunicColors[PLAYER_TUNIC_KOKIRI].b) }; + color = &sTemp; + } else if (tunic == PLAYER_TUNIC_GORON) { + Color_RGB8 sTemp = { CVar_GetS32("gTunic_Goron_Red", &sTunicColors[PLAYER_TUNIC_GORON].r), + CVar_GetS32("gTunic_Goron_Green", &sTunicColors[PLAYER_TUNIC_GORON].g), + CVar_GetS32("gTunic_Goron_Blue", &sTunicColors[PLAYER_TUNIC_GORON].b) }; + color = &sTemp; + } else if (tunic == PLAYER_TUNIC_ZORA) { + Color_RGB8 sTemp = { CVar_GetS32("gTunic_Zora_Red", &sTunicColors[PLAYER_TUNIC_ZORA].r), + CVar_GetS32("gTunic_Zora_Green", &sTunicColors[PLAYER_TUNIC_ZORA].g), + CVar_GetS32("gTunic_Zora_Blue", &sTunicColors[PLAYER_TUNIC_ZORA].b) }; + color = &sTemp; + } else { + Color_RGB8 sTemp = { CVar_GetS32("gTunic_Kokiri_Red", &sTunicColors[PLAYER_TUNIC_KOKIRI].r), + CVar_GetS32("gTunic_Kokiri_Green", &sTunicColors[PLAYER_TUNIC_KOKIRI].g), + CVar_GetS32("gTunic_Kokiri_Blue", &sTunicColors[PLAYER_TUNIC_KOKIRI].b) }; + color = &sTemp; + } gDPSetEnvColor(POLY_OPA_DISP++, color->r, color->g, color->b, 0); sDListsLodOffset = lod * 2; From 0e6ca5361e03c4945a7a8a1a3f858dc764cb0a97 Mon Sep 17 00:00:00 2001 From: Baoulettes Date: Wed, 27 Apr 2022 00:36:28 +0200 Subject: [PATCH 76/83] Fix L/R buttons color in Kaleido menu (#172) * Fix L/R buttons color in Kaleido menu. I know this is a bug even official game but that definitely a logic bug. That could be considered are a mods. This make both button L and R have the same color on Hover and normal. * Update z_kaleido_scope_PAL.c * Condition to be on Added condition to be on only if toggled on * Cvar registers * bool addition * Added the item in menu * Added bool in bootcommands By default it is on. * Hide and make it forced on by default * Hide menu entry for that fix --- libultraship/libultraship/GameSettings.cpp | 5 +++++ libultraship/libultraship/GameSettings.h | 2 +- libultraship/libultraship/SohImGuiImpl.cpp | 5 +++++ soh/soh/Enhancements/bootcommands.c | 2 +- .../misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c | 16 +++++++++++++--- 5 files changed, 25 insertions(+), 5 deletions(-) diff --git a/libultraship/libultraship/GameSettings.cpp b/libultraship/libultraship/GameSettings.cpp index 5e02037de..029e2a1a2 100644 --- a/libultraship/libultraship/GameSettings.cpp +++ b/libultraship/libultraship/GameSettings.cpp @@ -74,6 +74,10 @@ namespace Game { Settings.enhancements.mm_bunny_hood = stob(Conf[EnhancementSection]["mm_bunny_hood"]); CVar_SetS32("gMMBunnyHood", Settings.enhancements.mm_bunny_hood); + + Settings.enhancements.uniform_lr = stob(Conf[EnhancementSection]["uniform_lr"]); + //CVar_SetS32("gUniformLR", Settings.enhancements.uniform_lr); + CVar_SetS32("gUniformLR", 1); Settings.enhancements.newdrops = stob(Conf[EnhancementSection]["newdrops"]); CVar_SetS32("gNewDrops", Settings.enhancements.newdrops); @@ -264,6 +268,7 @@ namespace Game { Conf[EnhancementSection]["newdrops"] = std::to_string(Settings.enhancements.newdrops); Conf[EnhancementSection]["visualagony"] = std::to_string(Settings.enhancements.visualagony); Conf[EnhancementSection]["mm_bunny_hood"] = std::to_string(Settings.enhancements.mm_bunny_hood); + Conf[EnhancementSection]["uniform_lr"] = std::to_string(Settings.enhancements.uniform_lr); // Controllers diff --git a/libultraship/libultraship/GameSettings.h b/libultraship/libultraship/GameSettings.h index c2d2107e0..4f4eecb97 100644 --- a/libultraship/libultraship/GameSettings.h +++ b/libultraship/libultraship/GameSettings.h @@ -29,7 +29,7 @@ struct SoHConfigType { bool newdrops = false; bool visualagony = false; bool mm_bunny_hood = false; - + bool uniform_lr = true; } enhancements; // Controller diff --git a/libultraship/libultraship/SohImGuiImpl.cpp b/libultraship/libultraship/SohImGuiImpl.cpp index a2a648bc8..478f51590 100644 --- a/libultraship/libultraship/SohImGuiImpl.cpp +++ b/libultraship/libultraship/SohImGuiImpl.cpp @@ -473,6 +473,11 @@ namespace SohImGui { CVar_SetS32("gMMBunnyHood", Game::Settings.enhancements.mm_bunny_hood); needs_save = true; } + + /*if (ImGui::Checkbox("Fix L&R Pause menu", &Game::Settings.enhancements.uniform_lr)) { + CVar_SetS32("gUniformLR", Game::Settings.enhancements.uniform_lr); + needs_save = true; + }*/ if (ImGui::Checkbox("Visual Stone of Agony", &Game::Settings.enhancements.visualagony)) { CVar_SetS32("gVisualAgony", Game::Settings.enhancements.visualagony); diff --git a/soh/soh/Enhancements/bootcommands.c b/soh/soh/Enhancements/bootcommands.c index f3ad9aaac..60143e295 100644 --- a/soh/soh/Enhancements/bootcommands.c +++ b/soh/soh/Enhancements/bootcommands.c @@ -25,9 +25,9 @@ void BootCommands_Init() CVar_RegisterS32("gDebugEnabled", 0); CVar_RegisterS32("gPauseLiveLink", 0); CVar_RegisterS32("gMinimalUI", 0); + CVar_RegisterS32("gUniformLR", 1); CVar_RegisterS32("gNewDrops", 0); CVar_RegisterS32("gVisualAgony", 0); - } //void BootCommands_ParseBootArgs(char* str) diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c index 60d3595aa..ac1864412 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c @@ -1614,14 +1614,24 @@ void KaleidoScope_DrawInfoPanel(GlobalContext* globalCtx) { if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) && (pauseCtx->unk_1E4 == 0)) { gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, D_808321A0, D_808321A2, D_808321A4, D_808321A6); + } else { + if (CVar_GetS32("gUniformLR", 0) != 0) { + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 180, 210, 255, 255); + } } - + gSPDisplayList(POLY_KAL_DISP++, gLButtonIconDL); - - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 180, 210, 255, 220); + + if (CVar_GetS32("gUniformLR", 0) == 0) { //Restore the misplace gDPSetPrimColor + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 180, 210, 255, 255); + } if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_RIGHT) && (pauseCtx->unk_1E4 == 0)) { gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, D_808321A0, D_808321A2, D_808321A4, D_808321A6); + } else { + if (CVar_GetS32("gUniformLR", 0) != 0) { + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 180, 210, 255, 255); + } } gSPDisplayList(POLY_KAL_DISP++, gRButtonIconDL); From 9c2c443a6abb9a4b0baf0d5059111af7d2cac411 Mon Sep 17 00:00:00 2001 From: Baoulettes Date: Wed, 27 Apr 2022 00:41:24 +0200 Subject: [PATCH 77/83] Fix Title card name for FRA and GER (#204) --- soh/src/code/z_actor.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c index 640429515..0c46a8fc5 100644 --- a/soh/src/code/z_actor.c +++ b/soh/src/code/z_actor.c @@ -1009,7 +1009,6 @@ void TitleCard_Draw(GlobalContext* globalCtx, TitleCardContext* titleCtx) { s32 doubleWidth; s32 titleY; s32 titleSecondY; - s32 textureLanguageOffset; if (titleCtx->alpha != 0) { width = titleCtx->width; @@ -1020,7 +1019,6 @@ void TitleCard_Draw(GlobalContext* globalCtx, TitleCardContext* titleCtx) { OPEN_DISPS(globalCtx->state.gfxCtx, "../z_actor.c", 2824); - textureLanguageOffset = width * height * gSaveContext.language; height = (width * height > 0x1000) ? 0x1000 / width : height; titleSecondY = titleY + (height * 4); @@ -1030,7 +1028,8 @@ void TitleCard_Draw(GlobalContext* globalCtx, TitleCardContext* titleCtx) { gDPSetPrimColor(TITLE_CARD_DISP++, 0, 0, (u8)titleCtx->intensity, (u8)titleCtx->intensity, (u8)titleCtx->intensity, (u8)titleCtx->alpha); - gDPLoadTextureBlock(TITLE_CARD_DISP++, (uintptr_t)titleCtx->texture + textureLanguageOffset, G_IM_FMT_IA, + gDPLoadTextureBlock(TITLE_CARD_DISP++, (uintptr_t)titleCtx->texture, G_IM_FMT_IA, + G_IM_SIZ_8b, width, 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); @@ -1042,7 +1041,7 @@ void TitleCard_Draw(GlobalContext* globalCtx, TitleCardContext* titleCtx) { // If texture is bigger than 0x1000, display the rest if (height > 0) { - gDPLoadTextureBlock(TITLE_CARD_DISP++, (uintptr_t)titleCtx->texture + textureLanguageOffset + 0x1000, + gDPLoadTextureBlock(TITLE_CARD_DISP++, (uintptr_t)titleCtx->texture + 0x1000, G_IM_FMT_IA, G_IM_SIZ_8b, width, 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); From 1f663dda7bec991eaa4ede0635b147b7869a5f5d Mon Sep 17 00:00:00 2001 From: Ada <60364512+GreatArgorath@users.noreply.github.com> Date: Tue, 26 Apr 2022 20:58:21 +0100 Subject: [PATCH 78/83] Adds exception for text speed in the case of ocarina playing --- soh/src/code/z_message_PAL.c | 1 + 1 file changed, 1 insertion(+) diff --git a/soh/src/code/z_message_PAL.c b/soh/src/code/z_message_PAL.c index 8b9410018..6a29a6564 100644 --- a/soh/src/code/z_message_PAL.c +++ b/soh/src/code/z_message_PAL.c @@ -1096,6 +1096,7 @@ void Message_DrawText(GlobalContext* globalCtx, Gfx** gfxP) { *gfxP = gfx; return; case MESSAGE_OCARINA: + msgCtx->textDrawPos = i + 1; if (i + 1 == msgCtx->textDrawPos) { Message_HandleOcarina(globalCtx); *gfxP = gfx; From 486f673df53fa63a96d6173991189084027ebd72 Mon Sep 17 00:00:00 2001 From: KiritoDev <36680385+KiritoDv@users.noreply.github.com> Date: Tue, 26 Apr 2022 18:04:47 -0500 Subject: [PATCH 79/83] Fixed develop --- libultraship/libultraship/SohImGuiImpl.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/libultraship/libultraship/SohImGuiImpl.cpp b/libultraship/libultraship/SohImGuiImpl.cpp index 478f51590..96211fe20 100644 --- a/libultraship/libultraship/SohImGuiImpl.cpp +++ b/libultraship/libultraship/SohImGuiImpl.cpp @@ -559,8 +559,7 @@ namespace SohImGui { CVar_SetS32("gInfiniteNayru", Game::Settings.cheats.infinite_nayru); needs_save = true; } - - ImGui::EndMenu(); + ImGui::EndMenu(); } if (ImGui::Checkbox("No Clip", &Game::Settings.cheats.no_clip)) { @@ -582,7 +581,7 @@ namespace SohImGui { CVar_SetS32("gSuperTunic", Game::Settings.cheats.super_tunic); needs_save = true; } - + } if (ImGui::BeginMenu("Cosmetics")) { ImGui::Text("Tunics"); From eea5135d629fc4589c4a51680d42841ff189e542 Mon Sep 17 00:00:00 2001 From: Sirius902 <10891979+Sirius902@users.noreply.github.com> Date: Tue, 26 Apr 2022 16:50:24 -0700 Subject: [PATCH 80/83] Rumble cvar and fixes (#184) * Rumble indefinitely until turned off * Add rumble cvar * Register CVar * Check if controller can rumble to insert rumble pak * Reduce verbosity of checks * Remove extraneous const_cast * Once again remove extraneous const_cast * Add per-controller settings * Add nice spacing * Only display controller entry if pad connected * Const some stuff --- libultraship/libultraship/Controller.h | 6 + libultraship/libultraship/GameSettings.cpp | 112 +++++++---- libultraship/libultraship/GameSettings.h | 12 +- .../libultraship/KeyboardController.cpp | 2 +- .../libultraship/KeyboardController.h | 5 + libultraship/libultraship/SDLController.cpp | 65 +++++-- libultraship/libultraship/SDLController.h | 6 + libultraship/libultraship/SohImGuiImpl.cpp | 182 ++++++++++-------- soh/soh/Enhancements/bootcommands.c | 1 + soh/soh/Enhancements/debugconsole.cpp | 10 +- soh/soh/OTRGlobals.cpp | 11 ++ soh/soh/OTRGlobals.h | 1 + soh/soh/stubs.c | 4 +- soh/src/code/padmgr.c | 7 +- 14 files changed, 274 insertions(+), 150 deletions(-) diff --git a/libultraship/libultraship/Controller.h b/libultraship/libultraship/Controller.h index c78142af4..256b31fee 100644 --- a/libultraship/libultraship/Controller.h +++ b/libultraship/libultraship/Controller.h @@ -3,6 +3,7 @@ #include #include #include +#include #include "stdint.h" #include "UltraController.h" #include "ControllerAttachment.h" @@ -19,12 +20,17 @@ namespace Ship { void Read(OSContPad* pad); virtual void ReadFromSource() = 0; virtual void WriteToSource(ControllerCallback* controller) = 0; + virtual bool Connected() const = 0; + virtual bool CanRumble() const = 0; bool isRumbling; void SetButtonMapping(const std::string& szButtonName, int32_t dwScancode); std::shared_ptr GetAttachment() { return Attachment; } int32_t GetControllerNumber() { return dwControllerNumber; } + virtual bool HasPadConf() const = 0; + virtual std::optional GetPadConfSection() = 0; + protected: int32_t dwPressedButtons; std::map ButtonMapping; diff --git a/libultraship/libultraship/GameSettings.cpp b/libultraship/libultraship/GameSettings.cpp index 029e2a1a2..244e1a394 100644 --- a/libultraship/libultraship/GameSettings.cpp +++ b/libultraship/libultraship/GameSettings.cpp @@ -15,6 +15,8 @@ #include #include "SohHooks.h" +#include "Window.h" + #define ABS(var) var < 0 ? -(var) : var using namespace Ship; @@ -64,7 +66,7 @@ namespace Game { CVar_SetS32("gPauseLiveLink", Settings.enhancements.animated_pause_menu); Settings.enhancements.dynamic_wallet_icon = stob(Conf[EnhancementSection]["dynamic_wallet_icon"]); - CVar_SetS32(const_cast("gDynamicWalletIcon"), Settings.enhancements.dynamic_wallet_icon); + CVar_SetS32("gDynamicWalletIcon", Settings.enhancements.dynamic_wallet_icon); Settings.enhancements.minimal_ui = stob(Conf[EnhancementSection]["minimal_ui"]); CVar_SetS32("gMinimalUI", Settings.enhancements.minimal_ui); @@ -99,91 +101,88 @@ namespace Game { CVar_SetFloat("gFanfareVolume", Settings.audio.fanfare); // Controllers - Settings.controller.gyro_sensitivity = Ship::stof(Conf[ControllerSection]["gyro_sensitivity"]); - CVar_SetFloat("gGyroSensitivity", Settings.controller.gyro_sensitivity); - - Settings.controller.rumble_strength = Ship::stof(Conf[ControllerSection]["rumble_strength"]); - CVar_SetFloat("gRumbleStrength", Settings.controller.rumble_strength); + Settings.controller.rumble_enabled = Ship::stof(Conf[ControllerSection]["rumble_enabled"]); + CVar_SetS32("gRumbleEnabled", Settings.controller.rumble_enabled); Settings.controller.input_scale = Ship::stof(Conf[ControllerSection]["input_scale"]); CVar_SetFloat("gInputScale", Settings.controller.input_scale); Settings.controller.input_enabled = stob(Conf[ControllerSection]["input_enabled"]); - CVar_SetS32(const_cast("gInputEnabled"), Settings.controller.input_enabled); + CVar_SetS32("gInputEnabled", Settings.controller.input_enabled); //Tunics Settings.cosmetic.tunic_kokiri_red = (Conf[CosmeticsSection]["tunic_kokiri_red"] != "") ? Ship::stoi(Conf[CosmeticsSection]["tunic_kokiri_red"]) : Settings.cosmetic.tunic_kokiri_red; - CVar_SetS32(const_cast("gTunic_Kokiri_Red"), Settings.cosmetic.tunic_kokiri_red); + CVar_SetS32("gTunic_Kokiri_Red", Settings.cosmetic.tunic_kokiri_red); Settings.cosmetic.tunic_kokiri_green = (Conf[CosmeticsSection]["tunic_kokiri_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["tunic_kokiri_green"]) : Settings.cosmetic.tunic_kokiri_green; - CVar_SetS32(const_cast("gTunic_Kokiri_Green"), Settings.cosmetic.tunic_kokiri_green); + CVar_SetS32("gTunic_Kokiri_Green", Settings.cosmetic.tunic_kokiri_green); Settings.cosmetic.tunic_kokiri_blue = (Conf[CosmeticsSection]["tunic_kokiri_blue"] != "") ? Ship::stoi(Conf[CosmeticsSection]["tunic_kokiri_blue"]) : Settings.cosmetic.tunic_kokiri_blue; - CVar_SetS32(const_cast("gTunic_Kokiri_Blue"), Settings.cosmetic.tunic_kokiri_blue); + CVar_SetS32("gTunic_Kokiri_Blue", Settings.cosmetic.tunic_kokiri_blue); Settings.cosmetic.tunic_goron_red = (Conf[CosmeticsSection]["tunic_goron_red"] != "") ? Ship::stoi(Conf[CosmeticsSection]["tunic_goron_red"]) : Settings.cosmetic.tunic_goron_red; - CVar_SetS32(const_cast("gTunic_Goron_Red"), Settings.cosmetic.tunic_goron_red); + CVar_SetS32("gTunic_Goron_Red", Settings.cosmetic.tunic_goron_red); Settings.cosmetic.tunic_goron_green = (Conf[CosmeticsSection]["tunic_goron_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["tunic_goron_green"]) : Settings.cosmetic.tunic_goron_green; - CVar_SetS32(const_cast("gTunic_Goron_Green"), Settings.cosmetic.tunic_goron_green); + CVar_SetS32("gTunic_Goron_Green", Settings.cosmetic.tunic_goron_green); Settings.cosmetic.tunic_goron_blue = (Conf[CosmeticsSection]["tunic_goron_blue"] != "") ? Ship::stoi(Conf[CosmeticsSection]["tunic_goron_blue"]) : Settings.cosmetic.tunic_goron_blue; - CVar_SetS32(const_cast("gTunic_Goron_Blue"), Settings.cosmetic.tunic_goron_blue); + CVar_SetS32("gTunic_Goron_Blue", Settings.cosmetic.tunic_goron_blue); Settings.cosmetic.tunic_zora_red = (Conf[CosmeticsSection]["tunic_zora_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["tunic_zora_red"]) : Settings.cosmetic.tunic_zora_red; - CVar_SetS32(const_cast("gTunic_Zora_Red"), Settings.cosmetic.tunic_zora_red); + CVar_SetS32("gTunic_Zora_Red", Settings.cosmetic.tunic_zora_red); Settings.cosmetic.tunic_zora_green = (Conf[CosmeticsSection]["tunic_zora_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["tunic_zora_green"]) : Settings.cosmetic.tunic_zora_green; - CVar_SetS32(const_cast("gTunic_Zora_Green"), Settings.cosmetic.tunic_zora_green); + CVar_SetS32("gTunic_Zora_Green", Settings.cosmetic.tunic_zora_green); Settings.cosmetic.tunic_zora_blue = (Conf[CosmeticsSection]["tunic_zora_blue"] != "" ) ? Ship::stoi(Conf[CosmeticsSection]["tunic_zora_blue"]) : Settings.cosmetic.tunic_zora_blue; - CVar_SetS32(const_cast("gTunic_Zora_Blue"), Settings.cosmetic.tunic_zora_blue); + CVar_SetS32("gTunic_Zora_Blue", Settings.cosmetic.tunic_zora_blue); //Navi Settings.cosmetic.navi_idle_inner_red = (Conf[CosmeticsSection]["navi_idle_inner_red"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_idle_inner_red"]) : Settings.cosmetic.navi_idle_inner_red; - CVar_SetS32(const_cast("gNavi_Idle_Inner_Red"), Settings.cosmetic.navi_idle_inner_red); + CVar_SetS32("gNavi_Idle_Inner_Red", Settings.cosmetic.navi_idle_inner_red); Settings.cosmetic.navi_idle_inner_green = (Conf[CosmeticsSection]["navi_idle_inner_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_idle_inner_green"]) : Settings.cosmetic.navi_idle_inner_green; - CVar_SetS32(const_cast("gNavi_Idle_Inner_Green"), Settings.cosmetic.navi_idle_inner_green); + CVar_SetS32("gNavi_Idle_Inner_Green", Settings.cosmetic.navi_idle_inner_green); Settings.cosmetic.navi_idle_inner_blue = (Conf[CosmeticsSection]["navi_idle_inner_blue"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_idle_inner_blue"]) : Settings.cosmetic.navi_idle_inner_blue; - CVar_SetS32(const_cast("gNavi_Idle_Inner_Blue"), Settings.cosmetic.navi_idle_inner_blue); + CVar_SetS32("gNavi_Idle_Inner_Blue", Settings.cosmetic.navi_idle_inner_blue); Settings.cosmetic.navi_idle_outer_red = (Conf[CosmeticsSection]["navi_idle_outer_red"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_idle_outer_red"]) : Settings.cosmetic.navi_idle_outer_red; - CVar_SetS32(const_cast("gNavi_Idle_Outer_Red"), Settings.cosmetic.navi_idle_outer_red); + CVar_SetS32("gNavi_Idle_Outer_Red", Settings.cosmetic.navi_idle_outer_red); Settings.cosmetic.navi_idle_outer_green = (Conf[CosmeticsSection]["navi_idle_outer_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_idle_outer_green"]) : Settings.cosmetic.navi_idle_outer_green; - CVar_SetS32(const_cast("gNavi_Idle_Outer_Green"), Settings.cosmetic.navi_idle_outer_green); + CVar_SetS32("gNavi_Idle_Outer_Green", Settings.cosmetic.navi_idle_outer_green); Settings.cosmetic.navi_idle_outer_blue = (Conf[CosmeticsSection]["navi_idle_outer_blue"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_idle_outer_blue"]) : Settings.cosmetic.navi_idle_outer_blue; - CVar_SetS32(const_cast("gNavi_Idle_Outer_Blue"), Settings.cosmetic.navi_idle_outer_blue); + CVar_SetS32("gNavi_Idle_Outer_Blue", Settings.cosmetic.navi_idle_outer_blue); Settings.cosmetic.navi_npc_inner_red = (Conf[CosmeticsSection]["navi_npc_inner_red"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_npc_inner_red"]) : Settings.cosmetic.navi_npc_inner_red; - CVar_SetS32(const_cast("gNavi_NPC_Inner_Red"), Settings.cosmetic.navi_npc_inner_red); + CVar_SetS32("gNavi_NPC_Inner_Red", Settings.cosmetic.navi_npc_inner_red); Settings.cosmetic.navi_npc_inner_green = (Conf[CosmeticsSection]["navi_npc_inner_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_npc_inner_green"]) : Settings.cosmetic.navi_npc_inner_green; - CVar_SetS32(const_cast("gNavi_NPC_Inner_Green"), Settings.cosmetic.navi_npc_inner_green); + CVar_SetS32("gNavi_NPC_Inner_Green", Settings.cosmetic.navi_npc_inner_green); Settings.cosmetic.navi_npc_inner_blue = (Conf[CosmeticsSection]["navi_npc_inner_blue"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_npc_inner_blue"]) : Settings.cosmetic.navi_npc_inner_blue; - CVar_SetS32(const_cast("gNavi_NPC_Inner_Blue"), Settings.cosmetic.navi_npc_inner_blue); + CVar_SetS32("gNavi_NPC_Inner_Blue", Settings.cosmetic.navi_npc_inner_blue); Settings.cosmetic.navi_npc_outer_red = (Conf[CosmeticsSection]["navi_npc_outer_red"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_npc_outer_red"]) : Settings.cosmetic.navi_npc_outer_red; - CVar_SetS32(const_cast("gNavi_NPC_Outer_Red"), Settings.cosmetic.navi_npc_outer_red); + CVar_SetS32("gNavi_NPC_Outer_Red", Settings.cosmetic.navi_npc_outer_red); Settings.cosmetic.navi_npc_outer_green = (Conf[CosmeticsSection]["navi_npc_outer_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_npc_outer_green"]) : Settings.cosmetic.navi_npc_outer_green; - CVar_SetS32(const_cast("gNavi_NPC_Outer_Green"), Settings.cosmetic.navi_npc_outer_green); + CVar_SetS32("gNavi_NPC_Outer_Green", Settings.cosmetic.navi_npc_outer_green); Settings.cosmetic.navi_npc_outer_blue = (Conf[CosmeticsSection]["navi_npc_outer_blue"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_npc_outer_blue"]) : Settings.cosmetic.navi_npc_outer_blue; - CVar_SetS32(const_cast("gNavi_NPC_Outer_Blue"), Settings.cosmetic.navi_npc_outer_blue); + CVar_SetS32("gNavi_NPC_Outer_Blue", Settings.cosmetic.navi_npc_outer_blue); Settings.cosmetic.navi_enemy_inner_red = (Conf[CosmeticsSection]["navi_enemy_inner_red"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_enemy_inner_red"]) : Settings.cosmetic.navi_enemy_inner_red; - CVar_SetS32(const_cast("gNavi_Enemy_Inner_Red"), Settings.cosmetic.navi_enemy_inner_red); + CVar_SetS32("gNavi_Enemy_Inner_Red", Settings.cosmetic.navi_enemy_inner_red); Settings.cosmetic.navi_enemy_inner_green = (Conf[CosmeticsSection]["navi_enemy_inner_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_enemy_inner_green"]) : Settings.cosmetic.navi_enemy_inner_green; - CVar_SetS32(const_cast("gNavi_Enemy_Inner_Green"), Settings.cosmetic.navi_enemy_inner_green); + CVar_SetS32("gNavi_Enemy_Inner_Green", Settings.cosmetic.navi_enemy_inner_green); Settings.cosmetic.navi_enemy_inner_blue = (Conf[CosmeticsSection]["navi_enemy_inner_blue"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_enemy_inner_blue"]) : Settings.cosmetic.navi_enemy_inner_blue; - CVar_SetS32(const_cast("gNavi_Enemy_Inner_Blue"), Settings.cosmetic.navi_enemy_inner_blue); + CVar_SetS32("gNavi_Enemy_Inner_Blue", Settings.cosmetic.navi_enemy_inner_blue); Settings.cosmetic.navi_enemy_outer_red = (Conf[CosmeticsSection]["navi_enemy_outer_red"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_enemy_outer_red"]) : Settings.cosmetic.navi_enemy_outer_red; - CVar_SetS32(const_cast("gNavi_Enemy_Outer_Red"), Settings.cosmetic.navi_enemy_outer_red); + CVar_SetS32("gNavi_Enemy_Outer_Red", Settings.cosmetic.navi_enemy_outer_red); Settings.cosmetic.navi_enemy_outer_green = (Conf[CosmeticsSection]["navi_enemy_outer_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_enemy_outer_green"]) : Settings.cosmetic.navi_enemy_outer_green; - CVar_SetS32(const_cast("gNavi_Enemy_Outer_Green"), Settings.cosmetic.navi_enemy_outer_green); + CVar_SetS32("gNavi_Enemy_Outer_Green", Settings.cosmetic.navi_enemy_outer_green); Settings.cosmetic.navi_enemy_outer_blue = (Conf[CosmeticsSection]["navi_enemy_outer_blue"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_enemy_outer_blue"]) : Settings.cosmetic.navi_enemy_outer_blue; - CVar_SetS32(const_cast("gNavi_Enemy_Outer_Blue"), Settings.cosmetic.navi_enemy_outer_blue); + CVar_SetS32("gNavi_Enemy_Outer_Blue", Settings.cosmetic.navi_enemy_outer_blue); Settings.cosmetic.navi_prop_inner_red = (Conf[CosmeticsSection]["navi_prop_inner_red"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_prop_inner_red"]) : Settings.cosmetic.navi_prop_inner_red; - CVar_SetS32(const_cast("gNavi_Prop_Inner_Red"), Settings.cosmetic.navi_prop_inner_red); + CVar_SetS32("gNavi_Prop_Inner_Red", Settings.cosmetic.navi_prop_inner_red); Settings.cosmetic.navi_prop_inner_green = (Conf[CosmeticsSection]["navi_prop_inner_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_prop_inner_green"]) : Settings.cosmetic.navi_prop_inner_green; - CVar_SetS32(const_cast("gNavi_Prop_Inner_Green"), Settings.cosmetic.navi_prop_inner_green); + CVar_SetS32("gNavi_Prop_Inner_Green", Settings.cosmetic.navi_prop_inner_green); Settings.cosmetic.navi_prop_inner_blue = (Conf[CosmeticsSection]["navi_prop_inner_blue"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_prop_inner_blue"]) : Settings.cosmetic.navi_prop_inner_blue; - CVar_SetS32(const_cast("gNavi_Prop_Inner_Blue"), Settings.cosmetic.navi_prop_inner_blue); + CVar_SetS32("gNavi_Prop_Inner_Blue", Settings.cosmetic.navi_prop_inner_blue); Settings.cosmetic.navi_prop_outer_red = (Conf[CosmeticsSection]["navi_prop_outer_red"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_prop_outer_red"]) : Settings.cosmetic.navi_prop_outer_red; - CVar_SetS32(const_cast("gNavi_Prop_Outer_Red"), Settings.cosmetic.navi_prop_outer_red); + CVar_SetS32("gNavi_Prop_Outer_Red", Settings.cosmetic.navi_prop_outer_red); Settings.cosmetic.navi_prop_outer_green = (Conf[CosmeticsSection]["navi_prop_outer_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_prop_outer_green"]) : Settings.cosmetic.navi_prop_outer_green; - CVar_SetS32(const_cast("gNavi_Prop_Outer_Green"), Settings.cosmetic.navi_prop_outer_green); + CVar_SetS32("gNavi_Prop_Outer_Green", Settings.cosmetic.navi_prop_outer_green); Settings.cosmetic.navi_prop_outer_blue = (Conf[CosmeticsSection]["navi_prop_outer_blue"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_prop_outer_blue"]) : Settings.cosmetic.navi_prop_outer_blue; - CVar_SetS32(const_cast("gNavi_Prop_Outer_Blue"), Settings.cosmetic.navi_prop_outer_blue); + CVar_SetS32("gNavi_Prop_Outer_Blue", Settings.cosmetic.navi_prop_outer_blue); @@ -238,9 +237,28 @@ namespace Game { Settings.cheats.freeze_time = stob(Conf[CheatSection]["freeze_time"]); CVar_SetS32("gFreezeTime", Settings.cheats.freeze_time); + // Per-Controller + LoadPadSettings(); + UpdateAudio(); } + void LoadPadSettings() { + const std::shared_ptr pConf = GlobalCtx2::GetInstance()->GetConfig(); + ConfigFile& Conf = *pConf; + + for (const auto& [i, controllers] : Ship::Window::Controllers) { + for (const auto& controller : controllers) { + if (auto padConfSection = controller->GetPadConfSection()) { + Settings.controller.extra[i].gyro_sensitivity = Ship::stof(Conf[*padConfSection]["gyro_sensitivity"]); + Settings.controller.extra[i].rumble_strength = Ship::stof(Conf[*padConfSection]["rumble_strength"]); + Settings.controller.extra[i].gyro_drift_x = Ship::stof(Conf[*padConfSection]["gyro_drift_x"], 0.0f); + Settings.controller.extra[i].gyro_drift_y = Ship::stof(Conf[*padConfSection]["gyro_drift_y"], 0.0f); + } + } + } + } + void SaveSettings() { const std::shared_ptr pConf = GlobalCtx2::GetInstance()->GetConfig(); ConfigFile& Conf = *pConf; @@ -272,8 +290,7 @@ namespace Game { // Controllers - Conf[ControllerSection]["gyro_sensitivity"] = std::to_string(Settings.controller.gyro_sensitivity); - Conf[ControllerSection]["rumble_strength"] = std::to_string(Settings.controller.rumble_strength); + Conf[ControllerSection]["rumble_enabled"] = std::to_string(Settings.controller.rumble_enabled); Conf[ControllerSection]["input_scale"] = std::to_string(Settings.controller.input_scale); Conf[ControllerSection]["input_enabled"] = std::to_string(Settings.controller.input_enabled); Conf[ControllerSection]["dpad_pause_name"] = std::to_string(Settings.controller.dpad_pause_name); @@ -333,6 +350,17 @@ namespace Game { Conf[CheatSection]["moon_jump_on_l"] = std::to_string(Settings.cheats.moon_jump_on_l); Conf[CheatSection]["super_tunic"] = std::to_string(Settings.cheats.super_tunic); + // Per-Controller + for (const auto& [i, controllers] : Ship::Window::Controllers) { + for (const auto& controller : controllers) { + if (auto padConfSection = controller->GetPadConfSection()) { + Conf[*padConfSection]["gyro_sensitivity"] = std::to_string(Settings.controller.extra[i].gyro_sensitivity); + Conf[*padConfSection]["rumble_strength"] = std::to_string(Settings.controller.extra[i].rumble_strength); + Conf[*padConfSection]["gyro_drift_x"] = std::to_string(Settings.controller.extra[i].gyro_drift_x); + Conf[*padConfSection]["gyro_drift_y"] = std::to_string(Settings.controller.extra[i].gyro_drift_y); + } + } + } Conf.Save(); } diff --git a/libultraship/libultraship/GameSettings.h b/libultraship/libultraship/GameSettings.h index 4f4eecb97..2feea8dcb 100644 --- a/libultraship/libultraship/GameSettings.h +++ b/libultraship/libultraship/GameSettings.h @@ -34,11 +34,14 @@ struct SoHConfigType { // Controller struct { - float gyro_sensitivity = 1.0f; - float rumble_strength = 1.0f; + struct { + float gyro_sensitivity = 1.0f; + float rumble_strength = 1.0f; + float gyro_drift_x = 0.0f; + float gyro_drift_y = 0.0f; + } extra[4]; + bool rumble_enabled = true; float input_scale = 1.0f; - float gyroDriftX = 0.0f; - float gyroDriftY = 0.0f; bool input_enabled = false; bool dpad_pause_name = false; bool dpad_ocarina_text = false; @@ -128,6 +131,7 @@ namespace Game { extern SoHConfigType Settings; void InitSettings(); void LoadSettings(); + void LoadPadSettings(); void SaveSettings(); void SetSeqPlayerVolume(SeqPlayers playerId, float volume); } diff --git a/libultraship/libultraship/KeyboardController.cpp b/libultraship/libultraship/KeyboardController.cpp index 6f78a1678..13014c6a7 100644 --- a/libultraship/libultraship/KeyboardController.cpp +++ b/libultraship/libultraship/KeyboardController.cpp @@ -53,4 +53,4 @@ namespace Ship { std::string KeyboardController::GetBindingConfSection() { return GetControllerType() + " CONTROLLER BINDING " + std::to_string(GetControllerNumber() + 1); } -} \ No newline at end of file +} diff --git a/libultraship/libultraship/KeyboardController.h b/libultraship/libultraship/KeyboardController.h index ab0f98e64..f6c109ca7 100644 --- a/libultraship/libultraship/KeyboardController.h +++ b/libultraship/libultraship/KeyboardController.h @@ -10,11 +10,16 @@ namespace Ship { void ReadFromSource(); void WriteToSource(ControllerCallback* controller); + bool Connected() const { return true; } + bool CanRumble() const { return false; } bool PressButton(int32_t dwScancode); bool ReleaseButton(int32_t dwScancode); void ReleaseAllButtons(); + bool HasPadConf() const { return false; } + std::optional GetPadConfSection() { return {}; } + protected: std::string GetControllerType(); std::string GetConfSection(); diff --git a/libultraship/libultraship/SDLController.cpp b/libultraship/libultraship/SDLController.cpp index 47fb57441..267607048 100644 --- a/libultraship/libultraship/SDLController.cpp +++ b/libultraship/libultraship/SDLController.cpp @@ -74,15 +74,21 @@ namespace Ship { Cont = NewCont; std::string BindingConfSection = GetBindingConfSection(); - std::shared_ptr pBindingConf = GlobalCtx2::GetInstance()->GetConfig(); - ConfigFile& BindingConf = *pBindingConf.get(); + std::string PadConfSection = *GetPadConfSection(); + std::shared_ptr config = GlobalCtx2::GetInstance()->GetConfig(); - if (!BindingConf.has(BindingConfSection)) { + if (!config->has(BindingConfSection)) { CreateDefaultBinding(); } + if (!config->has(PadConfSection)) { + CreateDefaultPadConf(); + } + LoadBinding(); LoadAxisThresholds(); + // Update per-controller settings in ImGui menu after opening controller. + Game::LoadPadSettings(); break; } @@ -93,6 +99,9 @@ namespace Ship { } bool SDLController::Close() { + if (SDL_GameControllerHasRumble(Cont)) { + SDL_GameControllerRumble(Cont, 0, 0, 0); + } if (Cont != nullptr) { SDL_GameControllerClose(Cont); } @@ -178,37 +187,41 @@ namespace Ship { if (SDL_GameControllerHasSensor(Cont, SDL_SENSOR_GYRO)) { + size_t contNumber = GetControllerNumber(); + float& gyro_drift_x = Game::Settings.controller.extra[contNumber].gyro_drift_x; + float& gyro_drift_y = Game::Settings.controller.extra[contNumber].gyro_drift_y; + const float gyro_sensitivity = Game::Settings.controller.extra[contNumber].gyro_sensitivity; + float gyroData[3]; SDL_GameControllerGetSensorData(Cont, SDL_SENSOR_GYRO, gyroData, 3); const char* contName = SDL_GameControllerName(Cont); const int isSpecialController = !strcmp("PS5 Controller", contName); - const float gyroSensitivity = Game::Settings.controller.gyro_sensitivity; - if (Game::Settings.controller.gyroDriftX == 0) { - Game::Settings.controller.gyroDriftX = gyroData[0]; + if (gyro_drift_x == 0) { + gyro_drift_x = gyroData[0]; } - if (Game::Settings.controller.gyroDriftY == 0) { + if (gyro_drift_y == 0) { if (isSpecialController == 1) { - Game::Settings.controller.gyroDriftY = gyroData[2]; + gyro_drift_y = gyroData[2]; } else { - Game::Settings.controller.gyroDriftY = gyroData[1]; + gyro_drift_y = gyroData[1]; } } if (isSpecialController == 1) { - wGyroX = gyroData[0] - Game::Settings.controller.gyroDriftX; - wGyroY = -gyroData[2] - Game::Settings.controller.gyroDriftY; + wGyroX = gyroData[0] - gyro_drift_x; + wGyroY = -gyroData[2] - gyro_drift_y; } else { - wGyroX = gyroData[0] - Game::Settings.controller.gyroDriftX; - wGyroY = gyroData[1] - Game::Settings.controller.gyroDriftY; + wGyroX = gyroData[0] - gyro_drift_x; + wGyroY = gyroData[1] - gyro_drift_y; } - wGyroX *= gyroSensitivity; - wGyroY *= gyroSensitivity; + wGyroX *= gyro_sensitivity; + wGyroY *= gyro_sensitivity; } for (int32_t i = SDL_CONTROLLER_BUTTON_A; i < SDL_CONTROLLER_BUTTON_MAX; i++) { @@ -331,7 +344,10 @@ namespace Ship { { if (SDL_GameControllerHasRumble(Cont)) { if (controller->rumble > 0) { - SDL_GameControllerRumble(Cont, 0xFFFF * Game::Settings.controller.rumble_strength, 0xFFFF * Game::Settings.controller.rumble_strength, 1); + float rumble_strength = Game::Settings.controller.extra[GetControllerNumber()].rumble_strength; + SDL_GameControllerRumble(Cont, 0xFFFF * rumble_strength, 0xFFFF * rumble_strength, 0); + } else { + SDL_GameControllerRumble(Cont, 0, 0, 0); } } @@ -391,6 +407,19 @@ namespace Ship { Conf.Save(); } + void SDLController::CreateDefaultPadConf() { + std::string ConfSection = *GetPadConfSection(); + std::shared_ptr pConf = GlobalCtx2::GetInstance()->GetConfig(); + ConfigFile& Conf = *pConf.get(); + + Conf[ConfSection]["gyro_sensitivity"] = std::to_string(1.0f); + Conf[ConfSection]["rumble_strength"] = std::to_string(1.0f); + Conf[ConfSection]["gyro_drift_x"] = std::to_string(0.0f); + Conf[ConfSection]["gyro_drift_y"] = std::to_string(0.0f); + + Conf.Save(); + } + void SDLController::SetButtonMapping(const std::string& szButtonName, int32_t dwScancode) { if (guid.compare(INVALID_SDL_CONTROLLER_GUID)) { return; @@ -410,4 +439,8 @@ namespace Ship { std::string SDLController::GetBindingConfSection() { return GetControllerType() + " CONTROLLER BINDING " + guid; } + + std::optional SDLController::GetPadConfSection() { + return GetControllerType() + " CONTROLLER PAD " + guid; + } } diff --git a/libultraship/libultraship/SDLController.h b/libultraship/libultraship/SDLController.h index 5c71c50a9..138466a89 100644 --- a/libultraship/libultraship/SDLController.h +++ b/libultraship/libultraship/SDLController.h @@ -12,15 +12,21 @@ namespace Ship { void ReadFromSource(); void WriteToSource(ControllerCallback* controller); + bool Connected() const { return Cont != nullptr; } + bool CanRumble() const { return SDL_GameControllerHasRumble(Cont); } std::string GetGuid() { return guid; }; + bool HasPadConf() const { return true; } + std::optional GetPadConfSection(); + protected: std::string GetControllerType(); void SetButtonMapping(const std::string& szButtonName, int32_t dwScancode); std::string GetConfSection(); std::string GetBindingConfSection(); void CreateDefaultBinding(); + void CreateDefaultPadConf(); static bool IsGuidInUse(const std::string& guid); private: diff --git a/libultraship/libultraship/SohImGuiImpl.cpp b/libultraship/libultraship/SohImGuiImpl.cpp index 96211fe20..5111a0d6d 100644 --- a/libultraship/libultraship/SohImGuiImpl.cpp +++ b/libultraship/libultraship/SohImGuiImpl.cpp @@ -3,6 +3,9 @@ #include #include #include +#include +#include +#include #include "Archive.h" #include "Environment.h" @@ -81,49 +84,49 @@ namespace SohImGui { ImGui_ImplWin32_Init(impl.dx11.window); break; } - kokiri_col[0] = std::clamp((float) CVar_GetS32((char*)"gTunic_Kokiri_Red", 30)/255, 0.0f, 1.0f); - kokiri_col[1] = std::clamp((float)CVar_GetS32((char*)"gTunic_Kokiri_Green", 105) / 255, 0.0f, 1.0f); - kokiri_col[2] = std::clamp((float)CVar_GetS32((char*)"gTunic_Kokiri_Blue", 27) / 255, 0.0f, 1.0f); + kokiri_col[0] = std::clamp((float) CVar_GetS32("gTunic_Kokiri_Red", 30)/255, 0.0f, 1.0f); + kokiri_col[1] = std::clamp((float)CVar_GetS32("gTunic_Kokiri_Green", 105) / 255, 0.0f, 1.0f); + kokiri_col[2] = std::clamp((float)CVar_GetS32("gTunic_Kokiri_Blue", 27) / 255, 0.0f, 1.0f); - goron_col[0] = std::clamp((float)CVar_GetS32((char*)"gTunic_Goron_Red", 100) / 255, 0.0f, 1.0f); - goron_col[1] = std::clamp((float)CVar_GetS32((char*)"gTunic_Goron_Green", 20) / 255, 0.0f, 1.0f); - goron_col[2] = std::clamp((float)CVar_GetS32((char*)"gTunic_Goron_Blue", 0) / 255, 0.0f, 1.0f); + goron_col[0] = std::clamp((float)CVar_GetS32("gTunic_Goron_Red", 100) / 255, 0.0f, 1.0f); + goron_col[1] = std::clamp((float)CVar_GetS32("gTunic_Goron_Green", 20) / 255, 0.0f, 1.0f); + goron_col[2] = std::clamp((float)CVar_GetS32("gTunic_Goron_Blue", 0) / 255, 0.0f, 1.0f); - zora_col[0] = std::clamp((float)CVar_GetS32((char*)"gTunic_Zora_Red", 0) / 255, 0.0f, 1.0f); - zora_col[1] = std::clamp((float)CVar_GetS32((char*)"gTunic_Zora_Green", 60) / 255, 0.0f, 1.0f); - zora_col[2] = std::clamp((float)CVar_GetS32((char*)"gTunic_Zora_Blue", 100) / 255, 0.0f, 1.0f); + zora_col[0] = std::clamp((float)CVar_GetS32("gTunic_Zora_Red", 0) / 255, 0.0f, 1.0f); + zora_col[1] = std::clamp((float)CVar_GetS32("gTunic_Zora_Green", 60) / 255, 0.0f, 1.0f); + zora_col[2] = std::clamp((float)CVar_GetS32("gTunic_Zora_Blue", 100) / 255, 0.0f, 1.0f); - navi_idle_i_col[0] = std::clamp((float)CVar_GetS32((char*)"gNavi_Idle_Inner_Red", 0) / 255, 0.0f, 1.0f); - navi_idle_i_col[1] = std::clamp((float)CVar_GetS32((char*)"gNavi_Idle_Inner_Green", 0) / 255, 0.0f, 1.0f); - navi_idle_i_col[2] = std::clamp((float)CVar_GetS32((char*)"gNavi_Idle_Inner_Blue", 0) / 255, 0.0f, 1.0f); + navi_idle_i_col[0] = std::clamp((float)CVar_GetS32("gNavi_Idle_Inner_Red", 0) / 255, 0.0f, 1.0f); + navi_idle_i_col[1] = std::clamp((float)CVar_GetS32("gNavi_Idle_Inner_Green", 0) / 255, 0.0f, 1.0f); + navi_idle_i_col[2] = std::clamp((float)CVar_GetS32("gNavi_Idle_Inner_Blue", 0) / 255, 0.0f, 1.0f); - navi_idle_o_col[0] = std::clamp((float)CVar_GetS32((char*)"gNavi_Idle_Outer_Red", 0) / 255, 0.0f, 1.0f); - navi_idle_o_col[1] = std::clamp((float)CVar_GetS32((char*)"gNavi_Idle_Outer_Green", 0) / 255, 0.0f, 1.0f); - navi_idle_o_col[2] = std::clamp((float)CVar_GetS32((char*)"gNavi_Idle_Outer_Blue", 0) / 255, 0.0f, 1.0f); + navi_idle_o_col[0] = std::clamp((float)CVar_GetS32("gNavi_Idle_Outer_Red", 0) / 255, 0.0f, 1.0f); + navi_idle_o_col[1] = std::clamp((float)CVar_GetS32("gNavi_Idle_Outer_Green", 0) / 255, 0.0f, 1.0f); + navi_idle_o_col[2] = std::clamp((float)CVar_GetS32("gNavi_Idle_Outer_Blue", 0) / 255, 0.0f, 1.0f); - navi_npc_i_col[0] = std::clamp((float)CVar_GetS32((char*)"gNavi_NPC_Inner_Red", 0) / 255, 0.0f, 1.0f); - navi_npc_i_col[1] = std::clamp((float)CVar_GetS32((char*)"gNavi_NPC_Inner_Green", 0) / 255, 0.0f, 1.0f); - navi_npc_i_col[2] = std::clamp((float)CVar_GetS32((char*)"gNavi_NPC_Inner_Blue", 0) / 255, 0.0f, 1.0f); + navi_npc_i_col[0] = std::clamp((float)CVar_GetS32("gNavi_NPC_Inner_Red", 0) / 255, 0.0f, 1.0f); + navi_npc_i_col[1] = std::clamp((float)CVar_GetS32("gNavi_NPC_Inner_Green", 0) / 255, 0.0f, 1.0f); + navi_npc_i_col[2] = std::clamp((float)CVar_GetS32("gNavi_NPC_Inner_Blue", 0) / 255, 0.0f, 1.0f); - navi_npc_o_col[0] = std::clamp((float)CVar_GetS32((char*)"gNavi_NPC_Outer_Red", 0) / 255, 0.0f, 1.0f); - navi_npc_o_col[1] = std::clamp((float)CVar_GetS32((char*)"gNavi_NPC_Outer_Green", 0) / 255, 0.0f, 1.0f); - navi_npc_o_col[2] = std::clamp((float)CVar_GetS32((char*)"gNavi_NPC_Outer_Blue", 0) / 255, 0.0f, 1.0f); + navi_npc_o_col[0] = std::clamp((float)CVar_GetS32("gNavi_NPC_Outer_Red", 0) / 255, 0.0f, 1.0f); + navi_npc_o_col[1] = std::clamp((float)CVar_GetS32("gNavi_NPC_Outer_Green", 0) / 255, 0.0f, 1.0f); + navi_npc_o_col[2] = std::clamp((float)CVar_GetS32("gNavi_NPC_Outer_Blue", 0) / 255, 0.0f, 1.0f); - navi_enemy_i_col[0] = std::clamp((float)CVar_GetS32((char*)"gNavi_Enemy_Inner_Red", 0) / 255, 0.0f, 1.0f); - navi_enemy_i_col[1] = std::clamp((float)CVar_GetS32((char*)"gNavi_Enemy_Inner_Green", 0) / 255, 0.0f, 1.0f); - navi_enemy_i_col[2] = std::clamp((float)CVar_GetS32((char*)"gNavi_Enemy_Inner_Blue", 0) / 255, 0.0f, 1.0f); + navi_enemy_i_col[0] = std::clamp((float)CVar_GetS32("gNavi_Enemy_Inner_Red", 0) / 255, 0.0f, 1.0f); + navi_enemy_i_col[1] = std::clamp((float)CVar_GetS32("gNavi_Enemy_Inner_Green", 0) / 255, 0.0f, 1.0f); + navi_enemy_i_col[2] = std::clamp((float)CVar_GetS32("gNavi_Enemy_Inner_Blue", 0) / 255, 0.0f, 1.0f); - navi_enemy_o_col[0] = std::clamp((float)CVar_GetS32((char*)"gNavi_Enemy_Outer_Red", 0) / 255, 0.0f, 1.0f); - navi_enemy_o_col[1] = std::clamp((float)CVar_GetS32((char*)"gNavi_Enemy_Outer_Green", 0) / 255, 0.0f, 1.0f); - navi_enemy_o_col[2] = std::clamp((float)CVar_GetS32((char*)"gNavi_Enemy_Outer_Blue", 0) / 255, 0.0f, 1.0f); + navi_enemy_o_col[0] = std::clamp((float)CVar_GetS32("gNavi_Enemy_Outer_Red", 0) / 255, 0.0f, 1.0f); + navi_enemy_o_col[1] = std::clamp((float)CVar_GetS32("gNavi_Enemy_Outer_Green", 0) / 255, 0.0f, 1.0f); + navi_enemy_o_col[2] = std::clamp((float)CVar_GetS32("gNavi_Enemy_Outer_Blue", 0) / 255, 0.0f, 1.0f); - navi_prop_i_col[0] = std::clamp((float)CVar_GetS32((char*)"gNavi_Prop_Inner_Red", 0) / 255, 0.0f, 1.0f); - navi_prop_i_col[1] = std::clamp((float)CVar_GetS32((char*)"gNavi_Prop_Inner_Green", 0) / 255, 0.0f, 1.0f); - navi_prop_i_col[2] = std::clamp((float)CVar_GetS32((char*)"gNavi_Prop_Inner_Blue", 0) / 255, 0.0f, 1.0f); + navi_prop_i_col[0] = std::clamp((float)CVar_GetS32("gNavi_Prop_Inner_Red", 0) / 255, 0.0f, 1.0f); + navi_prop_i_col[1] = std::clamp((float)CVar_GetS32("gNavi_Prop_Inner_Green", 0) / 255, 0.0f, 1.0f); + navi_prop_i_col[2] = std::clamp((float)CVar_GetS32("gNavi_Prop_Inner_Blue", 0) / 255, 0.0f, 1.0f); - navi_prop_o_col[0] = std::clamp((float)CVar_GetS32((char*)"gNavi_Prop_Outer_Red", 0) / 255, 0.0f, 1.0f); - navi_prop_o_col[1] = std::clamp((float)CVar_GetS32((char*)"gNavi_Prop_Outer_Green", 0) / 255, 0.0f, 1.0f); - navi_prop_o_col[2] = std::clamp((float)CVar_GetS32((char*)"gNavi_Prop_Outer_Blue", 0) / 255, 0.0f, 1.0f); + navi_prop_o_col[0] = std::clamp((float)CVar_GetS32("gNavi_Prop_Outer_Red", 0) / 255, 0.0f, 1.0f); + navi_prop_o_col[1] = std::clamp((float)CVar_GetS32("gNavi_Prop_Outer_Green", 0) / 255, 0.0f, 1.0f); + navi_prop_o_col[2] = std::clamp((float)CVar_GetS32("gNavi_Prop_Outer_Blue", 0) / 255, 0.0f, 1.0f); } void ImGuiBackendInit() { @@ -402,20 +405,41 @@ namespace SohImGui { } if (ImGui::BeginMenu("Controller")) { - ImGui::Text("Gyro Sensitivity: %d %%", static_cast(100 * Game::Settings.controller.gyro_sensitivity)); - if (ImGui::SliderFloat("##GYROSCOPE", &Game::Settings.controller.gyro_sensitivity, 0.0f, 1.0f, "")) { - needs_save = true; - } + for (const auto& [i, controllers] : Ship::Window::Controllers) { + bool hasPad = std::find_if(controllers.begin(), controllers.end(), [](const auto& c) { + return c->HasPadConf() && c->Connected(); + }) != controllers.end(); - if (ImGui::Button("Recalibrate Gyro")) { - Game::Settings.controller.gyroDriftX = 0; - Game::Settings.controller.gyroDriftY = 0; + if (!hasPad) continue; + + auto menuLabel = "Controller " + std::to_string(i + 1); + if (ImGui::BeginMenu(menuLabel.c_str())) { + ImGui::Text("Gyro Sensitivity: %d %%", static_cast(100 * Game::Settings.controller.extra[i].gyro_sensitivity)); + if (ImGui::SliderFloat("##GYROSCOPE", &Game::Settings.controller.extra[i].gyro_sensitivity, 0.0f, 1.0f, "")) { + needs_save = true; + } + + if (ImGui::Button("Recalibrate Gyro")) { + Game::Settings.controller.extra[i].gyro_drift_x = 0; + Game::Settings.controller.extra[i].gyro_drift_y = 0; + needs_save = true; + } + + ImGui::Separator(); + + ImGui::Text("Rumble Strength: %d %%", static_cast(100 * Game::Settings.controller.extra[i].rumble_strength)); + if (ImGui::SliderFloat("##RUMBLE", &Game::Settings.controller.extra[i].rumble_strength, 0.0f, 1.0f, "")) { + needs_save = true; + } + + ImGui::EndMenu(); + } } ImGui::Separator(); - ImGui::Text("Rumble Strength: %d %%", static_cast(100 * Game::Settings.controller.rumble_strength)); - if (ImGui::SliderFloat("##RUMBLE", &Game::Settings.controller.rumble_strength, 0.0f, 1.0f, "")) { + if (ImGui::Checkbox("Rumble Enabled", &Game::Settings.controller.rumble_enabled)) { + CVar_SetS32("gRumbleEnabled", Game::Settings.controller.rumble_enabled); needs_save = true; } @@ -505,7 +529,7 @@ namespace SohImGui { } if (ImGui::Checkbox("Dynamic Wallet Icon", &Game::Settings.enhancements.dynamic_wallet_icon)) { - CVar_SetS32(const_cast("gDynamicWalletIcon"), Game::Settings.enhancements.dynamic_wallet_icon); + CVar_SetS32("gDynamicWalletIcon", Game::Settings.enhancements.dynamic_wallet_icon); needs_save = true; } @@ -587,30 +611,30 @@ namespace SohImGui { ImGui::Text("Tunics"); ImGui::Separator(); if (ImGui::ColorEdit3("Kokiri Tunic", kokiri_col)) { - Game::Settings.cosmetic.tunic_kokiri_red = (int) (kokiri_col[0] * 255); - Game::Settings.cosmetic.tunic_kokiri_green = (int) (kokiri_col[1] * 255); - Game::Settings.cosmetic.tunic_kokiri_blue = (int) (kokiri_col[2] * 255); - CVar_SetS32(const_cast("gTunic_Kokiri_Red"), Game::Settings.cosmetic.tunic_kokiri_red); - CVar_SetS32(const_cast("gTunic_Kokiri_Green"), Game::Settings.cosmetic.tunic_kokiri_green); - CVar_SetS32(const_cast("gTunic_Kokiri_Blue"), Game::Settings.cosmetic.tunic_kokiri_blue); + Game::Settings.cosmetic.tunic_kokiri_red = (int)(kokiri_col[0] * 255); + Game::Settings.cosmetic.tunic_kokiri_green = (int)(kokiri_col[1] * 255); + Game::Settings.cosmetic.tunic_kokiri_blue = (int)(kokiri_col[2] * 255); + CVar_SetS32("gTunic_Kokiri_Red", Game::Settings.cosmetic.tunic_kokiri_red); + CVar_SetS32("gTunic_Kokiri_Green", Game::Settings.cosmetic.tunic_kokiri_green); + CVar_SetS32("gTunic_Kokiri_Blue", Game::Settings.cosmetic.tunic_kokiri_blue); needs_save = true; } if (ImGui::ColorEdit3("Goron Tunic", goron_col)) { Game::Settings.cosmetic.tunic_goron_red = (int)(goron_col[0] * 255); Game::Settings.cosmetic.tunic_goron_green = (int)(goron_col[1] * 255); Game::Settings.cosmetic.tunic_goron_blue = (int)(goron_col[2] * 255); - CVar_SetS32(const_cast("gTunic_Goron_Red"), Game::Settings.cosmetic.tunic_goron_red); - CVar_SetS32(const_cast("gTunic_Goron_Green"), Game::Settings.cosmetic.tunic_goron_green); - CVar_SetS32(const_cast("gTunic_Goron_Blue"), Game::Settings.cosmetic.tunic_goron_blue); + CVar_SetS32("gTunic_Goron_Red", Game::Settings.cosmetic.tunic_goron_red); + CVar_SetS32("gTunic_Goron_Green", Game::Settings.cosmetic.tunic_goron_green); + CVar_SetS32("gTunic_Goron_Blue", Game::Settings.cosmetic.tunic_goron_blue); needs_save = true; } if (ImGui::ColorEdit3("Zora Tunic", zora_col)) { Game::Settings.cosmetic.tunic_zora_red = (int)(zora_col[0] * 255); Game::Settings.cosmetic.tunic_zora_green = (int)(zora_col[1] * 255); Game::Settings.cosmetic.tunic_zora_blue = (int)(zora_col[2] * 255); - CVar_SetS32(const_cast("gTunic_Zora_Red"), Game::Settings.cosmetic.tunic_zora_red); - CVar_SetS32(const_cast("gTunic_Zora_Green"), Game::Settings.cosmetic.tunic_zora_green); - CVar_SetS32(const_cast("gTunic_Zora_Blue"), Game::Settings.cosmetic.tunic_zora_blue); + CVar_SetS32("gTunic_Zora_Red", Game::Settings.cosmetic.tunic_zora_red); + CVar_SetS32("gTunic_Zora_Green", Game::Settings.cosmetic.tunic_zora_green); + CVar_SetS32("gTunic_Zora_Blue", Game::Settings.cosmetic.tunic_zora_blue); needs_save = true; } ImGui::Text("Navi"); @@ -619,9 +643,9 @@ namespace SohImGui { Game::Settings.cosmetic.navi_idle_inner_red = (int)(navi_idle_i_col[0] * 255); Game::Settings.cosmetic.navi_idle_inner_green = (int)(navi_idle_i_col[1] * 255); Game::Settings.cosmetic.navi_idle_inner_blue = (int)(navi_idle_i_col[2] * 255); - CVar_SetS32(const_cast("gNavi_Idle_Inner_Red"), Game::Settings.cosmetic.navi_idle_inner_red); - CVar_SetS32(const_cast("gNavi_Idle_Inner_Green"), Game::Settings.cosmetic.navi_idle_inner_green); - CVar_SetS32(const_cast("gNavi_Idle_Inner_Blue"), Game::Settings.cosmetic.navi_idle_inner_blue); + CVar_SetS32("gNavi_Idle_Inner_Red", Game::Settings.cosmetic.navi_idle_inner_red); + CVar_SetS32("gNavi_Idle_Inner_Green", Game::Settings.cosmetic.navi_idle_inner_green); + CVar_SetS32("gNavi_Idle_Inner_Blue", Game::Settings.cosmetic.navi_idle_inner_blue); needs_save = true; } @@ -629,9 +653,9 @@ namespace SohImGui { Game::Settings.cosmetic.navi_idle_outer_red = (int)(navi_idle_o_col[0] * 255); Game::Settings.cosmetic.navi_idle_outer_green = (int)(navi_idle_o_col[1] * 255); Game::Settings.cosmetic.navi_idle_outer_blue = (int)(navi_idle_o_col[2] * 255); - CVar_SetS32(const_cast("gNavi_Idle_Outer_Red"), Game::Settings.cosmetic.navi_idle_outer_red); - CVar_SetS32(const_cast("gNavi_Idle_Outer_Green"), Game::Settings.cosmetic.navi_idle_outer_green); - CVar_SetS32(const_cast("gNavi_Idle_Outer_Blue"), Game::Settings.cosmetic.navi_idle_outer_blue); + CVar_SetS32("gNavi_Idle_Outer_Red", Game::Settings.cosmetic.navi_idle_outer_red); + CVar_SetS32("gNavi_Idle_Outer_Green", Game::Settings.cosmetic.navi_idle_outer_green); + CVar_SetS32("gNavi_Idle_Outer_Blue", Game::Settings.cosmetic.navi_idle_outer_blue); needs_save = true; } @@ -639,9 +663,9 @@ namespace SohImGui { Game::Settings.cosmetic.navi_npc_inner_red = (int)(navi_npc_i_col[0] * 255); Game::Settings.cosmetic.navi_npc_inner_green = (int)(navi_npc_i_col[1] * 255); Game::Settings.cosmetic.navi_npc_inner_blue = (int)(navi_npc_i_col[2] * 255); - CVar_SetS32(const_cast("gNavi_NPC_Inner_Red"), Game::Settings.cosmetic.navi_npc_inner_red); - CVar_SetS32(const_cast("gNavi_NPC_Inner_Green"), Game::Settings.cosmetic.navi_npc_inner_green); - CVar_SetS32(const_cast("gNavi_NPC_Inner_Blue"), Game::Settings.cosmetic.navi_npc_inner_blue); + CVar_SetS32("gNavi_NPC_Inner_Red", Game::Settings.cosmetic.navi_npc_inner_red); + CVar_SetS32("gNavi_NPC_Inner_Green", Game::Settings.cosmetic.navi_npc_inner_green); + CVar_SetS32("gNavi_NPC_Inner_Blue", Game::Settings.cosmetic.navi_npc_inner_blue); needs_save = true; } @@ -649,9 +673,9 @@ namespace SohImGui { Game::Settings.cosmetic.navi_npc_outer_red = (int)(navi_npc_o_col[0] * 255); Game::Settings.cosmetic.navi_npc_outer_green = (int)(navi_npc_o_col[1] * 255); Game::Settings.cosmetic.navi_npc_outer_blue = (int)(navi_npc_o_col[2] * 255); - CVar_SetS32(const_cast("gNavi_NPC_Outer_Red"), Game::Settings.cosmetic.navi_npc_outer_red); - CVar_SetS32(const_cast("gNavi_NPC_Outer_Green"), Game::Settings.cosmetic.navi_npc_outer_green); - CVar_SetS32(const_cast("gNavi_NPC_Outer_Blue"), Game::Settings.cosmetic.navi_npc_outer_blue); + CVar_SetS32("gNavi_NPC_Outer_Red", Game::Settings.cosmetic.navi_npc_outer_red); + CVar_SetS32("gNavi_NPC_Outer_Green", Game::Settings.cosmetic.navi_npc_outer_green); + CVar_SetS32("gNavi_NPC_Outer_Blue", Game::Settings.cosmetic.navi_npc_outer_blue); needs_save = true; } @@ -659,9 +683,9 @@ namespace SohImGui { Game::Settings.cosmetic.navi_enemy_inner_red = (int)(navi_enemy_i_col[0] * 255); Game::Settings.cosmetic.navi_enemy_inner_green = (int)(navi_enemy_i_col[1] * 255); Game::Settings.cosmetic.navi_enemy_inner_blue = (int)(navi_enemy_i_col[2] * 255); - CVar_SetS32(const_cast("gNavi_Enemy_Inner_Red"), Game::Settings.cosmetic.navi_enemy_inner_red); - CVar_SetS32(const_cast("gNavi_Enemy_Inner_Green"), Game::Settings.cosmetic.navi_enemy_inner_green); - CVar_SetS32(const_cast("gNavi_Enemy_Inner_Blue"), Game::Settings.cosmetic.navi_enemy_inner_blue); + CVar_SetS32("gNavi_Enemy_Inner_Red", Game::Settings.cosmetic.navi_enemy_inner_red); + CVar_SetS32("gNavi_Enemy_Inner_Green", Game::Settings.cosmetic.navi_enemy_inner_green); + CVar_SetS32("gNavi_Enemy_Inner_Blue", Game::Settings.cosmetic.navi_enemy_inner_blue); needs_save = true; } @@ -669,9 +693,9 @@ namespace SohImGui { Game::Settings.cosmetic.navi_enemy_outer_red = (int)(navi_enemy_o_col[0] * 255); Game::Settings.cosmetic.navi_enemy_outer_green = (int)(navi_enemy_o_col[1] * 255); Game::Settings.cosmetic.navi_enemy_outer_blue = (int)(navi_enemy_o_col[2] * 255); - CVar_SetS32(const_cast("gNavi_Enemy_Outer_Red"), Game::Settings.cosmetic.navi_enemy_outer_red); - CVar_SetS32(const_cast("gNavi_Enemy_Outer_Green"), Game::Settings.cosmetic.navi_enemy_outer_green); - CVar_SetS32(const_cast("gNavi_Enemy_Outer_Blue"), Game::Settings.cosmetic.navi_enemy_outer_blue); + CVar_SetS32("gNavi_Enemy_Outer_Red", Game::Settings.cosmetic.navi_enemy_outer_red); + CVar_SetS32("gNavi_Enemy_Outer_Green", Game::Settings.cosmetic.navi_enemy_outer_green); + CVar_SetS32("gNavi_Enemy_Outer_Blue", Game::Settings.cosmetic.navi_enemy_outer_blue); needs_save = true; } @@ -679,9 +703,9 @@ namespace SohImGui { Game::Settings.cosmetic.navi_prop_inner_red = (int)(navi_prop_i_col[0] * 255); Game::Settings.cosmetic.navi_prop_inner_green = (int)(navi_prop_i_col[1] * 255); Game::Settings.cosmetic.navi_prop_inner_blue = (int)(navi_prop_i_col[2] * 255); - CVar_SetS32(const_cast("gNavi_Prop_Inner_Red"), Game::Settings.cosmetic.navi_prop_inner_red); - CVar_SetS32(const_cast("gNavi_Prop_Inner_Green"), Game::Settings.cosmetic.navi_prop_inner_green); - CVar_SetS32(const_cast("gNavi_Prop_Inner_Blue"), Game::Settings.cosmetic.navi_prop_inner_blue); + CVar_SetS32("gNavi_Prop_Inner_Red", Game::Settings.cosmetic.navi_prop_inner_red); + CVar_SetS32("gNavi_Prop_Inner_Green", Game::Settings.cosmetic.navi_prop_inner_green); + CVar_SetS32("gNavi_Prop_Inner_Blue", Game::Settings.cosmetic.navi_prop_inner_blue); needs_save = true; } @@ -689,9 +713,9 @@ namespace SohImGui { Game::Settings.cosmetic.navi_prop_outer_red = (int)(navi_prop_o_col[0] * 255); Game::Settings.cosmetic.navi_prop_outer_green = (int)(navi_prop_o_col[1] * 255); Game::Settings.cosmetic.navi_prop_outer_blue = (int)(navi_prop_o_col[2] * 255); - CVar_SetS32(const_cast("gNavi_Prop_Outer_Red"), Game::Settings.cosmetic.navi_prop_outer_red); - CVar_SetS32(const_cast("gNavi_Prop_Outer_Green"), Game::Settings.cosmetic.navi_prop_outer_green); - CVar_SetS32(const_cast("gNavi_Prop_Outer_Blue"), Game::Settings.cosmetic.navi_prop_outer_blue); + CVar_SetS32("gNavi_Prop_Outer_Red", Game::Settings.cosmetic.navi_prop_outer_red); + CVar_SetS32("gNavi_Prop_Outer_Green", Game::Settings.cosmetic.navi_prop_outer_green); + CVar_SetS32("gNavi_Prop_Outer_Blue", Game::Settings.cosmetic.navi_prop_outer_blue); needs_save = true; } diff --git a/soh/soh/Enhancements/bootcommands.c b/soh/soh/Enhancements/bootcommands.c index 60143e295..da4276f77 100644 --- a/soh/soh/Enhancements/bootcommands.c +++ b/soh/soh/Enhancements/bootcommands.c @@ -25,6 +25,7 @@ void BootCommands_Init() CVar_RegisterS32("gDebugEnabled", 0); CVar_RegisterS32("gPauseLiveLink", 0); CVar_RegisterS32("gMinimalUI", 0); + CVar_RegisterS32("gRumbleEnabled", 0); CVar_RegisterS32("gUniformLR", 1); CVar_RegisterS32("gNewDrops", 0); CVar_RegisterS32("gVisualAgony", 0); diff --git a/soh/soh/Enhancements/debugconsole.cpp b/soh/soh/Enhancements/debugconsole.cpp index 06126281f..de8cab260 100644 --- a/soh/soh/Enhancements/debugconsole.cpp +++ b/soh/soh/Enhancements/debugconsole.cpp @@ -337,11 +337,11 @@ static bool SetCVarHandler(const std::vector& args) { int vType = CheckVarType(args[2]); if (vType == VARTYPE_STRING) - CVar_SetString((char*)args[1].c_str(), (char*)args[2].c_str()); + CVar_SetString(args[1].c_str(), (char*)args[2].c_str()); else if (vType == VARTYPE_FLOAT) - CVar_SetFloat((char*)args[1].c_str(), std::stof(args[2])); + CVar_SetFloat(args[1].c_str(), std::stof(args[2])); else - CVar_SetS32((char*)args[1].c_str(), std::stoi(args[2])); + CVar_SetS32(args[1].c_str(), std::stoi(args[2])); DebugConsole_SaveCVars(); @@ -354,7 +354,7 @@ static bool GetCVarHandler(const std::vector& args) { if (args.size() < 2) return CMD_FAILED; - CVar* cvar = CVar_GetVar((char*) args[1].c_str()); + CVar* cvar = CVar_GetVar(args[1].c_str()); if (cvar != nullptr) { @@ -446,4 +446,4 @@ void DebugConsole_SaveCVars() } File::WriteAllText("cvars.cfg", output); -} \ No newline at end of file +} diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index fca6d6b7d..f125437ab 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -3,6 +3,7 @@ #include #include #include "GlobalCtx2.h" +#include "GameSettings.h" #include "ResourceMgr.h" #include "DisplayList.h" #include "PlayerAnimation.h" @@ -885,3 +886,13 @@ extern "C" void AudioPlayer_Play(const uint8_t* buf, uint32_t len) { OTRGlobals::Instance->context->GetWindow()->GetAudioPlayer()->Play(buf, len); } } + +extern "C" int Controller_ShouldRumble(size_t i) { + for (const auto& controller : Ship::Window::Controllers.at(i)) { + if (controller->CanRumble() && Game::Settings.controller.extra[i].rumble_strength > 0.001f) { + return 1; + } + } + + return 0; +} diff --git a/soh/soh/OTRGlobals.h b/soh/soh/OTRGlobals.h index 20080fcb1..dfb235712 100644 --- a/soh/soh/OTRGlobals.h +++ b/soh/soh/OTRGlobals.h @@ -64,4 +64,5 @@ int AudioPlayer_Buffered(void); int AudioPlayer_GetDesiredBuffered(void); void AudioPlayer_Play(const uint8_t* buf, uint32_t len); void AudioMgr_CreateNextAudioBuffer(s16* samples, u32 num_samples); +int Controller_ShouldRumble(size_t i); #endif diff --git a/soh/soh/stubs.c b/soh/soh/stubs.c index 871d5ca22..c47c1fa5d 100644 --- a/soh/soh/stubs.c +++ b/soh/soh/stubs.c @@ -102,7 +102,7 @@ void osCreateViManager(OSPri pri) s32 osMotorInit(OSMesgQueue* ctrlrqueue, OSPfs* pfs, s32 channel) { - + return 0; } u32 osAiGetLength(void) @@ -2099,4 +2099,4 @@ u8 gSequenceFontTable[0x1C0] = { 0x01, 0x12, 0x01, 0x24, 0x01, 0x18, 0x01, 0x19, 0x01, 0x13, 0x01, 0x20, 0x01, 0x1B, 0x01, 0x1C, 0x01, 0x1D, 0x01, 0x03, 0x01, 0x1F, 0x01, 0x20, 0x01, 0x20, 0x01, 0x09, 0x01, 0x21, 0x01, 0x22, 0x01, 0x21, 0x01, 0x09, 0x01, 0x20, 0x01, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; \ No newline at end of file +}; diff --git a/soh/src/code/padmgr.c b/soh/src/code/padmgr.c index 973c2b446..08c89869f 100644 --- a/soh/src/code/padmgr.c +++ b/soh/src/code/padmgr.c @@ -269,7 +269,7 @@ void PadMgr_ProcessInputs(PadMgr* padMgr) { input->press.stick_y += (s8)(input->cur.stick_y - input->prev.stick_y); } - controllerCallback.rumble = padMgr->rumbleEnable[0] > 0 ? 1 : 0; + controllerCallback.rumble = CVar_GetS32("gRumbleEnabled", 0) && (padMgr->rumbleEnable[0] > 0); if (HealthMeter_IsCritical()) { controllerCallback.ledColor = 0; @@ -303,6 +303,11 @@ void PadMgr_HandleRetraceMsg(PadMgr* padMgr) { } osRecvMesg(queue, NULL, OS_MESG_BLOCK); osContGetReadData(padMgr->pads); + + for (i = 0; i < __osMaxControllers; i++) { + padMgr->padStatus[i].status = CVar_GetS32("gRumbleEnabled", 0) && Controller_ShouldRumble(i); + } + if (padMgr->preNMIShutdown) { memset(padMgr->pads, 0, sizeof(padMgr->pads)); } From 02930be9ee876d998c5ca7a09c934ef69a8b8083 Mon Sep 17 00:00:00 2001 From: Zion <62904587+ZionHelios@users.noreply.github.com> Date: Wed, 27 Apr 2022 21:16:26 -0400 Subject: [PATCH 81/83] Update SohImGuiImpl.cpp Added back EndMenu into the Cheats section. Preventing the dropdown from expanding across the screen. Co-Authored-By: IShallRiseAgain <49771132+IShallRiseAgain@users.noreply.github.com> --- libultraship/libultraship/SohImGuiImpl.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libultraship/libultraship/SohImGuiImpl.cpp b/libultraship/libultraship/SohImGuiImpl.cpp index 5111a0d6d..3ac73ef82 100644 --- a/libultraship/libultraship/SohImGuiImpl.cpp +++ b/libultraship/libultraship/SohImGuiImpl.cpp @@ -605,6 +605,7 @@ namespace SohImGui { CVar_SetS32("gSuperTunic", Game::Settings.cheats.super_tunic); needs_save = true; } + ImGui::EndMenu(); } if (ImGui::BeginMenu("Cosmetics")) { From 60cbfd67beacf2b2f38947ff350cfb80aca9b32d Mon Sep 17 00:00:00 2001 From: KiritoDev <36680385+KiritoDv@users.noreply.github.com> Date: Wed, 27 Apr 2022 22:14:38 -0500 Subject: [PATCH 82/83] Fixed master volume slider --- libultraship/libultraship/SohImGuiImpl.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libultraship/libultraship/SohImGuiImpl.cpp b/libultraship/libultraship/SohImGuiImpl.cpp index 3ac73ef82..83ff7ef0e 100644 --- a/libultraship/libultraship/SohImGuiImpl.cpp +++ b/libultraship/libultraship/SohImGuiImpl.cpp @@ -391,8 +391,8 @@ namespace SohImGui { if (ImGui::BeginMenu("Audio")) { const float volume = Game::Settings.audio.master; ImGui::Text("Master Volume: %d %%", static_cast(100 * volume)); - if (ImGui::SliderFloat("##Master_Vol", &Game::Settings.audio.master, 0.0f, 1.0f, "")) { - CVar_SetFloat("gGameMasterVolume", volume); + if (ImGui::SliderFloat("##Master_Vol", &Game::Settings.audio.master, 0.0f, 1.0f, "", ImGuiSliderFlags_AlwaysClamp)) { + CVar_SetFloat("gGameMasterVolume", Game::Settings.audio.master); needs_save = true; } From 73194eee14a5b107ccc43c686404f953e008debc Mon Sep 17 00:00:00 2001 From: KiritoDev <36680385+KiritoDv@users.noreply.github.com> Date: Wed, 27 Apr 2022 22:27:54 -0500 Subject: [PATCH 83/83] Removed DirtyDirectory on kaleido --- .../overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c index ac1864412..8732093ca 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c @@ -1619,9 +1619,9 @@ void KaleidoScope_DrawInfoPanel(GlobalContext* globalCtx) { gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 180, 210, 255, 255); } } - + gSPDisplayList(POLY_KAL_DISP++, gLButtonIconDL); - + if (CVar_GetS32("gUniformLR", 0) == 0) { //Restore the misplace gDPSetPrimColor gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 180, 210, 255, 255); } @@ -3990,8 +3990,6 @@ void KaleidoScope_Update(GlobalContext* globalCtx) R_UPDATE_RATE = 3; R_PAUSE_MENU_MODE = 0; - ResourceMgr_DirtyDirectory("textures/icon_item_24_static*"); - ResourceMgr_DirtyDirectory("textures/icon_item_static*"); CVar_SetS32("gPauseTriforce", 0); func_800981B8(&globalCtx->objectCtx);