diff --git a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp index 933fc420c..1d68191f0 100644 --- a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp +++ b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp @@ -384,13 +384,14 @@ int hue = 0; // Runs every frame to update rainbow hue, a potential future optimization is to only run this a once or twice a second and increase the speed of the rainbow hue rotation. void CosmeticsUpdateTick(bool& open) { int index = 0; + float rainbowSpeed = CVarGetFloat("gCosmetics.RainbowSpeed", 0.6f); for (auto& [id, cosmeticOption] : cosmeticOptions) { if (cosmeticOption.supportsRainbow && CVarGetInteger(cosmeticOption.rainbowCvar, 0)) { - float frequency = 2 * M_PI / (360 * CVarGetFloat("gCosmetics.RainbowSpeed", 0.6f)); + float frequency = 2 * M_PI / (360 * rainbowSpeed); Color_RGBA8 newColor; - newColor.r = sin(frequency * ((hue + index)) + 0) * 127 + 128; - newColor.g = sin(frequency * ((hue + index)) + (2 * M_PI / 3)) * 127 + 128; - newColor.b = sin(frequency * ((hue + index)) + (4 * M_PI / 3)) * 127 + 128; + newColor.r = sin(frequency * (hue + index) + 0) * 127 + 128; + newColor.g = sin(frequency * (hue + index) + (2 * M_PI / 3)) * 127 + 128; + newColor.b = sin(frequency * (hue + index) + (4 * M_PI / 3)) * 127 + 128; newColor.a = 255; cosmeticOption.currentColor.x = newColor.r / 255.0; @@ -404,12 +405,12 @@ void CosmeticsUpdateTick(bool& open) { // Technically this would work if you replaced "60" with 1 but the hue would be so close it's // indistinguishable, 60 gives us a big enough gap to notice the difference. if (!CVarGetInteger("gCosmetics.RainbowSync", 0)) { - index+= (60 * CVarGetFloat("gCosmetics.RainbowSpeed", 0.6f)); + index+= (60 * rainbowSpeed); } } ApplyOrResetCustomGfxPatches(false); hue++; - if (hue >= 360) hue = 0; + if (hue >= (360 * rainbowSpeed)) hue = 0; } /* diff --git a/soh/soh/Enhancements/randomizer/3drando/fill.cpp b/soh/soh/Enhancements/randomizer/3drando/fill.cpp index 84fce11a2..47ab9f4a7 100644 --- a/soh/soh/Enhancements/randomizer/3drando/fill.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/fill.cpp @@ -1079,9 +1079,7 @@ int Fill() { } //Always execute ganon hint generation for the funny line CreateGanonText(); - if (AltarHintText) { - CreateAltarText(); - } + CreateAltarText(AltarHintText); if (DampeHintText) { CreateDampesDiaryText(); } diff --git a/soh/soh/Enhancements/randomizer/3drando/hints.cpp b/soh/soh/Enhancements/randomizer/3drando/hints.cpp index 09c6a6528..8a43e0aab 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hints.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hints.cpp @@ -678,37 +678,45 @@ static Text BuildGanonBossKeyText() { return Text()+"$b"+ganonBossKeyText+"^"; } -void CreateAltarText() { +void CreateAltarText(Option withHints) { //Child Altar Text - childAltarText = Hint(SPIRITUAL_STONE_TEXT_START).GetText()+"^"+ - //Spiritual Stones - (StartingKokiriEmerald.Value() ? Text{ "##", "##", "##" } - : BuildDungeonRewardText(KOKIRI_EMERALD)) + - (StartingGoronRuby.Value() ? Text{ "##", "##", "##" } - : BuildDungeonRewardText(GORON_RUBY)) + - (StartingZoraSapphire.Value() ? Text{ "##", "##", "##" } - : BuildDungeonRewardText(ZORA_SAPPHIRE)) + - //How to open Door of Time, the event trigger is necessary to read the altar multiple times - BuildDoorOfTimeText(); + if (withHints) { + childAltarText = Hint(SPIRITUAL_STONE_TEXT_START).GetText()+"^"+ + //Spiritual Stones + (StartingKokiriEmerald.Value() ? Text{ "##", "##", "##" } + : BuildDungeonRewardText(KOKIRI_EMERALD)) + + (StartingGoronRuby.Value() ? Text{ "##", "##", "##" } + : BuildDungeonRewardText(GORON_RUBY)) + + (StartingZoraSapphire.Value() ? Text{ "##", "##", "##" } + : BuildDungeonRewardText(ZORA_SAPPHIRE)) + + //How to open Door of Time, the event trigger is necessary to read the altar multiple times + BuildDoorOfTimeText(); + } else { + childAltarText = BuildDoorOfTimeText(); + } + CreateMessageFromTextObject(0x7040, 0, 2, 3, AddColorsAndFormat(childAltarText, {QM_GREEN, QM_RED, QM_BLUE})); //Adult Altar Text - adultAltarText = Hint(ADULT_ALTAR_TEXT_START).GetText()+"^"+ - //Medallion Areas - (StartingLightMedallion.Value() ? Text{ "##", "##", "##" } - : BuildDungeonRewardText(LIGHT_MEDALLION)) + - (StartingForestMedallion.Value() ? Text{ "##", "##", "##" } - : BuildDungeonRewardText(FOREST_MEDALLION)) + - (StartingFireMedallion.Value() ? Text{ "##", "##", "##" } - : BuildDungeonRewardText(FIRE_MEDALLION)) + - (StartingWaterMedallion.Value() ? Text{ "##", "##", "##" } - : BuildDungeonRewardText(WATER_MEDALLION)) + - (StartingSpiritMedallion.Value() ? Text{ "##", "##", "##" } - : BuildDungeonRewardText(SPIRIT_MEDALLION)) + - (StartingShadowMedallion.Value() ? Text{ "##", "##", "##" } - : BuildDungeonRewardText(SHADOW_MEDALLION)) + - + adultAltarText = Hint(ADULT_ALTAR_TEXT_START).GetText() + "^"; + if (withHints) { + adultAltarText = adultAltarText + + //Medallion Areas + (StartingLightMedallion.Value() ? Text{ "##", "##", "##" } + : BuildDungeonRewardText(LIGHT_MEDALLION)) + + (StartingForestMedallion.Value() ? Text{ "##", "##", "##" } + : BuildDungeonRewardText(FOREST_MEDALLION)) + + (StartingFireMedallion.Value() ? Text{ "##", "##", "##" } + : BuildDungeonRewardText(FIRE_MEDALLION)) + + (StartingWaterMedallion.Value() ? Text{ "##", "##", "##" } + : BuildDungeonRewardText(WATER_MEDALLION)) + + (StartingSpiritMedallion.Value() ? Text{ "##", "##", "##" } + : BuildDungeonRewardText(SPIRIT_MEDALLION)) + + (StartingShadowMedallion.Value() ? Text{ "##", "##", "##" } + : BuildDungeonRewardText(SHADOW_MEDALLION)); + } + adultAltarText = adultAltarText + //Bridge requirement BuildBridgeReqsText()+ diff --git a/soh/soh/Enhancements/randomizer/3drando/hints.hpp b/soh/soh/Enhancements/randomizer/3drando/hints.hpp index 5e8df5286..a397d12ac 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hints.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/hints.hpp @@ -223,7 +223,7 @@ extern void CreateMerchantsHints(); extern void CreateWarpSongTexts(); extern void CreateDampesDiaryText(); extern void CreateGanonText(); -extern void CreateAltarText(); +extern void CreateAltarText(Option withHints); Text& GetChildAltarText(); Text& GetAdultAltarText(); diff --git a/soh/soh/Enhancements/randomizer/3drando/item.hpp b/soh/soh/Enhancements/randomizer/3drando/item.hpp index 72ff57131..5049678a8 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/item.hpp @@ -95,8 +95,12 @@ public: if (type == ITEMTYPE_DUNGEONREWARD && (ShuffleRewards.Is(REWARDSHUFFLE_END_OF_DUNGEON))) { return false; } - // PURPLE TODO: LOCALIZATION - if (name.GetEnglish().find("Bombchus") != std::string::npos && !BombchusInLogic) { + + if ((randomizerGet == RG_BOMBCHU_5 || randomizerGet == RG_BOMBCHU_10 || randomizerGet == RG_BOMBCHU_20) && !BombchusInLogic) { + return false; + } + + if (hintKey == HEART_CONTAINER || hintKey == PIECE_OF_HEART || hintKey == TREASURE_GAME_HEART) { return false; } diff --git a/soh/soh/Enhancements/randomizer/3drando/item_list.cpp b/soh/soh/Enhancements/randomizer/3drando/item_list.cpp index 8f24603ef..dc4b141eb 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_list.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_list.cpp @@ -191,9 +191,9 @@ void ItemTable_Init() { // RandomizerGet itemTable[BOMBS_5] = Item(RG_BOMBS_5, Text{"Bombs (5)", "Bombes (5)", "Bombas (5)"}, ITEMTYPE_REFILL, GI_BOMBS_5, false, &noVariable, BOMBS_5); itemTable[BOMBS_10] = Item(RG_BOMBS_10, Text{"Bombs (10)", "Bombes (10)", "Bombas (10)"}, ITEMTYPE_REFILL, GI_BOMBS_10, false, &noVariable, BOMBS_10); itemTable[BOMBS_20] = Item(RG_BOMBS_20, Text{"Bombs (20)", "Bombes (20)", "Bombas (20)"}, ITEMTYPE_REFILL, GI_BOMBS_20, false, &noVariable, BOMBS_20); - itemTable[BOMBCHU_5] = Item(RG_BOMBCHU_5, Text{"Bombchu (5)", "Missiles (5)", "Bombchus (5)"}, ITEMTYPE_REFILL, GI_BOMBCHUS_5, true, &Bombchus5, BOMBCHU_5); - itemTable[BOMBCHU_10] = Item(RG_BOMBCHU_10, Text{"Bombchu (10)", "Missiles (10)", "Bombchus (10)"}, ITEMTYPE_REFILL, GI_BOMBCHUS_10, true, &Bombchus10, BOMBCHU_10); - itemTable[BOMBCHU_20] = Item(RG_BOMBCHU_20, Text{"Bombchu (20)", "Missiles (20)", "Bombchus (20)"}, ITEMTYPE_REFILL, GI_BOMBCHUS_20, true, &Bombchus20, BOMBCHU_20); + itemTable[BOMBCHU_5] = Item(RG_BOMBCHU_5, Text{"Bombchus (5)", "Missiles (5)", "Bombchus (5)"}, ITEMTYPE_REFILL, GI_BOMBCHUS_5, true, &Bombchus5, BOMBCHU_5); + itemTable[BOMBCHU_10] = Item(RG_BOMBCHU_10, Text{"Bombchus (10)", "Missiles (10)", "Bombchus (10)"}, ITEMTYPE_REFILL, GI_BOMBCHUS_10, true, &Bombchus10, BOMBCHU_10); + itemTable[BOMBCHU_20] = Item(RG_BOMBCHU_20, Text{"Bombchus (20)", "Missiles (20)", "Bombchus (20)"}, ITEMTYPE_REFILL, GI_BOMBCHUS_20, true, &Bombchus20, BOMBCHU_20); itemTable[BOMBCHU_DROP] = Item(RG_BOMBCHU_DROP, Text{"Bombchu Drop", "Drop Missiles", "Bombchus"}, ITEMTYPE_DROP, GI_BOMBCHUS_10, true, &BombchuDrop, NONE); itemTable[ARROWS_5] = Item(RG_ARROWS_5, Text{"Arrows (5)", "Flèches (5)", "Flechas (5)"}, ITEMTYPE_REFILL, GI_ARROWS_SMALL, false, &noVariable, ARROWS_5); itemTable[ARROWS_10] = Item(RG_ARROWS_10, Text{"Arrows (10)", "Flèches (10)", "Flechas (10)"}, ITEMTYPE_REFILL, GI_ARROWS_MEDIUM, false, &noVariable, ARROWS_10); diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index b859b5031..8041593de 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -4747,7 +4747,7 @@ CustomMessageMinimal NaviMessages[NUM_NAVI_MESSAGES] = { "%cSi tu es coincé quelque part, tu&devrais %wsauvegarder ta partie %cet&faire un %wreset%c!" }, { "%cSheik will meet you in a %rburning&village %conce you have %gForest%c,&%rFire%c, and %bWater %cMedallions!", - "%cSheik wird dich in einem %rbrennenden&Dorf %ctreffen sobald du das Amulett&des %gWaldes%c, %rFeuers %cund %bWassers&%cbesitzt.", + "%cShiek wird dich in einem %rbrennenden&Dorf %ctreffen sobald du das Amulett&des %gWaldes%c, %rFeuers %cund %bWassers&%cbesitzt.", "%cSheik t'attendra dans un %rvillage&en feu %clorsque tu auras récupéré&les médaillons de la %gForêt%c, du %rFeu&%cet de l'%bEau%c!" }, { "%cIf you don't have a %wsword %cas a&child, try buying %wDeku Sticks%c!&They're effective against your foes!", diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance.c b/soh/soh/Enhancements/randomizer/randomizer_entrance.c index d0f96d375..3c3712afa 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance.c +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance.c @@ -271,7 +271,8 @@ s16 Entrance_OverrideNextIndex(s16 nextEntranceIndex) { // Exiting through the crawl space from Hyrule Castle courtyard is the same exit as leaving Ganon's castle // Don't override the entrance if we came from the Castle courtyard (day and night scenes) - if (gPlayState != NULL && (gPlayState->sceneNum == 69 || gPlayState->sceneNum == 70) && nextEntranceIndex == 0x023D) { + if (gPlayState != NULL && (gPlayState->sceneNum == SCENE_HAIRAL_NIWA || gPlayState->sceneNum == SCENE_HAIRAL_NIWA_N) && + nextEntranceIndex == 0x023D) { return nextEntranceIndex; } @@ -289,7 +290,7 @@ s16 Entrance_OverrideDynamicExit(s16 dynamicExitIndex) { u32 Entrance_SceneAndSpawnAre(u8 scene, u8 spawn) { s16 computedEntranceIndex; - // Adjust the entrance to acount for the exact scene/spawn combination for child/adult and day/night + // Adjust the entrance to account for the exact scene/spawn combination for child/adult and day/night if (!IS_DAY) { if (!LINK_IS_ADULT) { computedEntranceIndex = gSaveContext.entranceIndex + 1; @@ -680,7 +681,7 @@ void Entrance_OverrideSpawnScene(s32 sceneNum, s32 spawn) { if (Randomizer_GetSettingValue(RSK_SHUFFLE_DUNGEON_ENTRANCES) == RO_DUNGEON_ENTRANCE_SHUFFLE_ON_PLUS_GANON) { // Move Hyrule's Castle Courtyard exit spawn to be before the crates so players don't skip Talon - if (sceneNum == 95 && spawn == 1) { + if (sceneNum == SCENE_SPOT15 && spawn == 1) { modifiedLinkActorEntry.pos.x = 0x033A; modifiedLinkActorEntry.pos.y = 0x0623; modifiedLinkActorEntry.pos.z = 0xFF22; @@ -689,7 +690,7 @@ void Entrance_OverrideSpawnScene(s32 sceneNum, s32 spawn) { // Move Ganon's Castle exit spawn to be on the small ledge near the castle and not over the void // to prevent Link from falling if the bridge isn't spawned - if (sceneNum == 100 && spawn == 1) { + if (sceneNum == SCENE_GANON_TOU && spawn == 1) { modifiedLinkActorEntry.pos.x = 0xFEA8; modifiedLinkActorEntry.pos.y = 0x065C; modifiedLinkActorEntry.pos.z = 0x0290; @@ -718,6 +719,15 @@ void Entrance_OverrideSpawnScene(s32 sceneNum, s32 spawn) { gPlayState->linkActorEntry = &modifiedLinkActorEntry; } } + + if (Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_ENTRANCES) == RO_GENERIC_ON) { + // Move Hyrule Field bridge spawn for child link at night to be beyond the moat so he doesn't fall in the water + if (sceneNum == SCENE_SPOT00 && spawn == 7 && LINK_IS_CHILD && IS_NIGHT) { + modifiedLinkActorEntry.pos.x = 0x0001; + modifiedLinkActorEntry.pos.z = 0x049E; + gPlayState->linkActorEntry = &modifiedLinkActorEntry; + } + } } s32 Entrance_OverrideSpawnSceneRoom(s32 sceneNum, s32 spawn, s32 roomNum) { diff --git a/soh/soh/GameMenuBar.cpp b/soh/soh/GameMenuBar.cpp index ae7674b10..9b337524f 100644 --- a/soh/soh/GameMenuBar.cpp +++ b/soh/soh/GameMenuBar.cpp @@ -726,7 +726,7 @@ namespace GameMenuBar { ImGui::EndMenu(); } - UIWidgets::PaddedEnhancementCheckbox("N64 Mode", "gN64Mode", true, false); + UIWidgets::PaddedEnhancementCheckbox("N64 Mode", "gLowResMode", true, false); UIWidgets::Tooltip("Sets aspect ratio to 4:3 and lowers resolution to 240p, the N64's native resolution"); UIWidgets::PaddedEnhancementCheckbox("Glitch line-up tick", "gDrawLineupTick", true, false); UIWidgets::Tooltip("Displays a tick in the top center of the screen to help with glitch line-ups in SoH, as traditional UI based line-ups do not work outside of 4:3"); diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 44c451a58..7634d651b 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1593,7 +1593,7 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) { Randomizer_GetCheckFromActor(stone->id, play->sceneNum, actorParams); messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::hintMessageTableID, hintCheck); - } else if ((textId == TEXT_ALTAR_CHILD || textId == TEXT_ALTAR_ADULT) && Randomizer_GetSettingValue(RSK_TOT_ALTAR_HINT)) { + } else if ((textId == TEXT_ALTAR_CHILD || textId == TEXT_ALTAR_ADULT)) { // rando hints at altar messageEntry = (LINK_IS_ADULT) ? CustomMessageManager::Instance->RetrieveMessage(Randomizer::hintMessageTableID, TEXT_ALTAR_ADULT) diff --git a/soh/soh/SaveManager.cpp b/soh/soh/SaveManager.cpp index 6a816cf92..41c455a65 100644 --- a/soh/soh/SaveManager.cpp +++ b/soh/soh/SaveManager.cpp @@ -205,6 +205,8 @@ void SaveManager::LoadRandomizerVersion2() { std::shared_ptr randomizer = OTRGlobals::Instance->gRandomizer; + randomizer->LoadRandomizerSettings(""); + size_t merchantPricesSize = 0; SaveManager::Instance->LoadData("merchantPricesSize", merchantPricesSize); diff --git a/soh/src/code/z_sram.c b/soh/src/code/z_sram.c index edf3191c9..ad78df64e 100644 --- a/soh/src/code/z_sram.c +++ b/soh/src/code/z_sram.c @@ -197,12 +197,6 @@ void Sram_OpenSave() { } } - // Setup the modified entrance table and entrance shuffle table for rando - if (gSaveContext.n64ddFlag) { - Entrance_Init(); - Entrance_InitEntranceTrackingData(); - } - osSyncPrintf("scene_no = %d\n", gSaveContext.entranceIndex); osSyncPrintf(VT_RST); diff --git a/soh/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c b/soh/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c index 9e8aed86a..c32d20c5c 100644 --- a/soh/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c +++ b/soh/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c @@ -426,7 +426,8 @@ void DemoKankyo_Update(Actor* thisx, PlayState* play) { DemoKankyo* this = (DemoKankyo*)thisx; this->actionFunc(this, play); - if (gSaveContext.n64ddFlag && Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS) && + // In ER, override the warp song locations. Also removes the warp song cutscene + if (gSaveContext.n64ddFlag && Randomizer_GetSettingValue(RSK_SHUFFLE_ENTRANCES) && thisx->params == 0x000F) { // Warp Song particles Entrance_SetWarpSongEntrance(); } diff --git a/soh/src/overlays/actors/ovl_En_Heishi4/z_en_heishi4.c b/soh/src/overlays/actors/ovl_En_Heishi4/z_en_heishi4.c index 77921b89d..f3a9ddc3a 100644 --- a/soh/src/overlays/actors/ovl_En_Heishi4/z_en_heishi4.c +++ b/soh/src/overlays/actors/ovl_En_Heishi4/z_en_heishi4.c @@ -350,10 +350,10 @@ void EnHeishi4_MarketSneak(EnHeishi4* this, PlayState* play) { if (Message_GetState(&play->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(play)) { switch (play->msgCtx.choiceIndex) { case 0: //yes - if (gSaveContext.n64ddFlag){ - play->nextEntranceIndex = Entrance_OverrideNextIndex(0xCD); + if (gSaveContext.n64ddFlag && Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_ENTRANCES) != RO_GENERIC_OFF){ + play->nextEntranceIndex = Entrance_OverrideNextIndex(0x01FD); // Market Entrance -> HF } else { - play->nextEntranceIndex = 0xCD; + play->nextEntranceIndex = 0x00CD; // HF Near bridge (OoT cutscene entrance) to not fall in the water } play->sceneLoadFlag = 0x14; play->fadeTransition = 0x2E; diff --git a/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c b/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c index 717782467..d3371f345 100644 --- a/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c +++ b/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c @@ -157,8 +157,8 @@ void EnSyatekiMan_Init(Actor* thisx, PlayState* play) { if (gSaveContext.n64ddFlag && Randomizer_GetSettingValue(RSK_SHUFFLE_INTERIOR_ENTRANCES)) { // If child is in the adult shooting gallery or adult in the child shooting gallery, then despawn the shooting gallery man - if ((LINK_IS_CHILD && Entrance_SceneAndSpawnAre(0x42, 0x00)) || //Kakariko Village -> Adult Shooting Gallery, index 003B in the entrance table - (LINK_IS_ADULT && Entrance_SceneAndSpawnAre(0x42, 0x01))) { //Market -> Child Shooting Gallery, index 016D in the entrance table + if ((LINK_IS_CHILD && Entrance_SceneAndSpawnAre(SCENE_SYATEKIJYOU, 0x00)) || //Kakariko Village -> Adult Shooting Gallery, index 003B in the entrance table + (LINK_IS_ADULT && Entrance_SceneAndSpawnAre(SCENE_SYATEKIJYOU, 0x01))) { //Market -> Child Shooting Gallery, index 016D in the entrance table Actor_Kill(thisx); return; } diff --git a/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c b/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c index 634bb6c7e..ea28d2c66 100644 --- a/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c +++ b/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c @@ -2145,13 +2145,19 @@ void FileChoose_LoadGame(GameState* thisx) { } } - // Handle randomized spawn positions after the save context has been setup from load - // When remeber save location is on, set save warp if the save was in an a grotto, or - // the entrance index is -1 from shuffle overwarld spawn - if (gSaveContext.n64ddFlag && Randomizer_GetSettingValue(RSK_SHUFFLE_ENTRANCES) && ((!CVarGetInteger("gRememberSaveLocation", 0) || - gSaveContext.savedSceneNum == SCENE_YOUSEI_IZUMI_TATE || gSaveContext.savedSceneNum == SCENE_KAKUSIANA) || - (CVarGetInteger("gRememberSaveLocation", 0) && Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) && gSaveContext.entranceIndex == -1))) { - Entrance_SetSavewarpEntrance(); + if (gSaveContext.n64ddFlag) { + // Setup the modified entrance table and entrance shuffle table for rando + Entrance_Init(); + Entrance_InitEntranceTrackingData(); + + // Handle randomized spawn positions after the save context has been setup from load + // When remeber save location is on, set save warp if the save was in an a grotto, or + // the entrance index is -1 from shuffle overwarld spawn + if (Randomizer_GetSettingValue(RSK_SHUFFLE_ENTRANCES) && ((!CVarGetInteger("gRememberSaveLocation", 0) || + gSaveContext.savedSceneNum == SCENE_YOUSEI_IZUMI_TATE || gSaveContext.savedSceneNum == SCENE_KAKUSIANA) || + (CVarGetInteger("gRememberSaveLocation", 0) && Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) && gSaveContext.entranceIndex == -1))) { + Entrance_SetSavewarpEntrance(); + } } } diff --git a/soh/src/overlays/gamestates/ovl_select/z_select.c b/soh/src/overlays/gamestates/ovl_select/z_select.c index dfc0807be..db677211e 100644 --- a/soh/src/overlays/gamestates/ovl_select/z_select.c +++ b/soh/src/overlays/gamestates/ovl_select/z_select.c @@ -175,7 +175,7 @@ static SceneSelectEntry sScenes[] = { { "65:" GFXP_KATAKANA "ゲルド" GFXP_HIRAGANA "ノシュウレンジョウ", "65:Gerudo Training Ground", "65:Gerudo-Arena", "65:Gymnase Gerudo", Select_LoadGame, 0x0008 }, { "66:" GFXP_HIRAGANA "ヨウセイノキノ " GFXP_KATAKANA "ダンジョン", "66:Inside the Deku Tree", "66:Im Deku-Baum", "66:Arbre Mojo", Select_LoadGame, 0x0000 }, { "67:" GFXP_HIRAGANA "ヨウセイノキノ " GFXP_KATAKANA "ダンジョン ボス", "67:Gohma's Lair", "67:Gohmas Verlies", "67:Repaire de Gohma", Select_LoadGame, 0x040F }, - { "68:" GFXP_KATAKANA "ドドンゴ ダンジョン", "68:Dodongo's Cavern", "68:Dodongo's Cavern", "68:Dodongos Hoehle", Select_LoadGame, 0x0004 }, + { "68:" GFXP_KATAKANA "ドドンゴ ダンジョン", "68:Dodongo's Cavern", "68:Dodongos Hoehle", "68:Caverne Dodongo", Select_LoadGame, 0x0004 }, { "69:" GFXP_KATAKANA "ドドンゴ ダンジョン ボス", "69:King Dodongo's Lair", "69:King Dodongos Verlies", "69:Repaire du Roi Dodongo", Select_LoadGame, 0x040B }, { "70:" GFXP_HIRAGANA "キョダイギョ " GFXP_KATAKANA "ダンジョン", "70:Inside Jabu-Jabu's Belly", "70:Jabu-Jabus Bauch", "70:Ventre de Jabu-Jabu", Select_LoadGame, 0x0028 }, { "71:" GFXP_HIRAGANA "キョダイギョ " GFXP_KATAKANA "ダンジョン ボス", "71:Barinade's Lair", "71:Barinades Verlies", "71:Repaire de Barinade", Select_LoadGame, 0x0301 }, @@ -185,7 +185,7 @@ static SceneSelectEntry sScenes[] = { { "75:" GFXP_HIRAGANA "ハカシタ " GFXP_KATAKANA "ダンジョン", "75:Shadow Temple", "75:Schattentempel", "75:Temple de l'Ombre", Select_LoadGame, 0x0037 }, { "76:" GFXP_HIRAGANA "ハカシタ " GFXP_KATAKANA "ダンジョン ボス", "76:Bongo Bongo's Lair", "76:Bongo Bongos Verlies", "76:Repaire de Bongo Bongo", Select_LoadGame, 0x0413 }, { "77:" GFXP_HIRAGANA "ヒノシンデン", "77:Fire Temple", "77:Feuertempel", "77:Temple du Feu", Select_LoadGame, 0x0165 }, - { "78:" GFXP_HIRAGANA "ヒノシンデン " GFXP_KATAKANA "ボス", "78:Volvagia's Lair", "78:Volvagias Verlies", "78:Repaire de Volvagia", Select_LoadGame, 0x0305 }, + { "78:" GFXP_HIRAGANA "ヒノシンデン " GFXP_KATAKANA "ボス", "78:Volvagia's Lair", "78:Volvagias Verlies", "78:Repaire de Volcania", Select_LoadGame, 0x0305 }, { "79:" GFXP_HIRAGANA "ミズノシンデン", "79:Water Temple", "79:Wassertempel", "79:Temple de l'Eau", Select_LoadGame, 0x0010 }, { "80:" GFXP_HIRAGANA "ミズノシンデン " GFXP_KATAKANA "ボス", "80:Morpha's Lair", "80:Morphas Verlies", "80:Repaire de Morpha", Select_LoadGame, 0x0417 }, { "81:" GFXP_HIRAGANA "ジャシンゾウ " GFXP_KATAKANA "ダンジョン", "81:Spirit Temple", "81:Geistertempel", "81:Temple de l'Esprit", Select_LoadGame, 0x0082 }, @@ -525,7 +525,7 @@ static BetterSceneSelectEntry sBetterScenes[] = { { "36:Fire Temple", "36:Feuertempel", "36:Temple du Feu", Select_LoadGame, 3, { { "Entrance", "Eingang", "Entrance", 0x0165 }, { "Before Volvagia", "Vor Volvagia", "Avant Volvagia", 0x0175 }, - { "Volvagia's Lair", "Volvagia Kampf", "Repaire de Volvagia", 0x0305 }, + { "Volvagia's Lair", "Volvagia Kampf", "Repaire de Volcania", 0x0305 }, }}, { "37:Water Temple", "37:Wassertempel", "37:Temple de l'Eau", Select_LoadGame, 2, { { "Entrance", "Eingang", "Entree", 0x0010 }, @@ -1245,8 +1245,8 @@ void Better_Select_PrintAgeSetting(SelectContext* this, GfxPrint* printer, s32 a void Select_PrintCutsceneSetting(SelectContext* this, GfxPrint* printer, u16 csIndex) { char* cutsceneLabels[13][4] = { - { GFXP_HIRAGANA " ヨル " GFXP_KATAKANA "ゴロン", "Day", "Nacht", "Jour" }, - { GFXP_HIRAGANA "オヒル " GFXP_KATAKANA "ジャラ", "Night", "Tag", "Nuit" }, + { GFXP_HIRAGANA " ヨル " GFXP_KATAKANA "ゴロン", "Day", "Tag", "Jour" }, + { GFXP_HIRAGANA "オヒル " GFXP_KATAKANA "ジャラ", "Night", "Nacht", "Nuit" }, { "デモ00", "Demo00", "Demo00", "Demo00" }, { "デモ01", "Demo01", "Demo01", "Demo01" }, { "デモ02", "Demo02", "Demo02", "Demo02" },