diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/pokemon.c | 613 |
1 files changed, 176 insertions, 437 deletions
diff --git a/src/pokemon.c b/src/pokemon.c index e476ab456..9c2532243 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -3883,7 +3883,7 @@ bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 item, u8 partyIndex, return PokemonUseItemEffects(mon, item, partyIndex, moveIndex, 0); } -bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 moveIndex, u8 e) +bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex, u8 e) { u32 data; s32 friendship; @@ -3899,7 +3899,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 mo u8 r10; u32 r4; - heldItem = GetMonData(pkmn, MON_DATA_HELD_ITEM, NULL); + heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, NULL); if (heldItem == ITEM_ENIGMA_BERRY) { if (gMain.inBattle) @@ -4023,27 +4023,27 @@ bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 mo retVal = FALSE; } if ((itemEffect[cmdIndex] & 0x40) // raise level - && GetMonData(pkmn, MON_DATA_LEVEL, NULL) != 100) + && GetMonData(mon, MON_DATA_LEVEL, NULL) != 100) { - data = gExperienceTables[gBaseStats[GetMonData(pkmn, MON_DATA_SPECIES, NULL)].growthRate][GetMonData(pkmn, MON_DATA_LEVEL, NULL) + 1]; - SetMonData(pkmn, MON_DATA_EXP, &data); - CalculateMonStats(pkmn); + data = gExperienceTables[gBaseStats[GetMonData(mon, MON_DATA_SPECIES, NULL)].growthRate][GetMonData(mon, MON_DATA_LEVEL, NULL) + 1]; + SetMonData(mon, MON_DATA_EXP, &data); + CalculateMonStats(mon); retVal = FALSE; } if ((itemEffect[cmdIndex] & 0x20) - && HealStatusConditions(pkmn, partyIndex, 7, sp34) == 0) + && HealStatusConditions(mon, partyIndex, 7, sp34) == 0) { if (sp34 != 4) gBattleMons[sp34].status2 &= ~STATUS2_NIGHTMARE; retVal = FALSE; } - if ((itemEffect[cmdIndex] & 0x10) && HealStatusConditions(pkmn, partyIndex, 0xF88, sp34) == 0) + if ((itemEffect[cmdIndex] & 0x10) && HealStatusConditions(mon, partyIndex, 0xF88, sp34) == 0) retVal = FALSE; - if ((itemEffect[cmdIndex] & 8) && HealStatusConditions(pkmn, partyIndex, 16, sp34) == 0) + if ((itemEffect[cmdIndex] & 8) && HealStatusConditions(mon, partyIndex, 16, sp34) == 0) retVal = FALSE; - if ((itemEffect[cmdIndex] & 4) && HealStatusConditions(pkmn, partyIndex, 32, sp34) == 0) + if ((itemEffect[cmdIndex] & 4) && HealStatusConditions(mon, partyIndex, 32, sp34) == 0) retVal = FALSE; - if ((itemEffect[cmdIndex] & 2) && HealStatusConditions(pkmn, partyIndex, 64, sp34) == 0) + if ((itemEffect[cmdIndex] & 2) && HealStatusConditions(mon, partyIndex, 64, sp34) == 0) retVal = FALSE; if ((itemEffect[cmdIndex] & 1) // heal confusion && gMain.inBattle && sp34 != 4 && (gBattleMons[sp34].status2 & STATUS2_CONFUSION)) @@ -4058,16 +4058,16 @@ bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 mo if (r10 & 0x20) { r10 &= ~0x20; - data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2); - sp28 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex); + data = (GetMonData(mon, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2); + sp28 = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex); if (data < 3 && sp28 > 4) { - data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) + gPPUpAddMask[moveIndex]; - SetMonData(pkmn, MON_DATA_PP_BONUSES, &data); + data = GetMonData(mon, MON_DATA_PP_BONUSES, NULL) + gPPUpAddMask[moveIndex]; + SetMonData(mon, MON_DATA_PP_BONUSES, &data); - data = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - sp28; - data = GetMonData(pkmn, MON_DATA_PP1 + moveIndex, NULL) + data; - SetMonData(pkmn, MON_DATA_PP1 + moveIndex, &data); + data = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - sp28; + data = GetMonData(mon, MON_DATA_PP1 + moveIndex, NULL) + data; + SetMonData(mon, MON_DATA_PP1 + moveIndex, &data); retVal = FALSE; } } @@ -4083,10 +4083,10 @@ bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 mo { case 0: case 1: - evCount = GetMonEVCount(pkmn); + evCount = GetMonEVCount(mon); if (evCount >= 510) return TRUE; - data = GetMonData(pkmn, sGetMonDataEVConstants[sp28], NULL); + data = GetMonData(mon, sGetMonDataEVConstants[sp28], NULL); if (data < 100) { if (data + itemEffect[sp24] > 100) @@ -4096,8 +4096,8 @@ bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 mo if (evCount + r4 > 510) r4 += 510 - (evCount + r4); data += r4; - SetMonData(pkmn, sGetMonDataEVConstants[sp28], &data); - CalculateMonStats(pkmn); + SetMonData(mon, sGetMonDataEVConstants[sp28], &data); + CalculateMonStats(mon); sp24++; retVal = FALSE; } @@ -4106,7 +4106,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 mo // revive? if (r10 & 0x10) { - if (GetMonData(pkmn, MON_DATA_HP, NULL) != 0) + if (GetMonData(mon, MON_DATA_HP, NULL) != 0) { sp24++; break; @@ -4130,7 +4130,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 mo } else { - if (GetMonData(pkmn, MON_DATA_HP, NULL) == 0) + if (GetMonData(mon, MON_DATA_HP, NULL) == 0) { sp24++; break; @@ -4140,10 +4140,10 @@ bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 mo switch (data) { case 0xFF: - data = GetMonData(pkmn, MON_DATA_MAX_HP, NULL) - GetMonData(pkmn, MON_DATA_HP, NULL); + data = GetMonData(mon, MON_DATA_MAX_HP, NULL) - GetMonData(mon, MON_DATA_HP, NULL); break; case 0xFE: - data = GetMonData(pkmn, MON_DATA_MAX_HP, NULL) / 2; + data = GetMonData(mon, MON_DATA_MAX_HP, NULL) / 2; if (data == 0) data = 1; break; @@ -4151,14 +4151,14 @@ bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 mo data = gBattleScripting.field_23; break; } - if (GetMonData(pkmn, MON_DATA_MAX_HP, NULL) != GetMonData(pkmn, MON_DATA_HP, NULL)) + if (GetMonData(mon, MON_DATA_MAX_HP, NULL) != GetMonData(mon, MON_DATA_HP, NULL)) { if (e == 0) { - data = GetMonData(pkmn, MON_DATA_HP, NULL) + data; - if (data > GetMonData(pkmn, MON_DATA_MAX_HP, NULL)) - data = GetMonData(pkmn, MON_DATA_MAX_HP, NULL); - SetMonData(pkmn, MON_DATA_HP, &data); + data = GetMonData(mon, MON_DATA_HP, NULL) + data; + if (data > GetMonData(mon, MON_DATA_MAX_HP, NULL)) + data = GetMonData(mon, MON_DATA_MAX_HP, NULL); + SetMonData(mon, MON_DATA_HP, &data); if (gMain.inBattle && sp34 != 4) { gBattleMons[sp34].hp = data; @@ -4190,18 +4190,18 @@ bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 mo { u16 r4; - data = GetMonData(pkmn, MON_DATA_PP1 + r5, NULL); - r4 = GetMonData(pkmn, MON_DATA_MOVE1 + r5, NULL); - if (data != CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), r5)) + data = GetMonData(mon, MON_DATA_PP1 + r5, NULL); + r4 = GetMonData(mon, MON_DATA_MOVE1 + r5, NULL); + if (data != CalculatePPWithBonus(r4, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), r5)) { data += itemEffect[sp24]; - r4 = GetMonData(pkmn, MON_DATA_MOVE1 + r5, NULL); - if (data > CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), r5)) + r4 = GetMonData(mon, MON_DATA_MOVE1 + r5, NULL); + if (data > CalculatePPWithBonus(r4, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), r5)) { - r4 = GetMonData(pkmn, MON_DATA_MOVE1 + r5, NULL); - data = CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), r5); + r4 = GetMonData(mon, MON_DATA_MOVE1 + r5, NULL); + data = CalculatePPWithBonus(r4, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), r5); } - SetMonData(pkmn, MON_DATA_PP1 + r5, &data); + SetMonData(mon, MON_DATA_PP1 + r5, &data); if (gMain.inBattle && sp34 != 4 && !(gBattleMons[sp34].status2 & 0x200000) && !(gDisableStructs[sp34].mimickedMoves & gBitTable[r5])) @@ -4215,18 +4215,18 @@ bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 mo { u16 r4; - data = GetMonData(pkmn, MON_DATA_PP1 + moveIndex, NULL); - r4 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL); - if (data != CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex)) + data = GetMonData(mon, MON_DATA_PP1 + moveIndex, NULL); + r4 = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL); + if (data != CalculatePPWithBonus(r4, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex)) { data += itemEffect[sp24++]; - r4 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL); - if (data > CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex)) + r4 = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL); + if (data > CalculatePPWithBonus(r4, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex)) { - r4 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL); - data = CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex); + r4 = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL); + data = CalculatePPWithBonus(r4, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex); } - SetMonData(pkmn, MON_DATA_PP1 + moveIndex, &data); + SetMonData(mon, MON_DATA_PP1 + moveIndex, &data); if (gMain.inBattle && sp34 != 4 && !(gBattleMons[sp34].status2 & 0x200000) && !(gDisableStructs[sp34].mimickedMoves & gBitTable[moveIndex])) @@ -4237,11 +4237,11 @@ bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 mo break; case 7: { - u16 targetSpecies = GetEvolutionTargetSpecies(pkmn, 2, item); + u16 targetSpecies = GetEvolutionTargetSpecies(mon, 2, item); if (targetSpecies != SPECIES_NONE) { - BeginEvolutionScene(pkmn, targetSpecies, 0, partyIndex); + BeginEvolutionScene(mon, targetSpecies, 0, partyIndex); return FALSE; } } @@ -4267,10 +4267,10 @@ bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 mo case 1: case 2: case 3: - evCount = GetMonEVCount(pkmn); + evCount = GetMonEVCount(mon); if (evCount >= 510) return TRUE; - data = GetMonData(pkmn, sGetMonDataEVConstants[sp28 + 2], NULL); + data = GetMonData(mon, sGetMonDataEVConstants[sp28 + 2], NULL); if (data < 100) { if (data + itemEffect[sp24] > 100) @@ -4280,98 +4280,98 @@ bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 mo if (evCount + r4 > 510) r4 += 510 - (evCount + r4); data += r4; - SetMonData(pkmn, sGetMonDataEVConstants[sp28 + 2], &data); - CalculateMonStats(pkmn); + SetMonData(mon, sGetMonDataEVConstants[sp28 + 2], &data); + CalculateMonStats(mon); retVal = FALSE; sp24++; } break; case 4: - data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2); + data = (GetMonData(mon, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2); if (data < 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); + r4 = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex); + data = GetMonData(mon, MON_DATA_PP_BONUSES, NULL); data &= gPPUpSetMask[moveIndex]; data += gPPUpAddMask[moveIndex] * 3; - SetMonData(pkmn, MON_DATA_PP_BONUSES, &data); - data = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - r4; - data = GetMonData(pkmn, MON_DATA_PP1 + moveIndex, NULL) + data; - SetMonData(pkmn, MON_DATA_PP1 + moveIndex, &data); + SetMonData(mon, MON_DATA_PP_BONUSES, &data); + data = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - r4; + data = GetMonData(mon, MON_DATA_PP1 + moveIndex, NULL) + data; + SetMonData(mon, MON_DATA_PP1 + moveIndex, &data); retVal = FALSE; } break; case 5: - if (GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) < 100 && retVal == 0 && sp2C == 0) + if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) < 100 && retVal == 0 && sp2C == 0) { sp2C = itemEffect[sp24]; - friendship = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL); + friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL); if (sp2C > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) friendship += 150 * sp2C / 100; else friendship += sp2C; if (sp2C > 0) { - if (GetMonData(pkmn, MON_DATA_POKEBALL, NULL) == 11) + if (GetMonData(mon, MON_DATA_POKEBALL, NULL) == 11) friendship++; - if (GetMonData(pkmn, MON_DATA_MET_LOCATION, NULL) == GetCurrentRegionMapSectionId()) + if (GetMonData(mon, MON_DATA_MET_LOCATION, NULL) == GetCurrentRegionMapSectionId()) friendship++; } if (friendship < 0) friendship = 0; if (friendship > 255) friendship = 255; - SetMonData(pkmn, MON_DATA_FRIENDSHIP, &friendship); + SetMonData(mon, MON_DATA_FRIENDSHIP, &friendship); } sp24++; break; case 6: - if (GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) >= 100 && GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) < 200 + if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) >= 100 && GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) < 200 && retVal == 0 && sp2C == 0) { sp2C = itemEffect[sp24]; - friendship = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL); + friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL); if (sp2C > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) friendship += 150 * sp2C / 100; else friendship += sp2C; if (sp2C > 0) { - if (GetMonData(pkmn, MON_DATA_POKEBALL, NULL) == 11) + if (GetMonData(mon, MON_DATA_POKEBALL, NULL) == 11) friendship++; - if (GetMonData(pkmn, MON_DATA_MET_LOCATION, NULL) == GetCurrentRegionMapSectionId()) + if (GetMonData(mon, MON_DATA_MET_LOCATION, NULL) == GetCurrentRegionMapSectionId()) friendship++; } if (friendship < 0) friendship = 0; if (friendship > 255) friendship = 255; - SetMonData(pkmn, MON_DATA_FRIENDSHIP, &friendship); + SetMonData(mon, MON_DATA_FRIENDSHIP, &friendship); } sp24++; break; case 7: - if (GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) >= 200 && retVal == 0 && sp2C == 0) + if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) >= 200 && retVal == 0 && sp2C == 0) { sp2C = itemEffect[sp24]; - friendship = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL); + friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL); if (sp2C > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) friendship += 150 * sp2C / 100; else friendship += sp2C; if (sp2C > 0) { - if (GetMonData(pkmn, MON_DATA_POKEBALL, NULL) == 11) + if (GetMonData(mon, MON_DATA_POKEBALL, NULL) == 11) friendship++; - if (GetMonData(pkmn, MON_DATA_MET_LOCATION, NULL) == GetCurrentRegionMapSectionId()) + if (GetMonData(mon, MON_DATA_MET_LOCATION, NULL) == GetCurrentRegionMapSectionId()) friendship++; } if (friendship < 0) friendship = 0; if (friendship > 255) friendship = 255; - SetMonData(pkmn, MON_DATA_FRIENDSHIP, &friendship); + SetMonData(mon, MON_DATA_FRIENDSHIP, &friendship); } sp24++; break; @@ -4406,25 +4406,28 @@ static bool8 HealStatusConditions(struct Pokemon *mon, u32 unused, u32 healMask, #ifdef NONMATCHING /* - * This is nonmatching due to the compiler's insistence on avoiding the u8 cast - * when loading gMain.inBattle. If it weren't for this absent cast, differing - * the function would be a lot easier. + * This is nonmatching due to: + * 1) the compiler's insistence on avoiding the u8 cast when loading gMain.inBattle + * 2) niche difference in the first loop + * 3) tail merge (there're still logical differences inside switch which are not noticed? ) */ -bool8 PokemonUseItemEffects2(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 moveIndex, u8 e) -{ // BEGIN +bool8 PokemonUseItemEffects2(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex) +{ u32 data; + s32 tmp; s32 cmdIndex; bool8 retVal = TRUE; const u8 *itemEffect; - u8 sp24 = 6; - u32 sp28; - s8 sp2C = 0; - u8 sp34 = 4; + u8 r10 = 6; + u32 i; + s32 sp18 = 0; + u8 battlerId = 4; u16 heldItem; - u8 r10; - s32 r4; + u8 curEffect; + u32 curMoveId; - heldItem = GetMonData(pkmn, MON_DATA_HELD_ITEM, NULL); + heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, NULL); + // you have to write as such, because otherwise gMain.inBattle will lose its u8 cast if (heldItem == ITEM_ENIGMA_BERRY) { if (gMain.inBattle) @@ -4436,41 +4439,30 @@ bool8 PokemonUseItemEffects2(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 m { /*holdEffect = */ItemId_GetHoldEffect(heldItem); } - gPotentialItemEffectBattler = gBattlerInMenuId; - - // grr. the original asm also u8 masks after loading the bitmask, despite - // the fact that is a useless operation. what's going on here? Something - // dumb I bet like dead code. if (gMain.inBattle) { gActiveBattler = gBattlerInMenuId; - if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) - cmdIndex = 0; - else - cmdIndex = 1; - while (cmdIndex < gBattlersCount) + for (cmdIndex = GetBattlerSide(gActiveBattler) != B_SIDE_PLAYER; + cmdIndex < gBattlersCount; + cmdIndex += 2) // for/while seems to be identical here { - if (gBattlerPartyIndexes[cmdIndex] == partyIndex) + if (gBattlerPartyIndexes[cmdIndex] == partyIndex) // why is gBattlerPartyIndexes reloaded? { - sp34 = cmdIndex; + battlerId = cmdIndex; break; } - cmdIndex += 2; } } else { gActiveBattler = 0; - sp34 = 4; + battlerId = 4; } - - // _08042504 if (!IS_POKEMON_ITEM(item)) return TRUE; if (gItemEffectTable[item - 13] == NULL && item != ITEM_ENIGMA_BERRY) return TRUE; - if (item == ITEM_ENIGMA_BERRY) { if (gMain.inBattle) @@ -4482,457 +4474,204 @@ bool8 PokemonUseItemEffects2(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 m { itemEffect = gItemEffectTable[item - 13]; } - for (cmdIndex = 0; cmdIndex < 6; cmdIndex++) { switch (cmdIndex) { // status healing effects case 0: - if ((itemEffect[cmdIndex] & 0x80) - && gMain.inBattle && sp34 != 4 && (gBattleMons[sp34].status2 & STATUS2_INFATUATION)) - { - //gBattleMons[sp34].status2 &= ~STATUS2_INFATUATION; + if (itemEffect[cmdIndex] & 0x80 + && gMain.inBattle + && battlerId != 4 + && gBattleMons[battlerId].status2 & STATUS2_INFATUATION) retVal = FALSE; - } - if ((itemEffect[cmdIndex] & 0x30) + if (itemEffect[cmdIndex] & 0x30 && !(gBattleMons[gActiveBattler].status2 & STATUS2_FOCUS_ENERGY)) - { - //gBattleMons[gActiveBattler].status2 |= STATUS2_FOCUS_ENERGY; retVal = FALSE; - } if ((itemEffect[cmdIndex] & 0xF) && gBattleMons[gActiveBattler].statStages[STAT_STAGE_ATK] < 12) - { - //gBattleMons[gActiveBattler].statStages[STAT_STAGE_ATK] += itemEffect[cmdIndex] & 0xF; - //if (gBattleMons[gActiveBattler].statStages[STAT_STAGE_ATK] > 12) - // gBattleMons[gActiveBattler].statStages[STAT_STAGE_ATK] = 12; retVal = FALSE; - } break; // in-battle stat boosting effects? case 1: if ((itemEffect[cmdIndex] & 0xF0) && gBattleMons[gActiveBattler].statStages[STAT_STAGE_DEF] < 12) - { - //gBattleMons[gActiveBattler].statStages[STAT_STAGE_DEF] += (itemEffect[cmdIndex] & 0xF0) >> 4; - //if (gBattleMons[gActiveBattler].statStages[STAT_STAGE_DEF] > 12) - // gBattleMons[gActiveBattler].statStages[STAT_STAGE_DEF] = 12; retVal = FALSE; - } if ((itemEffect[cmdIndex] & 0xF) && gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPEED] < 12) - { - //gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPEED] += itemEffect[cmdIndex] & 0xF; - //if (gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPEED] > 12) - // gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPEED] = 12; retVal = FALSE; - } break; // more stat boosting effects? case 2: if ((itemEffect[cmdIndex] & 0xF0) && gBattleMons[gActiveBattler].statStages[STAT_STAGE_ACC] < 12) - { - //gBattleMons[gActiveBattler].statStages[STAT_STAGE_ACC] += (itemEffect[cmdIndex] & 0xF0) >> 4; - //if (gBattleMons[gActiveBattler].statStages[STAT_STAGE_ACC] > 12) - // gBattleMons[gActiveBattler].statStages[STAT_STAGE_ACC] = 12; retVal = FALSE; - } if ((itemEffect[cmdIndex] & 0xF) && gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPATK] < 12) - { - //gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPATK] += itemEffect[cmdIndex] & 0xF; - //if (gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPATK] > 12) - // gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPATK] = 12; retVal = FALSE; - } break; case 3: if ((itemEffect[cmdIndex] & 0x80) && gSideTimers[GetBattlerSide(gActiveBattler)].mistTimer == 0) - { - //gSideTimers[GetBattlerSide(gActiveBattler)].mistTimer = 5; retVal = FALSE; - } if ((itemEffect[cmdIndex] & 0x40) // raise level - && GetMonData(pkmn, MON_DATA_LEVEL, NULL) != 100) - { - //data = gExperienceTables[gBaseStats[GetMonData(pkmn, MON_DATA_SPECIES, NULL)].growthRate][GetMonData(pkmn, MON_DATA_LEVEL, NULL) + 1]; - //SetMonData(pkmn, MON_DATA_EXP, &data); - //CalculateMonStats(pkmn); + && GetMonData(mon, MON_DATA_LEVEL, NULL) != 100) retVal = FALSE; - } if ((itemEffect[cmdIndex] & 0x20) - && sub_8042BE8(pkmn, partyIndex, 7, sp34) == 0) - { - //if (sp34 != 4) - // gBattleMons[sp34].status2 &= ~STATUS2_NIGHTMARE; + && sub_8042BE8(mon, partyIndex, 7, battlerId)) retVal = FALSE; - } - if ((itemEffect[cmdIndex] & 0x10) && sub_8042BE8(pkmn, partyIndex, 0xF88, sp34) == 0) + if ((itemEffect[cmdIndex] & 0x10) && sub_8042BE8(mon, partyIndex, 0xF88, battlerId)) retVal = FALSE; - if ((itemEffect[cmdIndex] & 8) && sub_8042BE8(pkmn, partyIndex, 16, sp34) == 0) + if ((itemEffect[cmdIndex] & 8) && sub_8042BE8(mon, partyIndex, 16, battlerId)) retVal = FALSE; - if ((itemEffect[cmdIndex] & 4) && sub_8042BE8(pkmn, partyIndex, 32, sp34) == 0) + if ((itemEffect[cmdIndex] & 4) && sub_8042BE8(mon, partyIndex, 32, battlerId)) retVal = FALSE; - if ((itemEffect[cmdIndex] & 2) && sub_8042BE8(pkmn, partyIndex, 64, sp34) == 0) + if ((itemEffect[cmdIndex] & 2) && sub_8042BE8(mon, partyIndex, 64, battlerId)) retVal = FALSE; - if ((itemEffect[cmdIndex] & 1) // heal confusion - && gMain.inBattle && sp34 != 4 && (gBattleMons[sp34].status2 & STATUS2_CONFUSION)) - { - //gBattleMons[sp34].status2 &= ~STATUS2_CONFUSION; + if (itemEffect[cmdIndex] & 1 // heal confusion + && gMain.inBattle && battlerId != 4 && (gBattleMons[battlerId].status2 & STATUS2_CONFUSION)) retVal = FALSE; - } break; // EV, HP, and PP raising effects case 4: - r10 = itemEffect[cmdIndex]; - if (r10 & 0x20) + curEffect = itemEffect[cmdIndex]; + if (curEffect & 0x20) { - r10 &= ~0x20; - data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2); - sp28 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex); - if (data < 3 && sp28 > 4) - { - //data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) + gPPUpAddMask[moveIndex]; - //SetMonData(pkmn, MON_DATA_PP_BONUSES, &data); - // - //data = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - sp28; - //data = GetMonData(pkmn, MON_DATA_PP1 + moveIndex, NULL) + data; - //SetMonData(pkmn, MON_DATA_PP1 + moveIndex, &data); + curEffect &= ~0x20; + data = (GetMonData(mon, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2); + i = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex); + if (data < 3 && i > 4) retVal = FALSE; - } } - sp28 = 0; - while (r10 != 0) // _080428C0 + i = 0; + while (curEffect) // _080428C0 { - if (r10 & 1) + if (curEffect & 1) { - u16 evCount; - u16 targetSpecies; - s32 r5; - - switch (sp28) + switch (i) { case 0: case 1: - evCount = GetMonEVCount(pkmn); - if (evCount >= 510) + if (GetMonEVCount(mon) >= 510) return TRUE; - data = GetMonData(pkmn, sGetMonDataEVConstants[sp28], NULL); + data = GetMonData(mon, sGetMonDataEVConstants[i], NULL); if (data < 100) { - //if (data + itemEffect[sp24] > 100) - // r4 = 100 - (data + itemEffect[sp24]) + itemEffect[sp24]; - //else - // r4 = itemEffect[sp24]; - //if (evCount + r4 > 510) - // r4 += 510 - (evCount + r4); - //data += r4; - //SetMonData(pkmn, sGetMonDataEVConstants[sp28], &data); - //CalculateMonStats(pkmn); - sp24++; + r10++; retVal = FALSE; } break; case 2: // revive? - if (r10 & 0x10) + if (curEffect & 0x10) { - if (GetMonData(pkmn, MON_DATA_HP, NULL) != 0) + if (GetMonData(mon, MON_DATA_HP, NULL) != 0) { - sp24++; + r10++; break; } - /* - if (gMain.inBattle) - { - if (sp34 != 4) - { - gAbsentBattlerFlags &= ~gBitTable[sp34]; - CopyPlayerPartyMonToBattleData(sp34, pokemon_order_func(gBattlerPartyIndexes[sp34])); - if (GetBattlerSide(gActiveBattler) == 0 && gBattleResults.unk4 < 255) - gBattleResults.unk4++; - } - else - { - gAbsentBattlerFlags &= ~gBitTable[gActiveBattler ^ 2]; - if (GetBattlerSide(gActiveBattler) == 0 && gBattleResults.unk4 < 255) - gBattleResults.unk4++; - } - } - */ } else { - if (GetMonData(pkmn, MON_DATA_HP, NULL) == 0) + if (GetMonData(mon, MON_DATA_HP, NULL) == 0) { - sp24++; + r10++; break; } } - /* - data = itemEffect[sp24++]; - switch (data) - { - case 0xFF: - data = GetMonData(pkmn, MON_DATA_MAX_HP, NULL) - GetMonData(pkmn, MON_DATA_HP, NULL); - break; - case 0xFE: - data = GetMonData(pkmn, MON_DATA_MAX_HP, NULL) / 2; - if (data == 0) - data = 1; - break; - case 0xFD: - data = gBattleScripting.field_23; - break; - } - */ - if (GetMonData(pkmn, MON_DATA_MAX_HP, NULL) != GetMonData(pkmn, MON_DATA_HP, NULL)) - { - /* - if (e == 0) - { - data = GetMonData(pkmn, MON_DATA_HP, NULL) + data; - if (data > GetMonData(pkmn, MON_DATA_MAX_HP, NULL)) - data = GetMonData(pkmn, MON_DATA_MAX_HP, NULL); - SetMonData(pkmn, MON_DATA_HP, &data); - if (gMain.inBattle && sp34 != 4) - { - gBattleMons[sp34].hp = data; - if (!(r10 & 0x10) && GetBattlerSide(gActiveBattler) == 0) - { - if (gBattleResults.unk3 < 255) - gBattleResults.unk3++; - // I have to re-use this variable to match. - r5 = gActiveBattler; - gActiveBattler = sp34; - BtlController_EmitGetMonData(0, 0, 0); - MarkBattlerForControllerExec(gActiveBattler); - gActiveBattler = r5; - } - } - } - else - { - gBattleMoveDamage = -data; - } - */ + if (GetMonData(mon, MON_DATA_MAX_HP, NULL) != GetMonData(mon, MON_DATA_HP, NULL)) retVal = FALSE; - } - sp24++; - r10 &= 0xEF; + r10++; + curEffect &= 0xEF; break; case 3: - if (!(r10 & 2)) + if (!(curEffect & 2)) { - for (r5 = 0; r5 < 4; r5++) + for (tmp = 0; tmp < MAX_MON_MOVES; tmp++) { - data = GetMonData(pkmn, MON_DATA_PP1 + r5, NULL); - r4 = GetMonData(pkmn, MON_DATA_MOVE1 + r5, NULL); - if (data != CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), r5)) - { - /* - data += itemEffect[sp24]; - r4 = GetMonData(pkmn, MON_DATA_MOVE1 + r5, NULL); - if (data > CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), r5)) - { - r4 = GetMonData(pkmn, MON_DATA_MOVE1 + r5, NULL); - data = CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), r5); - } - SetMonData(pkmn, MON_DATA_PP1 + r5, &data); - if (gMain.inBattle - && sp34 != 4 && !(gBattleMons[sp34].status2 & 0x200000) - && !(gDisableStructs[sp34].unk18_b & gBitTable[r5])) - gBattleMons[sp34].pp[r5] = data; - */ + data = GetMonData(mon, MON_DATA_PP1 + tmp, NULL); + curMoveId = GetMonData(mon, MON_DATA_MOVE1 + tmp, NULL); + if (data != CalculatePPWithBonus(curMoveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), tmp)) retVal = FALSE; - } } + r10++; } else // _080429FA { - data = GetMonData(pkmn, MON_DATA_PP1 + moveIndex, NULL); - r4 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL); - if (data != CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex)) + data = GetMonData(mon, MON_DATA_PP1 + moveIndex, NULL); + curMoveId = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL); + if (data != CalculatePPWithBonus(curMoveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex)) { - /* - data += itemEffect[sp24++]; - r4 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL); - if (data > CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex)) - { - r4 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL); - data = CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex); - } - SetMonData(pkmn, MON_DATA_PP1 + moveIndex, &data); - if (gMain.inBattle - && sp34 != 4 && !(gBattleMons[sp34].status2 & 0x200000) - && !(gDisableStructs[sp34].unk18_b & gBitTable[moveIndex])) - gBattleMons[sp34].pp[moveIndex] = data; - */ - sp24++; + r10++; retVal = FALSE; } } break; case 7: - { - targetSpecies = GetEvolutionTargetSpecies(pkmn, 2, item); - - if (targetSpecies != SPECIES_NONE) - { - //BeginEvolutionScene(pkmn, targetSpecies, 0, partyIndex); - return FALSE; - } - } + if (GetEvolutionTargetSpecies(mon, 2, item) != SPECIES_NONE) + return FALSE; break; } } - sp28++; - r10 >>= 1; + i++; + curEffect >>= 1; } break; case 5: - r10 = itemEffect[cmdIndex]; - sp28 = 0; - while (r10 != 0) + curEffect = itemEffect[cmdIndex]; + i = 0; + while (curEffect) { - if (r10 & 1) + if (curEffect & 1) { - u16 evCount; - - switch (sp28) + switch (i) { case 0: case 1: case 2: case 3: - evCount = GetMonEVCount(pkmn); - if (evCount >= 510) + if (GetMonEVCount(mon) >= 510) return TRUE; - data = GetMonData(pkmn, sGetMonDataEVConstants[sp28 + 2], NULL); + data = GetMonData(mon, sGetMonDataEVConstants[i + 2], NULL); if (data < 100) { - /* - if (data + itemEffect[sp24] > 100) - r4 = 100 - (data + itemEffect[sp24]) + itemEffect[sp24]; - else - r4 = itemEffect[sp24]; - if (evCount + r4 > 510) - r4 += 510 - (evCount + r4); - data += r4; - SetMonData(pkmn, sGetMonDataEVConstants[sp28 + 2], &data); - CalculateMonStats(pkmn); - */ retVal = FALSE; - sp24++; + r10++; } break; case 4: - data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2); - r4 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex); - if (data < 3) - { - if (r4 <= 4) - break; - /* - - data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL); - data &= gPPUpSetMask[moveIndex]; - data += gPPUpAddMask[moveIndex] * 3; - - SetMonData(pkmn, MON_DATA_PP_BONUSES, &data); - data = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - r4; - data = GetMonData(pkmn, MON_DATA_PP1 + moveIndex, NULL) + data; - SetMonData(pkmn, MON_DATA_PP1 + moveIndex, &data); - */ + data = (GetMonData(mon, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2); + tmp = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex); + if (data < 3 && tmp > 4) retVal = FALSE; - } break; case 5: - if (GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) < 100 && retVal == 0 && sp2C == 0) - { - sp2C = itemEffect[sp24]; - /* - friendship = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL); - if (sp2C > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) - friendship += 150 * sp2C / 100; - else - friendship += sp2C; - if (sp2C > 0) - { - if (GetMonData(pkmn, MON_DATA_POKEBALL, NULL) == 11) - friendship++; - if (GetMonData(pkmn, MON_DATA_MET_LOCATION, NULL) == GetCurrentRegionMapSectionId()) - friendship++; - } - if (friendship < 0) - friendship = 0; - if (friendship > 255) - friendship = 255; - SetMonData(pkmn, MON_DATA_FRIENDSHIP, &friendship); - */ - } - sp24++; + if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) < 100 + && retVal == FALSE + && sp18 == 0) + sp18 = itemEffect[r10]; + r10++; break; case 6: - if (GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) >= 100 && GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) < 200 - && retVal == 0 && sp2C == 0) - { - sp2C = itemEffect[sp24]; - /* - friendship = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL); - if (sp2C > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) - friendship += 150 * sp2C / 100; - else - friendship += sp2C; - if (sp2C > 0) - { - if (GetMonData(pkmn, MON_DATA_POKEBALL, NULL) == 11) - friendship++; - if (GetMonData(pkmn, MON_DATA_MET_LOCATION, NULL) == GetCurrentRegionMapSectionId()) - friendship++; - } - if (friendship < 0) - friendship = 0; - if (friendship > 255) - friendship = 255; - SetMonData(pkmn, MON_DATA_FRIENDSHIP, &friendship); - */ - } - sp24++; + if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) >= 100 + && GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) < 200 + && retVal == FALSE + && sp18 == 0) + sp18 = itemEffect[r10]; + r10++; break; - case 7: - if (GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) >= 200 && retVal == 0 && sp2C == 0) - { - sp2C = itemEffect[sp24]; - /* - friendship = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL); - if (sp2C > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) - friendship += 150 * sp2C / 100; - else - friendship += sp2C; - if (sp2C > 0) - { - if (GetMonData(pkmn, MON_DATA_POKEBALL, NULL) == 11) - friendship++; - if (GetMonData(pkmn, MON_DATA_MET_LOCATION, NULL) == GetCurrentRegionMapSectionId()) - friendship++; - } - if (friendship < 0) - friendship = 0; - if (friendship > 255) - friendship = 255; - SetMonData(pkmn, MON_DATA_FRIENDSHIP, &friendship); - */ - } - sp24++; + case 7:\ + + if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) >= 200 + && retVal == FALSE + && sp18 == 0) + sp18 = itemEffect[r10]; + r10++; break; } } - sp28++; - r10 >>= 1; + i++; + curEffect >>= 1; } break; } @@ -4941,7 +4680,7 @@ bool8 PokemonUseItemEffects2(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 m } #else __attribute__((naked)) -bool8 PokemonUseItemEffects2(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 moveIndex, u8 e) +bool8 PokemonUseItemEffects2(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex) { asm(".syntax unified\n\ push {r4-r7,lr}\n\ |