Adjust fishing prize threshold when minigame weight adjusted (#7089)

cleanup IS_RANDO usage in randomizer hook_handlers.cpp
This commit is contained in:
Philip Dubé
2026-08-17 17:23:36 +00:00
committed by GitHub
parent 4c43ef030d
commit 172b373fb5
2 changed files with 41 additions and 40 deletions
+10 -1
View File
@@ -1,9 +1,11 @@
#include "soh/Enhancements/game-interactor/GameInteractor.h"
#include "soh/ShipInit.hpp"
#include "src/overlays/actors/ovl_Fishing/z_fishing.h"
extern "C" {
#include <variables.h>
#include <functions.h>
#include <macros.h>
extern PlayState* gPlayState;
extern SaveContext gSaveContext;
f32 Fishing_GetMinimumRequiredScore();
@@ -18,6 +20,13 @@ void BuildFishingMessage(uint16_t* textId, bool* loadFromMessageTable) {
void RegisterFishingMessages() {
COND_ID_HOOK(OnOpenText, 0x40AE, CVarGetInteger(CVAR_ENHANCEMENT("CustomizeFishing"), 0), BuildFishingMessage);
COND_ID_HOOK(OnOpenText, 0x4080, CVarGetInteger(CVAR_ENHANCEMENT("CustomizeFishing"), 0), BuildFishingMessage);
COND_VB_SHOULD(
VB_SHOULD_GIVE_VANILLA_FISHING_PRIZE, (!IS_RANDO && CVarGetInteger(CVAR_ENHANCEMENT("CustomizeFishing"), 0)), {
VBFishingData* fishData = va_arg(args, VBFishingData*);
*should = fishData->fishWeight >= Fishing_GetMinimumRequiredScore() &&
!(HIGH_SCORE(HS_FISHING) & (LINK_IS_CHILD ? HS_FISH_PRIZE_CHILD : HS_FISH_PRIZE_ADULT));
});
}
void RegisterHoverFishing() {
@@ -58,7 +67,7 @@ void RegisterAllowFishingBlankB() {
});
}
static RegisterShipInitFunc initFunc(RegisterFishingMessages, { CVAR_ENHANCEMENT("CustomizeFishing") });
static RegisterShipInitFunc initFunc(RegisterFishingMessages, { CVAR_ENHANCEMENT("CustomizeFishing"), "IS_RANDO" });
static RegisterShipInitFunc initHoverFishing(RegisterHoverFishing, { CVAR_ENHANCEMENT("HoverFishing") });
static RegisterShipInitFunc initAllowFishingBlankB(RegisterAllowFishingBlankB,
{ CVAR_ENHANCEMENT("FishingBlankB"), "IS_RANDO" });
@@ -433,8 +433,6 @@ void RandomizerOnPlayerUpdateForRCQueueHandler() {
rc != RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE &&
// Always show ItemGet animation for ice traps
!(getItemEntry.modIndex == MOD_RANDOMIZER && getItemEntry.getItemId == RG_ICE_TRAP) &&
// Always show ItemGet animation outside of randomizer to keep behaviour consistent in vanilla
IS_RANDO &&
(CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), SGIA_JUNK) == SGIA_ALL ||
(CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), SGIA_JUNK) == SGIA_JUNK &&
(
@@ -543,7 +541,7 @@ void RandomizerOnItemReceiveHandler(GetItemEntry receivedItemEntry) {
}
if (loc->GetRandomizerCheck() == RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST) {
if (!CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) {
if (!CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), 1)) {
static uint32_t updateHook;
updateHook = GameInteractor::Instance->RegisterGameHook<GameInteractor::OnPlayerUpdate>([]() {
Player* player = GET_PLAYER(gPlayState);
@@ -784,15 +782,13 @@ bool ShouldGiveFishingPrize(f32 sFishOnHandLength) {
? CVarGetInteger(CVAR_ENHANCEMENT("MinimumFishWeightChild"), 10)
: 10;
f32 score = sqrt(((f32)weight - 0.5f) / 0.0036f);
return sFishOnHandLength >= score && (IS_RANDO ? !Flags_GetRandomizerInf(RAND_INF_CHILD_FISHING)
: !(HIGH_SCORE(HS_FISHING) & HS_FISH_PRIZE_CHILD));
return sFishOnHandLength >= score && !Flags_GetRandomizerInf(RAND_INF_CHILD_FISHING);
} else {
int32_t weight = CVarGetInteger(CVAR_ENHANCEMENT("CustomizeFishing"), 0)
? CVarGetInteger(CVAR_ENHANCEMENT("MinimumFishWeightAdult"), 13)
: 13;
f32 score = sqrt(((f32)weight - 0.5f) / 0.0036f);
return sFishOnHandLength >= score && (IS_RANDO ? !Flags_GetRandomizerInf(RAND_INF_ADULT_FISHING)
: !(HIGH_SCORE(HS_FISHING) & HS_FISH_PRIZE_ADULT));
return sFishOnHandLength >= score && !Flags_GetRandomizerInf(RAND_INF_ADULT_FISHING);
}
}
@@ -1985,48 +1981,44 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l
break;
}
case VB_SHOULD_GIVE_VANILLA_FISHING_PRIZE: {
VBFishingData* fishData = va_arg(args, VBFishingData*);
*should = !IS_RANDO && ShouldGiveFishingPrize(fishData->fishWeight);
// rando gives its prize via VB_GIVE_RANDO_FISHING_PRIZE instead
*should = false;
break;
}
case VB_GIVE_RANDO_FISHING_PRIZE: {
if (IS_RANDO) {
VBFishingData* fishData = va_arg(args, VBFishingData*);
if (*fishData->sFishOnHandIsLoach) {
if (!Flags_GetRandomizerInf(RAND_INF_CAUGHT_LOACH) &&
OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY) ==
RO_FISHSANITY_HYRULE_LOACH) {
Flags_SetRandomizerInf(RAND_INF_CAUGHT_LOACH);
Message_StartTextbox(gPlayState, TEXT_FISHING_RELEASE_THIS_ONE, NULL);
*should = true;
fishData->actor->stateAndTimer = 20;
}
} else {
if (ShouldGiveFishingPrize(fishData->fishWeight)) {
if (LINK_IS_CHILD) {
Flags_SetRandomizerInf(RAND_INF_CHILD_FISHING);
HIGH_SCORE(HS_FISHING) |= HS_FISH_PRIZE_CHILD;
} else {
Flags_SetRandomizerInf(RAND_INF_ADULT_FISHING);
HIGH_SCORE(HS_FISHING) |= HS_FISH_PRIZE_ADULT;
}
*should = true;
*fishData->sSinkingLureLocation = (u8)Rand_ZeroFloat(3.999f) + 1;
fishData->actor->stateAndTimer = 0;
VBFishingData* fishData = va_arg(args, VBFishingData*);
if (*fishData->sFishOnHandIsLoach) {
if (!Flags_GetRandomizerInf(RAND_INF_CAUGHT_LOACH) &&
OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY) ==
RO_FISHSANITY_HYRULE_LOACH) {
Flags_SetRandomizerInf(RAND_INF_CAUGHT_LOACH);
Message_StartTextbox(gPlayState, TEXT_FISHING_RELEASE_THIS_ONE, NULL);
*should = true;
fishData->actor->stateAndTimer = 20;
}
} else {
if (ShouldGiveFishingPrize(fishData->fishWeight)) {
if (LINK_IS_CHILD) {
Flags_SetRandomizerInf(RAND_INF_CHILD_FISHING);
HIGH_SCORE(HS_FISHING) |= HS_FISH_PRIZE_CHILD;
} else {
Flags_SetRandomizerInf(RAND_INF_ADULT_FISHING);
HIGH_SCORE(HS_FISHING) |= HS_FISH_PRIZE_ADULT;
}
*should = true;
*fishData->sSinkingLureLocation = (u8)Rand_ZeroFloat(3.999f) + 1;
fishData->actor->stateAndTimer = 0;
}
}
break;
}
case VB_GIVE_RANDO_GLITCH_FISHING_PRIZE: {
if (IS_RANDO) {
Fishing* fishing = va_arg(args, Fishing*);
if (!Flags_GetRandomizerInf(RAND_INF_ADULT_FISHING)) {
Flags_SetRandomizerInf(RAND_INF_ADULT_FISHING);
}
*should = true;
fishing->stateAndTimer = 0;
Fishing* fishing = va_arg(args, Fishing*);
if (!Flags_GetRandomizerInf(RAND_INF_ADULT_FISHING)) {
Flags_SetRandomizerInf(RAND_INF_ADULT_FISHING);
}
*should = true;
fishing->stateAndTimer = 0;
break;
}
case VB_TRADE_TIMER_EYEDROPS: {