diff --git a/soh/include/z64save.h b/soh/include/z64save.h index 00417ae75..e4aeb4e31 100644 --- a/soh/include/z64save.h +++ b/soh/include/z64save.h @@ -307,13 +307,16 @@ typedef struct { /* */ char gregHintText[250]; /* */ char ganonText[250]; /* */ char dampeText[150]; + /* */ char sheikText[150]; + /* */ char sariaText[150]; /* */ char warpMinuetText[100]; /* */ char warpBoleroText[100]; /* */ char warpSerenadeText[100]; /* */ char warpRequiemText[100]; /* */ char warpNocturneText[100]; /* */ char warpPreludeText[100]; - /* */ RandomizerCheck ganonHintCheck; + /* */ RandomizerCheck lightArrowHintCheck; + /* */ RandomizerCheck sariaCheck; /* */ RandomizerCheck gregCheck; /* */ RandomizerCheck dampeCheck; /* */ char inputSeed[1024]; diff --git a/soh/soh/Enhancements/custom-message/CustomMessageTypes.h b/soh/soh/Enhancements/custom-message/CustomMessageTypes.h index 3f5f2454a..4ce0db90a 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageTypes.h +++ b/soh/soh/Enhancements/custom-message/CustomMessageTypes.h @@ -2,6 +2,10 @@ typedef enum { TEXT_CURSED_SKULLTULA_PEOPLE = 0x22, + TEXT_SARIAS_SONG_FACE_TO_FACE= 0x160, + TEXT_SARIAS_SONG_FOREST_SOUNDS = 0x161, + TEXT_SARIAS_SONG_FOREST_TEMPLE = 0x16A, + TEXT_SARIA_SFM = 0x10AD, TEXT_ITEM_KEY_SMALL = 0x60, TEXT_ITEM_DUNGEON_MAP = 0x66, TEXT_ITEM_COMPASS = 0x67, @@ -27,12 +31,15 @@ typedef enum { TEXT_RED_RUPEE = 0xF0, TEXT_PURPLE_RUPEE = 0xF1, TEXT_HUGE_RUPEE = 0xF2, + TEXT_FROGS_UNDERWATER = 0x22E, TEXT_BEAN_SALESMAN = 0x405E, TEXT_MEDIGORON = 0x304C, TEXT_GRANNYS_SHOP = 0x500C, TEXT_CARPET_SALESMAN_1 = 0x6077, TEXT_CARPET_SALESMAN_2 = 0x6078, TEXT_MARKET_GUARD_NIGHT = 0x7003, + TEXT_SHEIK_NEED_HOOK = 0x700F, + TEXT_SHEIK_HAVE_HOOK = 0x7010, TEXT_SCRUB_RANDOM = 0x9000, TEXT_SCRUB_RANDOM_FREE = 0x9001, TEXT_SHOP_ITEM_RANDOM = 0x9100, diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index 2c647d80d..6fc3b35b2 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -1,7 +1,6 @@ #include "mods.h" #include #include "game-interactor/GameInteractor.h" -#include "soh/Enhancements/randomizer/3drando/random.hpp" #include "tts/tts.h" #include "soh/Enhancements/boss-rush/BossRushTypes.h" #include "soh/Enhancements/enhancementTypes.h" @@ -21,6 +20,7 @@ #include "src/overlays/actors/ovl_En_Poh/z_en_poh.h" #include "src/overlays/actors/ovl_En_Tp/z_en_tp.h" #include "src/overlays/actors/ovl_En_Firefly/z_en_firefly.h" +#include "src/overlays/actors/ovl_En_Xc/z_en_xc.h" extern "C" { #include @@ -952,6 +952,28 @@ void RegisterAltTrapTypes() { }); } +void RegisterRandomizerSheikSpawn() { + GameInteractor::Instance->RegisterGameHook([]() { + if (!gPlayState) return; + bool canSheik = (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIAL_COUNT) != RO_GANONS_TRIALS_SKIP && + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LIGHT_ARROWS_HINT)); + if (!gSaveContext.n64ddFlag || !LINK_IS_ADULT || !canSheik) return; + switch (gPlayState->sceneNum) { + case SCENE_TEMPLE_OF_TIME: + if (gPlayState->roomCtx.curRoom.num == 1) { + Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_XC, -104, -40, 2382, 0, 0x8000, 0, SHEIK_TYPE_RANDO, false); + } + break; + case SCENE_INSIDE_GANONS_CASTLE: + if (gPlayState->roomCtx.curRoom.num == 1){ + Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_XC, 101, 150, 137, 0, 0, 0, SHEIK_TYPE_RANDO, false); + } + break; + default: break; + } + }); +} + void InitMods() { RegisterTTS(); RegisterInfiniteMoney(); @@ -976,5 +998,6 @@ void InitMods() { RegisterMirrorModeHandler(); RegisterEnemyDefeatCounts(); RegisterAltTrapTypes(); + RegisterRandomizerSheikSpawn(); NameTag_RegisterHooks(); } diff --git a/soh/soh/Enhancements/randomizer/3drando/fill.cpp b/soh/soh/Enhancements/randomizer/3drando/fill.cpp index 49edb182a..f9d3a9592 100644 --- a/soh/soh/Enhancements/randomizer/3drando/fill.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/fill.cpp @@ -1083,6 +1083,8 @@ int Fill() { CreateAltarText(); CreateDampesDiaryText(); CreateGregRupeeHint(); + CreateSheikText(); + CreateSariaText(); CreateWarpSongTexts(); return 1; } diff --git a/soh/soh/Enhancements/randomizer/3drando/hints.cpp b/soh/soh/Enhancements/randomizer/3drando/hints.cpp index 59a6dd454..0bae15676 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hints.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hints.cpp @@ -132,6 +132,8 @@ Text childAltarText; Text adultAltarText; Text ganonText; Text ganonHintText; +Text sheikText; +Text sariaText; Text dampesText; Text gregText; Text warpMinuetText; @@ -141,7 +143,8 @@ Text warpRequiemText; Text warpNocturneText; Text warpPreludeText; -std::string ganonHintLoc; +std::string lightArrowHintLoc; +std::string sariaHintLoc; std::string dampeHintLoc; Text& GetChildAltarText() { @@ -168,6 +171,14 @@ Text& GetGregHintText() { return gregText; } +Text& GetSheikHintText() { + return sheikText; +} + +Text& GetSariaHintText() { + return sariaText; +} + Text& GetWarpMinuetText() { return warpMinuetText; } @@ -192,14 +203,18 @@ Text& GetWarpPreludeText() { return warpPreludeText; } -std::string GetGanonHintLoc() { - return ganonHintLoc; +std::string GetLightArrowHintLoc() { + return lightArrowHintLoc; } std::string GetDampeHintLoc() { return dampeHintLoc; } +std::string GetSariaHintLoc() { + return sariaHintLoc; +} + Area* GetHintRegion(const uint32_t area) { std::vector alreadyChecked = {}; @@ -583,10 +598,10 @@ void CreateGanonText() { auto hint = Hint(LIGHT_ARROW_LOCATION_HINT); if (lightArrowLocation.empty()) { ganonHintText = hint.GetText()+Hint(YOUR_POCKET).GetText(); - ganonHintLoc = "Link's Pocket"; + lightArrowHintLoc = "Link's Pocket"; } else { ganonHintText = hint.GetText()+GetHintRegion(Location(lightArrowLocation[0])->GetParentRegionKey())->GetHint().GetText(); - ganonHintLoc = Location(lightArrowLocation[0])->GetName(); + lightArrowHintLoc = Location(lightArrowLocation[0])->GetName(); } ganonHintText = ganonHintText + "!"; @@ -820,19 +835,52 @@ void CreateGregRupeeHint() { Text temp1 = Text{ "By the way, if you're interested, I saw the shiniest %gGreen Rupee%w somewhere in%g ", - "", + "Au fait, si ça t'intéresse, j'ai aperçu le plus éclatant des %gRubis Verts%w quelque part à %g", "" }; Text temp2 = { "%w.^It's said to have %rmysterious powers%w...^But then, it could just be another regular rupee.&Oh well.", - "", + "%w. On dit qu'il possède des pouvoirs mystérieux... Mais bon, ça pourrait juste être un autre rubis ordinaire.", "" }; gregText = temp1 + area + temp2; } +void CreateSheikText() { + //Get the location of the light arrows + auto lightArrowLocation = FilterFromPool(allLocations, [](const uint32_t loc){return Location(loc)->GetPlaceduint32_t() == LIGHT_ARROWS;}); + lightArrowHintLoc = Location(lightArrowLocation[0])->GetName(); + Text area = GetHintRegion(Location(lightArrowLocation[0])->GetParentRegionKey())->GetHint().GetText(); + Text temp1 = Text{ + "I overheard Ganondorf say that he misplaced the %rLight Arrows%w in&%g", + "J'ai entendu dire que Ganondorf aurait caché les %rFlèches de Lumière%w dans %g", + "" + }; + Text temp2 = Text{"%w.", "%w.", "%w."}; + sheikText = temp1 + area + temp2; +} + +void CreateSariaText() { + //Get the location of the light arrows + auto magicLocation = FilterFromPool(allLocations, [](const uint32_t loc){return Location(loc)->GetPlaceduint32_t() == PROGRESSIVE_MAGIC_METER;}); + sariaHintLoc = Location(magicLocation[0])->GetName(); + Text area = GetHintRegion(Location(magicLocation[0])->GetParentRegionKey())->GetHint().GetText(); + Text temp1 = Text{ + "Did you feel the %gsurge of magic%w recently? A mysterious bird told me it came from %g", + "As-tu récemment ressenti une vague de %gpuissance magique%w? Un mystérieux hibou m'a dit qu'elle provenait du %g", + "" + }; + Text temp2 = Text{ + "%w.^You should check that place out, @!$C", + "%w. Tu devrais aller y jeter un coup d'oeil, @!$C", + "%w.$C" + }; + sariaText = temp1 + area + temp2; +} + + void CreateWarpSongTexts() { if (!ShuffleWarpSongs) { warpMinuetText = Text(); diff --git a/soh/soh/Enhancements/randomizer/3drando/hints.hpp b/soh/soh/Enhancements/randomizer/3drando/hints.hpp index ccf949975..83985c0da 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hints.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/hints.hpp @@ -206,6 +206,8 @@ extern void CreateMerchantsHints(); extern void CreateWarpSongTexts(); extern void CreateDampesDiaryText(); extern void CreateGregRupeeHint(); +extern void CreateSheikText(); +extern void CreateSariaText(); extern void CreateGanonText(); extern void CreateAltarText(); @@ -215,6 +217,8 @@ Text& GetGanonText(); Text& GetGanonHintText(); Text& GetDampeHintText(); Text& GetGregHintText(); +Text& GetSheikHintText(); +Text& GetSariaHintText(); Text& GetWarpMinuetText(); Text& GetWarpBoleroText(); @@ -224,4 +228,5 @@ Text& GetWarpNocturneText(); Text& GetWarpPreludeText(); std::string GetDampeHintLoc(); -std::string GetGanonHintLoc(); +std::string GetLightArrowHintLoc(); +std::string GetSariaHintLoc(); diff --git a/soh/soh/Enhancements/randomizer/3drando/settings.cpp b/soh/soh/Enhancements/randomizer/3drando/settings.cpp index 210affdc2..286f249fc 100644 --- a/soh/soh/Enhancements/randomizer/3drando/settings.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/settings.cpp @@ -316,10 +316,12 @@ namespace Settings { Option ClearerHints = Option::U8 ("Hint Clarity", {"Obscure", "Ambiguous", "Clear"}); Option HintDistribution = Option::U8 ("Hint Distribution", {"Useless", "Balanced", "Strong", "Very Strong"}, OptionCategory::Setting, 1); // Balanced Option AltarHintText = Option::Bool("ToT Altar Hint", {"Off", "On"}, OptionCategory::Setting, 1); - Option GanondorfHintText = Option::Bool("Ganondorf LA Hint", {"Off", "On"}, OptionCategory::Setting, 1); + Option LightArrowHintText = Option::Bool("Light Arrow Hint", {"Off", "On"}, OptionCategory::Setting, 1); Option DampeHintText = Option::Bool("Dampe's Diary Hint", {"Off", "On"}, OptionCategory::Setting, 0); Option GregHintText = Option::Bool("Greg the Rupee Hint", {"Off", "On"}, OptionCategory::Setting, 0); - Option WarpSongHints = Option::Bool("Warp Song Hints", {"Off", "On"}, OptionCategory::Setting, 0); + Option SariaHintText = Option::Bool("Saria's Hint", {"Off", "On"}, OptionCategory::Setting, 0); + Option FrogsHintText = Option::Bool("Frog Ocarina Game Hint", {"Off", "On"}, OptionCategory::Setting, 0); + Option WarpSongHints = Option::Bool("Warp Songs Hints", {"Off", "On"}, OptionCategory::Setting, 0); Option Kak10GSHintText = Option::Bool("10 GS Hint", {"Off", "On"}, OptionCategory::Setting, 0); Option Kak20GSHintText = Option::Bool("20 GS Hint", {"Off", "On"}, OptionCategory::Setting, 0); Option Kak30GSHintText = Option::Bool("30 GS Hint", {"Off", "On"}, OptionCategory::Setting, 0); @@ -338,15 +340,18 @@ namespace Settings { Option RandomTrapDmg = Option::U8 ("Random Trap Damage", {"Off", "Basic", "Advanced"}, OptionCategory::Setting, 1); // Basic Option BlueFireArrows = Option::Bool("Blue Fire Arrows", {"Off", "On"}); Option SunlightArrows = Option::Bool("Sunlight Arrows", {"Off", "On"}); + bool HasNightStart = false; std::vector