diff --git a/soh/assets/custom/objects/object_boss_soul/BarkOrHorns b/soh/assets/custom/objects/object_boss_soul/BarkOrHorns new file mode 100644 index 000000000..d546ce9bd Binary files /dev/null and b/soh/assets/custom/objects/object_boss_soul/BarkOrHorns differ diff --git a/soh/assets/custom/objects/object_boss_soul/LightNoise b/soh/assets/custom/objects/object_boss_soul/LightNoise new file mode 100644 index 000000000..73bcf2a59 Binary files /dev/null and b/soh/assets/custom/objects/object_boss_soul/LightNoise differ diff --git a/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_vtx_cull b/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_vtx_cull new file mode 100644 index 000000000..0e8c716c3 --- /dev/null +++ b/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_boss_soul/heart1 b/soh/assets/custom/objects/object_boss_soul/heart1 new file mode 100644 index 000000000..1fdc62cbd Binary files /dev/null and b/soh/assets/custom/objects/object_boss_soul/heart1 differ diff --git a/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Black b/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Black new file mode 100644 index 000000000..03ecd61f5 --- /dev/null +++ b/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Black @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Horns b/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Horns new file mode 100644 index 000000000..28fdc0d1b --- /dev/null +++ b/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Horns @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Jewel b/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Jewel new file mode 100644 index 000000000..dbe5cfd53 --- /dev/null +++ b/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Jewel @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Skull1 b/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Skull1 new file mode 100644 index 000000000..c32c4ee24 --- /dev/null +++ b/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Skull1 @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_f3dlite_material b/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_f3dlite_material new file mode 100644 index 000000000..a3dd769f6 --- /dev/null +++ b/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_f3dlite_material @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_housekey/Hilite_new b/soh/assets/custom/objects/object_housekey/Hilite_new new file mode 100644 index 000000000..5438695fa Binary files /dev/null and b/soh/assets/custom/objects/object_housekey/Hilite_new differ diff --git a/soh/assets/custom/objects/object_housekey/HouseKey_Tag b/soh/assets/custom/objects/object_housekey/HouseKey_Tag new file mode 100644 index 000000000..4939ef966 Binary files /dev/null and b/soh/assets/custom/objects/object_housekey/HouseKey_Tag differ diff --git a/soh/assets/custom/objects/object_housekey/gHouseKeyDL b/soh/assets/custom/objects/object_housekey/gHouseKeyDL new file mode 100644 index 000000000..3d6787c3c --- /dev/null +++ b/soh/assets/custom/objects/object_housekey/gHouseKeyDL @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_housekey/gHouseKeyDL_tri_0 b/soh/assets/custom/objects/object_housekey/gHouseKeyDL_tri_0 new file mode 100644 index 000000000..4c8002a6a --- /dev/null +++ b/soh/assets/custom/objects/object_housekey/gHouseKeyDL_tri_0 @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_housekey/gHouseKeyDL_tri_1 b/soh/assets/custom/objects/object_housekey/gHouseKeyDL_tri_1 new file mode 100644 index 000000000..06fdafc2d --- /dev/null +++ b/soh/assets/custom/objects/object_housekey/gHouseKeyDL_tri_1 @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_housekey/gHouseKeyDL_tri_2 b/soh/assets/custom/objects/object_housekey/gHouseKeyDL_tri_2 new file mode 100644 index 000000000..a606298d1 --- /dev/null +++ b/soh/assets/custom/objects/object_housekey/gHouseKeyDL_tri_2 @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_housekey/gHouseKeyDL_vtx_0 b/soh/assets/custom/objects/object_housekey/gHouseKeyDL_vtx_0 new file mode 100644 index 000000000..cd0885c1c --- /dev/null +++ b/soh/assets/custom/objects/object_housekey/gHouseKeyDL_vtx_0 @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_housekey/gHouseKeyDL_vtx_1 b/soh/assets/custom/objects/object_housekey/gHouseKeyDL_vtx_1 new file mode 100644 index 000000000..c4f2d8850 --- /dev/null +++ b/soh/assets/custom/objects/object_housekey/gHouseKeyDL_vtx_1 @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_housekey/gHouseKeyDL_vtx_2 b/soh/assets/custom/objects/object_housekey/gHouseKeyDL_vtx_2 new file mode 100644 index 000000000..dc377511e --- /dev/null +++ b/soh/assets/custom/objects/object_housekey/gHouseKeyDL_vtx_2 @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_housekey/mat_gHouseKeyDL_f3dlite_housekeymetal b/soh/assets/custom/objects/object_housekey/mat_gHouseKeyDL_f3dlite_housekeymetal new file mode 100644 index 000000000..90c65bd06 --- /dev/null +++ b/soh/assets/custom/objects/object_housekey/mat_gHouseKeyDL_f3dlite_housekeymetal @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_housekey/mat_gHouseKeyDL_f3dlite_housekeyringmetal b/soh/assets/custom/objects/object_housekey/mat_gHouseKeyDL_f3dlite_housekeyringmetal new file mode 100644 index 000000000..d7d19e315 --- /dev/null +++ b/soh/assets/custom/objects/object_housekey/mat_gHouseKeyDL_f3dlite_housekeyringmetal @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_housekey/mat_gHouseKeyDL_f3dlite_housekeytag b/soh/assets/custom/objects/object_housekey/mat_gHouseKeyDL_f3dlite_housekeytag new file mode 100644 index 000000000..05f2afc64 --- /dev/null +++ b/soh/assets/custom/objects/object_housekey/mat_gHouseKeyDL_f3dlite_housekeytag @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/soh_assets.h b/soh/assets/soh_assets.h index 78f4d281e..4cf6a4266 100644 --- a/soh/assets/soh_assets.h +++ b/soh/assets/soh_assets.h @@ -237,6 +237,9 @@ static const ALIGN_ASSET(2) char gKeyringKeysShadowTempleMQDL[] = dgKeyringKeysS #define dgKeyringKeysGanonsCastleMQDL "__OTR__objects/object_keyring/gKeyringKeysGanonsCastleMQDL" static const ALIGN_ASSET(2) char gKeyringKeysGanonsCastleMQDL[] = dgKeyringKeysGanonsCastleMQDL; +#define dgHouseKeyDL "__OTR__objects/object_housekey/gHouseKeyDL" +static const ALIGN_ASSET(2) char gHouseKeyDL[] = dgHouseKeyDL; + // overlays #define dgOptionsDividerChangeLangVtx "__OTR__overlays/ovl_file_choose/gOptionsDividerChangeLangVtx" static const ALIGN_ASSET(2) char gOptionsDividerChangeLangVtx[] = dgOptionsDividerChangeLangVtx; diff --git a/soh/soh/Enhancements/FileSelectEnhancements.cpp b/soh/soh/Enhancements/FileSelectEnhancements.cpp index 43b2f1966..84cff9d12 100644 --- a/soh/soh/Enhancements/FileSelectEnhancements.cpp +++ b/soh/soh/Enhancements/FileSelectEnhancements.cpp @@ -13,7 +13,7 @@ std::array RandomizerSettingsMenuText[RSM_MAX] = { // German "Start Randomizer", // French - "Start Randomizer", + "Commencer le Randomizer", }, { // English @@ -21,7 +21,7 @@ std::array RandomizerSettingsMenuText[RSM_MAX] = { // German "Generate New Randomizer Seed", // French - "Generate New Randomizer Seed", + "Générer une nouvelle seed pour le Randomizer", }, { // English @@ -29,7 +29,7 @@ std::array RandomizerSettingsMenuText[RSM_MAX] = { // German "Open Randomizer Settings", // French - "Open Randomizer Settings", + "Ouvrir les paramètres du Randomizer", }, { // English @@ -37,7 +37,7 @@ std::array RandomizerSettingsMenuText[RSM_MAX] = { // German "Generating...", // French - "Generating...", + "Génération en cours...", }, { // English diff --git a/soh/soh/Enhancements/TimeDisplay/TimeDisplay.cpp b/soh/soh/Enhancements/TimeDisplay/TimeDisplay.cpp index cb9dfbb46..09f037570 100644 --- a/soh/soh/Enhancements/TimeDisplay/TimeDisplay.cpp +++ b/soh/soh/Enhancements/TimeDisplay/TimeDisplay.cpp @@ -196,7 +196,6 @@ void TimeDisplayWindow::Draw() { uint16_t textureIndex = 0; for (size_t i = 0; i < textLength; i++) { - ImVec2 originalCursorPos = ImGui::GetCursorPos(); if (textToDecode[i] == ':' || textToDecode[i] == '.') { textureIndex = 10; } else { diff --git a/soh/soh/Enhancements/debugconsole.cpp b/soh/soh/Enhancements/debugconsole.cpp index 903984f12..9ef0fe2ab 100644 --- a/soh/soh/Enhancements/debugconsole.cpp +++ b/soh/soh/Enhancements/debugconsole.cpp @@ -402,6 +402,7 @@ static bool EntranceHandler(std::shared_ptr Console, const std::v gPlayState->transitionTrigger = TRANS_TRIGGER_START; gPlayState->transitionType = TRANS_TYPE_INSTANT; gSaveContext.nextTransitionType = TRANS_TYPE_INSTANT; + return 0; } static bool VoidHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { diff --git a/soh/soh/Enhancements/debugger/MessageViewer.cpp b/soh/soh/Enhancements/debugger/MessageViewer.cpp index 4c3f62693..3c10772f3 100644 --- a/soh/soh/Enhancements/debugger/MessageViewer.cpp +++ b/soh/soh/Enhancements/debugger/MessageViewer.cpp @@ -180,9 +180,7 @@ void MessageDebug_StartTextBox(const char* tableId, uint16_t textId, uint8_t lan Font* font = &msgCtx->font; sMessageHasSetSfx = 0; for (u32 i = 0; i < FONT_CHAR_TEX_SIZE * 120; i += FONT_CHAR_TEX_SIZE) { - if (&font->charTexBuf[i] != nullptr) { - gSPInvalidateTexCache(play->state.gfxCtx->polyOpa.p++, reinterpret_cast(&font->charTexBuf[i])); - } + gSPInvalidateTexCache(play->state.gfxCtx->polyOpa.p++, reinterpret_cast(&font->charTexBuf[i])); } R_TEXT_CHAR_SCALE = 75; R_TEXT_LINE_SPACING = 12; diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.h b/soh/soh/Enhancements/debugger/debugSaveEditor.h index 8eb939ec8..2a77b9b0a 100644 --- a/soh/soh/Enhancements/debugger/debugSaveEditor.h +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.h @@ -1551,6 +1551,55 @@ const std::vector flagTables = { { RAND_INF_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, "RAND_INF_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY" }, { RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY" }, { RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY" }, + + { RAND_INF_GUARD_HOUSE_UNLOCKED, "RAND_INF_GUARD_HOUSE_UNLOCKED" }, + { RAND_INF_GUARD_HOUSE_KEY_OBTAINED, "RAND_INF_GUARD_HOUSE_KEY_OBTAINED" }, + { RAND_INF_MARKET_BAZAAR_UNLOCKED, "RAND_INF_MARKET_BAZAAR_UNLOCKED" }, + { RAND_INF_MARKET_BAZAAR_KEY_OBTAINED, "RAND_INF_MARKET_BAZAAR_KEY_OBTAINED" }, + { RAND_INF_MARKET_POTION_SHOP_UNLOCKED, "RAND_INF_MARKET_POTION_SHOP_UNLOCKED" }, + { RAND_INF_MARKET_POTION_SHOP_KEY_OBTAINED, "RAND_INF_MARKET_POTION_SHOP_KEY_OBTAINED" }, + { RAND_INF_MASK_SHOP_UNLOCKED, "RAND_INF_MASK_SHOP_UNLOCKED" }, + { RAND_INF_MASK_SHOP_KEY_OBTAINED, "RAND_INF_MASK_SHOP_KEY_OBTAINED" }, + { RAND_INF_MARKET_SHOOTING_GALLERY_UNLOCKED, "RAND_INF_MARKET_SHOOTING_GALLERY_UNLOCKED" }, + { RAND_INF_MARKET_SHOOTING_GALLERY_KEY_OBTAINED, "RAND_INF_MARKET_SHOOTING_GALLERY_KEY_OBTAINED" }, + { RAND_INF_BOMBCHU_BOWLING_UNLOCKED, "RAND_INF_BOMBCHU_BOWLING_UNLOCKED" }, + { RAND_INF_BOMBCHU_BOWLING_KEY_OBTAINED, "RAND_INF_BOMBCHU_BOWLING_KEY_OBTAINED" }, + { RAND_INF_TREASURE_CHEST_GAME_BUILDING_UNLOCKED, "RAND_INF_TREASURE_CHEST_GAME_BUILDING_UNLOCKED" }, + { RAND_INF_TREASURE_CHEST_GAME_BUILDING_KEY_OBTAINED, "RAND_INF_TREASURE_CHEST_GAME_BUILDING_KEY_OBTAINED" }, + { RAND_INF_BOMBCHU_SHOP_UNLOCKED, "RAND_INF_BOMBCHU_SHOP_UNLOCKED" }, + { RAND_INF_BOMBCHU_SHOP_KEY_OBTAINED, "RAND_INF_BOMBCHU_SHOP_KEY_OBTAINED" }, + { RAND_INF_RICHARDS_HOUSE_UNLOCKED, "RAND_INF_RICHARDS_HOUSE_UNLOCKED" }, + { RAND_INF_RICHARDS_HOUSE_KEY_OBTAINED, "RAND_INF_RICHARDS_HOUSE_KEY_OBTAINED" }, + { RAND_INF_ALLEY_HOUSE_UNLOCKED, "RAND_INF_ALLEY_HOUSE_UNLOCKED" }, + { RAND_INF_ALLEY_HOUSE_KEY_OBTAINED, "RAND_INF_ALLEY_HOUSE_KEY_OBTAINED" }, + { RAND_INF_KAK_BAZAAR_UNLOCKED, "RAND_INF_KAK_BAZAAR_UNLOCKED" }, + { RAND_INF_KAK_BAZAAR_KEY_OBTAINED, "RAND_INF_KAK_BAZAAR_KEY_OBTAINED" }, + { RAND_INF_KAK_POTION_SHOP_UNLOCKED, "RAND_INF_KAK_POTION_SHOP_UNLOCKED" }, + { RAND_INF_KAK_POTION_SHOP_KEY_OBTAINED, "RAND_INF_KAK_POTION_SHOP_KEY_OBTAINED" }, + { RAND_INF_BOSS_HOUSE_UNLOCKED, "RAND_INF_BOSS_HOUSE_UNLOCKED" }, + { RAND_INF_BOSS_HOUSE_KEY_OBTAINED, "RAND_INF_BOSS_HOUSE_KEY_OBTAINED" }, + { RAND_INF_GRANNYS_POTION_SHOP_UNLOCKED, "RAND_INF_GRANNYS_POTION_SHOP_UNLOCKED" }, + { RAND_INF_GRANNYS_POTION_SHOP_KEY_OBTAINED, "RAND_INF_GRANNYS_POTION_SHOP_KEY_OBTAINED" }, + { RAND_INF_SKULLTULA_HOUSE_UNLOCKED, "RAND_INF_SKULLTULA_HOUSE_UNLOCKED" }, + { RAND_INF_SKULLTULA_HOUSE_KEY_OBTAINED, "RAND_INF_SKULLTULA_HOUSE_KEY_OBTAINED" }, + { RAND_INF_IMPAS_HOUSE_UNLOCKED, "RAND_INF_IMPAS_HOUSE_UNLOCKED" }, + { RAND_INF_IMPAS_HOUSE_KEY_OBTAINED, "RAND_INF_IMPAS_HOUSE_KEY_OBTAINED" }, + { RAND_INF_WINDMILL_UNLOCKED, "RAND_INF_WINDMILL_UNLOCKED" }, + { RAND_INF_WINDMILL_KEY_OBTAINED, "RAND_INF_WINDMILL_KEY_OBTAINED" }, + { RAND_INF_KAK_SHOOTING_GALLERY_UNLOCKED, "RAND_INF_KAK_SHOOTING_GALLERY_UNLOCKED" }, + { RAND_INF_KAK_SHOOTING_GALLERY_KEY_OBTAINED, "RAND_INF_KAK_SHOOTING_GALLERY_KEY_OBTAINED" }, + { RAND_INF_DAMPES_HUT_UNLOCKED, "RAND_INF_DAMPES_HUT_UNLOCKED" }, + { RAND_INF_DAMPES_HUT_KEY_OBTAINED, "RAND_INF_DAMPES_HUT_KEY_OBTAINED" }, + { RAND_INF_TALONS_HOUSE_UNLOCKED, "RAND_INF_TALONS_HOUSE_UNLOCKED" }, + { RAND_INF_TALONS_HOUSE_KEY_OBTAINED, "RAND_INF_TALONS_HOUSE_KEY_OBTAINED" }, + { RAND_INF_STABLES_UNLOCKED, "RAND_INF_STABLES_UNLOCKED" }, + { RAND_INF_STABLES_KEY_OBTAINED, "RAND_INF_STABLES_KEY_OBTAINED" }, + { RAND_INF_BACK_TOWER_UNLOCKED, "RAND_INF_BACK_TOWER_UNLOCKED" }, + { RAND_INF_BACK_TOWER_KEY_OBTAINED, "RAND_INF_BACK_TOWER_KEY_OBTAINED" }, + { RAND_INF_HYLIA_LAB_UNLOCKED, "RAND_INF_HYLIA_LAB_UNLOCKED" }, + { RAND_INF_HYLIA_LAB_KEY_OBTAINED, "RAND_INF_HYLIA_LAB_KEY_OBTAINED" }, + { RAND_INF_FISHING_HOLE_UNLOCKED, "RAND_INF_FISHING_HOLE_UNLOCKED" }, + { RAND_INF_FISHING_HOLE_KEY_OBTAINED, "RAND_INF_FISHING_HOLE_KEY_OBTAINED" }, } }, }; diff --git a/soh/soh/Enhancements/debugger/performanceTimer.cpp b/soh/soh/Enhancements/debugger/performanceTimer.cpp index f52a8efac..69ffc6925 100644 --- a/soh/soh/Enhancements/debugger/performanceTimer.cpp +++ b/soh/soh/Enhancements/debugger/performanceTimer.cpp @@ -1,5 +1,3 @@ -#pragma once - #include "performanceTimer.h" void StartPerformanceTimer(TimerID timer){ diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.h b/soh/soh/Enhancements/game-interactor/GameInteractor.h index 41daa781f..e763ad329 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.h @@ -305,6 +305,13 @@ typedef enum { VB_FROGS_GO_TO_IDLE, // Vanilla condition: var >= gSaveContext.health) && (gSaveContext.health > 0 VB_HEALTH_METER_BE_CRITICAL, + VB_CONSUME_SMALL_KEY, + // Vanilla condition: gSaveContext.inventory.dungeonKeys[gSaveContext.mapIndex] <= 0 + VB_NOT_HAVE_SMALL_KEY, + // Vanilla condition: !Flags_GetSwitch(play, this->actor.params & 0x3F) + VB_DOOR_BE_LOCKED, + // Vanilla condition: ((doorActor->params >> 7) & 7) == 3 + VB_DOOR_PLAY_SCENE_TRANSITION, /*** Play Cutscenes ***/ diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index 1753dc30c..90b8272da 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -1133,7 +1133,7 @@ void RegisterOpenAllHours() { GameInteractor::Instance->RegisterGameHook([](void* refActor) { Actor* actor = static_cast(refActor); - if (CVarGetInteger(CVAR_ENHANCEMENT("OpenAllHours"), 0) && (actor->id == ACTOR_EN_DOOR)) { + if (CVarGetInteger(CVAR_ENHANCEMENT("OpenAllHours"), 0) && (actor->id == ACTOR_EN_DOOR) && (!IS_RANDO || !OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LOCK_OVERWORLD_DOORS))) { switch (actor->params) { case 4753: // Night Market Bazaar case 1678: // Night Potion Shop diff --git a/soh/soh/Enhancements/pausewarp.c b/soh/soh/Enhancements/pausewarp.c index b87952232..c767a3412 100644 --- a/soh/soh/Enhancements/pausewarp.c +++ b/soh/soh/Enhancements/pausewarp.c @@ -2,22 +2,23 @@ #include "global.h" #include "z64.h" #include "game-interactor/GameInteractor.h" +#include "soh/OTRGlobals.h" static const int songMessageMap[] = { - TEXT_WARP_MINUET_OF_FOREST, - TEXT_WARP_BOLERO_OF_FIRE, - TEXT_WARP_SERENADE_OF_WATER, - TEXT_WARP_REQUIEM_OF_SPIRIT, - TEXT_WARP_NOCTURNE_OF_SHADOW, - TEXT_WARP_PRELUDE_OF_LIGHT + TEXT_WARP_MINUET_OF_FOREST, + TEXT_WARP_BOLERO_OF_FIRE, + TEXT_WARP_SERENADE_OF_WATER, + TEXT_WARP_REQUIEM_OF_SPIRIT, + TEXT_WARP_NOCTURNE_OF_SHADOW, + TEXT_WARP_PRELUDE_OF_LIGHT }; static const int ocarinaSongMap[] = { - OCARINA_SONG_MINUET, - OCARINA_SONG_BOLERO, - OCARINA_SONG_SERENADE, - OCARINA_SONG_REQUIEM, - OCARINA_SONG_NOCTURNE, + OCARINA_SONG_MINUET, + OCARINA_SONG_BOLERO, + OCARINA_SONG_SERENADE, + OCARINA_SONG_REQUIEM, + OCARINA_SONG_NOCTURNE, OCARINA_SONG_PRELUDE }; @@ -31,12 +32,12 @@ static const int entranceIndexMap[] = { }; static const int songAudioMap[] = { - NA_BGM_OCA_MINUET, - NA_BGM_OCA_BOLERO, - NA_BGM_OCA_SERENADE, - NA_BGM_OCA_REQUIEM, - NA_BGM_OCA_NOCTURNE, - NA_BGM_OCA_LIGHT + NA_BGM_OCA_MINUET, + NA_BGM_OCA_BOLERO, + NA_BGM_OCA_SERENADE, + NA_BGM_OCA_REQUIEM, + NA_BGM_OCA_NOCTURNE, + NA_BGM_OCA_LIGHT }; static bool isWarpActive = false; @@ -87,6 +88,47 @@ void PauseWarp_HandleSelection() { int song = gPlayState->pauseCtx.cursorPoint[PAUSE_QUEST]; if (aButtonPressed && CHECK_QUEST_ITEM(song) && song >= QUEST_SONG_MINUET && song <= QUEST_SONG_PRELUDE && gPlayState->pauseCtx.pageIndex == PAUSE_QUEST && gPlayState->pauseCtx.state == 6) { + if (gSaveContext.ship.quest.id == QUEST_RANDOMIZER && Randomizer_GetSettingValue(RSK_SHUFFLE_OCARINA_BUTTONS)) { + bool canplay = false; + switch (song) { + case QUEST_SONG_MINUET: + canplay = Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_A) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_LEFT) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_RIGHT) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_UP); + break; + case QUEST_SONG_BOLERO: + canplay = Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_A) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_RIGHT) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_DOWN); + break; + case QUEST_SONG_SERENADE: + canplay = Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_A) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_LEFT) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_RIGHT) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_DOWN); + break; + case QUEST_SONG_REQUIEM: + canplay = Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_A) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_RIGHT) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_DOWN); + break; + case QUEST_SONG_NOCTURNE: + canplay = Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_A) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_LEFT) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_RIGHT) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_DOWN); + break; + case QUEST_SONG_PRELUDE: + canplay = Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_LEFT) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_RIGHT) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_UP); + break; + } + if (!canplay) { + return; + } + } ActivateWarp(&gPlayState->pauseCtx, song); } } diff --git a/soh/soh/Enhancements/presets.h b/soh/soh/Enhancements/presets.h index 965fa2678..78e754d58 100644 --- a/soh/soh/Enhancements/presets.h +++ b/soh/soh/Enhancements/presets.h @@ -408,7 +408,6 @@ const std::vector randomizerCvars = { CVAR_RANDOMIZER_SETTING("DoorOfTime"), CVAR_RANDOMIZER_SETTING("DungeonCount"), CVAR_RANDOMIZER_SETTING("EnableBombchuDrops"), - CVAR_RANDOMIZER_SETTING("EnableGlitchCutscenes"), CVAR_RANDOMIZER_SETTING("FishingPoleHint"), CVAR_RANDOMIZER_SETTING("Fishsanity"), CVAR_RANDOMIZER_SETTING("FishsanityAgeSplit"), @@ -1200,7 +1199,6 @@ const std::vector hellModePresetEntries = { PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("CuccosToReturn"), 1), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("DoorOfTime"), RO_DOOROFTIME_OPEN), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("EnableBombchuDrops"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("EnableGlitchCutscenes"), 1), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ClosedForest"), RO_CLOSED_FOREST_OFF), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GanonTrial"), RO_GANONS_TRIALS_SET_NUMBER), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GanonTrialCount"), 6), diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp index 49d090a26..fd1f5ae4d 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp @@ -1455,915 +1455,300 @@ void StaticData::HintTable_Init() { | JUNK HINT TEXT | ---------------------------*/ - hintTextTable[RHT_JUNK02] = HintText(CustomMessage("They say you must read the names of \"Special Deal\" shop items carefully.", - /*german*/ "", - /*french*/ "Selon moi, les \"Offres spéciales\" sont parfois trompeuses... Lisez les attentivement!")); - // /*spanish*/"Según dicen, se debería prestar atención a los nombres de las ofertas especiales." + hintTextTable[RHT_JUNK01] = HintText(CustomMessage("They say you must read the names of \"Special Deal\" shop items carefully.", + /*german*/ "", + /*french*/ "Selon moi, les \"Offres spéciales\" sont parfois trompeuses... Lisez les attentivement!")); - hintTextTable[RHT_JUNK03] = HintText(CustomMessage("They say that Zelda is a poor leader.", + hintTextTable[RHT_JUNK02] = HintText(CustomMessage("They say that Zelda is a poor leader.", /*german*/ "", /*french*/ "Selon moi, Zelda ne ferait pas un bon monarque.")); - // /*spanish*/Según dicen, Zelda es mala líder. - hintTextTable[RHT_JUNK04] = HintText(CustomMessage("These hints can be quite useful. This is an exception.", + hintTextTable[RHT_JUNK03] = HintText(CustomMessage("These hints can be quite useful. This is an exception.", /*german*/ "", /*french*/ "Ces indices sont très utiles, à l'exception de celui-ci.")); - // /*spanish*/Las pistas suelen servir de ayuda. En cambio, esta no. - hintTextTable[RHT_JUNK05] = HintText(CustomMessage("They say that the Lizalfos in Dodongo's Cavern like to play in lava.", + hintTextTable[RHT_JUNK04] = HintText(CustomMessage("They say that the Lizalfos in Dodongo's Cavern like to play in lava.", /*german*/ "", /*french*/ "Selon moi, les Lézalfos de la Caverne Dodongo aiment patauger dans la lave.")); - // /*spanish*/Según dicen, a los Lizalfos de la Cueva de los Dodongos les gusta jugar en la lava. - hintTextTable[RHT_JUNK06] = HintText(CustomMessage("They say that all the Zora drowned in Wind Waker.", + hintTextTable[RHT_JUNK05] = HintText(CustomMessage("They say that all the Zora drowned in Wind Waker.", /*german*/ "", /*french*/ "Selon moi, les Zoras se sont noyés dans Wind Waker.")); - // /*spanish*/Según dicen, en Wind Waker todos los zora se ahogaron. - hintTextTable[RHT_JUNK07] = HintText(CustomMessage("If Gorons eat rocks, does that mean I'm in danger?", + hintTextTable[RHT_JUNK06] = HintText(CustomMessage("If Gorons eat rocks, does that mean I'm in danger?", /*german*/ "", /*french*/ "Ne dis pas au Gorons que je suis ici. Ils mangent des roches, tu sais!")); - // /*spanish*/Si los Goron se tragan las piedras, ¿no me hace ser una especia vulnarable o algo así - hintTextTable[RHT_JUNK08] = HintText(CustomMessage("'Member when Ganon was a blue pig?^I 'member.", + hintTextTable[RHT_JUNK07] = HintText(CustomMessage("'Member when Ganon was a blue pig?^I 'member.", /*german*/ "", /*french*/ "Dans mon temps, Ganon était un cochon bleu...^Pff! Les jeunes de nos jours, et leur Ganondorf!")); - // /*spanish*/¿T'acuerdas cuando Ganon era un cerdo azul?^Qué tiempos, chico. - hintTextTable[RHT_JUNK09] = HintText(CustomMessage("One who does not have Triforce can't go in.", + hintTextTable[RHT_JUNK08] = HintText(CustomMessage("One who does not have Triforce can't go in.", /*german*/ "", /*french*/ "Ceux sans Triforce doivent rebrousser chemin.")); - // /*spanish*/Aquel que no porte la Trifuerza no podrá pasar. - hintTextTable[RHT_JUNK10] = HintText(CustomMessage("Save your future, end the Happy Mask Salesman.", + hintTextTable[RHT_JUNK09] = HintText(CustomMessage("Save your future, end the Happy Mask Salesman.", /*german*/ "", /*french*/ "Selon moi, tu t'éviteras des jours de malheur si tu vaincs le vendeur de masques...")); - // /*spanish*/Salva tu futuro, acaba con el dueño de La Máscara Feliz. - hintTextTable[RHT_JUNK11] = HintText(CustomMessage("Glitches are a pathway to many abilities some consider to be... Unnatural.", + hintTextTable[RHT_JUNK10] = HintText(CustomMessage("Glitches are a pathway to many abilities some consider to be... Unnatural.", /*german*/ "", /*french*/ "Les glitchs sont un moyen d'acquérir de nombreuses facultés considérées par certains comme... contraire ")); - // /*spanish*/ Los glitches son el camino a muchas habilidades que varios consideran... nada natural. - hintTextTable[RHT_JUNK12] = HintText(CustomMessage("I'm stoned. Get it?", + hintTextTable[RHT_JUNK11] = HintText(CustomMessage("I'm stoned. Get it?", /*german*/ "", /*french*/ "Allez, roche, papier, ciseau...&Roche.")); - // /*spanish*/Me he quedado de piedra. ¿Lo pillas? - hintTextTable[RHT_JUNK13] = HintText(CustomMessage("Hoot! Hoot! Would you like me to repeat that?", + hintTextTable[RHT_JUNK12] = HintText(CustomMessage("Hoot! Hoot! Would you like me to repeat that?", /*german*/ "", /*french*/ "Hou hou! Veux-tu que je répète tout ça?")); - // /*spanish*/¡Buuu, buuu! ¿Te lo vuelvo a repetir? - hintTextTable[RHT_JUNK14] = HintText(CustomMessage("Gorons are stupid. They eat rocks.", + hintTextTable[RHT_JUNK13] = HintText(CustomMessage("Gorons are stupid. They eat rocks.", /*german*/ "", /*french*/ "Les Gorons sont des vraies têtes dures.")); - // /*spanish*/Los Goron son tontos. Se comen las piedras. - hintTextTable[RHT_JUNK15] = HintText(CustomMessage("They say that Lon Lon Ranch prospered under Ingo.", + hintTextTable[RHT_JUNK14] = HintText(CustomMessage("They say that Lon Lon Ranch prospered under Ingo.", /*german*/ "", /*french*/ "Selon moi, le Ranch Lon Lon était plus prospère sous Ingo.")); - // /*spanish*/Según dicen, el Rancho Lon Lon prosperó gracias a Ingo. - hintTextTable[RHT_JUNK16] = HintText(CustomMessage("The single rupee is a unique item.", - /*german*/ "", - /*french*/ "Nul objet n'est plus unique que le rubis vert.")); - // /*spanish*/La rupia de uno es un objeto singular. - - hintTextTable[RHT_JUNK17] = HintText(CustomMessage("Without the Lens of Truth, the Treasure Chest Mini-Game is a 1 out of 32 chance.^Good luck!", + hintTextTable[RHT_JUNK15] = HintText(CustomMessage("They say without the Lens of Truth, the Treasure Chest Mini-Game is a 1 out of 32 chance.^Good luck!", /*german*/ "", /*french*/ "Gagner la Chasse-aux-Trésors est 1 chance sur 32.^Bonne chance!")); - // /*spanish*/Sin la Lupa de la Verdad, ganarías 1/32 veces en el Cofre del Tesoro.^¡Buena suerte con ello! - hintTextTable[RHT_JUNK18] = HintText(CustomMessage("Use bombs wisely.", + hintTextTable[RHT_JUNK16] = HintText(CustomMessage("Use bombs wisely.", /*german*/ "", /*french*/ "Utilise les bombes avec précaution.")); - // /*spanish*/No desperdicies las bombas. - hintTextTable[RHT_JUNK19] = HintText(CustomMessage("They say that Volvagia hates splinters", - /*german*/ "", - /*french*/ "Selon moi, Volvagia déteste les échardes.")); - // /*spanish*/Según dicen, Volvagia le teme a las astillas. - - hintTextTable[RHT_JUNK20] = HintText(CustomMessage("They say that funky monkeys can be spotted on Friday.", - /*german*/ "", - /*french*/ "Selon moi, des capucins coquins sortent le vendredi.")); - // /*spanish*/Según dicen, en los viernes puedes hallar monos marchosos. - - hintTextTable[RHT_JUNK21] = HintText(CustomMessage("I found you, faker!", - /*german*/ "", - /*french*/ "Ah-ha! Je t'ai trouvé!")); - // /*spanish*/¡Ahí estás, impostor! - - hintTextTable[RHT_JUNK22] = HintText(CustomMessage("They say the Groose is loose.", - /*german*/ "", - /*french*/ "Selon moi, Hergo est le vrai héros.")); - // /*spanish*/Según dicen, Malton es un espanto. - - hintTextTable[RHT_JUNK23] = HintText(CustomMessage("They say that players who select the \"ON\" option for \"MOTION CONTROL\" are the real \"Zelda players!\"", + hintTextTable[RHT_JUNK17] = HintText(CustomMessage("They say that players who select the \"ON\" option for \"MOTION CONTROL\" are the real \"Zelda players!\"", /*german*/ "", /*french*/ "Selon moi, ceux qui utilisent les contrôles gyroscopiques sont les VRAIS joueurs.")); - // /*spanish*/ "Según dicen, aquellos que juegan usando el control por movimiento son los verdaderos jugadores de Zelda." - hintTextTable[RHT_JUNK24] = HintText(CustomMessage("What happened to Sheik?", - /*german*/ "", - /*french*/ "Donc... Qu'est-ce qui arrive avec Sheik?")); - // /*spanish*/¿Qué la habrá pasado a Sheik? - - hintTextTable[RHT_JUNK25] = HintText(CustomMessage("L2P @.", + hintTextTable[RHT_JUNK18] = HintText(CustomMessage("L2P @.", /*german*/ "", /*french*/ "Arrête de lire les indices et joue comme un grand, @.")); - // /*spanish*/Mira que eres novato, @. - hintTextTable[RHT_JUNK26] = HintText(CustomMessage("I've heard you can cheat at Sploosh Kaboom.", - /*german*/ "", - /*french*/ "Selon moi, il y a une carte aux trésors à Mercantîle... Duh!")); - // /*spanish*/He oído por ahí que puedes hacer trampa en el Sploosh Kaboom. - - hintTextTable[RHT_JUNK27] = HintText(CustomMessage("I'm Lonk from Pennsylvania.", - /*german*/ "", - /*french*/ "Je suis Lonk, le héros de Pennsylvanie!")); - // /*spanish*/Soy Lonk, de Pensilvania. - - hintTextTable[RHT_JUNK28] = HintText(CustomMessage("I bet you'd like to have more bombs.", + hintTextTable[RHT_JUNK19] = HintText(CustomMessage("I bet you'd like to have more bombs.", /*german*/ "", /*french*/ "Je parie que tu veux plus de bombes.")); - // /*spanish*/Me apuesto a que quisieras tener más bombas. - hintTextTable[RHT_JUNK29] = HintText(CustomMessage("When all else fails, use Fire.", + hintTextTable[RHT_JUNK20] = HintText(CustomMessage("When all else fails, use Fire.", /*german*/ "", /*french*/ "Quand rien ne marche, utilise le feu.")); - // /*spanish*/Cuando nada funcione, usa el fuego. - hintTextTable[RHT_JUNK30] = HintText(CustomMessage("Here's a hint, @. Don't be bad.", + hintTextTable[RHT_JUNK21] = HintText(CustomMessage("Here's a hint, @. Don't be bad.", /*german*/ "", /*french*/ "Selon moi, la #Triforce# n'est pas dans le jeu... Duh!")); - // /*spanish*/Aquí tienes una pista, @: deja de ser manco. - hintTextTable[RHT_JUNK31] = HintText(CustomMessage("Game Over. Return of Ganon.", + hintTextTable[RHT_JUNK22] = HintText(CustomMessage("Game Over. Return of Ganon.", /*german*/ "", /*french*/ "Partie terminée. RETour de Ganon.")); - // /*spanish*/Fin de la partida. El regreso de Ganon. - hintTextTable[RHT_JUNK32] = HintText(CustomMessage("May the way of the Hero lead to the Triforce.", + hintTextTable[RHT_JUNK23] = HintText(CustomMessage("May the way of the Hero lead to the Triforce.", /*german*/ "", /*french*/ "Que le chemin du héros te mène à la Triforce.")); - // /*spanish*/Puede que la senda del héroe te lleve hacia la Trifuerza. - hintTextTable[RHT_JUNK33] = HintText(CustomMessage("Can't find an item? Scan an Amiibo.", + hintTextTable[RHT_JUNK24] = HintText(CustomMessage("Can't find an item? Scan an Amiibo.", /*german*/ "", /*french*/ "Tu cherches de quoi? Utilise un Amiibo!")); - // /*spanish*/¿No encuentras algo? Escanea un amiibo. - hintTextTable[RHT_JUNK34] = HintText(CustomMessage("They say this game has just a few glitches.", + hintTextTable[RHT_JUNK25] = HintText(CustomMessage("They say this game has just a few glitches.", /*german*/ "", /*french*/ "Selon moi, ce jeu est complètement exempt de glitchs.")); - // /*spanish*/Dicen que este juego apenas tiene glitches. - hintTextTable[RHT_JUNK35] = HintText(CustomMessage("BRRING BRRING This is Ulrira. Wrong number?", + hintTextTable[RHT_JUNK26] = HintText(CustomMessage("BRRING BRRING This is Ulrira. Wrong number?", /*german*/ "", /*french*/ "DRING DRING!! Pépé le Ramollo à l'appareil... Quoi? Faux numéro?")); - // /*spanish*/¡Ring! ¡Ring! Al habla Ulrira. ¿Me he equivocado de número? - hintTextTable[RHT_JUNK36] = HintText(CustomMessage("Tingle Tingle Kooloo Limpah!", + hintTextTable[RHT_JUNK27] = HintText(CustomMessage("Tingle Tingle Kooloo Limpah!", /*german*/ "", /*french*/ "Tingle! Tingle! Kooloolin... Pah!")); - // /*spanish*/Tingle, Tingle, Kurulín... ¡PA! - hintTextTable[RHT_JUNK37] = HintText(CustomMessage("L is real 2401", + hintTextTable[RHT_JUNK28] = HintText(CustomMessage("L is real 2401", /*german*/ "", /*french*/ "L is real 2401")); - // /*spanish*/L es real 2401. - hintTextTable[RHT_JUNK38] = HintText(CustomMessage("They say that Ganondorf will appear in the next Mario Tennis.", + hintTextTable[RHT_JUNK29] = HintText(CustomMessage("They say that Ganondorf will appear in the next Mario Tennis.", /*german*/ "", /*french*/ "Selon moi, Ganondorf sera la nouvelle recrue dans Mario Tennis.")); - // /*spanish*/Según dicen, Ganondorf estará en el próximo Mario Tennis. - hintTextTable[RHT_JUNK39] = HintText(CustomMessage("Medigoron sells the earliest Breath of the Wild demo.", + hintTextTable[RHT_JUNK30] = HintText(CustomMessage("They say Medigoron sells the earliest Breath of the Wild demo.", /*german*/ "", /*french*/ "Selon moi, Medigoron vend une démo de #Breath of the Wild#.")); - // /*spanish*/Medigoron vende la primera demo del Breath of the Wild. - hintTextTable[RHT_JUNK40] = HintText(CustomMessage("Can you move me? I don't get great service here.", + hintTextTable[RHT_JUNK31] = HintText(CustomMessage("Can you move me? I don't get great service here.", /*german*/ "", /*french*/ "Peux-tu me déplacer? J'ai pas une bonne réception ici.")); - // /*spanish*/¿Puedes llevarme a otro lado? Aquí nadie me presta atención. - hintTextTable[RHT_JUNK41] = HintText(CustomMessage("They say if you use Strength on the truck, you can find Mew.", + hintTextTable[RHT_JUNK32] = HintText(CustomMessage("They say if you use Strength on the truck, you can find Mew.", /*german*/ "", /*french*/ "Selon moi, #Mew# se trouve dessous le camion... Duh!")); - // /*spanish*/Según dicen, puedes hallar un Mew usando Fuerza contra el camión de Ciudad Carmín. - hintTextTable[RHT_JUNK42] = HintText(CustomMessage("I'm a helpful hint Gossip Stone!^See, I'm helping.", + hintTextTable[RHT_JUNK33] = HintText(CustomMessage("I'm a helpful hint Gossip Stone!^See, I'm helping.", /*german*/ "", /*french*/ "Salut! Je suis une pierre de bons conseils!^Tiens, tu vois? J'aide bien, hein?")); - // /*spanish*/Soy una Piedra Sheikah muy útil.^¡Mira cómo te ayudo! - hintTextTable[RHT_JUNK43] = HintText(CustomMessage("Dear @, please come to the castle. I've baked a cake for you.&Yours truly, Princess Zelda.", + hintTextTable[RHT_JUNK34] = HintText(CustomMessage("Dear @, please come to the castle. I've baked a cake for you.&Yours truly, Princess Zelda.", /*german*/ "", /*french*/ "Mon très cher @:&Viens vite au château, je t'ai préparé&un délicieux gâteau...^À bientôt, Princesse Zelda")); - // /*spanish*/Querido @: Por favor, ven al castillo. He hecho una tarta para ti.&Sinceramente tuya: Princesa Zelda. - hintTextTable[RHT_JUNK44] = HintText(CustomMessage("They say all toasters toast toast.", + hintTextTable[RHT_JUNK35] = HintText(CustomMessage("They say all toasters toast toast.", /*german*/ "", /*french*/ "Selon moi, les grille-pains grillent du pain.")); - // /*spanish*/Según dicen, todas las tostadoras tostan tostadas tostadas. - hintTextTable[RHT_JUNK45] = HintText(CustomMessage("You thought it would be a useful hint, but it was me, junk hint!", + hintTextTable[RHT_JUNK36] = HintText(CustomMessage("You thought it would be a useful hint, but it was me, junk hint!", /*german*/ "", /*french*/ "Tu t'attendais à un bon indice... Mais c'était moi, un mauvais indice!")); - // /*spanish*/Je... Creeías que iba a ser una piedra de utilidad, ¡pero no, era yo, la piedra de la agonía! - hintTextTable[RHT_JUNK46] = HintText(CustomMessage("They say that quest guidance can be found at a talking rock.", + hintTextTable[RHT_JUNK37] = HintText(CustomMessage("They say that quest guidance can be found at a talking rock.", /*german*/ "", /*french*/ "Selon moi, des #indices# se trouvent auprès d'une pierre parlante... Duh!")); - // /*spanish*/Según dicen, puedes consultarle ayuda a rocas parlanchinas. - hintTextTable[RHT_JUNK47] = HintText(CustomMessage("They say that the final item you're looking for can be found somewhere in Hyrule.", + hintTextTable[RHT_JUNK38] = HintText(CustomMessage("They say that the final item you're looking for can be found somewhere in Hyrule.", /*german*/ "", /*french*/ "Selon moi, le #dernier objet# se trouve quelque part dans Hyrule... Duh!")); - // /*spanish*/Según dicen, el último objeto que te falte puede estar en cualquier rincón de Hyrule. - hintTextTable[RHT_JUNK48] = HintText(CustomMessage("Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.", + hintTextTable[RHT_JUNK39] = HintText(CustomMessage("Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.", /*german*/ "", /*french*/ "Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.")); - // /*spanish*/Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep. - hintTextTable[RHT_JUNK49] = HintText(CustomMessage("They say that Barinade fears Deku Nuts.", + hintTextTable[RHT_JUNK40] = HintText(CustomMessage("They say that Barinade fears Deku Nuts.", /*german*/ "", /*french*/ "Selon moi, Barinade a la frousse des noix Mojo.")); - // /*spanish*/Según dicen, lo que más teme a Barinade son las nueces deku. - hintTextTable[RHT_JUNK50] = HintText(CustomMessage("They say that Flare Dancers do not fear Goron-crafted blades.", + hintTextTable[RHT_JUNK41] = HintText(CustomMessage("They say that Flare Dancers do not fear Goron-crafted blades.", /*german*/ "", /*french*/ "Selon moi, le danse-flamme n'a pas peur des armes de Goron.")); - // /*spanish*/Según dicen, los Bailafuegos no le temen a las armas forjadas por Gorons. - hintTextTable[RHT_JUNK51] = HintText(CustomMessage("They say that Morpha is easily trapped in a corner.", + hintTextTable[RHT_JUNK42] = HintText(CustomMessage("They say that Morpha is easily trapped in a corner.", /*german*/ "", /*french*/ "Selon moi, Morpha est facilement coincé.")); - // /*spanish*/Según dicen, puedes atrapar a Morpha con facilidad en una esquina. - hintTextTable[RHT_JUNK52] = HintText(CustomMessage("They say that Bongo Bongo really hates the cold.", + hintTextTable[RHT_JUNK43] = HintText(CustomMessage("They say that Bongo Bongo really hates the cold.", /*german*/ "", /*french*/ "Selon moi, Bongo Bongo a facilement froid aux doigts.")); - // /*spanish*/Según dicen, Bongo Bongo odia a muerte el frío. - hintTextTable[RHT_JUNK53] = HintText(CustomMessage("They say that your sword is most powerful when you put it away.", + hintTextTable[RHT_JUNK44] = HintText(CustomMessage("They say that your sword is most powerful when you put it away.", /*german*/ "", /*french*/ "Selon moi, ton épée est à pleine puissance quand tu la rengaines.")); - // /*spanish*/Según dicen, tu espada se vuelve más poderosa si la guardas. - hintTextTable[RHT_JUNK54] = HintText(CustomMessage("They say that bombing the hole Volvagia last flew into can be rewarding.", + hintTextTable[RHT_JUNK45] = HintText(CustomMessage("They say that bombing the hole Volvagia last flew into can be rewarding.", /*german*/ "", /*french*/ "Selon moi, le trou où se creuse Volvagia est vulnérable aux bombes.")); - // /*spanish*/Según dicen, trae buena suerte colocar una bomba en el último agujero de donde salió Volvagia. - hintTextTable[RHT_JUNK55] = HintText(CustomMessage("They say that invisible ghosts can be exposed with Deku Nuts.", + hintTextTable[RHT_JUNK46] = HintText(CustomMessage("They say that invisible ghosts can be exposed with Deku Nuts.", /*german*/ "", /*french*/ "Selon moi, des fantômes invisibles apparaissent avec des noix Mojo.")); - // /*spanish*/Según dicen, puedes exponer a los espectros invisibles con nueces deku. - hintTextTable[RHT_JUNK56] = HintText(CustomMessage("They say that the real Phantom Ganon is bright and loud.", + hintTextTable[RHT_JUNK47] = HintText(CustomMessage("They say that the real Phantom Ganon is bright and loud.", /*german*/ "", /*french*/ "Selon moi, le vrai spectre de Ganon est clair et bruyant.")); - // /*spanish*/Según dicen, el verdadero Ganon Fantasma es brillante y ruidoso. - hintTextTable[RHT_JUNK57] = HintText(CustomMessage("They say that walking backwards is very fast.", + hintTextTable[RHT_JUNK48] = HintText(CustomMessage("They say that walking backwards is very fast.", /*german*/ "", /*french*/ "Selon moi, tu fais marche arrière très rapidement pour un héros.")); - // /*spanish*/Según dicen, es más rápido caminar hacia atrás. - hintTextTable[RHT_JUNK58] = HintText(CustomMessage("They say that leaping above the Market entrance enriches most children.", - /*german*/ "", - /*french*/ "Selon moi, les enfants riches se pavanent en haut du pont-levis.")); - // /*spanish*/Según dicen, saltar por las cadenas a la entrada de la plaza enriquece a muchos chiquillos. - - hintTextTable[RHT_JUNK59] = HintText(CustomMessage("They say Ingo is not very good at planning ahead.", + hintTextTable[RHT_JUNK49] = HintText(CustomMessage("They say Ingo is not very good at planning ahead.", /*german*/ "", /*french*/ "Selon moi, Ingo ne fait pas un très bon geôlier.")); - // /*spanish*/Según dicen, a Ingo no se le da especialmente bien planificar con antelación. - hintTextTable[RHT_JUNK60] = HintText(CustomMessage("You found a spiritual Stone! By which I mean, I worship Nayru.", + hintTextTable[RHT_JUNK50] = HintText(CustomMessage("You found a spiritual Stone! By which I mean, I worship Nayru.", /*german*/ "", /*french*/ "Vous avez trouvé une Pierre Ancestrale! En effet, je vénère la déesse Hylia.")); - // /*spanish*/¡Has encontrado una piedra espiritual! Es que le rindo culto a Nayru... - hintTextTable[RHT_JUNK61] = HintText(CustomMessage("They say that a flying strike with a Deku Stick is no stronger than a grounded one.", - /*german*/ "", - /*french*/ "Selon moi, un coup de bâton sauté n'est pas meilleur qu'au sol.")); - // /*spanish*/Según dicen, los golpes aéreos con palos deku son tan fuertes como los normales. - - hintTextTable[RHT_JUNK62] = HintText(CustomMessage("Open your eyes.^Open your eyes.^Wake up, @.", + hintTextTable[RHT_JUNK51] = HintText(CustomMessage("Open your eyes.^Open your eyes.^Wake up, @.", /*german*/ "", /*french*/ "Réveille-toi...^Réveille-toi.^Ouvre les yeux, @.")); - // /*spanish*/Abre los ojos...^Abre los ojos...^Despierta, @... - hintTextTable[RHT_JUNK63] = HintText(CustomMessage("They say that the Nocturne of Shadow can bring you very close to Ganon.", + hintTextTable[RHT_JUNK52] = HintText(CustomMessage("They say that the Nocturne of Shadow can bring you very close to Ganon.", /*german*/ "", /*french*/ "Selon moi, le nocturne de l'ombre peut t'amener très près de Ganon.")); - // /*spanish*/Según dicen, el Nocturno de la sombra te puede acercar mucho a Ganon. - hintTextTable[RHT_JUNK64] = HintText(CustomMessage("They say that Twinrova always casts the same spell the first three times.", + hintTextTable[RHT_JUNK53] = HintText(CustomMessage("They say that Twinrova always casts the same spell the first three times.", /*german*/ "", /*french*/ "Selon moi, Twinrova lance toujours les mêmes trois premiers sorts.")); - // /*spanish*/Según dicen, Birova siempre lanza el mismo hechizo las tres primeras veces. - hintTextTable[RHT_JUNK65] = HintText(CustomMessage("They say that the nightly builds may be unstable.", + hintTextTable[RHT_JUNK54] = HintText(CustomMessage("They say that the nightly builds may be unstable.", /*german*/ "", /*french*/ "Selon moi, les \"nightly builds\" peuvent être instables.")); - // /*spanish*/Según dicen, las últimas nightlies pueden llegar a ser algo inestables. - hintTextTable[RHT_JUNK66] = HintText(CustomMessage("You're playing a Randomizer. I'm randomized!^Here's a random number: #4#.&Enjoy your Randomizer!", + hintTextTable[RHT_JUNK55] = HintText(CustomMessage("You're playing a Randomizer. I'm randomized!^Here's a random number: #4#.&Enjoy your Randomizer!", /*german*/ "", /*french*/ "Tu joues à un randomizer. Je suis aléatoire!^Voici un nombre aléatoire: #4#.&Bonne partie!")); - // /*spanish*/¡Estás jugando un Randomizer! ¡Yo también estoy aleatorizada!^Aquí tienes un número aleatorio: #8#.&¡Diviértete! - hintTextTable[RHT_JUNK67] = HintText(CustomMessage("They say Ganondorf's bolts can be reflected with glass or steel.", + hintTextTable[RHT_JUNK56] = HintText(CustomMessage("They say Ganondorf's bolts can be reflected with glass or steel.", /*german*/ "", /*french*/ "Selon moi, les éclairs de Ganon se reflètent sur l'acier et le verre.")); - // /*spanish*/Según dicen, puedes reflejar las esferas de energía de Ganondorf con cristal y acero. - hintTextTable[RHT_JUNK68] = HintText(CustomMessage("They say Ganon's tail is vulnerable to nuts, arrows, swords, explosives, hammers...^...sticks, seeds, " + hintTextTable[RHT_JUNK57] = HintText(CustomMessage("They say Ganon's tail is vulnerable to nuts, arrows, swords, explosives, hammers...^...sticks, seeds, " "boomerangs...^...rods, shovels, iron balls, angry bees...", /*german*/ "", /*french*/ "Selon moi, la queue de Ganon est vulnérable aux noix, flèches, épées, bombes, marteaux...^...bâtons, " "graines, boomerangs...^...baguettes, pelles, boulets de fer, abeilles enragées...")); - // /*spanish*/Según dicen, la cola de Ganon es vulnerable a nueces, flechas, espadas, explosivos, - // martillos...^...palos, semillas, bumeráns...^...cetros, palas, bolas de hierro, abejas... - hintTextTable[RHT_JUNK69] = HintText(CustomMessage("They say that you're wasting time reading this hint, but I disagree. Talk to me again!", + hintTextTable[RHT_JUNK58] = HintText(CustomMessage("They say that you're wasting time reading this hint, but I disagree. Talk to me again!", /*german*/ "", /*french*/ "Selon moi... tu sais quoi? Parle-moi encore, et je te le dirai!")); - // /*spanish*/Según dicen, pierdes el tiempo en leer esta pista, pero no pienso igual. ¡Vuelve a hablarme, ya verás! - hintTextTable[RHT_JUNK70] = HintText(CustomMessage("They say Ganondorf knows where to find the instrument of his doom.", + hintTextTable[RHT_JUNK59] = HintText(CustomMessage("They say Ganondorf knows where to find the instrument of his doom.", /*german*/ "", /*french*/ "Selon moi, Ganondorf sait où il a caché son point faible.")); - // /*spanish*/Según dicen, Ganondorf sabe dónde hallar el instrumento de su perdición. - hintTextTable[RHT_JUNK71] = HintText(CustomMessage("I heard @ is pretty good at Zelda.", + hintTextTable[RHT_JUNK60] = HintText(CustomMessage("I heard @ is pretty good at Zelda.", /*german*/ "", /*french*/ "Apparemment, @ est super bon à Zelda.")); - // /*spanish*/He oído que a @ se le dan muy bien los Zelda. - hintTextTable[RHT_JUNK72] = HintText(CustomMessage("Hi @, we've been trying to reach you about your car's extended warranty. ", + hintTextTable[RHT_JUNK61] = HintText(CustomMessage("Hi @, we've been trying to reach you about your car's extended warranty. ", /*german*/ "", /*french*/ "Bonjour, @. Vous avez une voiture? Vous savez, nous offrons des assurances abordables...")); - // /*spanish*/Buenas, @. Le llamamos para ofrecerle un nuevo seguro de hogar que puede pagar en cómodos plazos, sin - // intereses ni comisiones. - hintTextTable[RHT_JUNK73] = HintText(CustomMessage("They say that the best weapon against Iron Knuckles is item 176.", - /*german*/ "", - /*french*/ "Selon moi, les hache-viandes sont vulnérables contre l'objet 176.")); - // /*spanish*/Según dicen, la mejor arma para enfrentarse a los Nudillos de hierro es el objeto 176. - - hintTextTable[RHT_JUNK74] = HintText(CustomMessage("They say that it's actually possible to beat the running man.", + hintTextTable[RHT_JUNK62] = HintText(CustomMessage("They say that it's actually possible to beat the running man.", /*german*/ "", /*french*/ "Selon moi, il est possible de battre le coureur.&Donc, tu prends ton arc, et...")); - // /*spanish*/Según dicen, con mucha perseverancia puedes ganarle al corredor con la capucha de conejo. - hintTextTable[RHT_JUNK75] = HintText(CustomMessage("They say that the stone-cold guardian of the Well is only present during work hours.", - /*german*/ "", - /*french*/ "Selon moi, le gardien de pierre du Puits quitte le soir pour aller se coucher.")); - // /*spanish*/Según dicen, la inmensa roca que bloquea el pozo solo trabaja en horas laborales. - - hintTextTable[RHT_JUNK76] = HintText(CustomMessage("They say this hint makes more sense in other languages.", + hintTextTable[RHT_JUNK63] = HintText(CustomMessage("They say this hint makes more sense in other languages.", /*german*/ "", /*french*/ "Selon moi, ces indices auraient pu être mieux traduits... Duh!")); - // /*spanish*/Según dicen, esta pista revela algo de vital importancia si cambias el idioma del juego... - hintTextTable[RHT_JUNK77] = HintText(CustomMessage("BOK? No way.", - /*german*/ "", - /*french*/ "BD'accord? Hors de question.")); - // /*spanish*/¿BVale? Ni hablar. + // ^ Junk hints above are from 3drando + // v Junk hints below are new to soh rando - // ^ junk hints above are from 3drando - // v junk hints below are new to soh rando + // Please keep hints to stuff related to ship directly, or to Nintendo/Zelda related stuff. + // And nothing that's super obscure that no one's going to understand. #define HINT_TEXT_NEEDS_TRANSLATION_FR \ "Erreur 0x69a504:&Traduction manquante^C'est de la faute à Purple Hato!&J'vous jure!" - - hintTextTable[RHT_JUNK78] = HintText(CustomMessage("They say blarg...^...or at least briaguya does.", + + hintTextTable[RHT_JUNK64] = HintText(CustomMessage("They say Greg is special.", /*german*/ "", - /*french*/ "Tout ce que j'ai à dire, c'est blarg...^... 'fin c'est plutôt ce que briaguya dirait.")); - // /*spanish*/blarg + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - hintTextTable[RHT_JUNK79] = HintText(CustomMessage("They say this peace is what all true warriors strive for.", + hintTextTable[RHT_JUNK65] = HintText(CustomMessage("They say the longer the Goron's neck, the wiser they are.", /*german*/ "", - /*french*/ "Selon moi, cette paix est ce pour quoi luttent tous les vrais guerriers.")); - // /*spanish*/blarg + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - hintTextTable[RHT_JUNK80] = HintText(CustomMessage("They say this ship is what all true gamers strive for.", + hintTextTable[RHT_JUNK66] = HintText(CustomMessage("They say this ship is what all true gamers strive for.", /*german*/ "", /*french*/ "Selon moi, cette version du port est ce pour quoi luttent tous les vrais gamers.")); - // /*spanish*/blarg - - hintTextTable[RHT_JUNK81] = HintText(CustomMessage("They say that Glowsticks can be found in the Raveyard.", + + hintTextTable[RHT_JUNK67] = HintText(CustomMessage("They say that Glowsticks can be found in the Raveyard.", /*german*/ "", /*french*/ "On peut trouver des Bâtons Lumineux sur le dancefloor du cimetière.")); - // /*spanish*/blarg - hintTextTable[RHT_JUNK_WTC_1] = HintText(CustomMessage("They say %rthere are no more than 18&people on this island.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + hintTextTable[RHT_JUNK68] = HintText(CustomMessage("They say @'s uncle works for Nintendo.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - hintTextTable[RHT_JUNK_WTC_2] = HintText(CustomMessage("They say I am one yet many", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + hintTextTable[RHT_JUNK69] = HintText(CustomMessage("They say pulling all gravestones in the graveyard leads to something magical.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - hintTextTable[RHT_JUNK_WTC_3] = HintText(CustomMessage("They say its all in the name of guiding&humanity down the right path.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + hintTextTable[RHT_JUNK70] = HintText(CustomMessage("They say holding L while pausing makes you win the game.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - hintTextTable[RHT_JUNK_WTC_4] = HintText(CustomMessage("They say \"Repetition requested\"", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_WTC_5] = HintText(CustomMessage("They say %rThe red tells only the truth!", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_WTC_6] = HintText(CustomMessage("They say good tidings to you^my traitorous @", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_WTC_7] = HintText(CustomMessage("They say when the seagulls cried,&none were left alive.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_WTC_8] = HintText(CustomMessage("They say she is lying with the red letters!", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_WTC_9] = HintText(CustomMessage("They say we'll meet again,&when something else cries.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_WTC_10] = HintText(CustomMessage("They say \"Forgive me, but-^Your script will not be used.&....After all...^The one writing the rest of " - "the script...&will be me.\"", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_WTC_11] = HintText(CustomMessage("They say tea is best enjoyed...^\"\"With your fellow monsters.\"\"", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - - hintTextTable[RHT_JUNK_WTC_12] = HintText(CustomMessage("They say I shall make you some black tea. With my own hands, not magic.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_1] = HintText(CustomMessage("They say you know I've kiboshed before...^and I will kibosh again.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_2] = HintText(CustomMessage("They say if relationship @ walks through that door,^they will KILL independent @.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_3] = HintText(CustomMessage("They say you gotta have the BIG Salad.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_4] = HintText(CustomMessage("They say it's a festivus miracle", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_5] = HintText(CustomMessage("They say there are no houses in Tuscany to rent.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_6] = HintText(CustomMessage("They say my last boyfriend had a real&Kroner comprehension problem.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_7] = HintText(CustomMessage("They say it's a festivus miracle.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_8] = HintText(CustomMessage("They say Louis quit the importing&to focus on the exporting.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_9] = HintText(CustomMessage("They say no thanks, I can't drink coffee&late at night, it keeps me up.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_10] = HintText(CustomMessage("They say it's not a lie if you believe it.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_11] = HintText(CustomMessage("They say there was a second spitter.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_12] = HintText(CustomMessage("They say there was a second spitter.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_13] = HintText(CustomMessage("They say the jerk store called,^they're running out of YOU.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_14] = HintText(CustomMessage("They say when you look annoyed all the time,&people thing you are busy.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_15] = HintText(CustomMessage("They say when you look annoyed all the time,&people think you are busy.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_16] = HintText(CustomMessage("They say he fires people like its a bodily function.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_17] = HintText(CustomMessage("They say he threatened to move the ship to New Jersey&just to upset people.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_18] = HintText(CustomMessage("They say there was significant shrinkage.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_19] = HintText(CustomMessage("They say if it wasn't for the toilet there'd be no books.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_20] = HintText(CustomMessage("They say if it wasn't for the toilet there'd be no books.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_21] = HintText(CustomMessage("They say don't trust men in capes.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_22] = HintText(CustomMessage("They say @'s uncle works for Nintendo.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_23] = HintText(CustomMessage("They say @'s stole the marble rye.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_24] = HintText(CustomMessage("They say there is no better harmony&than the black and white cookie.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_25] = HintText(CustomMessage("They say @ hasn't vomited since 1983.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_26] = HintText(CustomMessage("They say you gotta have the early bird special.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_27] = HintText(CustomMessage("They say a donation has been made in your name&to the human fund.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_28] = HintText(CustomMessage("They say you want to be my latex salesman.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_29] = HintText(CustomMessage("They say if every instinct you have is wrong...^... then the opposite would have to be right.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_1] = HintText(CustomMessage("They say OTR stands for&Over the Rainbow", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_2] = HintText(CustomMessage("They say that OTR stands for&Onions, Tomatoes, and Radishes", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_3] = HintText(CustomMessage("They say that OTR stands for&Ocarina of Time Resources", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_4] = HintText(CustomMessage("They say that OTR stands for&Over the Road", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_5] = HintText(CustomMessage("They say that OTR stands for&Off the Record", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_6] = HintText(CustomMessage("They say that OTR stands for&Office of Tax and Revenue", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_7] = HintText(CustomMessage("They say OTR stands for&Over the Rainbow", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_8] = HintText(CustomMessage("They say that OTR stands for&Office of Trade Relations", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_9] = HintText(CustomMessage("They say that OTR stands for&Original Theatrical Release", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_10] = HintText(CustomMessage("They say that OTR stands for&Operational Test Requirement", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_11] = HintText(CustomMessage("They say that OTR stands for&Operational Trouble Report", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_12] = HintText(CustomMessage("They say that OTR stands for&Oxygen Transmission Rate", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_13] = HintText(CustomMessage("They say that OTR stands for&One Touch Recording", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_14] = HintText(CustomMessage("They say that OTR stands for&Olympic Torch Relay", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_15] = HintText(CustomMessage("They say that OTR stands for&Off the Rack", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_16] = HintText(CustomMessage("They say that OTR stands for&Overhead Transfer Rate", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_17] = HintText(CustomMessage("They say that OTR stands for&Operational TurnaRound", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_18] = HintText(CustomMessage("They say that OTR stands for&Opportunity to Recall", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_19] = HintText(CustomMessage("They say that OTR stands for&Operability Test Report", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_20] = HintText(CustomMessage("They say that OTR stands for&Overall Tuning Range", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_21] = HintText(CustomMessage("They say that OTR stands for&One Time Requisition", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_22] = HintText(CustomMessage("They say that OTR stands for&Oblivious to Reality", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_23] = HintText(CustomMessage("They say that OTR stands for&On the Run", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_24] = HintText(CustomMessage("They say that OTR stands for&On Time Reporting", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_25] = HintText(CustomMessage("They say that OTR stands for&Order to Receipt", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_26] = HintText(CustomMessage("They say that OTR stands for&Other Terrestrial Radio", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_27] = HintText(CustomMessage("They say that OTR stands for&On Target Reports", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_28] = HintText(CustomMessage("They say that OTR stands for&One Time Repair", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_29] = HintText(CustomMessage("They say that OTR stands for&Own the Room", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_30] = HintText(CustomMessage("They say that OTR stands for&Online Text Repository", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_MISC_1] = HintText(CustomMessage("They say #Kenix# isn't a developer...^...Just a PR guy", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR, - {QM_GREEN})); - - hintTextTable[RHT_JUNK_MISC_2] = HintText(CustomMessage("They say... No", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_MISC_3] = HintText(CustomMessage("They say BIG RIGS: OTR", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_MISC_4] = HintText(CustomMessage("They say you wanted to see me #Mr. Kenix#?", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR, - {QM_PINK})); - - hintTextTable[RHT_JUNK_MISC_5] = HintText(CustomMessage("They say Louis once saw an&equals not get set equals", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_MISC_6] = HintText(CustomMessage("They say only you can find your rom.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_MISC_7] = HintText(CustomMessage("They say ZAPD is good software.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_MISC_8] = HintText(CustomMessage("They say you can encounter&a parascode in tall grass.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_MISC_9] = HintText(CustomMessage("They say the ship sails on March 32nd.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_MISC_10] = HintText(CustomMessage("They say bombing dodongos is fun.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_MISC_11] = HintText(CustomMessage("They say shopkeepers don't give credits.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_MISC_12] = HintText(CustomMessage("They say shopkeepers don't give credits.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_MISC_13] = HintText(CustomMessage("They say Malon is glitched.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_MISC_14] = HintText(CustomMessage("They say do I look like I know&what a DList is?", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_MISC_15] = HintText(CustomMessage("They say do I look like I know&what an AList is?", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_MISC_16] = HintText(CustomMessage("They say the king drinks enthusiastically", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_MISC_17] = HintText(CustomMessage("They say Rubies are on the path to&Lamp Oil, Rope, and Bombs", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SG_1] = HintText(CustomMessage("They say %rError. Human is dead, mismatch.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SG_2] = HintText(CustomMessage("They say this is the choice of the&steins gate.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SG_3] = HintText(CustomMessage("They say el psy kongroo.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SG_4] = HintText(CustomMessage("They say tutturu~.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SG_5] = HintText(CustomMessage("They say im not Christina!.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SG_6] = HintText(CustomMessage("They say you know where to find an IBN5100.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SG_7] = HintText(CustomMessage("They say when you're on a chicken bender&grab a box of chicken tenders.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SG_8] = HintText(CustomMessage("Juicy Chicken #1! Wow!.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_1] = HintText(CustomMessage("They say that %gGanondorf's Mom%w is going out with %ySqueak%w!", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_2] = HintText(CustomMessage("They say that %gProxySaw%w is still fixing %yCaladius's Bugs%w...", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_3] = HintText(CustomMessage("They say that %gItsHeckinPat%w is still just %yEyeballing it%w.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_4] = HintText(CustomMessage("They say that %gCaladius%w is working on %yV2%w of something.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_5] = HintText(CustomMessage("They say that %gdice%w is a funny name for a %ytaco%w.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_6] = HintText(CustomMessage("They say %g2Ship Rando%w is still blocked by %yV3%w...", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_7] = HintText(CustomMessage("They say if you click your heels and say %gframebuffer%w 3 times, %yArchez%w appears!", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_8] = HintText(CustomMessage("They say %gVB%w stands for %yVirtual Bananas%w... Probably.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_9] = HintText(CustomMessage("They say %gZeru%w is still routing his %yHundo%w.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_10] = HintText(CustomMessage("They say %gRaccoonCloud%w is still looking for his %yHover Boots%w.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_11] = HintText(CustomMessage("They say %gItsHeckinPat%w foreclosed on his %yHut%w.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_12] = HintText(CustomMessage("They say %gRaccoonCloud%w is part of the %yInner Circle%w.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_13] = HintText(CustomMessage("They say %gMoonlitxShadows%w is the %rleader%w of the %yDork Army%w.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_14] = HintText(CustomMessage("They say %gGanondorf%w hates the %yInternet%w.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_15] = HintText(CustomMessage("They say %gMido's House%w hoards %yTrash%w.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_16] = HintText(CustomMessage("They say %gSweettalking Ganondorf%w rewards %yHis Heart%w.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_17] = HintText(CustomMessage("They say %gaMannus%w said %yGo To Bed%w!", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_18] = HintText(CustomMessage("They say %gCaladius%w is a %yPinhead%w!", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_19] = HintText(CustomMessage("They say %gRaccoonCloud%w loves the %yIce Cavern%w.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_20] = HintText(CustomMessage("They say %gNo One%w should forget %yHover Scrub%w!", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_21] = HintText(CustomMessage("They say %gMoonlitxShadows%w likes to %ySlide%w.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_23] = HintText(CustomMessage("They say that %gBackwalking%w should be %rBanned%w!", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_24] = HintText(CustomMessage("They say that %gGorons%w should always have %yLong Necks%w!", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_25] = HintText(CustomMessage("They say that %gCaladius%w has a %ytendency to lose his shirt%w!", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_26] = HintText(CustomMessage("They say that if your %rSkip keeps Failing%w, you're probably an %yESS Off%w.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_27] = HintText(CustomMessage("They say that %gLogic%w is just a %ySuggestion%w.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_28] = HintText(CustomMessage("They say there's %gAlways Logic%w in %yNo Logic%w...", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_29] = HintText(CustomMessage("They said that %rFredomato%w has just %yone more push up%w to do!", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + hintTextTable[RHT_JUNK71] = HintText(CustomMessage("They say @'s body is ready.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); /*-------------------------- | DUNGEON HINT TEXT | diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp index 7837f2cb6..056e1d4e5 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp @@ -1935,6 +1935,20 @@ void StaticData::HintTable_Init_Exclude_Overworld() { hintTextTable[RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone within the side of a crater# reveals #[[1]]#.", /*german*/ "!!!", /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange dans le côté d'un cratère révèle [[1]].", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_LH_ISLAND_SUN_FAIRY] = HintText(CustomMessage("They say that #summoning the sun on the lake's island# calls #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_HF_POND_STORMS_FAIRY] = HintText(CustomMessage("They say that #calling rain to the field's pond# summons #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_HF_FENCE_GROTTO_STORMS_FAIRY] = HintText(CustomMessage("They say that #making it rain in a scrub's cave# wakes #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_DMT_FLAG_SUN_FAIRY] = HintText(CustomMessage("They say that #changing the time in front of the trail's flag# reveals #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_DMT_COW_GROTTO_STORMS_FAIRY] = HintText(CustomMessage("They say that #calling a storm for a lonely cow# reveals #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_LW_SHORTCUT_STORMS_FAIRY] = HintText(CustomMessage("They say that #making it rain in the Lost Woods# reveals #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_GF_KITCHEN_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun in a guarded kitchen# exposes #[[1]]#.", {QM_RED, QM_GREEN})); } } diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp index 89c290a40..867da2b2c 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp @@ -1361,7 +1361,18 @@ void StaticData::HintTable_Init_Item() { // /*spanish*/un destructor de cerraduras final CustomMessage("a final lockpick", /*german*/"ein finaler Dietrich", /*french*/"un crochet à porte final")}); // /*spanish*/una apertura portentosa final - + hintTextTable[RHT_OVERWORLD_KEY] = HintText(CustomMessage("an Overworld Key", /*german*/"ein Überwelt-Schlüssel", /*french*/"une clé de l'Overworld"), + // /*spanish*/una llave del mundo exterior + { + CustomMessage("a small key", /*german*/"ein kleiner Schlüssel", /*french*/"une petite clé") + // /*spanish*/una llave + }, { + CustomMessage("a key to the world", /*german*/"ein Schlüssel zur Welt", /*french*/"une clé du monde"), + // /*spanish*/una llave al mundo + CustomMessage("a key to the kingdom", /*german*/"ein Schlüssel zum Königreich", /*french*/"une clé du royaume"), + // /*spanish*/una llave al reino + CustomMessage("a key to the universe", /*german*/"ein Schlüssel zum Universum", /*french*/"une clé de l'univers")}); + // /*spanish*/una llave al universo hintTextTable[RHT_FOREST_TEMPLE_KEY_RING] = HintText(CustomMessage("a Forest Temple Key Ring", /*german*/"ein Schlüsselbund des Waldtempels", /*french*/"un trousseau de clés du Temple de la Forêt"), // /*spanish*/un llavero del Templo del Bosque { diff --git a/soh/soh/Enhancements/randomizer/3drando/hints.cpp b/soh/soh/Enhancements/randomizer/3drando/hints.cpp index 941f0924b..f9b5d9191 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hints.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hints.cpp @@ -112,10 +112,10 @@ StaticHintInfo::StaticHintInfo(HintType _type, std::vectorGetOption(RSK_LOCK_OVERWORLD_DOORS)) { + AddItemToPool(ItemPool, RG_GUARD_HOUSE_KEY); + AddItemToPool(ItemPool, RG_MARKET_BAZAAR_KEY); + AddItemToPool(ItemPool, RG_MARKET_POTION_SHOP_KEY); + AddItemToPool(ItemPool, RG_MASK_SHOP_KEY); + AddItemToPool(ItemPool, RG_MARKET_SHOOTING_GALLERY_KEY); + AddItemToPool(ItemPool, RG_BOMBCHU_BOWLING_KEY); + AddItemToPool(ItemPool, RG_TREASURE_CHEST_GAME_BUILDING_KEY); + AddItemToPool(ItemPool, RG_BOMBCHU_SHOP_KEY); + AddItemToPool(ItemPool, RG_RICHARDS_HOUSE_KEY); + AddItemToPool(ItemPool, RG_ALLEY_HOUSE_KEY); + AddItemToPool(ItemPool, RG_KAK_BAZAAR_KEY); + AddItemToPool(ItemPool, RG_KAK_POTION_SHOP_KEY); + AddItemToPool(ItemPool, RG_BOSS_HOUSE_KEY); + AddItemToPool(ItemPool, RG_GRANNYS_POTION_SHOP_KEY); + AddItemToPool(ItemPool, RG_SKULLTULA_HOUSE_KEY); + AddItemToPool(ItemPool, RG_IMPAS_HOUSE_KEY); + AddItemToPool(ItemPool, RG_WINDMILL_KEY); + AddItemToPool(ItemPool, RG_KAK_SHOOTING_GALLERY_KEY); + AddItemToPool(ItemPool, RG_DAMPES_HUT_KEY); + AddItemToPool(ItemPool, RG_TALONS_HOUSE_KEY); + AddItemToPool(ItemPool, RG_STABLES_KEY); + AddItemToPool(ItemPool, RG_BACK_TOWER_KEY); + AddItemToPool(ItemPool, RG_HYLIA_LAB_KEY); + AddItemToPool(ItemPool, RG_FISHING_HOLE_KEY); + } + //Shopsanity if ( ctx->GetOption(RSK_SHOPSANITY).Is(RO_SHOPSANITY_OFF) || diff --git a/soh/soh/Enhancements/randomizer/LockOverworldDoors.cpp b/soh/soh/Enhancements/randomizer/LockOverworldDoors.cpp new file mode 100644 index 000000000..e48a5763f --- /dev/null +++ b/soh/soh/Enhancements/randomizer/LockOverworldDoors.cpp @@ -0,0 +1,154 @@ +#include +#include "soh/OTRGlobals.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +extern "C" { +extern PlayState* gPlayState; +#include "macros.h" +#include "src/overlays/actors/ovl_En_Door/z_en_door.h" +} + +#define RAND_GET_OPTION(option) Rando::Context::GetInstance()->GetOption(option).GetContextOptionIndex() + +using SceneDoorParamsPair = std::pair; +std::map lookupTable = { + {{ SCENE_MARKET_ENTRANCE_DAY, 447 }, RAND_INF_GUARD_HOUSE_UNLOCKED }, + {{ SCENE_MARKET_ENTRANCE_NIGHT, 447 }, RAND_INF_GUARD_HOUSE_UNLOCKED }, + {{ SCENE_MARKET_ENTRANCE_RUINS, 447 }, RAND_INF_GUARD_HOUSE_UNLOCKED }, + {{ SCENE_MARKET_GUARD_HOUSE, 447 }, RAND_INF_GUARD_HOUSE_UNLOCKED }, + {{ SCENE_MARKET_DAY, 4543 }, RAND_INF_MARKET_BAZAAR_UNLOCKED }, + {{ SCENE_MARKET_NIGHT, 4753 }, RAND_INF_MARKET_BAZAAR_UNLOCKED }, + {{ SCENE_MARKET_DAY, 1471 }, RAND_INF_MARKET_POTION_SHOP_UNLOCKED }, + {{ SCENE_MARKET_NIGHT, 1678 }, RAND_INF_MARKET_POTION_SHOP_UNLOCKED }, + {{ SCENE_MARKET_DAY, 3519 }, RAND_INF_MASK_SHOP_UNLOCKED }, + {{ SCENE_MARKET_NIGHT, 3728 }, RAND_INF_MASK_SHOP_UNLOCKED }, + {{ SCENE_MARKET_DAY, 2495 }, RAND_INF_MARKET_SHOOTING_GALLERY_UNLOCKED }, + {{ SCENE_MARKET_NIGHT, 2703 }, RAND_INF_MARKET_SHOOTING_GALLERY_UNLOCKED }, + {{ SCENE_SHOOTING_GALLERY, 447 }, RAND_INF_MARKET_SHOOTING_GALLERY_UNLOCKED }, + {{ SCENE_MARKET_DAY, 5567 }, RAND_INF_BOMBCHU_BOWLING_UNLOCKED }, + {{ SCENE_MARKET_NIGHT, 5567 }, RAND_INF_BOMBCHU_BOWLING_UNLOCKED }, + {{ SCENE_BOMBCHU_BOWLING_ALLEY, 447 }, RAND_INF_BOMBCHU_BOWLING_UNLOCKED }, + {{ SCENE_MARKET_DAY, 653 }, RAND_INF_TREASURE_CHEST_GAME_BUILDING_UNLOCKED }, + {{ SCENE_MARKET_NIGHT, 447 }, RAND_INF_TREASURE_CHEST_GAME_BUILDING_UNLOCKED }, + {{ SCENE_TREASURE_BOX_SHOP, 6591 }, RAND_INF_TREASURE_CHEST_GAME_BUILDING_UNLOCKED }, + {{ SCENE_BACK_ALLEY_DAY, 2689 }, RAND_INF_BOMBCHU_SHOP_UNLOCKED }, + {{ SCENE_BACK_ALLEY_NIGHT, 2495 }, RAND_INF_BOMBCHU_SHOP_UNLOCKED }, + {{ SCENE_BACK_ALLEY_DAY, 447 }, RAND_INF_RICHARDS_HOUSE_UNLOCKED }, + {{ SCENE_BACK_ALLEY_NIGHT, 447 }, RAND_INF_RICHARDS_HOUSE_UNLOCKED }, + {{ SCENE_DOG_LADY_HOUSE, 447 }, RAND_INF_RICHARDS_HOUSE_UNLOCKED }, + {{ SCENE_DOG_LADY_HOUSE, 447 }, RAND_INF_RICHARDS_HOUSE_UNLOCKED }, + {{ SCENE_BACK_ALLEY_HOUSE, 447 }, RAND_INF_ALLEY_HOUSE_UNLOCKED }, + {{ SCENE_BACK_ALLEY_DAY, 1665 }, RAND_INF_ALLEY_HOUSE_UNLOCKED }, + {{ SCENE_BACK_ALLEY_NIGHT, 1471 }, RAND_INF_ALLEY_HOUSE_UNLOCKED }, + {{ SCENE_KAKARIKO_VILLAGE, 6801 }, RAND_INF_KAK_BAZAAR_UNLOCKED }, // Adult Night + {{ SCENE_KAKARIKO_VILLAGE, 6591 }, RAND_INF_KAK_BAZAAR_UNLOCKED }, // Adult Day + {{ SCENE_KAKARIKO_VILLAGE, 6813 }, RAND_INF_KAK_BAZAAR_UNLOCKED }, // Child Day + {{ SCENE_KAKARIKO_VILLAGE, 6814 }, RAND_INF_KAK_BAZAAR_UNLOCKED }, // Child Night + {{ SCENE_KAKARIKO_VILLAGE, 8871 }, RAND_INF_KAK_POTION_SHOP_UNLOCKED }, // Child Day/Night Rear + {{ SCENE_KAKARIKO_VILLAGE, 8846 }, RAND_INF_KAK_POTION_SHOP_UNLOCKED }, // Adult Night Rear + {{ SCENE_KAKARIKO_VILLAGE, 8639 }, RAND_INF_KAK_POTION_SHOP_UNLOCKED }, // Adult Day Rear + {{ SCENE_KAKARIKO_VILLAGE, 7822 }, RAND_INF_KAK_POTION_SHOP_UNLOCKED }, // Adult Night + {{ SCENE_KAKARIKO_VILLAGE, 7615 }, RAND_INF_KAK_POTION_SHOP_UNLOCKED }, // Child Day/Night and Adult Day + {{ SCENE_KAKARIKO_VILLAGE, 2495 }, RAND_INF_BOSS_HOUSE_UNLOCKED }, + {{ SCENE_KAKARIKO_CENTER_GUEST_HOUSE, 447 }, RAND_INF_BOSS_HOUSE_UNLOCKED }, + {{ SCENE_KAKARIKO_VILLAGE, 3750 }, RAND_INF_GRANNYS_POTION_SHOP_UNLOCKED }, // Child + {{ SCENE_KAKARIKO_VILLAGE, 3519 }, RAND_INF_GRANNYS_POTION_SHOP_UNLOCKED }, // Adult + {{ SCENE_POTION_SHOP_GRANNY, 447 }, RAND_INF_GRANNYS_POTION_SHOP_UNLOCKED }, + {{ SCENE_KAKARIKO_VILLAGE, 5567 }, RAND_INF_SKULLTULA_HOUSE_UNLOCKED }, + {{ SCENE_HOUSE_OF_SKULLTULA, 447 }, RAND_INF_SKULLTULA_HOUSE_UNLOCKED }, + {{ SCENE_KAKARIKO_VILLAGE, 1471 }, RAND_INF_IMPAS_HOUSE_UNLOCKED }, + {{ SCENE_IMPAS_HOUSE, 447 }, RAND_INF_IMPAS_HOUSE_UNLOCKED }, + {{ SCENE_KAKARIKO_VILLAGE, 447 }, RAND_INF_WINDMILL_UNLOCKED }, + {{ SCENE_WINDMILL_AND_DAMPES_GRAVE, 2495 }, RAND_INF_WINDMILL_UNLOCKED }, + {{ SCENE_KAKARIKO_VILLAGE, 4543 }, RAND_INF_KAK_SHOOTING_GALLERY_UNLOCKED }, // Day + {{ SCENE_KAKARIKO_VILLAGE, 4751 }, RAND_INF_KAK_SHOOTING_GALLERY_UNLOCKED }, // Night + {{ SCENE_SHOOTING_GALLERY, 447 }, RAND_INF_KAK_SHOOTING_GALLERY_UNLOCKED }, + {{ SCENE_GRAVEYARD, 645 }, RAND_INF_DAMPES_HUT_UNLOCKED }, // Child Day + {{ SCENE_GRAVEYARD, 447 }, RAND_INF_DAMPES_HUT_UNLOCKED }, // Child Evening & Adult + {{ SCENE_GRAVEYARD, 774 }, RAND_INF_DAMPES_HUT_UNLOCKED }, // Child Night (After Dampes Tour) + {{ SCENE_GRAVEKEEPERS_HUT, 447 }, RAND_INF_DAMPES_HUT_UNLOCKED }, + {{ SCENE_LON_LON_RANCH, 2495 }, RAND_INF_TALONS_HOUSE_UNLOCKED }, + {{ SCENE_LON_LON_RANCH, 2473 }, RAND_INF_TALONS_HOUSE_UNLOCKED }, + {{ SCENE_LON_LON_RANCH, 2729 }, RAND_INF_TALONS_HOUSE_UNLOCKED }, + {{ SCENE_LON_LON_BUILDINGS, 1471 }, RAND_INF_TALONS_HOUSE_UNLOCKED }, + {{ SCENE_LON_LON_RANCH, 1471 }, RAND_INF_STABLES_UNLOCKED }, + {{ SCENE_STABLE, 447 }, RAND_INF_STABLES_UNLOCKED }, + {{ SCENE_LON_LON_RANCH, 447 }, RAND_INF_BACK_TOWER_UNLOCKED }, + {{ SCENE_LON_LON_BUILDINGS, 447 }, RAND_INF_BACK_TOWER_UNLOCKED }, + {{ SCENE_LAKE_HYLIA, 447 }, RAND_INF_HYLIA_LAB_UNLOCKED }, + {{ SCENE_LAKESIDE_LABORATORY, 447 }, RAND_INF_HYLIA_LAB_UNLOCKED }, + {{ SCENE_LAKE_HYLIA, 1471 }, RAND_INF_FISHING_HOLE_UNLOCKED }, + {{ SCENE_FISHING_POND, 447 }, RAND_INF_FISHING_HOLE_UNLOCKED }, +}; + +static void OnDoorInit(void* actorRef) { + EnDoor* enDoor = static_cast(actorRef); + enDoor->randomizerInf = RAND_INF_MAX; + + auto it = lookupTable.find({gPlayState->sceneNum, enDoor->actor.params}); + if (it != lookupTable.end()) { + if (it->second == RAND_INF_MARKET_SHOOTING_GALLERY_UNLOCKED && gSaveContext.entranceIndex == 0x3B) { + // Adult shooting gallery uses same scene and door params as child, so we manually handle it + enDoor->randomizerInf = RAND_INF_KAK_SHOOTING_GALLERY_UNLOCKED; + } else { + enDoor->randomizerInf = it->second; + } + if (!Flags_GetRandomizerInf(enDoor->randomizerInf)) { + // We don't want to override checkable doors, we still want those to not be openable even if they have a key + if (((enDoor->actor.params >> 7) & 7) != DOOR_CHECKABLE) { + enDoor->actor.params = (enDoor->actor.params & ~0x380) | (DOOR_LOCKED << 7); + enDoor->actionFunc = EnDoor_SetupType; + } else { + enDoor->lockTimer = 10; + } + } + } +} + +void RegisterLockOverworldDoors() { + bool shouldRegister = IS_RANDO && RAND_GET_OPTION(RSK_LOCK_OVERWORLD_DOORS); + + COND_ID_HOOK(OnActorInit, ACTOR_EN_DOOR, shouldRegister, OnDoorInit); + + COND_VB_SHOULD(VB_CONSUME_SMALL_KEY, shouldRegister, { + EnDoor* enDoor = va_arg(args, EnDoor*); + + if (enDoor->randomizerInf >= RAND_INF_GUARD_HOUSE_UNLOCKED && enDoor->randomizerInf <= RAND_INF_FISHING_HOLE_KEY_OBTAINED) { + Flags_SetRandomizerInf(enDoor->randomizerInf); + *should = false; + } + }); + + COND_VB_SHOULD(VB_NOT_HAVE_SMALL_KEY, shouldRegister, { + EnDoor* enDoor = va_arg(args, EnDoor*); + + if (enDoor->randomizerInf >= RAND_INF_GUARD_HOUSE_UNLOCKED && enDoor->randomizerInf <= RAND_INF_FISHING_HOLE_KEY_OBTAINED) { + *should = !Flags_GetRandomizerInf((RandomizerInf)(enDoor->randomizerInf + 1)); + } + }); + + COND_VB_SHOULD(VB_DOOR_BE_LOCKED, shouldRegister, { + EnDoor* enDoor = va_arg(args, EnDoor*); + + if (enDoor->randomizerInf >= RAND_INF_GUARD_HOUSE_UNLOCKED && enDoor->randomizerInf <= RAND_INF_FISHING_HOLE_KEY_OBTAINED) { + *should = !Flags_GetRandomizerInf(enDoor->randomizerInf); + } + }); + + // The door actor uses the same param to indicate if a door should be locked or be a scene transition, so it cannot be both. Here we're + // overriding the check for scene transition to also check if the door is being unlocked and should be a scene transition. + COND_VB_SHOULD(VB_DOOR_PLAY_SCENE_TRANSITION, shouldRegister, { + EnDoor* enDoor = va_arg(args, EnDoor*); + + if (!*should && ( + enDoor->actor.id == ACTOR_EN_DOOR && + ((enDoor->actor.params >> 7) & 7) == 1 && + enDoor->randomizerInf != RAND_INF_MAX + )) { + *should = true; + } + }); +} + +static RegisterShipInitFunc initFunc(RegisterLockOverworldDoors, { "IS_RANDO" }); diff --git a/soh/soh/Enhancements/randomizer/Plandomizer.cpp b/soh/soh/Enhancements/randomizer/Plandomizer.cpp index 3fc97eec7..2a086d377 100644 --- a/soh/soh/Enhancements/randomizer/Plandomizer.cpp +++ b/soh/soh/Enhancements/randomizer/Plandomizer.cpp @@ -77,7 +77,7 @@ std::unordered_map ocarinaButtonNames = { { RG_OCARINA_C_RIGHT_BUTTON, "C-RHT" }, }; -std::map bossSoulMapping = { +std::map bossSoulColorMapping = { { RG_GOHMA_SOUL, { 0.00f, 1.00f, 0.00f, 1.0f } }, { RG_KING_DODONGO_SOUL, { 1.00f, 0.00f, 0.39f, 1.0f } }, { RG_BARINADE_SOUL, { 0.20f, 1.00f, 1.00f, 1.0f } }, @@ -339,7 +339,7 @@ ImVec4 plandomizerGetItemColor(Rando::Item randoItem) { } if (randoItem.GetRandomizerGet() >= RG_GOHMA_SOUL && randoItem.GetRandomizerGet() <= RG_GANON_SOUL) { - itemColor = bossSoulMapping.at(randoItem.GetRandomizerGet()); + itemColor = bossSoulColorMapping.at(randoItem.GetRandomizerGet()); } return itemColor; diff --git a/soh/soh/Enhancements/randomizer/draw.cpp b/soh/soh/Enhancements/randomizer/draw.cpp index 0a1e0d46a..0a89e4dae 100644 --- a/soh/soh/Enhancements/randomizer/draw.cpp +++ b/soh/soh/Enhancements/randomizer/draw.cpp @@ -946,7 +946,13 @@ extern "C" void DrawGanon(PlayState* play) { } extern "C" void Randomizer_DrawBossSoul(PlayState* play, GetItemEntry* getItemEntry) { - s16 slot = getItemEntry->getItemId - RG_GOHMA_SOUL; + s16 slot; + if (getItemEntry->getItemId != RG_ICE_TRAP) { + slot = getItemEntry->getItemId - RG_GOHMA_SOUL; + } else { + slot = getItemEntry->drawItemId - RG_GOHMA_SOUL; + } + s16 flameColors[9][3] = { { 0, 255, 0 }, // Gohma { 255, 0, 100 }, // King Dodongo @@ -1223,3 +1229,18 @@ extern "C" void Randomizer_DrawBombchuBagInLogic(PlayState* play, GetItemEntry* CLOSE_DISPS(play->state.gfxCtx); } } + +extern "C" void Randomizer_DrawOverworldKey(PlayState* play, GetItemEntry* getItemEntry) { + OPEN_DISPS(play->state.gfxCtx); + + Gfx_SetupDL_25Opa(play->state.gfxCtx); + + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255); + gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, 255); + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_MODELVIEW | G_MTX_LOAD); + + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gHouseKeyDL); + + CLOSE_DISPS(play->state.gfxCtx); +} diff --git a/soh/soh/Enhancements/randomizer/draw.h b/soh/soh/Enhancements/randomizer/draw.h index 31ac2c1fb..3fc5c86b4 100644 --- a/soh/soh/Enhancements/randomizer/draw.h +++ b/soh/soh/Enhancements/randomizer/draw.h @@ -25,6 +25,7 @@ void Randomizer_DrawSkeletonKey(PlayState* play, GetItemEntry* getItemEntry); void Randomizer_DrawMysteryItem(PlayState* play, GetItemEntry getItemEntry); void Randomizer_DrawBombchuBagInLogic(PlayState* play, GetItemEntry* getItemEntry); void Randomizer_DrawBombchuBag(PlayState* play, GetItemEntry* getItemEntry); +void Randomizer_DrawOverworldKey(PlayState* play, GetItemEntry* getItemEntry); #define GET_ITEM_MYSTERY \ { ITEM_NONE_FE, 0, 0, 0, 0, MOD_RANDOMIZER, MOD_RANDOMIZER, ITEM_NONE_FE, 0, false, ITEM_FROM_NPC, ITEM_CATEGORY_JUNK, ITEM_NONE_FE, MOD_RANDOMIZER, (CustomDrawFunc)Randomizer_DrawMysteryItem } diff --git a/soh/soh/Enhancements/randomizer/entrance.cpp b/soh/soh/Enhancements/randomizer/entrance.cpp index 910467e81..876b22a7f 100644 --- a/soh/soh/Enhancements/randomizer/entrance.cpp +++ b/soh/soh/Enhancements/randomizer/entrance.cpp @@ -20,15 +20,11 @@ void Entrance::SetCondition(ConditionFn newCondition) { } bool Entrance::GetConditionsMet() const { - auto ctx = Rando::Context::GetInstance(); - if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_NO_LOGIC) || ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_VANILLA)) { - return true; - } else if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS)) { - return condition_function(); - } else if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHED)) { - return condition_function(); - } - return false; + auto ctx = Rando::Context::GetInstance(); + if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS)) { + return condition_function(); + } + return true; } std::string Entrance::to_string() const { diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index d1ba2f9ea..689d1c396 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -2370,6 +2370,8 @@ void RandomizerRegisterHooks() { static uint32_t shuffleFreestandingOnVanillaBehaviorHook = 0; GameInteractor::Instance->RegisterGameHook([](int32_t fileNum) { + ShipInit::Init("IS_RANDO"); + randomizerQueuedChecks = std::queue(); randomizerQueuedCheck = RC_UNKNOWN_CHECK; randomizerQueuedItemEntry = GET_ITEM_NONE; diff --git a/soh/soh/Enhancements/randomizer/item_list.cpp b/soh/soh/Enhancements/randomizer/item_list.cpp index 6aee0a775..0b94aab39 100644 --- a/soh/soh/Enhancements/randomizer/item_list.cpp +++ b/soh/soh/Enhancements/randomizer/item_list.cpp @@ -159,6 +159,54 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_GANONS_CASTLE_SMALL_KEY] = Item(RG_GANONS_CASTLE_SMALL_KEY, Text{ "Ganon's Castle Small Key", "Petite Clé du Château de Ganon", "Kleiner Schlüssel für Ganons Schloß" }, ITEMTYPE_SMALLKEY, 0xB7, true, LOGIC_GANONS_CASTLE_KEYS, RHT_GANONS_CASTLE_SMALL_KEY, RG_GANONS_CASTLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_GANONS_CASTLE_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey); itemTable[RG_TREASURE_GAME_SMALL_KEY] = Item(RG_TREASURE_GAME_SMALL_KEY, Text{ "Chest Game Small Key", "Petite Clé du jeu la Chasse-aux-Trésors", "Kleiner Schlüssel für das Truhenspiel" }, ITEMTYPE_SMALLKEY, GI_DOOR_KEY, true, LOGIC_TREASURE_GAME_KEYS, RHT_TREASURE_GAME_SMALL_KEY, ITEM_KEY_SMALL, OBJECT_GI_KEY, GID_KEY_SMALL, 0xF3, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_NONE); + itemTable[RG_GUARD_HOUSE_KEY] = Item(RG_GUARD_HOUSE_KEY, Text{ "Guard House Key", "", "Schlüssel für das Haus der Wachen" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_GUARD_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_GUARD_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GUARD_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_MARKET_BAZAAR_KEY] = Item(RG_MARKET_BAZAAR_KEY, Text{ "Market Bazaar Key", "", "Schlüssel für den Basar des Marktes" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_MARKET_BAZAAR_KEY, RHT_OVERWORLD_KEY, RG_MARKET_BAZAAR_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_MARKET_BAZAAR_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_MARKET_POTION_SHOP_KEY] = Item(RG_MARKET_POTION_SHOP_KEY, Text{ "Market Potion Shop Key", "", "Schlüssel für den Magie-Laden des Marktes" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_MARKET_POTION_SHOP_KEY, RHT_OVERWORLD_KEY, RG_MARKET_POTION_SHOP_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_MARKET_POTION_SHOP_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_MASK_SHOP_KEY] = Item(RG_MASK_SHOP_KEY, Text{ "Mask Shop Key", "", "Schlüssel für den Maskenladen" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_MASK_SHOP_KEY, RHT_OVERWORLD_KEY, RG_MASK_SHOP_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_MASK_SHOP_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_MARKET_SHOOTING_GALLERY_KEY] = Item(RG_MARKET_SHOOTING_GALLERY_KEY, Text{ "Market Shooting Gallery Key", "", "Schlüssel für die Schießbude des Marktes" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_MARKET_SHOOTING_GALLERY_KEY, RHT_OVERWORLD_KEY, RG_MARKET_SHOOTING_GALLERY_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_MARKET_SHOOTING_GALLERY_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_BOMBCHU_BOWLING_KEY] = Item(RG_BOMBCHU_BOWLING_KEY, Text{ "Bombchu Bowling Alley Key", "", "Schlüssel für die Minenbowlingbahn" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_BOMBCHU_BOWLING_KEY, RHT_OVERWORLD_KEY, RG_BOMBCHU_BOWLING_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_BOMBCHU_BOWLING_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_TREASURE_CHEST_GAME_BUILDING_KEY] = Item(RG_TREASURE_CHEST_GAME_BUILDING_KEY, Text{ "Treasure Chest Game Building Key", "", "Schlüssel für das Haus des Schatzkisten-Pokers" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_TREASURE_CHEST_GAME_BUILDING_KEY,RHT_OVERWORLD_KEY, RG_TREASURE_CHEST_GAME_BUILDING_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_TREASURE_CHEST_GAME_BUILDING_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_BOMBCHU_SHOP_KEY] = Item(RG_BOMBCHU_SHOP_KEY, Text{ "Bombchu Shop Key", "", "Schlüssel für den Krabbelminenladen" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_BOMBCHU_SHOP_KEY, RHT_OVERWORLD_KEY, RG_BOMBCHU_SHOP_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_BOMBCHU_SHOP_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_RICHARDS_HOUSE_KEY] = Item(RG_RICHARDS_HOUSE_KEY, Text{ "Richard's House Key", "", "Schlüssel für das Haus von Richard" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_RICHARDS_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_RICHARDS_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_RICHARDS_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_ALLEY_HOUSE_KEY] = Item(RG_ALLEY_HOUSE_KEY, Text{ "Alley House Key", "", "Schlüssel für das Gäßchenhaus" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_ALLEY_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_ALLEY_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_ALLEY_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_KAK_BAZAAR_KEY] = Item(RG_KAK_BAZAAR_KEY, Text{ "Kakariko Bazaar Key", "", "Schlüssel für den Basar von Kakariko" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_KAK_BAZAAR_KEY, RHT_OVERWORLD_KEY, RG_KAK_BAZAAR_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_KAK_BAZAAR_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_KAK_POTION_SHOP_KEY] = Item(RG_KAK_POTION_SHOP_KEY, Text{ "Kakariko Potion Shop Key", "", "Schlüssel für den Magie-Laden von Kakariko" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_KAK_POTION_SHOP_KEY, RHT_OVERWORLD_KEY, RG_KAK_POTION_SHOP_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_KAK_POTION_SHOP_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_BOSS_HOUSE_KEY] = Item(RG_BOSS_HOUSE_KEY, Text{ "Boss's House Key", "", "Schlüssel für das Haus des Chefs" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_BOSS_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_BOSS_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_BOSS_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_GRANNYS_POTION_SHOP_KEY] = Item(RG_GRANNYS_POTION_SHOP_KEY, Text{ "Granny's Potion Shop Key", "", "Schlüssel für Asas Hexenladen" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_GRANNYS_POTION_SHOP_KEY, RHT_OVERWORLD_KEY, RG_GRANNYS_POTION_SHOP_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GRANNYS_POTION_SHOP_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_SKULLTULA_HOUSE_KEY] = Item(RG_SKULLTULA_HOUSE_KEY, Text{ "Skulltula House Key", "", "Schlüssel für das Skulltula-Haus" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_SKULLTULA_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_SKULLTULA_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_SKULLTULA_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_IMPAS_HOUSE_KEY] = Item(RG_IMPAS_HOUSE_KEY, Text{ "Impa's House Key", "", "Schlüssel für das Haus von Impa" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_IMPAS_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_IMPAS_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_IMPAS_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_WINDMILL_KEY] = Item(RG_WINDMILL_KEY, Text{ "Windmill Key", "", "Schlüssel für die Windmühle" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_WINDMILL_KEY, RHT_OVERWORLD_KEY, RG_WINDMILL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_WINDMILL_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_KAK_SHOOTING_GALLERY_KEY] = Item(RG_KAK_SHOOTING_GALLERY_KEY, Text{ "Kakariko Shooting Gallery Key", "", "Schlüssel für die Schießbude von Kakariko" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_KAK_SHOOTING_GALLERY_KEY, RHT_OVERWORLD_KEY, RG_KAK_SHOOTING_GALLERY_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_KAK_SHOOTING_GALLERY_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_DAMPES_HUT_KEY] = Item(RG_DAMPES_HUT_KEY, Text{ "Dampe's Hut Key", "", "Schlüssel für die Hütte von Boris" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_DAMPES_HUT_KEY, RHT_OVERWORLD_KEY, RG_DAMPES_HUT_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_DAMPES_HUT_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_TALONS_HOUSE_KEY] = Item(RG_TALONS_HOUSE_KEY, Text{ "Talon's House Key", "", "Schlüssel für das Haus von Talon" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_TALONS_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_TALONS_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_TALONS_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_STABLES_KEY] = Item(RG_STABLES_KEY, Text{ "Stables Key", "", "Schlüssel für die Ställe" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_STABLES_KEY, RHT_OVERWORLD_KEY, RG_STABLES_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_STABLES_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_BACK_TOWER_KEY] = Item(RG_BACK_TOWER_KEY, Text{ "Back Tower Key", "", "Schlüssel für den hinteren Turm" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_BACK_TOWER_KEY, RHT_OVERWORLD_KEY, RG_BACK_TOWER_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_BACK_TOWER_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_HYLIA_LAB_KEY] = Item(RG_HYLIA_LAB_KEY, Text{ "Hylia Laboratory Key", "", "Schlüssel für das Hylia-Labor" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_HYLIA_LAB_KEY, RHT_OVERWORLD_KEY, RG_HYLIA_LAB_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_HYLIA_LAB_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_FISHING_HOLE_KEY] = Item(RG_FISHING_HOLE_KEY, Text{ "Fishing Hole Key", "", "Schlüssel für den Fischweiher" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_FISHING_HOLE_KEY, RHT_OVERWORLD_KEY, RG_FISHING_HOLE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_FISHING_HOLE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); // Key Rings itemTable[RG_FOREST_TEMPLE_KEY_RING] = Item(RG_FOREST_TEMPLE_KEY_RING, Text{ "Forest Temple Key Ring", "Trousseau du Temple de la Forêt", "Schlüsselbund für den Waldtempel" }, ITEMTYPE_SMALLKEY, 0xD5, true, LOGIC_FOREST_TEMPLE_KEYS, RHT_FOREST_TEMPLE_KEY_RING, RG_FOREST_TEMPLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_FOREST_TEMPLE_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); diff --git a/soh/soh/Enhancements/randomizer/location_access.h b/soh/soh/Enhancements/randomizer/location_access.h index 3af0a498d..986d08d6a 100644 --- a/soh/soh/Enhancements/randomizer/location_access.h +++ b/soh/soh/Enhancements/randomizer/location_access.h @@ -23,14 +23,10 @@ class EventAccess { bool ConditionsMet() const { auto ctx = Rando::Context::GetInstance(); - if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_NO_LOGIC) || ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_VANILLA)) { - return true; - } else if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS)) { - return condition_function(); - } else if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHED)) { + if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS)) { return condition_function(); } - return false; + return true; } bool CheckConditionAtAgeTime(bool& age, bool& time) { @@ -71,14 +67,10 @@ class LocationAccess { bool GetConditionsMet() const { auto ctx = Rando::Context::GetInstance(); - if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_NO_LOGIC) || ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_VANILLA)) { - return true; - } else if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS)) { - return condition_function(); - } else if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHED)) { + if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS)) { return condition_function(); } - return false; + return true; } bool CheckConditionAtAgeTime(bool& age, bool& time) const; diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_trail.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_trail.cpp index d67086371..bd0362598 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_trail.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_trail.cpp @@ -71,6 +71,7 @@ void RegionTable_Init_DeathMountainTrail() { LOCATION(RC_DMT_COW_GROTTO_RUPEE_5, true), LOCATION(RC_DMT_COW_GROTTO_RUPEE_6, true), LOCATION(RC_DMT_COW_GROTTO_RED_RUPEE, true), + LOCATION(RC_DMT_COW_GROTTO_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), }, { //Exits Entrance(RR_DEATH_MOUNTAIN_SUMMIT, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp index d6ded1312..eb906d227 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp @@ -24,7 +24,7 @@ void RegionTable_Init_Graveyard() { Entrance(RR_GRAVEYARD_COMPOSERS_GRAVE, []{return logic->CanUse(RG_ZELDAS_LULLABY);}), Entrance(RR_GRAVEYARD_HEART_PIECE_GRAVE, []{return logic->IsAdult || logic->AtNight;}), Entrance(RR_GRAVEYARD_DAMPES_GRAVE, []{return logic->IsAdult;}), - Entrance(RR_GRAVEYARD_DAMPES_HOUSE, []{return logic->IsAdult /*|| logic->AtDampeTime*/;}), //TODO: This needs to be handled in ToD rework + Entrance(RR_GRAVEYARD_DAMPES_HOUSE, []{return logic->IsAdult && logic->CanOpenOverworldDoor(RG_DAMPES_HUT_KEY) /*|| logic->AtDampeTime*/;}), //TODO: This needs to be handled in ToD rework Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), Entrance(RR_GRAVEYARD_WARP_PAD_REGION, []{return false;}), }); @@ -103,7 +103,7 @@ void RegionTable_Init_Graveyard() { LOCATION(RC_DAMPE_HINT, logic->IsAdult), }, { //Exits - Entrance(RR_THE_GRAVEYARD, []{return true;}), + Entrance(RR_THE_GRAVEYARD, []{return logic->CanOpenOverworldDoor(RG_DAMPES_HUT_KEY);}), }); areaTable[RR_GRAVEYARD_WARP_PAD_REGION] = Region("Graveyard Warp Pad Region", "Graveyard", {RA_THE_GRAVEYARD}, NO_DAY_NIGHT_CYCLE, { diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp index 7d22f30a0..d41055f95 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp @@ -33,14 +33,14 @@ void RegionTable_Init_Kakariko() { }, { //Exits Entrance(RR_HYRULE_FIELD, []{return true;}), - Entrance(RR_KAK_CARPENTER_BOSS_HOUSE, []{return true;}), - Entrance(RR_KAK_HOUSE_OF_SKULLTULA, []{return true;}), - Entrance(RR_KAK_IMPAS_HOUSE, []{return true;}), - Entrance(RR_KAK_WINDMILL, []{return true;}), - Entrance(RR_KAK_BAZAAR, []{return logic->IsAdult && logic->AtDay;}), - Entrance(RR_KAK_SHOOTING_GALLERY, []{return logic->IsAdult && logic->AtDay;}), + Entrance(RR_KAK_CARPENTER_BOSS_HOUSE, []{return logic->CanOpenOverworldDoor(RG_BOSS_HOUSE_KEY);}), + Entrance(RR_KAK_HOUSE_OF_SKULLTULA, []{return logic->CanOpenOverworldDoor(RG_SKULLTULA_HOUSE_KEY);}), + Entrance(RR_KAK_IMPAS_HOUSE, []{return logic->CanOpenOverworldDoor(RG_IMPAS_HOUSE_KEY);}), + Entrance(RR_KAK_WINDMILL, []{return logic->CanOpenOverworldDoor(RG_WINDMILL_KEY);}), + Entrance(RR_KAK_BAZAAR, []{return logic->IsAdult && logic->AtDay && logic->CanOpenOverworldDoor(RG_KAK_BAZAAR_KEY);}), + Entrance(RR_KAK_SHOOTING_GALLERY, []{return logic->IsAdult && logic->AtDay && logic->CanOpenOverworldDoor(RG_KAK_SHOOTING_GALLERY_KEY);}), Entrance(RR_KAK_WELL, []{return logic->IsAdult || logic->DrainWell || logic->CanUse(RG_IRON_BOOTS);}), - Entrance(RR_KAK_POTION_SHOP_FRONT, []{return logic->AtDay || logic->IsChild;}), + Entrance(RR_KAK_POTION_SHOP_FRONT, []{return logic->AtDay || logic->IsChild && logic->CanOpenOverworldDoor(RG_KAK_POTION_SHOP_KEY);}), Entrance(RR_KAK_REDEAD_GROTTO, []{return logic->CanOpenBombGrotto();}), Entrance(RR_KAK_IMPAS_LEDGE, []{return (logic->IsChild && logic->AtDay) || (logic->IsAdult && ctx->GetTrickOption(RT_VISIBLE_COLLISION));}), Entrance(RR_KAK_WATCHTOWER, []{return logic->IsAdult || logic->AtDay || logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_LONGSHOT) || (ctx->GetTrickOption(RT_KAK_TOWER_GS) && logic->CanJumpslashExceptHammer());}), @@ -95,8 +95,8 @@ void RegionTable_Init_Kakariko() { //Exits Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), Entrance(RR_KAK_OPEN_GROTTO, []{return true;}), - Entrance(RR_KAK_ODD_POTION_BUILDING, []{return logic->IsAdult;}), - Entrance(RR_KAK_POTION_SHOP_BACK, []{return logic->IsAdult && logic->AtDay;}), + Entrance(RR_KAK_ODD_POTION_BUILDING, []{return logic->IsAdult && logic->CanOpenOverworldDoor(RG_GRANNYS_POTION_SHOP_KEY);}), + Entrance(RR_KAK_POTION_SHOP_BACK, []{return logic->IsAdult && logic->AtDay && logic->CanOpenOverworldDoor(RG_KAK_POTION_SHOP_KEY);}), }); areaTable[RR_KAK_CARPENTER_BOSS_HOUSE] = Region("Kak Carpenter Boss House", "Kak Carpenter Boss House", {}, NO_DAY_NIGHT_CYCLE, { @@ -104,7 +104,7 @@ void RegionTable_Init_Kakariko() { EventAccess(&logic->WakeUpAdultTalon, []{return logic->IsAdult && logic->CanUse(RG_POCKET_EGG);}), }, {}, { //Exits - Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), + Entrance(RR_KAKARIKO_VILLAGE, []{return logic->CanOpenOverworldDoor(RG_BOSS_HOUSE_KEY);}), }); areaTable[RR_KAK_HOUSE_OF_SKULLTULA] = Region("Kak House of Skulltula", "Kak House of Skulltula", {}, NO_DAY_NIGHT_CYCLE, {}, { @@ -117,7 +117,7 @@ void RegionTable_Init_Kakariko() { LOCATION(RC_KAK_100_GOLD_SKULLTULA_REWARD, logic->GetGSCount() >= 100), }, { //Exits - Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), + Entrance(RR_KAKARIKO_VILLAGE, []{return logic->CanOpenOverworldDoor(RG_SKULLTULA_HOUSE_KEY);}), }); areaTable[RR_KAK_IMPAS_HOUSE] = Region("Kak Impas House", "Kak Impas House", {}, NO_DAY_NIGHT_CYCLE, {}, { @@ -125,7 +125,7 @@ void RegionTable_Init_Kakariko() { LOCATION(RC_KAK_IMPAS_HOUSE_COW, logic->CanUse(RG_EPONAS_SONG)), }, { //Exits - Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), + Entrance(RR_KAKARIKO_VILLAGE, []{return logic->CanOpenOverworldDoor(RG_IMPAS_HOUSE_KEY);}), }); areaTable[RR_KAK_IMPAS_HOUSE_BACK] = Region("Kak Impas House Back", "Kak Impas House", {}, NO_DAY_NIGHT_CYCLE, {}, { @@ -146,7 +146,7 @@ void RegionTable_Init_Kakariko() { LOCATION(RC_SONG_FROM_WINDMILL, logic->IsAdult && logic->HasItem(RG_FAIRY_OCARINA)), }, { //Exits - Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), + Entrance(RR_KAKARIKO_VILLAGE, []{return logic->CanOpenOverworldDoor(RG_WINDMILL_KEY);}), }); areaTable[RR_KAK_BAZAAR] = Region("Kak Bazaar", "Kak Bazaar", {}, NO_DAY_NIGHT_CYCLE, {}, { @@ -169,7 +169,7 @@ void RegionTable_Init_Kakariko() { LOCATION(RC_KAK_SHOOTING_GALLERY_REWARD, logic->HasItem(RG_CHILD_WALLET) && logic->IsAdult && logic->CanUse(RG_FAIRY_BOW)), }, { //Exits - Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), + Entrance(RR_KAKARIKO_VILLAGE, []{return logic->CanOpenOverworldDoor(RG_KAK_SHOOTING_GALLERY_KEY);}), }); areaTable[RR_KAK_POTION_SHOP_FRONT] = Region("Kak Potion Shop Front", "Kak Potion Shop", {}, NO_DAY_NIGHT_CYCLE, {}, { @@ -203,7 +203,7 @@ void RegionTable_Init_Kakariko() { LOCATION(RC_KAK_GRANNYS_SHOP, logic->IsAdult && (logic->CanUse(RG_ODD_MUSHROOM) || logic->TradeQuestStep(RG_ODD_MUSHROOM))), }, { // Exits - Entrance(RR_KAK_BACKYARD, []{return true;}), + Entrance(RR_KAK_BACKYARD, []{return logic->CanOpenOverworldDoor(RG_GRANNYS_POTION_SHOP_KEY);}), }); areaTable[RR_KAK_REDEAD_GROTTO] = Region("Kak Redead Grotto", "Kak Redead Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp index 148acad13..8833441e9 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp @@ -44,7 +44,7 @@ void RegionTable_Init_LakeHylia() { Entrance(RR_ZORAS_DOMAIN, []{return logic->IsChild && (logic->HasItem(RG_SILVER_SCALE) || logic->CanUse(RG_IRON_BOOTS));}), Entrance(RR_LH_OWL_FLIGHT, []{return logic->IsChild;}), Entrance(RR_LH_FISHING_ISLAND, []{return ((logic->IsChild || logic->WaterTempleClear) && logic->HasItem(RG_BRONZE_SCALE)) || (logic->IsAdult && (logic->CanUse(RG_SCARECROW) || CanPlantBean(RR_LAKE_HYLIA)));}), - Entrance(RR_LH_LAB, []{return true;}), + Entrance(RR_LH_LAB, []{return logic->CanOpenOverworldDoor(RG_HYLIA_LAB_KEY);}), Entrance(RR_WATER_TEMPLE_ENTRYWAY, []{return logic->CanUse(RG_HOOKSHOT) && ((logic->CanUse(RG_IRON_BOOTS) || (ctx->GetTrickOption(RT_LH_WATER_HOOKSHOT) && logic->HasItem(RG_GOLDEN_SCALE))) || (logic->IsAdult && logic->CanUse(RG_LONGSHOT) && logic->HasItem(RG_GOLDEN_SCALE)));}), Entrance(RR_LH_GROTTO, []{return true;}), }); @@ -52,7 +52,7 @@ void RegionTable_Init_LakeHylia() { areaTable[RR_LH_FISHING_ISLAND] = Region("LH Fishing Island", "Lake Hylia", {RA_LAKE_HYLIA}, DAY_NIGHT_CYCLE, {}, {}, { //Exits Entrance(RR_LAKE_HYLIA, []{return logic->HasItem(RG_BRONZE_SCALE);}), - Entrance(RR_LH_FISHING_POND, []{return true;}), + Entrance(RR_LH_FISHING_POND, []{return logic->CanOpenOverworldDoor(RG_FISHING_HOLE_KEY);}), }); areaTable[RR_LH_OWL_FLIGHT] = Region("LH Owl Flight", "Lake Hylia", {RA_LAKE_HYLIA}, NO_DAY_NIGHT_CYCLE, {}, {}, { @@ -70,7 +70,7 @@ void RegionTable_Init_LakeHylia() { LOCATION(RC_LH_LAB_RIGHT_RUPEE, logic->CanUse(RG_IRON_BOOTS) || logic->HasItem(RG_GOLDEN_SCALE)), }, { //Exits - Entrance(RR_LAKE_HYLIA, []{return true;}), + Entrance(RR_LAKE_HYLIA, []{return logic->CanOpenOverworldDoor(RG_HYLIA_LAB_KEY);}), }); // TODO: should some of these helpers be done via events instead? @@ -115,7 +115,7 @@ void RegionTable_Init_LakeHylia() { LOCATION(RC_FISHING_POLE_HINT, true), }, { //Exits - Entrance(RR_LH_FISHING_ISLAND, []{return true;}), + Entrance(RR_LH_FISHING_ISLAND, []{return logic->CanOpenOverworldDoor(RG_FISHING_HOLE_KEY);}), }); areaTable[RR_LH_GROTTO] = Region("LH Grotto", "LH Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/lon_lon_ranch.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/lon_lon_ranch.cpp index df73b78d9..fa1d7451e 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/lon_lon_ranch.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/lon_lon_ranch.cpp @@ -25,9 +25,9 @@ void RegionTable_Init_LonLonRanch() { }, { //Exits Entrance(RR_HYRULE_FIELD, []{return true;}), - Entrance(RR_LLR_TALONS_HOUSE, []{return true;}), - Entrance(RR_LLR_STABLES, []{return true;}), - Entrance(RR_LLR_TOWER, []{return true;}), + Entrance(RR_LLR_TALONS_HOUSE, []{return logic->CanOpenOverworldDoor(RG_TALONS_HOUSE_KEY);}), + Entrance(RR_LLR_STABLES, []{return logic->CanOpenOverworldDoor(RG_STABLES_KEY);}), + Entrance(RR_LLR_TOWER, []{return logic->CanOpenOverworldDoor(RG_BACK_TOWER_KEY);}), Entrance(RR_LLR_GROTTO, []{return logic->IsChild;}), }); @@ -39,7 +39,7 @@ void RegionTable_Init_LonLonRanch() { LOCATION(RC_LLR_TALONS_HOUSE_POT_3, logic->CanBreakPots()), }, { //Exits - Entrance(RR_LON_LON_RANCH, []{return true;}), + Entrance(RR_LON_LON_RANCH, []{return logic->CanOpenOverworldDoor(RG_TALONS_HOUSE_KEY);}), }); areaTable[RR_LLR_STABLES] = Region("LLR Stables", "LLR Stables", {}, NO_DAY_NIGHT_CYCLE, {}, { @@ -48,7 +48,7 @@ void RegionTable_Init_LonLonRanch() { LOCATION(RC_LLR_STABLES_RIGHT_COW, logic->CanUse(RG_EPONAS_SONG)), }, { //Exits - Entrance(RR_LON_LON_RANCH, []{return true;}), + Entrance(RR_LON_LON_RANCH, []{return logic->CanOpenOverworldDoor(RG_STABLES_KEY);}), }); areaTable[RR_LLR_TOWER] = Region("LLR Tower", "LLR Tower", {}, NO_DAY_NIGHT_CYCLE, {}, { @@ -58,7 +58,7 @@ void RegionTable_Init_LonLonRanch() { LOCATION(RC_LLR_TOWER_RIGHT_COW, logic->CanUse(RG_EPONAS_SONG)), }, { //Exits - Entrance(RR_LON_LON_RANCH, []{return true;}), + Entrance(RR_LON_LON_RANCH, []{return logic->CanOpenOverworldDoor(RG_BACK_TOWER_KEY);}), }); areaTable[RR_LLR_GROTTO] = Region("LLR Grotto", "LLR Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp index 384485730..e0ef67aa5 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp @@ -8,7 +8,7 @@ void RegionTable_Init_Market() { //Exits Entrance(RR_HYRULE_FIELD, []{return logic->IsAdult || logic->AtDay;}), Entrance(RR_THE_MARKET, []{return true;}), - Entrance(RR_MARKET_GUARD_HOUSE, []{return true;}), + Entrance(RR_MARKET_GUARD_HOUSE, []{return logic->CanOpenOverworldDoor(RG_GUARD_HOUSE_KEY);}), }); areaTable[RR_THE_MARKET] = Region("Market", "Market", {RA_THE_MARKET}, NO_DAY_NIGHT_CYCLE, {}, {}, { @@ -16,21 +16,21 @@ void RegionTable_Init_Market() { Entrance(RR_MARKET_ENTRANCE, []{return true;}), Entrance(RR_TOT_ENTRANCE, []{return true;}), Entrance(RR_CASTLE_GROUNDS, []{return true;}), - Entrance(RR_MARKET_BAZAAR, []{return logic->IsChild && logic->AtDay;}), - Entrance(RR_MARKET_MASK_SHOP, []{return logic->IsChild && logic->AtDay;}), - Entrance(RR_MARKET_SHOOTING_GALLERY, []{return logic->IsChild && logic->AtDay;}), - Entrance(RR_MARKET_BOMBCHU_BOWLING, []{return logic->IsChild;}), - Entrance(RR_MARKET_TREASURE_CHEST_GAME, []{return logic->IsChild && logic->AtNight;}), - Entrance(RR_MARKET_POTION_SHOP, []{return logic->IsChild && logic->AtDay;}), + Entrance(RR_MARKET_BAZAAR, []{return logic->IsChild && logic->AtDay && logic->CanOpenOverworldDoor(RG_MARKET_BAZAAR_KEY);}), + Entrance(RR_MARKET_MASK_SHOP, []{return logic->IsChild && logic->AtDay && logic->CanOpenOverworldDoor(RG_MASK_SHOP_KEY);}), + Entrance(RR_MARKET_SHOOTING_GALLERY, []{return logic->IsChild && logic->AtDay && logic->CanOpenOverworldDoor(RG_MARKET_SHOOTING_GALLERY_KEY);}), + Entrance(RR_MARKET_BOMBCHU_BOWLING, []{return logic->IsChild && logic->CanOpenOverworldDoor(RG_BOMBCHU_BOWLING_KEY);}), + Entrance(RR_MARKET_TREASURE_CHEST_GAME, []{return logic->IsChild && logic->AtNight && logic->CanOpenOverworldDoor(RG_TREASURE_CHEST_GAME_BUILDING_KEY);}), + Entrance(RR_MARKET_POTION_SHOP, []{return logic->IsChild && logic->AtDay && logic->CanOpenOverworldDoor(RG_MARKET_POTION_SHOP_KEY);}), Entrance(RR_MARKET_BACK_ALLEY, []{return logic->IsChild;}), }); areaTable[RR_MARKET_BACK_ALLEY] = Region("Market Back Alley", "Market", {RA_THE_MARKET}, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits Entrance(RR_THE_MARKET, []{return true;}), - Entrance(RR_MARKET_BOMBCHU_SHOP, []{return logic->AtNight;}), - Entrance(RR_MARKET_DOG_LADY_HOUSE, []{return true;}), - Entrance(RR_MARKET_MAN_IN_GREEN_HOUSE, []{return logic->AtNight;}), + Entrance(RR_MARKET_BOMBCHU_SHOP, []{return logic->AtNight && logic->CanOpenOverworldDoor(RG_BOMBCHU_SHOP_KEY);}), + Entrance(RR_MARKET_DOG_LADY_HOUSE, []{return logic->CanOpenOverworldDoor(RG_RICHARDS_HOUSE_KEY);}), + Entrance(RR_MARKET_MAN_IN_GREEN_HOUSE, []{return logic->AtNight && logic->CanOpenOverworldDoor(RG_ALLEY_HOUSE_KEY);}), }); areaTable[RR_MARKET_GUARD_HOUSE] = Region("Market Guard House", "Market Guard House", {}, NO_DAY_NIGHT_CYCLE, { @@ -98,7 +98,7 @@ void RegionTable_Init_Market() { LOCATION(RC_MK_GUARD_HOUSE_ADULT_POT_11, logic->IsAdult && logic->CanBreakPots()), }, { //Exits - Entrance(RR_MARKET_ENTRANCE, []{return true;}), + Entrance(RR_MARKET_ENTRANCE, []{return logic->CanOpenOverworldDoor(RG_GUARD_HOUSE_KEY);}), }); areaTable[RR_MARKET_BAZAAR] = Region("Market Bazaar", "Market Bazaar", {}, NO_DAY_NIGHT_CYCLE, {}, { @@ -133,7 +133,7 @@ void RegionTable_Init_Market() { LOCATION(RC_MARKET_SHOOTING_GALLERY_REWARD, logic->IsChild && logic->HasItem(RG_CHILD_WALLET)), }, { //Exits - Entrance(RR_THE_MARKET, []{return true;}), + Entrance(RR_THE_MARKET, []{return logic->CanOpenOverworldDoor(RG_MARKET_SHOOTING_GALLERY_KEY);}), }); areaTable[RR_MARKET_BOMBCHU_BOWLING] = Region("Market Bombchu Bowling", "Market Bombchu Bowling", {}, NO_DAY_NIGHT_CYCLE, { @@ -145,7 +145,7 @@ void RegionTable_Init_Market() { LOCATION(RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, logic->CouldPlayBowling && logic->BombchusEnabled()), }, { //Exits - Entrance(RR_THE_MARKET, []{return true;}), + Entrance(RR_THE_MARKET, []{return logic->CanOpenOverworldDoor(RG_BOMBCHU_BOWLING_KEY);}), }); areaTable[RR_MARKET_POTION_SHOP] = Region("Market Potion Shop", "Market Potion Shop", {}, NO_DAY_NIGHT_CYCLE, {}, { @@ -179,7 +179,7 @@ void RegionTable_Init_Market() { LOCATION(RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, logic->HasItem(RG_CHILD_WALLET) && ((ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_SINGLE_KEYS) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 5)) || (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_PACK) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)) || (logic->CanUse(RG_LENS_OF_TRUTH) && !ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME)))), }, { //Exits - Entrance(RR_THE_MARKET, []{return true;}), + Entrance(RR_THE_MARKET, []{return logic->CanOpenOverworldDoor(RG_TREASURE_CHEST_GAME_BUILDING_KEY);}), }); areaTable[RR_MARKET_BOMBCHU_SHOP] = Region("Market Bombchu Shop", "Market Bombchu Shop", {}, NO_DAY_NIGHT_CYCLE, {}, { @@ -202,7 +202,7 @@ void RegionTable_Init_Market() { LOCATION(RC_MARKET_LOST_DOG, logic->IsChild && logic->AtNight), }, { //Exits - Entrance(RR_MARKET_BACK_ALLEY, []{return true;}), + Entrance(RR_MARKET_BACK_ALLEY, []{return logic->CanOpenOverworldDoor(RG_RICHARDS_HOUSE_KEY);}), }); areaTable[RR_MARKET_MAN_IN_GREEN_HOUSE] = Region("Market Man in Green House", "Market Man in Green House", {}, NO_DAY_NIGHT_CYCLE, {}, { @@ -212,6 +212,6 @@ void RegionTable_Init_Market() { LOCATION(RC_MK_BACK_ALLEY_HOUSE_POT_3, logic->CanBreakPots()), }, { //Exits - Entrance(RR_MARKET_BACK_ALLEY, []{return true;}), + Entrance(RR_MARKET_BACK_ALLEY, []{return logic->CanOpenOverworldDoor(RG_ALLEY_HOUSE_KEY);}), }); } \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 9e89ea5d1..4141bcce4 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -1800,6 +1800,7 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_HF_POND_STORMS_FAIRY] = Location::Fairy(RC_HF_POND_STORMS_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(0x1000, 5012), "Pond Song of Storms Fairy", "Pond Song of Storms Fairy", RHT_HF_POND_STORMS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_POND_STORMS_FAIRY)); locationTable[RC_HF_FENCE_GROTTO_STORMS_FAIRY] = Location::Fairy(RC_HF_FENCE_GROTTO_STORMS_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1000, -308), "Inside Fence Storms Fairy", "Inside Fence Storms Fairy", RHT_HF_FENCE_GROTTO_STORMS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FENCE_GROTTO_STORMS_FAIRY)); locationTable[RC_DMT_FLAG_SUN_FAIRY] = Location::Fairy(RC_DMT_FLAG_SUN_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(0x1000, 464), "Flag Sun's Song Fairy", "Flag Sun's Song Fairy", RHT_DMT_FLAG_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_FLAG_SUN_FAIRY)); + locationTable[RC_DMT_COW_GROTTO_STORMS_FAIRY] = Location::Fairy(RC_DMT_COW_GROTTO_STORMS_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1000, -311), "Cow Grotto Song of Storms Fairy", "Cow Grotto Song of Storms Fairy", RHT_DMT_COW_GROTTO_STORMS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_STORMS_FAIRY)); locationTable[RC_LW_SHORTCUT_STORMS_FAIRY] = Location::Fairy(RC_LW_SHORTCUT_STORMS_FAIRY, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(0x1000, -795), "Shortcuts Song of Storms Fairy", "Shortcuts Song of Storms Fairy", RHT_LW_SHORTCUT_STORMS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_STORMS_FAIRY)); locationTable[RC_GF_KITCHEN_SUN_FAIRY] = Location::Fairy(RC_GF_KITCHEN_SUN_FAIRY, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(0x1000, -621), "Kitchen Sun's Song Fairy", "Kitchen Sun's Song Fairy", RHT_GF_KITCHEN_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_SUN_FAIRY)); diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index cd65fd006..1be61ccae 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -140,6 +140,31 @@ namespace Rando { case RG_TWINROVA_SOUL: case RG_GANON_SOUL: case RG_SKELETON_KEY: + // Overworld Keys + case RG_GUARD_HOUSE_KEY: + case RG_MARKET_BAZAAR_KEY: + case RG_MARKET_POTION_SHOP_KEY: + case RG_MASK_SHOP_KEY: + case RG_MARKET_SHOOTING_GALLERY_KEY: + case RG_BOMBCHU_BOWLING_KEY: + case RG_TREASURE_CHEST_GAME_BUILDING_KEY: + case RG_BOMBCHU_SHOP_KEY: + case RG_RICHARDS_HOUSE_KEY: + case RG_ALLEY_HOUSE_KEY: + case RG_KAK_BAZAAR_KEY: + case RG_KAK_POTION_SHOP_KEY: + case RG_BOSS_HOUSE_KEY: + case RG_GRANNYS_POTION_SHOP_KEY: + case RG_SKULLTULA_HOUSE_KEY: + case RG_IMPAS_HOUSE_KEY: + case RG_WINDMILL_KEY: + case RG_KAK_SHOOTING_GALLERY_KEY: + case RG_DAMPES_HUT_KEY: + case RG_TALONS_HOUSE_KEY: + case RG_STABLES_KEY: + case RG_BACK_TOWER_KEY: + case RG_HYLIA_LAB_KEY: + case RG_FISHING_HOLE_KEY: return CheckRandoInf(RandoGetToRandInf.at(itemName)); // Boss Keys case RG_EPONA: @@ -382,6 +407,18 @@ namespace Rando { } } + bool Logic::CanOpenOverworldDoor(RandomizerGet key) { + if (!ctx->GetOption(RSK_LOCK_OVERWORLD_DOORS)) { + return true; + } + + if (HasItem(RG_SKELETON_KEY)) { + return true; + } + + return HasItem(key); + } + uint8_t GetDifficultyValueFromString(Rando::Option& glitchOption) { return 0; } @@ -1293,7 +1330,31 @@ namespace Rando { { RG_OCARINA_C_RIGHT_BUTTON, RAND_INF_HAS_OCARINA_C_RIGHT }, { RG_SKELETON_KEY, RAND_INF_HAS_SKELETON_KEY }, { RG_GREG_RUPEE, RAND_INF_GREG_FOUND }, - { RG_FISHING_POLE, RAND_INF_FISHING_POLE_FOUND } + { RG_FISHING_POLE, RAND_INF_FISHING_POLE_FOUND }, + { RG_GUARD_HOUSE_KEY, RAND_INF_GUARD_HOUSE_KEY_OBTAINED }, + { RG_MARKET_BAZAAR_KEY, RAND_INF_MARKET_BAZAAR_KEY_OBTAINED }, + { RG_MARKET_POTION_SHOP_KEY, RAND_INF_MARKET_POTION_SHOP_KEY_OBTAINED }, + { RG_MASK_SHOP_KEY, RAND_INF_MASK_SHOP_KEY_OBTAINED }, + { RG_MARKET_SHOOTING_GALLERY_KEY, RAND_INF_MARKET_SHOOTING_GALLERY_KEY_OBTAINED }, + { RG_BOMBCHU_BOWLING_KEY, RAND_INF_BOMBCHU_BOWLING_KEY_OBTAINED }, + { RG_TREASURE_CHEST_GAME_BUILDING_KEY, RAND_INF_TREASURE_CHEST_GAME_BUILDING_KEY_OBTAINED }, + { RG_BOMBCHU_SHOP_KEY, RAND_INF_BOMBCHU_SHOP_KEY_OBTAINED }, + { RG_RICHARDS_HOUSE_KEY, RAND_INF_RICHARDS_HOUSE_KEY_OBTAINED }, + { RG_ALLEY_HOUSE_KEY, RAND_INF_ALLEY_HOUSE_KEY_OBTAINED }, + { RG_KAK_BAZAAR_KEY, RAND_INF_KAK_BAZAAR_KEY_OBTAINED }, + { RG_KAK_POTION_SHOP_KEY, RAND_INF_KAK_POTION_SHOP_KEY_OBTAINED }, + { RG_BOSS_HOUSE_KEY, RAND_INF_BOSS_HOUSE_KEY_OBTAINED }, + { RG_GRANNYS_POTION_SHOP_KEY, RAND_INF_GRANNYS_POTION_SHOP_KEY_OBTAINED }, + { RG_SKULLTULA_HOUSE_KEY, RAND_INF_SKULLTULA_HOUSE_KEY_OBTAINED }, + { RG_IMPAS_HOUSE_KEY, RAND_INF_IMPAS_HOUSE_KEY_OBTAINED }, + { RG_WINDMILL_KEY, RAND_INF_WINDMILL_KEY_OBTAINED }, + { RG_KAK_SHOOTING_GALLERY_KEY, RAND_INF_KAK_SHOOTING_GALLERY_KEY_OBTAINED }, + { RG_DAMPES_HUT_KEY, RAND_INF_DAMPES_HUT_KEY_OBTAINED }, + { RG_TALONS_HOUSE_KEY, RAND_INF_TALONS_HOUSE_KEY_OBTAINED }, + { RG_STABLES_KEY, RAND_INF_STABLES_KEY_OBTAINED }, + { RG_BACK_TOWER_KEY, RAND_INF_BACK_TOWER_KEY_OBTAINED }, + { RG_HYLIA_LAB_KEY, RAND_INF_HYLIA_LAB_KEY_OBTAINED }, + { RG_FISHING_HOLE_KEY, RAND_INF_FISHING_HOLE_KEY_OBTAINED }, }; std::map Logic::RandoGetToDungeonScene = { @@ -1635,6 +1696,30 @@ namespace Rando { case RG_OCARINA_C_RIGHT_BUTTON: case RG_GREG_RUPEE: case RG_FISHING_POLE: + case RG_GUARD_HOUSE_KEY: + case RG_MARKET_BAZAAR_KEY: + case RG_MARKET_POTION_SHOP_KEY: + case RG_MASK_SHOP_KEY: + case RG_MARKET_SHOOTING_GALLERY_KEY: + case RG_BOMBCHU_BOWLING_KEY: + case RG_TREASURE_CHEST_GAME_BUILDING_KEY: + case RG_BOMBCHU_SHOP_KEY: + case RG_RICHARDS_HOUSE_KEY: + case RG_ALLEY_HOUSE_KEY: + case RG_KAK_BAZAAR_KEY: + case RG_KAK_POTION_SHOP_KEY: + case RG_BOSS_HOUSE_KEY: + case RG_GRANNYS_POTION_SHOP_KEY: + case RG_SKULLTULA_HOUSE_KEY: + case RG_IMPAS_HOUSE_KEY: + case RG_WINDMILL_KEY: + case RG_KAK_SHOOTING_GALLERY_KEY: + case RG_DAMPES_HUT_KEY: + case RG_TALONS_HOUSE_KEY: + case RG_STABLES_KEY: + case RG_BACK_TOWER_KEY: + case RG_HYLIA_LAB_KEY: + case RG_FISHING_HOLE_KEY: SetRandoInf(RandoGetToRandInf.at(randoGet), state); break; case RG_TRIFORCE_PIECE: diff --git a/soh/soh/Enhancements/randomizer/logic.h b/soh/soh/Enhancements/randomizer/logic.h index 3aff99d67..ea9d51801 100644 --- a/soh/soh/Enhancements/randomizer/logic.h +++ b/soh/soh/Enhancements/randomizer/logic.h @@ -186,6 +186,7 @@ class Logic { bool HasProjectile(HasProjectileAge age); bool HasItem(RandomizerGet itemName); bool HasBossSoul(RandomizerGet itemName); + bool CanOpenOverworldDoor(RandomizerGet itemName); bool SmallKeys(RandomizerRegion dungeon, uint8_t requiredAmount); bool SmallKeys(RandomizerRegion dungeon, uint8_t requiredAmountGlitchless, uint8_t requiredAmountGlitched); bool CanDoGlitch(GlitchType glitch); diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp index 2e577c51e..8abdd2634 100644 --- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp +++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp @@ -41,6 +41,7 @@ void Settings::CreateOptionDescriptions() { "\n" "Open - Sleeping Waterfall is always open. " "Link may always enter Zora's Domain."; + mOptionDescriptions[RSK_LOCK_OVERWORLD_DOORS] = "Add locks to all wooden overworld doors, requiring specific small keys to open them"; mOptionDescriptions[RSK_STARTING_AGE] = "Choose which age Link will start as.\n\n" "Starting as adult means you start with the Master Sword in your inventory.\n" @@ -697,9 +698,6 @@ void Settings::CreateOptionDescriptions() { "location is reachable. When disabled, only " "required items and locations to beat the game " "will be guaranteed reachable."; - mOptionDescriptions[RSK_ENABLE_GLITCH_CUTSCENES] = - "The cutscenes of the Poes in Forest Temple and Darunia in Fire Temple will not be skipped. " - "These cutscenes are only useful for glitched gameplay and can be safely skipped otherwise."; mOptionDescriptions[RSK_SHUFFLE_BOSS_SOULS] = "Shuffles 8 boss souls (one for each blue warp dungeon). A boss will not appear until you collect its respective soul." "\n\"On + Ganon\" will also hide Ganon and Ganondorf behind a boss soul."; } diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 301498bf8..1f44fe2f3 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -2182,13 +2182,6 @@ void RandomizerSettingsWindow::DrawElement() { ImGui::SameLine(); ImGui::TextColored(ImVec4(1.0f, 0.0f, 0.0f, 1.0f), "Heads up! This will disable all rando settings except for entrance shuffle and starter items"); } - - UIWidgets::PaddedSeparator(); - - // Enable Glitch-Useful Cutscenes - if (mSettings->GetOption(RSK_ENABLE_GLITCH_CUTSCENES).RenderImGui()) { - mNeedsUpdate = true; - } ImGui::PopItemWidth(); ImGui::EndTable(); } @@ -3338,7 +3331,7 @@ CustomMessage Randomizer::GetGoronMessage(u16 index) { void Randomizer::CreateCustomMessages() { // RANDTODO: Translate into french and german and replace GIMESSAGE_UNTRANSLATED // with GIMESSAGE(getItemID, itemID, english, german, french). - const std::array getItemMessages = {{ + const std::array getItemMessages = {{ GIMESSAGE(RG_GREG_RUPEE, ITEM_MASK_GORON, "You found %gGreg%w!", "%gGreg%w! Du hast ihn wirklich gefunden!", @@ -3386,40 +3379,140 @@ void Randomizer::CreateCustomMessages() { GIMESSAGE(RG_GERUDO_FORTRESS_SMALL_KEY, ITEM_KEY_SMALL, "You found a %yThieves Hideout &%wSmall Key!", - "Du erhältst einen %rKleinen&Schlüssel%w für das %yDiebesversteck%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für das %yDiebesversteck%w!", "Vous obtenez une %rPetite Clé %w&du %yRepaire des Voleurs%w!"), GIMESSAGE(RG_FOREST_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL, "You found a %gForest Temple &%wSmall Key!", - "Du erhältst einen %rKleinen&Schlüssel%w für den %gWaldtempel%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für den %gWaldtempel%w!", "Vous obtenez une %rPetite Clé %w&du %gTemple de la Forêt%w!"), GIMESSAGE(RG_FIRE_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL, "You found a %rFire Temple &%wSmall Key!", - "Du erhältst einen %rKleinen&Schlüssel%w für den %rFeuertempel%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für den %rFeuertempel%w!", "Vous obtenez une %rPetite Clé %w&du %rTemple du Feu%w!"), GIMESSAGE(RG_WATER_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL, "You found a %bWater Temple &%wSmall Key!", - "Du erhältst einen %rKleinen&Schlüssel%w für den %bWassertempel%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für den %bWassertempel%w!", "Vous obtenez une %rPetite Clé %w&du %bTemple de l'Eau%w!"), GIMESSAGE(RG_SPIRIT_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL, "You found a %ySpirit Temple &%wSmall Key!", - "Du erhältst einen %rKleinen&Schlüssel%w für den %yGeistertempel%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für den %yGeistertempel%w!", "Vous obtenez une %rPetite Clé %w&du %yTemple de l'Esprit%w!"), GIMESSAGE(RG_SHADOW_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL, "You found a %pShadow Temple &%wSmall Key!", - "Du erhältst einen %rKleinen&Schlüssel%w für den %pSchattentempel%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für den %pSchattentempel%w!", "Vous obtenez une %rPetite Clé %w&du %pTemple de l'Ombre%w!"), GIMESSAGE(RG_BOTTOM_OF_THE_WELL_SMALL_KEY, ITEM_KEY_SMALL, "You found a %pBottom of the &Well %wSmall Key!", - "Du erhältst einen %rKleinen&Schlüssel%w für den %pGrund des Brunnens%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für den %pGrund des Brunnens%w!", "Vous obtenez une %rPetite Clé %w&du %pPuits%w!"), GIMESSAGE(RG_GERUDO_TRAINING_GROUND_SMALL_KEY, ITEM_KEY_SMALL, "You found a %yGerudo Training &Grounds %wSmall Key!", - "Du erhältst einen %rKleinen&Schlüssel%w für die %yGerudo-Trainingsarena%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für die %yGerudo-Trainingsarena%w!", "Vous obtenez une %rPetite Clé %w&du %yGymnase Gerudo%w!"), GIMESSAGE(RG_GANONS_CASTLE_SMALL_KEY, ITEM_KEY_SMALL, "You found a %rGanon's Castle &%wSmall Key!", - "Du erhältst einen %rKleinen&Schlüssel%w für %rGanons Schloß%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für %rGanons Schloß%w!", "Vous obtenez une %rPetite Clé %w&du %rChâteau de Ganon%w!"), + GIMESSAGE(RG_GUARD_HOUSE_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gGuard House%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus der Wachen%w!", + "Vous obtenez une %rPetite Clé %w&de la %gMaison des Gardes%w!"), + GIMESSAGE(RG_MARKET_BAZAAR_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gMarket Bazaar%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für den %gBasar des Marktes%w!", + "Vous obtenez une %rPetite Clé %w&du %gMarché%w!"), + GIMESSAGE(RG_MARKET_POTION_SHOP_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gMarket Potion Shop%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für den %gMagie-Laden des Marktes%w!", + "Vous obtenez une %rPetite Clé %w&du %gMarché%w!"), + GIMESSAGE(RG_MASK_SHOP_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gMask Shop%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für den %gMaskenladen%w!", + "Vous obtenez une %rPetite Clé %w&du %gMagasin de Masques%w!"), + GIMESSAGE(RG_MARKET_SHOOTING_GALLERY_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gMarket Shooting Gallery%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für die %gSchießbude des Marktes%w!", + "Vous obtenez une %rPetite Clé %w&du %gStand de Tir%w!"), + GIMESSAGE(RG_BOMBCHU_BOWLING_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gBombchu Bowling Alley%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für die %gMinenbowlingbahn%w!", + "Vous obtenez une %rPetite Clé %w&du %gBowling Bombchu%w!"), + GIMESSAGE(RG_TREASURE_CHEST_GAME_BUILDING_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gTreasure Chest Game Building%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus des Schatzkisten-Pokers%w!", + "Vous obtenez une %rPetite Clé %w&du %gJeu de la Chasse au Trésor%w!"), + GIMESSAGE(RG_BOMBCHU_SHOP_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gBombchu Shop%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für den %gKrabbelminenladen%w!", + "Vous obtenez une %rPetite Clé %w&du %gMagasin de Bombchu%w!"), + GIMESSAGE(RG_RICHARDS_HOUSE_KEY, ITEM_KEY_SMALL, + "You found the key to&%gRichard's House%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus von Richard%w!", + "Vous obtenez une %rPetite Clé %w&de la %gMaison de Richard%w!"), + GIMESSAGE(RG_RICHARDS_HOUSE_KEY, ITEM_KEY_SMALL, + "You found the key to&%gRichard's House%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus von Richard%w!", + "Vous obtenez une %rPetite Clé %w&de la %gMaison de Richard%w!"), + GIMESSAGE(RG_ALLEY_HOUSE_KEY, ITEM_KEY_SMALL, + "You found the key to&the %gAlley House%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus in der Gasse%w!", + "Vous obtenez une %rPetite Clé %w&de la %gMaison de la Ruelle%w!"), + GIMESSAGE(RG_KAK_BAZAAR_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gKakariko Bazaar%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für den %gBasar von Kakariko%w!", + "Vous obtenez une %rPetite Clé %w&du %gMarché de Cocorico%w!"), + GIMESSAGE(RG_KAK_POTION_SHOP_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gKakariko Potion Shop%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für den %gMagie-Laden von Kakariko%w!", + "Vous obtenez une %rPetite Clé %w&du %gMagasin de Potions de Cocorico%w!"), + GIMESSAGE(RG_BOSS_HOUSE_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gBoss's House%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus des Chefs%w!", + "Vous obtenez une %rPetite Clé %w&de la %gMaison du Boss%w!"), + GIMESSAGE(RG_GRANNYS_POTION_SHOP_KEY, ITEM_KEY_SMALL, + "You found the key to&%gGranny's Potion Shop%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für %gAsas Hexenladen%w!", + "Vous obtenez une %rPetite Clé %w&du %gMagasin de Potions de Grand-mère%w!"), + GIMESSAGE(RG_SKULLTULA_HOUSE_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gSkulltula House%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für das %gSkulltula-Haus%w!", + "Vous obtenez une %rPetite Clé %w&de la %gMaison des Skulltulas%w!"), + GIMESSAGE(RG_IMPAS_HOUSE_KEY, ITEM_KEY_SMALL, + "You found the key to&%gImpa's House%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus von Impa%w!", + "Vous obtenez une %rPetite Clé %w&de la %gMaison d'Impa%w!"), + GIMESSAGE(RG_WINDMILL_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gWindmill%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für die %gWindmühle%w!", + "Vous obtenez une %rPetite Clé %w&du %gMoulin à Vent%w!"), + GIMESSAGE(RG_KAK_SHOOTING_GALLERY_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gKakariko Shooting Gallery%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für die %gSchießbude von Kakariko%w!", + "Vous obtenez une %rPetite Clé %w&du %gStand de Tir de Cocorico%w!"), + GIMESSAGE(RG_DAMPES_HUT_KEY, ITEM_KEY_SMALL, + "You found the key to&%gDampe's Hut%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für die %gHütte von Boris%w!", + "Vous obtenez une %rPetite Clé %w&du %gChalet de Dampe%w!"), + GIMESSAGE(RG_TALONS_HOUSE_KEY, ITEM_KEY_SMALL, + "You found the key to&%gTalon's House%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus von Talon%w!", + "Vous obtenez une %rPetite Clé %w&de la %gMaison de Talon%w!"), + GIMESSAGE(RG_STABLES_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gStables%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für die %gStälle%w!", + "Vous obtenez une %rPetite Clé %w&des %gÉcuries%w!"), + GIMESSAGE(RG_BACK_TOWER_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gBack Tower%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für den %ghinteren Turm%w!", + "Vous obtenez une %rPetite Clé %w&du %gTour Arrière%w!"), + GIMESSAGE(RG_HYLIA_LAB_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gHylia Laboratory%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für das %gHylia-Labor%w!", + "Vous obtenez une %rPetite Clé %w&du %gLaboratoire d'Hylia%w!"), + GIMESSAGE(RG_FISHING_HOLE_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gFishing Hole%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für den %gFischweiher%w!", + "Vous obtenez une %rPetite Clé %w&du %gTrou de Pêche%w!"), GIMESSAGE(RG_GERUDO_FORTRESS_KEY_RING, ITEM_KEY_SMALL, "You found a %yThieves Hideout &%wKeyring!", @@ -3953,6 +4046,9 @@ extern "C" u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { gSaveContext.inventory.dungeonItems[mapIndex] |= bitmask; return Return_Item_Entry(giEntry, RG_NONE); + } else if (item >= RG_GUARD_HOUSE_KEY && item <= RG_FISHING_HOLE_KEY) { + Flags_SetRandomizerInf((RandomizerInf)((int)RAND_INF_GUARD_HOUSE_UNLOCKED + ((item - RG_GUARD_HOUSE_KEY) * 2) + 1)); + return Return_Item_Entry(giEntry, RG_NONE); } switch (item) { diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index d7edb01df..34f89c240 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -148,6 +148,30 @@ typedef enum { LOGIC_GANONS_CASTLE_KEYS, LOGIC_TREASURE_GAME_KEYS, LOGIC_SKELETON_KEY, + LOGIC_GUARD_HOUSE_KEY, + LOGIC_MARKET_BAZAAR_KEY, + LOGIC_MARKET_POTION_SHOP_KEY, + LOGIC_MASK_SHOP_KEY, + LOGIC_MARKET_SHOOTING_GALLERY_KEY, + LOGIC_BOMBCHU_BOWLING_KEY, + LOGIC_TREASURE_CHEST_GAME_BUILDING_KEY, + LOGIC_BOMBCHU_SHOP_KEY, + LOGIC_RICHARDS_HOUSE_KEY, + LOGIC_ALLEY_HOUSE_KEY, + LOGIC_KAK_BAZAAR_KEY, + LOGIC_KAK_POTION_SHOP_KEY, + LOGIC_BOSS_HOUSE_KEY, + LOGIC_GRANNYS_POTION_SHOP_KEY, + LOGIC_SKULLTULA_HOUSE_KEY, + LOGIC_IMPAS_HOUSE_KEY, + LOGIC_WINDMILL_KEY, + LOGIC_KAK_SHOOTING_GALLERY_KEY, + LOGIC_DAMPES_HUT_KEY, + LOGIC_TALONS_HOUSE_KEY, + LOGIC_STABLES_KEY, + LOGIC_BACK_TOWER_KEY, + LOGIC_HYLIA_LAB_KEY, + LOGIC_FISHING_HOLE_KEY, LOGIC_KOKIRI_EMERALD, LOGIC_GORON_RUBY, LOGIC_ZORA_SAPPHIRE, @@ -2799,6 +2823,7 @@ typedef enum { RC_HF_POND_STORMS_FAIRY, RC_HF_FENCE_GROTTO_STORMS_FAIRY, RC_DMT_FLAG_SUN_FAIRY, + RC_DMT_COW_GROTTO_STORMS_FAIRY, RC_LW_SHORTCUT_STORMS_FAIRY, RC_GF_KITCHEN_SUN_FAIRY, RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, @@ -3341,6 +3366,30 @@ typedef enum { RG_HOOKSHOT, RG_LONGSHOT, RG_SCARECROW, + RG_GUARD_HOUSE_KEY, + RG_MARKET_BAZAAR_KEY, + RG_MARKET_POTION_SHOP_KEY, + RG_MASK_SHOP_KEY, + RG_MARKET_SHOOTING_GALLERY_KEY, + RG_BOMBCHU_BOWLING_KEY, + RG_TREASURE_CHEST_GAME_BUILDING_KEY, + RG_BOMBCHU_SHOP_KEY, + RG_RICHARDS_HOUSE_KEY, + RG_ALLEY_HOUSE_KEY, + RG_KAK_BAZAAR_KEY, + RG_KAK_POTION_SHOP_KEY, + RG_BOSS_HOUSE_KEY, + RG_GRANNYS_POTION_SHOP_KEY, + RG_SKULLTULA_HOUSE_KEY, + RG_IMPAS_HOUSE_KEY, + RG_WINDMILL_KEY, + RG_KAK_SHOOTING_GALLERY_KEY, + RG_DAMPES_HUT_KEY, + RG_TALONS_HOUSE_KEY, + RG_STABLES_KEY, + RG_BACK_TOWER_KEY, + RG_HYLIA_LAB_KEY, + RG_FISHING_HOLE_KEY, // Logic Only RG_DISTANT_SCARECROW, RG_STICKS, @@ -3431,6 +3480,7 @@ typedef enum { RHT_CAN_BE_FOUND_AT, RHT_HOARDS, // Junk + RHT_JUNK01, RHT_JUNK02, RHT_JUNK03, RHT_JUNK04, @@ -3501,141 +3551,6 @@ typedef enum { RHT_JUNK69, RHT_JUNK70, RHT_JUNK71, - RHT_JUNK72, - RHT_JUNK73, - RHT_JUNK74, - RHT_JUNK75, - RHT_JUNK76, - RHT_JUNK77, - RHT_JUNK78, - RHT_JUNK79, - RHT_JUNK80, - RHT_JUNK81, - RHT_JUNK_WTC_1, - RHT_JUNK_WTC_2, - RHT_JUNK_WTC_3, - RHT_JUNK_WTC_4, - RHT_JUNK_WTC_5, - RHT_JUNK_WTC_6, - RHT_JUNK_WTC_7, - RHT_JUNK_WTC_8, - RHT_JUNK_WTC_9, - RHT_JUNK_WTC_10, - RHT_JUNK_WTC_11, - RHT_JUNK_WTC_12, - RHT_JUNK_SEI_1, - RHT_JUNK_SEI_2, - RHT_JUNK_SEI_3, - RHT_JUNK_SEI_4, - RHT_JUNK_SEI_5, - RHT_JUNK_SEI_6, - RHT_JUNK_SEI_7, - RHT_JUNK_SEI_8, - RHT_JUNK_SEI_9, - RHT_JUNK_SEI_10, - RHT_JUNK_SEI_11, - RHT_JUNK_SEI_12, - RHT_JUNK_SEI_13, - RHT_JUNK_SEI_14, - RHT_JUNK_SEI_15, - RHT_JUNK_SEI_16, - RHT_JUNK_SEI_17, - RHT_JUNK_SEI_18, - RHT_JUNK_SEI_19, - RHT_JUNK_SEI_20, - RHT_JUNK_SEI_21, - RHT_JUNK_SEI_22, - RHT_JUNK_SEI_23, - RHT_JUNK_SEI_24, - RHT_JUNK_SEI_25, - RHT_JUNK_SEI_26, - RHT_JUNK_SEI_27, - RHT_JUNK_SEI_28, - RHT_JUNK_SEI_29, - RHT_JUNK_OTR_MEANS_1, - RHT_JUNK_OTR_MEANS_2, - RHT_JUNK_OTR_MEANS_3, - RHT_JUNK_OTR_MEANS_4, - RHT_JUNK_OTR_MEANS_5, - RHT_JUNK_OTR_MEANS_6, - RHT_JUNK_OTR_MEANS_7, - RHT_JUNK_OTR_MEANS_8, - RHT_JUNK_OTR_MEANS_9, - RHT_JUNK_OTR_MEANS_10, - RHT_JUNK_OTR_MEANS_11, - RHT_JUNK_OTR_MEANS_12, - RHT_JUNK_OTR_MEANS_13, - RHT_JUNK_OTR_MEANS_14, - RHT_JUNK_OTR_MEANS_15, - RHT_JUNK_OTR_MEANS_16, - RHT_JUNK_OTR_MEANS_17, - RHT_JUNK_OTR_MEANS_18, - RHT_JUNK_OTR_MEANS_19, - RHT_JUNK_OTR_MEANS_20, - RHT_JUNK_OTR_MEANS_21, - RHT_JUNK_OTR_MEANS_22, - RHT_JUNK_OTR_MEANS_23, - RHT_JUNK_OTR_MEANS_24, - RHT_JUNK_OTR_MEANS_25, - RHT_JUNK_OTR_MEANS_26, - RHT_JUNK_OTR_MEANS_27, - RHT_JUNK_OTR_MEANS_28, - RHT_JUNK_OTR_MEANS_29, - RHT_JUNK_OTR_MEANS_30, - RHT_JUNK_MISC_1, - RHT_JUNK_MISC_2, - RHT_JUNK_MISC_3, - RHT_JUNK_MISC_4, - RHT_JUNK_MISC_5, - RHT_JUNK_MISC_6, - RHT_JUNK_MISC_7, - RHT_JUNK_MISC_8, - RHT_JUNK_MISC_9, - RHT_JUNK_MISC_10, - RHT_JUNK_MISC_11, - RHT_JUNK_MISC_12, - RHT_JUNK_MISC_13, - RHT_JUNK_MISC_14, - RHT_JUNK_MISC_15, - RHT_JUNK_MISC_16, - RHT_JUNK_MISC_17, - RHT_JUNK_SG_1, - RHT_JUNK_SG_2, - RHT_JUNK_SG_3, - RHT_JUNK_SG_4, - RHT_JUNK_SG_5, - RHT_JUNK_SG_6, - RHT_JUNK_SG_7, - RHT_JUNK_SG_8, - RHT_JUNK_CREW_1, - RHT_JUNK_CREW_2, - RHT_JUNK_CREW_3, - RHT_JUNK_CREW_4, - RHT_JUNK_CREW_5, - RHT_JUNK_CREW_6, - RHT_JUNK_CREW_7, - RHT_JUNK_CREW_8, - RHT_JUNK_CREW_9, - RHT_JUNK_CREW_10, - RHT_JUNK_CREW_11, - RHT_JUNK_CREW_12, - RHT_JUNK_CREW_13, - RHT_JUNK_CREW_14, - RHT_JUNK_CREW_15, - RHT_JUNK_CREW_16, - RHT_JUNK_CREW_17, - RHT_JUNK_CREW_18, - RHT_JUNK_CREW_19, - RHT_JUNK_CREW_20, - RHT_JUNK_CREW_21, - RHT_JUNK_CREW_22, - RHT_JUNK_CREW_23, - RHT_JUNK_CREW_24, - RHT_JUNK_CREW_25, - RHT_JUNK_CREW_26, - RHT_JUNK_CREW_27, - RHT_JUNK_CREW_28, - RHT_JUNK_CREW_29, // Locations RHT_LINKS_POCKET, RHT_QUEEN_GOHMA, @@ -4614,6 +4529,7 @@ typedef enum { RHT_FISHING_POLE, RHT_SKELETON_KEY, RHT_EPONA, + RHT_OVERWORLD_KEY, RHT_HINT_MYSTERIOUS, RHT_MYSTERIOUS_ITEM, RHT_MYSTERIOUS_ITEM_CAPITAL, @@ -4989,6 +4905,7 @@ typedef enum { RHT_HF_POND_STORMS_FAIRY, RHT_HF_FENCE_GROTTO_STORMS_FAIRY, RHT_DMT_FLAG_SUN_FAIRY, + RHT_DMT_COW_GROTTO_STORMS_FAIRY, RHT_LW_SHORTCUT_STORMS_FAIRY, RHT_GF_KITCHEN_SUN_FAIRY, RHT_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, @@ -5214,7 +5131,6 @@ typedef enum { RSK_SKIP_EPONA_RACE, RSK_COMPLETE_MASK_QUEST, RSK_SKIP_SCARECROWS_SONG, - RSK_ENABLE_GLITCH_CUTSCENES, RSK_SKULLS_SUNS_SONG, RSK_SHUFFLE_ADULT_TRADE, RSK_SHUFFLE_MERCHANTS, @@ -5300,6 +5216,7 @@ typedef enum { RSK_SHUFFLE_DEKU_NUT_BAG, RSK_SHUFFLE_FREESTANDING, RSK_SHUFFLE_FAIRIES, + RSK_LOCK_OVERWORLD_DOORS, RSK_MAX } RandomizerSettingKey; @@ -5657,7 +5574,6 @@ typedef enum { // Logic (glitchless/no logic) typedef enum { RO_LOGIC_GLITCHLESS, - RO_LOGIC_GLITCHED, RO_LOGIC_NO_LOGIC, RO_LOGIC_VANILLA, } RandoOptionLogic; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index c66c06fab..9daae088d 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -1249,6 +1249,7 @@ typedef enum { RAND_INF_LH_ISLAND_SUN_FAIRY, RAND_INF_HF_POND_STORMS_FAIRY, RAND_INF_DMT_FLAG_SUN_FAIRY, + RAND_INF_DMT_COW_GROTTO_STORMS_FAIRY, RAND_INF_HF_FENCE_GROTTO_STORMS_FAIRY, RAND_INF_LW_SHORTCUT_STORMS_FAIRY, RAND_INF_GF_KITCHEN_SUN_FAIRY, @@ -1272,6 +1273,56 @@ typedef enum { RAND_INF_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, + + RAND_INF_GUARD_HOUSE_UNLOCKED, + RAND_INF_GUARD_HOUSE_KEY_OBTAINED, + RAND_INF_MARKET_BAZAAR_UNLOCKED, + RAND_INF_MARKET_BAZAAR_KEY_OBTAINED, + RAND_INF_MARKET_POTION_SHOP_UNLOCKED, + RAND_INF_MARKET_POTION_SHOP_KEY_OBTAINED, + RAND_INF_MASK_SHOP_UNLOCKED, + RAND_INF_MASK_SHOP_KEY_OBTAINED, + RAND_INF_MARKET_SHOOTING_GALLERY_UNLOCKED, + RAND_INF_MARKET_SHOOTING_GALLERY_KEY_OBTAINED, + RAND_INF_BOMBCHU_BOWLING_UNLOCKED, + RAND_INF_BOMBCHU_BOWLING_KEY_OBTAINED, + RAND_INF_TREASURE_CHEST_GAME_BUILDING_UNLOCKED, + RAND_INF_TREASURE_CHEST_GAME_BUILDING_KEY_OBTAINED, + RAND_INF_BOMBCHU_SHOP_UNLOCKED, + RAND_INF_BOMBCHU_SHOP_KEY_OBTAINED, + RAND_INF_RICHARDS_HOUSE_UNLOCKED, + RAND_INF_RICHARDS_HOUSE_KEY_OBTAINED, + RAND_INF_ALLEY_HOUSE_UNLOCKED, + RAND_INF_ALLEY_HOUSE_KEY_OBTAINED, + RAND_INF_KAK_BAZAAR_UNLOCKED, + RAND_INF_KAK_BAZAAR_KEY_OBTAINED, + RAND_INF_KAK_POTION_SHOP_UNLOCKED, + RAND_INF_KAK_POTION_SHOP_KEY_OBTAINED, + RAND_INF_BOSS_HOUSE_UNLOCKED, + RAND_INF_BOSS_HOUSE_KEY_OBTAINED, + RAND_INF_GRANNYS_POTION_SHOP_UNLOCKED, + RAND_INF_GRANNYS_POTION_SHOP_KEY_OBTAINED, + RAND_INF_SKULLTULA_HOUSE_UNLOCKED, + RAND_INF_SKULLTULA_HOUSE_KEY_OBTAINED, + RAND_INF_IMPAS_HOUSE_UNLOCKED, + RAND_INF_IMPAS_HOUSE_KEY_OBTAINED, + RAND_INF_WINDMILL_UNLOCKED, + RAND_INF_WINDMILL_KEY_OBTAINED, + RAND_INF_KAK_SHOOTING_GALLERY_UNLOCKED, + RAND_INF_KAK_SHOOTING_GALLERY_KEY_OBTAINED, + RAND_INF_DAMPES_HUT_UNLOCKED, + RAND_INF_DAMPES_HUT_KEY_OBTAINED, + RAND_INF_TALONS_HOUSE_UNLOCKED, + RAND_INF_TALONS_HOUSE_KEY_OBTAINED, + RAND_INF_STABLES_UNLOCKED, + RAND_INF_STABLES_KEY_OBTAINED, + RAND_INF_BACK_TOWER_UNLOCKED, + RAND_INF_BACK_TOWER_KEY_OBTAINED, + RAND_INF_HYLIA_LAB_UNLOCKED, + RAND_INF_HYLIA_LAB_KEY_OBTAINED, + RAND_INF_FISHING_HOLE_UNLOCKED, + RAND_INF_FISHING_HOLE_KEY_OBTAINED, + // If you add anything to this list, you need to update the size of randomizerInf in z64save.h to be ceil(RAND_INF_MAX / 16) RAND_INF_MAX, diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index 2517923fd..0b96c4ab2 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -90,17 +90,15 @@ std::vector triforcePieces = { }; std::vector bossSoulItems = { - //Hack for right now, just gonna draw souls as bottles/big poes. - //Will replace with other macro once we have a custom texture - ITEM_TRACKER_ITEM_CUSTOM(RG_GOHMA_SOUL, ITEM_BIG_POE, ITEM_BOTTLE, 0, DrawItem ), - ITEM_TRACKER_ITEM_CUSTOM(RG_KING_DODONGO_SOUL, ITEM_BIG_POE, ITEM_BOTTLE, 0, DrawItem ), - ITEM_TRACKER_ITEM_CUSTOM(RG_BARINADE_SOUL, ITEM_BIG_POE, ITEM_BOTTLE, 0, DrawItem ), - ITEM_TRACKER_ITEM_CUSTOM(RG_PHANTOM_GANON_SOUL, ITEM_BIG_POE, ITEM_BOTTLE, 0, DrawItem ), - ITEM_TRACKER_ITEM_CUSTOM(RG_VOLVAGIA_SOUL, ITEM_BIG_POE, ITEM_BOTTLE, 0, DrawItem ), - ITEM_TRACKER_ITEM_CUSTOM(RG_MORPHA_SOUL, ITEM_BIG_POE, ITEM_BOTTLE, 0, DrawItem ), - ITEM_TRACKER_ITEM_CUSTOM(RG_BONGO_BONGO_SOUL, ITEM_BIG_POE, ITEM_BOTTLE, 0, DrawItem ), - ITEM_TRACKER_ITEM_CUSTOM(RG_TWINROVA_SOUL, ITEM_BIG_POE, ITEM_BOTTLE, 0, DrawItem ), - ITEM_TRACKER_ITEM_CUSTOM(RG_GANON_SOUL, ITEM_BIG_POE, ITEM_BOTTLE, 0, DrawItem ), + ITEM_TRACKER_ITEM(RG_GOHMA_SOUL, 0, DrawItem), + ITEM_TRACKER_ITEM(RG_KING_DODONGO_SOUL, 0, DrawItem ), + ITEM_TRACKER_ITEM(RG_BARINADE_SOUL, 0, DrawItem ), + ITEM_TRACKER_ITEM(RG_PHANTOM_GANON_SOUL, 0, DrawItem ), + ITEM_TRACKER_ITEM(RG_VOLVAGIA_SOUL, 0, DrawItem ), + ITEM_TRACKER_ITEM(RG_MORPHA_SOUL, 0, DrawItem ), + ITEM_TRACKER_ITEM(RG_BONGO_BONGO_SOUL, 0, DrawItem ), + ITEM_TRACKER_ITEM(RG_TWINROVA_SOUL, 0, DrawItem ), + ITEM_TRACKER_ITEM(RG_GANON_SOUL, 0, DrawItem ), }; std::vector ocarinaButtonItems = { diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index ef7cb0cd5..13acce622 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -110,6 +110,7 @@ void Settings::CreateOptions() { mOptions[RSK_DOOR_OF_TIME] = Option::U8("Door of Time", {"Closed", "Song only", "Open"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("DoorOfTime"), mOptionDescriptions[RSK_DOOR_OF_TIME], WidgetType::Combobox); mOptions[RSK_ZORAS_FOUNTAIN] = Option::U8("Zora's Fountain", {"Closed", "Closed as child", "Open"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ZorasFountain"), mOptionDescriptions[RSK_ZORAS_FOUNTAIN]); mOptions[RSK_SLEEPING_WATERFALL] = Option::U8("Sleeping Waterfall", {"Closed", "Open"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("SleepingWaterfall"), mOptionDescriptions[RSK_SLEEPING_WATERFALL]); + mOptions[RSK_LOCK_OVERWORLD_DOORS] = Option::Bool("Lock Overworld Doors", CVAR_RANDOMIZER_SETTING("LockOverworldDoors"), mOptionDescriptions[RSK_LOCK_OVERWORLD_DOORS]); mOptions[RSK_GERUDO_FORTRESS] = Option::U8("Fortress Carpenters", {"Normal", "Fast", "Free"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("FortressCarpenters"), mOptionDescriptions[RSK_GERUDO_FORTRESS]); mOptions[RSK_RAINBOW_BRIDGE] = Option::U8("Rainbow Bridge", {"Vanilla", "Always open", "Stones", "Medallions", "Dungeon rewards", "Dungeons", "Tokens", "Greg"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("RainbowBridge"), mOptionDescriptions[RSK_RAINBOW_BRIDGE], WidgetType::Combobox, RO_BRIDGE_VANILLA, false, IMFLAG_NONE); mOptions[RSK_RAINBOW_BRIDGE_STONE_COUNT] = Option::U8("Bridge Stone Count", {NumOpts(0, 4)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("StoneCount"), "", WidgetType::Slider, 3, true); @@ -249,6 +250,8 @@ void Settings::CreateOptions() { mOptions[RSK_KEYRINGS_BOTTOM_OF_THE_WELL] = Option::U8("Bottom of the Well Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsBottomOfTheWell"), "", WidgetType::TristateCheckbox, 0); mOptions[RSK_KEYRINGS_GTG] = Option::U8("Gerudo Training Ground Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsGTG"), "", WidgetType::TristateCheckbox, 0); mOptions[RSK_KEYRINGS_GANONS_CASTLE] = Option::U8("Ganon's Castle Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsGanonsCastle"), "", WidgetType::TristateCheckbox, 0); + //Dummied out due to redundancy with TimeSavers.SkipChildStealth until such a time that logic needs to consider child stealth e.g. because it's freestanding checks are added to freestanding shuffle. + //To undo this dummying, readd this setting to an OptionGroup so it appears in the UI, then edit the timesaver check hooks to look at this, and the timesaver setting to lock itself as needed. mOptions[RSK_SKIP_CHILD_STEALTH] = Option::Bool("Skip Child Stealth", {"Don't Skip", "Skip"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("SkipChildStealth"), mOptionDescriptions[RSK_SKIP_CHILD_STEALTH], WidgetType::Checkbox, RO_GENERIC_DONT_SKIP); mOptions[RSK_SKIP_CHILD_ZELDA] = Option::Bool("Skip Child Zelda", {"Don't Skip", "Skip"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("SkipChildZelda"), mOptionDescriptions[RSK_SKIP_CHILD_ZELDA], WidgetType::Checkbox, RO_GENERIC_DONT_SKIP); mOptions[RSK_SKIP_EPONA_RACE] = Option::Bool("Skip Epona Race", {"Don't Skip", "Skip"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("SkipEponaRace"), mOptionDescriptions[RSK_SKIP_EPONA_RACE], WidgetType::Checkbox, RO_GENERIC_DONT_SKIP); @@ -256,7 +259,6 @@ void Settings::CreateOptions() { mOptions[RSK_BIG_POE_COUNT] = Option::U8("Big Poe Target Count", {NumOpts(1, 10)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("BigPoeTargetCount"), mOptionDescriptions[RSK_BIG_POE_COUNT], WidgetType::Slider, 9); mOptions[RSK_CUCCO_COUNT] = Option::U8("Cuccos to return", {NumOpts(0, 7)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("CuccosToReturn"), mOptionDescriptions[RSK_CUCCO_COUNT], WidgetType::Slider, 7); mOptions[RSK_COMPLETE_MASK_QUEST] = Option::Bool("Complete Mask Quest", CVAR_RANDOMIZER_SETTING("CompleteMaskQuest"), mOptionDescriptions[RSK_COMPLETE_MASK_QUEST]); - mOptions[RSK_ENABLE_GLITCH_CUTSCENES] = Option::Bool("Enable Glitch-Useful Cutscenes", CVAR_RANDOMIZER_SETTING("EnableGlitchCutscenes"), mOptionDescriptions[RSK_ENABLE_GLITCH_CUTSCENES]); mOptions[RSK_GOSSIP_STONE_HINTS] = Option::U8("Gossip Stone Hints", {"No Hints", "Need Nothing", "Mask of Truth", "Stone of Agony"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("GossipStoneHints"), mOptionDescriptions[RSK_GOSSIP_STONE_HINTS], WidgetType::Combobox, RO_GOSSIP_STONES_NEED_NOTHING, false, IMFLAG_NONE); mOptions[RSK_HINT_CLARITY] = Option::U8("Hint Clarity", {"Obscure", "Ambiguous", "Clear"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("HintClarity"), mOptionDescriptions[RSK_HINT_CLARITY], WidgetType::Combobox, RO_HINT_CLARITY_CLEAR, true, IMFLAG_INDENT); mOptions[RSK_HINT_DISTRIBUTION] = Option::U8("Hint Distribution", {"Useless", "Balanced", "Strong", "Very Strong"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("HintDistribution"), mOptionDescriptions[RSK_HINT_DISTRIBUTION], WidgetType::Combobox, RO_HINT_DIST_BALANCED, true, IMFLAG_UNINDENT); @@ -315,7 +317,7 @@ void Settings::CreateOptions() { mOptions[RSK_STARTING_SKULLTULA_TOKEN] = Option::U8("Gold Skulltula Tokens", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("StartingSkulltulaToken"), "", WidgetType::Slider); mOptions[RSK_STARTING_HEARTS] = Option::U8("Starting Hearts", {NumOpts(1, 20)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("StartingHearts"), "", WidgetType::Slider, 2); // TODO: Remainder of Starting Items - mOptions[RSK_LOGIC_RULES] = Option::U8("Logic", {"Glitchless", "Glitched", "No Logic", "Vanilla"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("LogicRules"), mOptionDescriptions[RSK_LOGIC_RULES], WidgetType::Combobox, RO_LOGIC_GLITCHLESS); + mOptions[RSK_LOGIC_RULES] = Option::U8("Logic", {"Glitchless", "No Logic", "Vanilla"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("LogicRules"), mOptionDescriptions[RSK_LOGIC_RULES], WidgetType::Combobox, RO_LOGIC_GLITCHLESS); mOptions[RSK_ALL_LOCATIONS_REACHABLE] = Option::Bool("All Locations Reachable", {"Off", "On"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("AllLocationsReachable"), mOptionDescriptions[RSK_ALL_LOCATIONS_REACHABLE], WidgetType::Checkbox, RO_GENERIC_ON); mOptions[RSK_SKULLS_SUNS_SONG] = Option::Bool("Night Skulltula's Expect Sun's Song", CVAR_RANDOMIZER_SETTING("GsExpectSunsSong"), mOptionDescriptions[RSK_SKULLS_SUNS_SONG]); mOptions[RSK_DAMAGE_MULTIPLIER] = Option::U8("Damage Multiplier", {"x1/2", "x1", "x2", "x4", "x8", "x16", "OHKO"}, OptionCategory::Setting, "", "", WidgetType::Slider, RO_DAMAGE_MULTIPLIER_DEFAULT); @@ -551,6 +553,7 @@ void Settings::CreateOptions() { &mOptions[RSK_DOOR_OF_TIME], &mOptions[RSK_ZORAS_FOUNTAIN], &mOptions[RSK_SLEEPING_WATERFALL], + &mOptions[RSK_LOCK_OVERWORLD_DOORS], }, WidgetContainerType::COLUMN); mOptionGroups[RSG_WORLD_IMGUI] = OptionGroup::SubGroup("World Settings", { &mOptions[RSK_STARTING_AGE], @@ -703,7 +706,6 @@ void Settings::CreateOptions() { mOptionGroups[RSG_TIMESAVERS_IMGUI] = OptionGroup::SubGroup("Timesavers", { &mOptions[RSK_CUCCO_COUNT], &mOptions[RSK_BIG_POE_COUNT], - &mOptions[RSK_SKIP_CHILD_STEALTH], &mOptions[RSK_SKIP_CHILD_ZELDA], &mOptions[RSK_SKIP_EPONA_RACE], &mOptions[RSK_COMPLETE_MASK_QUEST], @@ -805,6 +807,7 @@ void Settings::CreateOptions() { &mOptions[RSK_DOOR_OF_TIME], &mOptions[RSK_ZORAS_FOUNTAIN], &mOptions[RSK_SLEEPING_WATERFALL], + &mOptions[RSK_LOCK_OVERWORLD_DOORS], &mOptions[RSK_GERUDO_FORTRESS], &mOptions[RSK_RAINBOW_BRIDGE], &mOptions[RSK_RAINBOW_BRIDGE_STONE_COUNT], @@ -976,14 +979,12 @@ void Settings::CreateOptions() { &mOptionGroups[RSG_STARTING_OTHER], }, OptionGroupType::DEFAULT); mOptionGroups[RSG_TIMESAVERS] = OptionGroup("Timesaver Settings", { - &mOptions[RSK_SKIP_CHILD_STEALTH], &mOptions[RSK_SKIP_CHILD_ZELDA], &mOptions[RSK_SKIP_EPONA_RACE], &mOptions[RSK_SKIP_SCARECROWS_SONG], &mOptions[RSK_BIG_POE_COUNT], &mOptions[RSK_CUCCO_COUNT], &mOptions[RSK_COMPLETE_MASK_QUEST], - &mOptions[RSK_ENABLE_GLITCH_CUTSCENES], }); mOptionGroups[RSG_MISC] = OptionGroup("Miscellaneous Settings", { &mOptions[RSK_GOSSIP_STONE_HINTS], diff --git a/soh/soh/ImGuiUtils.cpp b/soh/soh/ImGuiUtils.cpp index bfe1293d5..ebedf6b59 100644 --- a/soh/soh/ImGuiUtils.cpp +++ b/soh/soh/ImGuiUtils.cpp @@ -136,6 +136,18 @@ std::map triforcePieceMapping = { {RG_TRIFORCE_PIECE, {RG_TRIFORCE_PIECE, "RG_TRIFORCE_PIECE", "RG_TRIFORCE_PIECE_Faded", gTriforcePieceTex}} }; +std::map bossSoulMapping = { + { RG_GOHMA_SOUL, { RG_GOHMA_SOUL, "RG_GOHMA_SOUL", "RG_GOHMA_SOUL_Faded", gBossSoulTex } }, + { RG_KING_DODONGO_SOUL, { RG_KING_DODONGO_SOUL, "RG_KING_DODONGO_SOUL", "RG_KING_DODONGO_SOUL_Faded", gBossSoulTex } }, + { RG_BARINADE_SOUL, { RG_BARINADE_SOUL, "RG_BARINADE_SOUL", "RG_BARINADE_SOUL_Faded", gBossSoulTex } }, + { RG_PHANTOM_GANON_SOUL,{ RG_PHANTOM_GANON_SOUL,"RG_PHANTOM_GANON_SOUL","RG_PHANTOM_GANON_SOUL_Faded", gBossSoulTex } }, + { RG_VOLVAGIA_SOUL, { RG_VOLVAGIA_SOUL, "RG_VOLVAGIA_SOUL", "RG_VOLVAGIA_SOUL_Faded", gBossSoulTex } }, + { RG_MORPHA_SOUL, { RG_MORPHA_SOUL, "RG_MORPHA_SOUL", "RG_MORPHA_SOUL_Faded", gBossSoulTex } }, + { RG_BONGO_BONGO_SOUL, { RG_BONGO_BONGO_SOUL, "RG_BONGO_BONGO_SOUL", "RG_BONGO_BONGO_SOUL_Faded", gBossSoulTex } }, + { RG_TWINROVA_SOUL, { RG_TWINROVA_SOUL, "RG_TWINROVA_SOUL", "RG_TWINROVA_SOUL_Faded", gBossSoulTex } }, + { RG_GANON_SOUL, { RG_GANON_SOUL, "RG_GANON_SOUL", "RG_GANON_SOUL_Faded", gBossSoulTex } }, +}; + std::map questMapping = { QUEST_MAP_ENTRY(QUEST_MEDALLION_FOREST, dgQuestIconMedallionForestTex), QUEST_MAP_ENTRY(QUEST_MEDALLION_FIRE, dgQuestIconMedallionFireTex), @@ -208,6 +220,11 @@ void RegisterImGuiItemIcons() { Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture(entry.second.nameFaded, entry.second.texturePath, ImVec4(1, 1, 1, 0.3f)); } + for (const auto& entry : bossSoulMapping) { + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture(entry.second.name, entry.second.texturePath, ImVec4(1, 1, 1, 1)); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture(entry.second.nameFaded, entry.second.texturePath, ImVec4(1, 1, 1, 0.3f)); + } + for (const auto& entry : questMapping) { Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture(entry.second.name, entry.second.texturePath, ImVec4(1, 1, 1, 1)); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture(entry.second.nameFaded, entry.second.texturePath, ImVec4(1, 1, 1, 0.3f)); diff --git a/soh/soh/SohMenuBar.cpp b/soh/soh/SohMenuBar.cpp index a9cc2b171..cb954f43c 100644 --- a/soh/soh/SohMenuBar.cpp +++ b/soh/soh/SohMenuBar.cpp @@ -784,7 +784,9 @@ void DrawEnhancementsMenu() { UIWidgets::Tooltip("The default response to Kaepora Gaebora is always that you understood what he said"); UIWidgets::PaddedEnhancementCheckbox("Exit Market at Night", CVAR_ENHANCEMENT("MarketSneak"), true, false); UIWidgets::Tooltip("Allows exiting Hyrule Castle Market Town to Hyrule Field at night by speaking to the guard next to the gate."); - UIWidgets::PaddedEnhancementCheckbox("Shops and Games Always Open", CVAR_ENHANCEMENT("OpenAllHours"), true, false); + bool randoLockedOverworldDoors = IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LOCK_OVERWORLD_DOORS); + UIWidgets::PaddedEnhancementCheckbox("Shops and Games Always Open", CVAR_ENHANCEMENT("OpenAllHours"), true, false, randoLockedOverworldDoors, + "This is not compatible with the Locked Overworld Doors Randomizer option", UIWidgets::CheckboxGraphics::Checkmark); UIWidgets::Tooltip("Shops and minigames are open both day and night. Requires scene reload to take effect."); UIWidgets::PaddedEnhancementCheckbox("Link as default file name", CVAR_ENHANCEMENT("LinkDefaultName"), true, false); UIWidgets::Tooltip("Allows you to have \"Link\" as a premade file name"); diff --git a/soh/soh/config/ConfigMigrators.h b/soh/soh/config/ConfigMigrators.h index abfe9a6b1..48e1e708b 100644 --- a/soh/soh/config/ConfigMigrators.h +++ b/soh/soh/config/ConfigMigrators.h @@ -1319,7 +1319,6 @@ namespace SOH { { MigrationAction::Rename, "gRandomizeDoorOfTime", "gRandoSettings.DoorOfTime" }, { MigrationAction::Rename, "gRandomizeDungeonCount", "gRandoSettings.DungeonCount" }, { MigrationAction::Rename, "gRandomizeEnableBombchuDrops", "gRandoSettings.EnableBombchuDrops" }, - { MigrationAction::Rename, "gRandomizeEnableGlitchCutscenes", "gRandoSettings.EnableGlitchCutscenes" }, { MigrationAction::Rename, "gRandomizeEnabledTricks", "gRandoSettings.EnabledTricks" }, { MigrationAction::Rename, "gRandomizeForest", "gRandoSettings.ClosedForest" }, { MigrationAction::Rename, "gRandomizeFrogsHint", "gRandoSettings.FrogsHint" }, diff --git a/soh/src/code/z_en_item00.c b/soh/src/code/z_en_item00.c index 40a8ccbaa..ecdf89316 100644 --- a/soh/src/code/z_en_item00.c +++ b/soh/src/code/z_en_item00.c @@ -1197,24 +1197,6 @@ void EnItem00_CustomItemsParticles(Actor* Parent, PlayState* play, GetItemEntry switch (giEntry.drawModIndex) { case MOD_NONE: switch (giEntry.drawItemId) { - case ITEM_SONG_MINUET: - colorIndex = PARTICLE_BRIGHT_GREEN; - break; - case ITEM_SONG_BOLERO: - colorIndex = PARTICLE_RED; - break; - case ITEM_SONG_SERENADE: - colorIndex = PARTICLE_CYAN; - break; - case ITEM_SONG_REQUIEM: - colorIndex = PARTICLE_ORANGE; - break; - case ITEM_SONG_NOCTURNE: - colorIndex = PARTICLE_VIOLET; - break; - case ITEM_SONG_PRELUDE: - colorIndex = PARTICLE_YELLOW; - break; case ITEM_STICK_UPGRADE_20: case ITEM_STICK_UPGRADE_30: colorIndex = PARTICLE_GREEN; @@ -1234,6 +1216,7 @@ void EnItem00_CustomItemsParticles(Actor* Parent, PlayState* play, GetItemEntry break; case MOD_RANDOMIZER: switch (giEntry.drawItemId) { + case RG_MINUET_OF_FOREST: case RG_MAGIC_SINGLE: case RG_MAGIC_DOUBLE: case RG_MAGIC_BEAN_PACK: @@ -1242,19 +1225,30 @@ void EnItem00_CustomItemsParticles(Actor* Parent, PlayState* play, GetItemEntry case RG_GREG_RUPEE: colorIndex = PARTICLE_BRIGHT_GREEN; break; + case RG_BOLERO_OF_FIRE: + colorIndex = PARTICLE_RED; + break; + case RG_SERENADE_OF_WATER: case RG_BOTTLE_WITH_FISH: colorIndex = PARTICLE_CYAN; break; + case RG_REQUIEM_OF_SPIRIT: + colorIndex = PARTICLE_ORANGE; + break; + case RG_NOCTURNE_OF_SHADOW: case RG_BOTTLE_WITH_POE: colorIndex = PARTICLE_VIOLET; break; + case RG_PRELUDE_OF_LIGHT: case RG_BOTTLE_WITH_BIG_POE: colorIndex = PARTICLE_YELLOW; break; case RG_DEKU_STICK_BAG: + case RG_STICK_UPGRADE_INF: colorIndex = PARTICLE_GREEN; break; case RG_DEKU_NUT_BAG: + case RG_NUT_UPGRADE_INF: colorIndex = PARTICLE_GOLD; break; case RG_DOUBLE_DEFENSE: diff --git a/soh/src/overlays/actors/ovl_En_Door/z_en_door.c b/soh/src/overlays/actors/ovl_En_Door/z_en_door.c index 99ce9729f..8208881d2 100644 --- a/soh/src/overlays/actors/ovl_En_Door/z_en_door.c +++ b/soh/src/overlays/actors/ovl_En_Door/z_en_door.c @@ -11,6 +11,7 @@ #include "objects/object_mizu_objects/object_mizu_objects.h" #include "objects/object_haka_door/object_haka_door.h" #include "soh/ResourceManagerHelpers.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED @@ -162,7 +163,7 @@ void EnDoor_SetupType(EnDoor* this, PlayState* play) { } this->actor.world.rot.y = 0x0000; if (doorType == DOOR_LOCKED) { - if (!Flags_GetSwitch(play, this->actor.params & 0x3F)) { + if (GameInteractor_Should(VB_DOOR_BE_LOCKED, !Flags_GetSwitch(play, this->actor.params & 0x3F), this)) { this->lockTimer = 10; } } else if (doorType == DOOR_AJAR) { @@ -201,8 +202,10 @@ void EnDoor_Idle(EnDoor* this, PlayState* play) { Animation_PlayOnceSetSpeed(&this->skelAnime, D_809FCECC[this->animStyle], (player->stateFlags1 & PLAYER_STATE1_IN_WATER) ? 0.75f : 1.5f); if (this->lockTimer != 0) { - gSaveContext.inventory.dungeonKeys[gSaveContext.mapIndex]--; - Flags_SetSwitch(play, this->actor.params & 0x3F); + if (GameInteractor_Should(VB_CONSUME_SMALL_KEY, true, this)) { + gSaveContext.inventory.dungeonKeys[gSaveContext.mapIndex]--; + Flags_SetSwitch(play, this->actor.params & 0x3F); + } Audio_PlayActorSound2(&this->actor, NA_SE_EV_CHAIN_KEY_UNLOCK); } } else if (!Player_InCsMode(play)) { @@ -214,7 +217,7 @@ void EnDoor_Idle(EnDoor* this, PlayState* play) { } if (ABS(phi_v0) < 0x3000) { if (this->lockTimer != 0) { - if (gSaveContext.inventory.dungeonKeys[gSaveContext.mapIndex] <= 0) { + if (GameInteractor_Should(VB_NOT_HAVE_SMALL_KEY, gSaveContext.inventory.dungeonKeys[gSaveContext.mapIndex] <= 0, this)) { Player* player2 = GET_PLAYER(play); player2->naviTextId = -0x203; diff --git a/soh/src/overlays/actors/ovl_En_Door/z_en_door.h b/soh/src/overlays/actors/ovl_En_Door/z_en_door.h index 4e7ef1279..a21047d74 100644 --- a/soh/src/overlays/actors/ovl_En_Door/z_en_door.h +++ b/soh/src/overlays/actors/ovl_En_Door/z_en_door.h @@ -55,6 +55,9 @@ typedef struct EnDoor { /* 0x0198 */ Vec3s jointTable[5]; /* 0x01B6 */ Vec3s morphTable[5]; /* 0x01D4 */ EnDoorActionFunc actionFunc; + // #region SOH [Randomizer] + /* */ RandomizerInf randomizerInf; + // #endregion } EnDoor; // size = 0x01D8 #ifdef __cplusplus 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 7b1454aaf..97a57caeb 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -5418,7 +5418,7 @@ s32 Player_ActionHandler_1(Player* this, PlayState* play) { this->stateFlags1 |= PLAYER_STATE1_IN_CUTSCENE; Actor_DisableLens(play); - if (((doorActor->params >> 7) & 7) == 3) { + if (GameInteractor_Should(VB_DOOR_PLAY_SCENE_TRANSITION, ((doorActor->params >> 7) & 7) == 3, doorActor)) { checkPos.x = doorActor->world.pos.x - (sp6C * sp74); checkPos.y = doorActor->world.pos.y + 10.0f; checkPos.z = doorActor->world.pos.z - (sp6C * sp78);