From 07f5db48c075f55a67136afb84ac804d525f5de3 Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Sun, 14 Jan 2018 20:39:52 -0600 Subject: start decompiling the behemoth that is sub_803E1B0 --- asm/pokemon_item_effect.s | 21 -- include/battle.h | 2 +- include/pokemon.h | 3 + include/pokemon_item_effect.h | 2 +- ld_script.txt | 1 + src/pokemon/pokemon_item_effect.c | 454 +++++++++++++++++++++++++++++++++++++- 6 files changed, 459 insertions(+), 24 deletions(-) diff --git a/asm/pokemon_item_effect.s b/asm/pokemon_item_effect.s index 6995dc62b..ba1b37dcb 100644 --- a/asm/pokemon_item_effect.s +++ b/asm/pokemon_item_effect.s @@ -5,27 +5,6 @@ .text - thumb_func_start ExecuteTableBasedItemEffect_ -ExecuteTableBasedItemEffect_: @ 803E18C - push {r4,lr} - sub sp, 0x4 - lsls r1, 16 - lsrs r1, 16 - lsls r2, 24 - lsrs r2, 24 - lsls r3, 24 - lsrs r3, 24 - movs r4, 0 - str r4, [sp] - bl sub_803E1B0 - lsls r0, 24 - lsrs r0, 24 - add sp, 0x4 - pop {r4} - pop {r1} - bx r1 - thumb_func_end ExecuteTableBasedItemEffect_ - thumb_func_start sub_803E1B0 sub_803E1B0: @ 803E1B0 push {r4-r7,lr} diff --git a/include/battle.h b/include/battle.h index 27ed57045..c94325cd5 100644 --- a/include/battle.h +++ b/include/battle.h @@ -473,7 +473,7 @@ struct sideTimer u8 lightscreenTimer; //0x1 u8 mistTimer; //0x2 u8 field3; //0x3 - u16 field4; //0x4 + u16 field4; //0x4 u8 spikesAmount; //0x6 u8 safeguardTimer; //0x7 u8 followmeTimer; //0x8 diff --git a/include/pokemon.h b/include/pokemon.h index 539323bdb..874ad7e09 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -628,5 +628,8 @@ void PartySpreadPokerus(struct Pokemon *party); struct Sprite *sub_80F7920(u16, u16, const u16 *); +bool8 HealStatusConditions(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId); + + #endif // GUARD_POKEMON_H diff --git a/include/pokemon_item_effect.h b/include/pokemon_item_effect.h index c09649aff..014612b05 100644 --- a/include/pokemon_item_effect.h +++ b/include/pokemon_item_effect.h @@ -1,6 +1,6 @@ #ifndef GUARD_POKEMON_ITEM_EFFECT_H #define GUARD_POKEMON_ITEM_EFFECT_H -bool8 ExecuteTableBasedItemEffect_(struct Pokemon *mon, u16, u8, u16); +bool8 ExecuteTableBasedItemEffect_(struct Pokemon *mon, u16, u8, u8); #endif // GUARD_POKEMON_ITEM_EFFECT_H diff --git a/ld_script.txt b/ld_script.txt index 128eb4c20..3a6305509 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -61,6 +61,7 @@ SECTIONS { src/pokemon/pokemon_1.o(.text); src/battle/calculate_base_damage.o(.text); src/pokemon/pokemon_2.o(.text); + src/pokemon/pokemon_item_effect.o(.text); asm/pokemon_item_effect.o(.text); src/pokemon/pokemon_3.o(.text); src/de_rom_8040FE0.o(.text); diff --git a/src/pokemon/pokemon_item_effect.c b/src/pokemon/pokemon_item_effect.c index 66f2ff697..34a61a489 100644 --- a/src/pokemon/pokemon_item_effect.c +++ b/src/pokemon/pokemon_item_effect.c @@ -1,7 +1,29 @@ #include "global.h" +#include "constants/items.h" +#include "constants/species.h" +#include "battle.h" +#include "evolution_scene.h" +#include "ewram.h" +#include "item.h" +#include "main.h" #include "pokemon.h" +#include "pokemon_item_effect.h" +#include "rom_8077ABC.h" +#include "rom_8094928.h" +#include "util.h" -const u8 gUnknown_082082F2[] = { +extern s32 gBattleMoveDamage; +extern u8 gAbsentBankFlags; +extern u8 gBankInMenu; +extern u8 gNoOfAllBanks; +extern u16 gBattlePartyID[]; +extern u8 gActiveBank; +extern u8 gStringBank; +extern struct BattlePokemon gBattleMons[]; +extern struct BattleEnigmaBerry gEnigmaBerries[]; + +const u8 gUnknown_082082F2[] = +{ MON_DATA_HP_EV, MON_DATA_ATK_EV, MON_DATA_DEF_EV, @@ -9,3 +31,433 @@ const u8 gUnknown_082082F2[] = { MON_DATA_SPDEF_EV, MON_DATA_SPATK_EV }; + +bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e); + +bool8 ExecuteTableBasedItemEffect_(struct Pokemon *pkmn, u16 b, u8 c, u8 d) +{ + return sub_803E1B0(pkmn, b, c, d, 0); +} + +extern u8 gUnknown_08208238[]; +extern u8 gUnknown_08208240[]; + +bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) +{ + int r10; + int r5; + u8 sp18; + int sp1C = 1; + const u8 *sp20; + u8 sp24 = 6; + u32 sp28; + int sp2C = 0; + u8 sp30; + int sp34 = 4; + u16 item; + u16 r4; + + item = GetMonData(pkmn, MON_DATA_HELD_ITEM); + if (item == 0xAF) + { + if (gMain.inBattle) + sp30 = gEnigmaBerries[gBankInMenu].holdEffect; + else + sp30 = gSaveBlock1.enigmaBerry.holdEffect; + } + //_0803E240 + else + { + sp30 = ItemId_GetHoldEffect(item); + } + //_0803E248 + + gStringBank = gBankInMenu; + if (gMain.inBattle) + { + gActiveBank = gBankInMenu; + sp18 = (GetBankSide(gActiveBank) != 0); + r4 = b - 13; + while (sp18 < gNoOfAllBanks) + { + if (gBattlePartyID[sp18] == c) + { + sp34 = sp18; + break; + } + sp18 += 2; + } + } + //_0803E2E8 + else + { + gActiveBank = 0; + sp34 = 4; + r4 = b - 13; + } + //_0803E2F4 + + if (r4 > 0xA5) + return 1; + + if (gItemEffectTable[r4] == NULL && b != 0xAF) + return 1; + if (b == 0xAF) + { + //_0803E31E + if (gMain.inBattle) + sp20 = gEnigmaBerries[gActiveBank].itemEffect; + else + sp20 = gSaveBlock1.enigmaBerry.itemEffect; + } + //_0803E372 + else + { + sp20 = gItemEffectTable[r4]; + } + + // Now, the HUGE loop! + for (sp18 = 0; sp18 < 6; sp18++) + { + switch (sp18) + { + case 0: + //_0803E3A8 + if ((sp20[sp18] & 0x80) && gMain.inBattle + && sp34 != 4 && (gBattleMons[sp34].status2 & 0xF0000)) + { + gBattleMons[sp34].status2 &= 0xFFF0FFFF; + sp1C = 0; + } + //_0803E3F0 + if ((sp20[sp18] & 0x30) && !(gBattleMons[gActiveBank].status2 & 0x4000000)) + { + gBattleMons[gActiveBank].status2 |= 0x4000000; + sp1C = 0; + } + //_0803E41E + if ((sp20[sp18] & 0xF) && gBattleMons[gActiveBank].statStages[1] < 12) + { + if (gBattleMons[gActiveBank].statStages[1] > 12) + gBattleMons[gActiveBank].statStages[1] = 12; + sp1C = 0; + break; + } + break; + case 1: + //_0803E474 + // r3 might be a temporary variable + if ((sp20[sp18] & 0xF0) && gBattleMons[gActiveBank].statStages[2] < 12) + { + gBattleMons[gActiveBank].statStages[2] += sp20[sp18] & 0xF0; + if (gBattleMons[gActiveBank].statStages[2] > 12) + gBattleMons[gActiveBank].statStages[2] = 12; + sp1C = 0; + } + //_0803E4BA + if ((sp20[sp18] & 0xF) && gBattleMons[gActiveBank].statStages[3] < 12) + { + gBattleMons[gActiveBank].statStages[3] += sp20[sp18] & 0xF; + if (gBattleMons[gActiveBank].statStages[3] > 12) + gBattleMons[gActiveBank].statStages[3] = 12; + sp1C = 0; + } + break; + case 2: + //_0803E508 + if ((sp20[sp18] & 0xF0) && gBattleMons[gActiveBank].statStages[4] < 12) + { + gBattleMons[gActiveBank].statStages[4] += sp20[sp18] & 0xF0; + if (gBattleMons[gActiveBank].statStages[4] > 12) + gBattleMons[gActiveBank].statStages[4] = 12; + sp1C = 0; + } + //_0803E54E + if ((sp20[sp18] & 0xF) && gBattleMons[gActiveBank].statStages[6] < 12) + { + gBattleMons[gActiveBank].statStages[6] += sp20[sp18] & 0xF; + if (gBattleMons[gActiveBank].statStages[6] > 12) + gBattleMons[gActiveBank].statStages[6] = 12; + sp1C = 0; + } + break; + case 3: + //_0803E59C + if ((sp20[sp18] & 0x80) && gSideTimers[GetBankSide(gActiveBank)].mistTimer == 0) + { + gSideTimers[GetBankSide(gActiveBank)].mistTimer = 5; + sp1C = 0; + } + //_0803E5E4 + if ((sp20[sp18] & 0x40) && GetMonData(pkmn, MON_DATA_LEVEL) != 100) + { + u32 exp = gExperienceTables[gBaseStats[GetMonData(pkmn, MON_DATA_SPECIES)].growthRate][GetMonData(pkmn, MON_DATA_LEVEL) + 1]; + + SetMonData(pkmn, MON_DATA_EXP, &exp); + CalculateMonStats(pkmn); + sp1C = 0; + } + //_0803E646 + if ((sp20[sp18] & 0x20) && HealStatusConditions(pkmn, c, 7, sp34) == 0) + { + if (sp34 != 4) + gBattleMons[sp34].status2 &= 0xF7FFFFFF; + sp1C = 0; + } + //_0803E682 + if ((sp20[sp18] & 0x10) && HealStatusConditions(pkmn, c, 0xF88, sp34) == 0) + sp1C = 0; + //_0803E6A2 + if ((sp20[sp18] & 8) && HealStatusConditions(pkmn, c, 16, sp34) == 0) + sp1C = 0; + //_0803E6C2 + if ((sp20[sp18] & 4) && HealStatusConditions(pkmn, c, 32, sp34) == 0) + sp1C = 0; + //_0803E6E2 + if ((sp20[sp18] & 2) && HealStatusConditions(pkmn, c, 64, sp34) == 0) + sp1C = 0; + //_0803E702 + if ((sp20[sp18] & 1) && gMain.inBattle + && sp34 != 4 && (gBattleMons[sp34].status2 & 7)) + { + gBattleMons[sp34].status2 &= ~7; + sp1C = 0; + } + break; + case 4: + //_0803E77C + r10 = sp20[sp18] & 0x20; + if (r10 != 0) + { + u32 sp0; + u16 r4; + + r10 &= 0xDF; + + sp0 = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_08208238[d]) << (d * 2); + r4 = GetMonData(pkmn, MON_DATA_MOVE1 + d, NULL); + sp28 = CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), d); + if (sp0 <= 2 && sp28 > 4) + { + sp0 = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) + gUnknown_08208240[d]; + SetMonData(pkmn, MON_DATA_PP_BONUSES, &sp0); + + sp0 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + d), sp0, d) - sp28; + sp0 += GetMonData(pkmn, MON_DATA_PP1 + d, NULL); + SetMonData(pkmn, MON_DATA_PP1 + d, &sp0); + sp1C = 0; + } + } + //_0803E854 + sp28 = 0; + while (r10 != 0) + { + if (r10 & 1) + { + u16 r5; + u32 r4; + u32 sp0; + u32 r1; + + switch (sp28) + { + case 0: + case 1: + //_0803E8AC + r5 = GetMonEVCount(pkmn); + if (r5 >= 510) + return 1; + r1 = GetMonData(pkmn, gUnknown_082082F2[sp28], NULL); + sp0 = r1; + if (r1 < 100) + { + r1 += sp20[sp24]; + if (r1 > 100) + r4 = 100 - r1; + else + r4 = sp20[sp24]; + //_0803E8F6 + if (r5 + r4 > 510) + r4 = (r4 - 510) - (r5 + r4); + sp0 += r4; + SetMonData(pkmn, gUnknown_082082F2[sp28], &sp0); + CalculateMonStats(pkmn); + sp24++; + sp1C = 0; + } + break; + case 2: + //_0803E934 + if (r10 & 0x10) + { + if (GetMonData(pkmn, MON_DATA_HP, NULL) != 0) + { + sp24++; + break; + } + if (gMain.inBattle) + { + if (sp34 != 4) + { + gAbsentBankFlags &= ~gBitTable[sp34]; + CopyPlayerPartyMonToBattleData(sp34, pokemon_order_func(gBattlePartyID[sp34])); + // tail merge, possibly? + } + //_0803E9B4 + else + { + gAbsentBankFlags &= ~gBitTable[gActiveBank ^ 2]; + } + //_0803E9CC + if (GetBankSide(gActiveBank) == 0 && gBattleResults.unk4 < 255) + gBattleResults.unk4++; + } + //to _0803EA0A + } + //_0803E9F4 + else + { + if (GetMonData(pkmn, MON_DATA_HP, NULL) == 0) + { + sp24++; + break; + } + } + //_0803EA0A + sp0 = sp20[sp24++]; + switch (sp0) + { + case 0xFF: + //_0803EA2C + if (sp0 == 0xFF) // wat? + sp0 = GetMonData(pkmn, MON_DATA_MAX_HP, NULL) - GetMonData(pkmn, MON_DATA_HP, NULL); + break; + case 0xFE: + sp0 = GetMonData(pkmn, MON_DATA_MAX_HP, NULL) * 2; + if (sp0 == 0) + sp0 = 1; + break; + case 0xFD: + sp0 = eStatHp; + break; + } + //_0803EA6C + if (GetMonData(pkmn, MON_DATA_MAX_HP) != GetMonData(pkmn, MON_DATA_HP)) + { + if (e == 0) + { + sp0 += GetMonData(pkmn, MON_DATA_HP, NULL); + if (sp0 > GetMonData(pkmn, MON_DATA_MAX_HP, NULL)) + sp0 = GetMonData(pkmn, MON_DATA_MAX_HP); + //_0803EAB8 + SetMonData(pkmn, MON_DATA_HP, &sp0); + if (gMain.inBattle && sp34 != 4) + { + gBattleMons[sp34].hp = sp0; + if (!(r10 & 0x10) && GetBankSide(gActiveBank) == 0) + { + u8 r5; + + if (gBattleResults.unk3 < 255) + gBattleResults.unk3++; + r5 = gActiveBank; + gActiveBank = sp34; + EmitGetAttributes(0, 0, 0); + MarkBufferBankForExecution(gActiveBank); + gActiveBank = r5; + } + } + //to _0803EB48 + } + //_0803EB40 + else + { + gBattleMoveDamage *= -1; + } + //_0803EB48 + sp1C = 0; + } + //_0803EB4C + r10 &= 0xEF; + break; + case 3: + if (!(r10 & 2)) + { + for (r5 = 0; r5 < 4; r5++) + { + u16 r4; + + sp0 = GetMonData(pkmn, MON_DATA_PP1 + r5, NULL); + r4 = GetMonData(pkmn, MON_DATA_MOVE1 + r5, NULL); + if (sp0 != CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), r5)) + { + r4 = GetMonData(pkmn, MON_DATA_MOVE1 + r5, NULL); + if (sp0 > CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), r5)) + { + r4 = GetMonData(pkmn, MON_DATA_MOVE1 + r5, NULL); + sp0 = CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), r5); + } + //_0803EC28 + SetMonData(pkmn, MON_DATA_PP1 + r5, &sp0); + if (gMain.inBattle + && sp34 != 4 && !(gBattleMons[sp34].status2 & 0x200000) + && !(gDisableStructs[sp34].unk18_b & gBitTable[r5])) + gBattleMons[sp34].pp[r5] = sp0; + //_0803EC8E + sp1C = 0; + } + //_0803EC92 + } + //_0803EC9A + sp24++; + } + //_0803ECB8 + else + { + u16 r4; + + sp0 = GetMonData(pkmn, MON_DATA_PP1 + d, NULL); + r4 = GetMonData(pkmn, MON_DATA_MOVE1 + d, NULL); + if (sp0 != CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), d)) + { + //_0803ED00 + sp0 = sp20[sp24++]; + r4 = GetMonData(pkmn, MON_DATA_MOVE1 + d, NULL); + if (sp0 > CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), d)) + { + r4 = GetMonData(pkmn, MON_DATA_MOVE1 + d, NULL); + sp0 = CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), d); + } + //_0803ED74 + SetMonData(pkmn, MON_DATA_PP1 + d, &sp0); + if (gMain.inBattle + && sp34 != 4 && !(gBattleMons[sp34].status2 & 0x200000) + && !(gDisableStructs[sp34].unk18_b & gBitTable[d])) + gBattleMons[sp34].pp[d] = sp0; + //_0803EDD8 + sp1C = 0; + } + } + break; + case 7: + //_0803EDF4 + { + u16 targetSpecies = GetEvolutionTargetSpecies(pkmn, 2, d); + + if (targetSpecies != SPECIES_NONE) + { + BeginEvolutionScene(pkmn, targetSpecies, 0, c); + return 0; + } + } + break; + } + } + //_0803EE0A + } + break; + } + } + //_0803F15A + return sp1C; +} -- cgit v1.2.3 From 20f4dd0677b5e01825b9e271a06f5d3ee4bb3252 Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Sun, 14 Jan 2018 22:33:35 -0600 Subject: decompile sub_803E1B0 (nonmatching) --- src/pokemon/pokemon_item_effect.c | 181 +++++++++++++++++++++++++++++++++++++- 1 file changed, 177 insertions(+), 4 deletions(-) diff --git a/src/pokemon/pokemon_item_effect.c b/src/pokemon/pokemon_item_effect.c index 34a61a489..d25e96f9d 100644 --- a/src/pokemon/pokemon_item_effect.c +++ b/src/pokemon/pokemon_item_effect.c @@ -6,6 +6,7 @@ #include "ewram.h" #include "item.h" #include "main.h" +#include "overworld.h" #include "pokemon.h" #include "pokemon_item_effect.h" #include "rom_8077ABC.h" @@ -40,18 +41,20 @@ bool8 ExecuteTableBasedItemEffect_(struct Pokemon *pkmn, u16 b, u8 c, u8 d) } extern u8 gUnknown_08208238[]; +extern u8 gUnknown_0820823C[]; extern u8 gUnknown_08208240[]; bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) { int r10; - int r5; + u32 sp0; + u32 sp4; u8 sp18; int sp1C = 1; const u8 *sp20; u8 sp24 = 6; u32 sp28; - int sp2C = 0; + s8 sp2C = 0; u8 sp30; int sp34 = 4; u16 item; @@ -229,7 +232,6 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) r10 = sp20[sp18] & 0x20; if (r10 != 0) { - u32 sp0; u16 r4; r10 &= 0xDF; @@ -256,7 +258,6 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) { u16 r5; u32 r4; - u32 sp0; u32 r1; switch (sp28) @@ -456,6 +457,178 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) //_0803EE0A } break; + case 5: + //_0803EE1E + r10 = sp20[sp18]; + sp28 = 0; + while (r10 != 0) + { + //_0803EE32 + if (r10 & 1) + { + u16 r5; + u32 r4; + u32 r1; + + switch (sp28) + { + case 0: + case 1: + case 2: + case 3: + //_0803EE74 + r5 = GetMonEVCount(pkmn); + if (r5 >= 510) + return 1; + r1 = GetMonData(pkmn, gUnknown_082082F2[sp28], NULL); + sp0 = r1; + if (r1 < 100) + { + r1 += sp20[sp24]; + if (r1 > 100) + r4 = 100 - r1; + else + r4 = sp20[sp24]; + //_0803EEC6 + if (r5 + r4 > 510) + r4 = (r4 + 510) - (r5 + r4); + sp0 += r4; + SetMonData(pkmn, gUnknown_082082F2[sp28], &sp0); + CalculateMonStats(pkmn); + sp1C = 0; + sp24++; + } + break; + case 4: + //_0803EEF8 + sp0 = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_08208238[d]) << (d * 2); + if (sp0 < 3) + { + //_0803EF18 + u8 r4 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + d, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), d); + sp0 = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL); + sp0 &= gUnknown_0820823C[d]; + sp0 += gUnknown_08208240[d] * 3; + + SetMonData(pkmn, MON_DATA_PP_BONUSES, &sp0); + sp0 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + d, NULL), sp0, d) - r4; + sp0 += GetMonData(pkmn, MON_DATA_PP1 + b, NULL); + SetMonData(pkmn, MON_DATA_PP1 + b, &sp0); + sp1C = 0; + } + break; + case 5: + //_0803EFCC + if (GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) < 100 && sp1C == 0 && sp2C == 0) + { + //_0803EFEC + sp2C = sp20[sp24]; + sp4 = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL); + if (sp2C > 0 && sp30 == 0x1B) + { + sp4 = 0x96 * sp2C / 100; + } + //to _0803F0D0 hmm... + else + { + sp4 += sp2C; + } + //_0803F0DC (tail merged) + + if (sp2C > 0) + { + if (GetMonData(pkmn, MON_DATA_POKEBALL, NULL) == 11) + sp4++; + //_0803F0F4 + if (GetMonData(pkmn, MON_DATA_MET_LOCATION, NULL) == sav1_map_get_name()) + sp4++; + } + //_0803F112 + if (sp4 < 0) + sp4 = 0; + if (sp4 > 255) + sp4 = 255; + SetMonData(pkmn, MON_DATA_FRIENDSHIP, &sp4); + } + //to _0803F130 hmm... + sp24++; + break; + case 6: + //_0803F026 + if (GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) >= 100 && GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) < 200 + && sp1C == 0 && sp2C == 0) + { + sp2C = sp20[sp24]; + sp4 = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL); + if (sp2C > 0 && sp30 == 0x1B) + { + //to _0803F0BE + sp4 = 0x96 * sp2C / 100; + } + else + { + sp4 += sp2C; + } + //_0803F0DC (tail merged) + + if (sp2C > 0) + { + if (GetMonData(pkmn, MON_DATA_POKEBALL, NULL) == 11) + sp4++; + //_0803F0F4 + if (GetMonData(pkmn, MON_DATA_MET_LOCATION, NULL) == sav1_map_get_name()) + sp4++; + } + //_0803F112 + if (sp4 < 0) + sp4 = 0; + if (sp4 > 255) + sp4 = 255; + SetMonData(pkmn, MON_DATA_FRIENDSHIP, &sp4); + } + //to _0803F130 hmm... + sp24++; + break; + case 7: + //_0803F07C + if (GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) >= 200 && sp1C == 0 && sp2C == 0) + { + sp2C = sp20[sp24]; + sp4 = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL); + if (sp2C > 0 && sp30 == 0x1B) + { + //_0803F0BE + sp4 = 0x96 * sp2C / 100; + } + //_0803F0D0 + else + { + sp4 += sp2C; + } + //_0803F0DC + + if (sp2C > 0) + { + if (GetMonData(pkmn, MON_DATA_POKEBALL, NULL) == 11) + sp4++; + //_0803F0F4 + if (GetMonData(pkmn, MON_DATA_MET_LOCATION, NULL) == sav1_map_get_name()) + sp4++; + } + //_0803F112 + if (sp4 < 0) + sp4 = 0; + if (sp4 > 255) + sp4 = 255; + SetMonData(pkmn, MON_DATA_FRIENDSHIP, &sp4); + } + //to _0803F130 + sp24++; + break; + } + } + } + break; } } //_0803F15A -- cgit v1.2.3 From 2a2c61d46d77c0c974c785ddebab9105965e7275 Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Mon, 15 Jan 2018 00:40:55 -0600 Subject: get sub_803E1B0 closer --- src/pokemon/pokemon_item_effect.c | 81 ++++++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 36 deletions(-) diff --git a/src/pokemon/pokemon_item_effect.c b/src/pokemon/pokemon_item_effect.c index d25e96f9d..b58298f52 100644 --- a/src/pokemon/pokemon_item_effect.c +++ b/src/pokemon/pokemon_item_effect.c @@ -46,19 +46,19 @@ extern u8 gUnknown_08208240[]; bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) { - int r10; u32 sp0; - u32 sp4; - u8 sp18; - int sp1C = 1; + s32 sp4; + s32 sp18; + bool8 sp1C = TRUE; const u8 *sp20; u8 sp24 = 6; u32 sp28; s8 sp2C = 0; u8 sp30; - int sp34 = 4; + u8 sp34 = 4; u16 item; u16 r4; + u32 r10; item = GetMonData(pkmn, MON_DATA_HELD_ITEM); if (item == 0xAF) @@ -80,7 +80,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) { gActiveBank = gBankInMenu; sp18 = (GetBankSide(gActiveBank) != 0); - r4 = b - 13; + //r4 = b - 13; while (sp18 < gNoOfAllBanks) { if (gBattlePartyID[sp18] == c) @@ -90,6 +90,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) } sp18 += 2; } + r4 = b - 13; } //_0803E2E8 else @@ -141,10 +142,10 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) //_0803E41E if ((sp20[sp18] & 0xF) && gBattleMons[gActiveBank].statStages[1] < 12) { + gBattleMons[gActiveBank].statStages[1] += sp20[sp18] & 0xF; if (gBattleMons[gActiveBank].statStages[1] > 12) gBattleMons[gActiveBank].statStages[1] = 12; sp1C = 0; - break; } break; case 1: @@ -152,7 +153,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) // r3 might be a temporary variable if ((sp20[sp18] & 0xF0) && gBattleMons[gActiveBank].statStages[2] < 12) { - gBattleMons[gActiveBank].statStages[2] += sp20[sp18] & 0xF0; + gBattleMons[gActiveBank].statStages[2] += (sp20[sp18] & 0xF0) >> 4; if (gBattleMons[gActiveBank].statStages[2] > 12) gBattleMons[gActiveBank].statStages[2] = 12; sp1C = 0; @@ -164,23 +165,25 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) if (gBattleMons[gActiveBank].statStages[3] > 12) gBattleMons[gActiveBank].statStages[3] = 12; sp1C = 0; + //asm(""); } break; case 2: //_0803E508 - if ((sp20[sp18] & 0xF0) && gBattleMons[gActiveBank].statStages[4] < 12) + //asm_comment("case2"); + if ((sp20[sp18] & 0xF0) && gBattleMons[gActiveBank].statStages[6] < 12) { - gBattleMons[gActiveBank].statStages[4] += sp20[sp18] & 0xF0; - if (gBattleMons[gActiveBank].statStages[4] > 12) - gBattleMons[gActiveBank].statStages[4] = 12; + gBattleMons[gActiveBank].statStages[6] += (sp20[sp18] & 0xF0) >> 4; + if (gBattleMons[gActiveBank].statStages[6] > 12) + gBattleMons[gActiveBank].statStages[6] = 12; sp1C = 0; } //_0803E54E - if ((sp20[sp18] & 0xF) && gBattleMons[gActiveBank].statStages[6] < 12) + if ((sp20[sp18] & 0xF) && gBattleMons[gActiveBank].statStages[4] < 12) { - gBattleMons[gActiveBank].statStages[6] += sp20[sp18] & 0xF; - if (gBattleMons[gActiveBank].statStages[6] > 12) - gBattleMons[gActiveBank].statStages[6] = 12; + gBattleMons[gActiveBank].statStages[4] += sp20[sp18] & 0xF; + if (gBattleMons[gActiveBank].statStages[4] > 12) + gBattleMons[gActiveBank].statStages[4] = 12; sp1C = 0; } break; @@ -192,11 +195,10 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) sp1C = 0; } //_0803E5E4 - if ((sp20[sp18] & 0x40) && GetMonData(pkmn, MON_DATA_LEVEL) != 100) + if ((sp20[sp18] & 0x40) && GetMonData(pkmn, MON_DATA_LEVEL, NULL) != 100) { - u32 exp = gExperienceTables[gBaseStats[GetMonData(pkmn, MON_DATA_SPECIES)].growthRate][GetMonData(pkmn, MON_DATA_LEVEL) + 1]; - - SetMonData(pkmn, MON_DATA_EXP, &exp); + sp0 = gExperienceTables[gBaseStats[GetMonData(pkmn, MON_DATA_SPECIES, NULL)].growthRate][GetMonData(pkmn, MON_DATA_LEVEL, NULL) + 1]; + SetMonData(pkmn, MON_DATA_EXP, &sp0); CalculateMonStats(pkmn); sp1C = 0; } @@ -229,22 +231,22 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) break; case 4: //_0803E77C - r10 = sp20[sp18] & 0x20; - if (r10 != 0) + r10 = sp20[sp18]; + if (r10 & 0x20) { - u16 r4; + //u16 r4; r10 &= 0xDF; sp0 = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_08208238[d]) << (d * 2); - r4 = GetMonData(pkmn, MON_DATA_MOVE1 + d, NULL); - sp28 = CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), d); + //r4 = GetMonData(pkmn, MON_DATA_MOVE1 + d, NULL); + sp28 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + d, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), d); if (sp0 <= 2 && sp28 > 4) { sp0 = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) + gUnknown_08208240[d]; SetMonData(pkmn, MON_DATA_PP_BONUSES, &sp0); - sp0 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + d), sp0, d) - sp28; + sp0 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + d, NULL), sp0, d) - sp28; sp0 += GetMonData(pkmn, MON_DATA_PP1 + d, NULL); SetMonData(pkmn, MON_DATA_PP1 + d, &sp0); sp1C = 0; @@ -256,7 +258,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) { if (r10 & 1) { - u16 r5; + s32 r5; u32 r4; u32 r1; @@ -303,15 +305,17 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) gAbsentBankFlags &= ~gBitTable[sp34]; CopyPlayerPartyMonToBattleData(sp34, pokemon_order_func(gBattlePartyID[sp34])); // tail merge, possibly? + if (GetBankSide(gActiveBank) == 0 && gBattleResults.unk4 < 255) + gBattleResults.unk4++; } //_0803E9B4 else { gAbsentBankFlags &= ~gBitTable[gActiveBank ^ 2]; + if (GetBankSide(gActiveBank) == 0 && gBattleResults.unk4 < 255) + gBattleResults.unk4++; } //_0803E9CC - if (GetBankSide(gActiveBank) == 0 && gBattleResults.unk4 < 255) - gBattleResults.unk4++; } //to _0803EA0A } @@ -343,13 +347,13 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) break; } //_0803EA6C - if (GetMonData(pkmn, MON_DATA_MAX_HP) != GetMonData(pkmn, MON_DATA_HP)) + if (GetMonData(pkmn, MON_DATA_MAX_HP, NULL) != GetMonData(pkmn, MON_DATA_HP, NULL)) { if (e == 0) { sp0 += GetMonData(pkmn, MON_DATA_HP, NULL); if (sp0 > GetMonData(pkmn, MON_DATA_MAX_HP, NULL)) - sp0 = GetMonData(pkmn, MON_DATA_MAX_HP); + sp0 = GetMonData(pkmn, MON_DATA_MAX_HP, NULL); //_0803EAB8 SetMonData(pkmn, MON_DATA_HP, &sp0); if (gMain.inBattle && sp34 != 4) @@ -373,7 +377,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) //_0803EB40 else { - gBattleMoveDamage *= -1; + gBattleMoveDamage = -sp0; } //_0803EB48 sp1C = 0; @@ -392,6 +396,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) r4 = GetMonData(pkmn, MON_DATA_MOVE1 + r5, NULL); if (sp0 != CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), r5)) { + sp0 += sp20[sp24]; r4 = GetMonData(pkmn, MON_DATA_MOVE1 + r5, NULL); if (sp0 > CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), r5)) { @@ -422,7 +427,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) if (sp0 != CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), d)) { //_0803ED00 - sp0 = sp20[sp24++]; + sp0 += sp20[sp24++]; r4 = GetMonData(pkmn, MON_DATA_MOVE1 + d, NULL); if (sp0 > CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), d)) { @@ -455,6 +460,8 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) } } //_0803EE0A + sp28++; + r10 >>= 1; } break; case 5: @@ -480,7 +487,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) r5 = GetMonEVCount(pkmn); if (r5 >= 510) return 1; - r1 = GetMonData(pkmn, gUnknown_082082F2[sp28], NULL); + r1 = GetMonData(pkmn, gUnknown_082082F2[sp28 + 2], NULL); sp0 = r1; if (r1 < 100) { @@ -493,7 +500,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) if (r5 + r4 > 510) r4 = (r4 + 510) - (r5 + r4); sp0 += r4; - SetMonData(pkmn, gUnknown_082082F2[sp28], &sp0); + SetMonData(pkmn, gUnknown_082082F2[sp28 + 2], &sp0); CalculateMonStats(pkmn); sp1C = 0; sp24++; @@ -526,7 +533,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) sp4 = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL); if (sp2C > 0 && sp30 == 0x1B) { - sp4 = 0x96 * sp2C / 100; + sp4 += 0x96 * sp2C / 100; } //to _0803F0D0 hmm... else @@ -627,6 +634,8 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) break; } } + sp28++; + r10 >>= 1; } break; } -- cgit v1.2.3 From fd3ab3fcc69708d082f3791052823ec333165b36 Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Mon, 15 Jan 2018 12:49:20 -0600 Subject: get sub_803E1B0 a bit closer --- src/pokemon/pokemon_item_effect.c | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/pokemon/pokemon_item_effect.c b/src/pokemon/pokemon_item_effect.c index b58298f52..b4b7206dc 100644 --- a/src/pokemon/pokemon_item_effect.c +++ b/src/pokemon/pokemon_item_effect.c @@ -57,10 +57,9 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) u8 sp30; u8 sp34 = 4; u16 item; - u16 r4; - u32 r10; + u8 r10; - item = GetMonData(pkmn, MON_DATA_HELD_ITEM); + item = GetMonData(pkmn, MON_DATA_HELD_ITEM, NULL); if (item == 0xAF) { if (gMain.inBattle) @@ -80,7 +79,6 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) { gActiveBank = gBankInMenu; sp18 = (GetBankSide(gActiveBank) != 0); - //r4 = b - 13; while (sp18 < gNoOfAllBanks) { if (gBattlePartyID[sp18] == c) @@ -90,22 +88,20 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) } sp18 += 2; } - r4 = b - 13; } //_0803E2E8 else { gActiveBank = 0; sp34 = 4; - r4 = b - 13; } //_0803E2F4 - - if (r4 > 0xA5) + + if (b < 13 || b > 0xB2) return 1; - - if (gItemEffectTable[r4] == NULL && b != 0xAF) + if (gItemEffectTable[b - 13] == NULL && b != 0xAF) return 1; + if (b == 0xAF) { //_0803E31E @@ -117,7 +113,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) //_0803E372 else { - sp20 = gItemEffectTable[r4]; + sp20 = gItemEffectTable[b - 13]; } // Now, the HUGE loop! @@ -127,10 +123,11 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) { case 0: //_0803E3A8 + // TODO: stop re-loading sp34 if ((sp20[sp18] & 0x80) && gMain.inBattle && sp34 != 4 && (gBattleMons[sp34].status2 & 0xF0000)) { - gBattleMons[sp34].status2 &= 0xFFF0FFFF; + gBattleMons[sp34].status2 &= ~0xF0000; sp1C = 0; } //_0803E3F0 @@ -236,7 +233,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) { //u16 r4; - r10 &= 0xDF; + r10 &= ~0x20; sp0 = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_08208238[d]) << (d * 2); //r4 = GetMonData(pkmn, MON_DATA_MOVE1 + d, NULL); @@ -287,6 +284,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) CalculateMonStats(pkmn); sp24++; sp1C = 0; + //asm(""); } break; case 2: -- cgit v1.2.3 From c8bd765540bc38c2273a70caf99051727c467d21 Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Mon, 15 Jan 2018 15:29:27 -0600 Subject: get sub_803E1B0 a lot closer --- src/pokemon/pokemon_item_effect.c | 54 ++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 29 deletions(-) diff --git a/src/pokemon/pokemon_item_effect.c b/src/pokemon/pokemon_item_effect.c index b4b7206dc..92bf01171 100644 --- a/src/pokemon/pokemon_item_effect.c +++ b/src/pokemon/pokemon_item_effect.c @@ -33,6 +33,10 @@ const u8 gUnknown_082082F2[] = MON_DATA_SPATK_EV }; +extern u8 gUnknown_08208238[]; +extern u8 gUnknown_0820823C[]; +extern u8 gUnknown_08208240[]; + bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e); bool8 ExecuteTableBasedItemEffect_(struct Pokemon *pkmn, u16 b, u8 c, u8 d) @@ -40,10 +44,6 @@ bool8 ExecuteTableBasedItemEffect_(struct Pokemon *pkmn, u16 b, u8 c, u8 d) return sub_803E1B0(pkmn, b, c, d, 0); } -extern u8 gUnknown_08208238[]; -extern u8 gUnknown_0820823C[]; -extern u8 gUnknown_08208240[]; - bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) { u32 sp0; @@ -58,6 +58,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) u8 sp34 = 4; u16 item; u8 r10; + u32 r4; item = GetMonData(pkmn, MON_DATA_HELD_ITEM, NULL); if (item == 0xAF) @@ -131,9 +132,9 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) sp1C = 0; } //_0803E3F0 - if ((sp20[sp18] & 0x30) && !(gBattleMons[gActiveBank].status2 & 0x4000000)) + if ((sp20[sp18] & 0x30) && !(gBattleMons[gActiveBank].status2 & 0x100000)) { - gBattleMons[gActiveBank].status2 |= 0x4000000; + gBattleMons[gActiveBank].status2 |= 0x100000; sp1C = 0; } //_0803E41E @@ -235,8 +236,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) r10 &= ~0x20; - sp0 = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_08208238[d]) << (d * 2); - //r4 = GetMonData(pkmn, MON_DATA_MOVE1 + d, NULL); + sp0 = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_08208238[d]) >> (d * 2); sp28 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + d, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), d); if (sp0 <= 2 && sp28 > 4) { @@ -255,8 +255,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) { if (r10 & 1) { - s32 r5; - u32 r4; + s32 r5; // TODO: the ev count is a separate variable u32 r1; switch (sp28) @@ -271,14 +270,13 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) sp0 = r1; if (r1 < 100) { - r1 += sp20[sp24]; - if (r1 > 100) - r4 = 100 - r1; + if (r1 + sp20[sp24] > 100) + r4 = 100 - (r1 + sp20[sp24]) + sp20[sp24]; else r4 = sp20[sp24]; - //_0803E8F6 - if (r5 + r4 > 510) - r4 = (r4 - 510) - (r5 + r4); + r1 = r5 + r4; + if (r1 > 510) + r4 += 510 - r1; sp0 += r4; SetMonData(pkmn, gUnknown_082082F2[sp28], &sp0); CalculateMonStats(pkmn); @@ -336,7 +334,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) sp0 = GetMonData(pkmn, MON_DATA_MAX_HP, NULL) - GetMonData(pkmn, MON_DATA_HP, NULL); break; case 0xFE: - sp0 = GetMonData(pkmn, MON_DATA_MAX_HP, NULL) * 2; + sp0 = GetMonData(pkmn, MON_DATA_MAX_HP, NULL) / 2; if (sp0 == 0) sp0 = 1; break; @@ -472,7 +470,6 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) if (r10 & 1) { u16 r5; - u32 r4; u32 r1; switch (sp28) @@ -489,14 +486,13 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) sp0 = r1; if (r1 < 100) { - r1 += sp20[sp24]; - if (r1 > 100) - r4 = 100 - r1; + if (r1 + sp20[sp24] > 100) + r4 = 100 - (r1 + sp20[sp24]) + sp20[sp24]; else r4 = sp20[sp24]; - //_0803EEC6 - if (r5 + r4 > 510) - r4 = (r4 + 510) - (r5 + r4); + r1 = r5 + r4; + if (r1 > 510) + r4 += 510 - r1; sp0 += r4; SetMonData(pkmn, gUnknown_082082F2[sp28 + 2], &sp0); CalculateMonStats(pkmn); @@ -506,11 +502,11 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) break; case 4: //_0803EEF8 - sp0 = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_08208238[d]) << (d * 2); + sp0 = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_08208238[d]) >> (d * 2); if (sp0 < 3) { //_0803EF18 - u8 r4 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + d, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), d); + r4 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + d, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), d); sp0 = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL); sp0 &= gUnknown_0820823C[d]; sp0 += gUnknown_08208240[d] * 3; @@ -531,7 +527,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) sp4 = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL); if (sp2C > 0 && sp30 == 0x1B) { - sp4 += 0x96 * sp2C / 100; + sp4 += 150 * sp2C / 100; } //to _0803F0D0 hmm... else @@ -568,7 +564,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) if (sp2C > 0 && sp30 == 0x1B) { //to _0803F0BE - sp4 = 0x96 * sp2C / 100; + sp4 = 150 * sp2C / 100; } else { @@ -603,7 +599,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) if (sp2C > 0 && sp30 == 0x1B) { //_0803F0BE - sp4 = 0x96 * sp2C / 100; + sp4 = 150 * sp2C / 100; } //_0803F0D0 else -- cgit v1.2.3 From 4e9f791782fff682b133dab88533fe587b520815 Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Mon, 15 Jan 2018 16:09:22 -0600 Subject: match sub_803E1B0 --- asm/pokemon_item_effect.s | 1940 ------------------------------------- src/pokemon/pokemon_item_effect.c | 40 +- 2 files changed, 19 insertions(+), 1961 deletions(-) diff --git a/asm/pokemon_item_effect.s b/asm/pokemon_item_effect.s index ba1b37dcb..c3461fa64 100644 --- a/asm/pokemon_item_effect.s +++ b/asm/pokemon_item_effect.s @@ -5,1944 +5,4 @@ .text - thumb_func_start sub_803E1B0 -sub_803E1B0: @ 803E1B0 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x3C - mov r8, r0 - ldr r0, [sp, 0x5C] - lsls r1, 16 - lsrs r1, 16 - str r1, [sp, 0x8] - lsls r2, 24 - lsrs r2, 24 - str r2, [sp, 0xC] - lsls r3, 24 - lsrs r3, 24 - str r3, [sp, 0x10] - lsls r0, 24 - lsrs r0, 24 - str r0, [sp, 0x14] - movs r0, 0x1 - str r0, [sp, 0x1C] - movs r1, 0x6 - str r1, [sp, 0x24] - movs r2, 0 - str r2, [sp, 0x2C] - movs r3, 0x4 - str r3, [sp, 0x34] - mov r0, r8 - movs r1, 0xC - bl GetMonData - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0xAF - bne _0803E240 - ldr r0, _0803E21C @ =gMain - ldr r4, _0803E220 @ =0x0000043d - adds r0, r4 - ldrb r1, [r0] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _0803E22C - ldr r2, _0803E224 @ =gEnigmaBerries - ldr r0, _0803E228 @ =gBankInMenu - ldrb r1, [r0] - lsls r0, r1, 3 - subs r0, r1 - lsls r0, 2 - adds r0, r2 - ldrb r0, [r0, 0x7] - b _0803E248 - .align 2, 0 -_0803E21C: .4byte gMain -_0803E220: .4byte 0x0000043d -_0803E224: .4byte gEnigmaBerries -_0803E228: .4byte gBankInMenu -_0803E22C: - ldr r0, _0803E238 @ =gSaveBlock1 - ldr r5, _0803E23C @ =0x00003688 - adds r0, r5 - ldrb r0, [r0] - b _0803E248 - .align 2, 0 -_0803E238: .4byte gSaveBlock1 -_0803E23C: .4byte 0x00003688 -_0803E240: - bl ItemId_GetHoldEffect - lsls r0, 24 - lsrs r0, 24 -_0803E248: - str r0, [sp, 0x30] - ldr r1, _0803E2A4 @ =gStringBank - ldr r0, _0803E2A8 @ =gBankInMenu - ldrb r2, [r0] - strb r2, [r1] - ldr r0, _0803E2AC @ =gMain - ldr r1, _0803E2B0 @ =0x0000043d - adds r0, r1 - ldrb r1, [r0] - movs r0, 0x2 - ands r0, r1 - lsls r0, 24 - lsrs r1, r0, 24 - cmp r1, 0 - beq _0803E2E8 - ldr r0, _0803E2B4 @ =gActiveBank - strb r2, [r0] - ldrb r0, [r0] - bl GetBankSide - lsls r0, 24 - lsrs r0, 24 - negs r1, r0 - orrs r1, r0 - lsrs r1, 31 - str r1, [sp, 0x18] - ldr r0, _0803E2B8 @ =gNoOfAllBanks - ldr r4, [sp, 0x8] - subs r4, 0xD - ldrb r0, [r0] - cmp r1, r0 - bge _0803E2F4 - ldr r2, _0803E2BC @ =gBattlePartyID - lsls r0, r1, 1 - adds r0, r2 - ldrh r3, [r0] - ldr r5, [sp, 0xC] - lsls r0, r5, 16 - lsrs r1, r0, 16 - adds r5, r0, 0 - cmp r3, r1 - bne _0803E2C0 - ldr r0, [sp, 0x18] - str r0, [sp, 0x34] - b _0803E2F4 - .align 2, 0 -_0803E2A4: .4byte gStringBank -_0803E2A8: .4byte gBankInMenu -_0803E2AC: .4byte gMain -_0803E2B0: .4byte 0x0000043d -_0803E2B4: .4byte gActiveBank -_0803E2B8: .4byte gNoOfAllBanks -_0803E2BC: .4byte gBattlePartyID -_0803E2C0: - ldr r1, [sp, 0x18] - adds r1, 0x2 - str r1, [sp, 0x18] - ldr r0, _0803E2E4 @ =gNoOfAllBanks - ldrb r0, [r0] - cmp r1, r0 - bge _0803E2F4 - lsls r0, r1, 1 - adds r0, r2 - ldrh r1, [r0] - lsrs r0, r5, 16 - cmp r1, r0 - bne _0803E2C0 - ldr r2, [sp, 0x18] - lsls r0, r2, 24 - lsrs r0, 24 - str r0, [sp, 0x34] - b _0803E2F4 - .align 2, 0 -_0803E2E4: .4byte gNoOfAllBanks -_0803E2E8: - ldr r0, _0803E310 @ =gActiveBank - strb r1, [r0] - movs r3, 0x4 - str r3, [sp, 0x34] - ldr r4, [sp, 0x8] - subs r4, 0xD -_0803E2F4: - lsls r0, r4, 16 - lsrs r0, 16 - cmp r0, 0xA5 - bhi _0803E36C - ldr r1, _0803E314 @ =gItemEffectTable - lsls r0, r4, 2 - adds r0, r1 - ldr r0, [r0] - cmp r0, 0 - bne _0803E318 - ldr r4, [sp, 0x8] - cmp r4, 0xAF - beq _0803E31E - b _0803E36C - .align 2, 0 -_0803E310: .4byte gActiveBank -_0803E314: .4byte gItemEffectTable -_0803E318: - ldr r5, [sp, 0x8] - cmp r5, 0xAF - bne _0803E372 -_0803E31E: - ldr r0, _0803E340 @ =gMain - ldr r1, _0803E344 @ =0x0000043d - adds r0, r1 - ldrb r1, [r0] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _0803E350 - ldr r0, _0803E348 @ =gActiveBank - ldrb r1, [r0] - lsls r0, r1, 3 - subs r0, r1 - lsls r0, 2 - ldr r1, _0803E34C @ =gUnknown_02024DF8 - adds r0, r1 - b _0803E372 - .align 2, 0 -_0803E340: .4byte gMain -_0803E344: .4byte 0x0000043d -_0803E348: .4byte gActiveBank -_0803E34C: .4byte gUnknown_02024DF8 -_0803E350: - ldr r2, _0803E358 @ =gSaveBlock1 + 0x3676 - str r2, [sp, 0x20] - b _0803E374 - .align 2, 0 -_0803E358: .4byte gSaveBlock1 + 0x3676 -_0803E35C: - mov r0, r8 - movs r2, 0 - ldr r3, [sp, 0xC] - bl BeginEvolutionScene - movs r0, 0 - bl _0803F15C -_0803E36C: - movs r0, 0x1 - bl _0803F15C -_0803E372: - str r0, [sp, 0x20] -_0803E374: - movs r3, 0 - str r3, [sp, 0x18] -_0803E378: - ldr r4, [sp, 0x18] - cmp r4, 0x5 - bls _0803E382 - bl _0803F14C -_0803E382: - lsls r0, r4, 2 - ldr r1, _0803E38C @ =_0803E390 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_0803E38C: .4byte _0803E390 - .align 2, 0 -_0803E390: - .4byte _0803E3A8 - .4byte _0803E474 - .4byte _0803E508 - .4byte _0803E59C - .4byte _0803E77C - .4byte _0803EE1E -_0803E3A8: - ldr r5, [sp, 0x20] - ldr r0, [sp, 0x18] - adds r2, r5, r0 - ldrb r1, [r2] - movs r0, 0x80 - ands r0, r1 - adds r6, r2, 0 - cmp r0, 0 - beq _0803E3F0 - ldr r0, _0803E460 @ =gMain - ldr r1, _0803E464 @ =0x0000043d - adds r0, r1 - ldrb r1, [r0] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _0803E3F0 - ldr r2, [sp, 0x34] - cmp r2, 0x4 - beq _0803E3F0 - ldr r1, _0803E468 @ =gBattleMons - movs r0, 0x58 - muls r0, r2 - adds r1, 0x50 - adds r2, r0, r1 - ldr r1, [r2] - movs r0, 0xF0 - lsls r0, 12 - ands r0, r1 - cmp r0, 0 - beq _0803E3F0 - ldr r0, _0803E46C @ =0xfff0ffff - ands r1, r0 - str r1, [r2] - movs r3, 0 - str r3, [sp, 0x1C] -_0803E3F0: - ldrb r1, [r6] - movs r0, 0x30 - ands r0, r1 - cmp r0, 0 - beq _0803E41E - ldr r1, _0803E468 @ =gBattleMons - ldr r0, _0803E470 @ =gActiveBank - ldrb r2, [r0] - movs r0, 0x58 - muls r0, r2 - adds r1, 0x50 - adds r2, r0, r1 - ldr r1, [r2] - movs r3, 0x80 - lsls r3, 13 - adds r0, r1, 0 - ands r0, r3 - cmp r0, 0 - bne _0803E41E - orrs r1, r3 - str r1, [r2] - movs r4, 0 - str r4, [sp, 0x1C] -_0803E41E: - ldrb r0, [r6] - movs r3, 0xF - ands r3, r0 - cmp r3, 0 - bne _0803E42C - bl _0803F14C -_0803E42C: - ldr r6, _0803E468 @ =gBattleMons - ldr r5, _0803E470 @ =gActiveBank - ldrb r0, [r5] - movs r4, 0x58 - muls r0, r4 - adds r1, r0, r6 - ldrb r2, [r1, 0x19] - movs r0, 0x19 - ldrsb r0, [r1, r0] - cmp r0, 0xB - ble _0803E446 - bl _0803F14C -_0803E446: - adds r0, r2, r3 - strb r0, [r1, 0x19] - ldrb r0, [r5] - muls r0, r4 - adds r1, r0, r6 - movs r0, 0x19 - ldrsb r0, [r1, r0] - cmp r0, 0xC - bgt _0803E45A - b _0803E74E -_0803E45A: - movs r0, 0xC - strb r0, [r1, 0x19] - b _0803E74E - .align 2, 0 -_0803E460: .4byte gMain -_0803E464: .4byte 0x0000043d -_0803E468: .4byte gBattleMons -_0803E46C: .4byte 0xfff0ffff -_0803E470: .4byte gActiveBank -_0803E474: - ldr r0, [sp, 0x20] - ldr r1, [sp, 0x18] - adds r2, r0, r1 - ldrb r1, [r2] - movs r0, 0xF0 - ands r0, r1 - lsls r3, r0, 24 - adds r6, r2, 0 - cmp r3, 0 - beq _0803E4BA - ldr r7, _0803E500 @ =gBattleMons - ldr r5, _0803E504 @ =gActiveBank - ldrb r0, [r5] - movs r4, 0x58 - muls r0, r4 - adds r1, r0, r7 - ldrb r2, [r1, 0x1A] - movs r0, 0x1A - ldrsb r0, [r1, r0] - cmp r0, 0xB - bgt _0803E4BA - lsrs r0, r3, 28 - adds r0, r2, r0 - strb r0, [r1, 0x1A] - ldrb r0, [r5] - muls r0, r4 - adds r1, r0, r7 - movs r0, 0x1A - ldrsb r0, [r1, r0] - cmp r0, 0xC - ble _0803E4B6 - movs r0, 0xC - strb r0, [r1, 0x1A] -_0803E4B6: - movs r2, 0 - str r2, [sp, 0x1C] -_0803E4BA: - ldrb r0, [r6] - movs r3, 0xF - ands r3, r0 - cmp r3, 0 - bne _0803E4C8 - bl _0803F14C -_0803E4C8: - ldr r6, _0803E500 @ =gBattleMons - ldr r5, _0803E504 @ =gActiveBank - ldrb r0, [r5] - movs r4, 0x58 - muls r0, r4 - adds r1, r0, r6 - ldrb r2, [r1, 0x1B] - movs r0, 0x1B - ldrsb r0, [r1, r0] - cmp r0, 0xB - ble _0803E4E2 - bl _0803F14C -_0803E4E2: - adds r0, r2, r3 - strb r0, [r1, 0x1B] - ldrb r0, [r5] - muls r0, r4 - adds r1, r0, r6 - movs r0, 0x1B - ldrsb r0, [r1, r0] - cmp r0, 0xC - ble _0803E4F8 - movs r0, 0xC - strb r0, [r1, 0x1B] -_0803E4F8: - movs r3, 0 - str r3, [sp, 0x1C] - bl _0803F14C - .align 2, 0 -_0803E500: .4byte gBattleMons -_0803E504: .4byte gActiveBank -_0803E508: - ldr r4, [sp, 0x20] - ldr r5, [sp, 0x18] - adds r2, r4, r5 - ldrb r1, [r2] - movs r0, 0xF0 - ands r0, r1 - lsls r3, r0, 24 - adds r6, r2, 0 - cmp r3, 0 - beq _0803E54E - ldr r7, _0803E594 @ =gBattleMons - ldr r5, _0803E598 @ =gActiveBank - ldrb r0, [r5] - movs r4, 0x58 - muls r0, r4 - adds r1, r0, r7 - ldrb r2, [r1, 0x1E] - movs r0, 0x1E - ldrsb r0, [r1, r0] - cmp r0, 0xB - bgt _0803E54E - lsrs r0, r3, 28 - adds r0, r2, r0 - strb r0, [r1, 0x1E] - ldrb r0, [r5] - muls r0, r4 - adds r1, r0, r7 - movs r0, 0x1E - ldrsb r0, [r1, r0] - cmp r0, 0xC - ble _0803E54A - movs r0, 0xC - strb r0, [r1, 0x1E] -_0803E54A: - movs r0, 0 - str r0, [sp, 0x1C] -_0803E54E: - ldrb r0, [r6] - movs r3, 0xF - ands r3, r0 - cmp r3, 0 - bne _0803E55C - bl _0803F14C -_0803E55C: - ldr r6, _0803E594 @ =gBattleMons - ldr r5, _0803E598 @ =gActiveBank - ldrb r0, [r5] - movs r4, 0x58 - muls r0, r4 - adds r1, r0, r6 - ldrb r2, [r1, 0x1C] - movs r0, 0x1C - ldrsb r0, [r1, r0] - cmp r0, 0xB - ble _0803E576 - bl _0803F14C -_0803E576: - adds r0, r2, r3 - strb r0, [r1, 0x1C] - ldrb r0, [r5] - muls r0, r4 - adds r1, r0, r6 - movs r0, 0x1C - ldrsb r0, [r1, r0] - cmp r0, 0xC - ble _0803E58C - movs r0, 0xC - strb r0, [r1, 0x1C] -_0803E58C: - movs r1, 0 - str r1, [sp, 0x1C] - bl _0803F14C - .align 2, 0 -_0803E594: .4byte gBattleMons -_0803E598: .4byte gActiveBank -_0803E59C: - ldr r3, [sp, 0x20] - ldr r4, [sp, 0x18] - adds r2, r3, r4 - ldrb r1, [r2] - movs r0, 0x80 - ands r0, r1 - adds r6, r2, 0 - cmp r0, 0 - beq _0803E5E4 - ldr r5, _0803E758 @ =gSideTimers - ldr r4, _0803E75C @ =gActiveBank - ldrb r0, [r4] - bl GetBankSide - lsls r0, 24 - lsrs r0, 24 - lsls r1, r0, 1 - adds r1, r0 - lsls r1, 2 - adds r1, r5 - ldrb r0, [r1, 0x2] - cmp r0, 0 - bne _0803E5E4 - ldrb r0, [r4] - bl GetBankSide - lsls r0, 24 - lsrs r0, 24 - lsls r1, r0, 1 - adds r1, r0 - lsls r1, 2 - adds r1, r5 - movs r0, 0x5 - strb r0, [r1, 0x2] - movs r5, 0 - str r5, [sp, 0x1C] -_0803E5E4: - ldrb r1, [r6] - movs r0, 0x40 - ands r0, r1 - cmp r0, 0 - beq _0803E646 - mov r0, r8 - movs r1, 0x38 - movs r2, 0 - bl GetMonData - cmp r0, 0x64 - beq _0803E646 - ldr r5, _0803E760 @ =gExperienceTables - mov r0, r8 - movs r1, 0x38 - movs r2, 0 - bl GetMonData - adds r4, r0, 0 - mov r0, r8 - movs r1, 0xB - movs r2, 0 - bl GetMonData - adds r4, 0x1 - lsls r4, 2 - ldr r2, _0803E764 @ =gBaseStats - lsls r1, r0, 3 - subs r1, r0 - lsls r1, 2 - adds r1, r2 - ldrb r1, [r1, 0x13] - movs r0, 0xCA - lsls r0, 1 - muls r0, r1 - adds r4, r0 - adds r4, r5 - ldr r0, [r4] - str r0, [sp] - mov r0, r8 - movs r1, 0x19 - mov r2, sp - bl SetMonData - mov r0, r8 - bl CalculateMonStats - movs r0, 0 - str r0, [sp, 0x1C] -_0803E646: - ldrb r1, [r6] - movs r0, 0x20 - ands r0, r1 - cmp r0, 0 - beq _0803E682 - mov r0, r8 - ldr r1, [sp, 0xC] - movs r2, 0x7 - ldr r3, [sp, 0x34] - bl HealStatusConditions - lsls r0, 24 - cmp r0, 0 - bne _0803E682 - ldr r1, [sp, 0x34] - cmp r1, 0x4 - beq _0803E67E - ldr r1, _0803E768 @ =gBattleMons - movs r0, 0x58 - ldr r3, [sp, 0x34] - adds r2, r3, 0 - muls r2, r0 - adds r1, 0x50 - adds r2, r1 - ldr r0, [r2] - ldr r1, _0803E76C @ =0xf7ffffff - ands r0, r1 - str r0, [r2] -_0803E67E: - movs r4, 0 - str r4, [sp, 0x1C] -_0803E682: - ldrb r1, [r6] - movs r0, 0x10 - ands r0, r1 - cmp r0, 0 - beq _0803E6A2 - ldr r2, _0803E770 @ =0x00000f88 - mov r0, r8 - ldr r1, [sp, 0xC] - ldr r3, [sp, 0x34] - bl HealStatusConditions - lsls r0, 24 - cmp r0, 0 - bne _0803E6A2 - movs r5, 0 - str r5, [sp, 0x1C] -_0803E6A2: - ldrb r1, [r6] - movs r0, 0x8 - ands r0, r1 - cmp r0, 0 - beq _0803E6C2 - mov r0, r8 - ldr r1, [sp, 0xC] - movs r2, 0x10 - ldr r3, [sp, 0x34] - bl HealStatusConditions - lsls r0, 24 - cmp r0, 0 - bne _0803E6C2 - movs r0, 0 - str r0, [sp, 0x1C] -_0803E6C2: - ldrb r1, [r6] - movs r0, 0x4 - ands r0, r1 - cmp r0, 0 - beq _0803E6E2 - mov r0, r8 - ldr r1, [sp, 0xC] - movs r2, 0x20 - ldr r3, [sp, 0x34] - bl HealStatusConditions - lsls r0, 24 - cmp r0, 0 - bne _0803E6E2 - movs r1, 0 - str r1, [sp, 0x1C] -_0803E6E2: - ldrb r1, [r6] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _0803E702 - mov r0, r8 - ldr r1, [sp, 0xC] - movs r2, 0x40 - ldr r3, [sp, 0x34] - bl HealStatusConditions - lsls r0, 24 - cmp r0, 0 - bne _0803E702 - movs r2, 0 - str r2, [sp, 0x1C] -_0803E702: - ldrb r1, [r6] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - bne _0803E710 - bl _0803F14C -_0803E710: - ldr r0, _0803E774 @ =gMain - ldr r3, _0803E778 @ =0x0000043d - adds r0, r3 - ldrb r1, [r0] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _0803E724 - bl _0803F14C -_0803E724: - ldr r4, [sp, 0x34] - cmp r4, 0x4 - bne _0803E72E - bl _0803F14C -_0803E72E: - ldr r1, _0803E768 @ =gBattleMons - movs r0, 0x58 - muls r0, r4 - adds r1, 0x50 - adds r2, r0, r1 - ldr r1, [r2] - movs r0, 0x7 - ands r0, r1 - cmp r0, 0 - bne _0803E746 - bl _0803F14C -_0803E746: - movs r0, 0x8 - negs r0, r0 - ands r1, r0 - str r1, [r2] -_0803E74E: - movs r5, 0 - str r5, [sp, 0x1C] - bl _0803F14C - .align 2, 0 -_0803E758: .4byte gSideTimers -_0803E75C: .4byte gActiveBank -_0803E760: .4byte gExperienceTables -_0803E764: .4byte gBaseStats -_0803E768: .4byte gBattleMons -_0803E76C: .4byte 0xf7ffffff -_0803E770: .4byte 0x00000f88 -_0803E774: .4byte gMain -_0803E778: .4byte 0x0000043d -_0803E77C: - ldr r1, [sp, 0x20] - ldr r2, [sp, 0x18] - adds r0, r1, r2 - ldrb r0, [r0] - mov r10, r0 - movs r0, 0x20 - mov r3, r10 - ands r0, r3 - cmp r0, 0 - beq _0803E854 - movs r0, 0xDF - ands r3, r0 - mov r10, r3 - mov r0, r8 - movs r1, 0x15 - movs r2, 0 - bl GetMonData - ldr r1, _0803E880 @ =gUnknown_08208238 - ldr r4, [sp, 0x10] - adds r1, r4, r1 - ldrb r1, [r1] - ands r0, r1 - lsls r1, r4, 1 - lsrs r0, r1 - str r0, [sp] - adds r5, r4, 0 - adds r5, 0xD - mov r0, r8 - adds r1, r5, 0 - movs r2, 0 - bl GetMonData - adds r4, r0, 0 - lsls r4, 16 - lsrs r4, 16 - mov r0, r8 - movs r1, 0x15 - movs r2, 0 - bl GetMonData - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - adds r0, r4, 0 - ldr r2, [sp, 0x10] - bl CalculatePPWithBonus - lsls r0, 24 - lsrs r0, 24 - str r0, [sp, 0x28] - ldr r0, [sp] - cmp r0, 0x2 - bhi _0803E854 - ldr r0, [sp, 0x28] - cmp r0, 0x4 - bls _0803E854 - mov r0, r8 - movs r1, 0x15 - movs r2, 0 - bl GetMonData - ldr r1, _0803E884 @ =gUnknown_08208240 - ldr r2, [sp, 0x10] - adds r1, r2, r1 - ldrb r1, [r1] - adds r0, r1 - str r0, [sp] - mov r0, r8 - movs r1, 0x15 - mov r2, sp - bl SetMonData - mov r0, r8 - adds r1, r5, 0 - movs r2, 0 - bl GetMonData - lsls r0, 16 - lsrs r0, 16 - ldr r1, [sp] - lsls r1, 24 - lsrs r1, 24 - ldr r2, [sp, 0x10] - bl CalculatePPWithBonus - lsls r0, 24 - lsrs r0, 24 - ldr r3, [sp, 0x28] - subs r0, r3 - str r0, [sp] - ldr r4, [sp, 0x10] - adds r4, 0x11 - mov r0, r8 - adds r1, r4, 0 - movs r2, 0 - bl GetMonData - ldr r1, [sp] - adds r0, r1 - str r0, [sp] - mov r0, r8 - adds r1, r4, 0 - mov r2, sp - bl SetMonData - movs r4, 0 - str r4, [sp, 0x1C] -_0803E854: - movs r5, 0 - str r5, [sp, 0x28] - mov r0, r10 - cmp r0, 0 - bne _0803E862 - bl _0803F14C -_0803E862: - movs r0, 0x1 - mov r1, r10 - ands r0, r1 - cmp r0, 0 - bne _0803E86E - b _0803EE0A -_0803E86E: - ldr r2, [sp, 0x28] - cmp r2, 0x7 - bls _0803E876 - b _0803EE0A -_0803E876: - lsls r0, r2, 2 - ldr r1, _0803E888 @ =_0803E88C - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_0803E880: .4byte gUnknown_08208238 -_0803E884: .4byte gUnknown_08208240 -_0803E888: .4byte _0803E88C - .align 2, 0 -_0803E88C: - .4byte _0803E8AC - .4byte _0803E8AC - .4byte _0803E934 - .4byte _0803EB5C - .4byte _0803EE0A - .4byte _0803EE0A - .4byte _0803EE0A - .4byte _0803EDF4 -_0803E8AC: - mov r0, r8 - bl GetMonEVCount - lsls r0, 16 - lsrs r5, r0, 16 - ldr r0, _0803E8EC @ =0x000001fd - cmp r5, r0 - bls _0803E8BE - b _0803E36C -_0803E8BE: - ldr r0, _0803E8F0 @ =gUnknown_082082F2 - ldr r3, [sp, 0x28] - adds r0, r3, r0 - ldrb r1, [r0] - mov r0, r8 - movs r2, 0 - bl GetMonData - adds r1, r0, 0 - str r1, [sp] - cmp r1, 0x63 - bls _0803E8D8 - b _0803EE0A -_0803E8D8: - ldr r4, [sp, 0x20] - ldr r2, [sp, 0x24] - adds r0, r4, r2 - ldrb r0, [r0] - adds r1, r0 - cmp r1, 0x64 - bls _0803E8F4 - adds r0, 0x64 - subs r4, r0, r1 - b _0803E8F6 - .align 2, 0 -_0803E8EC: .4byte 0x000001fd -_0803E8F0: .4byte gUnknown_082082F2 -_0803E8F4: - adds r4, r0, 0 -_0803E8F6: - adds r1, r5, r4 - movs r0, 0xFF - lsls r0, 1 - cmp r1, r0 - bls _0803E904 - adds r0, r4, r0 - subs r4, r0, r1 -_0803E904: - ldr r0, [sp] - adds r0, r4 - str r0, [sp] - ldr r0, _0803E930 @ =gUnknown_082082F2 - ldr r3, [sp, 0x28] - adds r0, r3, r0 - ldrb r1, [r0] - mov r0, r8 - mov r2, sp - bl SetMonData - mov r0, r8 - bl CalculateMonStats - ldr r0, [sp, 0x24] - adds r0, 0x1 - lsls r0, 24 - lsrs r0, 24 - str r0, [sp, 0x24] - movs r4, 0 - str r4, [sp, 0x1C] - b _0803EE0A - .align 2, 0 -_0803E930: .4byte gUnknown_082082F2 -_0803E934: - movs r0, 0x10 - mov r5, r10 - ands r0, r5 - cmp r0, 0 - beq _0803E9F4 - mov r0, r8 - movs r1, 0x39 - movs r2, 0 - bl GetMonData - cmp r0, 0 - beq _0803E954 - ldr r0, [sp, 0x24] - adds r0, 0x1 - lsls r0, 24 - b _0803EC9E -_0803E954: - ldr r0, _0803E99C @ =gMain - ldr r1, _0803E9A0 @ =0x0000043d - adds r0, r1 - ldrb r1, [r0] - movs r4, 0x2 - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _0803EA0A - ldr r2, [sp, 0x34] - cmp r2, 0x4 - beq _0803E9B4 - ldr r2, _0803E9A4 @ =gAbsentBankFlags - ldr r1, _0803E9A8 @ =gBitTable - ldr r3, [sp, 0x34] - lsls r0, r3, 2 - adds r0, r1 - ldr r1, [r0] - ldrb r0, [r2] - bics r0, r1 - strb r0, [r2] - ldr r1, _0803E9AC @ =gBattlePartyID - lsls r0, r3, 1 - adds r0, r1 - ldrb r0, [r0] - bl pokemon_order_func - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - ldr r0, [sp, 0x34] - bl CopyPlayerPartyMonToBattleData - ldr r0, _0803E9B0 @ =gActiveBank - ldrb r0, [r0] - b _0803E9CC - .align 2, 0 -_0803E99C: .4byte gMain -_0803E9A0: .4byte 0x0000043d -_0803E9A4: .4byte gAbsentBankFlags -_0803E9A8: .4byte gBitTable -_0803E9AC: .4byte gBattlePartyID -_0803E9B0: .4byte gActiveBank -_0803E9B4: - ldr r3, _0803E9E4 @ =gAbsentBankFlags - ldr r1, _0803E9E8 @ =gBitTable - ldr r2, _0803E9EC @ =gActiveBank - ldrb r0, [r2] - eors r0, r4 - lsls r0, 2 - adds r0, r1 - ldr r1, [r0] - ldrb r0, [r3] - bics r0, r1 - strb r0, [r3] - ldrb r0, [r2] -_0803E9CC: - bl GetBankSide - lsls r0, 24 - cmp r0, 0 - bne _0803EA0A - ldr r1, _0803E9F0 @ =gBattleResults - ldrb r0, [r1, 0x4] - cmp r0, 0xFE - bhi _0803EA0A - adds r0, 0x1 - strb r0, [r1, 0x4] - b _0803EA0A - .align 2, 0 -_0803E9E4: .4byte gAbsentBankFlags -_0803E9E8: .4byte gBitTable -_0803E9EC: .4byte gActiveBank -_0803E9F0: .4byte gBattleResults -_0803E9F4: - mov r0, r8 - movs r1, 0x39 - movs r2, 0 - bl GetMonData - cmp r0, 0 - bne _0803EA0A - ldr r0, [sp, 0x24] - adds r0, 0x1 - lsls r0, 24 - b _0803EC9E -_0803EA0A: - ldr r1, [sp, 0x24] - adds r0, r1, 0x1 - lsls r0, 24 - lsrs r0, 24 - str r0, [sp, 0x24] - ldr r4, [sp, 0x20] - adds r1, r4, r1 - ldrb r1, [r1] - str r1, [sp] - adds r0, r1, 0 - cmp r0, 0xFE - beq _0803EA4C - cmp r0, 0xFE - bhi _0803EA2C - cmp r0, 0xFD - beq _0803EA62 - b _0803EA6C -_0803EA2C: - cmp r1, 0xFF - bne _0803EA6C - mov r0, r8 - movs r1, 0x3A - movs r2, 0 - bl GetMonData - adds r4, r0, 0 - mov r0, r8 - movs r1, 0x39 - movs r2, 0 - bl GetMonData - subs r4, r0 - str r4, [sp] - b _0803EA6C -_0803EA4C: - mov r0, r8 - movs r1, 0x3A - movs r2, 0 - bl GetMonData - lsrs r0, 1 - str r0, [sp] - cmp r0, 0 - bne _0803EA6C - movs r0, 0x1 - b _0803EA6A -_0803EA62: - ldr r0, _0803EB24 @ =gSharedMem - ldr r5, _0803EB28 @ =0x000160fa - adds r0, r5 - ldrb r0, [r0] -_0803EA6A: - str r0, [sp] -_0803EA6C: - mov r0, r8 - movs r1, 0x3A - movs r2, 0 - bl GetMonData - adds r4, r0, 0 - mov r0, r8 - movs r1, 0x39 - movs r2, 0 - bl GetMonData - cmp r4, r0 - beq _0803EB4C - ldr r0, [sp, 0x14] - cmp r0, 0 - bne _0803EB40 - mov r0, r8 - movs r1, 0x39 - movs r2, 0 - bl GetMonData - ldr r1, [sp] - adds r0, r1 - str r0, [sp] - mov r0, r8 - movs r1, 0x3A - movs r2, 0 - bl GetMonData - ldr r1, [sp] - cmp r1, r0 - bls _0803EAB8 - mov r0, r8 - movs r1, 0x3A - movs r2, 0 - bl GetMonData - str r0, [sp] -_0803EAB8: - mov r0, r8 - movs r1, 0x39 - mov r2, sp - bl SetMonData - ldr r0, _0803EB2C @ =gMain - ldr r1, _0803EB30 @ =0x0000043d - adds r0, r1 - ldrb r1, [r0] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _0803EB48 - ldr r2, [sp, 0x34] - cmp r2, 0x4 - beq _0803EB48 - ldr r1, _0803EB34 @ =gBattleMons - movs r0, 0x58 - muls r0, r2 - adds r0, r1 - ldr r1, [sp] - strh r1, [r0, 0x28] - movs r0, 0x10 - mov r3, r10 - ands r0, r3 - cmp r0, 0 - bne _0803EB48 - ldr r4, _0803EB38 @ =gActiveBank - ldrb r0, [r4] - bl GetBankSide - lsls r0, 24 - cmp r0, 0 - bne _0803EB48 - ldr r1, _0803EB3C @ =gBattleResults - ldrb r0, [r1, 0x3] - cmp r0, 0xFE - bhi _0803EB08 - adds r0, 0x1 - strb r0, [r1, 0x3] -_0803EB08: - ldrb r5, [r4] - add r0, sp, 0x34 - ldrb r0, [r0] - strb r0, [r4] - movs r0, 0 - movs r1, 0 - movs r2, 0 - bl EmitGetAttributes - ldrb r0, [r4] - bl MarkBufferBankForExecution - strb r5, [r4] - b _0803EB48 - .align 2, 0 -_0803EB24: .4byte gSharedMem -_0803EB28: .4byte 0x000160fa -_0803EB2C: .4byte gMain -_0803EB30: .4byte 0x0000043d -_0803EB34: .4byte gBattleMons -_0803EB38: .4byte gActiveBank -_0803EB3C: .4byte gBattleResults -_0803EB40: - ldr r1, _0803EB58 @ =gBattleMoveDamage - ldr r0, [sp] - negs r0, r0 - str r0, [r1] -_0803EB48: - movs r1, 0 - str r1, [sp, 0x1C] -_0803EB4C: - movs r0, 0xEF - mov r2, r10 - ands r2, r0 - mov r10, r2 - b _0803EE0A - .align 2, 0 -_0803EB58: .4byte gBattleMoveDamage -_0803EB5C: - movs r7, 0x2 - mov r0, r10 - ands r0, r7 - cmp r0, 0 - beq _0803EB68 - b _0803ECB8 -_0803EB68: - movs r5, 0 - ldr r3, [sp, 0x24] - adds r3, 0x1 - str r3, [sp, 0x38] -_0803EB70: - movs r4, 0x11 - adds r4, r5 - mov r9, r4 - mov r0, r8 - mov r1, r9 - movs r2, 0 - bl GetMonData - str r0, [sp] - adds r7, r5, 0 - adds r7, 0xD - mov r0, r8 - adds r1, r7, 0 - movs r2, 0 - bl GetMonData - adds r4, r0, 0 - lsls r4, 16 - lsrs r4, 16 - mov r0, r8 - movs r1, 0x15 - movs r2, 0 - bl GetMonData - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - lsls r0, r5, 24 - lsrs r6, r0, 24 - adds r0, r4, 0 - adds r2, r6, 0 - bl CalculatePPWithBonus - lsls r0, 24 - lsrs r0, 24 - ldr r1, [sp] - cmp r1, r0 - beq _0803EC92 - ldr r2, [sp, 0x20] - ldr r3, [sp, 0x24] - adds r0, r2, r3 - ldrb r0, [r0] - adds r0, r1, r0 - str r0, [sp] - mov r0, r8 - adds r1, r7, 0 - movs r2, 0 - bl GetMonData - adds r4, r0, 0 - lsls r4, 16 - lsrs r4, 16 - mov r0, r8 - movs r1, 0x15 - movs r2, 0 - bl GetMonData - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - adds r0, r4, 0 - adds r2, r6, 0 - bl CalculatePPWithBonus - lsls r0, 24 - lsrs r0, 24 - ldr r1, [sp] - cmp r1, r0 - bls _0803EC28 - mov r0, r8 - adds r1, r7, 0 - movs r2, 0 - bl GetMonData - adds r4, r0, 0 - lsls r4, 16 - lsrs r4, 16 - mov r0, r8 - movs r1, 0x15 - movs r2, 0 - bl GetMonData - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - adds r0, r4, 0 - adds r2, r6, 0 - bl CalculatePPWithBonus - lsls r0, 24 - lsrs r0, 24 - str r0, [sp] -_0803EC28: - mov r0, r8 - mov r1, r9 - mov r2, sp - bl SetMonData - ldr r0, _0803ECA4 @ =gMain - ldr r4, _0803ECA8 @ =0x0000043d - adds r0, r4 - ldrb r1, [r0] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _0803EC8E - ldr r0, [sp, 0x34] - cmp r0, 0x4 - beq _0803EC8E - ldr r4, _0803ECAC @ =gBattleMons - movs r0, 0x58 - ldr r1, [sp, 0x34] - adds r3, r1, 0 - muls r3, r0 - adds r0, r4, 0 - adds r0, 0x50 - adds r0, r3, r0 - ldr r1, [r0] - movs r0, 0x80 - lsls r0, 14 - ands r1, r0 - cmp r1, 0 - bne _0803EC8E - ldr r1, _0803ECB0 @ =gDisableStructs - ldr r2, [sp, 0x34] - lsls r0, r2, 3 - subs r0, r2 - lsls r0, 2 - adds r0, r1 - ldrb r1, [r0, 0x18] - lsrs r1, 4 - ldr r2, _0803ECB4 @ =gBitTable - lsls r0, r5, 2 - adds r0, r2 - ldr r0, [r0] - ands r1, r0 - cmp r1, 0 - bne _0803EC8E - adds r0, r5, r3 - adds r1, r4, 0 - adds r1, 0x24 - adds r0, r1 - ldr r1, [sp] - strb r1, [r0] -_0803EC8E: - movs r3, 0 - str r3, [sp, 0x1C] -_0803EC92: - adds r5, 0x1 - cmp r5, 0x3 - bgt _0803EC9A - b _0803EB70 -_0803EC9A: - ldr r4, [sp, 0x38] - lsls r0, r4, 24 -_0803EC9E: - lsrs r0, 24 - str r0, [sp, 0x24] - b _0803EE0A - .align 2, 0 -_0803ECA4: .4byte gMain -_0803ECA8: .4byte 0x0000043d -_0803ECAC: .4byte gBattleMons -_0803ECB0: .4byte gDisableStructs -_0803ECB4: .4byte gBitTable -_0803ECB8: - ldr r6, [sp, 0x10] - adds r6, 0x11 - mov r0, r8 - adds r1, r6, 0 - movs r2, 0 - bl GetMonData - str r0, [sp] - ldr r5, [sp, 0x10] - adds r5, 0xD - mov r0, r8 - adds r1, r5, 0 - movs r2, 0 - bl GetMonData - adds r4, r0, 0 - lsls r4, 16 - lsrs r4, 16 - mov r0, r8 - movs r1, 0x15 - movs r2, 0 - bl GetMonData - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - adds r0, r4, 0 - ldr r2, [sp, 0x10] - bl CalculatePPWithBonus - lsls r0, 24 - lsrs r0, 24 - ldr r2, [sp] - cmp r2, r0 - bne _0803ED00 - b _0803EE0A -_0803ED00: - ldr r1, [sp, 0x24] - adds r0, r1, 0x1 - lsls r0, 24 - lsrs r0, 24 - str r0, [sp, 0x24] - ldr r0, [sp, 0x20] - adds r1, r0, r1 - ldrb r0, [r1] - adds r0, r2, r0 - str r0, [sp] - mov r0, r8 - adds r1, r5, 0 - movs r2, 0 - bl GetMonData - adds r4, r0, 0 - lsls r4, 16 - lsrs r4, 16 - mov r0, r8 - movs r1, 0x15 - movs r2, 0 - bl GetMonData - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - adds r0, r4, 0 - ldr r2, [sp, 0x10] - bl CalculatePPWithBonus - lsls r0, 24 - lsrs r0, 24 - ldr r1, [sp] - cmp r1, r0 - bls _0803ED74 - mov r0, r8 - adds r1, r5, 0 - movs r2, 0 - bl GetMonData - adds r4, r0, 0 - lsls r4, 16 - lsrs r4, 16 - mov r0, r8 - movs r1, 0x15 - movs r2, 0 - bl GetMonData - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - adds r0, r4, 0 - ldr r2, [sp, 0x10] - bl CalculatePPWithBonus - lsls r0, 24 - lsrs r0, 24 - str r0, [sp] -_0803ED74: - mov r0, r8 - adds r1, r6, 0 - mov r2, sp - bl SetMonData - ldr r0, _0803EDE0 @ =gMain - ldr r1, _0803EDE4 @ =0x0000043d - adds r0, r1 - ldrb r1, [r0] - adds r0, r7, 0 - ands r0, r1 - cmp r0, 0 - beq _0803EDD8 - ldr r2, [sp, 0x34] - cmp r2, 0x4 - beq _0803EDD8 - ldr r4, _0803EDE8 @ =gBattleMons - movs r0, 0x58 - adds r3, r2, 0 - muls r3, r0 - adds r0, r4, 0 - adds r0, 0x50 - adds r0, r3, r0 - ldr r0, [r0] - movs r1, 0x80 - lsls r1, 14 - ands r0, r1 - cmp r0, 0 - bne _0803EDD8 - ldr r1, _0803EDEC @ =gDisableStructs - lsls r0, r2, 3 - subs r0, r2 - lsls r0, 2 - adds r0, r1 - ldrb r1, [r0, 0x18] - lsrs r1, 4 - ldr r2, _0803EDF0 @ =gBitTable - ldr r5, [sp, 0x10] - lsls r0, r5, 2 - adds r0, r2 - ldr r0, [r0] - ands r1, r0 - cmp r1, 0 - bne _0803EDD8 - adds r0, r5, r3 - adds r1, r4, 0 - adds r1, 0x24 - adds r0, r1 - ldr r1, [sp] - strb r1, [r0] -_0803EDD8: - movs r0, 0 - str r0, [sp, 0x1C] - b _0803EE0A - .align 2, 0 -_0803EDE0: .4byte gMain -_0803EDE4: .4byte 0x0000043d -_0803EDE8: .4byte gBattleMons -_0803EDEC: .4byte gDisableStructs -_0803EDF0: .4byte gBitTable -_0803EDF4: - mov r0, r8 - movs r1, 0x2 - ldr r2, [sp, 0x8] - bl GetEvolutionTargetSpecies - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - beq _0803EE0A - bl _0803E35C -_0803EE0A: - ldr r1, [sp, 0x28] - adds r1, 0x1 - str r1, [sp, 0x28] - mov r2, r10 - lsrs r2, 1 - mov r10, r2 - cmp r2, 0 - beq _0803EE1C - b _0803E862 -_0803EE1C: - b _0803F14C -_0803EE1E: - ldr r3, [sp, 0x20] - ldr r4, [sp, 0x18] - adds r0, r3, r4 - ldrb r0, [r0] - mov r10, r0 - movs r5, 0 - str r5, [sp, 0x28] - cmp r0, 0 - bne _0803EE32 - b _0803F14C -_0803EE32: - movs r0, 0x1 - mov r1, r10 - ands r0, r1 - cmp r0, 0 - bne _0803EE3E - b _0803F13A -_0803EE3E: - ldr r2, [sp, 0x28] - cmp r2, 0x7 - bls _0803EE46 - b _0803F13A -_0803EE46: - lsls r0, r2, 2 - ldr r1, _0803EE50 @ =_0803EE54 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_0803EE50: .4byte _0803EE54 - .align 2, 0 -_0803EE54: - .4byte _0803EE74 - .4byte _0803EE74 - .4byte _0803EE74 - .4byte _0803EE74 - .4byte _0803EEF8 - .4byte _0803EFCC - .4byte _0803F026 - .4byte _0803F07C -_0803EE74: - mov r0, r8 - bl GetMonEVCount - lsls r0, 16 - lsrs r5, r0, 16 - ldr r0, _0803EEBC @ =0x000001fd - cmp r5, r0 - bls _0803EE88 - bl _0803E36C -_0803EE88: - ldr r0, _0803EEC0 @ =gUnknown_082082F2 - ldr r4, [sp, 0x28] - adds r4, 0x2 - adds r0, r4, r0 - ldrb r1, [r0] - mov r0, r8 - movs r2, 0 - bl GetMonData - adds r1, r0, 0 - str r1, [sp] - adds r2, r4, 0 - cmp r1, 0x63 - bls _0803EEA6 - b _0803F13A -_0803EEA6: - ldr r3, [sp, 0x20] - ldr r4, [sp, 0x24] - adds r0, r3, r4 - ldrb r0, [r0] - adds r1, r0 - cmp r1, 0x64 - bls _0803EEC4 - adds r0, 0x64 - subs r4, r0, r1 - b _0803EEC6 - .align 2, 0 -_0803EEBC: .4byte 0x000001fd -_0803EEC0: .4byte gUnknown_082082F2 -_0803EEC4: - adds r4, r0, 0 -_0803EEC6: - adds r1, r5, r4 - movs r0, 0xFF - lsls r0, 1 - cmp r1, r0 - bls _0803EED4 - adds r0, r4, r0 - subs r4, r0, r1 -_0803EED4: - ldr r0, [sp] - adds r0, r4 - str r0, [sp] - ldr r0, _0803EEF4 @ =gUnknown_082082F2 - adds r0, r2, r0 - ldrb r1, [r0] - mov r0, r8 - mov r2, sp - bl SetMonData - mov r0, r8 - bl CalculateMonStats - movs r5, 0 - str r5, [sp, 0x1C] - b _0803F130 - .align 2, 0 -_0803EEF4: .4byte gUnknown_082082F2 -_0803EEF8: - mov r0, r8 - movs r1, 0x15 - movs r2, 0 - bl GetMonData - ldr r1, _0803EFC0 @ =gUnknown_08208238 - ldr r2, [sp, 0x10] - adds r1, r2, r1 - ldrb r1, [r1] - ands r0, r1 - lsls r1, r2, 1 - lsrs r0, r1 - str r0, [sp] - cmp r0, 0x2 - bls _0803EF18 - b _0803F13A -_0803EF18: - adds r5, r2, 0 - adds r5, 0xD - mov r0, r8 - adds r1, r5, 0 - movs r2, 0 - bl GetMonData - adds r4, r0, 0 - lsls r4, 16 - lsrs r4, 16 - mov r0, r8 - movs r1, 0x15 - movs r2, 0 - bl GetMonData - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - adds r0, r4, 0 - ldr r2, [sp, 0x10] - bl CalculatePPWithBonus - lsls r0, 24 - lsrs r4, r0, 24 - mov r0, r8 - movs r1, 0x15 - movs r2, 0 - bl GetMonData - str r0, [sp] - ldr r1, _0803EFC4 @ =gUnknown_0820823C - ldr r3, [sp, 0x10] - adds r1, r3, r1 - ldrb r2, [r1] - ands r2, r0 - str r2, [sp] - ldr r0, _0803EFC8 @ =gUnknown_08208240 - adds r0, r3, r0 - ldrb r1, [r0] - lsls r0, r1, 1 - adds r0, r1 - adds r2, r0 - str r2, [sp] - mov r0, r8 - movs r1, 0x15 - mov r2, sp - bl SetMonData - mov r0, r8 - adds r1, r5, 0 - movs r2, 0 - bl GetMonData - lsls r0, 16 - lsrs r0, 16 - ldr r1, [sp] - lsls r1, 24 - lsrs r1, 24 - ldr r2, [sp, 0x10] - bl CalculatePPWithBonus - lsls r0, 24 - lsrs r0, 24 - subs r0, r4 - str r0, [sp] - ldr r4, [sp, 0x10] - adds r4, 0x11 - mov r0, r8 - adds r1, r4, 0 - movs r2, 0 - bl GetMonData - ldr r1, [sp] - adds r0, r1 - str r0, [sp] - mov r0, r8 - adds r1, r4, 0 - mov r2, sp - bl SetMonData - movs r4, 0 - str r4, [sp, 0x1C] - b _0803F13A - .align 2, 0 -_0803EFC0: .4byte gUnknown_08208238 -_0803EFC4: .4byte gUnknown_0820823C -_0803EFC8: .4byte gUnknown_08208240 -_0803EFCC: - mov r0, r8 - movs r1, 0x20 - movs r2, 0 - bl GetMonData - cmp r0, 0x63 - bls _0803EFDC - b _0803F130 -_0803EFDC: - ldr r5, [sp, 0x1C] - cmp r5, 0 - beq _0803EFE4 - b _0803F130 -_0803EFE4: - ldr r0, [sp, 0x2C] - cmp r0, 0 - beq _0803EFEC - b _0803F130 -_0803EFEC: - ldr r1, [sp, 0x20] - ldr r2, [sp, 0x24] - adds r0, r1, r2 - ldrb r0, [r0] - str r0, [sp, 0x2C] - mov r0, r8 - movs r1, 0x20 - movs r2, 0 - bl GetMonData - adds r5, r0, 0 - str r5, [sp, 0x4] - ldr r3, [sp, 0x2C] - lsls r4, r3, 24 - asrs r1, r4, 24 - cmp r1, 0 - ble _0803F0D0 - ldr r0, [sp, 0x30] - cmp r0, 0x1B - bne _0803F0D0 - movs r0, 0x96 - muls r0, r1 - movs r1, 0x64 - bl __divsi3 - adds r0, r5, r0 - str r0, [sp, 0x4] - adds r2, r4, 0 - b _0803F0DC -_0803F026: - mov r0, r8 - movs r1, 0x20 - movs r2, 0 - bl GetMonData - cmp r0, 0x63 - bls _0803F130 - mov r0, r8 - movs r1, 0x20 - movs r2, 0 - bl GetMonData - cmp r0, 0xC7 - bhi _0803F130 - ldr r2, [sp, 0x1C] - cmp r2, 0 - bne _0803F130 - ldr r3, [sp, 0x2C] - cmp r3, 0 - bne _0803F130 - ldr r4, [sp, 0x20] - ldr r5, [sp, 0x24] - adds r0, r4, r5 - ldrb r0, [r0] - str r0, [sp, 0x2C] - mov r0, r8 - movs r1, 0x20 - movs r2, 0 - bl GetMonData - adds r4, r0, 0 - str r4, [sp, 0x4] - ldr r0, [sp, 0x2C] - lsls r5, r0, 24 - asrs r1, r5, 24 - cmp r1, 0 - ble _0803F076 - ldr r2, [sp, 0x30] - cmp r2, 0x1B - beq _0803F0BE -_0803F076: - ldr r3, [sp, 0x2C] - lsls r2, r3, 24 - b _0803F0D4 -_0803F07C: - mov r0, r8 - movs r1, 0x20 - movs r2, 0 - bl GetMonData - cmp r0, 0xC7 - bls _0803F130 - ldr r4, [sp, 0x1C] - cmp r4, 0 - bne _0803F130 - ldr r5, [sp, 0x2C] - cmp r5, 0 - bne _0803F130 - ldr r1, [sp, 0x20] - ldr r2, [sp, 0x24] - adds r0, r1, r2 - ldrb r0, [r0] - str r0, [sp, 0x2C] - mov r0, r8 - movs r1, 0x20 - movs r2, 0 - bl GetMonData - adds r4, r0, 0 - str r4, [sp, 0x4] - ldr r3, [sp, 0x2C] - lsls r5, r3, 24 - asrs r1, r5, 24 - cmp r1, 0 - ble _0803F0D0 - ldr r0, [sp, 0x30] - cmp r0, 0x1B - bne _0803F0D0 -_0803F0BE: - movs r0, 0x96 - muls r0, r1 - movs r1, 0x64 - bl __divsi3 - adds r0, r4, r0 - str r0, [sp, 0x4] - adds r2, r5, 0 - b _0803F0DC -_0803F0D0: - ldr r1, [sp, 0x2C] - lsls r2, r1, 24 -_0803F0D4: - asrs r1, r2, 24 - ldr r0, [sp, 0x4] - adds r0, r1 - str r0, [sp, 0x4] -_0803F0DC: - cmp r2, 0 - ble _0803F112 - mov r0, r8 - movs r1, 0x26 - movs r2, 0 - bl GetMonData - cmp r0, 0xB - bne _0803F0F4 - ldr r0, [sp, 0x4] - adds r0, 0x1 - str r0, [sp, 0x4] -_0803F0F4: - mov r0, r8 - movs r1, 0x23 - movs r2, 0 - bl GetMonData - adds r4, r0, 0 - bl sav1_map_get_name - lsls r0, 24 - lsrs r0, 24 - cmp r4, r0 - bne _0803F112 - ldr r0, [sp, 0x4] - adds r0, 0x1 - str r0, [sp, 0x4] -_0803F112: - ldr r0, [sp, 0x4] - cmp r0, 0 - bge _0803F11C - movs r0, 0 - str r0, [sp, 0x4] -_0803F11C: - ldr r0, [sp, 0x4] - cmp r0, 0xFF - ble _0803F126 - movs r0, 0xFF - str r0, [sp, 0x4] -_0803F126: - add r2, sp, 0x4 - mov r0, r8 - movs r1, 0x20 - bl SetMonData -_0803F130: - ldr r0, [sp, 0x24] - adds r0, 0x1 - lsls r0, 24 - lsrs r0, 24 - str r0, [sp, 0x24] -_0803F13A: - ldr r2, [sp, 0x28] - adds r2, 0x1 - str r2, [sp, 0x28] - mov r3, r10 - lsrs r3, 1 - mov r10, r3 - cmp r3, 0 - beq _0803F14C - b _0803EE32 -_0803F14C: - ldr r4, [sp, 0x18] - adds r4, 0x1 - str r4, [sp, 0x18] - cmp r4, 0x5 - bgt _0803F15A - bl _0803E378 -_0803F15A: - ldr r0, [sp, 0x1C] -_0803F15C: - add sp, 0x3C - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_803E1B0 - .align 2, 0 @ Don't pad with nop. diff --git a/src/pokemon/pokemon_item_effect.c b/src/pokemon/pokemon_item_effect.c index 92bf01171..ae24db061 100644 --- a/src/pokemon/pokemon_item_effect.c +++ b/src/pokemon/pokemon_item_effect.c @@ -97,7 +97,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) sp34 = 4; } //_0803E2F4 - + if (b < 13 || b > 0xB2) return 1; if (gItemEffectTable[b - 13] == NULL && b != 0xAF) @@ -163,7 +163,6 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) if (gBattleMons[gActiveBank].statStages[3] > 12) gBattleMons[gActiveBank].statStages[3] = 12; sp1C = 0; - //asm(""); } break; case 2: @@ -244,7 +243,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) SetMonData(pkmn, MON_DATA_PP_BONUSES, &sp0); sp0 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + d, NULL), sp0, d) - sp28; - sp0 += GetMonData(pkmn, MON_DATA_PP1 + d, NULL); + sp0 = GetMonData(pkmn, MON_DATA_PP1 + d, NULL) + sp0; SetMonData(pkmn, MON_DATA_PP1 + d, &sp0); sp1C = 0; } @@ -255,7 +254,8 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) { if (r10 & 1) { - s32 r5; // TODO: the ev count is a separate variable + u16 evCount; + s32 r5; u32 r1; switch (sp28) @@ -263,8 +263,8 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) case 0: case 1: //_0803E8AC - r5 = GetMonEVCount(pkmn); - if (r5 >= 510) + evCount = GetMonEVCount(pkmn); + if (evCount >= 510) return 1; r1 = GetMonData(pkmn, gUnknown_082082F2[sp28], NULL); sp0 = r1; @@ -274,7 +274,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) r4 = 100 - (r1 + sp20[sp24]) + sp20[sp24]; else r4 = sp20[sp24]; - r1 = r5 + r4; + r1 = evCount + r4; if (r1 > 510) r4 += 510 - r1; sp0 += r4; @@ -282,7 +282,6 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) CalculateMonStats(pkmn); sp24++; sp1C = 0; - //asm(""); } break; case 2: @@ -347,7 +346,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) { if (e == 0) { - sp0 += GetMonData(pkmn, MON_DATA_HP, NULL); + sp0 = GetMonData(pkmn, MON_DATA_HP, NULL) + sp0; if (sp0 > GetMonData(pkmn, MON_DATA_MAX_HP, NULL)) sp0 = GetMonData(pkmn, MON_DATA_MAX_HP, NULL); //_0803EAB8 @@ -357,10 +356,9 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) gBattleMons[sp34].hp = sp0; if (!(r10 & 0x10) && GetBankSide(gActiveBank) == 0) { - u8 r5; - if (gBattleResults.unk3 < 255) gBattleResults.unk3++; + // I have to re-use this variable to match. r5 = gActiveBank; gActiveBank = sp34; EmitGetAttributes(0, 0, 0); @@ -444,7 +442,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) case 7: //_0803EDF4 { - u16 targetSpecies = GetEvolutionTargetSpecies(pkmn, 2, d); + u16 targetSpecies = GetEvolutionTargetSpecies(pkmn, 2, b); if (targetSpecies != SPECIES_NONE) { @@ -471,7 +469,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) { u16 r5; u32 r1; - + switch (sp28) { case 0: @@ -510,11 +508,11 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) sp0 = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL); sp0 &= gUnknown_0820823C[d]; sp0 += gUnknown_08208240[d] * 3; - + SetMonData(pkmn, MON_DATA_PP_BONUSES, &sp0); sp0 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + d, NULL), sp0, d) - r4; - sp0 += GetMonData(pkmn, MON_DATA_PP1 + b, NULL); - SetMonData(pkmn, MON_DATA_PP1 + b, &sp0); + sp0 = GetMonData(pkmn, MON_DATA_PP1 + d, NULL) + sp0; + SetMonData(pkmn, MON_DATA_PP1 + d, &sp0); sp1C = 0; } break; @@ -535,7 +533,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) sp4 += sp2C; } //_0803F0DC (tail merged) - + if (sp2C > 0) { if (GetMonData(pkmn, MON_DATA_POKEBALL, NULL) == 11) @@ -564,14 +562,14 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) if (sp2C > 0 && sp30 == 0x1B) { //to _0803F0BE - sp4 = 150 * sp2C / 100; + sp4 += 150 * sp2C / 100; } else { sp4 += sp2C; } //_0803F0DC (tail merged) - + if (sp2C > 0) { if (GetMonData(pkmn, MON_DATA_POKEBALL, NULL) == 11) @@ -599,7 +597,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) if (sp2C > 0 && sp30 == 0x1B) { //_0803F0BE - sp4 = 150 * sp2C / 100; + sp4 += 150 * sp2C / 100; } //_0803F0D0 else @@ -607,7 +605,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) sp4 += sp2C; } //_0803F0DC - + if (sp2C > 0) { if (GetMonData(pkmn, MON_DATA_POKEBALL, NULL) == 11) -- cgit v1.2.3 From 3295ffbd5bcd75d586e3f6dde7469cad1fce2c85 Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Mon, 15 Jan 2018 17:36:16 -0600 Subject: clean up pokemon_item_effect.c --- asm/pokemon_item_effect.s | 8 - include/constants/items.h | 15 ++ include/pokemon.h | 2 + ld_script.txt | 1 - src/battle/battle_4.c | 4 +- src/pokemon/pokemon_item_effect.c | 539 ++++++++++++++++---------------------- 6 files changed, 245 insertions(+), 324 deletions(-) delete mode 100644 asm/pokemon_item_effect.s diff --git a/asm/pokemon_item_effect.s b/asm/pokemon_item_effect.s deleted file mode 100644 index c3461fa64..000000000 --- a/asm/pokemon_item_effect.s +++ /dev/null @@ -1,8 +0,0 @@ - .include "constants/gba_constants.inc" - .include "include/macros.inc" - - .syntax unified - - .text - - .align 2, 0 @ Don't pad with nop. diff --git a/include/constants/items.h b/include/constants/items.h index cde5c7141..9b88db1da 100644 --- a/include/constants/items.h +++ b/include/constants/items.h @@ -2,6 +2,8 @@ #define GUARD_CONSTANTS_ITEMS_H #define ITEM_NONE 0 + +// Balls #define ITEM_MASTER_BALL 1 #define ITEM_ULTRA_BALL 2 #define ITEM_GREAT_BALL 3 @@ -14,6 +16,8 @@ #define ITEM_TIMER_BALL 10 #define ITEM_LUXURY_BALL 11 #define ITEM_PREMIER_BALL 12 + +// Pokemon Items #define ITEM_POTION 13 #define ITEM_ANTIDOTE 14 #define ITEM_BURN_HEAL 15 @@ -180,6 +184,8 @@ #define ITEM_0B0 176 #define ITEM_0B1 177 #define ITEM_0B2 178 + +// hold items #define ITEM_BRIGHT_POWDER 179 #define ITEM_WHITE_HERB 180 #define ITEM_MACHO_BRACE 181 @@ -260,6 +266,8 @@ #define ITEM_PINK_SCARF 256 #define ITEM_GREEN_SCARF 257 #define ITEM_YELLOW_SCARF 258 + +// Key Items #define ITEM_MACH_BIKE 259 #define ITEM_COIN_CASE 260 #define ITEM_ITEMFINDER 261 @@ -290,6 +298,8 @@ #define ITEM_ROOT_FOSSIL 286 #define ITEM_CLAW_FOSSIL 287 #define ITEM_DEVON_SCOPE 288 + +// TMs/HMs #define ITEM_TM01_FOCUS_PUNCH 289 #define ITEM_TM02_DRAGON_CLAW 290 #define ITEM_TM03_WATER_PULSE 291 @@ -348,6 +358,8 @@ #define ITEM_HM06_ROCK_SMASH 344 #define ITEM_HM07_WATERFALL 345 #define ITEM_HM08_DIVE 346 + +// Unknown #define ITEM_15B 347 #define ITEM_15C 348 @@ -386,4 +398,7 @@ #define NUM_TECHNICAL_MACHINES 50 #define NUM_HIDDEN_MACHINES 8 +// Check if the item is one that can be used on a Pokemon. +#define IS_POKEMON_ITEM(item) ((item) >= ITEM_POTION && (item) <= ITEM_0B2) + #endif // GUARD_CONSTANTS_ITEMS_H diff --git a/include/pokemon.h b/include/pokemon.h index 874ad7e09..8f1b46387 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -351,6 +351,8 @@ struct BattlePokemon /*0x54*/ u32 otId; }; +// Shouldn't these be the same enum? + enum { STAT_STAGE_HP, // 0 diff --git a/ld_script.txt b/ld_script.txt index 3a6305509..7bc64638c 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -62,7 +62,6 @@ SECTIONS { src/battle/calculate_base_damage.o(.text); src/pokemon/pokemon_2.o(.text); src/pokemon/pokemon_item_effect.o(.text); - asm/pokemon_item_effect.o(.text); src/pokemon/pokemon_3.o(.text); src/de_rom_8040FE0.o(.text); src/engine/trig.o(.text); diff --git a/src/battle/battle_4.c b/src/battle/battle_4.c index ae8f94130..6b048f0ab 100644 --- a/src/battle/battle_4.c +++ b/src/battle/battle_4.c @@ -147,7 +147,7 @@ void ReshowBattleScreenAfterMenu(void); void BattleMainCB2(void); void AddMoney(u32* moneySaveblock, u32 to_give); u8 CountAliveMons(u8 caseID); -void sub_803E1B0(struct Pokemon*, u16 item, u8 partyID, u8 r3, u8 sp); +void PokemonUseItemEffects(struct Pokemon*, u16 item, u8 partyID, u8 r3, u8 sp); u8 CanRunFromBattle(void); u8 GetMoveTarget(u16 move, u8 targetbyte); //get target of move u8 CastformDataTypeChange(u8 bank); @@ -11996,7 +11996,7 @@ static void atk74_hpthresholds2(void) static void atk75_useitemonopponent(void) { gBankInMenu = gBankAttacker; - sub_803E1B0(&gEnemyParty[gBattlePartyID[gBankAttacker]], gLastUsedItem, gBattlePartyID[gBankAttacker], 0, 1); + PokemonUseItemEffects(&gEnemyParty[gBattlePartyID[gBankAttacker]], gLastUsedItem, gBattlePartyID[gBankAttacker], 0, 1); gBattlescriptCurrInstr += 1; } diff --git a/src/pokemon/pokemon_item_effect.c b/src/pokemon/pokemon_item_effect.c index ae24db061..4ebece3b3 100644 --- a/src/pokemon/pokemon_item_effect.c +++ b/src/pokemon/pokemon_item_effect.c @@ -1,4 +1,6 @@ #include "global.h" +#include "constants/battle_constants.h" +#include "constants/hold_effects.h" #include "constants/items.h" #include "constants/species.h" #include "battle.h" @@ -23,7 +25,7 @@ extern u8 gStringBank; extern struct BattlePokemon gBattleMons[]; extern struct BattleEnigmaBerry gEnigmaBerries[]; -const u8 gUnknown_082082F2[] = +static const u8 sGetMonDataEVConstants[] = { MON_DATA_HP_EV, MON_DATA_ATK_EV, @@ -37,218 +39,201 @@ extern u8 gUnknown_08208238[]; extern u8 gUnknown_0820823C[]; extern u8 gUnknown_08208240[]; -bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e); +bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 moveIndex, u8 e); -bool8 ExecuteTableBasedItemEffect_(struct Pokemon *pkmn, u16 b, u8 c, u8 d) +bool8 ExecuteTableBasedItemEffect_(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 moveIndex) { - return sub_803E1B0(pkmn, b, c, d, 0); + return PokemonUseItemEffects(pkmn, item, partyIndex, moveIndex, 0); } -bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) +bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 moveIndex, u8 e) { - u32 sp0; - s32 sp4; - s32 sp18; - bool8 sp1C = TRUE; - const u8 *sp20; + u32 data; + s32 friendship; + s32 cmdIndex; + bool8 retVal = TRUE; + const u8 *itemEffect; u8 sp24 = 6; u32 sp28; s8 sp2C = 0; - u8 sp30; + u8 holdEffect; u8 sp34 = 4; - u16 item; + u16 heldItem; u8 r10; u32 r4; - item = GetMonData(pkmn, MON_DATA_HELD_ITEM, NULL); - if (item == 0xAF) + heldItem = GetMonData(pkmn, MON_DATA_HELD_ITEM, NULL); + if (heldItem == ITEM_ENIGMA_BERRY) { if (gMain.inBattle) - sp30 = gEnigmaBerries[gBankInMenu].holdEffect; + holdEffect = gEnigmaBerries[gBankInMenu].holdEffect; else - sp30 = gSaveBlock1.enigmaBerry.holdEffect; + holdEffect = gSaveBlock1.enigmaBerry.holdEffect; } - //_0803E240 else { - sp30 = ItemId_GetHoldEffect(item); + holdEffect = ItemId_GetHoldEffect(heldItem); } - //_0803E248 gStringBank = gBankInMenu; if (gMain.inBattle) { gActiveBank = gBankInMenu; - sp18 = (GetBankSide(gActiveBank) != 0); - while (sp18 < gNoOfAllBanks) + cmdIndex = (GetBankSide(gActiveBank) != 0); + while (cmdIndex < gNoOfAllBanks) { - if (gBattlePartyID[sp18] == c) + if (gBattlePartyID[cmdIndex] == partyIndex) { - sp34 = sp18; + sp34 = cmdIndex; break; } - sp18 += 2; + cmdIndex += 2; } } - //_0803E2E8 else { gActiveBank = 0; sp34 = 4; } - //_0803E2F4 - if (b < 13 || b > 0xB2) - return 1; - if (gItemEffectTable[b - 13] == NULL && b != 0xAF) - return 1; + if (!IS_POKEMON_ITEM(item)) + return TRUE; + if (gItemEffectTable[item - 13] == NULL && item != ITEM_ENIGMA_BERRY) + return TRUE; - if (b == 0xAF) + if (item == ITEM_ENIGMA_BERRY) { - //_0803E31E if (gMain.inBattle) - sp20 = gEnigmaBerries[gActiveBank].itemEffect; + itemEffect = gEnigmaBerries[gActiveBank].itemEffect; else - sp20 = gSaveBlock1.enigmaBerry.itemEffect; + itemEffect = gSaveBlock1.enigmaBerry.itemEffect; } - //_0803E372 else { - sp20 = gItemEffectTable[b - 13]; + itemEffect = gItemEffectTable[item - 13]; } - // Now, the HUGE loop! - for (sp18 = 0; sp18 < 6; sp18++) + for (cmdIndex = 0; cmdIndex < 6; cmdIndex++) { - switch (sp18) + switch (cmdIndex) { + // status healing effects case 0: - //_0803E3A8 - // TODO: stop re-loading sp34 - if ((sp20[sp18] & 0x80) && gMain.inBattle - && sp34 != 4 && (gBattleMons[sp34].status2 & 0xF0000)) + if ((itemEffect[cmdIndex] & 0x80) + && gMain.inBattle && sp34 != 4 && (gBattleMons[sp34].status2 & STATUS2_INFATUATION)) { - gBattleMons[sp34].status2 &= ~0xF0000; - sp1C = 0; + gBattleMons[sp34].status2 &= ~STATUS2_INFATUATION; + retVal = FALSE; } - //_0803E3F0 - if ((sp20[sp18] & 0x30) && !(gBattleMons[gActiveBank].status2 & 0x100000)) + if ((itemEffect[cmdIndex] & 0x30) + && !(gBattleMons[gActiveBank].status2 & STATUS2_FOCUS_ENERGY)) { - gBattleMons[gActiveBank].status2 |= 0x100000; - sp1C = 0; + gBattleMons[gActiveBank].status2 |= STATUS2_FOCUS_ENERGY; + retVal = FALSE; } - //_0803E41E - if ((sp20[sp18] & 0xF) && gBattleMons[gActiveBank].statStages[1] < 12) + if ((itemEffect[cmdIndex] & 0xF) + && gBattleMons[gActiveBank].statStages[STAT_STAGE_ATK] < 12) { - gBattleMons[gActiveBank].statStages[1] += sp20[sp18] & 0xF; - if (gBattleMons[gActiveBank].statStages[1] > 12) - gBattleMons[gActiveBank].statStages[1] = 12; - sp1C = 0; + gBattleMons[gActiveBank].statStages[STAT_STAGE_ATK] += itemEffect[cmdIndex] & 0xF; + if (gBattleMons[gActiveBank].statStages[STAT_STAGE_ATK] > 12) + gBattleMons[gActiveBank].statStages[STAT_STAGE_ATK] = 12; + retVal = FALSE; } break; + // in-battle stat boosting effects? case 1: - //_0803E474 - // r3 might be a temporary variable - if ((sp20[sp18] & 0xF0) && gBattleMons[gActiveBank].statStages[2] < 12) + if ((itemEffect[cmdIndex] & 0xF0) + && gBattleMons[gActiveBank].statStages[STAT_STAGE_DEF] < 12) { - gBattleMons[gActiveBank].statStages[2] += (sp20[sp18] & 0xF0) >> 4; - if (gBattleMons[gActiveBank].statStages[2] > 12) - gBattleMons[gActiveBank].statStages[2] = 12; - sp1C = 0; + gBattleMons[gActiveBank].statStages[STAT_STAGE_DEF] += (itemEffect[cmdIndex] & 0xF0) >> 4; + if (gBattleMons[gActiveBank].statStages[STAT_STAGE_DEF] > 12) + gBattleMons[gActiveBank].statStages[STAT_STAGE_DEF] = 12; + retVal = FALSE; } - //_0803E4BA - if ((sp20[sp18] & 0xF) && gBattleMons[gActiveBank].statStages[3] < 12) + if ((itemEffect[cmdIndex] & 0xF) + && gBattleMons[gActiveBank].statStages[STAT_STAGE_SPEED] < 12) { - gBattleMons[gActiveBank].statStages[3] += sp20[sp18] & 0xF; - if (gBattleMons[gActiveBank].statStages[3] > 12) - gBattleMons[gActiveBank].statStages[3] = 12; - sp1C = 0; + gBattleMons[gActiveBank].statStages[STAT_STAGE_SPEED] += itemEffect[cmdIndex] & 0xF; + if (gBattleMons[gActiveBank].statStages[STAT_STAGE_SPEED] > 12) + gBattleMons[gActiveBank].statStages[STAT_STAGE_SPEED] = 12; + retVal = FALSE; } break; + // more stat boosting effects? case 2: - //_0803E508 - //asm_comment("case2"); - if ((sp20[sp18] & 0xF0) && gBattleMons[gActiveBank].statStages[6] < 12) + if ((itemEffect[cmdIndex] & 0xF0) + && gBattleMons[gActiveBank].statStages[STAT_STAGE_ACC] < 12) { - gBattleMons[gActiveBank].statStages[6] += (sp20[sp18] & 0xF0) >> 4; - if (gBattleMons[gActiveBank].statStages[6] > 12) - gBattleMons[gActiveBank].statStages[6] = 12; - sp1C = 0; + gBattleMons[gActiveBank].statStages[STAT_STAGE_ACC] += (itemEffect[cmdIndex] & 0xF0) >> 4; + if (gBattleMons[gActiveBank].statStages[STAT_STAGE_ACC] > 12) + gBattleMons[gActiveBank].statStages[STAT_STAGE_ACC] = 12; + retVal = FALSE; } - //_0803E54E - if ((sp20[sp18] & 0xF) && gBattleMons[gActiveBank].statStages[4] < 12) + if ((itemEffect[cmdIndex] & 0xF) + && gBattleMons[gActiveBank].statStages[STAT_STAGE_SPATK] < 12) { - gBattleMons[gActiveBank].statStages[4] += sp20[sp18] & 0xF; - if (gBattleMons[gActiveBank].statStages[4] > 12) - gBattleMons[gActiveBank].statStages[4] = 12; - sp1C = 0; + gBattleMons[gActiveBank].statStages[STAT_STAGE_SPATK] += itemEffect[cmdIndex] & 0xF; + if (gBattleMons[gActiveBank].statStages[STAT_STAGE_SPATK] > 12) + gBattleMons[gActiveBank].statStages[STAT_STAGE_SPATK] = 12; + retVal = FALSE; } break; case 3: - //_0803E59C - if ((sp20[sp18] & 0x80) && gSideTimers[GetBankSide(gActiveBank)].mistTimer == 0) + if ((itemEffect[cmdIndex] & 0x80) + && gSideTimers[GetBankSide(gActiveBank)].mistTimer == 0) { gSideTimers[GetBankSide(gActiveBank)].mistTimer = 5; - sp1C = 0; + retVal = FALSE; } - //_0803E5E4 - if ((sp20[sp18] & 0x40) && GetMonData(pkmn, MON_DATA_LEVEL, NULL) != 100) + if ((itemEffect[cmdIndex] & 0x40) // raise level + && GetMonData(pkmn, MON_DATA_LEVEL, NULL) != 100) { - sp0 = gExperienceTables[gBaseStats[GetMonData(pkmn, MON_DATA_SPECIES, NULL)].growthRate][GetMonData(pkmn, MON_DATA_LEVEL, NULL) + 1]; - SetMonData(pkmn, MON_DATA_EXP, &sp0); + 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); - sp1C = 0; + retVal = FALSE; } - //_0803E646 - if ((sp20[sp18] & 0x20) && HealStatusConditions(pkmn, c, 7, sp34) == 0) + if ((itemEffect[cmdIndex] & 0x20) + && HealStatusConditions(pkmn, partyIndex, 7, sp34) == 0) { if (sp34 != 4) - gBattleMons[sp34].status2 &= 0xF7FFFFFF; - sp1C = 0; + gBattleMons[sp34].status2 &= ~STATUS2_NIGHTMARE; + retVal = FALSE; } - //_0803E682 - if ((sp20[sp18] & 0x10) && HealStatusConditions(pkmn, c, 0xF88, sp34) == 0) - sp1C = 0; - //_0803E6A2 - if ((sp20[sp18] & 8) && HealStatusConditions(pkmn, c, 16, sp34) == 0) - sp1C = 0; - //_0803E6C2 - if ((sp20[sp18] & 4) && HealStatusConditions(pkmn, c, 32, sp34) == 0) - sp1C = 0; - //_0803E6E2 - if ((sp20[sp18] & 2) && HealStatusConditions(pkmn, c, 64, sp34) == 0) - sp1C = 0; - //_0803E702 - if ((sp20[sp18] & 1) && gMain.inBattle - && sp34 != 4 && (gBattleMons[sp34].status2 & 7)) + if ((itemEffect[cmdIndex] & 0x10) && HealStatusConditions(pkmn, partyIndex, 0xF88, sp34) == 0) + retVal = FALSE; + if ((itemEffect[cmdIndex] & 8) && HealStatusConditions(pkmn, partyIndex, 16, sp34) == 0) + retVal = FALSE; + if ((itemEffect[cmdIndex] & 4) && HealStatusConditions(pkmn, partyIndex, 32, sp34) == 0) + retVal = FALSE; + if ((itemEffect[cmdIndex] & 2) && HealStatusConditions(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 &= ~7; - sp1C = 0; + gBattleMons[sp34].status2 &= ~STATUS2_CONFUSION; + retVal = FALSE; } break; + // EV, HP, and PP raising effects case 4: - //_0803E77C - r10 = sp20[sp18]; + r10 = itemEffect[cmdIndex]; if (r10 & 0x20) { - //u16 r4; - r10 &= ~0x20; - - sp0 = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_08208238[d]) >> (d * 2); - sp28 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + d, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), d); - if (sp0 <= 2 && sp28 > 4) + data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_08208238[moveIndex]) >> (moveIndex * 2); + sp28 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex); + if (data <= 2 && sp28 > 4) { - sp0 = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) + gUnknown_08208240[d]; - SetMonData(pkmn, MON_DATA_PP_BONUSES, &sp0); + data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) + gUnknown_08208240[moveIndex]; + SetMonData(pkmn, MON_DATA_PP_BONUSES, &data); - sp0 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + d, NULL), sp0, d) - sp28; - sp0 = GetMonData(pkmn, MON_DATA_PP1 + d, NULL) + sp0; - SetMonData(pkmn, MON_DATA_PP1 + d, &sp0); - sp1C = 0; + 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; } } - //_0803E854 sp28 = 0; while (r10 != 0) { @@ -256,36 +241,32 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) { u16 evCount; s32 r5; - u32 r1; - + switch (sp28) { case 0: case 1: - //_0803E8AC evCount = GetMonEVCount(pkmn); if (evCount >= 510) - return 1; - r1 = GetMonData(pkmn, gUnknown_082082F2[sp28], NULL); - sp0 = r1; - if (r1 < 100) + return TRUE; + data = GetMonData(pkmn, sGetMonDataEVConstants[sp28], NULL); + if (data < 100) { - if (r1 + sp20[sp24] > 100) - r4 = 100 - (r1 + sp20[sp24]) + sp20[sp24]; + if (data + itemEffect[sp24] > 100) + r4 = 100 - (data + itemEffect[sp24]) + itemEffect[sp24]; else - r4 = sp20[sp24]; - r1 = evCount + r4; - if (r1 > 510) - r4 += 510 - r1; - sp0 += r4; - SetMonData(pkmn, gUnknown_082082F2[sp28], &sp0); + r4 = itemEffect[sp24]; + if (evCount + r4 > 510) + r4 += 510 - (evCount + r4); + data += r4; + SetMonData(pkmn, sGetMonDataEVConstants[sp28], &data); CalculateMonStats(pkmn); sp24++; - sp1C = 0; + retVal = FALSE; } break; case 2: - //_0803E934 + // revive? if (r10 & 0x10) { if (GetMonData(pkmn, MON_DATA_HP, NULL) != 0) @@ -299,22 +280,17 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) { gAbsentBankFlags &= ~gBitTable[sp34]; CopyPlayerPartyMonToBattleData(sp34, pokemon_order_func(gBattlePartyID[sp34])); - // tail merge, possibly? if (GetBankSide(gActiveBank) == 0 && gBattleResults.unk4 < 255) gBattleResults.unk4++; } - //_0803E9B4 else { gAbsentBankFlags &= ~gBitTable[gActiveBank ^ 2]; if (GetBankSide(gActiveBank) == 0 && gBattleResults.unk4 < 255) gBattleResults.unk4++; } - //_0803E9CC } - //to _0803EA0A } - //_0803E9F4 else { if (GetMonData(pkmn, MON_DATA_HP, NULL) == 0) @@ -323,37 +299,32 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) break; } } - //_0803EA0A - sp0 = sp20[sp24++]; - switch (sp0) + data = itemEffect[sp24++]; + switch (data) { case 0xFF: - //_0803EA2C - if (sp0 == 0xFF) // wat? - sp0 = GetMonData(pkmn, MON_DATA_MAX_HP, NULL) - GetMonData(pkmn, MON_DATA_HP, NULL); + data = GetMonData(pkmn, MON_DATA_MAX_HP, NULL) - GetMonData(pkmn, MON_DATA_HP, NULL); break; case 0xFE: - sp0 = GetMonData(pkmn, MON_DATA_MAX_HP, NULL) / 2; - if (sp0 == 0) - sp0 = 1; + data = GetMonData(pkmn, MON_DATA_MAX_HP, NULL) / 2; + if (data == 0) + data = 1; break; case 0xFD: - sp0 = eStatHp; + data = eStatHp; break; } - //_0803EA6C if (GetMonData(pkmn, MON_DATA_MAX_HP, NULL) != GetMonData(pkmn, MON_DATA_HP, NULL)) { if (e == 0) { - sp0 = GetMonData(pkmn, MON_DATA_HP, NULL) + sp0; - if (sp0 > GetMonData(pkmn, MON_DATA_MAX_HP, NULL)) - sp0 = GetMonData(pkmn, MON_DATA_MAX_HP, NULL); - //_0803EAB8 - SetMonData(pkmn, MON_DATA_HP, &sp0); + 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 = sp0; + gBattleMons[sp34].hp = data; if (!(r10 & 0x10) && GetBankSide(gActiveBank) == 0) { if (gBattleResults.unk3 < 255) @@ -366,17 +337,13 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) gActiveBank = r5; } } - //to _0803EB48 } - //_0803EB40 else { - gBattleMoveDamage = -sp0; + gBattleMoveDamage = -data; } - //_0803EB48 - sp1C = 0; + retVal = FALSE; } - //_0803EB4C r10 &= 0xEF; break; case 3: @@ -386,89 +353,76 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) { u16 r4; - sp0 = GetMonData(pkmn, MON_DATA_PP1 + r5, NULL); + data = GetMonData(pkmn, MON_DATA_PP1 + r5, NULL); r4 = GetMonData(pkmn, MON_DATA_MOVE1 + r5, NULL); - if (sp0 != CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), r5)) + if (data != CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), r5)) { - sp0 += sp20[sp24]; + data += itemEffect[sp24]; r4 = GetMonData(pkmn, MON_DATA_MOVE1 + r5, NULL); - if (sp0 > CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), r5)) + if (data > CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), r5)) { r4 = GetMonData(pkmn, MON_DATA_MOVE1 + r5, NULL); - sp0 = CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), r5); + data = CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), r5); } - //_0803EC28 - SetMonData(pkmn, MON_DATA_PP1 + r5, &sp0); + 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] = sp0; - //_0803EC8E - sp1C = 0; + gBattleMons[sp34].pp[r5] = data; + retVal = FALSE; } - //_0803EC92 } - //_0803EC9A sp24++; } - //_0803ECB8 else { u16 r4; - sp0 = GetMonData(pkmn, MON_DATA_PP1 + d, NULL); - r4 = GetMonData(pkmn, MON_DATA_MOVE1 + d, NULL); - if (sp0 != CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), d)) + 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)) { - //_0803ED00 - sp0 += sp20[sp24++]; - r4 = GetMonData(pkmn, MON_DATA_MOVE1 + d, NULL); - if (sp0 > CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), d)) + 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 + d, NULL); - sp0 = CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), d); + r4 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL); + data = CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex); } - //_0803ED74 - SetMonData(pkmn, MON_DATA_PP1 + d, &sp0); + SetMonData(pkmn, MON_DATA_PP1 + moveIndex, &data); if (gMain.inBattle && sp34 != 4 && !(gBattleMons[sp34].status2 & 0x200000) - && !(gDisableStructs[sp34].unk18_b & gBitTable[d])) - gBattleMons[sp34].pp[d] = sp0; - //_0803EDD8 - sp1C = 0; + && !(gDisableStructs[sp34].unk18_b & gBitTable[moveIndex])) + gBattleMons[sp34].pp[moveIndex] = data; + retVal = FALSE; } } break; case 7: - //_0803EDF4 { - u16 targetSpecies = GetEvolutionTargetSpecies(pkmn, 2, b); + u16 targetSpecies = GetEvolutionTargetSpecies(pkmn, 2, item); if (targetSpecies != SPECIES_NONE) { - BeginEvolutionScene(pkmn, targetSpecies, 0, c); - return 0; + BeginEvolutionScene(pkmn, targetSpecies, 0, partyIndex); + return FALSE; } } break; } } - //_0803EE0A sp28++; r10 >>= 1; } break; case 5: - //_0803EE1E - r10 = sp20[sp18]; + r10 = itemEffect[cmdIndex]; sp28 = 0; while (r10 != 0) { - //_0803EE32 if (r10 & 1) { - u16 r5; - u32 r1; + u16 evCount; switch (sp28) { @@ -476,152 +430,112 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) case 1: case 2: case 3: - //_0803EE74 - r5 = GetMonEVCount(pkmn); - if (r5 >= 510) - return 1; - r1 = GetMonData(pkmn, gUnknown_082082F2[sp28 + 2], NULL); - sp0 = r1; - if (r1 < 100) + evCount = GetMonEVCount(pkmn); + if (evCount >= 510) + return TRUE; + data = GetMonData(pkmn, sGetMonDataEVConstants[sp28 + 2], NULL); + if (data < 100) { - if (r1 + sp20[sp24] > 100) - r4 = 100 - (r1 + sp20[sp24]) + sp20[sp24]; + if (data + itemEffect[sp24] > 100) + r4 = 100 - (data + itemEffect[sp24]) + itemEffect[sp24]; else - r4 = sp20[sp24]; - r1 = r5 + r4; - if (r1 > 510) - r4 += 510 - r1; - sp0 += r4; - SetMonData(pkmn, gUnknown_082082F2[sp28 + 2], &sp0); + r4 = itemEffect[sp24]; + if (evCount + r4 > 510) + r4 += 510 - (evCount + r4); + data += r4; + SetMonData(pkmn, sGetMonDataEVConstants[sp28 + 2], &data); CalculateMonStats(pkmn); - sp1C = 0; + retVal = FALSE; sp24++; } break; case 4: - //_0803EEF8 - sp0 = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_08208238[d]) >> (d * 2); - if (sp0 < 3) + data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_08208238[moveIndex]) >> (moveIndex * 2); + if (data < 3) { - //_0803EF18 - r4 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + d, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), d); - sp0 = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL); - sp0 &= gUnknown_0820823C[d]; - sp0 += gUnknown_08208240[d] * 3; + r4 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex); + data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL); + data &= gUnknown_0820823C[moveIndex]; + data += gUnknown_08208240[moveIndex] * 3; - SetMonData(pkmn, MON_DATA_PP_BONUSES, &sp0); - sp0 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + d, NULL), sp0, d) - r4; - sp0 = GetMonData(pkmn, MON_DATA_PP1 + d, NULL) + sp0; - SetMonData(pkmn, MON_DATA_PP1 + d, &sp0); - sp1C = 0; + 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: - //_0803EFCC - if (GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) < 100 && sp1C == 0 && sp2C == 0) + if (GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) < 100 && retVal == 0 && sp2C == 0) { - //_0803EFEC - sp2C = sp20[sp24]; - sp4 = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL); - if (sp2C > 0 && sp30 == 0x1B) - { - sp4 += 150 * sp2C / 100; - } - //to _0803F0D0 hmm... + sp2C = itemEffect[sp24]; + friendship = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL); + if (sp2C > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) + friendship += 150 * sp2C / 100; else - { - sp4 += sp2C; - } - //_0803F0DC (tail merged) - + friendship += sp2C; if (sp2C > 0) { if (GetMonData(pkmn, MON_DATA_POKEBALL, NULL) == 11) - sp4++; - //_0803F0F4 + friendship++; if (GetMonData(pkmn, MON_DATA_MET_LOCATION, NULL) == sav1_map_get_name()) - sp4++; + friendship++; } - //_0803F112 - if (sp4 < 0) - sp4 = 0; - if (sp4 > 255) - sp4 = 255; - SetMonData(pkmn, MON_DATA_FRIENDSHIP, &sp4); + if (friendship < 0) + friendship = 0; + if (friendship > 255) + friendship = 255; + SetMonData(pkmn, MON_DATA_FRIENDSHIP, &friendship); } - //to _0803F130 hmm... sp24++; break; case 6: - //_0803F026 if (GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) >= 100 && GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) < 200 - && sp1C == 0 && sp2C == 0) + && retVal == 0 && sp2C == 0) { - sp2C = sp20[sp24]; - sp4 = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL); - if (sp2C > 0 && sp30 == 0x1B) - { - //to _0803F0BE - sp4 += 150 * sp2C / 100; - } + sp2C = itemEffect[sp24]; + friendship = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL); + if (sp2C > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) + friendship += 150 * sp2C / 100; else - { - sp4 += sp2C; - } - //_0803F0DC (tail merged) - + friendship += sp2C; if (sp2C > 0) { if (GetMonData(pkmn, MON_DATA_POKEBALL, NULL) == 11) - sp4++; - //_0803F0F4 + friendship++; if (GetMonData(pkmn, MON_DATA_MET_LOCATION, NULL) == sav1_map_get_name()) - sp4++; + friendship++; } - //_0803F112 - if (sp4 < 0) - sp4 = 0; - if (sp4 > 255) - sp4 = 255; - SetMonData(pkmn, MON_DATA_FRIENDSHIP, &sp4); + if (friendship < 0) + friendship = 0; + if (friendship > 255) + friendship = 255; + SetMonData(pkmn, MON_DATA_FRIENDSHIP, &friendship); } - //to _0803F130 hmm... sp24++; break; case 7: - //_0803F07C - if (GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) >= 200 && sp1C == 0 && sp2C == 0) + if (GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) >= 200 && retVal == 0 && sp2C == 0) { - sp2C = sp20[sp24]; - sp4 = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL); - if (sp2C > 0 && sp30 == 0x1B) - { - //_0803F0BE - sp4 += 150 * sp2C / 100; - } - //_0803F0D0 + sp2C = itemEffect[sp24]; + friendship = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL); + if (sp2C > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) + friendship += 150 * sp2C / 100; else - { - sp4 += sp2C; - } - //_0803F0DC - + friendship += sp2C; if (sp2C > 0) { if (GetMonData(pkmn, MON_DATA_POKEBALL, NULL) == 11) - sp4++; - //_0803F0F4 + friendship++; if (GetMonData(pkmn, MON_DATA_MET_LOCATION, NULL) == sav1_map_get_name()) - sp4++; + friendship++; } - //_0803F112 - if (sp4 < 0) - sp4 = 0; - if (sp4 > 255) - sp4 = 255; - SetMonData(pkmn, MON_DATA_FRIENDSHIP, &sp4); + if (friendship < 0) + friendship = 0; + if (friendship > 255) + friendship = 255; + SetMonData(pkmn, MON_DATA_FRIENDSHIP, &friendship); } - //to _0803F130 sp24++; break; } @@ -632,6 +546,5 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e) break; } } - //_0803F15A - return sp1C; + return retVal; } -- cgit v1.2.3