summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/menews_jisan.c199
-rw-r--r--src/pokemon.c2073
2 files changed, 1733 insertions, 539 deletions
diff --git a/src/menews_jisan.c b/src/menews_jisan.c
new file mode 100644
index 000000000..7dfcee939
--- /dev/null
+++ b/src/menews_jisan.c
@@ -0,0 +1,199 @@
+#include "global.h"
+#include "mevent.h"
+#include "random.h"
+#include "event_data.h"
+#include "menews_jisan.h"
+
+static u32 sub_8146D74(struct MysteryEventStruct *);
+static void sub_8146DD8(struct MysteryEventStruct *);
+static u32 sub_8146E0C(struct MysteryEventStruct *);
+static void sub_8146DA0(struct MysteryEventStruct *);
+static void sub_8146D94(struct MysteryEventStruct *);
+
+#ifdef NONMATCHING
+void sub_8146C30(u32 a0)
+{
+ struct MysteryEventStruct *r5 = sub_8143D94();
+
+ r5->unk_0_0 = a0;
+ asm_comment("The switch logic does not match. Specifically, the \"bhi\" is replaced with a \"bls\" and the comparisons with 1 and 3 are swapped chronologically.");
+ switch (a0)
+ {
+ case 0:
+ r5->unk_1 = (Random() % 15) + 16;
+ break;
+ case 1:
+ break;
+ case 2:
+ break;
+ case 3:
+ r5->unk_1 = (Random() % 15) + 1;
+ break;
+ }
+}
+#else
+NAKED
+void sub_8146C30(u32 a0)
+{
+ asm_unified("\tpush {r4,r5,lr}\n"
+ "\tadds r4, r0, 0\n"
+ "\tbl sub_8143D94\n"
+ "\tadds r5, r0, 0\n"
+ "\tmovs r0, 0x3\n"
+ "\tadds r1, r4, 0\n"
+ "\tands r1, r0\n"
+ "\tldrb r2, [r5]\n"
+ "\tmovs r0, 0x4\n"
+ "\tnegs r0, r0\n"
+ "\tands r0, r2\n"
+ "\torrs r0, r1\n"
+ "\tstrb r0, [r5]\n"
+ "\tcmp r4, 0x2\n"
+ "\tbhi _08146C56\n"
+ "\tcmp r4, 0x1\n"
+ "\tbcs _08146C5C\n"
+ "\tb _08146C80\n"
+ "_08146C56:\n"
+ "\tcmp r4, 0x3\n"
+ "\tbeq _08146C6E\n"
+ "\tb _08146C80\n"
+ "_08146C5C:\n"
+ "\tbl Random\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tmovs r1, 0xF\n"
+ "\tbl __umodsi3\n"
+ "\tadds r0, 0x10\n"
+ "\tb _08146C7E\n"
+ "_08146C6E:\n"
+ "\tbl Random\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tmovs r1, 0xF\n"
+ "\tbl __umodsi3\n"
+ "\tadds r0, 0x1\n"
+ "_08146C7E:\n"
+ "\tstrb r0, [r5, 0x1]\n"
+ "_08146C80:\n"
+ "\tpop {r4,r5}\n"
+ "\tpop {r0}\n"
+ "\tbx r0");
+}
+#endif
+
+void sub_8146C88(void)
+{
+ struct MysteryEventStruct *r5 = sub_8143D94();
+
+ r5->unk_0_0 = 0;
+ r5->unk_0_2 = 0;
+ r5->unk_0_5 = 0;
+ r5->unk_1 = 0;
+ VarSet(0x4028, 0);
+}
+
+void sub_8146CA4(void)
+{
+ u16 *r4 = sub_806E454(0x4028);
+ struct MysteryEventStruct *r2 = sub_8143D94();
+ struct MysteryEventStruct r0 = *r2;
+
+ if ((u8)r0.unk_0_5 > 4 && ++(*r4) > 0x1f3)
+ {
+ r2->unk_0_5 = 0;
+ *r4 = 0;
+ }
+}
+
+u16 sub_8146CE8(void)
+{
+ u16 *r6 = &gUnknown_20370D0;
+ struct MysteryEventStruct *r4 = sub_8143D94();
+ u16 r5;
+
+ if (!sub_806E2BC() || !sub_8143E1C())
+ return 0;
+
+ r5 = sub_8146E0C(r4);
+
+ switch (r5)
+ {
+ case 0:
+ break;
+ case 1:
+ *r6 = sub_8146D74(r4);
+ break;
+ case 2:
+ *r6 = sub_8146D74(r4);
+ break;
+ case 3:
+ break;
+ case 4:
+ *r6 = sub_8146D74(r4);
+ sub_8146DA0(r4);
+ break;
+ case 5:
+ *r6 = sub_8146D74(r4);
+ sub_8146D94(r4);
+ break;
+ case 6:
+ break;
+ }
+
+ return r5;
+}
+
+static u32 sub_8146D74(struct MysteryEventStruct *a0)
+{
+ u32 r4;
+
+ a0->unk_0_0 = 0;
+ r4 = a0->unk_1 + 0x84;
+ a0->unk_1 = 0;
+ sub_8146DD8(a0);
+ return r4;
+}
+
+static void sub_8146D94(struct MysteryEventStruct *a0)
+{
+ a0->unk_0_2 = 0;
+}
+
+static void sub_8146DA0(struct MysteryEventStruct *a0)
+{
+ a0->unk_0_2++;
+ if ((u8)a0->unk_0_2 > 4)
+ a0->unk_0_2 = 4;
+}
+
+static void sub_8146DD8(struct MysteryEventStruct *a0)
+{
+ a0->unk_0_5++;
+ if ((u8)a0->unk_0_5 > 5)
+ a0->unk_0_5 = 5;
+}
+
+static u32 sub_8146E0C(struct MysteryEventStruct *a0)
+{
+ struct MysteryEventStruct r0;
+ if ((u8)a0->unk_0_5 == 5)
+ return 6;
+
+ r0 = *a0;
+ switch (r0.unk_0_0)
+ {
+ case 0:
+ return 3;
+ case 1:
+ return 1;
+ case 2:
+ return 2;
+ case 3:
+ if ((u8)r0.unk_0_2 < 3)
+ return 4;
+ return 5;
+ default:
+ AGB_ASSERT_EX(0, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/menews_jisan.c", 383);
+ return 0;
+ }
+}
diff --git a/src/pokemon.c b/src/pokemon.c
index af599fec5..1467d8b6f 100644
--- a/src/pokemon.c
+++ b/src/pokemon.c
@@ -2832,544 +2832,1539 @@ bool8 HealStatusConditions(struct Pokemon *mon, u32 unused, u32 healMask, u8 bat
extern bool8 sub_8042BE8(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId);
-static inline u32 get_in_battle(void)
-{
- return (u8)gMain.inBattle;
-}
-
-//bool8 PokemonUseItemEffects2(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 moveIndex, u8 e)
-//{
-// u32 data;
-// s32 friendship;
-// s32 cmdIndex;
-// bool8 retVal = TRUE;
-// const u8 *itemEffect;
-// u8 sp24 = 6;
-// u32 sp28;
-// s8 sp2C = 0;
-// u8 sp34 = 4;
-// u16 heldItem;
-// u8 r10;
-// s32 r4;
-// u8 field;
-// u8 holdEffect;
-//
-// heldItem = GetMonData(pkmn, MON_DATA_HELD_ITEM, NULL);
-// if (heldItem == ITEM_ENIGMA_BERRY)
-// {
-// /*
-// if (gMain.inBattle)
-// holdEffect = gEnigmaBerries[gBattlerInMenuId].holdEffect;
-// else
-// holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect;
-// */
-// }
-// else
-// {
-// ItemId_GetHoldEffect(heldItem);
-// }
-//
-// gPotentialItemEffectBattler = gBattlerInMenuId;
-// // grr. the original asm also u8 masks after loading the bitmask, despite
-// // the fact that is a useless operation. what's going on here?
-// if (gMain.inBattle)
-// {
-// gActiveBattler = gBattlerInMenuId;
-// cmdIndex = (GetBattlerSide(gActiveBattler) != 0);
-// while (cmdIndex < gBattlersCount)
-// {
-// if (gBattlerPartyIndexes[cmdIndex] == partyIndex)
-// {
-// sp34 = cmdIndex;
-// break;
-// }
-// cmdIndex += 2;
-// }
-// }
-// else
-// {
-// sp34 = 4, gActiveBattler = 0;
-// }
-//
-// // _08042504
-// if (!IS_POKEMON_ITEM(item))
-// return TRUE;
-// if (gItemEffectTable[item - 13] == NULL && item != ITEM_ENIGMA_BERRY)
-// return TRUE;
-//
-// if (item == ITEM_ENIGMA_BERRY)
-// {
-// if (gMain.inBattle)
-// itemEffect = gEnigmaBerries[gActiveBattler].itemEffect;
-// else
-// itemEffect = gSaveBlock1Ptr->enigmaBerry.itemEffect;
-// }
-// else
-// {
-// itemEffect = gItemEffectTable[item - 13];
-// }
-//
-// for (cmdIndex = 0; cmdIndex < 6; cmdIndex++)
-// {
-// switch (cmdIndex)
-// {
-// // status healing effects
-// case 0:
-// if ((itemEffect[cmdIndex] & 0x80)
-// && gMain.inBattle && sp34 != 4 && (gBattleMons[sp34].status2 & STATUS2_INFATUATION))
-// {
-// //gBattleMons[sp34].status2 &= ~STATUS2_INFATUATION;
-// retVal = FALSE;
-// }
-// if ((itemEffect[cmdIndex] & 0x30)
-// && !(gBattleMons[gActiveBattler].status2 & STATUS2_FOCUS_ENERGY))
-// {
-// //gBattleMons[gActiveBattler].status2 |= STATUS2_FOCUS_ENERGY;
-// retVal = FALSE;
-// }
-// if ((itemEffect[cmdIndex] & 0xF)
-// && gBattleMons[gActiveBattler].statStages[STAT_STAGE_ATK] < 12)
-// {
-// //gBattleMons[gActiveBattler].statStages[STAT_STAGE_ATK] += itemEffect[cmdIndex] & 0xF;
-// //if (gBattleMons[gActiveBattler].statStages[STAT_STAGE_ATK] > 12)
-// // gBattleMons[gActiveBattler].statStages[STAT_STAGE_ATK] = 12;
-// retVal = FALSE;
-// }
-// break;
-// // in-battle stat boosting effects?
-// case 1:
-// if ((itemEffect[cmdIndex] & 0xF0)
-// && gBattleMons[gActiveBattler].statStages[STAT_STAGE_DEF] < 12)
-// {
-// //gBattleMons[gActiveBattler].statStages[STAT_STAGE_DEF] += (itemEffect[cmdIndex] & 0xF0) >> 4;
-// //if (gBattleMons[gActiveBattler].statStages[STAT_STAGE_DEF] > 12)
-// // gBattleMons[gActiveBattler].statStages[STAT_STAGE_DEF] = 12;
-// retVal = FALSE;
-// }
-// if ((itemEffect[cmdIndex] & 0xF)
-// && gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPEED] < 12)
-// {
-// //gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPEED] += itemEffect[cmdIndex] & 0xF;
-// //if (gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPEED] > 12)
-// // gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPEED] = 12;
-// retVal = FALSE;
-// }
-// break;
-// // more stat boosting effects?
-// case 2:
-// if ((itemEffect[cmdIndex] & 0xF0)
-// && gBattleMons[gActiveBattler].statStages[STAT_STAGE_ACC] < 12)
-// {
-// //gBattleMons[gActiveBattler].statStages[STAT_STAGE_ACC] += (itemEffect[cmdIndex] & 0xF0) >> 4;
-// //if (gBattleMons[gActiveBattler].statStages[STAT_STAGE_ACC] > 12)
-// // gBattleMons[gActiveBattler].statStages[STAT_STAGE_ACC] = 12;
-// retVal = FALSE;
-// }
-// if ((itemEffect[cmdIndex] & 0xF)
-// && gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPATK] < 12)
-// {
-// //gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPATK] += itemEffect[cmdIndex] & 0xF;
-// //if (gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPATK] > 12)
-// // gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPATK] = 12;
-// retVal = FALSE;
-// }
-// break;
-// case 3:
-// if ((itemEffect[cmdIndex] & 0x80)
-// && gSideTimers[GetBattlerSide(gActiveBattler)].mistTimer == 0)
-// {
-// //gSideTimers[GetBattlerSide(gActiveBattler)].mistTimer = 5;
-// retVal = FALSE;
-// }
-// if ((itemEffect[cmdIndex] & 0x40) // raise level
-// && GetMonData(pkmn, MON_DATA_LEVEL, NULL) != 100)
-// {
-// //data = gExperienceTables[gBaseStats[GetMonData(pkmn, MON_DATA_SPECIES, NULL)].growthRate][GetMonData(pkmn, MON_DATA_LEVEL, NULL) + 1];
-// //SetMonData(pkmn, MON_DATA_EXP, &data);
-// //CalculateMonStats(pkmn);
-// retVal = FALSE;
-// }
-// if ((itemEffect[cmdIndex] & 0x20)
-// && sub_8042BE8(pkmn, partyIndex, 7, sp34) == 0)
-// {
-// //if (sp34 != 4)
-// // gBattleMons[sp34].status2 &= ~STATUS2_NIGHTMARE;
-// retVal = FALSE;
-// }
-// if ((itemEffect[cmdIndex] & 0x10) && sub_8042BE8(pkmn, partyIndex, 0xF88, sp34) == 0)
-// retVal = FALSE;
-// if ((itemEffect[cmdIndex] & 8) && sub_8042BE8(pkmn, partyIndex, 16, sp34) == 0)
-// retVal = FALSE;
-// if ((itemEffect[cmdIndex] & 4) && sub_8042BE8(pkmn, partyIndex, 32, sp34) == 0)
-// retVal = FALSE;
-// if ((itemEffect[cmdIndex] & 2) && sub_8042BE8(pkmn, partyIndex, 64, sp34) == 0)
-// retVal = FALSE;
-// if ((itemEffect[cmdIndex] & 1) // heal confusion
-// && gMain.inBattle && sp34 != 4 && (gBattleMons[sp34].status2 & STATUS2_CONFUSION))
-// {
-// //gBattleMons[sp34].status2 &= ~STATUS2_CONFUSION;
-// retVal = FALSE;
-// }
-// break;
-// // EV, HP, and PP raising effects
-// case 4:
-// r10 = itemEffect[cmdIndex];
-// if (r10 & 0x20)
-// {
-// r10 &= ~0x20;
-// data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_825DEA1[moveIndex]) >> (moveIndex * 2);
-// sp28 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex);
-// if (data < 3 && sp28 > 4)
-// {
-// //data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) + gUnknown_825DEA9[moveIndex];
-// //SetMonData(pkmn, MON_DATA_PP_BONUSES, &data);
-// //
-// //data = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - sp28;
-// //data = GetMonData(pkmn, MON_DATA_PP1 + moveIndex, NULL) + data;
-// //SetMonData(pkmn, MON_DATA_PP1 + moveIndex, &data);
-// retVal = FALSE;
-// }
-// }
-// sp28 = 0;
-// while (r10 != 0) // _080428C0
-// {
-// if (r10 & 1)
-// {
-// u16 evCount;
-// u16 targetSpecies;
-// s32 r5;
-//
-// switch (sp28)
-// {
-// case 0:
-// case 1:
-// evCount = GetMonEVCount(pkmn);
-// if (evCount >= 510)
-// return TRUE;
-// data = GetMonData(pkmn, sGetMonDataEVConstants[sp28], NULL);
-// if (data < 100)
-// {
-// //if (data + itemEffect[sp24] > 100)
-// // r4 = 100 - (data + itemEffect[sp24]) + itemEffect[sp24];
-// //else
-// // r4 = itemEffect[sp24];
-// //if (evCount + r4 > 510)
-// // r4 += 510 - (evCount + r4);
-// //data += r4;
-// //SetMonData(pkmn, sGetMonDataEVConstants[sp28], &data);
-// //CalculateMonStats(pkmn);
-// sp24++;
-// retVal = FALSE;
-// }
-// break;
-// case 2:
-// // revive?
-// if (r10 & 0x10)
-// {
-// if (GetMonData(pkmn, MON_DATA_HP, NULL) != 0)
-// {
-// sp24++;
-// break;
-// }
-// /*
-// if (gMain.inBattle)
-// {
-// if (sp34 != 4)
-// {
-// gAbsentBattlerFlags &= ~gBitTable[sp34];
-// CopyPlayerPartyMonToBattleData(sp34, pokemon_order_func(gBattlerPartyIndexes[sp34]));
-// if (GetBattlerSide(gActiveBattler) == 0 && gBattleResults.unk4 < 255)
-// gBattleResults.unk4++;
-// }
-// else
-// {
-// gAbsentBattlerFlags &= ~gBitTable[gActiveBattler ^ 2];
-// if (GetBattlerSide(gActiveBattler) == 0 && gBattleResults.unk4 < 255)
-// gBattleResults.unk4++;
-// }
-// }
-// */
-// }
-// else
-// {
-// if (GetMonData(pkmn, MON_DATA_HP, NULL) == 0)
-// {
-// sp24++;
-// break;
-// }
-// }
-// /*
-// data = itemEffect[sp24++];
-// switch (data)
-// {
-// case 0xFF:
-// data = GetMonData(pkmn, MON_DATA_MAX_HP, NULL) - GetMonData(pkmn, MON_DATA_HP, NULL);
-// break;
-// case 0xFE:
-// data = GetMonData(pkmn, MON_DATA_MAX_HP, NULL) / 2;
-// if (data == 0)
-// data = 1;
-// break;
-// case 0xFD:
-// data = gBattleScripting.field_23;
-// break;
-// }
-// */
-// if (GetMonData(pkmn, MON_DATA_MAX_HP, NULL) != GetMonData(pkmn, MON_DATA_HP, NULL))
-// {
-// /*
-// if (e == 0)
-// {
-// data = GetMonData(pkmn, MON_DATA_HP, NULL) + data;
-// if (data > GetMonData(pkmn, MON_DATA_MAX_HP, NULL))
-// data = GetMonData(pkmn, MON_DATA_MAX_HP, NULL);
-// SetMonData(pkmn, MON_DATA_HP, &data);
-// if (gMain.inBattle && sp34 != 4)
-// {
-// gBattleMons[sp34].hp = data;
-// if (!(r10 & 0x10) && GetBattlerSide(gActiveBattler) == 0)
-// {
-// if (gBattleResults.unk3 < 255)
-// gBattleResults.unk3++;
-// // I have to re-use this variable to match.
-// r5 = gActiveBattler;
-// gActiveBattler = sp34;
-// BtlController_EmitGetMonData(0, 0, 0);
-// MarkBufferBankForExecution(gActiveBattler);
-// gActiveBattler = r5;
-// }
-// }
-// }
-// else
-// {
-// gBattleMoveDamage = -data;
-// }
-// */
-// retVal = FALSE;
-// }
-// sp24++;
-// r10 &= 0xEF;
-// break;
-// case 3:
-// if (!(r10 & 2))
-// {
-// for (r5 = 0; r5 < 4; r5++)
-// {
-// u16 r4;
-//
-// data = GetMonData(pkmn, MON_DATA_PP1 + r5, NULL);
-// r4 = GetMonData(pkmn, MON_DATA_MOVE1 + r5, NULL);
-// if (data != CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), r5))
-// {
-// /*
-// data += itemEffect[sp24];
-// r4 = GetMonData(pkmn, MON_DATA_MOVE1 + r5, NULL);
-// if (data > CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), r5))
-// {
-// r4 = GetMonData(pkmn, MON_DATA_MOVE1 + r5, NULL);
-// data = CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), r5);
-// }
-// SetMonData(pkmn, MON_DATA_PP1 + r5, &data);
-// if (gMain.inBattle
-// && sp34 != 4 && !(gBattleMons[sp34].status2 & 0x200000)
-// && !(gDisableStructs[sp34].unk18_b & gBitTable[r5]))
-// gBattleMons[sp34].pp[r5] = data;
-// */
-// retVal = FALSE;
-// }
-// }
-// }
-// else // _080429FA
-// {
-// u16 r4;
-//
-// data = GetMonData(pkmn, MON_DATA_PP1 + moveIndex, NULL);
-// r4 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL);
-// if (data != CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex))
-// {
-// /*
-// data += itemEffect[sp24++];
-// r4 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL);
-// if (data > CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex))
-// {
-// r4 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL);
-// data = CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex);
-// }
-// SetMonData(pkmn, MON_DATA_PP1 + moveIndex, &data);
-// if (gMain.inBattle
-// && sp34 != 4 && !(gBattleMons[sp34].status2 & 0x200000)
-// && !(gDisableStructs[sp34].unk18_b & gBitTable[moveIndex]))
-// gBattleMons[sp34].pp[moveIndex] = data;
-// */
-// sp24++;
-// retVal = FALSE;
-// }
-// }
-// break;
-// case 7:
-// {
-// targetSpecies = GetEvolutionTargetSpecies(pkmn, 2, item);
-//
-// if (targetSpecies != SPECIES_NONE)
-// {
-// //BeginEvolutionScene(pkmn, targetSpecies, 0, partyIndex);
-// return FALSE;
-// }
-// }
-// break;
-// }
-// }
-// sp28++;
-// r10 >>= 1;
-// }
-// break;
-// case 5:
-// r10 = itemEffect[cmdIndex];
-// sp28 = 0;
-// while (r10 != 0)
-// {
-// if (r10 & 1)
-// {
-// u16 evCount;
-//
-// switch (sp28)
-// {
-// case 0:
-// case 1:
-// case 2:
-// case 3:
-// evCount = GetMonEVCount(pkmn);
-// if (evCount >= 510)
-// return TRUE;
-// data = GetMonData(pkmn, sGetMonDataEVConstants[sp28 + 2], NULL);
-// if (data < 100)
-// {
-// /*
-// if (data + itemEffect[sp24] > 100)
-// r4 = 100 - (data + itemEffect[sp24]) + itemEffect[sp24];
-// else
-// r4 = itemEffect[sp24];
-// if (evCount + r4 > 510)
-// r4 += 510 - (evCount + r4);
-// data += r4;
-// SetMonData(pkmn, sGetMonDataEVConstants[sp28 + 2], &data);
-// CalculateMonStats(pkmn);
-// */
-// retVal = FALSE;
-// sp24++;
-// }
-// break;
-// case 4:
-// data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_825DEA1[moveIndex]) >> (moveIndex * 2);
-// r4 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex);
-// if (data < 3)
-// {
-// if(r4 <= 4)
-// break;
-// /*
-//
-// data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL);
-// data &= gPPUpWriteMasks[moveIndex];
-// data += gUnknown_825DEA9[moveIndex] * 3;
-//
-// SetMonData(pkmn, MON_DATA_PP_BONUSES, &data);
-// data = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - r4;
-// data = GetMonData(pkmn, MON_DATA_PP1 + moveIndex, NULL) + data;
-// SetMonData(pkmn, MON_DATA_PP1 + moveIndex, &data);
-// */
-// retVal = FALSE;
-// }
-// break;
-// case 5:
-// if (GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) < 100 && retVal == 0 && sp2C == 0)
-// {
-// sp2C = itemEffect[sp24];
-// /*
-// friendship = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL);
-// if (sp2C > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP)
-// friendship += 150 * sp2C / 100;
-// else
-// friendship += sp2C;
-// if (sp2C > 0)
-// {
-// if (GetMonData(pkmn, MON_DATA_POKEBALL, NULL) == 11)
-// friendship++;
-// if (GetMonData(pkmn, MON_DATA_MET_LOCATION, NULL) == sav1_map_get_name())
-// friendship++;
-// }
-// if (friendship < 0)
-// friendship = 0;
-// if (friendship > 255)
-// friendship = 255;
-// SetMonData(pkmn, MON_DATA_FRIENDSHIP, &friendship);
-// */
-// }
-// sp24++;
-// break;
-// case 6:
-// if (GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) >= 100 && GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) < 200
-// && retVal == 0 && sp2C == 0)
-// {
-// sp2C = itemEffect[sp24];
-// /*
-// friendship = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL);
-// if (sp2C > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP)
-// friendship += 150 * sp2C / 100;
-// else
-// friendship += sp2C;
-// if (sp2C > 0)
-// {
-// if (GetMonData(pkmn, MON_DATA_POKEBALL, NULL) == 11)
-// friendship++;
-// if (GetMonData(pkmn, MON_DATA_MET_LOCATION, NULL) == sav1_map_get_name())
-// friendship++;
-// }
-// if (friendship < 0)
-// friendship = 0;
-// if (friendship > 255)
-// friendship = 255;
-// SetMonData(pkmn, MON_DATA_FRIENDSHIP, &friendship);
-// */
-// }
-// sp24++;
-// break;
-// case 7:
-// if (GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) >= 200 && retVal == 0 && sp2C == 0)
-// {
-// sp2C = itemEffect[sp24];
-// /*
-// friendship = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL);
-// if (sp2C > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP)
-// friendship += 150 * sp2C / 100;
-// else
-// friendship += sp2C;
-// if (sp2C > 0)
-// {
-// if (GetMonData(pkmn, MON_DATA_POKEBALL, NULL) == 11)
-// friendship++;
-// if (GetMonData(pkmn, MON_DATA_MET_LOCATION, NULL) == sav1_map_get_name())
-// friendship++;
-// }
-// if (friendship < 0)
-// friendship = 0;
-// if (friendship > 255)
-// friendship = 255;
-// SetMonData(pkmn, MON_DATA_FRIENDSHIP, &friendship);
-// */
-// }
-// sp24++;
-// break;
-// }
-// }
-// sp28++;
-// r10 >>= 1;
-// }
-// break;
-// }
-// }
-// return retVal;
-//}
-
+#ifdef NONMATCHING
/*
+ * This is nonmatching due to the compiler's insistence on avoiding the u8 cast
+ * when loading gMain.inBattle. If it weren't for this absent cast, differing
+ * the function would be a lot easier.
+ */
+bool8 PokemonUseItemEffects2(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 moveIndex, u8 e)
+{ // BEGIN
+ u32 data;
+ s32 cmdIndex;
+ bool8 retVal = TRUE;
+ const u8 *itemEffect;
+ u8 sp24 = 6;
+ u32 sp28;
+ s8 sp2C = 0;
+ u8 sp34 = 4;
+ u16 heldItem;
+ u8 r10;
+ s32 r4;
+
+ heldItem = GetMonData(pkmn, MON_DATA_HELD_ITEM, NULL);
+ if (heldItem == ITEM_ENIGMA_BERRY)
+ {
+ if (gMain.inBattle)
+ /*holdEffect = */gEnigmaBerries[gBattlerInMenuId].holdEffect;
+ else
+ /*holdEffect = */gSaveBlock1Ptr->enigmaBerry.holdEffect;
+ }
+ else
+ {
+ /*holdEffect = */ItemId_GetHoldEffect(heldItem);
+ }
+
+ gPotentialItemEffectBattler = gBattlerInMenuId;
+
+ // grr. the original asm also u8 masks after loading the bitmask, despite
+ // the fact that is a useless operation. what's going on here? Something
+ // dumb I bet like dead code.
+ if (gMain.inBattle)
+ {
+ gActiveBattler = gBattlerInMenuId;
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
+ cmdIndex = 0;
+ else
+ cmdIndex = 1;
+ while (cmdIndex < gBattlersCount)
+ {
+ if (gBattlerPartyIndexes[cmdIndex] == partyIndex)
+ {
+ sp34 = cmdIndex;
+ break;
+ }
+ cmdIndex += 2;
+ }
+ }
+ else
+ {
+ gActiveBattler = 0;
+ sp34 = 4;
+ }
+
+ // _08042504
+ if (!IS_POKEMON_ITEM(item))
+ return TRUE;
+ if (gItemEffectTable[item - 13] == NULL && item != ITEM_ENIGMA_BERRY)
+ return TRUE;
+
+ if (item == ITEM_ENIGMA_BERRY)
+ {
+ if (gMain.inBattle)
+ itemEffect = gEnigmaBerries[gActiveBattler].itemEffect;
+ else
+ itemEffect = gSaveBlock1Ptr->enigmaBerry.itemEffect;
+ }
+ else
+ {
+ itemEffect = gItemEffectTable[item - 13];
+ }
+
+ for (cmdIndex = 0; cmdIndex < 6; cmdIndex++)
+ {
+ switch (cmdIndex)
+ {
+ // status healing effects
+ case 0:
+ if ((itemEffect[cmdIndex] & 0x80)
+ && gMain.inBattle && sp34 != 4 && (gBattleMons[sp34].status2 & STATUS2_INFATUATION))
+ {
+ //gBattleMons[sp34].status2 &= ~STATUS2_INFATUATION;
+ retVal = FALSE;
+ }
+ if ((itemEffect[cmdIndex] & 0x30)
+ && !(gBattleMons[gActiveBattler].status2 & STATUS2_FOCUS_ENERGY))
+ {
+ //gBattleMons[gActiveBattler].status2 |= STATUS2_FOCUS_ENERGY;
+ retVal = FALSE;
+ }
+ if ((itemEffect[cmdIndex] & 0xF)
+ && gBattleMons[gActiveBattler].statStages[STAT_STAGE_ATK] < 12)
+ {
+ //gBattleMons[gActiveBattler].statStages[STAT_STAGE_ATK] += itemEffect[cmdIndex] & 0xF;
+ //if (gBattleMons[gActiveBattler].statStages[STAT_STAGE_ATK] > 12)
+ // gBattleMons[gActiveBattler].statStages[STAT_STAGE_ATK] = 12;
+ retVal = FALSE;
+ }
+ break;
+ // in-battle stat boosting effects?
+ case 1:
+ if ((itemEffect[cmdIndex] & 0xF0)
+ && gBattleMons[gActiveBattler].statStages[STAT_STAGE_DEF] < 12)
+ {
+ //gBattleMons[gActiveBattler].statStages[STAT_STAGE_DEF] += (itemEffect[cmdIndex] & 0xF0) >> 4;
+ //if (gBattleMons[gActiveBattler].statStages[STAT_STAGE_DEF] > 12)
+ // gBattleMons[gActiveBattler].statStages[STAT_STAGE_DEF] = 12;
+ retVal = FALSE;
+ }
+ if ((itemEffect[cmdIndex] & 0xF)
+ && gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPEED] < 12)
+ {
+ //gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPEED] += itemEffect[cmdIndex] & 0xF;
+ //if (gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPEED] > 12)
+ // gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPEED] = 12;
+ retVal = FALSE;
+ }
+ break;
+ // more stat boosting effects?
+ case 2:
+ if ((itemEffect[cmdIndex] & 0xF0)
+ && gBattleMons[gActiveBattler].statStages[STAT_STAGE_ACC] < 12)
+ {
+ //gBattleMons[gActiveBattler].statStages[STAT_STAGE_ACC] += (itemEffect[cmdIndex] & 0xF0) >> 4;
+ //if (gBattleMons[gActiveBattler].statStages[STAT_STAGE_ACC] > 12)
+ // gBattleMons[gActiveBattler].statStages[STAT_STAGE_ACC] = 12;
+ retVal = FALSE;
+ }
+ if ((itemEffect[cmdIndex] & 0xF)
+ && gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPATK] < 12)
+ {
+ //gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPATK] += itemEffect[cmdIndex] & 0xF;
+ //if (gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPATK] > 12)
+ // gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPATK] = 12;
+ retVal = FALSE;
+ }
+ break;
+ case 3:
+ if ((itemEffect[cmdIndex] & 0x80)
+ && gSideTimers[GetBattlerSide(gActiveBattler)].mistTimer == 0)
+ {
+ //gSideTimers[GetBattlerSide(gActiveBattler)].mistTimer = 5;
+ retVal = FALSE;
+ }
+ if ((itemEffect[cmdIndex] & 0x40) // raise level
+ && GetMonData(pkmn, MON_DATA_LEVEL, NULL) != 100)
+ {
+ //data = gExperienceTables[gBaseStats[GetMonData(pkmn, MON_DATA_SPECIES, NULL)].growthRate][GetMonData(pkmn, MON_DATA_LEVEL, NULL) + 1];
+ //SetMonData(pkmn, MON_DATA_EXP, &data);
+ //CalculateMonStats(pkmn);
+ retVal = FALSE;
+ }
+ if ((itemEffect[cmdIndex] & 0x20)
+ && sub_8042BE8(pkmn, partyIndex, 7, sp34) == 0)
+ {
+ //if (sp34 != 4)
+ // gBattleMons[sp34].status2 &= ~STATUS2_NIGHTMARE;
+ retVal = FALSE;
+ }
+ if ((itemEffect[cmdIndex] & 0x10) && sub_8042BE8(pkmn, partyIndex, 0xF88, sp34) == 0)
+ retVal = FALSE;
+ if ((itemEffect[cmdIndex] & 8) && sub_8042BE8(pkmn, partyIndex, 16, sp34) == 0)
+ retVal = FALSE;
+ if ((itemEffect[cmdIndex] & 4) && sub_8042BE8(pkmn, partyIndex, 32, sp34) == 0)
+ retVal = FALSE;
+ if ((itemEffect[cmdIndex] & 2) && sub_8042BE8(pkmn, partyIndex, 64, sp34) == 0)
+ retVal = FALSE;
+ if ((itemEffect[cmdIndex] & 1) // heal confusion
+ && gMain.inBattle && sp34 != 4 && (gBattleMons[sp34].status2 & STATUS2_CONFUSION))
+ {
+ //gBattleMons[sp34].status2 &= ~STATUS2_CONFUSION;
+ retVal = FALSE;
+ }
+ break;
+ // EV, HP, and PP raising effects
+ case 4:
+ r10 = itemEffect[cmdIndex];
+ if (r10 & 0x20)
+ {
+ r10 &= ~0x20;
+ data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_825DEA1[moveIndex]) >> (moveIndex * 2);
+ sp28 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex);
+ if (data < 3 && sp28 > 4)
+ {
+ //data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) + gUnknown_825DEA9[moveIndex];
+ //SetMonData(pkmn, MON_DATA_PP_BONUSES, &data);
+ //
+ //data = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - sp28;
+ //data = GetMonData(pkmn, MON_DATA_PP1 + moveIndex, NULL) + data;
+ //SetMonData(pkmn, MON_DATA_PP1 + moveIndex, &data);
+ retVal = FALSE;
+ }
+ }
+ sp28 = 0;
+ while (r10 != 0) // _080428C0
+ {
+ if (r10 & 1)
+ {
+ u16 evCount;
+ u16 targetSpecies;
+ s32 r5;
+
+ switch (sp28)
+ {
+ case 0:
+ case 1:
+ evCount = GetMonEVCount(pkmn);
+ if (evCount >= 510)
+ return TRUE;
+ data = GetMonData(pkmn, sGetMonDataEVConstants[sp28], NULL);
+ if (data < 100)
+ {
+ //if (data + itemEffect[sp24] > 100)
+ // r4 = 100 - (data + itemEffect[sp24]) + itemEffect[sp24];
+ //else
+ // r4 = itemEffect[sp24];
+ //if (evCount + r4 > 510)
+ // r4 += 510 - (evCount + r4);
+ //data += r4;
+ //SetMonData(pkmn, sGetMonDataEVConstants[sp28], &data);
+ //CalculateMonStats(pkmn);
+ sp24++;
+ retVal = FALSE;
+ }
+ break;
+ case 2:
+ // revive?
+ if (r10 & 0x10)
+ {
+ if (GetMonData(pkmn, MON_DATA_HP, NULL) != 0)
+ {
+ sp24++;
+ break;
+ }
+ /*
+ if (gMain.inBattle)
+ {
+ if (sp34 != 4)
+ {
+ gAbsentBattlerFlags &= ~gBitTable[sp34];
+ CopyPlayerPartyMonToBattleData(sp34, pokemon_order_func(gBattlerPartyIndexes[sp34]));
+ if (GetBattlerSide(gActiveBattler) == 0 && gBattleResults.unk4 < 255)
+ gBattleResults.unk4++;
+ }
+ else
+ {
+ gAbsentBattlerFlags &= ~gBitTable[gActiveBattler ^ 2];
+ if (GetBattlerSide(gActiveBattler) == 0 && gBattleResults.unk4 < 255)
+ gBattleResults.unk4++;
+ }
+ }
+ */
+ }
+ else
+ {
+ if (GetMonData(pkmn, MON_DATA_HP, NULL) == 0)
+ {
+ sp24++;
+ break;
+ }
+ }
+ /*
+ data = itemEffect[sp24++];
+ switch (data)
+ {
+ case 0xFF:
+ data = GetMonData(pkmn, MON_DATA_MAX_HP, NULL) - GetMonData(pkmn, MON_DATA_HP, NULL);
+ break;
+ case 0xFE:
+ data = GetMonData(pkmn, MON_DATA_MAX_HP, NULL) / 2;
+ if (data == 0)
+ data = 1;
+ break;
+ case 0xFD:
+ data = gBattleScripting.field_23;
+ break;
+ }
+ */
+ if (GetMonData(pkmn, MON_DATA_MAX_HP, NULL) != GetMonData(pkmn, MON_DATA_HP, NULL))
+ {
+ /*
+ if (e == 0)
+ {
+ data = GetMonData(pkmn, MON_DATA_HP, NULL) + data;
+ if (data > GetMonData(pkmn, MON_DATA_MAX_HP, NULL))
+ data = GetMonData(pkmn, MON_DATA_MAX_HP, NULL);
+ SetMonData(pkmn, MON_DATA_HP, &data);
+ if (gMain.inBattle && sp34 != 4)
+ {
+ gBattleMons[sp34].hp = data;
+ if (!(r10 & 0x10) && GetBattlerSide(gActiveBattler) == 0)
+ {
+ if (gBattleResults.unk3 < 255)
+ gBattleResults.unk3++;
+ // I have to re-use this variable to match.
+ r5 = gActiveBattler;
+ gActiveBattler = sp34;
+ BtlController_EmitGetMonData(0, 0, 0);
+ MarkBufferBankForExecution(gActiveBattler);
+ gActiveBattler = r5;
+ }
+ }
+ }
+ else
+ {
+ gBattleMoveDamage = -data;
+ }
+ */
+ retVal = FALSE;
+ }
+ sp24++;
+ r10 &= 0xEF;
+ break;
+ case 3:
+ if (!(r10 & 2))
+ {
+ for (r5 = 0; r5 < 4; r5++)
+ {
+ data = GetMonData(pkmn, MON_DATA_PP1 + r5, NULL);
+ r4 = GetMonData(pkmn, MON_DATA_MOVE1 + r5, NULL);
+ if (data != CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), r5))
+ {
+ /*
+ data += itemEffect[sp24];
+ r4 = GetMonData(pkmn, MON_DATA_MOVE1 + r5, NULL);
+ if (data > CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), r5))
+ {
+ r4 = GetMonData(pkmn, MON_DATA_MOVE1 + r5, NULL);
+ data = CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), r5);
+ }
+ SetMonData(pkmn, MON_DATA_PP1 + r5, &data);
+ if (gMain.inBattle
+ && sp34 != 4 && !(gBattleMons[sp34].status2 & 0x200000)
+ && !(gDisableStructs[sp34].unk18_b & gBitTable[r5]))
+ gBattleMons[sp34].pp[r5] = data;
+ */
+ retVal = FALSE;
+ }
+ }
+ }
+ else // _080429FA
+ {
+ data = GetMonData(pkmn, MON_DATA_PP1 + moveIndex, NULL);
+ r4 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL);
+ if (data != CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex))
+ {
+ /*
+ data += itemEffect[sp24++];
+ r4 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL);
+ if (data > CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex))
+ {
+ r4 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL);
+ data = CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex);
+ }
+ SetMonData(pkmn, MON_DATA_PP1 + moveIndex, &data);
+ if (gMain.inBattle
+ && sp34 != 4 && !(gBattleMons[sp34].status2 & 0x200000)
+ && !(gDisableStructs[sp34].unk18_b & gBitTable[moveIndex]))
+ gBattleMons[sp34].pp[moveIndex] = data;
+ */
+ sp24++;
+ retVal = FALSE;
+ }
+ }
+ break;
+ case 7:
+ {
+ targetSpecies = GetEvolutionTargetSpecies(pkmn, 2, item);
+
+ if (targetSpecies != SPECIES_NONE)
+ {
+ //BeginEvolutionScene(pkmn, targetSpecies, 0, partyIndex);
+ return FALSE;
+ }
+ }
+ break;
+ }
+ }
+ sp28++;
+ r10 >>= 1;
+ }
+ break;
+ case 5:
+ r10 = itemEffect[cmdIndex];
+ sp28 = 0;
+ while (r10 != 0)
+ {
+ if (r10 & 1)
+ {
+ u16 evCount;
+
+ switch (sp28)
+ {
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ evCount = GetMonEVCount(pkmn);
+ if (evCount >= 510)
+ return TRUE;
+ data = GetMonData(pkmn, sGetMonDataEVConstants[sp28 + 2], NULL);
+ if (data < 100)
+ {
+ /*
+ if (data + itemEffect[sp24] > 100)
+ r4 = 100 - (data + itemEffect[sp24]) + itemEffect[sp24];
+ else
+ r4 = itemEffect[sp24];
+ if (evCount + r4 > 510)
+ r4 += 510 - (evCount + r4);
+ data += r4;
+ SetMonData(pkmn, sGetMonDataEVConstants[sp28 + 2], &data);
+ CalculateMonStats(pkmn);
+ */
+ retVal = FALSE;
+ sp24++;
+ }
+ break;
+ case 4:
+ data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_825DEA1[moveIndex]) >> (moveIndex * 2);
+ r4 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex);
+ if (data < 3)
+ {
+ if(r4 <= 4)
+ break;
+ /*
+
+ data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL);
+ data &= gPPUpWriteMasks[moveIndex];
+ data += gUnknown_825DEA9[moveIndex] * 3;
-*/
+ SetMonData(pkmn, MON_DATA_PP_BONUSES, &data);
+ data = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - r4;
+ data = GetMonData(pkmn, MON_DATA_PP1 + moveIndex, NULL) + data;
+ SetMonData(pkmn, MON_DATA_PP1 + moveIndex, &data);
+ */
+ retVal = FALSE;
+ }
+ break;
+ case 5:
+ if (GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) < 100 && retVal == 0 && sp2C == 0)
+ {
+ sp2C = itemEffect[sp24];
+ /*
+ friendship = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL);
+ if (sp2C > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP)
+ friendship += 150 * sp2C / 100;
+ else
+ friendship += sp2C;
+ if (sp2C > 0)
+ {
+ if (GetMonData(pkmn, MON_DATA_POKEBALL, NULL) == 11)
+ friendship++;
+ if (GetMonData(pkmn, MON_DATA_MET_LOCATION, NULL) == sav1_map_get_name())
+ friendship++;
+ }
+ if (friendship < 0)
+ friendship = 0;
+ if (friendship > 255)
+ friendship = 255;
+ SetMonData(pkmn, MON_DATA_FRIENDSHIP, &friendship);
+ */
+ }
+ sp24++;
+ break;
+ case 6:
+ if (GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) >= 100 && GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) < 200
+ && retVal == 0 && sp2C == 0)
+ {
+ sp2C = itemEffect[sp24];
+ /*
+ friendship = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL);
+ if (sp2C > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP)
+ friendship += 150 * sp2C / 100;
+ else
+ friendship += sp2C;
+ if (sp2C > 0)
+ {
+ if (GetMonData(pkmn, MON_DATA_POKEBALL, NULL) == 11)
+ friendship++;
+ if (GetMonData(pkmn, MON_DATA_MET_LOCATION, NULL) == sav1_map_get_name())
+ friendship++;
+ }
+ if (friendship < 0)
+ friendship = 0;
+ if (friendship > 255)
+ friendship = 255;
+ SetMonData(pkmn, MON_DATA_FRIENDSHIP, &friendship);
+ */
+ }
+ sp24++;
+ break;
+ case 7:
+ if (GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) >= 200 && retVal == 0 && sp2C == 0)
+ {
+ sp2C = itemEffect[sp24];
+ /*
+ friendship = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL);
+ if (sp2C > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP)
+ friendship += 150 * sp2C / 100;
+ else
+ friendship += sp2C;
+ if (sp2C > 0)
+ {
+ if (GetMonData(pkmn, MON_DATA_POKEBALL, NULL) == 11)
+ friendship++;
+ if (GetMonData(pkmn, MON_DATA_MET_LOCATION, NULL) == sav1_map_get_name())
+ friendship++;
+ }
+ if (friendship < 0)
+ friendship = 0;
+ if (friendship > 255)
+ friendship = 255;
+ SetMonData(pkmn, MON_DATA_FRIENDSHIP, &friendship);
+ */
+ }
+ sp24++;
+ break;
+ }
+ }
+ sp28++;
+ r10 >>= 1;
+ }
+ break;
+ }
+ }
+ return retVal;
+}
+#else
+__attribute__((naked))
+bool8 PokemonUseItemEffects2(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 moveIndex, u8 e)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ sub sp, 0x20\n\
+ mov r8, r0\n\
+ lsls r1, 16\n\
+ lsrs r1, 16\n\
+ str r1, [sp]\n\
+ lsls r2, 24\n\
+ lsrs r2, 24\n\
+ str r2, [sp, 0x4]\n\
+ lsls r3, 24\n\
+ lsrs r3, 24\n\
+ str r3, [sp, 0x8]\n\
+ movs r0, 0x1\n\
+ str r0, [sp, 0x10]\n\
+ movs r1, 0x6\n\
+ mov r10, r1\n\
+ movs r2, 0\n\
+ str r2, [sp, 0x18]\n\
+ movs r0, 0x4\n\
+ str r0, [sp, 0x1C]\n\
+ mov r0, r8\n\
+ movs r1, 0xC\n\
+ bl GetMonData\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ cmp r0, 0xAF\n\
+ beq _08042458\n\
+ bl ItemId_GetHoldEffect\n\
+_08042458:\n\
+ ldr r1, _080424B0 @ =gPotentialItemEffectBattler\n\
+ ldr r0, _080424B4 @ =gBattlerInMenuId\n\
+ ldrb r2, [r0]\n\
+ strb r2, [r1]\n\
+ ldr r0, _080424B8 @ =gMain\n\
+ ldr r1, _080424BC @ =0x00000439\n\
+ adds r0, r1\n\
+ ldrb r1, [r0]\n\
+ movs r0, 0x2\n\
+ ands r0, r1\n\
+ lsls r0, 24\n\
+ lsrs r1, r0, 24\n\
+ cmp r1, 0\n\
+ beq _080424F8\n\
+ ldr r0, _080424C0 @ =gActiveBattler\n\
+ strb r2, [r0]\n\
+ ldrb r0, [r0]\n\
+ bl GetBattlerSide\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ negs r1, r0\n\
+ orrs r1, r0\n\
+ lsrs r1, 31\n\
+ str r1, [sp, 0xC]\n\
+ ldr r0, _080424C4 @ =gBattlersCount\n\
+ ldr r4, [sp]\n\
+ subs r4, 0xD\n\
+ ldrb r0, [r0]\n\
+ cmp r1, r0\n\
+ bge _08042504\n\
+ ldr r2, _080424C8 @ =gBattlerPartyIndexes\n\
+ lsls r0, r1, 1\n\
+ adds r0, r2\n\
+ ldrh r3, [r0]\n\
+ ldr r1, [sp, 0x4]\n\
+ lsls r0, r1, 16\n\
+ lsrs r1, r0, 16\n\
+ adds r5, r0, 0\n\
+ cmp r3, r1\n\
+ bne _080424CC\n\
+ ldr r2, [sp, 0xC]\n\
+ str r2, [sp, 0x1C]\n\
+ b _08042504\n\
+ .align 2, 0\n\
+_080424B0: .4byte gPotentialItemEffectBattler\n\
+_080424B4: .4byte gBattlerInMenuId\n\
+_080424B8: .4byte gMain\n\
+_080424BC: .4byte 0x00000439\n\
+_080424C0: .4byte gActiveBattler\n\
+_080424C4: .4byte gBattlersCount\n\
+_080424C8: .4byte gBattlerPartyIndexes\n\
+_080424CC:\n\
+ ldr r0, [sp, 0xC]\n\
+ adds r0, 0x2\n\
+ str r0, [sp, 0xC]\n\
+ ldr r0, _080424F4 @ =gBattlersCount\n\
+ ldr r1, [sp, 0xC]\n\
+ ldrb r0, [r0]\n\
+ cmp r1, r0\n\
+ bge _08042504\n\
+ lsls r0, r1, 1\n\
+ adds r0, r2\n\
+ ldrh r1, [r0]\n\
+ lsrs r0, r5, 16\n\
+ cmp r1, r0\n\
+ bne _080424CC\n\
+ ldr r2, [sp, 0xC]\n\
+ lsls r0, r2, 24\n\
+ lsrs r0, 24\n\
+ str r0, [sp, 0x1C]\n\
+ b _08042504\n\
+ .align 2, 0\n\
+_080424F4: .4byte gBattlersCount\n\
+_080424F8:\n\
+ ldr r0, _08042520 @ =gActiveBattler\n\
+ strb r1, [r0]\n\
+ movs r0, 0x4\n\
+ str r0, [sp, 0x1C]\n\
+ ldr r4, [sp]\n\
+ subs r4, 0xD\n\
+_08042504:\n\
+ lsls r0, r4, 16\n\
+ lsrs r0, 16\n\
+ cmp r0, 0xA5\n\
+ bhi _08042578\n\
+ ldr r1, _08042524 @ =gItemEffectTable\n\
+ lsls r0, r4, 2\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _08042528\n\
+ ldr r1, [sp]\n\
+ cmp r1, 0xAF\n\
+ beq _0804252E\n\
+ b _08042578\n\
+ .align 2, 0\n\
+_08042520: .4byte gActiveBattler\n\
+_08042524: .4byte gItemEffectTable\n\
+_08042528:\n\
+ ldr r2, [sp]\n\
+ cmp r2, 0xAF\n\
+ bne _0804257C\n\
+_0804252E:\n\
+ ldr r0, _08042550 @ =gMain\n\
+ ldr r1, _08042554 @ =0x00000439\n\
+ adds r0, r1\n\
+ ldrb r1, [r0]\n\
+ movs r0, 0x2\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08042560\n\
+ ldr r0, _08042558 @ =gActiveBattler\n\
+ ldrb r1, [r0]\n\
+ lsls r0, r1, 3\n\
+ subs r0, r1\n\
+ lsls r0, 2\n\
+ ldr r1, _0804255C @ =gEnigmaBerries+0x8\n\
+ adds r0, r1\n\
+ b _0804257C\n\
+ .align 2, 0\n\
+_08042550: .4byte gMain\n\
+_08042554: .4byte 0x00000439\n\
+_08042558: .4byte gActiveBattler\n\
+_0804255C: .4byte gEnigmaBerries+0x8\n\
+_08042560:\n\
+ ldr r0, _0804256C @ =gSaveBlock1Ptr\n\
+ ldr r0, [r0]\n\
+ ldr r2, _08042570 @ =0x00003108\n\
+ adds r2, r0, r2\n\
+ str r2, [sp, 0x14]\n\
+ b _0804257E\n\
+ .align 2, 0\n\
+_0804256C: .4byte gSaveBlock1Ptr\n\
+_08042570: .4byte 0x00003108\n\
+_08042574:\n\
+ movs r0, 0\n\
+ b _08042BD8\n\
+_08042578:\n\
+ movs r0, 0x1\n\
+ b _08042BD8\n\
+_0804257C:\n\
+ str r0, [sp, 0x14]\n\
+_0804257E:\n\
+ movs r0, 0\n\
+ str r0, [sp, 0xC]\n\
+_08042582:\n\
+ ldr r1, [sp, 0xC]\n\
+ cmp r1, 0x5\n\
+ bls _0804258A\n\
+ b _08042BCA\n\
+_0804258A:\n\
+ lsls r0, r1, 2\n\
+ ldr r1, _08042594 @ =_08042598\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+ .align 2, 0\n\
+_08042594: .4byte _08042598\n\
+ .align 2, 0\n\
+_08042598:\n\
+ .4byte _080425B0\n\
+ .4byte _0804264C\n\
+ .4byte _080426A8\n\
+ .4byte _08042708\n\
+ .4byte _08042850\n\
+ .4byte _08042A6A\n\
+_080425B0:\n\
+ ldr r0, [sp, 0x14]\n\
+ ldr r1, [sp, 0xC]\n\
+ adds r2, r0, r1\n\
+ ldrb r1, [r2]\n\
+ movs r0, 0x80\n\
+ ands r0, r1\n\
+ adds r5, r2, 0\n\
+ cmp r0, 0\n\
+ beq _080425F4\n\
+ ldr r0, _0804263C @ =gMain\n\
+ ldr r2, _08042640 @ =0x00000439\n\
+ adds r0, r2\n\
+ ldrb r1, [r0]\n\
+ movs r0, 0x2\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080425F4\n\
+ ldr r0, [sp, 0x1C]\n\
+ cmp r0, 0x4\n\
+ beq _080425F4\n\
+ ldr r1, _08042644 @ =gBattleMons\n\
+ movs r0, 0x58\n\
+ ldr r2, [sp, 0x1C]\n\
+ muls r0, r2\n\
+ adds r1, 0x50\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ movs r1, 0xF0\n\
+ lsls r1, 12\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080425F4\n\
+ movs r0, 0\n\
+ str r0, [sp, 0x10]\n\
+_080425F4:\n\
+ ldrb r1, [r5]\n\
+ movs r0, 0x30\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0804261C\n\
+ ldr r1, _08042644 @ =gBattleMons\n\
+ ldr r0, _08042648 @ =gActiveBattler\n\
+ ldrb r2, [r0]\n\
+ movs r0, 0x58\n\
+ muls r0, r2\n\
+ adds r1, 0x50\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ movs r1, 0x80\n\
+ lsls r1, 13\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _0804261C\n\
+ movs r1, 0\n\
+ str r1, [sp, 0x10]\n\
+_0804261C:\n\
+ ldrb r1, [r5]\n\
+ movs r0, 0xF\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _08042628\n\
+ b _08042BCA\n\
+_08042628:\n\
+ ldr r2, _08042644 @ =gBattleMons\n\
+ ldr r0, _08042648 @ =gActiveBattler\n\
+ ldrb r1, [r0]\n\
+ movs r0, 0x58\n\
+ muls r0, r1\n\
+ adds r0, r2\n\
+ ldrb r0, [r0, 0x19]\n\
+ lsls r0, 24\n\
+ asrs r0, 24\n\
+ b _080426F2\n\
+ .align 2, 0\n\
+_0804263C: .4byte gMain\n\
+_08042640: .4byte 0x00000439\n\
+_08042644: .4byte gBattleMons\n\
+_08042648: .4byte gActiveBattler\n\
+_0804264C:\n\
+ ldr r0, [sp, 0x14]\n\
+ ldr r1, [sp, 0xC]\n\
+ adds r2, r0, r1\n\
+ ldrb r1, [r2]\n\
+ movs r0, 0xF0\n\
+ ands r0, r1\n\
+ adds r5, r2, 0\n\
+ cmp r0, 0\n\
+ beq _08042678\n\
+ ldr r2, _080426A0 @ =gBattleMons\n\
+ ldr r0, _080426A4 @ =gActiveBattler\n\
+ ldrb r1, [r0]\n\
+ movs r0, 0x58\n\
+ muls r0, r1\n\
+ adds r0, r2\n\
+ ldrb r0, [r0, 0x1A]\n\
+ lsls r0, 24\n\
+ asrs r0, 24\n\
+ cmp r0, 0xB\n\
+ bgt _08042678\n\
+ movs r2, 0\n\
+ str r2, [sp, 0x10]\n\
+_08042678:\n\
+ ldrb r1, [r5]\n\
+ movs r0, 0xF\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _08042684\n\
+ b _08042BCA\n\
+_08042684:\n\
+ ldr r2, _080426A0 @ =gBattleMons\n\
+ ldr r0, _080426A4 @ =gActiveBattler\n\
+ ldrb r1, [r0]\n\
+ movs r0, 0x58\n\
+ muls r0, r1\n\
+ adds r0, r2\n\
+ ldrb r0, [r0, 0x1B]\n\
+ lsls r0, 24\n\
+ asrs r0, 24\n\
+ cmp r0, 0xB\n\
+ ble _0804269C\n\
+ b _08042BCA\n\
+_0804269C:\n\
+ b _08042832\n\
+ .align 2, 0\n\
+_080426A0: .4byte gBattleMons\n\
+_080426A4: .4byte gActiveBattler\n\
+_080426A8:\n\
+ ldr r1, [sp, 0x14]\n\
+ ldr r0, [sp, 0xC]\n\
+ adds r2, r1, r0\n\
+ ldrb r1, [r2]\n\
+ movs r0, 0xF0\n\
+ ands r0, r1\n\
+ adds r5, r2, 0\n\
+ cmp r0, 0\n\
+ beq _080426D4\n\
+ ldr r2, _08042700 @ =gBattleMons\n\
+ ldr r0, _08042704 @ =gActiveBattler\n\
+ ldrb r1, [r0]\n\
+ movs r0, 0x58\n\
+ muls r0, r1\n\
+ adds r0, r2\n\
+ ldrb r0, [r0, 0x1E]\n\
+ lsls r0, 24\n\
+ asrs r0, 24\n\
+ cmp r0, 0xB\n\
+ bgt _080426D4\n\
+ movs r1, 0\n\
+ str r1, [sp, 0x10]\n\
+_080426D4:\n\
+ ldrb r1, [r5]\n\
+ movs r0, 0xF\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _080426E0\n\
+ b _08042BCA\n\
+_080426E0:\n\
+ ldr r2, _08042700 @ =gBattleMons\n\
+ ldr r0, _08042704 @ =gActiveBattler\n\
+ ldrb r1, [r0]\n\
+ movs r0, 0x58\n\
+ muls r0, r1\n\
+ adds r0, r2\n\
+ ldrb r0, [r0, 0x1C]\n\
+ lsls r0, 24\n\
+ asrs r0, 24\n\
+_080426F2:\n\
+ cmp r0, 0xB\n\
+ ble _080426F8\n\
+ b _08042BCA\n\
+_080426F8:\n\
+ movs r2, 0\n\
+ str r2, [sp, 0x10]\n\
+ b _08042BCA\n\
+ .align 2, 0\n\
+_08042700: .4byte gBattleMons\n\
+_08042704: .4byte gActiveBattler\n\
+_08042708:\n\
+ ldr r0, [sp, 0x14]\n\
+ ldr r1, [sp, 0xC]\n\
+ adds r2, r0, r1\n\
+ ldrb r1, [r2]\n\
+ movs r0, 0x80\n\
+ ands r0, r1\n\
+ adds r5, r2, 0\n\
+ cmp r0, 0\n\
+ beq _0804273A\n\
+ ldr r4, _08042838 @ =gSideTimers\n\
+ ldr r0, _0804283C @ =gActiveBattler\n\
+ ldrb r0, [r0]\n\
+ bl GetBattlerSide\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ lsls r1, r0, 1\n\
+ adds r1, r0\n\
+ lsls r1, 2\n\
+ adds r1, r4\n\
+ ldrb r0, [r1, 0x4]\n\
+ cmp r0, 0\n\
+ bne _0804273A\n\
+ movs r2, 0\n\
+ str r2, [sp, 0x10]\n\
+_0804273A:\n\
+ ldrb r1, [r5]\n\
+ movs r0, 0x40\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08042756\n\
+ mov r0, r8\n\
+ movs r1, 0x38\n\
+ movs r2, 0\n\
+ bl GetMonData\n\
+ cmp r0, 0x64\n\
+ beq _08042756\n\
+ movs r0, 0\n\
+ str r0, [sp, 0x10]\n\
+_08042756:\n\
+ ldrb r1, [r5]\n\
+ movs r0, 0x20\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08042776\n\
+ mov r0, r8\n\
+ ldr r1, [sp, 0x4]\n\
+ movs r2, 0x7\n\
+ ldr r3, [sp, 0x1C]\n\
+ bl sub_8042BE8\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _08042776\n\
+ movs r1, 0\n\
+ str r1, [sp, 0x10]\n\
+_08042776:\n\
+ ldrb r1, [r5]\n\
+ movs r0, 0x10\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08042796\n\
+ ldr r2, _08042840 @ =0x00000f88\n\
+ mov r0, r8\n\
+ ldr r1, [sp, 0x4]\n\
+ ldr r3, [sp, 0x1C]\n\
+ bl sub_8042BE8\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _08042796\n\
+ movs r2, 0\n\
+ str r2, [sp, 0x10]\n\
+_08042796:\n\
+ ldrb r1, [r5]\n\
+ movs r0, 0x8\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080427B6\n\
+ mov r0, r8\n\
+ ldr r1, [sp, 0x4]\n\
+ movs r2, 0x10\n\
+ ldr r3, [sp, 0x1C]\n\
+ bl sub_8042BE8\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _080427B6\n\
+ movs r0, 0\n\
+ str r0, [sp, 0x10]\n\
+_080427B6:\n\
+ ldrb r1, [r5]\n\
+ movs r0, 0x4\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080427D6\n\
+ mov r0, r8\n\
+ ldr r1, [sp, 0x4]\n\
+ movs r2, 0x20\n\
+ ldr r3, [sp, 0x1C]\n\
+ bl sub_8042BE8\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _080427D6\n\
+ movs r1, 0\n\
+ str r1, [sp, 0x10]\n\
+_080427D6:\n\
+ ldrb r1, [r5]\n\
+ movs r0, 0x2\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080427F6\n\
+ mov r0, r8\n\
+ ldr r1, [sp, 0x4]\n\
+ movs r2, 0x40\n\
+ ldr r3, [sp, 0x1C]\n\
+ bl sub_8042BE8\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _080427F6\n\
+ movs r2, 0\n\
+ str r2, [sp, 0x10]\n\
+_080427F6:\n\
+ ldrb r1, [r5]\n\
+ movs r0, 0x1\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _08042802\n\
+ b _08042BCA\n\
+_08042802:\n\
+ ldr r0, _08042844 @ =gMain\n\
+ ldr r1, _08042848 @ =0x00000439\n\
+ adds r0, r1\n\
+ ldrb r1, [r0]\n\
+ movs r0, 0x2\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _08042814\n\
+ b _08042BCA\n\
+_08042814:\n\
+ ldr r2, [sp, 0x1C]\n\
+ cmp r2, 0x4\n\
+ bne _0804281C\n\
+ b _08042BCA\n\
+_0804281C:\n\
+ ldr r1, _0804284C @ =gBattleMons\n\
+ movs r0, 0x58\n\
+ muls r0, r2\n\
+ adds r1, 0x50\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ movs r1, 0x7\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _08042832\n\
+ b _08042BCA\n\
+_08042832:\n\
+ movs r0, 0\n\
+ str r0, [sp, 0x10]\n\
+ b _08042BCA\n\
+ .align 2, 0\n\
+_08042838: .4byte gSideTimers\n\
+_0804283C: .4byte gActiveBattler\n\
+_08042840: .4byte 0x00000f88\n\
+_08042844: .4byte gMain\n\
+_08042848: .4byte 0x00000439\n\
+_0804284C: .4byte gBattleMons\n\
+_08042850:\n\
+ ldr r1, [sp, 0x14]\n\
+ ldr r2, [sp, 0xC]\n\
+ adds r0, r1, r2\n\
+ ldrb r7, [r0]\n\
+ movs r0, 0x20\n\
+ ands r0, r7\n\
+ cmp r0, 0\n\
+ beq _080428B6\n\
+ movs r0, 0xDF\n\
+ ands r7, r0\n\
+ mov r0, r8\n\
+ movs r1, 0x15\n\
+ movs r2, 0\n\
+ bl GetMonData\n\
+ adds r5, r0, 0\n\
+ ldr r0, _080428DC @ =gUnknown_825DEA1\n\
+ ldr r1, [sp, 0x8]\n\
+ adds r0, r1, r0\n\
+ ldrb r0, [r0]\n\
+ ands r5, r0\n\
+ lsls r0, r1, 1\n\
+ lsrs r5, r0\n\
+ adds r1, 0xD\n\
+ mov r0, r8\n\
+ movs r2, 0\n\
+ bl GetMonData\n\
+ adds r4, r0, 0\n\
+ lsls r4, 16\n\
+ lsrs r4, 16\n\
+ mov r0, r8\n\
+ movs r1, 0x15\n\
+ movs r2, 0\n\
+ bl GetMonData\n\
+ adds r1, r0, 0\n\
+ lsls r1, 24\n\
+ lsrs r1, 24\n\
+ adds r0, r4, 0\n\
+ ldr r2, [sp, 0x8]\n\
+ bl CalculatePPWithBonus\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r5, 0x2\n\
+ bhi _080428B6\n\
+ cmp r0, 0x4\n\
+ bls _080428B6\n\
+ movs r2, 0\n\
+ str r2, [sp, 0x10]\n\
+_080428B6:\n\
+ movs r0, 0\n\
+ mov r9, r0\n\
+ cmp r7, 0\n\
+ bne _080428C0\n\
+ b _08042BCA\n\
+_080428C0:\n\
+ movs r0, 0x1\n\
+ ands r0, r7\n\
+ cmp r0, 0\n\
+ bne _080428CA\n\
+ b _08042A5C\n\
+_080428CA:\n\
+ mov r1, r9\n\
+ cmp r1, 0x7\n\
+ bls _080428D2\n\
+ b _08042A5C\n\
+_080428D2:\n\
+ lsls r0, r1, 2\n\
+ ldr r1, _080428E0 @ =_080428E4\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+ .align 2, 0\n\
+_080428DC: .4byte gUnknown_825DEA1\n\
+_080428E0: .4byte _080428E4\n\
+ .align 2, 0\n\
+_080428E4:\n\
+ .4byte _08042904\n\
+ .4byte _08042904\n\
+ .4byte _08042934\n\
+ .4byte _08042996\n\
+ .4byte _08042A5C\n\
+ .4byte _08042A5C\n\
+ .4byte _08042A5C\n\
+ .4byte _08042A4A\n\
+_08042904:\n\
+ mov r0, r8\n\
+ bl GetMonEVCount\n\
+ lsls r0, 16\n\
+ ldr r1, _0804292C @ =0x01fd0000\n\
+ cmp r0, r1\n\
+ bls _08042914\n\
+ b _08042578\n\
+_08042914:\n\
+ ldr r0, _08042930 @ =sGetMonDataEVConstants\n\
+ add r0, r9\n\
+ ldrb r1, [r0]\n\
+ mov r0, r8\n\
+ movs r2, 0\n\
+ bl GetMonData\n\
+ adds r5, r0, 0\n\
+ cmp r5, 0x63\n\
+ bls _0804292A\n\
+ b _08042A5C\n\
+_0804292A:\n\
+ b _08042A3A\n\
+ .align 2, 0\n\
+_0804292C: .4byte 0x01fd0000\n\
+_08042930: .4byte sGetMonDataEVConstants\n\
+_08042934:\n\
+ movs r0, 0x10\n\
+ ands r0, r7\n\
+ cmp r0, 0\n\
+ beq _08042952\n\
+ mov r0, r8\n\
+ movs r1, 0x39\n\
+ movs r2, 0\n\
+ bl GetMonData\n\
+ cmp r0, 0\n\
+ beq _08042968\n\
+ mov r0, r10\n\
+ adds r0, 0x1\n\
+ lsls r0, 24\n\
+ b _080429F4\n\
+_08042952:\n\
+ mov r0, r8\n\
+ movs r1, 0x39\n\
+ movs r2, 0\n\
+ bl GetMonData\n\
+ cmp r0, 0\n\
+ bne _08042968\n\
+ mov r0, r10\n\
+ adds r0, 0x1\n\
+ lsls r0, 24\n\
+ b _080429F4\n\
+_08042968:\n\
+ mov r0, r8\n\
+ movs r1, 0x3A\n\
+ movs r2, 0\n\
+ bl GetMonData\n\
+ adds r4, r0, 0\n\
+ mov r0, r8\n\
+ movs r1, 0x39\n\
+ movs r2, 0\n\
+ bl GetMonData\n\
+ cmp r4, r0\n\
+ beq _08042986\n\
+ movs r0, 0\n\
+ str r0, [sp, 0x10]\n\
+_08042986:\n\
+ mov r0, r10\n\
+ adds r0, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r10, r0\n\
+ movs r0, 0xEF\n\
+ ands r7, r0\n\
+ b _08042A5C\n\
+_08042996:\n\
+ movs r0, 0x2\n\
+ ands r0, r7\n\
+ cmp r0, 0\n\
+ bne _080429FA\n\
+ movs r6, 0\n\
+ movs r1, 0x1\n\
+ add r10, r1\n\
+_080429A4:\n\
+ adds r1, r6, 0\n\
+ adds r1, 0x11\n\
+ mov r0, r8\n\
+ movs r2, 0\n\
+ bl GetMonData\n\
+ adds r5, r0, 0\n\
+ adds r1, r6, 0\n\
+ adds r1, 0xD\n\
+ mov r0, r8\n\
+ movs r2, 0\n\
+ bl GetMonData\n\
+ adds r4, r0, 0\n\
+ lsls r4, 16\n\
+ lsrs r4, 16\n\
+ mov r0, r8\n\
+ movs r1, 0x15\n\
+ movs r2, 0\n\
+ bl GetMonData\n\
+ adds r1, r0, 0\n\
+ lsls r1, 24\n\
+ lsrs r1, 24\n\
+ lsls r2, r6, 24\n\
+ lsrs r2, 24\n\
+ adds r0, r4, 0\n\
+ bl CalculatePPWithBonus\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r5, r0\n\
+ beq _080429EA\n\
+ movs r2, 0\n\
+ str r2, [sp, 0x10]\n\
+_080429EA:\n\
+ adds r6, 0x1\n\
+ cmp r6, 0x3\n\
+ ble _080429A4\n\
+ mov r1, r10\n\
+ lsls r0, r1, 24\n\
+_080429F4:\n\
+ lsrs r0, 24\n\
+ mov r10, r0\n\
+ b _08042A5C\n\
+_080429FA:\n\
+ ldr r1, [sp, 0x8]\n\
+ adds r1, 0x11\n\
+ mov r0, r8\n\
+ movs r2, 0\n\
+ bl GetMonData\n\
+ adds r5, r0, 0\n\
+ ldr r1, [sp, 0x8]\n\
+ adds r1, 0xD\n\
+ mov r0, r8\n\
+ movs r2, 0\n\
+ bl GetMonData\n\
+ adds r4, r0, 0\n\
+ lsls r4, 16\n\
+ lsrs r4, 16\n\
+ mov r0, r8\n\
+ movs r1, 0x15\n\
+ movs r2, 0\n\
+ bl GetMonData\n\
+ adds r1, r0, 0\n\
+ lsls r1, 24\n\
+ lsrs r1, 24\n\
+ adds r0, r4, 0\n\
+ ldr r2, [sp, 0x8]\n\
+ bl CalculatePPWithBonus\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r5, r0\n\
+ beq _08042A5C\n\
+_08042A3A:\n\
+ mov r0, r10\n\
+ adds r0, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r10, r0\n\
+ movs r2, 0\n\
+ str r2, [sp, 0x10]\n\
+ b _08042A5C\n\
+_08042A4A:\n\
+ mov r0, r8\n\
+ movs r1, 0x2\n\
+ ldr r2, [sp]\n\
+ bl GetEvolutionTargetSpecies\n\
+ lsls r0, 16\n\
+ cmp r0, 0\n\
+ beq _08042A5C\n\
+ b _08042574\n\
+_08042A5C:\n\
+ movs r0, 0x1\n\
+ add r9, r0\n\
+ lsrs r7, 1\n\
+ cmp r7, 0\n\
+ beq _08042A68\n\
+ b _080428C0\n\
+_08042A68:\n\
+ b _08042BCA\n\
+_08042A6A:\n\
+ ldr r1, [sp, 0x14]\n\
+ ldr r2, [sp, 0xC]\n\
+ adds r0, r1, r2\n\
+ ldrb r7, [r0]\n\
+ movs r0, 0\n\
+ mov r9, r0\n\
+ cmp r7, 0\n\
+ bne _08042A7C\n\
+ b _08042BCA\n\
+_08042A7C:\n\
+ movs r0, 0x1\n\
+ ands r0, r7\n\
+ cmp r0, 0\n\
+ bne _08042A86\n\
+ b _08042BBE\n\
+_08042A86:\n\
+ mov r1, r9\n\
+ cmp r1, 0x7\n\
+ bls _08042A8E\n\
+ b _08042BBE\n\
+_08042A8E:\n\
+ lsls r0, r1, 2\n\
+ ldr r1, _08042A98 @ =_08042A9C\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+ .align 2, 0\n\
+_08042A98: .4byte _08042A9C\n\
+ .align 2, 0\n\
+_08042A9C:\n\
+ .4byte _08042ABC\n\
+ .4byte _08042ABC\n\
+ .4byte _08042ABC\n\
+ .4byte _08042ABC\n\
+ .4byte _08042AF4\n\
+ .4byte _08042B4C\n\
+ .4byte _08042B68\n\
+ .4byte _08042B92\n\
+_08042ABC:\n\
+ mov r0, r8\n\
+ bl GetMonEVCount\n\
+ lsls r0, 16\n\
+ ldr r1, _08042AEC @ =0x01fd0000\n\
+ cmp r0, r1\n\
+ bls _08042ACC\n\
+ b _08042578\n\
+_08042ACC:\n\
+ ldr r0, _08042AF0 @ =sGetMonDataEVConstants\n\
+ mov r1, r9\n\
+ adds r1, 0x2\n\
+ adds r1, r0\n\
+ ldrb r1, [r1]\n\
+ mov r0, r8\n\
+ movs r2, 0\n\
+ bl GetMonData\n\
+ adds r5, r0, 0\n\
+ cmp r5, 0x63\n\
+ bhi _08042BBE\n\
+ movs r2, 0\n\
+ str r2, [sp, 0x10]\n\
+ b _08042BB4\n\
+ .align 2, 0\n\
+_08042AEC: .4byte 0x01fd0000\n\
+_08042AF0: .4byte sGetMonDataEVConstants\n\
+_08042AF4:\n\
+ mov r0, r8\n\
+ movs r1, 0x15\n\
+ movs r2, 0\n\
+ bl GetMonData\n\
+ adds r5, r0, 0\n\
+ ldr r0, _08042B48 @ =gUnknown_825DEA1\n\
+ ldr r1, [sp, 0x8]\n\
+ adds r0, r1, r0\n\
+ ldrb r0, [r0]\n\
+ ands r5, r0\n\
+ lsls r0, r1, 1\n\
+ lsrs r5, r0\n\
+ adds r1, 0xD\n\
+ mov r0, r8\n\
+ movs r2, 0\n\
+ bl GetMonData\n\
+ adds r4, r0, 0\n\
+ lsls r4, 16\n\
+ lsrs r4, 16\n\
+ mov r0, r8\n\
+ movs r1, 0x15\n\
+ movs r2, 0\n\
+ bl GetMonData\n\
+ adds r1, r0, 0\n\
+ lsls r1, 24\n\
+ lsrs r1, 24\n\
+ adds r0, r4, 0\n\
+ ldr r2, [sp, 0x8]\n\
+ bl CalculatePPWithBonus\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ cmp r5, 0x2\n\
+ bhi _08042BBE\n\
+ cmp r6, 0x4\n\
+ ble _08042BBE\n\
+ movs r2, 0\n\
+ str r2, [sp, 0x10]\n\
+ b _08042BBE\n\
+ .align 2, 0\n\
+_08042B48: .4byte gUnknown_825DEA1\n\
+_08042B4C:\n\
+ mov r0, r8\n\
+ movs r1, 0x20\n\
+ movs r2, 0\n\
+ bl GetMonData\n\
+ cmp r0, 0x63\n\
+ bhi _08042BB4\n\
+ ldr r0, [sp, 0x10]\n\
+ cmp r0, 0\n\
+ bne _08042BB4\n\
+ ldr r1, [sp, 0x18]\n\
+ cmp r1, 0\n\
+ bne _08042BB4\n\
+ b _08042BAC\n\
+_08042B68:\n\
+ mov r0, r8\n\
+ movs r1, 0x20\n\
+ movs r2, 0\n\
+ bl GetMonData\n\
+ cmp r0, 0x63\n\
+ bls _08042BB4\n\
+ mov r0, r8\n\
+ movs r1, 0x20\n\
+ movs r2, 0\n\
+ bl GetMonData\n\
+ cmp r0, 0xC7\n\
+ bhi _08042BB4\n\
+ ldr r2, [sp, 0x10]\n\
+ cmp r2, 0\n\
+ bne _08042BB4\n\
+ ldr r0, [sp, 0x18]\n\
+ cmp r0, 0\n\
+ bne _08042BB4\n\
+ b _08042BAC\n\
+_08042B92:\n\
+ mov r0, r8\n\
+ movs r1, 0x20\n\
+ movs r2, 0\n\
+ bl GetMonData\n\
+ cmp r0, 0xC7\n\
+ bls _08042BB4\n\
+ ldr r1, [sp, 0x10]\n\
+ cmp r1, 0\n\
+ bne _08042BB4\n\
+ ldr r2, [sp, 0x18]\n\
+ cmp r2, 0\n\
+ bne _08042BB4\n\
+_08042BAC:\n\
+ ldr r0, [sp, 0x14]\n\
+ add r0, r10\n\
+ ldrb r0, [r0]\n\
+ str r0, [sp, 0x18]\n\
+_08042BB4:\n\
+ mov r0, r10\n\
+ adds r0, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r10, r0\n\
+_08042BBE:\n\
+ movs r0, 0x1\n\
+ add r9, r0\n\
+ lsrs r7, 1\n\
+ cmp r7, 0\n\
+ beq _08042BCA\n\
+ b _08042A7C\n\
+_08042BCA:\n\
+ ldr r1, [sp, 0xC]\n\
+ adds r1, 0x1\n\
+ str r1, [sp, 0xC]\n\
+ cmp r1, 0x5\n\
+ bgt _08042BD6\n\
+ b _08042582\n\
+_08042BD6:\n\
+ ldr r0, [sp, 0x10]\n\
+_08042BD8:\n\
+ add sp, 0x20\n\
+ pop {r3-r5}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ mov r10, r5\n\
+ pop {r4-r7}\n\
+ pop {r1}\n\
+ bx r1\n\
+ .syntax divided\n");
+}
+#endif