This commit is contained in:
Pepe20129 2024-04-12 10:26:20 +02:00 committed by GitHub
commit 223f0ee8d2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
17 changed files with 90 additions and 22 deletions

View File

@ -136,7 +136,15 @@ typedef enum {
TEXT_BEAN_SALESMAN_SOLD_OUT = 0x406B,
TEXT_BEAN_SALESMAN_WANT_TO_PLANT = 0x406C,
TEXT_FISHING_POND_START = 0x407B,
TEXT_FISHING_TALK_ABOUT_SOMETHING = 0x4088,
TEXT_FISHING_TRY_ANOTHER_LURE = 0x408D,
TEXT_FISHING_SECRETS = 0x408E,
TEXT_FISHING_GOOD_FISHERMAN = 0x408F,
TEXT_FISHING_POND_START_MET = 0x4093,
TEXT_FISHING_DIFFERENT_POND = 0x4094,
TEXT_FISHING_SCRATCHING = 0x4095,
TEXT_FISHING_CLOUDY = 0x4096,
TEXT_FISHING_TRY_ANOTHER_LURE_WITH_SINKING_LURE = 0x40AF,
TEXT_DAMPES_DIARY = 0x5003,
TEXT_GRANNYS_SHOP = 0x500C,
TEXT_ANJU_PLEASE_BRING_MY_CUCCOS_BACK = 0x5036,

View File

@ -523,6 +523,8 @@ const std::vector<FlagTable> flagTables = {
{ RAND_INF_HAS_OCARINA_C_LEFT, "RAND_INF_HAS_OCARINA_C_LEFT"},
{ RAND_INF_HAS_OCARINA_C_RIGHT, "RAND_INF_HAS_OCARINA_C_RIGHT"},
{ RAND_INF_CAUGHT_LOACH, "RAND_INF_CAUGHT_LOACH" },
{ RAND_INF_CAN_SWIM, "RAND_INF_CAN_SWIM" },
{ RAND_INF_HAS_WALLET, "RAND_INF_HAS_WALLET" },

View File

@ -281,15 +281,13 @@ void HintTable_Init_Exclude_Overworld() {
});
// TODO: needs french translation
hintTable[RHT_LH_HYRULE_LOACH] = HintText::Exclude(
{
// obscure text
Text{ "#fishing the legend# bestows", /*french*/ "!!!", /*spanish*/ "#pescar a la leyenda# conduce a" },
},
{},
// clear text
Text{ "#fishing the hyrule loach# will give you", /*french*/ "!!!",
/*spanish*/ "si #pescas a la Locha de Hyrule# encontrarás" });
hintTable[RHT_LH_HYRULE_LOACH] = HintText::Exclude({
// obscure text
Text{"#fishing the legend# bestows", /*french*/"!!!", /*spanish*/"#pescar a la leyenda# conduce a"},
{},
// clear text
Text{"#fishing the hyrule loach# will give you", /*french*/"!!!", /*spanish*/"si #pescas a la Locha de Hyrule# encontrarás"}
});
hintTable[RHT_LH_ADULT_FISHING] = HintText::Exclude({

View File

@ -832,6 +832,12 @@ void GenerateItemPool() {
} else {
PlaceVanillaOverworldFish();
}
if (fsMode.Is(RO_FISHSANITY_HYRULE_LOACH)) {
AddItemToMainPool(RG_PURPLE_RUPEE);
} else {
ctx->PlaceItemInLocation(RC_LH_HYRULE_LOACH, RG_PURPLE_RUPEE, false, true);
}
} else {
PlaceVanillaOverworldFish();
}

View File

@ -202,6 +202,7 @@ void AreaTable_Init_HyruleField() {
LocationAccess(RC_LH_ADULT_FISH_14, {[]{return logic->CanGetAdultFish;}}),
LocationAccess(RC_LH_ADULT_FISH_15, {[]{return logic->CanGetAdultFish;}}),
LocationAccess(RC_LH_ADULT_LOACH, {[]{return logic->CanGetAdultFish;}}),
LocationAccess(RC_LH_HYRULE_LOACH, {[]{return logic->CanFish;}}),
LocationAccess(RC_FISHING_POLE_HINT,{[]{return true;}}),
}, {
//Exits

View File

@ -155,6 +155,7 @@ std::vector<RandomizerCheck> Rando::StaticData::overworldLocations = {
// Lake Hylia
RC_LH_CHILD_FISHING,
RC_LH_ADULT_FISHING,
RC_LH_HYRULE_LOACH,
RC_LH_LAB_DIVE,
RC_LH_TRADE_FROG,
RC_LH_UNDERWATER_ITEM,
@ -634,6 +635,7 @@ void Rando::StaticData::InitLocationTable() {
// Lake Hylia
locationTable[RC_LH_CHILD_FISHING] = Location::Base(RC_LH_CHILD_FISHING, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, ACTOR_ID_MAX, SCENE_FISHING_POND, 0x00, 0x3E, "Child Fishing", "LH Child Fishing", RHT_LH_CHILD_FISHING, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheck::RandomizerInf(SCENE_FISHING_POND, RAND_INF_CHILD_FISHING), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA, true);
locationTable[RC_LH_ADULT_FISHING] = Location::Base(RC_LH_ADULT_FISHING, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, ACTOR_ID_MAX, SCENE_FISHING_POND, 0x00, 0x38, "Adult Fishing", "LH Adult Fishing", RHT_LH_ADULT_FISHING, RG_PROGRESSIVE_SCALE, {}, SpoilerCollectionCheck::RandomizerInf(SCENE_FISHING_POND, RAND_INF_ADULT_FISHING), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA, true);
locationTable[RC_LH_HYRULE_LOACH] = Location::Base(RC_LH_HYRULE_LOACH, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, ACTOR_ID_MAX, SCENE_FISHING_POND, 0x00, 0x00, "Hyrule Loach Reward", "LH Hyrule Loach Reward", RHT_LH_HYRULE_LOACH, RG_PROGRESSIVE_SCALE, {}, SpoilerCollectionCheck::RandomizerInf(SCENE_FISHING_POND, RAND_INF_CAUGHT_LOACH), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA, true);
locationTable[RC_LH_LAB_DIVE] = Location::Base(RC_LH_LAB_DIVE, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, ACTOR_ID_MAX, SCENE_LAKESIDE_LABORATORY, 0x00, 0x3E, "Lab Dive", "LH Lab Dive", RHT_LH_LAB_DIVE, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheck::ItemGetInf(24), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA, true);
locationTable[RC_LH_TRADE_FROG] = Location::Base(RC_LH_TRADE_FROG, RCQUEST_BOTH, RCTYPE_ADULT_TRADE, RCAREA_LAKE_HYLIA, ACTOR_ID_MAX, SCENE_LAKESIDE_LABORATORY, 0x00, 0x25, "Lab Trade Eyeball Frog", "LH Lab Trade Eyeball Frog", RHT_LH_TRADE_FROG, RG_EYEDROPS, { Category::cAdultTrade }, SpoilerCollectionCheck::RandomizerInf(0x38, 0x1F), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA, true);
locationTable[RC_LH_UNDERWATER_ITEM] = Location::Base(RC_LH_UNDERWATER_ITEM, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, ACTOR_ID_MAX, SCENE_LAKE_HYLIA, 0x00, 0x15, "Underwater Item", "LH Underwater Item", RHT_LH_UNDERWATER_ITEM, RG_RUTOS_LETTER, {}, SpoilerCollectionCheck::EventChkInf(0x31), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA, true);

View File

@ -267,6 +267,7 @@ void Settings::CreateOptionDescriptions() {
"Affordable prices per tier: starter = 10, adult = 105, giant = 205, tycoon = 505\n\n"
"Use this to enable wallet tier locking, but make shop items not as expensive as they could be.";
mOptionDescriptions[RSK_FISHSANITY] = "Off - Fish will not be shuffled. No changes will be made to fishing behavior.\n\n"
"Shuffle only Hyrule Loach - Allows you to earn an item by catching the hyrule loach at the fishing pond and giving it to the owner.\n\n"
"Shuffle Fishing Pond - The fishing pond's fish will be shuffled. Catching a fish in the fishing pond will grant a reward.\n\n"
"Shuffle Overworld Fish - Fish in generic grottos and Zora's Domain will be shuffled. Catching a fish in a bottle will give a reward.\n\n"
"Shuffle Both - Both overworld fish and fish in the fishing pond will be shuffled.";
@ -512,6 +513,8 @@ void Settings::CreateOptionDescriptions() {
"Reading the diary of Dampé the gravekeeper as adult will tell you the location of one of the Hookshots.";
mOptionDescriptions[RSK_GREG_HINT] =
"Talking to the chest game owner after buying a key will tell you the location of Greg the Green Rupee.";
mOptionDescriptions[RSK_LOACH_HINT] =
"Talking to the fishing pond owner and asking to talk about something will tell you what's the reward for the Hyrule Loach.";
mOptionDescriptions[RSK_SARIA_HINT] = "Talking to Saria either in person or through Saria's Song will tell you the "
"location of a progressive magic meter.";
mOptionDescriptions[RSK_FISHING_POLE_HINT] = "Talking to the fishing pond owner without the fishing pole will tell you its location.";

View File

@ -87,7 +87,7 @@ static const char* englishRupeeNames[171] = {
"Frog Coins", "Gald", "Gekz", "Gems", "Geo",
"Gil", "Glimmer", "Glitches", "Gold", "Gold Dragons",
"Goober Dollars", "Green Herbs", "Greg Siblings", "Gummybears", "Hell",
"Hylian Loaches", "Ice Traps", "ISK", "Jiggies", "KF7 Ammo",
"Hyrule Loaches", "Ice Traps", "ISK", "Jiggies", "KF7 Ammo",
"Kinstones", "Kremcoins", "Kroner", "Leaves ", "Lemmings",
"Lien", "Lira", "Lumber", "Lungmen Dollars", "Macca",
"Mana", "Mann Co. Keys", "Meat", "Meat Stacks", "Medaparts",
@ -312,6 +312,15 @@ void Randomizer::LoadHintMessages() {
ctx->GetHint(RH_FROGS)->GetText().GetGerman(),
ctx->GetHint(RH_FROGS)->GetText().GetFrench(), TEXTBOX_TYPE_BLUE)
);
CustomMessageManager::Instance->CreateMessage(
Randomizer::randoMiscHintsTableID,
TEXT_FISHING_TALK_ABOUT_SOMETHING,
CustomMessage(
"What?^You wanna know about the&%rHyrule Loach%w?^It's a big fish, but it's so rare that&I'll give my %g{{item}}%w&to anyone who catches it. Seriously!",
"%g{{item}}%w",//TODO: Translations
"%g{{item}}%w"
)
);
CustomMessageManager::Instance->CreateMessage(Randomizer::randoMiscHintsTableID, TEXT_WARP_MINUET_OF_FOREST,
CustomMessage(ctx->GetHint(RH_MINUET_WARP_LOC)->GetText().GetEnglish(),
ctx->GetHint(RH_MINUET_WARP_LOC)->GetText().GetGerman(),
@ -2639,6 +2648,12 @@ CustomMessage Randomizer::ReplaceWithItemName(CustomMessage message, std::string
return message;
}
CustomMessage Randomizer::GetLoachMessage() {
auto ctx = Rando::Context::GetInstance();
CustomMessage messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::randoMiscHintsTableID, TEXT_FISHING_TALK_ABOUT_SOMETHING);
messageEntry = ReplaceWithItemName(messageEntry, "{{item}}", RC_LH_HYRULE_LOACH);
return messageEntry;
}
CustomMessage Randomizer::GetMiscHintMessage(TextIDs textToGet, RandomizerCheck hintedCheck, RandomizerCheck otherCheck) {
CustomMessage messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::randoMiscHintsTableID, textToGet);

View File

@ -63,6 +63,7 @@ class Randomizer {
ItemObtainability GetItemObtainabilityFromRandomizerGet(RandomizerGet randomizerCheck);
CustomMessage GetSheikMessage(s16 scene, u16 originalTextId);
CustomMessage ReplaceWithItemName(CustomMessage message, std::string&& toReplace, RandomizerCheck hintedCheck);
CustomMessage GetLoachMessage();
CustomMessage GetMiscHintMessage(TextIDs textToGet, RandomizerCheck hintedCheck, RandomizerCheck otherCheck = RC_UNKNOWN_CHECK);
CustomMessage GetSariaMessage(u16 originalTextId);
CustomMessage GetFishingPondOwnerMessage(u16 originalTextId);

View File

@ -926,6 +926,7 @@ typedef enum {
RC_LH_CHILD_LOACH_1,
RC_LH_CHILD_LOACH_2,
RC_LH_ADULT_FISHING,
RC_LH_HYRULE_LOACH,
RC_LH_ADULT_FISH_1,
RC_LH_ADULT_FISH_2,
RC_LH_ADULT_FISH_3,
@ -3556,6 +3557,7 @@ typedef enum {
RSK_LIGHT_ARROWS_HINT,
RSK_DAMPES_DIARY_HINT,
RSK_GREG_HINT,
RSK_LOACH_HINT,
RSK_SARIA_HINT,
RSK_FROGS_HINT,
RSK_KAK_10_SKULLS_HINT,
@ -3792,9 +3794,10 @@ typedef enum {
RO_BOSS_SOULS_ON_PLUS_GANON,
} RandoOptionBossSouls;
//Fishsanity settings (off, pond only, grottos only, both)
//Fishsanity settings (off, loach only, pond only, grottos only, both)
typedef enum {
RO_FISHSANITY_OFF,
RO_FISHSANITY_HYRULE_LOACH,
RO_FISHSANITY_POND,
RO_FISHSANITY_OVERWORLD,
RO_FISHSANITY_BOTH

View File

@ -160,6 +160,8 @@ void RandomizerCheckObjects::UpdateImGuiVisibility() {
CVarGetInteger("gRandomizeShuffleAdultTrade", RO_GENERIC_NO)) &&
(location.GetRandomizerCheck() != RC_KF_KOKIRI_SWORD_CHEST ||
CVarGetInteger("gRandomizeShuffleKokiriSword", RO_GENERIC_NO)) &&
(location.GetRandomizerCheck() != RC_LH_HYRULE_LOACH ||
CVarGetInteger("gRandomizeFishsanity", RO_GENERIC_NO) == RO_FISHSANITY_HYRULE_LOACH) &&
(location.GetRandomizerCheck() != RC_ZR_MAGIC_BEAN_SALESMAN ||
CVarGetInteger("gRandomizeShuffleBeans", RO_GENERIC_NO)) &&
(location.GetRandomizerCheck() != RC_HC_MALON_EGG ||

View File

@ -64,6 +64,7 @@ bool showCows;
bool showAdultTrade;
bool showKokiriSword;
bool showMasterSword;
bool showHyruleLoach;
bool showWeirdEgg;
bool showGerudoCard;
bool showFrogSongRupees;
@ -1106,6 +1107,9 @@ void LoadSettings() {
showMasterSword = IS_RANDO ?
OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_MASTER_SWORD) == RO_GENERIC_YES
: true;
showHyruleLoach = IS_RANDO ?
OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY) == RO_FISHSANITY_HYRULE_LOACH
: false;
showWeirdEgg = IS_RANDO ?
OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_WEIRD_EGG) == RO_GENERIC_YES
: true;
@ -1226,6 +1230,7 @@ bool IsVisibleInCheckTracker(RandomizerCheck rc) {
) &&
(rc != RC_KF_KOKIRI_SWORD_CHEST || showKokiriSword) &&
(rc != RC_TOT_MASTER_SWORD || showMasterSword) &&
(rc != RC_LH_HYRULE_LOACH || showHyruleLoach) &&
(rc != RC_ZR_MAGIC_BEAN_SALESMAN || showBeans) &&
(rc != RC_HC_MALON_EGG || showWeirdEgg) &&
(loc->GetRCType() != RCTYPE_FROG_SONG || showFrogSongRupees) &&

View File

@ -212,6 +212,8 @@ typedef enum {
RAND_INF_HAS_OCARINA_C_LEFT,
RAND_INF_HAS_OCARINA_C_RIGHT,
RAND_INF_CAUGHT_LOACH,
RAND_INF_CAN_SWIM,
RAND_INF_HAS_WALLET,

View File

@ -120,7 +120,7 @@ void Settings::CreateOptions() {
mOptions[RSK_SHUFFLE_CHEST_MINIGAME] = Option::U8("Shuffle Chest Minigame", {"Off", "On (Separate)", "On (Pack)"});
mOptions[RSK_SHUFFLE_100_GS_REWARD] = Option::Bool("Shuffle 100 GS Reward", "gRandomizeShuffle100GSReward", mOptionDescriptions[RSK_SHUFFLE_100_GS_REWARD], IMFLAG_SEPARATOR_BOTTOM, WidgetType::Checkbox, RO_GENERIC_OFF);
mOptions[RSK_SHUFFLE_BOSS_SOULS] = Option::U8("Shuffle Boss Souls", {"Off", "On", "On + Ganon"}, OptionCategory::Setting, "gRandomizeShuffleBossSouls", mOptionDescriptions[RSK_SHUFFLE_BOSS_SOULS], WidgetType::Combobox);
mOptions[RSK_FISHSANITY] = Option::U8("Fishsanity", {"Off", "Shuffle Fishing Pond", "Shuffle Overworld Fish", "Shuffle Both"}, OptionCategory::Setting, "gRandomizeFishsanity", mOptionDescriptions[RSK_FISHSANITY], WidgetType::Combobox, RO_FISHSANITY_OFF);
mOptions[RSK_FISHSANITY] = Option::U8("Fishsanity", {"Off", "Shuffle only Hyrule Loach", "Shuffle Fishing Pond", "Shuffle Overworld Fish", "Shuffle Both"}, OptionCategory::Setting, "gRandomizeFishsanity", mOptionDescriptions[RSK_FISHSANITY], WidgetType::Combobox, RO_FISHSANITY_OFF);
mOptions[RSK_FISHSANITY_POND_COUNT] = Option::U8("Pond Fish Count", {NumOpts(0,17,1)}, OptionCategory::Setting, "gRandomizeFishsanityPondCount", mOptionDescriptions[RSK_FISHSANITY_POND_COUNT], WidgetType::Slider, 0, true, IMFLAG_NONE);
mOptions[RSK_FISHSANITY_AGE_SPLIT] = Option::Bool("Pond Age Split", "gRandomizeFishsanityAgeSplit", mOptionDescriptions[RSK_FISHSANITY_AGE_SPLIT]);
mOptions[RSK_SHUFFLE_MAPANDCOMPASS] = Option::U8("Maps/Compasses", {"Start With", "Vanilla", "Own Dungeon", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, "gRandomizeStartingMapsCompasses", mOptionDescriptions[RSK_SHUFFLE_MAPANDCOMPASS], WidgetType::Combobox, RO_DUNGEON_ITEM_LOC_OWN_DUNGEON);
@ -161,6 +161,7 @@ void Settings::CreateOptions() {
mOptions[RSK_LIGHT_ARROWS_HINT] = Option::Bool("Light Arrow Hint", {"Off", "On"}, OptionCategory::Setting, "gRandomizeLAHint", mOptionDescriptions[RSK_LIGHT_ARROWS_HINT], WidgetType::Checkbox, RO_GENERIC_ON, false, IMFLAG_NONE);
mOptions[RSK_DAMPES_DIARY_HINT] = Option::Bool("Dampe's Diary Hint", "gRandomizeDampeHint", mOptionDescriptions[RSK_DAMPES_DIARY_HINT], IMFLAG_NONE);
mOptions[RSK_GREG_HINT] = Option::Bool("Greg the Green Rupee Hint", "gRandomizeGregHint", mOptionDescriptions[RSK_GREG_HINT], IMFLAG_NONE);
mOptions[RSK_LOACH_HINT] = Option::Bool("Hyrule Loach Hint", "gRandomizeLoachHint", mOptionDescriptions[RSK_LOACH_HINT], IMFLAG_NONE);
mOptions[RSK_SARIA_HINT] = Option::Bool("Saria's Hint", "gRandomizeSariaHint", mOptionDescriptions[RSK_SARIA_HINT], IMFLAG_NONE);
mOptions[RSK_FISHING_POLE_HINT] = Option::Bool("Fishing Pole Hint", "gRandomizeFishingPoleHint", mOptionDescriptions[RSK_FISHING_POLE_HINT], IMFLAG_NONE);
mOptions[RSK_FROGS_HINT] = Option::Bool("Frog Ocarina Game Hint", "gRandomizeFrogsHint", mOptionDescriptions[RSK_FROGS_HINT], IMFLAG_NONE);
@ -732,6 +733,7 @@ void Settings::CreateOptions() {
&mOptions[RSK_LIGHT_ARROWS_HINT],
&mOptions[RSK_DAMPES_DIARY_HINT],
&mOptions[RSK_GREG_HINT],
&mOptions[RSK_LOACH_HINT],
&mOptions[RSK_SARIA_HINT],
&mOptions[RSK_FROGS_HINT],
&mOptions[RSK_BIGGORON_HINT],
@ -959,6 +961,7 @@ void Settings::CreateOptions() {
&mOptions[RSK_LIGHT_ARROWS_HINT],
&mOptions[RSK_DAMPES_DIARY_HINT],
&mOptions[RSK_GREG_HINT],
&mOptions[RSK_LOACH_HINT],
&mOptions[RSK_SARIA_HINT],
&mOptions[RSK_FROGS_HINT],
&mOptions[RSK_WARP_SONG_HINTS],
@ -1176,6 +1179,7 @@ void Settings::CreateOptions() {
{ "Miscellaneous Settings:Light Arrow Hint", RSK_LIGHT_ARROWS_HINT },
{ "Miscellaneous Settings:Dampe's Diary Hint", RSK_DAMPES_DIARY_HINT },
{ "Miscellaneous Settings:Greg the Rupee Hint", RSK_GREG_HINT },
{ "Miscellaneous Settings:Hyrule Loach Hint", RSK_LOACH_HINT },
{ "Miscellaneous Settings:Saria's Hint", RSK_SARIA_HINT },
{ "Miscellaneous Settings:Frog Ocarina Game Hint", RSK_FROGS_HINT },
{ "Miscellaneous Settings:10 GS Hint", RSK_KAK_10_SKULLS_HINT },
@ -2283,6 +2287,7 @@ void Settings::ParseJson(nlohmann::json spoilerFileJson) {
case RSK_LIGHT_ARROWS_HINT:
case RSK_DAMPES_DIARY_HINT:
case RSK_GREG_HINT:
case RSK_LOACH_HINT:
case RSK_SARIA_HINT:
case RSK_FROGS_HINT:
case RSK_KAK_10_SKULLS_HINT:

View File

@ -2619,6 +2619,17 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) {
} else if (textId == TEXT_FIRE_TEMPLE_GORON_OWE_YOU_BIG_TIME || (textId >= TEXT_FIRE_TEMPLE_GORON_FALLING_DOORS_SECRET && textId <= TEXT_FIRE_TEMPLE_GORON_SOUNDS_DIFFERENT_SECRET)) {
u16 choice = Random(0, NUM_GORON_MESSAGES);
messageEntry = OTRGlobals::Instance->gRandomizer->GetGoronMessage(choice);
} else if (Randomizer_GetSettingValue(RSK_LOACH_HINT) &&
(
textId == TEXT_FISHING_CLOUDY ||
textId == TEXT_FISHING_TRY_ANOTHER_LURE ||
textId == TEXT_FISHING_SECRETS ||
textId == TEXT_FISHING_GOOD_FISHERMAN ||
textId == TEXT_FISHING_DIFFERENT_POND ||
textId == TEXT_FISHING_SCRATCHING ||
textId == TEXT_FISHING_TRY_ANOTHER_LURE_WITH_SINKING_LURE
)) {
messageEntry = OTRGlobals::Instance->gRandomizer->GetLoachMessage();
} else if (Randomizer_GetSettingValue(RSK_FROGS_HINT) && textId == TEXT_FROGS_UNDERWATER) {
messageEntry = OTRGlobals::Instance->gRandomizer->GetMiscHintMessage(TEXT_FROGS_UNDERWATER, RC_ZR_FROGS_OCARINA_GAME);
} else if (Randomizer_GetSettingValue(RSK_FISHING_POLE_HINT) && !Flags_GetRandomizerInf(RAND_INF_FISHING_POLE_FOUND) &&

View File

@ -864,6 +864,8 @@ void DrawEnhancementsMenu() {
UIWidgets::Tooltip("The minimum weight for the unique fishing reward as a child");
UIWidgets::PaddedEnhancementSliderInt("Adult Minimum Weight: %d", "##aMinimumWeight", "gAdultMinimumWeightFish", 6, 13, "", 13, true, true, false, disabled, disabledTooltip);
UIWidgets::Tooltip("The minimum weight for the unique fishing reward as an adult");
UIWidgets::PaddedEnhancementCheckbox("All fish are Hyrule Loaches", "gEnhancements.AllHyruleLoaches", true, false, disabled, disabledTooltip);
UIWidgets::Tooltip("Every fish in the fishing pond will always be a Hyrule Loach");
ImGui::EndMenu();
}
UIWidgets::Spacer(0);

View File

@ -17,6 +17,7 @@
#define WATER_SURFACE_Y(play) play->colCtx.colHeader->waterBoxes->ySurface
#define IS_FISHSANITY (IS_RANDO && Randomizer_GetPondFishShuffled())
#define FISHID(params) (Randomizer_IdentifyFish(play->sceneNum, params))
bool getShouldSpawnLoaches();
void Fishing_Init(Actor* thisx, PlayState* play);
void Fishing_Destroy(Actor* thisx, PlayState* play);
@ -26,8 +27,6 @@ void Fishing_DrawFish(Actor* thisx, PlayState* play);
void Fishing_DrawOwner(Actor* thisx, PlayState* play);
void Fishing_Reset(void);
bool getShouldSpawnLoaches();
typedef struct {
/* 0x00 */ u8 isLoach;
/* 0x02 */ Vec3s pos;
@ -1001,7 +1000,8 @@ void Fishing_Init(Actor* thisx, PlayState* play2) {
sFishInits[i].pos.z, 0, Rand_ZeroFloat(0x10000), 0, 100 + i, true);
}
} else {
if ((thisx->params < (EN_FISH_PARAM + 15)) || (thisx->params == EN_FISH_AQUARIUM)) {
u8 allHyruleLoaches = CVarGetInteger("gCustomizeFishing", 0) && CVarGetInteger("gEnhancements.AllHyruleLoaches", 0);
if ((thisx->params < (EN_FISH_PARAM + 15) && !allHyruleLoaches) || (thisx->params == EN_FISH_AQUARIUM)) {
SkelAnime_InitFlex(play, &this->skelAnime, &gFishingFishSkel, &gFishingFishAnim, NULL, NULL, 0);
Animation_MorphToLoop(&this->skelAnime, &gFishingFishAnim, 0.0f);
} else {
@ -1021,7 +1021,7 @@ void Fishing_Init(Actor* thisx, PlayState* play2) {
this->fishState = 10;
this->fishStateNext = 10;
this->isLoach = sFishInits[thisx->params - EN_FISH_PARAM].isLoach;
this->isLoach = allHyruleLoaches ? 1 : sFishInits[thisx->params - EN_FISH_PARAM].isLoach;
this->perception = sFishInits[thisx->params - EN_FISH_PARAM].perception;
this->fishLength = sFishInits[thisx->params - EN_FISH_PARAM].baseLength;
@ -5011,14 +5011,10 @@ void Fishing_HandleOwnerDialog(Fishing* this, PlayState* play) {
this->actor.textId = 0x408B;
this->stateAndTimer = 20;
}
} else if (!IS_RANDO) {
} else {
this->actor.textId = 0x409B;
this->stateAndTimer = 11;
}
else {
this->actor.textId = 0x4086;
this->stateAndTimer = 11;
}
Message_ContinueTextbox(play, this->actor.textId);
break;
case 1:
@ -5154,7 +5150,13 @@ void Fishing_HandleOwnerDialog(Fishing* this, PlayState* play) {
}
}
} else {
getItemId = GI_RUPEE_PURPLE;
if (IS_RANDO && !Flags_GetRandomizerInf(RAND_INF_CAUGHT_LOACH)) {
Flags_SetRandomizerInf(RAND_INF_CAUGHT_LOACH);
getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LH_HYRULE_LOACH, GI_RUPEE_PURPLE);
getItemId = getItemEntry.getItemId;
} else {
getItemId = GI_RUPEE_PURPLE;
}
sFishOnHandLength = 0.0f; // doesn't record loach
}