summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Huderle <huderlem@gmail.com>2018-04-08 12:59:08 -0700
committerMarcus Huderle <huderlem@gmail.com>2018-04-08 12:59:08 -0700
commit0a3b052bdc89eacddd1152049983c89dde37e7e4 (patch)
tree0af462596f61ad10ca49febeae3aa508c9a906c9
parent562dcc4bcdc14d5b6c0bb2a638410156945cdd41 (diff)
Document friendship events, primary status ailments, and misc cleanup
-rw-r--r--include/pokemon.h17
-rw-r--r--include/pokemon_summary_screen.h2
-rw-r--r--src/battle/battle_2.c6
-rw-r--r--src/battle/battle_4.c9
-rw-r--r--src/battle/battle_party_menu.c10
-rw-r--r--src/choose_party.c11
-rw-r--r--src/field_control_avatar.c9
-rw-r--r--src/field_poison.c59
-rw-r--r--src/party_menu.c136
-rw-r--r--src/pokemon_3.c50
-rw-r--r--src/pokemon_summary_screen.c30
11 files changed, 181 insertions, 158 deletions
diff --git a/include/pokemon.h b/include/pokemon.h
index 8864aee8a..9e3dd2e34 100644
--- a/include/pokemon.h
+++ b/include/pokemon.h
@@ -118,6 +118,23 @@
#define TYPE_DRAGON 0x10
#define TYPE_DARK 0x11
+#define FRIENDSHIP_EVENT_GROW_LEVEL 0x0
+#define FRIENDSHIP_EVENT_VITAMIN 0x1 // unused
+#define FRIENDSHIP_EVENT_BATTLE_ITEM 0x2 // unused
+#define FRIENDSHIP_EVENT_LEAGUE_BATTLE 0x3
+#define FRIENDSHIP_EVENT_LEARN_TMHM 0x4
+#define FRIENDSHIP_EVENT_WALKING 0x5
+#define FRIENDSHIP_EVENT_FAINT_SMALL 0x6
+#define FRIENDSHIP_EVENT_FAINT_OUTSIDE_BATTLE 0x7
+#define FRIENDSHIP_EVENT_FAINT_LARGE 0x8
+
+#define STATUS_PRIMARY_NONE 0x0
+#define STATUS_PRIMARY_POISON 0x1
+#define STATUS_PRIMARY_PARALYSIS 0x2
+#define STATUS_PRIMARY_SLEEP 0x3
+#define STATUS_PRIMARY_FREEZE 0x4
+#define STATUS_PRIMARY_BURN 0x5
+
#define PARTY_SIZE 6
#define MAX_TOTAL_EVS 510
#define NUM_STATS 6
diff --git a/include/pokemon_summary_screen.h b/include/pokemon_summary_screen.h
index 945e810a3..f1dbe0089 100644
--- a/include/pokemon_summary_screen.h
+++ b/include/pokemon_summary_screen.h
@@ -61,7 +61,7 @@ struct PokemonSummaryScreenStruct
void ShowPokemonSummaryScreen(struct Pokemon *, u8, u8, MainCallback, u8);
void ShowSelectMovePokemonSummaryScreen(struct Pokemon *, u8, u8, MainCallback, u16);
u8 sub_809FA30(void);
-u8 pokemon_ailments_get_primary(u32);
+u8 GetPrimaryStatus(u32);
u8 GetMonStatusAndPokerus();
u8 *sub_80A1E9C(u8 *dest, const u8 *src, u8);
u8 *PokemonSummaryScreen_CopyPokemonLevel(u8 *dest, u8 level);
diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c
index 096bd878f..21f53b5d7 100644
--- a/src/battle/battle_2.c
+++ b/src/battle/battle_2.c
@@ -291,8 +291,8 @@ void InitBattle(void)
SetWildMonHeldItem();
}
gMain.inBattle = TRUE;
- for (i = 0; i < 6; i++)
- AdjustFriendship(&gPlayerParty[i], 3);
+ for (i = 0; i < PARTY_SIZE; i++)
+ AdjustFriendship(&gPlayerParty[i], FRIENDSHIP_EVENT_LEAGUE_BATTLE);
gBattleCommunication[0] = 0;
}
@@ -304,7 +304,7 @@ void sub_800E9EC(void)
u32 status;
s32 i;
- for (i = 0; i < 6; i++)
+ for (i = 0; i < PARTY_SIZE; i++)
{
species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
hp = GetMonData(&gPlayerParty[i], MON_DATA_HP);
diff --git a/src/battle/battle_4.c b/src/battle/battle_4.c
index 8f5ea7cae..950ccb6ae 100644
--- a/src/battle/battle_4.c
+++ b/src/battle/battle_4.c
@@ -203,7 +203,6 @@ void PlayBGM(u16 songID);
void MonGainEVs(struct Pokemon*, u16 defeatedSpecies);
extern u8 gBattleBufferB[4][0x200];
void HandleLowHpMusicChange(struct Pokemon*, u8 bank);
-void AdjustFriendship(struct Pokemon*, u8 value);
bool8 IsTradedMon(struct Pokemon*);
void BattleScriptPop(void);
void SwitchInClearSetData(void);
@@ -5133,10 +5132,10 @@ static void atk19_tryfaintmon(void)
gBattleResults.playerFaintCounter++;
if (gBattleMons[bank].level > gBattleMons[gActiveBattler].level)
{
- if (gBattleMons[bank].level - gBattleMons[gActiveBattler].level > 0x1D)
- AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], 8);
+ if (gBattleMons[bank].level - gBattleMons[gActiveBattler].level > 29)
+ AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], FRIENDSHIP_EVENT_FAINT_LARGE);
else
- AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], 6);
+ AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], FRIENDSHIP_EVENT_FAINT_SMALL);
}
}
else
@@ -5569,7 +5568,7 @@ static void atk23_getexp(void)
gLeveledUpInBattle |= gBitTable[gBattleStruct->expGetterID];
gBattlescriptCurrInstr = BattleScript_LevelUp;
gBattleMoveDamage = (gBattleBufferB[gActiveBattler][2] | (gBattleBufferB[gActiveBattler][3] << 8));
- AdjustFriendship(&gPlayerParty[gBattleStruct->expGetterID], 0);
+ AdjustFriendship(&gPlayerParty[gBattleStruct->expGetterID], FRIENDSHIP_EVENT_GROW_LEVEL);
// update battle mon structure after level up
if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterID && gBattleMons[0].hp)
diff --git a/src/battle/battle_party_menu.c b/src/battle/battle_party_menu.c
index be376a9f1..923cf05a4 100644
--- a/src/battle/battle_party_menu.c
+++ b/src/battle/battle_party_menu.c
@@ -232,16 +232,16 @@ void sub_8094B6C(u8 a, u8 b, u8 c)
}
}
-u8 sub_8094C20(u8 a)
+u8 sub_8094C20(u8 monIndex)
{
u8 retVal;
- u8 val = a & 1;
+ u8 val = monIndex & 1;
- a /= 2;
+ monIndex /= 2;
if (val)
- retVal = gUnknown_02038470[a] & 0xF;
+ retVal = gUnknown_02038470[monIndex] & 0xF;
else
- retVal = gUnknown_02038470[a] >> 4;
+ retVal = gUnknown_02038470[monIndex] >> 4;
return retVal;
}
diff --git a/src/choose_party.c b/src/choose_party.c
index b4920dedd..186b42de3 100644
--- a/src/choose_party.c
+++ b/src/choose_party.c
@@ -671,15 +671,16 @@ static void sub_8122B10(u8 taskId)
{
if (gMultiPartnerParty[i].species != 0)
{
- u8 r2;
+ u8 primaryStatus;
PartyMenuDoPrintHP(i + 3, 3, gMultiPartnerParty[i].hp, gMultiPartnerParty[i].maxhp);
if (gMultiPartnerParty[i].hp == 0)
- r2 = 7;
+ primaryStatus = 7;
else
- r2 = pokemon_ailments_get_primary(gMultiPartnerParty[i].status);
- if (r2 != 0)
- PartyMenuPutStatusTilemap(i + 3, 3, r2 - 1);
+ primaryStatus = GetPrimaryStatus(gMultiPartnerParty[i].status);
+
+ if (primaryStatus != STATUS_PRIMARY_NONE)
+ PartyMenuPutStatusTilemap(i + 3, 3, primaryStatus - 1);
else
PartyMenuDoPrintLevel(i + 3, 3, gMultiPartnerParty[i].level);
PartyMenuDoPrintGenderIcon(gMultiPartnerParty[i].species, gMultiPartnerParty[i].gender, 3, i + 3, gMultiPartnerParty[i].nickname);
diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c
index 3ae422512..918ab0e21 100644
--- a/src/field_control_avatar.c
+++ b/src/field_control_avatar.c
@@ -587,12 +587,11 @@ static void happiness_algorithm_step(void)
(*ptr) %= 128;
if (*ptr == 0)
{
- struct Pokemon *pkmn = gPlayerParty;
-
- for (i = 0; i < 6; i++)
+ struct Pokemon *mon = gPlayerParty;
+ for (i = 0; i < PARTY_SIZE; i++)
{
- AdjustFriendship(pkmn, 5);
- pkmn++;
+ AdjustFriendship(mon, FRIENDSHIP_EVENT_WALKING);
+ mon++;
}
}
}
diff --git a/src/field_poison.c b/src/field_poison.c
index 8365351f9..dd7500d22 100644
--- a/src/field_poison.c
+++ b/src/field_poison.c
@@ -8,53 +8,54 @@
#include "string_util.h"
#include "task.h"
#include "text.h"
+#include "constants/species.h"
extern u16 gSpecialVar_Result;
extern u8 fieldPoisonText_PokemonFainted[];
-bool32 CheckMonIsValid(struct Pokemon *pkmn)
+static bool32 IsMonValidSpecies(struct Pokemon *mon)
{
// UB: Too few arguments for function 'GetMonData'
- u16 species2 = GetMonData(pkmn, MON_DATA_SPECIES2);
-
- if (species2 == 0 || species2 == 0x19C)
+ u16 species = GetMonData(mon, MON_DATA_SPECIES2);
+ if (species == SPECIES_NONE || species == SPECIES_EGG)
return FALSE;
else
return TRUE;
}
-bool32 AllMonsFainted(void)
+static bool32 AllMonsFainted(void)
{
- struct Pokemon *pkmn = &gPlayerParty[0];
int i;
+ struct Pokemon *mon = gPlayerParty;
- for (i = 0; i < 6; i++, pkmn++)
+ for (i = 0; i < PARTY_SIZE; i++, mon++)
{
// UB: Too few arguments for function 'GetMonData'
- if (CheckMonIsValid(pkmn) && GetMonData(pkmn, MON_DATA_HP) != 0)
+ if (IsMonValidSpecies(mon) && GetMonData(mon, MON_DATA_HP) != 0)
return FALSE;
}
+
return TRUE;
}
-void MonFaintFromPoisonOnField(u8 partyMember)
+static void FaintFromFieldPoison(u8 monIndex)
{
- struct Pokemon *pkmn = &gPlayerParty[partyMember];
- u32 val = 0;
+ struct Pokemon *mon = &gPlayerParty[monIndex];
+ u32 status = 0;
- AdjustFriendship(pkmn, 7);
- SetMonData(pkmn, MON_DATA_STATUS, &val);
- GetMonData(pkmn, MON_DATA_NICKNAME, gStringVar1);
+ AdjustFriendship(mon, FRIENDSHIP_EVENT_FAINT_OUTSIDE_BATTLE);
+ SetMonData(mon, MON_DATA_STATUS, &status);
+ GetMonData(mon, MON_DATA_NICKNAME, gStringVar1);
StringGetEnd10(gStringVar1);
}
-bool32 CheckMonFaintedFromPoison(u8 partyMember)
+static bool32 MonFaintedFromPoison(u8 monIndex)
{
- struct Pokemon *pkmn = &gPlayerParty[partyMember];
+ struct Pokemon *mon = &gPlayerParty[monIndex];
// UB: Too few arguments for function 'GetMonData'
- if (CheckMonIsValid(pkmn) && GetMonData(pkmn, MON_DATA_HP) == 0
- && pokemon_ailments_get_primary(GetMonData(pkmn, MON_DATA_STATUS)) == 1)
+ if (IsMonValidSpecies(mon) && GetMonData(mon, MON_DATA_HP) == 0
+ && GetPrimaryStatus(GetMonData(mon, MON_DATA_STATUS)) == STATUS_PRIMARY_POISON)
return TRUE;
else
return FALSE;
@@ -63,7 +64,7 @@ bool32 CheckMonFaintedFromPoison(u8 partyMember)
#define tState data[0]
#define tPartyMember data[1]
-void Task_WhiteOut(u8 taskId)
+static void Task_WhiteOut(u8 taskId)
{
s16 *data = gTasks[taskId].data;
@@ -71,12 +72,12 @@ void Task_WhiteOut(u8 taskId)
{
case 0:
// Check if any Pokemon have fainted due to poison
- while (tPartyMember < 6)
+ while (tPartyMember < PARTY_SIZE)
{
- if (CheckMonFaintedFromPoison(tPartyMember))
+ if (MonFaintedFromPoison(tPartyMember))
{
// Show message about fainted mon
- MonFaintFromPoisonOnField(tPartyMember);
+ FaintFromFieldPoison(tPartyMember);
ShowFieldMessage(fieldPoisonText_PokemonFainted);
tState++;
return;
@@ -111,30 +112,30 @@ void ExecuteWhiteOut(void)
s32 DoPoisonFieldEffect(void)
{
- struct Pokemon *pkmn = &gPlayerParty[0];
+ struct Pokemon *mon = &gPlayerParty[0];
u32 numPoisoned = 0;
u32 numFainting = 0;
int i;
// count the number of mons that are poisoned and fainting from poison,
// and decrement HP of all poisoned mons
- for (i = 0; i < 6; i++)
+ for (i = 0; i < PARTY_SIZE; i++)
{
u32 hp;
- if (GetMonData(pkmn, MON_DATA_SANITY_BIT2) != 0
- && pokemon_ailments_get_primary(GetMonData(pkmn, MON_DATA_STATUS)) == 1)
+ if (GetMonData(mon, MON_DATA_SANITY_BIT2) != 0
+ && GetPrimaryStatus(GetMonData(mon, MON_DATA_STATUS)) == STATUS_PRIMARY_POISON)
{
// decrement HP of poisoned mon
- hp = GetMonData(pkmn, MON_DATA_HP);
+ hp = GetMonData(mon, MON_DATA_HP);
if (hp != 0)
hp--;
if (hp == 0)
numFainting++;
- SetMonData(pkmn, MON_DATA_HP, &hp);
+ SetMonData(mon, MON_DATA_HP, &hp);
numPoisoned++;
}
- pkmn++;
+ mon++;
}
if (numFainting != 0 || numPoisoned != 0)
FldeffPoison_Start();
diff --git a/src/party_menu.c b/src/party_menu.c
index 9caaa05b9..c21c29b01 100644
--- a/src/party_menu.c
+++ b/src/party_menu.c
@@ -450,8 +450,8 @@ struct Unk201C000
{
/*0x00*/ struct Pokemon *pokemon;
/*0x04*/ u8 unk4;
- /*0x05*/ u8 unk5;
- /*0x06*/ u16 unk6;
+ /*0x05*/ u8 primarySelectedMonIndex;
+ /*0x06*/ u16 secondarySelectedIndex;
/*0x08*/ u16 unk8;
/*0x0A*/ u8 pad_0A[2];
/*0x0C*/ s32 unkC;
@@ -3601,9 +3601,9 @@ void sub_806E8D0(u8 taskId, u16 b, TaskFunc c)
{
ewram1C000.unk10 = c;
ewram1C000.unk4 = taskId;
- ewram1C000.unk5 = sub_806CA38(taskId);
- ewram1C000.unk6 = b;
- ewram1C000.pokemon = &gPlayerParty[ewram1C000.unk5];
+ ewram1C000.primarySelectedMonIndex = sub_806CA38(taskId);
+ ewram1C000.secondarySelectedIndex = b;
+ ewram1C000.pokemon = &gPlayerParty[ewram1C000.primarySelectedMonIndex];
}
bool8 PartyMenuUpdateMonHeldItem(struct Pokemon *pkmn, u16 item)
@@ -3664,7 +3664,7 @@ void PartyMenuTryGiveMonHeldItem(u8 taskId, u16 newItem, TaskFunc c)
}
else
{
- DisplayGiveHeldItemMessage(ewram1C000.unk5, newItem, 1);
+ DisplayGiveHeldItemMessage(ewram1C000.primarySelectedMonIndex, newItem, 1);
CreateTask(party_menu_link_mon_held_item_object, 5);
}
}
@@ -3674,7 +3674,7 @@ void party_menu_link_mon_held_item_object(u8 taskId)
{
if (gUnknown_0202E8F6 == 0)
{
- SetHeldItemIconVisibility(ewram1C000.unk4, ewram1C000.unk5);
+ SetHeldItemIconVisibility(ewram1C000.unk4, ewram1C000.primarySelectedMonIndex);
gTasks[ewram1C000.unk4].func = ewram1C000.unk10;
DestroyTask(taskId);
}
@@ -3690,17 +3690,17 @@ void PartyMenuTryGiveMonHeldItem_806EACC(u8 taskId)
Menu_EraseWindowRect(23, 8, 29, 13);
currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM);
- RemoveBagItem(ewram1C000.unk6, 1);
+ RemoveBagItem(ewram1C000.secondarySelectedIndex, 1);
if (AddBagItem(currentItem, 1) == TRUE)
{
- PartyMenuUpdateMonHeldItem(ewram1C000.pokemon, ewram1C000.unk6);
- if (ItemIsMail(ewram1C000.unk6))
+ PartyMenuUpdateMonHeldItem(ewram1C000.pokemon, ewram1C000.secondarySelectedIndex);
+ if (ItemIsMail(ewram1C000.secondarySelectedIndex))
{
- DisplayTakeHeldItemMessage(ewram1C000.unk5, currentItem, 1);
+ DisplayTakeHeldItemMessage(ewram1C000.primarySelectedMonIndex, currentItem, 1);
}
else
{
- CopyItemName(ewram1C000.unk6, gStringVar1);
+ CopyItemName(ewram1C000.secondarySelectedIndex, gStringVar1);
StringExpandPlaceholders(gStringVar4, gOtherText_TakenAndReplaced);
sub_806E834(gStringVar4, 1);
}
@@ -3708,7 +3708,7 @@ void PartyMenuTryGiveMonHeldItem_806EACC(u8 taskId)
else
{
sub_806E834(gOtherText_BagFullCannotRemoveItem, 0);
- AddBagItem(ewram1C000.unk6, 1);
+ AddBagItem(ewram1C000.secondarySelectedIndex, 1);
}
}
else
@@ -3789,7 +3789,7 @@ void PartyMenuTryGiveMonHeldItem_806ECE8(u8 taskId, TaskFunc func)
{
if (ItemIsMail(currentItem) == TRUE)
TakeMailFromMon(ewram1C000.pokemon);
- DisplayTakeHeldItemMessage(ewram1C000.unk5, currentItem, 0);
+ DisplayTakeHeldItemMessage(ewram1C000.primarySelectedMonIndex, currentItem, 0);
SetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM, itemData);
}
else
@@ -3812,7 +3812,7 @@ void DoTakeMail(u8 taskId, TaskFunc func)
{
gTasks[taskId].func = TaskDummy;
sub_806E8D0(taskId, 0, func);
- ewram1C000.unk6 = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM);
+ ewram1C000.secondarySelectedIndex = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM);
sub_806E834(gOtherText_SendRemovedMailPrompt, 1);
CreateTask(Task_ConfirmTakeHeldMail, 5);
}
@@ -3823,7 +3823,7 @@ void Task_LoseMailMessage(u8 taskId)
if (selection == 0)
{
- if (AddBagItem(ewram1C000.unk6, 1) == TRUE)
+ if (AddBagItem(ewram1C000.secondarySelectedIndex, 1) == TRUE)
{
TakeMailFromMon(ewram1C000.pokemon);
sub_806E834(gOtherText_MailTaken, 0);
@@ -3923,7 +3923,7 @@ extern u8 gUnknown_020297ED;
void Task_TeamMonTMMove(u8 taskId)
{
GetMonNickname(ewram1C000.pokemon, gStringVar1);
- ewram1C000.unk8 = ItemIdToBattleMoveId(ewram1C000.unk6);
+ ewram1C000.unk8 = ItemIdToBattleMoveId(ewram1C000.secondarySelectedIndex);
StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]);
ewram1B000.unk282 = 0;
if (pokemon_has_move(ewram1C000.pokemon, ewram1C000.unk8))
@@ -3938,7 +3938,7 @@ void Task_TeamMonTMMove(u8 taskId)
#if DEBUG
!gUnknown_020297ED &&
#endif
- !CanMonLearnTMHM(ewram1C000.pokemon, ewram1C000.unk6 - 33))
+ !CanMonLearnTMHM(ewram1C000.pokemon, ewram1C000.secondarySelectedIndex - 33))
{
StringExpandPlaceholders(gStringVar4, gOtherText_NotCompatible);
sub_806E834(gStringVar4, 1);
@@ -3965,9 +3965,9 @@ void Task_TeamMonTMMove2(u8 taskId)
StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]);
StringExpandPlaceholders(gStringVar4, gOtherText_LearnedMove);
sub_806E834(gStringVar4, 1);
- AdjustFriendship(ewram1C000.pokemon, 4);
- if (ewram1B000.unk282 == 0 && ewram1C000.unk6 <= 0x152)
- RemoveBagItem(ewram1C000.unk6, 1);
+ AdjustFriendship(ewram1C000.pokemon, FRIENDSHIP_EVENT_LEARN_TMHM);
+ if (ewram1B000.unk282 == 0 && ewram1C000.secondarySelectedIndex < ITEM_HM01_CUT)
+ RemoveBagItem(ewram1C000.secondarySelectedIndex, 1);
gTasks[taskId].func = Task_TeamMonTMMove3;
}
@@ -3986,7 +3986,7 @@ void Task_TeamMonTMMove4(u8 taskId)
{
if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON))
{
- SetHeldItemIconVisibility(ewram1C000.unk4, ewram1C000.unk5);
+ SetHeldItemIconVisibility(ewram1C000.unk4, ewram1C000.primarySelectedMonIndex);
if (ewram1B000.unk282 == 1)
{
TeachMonMoveInPartyMenu(taskId);
@@ -4004,7 +4004,7 @@ void sub_806F2FC(u8 taskId)
{
if (gUnknown_0202E8F6 == 0)
{
- SetHeldItemIconVisibility(ewram1C000.unk4, ewram1C000.unk5);
+ SetHeldItemIconVisibility(ewram1C000.unk4, ewram1C000.primarySelectedMonIndex);
if (ewram1B000.unk282 == 1)
{
TeachMonMoveInPartyMenu(taskId);
@@ -4050,7 +4050,7 @@ void sub_806F3FC(u8 taskId)
{
if (!gPaletteFade.active)
{
- ShowSelectMovePokemonSummaryScreen(gPlayerParty, ewram1C000.unk5, gPlayerPartyCount - 1, sub_808B564, ewram1C000.unk8);
+ ShowSelectMovePokemonSummaryScreen(gPlayerParty, ewram1C000.primarySelectedMonIndex, gPlayerPartyCount - 1, sub_808B564, ewram1C000.unk8);
DestroyTask(taskId);
}
}
@@ -4184,7 +4184,7 @@ s16 sub_806F7E8(u8 taskId, struct BattleInterfaceStruct1 *b, s8 c)
b->unkC_0 = 5;
if (hpBarLevel < 2)
b->unkC_0 = 6;
- vramPtr = gUnknown_08376858[IsDoubleBattle()][ewram1C000.unk5];
+ vramPtr = gUnknown_08376858[IsDoubleBattle()][ewram1C000.primarySelectedMonIndex];
return sub_80460C8(b, &ewram1C000.unkC, vramPtr, 0);
}
@@ -4208,19 +4208,19 @@ void sub_806F8AC(u8 taskId)
StringExpandPlaceholders(gStringVar4, gOtherText_HPRestoredBy);
else
StringExpandPlaceholders(gStringVar4, gOtherText_RegainedHealth);
- SetMonIconAnim(GetMonIconSpriteId(ewram1C000.unk4, ewram1C000.unk5), ewram1C000.pokemon);
- task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + ewram1C000.unk5 * 2], 7);
+ SetMonIconAnim(GetMonIconSpriteId(ewram1C000.unk4, ewram1C000.primarySelectedMonIndex), ewram1C000.pokemon);
+ task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + ewram1C000.primarySelectedMonIndex * 2], 7);
ewram1B000.unk261 = 2;
sub_806E834(gStringVar4, 1);
sp14 += sp0.unk4;
SetMonData(ewram1C000.pokemon, MON_DATA_HP, &sp14);
- RemoveBagItem(ewram1C000.unk6, 1);
+ RemoveBagItem(ewram1C000.secondarySelectedIndex, 1);
sub_8032638();
gTasks[taskId].func = sub_806FB44;
}
else
{
- PartyMenuDoPrintHP(ewram1C000.unk5, IsDoubleBattle(), ewram1B000.unk282, sp0.unk0);
+ PartyMenuDoPrintHP(ewram1C000.primarySelectedMonIndex, IsDoubleBattle(), ewram1B000.unk282, sp0.unk0);
}
}
@@ -4236,8 +4236,8 @@ void sub_806FA18(u8 taskId)
gTasks[taskId].data[11] -= gTasks[taskId].data[12];
SetMonData(ewram1C000.pokemon, MON_DATA_HP, &gTasks[taskId].data[11]);
SetMonIconAnim(GetMonIconSpriteId(ewram1C000.unk4, ewram01000.unk1), ewram1C000.pokemon);
- ewram1C000.unk5 = gSprites[ewram01000.unk2].data[0];
- ewram1C000.pokemon = &gPlayerParty[ewram1C000.unk5];
+ ewram1C000.primarySelectedMonIndex = gSprites[ewram01000.unk2].data[0];
+ ewram1C000.pokemon = &gPlayerParty[ewram1C000.primarySelectedMonIndex];
gTasks[taskId].data[10] = GetMonData(ewram1C000.pokemon, MON_DATA_MAX_HP);
gTasks[taskId].data[11] = GetMonData(ewram1C000.pokemon, MON_DATA_HP);
ewram1C000.unkC = -32768;
@@ -4247,7 +4247,7 @@ void sub_806FA18(u8 taskId)
}
else
{
- PartyMenuDoPrintHP(ewram1C000.unk5, IsDoubleBattle(), ewram1B000.unk282, sp0.unk0);
+ PartyMenuDoPrintHP(ewram1C000.primarySelectedMonIndex, IsDoubleBattle(), ewram1B000.unk282, sp0.unk0);
}
}
@@ -4364,12 +4364,12 @@ bool8 IsMedicineIneffective(struct Pokemon *pkmn, u16 item)
return FALSE;
}
-bool8 ExecuteTableBasedItemEffect__(u8 a, u16 b, u8 c)
+bool8 ExecuteTableBasedItemEffect__(u8 monIndex, u16 item, u8 moveIndex)
{
if (gMain.inBattle)
- return ExecuteTableBasedItemEffect_(&gPlayerParty[a], b, sub_8094C20(a), c);
+ return ExecuteTableBasedItemEffect_(&gPlayerParty[monIndex], item, sub_8094C20(monIndex), moveIndex);
else
- return ExecuteTableBasedItemEffect_(&gPlayerParty[a], b, a, c);
+ return ExecuteTableBasedItemEffect_(&gPlayerParty[monIndex], item, monIndex, moveIndex);
}
void UseMedicine(u8 taskId, u16 item, TaskFunc func)
@@ -4395,7 +4395,7 @@ void UseMedicine(u8 taskId, u16 item, TaskFunc func)
gTasks[r7].data[11] = 0;
}
}
- r0 = ExecuteTableBasedItemEffect__(ewram1C000.unk5, item, 0);
+ r0 = ExecuteTableBasedItemEffect__(ewram1C000.primarySelectedMonIndex, item, 0);
}
else
{
@@ -4420,7 +4420,7 @@ void UseMedicine(u8 taskId, u16 item, TaskFunc func)
PlaySE(SE_BIDORO);
statusAndPkrs = GetMonStatusAndPokerus(ewram1C000.pokemon);
if (statusAndPkrs == 6 || statusAndPkrs == 0)
- PartyMenuUpdateLevelOrStatus(ewram1C000.pokemon, ewram1C000.unk5);
+ PartyMenuUpdateLevelOrStatus(ewram1C000.pokemon, ewram1C000.primarySelectedMonIndex);
if (r9 == TRUE)
{
gTasks[r7].data[12] = GetMonData(ewram1C000.pokemon, MON_DATA_HP) - gTasks[r7].data[11];
@@ -4439,7 +4439,7 @@ void UseMedicine(u8 taskId, u16 item, TaskFunc func)
if (!IsBlueYellowRedFlute(item))
RemoveBagItem(item, 1);
GetMedicineItemEffectMessage(item);
- TryPrintPartyMenuMonNickname(ewram1C000.unk5, ewram1C000.pokemon);
+ TryPrintPartyMenuMonNickname(ewram1C000.primarySelectedMonIndex, ewram1C000.pokemon);
sub_806E834(gStringVar4, 1);
gTasks[r7].func = sub_806FB0C;
}
@@ -4460,8 +4460,8 @@ void sub_8070048(u8 taskId, u16 item, TaskFunc func)
{
ewram1C000.unk10 = func;
ewram1C000.unk4 = taskId;
- ewram1C000.unk6 = item;
- ewram1C000.unk5 = 0;
+ ewram1C000.secondarySelectedIndex = item;
+ ewram1C000.primarySelectedMonIndex = 0;
ewram1C000.unk14 = sub_80701DC;
ewram1B000.unk27E = 0;
ewram1B000.unk280 = 0;
@@ -4473,7 +4473,7 @@ void sub_8070088(u8 taskId)
u8 taskId2;
gTasks[taskId].func = TaskDummy;
- if (GetMonData(&gPlayerParty[ewram1C000.unk5], MON_DATA_SPECIES) == 0)
+ if (GetMonData(&gPlayerParty[ewram1C000.primarySelectedMonIndex], MON_DATA_SPECIES) == 0)
{
gTasks[taskId].func = sub_80701DC;
}
@@ -4483,10 +4483,10 @@ void sub_8070088(u8 taskId)
taskId2 = CreateTask(TaskDummy, 5);
taskData = gTasks[taskId2].data;
- ewram1C000.pokemon = &gPlayerParty[ewram1C000.unk5];
+ ewram1C000.pokemon = &gPlayerParty[ewram1C000.primarySelectedMonIndex];
taskData[10] = GetMonData(ewram1C000.pokemon, MON_DATA_MAX_HP);
taskData[11] = GetMonData(ewram1C000.pokemon, MON_DATA_HP);
- if (ExecuteTableBasedItemEffect__(ewram1C000.unk5, ewram1C000.unk6, 0))
+ if (ExecuteTableBasedItemEffect__(ewram1C000.primarySelectedMonIndex, ewram1C000.secondarySelectedIndex, 0))
{
DestroyTask(taskId2);
gTasks[taskId].func = sub_80701DC;
@@ -4496,8 +4496,8 @@ void sub_8070088(u8 taskId)
gUnknown_0202E8F4 = 1;
Menu_EraseWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19);
PlaySE(SE_KAIFUKU);
- PartyMenuUpdateLevelOrStatus(ewram1C000.pokemon, ewram1C000.unk5);
- task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + ewram1C000.unk5 * 2], 9);
+ PartyMenuUpdateLevelOrStatus(ewram1C000.pokemon, ewram1C000.primarySelectedMonIndex);
+ task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + ewram1C000.primarySelectedMonIndex * 2], 9);
ewram1B000.unk261 = 2;
taskData[12] = GetMonData(ewram1C000.pokemon, MON_DATA_HP) - taskData[11];
taskData[14] = 1;
@@ -4514,16 +4514,16 @@ void sub_80701DC(u8 taskId)
{
if (ewram1B000.unk27E == 1)
{
- AddBagItem(ewram1C000.unk6, 1);
- if (GetMonData(&gPlayerParty[ewram1C000.unk5], MON_DATA_SPECIES) != 0)
+ AddBagItem(ewram1C000.secondarySelectedIndex, 1);
+ if (GetMonData(&gPlayerParty[ewram1C000.primarySelectedMonIndex], MON_DATA_SPECIES) != 0)
{
- task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + ewram1C000.unk5 * 2], 3);
+ task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + ewram1C000.primarySelectedMonIndex * 2], 3);
ewram1B000.unk261 = 2;
}
ewram1B000.unk27E = 0;
}
- ewram1C000.unk5++;
- if (ewram1C000.unk5 == 6)
+ ewram1C000.primarySelectedMonIndex++;
+ if (ewram1C000.primarySelectedMonIndex == 6)
{
gUnknown_0202E8F4 = 0;
if (ewram1B000.unk280 == 0)
@@ -4534,7 +4534,7 @@ void sub_80701DC(u8 taskId)
}
else
{
- RemoveBagItem(ewram1C000.unk6, 1);
+ RemoveBagItem(ewram1C000.secondarySelectedIndex, 1);
gTasks[taskId].func = ewram1C000.unk10;
}
gLastFieldPokeMenuOpened = 0;
@@ -4607,7 +4607,7 @@ void DoPPRecoveryItemEffect(u8 taskId, u16 item, TaskFunc c)
{
PlaySE(SE_SELECT);
PrintPartyMenuPromptText(10, 3);
- CreateItemUseMoveMenu(ewram1C000.unk5);
+ CreateItemUseMoveMenu(ewram1C000.primarySelectedMonIndex);
gTasks[taskId2].func = Task_HandleItemUseMoveMenuInput;
gMain.newKeys = 0;
}
@@ -4638,7 +4638,7 @@ void DoRecoverPP(u8 taskId)
{
u16 r5 = 0;
- if (ExecuteTableBasedItemEffect__(ewram1C000.unk5, ewram1C000.unk6, gTasks[taskId].data[11]))
+ if (ExecuteTableBasedItemEffect__(ewram1C000.primarySelectedMonIndex, ewram1C000.secondarySelectedIndex, gTasks[taskId].data[11]))
{
gUnknown_0202E8F4 = r5;
PlaySE(SE_SELECT);
@@ -4648,10 +4648,10 @@ void DoRecoverPP(u8 taskId)
{
gUnknown_0202E8F4 = 1;
PlaySE(SE_KAIFUKU);
- RemoveBagItem(ewram1C000.unk6, 1);
+ RemoveBagItem(ewram1C000.secondarySelectedIndex, 1);
r5 = GetMonData(ewram1C000.pokemon, MON_DATA_MOVE1 + gTasks[taskId].data[11]);
StringCopy(gStringVar1, gMoveNames[r5]);
- GetMedicineItemEffectMessage(ewram1C000.unk6);
+ GetMedicineItemEffectMessage(ewram1C000.secondarySelectedIndex);
sub_806E834(gStringVar4, 1);
}
gTasks[taskId].func = sub_806FB0C;
@@ -4663,7 +4663,7 @@ void DoPPUpItemEffect(u8 taskId, u16 b, TaskFunc c)
sub_806E8D0(taskId, b, c);
PlaySE(SE_SELECT);
PrintPartyMenuPromptText(11, 3);
- CreateItemUseMoveMenu(ewram1C000.unk5);
+ CreateItemUseMoveMenu(ewram1C000.primarySelectedMonIndex);
CreateTask(Task_HandleItemUseMoveMenuInput, 5);
gMain.newKeys = 0;
}
@@ -4698,24 +4698,24 @@ const u8 gUnknown_Debug_839B6D8[] = _(
#endif
-void DoRareCandyItemEffect(u8 taskId, u16 b, TaskFunc c)
+void DoRareCandyItemEffect(u8 taskId, u16 item, TaskFunc c)
{
u8 i;
- bool8 r0;
+ bool8 noEffect;
gTasks[taskId].func = TaskDummy;
- sub_806E8D0(taskId, b, c);
+ sub_806E8D0(taskId, item, c);
if (GetMonData(ewram1C000.pokemon, MON_DATA_LEVEL) != 100)
{
- for (i = 0; i < 6; i++)
+ for (i = 0; i < NUM_STATS; i++)
ewram1B000.statGrowths[i] = GetMonData(ewram1C000.pokemon, StatDataTypes[i]);
- r0 = ExecuteTableBasedItemEffect__(ewram1C000.unk5, b, 0);
+ noEffect = ExecuteTableBasedItemEffect__(ewram1C000.primarySelectedMonIndex, item, 0);
}
else
- r0 = TRUE;
+ noEffect = TRUE;
- if (r0)
+ if (noEffect)
{
gUnknown_0202E8F4 = 0;
PlaySE(SE_SELECT);
@@ -4728,8 +4728,8 @@ void DoRareCandyItemEffect(u8 taskId, u16 b, TaskFunc c)
gUnknown_0202E8F4 = 1;
PlayFanfareByFanfareNum(0);
- RedrawPokemonInfoInMenu(ewram1C000.unk5, ewram1C000.pokemon);
- RemoveBagItem(b, 1);
+ RedrawPokemonInfoInMenu(ewram1C000.primarySelectedMonIndex, ewram1C000.pokemon);
+ RemoveBagItem(item, 1);
GetMonNickname(ewram1C000.pokemon, gStringVar1);
level = GetMonData(ewram1C000.pokemon, MON_DATA_LEVEL);
ConvertIntToDecimalStringN(gStringVar2, level, 0, 3);
@@ -4878,7 +4878,7 @@ void Task_RareCandy3(u8 taskId)
if (evolutionSpecies != 0)
{
gCB2_AfterEvolution = sub_80A53F8;
- BeginEvolutionScene(ewram1C000.pokemon, evolutionSpecies, TRUE, ewram1C000.unk5);
+ BeginEvolutionScene(ewram1C000.pokemon, evolutionSpecies, TRUE, ewram1C000.primarySelectedMonIndex);
DestroyTask(taskId);
}
else
@@ -4930,7 +4930,7 @@ void TeachMonMoveInPartyMenu(u8 taskId)
if (evolutionSpecies != 0)
{
gCB2_AfterEvolution = sub_80A53F8;
- BeginEvolutionScene(ewram1C000.pokemon, evolutionSpecies, TRUE, ewram1C000.unk5);
+ BeginEvolutionScene(ewram1C000.pokemon, evolutionSpecies, TRUE, ewram1C000.primarySelectedMonIndex);
DestroyTask(taskId);
}
else
@@ -4981,7 +4981,7 @@ void DoEvolutionStoneItemEffect(u8 taskId, u16 evolutionStoneItem, TaskFunc c)
gCB2_AfterEvolution = sub_80A53F8;
- if (ExecuteTableBasedItemEffect__(ewram1C000.unk5, evolutionStoneItem, 0))
+ if (ExecuteTableBasedItemEffect__(ewram1C000.primarySelectedMonIndex, evolutionStoneItem, 0))
{
gUnknown_0202E8F4 = 0;
sub_806E834(gOtherText_WontHaveAnyEffect, 1);
diff --git a/src/pokemon_3.c b/src/pokemon_3.c
index 791dd5d2f..ac739728e 100644
--- a/src/pokemon_3.c
+++ b/src/pokemon_3.c
@@ -22,6 +22,7 @@
#include "sprite.h"
#include "string_util.h"
#include "text.h"
+#include "trainer.h"
#include "util.h"
#include "ewram.h"
@@ -643,18 +644,19 @@ u16 nature_stat_mod(u8 nature, u16 n, u8 statIndex)
return n;
}
-const s8 gUnknown_082082FE[][3] =
-{
- // Happiness deltas
- { 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}
+// Friendship deltas. Each event has 3 separate values, depending on the mon's
+// current friendship value. In general, a mon's friendship grows faster if
+// its current friendship is lower. The 3 tiers are 0-99, 100-199, and 200-255.
+static const s8 sFriendshipEventDeltas[][3] = {
+ { 5, 3, 2}, // FRIENDSHIP_EVENT_GROW_LEVEL
+ { 5, 3, 2}, // FRIENDSHIP_EVENT_VITAMIN
+ { 1, 1, 0}, // FRIENDSHIP_EVENT_BATTLE_ITEM
+ { 3, 2, 1}, // FRIENDSHIP_EVENT_LEAGUE_BATTLE
+ { 1, 1, 0}, // FRIENDSHIP_EVENT_LEARN_TMHM
+ { 1, 1, 1}, // FRIENDSHIP_EVENT_WALKING
+ {-1, -1, -1}, // FRIENDSHIP_EVENT_FAINT_SMALL
+ {-5, -5, -10}, // FRIENDSHIP_EVENT_FAINT_OUTSIDE_BATTLE
+ {-5, -5, -10}, // FRIENDSHIP_EVENT_FAINT_LARGE
};
void AdjustFriendship(struct Pokemon *mon, u8 event)
@@ -683,28 +685,32 @@ void AdjustFriendship(struct Pokemon *mon, u8 event)
friendshipLevel++;
if (friendship > 199)
friendshipLevel++;
- if ((event != 5 || !(Random() & 1))
- && (event != 3
+
+ if ((event != FRIENDSHIP_EVENT_WALKING || !(Random() & 1))
+ && (event != FRIENDSHIP_EVENT_LEAGUE_BATTLE
|| ((gBattleTypeFlags & BATTLE_TYPE_TRAINER)
- && (gTrainers[gTrainerBattleOpponent].trainerClass == 24
- || gTrainers[gTrainerBattleOpponent].trainerClass == 25
- || gTrainers[gTrainerBattleOpponent].trainerClass == 32))))
+ && (gTrainers[gTrainerBattleOpponent].trainerClass == TRAINER_CLASS_ELITE_FOUR
+ || gTrainers[gTrainerBattleOpponent].trainerClass == TRAINER_CLASS_LEADER
+ || gTrainers[gTrainerBattleOpponent].trainerClass == TRAINER_CLASS_CHAMPION))))
{
- s8 mod = gUnknown_082082FE[event][friendshipLevel];
- if (mod > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP)
- mod = (150 * mod) / 100;
- friendship += mod;
- if (mod > 0)
+ 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) == sav1_map_get_name())
friendship++;
}
+
if (friendship < 0)
friendship = 0;
if (friendship > 255)
friendship = 255;
+
SetMonData(mon, MON_DATA_FRIENDSHIP, &friendship);
}
}
diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c
index 75ddb52d0..2bfb42681 100644
--- a/src/pokemon_summary_screen.c
+++ b/src/pokemon_summary_screen.c
@@ -4823,20 +4823,20 @@ void sub_80A1C30(u8 a)
}
}
-u8 pokemon_ailments_get_primary(u32 status)
+u8 GetPrimaryStatus(u32 status)
{
- if (status & 0x88)
- return 1;
- if (status & 0x40)
- return 2;
- if (status & 0x7)
- return 3;
- if (status & 0x20)
- return 4;
- if (status & 0x10)
- return 5;
-
- return 0;
+ if (status & (STATUS_POISON | STATUS_TOXIC_POISON))
+ return STATUS_PRIMARY_POISON;
+ if (status & STATUS_PARALYSIS)
+ return STATUS_PRIMARY_PARALYSIS;
+ if (status & STATUS_SLEEP)
+ return STATUS_PRIMARY_SLEEP;
+ if (status & STATUS_FREEZE)
+ return STATUS_PRIMARY_FREEZE;
+ if (status & STATUS_BURN)
+ return STATUS_PRIMARY_BURN;
+
+ return STATUS_PRIMARY_NONE;
}
u8 GetMonStatusAndPokerus(struct Pokemon *mon)
@@ -4846,8 +4846,8 @@ u8 GetMonStatusAndPokerus(struct Pokemon *mon)
if (GetMonData(mon, MON_DATA_HP) == 0)
return 7;
- statusAilment = pokemon_ailments_get_primary(GetMonData(mon, MON_DATA_STATUS));
- if (statusAilment == 0)
+ statusAilment = GetPrimaryStatus(GetMonData(mon, MON_DATA_STATUS));
+ if (statusAilment == STATUS_PRIMARY_NONE)
{
if (!CheckPartyPokerus(mon, 0))
return 0;