summaryrefslogtreecommitdiff
path: root/src/battle_3.c
diff options
context:
space:
mode:
authorDizzyEggg <jajkodizzy@wp.pl>2017-07-24 18:24:06 +0200
committerDizzyEggg <jajkodizzy@wp.pl>2017-07-24 18:24:06 +0200
commit7b5f9c3d5e63dbb83d43515f16b718a1579e1624 (patch)
tree2808b0039147a178fc213f62f2603181b3547ad4 /src/battle_3.c
parent551339599934103779bc81b4f258a5d611cf4f80 (diff)
a loop problem
Diffstat (limited to 'src/battle_3.c')
-rw-r--r--src/battle_3.c415
1 files changed, 375 insertions, 40 deletions
diff --git a/src/battle_3.c b/src/battle_3.c
index b1c6d9016..5c6bc8b07 100644
--- a/src/battle_3.c
+++ b/src/battle_3.c
@@ -33,12 +33,18 @@ extern u16 gBattleWeather;
extern void (*gBattleMainFunc)(void);
extern u8 gAbsentBankFlags;
extern u8 gBattleCommunication[];
+extern u32 gHitMarker;
+extern u8 gEffectBank;
+extern s32 gBattleMoveDamage;
u8 IsImprisoned(u8 bank, u16 move);
u8 GetBankByPlayerAI(u8 ID);
u8 GetBankIdentity(u8 bank);
u8 GetBankSide(u8 bank);
void b_call_bc_move_exec(u8* BS_ptr);
+bool8 sub_8015660(u8 bank); //check if a move failed
+void SetMoveEffect(bool8 primary, u8 certainArg);
+bool8 sub_8025A44(u8 bank); //uproar wakeup check
extern u8 BattleScript_MoveSelectionDisabledMove[];
extern u8 BattleScript_MoveSelectionTormented[];
@@ -56,6 +62,21 @@ extern u8 gUnknown_081D9016[];
extern u8 gUnknown_081D9008[];
extern u8 gUnknown_081D9041[];
+extern u8 gUnknown_081D93D1[]; //ingrain bs
+extern u8 gUnknown_081D904B[]; //leech seed BS
+extern u8 gUnknown_081D9518[]; //poison dmg BS
+extern u8 gUnknown_081D953A[]; //burn dmg BS
+extern u8 gUnknown_081D9613[]; //nightmare dmg BS
+extern u8 gUnknown_081D9624[]; //curse dmg BS
+extern u8 gUnknown_081D95E2[]; //wrap dmg BS
+extern u8 gUnknown_081D95F4[]; //wrap ends BS
+extern u8 gUnknown_081D950F[]; //uproar wakeup BS
+extern u8 gUnknown_081D957E[]; //uproar BS
+extern u8 gUnknown_081D9587[]; //thrash confusion BS
+extern u8 gUnknown_081D9148[]; //disabled no more BS
+extern u8 gUnknown_081D914F[]; //encored no more BS
+extern u8 gUnknown_081D964C[]; //yawn sleep BS
+
#define CHOICED_MOVE(bank)(((u16*)(&ewram[bank * 2 + 0x160e8])))
//array entries for battle communication
@@ -207,15 +228,23 @@ u8 IsImprisoned(u8 bank, u16 move)
}
return imprisionedMoves;
}
-/*
+
u8 UpdateTurnCounters(void)
{
u8 effect = 0;
s32 i;
- for (gBankAttacker = 0; gBankAttacker < gNoOfAllBanks && gAbsentBankFlags & gBitTable[gBankAttacker]; gBankAttacker++) {}
- for (gBankTarget = 0; gBankTarget < gNoOfAllBanks && gAbsentBankFlags & gBitTable[gBankTarget]; gBankTarget++) {}
+
+ for (gBankAttacker = 0; gBankAttacker < gNoOfAllBanks && gAbsentBankFlags & gBitTable[gBankAttacker]; gBankAttacker++)
+ {
+ }
+ for (gBankTarget = 0; gBankTarget < gNoOfAllBanks && gAbsentBankFlags & gBitTable[gBankTarget]; gBankTarget++)
+ {
+ }
+
do
{
+ u8 sideBank;
+
switch (BATTLE_STRUCT->turncountersTracker)
{
case 0:
@@ -237,13 +266,14 @@ u8 UpdateTurnCounters(void)
case 1:
while (BATTLE_STRUCT->turnSideTracker < 2)
{
- gBankAttacker = BATTLE_STRUCT->turnSideTracker;
- gActiveBank = BATTLE_STRUCT->turnSideTracker;
- if (gSideAffecting[BATTLE_STRUCT->turnSideTracker] & SIDE_STATUS_REFLECT)
+ gActiveBank = gBankAttacker = sideBank = BATTLE_STRUCT->turnSideTracker;
+
+ if (gSideAffecting[sideBank] & SIDE_STATUS_REFLECT)
{
- if (--gSideTimer[BATTLE_STRUCT->turnSideTracker].reflectTimer == 0)
+ if (--gSideTimer[sideBank].reflectTimer == 0)
{
- gSideAffecting[BATTLE_STRUCT->turnSideTracker] &= ~SIDE_STATUS_REFLECT;
+
+ gSideAffecting[sideBank] &= ~SIDE_STATUS_REFLECT;
b_call_bc_move_exec(gUnknown_081D9030);
gBattleTextBuff1[0] = 0xFD;
gBattleTextBuff1[1] = 2;
@@ -266,15 +296,14 @@ u8 UpdateTurnCounters(void)
case 2:
while (BATTLE_STRUCT->turnSideTracker < 2)
{
- gBankAttacker = BATTLE_STRUCT->turnSideTracker;
- gActiveBank = BATTLE_STRUCT->turnSideTracker;
- if (gSideAffecting[BATTLE_STRUCT->turnSideTracker] & SIDE_STATUS_LIGHTSCREEN)
+ gActiveBank = gBankAttacker = sideBank = BATTLE_STRUCT->turnSideTracker;
+ if (gSideAffecting[sideBank] & SIDE_STATUS_LIGHTSCREEN)
{
- if (--gSideTimer[BATTLE_STRUCT->turnSideTracker].lightscreenTimer == 0)
+ if (--gSideTimer[sideBank].lightscreenTimer == 0)
{
- gSideAffecting[BATTLE_STRUCT->turnSideTracker] &= ~SIDE_STATUS_LIGHTSCREEN;
+ gSideAffecting[sideBank] &= ~SIDE_STATUS_LIGHTSCREEN;
b_call_bc_move_exec(gUnknown_081D9030);
- gBattleCommunication[MULTISTRING_CHOOSER] = BATTLE_STRUCT->turnSideTracker;
+ gBattleCommunication[MULTISTRING_CHOOSER] = sideBank;
gBattleTextBuff1[0] = 0xFD;
gBattleTextBuff1[1] = 2;
gBattleTextBuff1[2] = MOVE_LIGHT_SCREEN;
@@ -296,13 +325,12 @@ u8 UpdateTurnCounters(void)
case 3:
while (BATTLE_STRUCT->turnSideTracker < 2)
{
- gBankAttacker = BATTLE_STRUCT->turnSideTracker;
- gActiveBank = BATTLE_STRUCT->turnSideTracker;
- if (gSideTimer[BATTLE_STRUCT->turnSideTracker].mistTimer && --gSideTimer[BATTLE_STRUCT->turnSideTracker].mistTimer == 0)
+ gActiveBank = gBankAttacker = sideBank = BATTLE_STRUCT->turnSideTracker;
+ if (gSideTimer[sideBank].mistTimer && --gSideTimer[sideBank].mistTimer == 0)
{
- gSideAffecting[BATTLE_STRUCT->turnSideTracker] &= ~SIDE_STATUS_MIST;
+ gSideAffecting[sideBank] &= ~SIDE_STATUS_MIST;
b_call_bc_move_exec(gUnknown_081D9030);
- gBattleCommunication[MULTISTRING_CHOOSER] = BATTLE_STRUCT->turnSideTracker;
+ gBattleCommunication[MULTISTRING_CHOOSER] = sideBank;
gBattleTextBuff1[0] = 0xFD;
gBattleTextBuff1[1] = 2;
gBattleTextBuff1[2] = MOVE_MIST;
@@ -323,13 +351,12 @@ u8 UpdateTurnCounters(void)
case 4:
while (BATTLE_STRUCT->turnSideTracker < 2)
{
- gBankAttacker = BATTLE_STRUCT->turnSideTracker;
- gActiveBank = BATTLE_STRUCT->turnSideTracker;
- if (gSideAffecting[BATTLE_STRUCT->turnSideTracker] & SIDE_STATUS_SAFEGUARD)
+ gActiveBank = gBankAttacker = sideBank = BATTLE_STRUCT->turnSideTracker;
+ if (gSideAffecting[sideBank] & SIDE_STATUS_SAFEGUARD)
{
- if (--gSideTimer[BATTLE_STRUCT->turnSideTracker].safeguardTimer == 0)
+ if (--gSideTimer[sideBank].safeguardTimer == 0)
{
- gSideAffecting[BATTLE_STRUCT->turnSideTracker] &= ~SIDE_STATUS_SAFEGUARD;
+ gSideAffecting[sideBank] &= ~SIDE_STATUS_SAFEGUARD;
b_call_bc_move_exec(gUnknown_081D9041);
effect++;
}
@@ -348,9 +375,9 @@ u8 UpdateTurnCounters(void)
while (BATTLE_STRUCT->turnSideTracker < gNoOfAllBanks)
{
gActiveBank = gTurnOrder[BATTLE_STRUCT->turnSideTracker];
- if (gWishFutureKnock.wishCounter[BATTLE_STRUCT->turnSideTracker] && --gWishFutureKnock.wishCounter[BATTLE_STRUCT->turnSideTracker] == 0 && gBattleMons[BATTLE_STRUCT->turnSideTracker].hp)
+ if (gWishFutureKnock.wishCounter[gActiveBank] && --gWishFutureKnock.wishCounter[gActiveBank] == 0 && gBattleMons[gActiveBank].hp)
{
- gBankTarget = BATTLE_STRUCT->turnSideTracker;
+ gBankTarget = gActiveBank;
b_call_bc_move_exec(BattleScript_WishComesTrue);
effect++;
}
@@ -398,11 +425,12 @@ u8 UpdateTurnCounters(void)
}
else
gBattlescriptCurrInstr = gUnknown_081D8F7D;
+
+ BATTLE_STRUCT->animArg1 = 0xC;
+ gBattleCommunication[MULTISTRING_CHOOSER] = 0;
+ b_call_bc_move_exec(gBattlescriptCurrInstr);
+ effect++;
}
- BATTLE_STRUCT->animArg1 = 0xD;
- gBattleCommunication[MULTISTRING_CHOOSER] = 1;
- b_call_bc_move_exec(gBattlescriptCurrInstr);
- effect++;
BATTLE_STRUCT->turncountersTracker++;
break;
case 8:
@@ -415,11 +443,10 @@ u8 UpdateTurnCounters(void)
}
else
gBattlescriptCurrInstr = gUnknown_081D9008;
+
+ b_call_bc_move_exec(gBattlescriptCurrInstr);
+ effect++;
}
- BATTLE_STRUCT->animArg1 = 0xD;
- gBattleCommunication[MULTISTRING_CHOOSER] = 1;
- b_call_bc_move_exec(gBattlescriptCurrInstr);
- effect++;
BATTLE_STRUCT->turncountersTracker++;
break;
case 9:
@@ -432,19 +459,327 @@ u8 UpdateTurnCounters(void)
}
else
gBattlescriptCurrInstr = gUnknown_081D8F7D;
+
+ BATTLE_STRUCT->animArg1 = 0xD;
+ gBattleCommunication[MULTISTRING_CHOOSER] = 1;
+ b_call_bc_move_exec(gBattlescriptCurrInstr);
+ effect++;
}
- BATTLE_STRUCT->animArg1 = 0xD;
- gBattleCommunication[MULTISTRING_CHOOSER] = 1;
- b_call_bc_move_exec(gBattlescriptCurrInstr);
- effect++;
BATTLE_STRUCT->turncountersTracker++;
break;
case 10:
effect++;
break;
}
- } while (!effect);
+ } while (effect == 0);
return (gBattleMainFunc != BattleTurnPassed);
}
-*/
+#define TURNBASED_MAX_CASE 19
+
+bool8 TurnBasedEffects(void)
+{
+ u8 effect = 0;
+ gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_x20);
+ while (BATTLE_STRUCT->turnEffectsBank < gNoOfAllBanks && BATTLE_STRUCT->turnEffectsTracker <= TURNBASED_MAX_CASE)
+ {
+ gActiveBank = gBankAttacker = gTurnOrder[BATTLE_STRUCT->turnEffectsBank];
+ if (gAbsentBankFlags & gBitTable[gActiveBank])
+ {
+ BATTLE_STRUCT->turnEffectsBank++;
+ }
+ else
+ {
+ int i;
+ switch (BATTLE_STRUCT->turnEffectsTracker)
+ {
+ case 0: //ingrain
+ if (gStatuses3[gActiveBank] & STATUS3_ROOTED && gBattleMons[gActiveBank].hp != gBattleMons[gActiveBank].maxHP && gBattleMons[gActiveBank].hp != 0)
+ {
+ gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 16;
+ if (gBattleMoveDamage == 0)
+ gBattleMoveDamage = 1;
+ gBattleMoveDamage *= -1;
+ b_call_bc_move_exec(gUnknown_081D93D1);
+ effect++;
+ }
+ BATTLE_STRUCT->turnEffectsTracker++;
+ break;
+ case 1: //end turn abilities
+ if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, gActiveBank, 0, 0, 0))
+ effect++;
+ BATTLE_STRUCT->turnEffectsTracker++;
+ break;
+ case 2: //item effects
+ if (ItemBattleEffects(0, gActiveBank, 0))
+ effect++;
+ BATTLE_STRUCT->turnEffectsTracker++;
+ break;
+ case 18: //item effects again
+ if (ItemBattleEffects(1, gActiveBank, 1))
+ effect++;
+ BATTLE_STRUCT->turnEffectsTracker++;
+ break;
+ case 3: //leech seed
+ {
+ u8 leecher;
+ if (gStatuses3[gActiveBank] & STATUS3_LEECHSEED && gBattleMons[leecher = (gStatuses3[gActiveBank] & STATUS3_LEECHSEED_BANK)].hp && gBattleMons[gActiveBank].hp) //wont match without this ugly leecher assignment
+ {
+ //u8 leecher = gStatuses3[gActiveBank] & STATUS3_LEECHSEED_BANK;
+ gBankTarget = leecher; //funny how the 'target' is actually the bank that receives HP
+ gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 8;
+ if (gBattleMoveDamage == 0)
+ gBattleMoveDamage = 1;
+ BATTLE_STRUCT->animArg1 = leecher;
+ BATTLE_STRUCT->animArg2 = gBankAttacker;
+ b_call_bc_move_exec(gUnknown_081D904B);
+ effect++;
+ }
+ BATTLE_STRUCT->turnEffectsTracker++;
+ }
+ break;
+ case 4: //poison
+ if (gBattleMons[gActiveBank].status1 & STATUS_POISON && gBattleMons[gActiveBank].hp)
+ {
+ gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 8;
+ if (gBattleMoveDamage == 0)
+ gBattleMoveDamage = 1;
+ b_call_bc_move_exec(gUnknown_081D9518);
+ effect++;
+ }
+ BATTLE_STRUCT->turnEffectsTracker++;
+ break;
+ case 5: //toxic poison
+ if (gBattleMons[gActiveBank].status1 & STATUS_TOXIC_POISON && gBattleMons[gActiveBank].hp)
+ {
+ gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 16;
+ if (gBattleMoveDamage == 0)
+ gBattleMoveDamage = 1;
+ if ((gBattleMons[gActiveBank].status1 & 0xF00) != 0xF00) //not 16 turns
+ gBattleMons[gActiveBank].status1 += 0x100;
+ gBattleMoveDamage *= (gBattleMons[gActiveBank].status1 & 0xF00) >> 8;
+ b_call_bc_move_exec(gUnknown_081D9518);
+ effect++;
+ }
+ BATTLE_STRUCT->turnEffectsTracker++;
+ break;
+ case 6: //burn
+ if (gBattleMons[gActiveBank].status1 & STATUS_BURN && gBattleMons[gActiveBank].hp)
+ {
+ gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 8;
+ if (gBattleMoveDamage == 0)
+ gBattleMoveDamage = 1;
+ b_call_bc_move_exec(gUnknown_081D953A);
+ effect++;
+ }
+ BATTLE_STRUCT->turnEffectsTracker++;
+ break;
+ case 7: //spooky nightmares
+ if (gBattleMons[gActiveBank].status2 & STATUS2_NIGHTMARE && gBattleMons[gActiveBank].hp)
+ {
+ //missing sleep check
+ gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 4;
+ if (gBattleMoveDamage == 0)
+ gBattleMoveDamage = 1;
+ b_call_bc_move_exec(gUnknown_081D9613);
+ effect++;
+ }
+ BATTLE_STRUCT->turnEffectsTracker++;
+ break;
+ case 8: //curse
+ if (gBattleMons[gActiveBank].status2 & STATUS2_CURSED && gBattleMons[gActiveBank].hp)
+ {
+ gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 4;
+ if (gBattleMoveDamage == 0)
+ gBattleMoveDamage = 1;
+ b_call_bc_move_exec(gUnknown_081D9624);
+ effect++;
+ }
+ BATTLE_STRUCT->turnEffectsTracker++;
+ break;
+ case 9: //wrap
+ if (gBattleMons[gActiveBank].status2 & STATUS2_WRAPPED && gBattleMons[gActiveBank].hp)
+ {
+ gBattleMons[gActiveBank].status2 &= 0xFFFFE000; //hmmm
+ if (gBattleMons[gActiveBank].status2 & STATUS2_WRAPPED) //damaged by wrap
+ {
+ BATTLE_STRUCT->animArg1 = ewram[gActiveBank * 2 + 0x16004];
+ BATTLE_STRUCT->animArg2 = ewram[gActiveBank * 2 + 0x16005];
+ gBattleTextBuff1[0] = 0xFD;
+ gBattleTextBuff1[1] = 2;
+ gBattleTextBuff1[2] = ewram[gActiveBank * 2 + 0x16004];
+ gBattleTextBuff1[3] = ewram[gActiveBank * 2 + 0x16005];
+ gBattleTextBuff1[4] = 0xFF;
+ gBattlescriptCurrInstr = gUnknown_081D95E2;
+ gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 16;
+ if (gBattleMoveDamage == 0)
+ gBattleMoveDamage = 1;
+ }
+ else //broke free
+ {
+ gBattleTextBuff1[0] = 0xFD;
+ gBattleTextBuff1[1] = 2;
+ gBattleTextBuff1[2] = ewram[gActiveBank * 2 + 0x16004];
+ gBattleTextBuff1[3] = ewram[gActiveBank * 2 + 0x16005];
+ gBattleTextBuff1[4] = 0xFF;
+ gBattlescriptCurrInstr = gUnknown_081D95F4;
+ }
+ b_call_bc_move_exec(gBattlescriptCurrInstr);
+ effect++;
+ }
+ BATTLE_STRUCT->turnEffectsTracker++;
+ break;
+ case 10: //uproar
+ if (gBattleMons[gActiveBank].status2 & STATUS2_UPROAR)
+ {
+ for (gBankAttacker = 0; gBankAttacker < gNoOfAllBanks; gBankAttacker++)
+ {
+ if (gBattleMons[gBankAttacker].status1 & STATUS_SLEEP && gBattleMons[gBankAttacker].ability != ABILITY_SOUNDPROOF)
+ {
+ gBattleMons[gBankAttacker].status1 &= ~(STATUS_SLEEP);
+ gBattleMons[gBankAttacker].status2 &= ~(STATUS2_NIGHTMARE);
+ gBattleCommunication[MULTISTRING_CHOOSER] = 1;
+ b_call_bc_move_exec(gUnknown_081D950F);
+ gActiveBank = gBankAttacker;
+ EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBankAttacker].status1);
+ MarkBufferBankForExecution(gActiveBank);
+ break;
+ }
+ }
+ if (gBankAttacker != gNoOfAllBanks)
+ {
+ effect = 2; //a pokemon was awaken
+ break;
+ }
+ else
+ {
+ gBankAttacker = gActiveBank;
+ gBattleMons[gActiveBank].status2 -= 0x10; //uproar timer goes down
+ if (sub_8015660(gActiveBank))
+ {
+ CancelMultiTurnMoves(gActiveBank);
+ gBattleCommunication[MULTISTRING_CHOOSER] = 1;
+ }
+ else if (gBattleMons[gActiveBank].status2 & STATUS2_UPROAR)
+ {
+ gBattleCommunication[MULTISTRING_CHOOSER] = 0;
+ gBattleMons[gActiveBank].status2 |= STATUS2_MULTIPLETURNS;
+ }
+ else
+ {
+ gBattleCommunication[MULTISTRING_CHOOSER] = 1;
+ CancelMultiTurnMoves(gActiveBank);
+ }
+ b_call_bc_move_exec(gUnknown_081D957E);
+ effect = 1;
+ }
+ }
+ if (effect != 2)
+ BATTLE_STRUCT->turnEffectsTracker++;
+ break;
+ case 11: //thrash
+ if (gBattleMons[gActiveBank].status2 & STATUS2_LOCK_CONFUSE)
+ {
+ gBattleMons[gActiveBank].status2 &= 0xFFFFFC00;
+ if (sub_8015660(gActiveBank))
+ CancelMultiTurnMoves(gActiveBank);
+ else if (!(gBattleMons[gActiveBank].status2 & STATUS2_LOCK_CONFUSE) && gBattleMons[gActiveBank].status2 & STATUS2_MULTIPLETURNS)
+ {
+ gBattleMons[gActiveBank].status2 &= 0xFFFFEFFF;
+ if (!(gBattleMons[gActiveBank].status2 & STATUS2_CONFUSION))
+ {
+ gBattleCommunication[MOVE_EFFECT_BYTE] = 0x47;
+ SetMoveEffect(1, 0);
+ if (gBattleMons[gActiveBank].status2 & STATUS2_CONFUSION)
+ b_call_bc_move_exec(gUnknown_081D9587);
+ effect++;
+ }
+ }
+ }
+ BATTLE_STRUCT->turnEffectsTracker++;
+ break;
+ case 12: //disable
+ if (gDisableStructs[gActiveBank].disableTimer1)
+ {
+ for (i = 0; i < 4; i++)
+ {
+ if (gDisableStructs[gActiveBank].disabledMove == gBattleMons[gActiveBank].moves[i])
+ break;
+ }
+ if (i == 4) //pokemon does not have the disabled move anymore
+ {
+ gDisableStructs[gActiveBank].disabledMove = 0;
+ gDisableStructs[gActiveBank].disableTimer1 = 0;
+ }
+ else if (--gDisableStructs[gActiveBank].disableTimer1 == 0) //disable ends
+ {
+ gDisableStructs[gActiveBank].disabledMove = 0;
+ b_call_bc_move_exec(gUnknown_081D9148);
+ effect++;
+ }
+ }
+ BATTLE_STRUCT->turnEffectsTracker++;
+ break;
+ case 13: //encore
+ if (gDisableStructs[gActiveBank].encoreTimer1)
+ {
+ if (gBattleMons[gActiveBank].moves[gDisableStructs[gActiveBank].encoredMovePos] != gDisableStructs[gActiveBank].encoredMove) //pokemon does not have the encored move anymore
+ {
+ gDisableStructs[gActiveBank].encoredMove = 0;
+ gDisableStructs[gActiveBank].encoreTimer1 = 0;
+ }
+ else if (--gDisableStructs[gActiveBank].encoreTimer1 == 0 || gBattleMons[gActiveBank].pp[gDisableStructs[gActiveBank].encoredMovePos] == 0)
+ {
+ gDisableStructs[gActiveBank].encoredMove = 0;
+ gDisableStructs[gActiveBank].encoreTimer1 = 0;
+ b_call_bc_move_exec(gUnknown_081D914F);
+ effect++;
+ }
+ }
+ BATTLE_STRUCT->turnEffectsTracker++;
+ break;
+ case 14: //lock-on decrement
+ if (gStatuses3[gActiveBank] & STATUS3_ALWAYS_HITS)
+ gStatuses3[gActiveBank] -= 0x8;
+ BATTLE_STRUCT->turnEffectsTracker++;
+ break;
+ case 15: //charge
+ if (gDisableStructs[gActiveBank].chargeTimer1 && --gDisableStructs[gActiveBank].chargeTimer1 == 0)
+ gStatuses3[gActiveBank] &= ~STATUS3_CHARGED_UP;
+ BATTLE_STRUCT->turnEffectsTracker++;
+ break;
+ case 16: //taunt
+ if (gDisableStructs[gActiveBank].tauntTimer1)
+ gDisableStructs[gActiveBank].tauntTimer1--;
+ BATTLE_STRUCT->turnEffectsTracker++;
+ break;
+ case 17: //yawn
+ if (gStatuses3[gActiveBank] & STATUS3_YAWN)
+ {
+ gStatuses3[gActiveBank] &= 0xFFFFF800;
+ if (!(gStatuses3[gActiveBank] & STATUS3_YAWN) && !gBattleMons[gActiveBank].status1 && gBattleMons[gActiveBank].ability != ABILITY_VITAL_SPIRIT
+ && gBattleMons[gActiveBank].ability != ABILITY_INSOMNIA && !sub_8025A44(gActiveBank))
+ {
+ CancelMultiTurnMoves(gActiveBank);
+ gBattleMons[gActiveBank].status1 |= (Random() & 3) + 2;
+ EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1);
+ MarkBufferBankForExecution(gActiveBank);
+ gEffectBank = gActiveBank;
+ b_call_bc_move_exec(gUnknown_081D964C);
+ effect++;
+ }
+ }
+ BATTLE_STRUCT->turnEffectsTracker++;
+ break;
+ case 19: //done
+ BATTLE_STRUCT->turnEffectsTracker = 0;
+ BATTLE_STRUCT->turnEffectsBank++;
+ break;
+ }
+ if (effect)
+ return effect;
+ }
+ }
+ gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_x20);
+ return 0;
+}