diff options
Diffstat (limited to 'src/pokemon.c')
-rw-r--r-- | src/pokemon.c | 177 |
1 files changed, 94 insertions, 83 deletions
diff --git a/src/pokemon.c b/src/pokemon.c index f8c03ea02..563073237 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -1594,16 +1594,16 @@ static const u8 sStatsToRaise[] = static const s8 sFriendshipEventDeltas[][3] = { - { 5, 3, 2 }, - { 5, 3, 2 }, - { 1, 1, 0 }, - { 3, 2, 1 }, - { 1, 1, 0 }, - { 1, 1, 1 }, - { 3, 3, 3 }, - {-1, -1, -1 }, - {-5, -5, -10 }, - {-5, -5, -10 }, + [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_MASSAGE] = { 3, 3, 3 }, + [FRIENDSHIP_EVENT_FAINT_SMALL] = {-1, -1, -1 }, + [FRIENDSHIP_EVENT_FAINT_OUTSIDE_BATTLE] = {-5, -5, -10 }, + [FRIENDSHIP_EVENT_FAINT_LARGE] = {-5, -5, -10 }, }; static const u16 sHMMoves[] = @@ -1622,7 +1622,7 @@ static const u16 sDeoxysBaseStats[] = 180, // Sp.Attack 20, // Sp.Defense }; -#elif defined LEAFGREEN +#elif defined(LEAFGREEN) static const u16 sDeoxysBaseStats[] = { 50, // Hp @@ -4410,7 +4410,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov static bool8 HealStatusConditions(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId) { - u32 status = GetMonData(mon, MON_DATA_STATUS, 0); + u32 status = GetMonData(mon, MON_DATA_STATUS, NULL); if (status & healMask) { @@ -4874,7 +4874,7 @@ const u8 *Battle_PrintStatBoosterEffectMessage(u16 itemId) u8 GetNature(struct Pokemon *mon) { - return GetMonData(mon, MON_DATA_PERSONALITY, 0) % 25; + return GetMonData(mon, MON_DATA_PERSONALITY, NULL) % 25; } static u8 GetNatureFromPersonality(u32 personality) @@ -4886,12 +4886,12 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem) { int i; u16 targetSpecies = 0; - u16 species = GetMonData(mon, MON_DATA_SPECIES, 0); - u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); - u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); + u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); + u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, NULL); + u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); u8 level; u16 friendship; - u8 beauty = GetMonData(mon, MON_DATA_BEAUTY, 0); + u8 beauty = GetMonData(mon, MON_DATA_BEAUTY, NULL); u16 upperPersonality = personality >> 16; u8 holdEffect; @@ -4906,8 +4906,8 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem) switch (type) { case EVO_MODE_NORMAL: - level = GetMonData(mon, MON_DATA_LEVEL, 0); - friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0); + level = GetMonData(mon, MON_DATA_LEVEL, NULL); + friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL); for (i = 0; i < 5; i++) { @@ -4938,17 +4938,17 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem) break; case EVO_LEVEL_ATK_GT_DEF: if (gEvolutionTable[species][i].param <= level) - if (GetMonData(mon, MON_DATA_ATK, 0) > GetMonData(mon, MON_DATA_DEF, 0)) + if (GetMonData(mon, MON_DATA_ATK, NULL) > GetMonData(mon, MON_DATA_DEF, NULL)) targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_LEVEL_ATK_EQ_DEF: if (gEvolutionTable[species][i].param <= level) - if (GetMonData(mon, MON_DATA_ATK, 0) == GetMonData(mon, MON_DATA_DEF, 0)) + if (GetMonData(mon, MON_DATA_ATK, NULL) == GetMonData(mon, MON_DATA_DEF, NULL)) targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_LEVEL_ATK_LT_DEF: if (gEvolutionTable[species][i].param <= level) - if (GetMonData(mon, MON_DATA_ATK, 0) < GetMonData(mon, MON_DATA_DEF, 0)) + if (GetMonData(mon, MON_DATA_ATK, NULL) < GetMonData(mon, MON_DATA_DEF, NULL)) targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_LEVEL_SILCOON: @@ -5237,15 +5237,10 @@ static u16 ModifyStatByNature(u8 nature, u16 n, u8 statIndex) return n; } -// TODO: Move these to constants/trainers.h -#define TRAINER_CLASS_ELITE_FOUR 0x54 -#define TRAINER_CLASS_LEADER 0x57 -#define TRAINER_CLASS_CHAMPION 0x5A - void AdjustFriendship(struct Pokemon *mon, u8 event) { - u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); - u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); + u16 species = GetMonData(mon, MON_DATA_SPECIES2, NULL); + u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, NULL); u8 holdEffect; if (heldItem == ITEM_ENIGMA_BERRY) @@ -5262,40 +5257,56 @@ void AdjustFriendship(struct Pokemon *mon, u8 event) if (species && species != SPECIES_EGG) { + s8 delta; + // Friendship level refers to the column in sFriendshipEventDeltas. + // 0-99: Level 0 (maximum increase, typically) + // 100-199: Level 1 + // 200-255: Level 2 u8 friendshipLevel = 0; - s16 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0); - if (friendship > 99) + s16 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL); + if (friendship >= 100) friendshipLevel++; - if (friendship > 199) + if (friendship >= 200) friendshipLevel++; - if ((event != FRIENDSHIP_EVENT_WALKING || !(Random() & 1)) - && (event != FRIENDSHIP_EVENT_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)))) + if (event == FRIENDSHIP_EVENT_WALKING) { - s8 delta = sFriendshipEventDeltas[event][friendshipLevel]; - if (delta > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) - delta = (150 * delta) / 100; - - friendship += delta; - if (delta > 0) - { - if (GetMonData(mon, MON_DATA_POKEBALL, 0) == ITEM_LUXURY_BALL) - friendship++; - if (GetMonData(mon, MON_DATA_MET_LOCATION, 0) == GetCurrentRegionMapSectionId()) - friendship++; - } + // 50% chance every 128 steps + if (Random() & 1) + return; + } + if (event == FRIENDSHIP_EVENT_LEAGUE_BATTLE) + { + // Only if it's a trainer battle with league progression significance + if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER)) + return; + if (!(gTrainers[gTrainerBattleOpponent_A].trainerClass == CLASS_LEADER_2 + || gTrainers[gTrainerBattleOpponent_A].trainerClass == CLASS_ELITE_FOUR_2 + || gTrainers[gTrainerBattleOpponent_A].trainerClass == CLASS_CHAMPION_2)) + return; + } - if (friendship < 0) - friendship = 0; - if (friendship > 255) - friendship = 255; + delta = sFriendshipEventDeltas[event][friendshipLevel]; + if (delta > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) + // 50% increase, rounding down + delta = (150 * delta) / 100; - SetMonData(mon, MON_DATA_FRIENDSHIP, &friendship); + friendship += delta; + if (delta > 0) + { + if (GetMonData(mon, MON_DATA_POKEBALL, NULL) == ITEM_LUXURY_BALL) + friendship++; + if (GetMonData(mon, MON_DATA_MET_LOCATION, NULL) == GetCurrentRegionMapSectionId()) + friendship++; } + + // Clamp to u8 + if (friendship < 0) + friendship = 0; + if (friendship > 255) + friendship = 255; + + SetMonData(mon, MON_DATA_FRIENDSHIP, &friendship); } } @@ -5310,7 +5321,7 @@ void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies) for (i = 0; i < NUM_STATS; i++) { - evs[i] = GetMonData(mon, MON_DATA_HP_EV + i, 0); + evs[i] = GetMonData(mon, MON_DATA_HP_EV + i, NULL); totalEVs += evs[i]; } @@ -5351,7 +5362,7 @@ void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies) break; } - heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); + heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, NULL); if (heldItem == ITEM_ENIGMA_BERRY) { @@ -5390,7 +5401,7 @@ u16 GetMonEVCount(struct Pokemon *mon) u16 count = 0; for (i = 0; i < NUM_STATS; i++) - count += GetMonData(mon, MON_DATA_HP_EV + i, 0); + count += GetMonData(mon, MON_DATA_HP_EV + i, NULL); return count; } @@ -5417,7 +5428,7 @@ u8 CheckPartyPokerus(struct Pokemon *party, u8 selection) { do { - if ((selection & 1) && (GetMonData(&party[partyIndex], MON_DATA_POKERUS, 0) & 0xF)) + if ((selection & 1) && (GetMonData(&party[partyIndex], MON_DATA_POKERUS, NULL) & 0xF)) retVal |= curBit; partyIndex++; curBit <<= 1; @@ -5425,7 +5436,7 @@ u8 CheckPartyPokerus(struct Pokemon *party, u8 selection) } while (selection); } - else if (GetMonData(&party[0], MON_DATA_POKERUS, 0) & 0xF) + else if (GetMonData(&party[0], MON_DATA_POKERUS, NULL) & 0xF) { retVal = 1; } @@ -5445,7 +5456,7 @@ u8 CheckPartyHasHadPokerus(struct Pokemon *party, u8 selection) { do { - if ((selection & 1) && GetMonData(&party[partyIndex], MON_DATA_POKERUS, 0)) + if ((selection & 1) && GetMonData(&party[partyIndex], MON_DATA_POKERUS, NULL)) retVal |= curBit; partyIndex++; curBit <<= 1; @@ -5453,7 +5464,7 @@ u8 CheckPartyHasHadPokerus(struct Pokemon *party, u8 selection) } while (selection); } - else if (GetMonData(&party[0], MON_DATA_POKERUS, 0)) + else if (GetMonData(&party[0], MON_DATA_POKERUS, NULL)) { retVal = 1; } @@ -5511,7 +5522,7 @@ bool8 TryIncrementMonLevel(struct Pokemon *mon) u32 CanMonLearnTMHM(struct Pokemon *mon, u8 tm) { - u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); + u16 species = GetMonData(mon, MON_DATA_SPECIES2, NULL); if (species == SPECIES_EGG) { return 0; @@ -5532,12 +5543,12 @@ u8 GetMoveRelearnerMoves(struct Pokemon *mon, u16 *moves) { u16 learnedMoves[4]; u8 numMoves = 0; - u16 species = GetMonData(mon, MON_DATA_SPECIES, 0); - u8 level = GetMonData(mon, MON_DATA_LEVEL, 0); + u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); + u8 level = GetMonData(mon, MON_DATA_LEVEL, NULL); int i, j, k; for (i = 0; i < 4; i++) - learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0); + learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, NULL); for (i = 0; i < 20; i++) { @@ -5583,15 +5594,15 @@ u8 GetNumberOfRelearnableMoves(struct Pokemon *mon) u16 learnedMoves[4]; u16 moves[20]; u8 numMoves = 0; - u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); - u8 level = GetMonData(mon, MON_DATA_LEVEL, 0); + u16 species = GetMonData(mon, MON_DATA_SPECIES2, NULL); + u8 level = GetMonData(mon, MON_DATA_LEVEL, NULL); int i, j, k; if (species == SPECIES_EGG) return 0; for (i = 0; i < 4; i++) - learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0); + learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, NULL); for (i = 0; i < 20; i++) { @@ -5685,9 +5696,9 @@ void PlayMapChosenOrBattleBGM(u16 songId) const u32 *GetMonFrontSpritePal(struct Pokemon *mon) { - u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); - u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0); - u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); + u16 species = GetMonData(mon, MON_DATA_SPECIES2, NULL); + u32 otId = GetMonData(mon, MON_DATA_OT_ID, NULL); + u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); return GetMonSpritePalFromSpeciesAndPersonality(species, otId, personality); } @@ -5707,9 +5718,9 @@ const u32 *GetMonSpritePalFromSpeciesAndPersonality(u16 species, u32 otId, u32 p const struct CompressedSpritePalette *GetMonSpritePalStruct(struct Pokemon *mon) { - u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); - u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0); - u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); + u16 species = GetMonData(mon, MON_DATA_SPECIES2, NULL); + u32 otId = GetMonData(mon, MON_DATA_OT_ID, NULL); + u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); return GetMonSpritePalStructFromOtIdPersonality(species, otId, personality); } @@ -5757,7 +5768,7 @@ bool8 IsTradedMon(struct Pokemon *mon) u8 otName[PLAYER_NAME_LENGTH]; u32 otId; GetMonData(mon, MON_DATA_OT_NAME, otName); - otId = GetMonData(mon, MON_DATA_OT_ID, 0); + otId = GetMonData(mon, MON_DATA_OT_ID, NULL); return IsOtherTrainer(otId, otName); } @@ -5824,7 +5835,7 @@ void SetWildMonHeldItem(void) if (!(gBattleTypeFlags & (BATTLE_TYPE_POKEDUDE | BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_TRAINER))) { u16 rnd = Random() % 100; - u16 species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, 0); + u16 species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL); if (gBaseStats[species].item1 == gBaseStats[species].item2) { SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &gBaseStats[species].item1); @@ -5843,8 +5854,8 @@ void SetWildMonHeldItem(void) bool8 IsMonShiny(struct Pokemon *mon) { - u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0); - u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); + u32 otId = GetMonData(mon, MON_DATA_OT_ID, NULL); + u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); return IsShinyOtIdPersonality(otId, personality); } @@ -5893,7 +5904,7 @@ bool8 ShouldIgnoreDeoxysForm(u8 caseId, u8 battlerId) case 0: default: return FALSE; - case 1: + case DEOXYS_CHECK_BATTLE_SPRITE: if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) return FALSE; if (!gMain.inBattle) @@ -5903,7 +5914,7 @@ bool8 ShouldIgnoreDeoxysForm(u8 caseId, u8 battlerId) break; case 2: break; - case 3: + case DEOXYS_CHECK_TRADE_MAIN: if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) return FALSE; if (!gMain.inBattle) @@ -5913,7 +5924,7 @@ bool8 ShouldIgnoreDeoxysForm(u8 caseId, u8 battlerId) return FALSE; case 4: break; - case 5: + case DEOXYS_CHECK_BATTLE_ANIM: if (gBattleTypeFlags & BATTLE_TYPE_LINK) { if (!gMain.inBattle) @@ -5948,7 +5959,7 @@ static u16 GetDeoxysStat(struct Pokemon *mon, s32 statId) u16 statValue; u8 nature; - if (gBattleTypeFlags & BATTLE_TYPE_20 || GetMonData(mon, MON_DATA_SPECIES, NULL) != SPECIES_DEOXYS) + if (gBattleTypeFlags & BATTLE_TYPE_LINK_ESTABLISHED || GetMonData(mon, MON_DATA_SPECIES, NULL) != SPECIES_DEOXYS) { return statValue = 0; } |