mirror of
https://github.com/pret/pokefirered.git
synced 2026-05-09 04:23:14 -05:00
Merge pull request #100 from jiangzhengwenjz/PIE2
closer PokemonUseItemEffects2
This commit is contained in:
commit
9c6cee5d6c
|
|
@ -610,8 +610,8 @@ u8 CalculatePPWithBonus(u16 move, u8 ppBonuses, u8 moveIndex);
|
|||
void RemoveMonPPBonus(struct Pokemon *mon, u8 moveIndex);
|
||||
void RemoveBattleMonPPBonus(struct BattlePokemon *mon, u8 moveIndex);
|
||||
bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex);
|
||||
bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 moveIndex, u8 e);
|
||||
bool8 PokemonUseItemEffects2(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 moveIndex, u8 e);
|
||||
bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex, u8 e);
|
||||
bool8 PokemonUseItemEffects2(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex);
|
||||
u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit);
|
||||
const u8 *Battle_PrintStatBoosterEffectMessage(u16 itemId);
|
||||
u8 GetNature(struct Pokemon *mon);
|
||||
|
|
|
|||
613
src/pokemon.c
613
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\
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user