PokemonUseItemEffects2

This commit is contained in:
jiangzhengwenjz
2019-09-24 23:13:20 +08:00
parent 6c0fd9884c
commit 29e641bc1c
2 changed files with 102 additions and 363 deletions
+1 -1
View File
@@ -608,7 +608,7 @@ void RemoveMonPPBonus(struct Pokemon *mon, u8 moveIndex);
void RemoveBattleMonPPBonus(struct BattlePokemon *mon, u8 moveIndex); void RemoveBattleMonPPBonus(struct BattlePokemon *mon, u8 moveIndex);
bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 item, u8 partyIndex, 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 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 PokemonUseItemEffects2(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex);
u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit); u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit);
const u8 *Battle_PrintStatBoosterEffectMessage(u16 itemId); const u8 *Battle_PrintStatBoosterEffectMessage(u16 itemId);
u8 GetNature(struct Pokemon *mon); u8 GetNature(struct Pokemon *mon);
+101 -362
View File
@@ -4407,25 +4407,28 @@ static bool8 HealStatusConditions(struct Pokemon *mon, u32 unused, u32 healMask,
#ifdef NONMATCHING #ifdef NONMATCHING
/* /*
* This is nonmatching due to the compiler's insistence on avoiding the u8 cast * This is nonmatching due to:
* when loading gMain.inBattle. If it weren't for this absent cast, differing * 1) the compiler's insistence on avoiding the u8 cast when loading gMain.inBattle
* the function would be a lot easier. * 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) bool8 PokemonUseItemEffects2(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex)
{ // BEGIN {
u32 data; u32 data;
s32 tmp;
s32 cmdIndex; s32 cmdIndex;
bool8 retVal = TRUE; bool8 retVal = TRUE;
const u8 *itemEffect; const u8 *itemEffect;
u8 sp24 = 6; u8 r10 = 6;
u32 sp28; u32 i;
s8 sp2C = 0; s32 sp18 = 0;
u8 sp34 = 4; u8 battlerId = 4;
u16 heldItem; u16 heldItem;
u8 r10; u8 curEffect;
s32 r4; 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 (heldItem == ITEM_ENIGMA_BERRY)
{ {
if (gMain.inBattle) if (gMain.inBattle)
@@ -4437,41 +4440,30 @@ bool8 PokemonUseItemEffects2(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 m
{ {
/*holdEffect = */ItemId_GetHoldEffect(heldItem); /*holdEffect = */ItemId_GetHoldEffect(heldItem);
} }
gPotentialItemEffectBattler = gBattlerInMenuId; 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) if (gMain.inBattle)
{ {
gActiveBattler = gBattlerInMenuId; gActiveBattler = gBattlerInMenuId;
if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) for (cmdIndex = GetBattlerSide(gActiveBattler) != B_SIDE_PLAYER;
cmdIndex = 0; cmdIndex < gBattlersCount;
else cmdIndex += 2) // for/while seems to be identical here
cmdIndex = 1;
while (cmdIndex < gBattlersCount)
{ {
if (gBattlerPartyIndexes[cmdIndex] == partyIndex) if (gBattlerPartyIndexes[cmdIndex] == partyIndex) // why is gBattlerPartyIndexes reloaded?
{ {
sp34 = cmdIndex; battlerId = cmdIndex;
break; break;
} }
cmdIndex += 2;
} }
} }
else else
{ {
gActiveBattler = 0; gActiveBattler = 0;
sp34 = 4; battlerId = 4;
} }
// _08042504
if (!IS_POKEMON_ITEM(item)) if (!IS_POKEMON_ITEM(item))
return TRUE; return TRUE;
if (gItemEffectTable[item - 13] == NULL && item != ITEM_ENIGMA_BERRY) if (gItemEffectTable[item - 13] == NULL && item != ITEM_ENIGMA_BERRY)
return TRUE; return TRUE;
if (item == ITEM_ENIGMA_BERRY) if (item == ITEM_ENIGMA_BERRY)
{ {
if (gMain.inBattle) if (gMain.inBattle)
@@ -4483,457 +4475,204 @@ bool8 PokemonUseItemEffects2(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 m
{ {
itemEffect = gItemEffectTable[item - 13]; itemEffect = gItemEffectTable[item - 13];
} }
for (cmdIndex = 0; cmdIndex < 6; cmdIndex++) for (cmdIndex = 0; cmdIndex < 6; cmdIndex++)
{ {
switch (cmdIndex) switch (cmdIndex)
{ {
// status healing effects // status healing effects
case 0: case 0:
if ((itemEffect[cmdIndex] & 0x80) if (itemEffect[cmdIndex] & 0x80
&& gMain.inBattle && sp34 != 4 && (gBattleMons[sp34].status2 & STATUS2_INFATUATION)) && gMain.inBattle
{ && battlerId != 4
//gBattleMons[sp34].status2 &= ~STATUS2_INFATUATION; && gBattleMons[battlerId].status2 & STATUS2_INFATUATION)
retVal = FALSE; retVal = FALSE;
} if (itemEffect[cmdIndex] & 0x30
if ((itemEffect[cmdIndex] & 0x30)
&& !(gBattleMons[gActiveBattler].status2 & STATUS2_FOCUS_ENERGY)) && !(gBattleMons[gActiveBattler].status2 & STATUS2_FOCUS_ENERGY))
{
//gBattleMons[gActiveBattler].status2 |= STATUS2_FOCUS_ENERGY;
retVal = FALSE; retVal = FALSE;
}
if ((itemEffect[cmdIndex] & 0xF) if ((itemEffect[cmdIndex] & 0xF)
&& gBattleMons[gActiveBattler].statStages[STAT_STAGE_ATK] < 12) && 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; retVal = FALSE;
}
break; break;
// in-battle stat boosting effects? // in-battle stat boosting effects?
case 1: case 1:
if ((itemEffect[cmdIndex] & 0xF0) if ((itemEffect[cmdIndex] & 0xF0)
&& gBattleMons[gActiveBattler].statStages[STAT_STAGE_DEF] < 12) && 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; retVal = FALSE;
}
if ((itemEffect[cmdIndex] & 0xF) if ((itemEffect[cmdIndex] & 0xF)
&& gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPEED] < 12) && 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; retVal = FALSE;
}
break; break;
// more stat boosting effects? // more stat boosting effects?
case 2: case 2:
if ((itemEffect[cmdIndex] & 0xF0) if ((itemEffect[cmdIndex] & 0xF0)
&& gBattleMons[gActiveBattler].statStages[STAT_STAGE_ACC] < 12) && 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; retVal = FALSE;
}
if ((itemEffect[cmdIndex] & 0xF) if ((itemEffect[cmdIndex] & 0xF)
&& gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPATK] < 12) && 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; retVal = FALSE;
}
break; break;
case 3: case 3:
if ((itemEffect[cmdIndex] & 0x80) if ((itemEffect[cmdIndex] & 0x80)
&& gSideTimers[GetBattlerSide(gActiveBattler)].mistTimer == 0) && gSideTimers[GetBattlerSide(gActiveBattler)].mistTimer == 0)
{
//gSideTimers[GetBattlerSide(gActiveBattler)].mistTimer = 5;
retVal = FALSE; retVal = FALSE;
}
if ((itemEffect[cmdIndex] & 0x40) // raise level 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);
retVal = FALSE; retVal = FALSE;
}
if ((itemEffect[cmdIndex] & 0x20) if ((itemEffect[cmdIndex] & 0x20)
&& sub_8042BE8(pkmn, partyIndex, 7, sp34) == 0) && sub_8042BE8(mon, partyIndex, 7, battlerId))
{
//if (sp34 != 4)
// gBattleMons[sp34].status2 &= ~STATUS2_NIGHTMARE;
retVal = FALSE; retVal = FALSE;
} if ((itemEffect[cmdIndex] & 0x10) && sub_8042BE8(mon, partyIndex, 0xF88, battlerId))
if ((itemEffect[cmdIndex] & 0x10) && sub_8042BE8(pkmn, partyIndex, 0xF88, sp34) == 0)
retVal = FALSE; 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; 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; 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; retVal = FALSE;
if ((itemEffect[cmdIndex] & 1) // heal confusion if (itemEffect[cmdIndex] & 1 // heal confusion
&& gMain.inBattle && sp34 != 4 && (gBattleMons[sp34].status2 & STATUS2_CONFUSION)) && gMain.inBattle && battlerId != 4 && (gBattleMons[battlerId].status2 & STATUS2_CONFUSION))
{
//gBattleMons[sp34].status2 &= ~STATUS2_CONFUSION;
retVal = FALSE; retVal = FALSE;
}
break; break;
// EV, HP, and PP raising effects // EV, HP, and PP raising effects
case 4: case 4:
r10 = itemEffect[cmdIndex]; curEffect = itemEffect[cmdIndex];
if (r10 & 0x20) if (curEffect & 0x20)
{ {
r10 &= ~0x20; curEffect &= ~0x20;
data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2); data = (GetMonData(mon, 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); i = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex);
if (data < 3 && sp28 > 4) if (data < 3 && i > 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);
retVal = FALSE; retVal = FALSE;
}
} }
sp28 = 0; i = 0;
while (r10 != 0) // _080428C0 while (curEffect) // _080428C0
{ {
if (r10 & 1) if (curEffect & 1)
{ {
u16 evCount; switch (i)
u16 targetSpecies;
s32 r5;
switch (sp28)
{ {
case 0: case 0:
case 1: case 1:
evCount = GetMonEVCount(pkmn); if (GetMonEVCount(mon) >= 510)
if (evCount >= 510)
return TRUE; return TRUE;
data = GetMonData(pkmn, sGetMonDataEVConstants[sp28], NULL); data = GetMonData(mon, sGetMonDataEVConstants[i], NULL);
if (data < 100) if (data < 100)
{ {
//if (data + itemEffect[sp24] > 100) r10++;
// r4 = 100 - (data + itemEffect[sp24]) + itemEffect[sp24];
//else
// r4 = itemEffect[sp24];
//if (evCount + r4 > 510)
// r4 += 510 - (evCount + r4);
//data += r4;
//SetMonData(pkmn, sGetMonDataEVConstants[sp28], &data);
//CalculateMonStats(pkmn);
sp24++;
retVal = FALSE; retVal = FALSE;
} }
break; break;
case 2: case 2:
// revive? // 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; 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 else
{ {
if (GetMonData(pkmn, MON_DATA_HP, NULL) == 0) if (GetMonData(mon, MON_DATA_HP, NULL) == 0)
{ {
sp24++; r10++;
break; break;
} }
} }
/* if (GetMonData(mon, MON_DATA_MAX_HP, NULL) != GetMonData(mon, MON_DATA_HP, NULL))
data = itemEffect[sp24++];
switch (data)
{
case 0xFF:
data = GetMonData(pkmn, MON_DATA_MAX_HP, NULL) - GetMonData(pkmn, MON_DATA_HP, NULL);
break;
case 0xFE:
data = GetMonData(pkmn, MON_DATA_MAX_HP, NULL) / 2;
if (data == 0)
data = 1;
break;
case 0xFD:
data = gBattleScripting.field_23;
break;
}
*/
if (GetMonData(pkmn, MON_DATA_MAX_HP, NULL) != GetMonData(pkmn, MON_DATA_HP, NULL))
{
/*
if (e == 0)
{
data = GetMonData(pkmn, MON_DATA_HP, NULL) + data;
if (data > GetMonData(pkmn, MON_DATA_MAX_HP, NULL))
data = GetMonData(pkmn, MON_DATA_MAX_HP, NULL);
SetMonData(pkmn, MON_DATA_HP, &data);
if (gMain.inBattle && sp34 != 4)
{
gBattleMons[sp34].hp = data;
if (!(r10 & 0x10) && GetBattlerSide(gActiveBattler) == 0)
{
if (gBattleResults.unk3 < 255)
gBattleResults.unk3++;
// I have to re-use this variable to match.
r5 = gActiveBattler;
gActiveBattler = sp34;
BtlController_EmitGetMonData(0, 0, 0);
MarkBufferBankForExecution(gActiveBattler);
gActiveBattler = r5;
}
}
}
else
{
gBattleMoveDamage = -data;
}
*/
retVal = FALSE; retVal = FALSE;
} r10++;
sp24++; curEffect &= 0xEF;
r10 &= 0xEF;
break; break;
case 3: 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); data = GetMonData(mon, MON_DATA_PP1 + tmp, NULL);
r4 = GetMonData(pkmn, MON_DATA_MOVE1 + r5, NULL); curMoveId = GetMonData(mon, MON_DATA_MOVE1 + tmp, NULL);
if (data != CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), r5)) if (data != CalculatePPWithBonus(curMoveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), tmp))
{
/*
data += itemEffect[sp24];
r4 = GetMonData(pkmn, MON_DATA_MOVE1 + r5, NULL);
if (data > CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), r5))
{
r4 = GetMonData(pkmn, MON_DATA_MOVE1 + r5, NULL);
data = CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), r5);
}
SetMonData(pkmn, MON_DATA_PP1 + r5, &data);
if (gMain.inBattle
&& sp34 != 4 && !(gBattleMons[sp34].status2 & 0x200000)
&& !(gDisableStructs[sp34].unk18_b & gBitTable[r5]))
gBattleMons[sp34].pp[r5] = data;
*/
retVal = FALSE; retVal = FALSE;
}
} }
r10++;
} }
else // _080429FA else // _080429FA
{ {
data = GetMonData(pkmn, MON_DATA_PP1 + moveIndex, NULL); data = GetMonData(mon, MON_DATA_PP1 + moveIndex, NULL);
r4 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL); curMoveId = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL);
if (data != CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex)) if (data != CalculatePPWithBonus(curMoveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex))
{ {
/* r10++;
data += itemEffect[sp24++];
r4 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL);
if (data > CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex))
{
r4 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL);
data = CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex);
}
SetMonData(pkmn, MON_DATA_PP1 + moveIndex, &data);
if (gMain.inBattle
&& sp34 != 4 && !(gBattleMons[sp34].status2 & 0x200000)
&& !(gDisableStructs[sp34].unk18_b & gBitTable[moveIndex]))
gBattleMons[sp34].pp[moveIndex] = data;
*/
sp24++;
retVal = FALSE; retVal = FALSE;
} }
} }
break; break;
case 7: case 7:
{ if (GetEvolutionTargetSpecies(mon, 2, item) != SPECIES_NONE)
targetSpecies = GetEvolutionTargetSpecies(pkmn, 2, item); return FALSE;
if (targetSpecies != SPECIES_NONE)
{
//BeginEvolutionScene(pkmn, targetSpecies, 0, partyIndex);
return FALSE;
}
}
break; break;
} }
} }
sp28++; i++;
r10 >>= 1; curEffect >>= 1;
} }
break; break;
case 5: case 5:
r10 = itemEffect[cmdIndex]; curEffect = itemEffect[cmdIndex];
sp28 = 0; i = 0;
while (r10 != 0) while (curEffect)
{ {
if (r10 & 1) if (curEffect & 1)
{ {
u16 evCount; switch (i)
switch (sp28)
{ {
case 0: case 0:
case 1: case 1:
case 2: case 2:
case 3: case 3:
evCount = GetMonEVCount(pkmn); if (GetMonEVCount(mon) >= 510)
if (evCount >= 510)
return TRUE; return TRUE;
data = GetMonData(pkmn, sGetMonDataEVConstants[sp28 + 2], NULL); data = GetMonData(mon, sGetMonDataEVConstants[i + 2], NULL);
if (data < 100) 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; retVal = FALSE;
sp24++; r10++;
} }
break; break;
case 4: 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);
r4 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex); tmp = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex);
if (data < 3) if (data < 3 && tmp > 4)
{
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);
*/
retVal = FALSE; retVal = FALSE;
}
break; break;
case 5: case 5:
if (GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) < 100 && retVal == 0 && sp2C == 0) if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) < 100
{ && retVal == FALSE
sp2C = itemEffect[sp24]; && sp18 == 0)
/* sp18 = itemEffect[r10];
friendship = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL); r10++;
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++;
break; break;
case 6: 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
&& retVal == 0 && sp2C == 0) && GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) < 200
{ && retVal == FALSE
sp2C = itemEffect[sp24]; && sp18 == 0)
/* sp18 = itemEffect[r10];
friendship = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL); r10++;
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++;
break; break;
case 7: case 7:\
if (GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) >= 200 && retVal == 0 && sp2C == 0)
{ if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) >= 200
sp2C = itemEffect[sp24]; && retVal == FALSE
/* && sp18 == 0)
friendship = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL); sp18 = itemEffect[r10];
if (sp2C > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) r10++;
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++;
break; break;
} }
} }
sp28++; i++;
r10 >>= 1; curEffect >>= 1;
} }
break; break;
} }
@@ -4942,7 +4681,7 @@ bool8 PokemonUseItemEffects2(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 m
} }
#else #else
__attribute__((naked)) __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\ asm(".syntax unified\n\
push {r4-r7,lr}\n\ push {r4-r7,lr}\n\