summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/constants/item_effects.h79
-rw-r--r--include/constants/items.h2
-rw-r--r--src/battle_ai_switch_items.c38
-rw-r--r--src/data/pokemon/item_effects.h704
-rwxr-xr-xsrc/item_use.c65
-rwxr-xr-xsrc/party_menu.c181
-rw-r--r--src/pokemon.c80
7 files changed, 739 insertions, 410 deletions
diff --git a/include/constants/item_effects.h b/include/constants/item_effects.h
new file mode 100644
index 000000000..a5bb77035
--- /dev/null
+++ b/include/constants/item_effects.h
@@ -0,0 +1,79 @@
+#ifndef GUARD_CONSTANTS_ITEM_EFFECTS_H
+#define GUARD_CONSTANTS_ITEM_EFFECTS_H
+
+// field 0 masks
+#define ITEM0_X_ATTACK 0x0F
+#define ITEM0_HIGH_CRIT 0x30 // For Dire Hit, works the same way as move Focus Energy.
+#define ITEM0_SACRED_ASH 0x40
+#define ITEM0_INFATUATION 0x80
+
+// field 1 masks
+#define ITEM1_X_SPEED 0x0F
+#define ITEM1_X_DEFEND 0xF0
+
+// field 2 masks
+#define ITEM2_X_SPATK 0x0F
+#define ITEM2_X_ACCURACY 0xF0
+
+// field 3 masks
+#define ITEM3_CONFUSION 0x1
+#define ITEM3_PARALYSIS 0x2
+#define ITEM3_FREEZE 0x4
+#define ITEM3_BURN 0x8
+#define ITEM3_POISON 0x10
+#define ITEM3_SLEEP 0x20
+#define ITEM3_LEVEL_UP 0x40
+#define ITEM3_MIST 0x80 // For Guard Specs, works the same way as move Mist.
+
+#define ITEM3_STATUS_ALL (ITEM3_CONFUSION | ITEM3_PARALYSIS | ITEM3_FREEZE | ITEM3_BURN | ITEM3_POISON | ITEM3_SLEEP)
+
+// field 4 masks
+#define ITEM4_EV_HP 0x1
+#define ITEM4_EV_ATK 0x2
+#define ITEM4_HEAL_HP 0x4
+#define ITEM4_HEAL_PP_ALL 0x8
+#define ITEM4_HEAL_PP_ONE 0x10
+#define ITEM4_PP_UP 0x20
+#define ITEM4_REVIVE 0x40
+#define ITEM4_EVO_STONE 0x80
+
+// field 5 masks
+#define ITEM5_EV_DEF 0x1
+#define ITEM5_EV_SPEED 0x2
+#define ITEM5_EV_SPDEF 0x4
+#define ITEM5_EV_SPATK 0x8
+#define ITEM5_PP_MAX 0x10
+#define ITEM5_FRIENDSHIP_LOW 0x20
+#define ITEM5_FRIENDSHIP_MID 0x40
+#define ITEM5_FRIENDSHIP_HIGH 0x80
+
+#define ITEM5_FRIENDSHIP_ALL (ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID | ITEM5_FRIENDSHIP_HIGH)
+
+// fields 6 and onwards are item-specific arguments
+
+// Used for GetItemEffectType.
+#define ITEM_EFFECT_X_ITEM 0
+#define ITEM_EFFECT_RAISE_LEVEL 1
+#define ITEM_EFFECT_HEAL_HP 2
+#define ITEM_EFFECT_CURE_POISON 3
+#define ITEM_EFFECT_CURE_SLEEP 4
+#define ITEM_EFFECT_CURE_BURN 5
+#define ITEM_EFFECT_CURE_FREEZE 6
+#define ITEM_EFFECT_CURE_PARALYSIS 7
+#define ITEM_EFFECT_CURE_CONFUSION 8
+#define ITEM_EFFECT_CURE_INFATUATION 9
+#define ITEM_EFFECT_SACRED_ASH 10
+#define ITEM_EFFECT_CURE_ALL_STATUS 11
+#define ITEM_EFFECT_ATK_EV 12
+#define ITEM_EFFECT_HP_EV 13
+#define ITEM_EFFECT_SPATK_EV 14
+#define ITEM_EFFECT_SPDEF_EV 15
+#define ITEM_EFFECT_SPEED_EV 16
+#define ITEM_EFFECT_DEF_EV 17
+#define ITEM_EFFECT_EVO_STONE 18
+#define ITEM_EFFECT_PP_UP 19
+#define ITEM_EFFECT_PP_MAX 20
+#define ITEM_EFFECT_HEAL_PP 21
+#define ITEM_EFFECT_NONE 22
+
+#endif // GUARD_CONSTANTS_ITEM_EFFECTS_H
diff --git a/include/constants/items.h b/include/constants/items.h
index 294499c8b..3a894f8ff 100644
--- a/include/constants/items.h
+++ b/include/constants/items.h
@@ -473,6 +473,6 @@
#define NUM_HIDDEN_MACHINES 8
// Check if the item is one that can be used on a Pokemon.
-#define IS_POKEMON_ITEM(item) ((item) >= ITEM_POTION && (item) <= ITEM_0B2)
+#define ITEM_HAS_EFFECT(item) ((item) >= ITEM_POTION && (item) <= ITEM_0B2)
#endif // GUARD_CONSTANTS_ITEMS_H
diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c
index 2d67fda99..de798eee3 100644
--- a/src/battle_ai_switch_items.c
+++ b/src/battle_ai_switch_items.c
@@ -6,6 +6,7 @@
#include "random.h"
#include "util.h"
#include "constants/abilities.h"
+#include "constants/item_effects.h"
#include "constants/items.h"
#include "constants/moves.h"
#include "constants/species.h"
@@ -778,18 +779,17 @@ u8 GetMostSuitableMonToSwitchInto(void)
return bestMonId;
}
-// TODO: use PokemonItemEffect struct instead of u8 once it's documented.
static u8 GetAI_ItemType(u8 itemId, const u8 *itemEffect) // NOTE: should take u16 as item Id argument
{
if (itemId == ITEM_FULL_RESTORE)
return AI_ITEM_FULL_RESTORE;
- else if (itemEffect[4] & 4)
+ else if (itemEffect[4] & ITEM4_HEAL_HP)
return AI_ITEM_HEAL_HP;
- else if (itemEffect[3] & 0x3F)
+ else if (itemEffect[3] & ITEM3_STATUS_ALL)
return AI_ITEM_CURE_CONDITION;
- else if (itemEffect[0] & 0x3F || itemEffect[1] != 0 || itemEffect[2] != 0)
+ else if (itemEffect[0] & (ITEM0_HIGH_CRIT | ITEM0_X_ATTACK) || itemEffect[1] != 0 || itemEffect[2] != 0)
return AI_ITEM_X_STAT;
- else if (itemEffect[3] & 0x80)
+ else if (itemEffect[3] & ITEM3_MIST)
return AI_ITEM_GUARD_SPECS;
else
return AI_ITEM_NOT_RECOGNIZABLE;
@@ -832,13 +832,13 @@ static bool8 ShouldUseItem(void)
item = gBattleResources->battleHistory->trainerItems[i];
if (item == ITEM_NONE)
continue;
- if (gItemEffectTable[item - 13] == NULL)
+ if (gItemEffectTable[item - ITEM_POTION] == NULL)
continue;
if (item == ITEM_ENIGMA_BERRY)
itemEffects = gSaveBlock1Ptr->enigmaBerry.itemEffect;
else
- itemEffects = gItemEffectTable[item - 13];
+ itemEffects = gItemEffectTable[item - ITEM_POTION];
*(gBattleStruct->AI_itemType + gActiveBattler / 2) = GetAI_ItemType(item, itemEffects);
@@ -862,32 +862,32 @@ static bool8 ShouldUseItem(void)
break;
case AI_ITEM_CURE_CONDITION:
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) = 0;
- if (itemEffects[3] & 0x20 && gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP)
+ if (itemEffects[3] & ITEM3_SLEEP && gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP)
{
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x20;
shouldUse = TRUE;
}
- if (itemEffects[3] & 0x10 && (gBattleMons[gActiveBattler].status1 & STATUS1_POISON || gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_POISON))
+ if (itemEffects[3] & ITEM3_POISON && (gBattleMons[gActiveBattler].status1 & STATUS1_POISON || gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_POISON))
{
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x10;
shouldUse = TRUE;
}
- if (itemEffects[3] & 0x8 && gBattleMons[gActiveBattler].status1 & STATUS1_BURN)
+ if (itemEffects[3] & ITEM3_BURN && gBattleMons[gActiveBattler].status1 & STATUS1_BURN)
{
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x8;
shouldUse = TRUE;
}
- if (itemEffects[3] & 0x4 && gBattleMons[gActiveBattler].status1 & STATUS1_FREEZE)
+ if (itemEffects[3] & ITEM3_FREEZE && gBattleMons[gActiveBattler].status1 & STATUS1_FREEZE)
{
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x4;
shouldUse = TRUE;
}
- if (itemEffects[3] & 0x2 && gBattleMons[gActiveBattler].status1 & STATUS1_PARALYSIS)
+ if (itemEffects[3] & ITEM3_PARALYSIS && gBattleMons[gActiveBattler].status1 & STATUS1_PARALYSIS)
{
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x2;
shouldUse = TRUE;
}
- if (itemEffects[3] & 0x1 && gBattleMons[gActiveBattler].status2 & STATUS2_CONFUSION)
+ if (itemEffects[3] & ITEM3_CONFUSION && gBattleMons[gActiveBattler].status2 & STATUS2_CONFUSION)
{
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x1;
shouldUse = TRUE;
@@ -897,17 +897,17 @@ static bool8 ShouldUseItem(void)
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) = 0;
if (gDisableStructs[gActiveBattler].isFirstTurn == 0)
break;
- if (itemEffects[0] & 0xF)
+ if (itemEffects[0] & ITEM0_X_ATTACK)
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x1;
- if (itemEffects[1] & 0xF0)
+ if (itemEffects[1] & ITEM1_X_DEFEND)
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x2;
- if (itemEffects[1] & 0xF)
+ if (itemEffects[1] & ITEM1_X_SPEED)
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x4;
- if (itemEffects[2] & 0xF)
+ if (itemEffects[2] & ITEM2_X_SPATK)
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x8;
- if (itemEffects[2] & 0xF0)
+ if (itemEffects[2] & ITEM2_X_ACCURACY)
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x20;
- if (itemEffects[0] & 0x30)
+ if (itemEffects[0] & ITEM0_HIGH_CRIT)
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x80;
shouldUse = TRUE;
break;
diff --git a/src/data/pokemon/item_effects.h b/src/data/pokemon/item_effects.h
index 9f5720a66..1697a1e7e 100644
--- a/src/data/pokemon/item_effects.h
+++ b/src/data/pokemon/item_effects.h
@@ -1,236 +1,476 @@
-const u8 gItemEffect_Potion[] = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 20};
-const u8 gItemEffect_Antidote[] = {0x00, 0x00, 0x00, 0x10, 0x00, 0x00};
-const u8 gItemEffect_BurnHeal[] = {0x00, 0x00, 0x00, 0x08, 0x00, 0x00};
-const u8 gItemEffect_IceHeal[] = {0x00, 0x00, 0x00, 0x04, 0x00, 0x00};
-const u8 gItemEffect_Awakening[] = {0x00, 0x00, 0x00, 0x20, 0x00, 0x00};
-const u8 gItemEffect_ParalyzeHeal[] = {0x00, 0x00, 0x00, 0x02, 0x00, 0x00};
-const u8 gItemEffect_FullRestore[] = {0x00, 0x00, 0x00, 0x3f, 0x04, 0x00, 0xff};
-const u8 gItemEffect_MaxPotion[] = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff};
-const u8 gItemEffect_HyperPotion[] = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 200};
-const u8 gItemEffect_SuperPotion[] = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 50};
-const u8 gItemEffect_FullHeal[] = {0x00, 0x00, 0x00, 0x3f, 0x00, 0x00};
-const u8 gItemEffect_Revive[] = {0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0xfe};
-const u8 gItemEffect_MaxRevive[] = {0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0xff};
-const u8 gItemEffect_FreshWater[] = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 50};
-const u8 gItemEffect_SodaPop[] = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 60};
-const u8 gItemEffect_Lemonade[] = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 80};
-const u8 gItemEffect_MoomooMilk[] = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 100};
-const u8 gItemEffect_EnergyPowder[] = {0x00, 0x00, 0x00, 0x00, 0x04, 0xe0, 50, 0xfb, 0xfb, 0xf6};
-const u8 gItemEffect_EnergyRoot[] = {0x00, 0x00, 0x00, 0x00, 0x04, 0xe0, 200, 0xf6, 0xf6, 0xf1};
-const u8 gItemEffect_HealPowder[] = {0x00, 0x00, 0x00, 0x3f, 0x00, 0xe0, 0xfb, 0xfb, 0xf6};
-const u8 gItemEffect_RevivalHerb[] = {0x00, 0x00, 0x00, 0x00, 0x44, 0xe0, 0xff, 0xf1, 0xf1, 0xec};
-const u8 gItemEffect_Ether[] = {0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x0a};
-const u8 gItemEffect_MaxEther[] = {0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x7f};
-const u8 gItemEffect_Elixir[] = {0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0a};
-const u8 gItemEffect_MaxElixir[] = {0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7f};
-const u8 gItemEffect_LavaCookie[] = {0x00, 0x00, 0x00, 0x3f, 0x00, 0x00};
-const u8 gItemEffect_BlueFlute[] = {0x00, 0x00, 0x00, 0x20, 0x00, 0x00};
-const u8 gItemEffect_YellowFlute[] = {0x00, 0x00, 0x00, 0x01, 0x00, 0x00};
-const u8 gItemEffect_RedFlute[] = {0x80, 0x00, 0x00, 0x00, 0x00, 0x00};
-const u8 gItemEffect_BerryJuice[] = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 20};
-const u8 gItemEffect_SacredAsh[] = {0x40, 0x00, 0x00, 0x00, 0x44, 0x00, 0xff};
-const u8 gItemEffect_HPUp[] = {0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x0a, 0x05, 0x03, 0x02};
-const u8 gItemEffect_Protein[] = {0x00, 0x00, 0x00, 0x00, 0x02, 0xe0, 0x0a, 0x05, 0x03, 0x02};
-const u8 gItemEffect_Iron[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0xe1, 0x0a, 0x05, 0x03, 0x02};
-const u8 gItemEffect_Carbos[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0xe2, 0x0a, 0x05, 0x03, 0x02};
-const u8 gItemEffect_Calcium[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x0a, 0x05, 0x03, 0x02};
-const u8 gItemEffect_RareCandy[] = {0x00, 0x00, 0x00, 0x40, 0x44, 0xe0, 253, 0x05, 0x03, 0x02};
-const u8 gItemEffect_PPUp[] = {0x00, 0x00, 0x00, 0x00, 0x20, 0xe0, 0x05, 0x03, 0x02};
-const u8 gItemEffect_Zinc[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x0a, 0x05, 0x03, 0x02};
-const u8 gItemEffect_PPMax[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x05, 0x03, 0x02};
-const u8 gItemEffect_GuardSpec[] = {0x00, 0x00, 0x00, 0x80, 0x00, 0x60, 0x01, 0x01};
-const u8 gItemEffect_DireHit[] = {0x20, 0x00, 0x00, 0x00, 0x00, 0x60, 0x01, 0x01};
-const u8 gItemEffect_XAttack[] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x60, 0x01, 0x01};
-const u8 gItemEffect_XDefend[] = {0x00, 0x10, 0x00, 0x00, 0x00, 0x60, 0x01, 0x01};
-const u8 gItemEffect_XSpeed[] = {0x00, 0x01, 0x00, 0x00, 0x00, 0x60, 0x01, 0x01};
-const u8 gItemEffect_XAccuracy[] = {0x00, 0x00, 0x10, 0x00, 0x00, 0x60, 0x01, 0x01};
-const u8 gItemEffect_XSpecial[] = {0x00, 0x00, 0x01, 0x00, 0x00, 0x60, 0x01, 0x01};
-const u8 gItemEffect_SunStone[] = {0x00, 0x00, 0x00, 0x00, 0x80, 0x00};
-const u8 gItemEffect_MoonStone[] = {0x00, 0x00, 0x00, 0x00, 0x80, 0x00};
-const u8 gItemEffect_FireStone[] = {0x00, 0x00, 0x00, 0x00, 0x80, 0x00};
-const u8 gItemEffect_ThunderStone[] = {0x00, 0x00, 0x00, 0x00, 0x80, 0x00};
-const u8 gItemEffect_WaterStone[] = {0x00, 0x00, 0x00, 0x00, 0x80, 0x00};
-const u8 gItemEffect_LeafStone[] = {0x00, 0x00, 0x00, 0x00, 0x80, 0x00};
-const u8 gItemEffect_CheriBerry[] = {0x00, 0x00, 0x00, 0x02, 0x00, 0x00};
-const u8 gItemEffect_ChestoBerry[] = {0x00, 0x00, 0x00, 0x20, 0x00, 0x00};
-const u8 gItemEffect_PechaBerry[] = {0x00, 0x00, 0x00, 0x10, 0x00, 0x00};
-const u8 gItemEffect_RawstBerry[] = {0x00, 0x00, 0x00, 0x08, 0x00, 0x00};
-const u8 gItemEffect_AspearBerry[] = {0x00, 0x00, 0x00, 0x04, 0x00, 0x00};
-const u8 gItemEffect_LeppaBerry[] = {0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x0a};
-const u8 gItemEffect_OranBerry[] = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 10};
-const u8 gItemEffect_PersimBerry[] = {0x00, 0x00, 0x00, 0x01, 0x00, 0x00};
-const u8 gItemEffect_LumBerry[] = {0x00, 0x00, 0x00, 0x3f, 0x00, 0x00};
-const u8 gItemEffect_SitrusBerry[] = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 30};
-const u8 gItemEffect_PomegBerry[] = {0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 0xf6, 0x0a, 0x05, 0x02};
-const u8 gItemEffect_KelpsyBerry[] = {0x00, 0x00, 0x00, 0x00, 0x02, 0xe0, 0xf6, 0x0a, 0x05, 0x02};
-const u8 gItemEffect_QualotBerry[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0xe1, 0xf6, 0x0a, 0x05, 0x02};
-const u8 gItemEffect_HondrewBerry[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0xf6, 0x0a, 0x05, 0x02};
-const u8 gItemEffect_GrepaBerry[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xf6, 0x0a, 0x05, 0x02};
-const u8 gItemEffect_TamatoBerry[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0xe2, 0xf6, 0x0a, 0x05, 0x02};
+const u8 gItemEffect_Potion[7] = {
+ [4] = ITEM4_HEAL_HP,
+ [6] = 20,
+};
+
+const u8 gItemEffect_Antidote[6] = {
+ [3] = ITEM3_POISON,
+};
+
+const u8 gItemEffect_BurnHeal[6] = {
+ [3] = ITEM3_BURN,
+};
+
+const u8 gItemEffect_IceHeal[6] = {
+ [3] = ITEM3_FREEZE,
+};
+
+const u8 gItemEffect_Awakening[6] = {
+ [3] = ITEM3_SLEEP,
+};
+
+const u8 gItemEffect_ParalyzeHeal[6] = {
+ [3] = ITEM3_PARALYSIS,
+};
+
+const u8 gItemEffect_FullRestore[7] = {
+ [3] = ITEM3_STATUS_ALL,
+ [4] = ITEM4_HEAL_HP,
+ [6] = -1,
+};
+
+const u8 gItemEffect_MaxPotion[7] = {
+ [4] = ITEM4_HEAL_HP,
+ [6] = -1,
+};
+
+const u8 gItemEffect_HyperPotion[7] = {
+ [4] = ITEM4_HEAL_HP,
+ [6] = 200,
+};
+
+const u8 gItemEffect_SuperPotion[7] = {
+ [4] = ITEM4_HEAL_HP,
+ [6] = 50,
+};
+
+const u8 gItemEffect_FullHeal[6] = {
+ [3] = ITEM3_STATUS_ALL,
+};
+
+const u8 gItemEffect_Revive[7] = {
+ [4] = ITEM4_REVIVE | ITEM4_HEAL_HP,
+ [6] = -2,
+};
+
+const u8 gItemEffect_MaxRevive[7] = {
+ [4] = ITEM4_REVIVE | ITEM4_HEAL_HP,
+ [6] = -1,
+};
+
+const u8 gItemEffect_FreshWater[7] = {
+ [4] = ITEM4_HEAL_HP,
+ [6] = 50,
+};
+
+const u8 gItemEffect_SodaPop[7] = {
+ [4] = ITEM4_HEAL_HP,
+ [6] = 60,
+};
+
+const u8 gItemEffect_Lemonade[7] = {
+ [4] = ITEM4_HEAL_HP,
+ [6] = 80,
+};
+
+const u8 gItemEffect_MoomooMilk[7] = {
+ [4] = ITEM4_HEAL_HP,
+ [6] = 100,
+};
+
+const u8 gItemEffect_EnergyPowder[10] = {
+ [4] = ITEM4_HEAL_HP,
+ [5] = ITEM5_FRIENDSHIP_ALL,
+ [6] = 50,
+ [7] = -5,
+ [8] = -5,
+ [9] = -10,
+};
+
+const u8 gItemEffect_EnergyRoot[10] = {
+ [4] = ITEM4_HEAL_HP,
+ [5] = ITEM5_FRIENDSHIP_ALL,
+ [6] = 200,
+ [7] = -10,
+ [8] = -10,
+ [9] = -15,
+};
+
+const u8 gItemEffect_HealPowder[9] = {
+ [3] = ITEM3_STATUS_ALL,
+ [5] = ITEM5_FRIENDSHIP_ALL,
+ [6] = -5,
+ [7] = -5,
+ [8] = -10,
+};
+
+const u8 gItemEffect_RevivalHerb[10] = {
+ [4] = ITEM4_REVIVE | ITEM4_HEAL_HP,
+ [5] = ITEM5_FRIENDSHIP_ALL,
+ [6] = -1,
+ [7] = -15,
+ [8] = -15,
+ [9] = -20,
+};
+
+const u8 gItemEffect_Ether[7] = {
+ [4] = ITEM4_HEAL_PP_ONE | ITEM4_HEAL_PP_ALL,
+ [6] = 10,
+};
+
+const u8 gItemEffect_MaxEther[7] = {
+ [4] = ITEM4_HEAL_PP_ONE | ITEM4_HEAL_PP_ALL,
+ [6] = 0x7F,
+};
+
+const u8 gItemEffect_Elixir[7] = {
+ [4] = ITEM4_HEAL_PP_ALL,
+ [6] = 10,
+};
+
+const u8 gItemEffect_MaxElixir[7] = {
+ [4] = ITEM4_HEAL_PP_ALL,
+ [6] = 0x7F,
+};
+
+const u8 gItemEffect_LavaCookie[6] = {
+ [3] = ITEM3_STATUS_ALL,
+};
+
+const u8 gItemEffect_BlueFlute[6] = {
+ [3] = ITEM3_SLEEP,
+};
+
+const u8 gItemEffect_YellowFlute[6] = {
+ [3] = ITEM3_CONFUSION,
+};
+
+const u8 gItemEffect_RedFlute[6] = {
+ [0] = ITEM0_INFATUATION,
+};
+
+const u8 gItemEffect_BerryJuice[7] = {
+ [4] = ITEM4_HEAL_HP,
+ [6] = 20,
+};
+
+const u8 gItemEffect_SacredAsh[7] = {
+ [0] = ITEM0_SACRED_ASH,
+ [4] = ITEM4_REVIVE | ITEM4_HEAL_HP,
+ [6] = -1,
+};
+
+const u8 gItemEffect_HPUp[10] = {
+ [4] = ITEM4_EV_HP,
+ [5] = ITEM5_FRIENDSHIP_ALL,
+ [6] = 10,
+ [7] = 5,
+ [8] = 3,
+ [9] = 2,
+};
+
+const u8 gItemEffect_Protein[10] = {
+ [4] = ITEM4_EV_ATK,
+ [5] = ITEM5_FRIENDSHIP_ALL,
+ [6] = 10,
+ [7] = 5,
+ [8] = 3,
+ [9] = 2,
+};
+
+const u8 gItemEffect_Iron[10] = {
+ [5] = ITEM5_EV_DEF | ITEM5_FRIENDSHIP_ALL,
+ [6] = 10,
+ [7] = 5,
+ [8] = 3,
+ [9] = 2,
+};
+
+const u8 gItemEffect_Carbos[10] = {
+ [5] = ITEM5_EV_SPEED | ITEM5_FRIENDSHIP_ALL,
+ [6] = 10,
+ [7] = 5,
+ [8] = 3,
+ [9] = 2,
+};
+
+const u8 gItemEffect_Calcium[10] = {
+ [5] = ITEM5_EV_SPATK | ITEM5_FRIENDSHIP_ALL,
+ [6] = 10,
+ [7] = 5,
+ [8] = 3,
+ [9] = 2,
+};
+
+const u8 gItemEffect_RareCandy[10] = {
+ [3] = ITEM3_LEVEL_UP,
+ [4] = ITEM4_REVIVE | ITEM4_HEAL_HP,
+ [5] = ITEM5_FRIENDSHIP_ALL,
+ [6] = 0xFD,
+ [7] = 5,
+ [8] = 3,
+ [9] = 2,
+};
+
+const u8 gItemEffect_PPUp[9] = {
+ [4] = ITEM4_PP_UP,
+ [5] = ITEM5_FRIENDSHIP_ALL,
+ [6] = 5,
+ [7] = 3,
+ [8] = 2,
+};
+
+const u8 gItemEffect_Zinc[10] = {
+ [5] = ITEM5_EV_SPDEF | ITEM5_FRIENDSHIP_ALL,
+ [6] = 10,
+ [7] = 5,
+ [8] = 3,
+ [9] = 2,
+};
+
+const u8 gItemEffect_PPMax[9] = {
+ [5] = ITEM5_PP_MAX | ITEM5_FRIENDSHIP_ALL,
+ [6] = 5,
+ [7] = 3,
+ [8] = 2,
+};
+
+const u8 gItemEffect_GuardSpec[8] = {
+ [3] = ITEM3_MIST,
+ [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID,
+ [6] = 1,
+ [7] = 1,
+};
+
+const u8 gItemEffect_DireHit[8] = {
+ [0] = 2 << 4,
+ [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID,
+ [6] = 1,
+ [7] = 1,
+};
+
+const u8 gItemEffect_XAttack[8] = {
+ [0] = 1,
+ [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID,
+ [6] = 1,
+ [7] = 1,
+};
+
+const u8 gItemEffect_XDefend[8] = {
+ [1] = 1 << 4,
+ [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID,
+ [6] = 1,
+ [7] = 1,
+};
+
+const u8 gItemEffect_XSpeed[8] = {
+ [1] = 1,
+ [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID,
+ [6] = 1,
+ [7] = 1,
+};
+
+const u8 gItemEffect_XAccuracy[8] = {
+ [2] = 1 << 4,
+ [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID,
+ [6] = 1,
+ [7] = 1,
+};
+
+const u8 gItemEffect_XSpecial[8] = {
+ [2] = 1,
+ [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID,
+ [6] = 1,
+ [7] = 1,
+};
+
+const u8 gItemEffect_SunStone[6] = {
+ [4] = ITEM4_EVO_STONE,
+};
+
+const u8 gItemEffect_MoonStone[6] = {
+ [4] = ITEM4_EVO_STONE,
+};
+
+const u8 gItemEffect_FireStone[6] = {
+ [4] = ITEM4_EVO_STONE,
+};
+
+const u8 gItemEffect_ThunderStone[6] = {
+ [4] = ITEM4_EVO_STONE,
+};
+
+const u8 gItemEffect_WaterStone[6] = {
+ [4] = ITEM4_EVO_STONE,
+};
+
+const u8 gItemEffect_LeafStone[6] = {
+ [4] = ITEM4_EVO_STONE,
+};
+
+const u8 gItemEffect_CheriBerry[6] = {
+ [3] = ITEM3_PARALYSIS,
+};
+
+const u8 gItemEffect_ChestoBerry[6] = {
+ [3] = ITEM3_SLEEP,
+};
+
+const u8 gItemEffect_PechaBerry[6] = {
+ [3] = ITEM3_POISON,
+};
+
+const u8 gItemEffect_RawstBerry[6] = {
+ [3] = ITEM3_BURN,
+};
+
+const u8 gItemEffect_AspearBerry[6] = {
+ [3] = ITEM3_FREEZE,
+};
+
+const u8 gItemEffect_LeppaBerry[7] = {
+ [4] = ITEM4_HEAL_PP_ONE | ITEM4_HEAL_PP_ALL,
+ [6] = 10,
+};
+
+const u8 gItemEffect_OranBerry[7] = {
+ [4] = ITEM4_HEAL_HP,
+ [6] = 10,
+};
+
+const u8 gItemEffect_PersimBerry[6] = {
+ [3] = ITEM3_CONFUSION,
+};
+
+const u8 gItemEffect_LumBerry[6] = {
+ [3] = ITEM3_STATUS_ALL,
+};
+
+const u8 gItemEffect_SitrusBerry[7] = {
+ [4] = ITEM4_HEAL_HP,
+ [6] = 30,
+};
+
+const u8 gItemEffect_PomegBerry[10] = {
+ [4] = ITEM4_EV_HP,
+ [5] = ITEM5_FRIENDSHIP_ALL,
+ [6] = -10,
+ [7] = 10,
+ [8] = 5,
+ [9] = 2,
+};
+
+const u8 gItemEffect_KelpsyBerry[10] = {
+ [4] = ITEM4_EV_ATK,
+ [5] = ITEM5_FRIENDSHIP_ALL,
+ [6] = -10,
+ [7] = 10,
+ [8] = 5,
+ [9] = 2,
+};
+
+const u8 gItemEffect_QualotBerry[10] = {
+ [5] = ITEM5_EV_DEF | ITEM5_FRIENDSHIP_ALL,
+ [6] = -10,
+ [7] = 10,
+ [8] = 5,
+ [9] = 2,
+};
+
+const u8 gItemEffect_HondrewBerry[10] = {
+ [5] = ITEM5_EV_SPATK | ITEM5_FRIENDSHIP_ALL,
+ [6] = -10,
+ [7] = 10,
+ [8] = 5,
+ [9] = 2,
+};
+
+const u8 gItemEffect_GrepaBerry[10] = {
+ [5] = ITEM5_EV_SPDEF | ITEM5_FRIENDSHIP_ALL,
+ [6] = -10,
+ [7] = 10,
+ [8] = 5,
+ [9] = 2,
+};
+
+const u8 gItemEffect_TamatoBerry[10] = {
+ [5] = ITEM5_EV_SPEED | ITEM5_FRIENDSHIP_ALL,
+ [6] = -10,
+ [7] = 10,
+ [8] = 5,
+ [9] = 2,
+};
const u8 *const gItemEffectTable[] =
{
- gItemEffect_Potion,
- gItemEffect_Antidote,
- gItemEffect_BurnHeal,
- gItemEffect_IceHeal,
- gItemEffect_Awakening,
- gItemEffect_ParalyzeHeal,
- gItemEffect_FullRestore,
- gItemEffect_MaxPotion,
- gItemEffect_HyperPotion,
- gItemEffect_SuperPotion,
- gItemEffect_FullHeal,
- gItemEffect_Revive,
- gItemEffect_MaxRevive,
- gItemEffect_FreshWater,
- gItemEffect_SodaPop,
- gItemEffect_Lemonade,
- gItemEffect_MoomooMilk,
- gItemEffect_EnergyPowder,
- gItemEffect_EnergyRoot,
- gItemEffect_HealPowder,
- gItemEffect_RevivalHerb,
- gItemEffect_Ether,
- gItemEffect_MaxEther,
- gItemEffect_Elixir,
- gItemEffect_MaxElixir,
- gItemEffect_LavaCookie,
- gItemEffect_BlueFlute,
- gItemEffect_YellowFlute,
- gItemEffect_RedFlute,
- NULL,
- NULL,
- gItemEffect_BerryJuice,
- gItemEffect_SacredAsh,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- gItemEffect_HPUp,
- gItemEffect_Protein,
- gItemEffect_Iron,
- gItemEffect_Carbos,
- gItemEffect_Calcium,
- gItemEffect_RareCandy,
- gItemEffect_PPUp,
- gItemEffect_Zinc,
- gItemEffect_PPMax,
- NULL,
- gItemEffect_GuardSpec,
- gItemEffect_DireHit,
- gItemEffect_XAttack,
- gItemEffect_XDefend,
- gItemEffect_XSpeed,
- gItemEffect_XAccuracy,
- gItemEffect_XSpecial,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- gItemEffect_SunStone,
- gItemEffect_MoonStone,
- gItemEffect_FireStone,
- gItemEffect_ThunderStone,
- gItemEffect_WaterStone,
- gItemEffect_LeafStone,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- gItemEffect_CheriBerry,
- gItemEffect_ChestoBerry,
- gItemEffect_PechaBerry,
- gItemEffect_RawstBerry,
- gItemEffect_AspearBerry,
- gItemEffect_LeppaBerry,
- gItemEffect_OranBerry,
- gItemEffect_PersimBerry,
- gItemEffect_LumBerry,
- gItemEffect_SitrusBerry,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- gItemEffect_PomegBerry,
- gItemEffect_KelpsyBerry,
- gItemEffect_QualotBerry,
- gItemEffect_HondrewBerry,
- gItemEffect_GrepaBerry,
- gItemEffect_TamatoBerry,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL
+ [ITEM_POTION - ITEM_POTION] = gItemEffect_Potion,
+ [ITEM_ANTIDOTE - ITEM_POTION] = gItemEffect_Antidote,
+ [ITEM_BURN_HEAL - ITEM_POTION] = gItemEffect_BurnHeal,
+ [ITEM_ICE_HEAL - ITEM_POTION] = gItemEffect_IceHeal,
+ [ITEM_AWAKENING - ITEM_POTION] = gItemEffect_Awakening,
+ [ITEM_PARALYZE_HEAL - ITEM_POTION] = gItemEffect_ParalyzeHeal,
+ [ITEM_FULL_RESTORE - ITEM_POTION] = gItemEffect_FullRestore,
+ [ITEM_MAX_POTION - ITEM_POTION] = gItemEffect_MaxPotion,
+ [ITEM_HYPER_POTION - ITEM_POTION] = gItemEffect_HyperPotion,
+ [ITEM_SUPER_POTION - ITEM_POTION] = gItemEffect_SuperPotion,
+ [ITEM_FULL_HEAL - ITEM_POTION] = gItemEffect_FullHeal,
+ [ITEM_REVIVE - ITEM_POTION] = gItemEffect_Revive,
+ [ITEM_MAX_REVIVE - ITEM_POTION] = gItemEffect_MaxRevive,
+ [ITEM_FRESH_WATER - ITEM_POTION] = gItemEffect_FreshWater,
+ [ITEM_SODA_POP - ITEM_POTION] = gItemEffect_SodaPop,
+ [ITEM_LEMONADE - ITEM_POTION] = gItemEffect_Lemonade,
+ [ITEM_MOOMOO_MILK - ITEM_POTION] = gItemEffect_MoomooMilk,
+ [ITEM_ENERGY_POWDER - ITEM_POTION] = gItemEffect_EnergyPowder,
+ [ITEM_ENERGY_ROOT - ITEM_POTION] = gItemEffect_EnergyRoot,
+ [ITEM_HEAL_POWDER - ITEM_POTION] = gItemEffect_HealPowder,
+ [ITEM_REVIVAL_HERB - ITEM_POTION] = gItemEffect_RevivalHerb,
+ [ITEM_ETHER - ITEM_POTION] = gItemEffect_Ether,
+ [ITEM_MAX_ETHER - ITEM_POTION] = gItemEffect_MaxEther,
+ [ITEM_ELIXIR - ITEM_POTION] = gItemEffect_Elixir,
+ [ITEM_MAX_ELIXIR - ITEM_POTION] = gItemEffect_MaxElixir,
+ [ITEM_LAVA_COOKIE - ITEM_POTION] = gItemEffect_LavaCookie,
+ [ITEM_BLUE_FLUTE - ITEM_POTION] = gItemEffect_BlueFlute,
+ [ITEM_YELLOW_FLUTE - ITEM_POTION] = gItemEffect_YellowFlute,
+ [ITEM_RED_FLUTE - ITEM_POTION] = gItemEffect_RedFlute,
+ [ITEM_BERRY_JUICE - ITEM_POTION] = gItemEffect_BerryJuice,
+ [ITEM_SACRED_ASH - ITEM_POTION] = gItemEffect_SacredAsh,
+ [ITEM_HP_UP - ITEM_POTION] = gItemEffect_HPUp,
+ [ITEM_PROTEIN - ITEM_POTION] = gItemEffect_Protein,
+ [ITEM_IRON - ITEM_POTION] = gItemEffect_Iron,
+ [ITEM_CARBOS - ITEM_POTION] = gItemEffect_Carbos,
+ [ITEM_CALCIUM - ITEM_POTION] = gItemEffect_Calcium,
+ [ITEM_RARE_CANDY - ITEM_POTION] = gItemEffect_RareCandy,
+ [ITEM_PP_UP - ITEM_POTION] = gItemEffect_PPUp,
+ [ITEM_ZINC - ITEM_POTION] = gItemEffect_Zinc,
+ [ITEM_PP_MAX - ITEM_POTION] = gItemEffect_PPMax,
+ [ITEM_GUARD_SPEC - ITEM_POTION] = gItemEffect_GuardSpec,
+ [ITEM_DIRE_HIT - ITEM_POTION] = gItemEffect_DireHit,
+ [ITEM_X_ATTACK - ITEM_POTION] = gItemEffect_XAttack,
+ [ITEM_X_DEFEND - ITEM_POTION] = gItemEffect_XDefend,
+ [ITEM_X_SPEED - ITEM_POTION] = gItemEffect_XSpeed,
+ [ITEM_X_ACCURACY - ITEM_POTION] = gItemEffect_XAccuracy,
+ [ITEM_X_SPECIAL - ITEM_POTION] = gItemEffect_XSpecial,
+ [ITEM_SUN_STONE - ITEM_POTION] = gItemEffect_SunStone,
+ [ITEM_MOON_STONE - ITEM_POTION] = gItemEffect_MoonStone,
+ [ITEM_FIRE_STONE - ITEM_POTION] = gItemEffect_FireStone,
+ [ITEM_THUNDER_STONE - ITEM_POTION] = gItemEffect_ThunderStone,
+ [ITEM_WATER_STONE - ITEM_POTION] = gItemEffect_WaterStone,
+ [ITEM_LEAF_STONE - ITEM_POTION] = gItemEffect_LeafStone,
+ [ITEM_CHERI_BERRY - ITEM_POTION] = gItemEffect_CheriBerry,
+ [ITEM_CHESTO_BERRY - ITEM_POTION] = gItemEffect_ChestoBerry,
+ [ITEM_PECHA_BERRY - ITEM_POTION] = gItemEffect_PechaBerry,
+ [ITEM_RAWST_BERRY - ITEM_POTION] = gItemEffect_RawstBerry,
+ [ITEM_ASPEAR_BERRY - ITEM_POTION] = gItemEffect_AspearBerry,
+ [ITEM_LEPPA_BERRY - ITEM_POTION] = gItemEffect_LeppaBerry,
+ [ITEM_ORAN_BERRY - ITEM_POTION] = gItemEffect_OranBerry,
+ [ITEM_PERSIM_BERRY - ITEM_POTION] = gItemEffect_PersimBerry,
+ [ITEM_LUM_BERRY - ITEM_POTION] = gItemEffect_LumBerry,
+ [ITEM_SITRUS_BERRY - ITEM_POTION] = gItemEffect_SitrusBerry,
+ [ITEM_POMEG_BERRY - ITEM_POTION] = gItemEffect_PomegBerry,
+ [ITEM_KELPSY_BERRY - ITEM_POTION] = gItemEffect_KelpsyBerry,
+ [ITEM_QUALOT_BERRY - ITEM_POTION] = gItemEffect_QualotBerry,
+ [ITEM_HONDEW_BERRY - ITEM_POTION] = gItemEffect_HondrewBerry,
+ [ITEM_GREPA_BERRY - ITEM_POTION] = gItemEffect_GrepaBerry,
+ [ITEM_TAMATO_BERRY - ITEM_POTION] = gItemEffect_TamatoBerry,
+ [LAST_BERRY_INDEX - ITEM_POTION] = NULL
};
diff --git a/src/item_use.c b/src/item_use.c
index 8e28d48fd..97aceb7ad 100755
--- a/src/item_use.c
+++ b/src/item_use.c
@@ -37,6 +37,7 @@
#include "constants/bg_event_constants.h"
#include "constants/event_objects.h"
#include "constants/flags.h"
+#include "constants/item_effects.h"
#include "constants/items.h"
#include "constants/songs.h"
#include "constants/vars.h"
@@ -389,7 +390,7 @@ bool8 sub_80FD6D4(const struct MapEvents *events, s16 x, s16 y)
bool8 sub_80FD730(struct MapConnection *connection, int x, int y)
{
-
+
u16 localX, localY;
u32 localOffset;
s32 localLength;
@@ -1026,44 +1027,45 @@ void ItemUseInBattle_Escape(u8 taskId)
void ItemUseOutOfBattle_EnigmaBerry(u8 taskId)
{
- switch (GetItemEffectType(gSpecialVar_ItemId) - 1)
+ switch (GetItemEffectType(gSpecialVar_ItemId))
{
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 10:
- case 11:
- case 12:
- case 13:
- case 14:
- case 15:
- case 16:
+ case ITEM_EFFECT_HEAL_HP:
+ case ITEM_EFFECT_CURE_POISON:
+ case ITEM_EFFECT_CURE_SLEEP:
+ case ITEM_EFFECT_CURE_BURN:
+ case ITEM_EFFECT_CURE_FREEZE:
+ case ITEM_EFFECT_CURE_PARALYSIS:
+ case ITEM_EFFECT_CURE_ALL_STATUS:
+ case ITEM_EFFECT_ATK_EV:
+ case ITEM_EFFECT_HP_EV:
+ case ITEM_EFFECT_SPATK_EV:
+ case ITEM_EFFECT_SPDEF_EV:
+ case ITEM_EFFECT_SPEED_EV:
+ case ITEM_EFFECT_DEF_EV:
gTasks[taskId].data[4] = 1;
ItemUseOutOfBattle_Medicine(taskId);
break;
- case 9:
+ case ITEM_EFFECT_SACRED_ASH:
gTasks[taskId].data[4] = 1;
ItemUseOutOfBattle_SacredAsh(taskId);
break;
- case 0:
+ case ITEM_EFFECT_RAISE_LEVEL:
gTasks[taskId].data[4] = 1;
ItemUseOutOfBattle_RareCandy(taskId);
break;
- case 18:
- case 19:
+ case ITEM_EFFECT_PP_UP:
+ case ITEM_EFFECT_PP_MAX:
gTasks[taskId].data[4] = 1;
ItemUseOutOfBattle_PPUp(taskId);
break;
- case 20:
+ case ITEM_EFFECT_HEAL_PP:
gTasks[taskId].data[4] = 1;
ItemUseOutOfBattle_PPRecovery(taskId);
break;
default:
gTasks[taskId].data[4] = 4;
ItemUseOutOfBattle_CannotUse(taskId);
+ break;
}
}
@@ -1071,25 +1073,26 @@ void ItemUseInBattle_EnigmaBerry(u8 taskId)
{
switch (GetItemEffectType(gSpecialVar_ItemId))
{
- case 0:
+ case ITEM_EFFECT_X_ITEM:
ItemUseInBattle_StatIncrease(taskId);
break;
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- case 8:
- case 9:
- case 11:
+ case ITEM_EFFECT_HEAL_HP:
+ case ITEM_EFFECT_CURE_POISON:
+ case ITEM_EFFECT_CURE_SLEEP:
+ case ITEM_EFFECT_CURE_BURN:
+ case ITEM_EFFECT_CURE_FREEZE:
+ case ITEM_EFFECT_CURE_PARALYSIS:
+ case ITEM_EFFECT_CURE_ALL_STATUS:
+ case ITEM_EFFECT_CURE_CONFUSION:
+ case ITEM_EFFECT_CURE_INFATUATION:
ItemUseInBattle_Medicine(taskId);
break;
- case 21:
+ case ITEM_EFFECT_HEAL_PP:
ItemUseInBattle_PPRecovery(taskId);
break;
default:
ItemUseOutOfBattle_CannotUse(taskId);
+ break;
}
}
diff --git a/src/party_menu.c b/src/party_menu.c
index 9be69c026..d13dc1e97 100755
--- a/src/party_menu.c
+++ b/src/party_menu.c
@@ -68,6 +68,7 @@
#include "constants/easy_chat.h"
#include "constants/field_effects.h"
#include "constants/flags.h"
+#include "constants/item_effects.h"
#include "constants/items.h"
#include "constants/maps.h"
#include "constants/moves.h"
@@ -298,8 +299,8 @@ static u8 sub_81B8984(void);
static void sub_81B6280(u8);
static void c2_815ABFC(void);
static void sub_81B672C(u8);
-static u16 sub_81B691C(struct Pokemon*, u8);
-static void option_menu_get_string(u8, u8*);
+static u16 ItemEffectToMonEv(struct Pokemon*, u8);
+static void ItemEffectToStatString(u8, u8*);
static void sub_81B6BB4(u8);
static void ether_effect_related_2(u8);
static void ether_effect_related(u8);
@@ -5230,7 +5231,7 @@ void sub_81B617C(void)
doubleBattleStatus = 0;
}
- if (GetItemEffectType(gSpecialVar_ItemId) == 10)
+ if (GetItemEffectType(gSpecialVar_ItemId) == ITEM_EFFECT_SACRED_ASH)
{
gUnknown_0203CEC8.unk9 = 0;
for (i = 0; i < PARTY_SIZE; i++)
@@ -5284,7 +5285,7 @@ static bool8 IsHPRecoveryItem(u16 item)
else
effect = gItemEffectTable[item - ITEM_POTION];
- if ((effect[4] & 4) != 0)
+ if (effect[4] & ITEM4_HEAL_HP)
return TRUE;
else
return FALSE;
@@ -5294,59 +5295,59 @@ static void GetMedicineItemEffectMessage(u16 item)
{
switch (GetItemEffectType(item))
{
- case 3:
+ case ITEM_EFFECT_CURE_POISON:
StringExpandPlaceholders(gStringVar4, gText_PkmnCuredOfPoison);
break;
- case 4:
+ case ITEM_EFFECT_CURE_SLEEP:
StringExpandPlaceholders(gStringVar4, gText_PkmnWokeUp2);
break;
- case 5:
+ case ITEM_EFFECT_CURE_BURN:
StringExpandPlaceholders(gStringVar4, gText_PkmnBurnHealed);
break;
- case 6:
+ case ITEM_EFFECT_CURE_FREEZE:
StringExpandPlaceholders(gStringVar4, gText_PkmnThawedOut);
break;
- case 7:
+ case ITEM_EFFECT_CURE_PARALYSIS:
StringExpandPlaceholders(gStringVar4, gText_PkmnCuredOfParalysis);
break;
- case 8:
+ case ITEM_EFFECT_CURE_CONFUSION:
StringExpandPlaceholders(gStringVar4, gText_PkmnSnappedOutOfConfusion);
break;
- case 9:
+ case ITEM_EFFECT_CURE_INFATUATION:
StringExpandPlaceholders(gStringVar4, gText_PkmnGotOverInfatuation);
break;
- case 11:
+ case ITEM_EFFECT_CURE_ALL_STATUS:
StringExpandPlaceholders(gStringVar4, gText_PkmnBecameHealthy);
break;
- case 13:
+ case ITEM_EFFECT_HP_EV:
StringCopy(gStringVar2, gText_HP3);
StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased);
break;
- case 12:
+ case ITEM_EFFECT_ATK_EV:
StringCopy(gStringVar2, gText_Attack3);
StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased);
break;
- case 17:
+ case ITEM_EFFECT_DEF_EV:
StringCopy(gStringVar2, gText_Defense3);
StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased);
break;
- case 16:
+ case ITEM_EFFECT_SPEED_EV:
StringCopy(gStringVar2, gText_Speed2);
StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased);
break;
- case 14:
+ case ITEM_EFFECT_SPATK_EV:
StringCopy(gStringVar2, gText_SpAtk3);
StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased);
break;
- case 15:
+ case ITEM_EFFECT_SPDEF_EV:
StringCopy(gStringVar2, gText_SpDef3);
StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased);
break;
- case 19:
- case 20:
+ case ITEM_EFFECT_PP_UP:
+ case ITEM_EFFECT_PP_MAX:
StringExpandPlaceholders(gStringVar4, gText_MovesPPIncreased);
break;
- case 21:
+ case ITEM_EFFECT_HEAL_PP:
StringExpandPlaceholders(gStringVar4, gText_PPWasRestored);
break;
default:
@@ -5357,12 +5358,12 @@ static void GetMedicineItemEffectMessage(u16 item)
static bool8 UsingHPEVItemOnShedinja(struct Pokemon *mon, u16 item)
{
- if (GetItemEffectType(item) == 13 && GetMonData(mon, MON_DATA_SPECIES) == SPECIES_SHEDINJA)
+ if (GetItemEffectType(item) == ITEM_EFFECT_HP_EV && GetMonData(mon, MON_DATA_SPECIES) == SPECIES_SHEDINJA)
return FALSE;
return TRUE;
}
-static bool8 IsBlueYellowRedFlute(u16 item)
+static bool8 IsItemFlute(u16 item)
{
if (item == ITEM_BLUE_FLUTE || item == ITEM_RED_FLUTE || item == ITEM_YELLOW_FLUTE)
return TRUE;
@@ -5409,7 +5410,7 @@ void ItemUseCB_Medicine(u8 taskId, TaskFunc task)
goto iTriedHonestlyIDid;
}
gUnknown_0203CEE8 = 1;
- if (IsBlueYellowRedFlute(item) == FALSE)
+ if (IsItemFlute(item) == FALSE)
{
PlaySE(SE_KAIFUKU);
if (gUnknown_0203CEC8.unkB != 14)
@@ -5466,10 +5467,10 @@ void sub_81B67C8(u8 taskId, TaskFunc task)
u16 item = gSpecialVar_ItemId;
u8 effectType = GetItemEffectType(item);
u16 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP);
- u16 relevantEV = sub_81B691C(mon, effectType);
+ u16 relevantEV = ItemEffectToMonEv(mon, effectType);
bool8 cannotUseEffect = ExecuteTableBasedItemEffect__(gUnknown_0203CEC8.unk9, item, 0);
u16 newFriendship = GetMonData(mon, MON_DATA_FRIENDSHIP);
- u16 newRelevantEV = sub_81B691C(mon, effectType);
+ u16 newRelevantEV = ItemEffectToMonEv(mon, effectType);
if (cannotUseEffect || (friendship == newFriendship && relevantEV == newRelevantEV))
{
@@ -5485,7 +5486,7 @@ void sub_81B67C8(u8 taskId, TaskFunc task)
PlaySE(SE_KAIFUKU);
RemoveBagItem(item, 1);
GetMonNickname(mon, gStringVar1);
- option_menu_get_string(effectType, gStringVar2);
+ ItemEffectToStatString(effectType, gStringVar2);
if (friendship != newFriendship)
{
if (relevantEV != newRelevantEV)
@@ -5503,48 +5504,48 @@ void sub_81B67C8(u8 taskId, TaskFunc task)
}
}
-static u16 sub_81B691C(struct Pokemon *mon, u8 effectType)
+static u16 ItemEffectToMonEv(struct Pokemon *mon, u8 effectType)
{
switch (effectType)
{
- case 13:
+ case ITEM_EFFECT_HP_EV:
if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_SHEDINJA)
return GetMonData(mon, MON_DATA_HP_EV);
break;
- case 12:
+ case ITEM_EFFECT_ATK_EV:
return GetMonData(mon, MON_DATA_ATK_EV);
- case 17:
+ case ITEM_EFFECT_DEF_EV:
return GetMonData(mon, MON_DATA_DEF_EV);
- case 16:
+ case ITEM_EFFECT_SPEED_EV:
return GetMonData(mon, MON_DATA_SPEED_EV);
- case 14:
+ case ITEM_EFFECT_SPATK_EV:
return GetMonData(mon, MON_DATA_SPATK_EV);
- case 15:
+ case ITEM_EFFECT_SPDEF_EV:
return GetMonData(mon, MON_DATA_SPDEF_EV);
}
return 0;
}
-static void option_menu_get_string(u8 effectType, u8 *dest)
+static void ItemEffectToStatString(u8 effectType, u8 *dest)
{
switch (effectType)
{
- case 13:
+ case ITEM_EFFECT_HP_EV:
StringCopy(dest, gText_HP3);
break;
- case 12:
+ case ITEM_EFFECT_ATK_EV:
StringCopy(dest, gText_Attack3);
break;
- case 17:
+ case ITEM_EFFECT_DEF_EV:
StringCopy(dest, gText_Defense3);
break;
- case 16:
+ case ITEM_EFFECT_SPEED_EV:
StringCopy(dest, gText_Speed2);
break;
- case 14:
+ case ITEM_EFFECT_SPATK_EV:
StringCopy(dest, gText_SpAtk3);
break;
- case 15:
+ case ITEM_EFFECT_SPDEF_EV:
StringCopy(dest, gText_SpDef3);
break;
}
@@ -5598,7 +5599,7 @@ void dp05_ether(u8 taskId, TaskFunc task)
else
effect = gItemEffectTable[item - ITEM_POTION];
- if ((effect[4] & 0x10) == 0)
+ if (!(effect[4] & ITEM4_HEAL_PP_ONE))
{
gUnknown_0203CEC8.unkE = 0;
ether_effect_related(taskId);
@@ -6221,8 +6222,8 @@ u8 GetItemEffectType(u16 item)
const u8 *itemEffect;
u32 statusCure;
- if (!IS_POKEMON_ITEM(item))
- return 22;
+ if (!ITEM_HAS_EFFECT(item))
+ return ITEM_EFFECT_NONE;
// Read the item's effect properties.
if (item == ITEM_ENIGMA_BERRY)
@@ -6230,58 +6231,58 @@ u8 GetItemEffectType(u16 item)
else
itemEffect = gItemEffectTable[item - ITEM_POTION];
- if ((itemEffect[0] & 0x3F) || itemEffect[1] || itemEffect[2] || (itemEffect[3] & 0x80))
- return 0;
- else if (itemEffect[0] & 0x40)
- return 10;
- else if (itemEffect[3] & 0x40)
- return 1;
+ if ((itemEffect[0] & (ITEM0_HIGH_CRIT | ITEM0_X_ATTACK)) || itemEffect[1] || itemEffect[2] || (itemEffect[3] & ITEM3_MIST))
+ return ITEM_EFFECT_X_ITEM;
+ else if (itemEffect[0] & ITEM0_SACRED_ASH)
+ return ITEM_EFFECT_SACRED_ASH;
+ else if (itemEffect[3] & ITEM3_LEVEL_UP)
+ return ITEM_EFFECT_RAISE_LEVEL;
- statusCure = itemEffect[3] & 0x3F;
+ statusCure = itemEffect[3] & ITEM3_STATUS_ALL;
if (statusCure || (itemEffect[0] >> 7))
{
- if (statusCure == 0x20)
- return 4;
- else if (statusCure == 0x10)
- return 3;
- else if (statusCure == 0x8)
- return 5;
- else if (statusCure == 0x4)
- return 6;
- else if (statusCure == 0x2)
- return 7;
- else if (statusCure == 0x1)
- return 8;
+ if (statusCure == ITEM3_SLEEP)
+ return ITEM_EFFECT_CURE_SLEEP;
+ else if (statusCure == ITEM3_POISON)
+ return ITEM_EFFECT_CURE_POISON;
+ else if (statusCure == ITEM3_BURN)
+ return ITEM_EFFECT_CURE_BURN;
+ else if (statusCure == ITEM3_FREEZE)
+ return ITEM_EFFECT_CURE_FREEZE;
+ else if (statusCure == ITEM3_PARALYSIS)
+ return ITEM_EFFECT_CURE_PARALYSIS;
+ else if (statusCure == ITEM3_CONFUSION)
+ return ITEM_EFFECT_CURE_CONFUSION;
else if (itemEffect[0] >> 7 && !statusCure)
- return 9;
+ return ITEM_EFFECT_CURE_INFATUATION;
else
- return 11;
- }
-
- if (itemEffect[4] & 0x44)
- return 2;
- else if (itemEffect[4] & 0x2)
- return 12;
- else if (itemEffect[4] & 0x1)
- return 13;
- else if (itemEffect[5] & 0x8)
- return 14;
- else if (itemEffect[5] & 0x4)
- return 15;
- else if (itemEffect[5] & 0x2)
- return 16;
- else if (itemEffect[5] & 0x1)
- return 17;
- else if (itemEffect[4] & 0x80)
- return 18;
- else if (itemEffect[4] & 0x20)
- return 19;
- else if (itemEffect[5] & 0x10)
- return 20;
- else if (itemEffect[4] & 0x18)
- return 21;
+ return ITEM_EFFECT_CURE_ALL_STATUS;
+ }
+
+ if (itemEffect[4] & (ITEM4_REVIVE | ITEM4_HEAL_HP))
+ return ITEM_EFFECT_HEAL_HP;
+ else if (itemEffect[4] & ITEM4_EV_ATK)
+ return ITEM_EFFECT_ATK_EV;
+ else if (itemEffect[4] & ITEM4_EV_HP)
+ return ITEM_EFFECT_HP_EV;
+ else if (itemEffect[5] & ITEM5_EV_SPATK)
+ return ITEM_EFFECT_SPATK_EV;
+ else if (itemEffect[5] & ITEM5_EV_SPDEF)
+ return ITEM_EFFECT_SPDEF_EV;
+ else if (itemEffect[5] & ITEM5_EV_SPEED)
+ return ITEM_EFFECT_SPEED_EV;
+ else if (itemEffect[5] & ITEM5_EV_DEF)
+ return ITEM_EFFECT_DEF_EV;
+ else if (itemEffect[4] & ITEM4_EVO_STONE)
+ return ITEM_EFFECT_EVO_STONE;
+ else if (itemEffect[4] & ITEM4_PP_UP)
+ return ITEM_EFFECT_PP_UP;
+ else if (itemEffect[5] & ITEM5_PP_MAX)
+ return ITEM_EFFECT_PP_MAX;
+ else if (itemEffect[4] & (ITEM4_HEAL_PP_ALL | ITEM4_HEAL_PP_ONE))
+ return ITEM_EFFECT_HEAL_PP;
else
- return 22;
+ return ITEM_EFFECT_NONE;
}
static void sub_81B7E4C(u8 taskId)
diff --git a/src/pokemon.c b/src/pokemon.c
index 9c6afe0b8..fc9a0843f 100644
--- a/src/pokemon.c
+++ b/src/pokemon.c
@@ -39,6 +39,7 @@
#include "constants/battle_frontier.h"
#include "constants/battle_move_effects.h"
#include "constants/hold_effects.h"
+#include "constants/item_effects.h"
#include "constants/items.h"
#include "constants/layouts.h"
#include "constants/moves.h"
@@ -4664,9 +4665,9 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov
battlerId = MAX_BATTLERS_COUNT;
}
- if (!IS_POKEMON_ITEM(item))
+ if (!ITEM_HAS_EFFECT(item))
return TRUE;
- if (gItemEffectTable[item - 13] == NULL && item != ITEM_ENIGMA_BERRY)
+ if (gItemEffectTable[item - ITEM_POTION] == NULL && item != ITEM_ENIGMA_BERRY)
return TRUE;
if (item == ITEM_ENIGMA_BERRY)
@@ -4678,82 +4679,82 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov
}
else
{
- itemEffect = gItemEffectTable[item - 13];
+ itemEffect = gItemEffectTable[item - ITEM_POTION];
}
for (cmdIndex = 0; cmdIndex < 6; cmdIndex++)
{
switch (cmdIndex)
{
- // status healing effects
+ // infatuation heal, x attack, sacred ash and dire hit
case 0:
- if ((itemEffect[cmdIndex] & 0x80)
- && gMain.inBattle && battlerId != 4 && (gBattleMons[battlerId].status2 & STATUS2_INFATUATION))
+ if ((itemEffect[cmdIndex] & ITEM0_INFATUATION)
+ && gMain.inBattle && battlerId != MAX_BATTLERS_COUNT && (gBattleMons[battlerId].status2 & STATUS2_INFATUATION))
{
gBattleMons[battlerId].status2 &= ~STATUS2_INFATUATION;
retVal = FALSE;
}
- if ((itemEffect[cmdIndex] & 0x30)
+ if ((itemEffect[cmdIndex] & ITEM0_HIGH_CRIT)
&& !(gBattleMons[gActiveBattler].status2 & STATUS2_FOCUS_ENERGY))
{
gBattleMons[gActiveBattler].status2 |= STATUS2_FOCUS_ENERGY;
retVal = FALSE;
}
- if ((itemEffect[cmdIndex] & 0xF)
+ if ((itemEffect[cmdIndex] & ITEM0_X_ATTACK)
&& gBattleMons[gActiveBattler].statStages[STAT_ATK] < 12)
{
- gBattleMons[gActiveBattler].statStages[STAT_ATK] += itemEffect[cmdIndex] & 0xF;
+ gBattleMons[gActiveBattler].statStages[STAT_ATK] += itemEffect[cmdIndex] & ITEM0_X_ATTACK;
if (gBattleMons[gActiveBattler].statStages[STAT_ATK] > 12)
gBattleMons[gActiveBattler].statStages[STAT_ATK] = 12;
retVal = FALSE;
}
break;
- // in-battle stat boosting effects?
+ // in-battle stat boosting effects
case 1:
- if ((itemEffect[cmdIndex] & 0xF0)
+ if ((itemEffect[cmdIndex] & ITEM1_X_DEFEND)
&& gBattleMons[gActiveBattler].statStages[STAT_DEF] < 12)
{
- gBattleMons[gActiveBattler].statStages[STAT_DEF] += (itemEffect[cmdIndex] & 0xF0) >> 4;
+ gBattleMons[gActiveBattler].statStages[STAT_DEF] += (itemEffect[cmdIndex] & ITEM1_X_DEFEND) >> 4;
if (gBattleMons[gActiveBattler].statStages[STAT_DEF] > 12)
gBattleMons[gActiveBattler].statStages[STAT_DEF] = 12;
retVal = FALSE;
}
- if ((itemEffect[cmdIndex] & 0xF)
+ if ((itemEffect[cmdIndex] & ITEM1_X_SPEED)
&& gBattleMons[gActiveBattler].statStages[STAT_SPEED] < 12)
{
- gBattleMons[gActiveBattler].statStages[STAT_SPEED] += itemEffect[cmdIndex] & 0xF;
+ gBattleMons[gActiveBattler].statStages[STAT_SPEED] += itemEffect[cmdIndex] & ITEM1_X_SPEED;
if (gBattleMons[gActiveBattler].statStages[STAT_SPEED] > 12)
gBattleMons[gActiveBattler].statStages[STAT_SPEED] = 12;
retVal = FALSE;
}
break;
- // more stat boosting effects?
+ // more stat boosting effects
case 2:
- if ((itemEffect[cmdIndex] & 0xF0)
+ if ((itemEffect[cmdIndex] & ITEM2_X_ACCURACY)
&& gBattleMons[gActiveBattler].statStages[STAT_ACC] < 12)
{
- gBattleMons[gActiveBattler].statStages[STAT_ACC] += (itemEffect[cmdIndex] & 0xF0) >> 4;
+ gBattleMons[gActiveBattler].statStages[STAT_ACC] += (itemEffect[cmdIndex] & ITEM2_X_ACCURACY) >> 4;
if (gBattleMons[gActiveBattler].statStages[STAT_ACC] > 12)
gBattleMons[gActiveBattler].statStages[STAT_ACC] = 12;
retVal = FALSE;
}
- if ((itemEffect[cmdIndex] & 0xF)
+ if ((itemEffect[cmdIndex] & ITEM2_X_SPATK)
&& gBattleMons[gActiveBattler].statStages[STAT_SPATK] < 12)
{
- gBattleMons[gActiveBattler].statStages[STAT_SPATK] += itemEffect[cmdIndex] & 0xF;
+ gBattleMons[gActiveBattler].statStages[STAT_SPATK] += itemEffect[cmdIndex] & ITEM2_X_SPATK;
if (gBattleMons[gActiveBattler].statStages[STAT_SPATK] > 12)
gBattleMons[gActiveBattler].statStages[STAT_SPATK] = 12;
retVal = FALSE;
}
break;
case 3:
- if ((itemEffect[cmdIndex] & 0x80)
+ if ((itemEffect[cmdIndex] & ITEM3_MIST)
&& gSideTimers[GetBattlerSide(gActiveBattler)].mistTimer == 0)
{
gSideTimers[GetBattlerSide(gActiveBattler)].mistTimer = 5;
retVal = FALSE;
}
- if ((itemEffect[cmdIndex] & 0x40) // raise level
+ if ((itemEffect[cmdIndex] & ITEM3_LEVEL_UP)
&& GetMonData(mon, MON_DATA_LEVEL, NULL) != MAX_LEVEL)
{
dataUnsigned = gExperienceTables[gBaseStats[GetMonData(mon, MON_DATA_SPECIES, NULL)].growthRate][GetMonData(mon, MON_DATA_LEVEL, NULL) + 1];
@@ -4761,23 +4762,23 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov
CalculateMonStats(mon);
retVal = FALSE;
}
- if ((itemEffect[cmdIndex] & 0x20)
+ if ((itemEffect[cmdIndex] & ITEM3_SLEEP)
&& HealStatusConditions(mon, partyIndex, 7, battlerId) == 0)
{
if (battlerId != 4)
gBattleMons[battlerId].status2 &= ~STATUS2_NIGHTMARE;
retVal = FALSE;
}
- if ((itemEffect[cmdIndex] & 0x10) && HealStatusConditions(mon, partyIndex, STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER, battlerId) == 0)
+ if ((itemEffect[cmdIndex] & ITEM3_POISON) && HealStatusConditions(mon, partyIndex, STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER, battlerId) == 0)
retVal = FALSE;
- if ((itemEffect[cmdIndex] & 8) && HealStatusConditions(mon, partyIndex, STATUS1_BURN, battlerId) == 0)
+ if ((itemEffect[cmdIndex] & ITEM3_BURN) && HealStatusConditions(mon, partyIndex, STATUS1_BURN, battlerId) == 0)
retVal = FALSE;
- if ((itemEffect[cmdIndex] & 4) && HealStatusConditions(mon, partyIndex, STATUS1_FREEZE, battlerId) == 0)
+ if ((itemEffect[cmdIndex] & ITEM3_FREEZE) && HealStatusConditions(mon, partyIndex, STATUS1_FREEZE, battlerId) == 0)
retVal = FALSE;
- if ((itemEffect[cmdIndex] & 2) && HealStatusConditions(mon, partyIndex, STATUS1_PARALYSIS, battlerId) == 0)
+ if ((itemEffect[cmdIndex] & ITEM3_PARALYSIS) && HealStatusConditions(mon, partyIndex, STATUS1_PARALYSIS, battlerId) == 0)
retVal = FALSE;
- if ((itemEffect[cmdIndex] & 1) // heal confusion
- && gMain.inBattle && battlerId != 4 && (gBattleMons[battlerId].status2 & STATUS2_CONFUSION))
+ if ((itemEffect[cmdIndex] & ITEM3_CONFUSION) // heal confusion
+ && gMain.inBattle && battlerId != MAX_BATTLERS_COUNT && (gBattleMons[battlerId].status2 & STATUS2_CONFUSION))
{
gBattleMons[battlerId].status2 &= ~STATUS2_CONFUSION;
retVal = FALSE;
@@ -4786,9 +4787,9 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov
// EV, HP, and PP raising effects
case 4:
r10 = itemEffect[cmdIndex];
- if (r10 & 0x20)
+ if (r10 & ITEM4_PP_UP)
{
- r10 &= ~0x20;
+ r10 &= ~ITEM4_PP_UP;
dataUnsigned = (GetMonData(mon, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2);
var_38 = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex);
if (dataUnsigned <= 2 && var_38 > 4)
@@ -4811,6 +4812,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov
{
case 0:
case 1:
+ // ev raise
evCount = GetMonEVCount(mon);
r5 = itemEffect[var_3C];
dataSigned = GetMonData(mon, sGetMonDataEVConstants[var_38], NULL);
@@ -4849,7 +4851,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov
retVal = FALSE;
break;
case 2:
- // revive?
+ // revive
if (r10 & 0x10)
{
if (GetMonData(mon, MON_DATA_HP, NULL) != 0)
@@ -4930,6 +4932,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov
r10 &= 0xEF;
break;
case 3:
+ // Heal pp in all moves.
if (!(r10 & 2))
{
for (r5 = 0; (signed)(r5) < (signed)(4); r5++)
@@ -4949,7 +4952,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov
}
SetMonData(mon, MON_DATA_PP1 + r5, &dataUnsigned);
if (gMain.inBattle
- && battlerId != 4 && !(gBattleMons[battlerId].status2 & STATUS2_TRANSFORMED)
+ && battlerId != MAX_BATTLERS_COUNT && !(gBattleMons[battlerId].status2 & STATUS2_TRANSFORMED)
&& !(gDisableStructs[battlerId].mimickedMoves & gBitTable[r5]))
gBattleMons[battlerId].pp[r5] = dataUnsigned;
retVal = FALSE;
@@ -4957,6 +4960,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov
}
var_3C++;
}
+ // Heal pp in one move.
else
{
u16 moveId;
@@ -4981,6 +4985,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov
}
}
break;
+ // Evolution stone
case 7:
{
u16 targetSpecies = GetEvolutionTargetSpecies(mon, 2, item);
@@ -4998,6 +5003,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov
r10 >>= 1;
}
break;
+ // EV and friendship
case 5:
r10 = itemEffect[cmdIndex];
var_38 = 0;
@@ -5180,7 +5186,7 @@ u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit)
offset = 6;
- temp = gItemEffectTable[itemId - 13];
+ temp = gItemEffectTable[itemId - ITEM_POTION];
if (!temp && itemId != ITEM_ENIGMA_BERRY)
return 0;
@@ -5205,8 +5211,8 @@ u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit)
break;
case 4:
val = itemEffect[4];
- if (val & 0x20)
- val &= 0xDF;
+ if (val & ITEM4_PP_UP)
+ val &= ~(ITEM4_PP_UP);
j = 0;
while (val)
{
@@ -5304,7 +5310,7 @@ u8 *sub_806CF78(u16 itemId)
}
else
{
- itemEffect = gItemEffectTable[itemId - 13];
+ itemEffect = gItemEffectTable[itemId - ITEM_POTION];
}
gPotentialItemEffectBattler = gBattlerInMenuId;
@@ -5327,7 +5333,7 @@ u8 *sub_806CF78(u16 itemId)
}
}
- if (itemEffect[3] & 0x80)
+ if (itemEffect[3] & ITEM3_MIST)
{
gBattlerAttacker = gBattlerInMenuId;
BattleStringExpandPlaceholdersToDisplayedString(gText_PkmnShroudedInMist);