From 26395fe60041aef03150228045e9e2d576ff72d5 Mon Sep 17 00:00:00 2001 From: cawtds <38510667+cawtds@users.noreply.github.com> Date: Wed, 3 Jul 2024 16:51:16 +0200 Subject: [PATCH 1/4] fix fishing encounter rolls --- src/pokemon.c | 2 +- src/wild_encounter.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pokemon.c b/src/pokemon.c index 926286caff..2daae8190b 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -1150,7 +1150,7 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, totalRerolls += I_SHINY_CHARM_ADDITIONAL_ROLLS; if (LURE_STEP_COUNT != 0) totalRerolls += 1; - if (IsCurrentEncounterFishing()) + if (I_FISHING_CHAIN && IsCurrentEncounterFishing()) totalRerolls += CalculateChainFishingShinyRolls(); while (GET_SHINY_VALUE(value, personality) >= SHINY_ODDS && totalRerolls > 0) diff --git a/src/wild_encounter.c b/src/wild_encounter.c index 273f9f312a..1e9c13829a 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -919,7 +919,7 @@ static void SetEncounterFishing(void) u32 CalculateChainFishingShinyRolls(void) { - return (1 + (2 * GetCurrentChainFishingDexNavStreak())); + return 2 * GetCurrentChainFishingDexNavStreak(); } static void SetLastFishingSpecies(u32 species) From 91550eb75fce23c86a7719bcefbec3e7f5db83f8 Mon Sep 17 00:00:00 2001 From: cawtds <38510667+cawtds@users.noreply.github.com> Date: Wed, 3 Jul 2024 17:02:12 +0200 Subject: [PATCH 2/4] chain fishing refactored --- include/wild_encounter.h | 3 -- src/field_player_avatar.c | 4 +- src/fieldmap.c | 2 +- src/pokemon.c | 4 +- src/wild_encounter.c | 87 ++++++--------------------------------- 5 files changed, 17 insertions(+), 83 deletions(-) diff --git a/include/wild_encounter.h b/include/wild_encounter.h index 6a7c7a2cba..733ea104e6 100644 --- a/include/wild_encounter.h +++ b/include/wild_encounter.h @@ -42,8 +42,5 @@ u16 GetLocalWaterMon(void); bool8 UpdateRepelCounter(void); bool8 TryDoDoubleWildBattle(void); bool8 StandardWildEncounter_Debug(void); -void ResetChainFishingDexNavStreak(void); -bool32 IsCurrentEncounterFishing(void); -u32 CalculateChainFishingShinyRolls(void); #endif // GUARD_WILD_ENCOUNTER_H diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c index 82532881f2..b10ca6c599 100644 --- a/src/field_player_avatar.c +++ b/src/field_player_avatar.c @@ -1997,7 +1997,7 @@ static bool8 Fishing_StartEncounter(struct Task *task) static bool8 Fishing_NotEvenNibble(struct Task *task) { - ResetChainFishingDexNavStreak(); + gChainFishingDexNavStreak = 0; AlignFishingAnimationFrames(); StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], GetFishingNoCatchDirectionAnimNum(GetPlayerFacingDirection())); FillWindowPixelBuffer(0, PIXEL_FILL(1)); @@ -2008,7 +2008,7 @@ static bool8 Fishing_NotEvenNibble(struct Task *task) static bool8 Fishing_GotAway(struct Task *task) { - ResetChainFishingDexNavStreak(); + gChainFishingDexNavStreak = 0; AlignFishingAnimationFrames(); StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], GetFishingNoCatchDirectionAnimNum(GetPlayerFacingDirection())); FillWindowPixelBuffer(0, PIXEL_FILL(1)); diff --git a/src/fieldmap.c b/src/fieldmap.c index 28c9602688..e5a399875f 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -67,7 +67,7 @@ const struct MapHeader *const GetMapHeaderFromConnection(const struct MapConnect void InitMap(void) { - ResetChainFishingDexNavStreak(); + gChainFishingDexNavStreak = 0; InitMapLayoutData(&gMapHeader); SetOccupiedSecretBaseEntranceMetatiles(gMapHeader.events); RunOnLoadMapScript(); diff --git a/src/pokemon.c b/src/pokemon.c index 2daae8190b..81f7c3de5f 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -1150,8 +1150,8 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, totalRerolls += I_SHINY_CHARM_ADDITIONAL_ROLLS; if (LURE_STEP_COUNT != 0) totalRerolls += 1; - if (I_FISHING_CHAIN && IsCurrentEncounterFishing()) - totalRerolls += CalculateChainFishingShinyRolls(); + if (I_FISHING_CHAIN && gIsFishingEncounter) + totalRerolls += (2 * gChainFishingDexNavStreak); while (GET_SHINY_VALUE(value, personality) >= SHINY_ODDS && totalRerolls > 0) { diff --git a/src/wild_encounter.c b/src/wild_encounter.c index 1e9c13829a..34c221b26c 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -51,14 +51,6 @@ enum { static u16 FeebasRandom(void); static void FeebasSeedRng(u16 seed); -static u32 GetLastFishingSpecies(void); -static bool32 DoesSpeciesMatchLastFishingSpecies(u32 species); -static u32 GetCurrentChainFishingDexNavStreak(void); -static bool32 IsChainFishingStreakAtMax(void); -static void IncrementChainFishingDexNavStreak(void); -static void SetEncounterFishing(void); -static void SetLastFishingSpecies(u32 species); -static void HandleChainFishingStreak(u32 species); static void UpdateChainFishingSpeciesAndStreak(u32 species); static bool8 IsWildLevelAllowedByRepel(u8 level); static void ApplyFluteEncounterRateMod(u32 *encRate); @@ -877,84 +869,29 @@ bool8 DoesCurrentMapHaveFishingMons(void) return FALSE; } -static u32 GetLastFishingSpecies(void) -{ - return sLastFishingSpecies; -} - -static bool32 DoesSpeciesMatchLastFishingSpecies(u32 species) -{ - return (species == GetLastFishingSpecies()); -} - -static u32 GetCurrentChainFishingDexNavStreak(void) -{ - return gChainFishingDexNavStreak; -} - -static bool32 IsChainFishingStreakAtMax(void) -{ - return (GetCurrentChainFishingDexNavStreak() >= FISHING_CHAIN_LENGTH_MAX); -} - -static void IncrementChainFishingDexNavStreak(void) -{ - gChainFishingDexNavStreak++; -} - -void ResetChainFishingDexNavStreak(void) -{ - gChainFishingDexNavStreak = 0; -} - -bool32 IsCurrentEncounterFishing(void) -{ - return gIsFishingEncounter; -} - -static void SetEncounterFishing(void) -{ - gIsFishingEncounter = TRUE; -} - -u32 CalculateChainFishingShinyRolls(void) -{ - return 2 * GetCurrentChainFishingDexNavStreak(); -} - -static void SetLastFishingSpecies(u32 species) -{ - sLastFishingSpecies = species; -} - -static void HandleChainFishingStreak(u32 species) -{ - if (!DoesSpeciesMatchLastFishingSpecies(species)) - { - ResetChainFishingDexNavStreak(); - return; - } - - if (IsChainFishingStreakAtMax()) - return; - - IncrementChainFishingDexNavStreak(); -} - static void UpdateChainFishingSpeciesAndStreak(u32 species) { if (!I_FISHING_CHAIN) return; - HandleChainFishingStreak(species); - SetLastFishingSpecies(species); + if (species != sLastFishingSpecies) + { + gChainFishingDexNavStreak = 0; + return; + } + + if (gChainFishingDexNavStreak >= FISHING_CHAIN_LENGTH_MAX) + return; + + gChainFishingDexNavStreak++; + sLastFishingSpecies = species; } void FishingWildEncounter(u8 rod) { u16 species; - SetEncounterFishing(); + gIsFishingEncounter = TRUE; if (CheckFeebas() == TRUE) { u8 level = ChooseWildMonLevel(&sWildFeebas, 0, WILD_AREA_FISHING); From 3babd7f1306f8ff45a99a33ed72e39ea49f85aaf Mon Sep 17 00:00:00 2001 From: cawtds <38510667+cawtds@users.noreply.github.com> Date: Sat, 6 Jul 2024 02:10:30 +0200 Subject: [PATCH 3/4] shiny roll calc as separate function --- include/wild_encounter.h | 1 + src/pokemon.c | 2 +- src/wild_encounter.c | 5 +++++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/include/wild_encounter.h b/include/wild_encounter.h index 733ea104e6..63289f081c 100644 --- a/include/wild_encounter.h +++ b/include/wild_encounter.h @@ -42,5 +42,6 @@ u16 GetLocalWaterMon(void); bool8 UpdateRepelCounter(void); bool8 TryDoDoubleWildBattle(void); bool8 StandardWildEncounter_Debug(void); +u32 CalculateChainFishingShinyRolls(void); #endif // GUARD_WILD_ENCOUNTER_H diff --git a/src/pokemon.c b/src/pokemon.c index 81f7c3de5f..a9d0ec99da 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -1151,7 +1151,7 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, if (LURE_STEP_COUNT != 0) totalRerolls += 1; if (I_FISHING_CHAIN && gIsFishingEncounter) - totalRerolls += (2 * gChainFishingDexNavStreak); + totalRerolls += CalculateChainFishingShinyRolls(); while (GET_SHINY_VALUE(value, personality) >= SHINY_ODDS && totalRerolls > 0) { diff --git a/src/wild_encounter.c b/src/wild_encounter.c index 34c221b26c..450ba2f40f 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -869,6 +869,11 @@ bool8 DoesCurrentMapHaveFishingMons(void) return FALSE; } +u32 CalculateChainFishingShinyRolls(void) +{ + return (2 * gChainFishingDexNavStreak); +} + static void UpdateChainFishingSpeciesAndStreak(u32 species) { if (!I_FISHING_CHAIN) From 5dda4b846e3151d29339134550bff79bee769f05 Mon Sep 17 00:00:00 2001 From: cawtds <38510667+cawtds@users.noreply.github.com> Date: Sat, 6 Jul 2024 15:18:51 +0200 Subject: [PATCH 4/4] fishing chain only resets on failed attempt or when map warping, encountering different species does not break the chain, differentiate between max shiny streak and max chain length --- include/constants/wild_encounter.h | 3 ++- src/fieldmap.c | 1 - src/overworld.c | 1 + src/wild_encounter.c | 16 ++++------------ 4 files changed, 7 insertions(+), 14 deletions(-) diff --git a/include/constants/wild_encounter.h b/include/constants/wild_encounter.h index 8902f2ef43..ae669a2c35 100644 --- a/include/constants/wild_encounter.h +++ b/include/constants/wild_encounter.h @@ -8,6 +8,7 @@ #define NUM_ALTERING_CAVE_TABLES 9 -#define FISHING_CHAIN_LENGTH_MAX 20 +#define FISHING_CHAIN_LENGTH_MAX 200 +#define FISHING_CHAIN_SHINY_STREAK_MAX 20 #endif // GUARD_CONSTANTS_WILD_ENCOUNTER_H diff --git a/src/fieldmap.c b/src/fieldmap.c index e5a399875f..30daae49ca 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -67,7 +67,6 @@ const struct MapHeader *const GetMapHeaderFromConnection(const struct MapConnect void InitMap(void) { - gChainFishingDexNavStreak = 0; InitMapLayoutData(&gMapHeader); SetOccupiedSecretBaseEntranceMetatiles(gMapHeader.events); RunOnLoadMapScript(); diff --git a/src/overworld.c b/src/overworld.c index ca5a268a82..a9606578dc 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -907,6 +907,7 @@ if (I_VS_SEEKER_CHARGING != 0) RunOnTransitionMapScript(); UpdateLocationHistoryForRoamer(); MoveAllRoamersToOtherLocationSets(); + gChainFishingDexNavStreak = 0; if (gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PYRAMID_FLOOR) InitBattlePyramidMap(FALSE); else if (InTrainerHill()) diff --git a/src/wild_encounter.c b/src/wild_encounter.c index 450ba2f40f..ae7770aa3a 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -51,7 +51,7 @@ enum { static u16 FeebasRandom(void); static void FeebasSeedRng(u16 seed); -static void UpdateChainFishingSpeciesAndStreak(u32 species); +static void UpdateChainFishingStreak(); static bool8 IsWildLevelAllowedByRepel(u8 level); static void ApplyFluteEncounterRateMod(u32 *encRate); static void ApplyCleanseTagEncounterRateMod(u32 *encRate); @@ -68,7 +68,6 @@ EWRAM_DATA static u32 sFeebasRngValue = 0; EWRAM_DATA bool8 gIsFishingEncounter = 0; EWRAM_DATA bool8 gIsSurfingEncounter = 0; EWRAM_DATA u8 gChainFishingDexNavStreak = 0; -EWRAM_DATA static u16 sLastFishingSpecies = 0; #include "data/wild_encounters.h" @@ -520,7 +519,7 @@ static u16 GenerateFishingWildMon(const struct WildPokemonInfo *wildMonInfo, u8 u16 wildMonSpecies = wildMonInfo->wildPokemon[wildMonIndex].species; u8 level = ChooseWildMonLevel(wildMonInfo->wildPokemon, wildMonIndex, WILD_AREA_FISHING); - UpdateChainFishingSpeciesAndStreak(wildMonSpecies); + UpdateChainFishingStreak(); CreateWildMon(wildMonSpecies, level); return wildMonSpecies; } @@ -871,25 +870,18 @@ bool8 DoesCurrentMapHaveFishingMons(void) u32 CalculateChainFishingShinyRolls(void) { - return (2 * gChainFishingDexNavStreak); + return (2 * min(gChainFishingDexNavStreak, FISHING_CHAIN_SHINY_STREAK_MAX)); } -static void UpdateChainFishingSpeciesAndStreak(u32 species) +static void UpdateChainFishingStreak() { if (!I_FISHING_CHAIN) return; - if (species != sLastFishingSpecies) - { - gChainFishingDexNavStreak = 0; - return; - } - if (gChainFishingDexNavStreak >= FISHING_CHAIN_LENGTH_MAX) return; gChainFishingDexNavStreak++; - sLastFishingSpecies = species; } void FishingWildEncounter(u8 rod)