diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/menews_jisan.c | 199 | ||||
-rw-r--r-- | src/pokemon.c | 2073 |
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 |