From 02c50cd0c47d3badcd0a090a342c4788bc8937d9 Mon Sep 17 00:00:00 2001 From: aMannus Date: Thu, 28 Jul 2022 23:21:10 +0200 Subject: [PATCH 01/42] Fix all VS filters for rando files --- soh/soh.vcxproj.filters | 202 ++++++++++++++++++++++------------------ 1 file changed, 110 insertions(+), 92 deletions(-) diff --git a/soh/soh.vcxproj.filters b/soh/soh.vcxproj.filters index 5f48ff0425..e165f6eb8d 100644 --- a/soh/soh.vcxproj.filters +++ b/soh/soh.vcxproj.filters @@ -82,6 +82,24 @@ {04fc1c52-49ff-48e2-ae23-2c00867374f8} + + {fd63976d-64b1-45ee-b3ab-530c636391c3} + + + {ff94f63c-a792-49af-869b-42557318a32b} + + + {1ba82a8d-b7d9-4f79-b80b-389322e189bc} + + + {9e20d69b-6a26-48ef-9aae-09c149b2c459} + + + {d7b4c12f-3876-40ec-a8ec-db435513156c} + + + {38ae4e39-fade-4f81-bfdb-af83bf641df0} + @@ -2206,172 +2224,172 @@ Header Files\include - Source Files + Source Files\soh\Enhancements\randomizer\3drando\hint_list - Source Files + Source Files\soh\Enhancements\randomizer\3drando\hint_list - Source Files + Source Files\soh\Enhancements\randomizer\3drando\hint_list - Source Files + Source Files\soh\Enhancements\randomizer\3drando\location_access - Source Files + Source Files\soh\Enhancements\randomizer\3drando\location_access - Source Files + Source Files\soh\Enhancements\randomizer\3drando\location_access - Source Files + Source Files\soh\Enhancements\randomizer\3drando\location_access - Source Files + Source Files\soh\Enhancements\randomizer\3drando\location_access - Source Files + Source Files\soh\Enhancements\randomizer\3drando\location_access - Source Files + Source Files\soh\Enhancements\randomizer\3drando\location_access - Source Files + Source Files\soh\Enhancements\randomizer\3drando\location_access - Source Files + Source Files\soh\Enhancements\randomizer\3drando\location_access - Source Files + Source Files\soh\Enhancements\randomizer\3drando\location_access - Source Files + Source Files\soh\Enhancements\randomizer\3drando\location_access - Source Files + Source Files\soh\Enhancements\randomizer\3drando\location_access - Source Files + Source Files\soh\Enhancements\randomizer\3drando\location_access - Source Files + Source Files\soh\Enhancements\randomizer\3drando\location_access - Source Files + Source Files\soh\Enhancements\randomizer\3drando\location_access - Source Files + Source Files\soh\Enhancements\randomizer\3drando\location_access - Source Files + Source Files\soh\Enhancements\randomizer\3drando\location_access - Source Files + Source Files\soh\Enhancements\randomizer\3drando\location_access - Source Files + Source Files\soh\Enhancements\randomizer\3drando\location_access - Source Files + Source Files\soh\Enhancements\randomizer\3drando - Source Files + Source Files\soh\Enhancements\randomizer\3drando - Source Files + Source Files\soh\Enhancements\randomizer\3drando - Source Files + Source Files\soh\Enhancements\randomizer\3drando - Source Files + Source Files\soh\Enhancements\randomizer\3drando - Source Files + Source Files\soh\Enhancements\randomizer\3drando - Source Files + Source Files\soh\Enhancements\randomizer\3drando - Source Files + Source Files\soh\Enhancements\randomizer\3drando - Source Files + Source Files\soh\Enhancements\randomizer\3drando - Source Files + Source Files\soh\Enhancements\randomizer\3drando - Source Files + Source Files\soh\Enhancements\randomizer\3drando - Source Files + Source Files\soh\Enhancements\randomizer\3drando - Source Files + Source Files\soh\Enhancements\randomizer\3drando - Source Files + Source Files\soh\Enhancements\randomizer\3drando - Source Files + Source Files\soh\Enhancements\randomizer\3drando - Source Files + Source Files\soh\Enhancements\randomizer\3drando - Source Files + Source Files\soh\Enhancements\randomizer\3drando - Source Files + Source Files\soh\Enhancements\randomizer\3drando - Source Files + Source Files\soh\Enhancements\randomizer\3drando - Source Files + Source Files\soh\Enhancements\randomizer\3drando - Source Files + Source Files\soh\Enhancements\randomizer\3drando - Source Files + Source Files\soh\Enhancements\randomizer\3drando - Source Files + Source Files\soh\Enhancements\randomizer\3drando - Source Files + Source Files\soh\Enhancements\randomizer\3drando - Source Files + Source Files\soh\Enhancements\randomizer\3drando - Source Files + Source Files\soh\Enhancements\randomizer\3drando - Source Files + Source Files\soh\Enhancements\randomizer\3drando - Source Files + Source Files\soh\Enhancements\randomizer\3drando - Source Files + Source Files\soh\Enhancements\randomizer\3drando - Source Files + Source Files\soh\Enhancements\randomizer\3drando - Source Files + Source Files\soh\Enhancements\randomizer - Header Files + Header Files\soh\Enhancements\randomizer Header Files\soh\Enhancements - Source Files\src + Source Files\soh\Enhancements\randomizer @@ -3948,118 +3966,118 @@ Header Files\include - Header Files + Header Files\soh\Enhancements\randomizer\3drando - Header Files + Header Files\soh\Enhancements\randomizer\3drando - Header Files + Header Files\soh\Enhancements\randomizer\3drando - Header Files + Header Files\soh\Enhancements\randomizer\3drando - Header Files + Header Files\soh\Enhancements\randomizer\3drando - Header Files + Header Files\soh\Enhancements\randomizer\3drando - Header Files + Header Files\soh\Enhancements\randomizer\3drando - Header Files + Header Files\soh\Enhancements\randomizer\3drando - Header Files + Header Files\soh\Enhancements\randomizer\3drando - Header Files + Header Files\soh\Enhancements\randomizer\3drando - Header Files + Header Files\soh\Enhancements\randomizer\3drando - Header Files + Header Files\soh\Enhancements\randomizer\3drando - Header Files + Header Files\soh\Enhancements\randomizer\3drando - Header Files + Header Files\soh\Enhancements\randomizer\3drando - Header Files + Header Files\soh\Enhancements\randomizer\3drando - Header Files + Header Files\soh\Enhancements\randomizer\3drando - Header Files + Header Files\soh\Enhancements\randomizer\3drando - Header Files + Header Files\soh\Enhancements\randomizer\3drando - Header Files + Header Files\soh\Enhancements\randomizer\3drando - Header Files + Header Files\soh\Enhancements\randomizer\3drando - Header Files + Header Files\soh\Enhancements\randomizer\3drando - Header Files + Header Files\soh\Enhancements\randomizer\3drando - Header Files + Header Files\soh\Enhancements\randomizer\3drando - Header Files + Header Files\soh\Enhancements\randomizer\3drando - Header Files + Header Files\soh\Enhancements\randomizer\3drando - Header Files + Header Files\soh\Enhancements\randomizer\3drando - Header Files + Header Files\soh\Enhancements\randomizer\3drando - Header Files + Header Files\soh\Enhancements\randomizer\3drando - Header Files + Header Files\soh\Enhancements\randomizer\3drando - Header Files + Header Files\soh\Enhancements\randomizer\3drando - Header Files + Header Files\soh\Enhancements\randomizer\3drando - Header Files + Header Files\soh\Enhancements\randomizer\3drando - Header Files + Header Files\soh\Enhancements\randomizer\3drando - Header Files + Header Files\soh\Enhancements\randomizer\3drando - Header Files + Header Files\soh\Enhancements\randomizer\3drando - Header Files + Header Files\soh\Enhancements\randomizer Header Files\soh\Enhancements - Source Files\src + Header Files\soh\Enhancements\randomizer From 361a986b8e2ba7e03ac6fc995fed6b33033c87f1 Mon Sep 17 00:00:00 2001 From: vaguerant Date: Mon, 1 Aug 2022 11:37:47 +1000 Subject: [PATCH 02/42] Add bottle swipes to Fast Drops; rename to Skip Pickup Messages (#847) * Add bottle-swipes to Fast Drops; rename to Fast Pickups * More freecam friendly * Resolve freecam interaction * Rename to "Skip Pickup Messages" --- libultraship/libultraship/ImGuiImpl.cpp | 4 ++-- soh/src/overlays/actors/ovl_player_actor/z_player.c | 13 +++++++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index da3469301c..9c7318b89d 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -995,8 +995,8 @@ namespace SohImGui { Tooltip("Wearing the Bunny Hood grants a speed\nincrease like in Majora's Mask"); EnhancementCheckbox("Fast Chests", "gFastChests"); Tooltip("Kick open every chest"); - EnhancementCheckbox("Fast Drops", "gFastDrops"); - Tooltip("Skip first-time pickup messages for consumable items"); + EnhancementCheckbox("Skip Pickup Messages", "gFastDrops"); + Tooltip("Skip pickup messages for new consumable items and bottle swipes"); EnhancementCheckbox("Better Owl", "gBetterOwl"); Tooltip("The default response to Kaepora Gaebora is\nalways that you understood what he said"); EnhancementCheckbox("Fast Ocarina Playback", "gFastOcarinaPlayback"); 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 411647644c..306a460d33 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -13129,7 +13129,10 @@ void func_8084ECA4(Player* this, GlobalContext* globalCtx) { if (LinkAnimation_Update(globalCtx, &this->skelAnime)) { if (this->unk_84F != 0) { if (this->unk_850 == 0) { - Message_StartTextbox(globalCtx, D_80854A04[this->unk_84F - 1].textId, &this->actor); + if (CVar_GetS32("gFastDrops", 0)) + { this->unk_84F = 0; } + else + { Message_StartTextbox(globalCtx, D_80854A04[this->unk_84F - 1].textId, &this->actor); } Audio_PlayFanfare(NA_BGM_ITEM_GET | 0x900); this->unk_850 = 1; } @@ -13165,11 +13168,13 @@ void func_8084ECA4(Player* this, GlobalContext* globalCtx) { if (i < 4) { this->unk_84F = i + 1; this->unk_850 = 0; - this->stateFlags1 |= PLAYER_STATE1_28 | PLAYER_STATE1_29; this->interactRangeActor->parent = &this->actor; Player_UpdateBottleHeld(globalCtx, this, catchInfo->itemId, ABS(catchInfo->actionParam)); - func_808322D0(globalCtx, this, sp24->unk_04); - func_80835EA4(globalCtx, 4); + if (!CVar_GetS32("gFastDrops", 0)) { + this->stateFlags1 |= PLAYER_STATE1_28 | PLAYER_STATE1_29; + func_808322D0(globalCtx, this, sp24->unk_04); + func_80835EA4(globalCtx, 4); + } } } } From 7dd6f59b8b3dd7c92cde95d1aa92f49c09664c6e Mon Sep 17 00:00:00 2001 From: PurpleHato Date: Mon, 1 Aug 2022 03:38:40 +0200 Subject: [PATCH 03/42] TWEAK: added 360hz support (#896) * FIX: Increased the maximum actor limit for draw distance Fix issue #529 * TWEAK: added 360hz support Has been asked by an user who have a fancy 360hz laptop refresh rate https://www.androidauthority.com/asus-rog-ces-2021-1191928/ * TWEAK: Forgot one value --- libultraship/libultraship/ImGuiImpl.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index 9c7318b89d..c3b3f6432b 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -900,7 +900,7 @@ namespace SohImGui { { const char* cvar = "gExtraLatencyThreshold"; int val = CVar_GetS32(cvar, 80); - val = MAX(MIN(val, 250), 0); + val = MAX(MIN(val, 360), 0); int fps = val; if (fps == 0) @@ -922,7 +922,7 @@ namespace SohImGui { ImGui::SameLine(); ImGui::SetCursorPosX(ImGui::GetCursorPosX() - 7.0f); - if (ImGui::SliderInt("##ExtraLatencyThreshold", &val, 0, 250, "", ImGuiSliderFlags_AlwaysClamp)) + if (ImGui::SliderInt("##ExtraLatencyThreshold", &val, 0, 360, "", ImGuiSliderFlags_AlwaysClamp)) { CVar_SetS32(cvar, val); needs_save = true; @@ -1268,7 +1268,7 @@ namespace SohImGui { int maxFps = 60; #else int minFps = 20; - int maxFps = 250; + int maxFps = 360; #endif int val = CVar_GetS32(fps_cvar, minFps); @@ -1296,9 +1296,9 @@ namespace SohImGui { if (ImGui::SliderInt("##FPSInterpolation", &val, minFps, maxFps, "", ImGuiSliderFlags_AlwaysClamp)) { - if (val > 250) + if (val > 360) { - val = 250; + val = 360; } else if (val < 20) { @@ -1329,7 +1329,7 @@ namespace SohImGui { if (ImGui::Button("Match Refresh Rate")) { int hz = roundf(gfx_get_detected_hz()); - if (hz >= 20 && hz <= 250) + if (hz >= 20 && hz <= 360) { CVar_SetS32(fps_cvar, hz); needs_save = true; From 99ecccfaab796c093bfd2778e01fc02d170ef23b Mon Sep 17 00:00:00 2001 From: GaryOderNichts <12049776+GaryOderNichts@users.noreply.github.com> Date: Mon, 1 Aug 2022 03:39:24 +0200 Subject: [PATCH 04/42] Save scarecrow songs as OcarinaNotes (#918) --- soh/include/z64save.h | 5 +- soh/soh/SaveManager.cpp | 211 +++++++++++++++++++++++++++++++++++++--- soh/soh/SaveManager.h | 1 + 3 files changed, 202 insertions(+), 15 deletions(-) diff --git a/soh/include/z64save.h b/soh/include/z64save.h index e58d7a9250..114de9fd47 100644 --- a/soh/include/z64save.h +++ b/soh/include/z64save.h @@ -3,6 +3,7 @@ #include "ultra64.h" #include "z64math.h" +#include "z64audio.h" #include "soh/Enhancements/randomizer/randomizerTypes.h" typedef struct { @@ -114,9 +115,9 @@ typedef struct { /* 0x0EF8 */ u16 infTable[30]; // "inf_table" /* 0x0F38 */ u32 worldMapAreaData; // "area_arrival" /* 0x0F40 */ u8 scarecrowCustomSongSet; - /* 0x0F41 */ u8 scarecrowCustomSong[0x360]; + /* 0x0F41 */ OcarinaNote scarecrowCustomSong[108]; /* 0x12C5 */ u8 scarecrowSpawnSongSet; - /* 0x12C6 */ u8 scarecrowSpawnSong[0x80]; + /* 0x12C6 */ OcarinaNote scarecrowSpawnSong[16]; /* 0x1346 */ char unk_1346[0x02]; /* 0x1348 */ HorseData horseData; /* 0x1354 */ s32 fileNum; // "file_no" diff --git a/soh/soh/SaveManager.cpp b/soh/soh/SaveManager.cpp index e0de89d099..4fe0b1cfde 100644 --- a/soh/soh/SaveManager.cpp +++ b/soh/soh/SaveManager.cpp @@ -22,7 +22,8 @@ std::filesystem::path SaveManager::GetFileName(int fileNum) { SaveManager::SaveManager() { AddLoadFunction("base", 1, LoadBaseVersion1); - AddSaveFunction("base", 1, SaveBase); + AddLoadFunction("base", 2, LoadBaseVersion2); + AddSaveFunction("base", 2, SaveBase); AddLoadFunction("randomizer", 1, LoadRandomizerVersion1); AddSaveFunction("randomizer", 1, SaveRandomizer); @@ -319,11 +320,23 @@ void SaveManager::InitFileNormal() { gSaveContext.worldMapAreaData = 0; gSaveContext.scarecrowCustomSongSet = 0; for (int i = 0; i < ARRAY_COUNT(gSaveContext.scarecrowCustomSong); i++) { - gSaveContext.scarecrowCustomSong[i] = 0; + gSaveContext.scarecrowCustomSong[i].noteIdx = 0; + gSaveContext.scarecrowCustomSong[i].unk_01 = 0; + gSaveContext.scarecrowCustomSong[i].unk_02 = 0; + gSaveContext.scarecrowCustomSong[i].volume = 0; + gSaveContext.scarecrowCustomSong[i].vibrato = 0; + gSaveContext.scarecrowCustomSong[i].tone = 0; + gSaveContext.scarecrowCustomSong[i].semitone = 0; } gSaveContext.scarecrowSpawnSongSet = 0; for (int i = 0; i < ARRAY_COUNT(gSaveContext.scarecrowSpawnSong); i++) { - gSaveContext.scarecrowSpawnSong[i] = 0; + gSaveContext.scarecrowSpawnSong[i].noteIdx = 0; + gSaveContext.scarecrowSpawnSong[i].unk_01 = 0; + gSaveContext.scarecrowSpawnSong[i].unk_02 = 0; + gSaveContext.scarecrowSpawnSong[i].volume = 0; + gSaveContext.scarecrowSpawnSong[i].vibrato = 0; + gSaveContext.scarecrowSpawnSong[i].tone = 0; + gSaveContext.scarecrowSpawnSong[i].semitone = 0; } gSaveContext.horseData.scene = SCENE_SPOT00; @@ -700,12 +713,172 @@ void SaveManager::LoadBaseVersion1() { }); SaveManager::Instance->LoadData("worldMapAreaData", gSaveContext.worldMapAreaData); SaveManager::Instance->LoadData("scarecrowCustomSongSet", gSaveContext.scarecrowCustomSongSet); + SaveManager::Instance->LoadArray("scarecrowCustomSong", sizeof(gSaveContext.scarecrowCustomSong), [](size_t i) { + SaveManager::Instance->LoadData("", ((u8*)&gSaveContext.scarecrowCustomSong)[i]); + }); + SaveManager::Instance->LoadData("scarecrowSpawnSongSet", gSaveContext.scarecrowSpawnSongSet); + SaveManager::Instance->LoadArray("scarecrowSpawnSong", sizeof(gSaveContext.scarecrowSpawnSong), [](size_t i) { + SaveManager::Instance->LoadData("", ((u8*)&gSaveContext.scarecrowSpawnSong)[i]); + }); + SaveManager::Instance->LoadStruct("horseData", []() { + SaveManager::Instance->LoadData("scene", gSaveContext.horseData.scene); + SaveManager::Instance->LoadStruct("pos", []() { + SaveManager::Instance->LoadData("x", gSaveContext.horseData.pos.x); + SaveManager::Instance->LoadData("y", gSaveContext.horseData.pos.y); + SaveManager::Instance->LoadData("z", gSaveContext.horseData.pos.z); + }); + SaveManager::Instance->LoadData("angle", gSaveContext.horseData.angle); + }); + + SaveManager::Instance->LoadArray("dungeonsDone", ARRAY_COUNT(gSaveContext.dungeonsDone), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.dungeonsDone[i]); + }); + + SaveManager::Instance->LoadArray("trialsDone", ARRAY_COUNT(gSaveContext.trialsDone), + [](size_t i) { SaveManager::Instance->LoadData("", gSaveContext.trialsDone[i]); }); +} + +void SaveManager::LoadBaseVersion2() { + SaveManager::Instance->LoadData("entranceIndex", gSaveContext.entranceIndex); + SaveManager::Instance->LoadData("linkAge", gSaveContext.linkAge); + SaveManager::Instance->LoadData("cutsceneIndex", gSaveContext.cutsceneIndex); + SaveManager::Instance->LoadData("dayTime", gSaveContext.dayTime); + SaveManager::Instance->LoadData("nightFlag", gSaveContext.nightFlag); + SaveManager::Instance->LoadData("totalDays", gSaveContext.totalDays); + SaveManager::Instance->LoadData("bgsDayCount", gSaveContext.bgsDayCount); + SaveManager::Instance->LoadData("deaths", gSaveContext.deaths); + SaveManager::Instance->LoadArray("playerName", ARRAY_COUNT(gSaveContext.playerName), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.playerName[i]); + }); + SaveManager::Instance->LoadData("n64ddFlag", gSaveContext.n64ddFlag); + SaveManager::Instance->LoadData("healthCapacity", gSaveContext.healthCapacity); + SaveManager::Instance->LoadData("health", gSaveContext.health); + SaveManager::Instance->LoadData("magicLevel", gSaveContext.magicLevel); + SaveManager::Instance->LoadData("magic", gSaveContext.magic); + SaveManager::Instance->LoadData("rupees", gSaveContext.rupees); + SaveManager::Instance->LoadData("swordHealth", gSaveContext.swordHealth); + SaveManager::Instance->LoadData("naviTimer", gSaveContext.naviTimer); + SaveManager::Instance->LoadData("magicAcquired", gSaveContext.magicAcquired); + SaveManager::Instance->LoadData("doubleMagic", gSaveContext.doubleMagic); + SaveManager::Instance->LoadData("doubleDefense", gSaveContext.doubleDefense); + SaveManager::Instance->LoadData("bgsFlag", gSaveContext.bgsFlag); + SaveManager::Instance->LoadData("ocarinaGameRoundNum", gSaveContext.ocarinaGameRoundNum); + SaveManager::Instance->LoadStruct("childEquips", []() { + SaveManager::Instance->LoadArray("buttonItems", ARRAY_COUNT(gSaveContext.childEquips.buttonItems), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.childEquips.buttonItems[i], + static_cast(ITEM_NONE)); + }); + SaveManager::Instance->LoadArray("cButtonSlots", ARRAY_COUNT(gSaveContext.childEquips.cButtonSlots), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.childEquips.cButtonSlots[i], + static_cast(SLOT_NONE)); + }); + SaveManager::Instance->LoadData("equipment", gSaveContext.childEquips.equipment); + }); + SaveManager::Instance->LoadStruct("adultEquips", []() { + SaveManager::Instance->LoadArray("buttonItems", ARRAY_COUNT(gSaveContext.adultEquips.buttonItems), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.adultEquips.buttonItems[i], + static_cast(ITEM_NONE)); + }); + SaveManager::Instance->LoadArray("cButtonSlots", ARRAY_COUNT(gSaveContext.adultEquips.cButtonSlots), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.adultEquips.cButtonSlots[i], + static_cast(SLOT_NONE)); + }); + SaveManager::Instance->LoadData("equipment", gSaveContext.adultEquips.equipment); + }); + SaveManager::Instance->LoadData("unk_54", gSaveContext.unk_54); + SaveManager::Instance->LoadData("savedSceneNum", gSaveContext.savedSceneNum); + SaveManager::Instance->LoadStruct("equips", []() { + SaveManager::Instance->LoadArray("buttonItems", ARRAY_COUNT(gSaveContext.equips.buttonItems), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.equips.buttonItems[i], static_cast(ITEM_NONE)); + }); + SaveManager::Instance->LoadArray("cButtonSlots", ARRAY_COUNT(gSaveContext.equips.cButtonSlots), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.equips.cButtonSlots[i], static_cast(SLOT_NONE)); + }); + SaveManager::Instance->LoadData("equipment", gSaveContext.equips.equipment); + }); + SaveManager::Instance->LoadStruct("inventory", []() { + SaveManager::Instance->LoadArray("items", ARRAY_COUNT(gSaveContext.inventory.items), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.inventory.items[i]); + }); + SaveManager::Instance->LoadArray("ammo", ARRAY_COUNT(gSaveContext.inventory.ammo), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.inventory.ammo[i]); + }); + SaveManager::Instance->LoadData("equipment", gSaveContext.inventory.equipment); + SaveManager::Instance->LoadData("upgrades", gSaveContext.inventory.upgrades); + SaveManager::Instance->LoadData("questItems", gSaveContext.inventory.questItems); + SaveManager::Instance->LoadArray("dungeonItems", ARRAY_COUNT(gSaveContext.inventory.dungeonItems), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.inventory.dungeonItems[i]); + }); + SaveManager::Instance->LoadArray("dungeonKeys", ARRAY_COUNT(gSaveContext.inventory.dungeonKeys), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.inventory.dungeonKeys[i]); + }); + SaveManager::Instance->LoadData("defenseHearts", gSaveContext.inventory.defenseHearts); + SaveManager::Instance->LoadData("gsTokens", gSaveContext.inventory.gsTokens); + }); + SaveManager::Instance->LoadArray("sceneFlags", ARRAY_COUNT(gSaveContext.sceneFlags), [](size_t i) { + SaveManager::Instance->LoadStruct("", [&i]() { + SaveManager::Instance->LoadData("chest", gSaveContext.sceneFlags[i].chest); + SaveManager::Instance->LoadData("swch", gSaveContext.sceneFlags[i].swch); + SaveManager::Instance->LoadData("clear", gSaveContext.sceneFlags[i].clear); + SaveManager::Instance->LoadData("collect", gSaveContext.sceneFlags[i].collect); + SaveManager::Instance->LoadData("unk", gSaveContext.sceneFlags[i].unk); + SaveManager::Instance->LoadData("rooms", gSaveContext.sceneFlags[i].rooms); + SaveManager::Instance->LoadData("floors", gSaveContext.sceneFlags[i].floors); + }); + }); + SaveManager::Instance->LoadStruct("fw", []() { + SaveManager::Instance->LoadStruct("pos", []() { + SaveManager::Instance->LoadData("x", gSaveContext.fw.pos.x); + SaveManager::Instance->LoadData("y", gSaveContext.fw.pos.y); + SaveManager::Instance->LoadData("z", gSaveContext.fw.pos.z); + }); + SaveManager::Instance->LoadData("yaw", gSaveContext.fw.yaw); + SaveManager::Instance->LoadData("playerParams", gSaveContext.fw.playerParams); + SaveManager::Instance->LoadData("entranceIndex", gSaveContext.fw.entranceIndex); + SaveManager::Instance->LoadData("roomIndex", gSaveContext.fw.roomIndex); + SaveManager::Instance->LoadData("set", gSaveContext.fw.set); + SaveManager::Instance->LoadData("tempSwchFlags", gSaveContext.fw.tempSwchFlags); + SaveManager::Instance->LoadData("tempCollectFlags", gSaveContext.fw.tempCollectFlags); + }); + SaveManager::Instance->LoadArray("gsFlags", ARRAY_COUNT(gSaveContext.gsFlags), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.gsFlags[i]); + }); + SaveManager::Instance->LoadArray("highScores", ARRAY_COUNT(gSaveContext.highScores), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.highScores[i]); + }); + SaveManager::Instance->LoadArray("eventChkInf", ARRAY_COUNT(gSaveContext.eventChkInf), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.eventChkInf[i]); + }); + SaveManager::Instance->LoadArray("itemGetInf", ARRAY_COUNT(gSaveContext.itemGetInf), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.itemGetInf[i]); + }); + SaveManager::Instance->LoadArray("infTable", ARRAY_COUNT(gSaveContext.infTable), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.infTable[i]); + }); + SaveManager::Instance->LoadData("worldMapAreaData", gSaveContext.worldMapAreaData); + SaveManager::Instance->LoadData("scarecrowCustomSongSet", gSaveContext.scarecrowCustomSongSet); SaveManager::Instance->LoadArray("scarecrowCustomSong", ARRAY_COUNT(gSaveContext.scarecrowCustomSong), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.scarecrowCustomSong[i]); + SaveManager::Instance->LoadStruct("", [&i]() { + SaveManager::Instance->LoadData("noteIdx", gSaveContext.scarecrowCustomSong[i].noteIdx); + SaveManager::Instance->LoadData("unk_01", gSaveContext.scarecrowCustomSong[i].unk_01); + SaveManager::Instance->LoadData("unk_02", gSaveContext.scarecrowCustomSong[i].unk_02); + SaveManager::Instance->LoadData("volume", gSaveContext.scarecrowCustomSong[i].volume); + SaveManager::Instance->LoadData("vibrato", gSaveContext.scarecrowCustomSong[i].vibrato); + SaveManager::Instance->LoadData("tone", gSaveContext.scarecrowCustomSong[i].tone); + SaveManager::Instance->LoadData("semitone", gSaveContext.scarecrowCustomSong[i].semitone); + }); }); SaveManager::Instance->LoadData("scarecrowSpawnSongSet", gSaveContext.scarecrowSpawnSongSet); SaveManager::Instance->LoadArray("scarecrowSpawnSong", ARRAY_COUNT(gSaveContext.scarecrowSpawnSong), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.scarecrowSpawnSong[i]); + SaveManager::Instance->LoadStruct("", [&i]() { + SaveManager::Instance->LoadData("noteIdx", gSaveContext.scarecrowSpawnSong[i].noteIdx); + SaveManager::Instance->LoadData("unk_01", gSaveContext.scarecrowSpawnSong[i].unk_01); + SaveManager::Instance->LoadData("unk_02", gSaveContext.scarecrowSpawnSong[i].unk_02); + SaveManager::Instance->LoadData("volume", gSaveContext.scarecrowSpawnSong[i].volume); + SaveManager::Instance->LoadData("vibrato", gSaveContext.scarecrowSpawnSong[i].vibrato); + SaveManager::Instance->LoadData("tone", gSaveContext.scarecrowSpawnSong[i].tone); + SaveManager::Instance->LoadData("semitone", gSaveContext.scarecrowSpawnSong[i].semitone); + }); }); SaveManager::Instance->LoadStruct("horseData", []() { SaveManager::Instance->LoadData("scene", gSaveContext.horseData.scene); @@ -841,11 +1014,27 @@ void SaveManager::SaveBase() { SaveManager::Instance->SaveData("worldMapAreaData", gSaveContext.worldMapAreaData); SaveManager::Instance->SaveData("scarecrowCustomSongSet", gSaveContext.scarecrowCustomSongSet); SaveManager::Instance->SaveArray("scarecrowCustomSong", ARRAY_COUNT(gSaveContext.scarecrowCustomSong), [](size_t i) { - SaveManager::Instance->SaveData("", gSaveContext.scarecrowCustomSong[i]); + SaveManager::Instance->SaveStruct("", [&i]() { + SaveManager::Instance->SaveData("noteIdx", gSaveContext.scarecrowCustomSong[i].noteIdx); + SaveManager::Instance->SaveData("unk_01", gSaveContext.scarecrowCustomSong[i].unk_01); + SaveManager::Instance->SaveData("unk_02", gSaveContext.scarecrowCustomSong[i].unk_02); + SaveManager::Instance->SaveData("volume", gSaveContext.scarecrowCustomSong[i].volume); + SaveManager::Instance->SaveData("vibrato", gSaveContext.scarecrowCustomSong[i].vibrato); + SaveManager::Instance->SaveData("tone", gSaveContext.scarecrowCustomSong[i].tone); + SaveManager::Instance->SaveData("semitone", gSaveContext.scarecrowCustomSong[i].semitone); + }); }); SaveManager::Instance->SaveData("scarecrowSpawnSongSet", gSaveContext.scarecrowSpawnSongSet); SaveManager::Instance->SaveArray("scarecrowSpawnSong", ARRAY_COUNT(gSaveContext.scarecrowSpawnSong), [](size_t i) { - SaveManager::Instance->SaveData("", gSaveContext.scarecrowSpawnSong[i]); + SaveManager::Instance->SaveStruct("", [&i]() { + SaveManager::Instance->SaveData("noteIdx", gSaveContext.scarecrowSpawnSong[i].noteIdx); + SaveManager::Instance->SaveData("unk_01", gSaveContext.scarecrowSpawnSong[i].unk_01); + SaveManager::Instance->SaveData("unk_02", gSaveContext.scarecrowSpawnSong[i].unk_02); + SaveManager::Instance->SaveData("volume", gSaveContext.scarecrowSpawnSong[i].volume); + SaveManager::Instance->SaveData("vibrato", gSaveContext.scarecrowSpawnSong[i].vibrato); + SaveManager::Instance->SaveData("tone", gSaveContext.scarecrowSpawnSong[i].tone); + SaveManager::Instance->SaveData("semitone", gSaveContext.scarecrowSpawnSong[i].semitone); + }); }); SaveManager::Instance->SaveStruct("horseData", []() { SaveManager::Instance->SaveData("scene", gSaveContext.horseData.scene); @@ -1252,13 +1441,9 @@ void CopyV0Save(SaveContext_v0& src, SaveContext& dst) { } dst.worldMapAreaData = src.worldMapAreaData; dst.scarecrowCustomSongSet = src.scarecrowCustomSongSet; - for (size_t i = 0; i < ARRAY_COUNT(src.scarecrowCustomSong); i++) { - dst.scarecrowCustomSong[i] = src.scarecrowCustomSong[i]; - } + memcpy(&dst.scarecrowCustomSong[0], &src.scarecrowCustomSong[0], sizeof(src.scarecrowCustomSong)); dst.scarecrowSpawnSongSet = src.scarecrowSpawnSongSet; - for (size_t i = 0; i < ARRAY_COUNT(src.scarecrowSpawnSong); i++) { - dst.scarecrowSpawnSong[i] = src.scarecrowSpawnSong[i]; - } + memcpy(&dst.scarecrowSpawnSong[0], &src.scarecrowSpawnSong[0], sizeof(src.scarecrowSpawnSong)); dst.horseData.scene = src.horseData.scene; dst.horseData.pos.x = src.horseData.pos.x; dst.horseData.pos.y = src.horseData.pos.y; diff --git a/soh/soh/SaveManager.h b/soh/soh/SaveManager.h index ee13451fbf..06a382baa1 100644 --- a/soh/soh/SaveManager.h +++ b/soh/soh/SaveManager.h @@ -117,6 +117,7 @@ public: static void SaveRandomizer(); static void LoadBaseVersion1(); + static void LoadBaseVersion2(); static void SaveBase(); std::vector initFuncs; From 7a45380123a3328ea41140ec7459f03549f2058a Mon Sep 17 00:00:00 2001 From: Josh Bodner <30329717+jbodner09@users.noreply.github.com> Date: Sun, 31 Jul 2022 18:40:26 -0700 Subject: [PATCH 05/42] Automatically break long tooltip lines (#925) * Remove manual newlines from the middle of sentences in tooltips and automatically break long lines instead * Move split functionality into header so randomizer tooltips can use it * Rewrite logic to be O(n) * Found another typo * Move helper function to libultraship to (hopefully) get Jenkins happy * Fix typo I made when fixing the typo before * Remove unneeded header * Parameterize line length in case variable line length is desired in the future --- libultraship/libultraship/ImGuiImpl.cpp | 104 +++-- libultraship/libultraship/ImGuiImpl.h | 2 + .../Enhancements/debugger/ImGuiHelpers.cpp | 5 +- .../Enhancements/debugger/debugSaveEditor.cpp | 2 +- .../Enhancements/randomizer/randomizer.cpp | 413 +++++++++--------- .../randomizer/randomizer_item_tracker.cpp | 2 +- 6 files changed, 271 insertions(+), 257 deletions(-) diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index c3b3f6432b..ea779b677d 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -130,8 +130,9 @@ namespace SohImGui { } void Tooltip(const char* text) { - if (ImGui::IsItemHovered()) - ImGui::SetTooltip("%s", text); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("%s", BreakTooltip(text, 60).c_str()); + } } void ImGuiWMInit() { @@ -867,7 +868,7 @@ namespace SohImGui { // TODO mutual exclusions -- There should be some system to prevent conclifting enhancements from being selected EnhancementCheckbox("D-pad Support on Pause and File Select", "gDpadPauseName"); - Tooltip("Enables Pause and File Select screen navigation with the D-pad\nIf used with D-pad as Equip Items, you must hold C-Up\nto equip instead of navigate"); + Tooltip("Enables Pause and File Select screen navigation with the D-pad\nIf used with D-pad as Equip Items, you must hold C-Up to equip instead of navigate"); EnhancementCheckbox("D-pad Support in Ocarina and Text Choice", "gDpadOcarinaText"); EnhancementCheckbox("D-pad Support for Browsing Shop Items", "gDpadShop"); EnhancementCheckbox("D-pad as Equip Items", "gDpadEquips"); @@ -890,10 +891,10 @@ namespace SohImGui { if (ImGui::BeginMenu("Graphics")) { EnhancementSliderFloat("Internal Resolution: %d %%", "##IMul", "gInternalResolution", 0.5f, 2.0f, "", 1.0f, true); - Tooltip("Multiplies your output resolution by the value inputted,\nas a more intensive but effective form of anti-aliasing"); + Tooltip("Multiplies your output resolution by the value inputted, as a more intensive but effective form of anti-aliasing"); gfx_current_dimensions.internal_mul = CVar_GetFloat("gInternalResolution", 1); EnhancementSliderInt("MSAA: %d", "##IMSAA", "gMSAAValue", 1, 8, ""); - Tooltip("Activates multi-sample anti-aliasing when above 1x\nup to 8x for 8 samples for every pixel"); + Tooltip("Activates multi-sample anti-aliasing when above 1x up to 8x for 8 samples for every pixel"); gfx_msaa_level = CVar_GetS32("gMSAAValue", 1); if (impl.backend == Backend::DX11) @@ -928,12 +929,7 @@ namespace SohImGui { needs_save = true; } - Tooltip("When Interpolation FPS setting is at least this threshold,\n" - "add one frame of input lag (e.g. 16.6 ms for 60 FPS)\n" - "in order to avoid jitter.This setting allows the CPU\n" - "to work on one frame while GPU works on the previous frame.\n" - "This setting should be used when your computer is too slow\n" - "to do CPU + GPU work in time."); + Tooltip("When Interpolation FPS setting is at least this threshold, add one frame of input lag (e.g. 16.6 ms for 60 FPS) in order to avoid jitter. This setting allows the CPU to work on one frame while GPU works on the previous frame.\nThis setting should be used when your computer is too slow to do CPU + GPU work in time."); ImGui::SameLine(); ImGui::SetCursorPosX(ImGui::GetCursorPosX() - 7.0f); @@ -983,30 +979,30 @@ namespace SohImGui { EnhancementSliderInt("Text Speed: %dx", "##TEXTSPEED", "gTextSpeed", 1, 5, ""); EnhancementSliderInt("King Zora Speed: %dx", "##MWEEPSPEED", "gMweepSpeed", 1, 5, ""); EnhancementSliderInt("Biggoron Forge Time: %d days", "##FORGETIME", "gForgeTime", 0, 3, ""); - Tooltip("Allows you to change the number of days it takes for\nBiggoron to forge the Biggoron Sword"); + Tooltip("Allows you to change the number of days it takes for Biggoron to forge the Biggoron Sword"); EnhancementSliderInt("Vine/Ladder Climb speed +%d", "##CLIMBSPEED", "gClimbSpeed", 0, 12, ""); EnhancementCheckbox("Faster Block Push", "gFasterBlockPush"); EnhancementCheckbox("No Forced Navi", "gNoForcedNavi"); Tooltip("Prevent forced Navi conversations"); EnhancementCheckbox("No Skulltula Freeze", "gSkulltulaFreeze"); - Tooltip("Stops the game from freezing the player\nwhen picking up Gold Skulltulas"); + Tooltip("Stops the game from freezing the player when picking up Gold Skulltulas"); EnhancementCheckbox("MM Bunny Hood", "gMMBunnyHood"); - Tooltip("Wearing the Bunny Hood grants a speed\nincrease like in Majora's Mask"); + Tooltip("Wearing the Bunny Hood grants a speed increase like in Majora's Mask"); EnhancementCheckbox("Fast Chests", "gFastChests"); Tooltip("Kick open every chest"); EnhancementCheckbox("Skip Pickup Messages", "gFastDrops"); Tooltip("Skip pickup messages for new consumable items and bottle swipes"); EnhancementCheckbox("Better Owl", "gBetterOwl"); - Tooltip("The default response to Kaepora Gaebora is\nalways that you understood what he said"); + Tooltip("The default response to Kaepora Gaebora is always that you understood what he said"); EnhancementCheckbox("Fast Ocarina Playback", "gFastOcarinaPlayback"); - Tooltip("Skip the part where the Ocarina playback is called when you play\na song"); + Tooltip("Skip the part where the Ocarina playback is called when you play a song"); EnhancementCheckbox("Prevent Dropped Ocarina Inputs", "gDpadNoDropOcarinaInput"); Tooltip("Prevent dropping inputs when playing the ocarina quickly"); EnhancementCheckbox("Instant Putaway", "gInstantPutaway"); Tooltip("Allow Link to put items away without having to wait around"); EnhancementCheckbox("Mask Select in Inventory", "gMaskSelect"); - Tooltip("After completing the mask trading sub-quest,\npress A and any direction on the mask slot to change masks"); + Tooltip("After completing the mask trading sub-quest, press A and any direction on the mask slot to change masks"); ImGui::EndMenu(); } @@ -1137,13 +1133,13 @@ namespace SohImGui { } EnhancementCheckbox("Visual Stone of Agony", "gVisualAgony"); - Tooltip("Displays an icon and plays a sound when Stone of Agony\nshould be activated, for those without rumble"); + Tooltip("Displays an icon and plays a sound when Stone of Agony should be activated, for those without rumble"); EnhancementCheckbox("Assignable Tunics and Boots", "gAssignableTunicsAndBoots"); Tooltip("Allows equipping the tunic and boots to c-buttons"); EnhancementCheckbox("Equipment Toggle", "gEquipmentCanBeRemoved"); Tooltip("Allows equipment to be removed by toggling it off on\nthe equipment subscreen."); EnhancementCheckbox("Link's Cow in Both Time Periods", "gCowOfTime"); - Tooltip("Allows the Lon Lon Ranch obstacle course reward to be\nshared across time periods"); + Tooltip("Allows the Lon Lon Ranch obstacle course reward to be shared across time periods"); EnhancementCheckbox("Enable visible guard vision", "gGuardVision"); EnhancementCheckbox("Enable passage of time on file select", "gTimeFlowFileSelect"); EnhancementCheckbox("Allow the cursor to be on any slot", "gPauseAnyCursor"); @@ -1161,7 +1157,7 @@ namespace SohImGui { ImGui::Text("Rotation"); EnhancementRadioButton("Disabled", "gPauseLiveLinkRotation", 0); EnhancementRadioButton("Rotate Link with D-pad", "gPauseLiveLinkRotation", 1); - Tooltip("Allow you to rotate Link on the Equipment menu with the DPAD\nUse DPAD-Up or DPAD-Down to reset Link's rotation"); + Tooltip("Allow you to rotate Link on the Equipment menu with the D-pad\nUse D-pad Up or D-pad Down to reset Link's rotation"); EnhancementRadioButton("Rotate Link with C-buttons", "gPauseLiveLinkRotation", 2); Tooltip("Allow you to rotate Link on the Equipment menu with the C-buttons\nUse C-Up or C-Down to reset Link's rotation"); EnhancementRadioButton("Rotate Link with Right Stick", "gPauseLiveLinkRotation", 3); @@ -1206,7 +1202,7 @@ namespace SohImGui { EnhancementCheckbox("Enable 3D Dropped items/projectiles", "gNewDrops"); Tooltip("Change most 2D items and projectiles on the overworld to their 3D versions"); EnhancementCheckbox("Disable Black Bar Letterboxes", "gDisableBlackBars"); - Tooltip("Disables Black Bar Letterboxes during cutscenes and Z-targeting\nNote: there may be minor visual glitches that\nwere covered up by the black bars\nPlease disable this setting before reporting a bug"); + Tooltip("Disables Black Bar Letterboxes during cutscenes and Z-targeting\nNote: there may be minor visual glitches that were covered up by the black bars\nPlease disable this setting before reporting a bug"); EnhancementCheckbox("Dynamic Wallet Icon", "gDynamicWalletIcon"); Tooltip("Changes the rupee in the wallet icon to match the wallet size you currently have"); EnhancementCheckbox("Always show dungeon entrances", "gAlwaysShowDungeonMinimapIcon"); @@ -1222,19 +1218,19 @@ namespace SohImGui { EnhancementCheckbox("Fix L&Z Page switch in Pause menu", "gNGCKaleidoSwitcher"); Tooltip("Makes L and R switch pages like on the GameCube\nZ opens the Debug Menu instead"); EnhancementCheckbox("Fix Dungeon entrances", "gFixDungeonMinimapIcon"); - Tooltip("Removes the dungeon entrance icon on the top-left corner\nof the screen when no dungeon is present on the current map"); + Tooltip("Removes the dungeon entrance icon on the top-left corner of the screen when no dungeon is present on the current map"); EnhancementCheckbox("Fix Two Handed idle animations", "gTwoHandedIdle"); - Tooltip("Re-enables the two-handed idle animation, a seemingly\nfinished animation that was disabled on accident in the original game"); + Tooltip("Re-enables the two-handed idle animation, a seemingly finished animation that was disabled on accident in the original game"); EnhancementCheckbox("Fix the Gravedigging Tour Glitch", "gGravediggingTourFix"); - Tooltip("Fixes a bug where the Gravedigging Tour Heart\nPiece disappears if the area reloads"); + Tooltip("Fixes a bug where the Gravedigging Tour Heart Piece disappears if the area reloads"); EnhancementCheckbox("Fix Deku Nut upgrade", "gDekuNutUpgradeFix"); - Tooltip("Prevents the Forest Stage Deku Nut upgrade from\nbecoming unobtainable after receiving the Poacher's Saw"); + Tooltip("Prevents the Forest Stage Deku Nut upgrade from becoming unobtainable after receiving the Poacher's Saw"); EnhancementCheckbox("Fix Navi text HUD position", "gNaviTextFix"); Tooltip("Correctly centers the Navi text prompt on the HUD's C-Up button"); EnhancementCheckbox("Fix Anubis fireballs", "gAnubisFix"); - Tooltip("Make Anubis fireballs do fire damage when reflected\nback at them with the Mirror Shield"); + Tooltip("Make Anubis fireballs do fire damage when reflected back at them with the Mirror Shield"); EnhancementCheckbox("Fix Megaton Hammer crouch stab", "gCrouchStabHammerFix"); - Tooltip("Make the Megaton Hammer's crouch stab able to destroy\nrocks without first swinging it normally"); + Tooltip("Make the Megaton Hammer's crouch stab able to destroy rocks without first swinging it normally"); if (CVar_GetS32("gCrouchStabHammerFix", 0) == 0) { CVar_SetS32("gCrouchStabFix", 0); } else { @@ -1250,7 +1246,7 @@ namespace SohImGui { EnhancementCheckbox("Red Ganon blood", "gRedGanonBlood"); Tooltip("Restore the original red blood from NTSC 1.0/1.1. Disable for green blood"); EnhancementCheckbox("Fish while hovering", "gHoverFishing"); - Tooltip("Restore a bug from NTSC 1.0 that allows casting\nthe Fishing Rod while using the Hover Boots"); + Tooltip("Restore a bug from NTSC 1.0 that allows casting the Fishing Rod while using the Hover Boots"); EnhancementCheckbox("N64 Weird Frames", "gN64WeirdFrames"); Tooltip("Restores N64 Weird Frames allowing weirdshots to behave the same as N64"); EnhancementCheckbox("Bombchus out of bounds", "gBombchusOOB"); @@ -1311,7 +1307,7 @@ namespace SohImGui { Tooltip("Interpolate extra frames to get smoother graphics\n" "Set to match your monitor's refresh rate, or a divisor of it\n" - "A higher target FPS than your monitor's refresh rate will just waste resources,\n" + "A higher target FPS than your monitor's refresh rate will just waste resources, " "and might give a worse result.\n" "For consistent input lag, set this value and your monitor's refresh rate to a multiple of 20\n" "Ctrl+Click for keyboard input"); @@ -1339,7 +1335,7 @@ namespace SohImGui { EnhancementCheckbox("Disable LOD", "gDisableLOD"); Tooltip("Turns off the Level of Detail setting, making models use their higher-poly variants at any distance"); EnhancementCheckbox("Disable Draw Distance", "gDisableDrawDistance"); - Tooltip("Turns off the objects draw distance,\nmaking objects being visible from a longer range"); + Tooltip("Turns off the objects draw distance, making objects being visible from a longer range"); if (CVar_GetS32("gDisableDrawDistance", 0) == 0) { CVar_SetS32("gDisableKokiriDrawDistance", 0); } else if (CVar_GetS32("gDisableDrawDistance", 0) == 1) { @@ -1350,7 +1346,7 @@ namespace SohImGui { Tooltip("Holding down B skips text\nKnown to cause a cutscene softlock in Water Temple\nSoftlock can be fixed by pressing D-Right in Debug mode"); EnhancementCheckbox("Free Camera", "gFreeCamera"); - Tooltip("Enables camera control\nNote: You must remap C buttons off of\nthe right stick in the controller\nconfig menu, and map the camera stick\nto the right stick."); + Tooltip("Enables camera control\nNote: You must remap C buttons off of the right stick in the controller config menu, and map the camera stick to the right stick."); #ifdef __SWITCH__ int slot = CVar_GetS32("gSwitchPerfMode", (int)SwitchProfiles::STOCK); @@ -1406,7 +1402,7 @@ namespace SohImGui { EnhancementCheckbox("Fireproof Deku Shield", "gFireproofDekuShield"); Tooltip("Prevents the Deku Shield from burning on contact with fire"); EnhancementCheckbox("Shield with Two-Handed Weapons", "gShieldTwoHanded"); - Tooltip("This allows you to put up your shield with any two-handed weapon in hand\nexcept for Deku Sticks"); + Tooltip("This allows you to put up your shield with any two-handed weapon in hand except for Deku Sticks"); ImGui::EndMenu(); } @@ -1416,11 +1412,11 @@ namespace SohImGui { if (ImGui::BeginMenu("Developer Tools")) { EnhancementCheckbox("OoT Debug Mode", "gDebugEnabled"); - Tooltip("Enables Debug Mode, allowing you to select maps with L + R + Z, noclip with L + D-pad Right,\nand open the debug menu with L on the pause screen"); + Tooltip("Enables Debug Mode, allowing you to select maps with L + R + Z, noclip with L + D-pad Right, and open the debug menu with L on the pause screen"); EnhancementCheckbox("OoT Skulltula Debug", "gSkulltulaDebugEnabled"); - Tooltip("Enables Skulltula Debug, when moving the cursor in the menu above various map\nicons (boss key, compass, map screen locations, etc) will set the GS bits in that\narea. USE WITH CAUTION AS IT DOES NOT UPDATE THE GS COUNT."); + Tooltip("Enables Skulltula Debug, when moving the cursor in the menu above various map icons (boss key, compass, map screen locations, etc) will set the GS bits in that area.\nUSE WITH CAUTION AS IT DOES NOT UPDATE THE GS COUNT."); EnhancementCheckbox("Fast File Select", "gSkipLogoTitle"); - Tooltip("Load the game to the selected menu or file\n\"Zelda Map Select\" require debug mode else you will fallback to File choose menu\nUsing a file number that don't have save will create a save file only\nif you toggle on \"Create a new save if none ?\" else it will bring you to the\nFile choose menu"); + Tooltip("Load the game to the selected menu or file\n\"Zelda Map Select\" require debug mode else you will fallback to File choose menu\nUsing a file number that don't have save will create a save file only if you toggle on \"Create a new save if none ?\" else it will bring you to the File choose menu"); if (CVar_GetS32("gSkipLogoTitle", 0)) { const char* FastFileSelect[5] = { "File N.1", @@ -1432,13 +1428,13 @@ namespace SohImGui { ImGui::Text("Loading :"); EnhancementCombobox("gSaveFileID", FastFileSelect, 5, 0); EnhancementCheckbox("Create a new save if none", "gCreateNewSave"); - Tooltip("Enable the creation of a new save file\nif none exist in the File number selected\nNo file name will be assigned please do in Save editor once you see the first text\nelse your save file name will be named \"00000000\"\nIf disabled you will fall back in File select menu"); + Tooltip("Enable the creation of a new save file if none exist in the File number selected\nNo file name will be assigned please do in Save editor once you see the first text else your save file name will be named \"00000000\"\nIf disabled you will fall back in File select menu"); }; ImGui::Separator(); EnhancementCheckbox("Stats", "gStatsEnabled"); - Tooltip("Shows the stats window, with your FPS and frametimes,\nand the OS you're playing on"); + Tooltip("Shows the stats window, with your FPS and frametimes, and the OS you're playing on"); EnhancementCheckbox("Console", "gConsoleEnabled"); - Tooltip("Enables the console window, allowing you to input commands,\ntype help for some examples"); + Tooltip("Enables the console window, allowing you to input commands, type help for some examples"); console->opened = CVar_GetS32("gConsoleEnabled", 0); ImGui::EndMenu(); @@ -1780,4 +1776,36 @@ namespace SohImGui { ImGui::EndGroup(); } + + // Automatically add newlines to break up tooltips longer than a specified number of characters + // Manually included newlines will still be respected and reset the line length + // Default line length is 60 characters + std::string BreakTooltip(const char* text, int lineLength) { + std::string newText(text); + const int tipLength = newText.length(); + int lastSpace = -1; + int currentLineLength = 0; + for (int currentCharacter = 0; currentCharacter < tipLength; currentCharacter++) { + if (newText[currentCharacter] == '\n') { + currentLineLength = 0; + lastSpace = -1; + continue; + } + else if (newText[currentCharacter] == ' ') { + lastSpace = currentCharacter; + } + + if ((currentLineLength >= lineLength) && (lastSpace >= 0)) { + newText[lastSpace] = '\n'; + currentLineLength = currentCharacter - lastSpace - 1; + lastSpace = -1; + } + currentLineLength++; + } + return newText; + } + + std::string BreakTooltip(const std::string& text, int lineLength) { + return BreakTooltip(text.c_str(), lineLength); + } } diff --git a/libultraship/libultraship/ImGuiImpl.h b/libultraship/libultraship/ImGuiImpl.h index 580d5cdb61..eb007efeb7 100644 --- a/libultraship/libultraship/ImGuiImpl.h +++ b/libultraship/libultraship/ImGuiImpl.h @@ -94,4 +94,6 @@ namespace SohImGui { ImTextureID GetTextureByName(const std::string& name); void BeginGroupPanel(const char* name, const ImVec2 & size = ImVec2(0.0f, 0.0f)); void EndGroupPanel(float minHeight = 0.0f); + std::string BreakTooltip(const char* text, int lineLength = 60); + std::string BreakTooltip(const std::string& text, int lineLength = 60); } diff --git a/soh/soh/Enhancements/debugger/ImGuiHelpers.cpp b/soh/soh/Enhancements/debugger/ImGuiHelpers.cpp index 6f4f006372..7fec0de144 100644 --- a/soh/soh/Enhancements/debugger/ImGuiHelpers.cpp +++ b/soh/soh/Enhancements/debugger/ImGuiHelpers.cpp @@ -1,10 +1,11 @@ #include "ImGuiHelpers.h" +#include "../../../../libultraship/libultraship/ImGuiImpl.h" // 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::Text(SohImGui::BreakTooltip(text, 60).c_str()); ImGui::EndTooltip(); } } @@ -15,7 +16,7 @@ void InsertHelpHoverText(const std::string& text) { ImGui::TextColored(ImVec4(0.7f, 0.7f, 0.7f, 1.0f), "?"); if (ImGui::IsItemHovered()) { ImGui::BeginTooltip(); - ImGui::Text(text.c_str()); + ImGui::Text(SohImGui::BreakTooltip(text, 60).c_str()); ImGui::EndTooltip(); } } diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp index f31a5e42ad..513776b2ac 100644 --- a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp @@ -1435,7 +1435,7 @@ void DrawPlayerTab() { InsertHelpHoverText("Link's speed along the Y plane. Caps at -20"); ImGui::InputScalar("Wall Height", ImGuiDataType_Float, &player->wallHeight); - InsertHelpHoverText("\"height used to determine whether link can climb or grab a ledge at the top\""); + InsertHelpHoverText("Height used to determine whether Link can climb or grab a ledge at the top"); ImGui::InputScalar("Invincibility Timer", ImGuiDataType_S8, &player->invincibilityTimer); InsertHelpHoverText("Can't take damage while this is nonzero"); diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 09704e8671..59146ba10d 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -3542,21 +3542,21 @@ void DrawRandoEditor(bool& open) { switch (CVar_GetS32("gRandomizeForest", 1)) { case 1: InsertHelpHoverText("Mido no longer blocks the path to the Deku Tree\n" - "The Kokiri boy no longer blocks the path\nout of the forest."); + "The Kokiri boy no longer blocks the path out of the forest."); break; case 2: InsertHelpHoverText( "The Kokiri boy no longer blocks the path out of the forest\nMido " - "still blocks the path to the Deku\nTree, requiring the Kokiri Sword " - "and a Deku Shield to\naccess the Deku Tree."); + "still blocks the path to the Deku Tree, requiring the Kokiri Sword " + "and a Deku Shield to access the Deku Tree."); break; case 0: InsertHelpHoverText( - "Beating Deku Tree is logically required to leave\nthe forest area " - "(Kokiri Forest / Loost Woods / Sacred\nForest Meadow / Deku Tree) " - "while the Kokiri Sword\nand a Deku Shield are required to access the " - "Deku\nTree Items needed for this will be guaranteed\ninside the " - "forest area.\nThis settins is incompatible with starting as adult."); + "Beating Deku Tree is logically required to leave the forest area " + "(Kokiri Forest / Lost Woods / Sacred Forest Meadow / Deku Tree) " + "while the Kokiri Sword and a Deku Shield are required to access the " + "Deku Tree\nItems needed for this will be guaranteed inside the " + "forest area.\nThis setting is incompatible with starting as adult."); break; } SohImGui::EnhancementCombobox("gRandomizeForest", randoForest, 3, 1); @@ -3566,13 +3566,13 @@ void DrawRandoEditor(bool& open) { switch (CVar_GetS32("gRandomizeKakarikoGate", 0)) { case 0: InsertHelpHoverText( - "The gate and the Happy Mask Shop both remain\nclosed until showing " - "Zelda's Letter to the guard\nin Kakariko."); + "The gate and the Happy Mask Shop both remain closed until showing " + "Zelda's Letter to the guard in Kakariko."); break; case 1: InsertHelpHoverText( - "The gate is always open instead of needing\nZelda's Letter.\nThe Happy Mask Shop " - "opens upon obtaining \n Zelda's Letter without needing to show\nit to the guard."); + "The gate is always open instead of needing Zelda's Letter.\nThe Happy Mask Shop " + "opens upon obtaining Zelda's Letter without needing to show it to the guard."); break; } SohImGui::EnhancementCombobox("gRandomizeKakarikoGate", randoKakarikoGate, 2, 1); @@ -3583,16 +3583,16 @@ void DrawRandoEditor(bool& open) { switch (CVar_GetS32("gRandomizeDoorOfTime", 0)) { case 0: InsertHelpHoverText( - "The Door of Time starts opened instead of needing\nto play the Song of Time."); + "The Door of Time starts opened instead of needing to play the Song of Time."); break; case 1: InsertHelpHoverText( - "Only an Ocarina and the Song of Time need to be\nfound to open the Door of Time."); + "Only an Ocarina and the Song of Time need to be found to open the Door of Time."); break; case 2: InsertHelpHoverText( - "The Ocarina of Time, the Song of Time and\nall Spiritual Stones need to " - "be found to\nopen the Door of Time."); + "The Ocarina of Time, the Song of Time and all Spiritual Stones need to " + "be found to open the Door of Time."); break; } SohImGui::EnhancementCombobox("gRandomizeDoorOfTime", randoDoorOfTime, 3, 0); @@ -3604,17 +3604,17 @@ void DrawRandoEditor(bool& open) { case 0: InsertHelpHoverText( "King Zora obstructs the way to Zora's Fountain.\nRuto's Letter must be " - "shown as child in order to\nmove him from both eras."); + "shown as child in order to move him from both eras."); break; case 1: InsertHelpHoverText( "King Zora is always moved in the adult era.\nThis means Ruto's Letter is " - "only required to\naccess Zora's fountain as child."); + "only required to access Zora's fountain as child."); break; case 2: InsertHelpHoverText( - "King Zora starts as moved in both the child and\nadult eras.\nThis also " - "removes Ruto's Letter from the\npool since it can't be used."); + "King Zora starts as moved in both the child and adult eras.\nThis also " + "removes Ruto's Letter from the pool since it can't be used."); break; } SohImGui::EnhancementCombobox("gRandomizeZorasFountain", randoZorasFountain, 3, 0); @@ -3631,9 +3631,9 @@ void DrawRandoEditor(bool& open) { break; case 2: InsertHelpHoverText( - "The carpenters are rescued from the start of the\ngame and if \"Shuffle " - "Gerudo Card\" is disabled,\nthe player starts with the Gerudo Card in " - "the\ninventory allowing access to Gerudo Training\nGrounds."); + "The carpenters are rescued from the start of the game and if \"Shuffle " + "Gerudo Card\" is disabled, the player starts with the Gerudo Card in " + "the inventory allowing access to Gerudo Training Grounds."); break; } SohImGui::EnhancementCombobox("gRandomizeGerudoFortress", randoGerudoFortress, 3, 1); @@ -3644,41 +3644,40 @@ void DrawRandoEditor(bool& open) { SohImGui::EnhancementCombobox("gRandomizeRainbowBridge", randoRainbowBridge, 7, 3); switch (CVar_GetS32("gRandomizeRainbowBridge", 3)) { case 1: - InsertHelpHoverText("The Rainbow Bridge requires Shadow and Spirit\nMedallions as well " + InsertHelpHoverText("The Rainbow Bridge requires Shadow and Spirit Medallions as well " "as Light Arrows."); break; case 2: - InsertHelpHoverText("The Rainbow Bridge requires collecting a\nconfigurable number of " + InsertHelpHoverText("The Rainbow Bridge requires collecting a configurable number of " "Spiritual Stones."); SohImGui::EnhancementSliderInt("Stone Count: %d", "##RandoStoneCount", "gRandomizeStoneCount", 0, 3, ""); SetLastItemHoverText( - "Sets the number of Spiritual Stones required to\nspawn the Rainbow Bridge."); + "Sets the number of Spiritual Stones required to spawn the Rainbow Bridge."); break; case 3: SohImGui::EnhancementSliderInt("Medallion Count: %d", "##RandoMedallionCount", "gRandomizeMedallionCount", 0, 6, "", 6); SetLastItemHoverText( - "The Rainbow Bridge requires collecting a\nconfigurable number of Medallions."); + "The Rainbow Bridge requires collecting a configurable number of Medallions."); break; case 4: SohImGui::EnhancementSliderInt("Reward Count: %d", "##RandoRewardCount", "gRandomizeRewardCount", 0, 9, ""); - SetLastItemHoverText("The Rainbow Bridge requires collecting a\nconfigurable number of " + SetLastItemHoverText("The Rainbow Bridge requires collecting a configurable number of " "Dungeon Rewards."); break; case 5: SohImGui::EnhancementSliderInt("Dungeon Count: %d", "##RandoDungeonCount", "gRandomizeDungeonCount", 0, 8, ""); SetLastItemHoverText( - "The Rainbow Bridge requires completing a\nconfigurable number of " - "Dungeons.\n\nDungeons " - "are considered complete when Link steps\ninto the blue warp at the end of them."); + "The Rainbow Bridge requires completing a configurable number of Dungeons.\nDungeons " + "are considered complete when Link steps into the blue warp at the end of them."); break; case 6: SohImGui::EnhancementSliderInt("Token Count: %d", "##RandoTokenCount", "gRandomizeTokenCount", 0, 100, ""); - SetLastItemHoverText("The Rainbow Bridge requires collecting a\nconfigurable number of " + SetLastItemHoverText("The Rainbow Bridge requires collecting a configurable number of " "Gold Skulltula Tokens."); break; } @@ -3687,17 +3686,17 @@ void DrawRandoEditor(bool& open) { // Random Ganon's Trials /* ImGui::Text("Random Ganon's Trials"); - InsertHelpHoverText("Sets a random number or required trials to enter\nGanon's Tower."); + InsertHelpHoverText("Sets a random number or required trials to enter Ganon's Tower."); SohImGui::EnhancementCombobox("gRandomizeGanonTrial", randoGanonsTrial, 2, 0); if (CVar_GetS32("gRandomizeGanonTrial", 0) == 0) { */ //SohImGui::EnhancementSliderInt("Ganon's Trial Count: %d", "##RandoTrialCount", // "gRandomizeGanonTrialCount", 0, 6, ""); - //InsertHelpHoverText("Set the number of trials required to enter\nGanon's Tower."); + //InsertHelpHoverText("Set the number of trials required to enter Ganon's Tower."); // RANDTODO: Switch back to slider when pre-completing some of Ganon's Trials is properly implemnted. SohImGui::EnhancementCheckbox("Skip Ganon's Trials", "gRandomizeGanonTrialCount"); InsertHelpHoverText( - "Sets whether or not Ganon's Castle Trials are required\nto enter Ganon's Tower."); + "Sets whether or not Ganon's Castle Trials are required to enter Ganon's Tower."); // } ImGui::Separator(); @@ -3716,9 +3715,9 @@ void DrawRandoEditor(bool& open) { // Starting Age // ImGui::Text("Starting Age"); // InsertHelpHoverText( - // "Choose which age Link will start as.\n\nStarting as adult means you start with the " - // "Master\nSword " - // "in your inventory.\n\nOnly the child option is compatible with Closed\nForest."); + // "Choose which age Link will start as.\nStarting as adult means you start with the " + // "Master Sword in your inventory.\nOnly the child option is compatible with " + // "Closed Forest."); // SohImGui::EnhancementCombobox("gRandomizeStartingAge", randoStartingAge, 3, 0); // ImGui::Separator(); @@ -3726,31 +3725,26 @@ void DrawRandoEditor(bool& open) { // Shuffle Entrances // ImGui::Text("Shuffle Entrances"); // InsertHelpHoverText("Shuffle where the entrances between areas lead to.\n" - // "If turned on, select which kinds of entrances you\n" - // "want shuffled in the options below. Note that some\n" - // "types of entrances can have widly varying\ngeneration times."); + // "If turned on, select which kinds of entrances you " + // "want shuffled in the options below.\n Note that some " + // "types of entrances can have widly varying generation times."); // SohImGui::EnhancementCombobox("gRandomizeShuffleEntrances", randoShuffleEntrances, 2, 0); // if (CVar_GetS32("gRandomizeShuffleEntrances", 0) == 1) { // ImGui::Indent(); // ImGui::Text("Shuffle Dungeons Entrances"); // InsertHelpHoverText( - // "Shuffle the pool of dungeon entrances, including\nBottom of the Well, Ice caven and " - // "Gerudo\n" - // "Training Grounds However, Ganon's Caslte is not\nshuffled.\n\nAdditionally, the " - // "entrance " - // "of " - // "Deku Tree, Fire\nTemple and Bottom of the Well are opened for both\nadult and child."); + // "Shuffle the pool of dungeon entrances, including Bottom of the Well, Ice Cavern and " + // "Gerudo Training Grounds\nGanon's Castle is not shuffled.\nAdditionally, the entrance " + // "of Deku Tree, Fire Temple and Bottom of the Well are open for both adult and child."); // SohImGui::EnhancementCombobox("gRandomizeShuffleDungeonsEntrances", // randoShuffleDungeonsEntrances, 2, 0); // ImGui::Text("Shuffle Overworld Entrances"); // InsertHelpHoverText( - // "Shuffle the pool of Overworld entrances, which\ncorresponds to almost all loading " - // "zones " - // "between\nOverworld areas.\n\nSome entrances are unshuffled to avoid issues:\n- Hyrule " - // "Castle " - // "Courtyard and Garden entrance\n- Both Market Back Alley entrances\n- Gerudo Valley to " - // "Lake " - // "Hylia (unless entrances\nare decoupled)."); + // "Shuffle the pool of Overworld entrances, which corresponds to almost all loading " + // "zones between Overworld areas.\nSome entrances are unshuffled to avoid issues:\n" + // "- Hyrule Castle Courtyard and Garden entrance\n" + // "- Both Market Back Alley entrances\n" + // "- Gerudo Valley to Lake Hylia (unless entrances are decoupled)"); // SohImGui::EnhancementCombobox("gRandomizeShuffleOverworldEntrances", // randoShuffleOverworldEntrances, 2, 0); // ImGui::Text("Shuffle Interiors Entrances"); @@ -3759,8 +3753,8 @@ void DrawRandoEditor(bool& open) { // randoShuffleInteriorsEntrances, 2, 0); // ImGui::Text("Shuffle Grottos Entrances"); // InsertHelpHoverText( - // "Shuffle the pool of grotto entrances, including\nall graves, small Fairy " - // "fountains and the Lost\nWoods Stage."); + // "Shuffle the pool of grotto entrances, including all graves, small Fairy " + // "fountains and the Lost Woods Stage."); // SohImGui::EnhancementCombobox("gRandomizeShuffleGrottosEntrances", // randoShuffleGrottosEntrances, 2, 0); // ImGui::Unindent(); @@ -3771,9 +3765,8 @@ void DrawRandoEditor(bool& open) { // Bombchus in Logic // ImGui::Text("Bombchus in Logic"); // InsertHelpHoverText( - // "Bombchus are properly considered in logic.\nThey can be replenished in shops " - // "or trough\nbombchu " - // "drops, if those are enabled.\nBombchu Bowling is opened by bombchus."); + // "Bombchus are properly considered in logic.\nThey can be replenished in shops or " + // "through bombchu drops, if those are enabled.\nBombchu Bowling is opened by bombchus."); // SohImGui::EnhancementCombobox("gRandomizeBombchusInLogic", randoBombchusInLogic, 3, 0); // ImGui::Separator(); @@ -3783,17 +3776,17 @@ void DrawRandoEditor(bool& open) { // switch (CVar_GetS32("gRandomizeAmmoDrops", 0)) { // case 0: // InsertHelpHoverText( - // "Bombs, arrows, seeds, nuts, sticks and\nmagic jars appear as normal.\n" + // "Bombs, arrows, seeds, nuts, sticks and magic jars appear as normal.\n" // "Bombchus can sometimes replace bomb drops."); // break; // case 1: // InsertHelpHoverText( - // "All ammo drops will be replaced by blue rupees,\nexcept for Deku Sticks.\n" + // "All ammo drops will be replaced by blue rupees, except for Deku Sticks.\n" // "Ammo upgrades will only refill ammo by 10 units."); // break; // case 2: // InsertHelpHoverText( - // "Bombs, arrow, seeds, nuts, sticks and\nmagic jars appear as normal."); + // "Bombs, arrow, seeds, nuts, sticks and magic jars appear as normal."); // break; // } // SohImGui::EnhancementCombobox("gRandomizeAmmoDrops", randoAmmoDrops, 3, 0); @@ -3843,20 +3836,19 @@ void DrawRandoEditor(bool& open) { switch (CVar_GetS32("gRandomizeShuffleDungeonReward", 0)) { case 0: InsertHelpHoverText( - "Medallions and Spiritual Stones will be given as\nrewards for beating " - "dungeons.\n\nThis " - "setting will force Link's Pocket to be a\nMedallion or a Spiritual Stone."); + "Medallions and Spiritual Stones will be given as rewards for beating dungeons.\n" + "This setting will force Link's Pocket to be a Medallion or a Spiritual Stone."); break; case 1: InsertHelpHoverText( - "Medallions and Spiritual Stones can only appear\ninside of dungeons."); + "Medallions and Spiritual Stones can only appear inside of dungeons."); break; case 2: InsertHelpHoverText( - "Medallions and Spiritual Stones can only appear\noutside dungeons."); + "Medallions and Spiritual Stones can only appear outside dungeons."); break; case 3: - InsertHelpHoverText("Medallions and Spiritual Stones can appear\nanywhere."); + InsertHelpHoverText("Medallions and Spiritual Stones can appear anywhere."); break; } SohImGui::EnhancementCombobox("gRandomizeShuffleDungeonReward", randoShuffleDungeonRewards, 4, @@ -3869,16 +3861,16 @@ void DrawRandoEditor(bool& open) { // ImGui::Text("Link's Pocket"); // switch (CVar_GetS32("gRandomizeLinksPocket", 0)) { // case 0: - // InsertHelpHoverText("Link will start with a Dungeon Reward in his\ninventory."); + // InsertHelpHoverText("Link will start with a Dungeon Reward in his inventory."); // break; // case 1: - // InsertHelpHoverText("Link will receive a random advancement item at the\nbeginning " + // InsertHelpHoverText("Link will receive a random advancement item at the beginning " // "of the playtrough."); // break; // case 2: // InsertHelpHoverText( - // "Link will recieve a random item from the item pool\nat the beginning " - // "of the playthrought."); + // "Link will recieve a random item from the item pool at the beginning " + // "of the playthrough."); // break; // case 3: // InsertHelpHoverText("Link will start with a very useful green rupee."); @@ -3893,16 +3885,15 @@ void DrawRandoEditor(bool& open) { ImGui::Text("Shuffle Songs"); switch (CVar_GetS32("gRandomizeShuffleSongs", 0)) { case 0: - InsertHelpHoverText("Songs will only appear at locations that normally\nteach songs."); + InsertHelpHoverText("Songs will only appear at locations that normally teach songs."); break; case 1: InsertHelpHoverText("Songs appear at the end of dungeons.\nFor major dungeons, they " - "will be at the boss " - "heart container location.\nThe remaining 4 songs are placed " - "at:\n- Zelda's Lullaby " - "location\n- Ice Cavern's Serenade of Water Location\n- Bottom of " - "the Well's Lens of " - "Truth Location\n- Gerudo Training Ground's Ice Arrow Location."); + "will be at the boss heart container location.\nThe remaining 4 " + "songs are placed at:\n- Zelda's Lullaby location\n" + "- Ice Cavern's Serenade of Water Location\n" + "- Bottom of the Well's Lens of Truth Location\n" + "- Gerudo Training Ground's Ice Arrow Location."); break; case 2: InsertHelpHoverText("Songs can appear in any location"); @@ -3919,32 +3910,32 @@ void DrawRandoEditor(bool& open) { // InsertHelpHoverText("All shop items will be the same as vanilla."); // break; // case 1: - // InsertHelpHoverText("Vanilla shop items will be shuffled among\ndifferent shops."); + // InsertHelpHoverText("Vanilla shop items will be shuffled among different shops."); // break; // case 2: // InsertHelpHoverText( // "Vanilla shop items will be shuffled among different shops, and each " - // "shop will contain\n1 non-vanilla shop item."); + // "shop will contain 1 non-vanilla shop item."); // break; // case 3: // InsertHelpHoverText( // "Vanilla shop items will be shuffled among different shops, and each " - // "shop will contain\n2 non-vanilla shop items."); + // "shop will contain 2 non-vanilla shop items."); // break; // case 4: // InsertHelpHoverText( // "Vanilla shop items will be shuffled among different shops, and each " - // "shop will contain\n3 non-vanilla shop items."); + // "shop will contain 3 non-vanilla shop items."); // break; // case 5: // InsertHelpHoverText( // "Vanilla shop items will be shuffled among different shops, and each " - // "shop will contain\n4 non-vanilla shop items."); + // "shop will contain 4 non-vanilla shop items."); // break; // case 6: // InsertHelpHoverText( // "Vanilla shop items will be shuffled among different shops, and each " - // "shop will contain\n1 to 4 non-vanilla shop items."); + // "shop will contain 1 to 4 non-vanilla shop items."); // break; // } // SohImGui::EnhancementCombobox("gRandomizeShopsanity", randoShopsanity, 7, 0); @@ -3959,16 +3950,15 @@ void DrawRandoEditor(bool& open) { // break; // case 1: // InsertHelpHoverText( - // "This only shuffles 65 location that are\nwithing dungeons, increasing the value " - // "of " - // "most\ndungeons and making internal dungeon exploration\nmore diverse."); + // "This only shuffles 65 location that are within dungeons, increasing the value " + // "of most dungeons and making internal dungeon exploration more diverse."); // break; // case 2: // InsertHelpHoverText( - // "This only shuffles the 65 locations that are\noutside of dungeons."); + // "This only shuffles the 65 locations that are outside of dungeons."); // break; // case 3: - // InsertHelpHoverText("Effectively adds 100 new locations for items to\nappear."); + // InsertHelpHoverText("Effectively adds 100 new locations for items to appear."); // break; // } // SohImGui::EnhancementCombobox("gRandomizeTokensanity", randoTokensanity, 4, 0); @@ -3980,15 +3970,15 @@ void DrawRandoEditor(bool& open) { // switch (CVar_GetS32("gRandomizeShuffleScrubs", 0)) { // case 0: // InsertHelpHoverText( - // "Only the 3 Scrubs that give one-time items in the\nvanilla game (PoH, " - // "Deku Nut capacity, and Deku\nStick capacity) will have random items."); + // "Only the 3 Scrubs that give one-time items in the vanilla game (PoH, " + // "Deku Nut capacity, and Deku Stick capacity) will have random items."); // break; // case 1: // InsertHelpHoverText("All Scrub prices will be reduced to 10 rupees each."); // break; // case 2: // InsertHelpHoverText("All Scrub prices will be their vanilla prices.\nThis will require " - // "spending over 1000 rupees on\nSrubs."); + // "spending over 1000 rupees on Scrubs."); // break; // case 3: // InsertHelpHoverText("All Scrub prices will be between 0 to 95 rupees.\nThis will on " @@ -4002,16 +3992,16 @@ void DrawRandoEditor(bool& open) { // // Shuffle Cows // ImGui::Text("Shuffle Cows"); // InsertHelpHoverText( - // "Enabling this will let cows give you items upon\nperforming Epona's Song in " - // "front of them. There\nare 9 cows."); + // "Enabling this will let cows give you items upon performing Epona's Song in " + // "front of them. There are 9 cows."); // SohImGui::EnhancementCombobox("gRandomizeShuffleCows", randoShuffleCows, 2, 0); // ImGui::Separator(); if(CVar_GetS32("gRandomizeStartingKokiriSword", 0) == 0) { // Shuffle Kokiri Sword ImGui::Text("Shuffle Kokiri Sword"); - InsertHelpHoverText("Enabling this shuffles the Kokiri Sword into the item pool.\n\nThis will " - "require extensive use of sticks until\nthe sword is found."); + InsertHelpHoverText("Enabling this shuffles the Kokiri Sword into the item pool.\nThis will " + "require extensive use of sticks until the sword is found."); SohImGui::EnhancementCombobox("gRandomizeShuffleKokiriSword", randoShuffleKokiriSword, 2, 0); ImGui::Separator(); } @@ -4019,9 +4009,9 @@ void DrawRandoEditor(bool& open) { if(CVar_GetS32("gRandomizeStartingOcarina", 0) == 0) { // Shuffle Ocarinas ImGui::Text("Shuffle Ocarinas"); - InsertHelpHoverText("Enabling this shuffles the Fairy Ocarina and the\nOcarina of time into " - "the item pool.\n\nThis " - "will require finding an Ocarina before being\nable to play songs."); + InsertHelpHoverText("Enabling this shuffles the Fairy Ocarina and the Ocarina of time into " + "the item pool.\n" + "This will require finding an Ocarina before being able to play songs."); SohImGui::EnhancementCombobox("gRandomizeShuffleOcarinas", randoShuffleOcarinas, 2, 0); ImGui::Separator(); } @@ -4031,11 +4021,11 @@ void DrawRandoEditor(bool& open) { // Shuffle Weird Egg ImGui::Text("Shuffle Weird Egg"); InsertHelpHoverText( - "Enabling this shuffles the Weird Egg from Malon\ninto the item pool.\nThis " - "will require finding the Weird Egg to talk to\nZelda in Hyrule Castle which " - "in turn locks\nrewards from Impa, Xaria, Malon and Talon as\nwell as the " - "Happy Mask Sidequest. The Weird egg\nis also required for Zelda's Letter to " - "unlock the\nKakariko Gate as child which can lock some\nprogression."); + "Enabling this shuffles the Weird Egg from Malon into the item pool.\nThis " + "will require finding the Weird Egg to talk to Zelda in Hyrule Castle which " + "in turn unlocks rewards from Impa, Saria, Malon and Talon as well as the " + "Happy Mask Sidequest.\nThe Weird egg is also required for Zelda's Letter to " + "unlock the Kakariko Gate as child which can lock some progression."); SohImGui::EnhancementCombobox("gRandomizeShuffleWeirdEgg", randoShuffleWeirdEgg, 2, 0); ImGui::Separator(); } @@ -4043,16 +4033,16 @@ void DrawRandoEditor(bool& open) { // Shuffle Gerudo Membership Card ImGui::Text("Shuffle Gerudo Membership Card"); InsertHelpHoverText( - "Enabling this shuffles the Gerudo Membership Card into the\nitem pool.\n\nThe Gerudo " - "Token is required to enter the Gerudo\nTraining Ground."); + "Enabling this shuffles the Gerudo Membership Card into the item pool.\nThe Gerudo " + "Token is required to enter the Gerudo Training Ground."); SohImGui::EnhancementCombobox("gRandomizeShuffleGerudoToken", randoShuffleGerudoToken, 2, 0); ImGui::Separator(); // todo implement magic bean 10 pack // // Shuffle Magic Beans // ImGui::Text("Shuffle Magic Beans"); - // InsertHelpHoverText("Enabling this adds a pack of 10 beans to the item\n" - // "pool and changes the Magic Bean Salesman to sell a\n" + // InsertHelpHoverText("Enabling this adds a pack of 10 beans to the item " + // "pool and changes the Magic Bean Salesman to sell a " // "random item at a price of 60 rupees."); // SohImGui::EnhancementCombobox("gRandomizeShuffleMagicBeans", randoShuffleMagicBeans, 2, 0); // ImGui::Separator(); @@ -4062,13 +4052,13 @@ void DrawRandoEditor(bool& open) { // ImGui::Text("Shuffle Merchants"); // if (CVar_GetS32("gRandomizeShuffleMerchants", 0) == 0) { // InsertHelpHoverText( - // "Enabling this adds a Giant's Knife and a pack\nof Bombchus to the item " - // "pool and changes both\nMediagoron and the Haunted Wasteland " - // "Carpet\nSalesman to sell a random item once at the price\nof 200 rupees."); + // "Enabling this adds a Giant's Knife and a pack of Bombchus to the item " + // "pool and changes both Mediagoron and the Haunted Wasteland " + // "Carpet Salesman to sell a random item once at the price of 200 rupees."); // } else if (CVar_GetS32("gRandomizeShuffleMerchants", 0) <= 2) { // InsertHelpHoverText( - // "These hints will make Medigoron and the Carpet\nsalesman tell you which item they\'re " - // "selling.\n\nThe Clearer Hints setting will affect how they\nrefer to the item."); + // "These hints will make Medigoron and the Carpet salesman tell you which item they're " + // "selling.\nThe Clearer Hints setting will affect how they refer to the item."); // } // SohImGui::EnhancementCombobox("gRandomizeShuffleMerchants", randoShuffleMerchants, 3, 0); // ImGui::Separator(); @@ -4077,13 +4067,10 @@ void DrawRandoEditor(bool& open) { // Shuffle Adult Trade // ImGui::Text("Shuffle Adult Trade"); // InsertHelpHoverText( - // "Enabling this adds all of the adult trade quest\nitems to the pool, each of which can be " - // "traded\nfor a unique reward You will be able to choose\nwhich of your owner adult trade " - // "items " - // " " - // "is visible\nin the inventory by selecting the item and using\nthe L and R buttons If " - // "disabled " - // "only the Claim\nCheck will be found in the pool."); + // "Enabling this adds all of the adult trade quest items to the pool, each of which can be " + // "traded for a unique reward.\nYou will be able to choose which of your adult trade items " + // "are visible in the inventory by selecting the item and using the L and R buttons.\n" + // "If disabled only the Claim Check will be found in the pool."); // SohImGui::EnhancementCombobox("gRandomizeShuffleAdultTrade", randoShuffleAdultTrade, 2, 0); } ImGui::PopItemWidth(); @@ -4114,26 +4101,26 @@ void DrawRandoEditor(bool& open) { // ImGui::Text("Maps / Compasses"); // switch (CVar_GetS32("gRandomizeShuffleMapsAndCompasses", 0)) { // case 0: - // InsertHelpHoverText("Maps and Compasses can only appear in their repsective dungeon."); + // InsertHelpHoverText("Maps and Compasses can only appear in their respective dungeon."); // break; // case 1: // InsertHelpHoverText( - // "Maps and Compasses can only appear in a dungeon\nbut not necessarily the " + // "Maps and Compasses can only appear in a dungeon but not necessarily the " // "dungeon they are for."); // break; // case 2: - // InsertHelpHoverText("Maps and Compasses can only appear outside of\ndungeons."); + // InsertHelpHoverText("Maps and Compasses can only appear outside of dungeons."); // break; // case 3: - // InsertHelpHoverText("Maps and Compasses can appear anywhere in the\nworld."); + // InsertHelpHoverText("Maps and Compasses can appear anywhere in the world."); // break; // case 4: // InsertHelpHoverText( // "Maps and Compasses are given to you from the start.\nThis will add a " - // "small amount of money and\nrefill items to the pool."); + // "small amount of money and refill items to the pool."); // break; // case 5: - // InsertHelpHoverText("Maps and Compasses will appear in their vanilla\nlocations."); + // InsertHelpHoverText("Maps and Compasses will appear in their vanilla locations."); // break; // } // SohImGui::EnhancementCombobox("gRandomizeShuffleMapsAndCompasses", randoShuffleMapsAndCompasses, @@ -4145,28 +4132,28 @@ void DrawRandoEditor(bool& open) { // ImGui::Text("Small Keys"); // switch (CVar_GetS32("gRandomizeShuffleSmallKeys", 0)) { // case 0: - // InsertHelpHoverText("Small Keys can only appear in their respective\ndungeon."); + // InsertHelpHoverText("Small Keys can only appear in their respective dungeon."); // break; // case 1: // InsertHelpHoverText( - // "Small Keys can only appear inside of any dungon,\nbut won't necessarily " - // "be in the dungeon that the\nkey is for.\nA difficult mode since it is " - // "more likely\nto need to enter a dungeon multiple times."); + // "Small Keys can only appear inside of any dungon, but won't necessarily " + // "be in the dungeon that the key is for.\nA difficult mode since it is " + // "more likely to need to enter a dungeon multiple times."); // break; // case 2: // InsertHelpHoverText( // "Small Keys can only appear outside of dungeons.\nYou may need to enter a " - // "dungeon multiple times to\ngain items to access the overworld locations " - // "with\nthe keys required to finish a dungeon."); + // "dungeon multiple times to gain items to access the overworld locations " + // "with the keys required to finish a dungeon."); // break; // case 3: // InsertHelpHoverText( // "Small Keys can appear anywhere in the world.\nA difficult mode since it " - // "is more likely to need to\nenter a dungeon multiple times."); + // "is more likely to need to enter a dungeon multiple times."); // break; // case 4: // InsertHelpHoverText( - // "Small Keys are given to you from the start so you\nwon't have to worry " + // "Small Keys are given to you from the start so you won't have to worry " // "about locked doors.\nAn easier mode."); // break; // case 5: @@ -4182,18 +4169,17 @@ void DrawRandoEditor(bool& open) { // switch (CVar_GetS32("gRandomizeShuffleGerudoFortressKeys", 0)) { // case 0: // InsertHelpHoverText( - // "Gerudo Fortress Keys will appear in their vanilla\nlocation dropping " - // "from fighting Gerudo " - // "guard\nthat attack when trying to free the jailed\ncarpenters."); + // "Gerudo Fortress Keys will appear in their vanilla location dropping from " + // "fighting Gerudo guards that attack when trying to free the jailed carpenters."); // break; // case 1: - // InsertHelpHoverText("Gerudo Fortress Keys can only appear inside of\ndungeons."); + // InsertHelpHoverText("Gerudo Fortress Keys can only appear inside of dungeons."); // break; // case 2: - // InsertHelpHoverText("Gerudo Fortress Keys can only appear outside of\ndungeons."); + // InsertHelpHoverText("Gerudo Fortress Keys can only appear outside of dungeons."); // break; // case 3: - // InsertHelpHoverText("Gerudo Fortress Keys can appear anywhere in the\nworld."); + // InsertHelpHoverText("Gerudo Fortress Keys can appear anywhere in the world."); // break; // } // SohImGui::EnhancementCombobox("gRandomizeShuffleGerudoFortressKeys", @@ -4205,28 +4191,27 @@ void DrawRandoEditor(bool& open) { // ImGui::Text("Boss Keys"); // switch (CVar_GetS32("gRandomizeShuffleBossKeys", 0)) { // case 0: - // InsertHelpHoverText("Boss Keys can only appear in their respective\ndungeons."); + // InsertHelpHoverText("Boss Keys can only appear in their respective dungeons."); // break; // case 1: // InsertHelpHoverText( - // "Boss Keys can only appear inside of any dungeon,\nbut won't necessarily " - // "be in the dungon that the\nkey is for.\nA difficult mode since it is " - // "more\nlikely to need to enter a dungeon multiple times."); + // "Boss Keys can only appear inside of any dungeon, but won't necessarily " + // "be in the dungon that the key is for.\nA difficult mode since it is " + // "more likely to need to enter a dungeon multiple times."); // break; // case 2: // InsertHelpHoverText( - // "Boss keys can only appear outside of dungeons.\nYou may need to enter a dungeon " - // "without " - // "the boss\nkey to get items required to find the key in the\noverworld."); + // "Boss Keys can only appear outside of dungeons.\nYou may need to enter a dungeon " + // "without the boss key to get items required to find the key in the overworld."); // break; // case 3: // InsertHelpHoverText( - // "Boss key can appear anywhere in the overworld.\nA difficult mode since it " - // "is more likely to need to\nenter a dungeon multiple times."); + // "Boss Keys can appear anywhere in the overworld.\nA difficult mode since it " + // "is more likely to need to enter a dungeon multiple times."); // break; // case 4: // InsertHelpHoverText( - // "Boss Keys are given to you from the start so you\nwon't have to worry " + // "Boss Keys are given to you from the start so you won't have to worry " // "about boss doors.\nAn easier mode."); // break; // case 5: @@ -4245,80 +4230,80 @@ void DrawRandoEditor(bool& open) { switch (CVar_GetS32("gRandomizeShuffleGanonBossKey", 0)) { case 0: SetLastItemHoverText( - "Ganon's Boss Key is given to you from the\nstart and you don't " + "Ganon's Boss Key is given to you from the start and you don't " "have to worry about finding it."); break; case 1: - SetLastItemHoverText("Ganon's Boss Key will appear in the vanilla\nlocation."); + SetLastItemHoverText("Ganon's Boss Key will appear in the vanilla location."); break; case 2: - SetLastItemHoverText("Ganon's Boss Key will appear somewhere inside\nGanon's Castle."); + SetLastItemHoverText("Ganon's Boss Key will appear somewhere inside Ganon's Castle."); break; // case 0: // SetLastItemHoverText( - // "Ganon's Castle Boss Key can only appear inside of\na dungeon, but not " + // "Ganon's Castle Boss Key can only appear inside of a dungeon, but not " // "necessarily Ganon's Castle."); // break; // case 1: - // SetLastItemHoverText("Ganon's Castle Boss Key can only appear outside of\ndungeons."); + // SetLastItemHoverText("Ganon's Castle Boss Key can only appear outside of dungeons."); // break; // case 2: - // SetLastItemHoverText("Ganon's Castle Boss Key can appear anywhere in the\nworld."); + // SetLastItemHoverText("Ganon's Castle Boss Key can appear anywhere in the world."); // break; // case 3: // SetLastItemHoverText( - // "These settings put the boss key on the Light Arrow\nCutscene location, " - // "from Zelda in Temple of Time as\nadult, with differing requirements."); + // "These settings put the boss key on the Light Arrow Cutscene location, " + // "from Zelda in Temple of Time as adult, with differing requirements."); // break; // case 4: - // SetLastItemHoverText("Ganon's Caslte Boss Key can appear anywhere in the\nworld."); + // SetLastItemHoverText("Ganon's Castle Boss Key can appear anywhere in the world."); // break; // case 5: // SetLastItemHoverText( - // "These settings put the boss key on the Light Arrow\nCutscene location, " - // "from Zelda in Temple of Time as\nadult, with differing requirements."); + // "These settings put the boss key on the Light Arrow Cutscene location, " + // "from Zelda in Temple of Time as adult, with differing requirements."); // SohImGui::EnhancementSliderInt("Medallion Count: %d", "##RandoGanonMedallionCount", // "gRandomizeGanonMedallionCount", 0, 6, ""); // InsertHelpHoverText( - // "Set the number of Medallions required to trigger\nthe Light Arrow Cutscene."); + // "Set the number of Medallions required to trigger the Light Arrow Cutscene."); // break; // case 6: // SetLastItemHoverText( - // "These settings put the boss key on the Light Arrow\nCutscene location, " - // "from Zelda in Temple of Time as\nadult, with differing requirements."); + // "These settings put the boss key on the Light Arrow Cutscene location, " + // "from Zelda in Temple of Time as adult, with differing requirements."); // SohImGui::EnhancementSliderInt("Stone Count: %d", "##RandoGanonStoneCount", // "gRandomizeGanonStoneCount", 0, 3, ""); - // InsertHelpHoverText("Set the number of Spiritual Stones required to trigger\nthe Light " + // InsertHelpHoverText("Set the number of Spiritual Stones required to trigger the Light " // "Arrow Cutscene."); // break; // case 7: // SetLastItemHoverText( - // "These settings put the boss key on the Light Arrow\nCutscene location, " - // "from Zelda in Temple of Time as\nadult, with differing requirements."); + // "These settings put the boss key on the Light Arrow Cutscene location, " + // "from Zelda in Temple of Time as adult, with differing requirements."); // SohImGui::EnhancementSliderInt("Reward Count: %d", "##RandoGanonRewardCount", // "gRandomizeGanonRewardCount", 0, 9, ""); // InsertHelpHoverText( - // "Set the number of Dungeon Rewards (Spiritual\nStones and Medallions) " - // "required to trigger the\nLight Arrow Cutscene."); + // "Set the number of Dungeon Rewards (Spiritual Stones and Medallions) " + // "required to trigger the Light Arrow Cutscene."); // break; // case 8: // SetLastItemHoverText( - // "These settings put the boss key on the Light Arrow\nCutscene location, " - // "from Zelda in Temple of Time as\nadult, with differing requirements."); + // "These settings put the boss key on the Light Arrow Cutscene location, " + // "from Zelda in Temple of Time as adult, with differing requirements."); // SohImGui::EnhancementSliderInt("MDungeon Count: %d", "##RandoGanonDungeonCount", // "gRandomizeGanonDungeonCount", 0, 8, ""); // InsertHelpHoverText( - // "Set the number of completed dungeons required to\ntrigger the Light Arrow " - // "Cutscene.\n\nDungeons are considered complete when Link steps\ninto the " + // "Set the number of completed dungeons required to trigger the Light Arrow " + // "Cutscene.\nDungeons are considered complete when Link steps into the " // "blue warp at the end of them."); // break; // case 9: // SetLastItemHoverText( - // "These settings put the boss key on the Light Arrow\nCutscene location, " - // "from Zelda in Temple of Time as\nadult, with differing requirements."); + // "These settings put the boss key on the Light Arrow Cutscene location, " + // "from Zelda in Temple of Time as adult, with differing requirements."); // SohImGui::EnhancementSliderInt("Token Count: %d", "##RandoGanonTokenCount", // "gRandomizeGanonTokenCount", 0, 100, ""); - // InsertHelpHoverText("Set the number of Gold Skulltula Tokens required\nto trigger the " + // InsertHelpHoverText("Set the number of Gold Skulltula Tokens required to trigger the " // "Light Arrow Cutscene."); // break; } @@ -4342,82 +4327,82 @@ void DrawRandoEditor(bool& open) { // todo implement minigame repeat skip // // Skip Minigame repetition // SohImGui::EnhancementCheckbox("Skip Minigame Repetition", "gRandomizeSkipMinigameRepetition"); - // InsertHelpHoverText("Completing the second objective in the Dampe Race\nand Gerudo Archery on the " - // "first attempt will give\nboth rewards at once for that minigame."); + // InsertHelpHoverText("Completing the second objective in the Dampe Race and Gerudo Archery on the " + // "first attempt will give both rewards at once for that minigame."); // ImGui::Separator(); // todo implement free scarecrow (is this already in?) // // Free scarecrow // SohImGui::EnhancementCheckbox("Free Scarecrow", "gRandomizeFreeScarecrow"); // InsertHelpHoverText( - // "Pulling the Ocarina near a spot at which\nPierre can spawn will do so, without " - // "needing\nthe song."); + // "Pulling the Ocarina near a spot at which Pierre can spawn will do so, without " + // "needing the song."); // ImGui::Separator(); // todo implement skip poes (did we already?) // // Skip Four Poes cutscene // SohImGui::EnhancementCheckbox("Skip Four Poes Cutscene", "gRandomizeSkipFourPoesCutscene"); // InsertHelpHoverText( - // "The cutscene with the 4 poes in Forest Temple will\nbe skipped. If the cutscene " - // "is not skipped, it can\nbe exploited to reach the basement early."); + // "The cutscene with the 4 poes in Forest Temple will be skipped. If the cutscene " + // "is not skipped, it can be exploited to reach the basement early."); // ImGui::Separator(); // todo implement skip lake hylia owl // // Skip Lake Hylia owl // SohImGui::EnhancementCheckbox("Skip Lake Hylia Owl Cutscene", "gRandomizeSkipLakeHyliaOwl"); // InsertHelpHoverText( - // "The owl flight cutscene in Lake Hylia will be\nskipped. This cutscene lets you " - // "see what item\nis on top of the laboratory roof."); + // "The owl flight cutscene in Lake Hylia will be skipped. This cutscene lets you " + // "see what item is on top of the laboratory roof."); // ImGui::Separator(); // Cuccos to return SohImGui::EnhancementSliderInt("Cuccos to return: %d", "##RandoCuccosToReturn", "gRandomizeCuccosToReturn", 0, 7, "", 7); - InsertHelpHoverText("The cucco Lady will give a reward for returning\nthis many of her cuccos to the pen."); + InsertHelpHoverText("The cucco Lady will give a reward for returning this many of her cuccos to the pen."); ImGui::Separator(); // // Big Poe Target Count SohImGui::EnhancementSliderInt("Big Poe Target Count: %d", "##RandoBigPoeTargetCount", "gRandomizeBigPoeTargetCount", 1, 10, "", 10); - InsertHelpHoverText("The Poe buyer will give a reward for turning in\nthe chosen number of Big Poes."); + InsertHelpHoverText("The Poe buyer will give a reward for turning in the chosen number of Big Poes."); ImGui::Separator(); // // Skip child stealth SohImGui::EnhancementCheckbox("Skip Child Stealth", "gRandomizeSkipChildStealth"); - InsertHelpHoverText("The crawlspace into Hyrule Castle goes straight to\nZelda, skipping the guards."); + InsertHelpHoverText("The crawlspace into Hyrule Castle goes straight to Zelda, skipping the guards."); ImGui::Separator(); // Skip Epona race SohImGui::EnhancementCheckbox("Skip Epona Race", "gRandomizeSkipEponaRace"); - InsertHelpHoverText("Epona can be summoned with Epona's Song without\nneeding to race Ingo."); + InsertHelpHoverText("Epona can be summoned with Epona's Song without needing to race Ingo."); ImGui::Separator(); // Skip tower escape SohImGui::EnhancementCheckbox("Skip Tower Escape", "gRandomizeSkipTowerEscape"); - InsertHelpHoverText("The tower escape sequence between Ganondorf and\nGanon will be skipped."); + InsertHelpHoverText("The tower escape sequence between Ganondorf and Ganon will be skipped."); ImGui::Separator(); // todo implement complete mask quest // // Complete Mask Quest // SohImGui::EnhancementCheckbox("Complete Mask Quest", "gRandomizeCompleteMaskQuest"); // InsertHelpHoverText( - // "Once the Happy Mask Shop is opened, all masks\nwill be available to be borrowed."); + // "Once the Happy Mask Shop is opened, all masks will be available to be borrowed."); // ImGui::Separator(); // todo implement keep farores (in soh) // // Keep Farore's Wind Warp Point // SohImGui::EnhancementCheckbox("Keep Farore's Wind Warp Point", "gRandomizeKeepFaroresWindWarp"); // InsertHelpHoverText( - // "The Farore's Wind warp point will stay active\nafter having been warped to. The " - // "old point will\nneed to be dispelled before setting a new one."); + // "The Farore's Wind warp point will stay active after having been warped to.\nThe " + // "old point will need to be dispelled before setting a new one."); // ImGui::Separator(); // todo implement skip song replays (in soh) // // Skip Song Replays // ImGui::Text("Skip Song Replays"); // InsertHelpHoverText( - // "The automatic replay after you play a song will\nbe skipped.\nYou can choose to " - // "keep the SFX anyway, but you\nwill have control of Link during it."); + // "The automatic replay after you play a song will be skipped.\nYou can choose to " + // "keep the SFX anyway, but you will have control of Link during it."); // SohImGui::EnhancementCombobox("gRandomizeSkipSongReplays", randoSkipSongReplays, 3, 0); // ImGui::Separator(); @@ -4428,12 +4413,10 @@ void DrawRandoEditor(bool& open) { // Gossip Stone Hints ImGui::Text("Gossip Stone Hints"); InsertHelpHoverText( - "Gossip Stones can be made to give hints about\nwhere items can be found.\nDifferent settings " - "can " - "be chosen to decide which\nitem is needed to speak to Gossip Stones. Choosing\nto sticl with " - "the " - "Mask of Trutj will make the\nhints very difficult to obtain.\nHints for \"on the way of the " - "hero\" are locations\ntaht contain items that are required to beat the\ngame."); + "Gossip Stones can be made to give hints about where items can be found.\nDifferent settings can " + "be chosen to decide which item is needed to speak to Gossip Stones. \nChoosing to stick with the " + "Mask of Truth will make the hints very difficult to obtain.\nHints for \"on the way of the " + "hero\" are locations that contain items that are required to beat the game."); SohImGui::EnhancementCombobox("gRandomizeGossipStoneHints", randoGossipStoneHints, 4, 1); if (CVar_GetS32("gRandomizeGossipStoneHints", 1) != 0) { @@ -4443,18 +4426,18 @@ void DrawRandoEditor(bool& open) { switch (CVar_GetS32("gRandomizeHintClarity", 2)) { case 0: InsertHelpHoverText( - "Sets the difficulty of hints.\nObscure: Hints are unique for each thing, but\nthe " + "Sets the difficulty of hints.\nObscure: Hints are unique for each thing, but the " "writing may be confusing.\nEx: Kokiri Sword > a butter knife"); break; case 1: InsertHelpHoverText( "Sets the difficulty of hints.\nAmbiguous: Hints are clearly written, " - "but may\nrefer to more than one thing.\nEx: Kokiri Sword > a sword"); + "but may refer to more than one thing.\nEx: Kokiri Sword > a sword"); break; case 2: InsertHelpHoverText( "Sets the difficulty of hints.\nClear: Hints are clearly written and " - "are unique\nfor each thing.\nEx: Kokiri Sword > the Kokiri Sword"); + "are unique for each thing.\nEx: Kokiri Sword > the Kokiri Sword"); break; } SohImGui::EnhancementCombobox("gRandomizeHintClarity", randoHintClarity, 3, 2); @@ -4490,7 +4473,7 @@ void DrawRandoEditor(bool& open) { // todo implement starting time // // Starting Time // ImGui::Text("Starting Time"); - // InsertHelpHoverText("Change up Link's sleep routine."); + // InsertHelpHoverText("Change up Link's sleep routine."); // SohImGui::EnhancementCombobox("gRandomizeStartingTime", randoStartingTime, 2, 0); // ImGui::Separator(); @@ -4498,7 +4481,7 @@ void DrawRandoEditor(bool& open) { // // Chest Size and Color // ImGui::Text("Chest Size and Color"); // InsertHelpHoverText( - // "This option will change the appearance of all\nregular chests depending on their " + // "This option will change the appearance of all regular chests depending on their " // "contents:\nMajor Items = Big Wooden Chests\nLesser Items = Small Wooden " // "Chests\nBoss Keys = Big Fancy Chests\nSmall Keys = Small Fancy Chests"); // SohImGui::EnhancementCombobox("gRandomizeChestSizeAndColor", randoChestSizeAndColor, 2, 0); @@ -4509,11 +4492,11 @@ void DrawRandoEditor(bool& open) { // switch (CVar_GetS32("gRandomize", 0)) { // case 0: // InsertHelpHoverText( - // "All alternative traps will cause a small damage\nand no other negative effets."); + // "All alternative traps will cause small damage and no other negative effects."); // break; // case 1: - // InsertHelpHoverText("Some chest traps will burn your Deku Shield or\ncause a lot of damage " - // "(with one-hit protection)."); + // InsertHelpHoverText("Some chest traps will burn your Deku Shield or cause a lot of damage " + // "(with one-hit KO protection)."); // break; // case 2: // InsertHelpHoverText("All traps will be the base game ice trap."); @@ -4535,7 +4518,7 @@ void DrawRandoEditor(bool& open) { InsertHelpHoverText("Original item pool."); break; case 2: - InsertHelpHoverText("Some excess items are removed, including health\nupgrades."); + InsertHelpHoverText("Some excess items are removed, including health upgrades."); break; case 3: InsertHelpHoverText("Most excess items are removed."); @@ -4555,14 +4538,14 @@ void DrawRandoEditor(bool& open) { break; case 2: InsertHelpHoverText( - "Chance to add extra Ice Traps when junk items are\nadded to the item pool."); + "Chance to add extra Ice Traps when junk items are added to the item pool."); break; case 3: InsertHelpHoverText("All added junk items will be Ice Traps."); break; case 4: InsertHelpHoverText( - "All junk items will be replaced by Ice Traps, even\nthose in the base pool."); + "All junk items will be replaced by Ice Traps, even those in the base pool."); break; } SohImGui::EnhancementCombobox("gRandomizeIceTraps", randoIceTraps, 5, 1); @@ -4571,7 +4554,7 @@ void DrawRandoEditor(bool& open) { // todo implement double defense getitem // // Remove Double Defense // SohImGui::EnhancementCheckbox("Remove Double Defense", "gRandomizeRemoveDoubleDefense"); - // InsertHelpHoverText("If set the double defense item will be removed\nfrom the item pool for " + // InsertHelpHoverText("If set the double defense item will be removed from the item pool for " // "balanced and plentiful."); // ImGui::Separator(); @@ -4579,8 +4562,8 @@ void DrawRandoEditor(bool& open) { // // Prog Goron Sword // SohImGui::EnhancementCheckbox("Prog Goron Sword", "gRandomizeProgGoronSword"); // InsertHelpHoverText( - // "Giant's Knife will walays be found before Biggoron's\nSword. Medigoron only " - // "starts selling new knives\nonce the Giant's Knife has been found\nand broken."); + // "Giant's Knife will always be found before Biggoron's Sword.\nMedigoron only " + // "starts selling new knives once the Giant's Knife has been found and broken."); // ImGui::Separator(); ImGui::PopItemWidth(); ImGui::EndTable(); diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index 3e7756e344..2dcef684c2 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -985,7 +985,7 @@ void DrawItemTracker(bool& open) { } SohImGui::EnhancementCheckbox("Display \"Ammo/MaxAmo\"", "gItemTrackerAmmoDisplay"); SohImGui::EnhancementCheckbox("Randomizer colors for Songs", "gItemTrackeSongColor"); - SohImGui::Tooltip("Will dispaly non-warp songs with randomizer\ncolors instead of pure white"); + SohImGui::Tooltip("Will display non-warp songs with randomizer colors instead of pure white"); SohImGui::EnhancementSliderInt("Icon size : %dpx", "##ITEMTRACKERICONSIZE", "gRandoTrackIconSize", 32, 128, ""); SohImGui::EnhancementSliderInt("X spacing : %dpx", "##ITEMTRACKERSPACINGX", "gRandoTrackIconSpacingX", minimalSpacingX, 256, From 206f63f9e6ac7f6aabf78789e3b9f48bc5761fad Mon Sep 17 00:00:00 2001 From: InfoManiac742 <26778801+InfoManiac742@users.noreply.github.com> Date: Sun, 31 Jul 2022 18:48:43 -0700 Subject: [PATCH 06/42] Fix build link in README (#944) Currently leads to a 404 page since there's no longer a branch called "develop", I've just sent it to the main page for the builds site --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index baae758c96..48faf9d074 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ Refer to the [building instructions](BUILDING.md) to compile SoH. - Confirm that `zapd.exe` exists in the `/assets/extractor` folder ## Nightly Builds -Nightly builds of Ship of Harkinian are available [here](https://builds.shipofharkinian.com/job/SoH_Multibranch/job/develop) +Nightly builds of Ship of Harkinian are available [here](https://builds.shipofharkinian.com/) ## The Harbour Masters Are... From a1ed35e5bde7392ab94f113c60864960251d9e72 Mon Sep 17 00:00:00 2001 From: KiritoDev <36680385+KiritoDv@users.noreply.github.com> Date: Sun, 31 Jul 2022 20:49:54 -0500 Subject: [PATCH 07/42] Fixed slowdown on dodongo (#945) * Fixed slowdown on dodongo * Invalidate only works on pc * Added todo comment --- soh/src/overlays/actors/ovl_Boss_Dodongo/z_boss_dodongo.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/soh/src/overlays/actors/ovl_Boss_Dodongo/z_boss_dodongo.c b/soh/src/overlays/actors/ovl_Boss_Dodongo/z_boss_dodongo.c index 37105d0408..721fcf51c8 100644 --- a/soh/src/overlays/actors/ovl_Boss_Dodongo/z_boss_dodongo.c +++ b/soh/src/overlays/actors/ovl_Boss_Dodongo/z_boss_dodongo.c @@ -1697,7 +1697,10 @@ void BossDodongo_DrawEffects(GlobalContext* globalCtx) { func_80093D84(globalCtx->state.gfxCtx); unkMtx = &globalCtx->billboardMtxF; + // OTRTODO: This call causes the whole texture cache to be cleaned up, which causes an important slowdown on switch so we need to find a way to avoid it. +#ifndef __SWITCH__ gSPInvalidateTexCache(POLY_XLU_DISP++, 0); +#endif for (i = 0; i < 80; i++, eff++) { if (eff->unk_24 == 1) { From d648c7275c1a63d0fd15eb8229231c5ad5cc96f9 Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Sun, 31 Jul 2022 20:51:36 -0500 Subject: [PATCH 08/42] Hide Dpad in minimal UI (#955) --- soh/src/code/z_parameter.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index 40f2c2678f..44d529587a 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -4745,12 +4745,14 @@ void Interface_Draw(GlobalContext* globalCtx) { } else { gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, dpadAlpha); } - gDPLoadTextureBlock(OVERLAY_DISP++, ResourceMgr_LoadFileRaw("assets/ship_of_harkinian/buttons/dpad.bin"), - G_IM_FMT_IA, G_IM_SIZ_16b, 32, 32, 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); - gSPWideTextureRectangle(OVERLAY_DISP++, DpadPosX << 2, DpadPosY << 2, - (DpadPosX + 32) << 2, (DpadPosY + 32) << 2, - G_TX_RENDERTILE, 0, 0, (1 << 10), (1 << 10)); + if (fullUi) { + gDPLoadTextureBlock(OVERLAY_DISP++, ResourceMgr_LoadFileRaw("assets/ship_of_harkinian/buttons/dpad.bin"), + G_IM_FMT_IA, G_IM_SIZ_16b, 32, 32, 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); + gSPWideTextureRectangle(OVERLAY_DISP++, DpadPosX << 2, DpadPosY << 2, + (DpadPosX + 32) << 2, (DpadPosY + 32) << 2, + G_TX_RENDERTILE, 0, 0, (1 << 10), (1 << 10)); + } // DPad-Up Button Icon & Ammo Count if (gSaveContext.equips.buttonItems[4] < 0xF0) { From 4f29833476817a91b40da1177d2815e775f91537 Mon Sep 17 00:00:00 2001 From: Kenix3 Date: Sun, 31 Jul 2022 21:52:10 -0400 Subject: [PATCH 09/42] Adds beta quest Gameshark cheat. (#975) * Adds beta quest Gameshark cheat. * Fixes issue where lus was including a function from soh. * Limits beta quest to 0-8 --- libultraship/libultraship/ImGuiImpl.cpp | 79 +++++++++++++++++++++++++ libultraship/libultraship/ImGuiImpl.h | 12 ++++ soh/src/code/z_common_data.c | 2 +- soh/src/code/z_play.c | 4 +- 4 files changed, 95 insertions(+), 2 deletions(-) diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index ea779b677d..e01026b10c 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -68,6 +68,13 @@ OSContPad* pads; std::map DefaultAssets; std::vector emptyArgs; +bool isBetaQuestEnabled = false; + +extern "C" { + void enableBetaQuest() { isBetaQuestEnabled = true; } + void disableBetaQuest() { isBetaQuestEnabled = false; } +} + namespace SohImGui { WindowImpl impl; @@ -1404,6 +1411,78 @@ namespace SohImGui { EnhancementCheckbox("Shield with Two-Handed Weapons", "gShieldTwoHanded"); Tooltip("This allows you to put up your shield with any two-handed weapon in hand except for Deku Sticks"); + { + static int32_t betaQuestEnabled = CVar_GetS32("gEnableBetaQuest", 0); + static int32_t lastBetaQuestEnabled = betaQuestEnabled; + static int32_t betaQuestWorld = CVar_GetS32("gBetaQuestWorld", 0xFFEF); + static int32_t lastBetaQuestWorld = betaQuestWorld; + + if (!isBetaQuestEnabled) { + ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); + ImGui::PushStyleVar(ImGuiStyleVar_Alpha, ImGui::GetStyle().Alpha * 0.5f); + } + + EnhancementCheckbox("Enable Beta Quest", "gEnableBetaQuest"); + Tooltip("Turns on OoT Beta Quest. *WARNING* This will reset your game."); + betaQuestEnabled = CVar_GetS32("gEnableBetaQuest", 0); + if (betaQuestEnabled) { + if (betaQuestEnabled != lastBetaQuestEnabled) { + betaQuestWorld = 0; + } + + ImGui::Text("Beta Quest World: %d", betaQuestWorld); + + if (ImGui::Button(" - ##BetaQuest")) { + betaQuestWorld--; + } + ImGui::SameLine(); + ImGui::SetCursorPosX(ImGui::GetCursorPosX() - 7.0f); + + ImGui::SliderInt("##BetaQuest", &betaQuestWorld, 0, 8, "", ImGuiSliderFlags_AlwaysClamp); + Tooltip("Set the Beta Quest world to explore. *WARNING* Changing this will reset your game.\nCtrl+Click to type in a value."); + + ImGui::Text("After Slider Beta Quest World: %d", betaQuestWorld); + + + ImGui::SameLine(); + ImGui::SetCursorPosX(ImGui::GetCursorPosX() - 7.0f); + if (ImGui::Button(" + ##BetaQuest")) { + betaQuestWorld++; + } + + if (betaQuestWorld > 8) { + betaQuestWorld = 8; + } + else if (betaQuestWorld < 0) { + betaQuestWorld = 0; + } + + ImGui::Text("After Clamp Beta Quest World: %d", betaQuestWorld); + } + else { + lastBetaQuestWorld = betaQuestWorld = 0xFFEF; + CVar_SetS32("gBetaQuestWorld", betaQuestWorld); + needs_save = true; + } + if (betaQuestEnabled != lastBetaQuestEnabled || betaQuestWorld != lastBetaQuestWorld) + { + // Reset the game if the beta quest state or world changed because beta quest happens on redirecting the title screen cutscene. + lastBetaQuestEnabled = betaQuestEnabled; + lastBetaQuestWorld = betaQuestWorld; + CVar_SetS32("gEnableBetaQuest", betaQuestEnabled); + CVar_SetS32("gBetaQuestWorld", betaQuestWorld); + + console->Commands["reset"].handler(emptyArgs); + + needs_save = true; + } + + if (!isBetaQuestEnabled) { + ImGui::PopItemFlag(); + ImGui::PopStyleVar(); + } + } + ImGui::EndMenu(); } diff --git a/libultraship/libultraship/ImGuiImpl.h b/libultraship/libultraship/ImGuiImpl.h index eb007efeb7..01235d4112 100644 --- a/libultraship/libultraship/ImGuiImpl.h +++ b/libultraship/libultraship/ImGuiImpl.h @@ -1,5 +1,15 @@ #pragma once +#ifdef __cplusplus +extern "C" { +#endif + void enableBetaQuest(); + void disableBetaQuest(); +#ifdef __cplusplus +} +#endif + +#ifdef __cplusplus #include "GameOverlay.h" #include "Lib/ImGui/imgui.h" #include "Console.h" @@ -97,3 +107,5 @@ namespace SohImGui { std::string BreakTooltip(const char* text, int lineLength = 60); std::string BreakTooltip(const std::string& text, int lineLength = 60); } + +#endif \ No newline at end of file diff --git a/soh/src/code/z_common_data.c b/soh/src/code/z_common_data.c index c92a36b71c..53334fb842 100644 --- a/soh/src/code/z_common_data.c +++ b/soh/src/code/z_common_data.c @@ -8,7 +8,7 @@ void SaveContext_Init(void) { gSaveContext.seqId = (u8)NA_BGM_DISABLED; gSaveContext.natureAmbienceId = NATURE_ID_DISABLED; gSaveContext.forcedSeqId = NA_BGM_GENERAL_SFX; - gSaveContext.nextCutsceneIndex = 0xFFEF; + gSaveContext.nextCutsceneIndex = CVar_GetS32("gBetaQuestWorld", 0xFFEF); gSaveContext.cutsceneTrigger = 0; gSaveContext.chamberCutsceneNum = 0; gSaveContext.nextDayTime = 0xFFFF; diff --git a/soh/src/code/z_play.c b/soh/src/code/z_play.c index 5656f4c07e..763ed1ee85 100644 --- a/soh/src/code/z_play.c +++ b/soh/src/code/z_play.c @@ -4,7 +4,7 @@ #include #include "soh/Enhancements/gameconsole.h" - +#include "../libultraship/ImGuiImpl.h" #include "soh/frame_interpolation.h" void* D_8012D1F0 = NULL; @@ -190,6 +190,7 @@ void Gameplay_Destroy(GameState* thisx) { KaleidoManager_Destroy(); ZeldaArena_Cleanup(); Fault_RemoveClient(&D_801614B8); + disableBetaQuest(); gGlobalCtx = NULL; } @@ -260,6 +261,7 @@ void GivePlayerRandoRewardSariaGift(GlobalContext* globalCtx, RandomizerCheck ch void Gameplay_Init(GameState* thisx) { GlobalContext* globalCtx = (GlobalContext*)thisx; GraphicsContext* gfxCtx = globalCtx->state.gfxCtx; + enableBetaQuest(); gGlobalCtx = globalCtx; //globalCtx->state.gfxCtx = NULL; uintptr_t zAlloc; From 8c25e9a9921f3b8414d1b46c9962a94b68d42f99 Mon Sep 17 00:00:00 2001 From: aMannus Date: Mon, 1 Aug 2022 03:54:26 +0200 Subject: [PATCH 10/42] Added line break (#958) --- soh/soh/Enhancements/randomizer/3drando/hint_list.cpp | 2 +- soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp index 19329675af..11fd2b441b 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp @@ -2102,7 +2102,7 @@ void HintTable_Init() { hintTable[GANON_LINE07] = HintText::GanonLine({ //obscure text - Text{"What about Zelda makes you think she'd be a better ruler than I?^I saved Lon Lon Ranch,&fed the hungry,&and my castle floats.", + Text{"What about Zelda makes you think&she'd be a better ruler than I?^I saved Lon Lon Ranch,&fed the hungry,&and my castle floats.", /*french*/"Zelda ne sera jamais un meilleur monarque que moi!^J'ai un château volant, mes sujets sont des belles amazones... et mes Moblins sont clairement plus puissants que jamais!", /*spanish*/"¿Qué te hace pensar que Zelda gobierna mejor que yo?^Yo he salvado el Rancho Lon Lon,&he alimentado a los hambrientos&y hasta hago que mi castillo flote."}, }); diff --git a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp index c64134fbc2..06aef47802 100644 --- a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp @@ -579,7 +579,7 @@ std::string AutoFormatHintTextString(std::string unformattedHintTextString) { bool needsAutomaicNewlines = true; if (textStr == "Erreur 0x69a504:&Traduction manquante^C'est de la faute à Purple Hato!&J'vous jure!" || textStr == "Mon très cher @:&Viens vite au château, je t'ai préparé&un délicieux gâteau...^À bientôt, Princesse Zelda" || - textStr == "What about Zelda makes you think she'd be a better ruler than I?^I saved Lon Lon Ranch,&fed the hungry,&and my castle floats." || + textStr == "What about Zelda makes you think&she'd be a better ruler than I?^I saved Lon Lon Ranch,&fed the hungry,&and my castle floats." || textStr == "Many tricks are up my sleeve,&to save yourself&you'd better leave!" || textStr == "I've learned this spell,&it's really neat,&I'll keep it later&for your treat!" || textStr == "Sale petit garnement,&tu fais erreur!&C'est maintenant que marque&ta dernière heure!" || From b59c9cdf02f1b989235d73d562ed1a94a943d890 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 31 Jul 2022 21:57:30 -0400 Subject: [PATCH 11/42] Randomizer: Fixes LACS and Prelude checks under certain conditions (#961) * Prevents LACS flag from getting set when it shouldn't be. * Fixes Prelude and LACS checks so they apply immediately if missed. * Refactors the scene-flag-setting code into its own function. * Renames new enums and props to be clearer and not specific to scene flags. * Refactors pendingFlag data into a separate struct. --- soh/include/z64player.h | 18 ++++++++++-- soh/src/code/z_play.c | 5 ++-- soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c | 6 ++-- .../actors/ovl_player_actor/z_player.c | 28 +++++++++++++++++++ 4 files changed, 51 insertions(+), 6 deletions(-) diff --git a/soh/include/z64player.h b/soh/include/z64player.h index 954c36c142..3c2c7c3cda 100644 --- a/soh/include/z64player.h +++ b/soh/include/z64player.h @@ -356,7 +356,20 @@ typedef struct { /* 0x00 */ s32 active; /* 0x04 */ Vec3f tip; /* 0x10 */ Vec3f base; -} WeaponInfo; // size = 0x1C +} WeaponInfo; // size = 0x1C\ + +typedef enum { + FLAG_NONE, + FLAG_SCENE_SWITCH, + FLAG_SCENE_TREASURE, + FLAG_SCENE_CLEAR, + FLAG_SCENE_COLLECTIBLE, +} FlagType; + +typedef struct { + /* 0x00 */ s32 flagID; // which flag to set when Player_SetPendingFlag is called + /* 0x04 */ FlagType flagType; // type of flag to set when Player_SetPendingFlag is called +} PendingFlag; // size = 0x06 #define PLAYER_STATE1_0 (1 << 0) #define PLAYER_STATE1_1 (1 << 1) @@ -612,6 +625,7 @@ typedef struct Player { /* 0x0A86 */ s8 unk_A86; /* 0x0A87 */ u8 unk_A87; /* 0x0A88 */ Vec3f unk_A88; // previous body part 0 position -} Player; // size = 0xA94 + /* 0x0A94 */ PendingFlag pendingFlag; +} Player; // size = 0xAA0 #endif diff --git a/soh/src/code/z_play.c b/soh/src/code/z_play.c index 5656f4c07e..7c9db98375 100644 --- a/soh/src/code/z_play.c +++ b/soh/src/code/z_play.c @@ -237,10 +237,11 @@ void GivePlayerRandoRewardZeldaLightArrowsGift(GlobalContext* globalCtx, Randomi if (CHECK_QUEST_ITEM(QUEST_MEDALLION_SPIRIT) && CHECK_QUEST_ITEM(QUEST_MEDALLION_SHADOW) && LINK_IS_ADULT && (gEntranceTable[((void)0, gSaveContext.entranceIndex)].scene == SCENE_TOKINOMA) && !Flags_GetTreasure(globalCtx, 0x1E) && player != NULL && !Player_InBlockingCsMode(globalCtx, player) && - globalCtx->sceneLoadFlag == 0 && player->getItemId == GI_NONE) { + globalCtx->sceneLoadFlag == 0) { GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_ARROW_LIGHT); GiveItemWithoutActor(globalCtx, getItemId); - Flags_SetTreasure(globalCtx, 0x1E); + player->pendingFlag.flagID = 0x1E; + player->pendingFlag.flagType = FLAG_SCENE_TREASURE; } } diff --git a/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c b/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c index 88ce05819f..d9f96e1774 100644 --- a/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c +++ b/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c @@ -288,14 +288,16 @@ void func_80B3CA38(EnXc* this, GlobalContext* globalCtx) { } void GivePlayerRandoRewardSheikSong(EnXc* sheik, GlobalContext* globalCtx, RandomizerCheck check, int sheikType, GetItemID ogSongId) { - if (sheik->actor.parent != NULL && sheik->actor.parent->id == GET_PLAYER(globalCtx)->actor.id && + Player* player = GET_PLAYER(globalCtx); + if (sheik->actor.parent != NULL && sheik->actor.parent->id == player->actor.id && !(gSaveContext.eventChkInf[5] & sheikType)) { gSaveContext.eventChkInf[5] |= sheikType; } else if (!(gSaveContext.eventChkInf[5] & sheikType)) { GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, ogSongId); if (check == RC_SHEIK_AT_TEMPLE && !Flags_GetTreasure(globalCtx, 0x1F)) { if (func_8002F434(&sheik->actor, globalCtx, getItemId, 10000.0f, 100.0f)) { - Flags_SetTreasure(globalCtx, 0x1F); + player->pendingFlag.flagID = 0x1F; + player->pendingFlag.flagType = FLAG_SCENE_TREASURE; } } else if (check != RC_SHEIK_AT_TEMPLE) { func_8002F434(&sheik->actor, globalCtx, getItemId, 10000.0f, 100.0f); 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 1f1d09a8db..2c3b3d61b3 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -167,6 +167,7 @@ void func_8083CA20(GlobalContext* globalCtx, Player* this); void func_8083CA54(GlobalContext* globalCtx, Player* this); void func_8083CA9C(GlobalContext* globalCtx, Player* this); s32 func_8083E0FC(Player* this, GlobalContext* globalCtx); +void Player_SetPendingFlag(Player* this, GlobalContext* globalCtx); s32 func_8083E5A8(Player* this, GlobalContext* globalCtx); s32 func_8083EB44(Player* this, GlobalContext* globalCtx); s32 func_8083F7BC(Player* this, GlobalContext* globalCtx); @@ -6231,6 +6232,30 @@ void func_8083E4C4(GlobalContext* globalCtx, Player* this, GetItemEntry* giEntry func_80078884((this->getItemId < 0) ? NA_SE_SY_GET_BOXITEM : NA_SE_SY_GET_ITEM); } +// Sets a flag according to which type of flag is specified in player->pendingFlag.flagType +// and which flag is specified in player->pendingFlag.flagID. +void Player_SetPendingFlag(Player* this, GlobalContext* globalCtx) { + switch (this->pendingFlag.flagType) { + case FLAG_SCENE_CLEAR: + Flags_SetClear(globalCtx, this->pendingFlag.flagID); + break; + case FLAG_SCENE_COLLECTIBLE: + Flags_SetCollectible(globalCtx, this->pendingFlag.flagID); + break; + case FLAG_SCENE_SWITCH: + Flags_SetSwitch(globalCtx, this->pendingFlag.flagID); + break; + case FLAG_SCENE_TREASURE: + Flags_SetTreasure(globalCtx, this->pendingFlag.flagID); + break; + case FLAG_NONE: + default: + break; + } + this->pendingFlag.flagType = FLAG_NONE; + this->pendingFlag.flagID = 0; +} + s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) { Actor* interactedActor; @@ -6254,6 +6279,7 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) { this->stateFlags1 &= ~(PLAYER_STATE1_10 | PLAYER_STATE1_11); this->actor.colChkInfo.damage = 0; func_80837C0C(globalCtx, this, 3, 0.0f, 0.0f, 0, 20); + Player_SetPendingFlag(this, globalCtx); return; } @@ -12659,6 +12685,8 @@ s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) { Message_StartTextbox(globalCtx, giEntry->textId, &this->actor); Item_Give(globalCtx, giEntry->itemId); + + Player_SetPendingFlag(this, globalCtx); if (((this->getItemId >= GI_RUPEE_GREEN) && (this->getItemId <= GI_RUPEE_RED)) || ((this->getItemId >= GI_RUPEE_PURPLE) && (this->getItemId <= GI_RUPEE_GOLD)) || From d332c3d9d6d63e58bac9c0406f8a5d3d927fa757 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 31 Jul 2022 21:58:13 -0400 Subject: [PATCH 12/42] Randomizer Allows Skull Kid to accept Mask after receiving an ice trap. (#963) * Allows Skull Kid to accept Mask after receiving an ice trap. * Extracts obscure rando check into a clearly named function. * Fixes missing semicolon... --- soh/soh/OTRGlobals.cpp | 4 ++++ soh/soh/OTRGlobals.h | 1 + soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 6a1ecc1980..05c572bf3b 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1501,3 +1501,7 @@ extern "C" s32 Randomizer_GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 a extern "C" s32 Randomizer_GetItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId) { return OTRGlobals::Instance->gRandomizer->GetRandomizedItemIdFromKnownCheck(randomizerCheck, ogId); } + +extern "C" bool Randomizer_ItemIsIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId) { + return gSaveContext.n64ddFlag && Randomizer_GetItemIdFromKnownCheck(randomizerCheck, ogId) == GI_ICE_TRAP; +} diff --git a/soh/soh/OTRGlobals.h b/soh/soh/OTRGlobals.h index 2bee6819de..90efaf8c4e 100644 --- a/soh/soh/OTRGlobals.h +++ b/soh/soh/OTRGlobals.h @@ -97,6 +97,7 @@ s16 Randomizer_GetItemModelFromId(s16 itemId); s32 Randomizer_GetItemIDFromGetItemID(s32 getItemId); s32 Randomizer_GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum); s32 Randomizer_GetItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId); +bool Randomizer_ItemIsIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId); #endif #endif diff --git a/soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c b/soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c index 859afb4063..2d42c191ec 100644 --- a/soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c +++ b/soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c @@ -1059,7 +1059,7 @@ void EnSkj_SetupPostSariasSong(EnSkj* this) { } void EnSkj_ChangeModeAfterSong(EnSkj* this, GlobalContext* globalCtx) { - if ((Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_DONE) && Message_ShouldAdvance(globalCtx)) { + if (((Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_DONE) && Message_ShouldAdvance(globalCtx)) || Randomizer_ItemIsIceTrap(RC_LW_SKULL_KID, GI_HEART_PIECE)) { gSaveContext.itemGetInf[1] |= 0x40; EnSkj_SetNaviId(this); EnSkj_SetupWaitInRange(this); From b4f4e36acbfb4e0862624b0fa53c1ab28b479b9e Mon Sep 17 00:00:00 2001 From: David Chavez Date: Mon, 1 Aug 2022 04:08:10 +0200 Subject: [PATCH 13/42] [macos] Disable buggy resolution scaling (#982) --- libultraship/libultraship/ImGuiImpl.cpp | 4 +++- libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index 0e2a4b1392..743ca7ab21 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -859,10 +859,12 @@ namespace SohImGui { if (ImGui::BeginMenu("Graphics")) { +#ifndef __APPLE__ EnhancementSliderFloat("Internal Resolution: %d %%", "##IMul", "gInternalResolution", 0.5f, 2.0f, "", 1.0f, true); Tooltip("Multiplies your output resolution by the value inputted,\nas a more intensive but effective form of anti-aliasing"); gfx_current_dimensions.internal_mul = CVar_GetFloat("gInternalResolution", 1); - EnhancementSliderInt("MSAA: %d", "##IMSAA", "gMSAAValue", 1, 8, ""); +#endif + EnhancementSliderInt("MSAA: %d", "##IMSAA", "gMSAAValue", 1, 8, "", 1, true); Tooltip("Activates multi-sample anti-aliasing when above 1x\nup to 8x for 8 samples for every pixel"); gfx_msaa_level = CVar_GetS32("gMSAAValue", 1); diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp index 0a04c9580f..e5c041f173 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp @@ -2651,7 +2651,11 @@ void gfx_init(struct GfxWindowManagerAPI *wapi, struct GfxRenderingAPI *rapi, co gfx_wapi->init(game_name, start_in_fullscreen, width, height); gfx_rapi->init(); gfx_rapi->update_framebuffer_parameters(0, width, height, 1, false, true, true, true); +#ifdef __APPLE__ + gfx_current_dimensions.internal_mul = 1; +#else gfx_current_dimensions.internal_mul = CVar_GetFloat("gInternalResolution", 1); +#endif gfx_msaa_level = CVar_GetS32("gMSAAValue", 1); gfx_current_dimensions.width = width; gfx_current_dimensions.height = height; @@ -2870,4 +2874,4 @@ uint16_t gfx_get_pixel_depth(float x, float y) { get_pixel_depth_pending.clear(); return get_pixel_depth_cached.find(make_pair(x, y))->second; -} \ No newline at end of file +} From 9389ceb8c12c3e9d29b3e6428eb2ff07791d59ed Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Sun, 31 Jul 2022 21:09:30 -0500 Subject: [PATCH 14/42] Speed up lifting silver rocks and obelisks by 5x (#953) * Speed up lifting silver rocks and obelisks by 3x * Increase rock lifting speed to 5x * Fix bug that sped up picking up small rocks, grass, bombflowers * Add enhancement checkbox for faster block lifting and reduced speed to 3x --- libultraship/libultraship/ImGuiImpl.cpp | 2 ++ soh/src/code/z_onepointdemo.c | 19 +++++++++++++++++++ soh/src/code/z_onepointdemo_data.inc | 6 +++--- .../actors/ovl_player_actor/z_player.c | 6 +++++- 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index e01026b10c..c3dc8e23fd 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -990,6 +990,8 @@ namespace SohImGui { EnhancementSliderInt("Vine/Ladder Climb speed +%d", "##CLIMBSPEED", "gClimbSpeed", 0, 12, ""); EnhancementCheckbox("Faster Block Push", "gFasterBlockPush"); + EnhancementCheckbox("Faster Heavy Block Lift", "gFasterHeavyBlockLift"); + Tooltip("Speeds up lifting silver rocks and obelisks"); EnhancementCheckbox("No Forced Navi", "gNoForcedNavi"); Tooltip("Prevent forced Navi conversations"); EnhancementCheckbox("No Skulltula Freeze", "gSkulltulaFreeze"); diff --git a/soh/src/code/z_onepointdemo.c b/soh/src/code/z_onepointdemo.c index 5dcdeb2e4a..2fd692da81 100644 --- a/soh/src/code/z_onepointdemo.c +++ b/soh/src/code/z_onepointdemo.c @@ -1041,18 +1041,37 @@ s32 OnePointCutscene_SetInfo(GlobalContext* globalCtx, s16 camIdx, s16 csId, Act func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C); break; case 4020: + if (CVar_GetS32("gFasterHeavyBlockLift", 0)) { + D_8012368C[0].timerInit *= (1.0f / 3.0f); + D_8012368C[1].timerInit *= (1.0f / 3.0f); + D_8012368C[2].timerInit *= (1.0f / 3.0f); + D_8012368C[3].timerInit *= (1.0f / 3.0f); + } csInfo->keyFrames = D_8012368C; csInfo->keyFrameCnt = 4; func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C); break; case 4021: + if (CVar_GetS32("gFasterHeavyBlockLift", 0)) { + D_8012372C[0].timerInit *= (1.0f / 3.0f); + D_8012372C[1].timerInit *= (1.0f / 3.0f); + D_8012372C[2].timerInit *= (1.0f / 3.0f); + D_8012372C[3].timerInit *= (1.0f / 3.0f); + } csInfo->keyFrames = D_8012372C; csInfo->keyFrameCnt = 4; func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C); break; case 4022: + if (CVar_GetS32("gFasterHeavyBlockLift", 0)) { + D_801237CC[0].timerInit *= (1.0f / 3.0f); + D_801237CC[1].timerInit *= (1.0f / 3.0f); + D_801237CC[2].timerInit *= (1.0f / 3.0f); + D_801237CC[3].timerInit *= (1.0f / 3.0f); + D_801237CC[4].timerInit *= (1.0f / 3.0f); + } csCam->timer = D_801237CC[0].timerInit + D_801237CC[3].timerInit + D_801237CC[1].timerInit + D_801237CC[2].timerInit + D_801237CC[4].timerInit; diff --git a/soh/src/code/z_onepointdemo_data.inc b/soh/src/code/z_onepointdemo_data.inc index 2488be71b3..216340f40a 100644 --- a/soh/src/code/z_onepointdemo_data.inc +++ b/soh/src/code/z_onepointdemo_data.inc @@ -624,21 +624,21 @@ static OnePointCsFull D_801235C4[5] = { { 0x12, 0xFF, 0x0000, 1, 0, 60.0f, 1.0f, { -1.0f, -1.0f, -1.0f }, { -1.0f, -1.0f, -1.0f } }, }; -static OnePointCsFull D_8012368C[4] = { +OnePointCsFull D_8012368C[4] = { { 0x0F, 0xFF, 0x0101, 10, 0, 60.0f, 1.0f, { -1110.0f, -180.0f, -840.0f }, { -985.0f, -220.0f, -840.0f } }, { 0x02, 0xFF, 0x0101, 70, -45, 75.0f, 1.0f, { -1060.0f, -160.0f, -840.0f }, { -1005.0f, -230.0f, -840.0f } }, { 0x0F, 0xFF, 0x0000, 10, -45, 75.0f, 1.0f, { -1.0f, -1.0f, -1.0f }, { -1.0f, -1.0f, -1.0f } }, { 0x0F, 0xFF, 0x0101, 180, 9, 80.0f, 1.0f, { -1205.0f, -175.0f, -840.0f }, { -1305.0f, -230.0f, -828.0f } }, }; -static OnePointCsFull D_8012372C[4] = { +OnePointCsFull D_8012372C[4] = { { 0x0F, 0xFF, 0x0142, 10, 0, 70.0f, 1.0f, { 0.0f, 80.0f, 0.0f }, { -1650.0f, 200.0f, -2920.0f } }, { 0x02, 0xFF, 0x0142, 110, -2, 50.0f, 0.5f, { 0.0f, 150.0f, 0.0f }, { -1320.0f, 170.0f, -2900.0f } }, { 0x0B, 0xFF, 0x4242, 100, 2, 70.0f, 0.1f, { 0.0f, 150.0f, 50.0f }, { -1.0f, -1.0f, -1.0f } }, { 0x03, 0xFF, 0x4242, 60, 2, 45.0f, 0.01f, { 0.0f, 150.0f, 50.0f }, { 0.0f, 200.0f, -80.0f } }, }; -static OnePointCsFull D_801237CC[5] = { +OnePointCsFull D_801237CC[5] = { { 0x8F, 0xFF, 0x4242, 20, 0, 50.0f, 1.0f, { 0.0f, 50.0f, -10.0f }, { 0.0f, 0.0f, 100.0f } }, { 0x0A, 0xFF, 0x0101, 80, 0, 75.0f, 1.0f, { 2900.0f, 1300.0f, 530.0f }, { 2800.0f, 1190.0f, 540.0f } }, { 0x0F, 0xFF, 0x0000, 10, 0, 75.0f, 1.0f, { -1.0f, -1.0f, -1.0f }, { -1.0f, -1.0f, -1.0f } }, 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 306a460d33..844e301a90 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -4648,7 +4648,11 @@ void func_8083A0F4(GlobalContext* globalCtx, Player* this) { anim = D_80853914[PLAYER_ANIMGROUP_13][this->modelAnimType]; } - func_80832264(globalCtx, this, anim); + if (CVar_GetS32("gFasterHeavyBlockLift", 0) && interactActorId == ACTOR_BG_HEAVY_BLOCK) { + LinkAnimation_PlayOnceSetSpeed(globalCtx, &this->skelAnime, anim, 3.0f); + } else { + LinkAnimation_PlayOnce(globalCtx, &this->skelAnime, anim); + } } } else { From 4ed82c71dc9e24748cb06a6c70f4d52e87372ecc Mon Sep 17 00:00:00 2001 From: David Chavez Date: Mon, 1 Aug 2022 09:18:48 +0200 Subject: [PATCH 15/42] Fix c++20 clang issue --- soh/soh/Enhancements/debugconsole.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/debugconsole.cpp b/soh/soh/Enhancements/debugconsole.cpp index 85a8c3829f..ba866b0624 100644 --- a/soh/soh/Enhancements/debugconsole.cpp +++ b/soh/soh/Enhancements/debugconsole.cpp @@ -529,7 +529,7 @@ void DebugConsole_LoadLegacyCVars() { if (cfg[1].find("\"") == std::string::npos && (cfg[1].find("#") != std::string::npos)) { std::string value(cfg[1]); - value.erase(std::ranges::remove(value, '#').begin(), value.end()); + value.erase(std::remove_if(value.begin(), value.end(), [](char c) { return c == '#'; }), value.end()); auto splitTest = StringHelper::Split(value, "\r")[0]; uint32_t val = std::stoul(splitTest, nullptr, 16); From 61c68666d622bddf1c8964cb3160ce5d0198af74 Mon Sep 17 00:00:00 2001 From: David Chavez Date: Tue, 2 Aug 2022 16:22:20 +0200 Subject: [PATCH 16/42] Closer align Makefiles & Dockerfiles (#748) --- .ci/switch/buildswitch.bash | 11 --- BUILDING.md | 7 -- Dockerfile | 81 +++++++++++-------- Dockerfile.switch | 58 ------------- Jenkinsfile | 19 +++-- ZAPDTR/Makefile | 18 +++-- libultraship/Makefile | 7 +- .../linux/build-appimage.sh | 2 +- scripts/linux/build.sh | 11 +++ {appimage => scripts/linux}/soh.desktop | 0 {appimage => scripts/linux}/soh.sh | 0 scripts/switch/build.sh | 4 + soh/Makefile | 69 +++++++--------- soh/include/z64.h | 2 +- .../Enhancements/debugger/debugSaveEditor.cpp | 2 +- 15 files changed, 116 insertions(+), 175 deletions(-) delete mode 100755 .ci/switch/buildswitch.bash delete mode 100644 Dockerfile.switch rename appimage/appimage.sh => scripts/linux/build-appimage.sh (96%) create mode 100755 scripts/linux/build.sh rename {appimage => scripts/linux}/soh.desktop (100%) rename {appimage => scripts/linux}/soh.sh (100%) create mode 100755 scripts/switch/build.sh diff --git a/.ci/switch/buildswitch.bash b/.ci/switch/buildswitch.bash deleted file mode 100755 index 032b19157c..0000000000 --- a/.ci/switch/buildswitch.bash +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -cp -av /usr/local/lib/libSDL2* /lib/x86_64-linux-gnu/ -git config --global --add safe.directory /soh -make setup -C soh -j$(nproc) OPTFLAGS=-O2 DEBUG=0 CC="gcc" CXX="g++" - -/opt/devkitpro/portlibs/switch/bin/aarch64-none-elf-cmake -B StormLib/build-switch -S StormLib -DCMAKE_INSTALL_PREFIX=/opt/devkitpro/portlibs/switch/ -make -C StormLib/build-switch -j$(nproc) -make install -C StormLib/build-switch - -make -f Makefile.switch -j$(nproc) OPTFLAGS=-O2 DEBUG=0 diff --git a/BUILDING.md b/BUILDING.md index 70ddd16b44..2a52e3f58a 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -32,13 +32,6 @@ sudo docker run --rm -it -v $(pwd):/soh soh /bin/bash ``` Inside the Docker container: ```bash -# Clone and build StormLib -git clone https://github.com/ladislav-zezula/StormLib external/StormLib -cmake -B external/StormLib/build -S external/StormLib -cmake --build external/StormLib/build -cp external/StormLib/build/libstorm.a external -cp /usr/local/lib/libGLEW.a external - cd soh # Extract the assets/Compile the exporter/Run the exporter make setup -j$(nproc) OPTFLAGS=-O2 DEBUG=0 diff --git a/Dockerfile b/Dockerfile index 2796742296..bf7d49ad55 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,45 +3,56 @@ FROM ubuntu:20.04 as build ENV LANG C.UTF-8 ARG DEBIAN_FRONTEND=noninteractive +ENV GCCVER=10 RUN apt-get update && \ - apt-get upgrade -y && \ - apt-get install -y \ - binutils \ - gcc-10 \ - g++-10 \ - patchelf \ - p7zip-full \ - python3.9 \ - make \ - cmake \ - curl \ - git \ - lld \ - libsdl2-dev \ - zlib1g-dev \ - libbz2-dev \ - libpng-dev \ - libgles2-mesa-dev && \ - ln -s /usr/bin/g++-10 /usr/bin/g++ && \ - update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 10 && \ - gcc --version && \ - g++ --version - -RUN apt-get clean autoclean && apt-get autoremove --yes && rm -rf /var/lib/apt /var/lib/cache /var/lib/log - + apt-get upgrade -y && \ + apt-get install -y \ + binutils \ + gcc-${GCCVER} \ + g++-${GCCVER} \ + p7zip-full \ + python3 \ + make \ + cmake \ + curl \ + git \ + lld \ + wget \ + libglew-dev \ + libsdl2-dev \ + zlib1g-dev \ + libbz2-dev \ + libpng-dev \ + libgles2-mesa-dev && \ + update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-${GCCVER} 10 && \ + update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-${GCCVER} 10 + RUN git clone https://github.com/Perlmint/glew-cmake.git && \ - cmake glew-cmake && \ - make -j$(nproc) && \ - make install - + cmake glew-cmake && \ + make -j$(nproc) && \ + make install + ENV SDL2VER=2.0.22 RUN curl -sLO https://libsdl.org/release/SDL2-${SDL2VER}.tar.gz && \ - tar -xzf SDL2-${SDL2VER}.tar.gz && \ - cd SDL2-${SDL2VER} && \ - ./configure --prefix=/usr && \ - make && make install && \ - rm ../SDL2-${SDL2VER}.tar.gz && \ - cp -av /lib/libSDL* /lib/x86_64-linux-gnu/ + tar -xzf SDL2-${SDL2VER}.tar.gz && \ + cd SDL2-${SDL2VER} && \ + ./configure --build=x86_64-linux-gnu && \ + make -j$(nproc) && make install && \ + rm ../SDL2-${SDL2VER}.tar.gz + +RUN \ + ln -sf /proc/self/mounts /etc/mtab && \ + mkdir -p /usr/local/share/keyring/ && \ + wget -O /usr/local/share/keyring/devkitpro-pub.gpg https://apt.devkitpro.org/devkitpro-pub.gpg && \ + echo "deb [signed-by=/usr/local/share/keyring/devkitpro-pub.gpg] https://apt.devkitpro.org stable main" > /etc/apt/sources.list.d/devkitpro.list && \ + apt-get update -y && \ + apt-get install -y devkitpro-pacman && \ + yes | dkp-pacman -Syu switch-dev switch-portlibs --noconfirm + +ENV DEVKITPRO=/opt/devkitpro +ENV DEVKITARM=/opt/devkitpro/devkitARM +ENV DEVKITPPC=/opt/devkitpro/devkitPPC +ENV PATH=$PATH:/opt/devkitpro/portlibs/switch/bin/ RUN mkdir /soh WORKDIR /soh diff --git a/Dockerfile.switch b/Dockerfile.switch deleted file mode 100644 index 7319f22a61..0000000000 --- a/Dockerfile.switch +++ /dev/null @@ -1,58 +0,0 @@ -FROM ubuntu:20.04 as build - -ENV LANG C.UTF-8 -ARG DEBIAN_FRONTEND=noninteractive - -ENV GCCVER=10 -RUN \ - apt-get update && \ - apt-get upgrade -y && \ - apt-get install -y \ - binutils \ - gcc-10 \ - g++-10 \ - p7zip-full \ - python3 \ - make \ - cmake \ - curl \ - git \ - lld \ - wget \ - libsdl2-dev \ - zlib1g-dev \ - libbz2-dev \ - libpng-dev \ - libgles2-mesa-dev && \ - update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-${GCCVER} 10 && \ - update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-${GCCVER} 10 - -RUN git clone https://github.com/Perlmint/glew-cmake.git && \ - cmake glew-cmake && \ - make -j$(nproc) && \ - make install ARCH64=true - -ENV SDL2VER=2.0.22 -RUN curl -sLO https://libsdl.org/release/SDL2-${SDL2VER}.tar.gz && \ - tar -xzf SDL2-${SDL2VER}.tar.gz && \ - cd SDL2-${SDL2VER} && \ - ./configure --build=x86_64-linux-gnu && \ - make && make install && \ - rm ../SDL2-${SDL2VER}.tar.gz - -RUN \ - ln -sf /proc/self/mounts /etc/mtab && \ - mkdir -p /usr/local/share/keyring/ && \ - wget -O /usr/local/share/keyring/devkitpro-pub.gpg https://apt.devkitpro.org/devkitpro-pub.gpg && \ - echo "deb [signed-by=/usr/local/share/keyring/devkitpro-pub.gpg] https://apt.devkitpro.org stable main" > /etc/apt/sources.list.d/devkitpro.list && \ - apt-get update -y && \ - apt-get install -y devkitpro-pacman && \ - yes | dkp-pacman -Syu switch-dev switch-portlibs --noconfirm - -ENV DEVKITPRO=/opt/devkitpro -ENV DEVKITARM=/opt/devkitpro/devkitARM -ENV DEVKITPPC=/opt/devkitpro/devkitPPC -ENV PATH=$PATH:/opt/devkitpro/portlibs/switch/bin/ - -RUN mkdir /soh -WORKDIR /soh diff --git a/Jenkinsfile b/Jenkinsfile index 033f1f7580..60f0222530 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -97,8 +97,7 @@ pipeline { cp ../../ZELOOTD.z64 OTRExporter/baserom_non_mq.z64 docker build . -t soh docker run --name sohcont -dit --rm -v $(pwd):/soh soh /bin/bash - cp ../../buildsoh.bash soh - docker exec sohcont soh/buildsoh.bash + docker exec sohcont scripts/linux/build.sh mkdir build mv soh/soh.elf build/ @@ -106,9 +105,9 @@ pipeline { mv OTRGui/build/assets build/ mv ZAPDTR/ZAPD.out build/assets/extractor/ mv README.md readme.txt - - docker exec sohcont appimage/appimage.sh - + + docker exec sohcont scripts/linux/build-appimage.sh + 7z a soh-linux.7z SOH-Linux.AppImage readme.txt ''' @@ -143,9 +142,9 @@ pipeline { sh ''' cp ../../ZELOOTD.z64 OTRExporter/baserom_non_mq.z64 cd soh - make setup -j4 OPTFLAGS=-O2 DEBUG=0 LD="ld" - make -j4 DEBUG=0 OPTFLAGS=-O2 LD="ld" - make -j4 appbundle + make setup -j$(sysctl -n hw.physicalcpu) OPTFLAGS=-O2 DEBUG=0 LD="ld" + make -j$(sysctl -n hw.physicalcpu) DEBUG=0 OPTFLAGS=-O2 LD="ld" + make appbundle mv ../README.md readme.txt 7z a soh-mac.7z soh.app readme.txt ''' @@ -177,9 +176,9 @@ pipeline { sh ''' cp ../../ZELOOTD.z64 OTRExporter/baserom_non_mq.z64 - docker build . -t sohswitch -f Dockerfile.switch + docker build . -t sohswitch docker run --name sohcont -dit --rm -v $(pwd):/soh sohswitch /bin/bash - docker exec sohcont .ci/switch/buildswitch.bash + docker exec sohcont scripts/switch/build.sh mv soh/soh.nro . mv README.md readme.txt diff --git a/ZAPDTR/Makefile b/ZAPDTR/Makefile index 6d8ba354d4..660e0469ce 100644 --- a/ZAPDTR/Makefile +++ b/ZAPDTR/Makefile @@ -48,11 +48,15 @@ endif LDFLAGS := -Llib/libgfxd -L../libultraship -L../StormLib/build \ -pthread -lgfxd -lultraship ZAPDUtils/ZAPDUtils.a -lstorm -lbz2 -lm -ldl +LDFLAGS += $(shell pkg-config --libs glew libpng zlib) $(shell sdl2-config --libs) +INC += $(shell pkg-config --cflags libpng) + ifeq ($(UNAME), Darwin) - LDFLAGS += $(shell pkg-config --libs glew libpng zlib) $(shell sdl2-config --libs) -framework OpenGL -framework Foundation - INC += $(shell pkg-config --cflags libpng) -else - LDFLAGS += -lpng -lGL -lGLEW -lX11 -lz -lSDL2 -lpulse + LDFLAGS += -framework OpenGL -framework Foundation +endif + +ifeq ($(UNAME), Linux) + LDFLAGS += $(shell pkg-config --libs x11 libpulse) endif # Use LLD if available. Set LLD=0 to not use it @@ -65,10 +69,12 @@ ifneq ($(LLD),0) endif UNAMEM := $(shell uname -m) -ifneq ($(UNAME), Darwin) +ifeq ($(UNAME), Linux) LDFLAGS += -Wl,-export-dynamic -lstdc++fs EXPORTERS := -Wl,--whole-archive ../OTRExporter/OTRExporter/OTRExporter.a -Wl,--no-whole-archive -else +endif + +ifeq ($(UNAME), Darwin) EXPORTERS := -Wl,-force_load ../OTRExporter/OTRExporter/OTRExporter.a endif diff --git a/libultraship/Makefile b/libultraship/Makefile index 37640969df..8369126f40 100644 --- a/libultraship/Makefile +++ b/libultraship/Makefile @@ -29,7 +29,6 @@ WARN := -Wall -Wextra -Werror \ -Wno-narrowing \ -Wno-missing-field-initializers \ -Wno-error=multichar \ - -Wno-unused-command-line-argument \ -Wno-delete-non-abstract-non-virtual-dtor \ -Wno-unused-private-field \ -Wno-deprecated-copy-with-user-provided-copy \ @@ -46,7 +45,7 @@ endif CXXFLAGS := $(WARN) $(CXXWARN) -std=c++20 -D_GNU_SOURCE -DENABLE_OPENGL -DSPDLOG_ACTIVE_LEVEL=0 CFLAGS := $(WARN) $(CWARN) -std=c99 -D_GNU_SOURCE -DENABLE_OPENGL -DSPDLOG_ACTIVE_LEVEL=0 -CPPFLAGS := -MMD +CPPFLAGS := -MMD $(shell pkg-config --cflags sdl2 glew) MMFLAGS := -Wno-deprecated-declarations -ObjC++ -fobjc-weak -fobjc-arc @@ -62,10 +61,6 @@ ifneq ($(CXX_IS_CLANG),1) MMFLAGS += -stdlib++-isystem ${STD_ISYSTEM} -cxx-isystem ${CXX_ISYSTEM} endif -ifeq ($(UNAME), Darwin) #APPLE - CPPFLAGS += $(shell pkg-config --cflags sdl2 glew) -framework OpenGL -framework Foundation -endif - ifneq ($(DEBUG),0) CXXFLAGS += -g -D_DEBUG CFLAGS += -g -D_DEBUG diff --git a/appimage/appimage.sh b/scripts/linux/build-appimage.sh similarity index 96% rename from appimage/appimage.sh rename to scripts/linux/build-appimage.sh index 7ac03934e7..053ce580a8 100755 --- a/appimage/appimage.sh +++ b/scripts/linux/build-appimage.sh @@ -6,7 +6,7 @@ curl -sSfL https://github.com$(curl https://github.com/probonopd/go-appimage/rel chmod a+x mkappimage.AppImage mkdir -p AppDir/usr/bin -cp appimage/{soh.desktop,soh.sh} AppDir/ +cp scripts/linux/{soh.desktop,soh.sh} AppDir/ cp soh/macosx/sohIcon.png AppDir/soh.png curl -sSfL https://raw.githubusercontent.com/gabomdq/SDL_GameControllerDB/master/gamecontrollerdb.txt -o AppDir/usr/bin/gamecontrollerdb.txt diff --git a/scripts/linux/build.sh b/scripts/linux/build.sh new file mode 100755 index 0000000000..f9d1f9e2cb --- /dev/null +++ b/scripts/linux/build.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +cd soh +make setup -j$(nproc) OPTFLAGS=-O2 DEBUG=0 +make -j$(nproc) OPTFLAGS=-O2 DEBUG=0 + +cd ../OTRGui +mkdir build +cd build +cmake .. +cmake --build . --config Release diff --git a/appimage/soh.desktop b/scripts/linux/soh.desktop similarity index 100% rename from appimage/soh.desktop rename to scripts/linux/soh.desktop diff --git a/appimage/soh.sh b/scripts/linux/soh.sh similarity index 100% rename from appimage/soh.sh rename to scripts/linux/soh.sh diff --git a/scripts/switch/build.sh b/scripts/switch/build.sh new file mode 100755 index 0000000000..e5d65d99db --- /dev/null +++ b/scripts/switch/build.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +make setup -C soh -j$(nproc) OPTFLAGS=-O2 DEBUG=0 +make -f Makefile.switch -j$(nproc) diff --git a/soh/Makefile b/soh/Makefile index 2c0f9ff319..24b3c9e8bd 100644 --- a/soh/Makefile +++ b/soh/Makefile @@ -16,26 +16,35 @@ DEBUG ?= 1 OPTFLAGS ?= -O0 LTO ?= 0 +# flag to save whether the compiler being used is clang or gcc by checking CXX --version +CXX_IS_CLANG ?= $(shell $(CXX) --version | grep -c clang) + WARN := \ -Wno-return-type \ - -Wno-unused-command-line-argument \ - -Wno-implicit-function-declaration \ - -Wno-c++11-narrowing \ -funsigned-char \ -fno-stack-protector -fno-common -fno-zero-initialized-in-bss -fno-strict-aliasing -fno-inline-functions -fno-inline-small-functions -ffreestanding -fwrapv \ -CXXFLAGS := $(WARN) -std=c++20 -D_GNU_SOURCE -fpermissive -no-pie -nostdlib -CFLAGS := $(WARN) -std=c99 -D_GNU_SOURCE -no-pie -nostdlib -LDFLAGS := - -ifeq ($(UNAME), Linux) #LINUX - CXXFLAGS += -mhard-float -msse2 -mfpmath=sse - CFLAGS += -mhard-float -msse2 -mfpmath=sse +ifeq ($(CXX_IS_CLANG),1) + WARN += -Wno-c++11-narrowing endif -ifeq ($(UNAME), Darwin) #APPLE - CXXFLAGS += $(shell pkg-config --cflags sdl2) $(shell sdl2-config --cflags) $(shell pkg-config --cflags glew) -framework OpenGL - CFLAGS += $(shell pkg-config --cflags sdl2) $(shell sdl2-config --cflags) $(shell pkg-config --cflags glew) -framework OpenGL +CXXFLAGS := $(WARN) -std=c++20 -D_GNU_SOURCE -fpermissive -nostdlib $(shell pkg-config --cflags glew) $(shell sdl2-config --cflags) +CFLAGS := $(WARN) -std=c99 -Wno-implicit-function-declaration -D_GNU_SOURCE -nostdlib $(shell pkg-config --cflags glew) $(shell sdl2-config --cflags) +LDFLAGS := + +ifneq ($(CXX_IS_CLANG),1) + CXXFLAGS += -no-pie + CFLAGS += -no-pie +endif + +ifeq ($(UNAME), Linux) + ifeq ($(UNAMEM), x86_64) + CXXFLAGS += -msse2 -mfpmath=sse -mhard-float + CFLAGS += -msse2 -mfpmath=sse -mhard-float + endif + + CXXFLAGS += $(shell pkg-config --cflags libpulse) + CFLAGS += $(shell pkg-config --cflags libpulse) endif CPPFLAGS := -MMD @@ -57,11 +66,11 @@ ifneq ($(LTO),0) LDFLAGS += -flto endif -ifeq ($(UNAME), Linux) #LINUX +ifeq ($(UNAME), Linux) TARGET := soh.elf endif -ifeq ($(UNAME), Darwin) #APPLE +ifeq ($(UNAME), Darwin) TARGET := soh-$(UNAMEM) endif @@ -78,25 +87,15 @@ INC_DIRS := $(addprefix -I, \ ../libultraship/libultraship/Lib/Fast3D/U64/PR \ ) -ifeq ($(UNAME), Linux) #LINUX - INC_DIRS += $(addprefix -I, \ - /opt/X11/include \ -) -endif - LDDIRS := $(addprefix -L, \ ../libultraship/ \ ) -ifeq ($(UNAME), Linux) #LINUX - LDDIRS += $(addprefix -L, \ - /opt/X11/lib \ -) -endif - LDLIBS := \ $(ZAPDUTILS) \ $(LIBSTORM) \ + $(shell sdl2-config --libs) \ + $(shell pkg-config --libs glew) \ $(addprefix -l, \ dl \ bz2 \ @@ -105,24 +104,16 @@ LDLIBS := \ ultraship \ ) -ifeq ($(UNAME), Linux) #LINUX -LDLIBS += \ - $(addprefix -l, \ - X11 \ - SDL2 \ - GL \ - GLEW \ - pulse \ -) +ifeq ($(UNAME), Linux) +LDLIBS += $(shell pkg-config --libs x11 libpulse) endif -ifeq ($(UNAME), Darwin) #APPLE +ifeq ($(UNAME), Darwin) LDLIBS += \ $(addprefix -framework , \ OpenGL \ Foundation \ -) \ - $(shell sdl2-config --libs) $(shell pkg-config --libs glew) +) endif ASSET_BIN_DIRS := $(shell find assets/* -type d -not -path "assets/xml*") diff --git a/soh/include/z64.h b/soh/include/z64.h index 94d8b280e1..d9570ae5e6 100644 --- a/soh/include/z64.h +++ b/soh/include/z64.h @@ -30,7 +30,7 @@ #include "ichain.h" #include "regs.h" -#if defined(_WIN64) || defined(__x86_64__) || defined(__arm64__) +#if defined(__LP64__) #define _SOH64 #endif diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp index 513776b2ac..48c9c46959 100644 --- a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp @@ -1001,7 +1001,7 @@ void DrawFlagsTab() { // 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::Text("%s", categoryName.c_str()); ImGui::SameLine(); ImGui::PushID(categoryName.c_str()); if (ImGui::BeginCombo("##upgrade", names[CUR_UPG_VALUE(categoryId)].c_str())) { From 18013e1ae0177d1b8ee71bd072b4d89156269000 Mon Sep 17 00:00:00 2001 From: Josh Bodner Date: Mon, 1 Aug 2022 20:46:50 -0700 Subject: [PATCH 17/42] Do this in Rachael instead --- soh/src/code/z_play.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/src/code/z_play.c b/soh/src/code/z_play.c index 7c9db98375..aa91e43a55 100644 --- a/soh/src/code/z_play.c +++ b/soh/src/code/z_play.c @@ -1408,7 +1408,7 @@ void Gameplay_Draw(GlobalContext* globalCtx) { OVERLAY_DISP = sp70; globalCtx->unk_121C7 = 2; SREG(33) |= 1; - } else { + } else if (R_PAUSE_MENU_MODE != 3) { Gameplay_Draw_DrawOverlayElements: if ((HREG(80) != 10) || (HREG(89) != 0)) { Gameplay_DrawOverlayElements(globalCtx); From 85c4cd38631a28f1f2c46034e9c2a819c7861065 Mon Sep 17 00:00:00 2001 From: aMannus Date: Tue, 2 Aug 2022 23:47:39 +0200 Subject: [PATCH 18/42] Re-added ImStrdup around string value (#1009) --- libultraship/libultraship/Cvar.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libultraship/libultraship/Cvar.cpp b/libultraship/libultraship/Cvar.cpp index 3a5ab6e040..d5b3af7508 100644 --- a/libultraship/libultraship/Cvar.cpp +++ b/libultraship/libultraship/Cvar.cpp @@ -111,7 +111,7 @@ extern "C" void CVar_SetString(const char* name, const char* value) { cvar = std::make_unique(); } cvar->type = CVarType::String; - cvar->value.valueStr = value; + cvar->value.valueStr = ImStrdup(value); } extern "C" void CVar_RegisterRGBA(const char* name, Color_RGBA8 defaultValue) { From d9443d98f0e0af2ff977620c194b31c774450258 Mon Sep 17 00:00:00 2001 From: David Chavez Date: Wed, 3 Aug 2022 00:09:33 +0200 Subject: [PATCH 19/42] Store RGBA Cvar as JSON object (#996) * Store RGBA Cvar as JSON object * Use existing split string method * Extract key setting to var --- .../libultraship/Lib/Mercury/Mercury.cpp | 16 +++------- .../libultraship/Lib/Mercury/Mercury.h | 2 ++ soh/soh/Enhancements/debugconsole.cpp | 31 ++++++++++--------- 3 files changed, 22 insertions(+), 27 deletions(-) diff --git a/libultraship/libultraship/Lib/Mercury/Mercury.cpp b/libultraship/libultraship/Lib/Mercury/Mercury.cpp index d6bf734ea0..009b9c0f98 100644 --- a/libultraship/libultraship/Lib/Mercury/Mercury.cpp +++ b/libultraship/libultraship/Lib/Mercury/Mercury.cpp @@ -6,6 +6,7 @@ #include #include #include +#include namespace fs = std::filesystem; using json = nlohmann::json; @@ -16,18 +17,9 @@ Mercury::Mercury(std::string path) : path_(std::move(path)) { this->reload(); } -std::vector split(const std::string& s, const char delimiter) { - std::vector result; - std::stringstream ss(s); - std::string item; - while (getline(ss, item, delimiter)) { - result.push_back(item); - } - return result; -} - std::string Mercury::formatNestedKey(const std::string& key) { - const std::vector dots = split(key, '.'); + std::vector dots = StringHelper::Split(key, "."); + std::string tmp; if (dots.size() > 1) for (const auto& dot : dots) { @@ -40,7 +32,7 @@ std::string Mercury::formatNestedKey(const std::string& key) { } json Mercury::nested(const std::string& key) { - std::vector dots = split(key, '.'); + std::vector dots = StringHelper::Split(key, "."); if (!this->vjson.is_object()) return this->vjson; json gjson = this->vjson.unflatten(); diff --git a/libultraship/libultraship/Lib/Mercury/Mercury.h b/libultraship/libultraship/Lib/Mercury/Mercury.h index 5c2646d362..92cb2097ee 100644 --- a/libultraship/libultraship/Lib/Mercury/Mercury.h +++ b/libultraship/libultraship/Lib/Mercury/Mercury.h @@ -4,6 +4,8 @@ #include #include "../nlohmann/json.hpp" +static const std::string mercuryRGBAObjectType = "RGBA"; + class Mercury { protected: std::string path_; diff --git a/soh/soh/Enhancements/debugconsole.cpp b/soh/soh/Enhancements/debugconsole.cpp index ba866b0624..73c54b742a 100644 --- a/soh/soh/Enhancements/debugconsole.cpp +++ b/soh/soh/Enhancements/debugconsole.cpp @@ -568,20 +568,18 @@ void DebugConsole_LoadCVars() { switch (value.type()) { case nlohmann::detail::value_t::array: break; - case nlohmann::detail::value_t::string: - if (StringHelper::StartsWith(value.get(), "#")) - { - uint32_t val = std::stoul(&value.get().c_str()[1], nullptr, 16); + case nlohmann::detail::value_t::object: + if (value["Type"].get() == mercuryRGBAObjectType) { Color_RGBA8 clr; - clr.r = val >> 24; - clr.g = val >> 16; - clr.b = val >> 8; - clr.a = val & 0xFF; - - CVar_SetRGBA(item.key().c_str(), clr); + clr.r = value["R"].get(); + clr.g = value["G"].get(); + clr.b = value["B"].get(); + clr.a = value["A"].get(); } - else - CVar_SetString(item.key().c_str(), value.get().c_str()); + + break; + case nlohmann::detail::value_t::string: + CVar_SetString(item.key().c_str(), value.get().c_str()); break; case nlohmann::detail::value_t::boolean: CVar_SetS32(item.key().c_str(), value.get()); @@ -618,10 +616,13 @@ void DebugConsole_SaveCVars() pConf->setFloat(key, cvar.second->value.valueFloat); else if (cvar.second->type == CVarType::RGBA) { + auto keyStr = key.c_str(); Color_RGBA8 clr = cvar.second->value.valueRGBA; - uint32_t val = (clr.r << 24) + (clr.g << 16) + (clr.b << 8) + clr.a; - std::string str = StringHelper::Sprintf("#%08X", val); - pConf->setString(key, str); + pConf->setUInt(StringHelper::Sprintf("%s.R", keyStr), clr.r); + pConf->setUInt(StringHelper::Sprintf("%s.G", keyStr), clr.r); + pConf->setUInt(StringHelper::Sprintf("%s.B", keyStr), clr.r); + pConf->setUInt(StringHelper::Sprintf("%s.A", keyStr), clr.r); + pConf->setString(StringHelper::Sprintf("%s.Type", keyStr), mercuryRGBAObjectType); } } From b3c3882b12a6c8810675abf00c9b3173d9e35114 Mon Sep 17 00:00:00 2001 From: Kenix3 Date: Sun, 31 Jul 2022 23:14:54 -0400 Subject: [PATCH 20/42] LUS Cleanup: Make ControlDeck a member of Window --- libultraship/libultraship/ControlDeck.cpp | 16 ++++++++++++ libultraship/libultraship/ControlDeck.h | 9 +++++-- libultraship/libultraship/ImGuiImpl.cpp | 2 +- libultraship/libultraship/InputEditor.cpp | 21 +++++++-------- libultraship/libultraship/Window.cpp | 31 ++++++++++++++--------- libultraship/libultraship/Window.h | 12 +++++---- soh/soh/OTRGlobals.cpp | 15 ++++++----- 7 files changed, 67 insertions(+), 39 deletions(-) diff --git a/libultraship/libultraship/ControlDeck.cpp b/libultraship/libultraship/ControlDeck.cpp index fd6511f783..6e90e1ea39 100644 --- a/libultraship/libultraship/ControlDeck.cpp +++ b/libultraship/libultraship/ControlDeck.cpp @@ -152,3 +152,19 @@ void Ship::ControlDeck::SaveControllerSettings() { Config->save(); } + +std::shared_ptr Ship::ControlDeck::GetPhysicalDevice(int deviceSlot) { + return physicalDevices[deviceSlot]; +} + +size_t Ship::ControlDeck::GetNumPhysicalDevices() { + return physicalDevices.size(); +} + +int Ship::ControlDeck::GetVirtualDevice(int slot) { + return virtualDevices[slot]; +} + +size_t Ship::ControlDeck::GetNumVirtualDevices() { + return virtualDevices.size(); +} \ No newline at end of file diff --git a/libultraship/libultraship/ControlDeck.h b/libultraship/libultraship/ControlDeck.h index fbbaca7abf..7c0f6ea63e 100644 --- a/libultraship/libultraship/ControlDeck.h +++ b/libultraship/libultraship/ControlDeck.h @@ -8,13 +8,18 @@ namespace Ship { class ControlDeck { public: - std::vector virtualDevices; - std::vector> physicalDevices = {}; void Init(uint8_t* controllerBits); void ScanPhysicalDevices(); void WriteToPad(OSContPad* pad) const; void LoadControllerSettings(); void SaveControllerSettings(); void SetPhysicalDevice(int slot, int deviceSlot); + std::shared_ptr GetPhysicalDevice(int deviceSlot); + size_t GetNumPhysicalDevices(); + int GetVirtualDevice(int slot); + size_t GetNumVirtualDevices(); + private: + std::vector virtualDevices; + std::vector> physicalDevices = {}; }; } diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index ef1aec4317..f19ce7eac1 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -792,7 +792,7 @@ namespace SohImGui { bool menu_bar = CVar_GetS32("gOpenMenuBar", 0); CVar_SetS32("gOpenMenuBar", !menu_bar); needs_save = true; - GlobalCtx2::GetInstance()->GetWindow()->dwMenubar = menu_bar; + GlobalCtx2::GetInstance()->GetWindow()->SetMenuBar(menu_bar); ShowCursor(menu_bar, Dialogues::dMenubar); GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck()->SaveControllerSettings(); if (CVar_GetS32("gControlNav", 0)) { diff --git a/libultraship/libultraship/InputEditor.cpp b/libultraship/libultraship/InputEditor.cpp index eb191cc203..7ebe497526 100644 --- a/libultraship/libultraship/InputEditor.cpp +++ b/libultraship/libultraship/InputEditor.cpp @@ -16,8 +16,8 @@ namespace Ship { } std::shared_ptr GetControllerPerSlot(int slot) { - const std::vector vDevices = Window::ControllerApi->virtualDevices; - return Window::ControllerApi->physicalDevices[vDevices[slot]]; + auto controlDeck = Ship::GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck(); + return controlDeck->GetPhysicalDevice(controlDeck->GetVirtualDevice(slot)); } void InputEditor::DrawButton(const char* label, int n64Btn) { @@ -82,20 +82,17 @@ namespace Ship { } void InputEditor::DrawControllerSchema() { - - const std::vector vDevices = Window::ControllerApi->virtualDevices; - const std::vector> devices = Window::ControllerApi->physicalDevices; - - std::shared_ptr Backend = devices[vDevices[CurrentPort]]; - DeviceProfile& profile =Backend->profiles[CurrentPort]; + auto controlDeck = Ship::GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck(); + auto Backend = controlDeck->GetPhysicalDevice(controlDeck->GetVirtualDevice(CurrentPort)); + DeviceProfile& profile = Backend->profiles[CurrentPort]; float sensitivity = profile.Thresholds[SENSITIVITY]; bool IsKeyboard = Backend->GetGuid() == "Keyboard" || Backend->GetGuid() == "Auto" || !Backend->Connected(); const char* ControllerName = Backend->GetControllerName(); if (ControllerName != nullptr && ImGui::BeginCombo("##ControllerEntries", ControllerName)) { - for (uint8_t i = 0; i < devices.size(); i++) { - if (ImGui::Selectable(devices[i]->GetControllerName(), i == vDevices[CurrentPort])) { - Window::ControllerApi->SetPhysicalDevice(CurrentPort, i); + for (uint8_t i = 0; i < controlDeck->GetNumPhysicalDevices(); i++) { + if (ImGui::Selectable(controlDeck->GetPhysicalDevice(i)->GetControllerName(), i == controlDeck->GetVirtualDevice(CurrentPort))) { + controlDeck->SetPhysicalDevice(CurrentPort, i); } } ImGui::EndCombo(); @@ -104,7 +101,7 @@ namespace Ship { ImGui::SameLine(); if(ImGui::Button("Refresh")) { - Window::ControllerApi->ScanPhysicalDevices(); + controlDeck->ScanPhysicalDevices(); } SohImGui::BeginGroupPanel("Buttons", ImVec2(150, 20)); diff --git a/libultraship/libultraship/Window.cpp b/libultraship/libultraship/Window.cpp index 39d4aad06e..0773a3f31c 100644 --- a/libultraship/libultraship/Window.cpp +++ b/libultraship/libultraship/Window.cpp @@ -57,7 +57,7 @@ extern "C" { } #endif - Ship::Window::ControllerApi->Init(controllerBits); + Ship::GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck()->Init(controllerBits); return 0; } @@ -77,7 +77,7 @@ extern "C" { pad->gyro_y = 0; if (!CVar_GetS32("gOpenMenuBar", 0)) { - Ship::Window::ControllerApi->WriteToPad(pad); + Ship::GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck()->WriteToPad(pad); } ModInternal::ExecuteHooks(pad); @@ -221,7 +221,7 @@ namespace Ship { int32_t Window::lastScancode; - Window::Window(std::shared_ptr Context) : Context(Context), APlayer(nullptr) { + Window::Window(std::shared_ptr Context) : Context(Context), APlayer(nullptr), ControllerApi(nullptr) { WmApi = nullptr; RenderingApi = nullptr; bIsFullscreen = false; @@ -259,8 +259,9 @@ namespace Ship { std::shared_ptr pConf = GlobalCtx2::GetInstance()->GetConfig(); CreateDefaults(); + InitializeAudioPlayer(); + InitializeControlDeck(); - SetAudioPlayer(); bIsFullscreen = pConf->getBool("Window.Fullscreen.Enabled", false); if (bIsFullscreen) { @@ -279,7 +280,7 @@ namespace Ship { WmApi->set_fullscreen_changed_callback(OnFullscreenChanged); WmApi->set_keyboard_callbacks(KeyDown, KeyUp, AllKeysUp); - ModInternal::RegisterHook([]() { + ModInternal::RegisterHook([this]() { ControllerApi->SaveControllerSettings(); }); } @@ -347,8 +348,9 @@ namespace Ship { lastScancode = -1; bool bIsProcessed = false; - const auto pad = dynamic_cast(ControllerApi->physicalDevices[ControllerApi->physicalDevices.size() - 2].get()); - if (pad != nullptr) { + auto controlDeck = GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck(); + const auto pad = dynamic_cast(controlDeck->GetPhysicalDevice(controlDeck->GetNumPhysicalDevices() - 2).get()); + if (pad != nullptr) { if (pad->ReleaseButton(dwScancode)) { bIsProcessed = true; } @@ -359,9 +361,9 @@ namespace Ship { bool Window::KeyDown(int32_t dwScancode) { bool bIsProcessed = false; - - const auto pad = dynamic_cast(ControllerApi->physicalDevices[ControllerApi->physicalDevices.size() - 2].get()); - if (pad != nullptr) { + auto controlDeck = GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck(); + const auto pad = dynamic_cast(controlDeck->GetPhysicalDevice(controlDeck->GetNumPhysicalDevices() - 2).get()); + if (pad != nullptr) { if (pad->PressButton(dwScancode)) { bIsProcessed = true; } @@ -374,7 +376,8 @@ namespace Ship { void Window::AllKeysUp(void) { - const auto pad = dynamic_cast(ControllerApi->physicalDevices[ControllerApi->physicalDevices.size() - 2].get()); + auto controlDeck = GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck(); + const auto pad = dynamic_cast(controlDeck->GetPhysicalDevice(controlDeck->GetNumPhysicalDevices() - 2).get()); if (pad != nullptr) { pad->ReleaseAllButtons(); } @@ -400,7 +403,7 @@ namespace Ship { return dwHeight; } - void Window::SetAudioPlayer() { + void Window::InitializeAudioPlayer() { #ifdef _WIN32 APlayer = std::make_shared(); #elif defined(__linux) @@ -409,4 +412,8 @@ namespace Ship { APlayer = std::make_shared(); #endif } + + void Window::InitializeControlDeck() { + ControllerApi = std::make_shared(); + } } diff --git a/libultraship/libultraship/Window.h b/libultraship/libultraship/Window.h index 1fa43abeb2..52737dd379 100644 --- a/libultraship/libultraship/Window.h +++ b/libultraship/libultraship/Window.h @@ -16,7 +16,6 @@ namespace Ship { class Window { public: static int32_t lastScancode; - inline static ControlDeck* ControllerApi = new ControlDeck; Window(std::shared_ptr Context); ~Window(); @@ -32,12 +31,12 @@ namespace Ship { void ToggleFullscreen(); void SetFullscreen(bool bIsFullscreen); void ShowCursor(bool hide); - bool IsFullscreen() { return bIsFullscreen; } uint32_t GetCurrentWidth(); uint32_t GetCurrentHeight(); - ControlDeck* GetControlDeck() { return ControllerApi; }; - uint32_t dwMenubar; + uint32_t GetMenuBar() { return dwMenubar; } + void SetMenuBar(uint32_t dwMenuBar) { this->dwMenubar = dwMenuBar; } + std::shared_ptr GetControlDeck() { return ControllerApi; }; std::shared_ptr GetContext() { return Context.lock(); } std::shared_ptr GetAudioPlayer() { return APlayer; } const char* GetKeyName(int scancode) { return WmApi->get_key_name(scancode); } @@ -48,15 +47,18 @@ namespace Ship { static bool KeyUp(int32_t dwScancode); static void AllKeysUp(void); static void OnFullscreenChanged(bool bIsNowFullscreen); - void SetAudioPlayer(); + void InitializeControlDeck(); + void InitializeAudioPlayer(); std::weak_ptr Context; std::shared_ptr APlayer; + std::shared_ptr ControllerApi; GfxRenderingAPI* RenderingApi; GfxWindowManagerAPI* WmApi; bool bIsFullscreen; uint32_t dwWidth; uint32_t dwHeight; + uint32_t dwMenubar; }; } diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index d1d9ebb731..625fdfba88 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1306,10 +1306,11 @@ extern "C" uint32_t OTRGetCurrentHeight() { } extern "C" void OTRControllerCallback(ControllerCallback* controller) { - const auto controllers = Ship::Window::ControllerApi->virtualDevices; + auto controlDeck = Ship::GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck(); - for (int i = 0; i < controllers.size(); ++i) { - Ship::Window::ControllerApi->physicalDevices[controllers[i]]->WriteToSource(i, controller); + for (int i = 0; i < controlDeck->GetNumVirtualDevices(); ++i) { + auto physicalDevice = controlDeck->GetPhysicalDevice(controlDeck->GetVirtualDevice(i)); + physicalDevice->WriteToSource(i, controller); } } @@ -1363,11 +1364,11 @@ extern "C" void AudioPlayer_Play(const uint8_t* buf, uint32_t len) { } extern "C" int Controller_ShouldRumble(size_t i) { + auto controlDeck = Ship::GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck(); - const auto controllers = Ship::Window::ControllerApi->virtualDevices; - - for (const auto virtual_entry : controllers) { - if (Ship::Window::ControllerApi->physicalDevices[virtual_entry]->CanRumble()) { + for (int i = 0; i < controlDeck->GetNumVirtualDevices(); ++i) { + auto physicalDevice = controlDeck->GetPhysicalDevice(controlDeck->GetVirtualDevice(i)); + if (physicalDevice->CanRumble()) { return 1; } } From c1659d3dcff2a36fb221e33e885cefc884f8e0dc Mon Sep 17 00:00:00 2001 From: Kenix3 Date: Tue, 2 Aug 2022 21:58:30 -0400 Subject: [PATCH 21/42] Adds a function for grabbing physical device from virtual slot. --- libultraship/libultraship/ControlDeck.cpp | 244 +++++++++++----------- libultraship/libultraship/ControlDeck.h | 1 + libultraship/libultraship/InputEditor.cpp | 4 +- libultraship/libultraship/Window.cpp | 4 +- soh/soh/OTRGlobals.cpp | 4 +- 5 files changed, 132 insertions(+), 125 deletions(-) diff --git a/libultraship/libultraship/ControlDeck.cpp b/libultraship/libultraship/ControlDeck.cpp index 6e90e1ea39..31eb900679 100644 --- a/libultraship/libultraship/ControlDeck.cpp +++ b/libultraship/libultraship/ControlDeck.cpp @@ -7,164 +7,170 @@ #include "SDLController.h" #include -uint8_t* controllerBits; +namespace Ship { + uint8_t* controllerBits; -void Ship::ControlDeck::Init(uint8_t* bits) { - ScanPhysicalDevices(); - controllerBits = bits; -} + void ControlDeck::Init(uint8_t* bits) { + ScanPhysicalDevices(); + controllerBits = bits; + } -void Ship::ControlDeck::ScanPhysicalDevices() { + void ControlDeck::ScanPhysicalDevices() { - virtualDevices.clear(); - physicalDevices.clear(); + virtualDevices.clear(); + physicalDevices.clear(); - for (int i = 0; i < SDL_NumJoysticks(); i++) { - if (SDL_IsGameController(i)) { - auto sdl = std::make_shared(i); - sdl->Open(); - physicalDevices.push_back(sdl); - } - } + for (int i = 0; i < SDL_NumJoysticks(); i++) { + if (SDL_IsGameController(i)) { + auto sdl = std::make_shared(i); + sdl->Open(); + physicalDevices.push_back(sdl); + } + } - physicalDevices.push_back(std::make_shared("Auto", "Auto", true)); - physicalDevices.push_back(std::make_shared()); - physicalDevices.push_back(std::make_shared("Disconnected", "None", false)); + physicalDevices.push_back(std::make_shared("Auto", "Auto", true)); + physicalDevices.push_back(std::make_shared()); + physicalDevices.push_back(std::make_shared("Disconnected", "None", false)); - for (const auto& device : physicalDevices) { - for (int i = 0; i < MAXCONTROLLERS; i++) { - device->CreateDefaultBinding(i); - } - } + for (const auto& device : physicalDevices) { + for (int i = 0; i < MAXCONTROLLERS; i++) { + device->CreateDefaultBinding(i); + } + } - for (int i = 0; i < MAXCONTROLLERS; i++) { - virtualDevices.push_back(i == 0 ? 0 : static_cast(physicalDevices.size()) - 1); - } + for (int i = 0; i < MAXCONTROLLERS; i++) { + virtualDevices.push_back(i == 0 ? 0 : static_cast(physicalDevices.size()) - 1); + } - LoadControllerSettings(); -} + LoadControllerSettings(); + } -void Ship::ControlDeck::SetPhysicalDevice(int slot, int deviceSlot) { - const std::shared_ptr backend = physicalDevices[deviceSlot]; - virtualDevices[slot] = deviceSlot; - *controllerBits |= (backend->Connected()) << slot; -} + void ControlDeck::SetPhysicalDevice(int slot, int deviceSlot) { + const std::shared_ptr backend = physicalDevices[deviceSlot]; + virtualDevices[slot] = deviceSlot; + *controllerBits |= (backend->Connected()) << slot; + } -void Ship::ControlDeck::WriteToPad(OSContPad* pad) const { - for (size_t i = 0; i < virtualDevices.size(); i++) { - const std::shared_ptr backend = physicalDevices[virtualDevices[i]]; - if (backend->GetGuid() == "Auto") { - for (const auto& device : physicalDevices) { - device->Read(&pad[i], i); - } - continue; - } - backend->Read(&pad[i], i); - } -} + void ControlDeck::WriteToPad(OSContPad* pad) const { + for (size_t i = 0; i < virtualDevices.size(); i++) { + const std::shared_ptr backend = physicalDevices[virtualDevices[i]]; + if (backend->GetGuid() == "Auto") { + for (const auto& device : physicalDevices) { + device->Read(&pad[i], i); + } + continue; + } + backend->Read(&pad[i], i); + } + } #define NESTED(key, ...) StringHelper::Sprintf("Controllers.%s.Slot_%d." key, device->GetGuid().c_str(), slot, __VA_ARGS__) -void Ship::ControlDeck::LoadControllerSettings() { - std::shared_ptr Config = GlobalCtx2::GetInstance()->GetConfig(); + void ControlDeck::LoadControllerSettings() { + std::shared_ptr Config = GlobalCtx2::GetInstance()->GetConfig(); - for (auto const& val : Config->rjson["Controllers"]["Deck"].items()) { - int slot = std::stoi(val.key().substr(5)); + for (auto const& val : Config->rjson["Controllers"]["Deck"].items()) { + int slot = std::stoi(val.key().substr(5)); - for (size_t dev = 0; dev < physicalDevices.size(); dev++) { - std::string guid = physicalDevices[dev]->GetGuid(); - if(guid != val.value()) continue; + for (size_t dev = 0; dev < physicalDevices.size(); dev++) { + std::string guid = physicalDevices[dev]->GetGuid(); + if (guid != val.value()) continue; - virtualDevices[slot] = dev; - } - } + virtualDevices[slot] = dev; + } + } - for (size_t i = 0; i < virtualDevices.size(); i++) { - std::shared_ptr backend = physicalDevices[virtualDevices[i]]; - Config->setString(StringHelper::Sprintf("Controllers.Deck.Slot_%d", (int)i), backend->GetGuid()); - } + for (size_t i = 0; i < virtualDevices.size(); i++) { + std::shared_ptr backend = physicalDevices[virtualDevices[i]]; + Config->setString(StringHelper::Sprintf("Controllers.Deck.Slot_%d", (int)i), backend->GetGuid()); + } - for (const auto& device : physicalDevices) { + for (const auto& device : physicalDevices) { - std::string guid = device->GetGuid(); + std::string guid = device->GetGuid(); - for (int slot = 0; slot < MAXCONTROLLERS; slot++) { + for (int slot = 0; slot < MAXCONTROLLERS; slot++) { - if (!(Config->rjson["Controllers"].contains(guid) && Config->rjson["Controllers"][guid].contains(StringHelper::Sprintf("Slot_%d", slot)))) continue; + if (!(Config->rjson["Controllers"].contains(guid) && Config->rjson["Controllers"][guid].contains(StringHelper::Sprintf("Slot_%d", slot)))) continue; - auto& profile = device->profiles[slot]; - auto rawProfile = Config->rjson["Controllers"][guid][StringHelper::Sprintf("Slot_%d", slot)]; + auto& profile = device->profiles[slot]; + auto rawProfile = Config->rjson["Controllers"][guid][StringHelper::Sprintf("Slot_%d", slot)]; - profile.Mappings.clear(); - profile.Thresholds.clear(); - profile.UseRumble = Config->getBool(NESTED("Rumble.Enabled", "")); - profile.RumbleStrength = Config->getFloat(NESTED("Rumble.Strength", "")); - profile.UseGyro = Config->getBool(NESTED("Gyro.Enabled", "")); + profile.Mappings.clear(); + profile.Thresholds.clear(); + profile.UseRumble = Config->getBool(NESTED("Rumble.Enabled", "")); + profile.RumbleStrength = Config->getFloat(NESTED("Rumble.Strength", "")); + profile.UseGyro = Config->getBool(NESTED("Gyro.Enabled", "")); - for (auto const& val : rawProfile["Thresholds"].items()) { - profile.Thresholds[static_cast(std::stoi(val.key()))] = val.value(); - } + for (auto const& val : rawProfile["Thresholds"].items()) { + profile.Thresholds[static_cast(std::stoi(val.key()))] = val.value(); + } - for (auto const& val : rawProfile["Mappings"].items()) { - device->SetButtonMapping(slot, std::stoi(val.key().substr(4)), val.value()); - } - } - } -} + for (auto const& val : rawProfile["Mappings"].items()) { + device->SetButtonMapping(slot, std::stoi(val.key().substr(4)), val.value()); + } + } + } + } -void Ship::ControlDeck::SaveControllerSettings() { - std::shared_ptr Config = GlobalCtx2::GetInstance()->GetConfig(); + void ControlDeck::SaveControllerSettings() { + std::shared_ptr Config = GlobalCtx2::GetInstance()->GetConfig(); - for (size_t i = 0; i < virtualDevices.size(); i++) { - std::shared_ptr backend = physicalDevices[virtualDevices[i]]; - Config->setString(StringHelper::Sprintf("Controllers.Deck.Slot_%d", (int)i), backend->GetGuid()); - } + for (size_t i = 0; i < virtualDevices.size(); i++) { + std::shared_ptr backend = physicalDevices[virtualDevices[i]]; + Config->setString(StringHelper::Sprintf("Controllers.Deck.Slot_%d", (int)i), backend->GetGuid()); + } - for (const auto& device : physicalDevices) { + for (const auto& device : physicalDevices) { - int slot = 0; - std::string guid = device->GetGuid(); + int slot = 0; + std::string guid = device->GetGuid(); - for (const auto& profile : device->profiles) { + for (const auto& profile : device->profiles) { - if (!device->Connected()) continue; + if (!device->Connected()) continue; - auto rawProfile = Config->rjson["Controllers"][guid][StringHelper::Sprintf("Slot_%d", slot)]; - Config->setBool(NESTED("Rumble.Enabled", ""), profile.UseRumble); - Config->setFloat(NESTED("Rumble.Strength", ""), profile.RumbleStrength); - Config->setBool(NESTED("Gyro.Enabled", ""), profile.UseGyro); + auto rawProfile = Config->rjson["Controllers"][guid][StringHelper::Sprintf("Slot_%d", slot)]; + Config->setBool(NESTED("Rumble.Enabled", ""), profile.UseRumble); + Config->setFloat(NESTED("Rumble.Strength", ""), profile.RumbleStrength); + Config->setBool(NESTED("Gyro.Enabled", ""), profile.UseGyro); - for (auto const& val : rawProfile["Mappings"].items()) { - Config->setInt(NESTED("Mappings.%s", val.key().c_str()), -1); - } + for (auto const& val : rawProfile["Mappings"].items()) { + Config->setInt(NESTED("Mappings.%s", val.key().c_str()), -1); + } - for (auto const& [key, val] : profile.Thresholds) { - Config->setFloat(NESTED("Thresholds.%d", key), val); - } + for (auto const& [key, val] : profile.Thresholds) { + Config->setFloat(NESTED("Thresholds.%d", key), val); + } - for (auto const& [key, val] : profile.Mappings) { - Config->setInt(NESTED("Mappings.BTN_%d", val), key); - } + for (auto const& [key, val] : profile.Mappings) { + Config->setInt(NESTED("Mappings.BTN_%d", val), key); + } - slot++; - } - } + slot++; + } + } - Config->save(); -} + Config->save(); + } -std::shared_ptr Ship::ControlDeck::GetPhysicalDevice(int deviceSlot) { - return physicalDevices[deviceSlot]; -} + std::shared_ptr ControlDeck::GetPhysicalDevice(int deviceSlot) { + return physicalDevices[deviceSlot]; + } -size_t Ship::ControlDeck::GetNumPhysicalDevices() { - return physicalDevices.size(); -} + size_t ControlDeck::GetNumPhysicalDevices() { + return physicalDevices.size(); + } -int Ship::ControlDeck::GetVirtualDevice(int slot) { - return virtualDevices[slot]; -} + int ControlDeck::GetVirtualDevice(int slot) { + return virtualDevices[slot]; + } -size_t Ship::ControlDeck::GetNumVirtualDevices() { - return virtualDevices.size(); + size_t ControlDeck::GetNumVirtualDevices() { + return virtualDevices.size(); + } + + std::shared_ptr ControlDeck::GetPhysicalDeviceFromVirtualSlot(int slot) { + return GetPhysicalDevice(GetVirtualDevice(slot)); + } } \ No newline at end of file diff --git a/libultraship/libultraship/ControlDeck.h b/libultraship/libultraship/ControlDeck.h index 7c0f6ea63e..58c258ca8c 100644 --- a/libultraship/libultraship/ControlDeck.h +++ b/libultraship/libultraship/ControlDeck.h @@ -15,6 +15,7 @@ namespace Ship { void SaveControllerSettings(); void SetPhysicalDevice(int slot, int deviceSlot); std::shared_ptr GetPhysicalDevice(int deviceSlot); + std::shared_ptr GetPhysicalDeviceFromVirtualSlot(int slot); size_t GetNumPhysicalDevices(); int GetVirtualDevice(int slot); size_t GetNumVirtualDevices(); diff --git a/libultraship/libultraship/InputEditor.cpp b/libultraship/libultraship/InputEditor.cpp index 7ebe497526..0ad5c09a09 100644 --- a/libultraship/libultraship/InputEditor.cpp +++ b/libultraship/libultraship/InputEditor.cpp @@ -17,7 +17,7 @@ namespace Ship { std::shared_ptr GetControllerPerSlot(int slot) { auto controlDeck = Ship::GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck(); - return controlDeck->GetPhysicalDevice(controlDeck->GetVirtualDevice(slot)); + return controlDeck->GetPhysicalDeviceFromVirtualSlot(slot); } void InputEditor::DrawButton(const char* label, int n64Btn) { @@ -83,7 +83,7 @@ namespace Ship { void InputEditor::DrawControllerSchema() { auto controlDeck = Ship::GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck(); - auto Backend = controlDeck->GetPhysicalDevice(controlDeck->GetVirtualDevice(CurrentPort)); + auto Backend = controlDeck->GetPhysicalDeviceFromVirtualSlot(CurrentPort); DeviceProfile& profile = Backend->profiles[CurrentPort]; float sensitivity = profile.Thresholds[SENSITIVITY]; bool IsKeyboard = Backend->GetGuid() == "Keyboard" || Backend->GetGuid() == "Auto" || !Backend->Connected(); diff --git a/libultraship/libultraship/Window.cpp b/libultraship/libultraship/Window.cpp index 0773a3f31c..9c11f2d6d5 100644 --- a/libultraship/libultraship/Window.cpp +++ b/libultraship/libultraship/Window.cpp @@ -350,7 +350,7 @@ namespace Ship { bool bIsProcessed = false; auto controlDeck = GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck(); const auto pad = dynamic_cast(controlDeck->GetPhysicalDevice(controlDeck->GetNumPhysicalDevices() - 2).get()); - if (pad != nullptr) { + if (pad != nullptr) { if (pad->ReleaseButton(dwScancode)) { bIsProcessed = true; } @@ -363,7 +363,7 @@ namespace Ship { bool bIsProcessed = false; auto controlDeck = GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck(); const auto pad = dynamic_cast(controlDeck->GetPhysicalDevice(controlDeck->GetNumPhysicalDevices() - 2).get()); - if (pad != nullptr) { + if (pad != nullptr) { if (pad->PressButton(dwScancode)) { bIsProcessed = true; } diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 625fdfba88..2bdf80e682 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1309,7 +1309,7 @@ extern "C" void OTRControllerCallback(ControllerCallback* controller) { auto controlDeck = Ship::GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck(); for (int i = 0; i < controlDeck->GetNumVirtualDevices(); ++i) { - auto physicalDevice = controlDeck->GetPhysicalDevice(controlDeck->GetVirtualDevice(i)); + auto physicalDevice = controlDeck->GetPhysicalDeviceFromVirtualSlot(i); physicalDevice->WriteToSource(i, controller); } } @@ -1367,7 +1367,7 @@ extern "C" int Controller_ShouldRumble(size_t i) { auto controlDeck = Ship::GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck(); for (int i = 0; i < controlDeck->GetNumVirtualDevices(); ++i) { - auto physicalDevice = controlDeck->GetPhysicalDevice(controlDeck->GetVirtualDevice(i)); + auto physicalDevice = controlDeck->GetPhysicalDeviceFromVirtualSlot(i); if (physicalDevice->CanRumble()) { return 1; } From 1bf777198194e766b7e0f6a3b1a64ac129b43a43 Mon Sep 17 00:00:00 2001 From: Kenix3 Date: Sun, 31 Jul 2022 23:22:02 -0400 Subject: [PATCH 22/42] LUS Cleanup: Utils.cpp is now in namespace Ship. --- libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp | 6 +++--- libultraship/libultraship/Utils.cpp | 12 ++++++------ libultraship/libultraship/Utils.h | 11 ++++++----- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp index 10ba45ec52..0a5d0ceef6 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp @@ -1065,8 +1065,8 @@ static void gfx_sp_vertex(size_t n_vertices, size_t dest_index, const Vtx *verti dotx /= 127.0f; doty /= 127.0f; - dotx = math::clamp(dotx, -1.0f, 1.0f); - doty = math::clamp(doty, -1.0f, 1.0f); + dotx = Ship::Math::clamp(dotx, -1.0f, 1.0f); + doty = Ship::Math::clamp(doty, -1.0f, 1.0f); if (rsp.geometry_mode & G_TEXTURE_GEN_LINEAR) { // Not sure exactly what formula we should use to get accurate values @@ -1118,7 +1118,7 @@ static void gfx_sp_vertex(size_t n_vertices, size_t dest_index, const Vtx *verti if (winv < 0.0f) winv = std::numeric_limits::max(); float fog_z = z * winv * rsp.fog_mul + rsp.fog_offset; - fog_z = math::clamp(fog_z, 0.0f, 255.0f); + fog_z = Ship::Math::clamp(fog_z, 0.0f, 255.0f); d->color.a = fog_z; // Use alpha variable to store fog factor } else { d->color.a = v->cn[3]; diff --git a/libultraship/libultraship/Utils.cpp b/libultraship/libultraship/Utils.cpp index 2b813aee7d..185c21c249 100644 --- a/libultraship/libultraship/Utils.cpp +++ b/libultraship/libultraship/Utils.cpp @@ -5,14 +5,14 @@ #define strdup _strdup #endif -namespace math { - float clamp(float d, float min, float max) { - const float t = d < min ? min : d; - return t > max ? max : t; +namespace Ship { + namespace Math { + float clamp(float d, float min, float max) { + const float t = d < min ? min : d; + return t > max ? max : t; + } } -} -namespace Utils { std::vector SplitText(const std::string text, char separator = ' ', bool keep_quotes = false) { std::vector args; char* input = strdup(text.c_str()); diff --git a/libultraship/libultraship/Utils.h b/libultraship/libultraship/Utils.h index 25c6dd64b4..1dc3d34914 100644 --- a/libultraship/libultraship/Utils.h +++ b/libultraship/libultraship/Utils.h @@ -3,10 +3,11 @@ #include #include -namespace math { - float clamp(float d, float min, float max); -} +namespace Ship { + + namespace Math { + float clamp(float d, float min, float max); + } -namespace Utils { std::vector SplitText(const std::string& text, char separator, bool keep_quotes); -} +} \ No newline at end of file From 352b46c1f5b79be3320e1e91182122e2dd82b08d Mon Sep 17 00:00:00 2001 From: Kenix3 Date: Sun, 31 Jul 2022 23:36:21 -0400 Subject: [PATCH 23/42] LUS Cleanup: Console class is now in the Ship namespace --- libultraship/libultraship/Console.cpp | 312 +++++++++--------- libultraship/libultraship/Console.h | 140 ++++---- libultraship/libultraship/ImGuiImpl.h | 4 +- .../libultraship/Lib/Fast3D/gfx_dxgi.cpp | 1 - .../include/spdlog/sinks/sohconsole_sink.h | 19 +- soh/soh/Enhancements/debugconsole.cpp | 53 ++- 6 files changed, 266 insertions(+), 263 deletions(-) diff --git a/libultraship/libultraship/Console.cpp b/libultraship/libultraship/Console.cpp index 85ba1f78d2..b7158bd3bc 100644 --- a/libultraship/libultraship/Console.cpp +++ b/libultraship/libultraship/Console.cpp @@ -10,115 +10,116 @@ #include "Utils/StringHelper.h" #include "Lib/ImGui/imgui_internal.h" -std::map Bindings; -std::map BindingToggle; +namespace Ship { + std::map Bindings; + std::map BindingToggle; -static bool HelpCommand(const std::vector&) { - INFO("SoH Commands:"); - for(const auto& cmd : SohImGui::console->Commands) { - INFO("%s", (" - " + cmd.first).c_str()); + static bool HelpCommand(const std::vector&) { + INFO("SoH Commands:"); + for (const auto& cmd : SohImGui::console->Commands) { + INFO("%s", (" - " + cmd.first).c_str()); + } + return CMD_SUCCESS; } - return CMD_SUCCESS; -} -static bool ClearCommand(const std::vector&) { - SohImGui::console->Log[SohImGui::console->selected_channel].clear(); - return CMD_SUCCESS; -} + static bool ClearCommand(const std::vector&) { + SohImGui::console->Log[SohImGui::console->selected_channel].clear(); + return CMD_SUCCESS; + } -std::string toLowerCase(std::string in) { - std::string cpy(in); - std::transform(cpy.begin(), cpy.end(), cpy.begin(), ::tolower); - return cpy; -} + std::string toLowerCase(std::string in) { + std::string cpy(in); + std::transform(cpy.begin(), cpy.end(), cpy.begin(), ::tolower); + return cpy; + } -static bool BindCommand(const std::vector& args) { - if(args.size() > 2) { - const ImGuiIO* io = &ImGui::GetIO();; - for (size_t k = 0; k < std::size(io->KeysData); k++) { - std::string key(ImGui::GetKeyName(k)); + static bool BindCommand(const std::vector& args) { + if (args.size() > 2) { + const ImGuiIO* io = &ImGui::GetIO();; + for (size_t k = 0; k < std::size(io->KeysData); k++) { + std::string key(ImGui::GetKeyName(k)); - if(toLowerCase(args[1]) == toLowerCase(key)) { - std::vector tmp; - const char* const delim = " "; - std::ostringstream imploded; - std::copy(args.begin() + 2, args.end(), std::ostream_iterator(imploded, delim)); - Bindings[k] = imploded.str(); - INFO("Binding '%s' to %s", args[1].c_str(), Bindings[k].c_str()); - break; + if (toLowerCase(args[1]) == toLowerCase(key)) { + std::vector tmp; + const char* const delim = " "; + std::ostringstream imploded; + std::copy(args.begin() + 2, args.end(), std::ostream_iterator(imploded, delim)); + Bindings[k] = imploded.str(); + INFO("Binding '%s' to %s", args[1].c_str(), Bindings[k].c_str()); + break; + } + } + } + return CMD_SUCCESS; + } + + static bool BindToggleCommand(const std::vector& args) { + if (args.size() > 2) { + const ImGuiIO* io = &ImGui::GetIO();; + for (size_t k = 0; k < std::size(io->KeysData); k++) { + std::string key(ImGui::GetKeyName(k)); + + if (toLowerCase(args[1]) == toLowerCase(key)) { + BindingToggle[k] = args[2]; + INFO("Binding toggle '%s' to %s", args[1].c_str(), BindingToggle[k].c_str()); + break; + } + } + } + return CMD_SUCCESS; + } + + std::string BuildUsage(const CommandEntry& entry) { + std::string usage; + for (const auto& arg : entry.arguments) + usage += StringHelper::Sprintf(arg.optional ? "[%s] " : "<%s> ", arg.info.c_str()); + return usage; + } + + void Console::Init() { + this->InputBuffer = new char[MAX_BUFFER_SIZE]; + strcpy(this->InputBuffer, ""); + this->FilterBuffer = new char[MAX_BUFFER_SIZE]; + strcpy(this->FilterBuffer, ""); + this->Commands["help"] = { HelpCommand, "Shows all the commands" }; + this->Commands["clear"] = { ClearCommand, "Clear the console history" }; + this->Commands["bind"] = { BindCommand, "Binds key to commands" }; + this->Commands["bind-toggle"] = { BindToggleCommand, "Bind key as a bool toggle" }; + } + + void Console::Update() { + for (auto [key, cmd] : Bindings) { + if (ImGui::IsKeyPressed(key)) Dispatch(cmd); + } + for (auto [key, var] : BindingToggle) { + if (ImGui::IsKeyPressed(key)) { + CVar* cvar = CVar_Get(var.c_str()); + Dispatch("set " + var + " " + std::to_string(cvar == nullptr ? 0 : !static_cast(cvar->value.valueS32))); } } } - return CMD_SUCCESS; -} -static bool BindToggleCommand(const std::vector& args) { - if (args.size() > 2) { - const ImGuiIO* io = &ImGui::GetIO();; - for (size_t k = 0; k < std::size(io->KeysData); k++) { - std::string key(ImGui::GetKeyName(k)); + void Console::Draw() { + bool input_focus = false; + if (!this->opened) return; - if (toLowerCase(args[1]) == toLowerCase(key)) { - BindingToggle[k] = args[2]; - INFO("Binding toggle '%s' to %s", args[1].c_str(), BindingToggle[k].c_str()); - break; - } - } - } - return CMD_SUCCESS; -} - -std::string BuildUsage(const CommandEntry& entry) { - std::string usage; - for (const auto& arg : entry.arguments) - usage += StringHelper::Sprintf(arg.optional ? "[%s] " : "<%s> ", arg.info.c_str()); - return usage; -} - -void Console::Init() { - this->InputBuffer = new char[MAX_BUFFER_SIZE]; - strcpy(this->InputBuffer, ""); - this->FilterBuffer = new char[MAX_BUFFER_SIZE]; - strcpy(this->FilterBuffer, ""); - this->Commands["help"] = { HelpCommand, "Shows all the commands" }; - this->Commands["clear"] = { ClearCommand, "Clear the console history" }; - this->Commands["bind"] = { BindCommand, "Binds key to commands" }; - this->Commands["bind-toggle"] = { BindToggleCommand, "Bind key as a bool toggle" }; -} - -void Console::Update() { - for(auto [key, cmd] : Bindings) { - if (ImGui::IsKeyPressed(key)) Dispatch(cmd); - } - for (auto [key, var] : BindingToggle) { - if (ImGui::IsKeyPressed(key)) { - CVar* cvar = CVar_Get(var.c_str()); - Dispatch("set " + var + " " + std::to_string(cvar == nullptr ? 0 : !static_cast(cvar->value.valueS32))); - } - } -} - -void Console::Draw() { - bool input_focus = false; - if (!this->opened) return; - - ImGui::SetNextWindowSize(ImVec2(520, 600), ImGuiCond_FirstUseEver); - ImGui::Begin("Console", nullptr, ImGuiWindowFlags_NoFocusOnAppearing); + ImGui::SetNextWindowSize(ImVec2(520, 600), ImGuiCond_FirstUseEver); + ImGui::Begin("Console", nullptr, ImGuiWindowFlags_NoFocusOnAppearing); const ImVec2 pos = ImGui::GetWindowPos(); const ImVec2 size = ImGui::GetWindowSize(); // SohImGui::ShowCursor(ImGui::IsWindowHovered(ImGuiHoveredFlags_RootAndChildWindows | ImGuiHoveredFlags_RectOnly), SohImGui::Dialogues::dConsole); // Renders autocomplete window - if(this->OpenAutocomplete) { + if (this->OpenAutocomplete) { ImGui::SetNextWindowSize(ImVec2(350, std::min(static_cast(this->Autocomplete.size()), 3) * 20.f), ImGuiCond_Once); ImGui::SetNextWindowPos(ImVec2(pos.x + 8, pos.y + size.y - 1)); ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(3, 3)); - ImGui::Begin("##WndAutocomplete", nullptr, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoMove ); + ImGui::Begin("##WndAutocomplete", nullptr, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoMove); ImGui::BeginChild("AC_Child", ImVec2(0, 0), false, ImGuiWindowFlags_HorizontalScrollbar); ImGui::PushStyleColor(ImGuiCol_FrameBgActive, ImVec4(.3f, .3f, .3f, 1.0f)); if (ImGui::BeginTable("AC_History", 1)) { - for (const auto &cmd : this->Autocomplete) { - std::string usage = BuildUsage(this->Commands[cmd]); + for (const auto& cmd : this->Autocomplete) { + std::string usage = BuildUsage(this->Commands[cmd]); std::string preview = cmd + " - " + this->Commands[cmd].description; std::string autocomplete = (usage == NULLSTR ? cmd : usage); ImGui::TableNextRow(); @@ -186,53 +187,53 @@ void Console::Draw() { // Renders console history const float footer_height_to_reserve = ImGui::GetStyle().ItemSpacing.y + ImGui::GetFrameHeightWithSpacing(); ImGui::BeginChild("ScrollingRegion", ImVec2(0, -footer_height_to_reserve), false, ImGuiWindowFlags_HorizontalScrollbar); - ImGui::PushStyleColor(ImGuiCol_FrameBgActive, ImVec4(.3f, .3f, .3f, 1.0f)); - if (ImGui::BeginTable("History", 1)) { + ImGui::PushStyleColor(ImGuiCol_FrameBgActive, ImVec4(.3f, .3f, .3f, 1.0f)); + if (ImGui::BeginTable("History", 1)) { - if (ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_DownArrow))) - if (this->selectedId < (int)this->Log.size() - 1) ++this->selectedId; - if (ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_UpArrow))) - if (this->selectedId > 0) --this->selectedId; + if (ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_DownArrow))) + if (this->selectedId < (int)this->Log.size() - 1)++this->selectedId; + if (ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_UpArrow))) + if (this->selectedId > 0)--this->selectedId; - const std::vector channel = this->Log[this->selected_channel]; - for (int i = 0; i < static_cast(channel.size()); i++) { - ConsoleLine line = channel[i]; - if(!this->filter.empty() && line.text.find(this->filter) == std::string::npos) continue; - if(this->level_filter != NULLSTR && line.priority != (std::find(priority_filters.begin(), priority_filters.end(), this->level_filter) - priority_filters.begin()) - 1) continue; - std::string id = line.text + "##" + std::to_string(i); - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - const bool is_selected = (this->selectedId == i) || std::find(this->selectedEntries.begin(), this->selectedEntries.end(), i) != this->selectedEntries.end(); - ImGui::PushStyleColor(ImGuiCol_Text, this->priority_colors[line.priority]); - if (ImGui::Selectable(id.c_str(), is_selected)) { - if (ImGui::IsKeyDown(ImGui::GetKeyIndex(ImGuiKey_LeftCtrl)) && !is_selected) - this->selectedEntries.push_back(i); + const std::vector channel = this->Log[this->selected_channel]; + for (int i = 0; i < static_cast(channel.size()); i++) { + ConsoleLine line = channel[i]; + if (!this->filter.empty() && line.text.find(this->filter) == std::string::npos) continue; + if (this->level_filter != NULLSTR && line.priority != (std::find(priority_filters.begin(), priority_filters.end(), this->level_filter) - priority_filters.begin()) - 1) continue; + std::string id = line.text + "##" + std::to_string(i); + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + const bool is_selected = (this->selectedId == i) || std::find(this->selectedEntries.begin(), this->selectedEntries.end(), i) != this->selectedEntries.end(); + ImGui::PushStyleColor(ImGuiCol_Text, this->priority_colors[line.priority]); + if (ImGui::Selectable(id.c_str(), is_selected)) { + if (ImGui::IsKeyDown(ImGui::GetKeyIndex(ImGuiKey_LeftCtrl)) && !is_selected) + this->selectedEntries.push_back(i); - else this->selectedEntries.clear(); - this->selectedId = is_selected ? -1 : i; - } - ImGui::PopStyleColor(); - if (is_selected) ImGui::SetItemDefaultFocus(); + else this->selectedEntries.clear(); + this->selectedId = is_selected ? -1 : i; } - ImGui::EndTable(); + ImGui::PopStyleColor(); + if (is_selected) ImGui::SetItemDefaultFocus(); } - ImGui::PopStyleColor(); - if (ImGui::GetScrollY() >= ImGui::GetScrollMaxY()) - ImGui::SetScrollHereY(1.0f); + ImGui::EndTable(); + } + ImGui::PopStyleColor(); + if (ImGui::GetScrollY() >= ImGui::GetScrollMaxY()) + ImGui::SetScrollHereY(1.0f); ImGui::EndChild(); // Renders input textfield constexpr ImGuiInputTextFlags flags = ImGuiInputTextFlags_EnterReturnsTrue | ImGuiInputTextFlags_CallbackEdit | - ImGuiInputTextFlags_CallbackCompletion | ImGuiInputTextFlags_CallbackHistory; + ImGuiInputTextFlags_CallbackCompletion | ImGuiInputTextFlags_CallbackHistory; ImGui::PushItemWidth(-53); - if(ImGui::InputTextWithHint("##CMDInput", ">", this->InputBuffer, MAX_BUFFER_SIZE, flags, &Console::CallbackStub, this)) { + if (ImGui::InputTextWithHint("##CMDInput", ">", this->InputBuffer, MAX_BUFFER_SIZE, flags, &Console::CallbackStub, this)) { input_focus = true; - if(this->InputBuffer[0] != '\0' && this->InputBuffer[0] != ' ') + if (this->InputBuffer[0] != '\0' && this->InputBuffer[0] != ' ') this->Dispatch(std::string(this->InputBuffer)); memset(this->InputBuffer, 0, MAX_BUFFER_SIZE); } - if(this->CMDHint != NULLSTR) { + if (this->CMDHint != NULLSTR) { if (ImGui::IsItemFocused()) { ImGui::SetNextWindowPos(ImVec2(pos.x, pos.y + size.y)); ImGui::SameLine(); @@ -246,38 +247,38 @@ void Console::Draw() { ImGui::SameLine(); ImGui::SetCursorPosX(ImGui::GetCursorPosX() + ImGui::GetContentRegionAvail().x - 50); - if(ImGui::Button("Submit") && !input_focus && this->InputBuffer[0] != '\0' && this->InputBuffer[0] != ' '){ - this->Dispatch(std::string(this->InputBuffer)); + if (ImGui::Button("Submit") && !input_focus && this->InputBuffer[0] != '\0' && this->InputBuffer[0] != ' ') { + this->Dispatch(std::string(this->InputBuffer)); memset(this->InputBuffer, 0, MAX_BUFFER_SIZE); } ImGui::SetItemDefaultFocus(); if (input_focus) ImGui::SetKeyboardFocusHere(-1); ImGui::PopItemWidth(); - ImGui::End(); -} - -void Console::Dispatch(const std::string& line) { - this->CMDHint = NULLSTR; - this->History.push_back(line); - this->Log[this->selected_channel].push_back({ "> " + line } ); - const std::vector cmd_args = StringHelper::Split(line, " "); - if (this->Commands.contains(cmd_args[0])) { - const CommandEntry entry = this->Commands[cmd_args[0]]; - if(!entry.handler(cmd_args) && !entry.arguments.empty()) - this->Log[this->selected_channel].push_back({ "[SOH] Usage: " + cmd_args[0] + " " + BuildUsage(entry), ERROR_LVL}); - return; + ImGui::End(); } - this->Log[this->selected_channel].push_back({ "[SOH] Command not found", ERROR_LVL }); -} -int Console::CallbackStub(ImGuiInputTextCallbackData* data) { - const auto instance = static_cast(data->UserData); - const bool empty_history = instance->History.empty(); - const int history_index = instance->HistoryIndex; - std::string history; + void Console::Dispatch(const std::string& line) { + this->CMDHint = NULLSTR; + this->History.push_back(line); + this->Log[this->selected_channel].push_back({ "> " + line }); + const std::vector cmd_args = StringHelper::Split(line, " "); + if (this->Commands.contains(cmd_args[0])) { + const CommandEntry entry = this->Commands[cmd_args[0]]; + if (!entry.handler(cmd_args) && !entry.arguments.empty()) + this->Log[this->selected_channel].push_back({ "[SOH] Usage: " + cmd_args[0] + " " + BuildUsage(entry), ERROR_LVL }); + return; + } + this->Log[this->selected_channel].push_back({ "[SOH] Command not found", ERROR_LVL }); + } - switch(data->EventKey) { + int Console::CallbackStub(ImGuiInputTextCallbackData* data) { + const auto instance = static_cast(data->UserData); + const bool empty_history = instance->History.empty(); + const int history_index = instance->HistoryIndex; + std::string history; + + switch (data->EventKey) { case ImGuiKey_Tab: instance->Autocomplete.clear(); for (auto& [cmd, entry] : instance->Commands) @@ -287,7 +288,7 @@ int Console::CallbackStub(ImGuiInputTextCallbackData* data) { break; case ImGuiKey_UpArrow: if (empty_history) break; - if(history_index < static_cast(instance->History.size()) - 1) instance->HistoryIndex += 1; + if (history_index < static_cast(instance->History.size()) - 1) instance->HistoryIndex += 1; data->DeleteChars(0, data->BufTextLen); data->InsertChars(0, instance->History[instance->HistoryIndex].c_str()); instance->CMDHint = NULLSTR; @@ -296,7 +297,7 @@ int Console::CallbackStub(ImGuiInputTextCallbackData* data) { if (empty_history) break; if (history_index > -1) instance->HistoryIndex -= 1; data->DeleteChars(0, data->BufTextLen); - if(history_index >= 0) + if (history_index >= 0) data->InsertChars(0, instance->History[history_index].c_str()); instance->CMDHint = NULLSTR; break; @@ -316,16 +317,17 @@ int Console::CallbackStub(ImGuiInputTextCallbackData* data) { } instance->CMDHint = NULLSTR; } + } + return 0; } - return 0; -} -void Console::Append(const std::string& channel, Priority priority, const char* fmt, ...) { - char buf[1024]; - va_list args; - va_start(args, fmt); - vsnprintf(buf, IM_ARRAYSIZE(buf), fmt, args); - buf[IM_ARRAYSIZE(buf) - 1] = 0; - va_end(args); - this->Log[channel].push_back({ std::string(buf), priority }); -} + void Console::Append(const std::string& channel, Priority priority, const char* fmt, ...) { + char buf[1024]; + va_list args; + va_start(args, fmt); + vsnprintf(buf, IM_ARRAYSIZE(buf), fmt, args); + buf[IM_ARRAYSIZE(buf) - 1] = 0; + va_end(args); + this->Log[channel].push_back({ std::string(buf), priority }); + } +} \ No newline at end of file diff --git a/libultraship/libultraship/Console.h b/libultraship/libultraship/Console.h index bfbffd0b9f..a174450e16 100644 --- a/libultraship/libultraship/Console.h +++ b/libultraship/libultraship/Console.h @@ -7,75 +7,77 @@ #include "Lib/ImGui/imgui.h" -#define LOG(msg, ...) SohImGui::console->Append("Main", Priority::LOG_LVL, msg, ##__VA_ARGS__) -#define INFO(msg, ...) SohImGui::console->Append("Main", Priority::INFO_LVL, msg, ##__VA_ARGS__) -#define WARNING(msg, ...) SohImGui::console->Append("Main", Priority::WARNING_LVL, msg, ##__VA_ARGS__) -#define ERROR(msg, ...) SohImGui::console->Append("Main", Priority::ERROR_LVL, msg, ##__VA_ARGS__) -#define CMD_SUCCESS true -#define CMD_FAILED false -#define MAX_BUFFER_SIZE 255 -#define NULLSTR "None" +namespace Ship { + #define LOG(msg, ...) SohImGui::console->Append("Main", Ship::Priority::LOG_LVL, msg, ##__VA_ARGS__) + #define INFO(msg, ...) SohImGui::console->Append("Main", Ship::Priority::INFO_LVL, msg, ##__VA_ARGS__) + #define WARNING(msg, ...) SohImGui::console->Append("Main", Ship::Priority::WARNING_LVL, msg, ##__VA_ARGS__) + #define ERROR(msg, ...) SohImGui::console->Append("Main", Ship::Priority::ERROR_LVL, msg, ##__VA_ARGS__) + #define CMD_SUCCESS true + #define CMD_FAILED false + #define MAX_BUFFER_SIZE 255 + #define NULLSTR "None" -typedef std::function args)> CommandHandler; + typedef std::function args)> CommandHandler; -enum Priority { - INFO_LVL, - LOG_LVL, - WARNING_LVL, - ERROR_LVL -}; - -enum class ArgumentType { - TEXT, NUMBER, PLAYER_POS, PLAYER_ROT -}; - -struct CommandArgument { - std::string info; - ArgumentType type = ArgumentType::NUMBER; - bool optional = false; -}; - -struct CommandEntry { - CommandHandler handler; - std::string description; - std::vector arguments; -}; - -struct ConsoleLine { - std::string text; - Priority priority = Priority::INFO_LVL; - std::string channel = "Main"; -}; - -class Console { - int selectedId = -1; - std::vector selectedEntries; - std::string filter; - std::string level_filter = NULLSTR; - std::vector log_channels = { "Main", "SoH Logging"}; - std::vector priority_filters = { "None", "Info", "Log", "Warning", "Error" }; - std::vector priority_colors = { - ImVec4(1.0f, 1.0f, 1.0f, 1.0f), - ImVec4(0.2f, 1.0f, 0.2f, 1.0f), - ImVec4(0.9f, 0.8f, 0.4f, 0.01f), - ImVec4(1.0f, 0.2f, 0.2f, 1.0f) + enum Priority { + INFO_LVL, + LOG_LVL, + WARNING_LVL, + ERROR_LVL }; -public: - std::map> Log; - std::map Commands; - std::vector Autocomplete; - std::vector History; - std::string CMDHint = NULLSTR; - char* FilterBuffer = nullptr; - char* InputBuffer = nullptr; - bool OpenAutocomplete = false; - int HistoryIndex = -1; - std::string selected_channel = "Main"; - bool opened = false; - void Init(); - void Update(); - void Draw(); - void Append(const std::string& channel, Priority priority, const char* fmt, ...) IM_FMTARGS(4); - void Dispatch(const std::string& line); - static int CallbackStub(ImGuiInputTextCallbackData* data); -}; \ No newline at end of file + + enum class ArgumentType { + TEXT, NUMBER, PLAYER_POS, PLAYER_ROT + }; + + struct CommandArgument { + std::string info; + ArgumentType type = ArgumentType::NUMBER; + bool optional = false; + }; + + struct CommandEntry { + CommandHandler handler; + std::string description; + std::vector arguments; + }; + + struct ConsoleLine { + std::string text; + Priority priority = Priority::INFO_LVL; + std::string channel = "Main"; + }; + + class Console { + int selectedId = -1; + std::vector selectedEntries; + std::string filter; + std::string level_filter = NULLSTR; + std::vector log_channels = { "Main", "SoH Logging" }; + std::vector priority_filters = { "None", "Info", "Log", "Warning", "Error" }; + std::vector priority_colors = { + ImVec4(1.0f, 1.0f, 1.0f, 1.0f), + ImVec4(0.2f, 1.0f, 0.2f, 1.0f), + ImVec4(0.9f, 0.8f, 0.4f, 0.01f), + ImVec4(1.0f, 0.2f, 0.2f, 1.0f) + }; + public: + std::map> Log; + std::map Commands; + std::vector Autocomplete; + std::vector History; + std::string CMDHint = NULLSTR; + char* FilterBuffer = nullptr; + char* InputBuffer = nullptr; + bool OpenAutocomplete = false; + int HistoryIndex = -1; + std::string selected_channel = "Main"; + bool opened = false; + void Init(); + void Update(); + void Draw(); + void Append(const std::string& channel, Priority priority, const char* fmt, ...) IM_FMTARGS(4); + void Dispatch(const std::string& line); + static int CallbackStub(ImGuiInputTextCallbackData* data); + }; +} \ No newline at end of file diff --git a/libultraship/libultraship/ImGuiImpl.h b/libultraship/libultraship/ImGuiImpl.h index 01235d4112..6913fce61f 100644 --- a/libultraship/libultraship/ImGuiImpl.h +++ b/libultraship/libultraship/ImGuiImpl.h @@ -69,7 +69,7 @@ namespace SohImGui { WindowDrawFunc drawFunc; } CustomWindow; - extern Console* console; + extern Ship::Console* console; extern Ship::InputEditor* controller; extern Ship::GameOverlay* overlay; extern bool needs_save; @@ -92,7 +92,7 @@ namespace SohImGui { void Render(void); void CancelFrame(void); void ShowCursor(bool hide, Dialogues w); - void BindCmd(const std::string& cmd, CommandEntry entry); + void BindCmd(const std::string& cmd, Ship::CommandEntry entry); void AddWindow(const std::string& category, const std::string& name, WindowDrawFunc drawFunc, bool isEnabled=false, bool isHidden=false); void LoadResource(const std::string& name, const std::string& path, const ImVec4& tint = ImVec4(1, 1, 1, 1)); void LoadPickersColors(ImVec4& ColorArray, const char* cvarname, const ImVec4& default_colors, bool has_alpha=false); diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_dxgi.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_dxgi.cpp index 6e0c2e4d6d..aabeb0acf8 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_dxgi.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_dxgi.cpp @@ -358,7 +358,6 @@ static void gfx_dxgi_show_cursor(bool hide) { * @bug When menubar is open in windowed mode and you toggle fullscreen * ShowCursor no longer responds. Debugging shows the bool to be correct. **/ - INFO("renderer: %s", hide ? "true" : "false"); ShowCursor(hide); } diff --git a/libultraship/libultraship/Lib/spdlog/include/spdlog/sinks/sohconsole_sink.h b/libultraship/libultraship/Lib/spdlog/include/spdlog/sinks/sohconsole_sink.h index b9d3cdbf34..9f71bdee42 100644 --- a/libultraship/libultraship/Lib/spdlog/include/spdlog/sinks/sohconsole_sink.h +++ b/libultraship/libultraship/Lib/spdlog/include/spdlog/sinks/sohconsole_sink.h @@ -34,7 +34,7 @@ public: protected: void sink_it_(const details::log_msg &msg) override { - const Priority priority = convert_to_soh(msg.level); + const Ship::Priority priority = convert_to_soh(msg.level); memory_buf_t formatted; if (use_raw_msg_) { @@ -53,24 +53,25 @@ protected: void flush_() override {} private: - static Priority convert_to_soh(spdlog::level::level_enum level) { + static Ship::Priority convert_to_soh(spdlog::level::level_enum level) + { switch (level) { case spdlog::level::trace: - return Priority::INFO_LVL; + return Ship::Priority::INFO_LVL; case spdlog::level::debug: - return Priority::LOG_LVL; + return Ship::Priority::LOG_LVL; case spdlog::level::info: - return Priority::LOG_LVL; + return Ship::Priority::LOG_LVL; case spdlog::level::warn: - return Priority::WARNING_LVL; + return Ship::Priority::WARNING_LVL; case spdlog::level::err: - return Priority::ERROR_LVL; + return Ship::Priority::ERROR_LVL; case spdlog::level::critical: - return Priority::ERROR_LVL; + return Ship::Priority::ERROR_LVL; default: break; } - return Priority::LOG_LVL; + return Ship::Priority::LOG_LVL; } std::string tag_; diff --git a/soh/soh/Enhancements/debugconsole.cpp b/soh/soh/Enhancements/debugconsole.cpp index 73c54b742a..ba5fb0b34e 100644 --- a/soh/soh/Enhancements/debugconsole.cpp +++ b/soh/soh/Enhancements/debugconsole.cpp @@ -463,50 +463,49 @@ void DebugConsole_Init(void) { CMD_REGISTER("kill", { KillPlayerHandler, "Commit suicide." }); CMD_REGISTER("map", { LoadSceneHandler, "Load up kak?" }); CMD_REGISTER("rupee", { RuppeHandler, "Set your rupee counter.", { - {"amount", ArgumentType::NUMBER } + {"amount", Ship::ArgumentType::NUMBER } }}); - CMD_REGISTER("bItem", { BHandler, "Set an item to the B button.", { { "Item ID", ArgumentType::NUMBER } } }); - CMD_REGISTER("health", { SetPlayerHealthHandler, "Set the health of the player.", { - {"health", ArgumentType::NUMBER } + CMD_REGISTER("bItem", { BHandler, "Set an item to the B button.", { { "Item ID", Ship::ArgumentType::NUMBER } } }); + CMD_REGISTER("health", { SetPlayerHealthHandler, "Set the health of the player.", { { "health", Ship::ArgumentType::NUMBER } }}); - CMD_REGISTER("spawn", { ActorSpawnHandler, "Spawn an actor.", { - { "actor_id", ArgumentType::NUMBER }, - { "data", ArgumentType::NUMBER }, - { "x", ArgumentType::PLAYER_POS, true }, - { "y", ArgumentType::PLAYER_POS, true }, - { "z", ArgumentType::PLAYER_POS, true }, - { "rx", ArgumentType::PLAYER_ROT, true }, - { "ry", ArgumentType::PLAYER_ROT, true }, - { "rz", ArgumentType::PLAYER_ROT, true } + CMD_REGISTER("spawn", { ActorSpawnHandler, "Spawn an actor.", { { "actor_id", Ship::ArgumentType::NUMBER }, + { "data", Ship::ArgumentType::NUMBER }, + { "x", Ship::ArgumentType::PLAYER_POS, true }, + { "y", Ship::ArgumentType::PLAYER_POS, true }, + { "z", Ship::ArgumentType::PLAYER_POS, true }, + { "rx", Ship::ArgumentType::PLAYER_ROT, true }, + { "ry", Ship::ArgumentType::PLAYER_ROT, true }, + { "rz", Ship::ArgumentType::PLAYER_ROT, true } }}); - CMD_REGISTER("pos", { SetPosHandler, "Sets the position of the player.", { - { "x", ArgumentType::PLAYER_POS, true }, - { "y", ArgumentType::PLAYER_POS, true }, - { "z", ArgumentType::PLAYER_POS, true } + CMD_REGISTER("pos", { SetPosHandler, "Sets the position of the player.", { { "x", Ship::ArgumentType::PLAYER_POS, true }, + { "y", Ship::ArgumentType::PLAYER_POS, true }, + { "z", Ship::ArgumentType::PLAYER_POS, true } }}); CMD_REGISTER("set", { SetCVarHandler, "Sets a console variable.", - { { "varName", ArgumentType::TEXT }, { "varValue", ArgumentType::TEXT } } }); - CMD_REGISTER("get", { GetCVarHandler, "Gets a console variable.", { { "varName", ArgumentType::TEXT } } }); + { { "varName", Ship::ArgumentType::TEXT }, { "varValue", Ship::ArgumentType::TEXT } } }); + CMD_REGISTER("get", { GetCVarHandler, "Gets a console variable.", { { "varName", Ship::ArgumentType::TEXT } } }); CMD_REGISTER("reset", { ResetHandler, "Resets the game." }); CMD_REGISTER("ammo", { AmmoHandler, "Changes ammo of an item.", - { { "item", ArgumentType::TEXT }, - { "count", ArgumentType::NUMBER } } }); + { { "item", Ship::ArgumentType::TEXT }, { "count", Ship::ArgumentType::NUMBER } } }); CMD_REGISTER("bottle", { BottleHandler, "Changes item in a bottle slot.", - { { "item", ArgumentType::TEXT }, { "slot", ArgumentType::NUMBER } } }); + { { "item", Ship::ArgumentType::TEXT }, { "slot", Ship::ArgumentType::NUMBER } } }); CMD_REGISTER("item", { ItemHandler, "Sets item ID in arg 1 into slot arg 2. No boundary checks. Use with caution.", - { { "slot", ArgumentType::NUMBER }, { "item id", ArgumentType::NUMBER } } }); - CMD_REGISTER("entrance", - { EntranceHandler, "Sends player to the entered entrance (hex)", { { "entrance", ArgumentType::NUMBER } } }); + { { "slot", Ship::ArgumentType::NUMBER }, { "item id", Ship::ArgumentType::NUMBER } } }); + CMD_REGISTER("entrance", { EntranceHandler, + "Sends player to the entered entrance (hex)", + { { "entrance", Ship::ArgumentType::NUMBER } } }); CMD_REGISTER("save_state", { SaveStateHandler, "Save a state." }); CMD_REGISTER("load_state", { LoadStateHandler, "Load a state." }); - CMD_REGISTER("set_slot", { StateSlotSelectHandler, "Selects a SaveState slot", { - { "Slot number", ArgumentType::NUMBER, } + CMD_REGISTER("set_slot", { StateSlotSelectHandler, "Selects a SaveState slot", { { + "Slot number", + Ship::ArgumentType::NUMBER, + } } }); DebugConsole_LoadCVars(); } From 1de525900dbfea9b44f70531e0a82c2629a9ba57 Mon Sep 17 00:00:00 2001 From: Kenix3 Date: Tue, 2 Aug 2022 22:10:26 -0400 Subject: [PATCH 24/42] Removes unnecessary Environment.cpp file. --- libultraship/libultraship/Environment.cpp | 16 ---------------- libultraship/libultraship/Environment.h | 8 -------- libultraship/libultraship/ImGuiImpl.cpp | 3 +-- .../libultraship/Lib/Fast3D/gfx_opengl.cpp | 1 - libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp | 9 +++++---- libultraship/libultraship/Lib/Fast3D/gfx_pc.h | 2 ++ libultraship/libultraship/libultraship.vcxproj | 2 -- .../libultraship/libultraship.vcxproj.filters | 9 --------- 8 files changed, 8 insertions(+), 42 deletions(-) delete mode 100644 libultraship/libultraship/Environment.cpp delete mode 100644 libultraship/libultraship/Environment.h diff --git a/libultraship/libultraship/Environment.cpp b/libultraship/libultraship/Environment.cpp deleted file mode 100644 index 53d0f330b3..0000000000 --- a/libultraship/libultraship/Environment.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include "Environment.h" - -#include -#include - -std::map environmentVars; - -namespace SohUtils { - void saveEnvironmentVar(const std::string& key, const std::string& value) { - environmentVars[key] = value; - } - - std::string getEnvironmentVar(const std::string& key) { - return environmentVars[key]; - } -} \ No newline at end of file diff --git a/libultraship/libultraship/Environment.h b/libultraship/libultraship/Environment.h deleted file mode 100644 index 4d6ab33462..0000000000 --- a/libultraship/libultraship/Environment.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -#include - -namespace SohUtils { - void saveEnvironmentVar(const std::string& key, const std::string& value); - std::string getEnvironmentVar(const std::string& key); -} \ No newline at end of file diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index f19ce7eac1..a1b44a6df3 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -8,7 +8,6 @@ #include #include "Archive.h" -#include "Environment.h" #include "GameSettings.h" #include "Console.h" #include "Hooks.h" @@ -1626,7 +1625,7 @@ namespace SohImGui { pos = ImVec2(size.x / 2 - sw / 2, 0); size = ImVec2(sw, size.y); } - std::string fb_str = SohUtils::getEnvironmentVar("framebuffer"); + std::string fb_str = gfxFramebuffer; if (!fb_str.empty()) { uintptr_t fbuf = (uintptr_t)std::stoull(fb_str); //ImGui::ImageSimple(reinterpret_cast(fbuf), pos, size); diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp index ad683e047b..3d199ef714 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp @@ -44,7 +44,6 @@ #include "gfx_cc.h" #include "gfx_rendering_api.h" #include "../../ImGuiImpl.h" -#include "../../Environment.h" #include "../../GlobalCtx2.h" #include "gfx_pc.h" diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp index 0a5d0ceef6..d855012ef5 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp @@ -32,7 +32,6 @@ #include "../../luslog.h" #include "../StrHash64.h" #include "../../ImGuiImpl.h" -#include "../../Environment.h" #include "../../GameVersions.h" #include "../../ResourceMgr.h" #include "../../Utils.h" @@ -49,6 +48,8 @@ extern "C" { int ResourceMgr_OTRSigCheck(char* imgData); } +std::string gfxFramebuffer; + using namespace std; #define SEG_ADDR(seg, addr) (addr | (seg << 24) | 1) @@ -2782,7 +2783,7 @@ void gfx_run(Gfx *commands, const std::unordered_map& mtx_replaceme rendering_state.scissor = {}; gfx_run_dl(commands); gfx_flush(); - SohUtils::saveEnvironmentVar("framebuffer", string()); + gfxFramebuffer = string(); if (game_renders_to_framebuffer) { gfx_rapi->start_draw_to_framebuffer(0, 1); gfx_rapi->clear_framebuffer(); @@ -2792,12 +2793,12 @@ void gfx_run(Gfx *commands, const std::unordered_map& mtx_replaceme 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))); + gfxFramebuffer = 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))); + gfxFramebuffer = std::to_string((uintptr_t)gfx_rapi->get_framebuffer_texture_id(game_framebuffer)); } } SohImGui::DrawFramebufferAndGameInput(); diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_pc.h b/libultraship/libultraship/Lib/Fast3D/gfx_pc.h index 4e620ef2d3..931093079a 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_pc.h +++ b/libultraship/libultraship/Lib/Fast3D/gfx_pc.h @@ -14,6 +14,8 @@ #define SCREEN_WIDTH 320 #define SCREEN_HEIGHT 240 +extern std::string gfxFramebuffer; + struct GfxRenderingAPI; struct GfxWindowManagerAPI; diff --git a/libultraship/libultraship/libultraship.vcxproj b/libultraship/libultraship/libultraship.vcxproj index 4d7eab9b42..52df7d3959 100644 --- a/libultraship/libultraship/libultraship.vcxproj +++ b/libultraship/libultraship/libultraship.vcxproj @@ -258,7 +258,6 @@ - @@ -354,7 +353,6 @@ - diff --git a/libultraship/libultraship/libultraship.vcxproj.filters b/libultraship/libultraship/libultraship.vcxproj.filters index fa5c505aa4..f84250c290 100644 --- a/libultraship/libultraship/libultraship.vcxproj.filters +++ b/libultraship/libultraship/libultraship.vcxproj.filters @@ -67,9 +67,6 @@ {ccd6359f-e357-41ca-9b89-5f509dd30649} - - {94ca4b98-cee2-48e6-a88b-68b8d2fed287} - {0dca2d94-45ba-4916-b03a-1dd5f949114c} @@ -321,9 +318,6 @@ Source Files\Audio - - Source Files\CustomImpl\Environment - Source Files\CustomImpl\Utils @@ -605,9 +599,6 @@ Source Files\Lib\ImGui - - Source Files\CustomImpl\Environment - Source Files\CustomImpl\Utils From 67d5ba08ab64bf3c913480a276b6e0886272ec2d Mon Sep 17 00:00:00 2001 From: Kenix3 Date: Tue, 2 Aug 2022 22:34:45 -0400 Subject: [PATCH 25/42] Converts gfxFramebuffer to be a pointer. --- libultraship/libultraship/ImGuiImpl.cpp | 8 +++----- libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp | 8 ++++---- libultraship/libultraship/Lib/Fast3D/gfx_pc.h | 2 +- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index a1b44a6df3..5581dd5a3b 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -1625,12 +1625,10 @@ namespace SohImGui { pos = ImVec2(size.x / 2 - sw / 2, 0); size = ImVec2(sw, size.y); } - std::string fb_str = gfxFramebuffer; - if (!fb_str.empty()) { - uintptr_t fbuf = (uintptr_t)std::stoull(fb_str); - //ImGui::ImageSimple(reinterpret_cast(fbuf), pos, size); + if (gfxFramebuffer != NULL) { + //ImGui::ImageSimple(reinterpret_cast(gfxFramebuffer), pos, size); ImGui::SetCursorPos(pos); - ImGui::Image(reinterpret_cast(fbuf), size); + ImGui::Image(reinterpret_cast(gfxFramebuffer), size); } ImGui::End(); diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp index d855012ef5..0660d6ebd5 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp @@ -48,7 +48,7 @@ extern "C" { int ResourceMgr_OTRSigCheck(char* imgData); } -std::string gfxFramebuffer; +uintptr_t gfxFramebuffer; using namespace std; @@ -2783,7 +2783,7 @@ void gfx_run(Gfx *commands, const std::unordered_map& mtx_replaceme rendering_state.scissor = {}; gfx_run_dl(commands); gfx_flush(); - gfxFramebuffer = string(); + gfxFramebuffer = NULL; if (game_renders_to_framebuffer) { gfx_rapi->start_draw_to_framebuffer(0, 1); gfx_rapi->clear_framebuffer(); @@ -2793,12 +2793,12 @@ void gfx_run(Gfx *commands, const std::unordered_map& mtx_replaceme if (different_size) { gfx_rapi->resolve_msaa_color_buffer(game_framebuffer_msaa_resolved, game_framebuffer); - gfxFramebuffer = std::to_string((uintptr_t)gfx_rapi->get_framebuffer_texture_id(game_framebuffer_msaa_resolved)); + gfxFramebuffer = (uintptr_t)gfx_rapi->get_framebuffer_texture_id(game_framebuffer_msaa_resolved); } else { gfx_rapi->resolve_msaa_color_buffer(0, game_framebuffer); } } else { - gfxFramebuffer = std::to_string((uintptr_t)gfx_rapi->get_framebuffer_texture_id(game_framebuffer)); + gfxFramebuffer = (uintptr_t)gfx_rapi->get_framebuffer_texture_id(game_framebuffer); } } SohImGui::DrawFramebufferAndGameInput(); diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_pc.h b/libultraship/libultraship/Lib/Fast3D/gfx_pc.h index 931093079a..feab8e3d93 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_pc.h +++ b/libultraship/libultraship/Lib/Fast3D/gfx_pc.h @@ -14,7 +14,7 @@ #define SCREEN_WIDTH 320 #define SCREEN_HEIGHT 240 -extern std::string gfxFramebuffer; +extern uintptr_t gfxFramebuffer; struct GfxRenderingAPI; struct GfxWindowManagerAPI; From 7267b60a264d65d45d9a518f8d433ff10b4156c9 Mon Sep 17 00:00:00 2001 From: Kenix3 Date: Tue, 2 Aug 2022 23:16:15 -0400 Subject: [PATCH 26/42] gfxFramebuffer is now only compared or set to 0 rather than NULL --- libultraship/libultraship/ImGuiImpl.cpp | 2 +- libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index 5581dd5a3b..eb417c98f1 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -1625,7 +1625,7 @@ namespace SohImGui { pos = ImVec2(size.x / 2 - sw / 2, 0); size = ImVec2(sw, size.y); } - if (gfxFramebuffer != NULL) { + if (gfxFramebuffer) { //ImGui::ImageSimple(reinterpret_cast(gfxFramebuffer), pos, size); ImGui::SetCursorPos(pos); ImGui::Image(reinterpret_cast(gfxFramebuffer), size); diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp index 0660d6ebd5..25030afbee 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp @@ -2783,7 +2783,7 @@ void gfx_run(Gfx *commands, const std::unordered_map& mtx_replaceme rendering_state.scissor = {}; gfx_run_dl(commands); gfx_flush(); - gfxFramebuffer = NULL; + gfxFramebuffer = 0; if (game_renders_to_framebuffer) { gfx_rapi->start_draw_to_framebuffer(0, 1); gfx_rapi->clear_framebuffer(); From 27e0f19dac4a2b429430414712a45d0585f9092e Mon Sep 17 00:00:00 2001 From: InfoManiac742 <26778801+InfoManiac742@users.noreply.github.com> Date: Tue, 2 Aug 2022 20:47:57 -0700 Subject: [PATCH 27/42] Remember save location (#980) * Remember save location * Clarified grotto caveat * Update ImGuiImpl.cpp --- libultraship/libultraship/ImGuiImpl.cpp | 3 + soh/src/code/z_sram.c | 113 ++++++++++++------------ 2 files changed, 61 insertions(+), 55 deletions(-) diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index eb417c98f1..555878b30f 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -1013,6 +1013,9 @@ namespace SohImGui { Tooltip("Allow Link to put items away without having to wait around"); EnhancementCheckbox("Mask Select in Inventory", "gMaskSelect"); Tooltip("After completing the mask trading sub-quest, press A and any direction on the mask slot to change masks"); + EnhancementCheckbox("Remember Save Location", "gRememberSaveLocation"); + Tooltip("When loading a save, places Link at the last entrance he went through.\n" + "This doesn't work if the save was made in a grotto."); ImGui::EndMenu(); } diff --git a/soh/src/code/z_sram.c b/soh/src/code/z_sram.c index 7670762c59..080c5ea9df 100644 --- a/soh/src/code/z_sram.c +++ b/soh/src/code/z_sram.c @@ -442,62 +442,65 @@ void Sram_OpenSave() { Save_LoadFile(); - switch (gSaveContext.savedSceneNum) { - case SCENE_YDAN: - case SCENE_DDAN: - case SCENE_BDAN: - 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: - gSaveContext.entranceIndex = dungeonEntrances[gSaveContext.savedSceneNum]; - break; - case SCENE_YDAN_BOSS: - gSaveContext.entranceIndex = 0; - break; - case SCENE_DDAN_BOSS: - gSaveContext.entranceIndex = 4; - break; - case SCENE_BDAN_BOSS: - gSaveContext.entranceIndex = 0x28; - break; - case SCENE_MORIBOSSROOM: - gSaveContext.entranceIndex = 0x169; - break; - case SCENE_FIRE_BS: - gSaveContext.entranceIndex = 0x165; - break; - case SCENE_MIZUSIN_BS: - gSaveContext.entranceIndex = 0x10; - break; - case SCENE_JYASINBOSS: - gSaveContext.entranceIndex = 0x82; - break; - case SCENE_HAKADAN_BS: - gSaveContext.entranceIndex = 0x37; - break; - case SCENE_GANON_SONOGO: - case SCENE_GANONTIKA_SONOGO: - case SCENE_GANON_BOSS: - case SCENE_GANON_FINAL: - case SCENE_GANON_DEMO: - gSaveContext.entranceIndex = 0x41B; - break; + if (!CVar_GetS32("gRememberSaveLocation", 0) || gSaveContext.savedSceneNum == SCENE_YOUSEI_IZUMI_TATE || + gSaveContext.savedSceneNum == SCENE_KAKUSIANA) { + switch (gSaveContext.savedSceneNum) { + case SCENE_YDAN: + case SCENE_DDAN: + case SCENE_BDAN: + 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: + gSaveContext.entranceIndex = dungeonEntrances[gSaveContext.savedSceneNum]; + break; + case SCENE_YDAN_BOSS: + gSaveContext.entranceIndex = 0; + break; + case SCENE_DDAN_BOSS: + gSaveContext.entranceIndex = 4; + break; + case SCENE_BDAN_BOSS: + gSaveContext.entranceIndex = 0x28; + break; + case SCENE_MORIBOSSROOM: + gSaveContext.entranceIndex = 0x169; + break; + case SCENE_FIRE_BS: + gSaveContext.entranceIndex = 0x165; + break; + case SCENE_MIZUSIN_BS: + gSaveContext.entranceIndex = 0x10; + break; + case SCENE_JYASINBOSS: + gSaveContext.entranceIndex = 0x82; + break; + case SCENE_HAKADAN_BS: + gSaveContext.entranceIndex = 0x37; + break; + case SCENE_GANON_SONOGO: + case SCENE_GANONTIKA_SONOGO: + case SCENE_GANON_BOSS: + case SCENE_GANON_FINAL: + case SCENE_GANON_DEMO: + gSaveContext.entranceIndex = 0x41B; + break; - default: - if (gSaveContext.savedSceneNum != SCENE_LINK_HOME) { - gSaveContext.entranceIndex = (LINK_AGE_IN_YEARS == YEARS_CHILD) ? 0xBB : 0x5F4; - } else { - gSaveContext.entranceIndex = 0xBB; - } - break; + default: + if (gSaveContext.savedSceneNum != SCENE_LINK_HOME) { + gSaveContext.entranceIndex = (LINK_AGE_IN_YEARS == YEARS_CHILD) ? 0xBB : 0x5F4; + } else { + gSaveContext.entranceIndex = 0xBB; + } + break; + } } osSyncPrintf("scene_no = %d\n", gSaveContext.entranceIndex); From db33604171bd09d33ddde83508da852e246df3d2 Mon Sep 17 00:00:00 2001 From: Nycz <63111944+Nycz-lab@users.noreply.github.com> Date: Wed, 3 Aug 2022 05:48:41 +0200 Subject: [PATCH 28/42] added Cheat Sync Time (#957) * added Cheat Sync Time This syncs the ingame time with the real world time. I wasnt quite sure where to put the code so im sorry if this is bad i just wanted to contribute to this project. * Update soh/src/code/z_play.c Co-authored-by: Christopher Leggett * Update z_play.c added suggestions from leggettc18 * Update z_play.c Co-authored-by: Christopher Leggett --- libultraship/libultraship/ImGuiImpl.cpp | 3 +++ soh/src/code/z_play.c | 28 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index 555878b30f..e6f7a31c68 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -1416,6 +1416,9 @@ namespace SohImGui { Tooltip("Prevents the Deku Shield from burning on contact with fire"); EnhancementCheckbox("Shield with Two-Handed Weapons", "gShieldTwoHanded"); Tooltip("This allows you to put up your shield with any two-handed weapon in hand except for Deku Sticks"); + Tooltip("This allows you to put up your shield with any two-handed weapon in hand\nexcept for Deku Sticks"); + EnhancementCheckbox("Time Sync", "gTimeSync"); + Tooltip("This syncs the ingame time with the real world time"); { static int32_t betaQuestEnabled = CVar_GetS32("gEnableBetaQuest", 0); diff --git a/soh/src/code/z_play.c b/soh/src/code/z_play.c index d5bcb5bebf..f999797158 100644 --- a/soh/src/code/z_play.c +++ b/soh/src/code/z_play.c @@ -7,6 +7,8 @@ #include "../libultraship/ImGuiImpl.h" #include "soh/frame_interpolation.h" +#include + void* D_8012D1F0 = NULL; //UNK_TYPE D_8012D1F4 = 0; // unused Input* D_8012D1F8 = NULL; @@ -1444,6 +1446,18 @@ void Gameplay_Draw(GlobalContext* globalCtx) { CLOSE_DISPS(gfxCtx); } +time_t Gameplay_GetRealTime() { + time_t t1, t2; + struct tm* tms; + time(&t1); + tms = localtime(&t1); + tms->tm_hour = 0; + tms->tm_min = 0; + tms->tm_sec = 0; + t2 = mktime(tms); + return t1 - t2; +} + void Gameplay_Main(GameState* thisx) { GlobalContext* globalCtx = (GlobalContext*)thisx; @@ -1487,6 +1501,20 @@ void Gameplay_Main(GameState* thisx) { if (1 && HREG(63)) { LOG_NUM("1", 1); } + + if (CVar_GetS32("gTimeSync", 0)) { + const int maxRealDaySeconds = 86400; + const int maxInGameDayTicks = 65536; + + int secs = (int)Gameplay_GetRealTime(); + float percent = (float)secs / (float)maxRealDaySeconds; + + int newIngameTime = maxInGameDayTicks * percent; + + gSaveContext.dayTime = newIngameTime; + + } + } // original name: "Game_play_demo_mode_check" From 6d0d608e38906624408e3a4e6fc697c238b89f5b Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Tue, 2 Aug 2022 22:51:07 -0500 Subject: [PATCH 29/42] Unrestricted warping in randomizer (#951) --- 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 afc69e8142..29d3ee4ff0 100644 --- a/soh/src/code/z_message_PAL.c +++ b/soh/src/code/z_message_PAL.c @@ -2737,7 +2737,7 @@ void Message_DrawMain(GlobalContext* globalCtx, Gfx** p) { if (msgCtx->lastPlayedSong < OCARINA_SONG_SARIAS && (msgCtx->ocarinaAction < OCARINA_ACTION_PLAYBACK_MINUET || msgCtx->ocarinaAction >= OCARINA_ACTION_PLAYBACK_SARIA)) { - if (msgCtx->disableWarpSongs || interfaceCtx->restrictions.warpSongs == 3) { + if (msgCtx->disableWarpSongs || (interfaceCtx->restrictions.warpSongs == 3 && !gSaveContext.n64ddFlag)) { Message_StartTextbox(globalCtx, 0x88C, NULL); // "You can't warp here!" globalCtx->msgCtx.ocarinaMode = OCARINA_MODE_04; } else if ((gSaveContext.eventInf[0] & 0xF) != 1) { From 2d60c772bf0d9369155305253c3d14dc23ea90c1 Mon Sep 17 00:00:00 2001 From: Kenix3 Date: Wed, 3 Aug 2022 00:07:52 -0400 Subject: [PATCH 30/42] LUS Cleanup: Controllers cleanup (#1016) --- libultraship/libultraship/ControlDeck.h | 1 - libultraship/libultraship/InputEditor.h | 2 - libultraship/libultraship/VirtualController.h | 56 ++++++++++--------- 3 files changed, 29 insertions(+), 30 deletions(-) diff --git a/libultraship/libultraship/ControlDeck.h b/libultraship/libultraship/ControlDeck.h index 58c258ca8c..15cba08e96 100644 --- a/libultraship/libultraship/ControlDeck.h +++ b/libultraship/libultraship/ControlDeck.h @@ -2,7 +2,6 @@ #include "Controller.h" #include -#include namespace Ship { diff --git a/libultraship/libultraship/InputEditor.h b/libultraship/libultraship/InputEditor.h index 39bddd51d3..81b1997eca 100644 --- a/libultraship/libultraship/InputEditor.h +++ b/libultraship/libultraship/InputEditor.h @@ -1,7 +1,5 @@ #pragma once -#include - #include "Lib/ImGui/imgui.h" namespace Ship { diff --git a/libultraship/libultraship/VirtualController.h b/libultraship/libultraship/VirtualController.h index 017373e55c..825d7df59b 100644 --- a/libultraship/libultraship/VirtualController.h +++ b/libultraship/libultraship/VirtualController.h @@ -4,32 +4,34 @@ #include "Controller.h" -class VirtualController final : public Ship::Controller { -public: - VirtualController(const std::string& CUID, const std::string& KeyName, bool Connected) { - GUID = CUID; - isConnected = Connected; - ButtonName = KeyName; - } +namespace Ship { + class VirtualController final : public Controller { + public: + VirtualController(const std::string& CUID, const std::string& KeyName, bool Connected) { + GUID = CUID; + isConnected = Connected; + ButtonName = KeyName; + } - std::map, int32_t> ReadButtonPress(); - void ReadFromSource(int32_t slot) override {} - const char* GetControllerName() override { return GUID.c_str(); } - const char* GetButtonName(int slot, int n64Button) override { return ButtonName.c_str(); } - void WriteToSource(int32_t slot, ControllerCallback* controller) override { } - bool Connected() const override { return isConnected; } - bool CanRumble() const override { return false; } - bool CanGyro() const override { return false; } + std::map, int32_t> ReadButtonPress(); + void ReadFromSource(int32_t slot) override {} + const char* GetControllerName() override { return GUID.c_str(); } + const char* GetButtonName(int slot, int n64Button) override { return ButtonName.c_str(); } + void WriteToSource(int32_t slot, ControllerCallback* controller) override { } + bool Connected() const override { return isConnected; } + bool CanRumble() const override { return false; } + bool CanGyro() const override { return false; } - void ClearRawPress() override {} - int32_t ReadRawPress() override { return -1; } - bool HasPadConf() const { return true; } - std::optional GetPadConfSection() { return "Unk"; } - void CreateDefaultBinding(int32_t slot) override {} -protected: - std::string ButtonName; - bool isConnected = false; - std::string GetControllerType() { return "Unk"; } - std::string GetConfSection() { return "Unk"; } - std::string GetBindingConfSection() { return "Unk"; } -}; + void ClearRawPress() override {} + int32_t ReadRawPress() override { return -1; } + bool HasPadConf() const { return true; } + std::optional GetPadConfSection() { return "Unk"; } + void CreateDefaultBinding(int32_t slot) override {} + protected: + std::string ButtonName; + bool isConnected = false; + std::string GetControllerType() { return "Unk"; } + std::string GetConfSection() { return "Unk"; } + std::string GetBindingConfSection() { return "Unk"; } + }; +} \ No newline at end of file From 8431cddb1470343cf19ce932df6bcd8b2351b781 Mon Sep 17 00:00:00 2001 From: Kenix3 Date: Tue, 2 Aug 2022 23:32:37 -0400 Subject: [PATCH 31/42] LUS Cleanup: GameOverlay and moves various GUI related files to it's own filter. --- libultraship/libultraship/GameOverlay.cpp | 403 +++++++++--------- libultraship/libultraship/GameOverlay.h | 24 +- .../libultraship/libultraship.vcxproj.filters | 42 +- 3 files changed, 238 insertions(+), 231 deletions(-) diff --git a/libultraship/libultraship/GameOverlay.cpp b/libultraship/libultraship/GameOverlay.cpp index ccbdc142c8..01d889dd63 100644 --- a/libultraship/libultraship/GameOverlay.cpp +++ b/libultraship/libultraship/GameOverlay.cpp @@ -10,219 +10,226 @@ #include "Lib/ImGui/imgui_internal.h" #include "Utils/StringHelper.h" -void Ship::GameOverlay::LoadFont(const std::string& name, const std::string& path, float fontSize) { - ImGuiIO& io = ImGui::GetIO(); - std::shared_ptr base = GlobalCtx2::GetInstance()->GetResourceManager()->GetArchive(); - std::shared_ptr font = std::make_shared(); - base->LoadFile(path, false, font); - if (font->bIsLoaded) { - char* font_data = new char[font->dwBufferSize]; - memcpy(font_data, font->buffer.get(), font->dwBufferSize); - Fonts[name] = io.Fonts->AddFontFromMemoryTTF(font_data, font->dwBufferSize, fontSize); +namespace Ship { + void GameOverlay::LoadFont(const std::string& name, const std::string& path, float fontSize) { + ImGuiIO& io = ImGui::GetIO(); + std::shared_ptr base = GlobalCtx2::GetInstance()->GetResourceManager()->GetArchive(); + std::shared_ptr font = std::make_shared(); + base->LoadFile(path, false, font); + if (font->bIsLoaded) { + char* font_data = new char[font->dwBufferSize]; + memcpy(font_data, font->buffer.get(), font->dwBufferSize); + Fonts[name] = io.Fonts->AddFontFromMemoryTTF(font_data, font->dwBufferSize, fontSize); + } } -} -void Ship::GameOverlay::TextDraw(float x, float y, bool shadow, ImVec4 color, const char* fmt, ...) { - char buf[1024]; - va_list args; - va_start(args, fmt); - vsnprintf(buf, IM_ARRAYSIZE(buf), fmt, args); - buf[IM_ARRAYSIZE(buf) - 1] = 0; - va_end(args); + void GameOverlay::TextDraw(float x, float y, bool shadow, ImVec4 color, const char* fmt, ...) { + char buf[1024]; + va_list args; + va_start(args, fmt); + vsnprintf(buf, IM_ARRAYSIZE(buf), fmt, args); + buf[IM_ARRAYSIZE(buf) - 1] = 0; + va_end(args); - ImGui::PushStyleColor(ImGuiCol_Text, color); - ImGui::PushFont(Fonts[this->CurrentFont]); - if (shadow) { - ImGui::SetCursorPos(ImVec2(x + 1, y + 1)); - ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(.0f, .0f, .0f, color.w)); + ImGui::PushStyleColor(ImGuiCol_Text, color); + ImGui::PushFont(Fonts[this->CurrentFont]); + if (shadow) { + ImGui::SetCursorPos(ImVec2(x + 1, y + 1)); + ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(.0f, .0f, .0f, color.w)); + ImGui::Text(buf, args); + } + ImGui::PopStyleColor(); + ImGui::SetCursorPos(ImVec2(x, y)); ImGui::Text(buf, args); + ImGui::PopFont(); + ImGui::PopStyleColor(); } - ImGui::PopStyleColor(); - ImGui::SetCursorPos(ImVec2(x, y)); - ImGui::Text(buf, args); - ImGui::PopFont(); - ImGui::PopStyleColor(); -} -void Ship::GameOverlay::TextDrawNotification(float duration, bool shadow, const char* fmt, ...) { - char buf[1024]; - va_list args; - va_start(args, fmt); - vsnprintf(buf, IM_ARRAYSIZE(buf), fmt, args); - buf[IM_ARRAYSIZE(buf) - 1] = 0; - va_end(args); - this->RegisteredOverlays[StringHelper::Sprintf("NotificationID:%d%d", rand(), this->RegisteredOverlays.size())] = new Overlay({ OverlayType::NOTIFICATION, ImStrdup(buf), duration, duration }); - NeedsCleanup = true; -} - -void Ship::GameOverlay::CleanupNotifications() { - if(!NeedsCleanup) return; - for (auto it = this->RegisteredOverlays.begin(); it != this->RegisteredOverlays.end(); ) { - if (it->second->type == OverlayType::NOTIFICATION && it->second->duration <= 0.0f) { - it = this->RegisteredOverlays.erase(it); - } else { - ++it; - } + void GameOverlay::TextDrawNotification(float duration, bool shadow, const char* fmt, ...) { + char buf[1024]; + va_list args; + va_start(args, fmt); + vsnprintf(buf, IM_ARRAYSIZE(buf), fmt, args); + buf[IM_ARRAYSIZE(buf) - 1] = 0; + va_end(args); + this->RegisteredOverlays[StringHelper::Sprintf("NotificationID:%d%d", rand(), this->RegisteredOverlays.size())] = new Overlay({ OverlayType::NOTIFICATION, ImStrdup(buf), duration, duration }); + NeedsCleanup = true; } - NeedsCleanup = false; -} -float Ship::GameOverlay::GetScreenWidth() { - const ImGuiViewport* viewport = ImGui::GetMainViewport(); - return viewport->Size.x; -} - -float Ship::GameOverlay::GetScreenHeight() { - const ImGuiViewport* viewport = ImGui::GetMainViewport(); - return viewport->Size.y; -} - -float Ship::GameOverlay::GetStringWidth(const char* text) { - return CalculateTextSize(text).x; -} - -ImVec2 Ship::GameOverlay::CalculateTextSize(const char* text, const char* text_end, bool hide_text_after_double_hash, float wrap_width) { - ImGuiContext& g = *GImGui; - - const char* text_display_end; - if (hide_text_after_double_hash) - text_display_end = ImGui::FindRenderedTextEnd(text, text_end); // Hide anything after a '##' string - else - text_display_end = text_end; - - GameOverlay* overlay = SohImGui::overlay; - - ImFont* font = overlay->CurrentFont == "Default" ? g.Font : overlay->Fonts[overlay->CurrentFont]; - const float font_size = font->FontSize; - if (text == text_display_end) - return ImVec2(0.0f, font_size); - ImVec2 text_size = font->CalcTextSizeA(font_size, FLT_MAX, wrap_width, text, text_display_end, NULL); - - // Round - // FIXME: This has been here since Dec 2015 (7b0bf230) but down the line we want this out. - // FIXME: Investigate using ceilf or e.g. - // - https://git.musl-libc.org/cgit/musl/tree/src/math/ceilf.c - // - https://embarkstudios.github.io/rust-gpu/api/src/libm/math/ceilf.rs.html - text_size.x = IM_FLOOR(text_size.x + 0.99999f); - - return text_size; -} - -void Ship::GameOverlay::Init() { - this->LoadFont("Press Start 2P", "assets/ship_of_harkinian/fonts/PressStart2P-Regular.ttf", 12.0f); - this->LoadFont("Fipps", "assets/ship_of_harkinian/fonts/Fipps-Regular.otf", 32.0f); - const std::string DefaultFont = this->Fonts.begin()->first; - if(!this->Fonts.empty()) { - const std::string font = CVar_GetString("gOverlayFont", ImStrdup(DefaultFont.c_str())); - for (auto& [name, _] : this->Fonts) { - if (font.starts_with(name)) { - this->CurrentFont = name; - break; + void GameOverlay::CleanupNotifications() { + if (!NeedsCleanup) return; + for (auto it = this->RegisteredOverlays.begin(); it != this->RegisteredOverlays.end(); ) { + if (it->second->type == OverlayType::NOTIFICATION && it->second->duration <= 0.0f) { + it = this->RegisteredOverlays.erase(it); } - this->CurrentFont = DefaultFont; - } - } - SohImGui::console->Commands["overlay"] = { OverlayCommand, "Draw an overlay using a cvar value" }; -} - -void Ship::GameOverlay::DrawSettings() { - ImGui::Text("Overlays Text Font"); - if (ImGui::BeginCombo("##TextFont", this->CurrentFont.c_str())) { - for (auto& [name, font] : this->Fonts) { - if (ImGui::Selectable(name.c_str(), name == this->CurrentFont)) { - this->CurrentFont = name; - CVar_SetString("gOverlayFont", ImStrdup(name.c_str())); - SohImGui::needs_save = true; + else { + ++it; } - - } - ImGui::EndCombo(); - } -} - - -void Ship::GameOverlay::Draw() { - const ImGuiViewport* viewport = ImGui::GetMainViewport(); - - ImGui::SetNextWindowPos(viewport->Pos, ImGuiCond_Always); - ImGui::SetNextWindowSize(viewport->Size, ImGuiCond_Always); - ImGui::Begin("SoHOverlay", nullptr, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoBackground | - ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoInputs); - - this->CleanupNotifications(); - - float textY = 50; - float notY = 0; - - for (auto &[key, overlay] : this->RegisteredOverlays) { - - if (overlay->type == OverlayType::TEXT) { - const char* text = ImStrdup(overlay->value); - const CVar* var = CVar_Get(text); - ImVec4 color = ImVec4(1.0f, 1.0f, 1.0f, 1.0f); - - switch (var->type) { - case CVarType::Float: - this->TextDraw(30, textY, true, color, "%s %.2f", text, var->value.valueFloat); - break; - case CVarType::S32: - this->TextDraw(30, textY, true, color, "%s %d", text, var->value.valueS32); - break; - case CVarType::String: - this->TextDraw(30, textY, true, color, "%s %s", text, var->value.valueStr); - break; - case CVarType::RGBA: - this->TextDraw(30, textY, true, color, "#%08X", text, var->value.valueRGBA); - break; - } - - free((void*) text); - textY += 30; - } - - if (overlay->type == OverlayType::NOTIFICATION && overlay->duration > 0) { - const char* text = overlay->value; - const float duration = overlay->duration / overlay->fadeTime; - - const ImVec4 color = ImVec4(1.0f, 1.0f, 1.0f, duration); - const float textWidth = this->GetStringWidth(overlay->value); - - this->TextDraw(GetScreenWidth() - textWidth - 40, GetScreenHeight() - 40 - notY, true, color, text); - notY += 30; - overlay->duration -= .05f; } + NeedsCleanup = false; } - ImGui::End(); -} - - -bool Ship::OverlayCommand(const std::vector& args) { - if (args.size() < 3) { - return CMD_FAILED; + float GameOverlay::GetScreenWidth() { + const ImGuiViewport* viewport = ImGui::GetMainViewport(); + return viewport->Size.x; } - if (CVar_Get(args[2].c_str()) != nullptr) { - const char* key = args[2].c_str(); + float GameOverlay::GetScreenHeight() { + const ImGuiViewport* viewport = ImGui::GetMainViewport(); + return viewport->Size.y; + } + + float GameOverlay::GetStringWidth(const char* text) { + return CalculateTextSize(text).x; + } + + ImVec2 GameOverlay::CalculateTextSize(const char* text, const char* text_end, bool hide_text_after_double_hash, float wrap_width) { + ImGuiContext& g = *GImGui; + + const char* text_display_end; + if (hide_text_after_double_hash) + text_display_end = ImGui::FindRenderedTextEnd(text, text_end); // Hide anything after a '##' string + else + text_display_end = text_end; + GameOverlay* overlay = SohImGui::overlay; - if (args[1] == "add") { - if (!overlay->RegisteredOverlays.contains(key)) { - overlay->RegisteredOverlays[key] = new Overlay({ OverlayType::TEXT, ImStrdup(key), -1.0f }); - INFO("Added overlay: %s ", key); - } else { - ERROR("Overlay already exists: %s", key); - } - } else if (args[1] == "remove") { - if (overlay->RegisteredOverlays.contains(key)) { - overlay->RegisteredOverlays.erase(key); - INFO("Removed overlay: %s ", key); - } else { - ERROR("Overlay not found: %s ", key); - } - } - } else { - ERROR("CVar %s does not exist", args[2].c_str()); + + ImFont* font = overlay->CurrentFont == "Default" ? g.Font : overlay->Fonts[overlay->CurrentFont]; + const float font_size = font->FontSize; + if (text == text_display_end) + return ImVec2(0.0f, font_size); + ImVec2 text_size = font->CalcTextSizeA(font_size, FLT_MAX, wrap_width, text, text_display_end, NULL); + + // Round + // FIXME: This has been here since Dec 2015 (7b0bf230) but down the line we want this out. + // FIXME: Investigate using ceilf or e.g. + // - https://git.musl-libc.org/cgit/musl/tree/src/math/ceilf.c + // - https://embarkstudios.github.io/rust-gpu/api/src/libm/math/ceilf.rs.html + text_size.x = IM_FLOOR(text_size.x + 0.99999f); + + return text_size; } - return CMD_SUCCESS; -} \ No newline at end of file + void GameOverlay::Init() { + this->LoadFont("Press Start 2P", "assets/ship_of_harkinian/fonts/PressStart2P-Regular.ttf", 12.0f); + this->LoadFont("Fipps", "assets/ship_of_harkinian/fonts/Fipps-Regular.otf", 32.0f); + const std::string DefaultFont = this->Fonts.begin()->first; + if (!this->Fonts.empty()) { + const std::string font = CVar_GetString("gOverlayFont", ImStrdup(DefaultFont.c_str())); + for (auto& [name, _] : this->Fonts) { + if (font.starts_with(name)) { + this->CurrentFont = name; + break; + } + this->CurrentFont = DefaultFont; + } + } + SohImGui::console->Commands["overlay"] = { OverlayCommand, "Draw an overlay using a cvar value" }; + } + + void GameOverlay::DrawSettings() { + ImGui::Text("Overlays Text Font"); + if (ImGui::BeginCombo("##TextFont", this->CurrentFont.c_str())) { + for (auto& [name, font] : this->Fonts) { + if (ImGui::Selectable(name.c_str(), name == this->CurrentFont)) { + this->CurrentFont = name; + CVar_SetString("gOverlayFont", ImStrdup(name.c_str())); + SohImGui::needs_save = true; + } + + } + ImGui::EndCombo(); + } + } + + + void GameOverlay::Draw() { + const ImGuiViewport* viewport = ImGui::GetMainViewport(); + + ImGui::SetNextWindowPos(viewport->Pos, ImGuiCond_Always); + ImGui::SetNextWindowSize(viewport->Size, ImGuiCond_Always); + ImGui::Begin("SoHOverlay", nullptr, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoBackground | + ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoInputs); + + this->CleanupNotifications(); + + float textY = 50; + float notY = 0; + + for (auto& [key, overlay] : this->RegisteredOverlays) { + + if (overlay->type == OverlayType::TEXT) { + const char* text = ImStrdup(overlay->value); + const CVar* var = CVar_Get(text); + ImVec4 color = ImVec4(1.0f, 1.0f, 1.0f, 1.0f); + + switch (var->type) { + case CVarType::Float: + this->TextDraw(30, textY, true, color, "%s %.2f", text, var->value.valueFloat); + break; + case CVarType::S32: + this->TextDraw(30, textY, true, color, "%s %d", text, var->value.valueS32); + break; + case CVarType::String: + this->TextDraw(30, textY, true, color, "%s %s", text, var->value.valueStr); + break; + case CVarType::RGBA: + this->TextDraw(30, textY, true, color, "#%08X", text, var->value.valueRGBA); + break; + } + + free((void*)text); + textY += 30; + } + + if (overlay->type == OverlayType::NOTIFICATION && overlay->duration > 0) { + const char* text = overlay->value; + const float duration = overlay->duration / overlay->fadeTime; + + const ImVec4 color = ImVec4(1.0f, 1.0f, 1.0f, duration); + const float textWidth = this->GetStringWidth(overlay->value); + + this->TextDraw(GetScreenWidth() - textWidth - 40, GetScreenHeight() - 40 - notY, true, color, text); + notY += 30; + overlay->duration -= .05f; + } + } + + ImGui::End(); + } + + + bool OverlayCommand(const std::vector& args) { + if (args.size() < 3) { + return CMD_FAILED; + } + + if (CVar_Get(args[2].c_str()) != nullptr) { + const char* key = args[2].c_str(); + GameOverlay* overlay = SohImGui::overlay; + if (args[1] == "add") { + if (!overlay->RegisteredOverlays.contains(key)) { + overlay->RegisteredOverlays[key] = new Overlay({ OverlayType::TEXT, ImStrdup(key), -1.0f }); + INFO("Added overlay: %s ", key); + } + else { + ERROR("Overlay already exists: %s", key); + } + } + else if (args[1] == "remove") { + if (overlay->RegisteredOverlays.contains(key)) { + overlay->RegisteredOverlays.erase(key); + INFO("Removed overlay: %s ", key); + } + else { + ERROR("Overlay not found: %s ", key); + } + } + } + else { + ERROR("CVar %s does not exist", args[2].c_str()); + } + + return CMD_SUCCESS; + } +} diff --git a/libultraship/libultraship/GameOverlay.h b/libultraship/libultraship/GameOverlay.h index c9290390e4..061d259ba8 100644 --- a/libultraship/libultraship/GameOverlay.h +++ b/libultraship/libultraship/GameOverlay.h @@ -3,21 +3,21 @@ #include #include "Lib/ImGui/imgui.h" -#include #include -enum class OverlayType { - TEXT, IMAGE, NOTIFICATION -}; - -struct Overlay { - OverlayType type; - const char* value; - float fadeTime; - float duration; -}; - namespace Ship { + + enum class OverlayType { + TEXT, IMAGE, NOTIFICATION + }; + + struct Overlay { + OverlayType type; + const char* value; + float fadeTime; + float duration; + }; + class GameOverlay { public: std::unordered_map RegisteredOverlays; diff --git a/libultraship/libultraship/libultraship.vcxproj.filters b/libultraship/libultraship/libultraship.vcxproj.filters index f84250c290..d807349a29 100644 --- a/libultraship/libultraship/libultraship.vcxproj.filters +++ b/libultraship/libultraship/libultraship.vcxproj.filters @@ -82,9 +82,6 @@ {bd6557f1-9480-413b-b0cd-843f8efc1939} - - {3285ab8a-06d8-4dac-9af9-efb2a9723ab1} - {db6e02cc-fc4c-4138-8219-1d281ad93ec2} @@ -97,6 +94,9 @@ {010dc29b-d1f6-4793-a4e7-4156aa4fcdd6} + + {5d68254f-662d-4e8c-a57f-de0d8e1d4a58} + @@ -300,12 +300,6 @@ Source Files\Lib\ImGui - - Source Files\CustomImpl - - - Source Files\CustomImpl - Source Files\Lib\ImGui @@ -342,9 +336,6 @@ Source Files\CustomImpl - - Source Files\CustomImpl\Overlay - Source Files\Resources\Files @@ -360,6 +351,15 @@ Source Files\Lib\Mercury + + Source Files\GUI + + + Source Files\GUI + + + Source Files\GUI + @@ -587,12 +587,6 @@ Source Files\Lib\ImGui - - Source Files\CustomImpl - - - Source Files\CustomImpl - Source Files\Lib\ImGui @@ -647,9 +641,6 @@ Header Files - - Source Files\CustomImpl\Overlay - Header Files\Resources\Files @@ -677,5 +668,14 @@ Source Files\Controller + + Source Files\GUI + + + Source Files\GUI + + + Source Files\GUI + \ No newline at end of file From fd379896d6ae16f91a85ee6039e22f6dc6bc5a33 Mon Sep 17 00:00:00 2001 From: Kenix3 Date: Tue, 2 Aug 2022 23:14:25 -0400 Subject: [PATCH 32/42] LUS Cleanup: Clean up hooks system. --- libultraship/libultraship/GameSettings.cpp | 4 ++-- libultraship/libultraship/Hooks.cpp | 10 --------- libultraship/libultraship/Hooks.h | 22 +++---------------- libultraship/libultraship/ImGuiImpl.cpp | 6 ++--- .../libultraship/Lib/Fast3D/gfx_dxgi.cpp | 2 +- .../libultraship/Lib/Fast3D/gfx_pc.cpp | 2 +- .../libultraship/Lib/Fast3D/gfx_sdl2.cpp | 4 ++-- libultraship/libultraship/Window.cpp | 15 +++++-------- .../libultraship/libultraship.vcxproj | 1 - .../libultraship/libultraship.vcxproj.filters | 3 --- soh/soh/OTRGlobals.cpp | 10 ++++----- soh/soh/OTRGlobals.h | 1 + soh/src/code/audioMgr.c | 4 ++-- .../ovl_kaleido_scope/z_kaleido_scope_PAL.c | 1 - 14 files changed, 26 insertions(+), 59 deletions(-) delete mode 100644 libultraship/libultraship/Hooks.cpp diff --git a/libultraship/libultraship/GameSettings.cpp b/libultraship/libultraship/GameSettings.cpp index e3f95ad76a..d6af513993 100644 --- a/libultraship/libultraship/GameSettings.cpp +++ b/libultraship/libultraship/GameSettings.cpp @@ -41,8 +41,8 @@ namespace Game { } void InitSettings() { - ModInternal::RegisterHook(UpdateAudio); - ModInternal::RegisterHook([] { + Ship::RegisterHook(UpdateAudio); + Ship::RegisterHook([] { gfx_get_current_rendering_api()->set_texture_filter((FilteringMode) CVar_GetS32("gTextureFilter", FILTER_THREE_POINT)); SohImGui::console->opened = CVar_GetS32("gConsoleEnabled", 0); SohImGui::controller->Opened = CVar_GetS32("gControllerConfigurationEnabled", 0); diff --git a/libultraship/libultraship/Hooks.cpp b/libultraship/libultraship/Hooks.cpp deleted file mode 100644 index 2b66ed318e..0000000000 --- a/libultraship/libultraship/Hooks.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include "Hooks.h" -#include -#include -#include -#include -#include - -void ModInternal_ExecuteAudioInitHooks() { - ModInternal::ExecuteHooks(); -} diff --git a/libultraship/libultraship/Hooks.h b/libultraship/libultraship/Hooks.h index 411cffe42e..5f29a831cd 100644 --- a/libultraship/libultraship/Hooks.h +++ b/libultraship/libultraship/Hooks.h @@ -1,15 +1,12 @@ #pragma once -#ifdef __cplusplus - #include - #include "UltraController.h" -#include "Controller.h" #define DEFINE_HOOK(name, type) struct name { typedef std::function fn; } -namespace ModInternal { +namespace Ship { + class Controller; template struct RegisteredHooks { @@ -29,22 +26,9 @@ namespace ModInternal { } DEFINE_HOOK(ControllerRead, void(OSContPad* cont_pad)); - DEFINE_HOOK(ControllerRawInput, void(Ship::Controller* backend, uint32_t raw)); + DEFINE_HOOK(ControllerRawInput, void(Controller* backend, uint32_t raw)); DEFINE_HOOK(AudioInit, void()); DEFINE_HOOK(LoadTexture, void(const char* path, uint8_t** texture)); DEFINE_HOOK(GfxInit, void()); DEFINE_HOOK(ExitGame, void()); - } - -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -void ModInternal_ExecuteAudioInitHooks(); - -#ifdef __cplusplus -} -#endif diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index e6f7a31c68..1a0a79bf91 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -24,7 +24,7 @@ #include "Lib/stb/stb_image.h" #include "Lib/Fast3D/gfx_rendering_api.h" #include "Lib/spdlog/include/spdlog/common.h" -#include "Utils/StringHelper.h" +#include "UltraController.h" #if __APPLE__ #include @@ -385,7 +385,7 @@ namespace SohImGui { ImGui::GetStyle().ScaleAllSizes(2); #endif - ModInternal::RegisterHook([] { + Ship::RegisterHook([] { if (GlobalCtx2::GetInstance()->GetWindow()->IsFullscreen()) ShowCursor(CVar_GetS32("gOpenMenuBar", 0), Dialogues::dLoadSettings); @@ -402,7 +402,7 @@ namespace SohImGui { LoadTexture("C-Down", "assets/ship_of_harkinian/buttons/CDown.png"); }); - ModInternal::RegisterHook([](OSContPad* cont_pad) { + Ship::RegisterHook([](OSContPad* cont_pad) { pads = cont_pad; }); diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_dxgi.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_dxgi.cpp index aabeb0acf8..1bf67891b2 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_dxgi.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_dxgi.cpp @@ -240,7 +240,7 @@ static LRESULT CALLBACK gfx_dxgi_wnd_proc(HWND h_wnd, UINT message, WPARAM w_par dxgi.current_height = (uint32_t)(l_param >> 16); break; case WM_DESTROY: - ModInternal::ExecuteHooks(); + Ship::ExecuteHooks(); exit(0); case WM_PAINT: if (dxgi.in_paint) { diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp index 25030afbee..8aebec9e22 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp @@ -2699,7 +2699,7 @@ void gfx_init(struct GfxWindowManagerAPI *wapi, struct GfxRenderingAPI *rapi, co //gfx_lookup_or_create_shader_program(precomp_shaders[i]); } - ModInternal::ExecuteHooks(); + Ship::ExecuteHooks(); } struct GfxRenderingAPI *gfx_get_current_rendering_api(void) { diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_sdl2.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_sdl2.cpp index 2576bc17b1..06d88b78c4 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_sdl2.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_sdl2.cpp @@ -239,7 +239,7 @@ static void gfx_sdl_main_loop(void (*run_one_game_iter)(void)) { #ifdef __SWITCH__ Ship::Switch::Exit(); #endif - ModInternal::ExecuteHooks(); + Ship::ExecuteHooks(); } static void gfx_sdl_get_dimensions(uint32_t *width, uint32_t *height) { @@ -309,7 +309,7 @@ static void gfx_sdl_handle_events(void) { Game::SaveSettings(); break; case SDL_QUIT: - ModInternal::ExecuteHooks(); + Ship::ExecuteHooks(); SDL_Quit(); // bandaid fix for linux window closing issue exit(0); } diff --git a/libultraship/libultraship/Window.cpp b/libultraship/libultraship/Window.cpp index 9c11f2d6d5..d3bdee369b 100644 --- a/libultraship/libultraship/Window.cpp +++ b/libultraship/libultraship/Window.cpp @@ -1,7 +1,6 @@ #include "Window.h" #include "spdlog/spdlog.h" #include "KeyboardController.h" -#include "SDLController.h" #include "GlobalCtx2.h" #include "DisplayList.h" #include "Vertex.h" @@ -11,22 +10,20 @@ #include "Blob.h" #include "Matrix.h" #include "AudioPlayer.h" +#include "Hooks.h" +#include "UltraController.h" #include "WasapiAudioPlayer.h" #include "PulseAudioPlayer.h" -#include "SDLAudioPlayer.h" #include "Lib/Fast3D/gfx_pc.h" #include "Lib/Fast3D/gfx_sdl.h" #include "Lib/Fast3D/gfx_opengl.h" -#include "stox.h" #if __APPLE__ #include #else #include #endif -#include #include #include -#include "Hooks.h" #include "Console.h" #include "Cvar.h" @@ -80,7 +77,7 @@ extern "C" { Ship::GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck()->WriteToPad(pad); } - ModInternal::ExecuteHooks(pad); + Ship::ExecuteHooks(pad); } const char* ResourceMgr_GetNameByCRC(uint64_t crc) { @@ -126,7 +123,7 @@ extern "C" { if (hashStr != nullptr) { const auto res = LOAD_TEX(hashStr->c_str()); - ModInternal::ExecuteHooks(hashStr->c_str(), &res->imageData); + Ship::ExecuteHooks(hashStr->c_str(), &res->imageData); return reinterpret_cast(res->imageData); } else { @@ -153,7 +150,7 @@ extern "C" { char* ResourceMgr_LoadTexByName(char* texPath) { const auto res = LOAD_TEX(texPath); - ModInternal::ExecuteHooks(texPath, &res->imageData); + Ship::ExecuteHooks(texPath, &res->imageData); return (char*)res->imageData; } @@ -280,7 +277,7 @@ namespace Ship { WmApi->set_fullscreen_changed_callback(OnFullscreenChanged); WmApi->set_keyboard_callbacks(KeyDown, KeyUp, AllKeysUp); - ModInternal::RegisterHook([this]() { + Ship::RegisterHook([this]() { ControllerApi->SaveControllerSettings(); }); } diff --git a/libultraship/libultraship/libultraship.vcxproj b/libultraship/libultraship/libultraship.vcxproj index 52df7d3959..95250d4b1a 100644 --- a/libultraship/libultraship/libultraship.vcxproj +++ b/libultraship/libultraship/libultraship.vcxproj @@ -282,7 +282,6 @@ - diff --git a/libultraship/libultraship/libultraship.vcxproj.filters b/libultraship/libultraship/libultraship.vcxproj.filters index d807349a29..bf51936824 100644 --- a/libultraship/libultraship/libultraship.vcxproj.filters +++ b/libultraship/libultraship/libultraship.vcxproj.filters @@ -327,9 +327,6 @@ Source Files\ModManager - - Source Files\CustomImpl\Hooks - Source Files\Logging diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 2bdf80e682..41347264ec 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -4,9 +4,7 @@ #include #include #include -#include #include "GlobalCtx2.h" -#include "GameSettings.h" #include "ResourceMgr.h" #include "DisplayList.h" #include "PlayerAnimation.h" @@ -22,11 +20,9 @@ #else #include #endif -#include #include #include #include -#include #include "Lib/stb/stb_image.h" #define DRMP3_IMPLEMENTATION #include "Lib/dr_libs/mp3.h" @@ -40,10 +36,10 @@ #include #include "Enhancements/n64_weird_frame_data.inc" #include "soh/frame_interpolation.h" -#include "Utils/BitConverter.h" #include "variables.h" #include "macros.h" #include +#include "Hooks.h" #ifdef __APPLE__ #include @@ -1376,6 +1372,10 @@ extern "C" int Controller_ShouldRumble(size_t i) { return 0; } +extern "C" void Hooks_ExecuteAudioInit() { + Ship::ExecuteHooks(); +} + extern "C" void* getN64WeirdFrame(s32 i) { char* weirdFrameBytes = reinterpret_cast(n64WeirdFrames); return &weirdFrameBytes[i + sizeof(n64WeirdFrames)]; diff --git a/soh/soh/OTRGlobals.h b/soh/soh/OTRGlobals.h index d838b94dfd..018c3c9414 100644 --- a/soh/soh/OTRGlobals.h +++ b/soh/soh/OTRGlobals.h @@ -85,6 +85,7 @@ 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); +void Hooks_ExecuteAudioInit(); void* getN64WeirdFrame(s32 i); Sprite* GetSeedTexture(uint8_t index); void Randomizer_LoadSettings(const char* spoilerFileName); diff --git a/soh/src/code/audioMgr.c b/soh/src/code/audioMgr.c index dc826aa5c0..35c21ab950 100644 --- a/soh/src/code/audioMgr.c +++ b/soh/src/code/audioMgr.c @@ -1,6 +1,6 @@ #include "global.h" -#include "Hooks.h" #include +#include "soh/OTRGlobals.h" void func_800C3C80(AudioMgr* audioMgr) { AudioTask* task; @@ -108,7 +108,7 @@ void AudioMgr_Init(AudioMgr* audioMgr, void* stack, OSPri pri, OSId id, SchedCon AudioLoad_SetDmaHandler(DmaMgr_DmaHandler); Audio_InitSound(); osSendMesgPtr(&audioMgr->unk_C8, NULL, OS_MESG_BLOCK); - ModInternal_ExecuteAudioInitHooks(); + Hooks_ExecuteAudioInit(); // Removed due to crash //IrqMgr_AddClient(audioMgr->irqMgr, &irqClient, &audioMgr->unk_74); hasInitialized = true; 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 2735ed9b42..66967e9a45 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 @@ -12,7 +12,6 @@ #include "textures/map_name_static/map_name_static.h" #include "textures/map_48x85_static/map_48x85_static.h" #include "vt.h" -#include "Hooks.h" #include "soh/frame_interpolation.h" From 4ce19e144833d93ed4cb03d836ebb7aa67063093 Mon Sep 17 00:00:00 2001 From: Kenix3 Date: Wed, 3 Aug 2022 20:04:29 -0400 Subject: [PATCH 33/42] LUS Cleanup: Only including the correct audio player header file. --- libultraship/libultraship/AudioPlayer.h | 9 +++++++++ libultraship/libultraship/Window.cpp | 2 -- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/libultraship/libultraship/AudioPlayer.h b/libultraship/libultraship/AudioPlayer.h index 346239624b..739531c511 100644 --- a/libultraship/libultraship/AudioPlayer.h +++ b/libultraship/libultraship/AudioPlayer.h @@ -1,5 +1,14 @@ #pragma once #include "stdint.h" +#ifndef _MSC_VER +#include "SDLAudioPlayer.h" +#endif +#ifdef _MSC_VER +#include "WasapiAudioPlayer.h" +#endif +#ifdef __APPLE__ +#include "PulseAudioPlayer.h" +#endif namespace Ship { class AudioPlayer { diff --git a/libultraship/libultraship/Window.cpp b/libultraship/libultraship/Window.cpp index d3bdee369b..86e1e12e01 100644 --- a/libultraship/libultraship/Window.cpp +++ b/libultraship/libultraship/Window.cpp @@ -12,8 +12,6 @@ #include "AudioPlayer.h" #include "Hooks.h" #include "UltraController.h" -#include "WasapiAudioPlayer.h" -#include "PulseAudioPlayer.h" #include "Lib/Fast3D/gfx_pc.h" #include "Lib/Fast3D/gfx_sdl.h" #include "Lib/Fast3D/gfx_opengl.h" From 7675309e3fd0583da1f10a4cdd9db99c60de5817 Mon Sep 17 00:00:00 2001 From: Kenix3 Date: Wed, 3 Aug 2022 20:20:15 -0400 Subject: [PATCH 34/42] Moves specific audio player header file include to after the definition of AudioPlayer class in AudioPlayer.h --- libultraship/libultraship/AudioPlayer.h | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/libultraship/libultraship/AudioPlayer.h b/libultraship/libultraship/AudioPlayer.h index 739531c511..cd8aa75cbf 100644 --- a/libultraship/libultraship/AudioPlayer.h +++ b/libultraship/libultraship/AudioPlayer.h @@ -1,14 +1,5 @@ #pragma once #include "stdint.h" -#ifndef _MSC_VER -#include "SDLAudioPlayer.h" -#endif -#ifdef _MSC_VER -#include "WasapiAudioPlayer.h" -#endif -#ifdef __APPLE__ -#include "PulseAudioPlayer.h" -#endif namespace Ship { class AudioPlayer { @@ -23,3 +14,13 @@ namespace Ship { constexpr int GetSampleRate() const { return 44100; } }; } + +#if !_MSC_VER && !__APPLE__ +#include "SDLAudioPlayer.h" +#endif +#ifdef _MSC_VER +#include "WasapiAudioPlayer.h" +#endif +#ifdef __APPLE__ +#include "PulseAudioPlayer.h" +#endif From e68fac14c892e9658e9707ad4a40f3df08abf8cc Mon Sep 17 00:00:00 2001 From: Kenix3 Date: Wed, 3 Aug 2022 20:40:33 -0400 Subject: [PATCH 35/42] Uses correct audio player per platform now. --- libultraship/libultraship/AudioPlayer.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/libultraship/libultraship/AudioPlayer.h b/libultraship/libultraship/AudioPlayer.h index cd8aa75cbf..c2b010babb 100644 --- a/libultraship/libultraship/AudioPlayer.h +++ b/libultraship/libultraship/AudioPlayer.h @@ -16,11 +16,11 @@ namespace Ship { } #if !_MSC_VER && !__APPLE__ +#endif +#ifdef _WIN32 +#include "WasapiAudioPlayer.h" +#elif defined(__linux) +#include "PulseAudioPlayer.h" +#else #include "SDLAudioPlayer.h" #endif -#ifdef _MSC_VER -#include "WasapiAudioPlayer.h" -#endif -#ifdef __APPLE__ -#include "PulseAudioPlayer.h" -#endif From 212d774613525d764084476bb5d5462dec951abc Mon Sep 17 00:00:00 2001 From: Kenix3 Date: Wed, 3 Aug 2022 20:56:04 -0400 Subject: [PATCH 36/42] Clean up unnecessary compiler checks. --- libultraship/libultraship/AudioPlayer.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/libultraship/libultraship/AudioPlayer.h b/libultraship/libultraship/AudioPlayer.h index c2b010babb..863cac8751 100644 --- a/libultraship/libultraship/AudioPlayer.h +++ b/libultraship/libultraship/AudioPlayer.h @@ -15,8 +15,6 @@ namespace Ship { }; } -#if !_MSC_VER && !__APPLE__ -#endif #ifdef _WIN32 #include "WasapiAudioPlayer.h" #elif defined(__linux) From 6d3d5e7da5e8728adcf678a9febfb01aa86746c0 Mon Sep 17 00:00:00 2001 From: Kenix3 Date: Wed, 3 Aug 2022 21:22:07 -0400 Subject: [PATCH 37/42] LUS Cleanup: Removes unnecessary ModManager class. --- libultraship/libultraship/GameOverlay.cpp | 1 - libultraship/libultraship/GlobalCtx2.cpp | 5 - libultraship/libultraship/ImGuiImpl.cpp | 1 - libultraship/libultraship/ModManager.cpp | 23 ---- libultraship/libultraship/ModManager.h | 12 -- libultraship/libultraship/ModModule.h | 19 --- libultraship/libultraship/TextureMod.cpp | 128 ------------------ libultraship/libultraship/TextureMod.h | 55 -------- .../libultraship/libultraship.vcxproj | 5 - .../libultraship/libultraship.vcxproj.filters | 21 --- 10 files changed, 270 deletions(-) delete mode 100644 libultraship/libultraship/ModManager.cpp delete mode 100644 libultraship/libultraship/ModManager.h delete mode 100644 libultraship/libultraship/ModModule.h delete mode 100644 libultraship/libultraship/TextureMod.cpp delete mode 100644 libultraship/libultraship/TextureMod.h diff --git a/libultraship/libultraship/GameOverlay.cpp b/libultraship/libultraship/GameOverlay.cpp index 01d889dd63..00bab575fb 100644 --- a/libultraship/libultraship/GameOverlay.cpp +++ b/libultraship/libultraship/GameOverlay.cpp @@ -6,7 +6,6 @@ #include "ResourceMgr.h" #include "Console.h" #include "ImGuiImpl.h" -#include "TextureMod.h" #include "Lib/ImGui/imgui_internal.h" #include "Utils/StringHelper.h" diff --git a/libultraship/libultraship/GlobalCtx2.cpp b/libultraship/libultraship/GlobalCtx2.cpp index 5eb449ad37..4d6046de39 100644 --- a/libultraship/libultraship/GlobalCtx2.cpp +++ b/libultraship/libultraship/GlobalCtx2.cpp @@ -7,7 +7,6 @@ #include "spdlog/sinks/rotating_file_sink.h" #include "spdlog/sinks/stdout_color_sinks.h" #include "spdlog/sinks/sohconsole_sink.h" -#include "ModManager.h" #ifdef __APPLE__ #include "OSXFolderManager.h" #elif defined(__SWITCH__) @@ -16,7 +15,6 @@ namespace Ship { std::weak_ptr GlobalCtx2::Context; - ModManager* INSTANCE; std::shared_ptr GlobalCtx2::GetInstance() { return Context.lock(); } @@ -56,7 +54,6 @@ namespace Ship { GlobalCtx2::~GlobalCtx2() { SPDLOG_INFO("destruct GlobalCtx2"); - INSTANCE->Exit(); } void GlobalCtx2::InitWindow() { @@ -84,8 +81,6 @@ namespace Ship { #ifdef __SWITCH__ Ship::Switch::Init(PostInitPhase); #endif - INSTANCE = new ModManager(ResMan); - INSTANCE->Init(); } void GlobalCtx2::InitLogging() { diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index 1a0a79bf91..583d36f014 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -15,7 +15,6 @@ #include "Lib/ImGui/imgui_internal.h" #include "GlobalCtx2.h" #include "ResourceMgr.h" -#include "TextureMod.h" #include "Window.h" #include "Cvar.h" #include "GameOverlay.h" diff --git a/libultraship/libultraship/ModManager.cpp b/libultraship/libultraship/ModManager.cpp deleted file mode 100644 index 8aa2715dee..0000000000 --- a/libultraship/libultraship/ModManager.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#include "ModManager.h" -#include "TextureMod.h" -#include "ModModule.h" -#include "ImGuiImpl.h" - -namespace Ship { - std::vector modules; - - void ModManager::Init() { - // ResManager->GetArchive()->loa - // modules.push_back(new TextureModule(this)); - // std::shared_ptr archive = std::make_shared("mods/TexMods.otr", "", false); - for (auto& mod : modules) { - mod->Init(); - // mod->Open(archive); - } - } - - void ModManager::Exit() { - for (auto& mod : modules) - mod->Exit(); - } -} \ No newline at end of file diff --git a/libultraship/libultraship/ModManager.h b/libultraship/libultraship/ModManager.h deleted file mode 100644 index ca25355b58..0000000000 --- a/libultraship/libultraship/ModManager.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once -#include "ResourceMgr.h" - -namespace Ship { - class ModManager { - public: - std::shared_ptr ResManager; - explicit ModManager(std::shared_ptr manager) : ResManager(manager) {} - void Init(); - void Exit(); - }; -} \ No newline at end of file diff --git a/libultraship/libultraship/ModModule.h b/libultraship/libultraship/ModModule.h deleted file mode 100644 index da62273dbb..0000000000 --- a/libultraship/libultraship/ModModule.h +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once -#include "ModManager.h" -#include "Hooks.h" -#include "Console.h" -#include "Archive.h" - -namespace Ship { - class ModModule { - protected: - ModManager* Manager; - public: - virtual ~ModModule() = default; - explicit ModModule(ModManager* Manager) : Manager(Manager) {} - virtual void Init() = 0; - virtual void Open(std::shared_ptr archive) = 0; - virtual void Close(Ship::Archive archive) = 0; - virtual void Exit() = 0; - }; -} \ No newline at end of file diff --git a/libultraship/libultraship/TextureMod.cpp b/libultraship/libultraship/TextureMod.cpp deleted file mode 100644 index 87f17ed2ca..0000000000 --- a/libultraship/libultraship/TextureMod.cpp +++ /dev/null @@ -1,128 +0,0 @@ -#include "TextureMod.h" - -#if 0 - -#include -#include -#include -#include -#include -#include "Lib/stb/stb_image.h" -#include "Lib/Fast3D/gfx_pc.h" -#define STB_IMAGE_WRITE_IMPLEMENTATION -#include "Lib/stb/stb_image_write.h" -#include "Lib/Fast3D/gfx_rendering_api.h" -#include "SohImGuiImpl.h" - -namespace fs = std::filesystem; - -namespace Ship { - void TextureModule::Init() { - BIND_HOOK(LOOKUP_TEXTURE, Hook_LookupTexture); - BIND_HOOK(GRAYOUT_TEXTURE, Hook_GrayScaleFilter); - BIND_HOOK(INVALIDATE_TEXTURE, Hook_InvalidateTexture); - - SohImGui::BindCmd("reload", { .handler = [&](const std::vector&) { - INFO("Reloading all textures!"); - gfx_texture_cache_clear(); - this->TexturePool.clear(); - this->TextureCache.clear(); - return true; - } }); - } - - void TextureModule::Open(std::shared_ptr archive) { - this->LoadedOTRS.push_back(archive); - } - - void TextureModule::Close(Ship::Archive otr) { - // Remove all loaded textures - // this->LoadedOTRS.erase(std::find(this->LoadedOTRS.begin(), this->LoadedOTRS.end(), otr)); - } - - void TextureModule::Hook_LookupTexture(HookEvent call) { - const auto raw_path = BIND_PTR("path", char*); - if (raw_path == nullptr) return; - - const auto api = BIND_PTR("gfx_api", GfxRenderingAPI*); - const auto path = std::string(raw_path) + ".png"; - const auto node = BIND_PTR("node", TextureCacheNode**); - const auto fmt = BIND_VAR("fmt", uint32_t*); - const auto siz = BIND_VAR("siz", uint32_t*); - const auto tile = BIND_VAR("tile", int*); - const auto palette = BIND_VAR("palette", uint32_t*); - const auto orig_addr = BIND_VAR("addr", const uint8_t**); - - // INFO("The game is trying to load %s", path.c_str()); - - if (this->TextureCache.contains(path) && this->TextureCache[path][tile] != nullptr) { - *node = this->TextureCache[path][tile]; - api->select_texture(tile, (*node)->second.texture_id); - call->cancelled = true; - return; - } - - // OTRTODO: Implement loading order - TextureData* tex_data = nullptr; - if (!this->TexturePool.contains(path)) { - std::shared_ptr raw_data = std::make_shared(); - this->Manager->ResManager->GetArchive()->LoadPatchFile(path, false, raw_data); - - if (raw_data->bIsLoaded) { - char* tdata = new char[raw_data->dwBufferSize]; - memcpy(tdata, raw_data->buffer.get(), raw_data->dwBufferSize); - tex_data = new TextureData({ .data = tdata, .size = raw_data->dwBufferSize }); - INFO("Loaded %s", path.c_str()); - this->TexturePool[path] = tex_data; - } - } - - if (tex_data == nullptr) - return; - - if (!this->TextureCache.contains(path)) this->TextureCache[path].resize(10); - - 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); - api->set_sampler_parameters(tile, false, 0, 0); - *node = entry; - - uint8_t* img_data = stbi_load_from_memory(reinterpret_cast(tex_data->data), tex_data->size, &tex_data->width, &tex_data->height, nullptr, 4); - - if (!img_data) - return; - - switch (tex_data->color_modifier) { - case GRAYSCALE: { - GrayOutTexture(img_data, tex_data->width, tex_data->height); - } - default:; - } - - std::cout << "Uploading to the GPU" << std::endl; - api->upload_texture(img_data, tex_data->width, tex_data->height); - this->TextureCache[path][tile] = entry; - - stbi_image_free(img_data); - call->cancelled = true; - } - - - void TextureModule::Hook_GrayScaleFilter(HookEvent event) { - // this->Exit(); - } - - void TextureModule::Hook_InvalidateTexture(HookEvent event) { - // this->Exit(); - } - - void TextureModule::Exit() { - TextureCache.clear(); - TexturePool.clear(); - LoadedOTRS.clear(); - } -} - -#endif diff --git a/libultraship/libultraship/TextureMod.h b/libultraship/libultraship/TextureMod.h deleted file mode 100644 index 5f41873cae..0000000000 --- a/libultraship/libultraship/TextureMod.h +++ /dev/null @@ -1,55 +0,0 @@ -#pragma once -#include "ModModule.h" -#include -#include "Lib/Fast3D/gfx_pc.h" - -#if 0 - -namespace Ship { - enum TextureMod { - GRAYSCALE, - NONE - }; - - struct TextureData { - char* data; - uint32_t size; - int width; - int height; - char* loaded_data; - std::shared_ptr parent; - TextureMod color_modifier = NONE; - }; - - class TextureModule : public ModModule { - public: - explicit TextureModule(ModManager* Manager) : ModModule(Manager) {} - private: - std::vector> LoadedOTRS; - std::map TexturePool; - std::map> TextureCache; - void Init() override; - void Open(std::shared_ptr archive) override; - void Close(Ship::Archive mod) override; - void Exit() override; - protected: - void Hook_LookupTexture(HookEvent event); - void Hook_GrayScaleFilter(HookEvent event); - void Hook_InvalidateTexture(HookEvent event); - }; - - inline void GrayOutTexture(uint8_t* data, int width, int height) { - for (int x = 0; x < width * height * 4; x += 4) { - - int red = data[x]; - int green = data[x + 1]; - int blue = data[x + 2]; - int gray = (red + green + blue) / 3; - data[x] = gray; - data[x + 1] = gray; - data[x + 2] = gray; - } - } -} - -#endif diff --git a/libultraship/libultraship/libultraship.vcxproj b/libultraship/libultraship/libultraship.vcxproj index 95250d4b1a..f677dfe5ea 100644 --- a/libultraship/libultraship/libultraship.vcxproj +++ b/libultraship/libultraship/libultraship.vcxproj @@ -267,7 +267,6 @@ - @@ -332,7 +331,6 @@ - @@ -364,8 +362,6 @@ - - @@ -404,7 +400,6 @@ - diff --git a/libultraship/libultraship/libultraship.vcxproj.filters b/libultraship/libultraship/libultraship.vcxproj.filters index bf51936824..b7fe847ce8 100644 --- a/libultraship/libultraship/libultraship.vcxproj.filters +++ b/libultraship/libultraship/libultraship.vcxproj.filters @@ -70,12 +70,6 @@ {0dca2d94-45ba-4916-b03a-1dd5f949114c} - - {8e970531-d0cd-4c29-9800-a7e6edc92036} - - - {05f273a3-f147-430e-9853-aeef59e6288d} - {cc8de11b-7305-4482-853f-7f0f843eef28} @@ -321,12 +315,6 @@ Source Files\Globals - - Source Files\ModManager\ModModule - - - Source Files\ModManager - Source Files\Logging @@ -614,15 +602,6 @@ Source Files\Lib\stb - - Source Files\ModManager\ModModule - - - Source Files\ModManager - - - Source Files\ModManager\ModModule - Source Files\CustomImpl\Hooks From 8c9d067657e55c38346f2dc814e85d68233c7b89 Mon Sep 17 00:00:00 2001 From: Kenix3 Date: Tue, 2 Aug 2022 22:25:27 -0400 Subject: [PATCH 38/42] LUS Cleanup: CVars functions are now consistent --- libultraship/libultraship/Cvar.cpp | 6 ++---- libultraship/libultraship/Cvar.h | 6 +----- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/libultraship/libultraship/Cvar.cpp b/libultraship/libultraship/Cvar.cpp index d5b3af7508..c20aec25a4 100644 --- a/libultraship/libultraship/Cvar.cpp +++ b/libultraship/libultraship/Cvar.cpp @@ -4,8 +4,6 @@ #include #include #include -#include -#include "imgui_internal.h" std::map, std::less<>> cvars; @@ -96,7 +94,7 @@ extern "C" void CVar_SetS32(const char* name, int32_t value) { cvar->value.valueS32 = value; } -void CVar_SetFloat(const char* name, float value) { +extern "C" void CVar_SetFloat(const char* name, float value) { auto& cvar = cvars[name]; if (!cvar) { cvar = std::make_unique(); @@ -111,7 +109,7 @@ extern "C" void CVar_SetString(const char* name, const char* value) { cvar = std::make_unique(); } cvar->type = CVarType::String; - cvar->value.valueStr = ImStrdup(value); + cvar->value.valueStr = _strdup(value); } extern "C" void CVar_RegisterRGBA(const char* name, Color_RGBA8 defaultValue) { diff --git a/libultraship/libultraship/Cvar.h b/libultraship/libultraship/Cvar.h index b8f294be60..e6225610d8 100644 --- a/libultraship/libultraship/Cvar.h +++ b/libultraship/libultraship/Cvar.h @@ -32,14 +32,13 @@ extern "C" CVar * CVar_Get(const char* name); extern "C" { #endif -//#include int32_t CVar_GetS32(const char* name, int32_t defaultValue); float CVar_GetFloat(const char* name, float defaultValue); +void CVar_SetFloat(const char* name, float value); const char* CVar_GetString(const char* name, const char* defaultValue); void CVar_SetS32(const char* name, int32_t value); void CVar_SetString(const char* name, const char* value); - Color_RGB8 CVar_GetRGB(const char* name, Color_RGB8 defaultValue); Color_RGBA8 CVar_GetRGBA(const char* name, Color_RGBA8 defaultValue); void CVar_SetRGBA(const char* name, Color_RGBA8 value); @@ -56,11 +55,8 @@ void CVar_RegisterRGBA(const char* name, Color_RGBA8 defaultValue); #ifdef __cplusplus #include #include -#include #include -//extern "C" CVar * CVar_Get(const char* name); extern std::map, std::less<>> cvars; -void CVar_SetFloat(const char* name, float value); #endif #endif From 619038816494ea9046e11988cfde2030106bbcaf Mon Sep 17 00:00:00 2001 From: Kenix3 Date: Tue, 2 Aug 2022 23:20:17 -0400 Subject: [PATCH 39/42] Now using posix strdrup on non-msvc builds. --- libultraship/libultraship/Cvar.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libultraship/libultraship/Cvar.cpp b/libultraship/libultraship/Cvar.cpp index c20aec25a4..c4fe75cc71 100644 --- a/libultraship/libultraship/Cvar.cpp +++ b/libultraship/libultraship/Cvar.cpp @@ -109,7 +109,11 @@ extern "C" void CVar_SetString(const char* name, const char* value) { cvar = std::make_unique(); } cvar->type = CVarType::String; +#ifdef _MSC_VER cvar->value.valueStr = _strdup(value); +#else + cvar->value.valueStr = strdup(value); +#endif } extern "C" void CVar_RegisterRGBA(const char* name, Color_RGBA8 defaultValue) { From 97adc4a7f2831b3f114a0824307b1756aba71a14 Mon Sep 17 00:00:00 2001 From: Kenix3 Date: Wed, 3 Aug 2022 20:16:17 -0400 Subject: [PATCH 40/42] Changes string.h include in CVar.cpp --- libultraship/libultraship/Cvar.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libultraship/libultraship/Cvar.cpp b/libultraship/libultraship/Cvar.cpp index c4fe75cc71..fa536e1bb4 100644 --- a/libultraship/libultraship/Cvar.cpp +++ b/libultraship/libultraship/Cvar.cpp @@ -1,6 +1,6 @@ #include "Cvar.h" #include -#include +#include #include #include #include From dffcbb035eebab6fdb9d824caf6cd12bfa36f3a8 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Wed, 3 Aug 2022 22:43:55 -0400 Subject: [PATCH 41/42] Fixes glitchy dungeon maps. (#1032) --- soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c | 3 +-- 1 file changed, 1 insertion(+), 2 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 66967e9a45..6e88d975d4 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 @@ -3227,10 +3227,9 @@ void KaleidoScope_LoadDungeonMap(GlobalContext* globalCtx) { char* firstTextureName = sDungeonMapTexs[R_MAP_TEX_INDEX]; char* secondTextureName = sDungeonMapTexs[R_MAP_TEX_INDEX + 1]; - uint32_t firstTextureSize = ResourceMgr_LoadTexSizeByName(firstTextureName); memcpy(interfaceCtx->mapSegment, ResourceMgr_LoadTexByName(firstTextureName), ResourceMgr_LoadTexSizeByName(firstTextureName)); - memcpy(interfaceCtx->mapSegment + (firstTextureSize / 2), ResourceMgr_LoadTexByName(secondTextureName), ResourceMgr_LoadTexSizeByName(secondTextureName)); + memcpy(interfaceCtx->mapSegment + 0x800, ResourceMgr_LoadTexByName(secondTextureName), ResourceMgr_LoadTexSizeByName(secondTextureName)); } void KaleidoScope_UpdateDungeonMap(GlobalContext* globalCtx) { From bd86c792c371356d6a4e4eca4ab60c1209a75d44 Mon Sep 17 00:00:00 2001 From: Ada <60364512+GreatArgorath@users.noreply.github.com> Date: Thu, 4 Aug 2022 03:44:43 +0100 Subject: [PATCH 42/42] Moves release version text (#1028) --- soh/src/overlays/gamestates/ovl_title/z_title.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/soh/src/overlays/gamestates/ovl_title/z_title.c b/soh/src/overlays/gamestates/ovl_title/z_title.c index 699dff6266..cfaf9e26d3 100644 --- a/soh/src/overlays/gamestates/ovl_title/z_title.c +++ b/soh/src/overlays/gamestates/ovl_title/z_title.c @@ -39,8 +39,10 @@ void Title_PrintBuildInfo(Gfx** gfxp) { GfxPrint_Printf(&printer, "GCC SHIP"); #endif - GfxPrint_SetPos(&printer, 5, 4); + GfxPrint_SetPos(&printer, 1, 4); GfxPrint_Printf(&printer, "Game Version: %s", gameVersionStr); + GfxPrint_SetPos(&printer, 1, 5); + GfxPrint_Printf(&printer, "Release Version: %s", gBuildVersion); GfxPrint_SetColor(&printer, 255, 255, 255, 255); GfxPrint_SetPos(&printer, 2, 22); @@ -49,8 +51,6 @@ void Title_PrintBuildInfo(Gfx** gfxp) { GfxPrint_Printf(&printer, "Build Date:%s", gBuildDate); GfxPrint_SetPos(&printer, 3, 26); GfxPrint_Printf(&printer, "%s", gBuildTeam); - GfxPrint_SetPos(&printer, 3, 28); - GfxPrint_Printf(&printer, "Release Version: %s", gBuildVersion); g = GfxPrint_Close(&printer); GfxPrint_Destroy(&printer); *gfxp = g;