diff --git a/include/config/item.h b/include/config/item.h index 67916cbe4d..dce2682959 100644 --- a/include/config/item.h +++ b/include/config/item.h @@ -38,9 +38,12 @@ // Vs. Seeker #define I_VS_SEEKER_CHARGING 0 // If this flag is assigned, the Vs Seeker functionality will be enabled. When the player has the Vs. Seeker, Match Call rematch functions will stop working. -//Fishing -#define I_FISHING_CHAIN FALSE // Introduced in XY, hooking the same Pokémon repeatedly will increase the odds of that mon being shiny. NOTE: This implementation is an approximation of the actual feature, as XY have not been throughoutly documented or datamined. -#define I_FISHING_MINIGAME GEN_3 // Each generation uses a variation of reeling in Pokémon once they have been hooked. -#define I_FISHING_PROXIMITY FALSE // Introduced in XY, fishing away from other people in enclosed areas will increase the chances of a Pokémon being hooked. NOTE: This implementation is an approximation of the actual feature, as XY have not been throughoutly documented or datamined. +// Fishing +#define I_FISHING_BITE_ODDS GEN_LATEST // In Gen 1 and Gen 2, the Old Rod has a 100% chance for a bite, Good Rod has a 66% chance for a bite, and Super Rod has a 50% chance for a bite. In Gen 3, all rods have a base 50% chance for a bite. In Gen 4 onwards, the Old Rod has a base 25% chance for a bite, Good Rod has a 50% chance for a bite, and Super Rod has a 75% chance for a bite. +#define I_FISHING_MINIGAME GEN_3 // Each generation uses a variation of reeling in Pokémon once they have been hooked. NOTE: Only the Gen 1/2 and Gen 3 minigames are implemented right now! +#define I_FISHING_STICKY_BOOST GEN_LATEST // In Gen 3, a Pokemon with Suction Cups or Sticky Hold in the first slot of the party causes the chance for a bite to increase by about 35%. In Gen 4 onwards, it doubles the base bite chance. +#define I_FISHING_FOLLOWER_BOOST FALSE // In HGSS, fishing bite odds are increased depending on the friendship of the current following Pokémon. +#define I_FISHING_CHAIN FALSE // Introduced in XY, hooking the same Pokémon repeatedly will increase the odds of that mon being shiny. NOTE: This implementation is an approximation of the actual feature, as XY have not been throughoutly documented or datamined. +#define I_FISHING_PROXIMITY FALSE // Introduced in XY, fishing away from other people in enclosed areas will increase the chances of a Pokémon being hooked. NOTE: This implementation is an approximation of the actual feature, as XY have not been throughoutly documented or datamined. #endif // GUARD_CONFIG_ITEM_H diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c index 6cb46cb378..ebf61bdaa3 100644 --- a/src/field_player_avatar.c +++ b/src/field_player_avatar.c @@ -146,8 +146,9 @@ static bool32 Fishing_EndNoMon(struct Task *); static void AlignFishingAnimationFrames(void); static bool32 DoesFishingMinigameAllowCancel(void); static bool32 Fishing_DoesFirstMonInPartyHaveSuctionCupsOrStickyHold(void); -static bool32 Fishing_RollForBite(bool32); -static u32 CalculateFishingBiteOdds(bool32); +static bool32 Fishing_RollForBite(u32, bool32); +static u32 CalculateFishingBiteOdds(u32, bool32); +static u32 CalculateFishingFollowerBoost(void); static u32 CalculateFishingProximityBoost(u32 odds); static void GetCoordinatesAroundBobber(s16[], s16[][AXIS_COUNT], u32); static u32 CountQualifyingTiles(s16[][AXIS_COUNT], s16 player[], u8 facingDirection, struct ObjectEvent *objectEvent, bool32 isTileLand[]); @@ -1725,7 +1726,20 @@ static void Task_WaitStopSurfing(u8 taskId) #define FISHING_PROXIMITY_BOOST 4 #define FISHING_STICKY_BOOST 36 -#define FISHING_DEFAULT_ODDS 50 + +#if I_FISHING_BITE_ODDS >= GEN_4 + #define FISHING_OLD_ROD_ODDS 75 + #define FISHING_GOOD_ROD_ODDS 50 + #define FISHING_SUPER_ROD_ODDS 25 +#elif I_FISHING_BITE_ODDS >= GEN_3 + #define FISHING_OLD_ROD_ODDS 50 + #define FISHING_GOOD_ROD_ODDS 50 + #define FISHING_SUPER_ROD_ODDS 50 +#else + #define FISHING_OLD_ROD_ODDS 0 + #define FISHING_GOOD_ROD_ODDS 33 + #define FISHING_SUPER_ROD_ODDS 50 +#endif enum { @@ -1902,10 +1916,10 @@ static bool32 Fishing_CheckForBite(struct Task *task) firstMonHasSuctionOrSticky = Fishing_DoesFirstMonInPartyHaveSuctionCupsOrStickyHold(); if(firstMonHasSuctionOrSticky) - bite = Fishing_RollForBite(firstMonHasSuctionOrSticky); + bite = Fishing_RollForBite(task->tFishingRod, firstMonHasSuctionOrSticky); if (!bite) - bite = Fishing_RollForBite(FALSE); + bite = Fishing_RollForBite(task->tFishingRod, FALSE); if (!bite) task->tStep = FISHING_NOT_EVEN_NIBBLE; @@ -2127,22 +2141,58 @@ static bool32 Fishing_DoesFirstMonInPartyHaveSuctionCupsOrStickyHold(void) return (ability == ABILITY_SUCTION_CUPS || ability == ABILITY_STICKY_HOLD); } -static bool32 Fishing_RollForBite(bool32 isStickyHold) +static bool32 Fishing_RollForBite(u32 rod, bool32 isStickyHold) { - return ((Random() % 100) > CalculateFishingBiteOdds(isStickyHold)); + return ((Random() % 100) > CalculateFishingBiteOdds(rod, isStickyHold)); } -static u32 CalculateFishingBiteOdds(bool32 isStickyHold) +static u32 CalculateFishingBiteOdds(u32 rod, bool32 isStickyHold) { - u32 odds = FISHING_DEFAULT_ODDS; + u32 odds; + + if (rod == OLD_ROD) + odds = FISHING_OLD_ROD_ODDS; + if (rod == GOOD_ROD) + odds = FISHING_GOOD_ROD_ODDS; + if (rod == SUPER_ROD) + odds = FISHING_SUPER_ROD_ODDS; + + odds -= CalculateFishingFollowerBoost(); if (isStickyHold) - odds -= FISHING_STICKY_BOOST; + { + if (I_FISHING_STICKY_BOOST >= GEN_4) + odds -= (100 - odds); + else + odds -= FISHING_STICKY_BOOST; + } odds -= CalculateFishingProximityBoost(odds); + return odds; } +static u32 CalculateFishingFollowerBoost() +{ + u32 friendship; + struct Pokemon *mon = GetFirstLiveMon(); + + if (!I_FISHING_FOLLOWER_BOOST || !mon) + return 0; + + friendship = GetMonData(mon, MON_DATA_FRIENDSHIP); + if (friendship >= 250) + return 50; + else if (friendship >= 200) + return 40; + else if (friendship >= 150) + return 30; + else if (friendship >= 100) + return 20; + else + return 0; +} + static u32 CalculateFishingProximityBoost(u32 odds) { s16 player[AXIS_COUNT], bobber[AXIS_COUNT];