Skip to content

Commit

Permalink
Rando: More Misc. Hints (#2930)
Browse files Browse the repository at this point in the history
* commit constipation

* fix inconsistencies between 3d and soh settings

* Add RSK check for Saria; Sheik now tells you other reqs for ganon

* Translations (thanks Purple and Timmy_GamerNepgear);
Retain Saria's "face-to-face" text in rando if you're too close

* fix scene renames for sheik

* whoops

* Undo LA hint setting erasure from conflict

* Clarified Sheik text IDs; Clarified final frogs hint

* Fixed Sheik text ID assignment; Fixed Saria's messages in `OTRGlobals`

* Added hint locs for sheik and saria

* Set up hook for Sheik spawn;
Sheik no longer cheats with room transitions;
Enforced text IDs on saria msg function

* Set up hook for Sheik spawn;
Sheik no longer cheats with room transitions;
Enforced text IDs on saria msg function

* Update soh/soh/SaveManager.cpp

Co-authored-by: Garrett Cox <garrettjcox@gmail.com>

* nice.gif

Co-authored-by: Garrett Cox <garrettjcox@gmail.com>

* got ahead of myself

* Conquered and divided; simplified stuff

* nitpicking

Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com>

* Apply suggestions from code review

Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com>

* the little things i stg

---------

Co-authored-by: Garrett Cox <garrettjcox@gmail.com>
Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com>
  • Loading branch information
3 people authored Sep 19, 2023
1 parent 18e21e1 commit c3a1eb2
Show file tree
Hide file tree
Showing 18 changed files with 320 additions and 32 deletions.
5 changes: 4 additions & 1 deletion soh/include/z64save.h
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand Down
7 changes: 7 additions & 0 deletions soh/soh/Enhancements/custom-message/CustomMessageTypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
Expand Down
25 changes: 24 additions & 1 deletion soh/soh/Enhancements/mods.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
#include "mods.h"
#include <libultraship/bridge.h>
#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"
Expand All @@ -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 <z64.h>
Expand Down Expand Up @@ -952,6 +952,28 @@ void RegisterAltTrapTypes() {
});
}

void RegisterRandomizerSheikSpawn() {
GameInteractor::Instance->RegisterGameHook<GameInteractor::OnSceneSpawnActors>([]() {
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();
Expand All @@ -976,5 +998,6 @@ void InitMods() {
RegisterMirrorModeHandler();
RegisterEnemyDefeatCounts();
RegisterAltTrapTypes();
RegisterRandomizerSheikSpawn();
NameTag_RegisterHooks();
}
2 changes: 2 additions & 0 deletions soh/soh/Enhancements/randomizer/3drando/fill.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1083,6 +1083,8 @@ int Fill() {
CreateAltarText();
CreateDampesDiaryText();
CreateGregRupeeHint();
CreateSheikText();
CreateSariaText();
CreateWarpSongTexts();
return 1;
}
Expand Down
62 changes: 55 additions & 7 deletions soh/soh/Enhancements/randomizer/3drando/hints.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,8 @@ Text childAltarText;
Text adultAltarText;
Text ganonText;
Text ganonHintText;
Text sheikText;
Text sariaText;
Text dampesText;
Text gregText;
Text warpMinuetText;
Expand All @@ -141,7 +143,8 @@ Text warpRequiemText;
Text warpNocturneText;
Text warpPreludeText;

std::string ganonHintLoc;
std::string lightArrowHintLoc;
std::string sariaHintLoc;
std::string dampeHintLoc;

Text& GetChildAltarText() {
Expand All @@ -168,6 +171,14 @@ Text& GetGregHintText() {
return gregText;
}

Text& GetSheikHintText() {
return sheikText;
}

Text& GetSariaHintText() {
return sariaText;
}

Text& GetWarpMinuetText() {
return warpMinuetText;
}
Expand All @@ -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<uint32_t> alreadyChecked = {};
Expand Down Expand Up @@ -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 + "!";

Expand Down Expand Up @@ -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();
Expand Down
7 changes: 6 additions & 1 deletion soh/soh/Enhancements/randomizer/3drando/hints.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand All @@ -215,6 +217,8 @@ Text& GetGanonText();
Text& GetGanonHintText();
Text& GetDampeHintText();
Text& GetGregHintText();
Text& GetSheikHintText();
Text& GetSariaHintText();

Text& GetWarpMinuetText();
Text& GetWarpBoleroText();
Expand All @@ -224,4 +228,5 @@ Text& GetWarpNocturneText();
Text& GetWarpPreludeText();

std::string GetDampeHintLoc();
std::string GetGanonHintLoc();
std::string GetLightArrowHintLoc();
std::string GetSariaHintLoc();
15 changes: 11 additions & 4 deletions soh/soh/Enhancements/randomizer/3drando/settings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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<Option *> miscOptions = {
&GossipStoneHints,
&ClearerHints,
&HintDistribution,
&AltarHintText,
&GanondorfHintText,
&LightArrowHintText,
&DampeHintText,
&GregHintText,
&SariaHintText,
&FrogsHintText,
&WarpSongHints,
&Kak10GSHintText,
&Kak20GSHintText,
Expand Down Expand Up @@ -2338,9 +2343,11 @@ namespace Settings {
GossipStoneHints.SetSelectedIndex(cvarSettings[RSK_GOSSIP_STONE_HINTS]);
ClearerHints.SetSelectedIndex(cvarSettings[RSK_HINT_CLARITY]);
AltarHintText.SetSelectedIndex(cvarSettings[RSK_TOT_ALTAR_HINT]);
GanondorfHintText.SetSelectedIndex(cvarSettings[RSK_GANONDORF_LIGHT_ARROWS_HINT]);
LightArrowHintText.SetSelectedIndex(cvarSettings[RSK_LIGHT_ARROWS_HINT]);
DampeHintText.SetSelectedIndex(cvarSettings[RSK_DAMPES_DIARY_HINT]);
GregHintText.SetSelectedIndex(cvarSettings[RSK_GREG_HINT]);
SariaHintText.SetSelectedIndex(cvarSettings[RSK_SARIA_HINT]);
FrogsHintText.SetSelectedIndex(cvarSettings[RSK_FROGS_HINT]);
WarpSongHints.SetSelectedIndex(cvarSettings[RSK_WARP_SONG_HINTS]);
Kak10GSHintText.SetSelectedIndex(cvarSettings[RSK_KAK_10_SKULLS_HINT]);
Kak20GSHintText.SetSelectedIndex(cvarSettings[RSK_KAK_20_SKULLS_HINT]);
Expand Down
2 changes: 1 addition & 1 deletion soh/soh/Enhancements/randomizer/3drando/settings.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -848,7 +848,7 @@ void UpdateSettings(std::unordered_map<RandomizerSettingKey, uint8_t> cvarSettin
extern Option ClearerHints;
extern Option HintDistribution;
extern Option AltarHintText;
extern Option GanondorfHintText;
extern Option LightArrowHintText;
extern Option DampeHintText;
extern Option GregHintText;
extern Option Kak10GSHintText;
Expand Down
13 changes: 12 additions & 1 deletion soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -670,6 +670,8 @@ static void WriteHints(int language) {
std::string unformattedGanonHintText;
std::string unformattedDampesText;
std::string unformattedGregText;
std::string unformattedSheikText;
std::string unformattedSariaText;

switch (language) {
case 0:
Expand All @@ -678,6 +680,8 @@ static void WriteHints(int language) {
unformattedGanonHintText = GetGanonHintText().GetEnglish();
unformattedDampesText = GetDampeHintText().GetEnglish();
unformattedGregText = GetGregHintText().GetEnglish();
unformattedSheikText = GetSheikHintText().GetEnglish();
unformattedSariaText = GetSariaHintText().GetEnglish();
jsonData["warpMinuetText"] = GetWarpMinuetText().GetEnglish();
jsonData["warpBoleroText"] = GetWarpBoleroText().GetEnglish();
jsonData["warpSerenadeText"] = GetWarpSerenadeText().GetEnglish();
Expand All @@ -692,6 +696,8 @@ static void WriteHints(int language) {
unformattedGanonHintText = GetGanonHintText().GetFrench();
unformattedDampesText = GetDampeHintText().GetFrench();
unformattedGregText = GetGregHintText().GetFrench();
unformattedSheikText = GetSheikHintText().GetFrench();
unformattedSariaText = GetSariaHintText().GetFrench();
jsonData["warpMinuetText"] = GetWarpMinuetText().GetFrench();
jsonData["warpBoleroText"] = GetWarpBoleroText().GetFrench();
jsonData["warpSerenadeText"] = GetWarpSerenadeText().GetFrench();
Expand Down Expand Up @@ -732,14 +738,19 @@ static void WriteHints(int language) {
std::string ganonHintText = AutoFormatHintTextString(unformattedGanonHintText);
std::string dampesText = AutoFormatHintTextString(unformattedDampesText);
std::string gregText = AutoFormatHintTextString(unformattedGregText);
std::string sheikText = AutoFormatHintTextString(unformattedSheikText);
std::string sariaText = AutoFormatHintTextString(unformattedSariaText);

jsonData["ganonText"] = ganonText;
jsonData["ganonHintText"] = ganonHintText;
jsonData["ganonHintLoc"] = GetGanonHintLoc();
jsonData["lightArrowHintLoc"] = GetLightArrowHintLoc();
jsonData["dampeText"] = dampesText;
jsonData["dampeHintLoc"] = GetDampeHintLoc();
jsonData["gregText"] = gregText;
jsonData["gregLoc"] = GetItemLocation(GREG_RUPEE)->GetName();
jsonData["sheikText"] = sheikText;
jsonData["sariaText"] = sariaText;
jsonData["sariaHintLoc"] = GetSariaHintLoc();

if (Settings::GossipStoneHints.Is(HINTS_NO_HINTS)) {
return;
Expand Down
Loading

0 comments on commit c3a1eb2

Please sign in to comment.