diff options
Diffstat (limited to 'src/pokemon.c')
-rw-r--r-- | src/pokemon.c | 65 |
1 files changed, 36 insertions, 29 deletions
diff --git a/src/pokemon.c b/src/pokemon.c index 040b342d2..3f49c0440 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -61,6 +61,7 @@ static void DecryptBoxMon(struct BoxPokemon *boxMon); static void sub_806E6CC(u8 taskId); static bool8 ShouldGetStatBadgeBoost(u16 flagId, u8 battlerId); static u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move); +static bool8 ShouldSkipFriendshipChange(void); // EWRAM vars EWRAM_DATA static u8 sLearningMoveTableID = 0; @@ -1886,12 +1887,12 @@ const u8 gStatStageRatios[][2] = static const u16 sDeoxysBaseStats[] = { - 50, // Hp - 95, // Attack - 90, // Defense - 180, // Speed - 95, // Sp.Attack - 90, // Sp.Defense + [STAT_HP] = 50, + [STAT_ATK] = 95, + [STAT_DEF] = 90, + [STAT_SPEED] = 180, + [STAT_SPATK] = 95, + [STAT_SPDEF] = 90, }; const u16 gLinkPlayerFacilityClasses[] = @@ -2063,17 +2064,19 @@ static const u8 sStatsToRaise[] = STAT_ATK, STAT_ATK, STAT_SPEED, STAT_DEF, STAT_SPATK, STAT_ACC }; -static const s8 gUnknown_08329ECE[][3] = -{ - { 5, 3, 2}, - { 5, 3, 2}, - { 1, 1, 0}, - { 3, 2, 1}, - { 1, 1, 0}, - { 1, 1, 1}, - {-1, -1, -1}, - {-5, -5, -10}, - {-5, -5, -10}, +// 3 modifiers each for how much to change friendship for different ranges +// 0-99, 100-199, 200+ +static const s8 sFriendshipEventModifiers[][3] = +{ + [FRIENDSHIP_EVENT_GROW_LEVEL] = { 5, 3, 2}, + [FRIENDSHIP_EVENT_VITAMIN] = { 5, 3, 2}, + [FRIENDSHIP_EVENT_BATTLE_ITEM] = { 1, 1, 0}, + [FRIENDSHIP_EVENT_LEAGUE_BATTLE] = { 3, 2, 1}, + [FRIENDSHIP_EVENT_LEARN_TMHM] = { 1, 1, 0}, + [FRIENDSHIP_EVENT_WALKING] = { 1, 1, 1}, + [FRIENDSHIP_EVENT_FAINT_SMALL] = {-1, -1, -1}, + [FRIENDSHIP_EVENT_FAINT_FIELD_PSN] = {-5, -5, -10}, + [FRIENDSHIP_EVENT_FAINT_LARGE] = {-5, -5, -10}, }; static const u16 sHMMoves[] = @@ -5083,7 +5086,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov } break; case 5: - if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) < 100 && (retVal == 0 || var_28 != 0) && !sub_806F104() && var_34 == 0) + if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) < 100 && (retVal == 0 || var_28 != 0) && !ShouldSkipFriendshipChange() && var_34 == 0) { var_34 = itemEffect[var_3C]; friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL); @@ -5109,7 +5112,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov break; case 6: if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) >= 100 && GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) < 200 - && (retVal == 0 || var_28 != 0) && !sub_806F104() && var_34 == 0) + && (retVal == 0 || var_28 != 0) && !ShouldSkipFriendshipChange() && var_34 == 0) { var_34 = itemEffect[var_3C]; friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL); @@ -5134,7 +5137,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov var_3C++; break; case 7: - if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) >= 200 && (retVal == 0 || var_28 != 0) && !sub_806F104() && var_34 == 0) + if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) >= 200 && (retVal == 0 || var_28 != 0) && !ShouldSkipFriendshipChange() && var_34 == 0) { var_34 = itemEffect[var_3C]; friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL); @@ -5752,12 +5755,18 @@ u16 ModifyStatByNature(u8 nature, u16 n, u8 statIndex) return n; } +#define IS_LEAGUE_BATTLE \ + ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) \ + && (gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_ELITE_FOUR \ + || gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_LEADER \ + || gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_CHAMPION)) \ + void AdjustFriendship(struct Pokemon *mon, u8 event) { u16 species, heldItem; u8 holdEffect; - if (sub_806F104()) + if (ShouldSkipFriendshipChange()) return; species = GetMonData(mon, MON_DATA_SPECIES2, 0); @@ -5779,18 +5788,16 @@ void AdjustFriendship(struct Pokemon *mon, u8 event) { u8 friendshipLevel = 0; s16 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0); + if (friendship > 99) friendshipLevel++; if (friendship > 199) friendshipLevel++; - if ((event != 5 || !(Random() & 1)) - && (event != 3 - || ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) - && (gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_ELITE_FOUR - || gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_LEADER - || gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_CHAMPION)))) + + if ((event != FRIENDSHIP_EVENT_WALKING || !(Random() & 1)) + && (event != FRIENDSHIP_EVENT_LEAGUE_BATTLE || IS_LEAGUE_BATTLE)) { - s8 mod = gUnknown_08329ECE[event][friendshipLevel]; + s8 mod = sFriendshipEventModifiers[event][friendshipLevel]; if (mod > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) mod = (150 * mod) / 100; friendship += mod; @@ -6782,7 +6789,7 @@ bool8 HasTwoFramesAnimation(u16 species) && species != SPECIES_UNOWN); } -bool8 sub_806F104(void) +static bool8 ShouldSkipFriendshipChange(void) { if (gMain.inBattle && gBattleTypeFlags & (BATTLE_TYPE_FRONTIER)) return TRUE; |