Skip to content

Commit

Permalink
add handling for healer, natural cure, working on heal bell
Browse files Browse the repository at this point in the history
  • Loading branch information
iriv24 committed Oct 20, 2024
1 parent fad1ce5 commit 5e26d03
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 29 deletions.
66 changes: 43 additions & 23 deletions src/battle_script_commands.c
Original file line number Diff line number Diff line change
Expand Up @@ -13184,19 +13184,18 @@ static void Cmd_tryspiteppreduce(void)

static void Cmd_healpartystatus(void)
{
// TODO sleep clause: add code here for heal bell/armoatherapy/sparkly swirl (??)
// TODO sleep clause: bug when the mon in the right slot in a double battle uses heal bell/aromatherapy, sleep clause is not deactivated
CMD_ARGS();

u32 zero = 0;
u32 partner = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerAttacker)));
u8 toHeal = 0;
bool32 isStatusSleep = (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP);
struct Pokemon *party = GetBattlerParty(gBattlerAttacker);
s32 i;

if (gCurrentMove == MOVE_HEAL_BELL)
{
struct Pokemon *party = GetBattlerParty(gBattlerAttacker);
s32 i;

gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_BELL;

if (GetBattlerAbility(gBattlerAttacker) != ABILITY_SOUNDPROOF
Expand Down Expand Up @@ -13228,11 +13227,11 @@ static void Cmd_healpartystatus(void)
gBattleMons[partner].status1 = 0;
gBattleMons[partner].status2 &= ~STATUS2_NIGHTMARE;
if(B_SLEEP_CLAUSE && isStatusSleep
&& gBattleStruct->sleepClause.isActive[GetBattlerSide(partner)]
&& gBattleStruct->sleepClause.isCausingSleepClause[GetBattlerSide(partner)][gBattlerPartyIndexes[partner]])
&& gBattleStruct->sleepClause.isActive[GetBattlerSide(gBattlerAttacker)]
&& gBattleStruct->sleepClause.isCausingSleepClause[GetBattlerSide(gBattlerAttacker)][gBattlerPartyIndexes[partner]])
{
gBattleStruct->sleepClause.isActive[GetBattlerSide(partner)] = FALSE;
gBattleStruct->sleepClause.isCausingSleepClause[GetBattlerSide(partner)][gBattlerPartyIndexes[partner]] = FALSE;
gBattleStruct->sleepClause.isActive[GetBattlerSide(gBattlerAttacker)] = FALSE;
gBattleStruct->sleepClause.isCausingSleepClause[GetBattlerSide(gBattlerAttacker)][gBattlerPartyIndexes[partner]] = FALSE;
}
}
else
Expand Down Expand Up @@ -13289,26 +13288,27 @@ static void Cmd_healpartystatus(void)
gBattleMons[gBattlerAttacker].status1 = 0;
gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE;

if(B_SLEEP_CLAUSE && isStatusSleep)
if(B_SLEEP_CLAUSE
&& isStatusSleep
&& gBattleStruct->sleepClause.isActive[GetBattlerSide(gBattlerAttacker)]
&& gBattleStruct->sleepClause.isCausingSleepClause[GetBattlerSide(gBattlerAttacker)][gBattlerPartyIndexes[gBattlerAttacker]])
{
if(gBattleStruct->sleepClause.isActive[GetBattlerSide(gBattlerAttacker)]
&& gBattleStruct->sleepClause.isCausingSleepClause[GetBattlerSide(gBattlerAttacker)][gBattlerPartyIndexes[gBattlerAttacker]])
{
gBattleStruct->sleepClause.isActive[GetBattlerSide(gBattlerAttacker)] = FALSE;
gBattleStruct->sleepClause.isCausingSleepClause[GetBattlerSide(gBattlerAttacker)][gBattlerPartyIndexes[gBattlerAttacker]] = FALSE;
}

else if(gBattleStruct->sleepClause.isActive[GetBattlerSide(partner)]
&& gBattleStruct->sleepClause.isCausingSleepClause[GetBattlerSide(partner)][gBattlerPartyIndexes[partner]])
{
gBattleStruct->sleepClause.isActive[GetBattlerSide(partner)] = FALSE;
gBattleStruct->sleepClause.isCausingSleepClause[GetBattlerSide(partner)][gBattlerPartyIndexes[partner]] = FALSE;
}
gBattleStruct->sleepClause.isActive[GetBattlerSide(gBattlerAttacker)] = FALSE;
gBattleStruct->sleepClause.isCausingSleepClause[GetBattlerSide(gBattlerAttacker)][gBattlerPartyIndexes[gBattlerAttacker]] = FALSE;
}

if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE
&& !(gAbsentBattlerFlags & gBitTable[partner]))
{
isStatusSleep = (gBattleMons[partner].status1 & STATUS1_SLEEP);
if(B_SLEEP_CLAUSE
&& isStatusSleep
&& gBattleStruct->sleepClause.isActive[GetBattlerSide(gBattlerAttacker)]
&& gBattleStruct->sleepClause.isCausingSleepClause[GetBattlerSide(gBattlerAttacker)][gBattlerPartyIndexes[partner]])
{
gBattleStruct->sleepClause.isActive[GetBattlerSide(gBattlerAttacker)] = FALSE;
gBattleStruct->sleepClause.isCausingSleepClause[GetBattlerSide(gBattlerAttacker)][gBattlerPartyIndexes[partner]] = FALSE;
}
gBattleMons[partner].status1 = 0;
gBattleMons[partner].status2 &= ~STATUS2_NIGHTMARE;
}
Expand All @@ -13317,6 +13317,19 @@ static void Cmd_healpartystatus(void)

if (toHeal)
{
if(B_SLEEP_CLAUSE && gBattleStruct->sleepClause.isActive[gBattlerAttacker])
{
for (i = 0; i < PARTY_SIZE; i++)
{
if ((GetMonData(&party[i], MON_DATA_STATUS, 0) & STATUS1_SLEEP) && gBattleStruct->sleepClause.isCausingSleepClause[gBattlerAttacker][i])
{
gBattleStruct->sleepClause.isActive[gBattlerAttacker] = FALSE;
gBattleStruct->sleepClause.isCausingSleepClause[gBattlerAttacker][i] = FALSE;
break;
}
}
}

BtlController_EmitSetMonData(gBattlerAttacker, BUFFER_A, REQUEST_STATUS_BATTLE, toHeal, sizeof(zero), &zero);
MarkBattlerForControllerExec(gBattlerAttacker);
}
Expand Down Expand Up @@ -14673,8 +14686,15 @@ static void Cmd_switchoutabilities(void)
{
switch (GetBattlerAbility(battler))
{
//todo sleep clause here natural cure
case ABILITY_NATURAL_CURE:
if (B_SLEEP_CLAUSE
&& (gBattleMons[battler].status1 & STATUS1_SLEEP )
&& gBattleStruct->sleepClause.isActive[GetBattlerSide(battler)]
&& gBattleStruct->sleepClause.isCausingSleepClause[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]])
{
gBattleStruct->sleepClause.isActive[GetBattlerSide(battler)] = FALSE;
gBattleStruct->sleepClause.isCausingSleepClause[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]] = FALSE;
}
gBattleMons[battler].status1 = 0;
BtlController_EmitSetMonData(battler, BUFFER_A, REQUEST_STATUS_BATTLE,
gBitTable[*(gBattleStruct->battlerPartyIndexes + battler)],
Expand Down
10 changes: 9 additions & 1 deletion src/battle_util.c
Original file line number Diff line number Diff line change
Expand Up @@ -5078,8 +5078,16 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
gBattleScripting.battler = BATTLE_PARTNER(battler);
if (IsBattlerAlive(gBattleScripting.battler)
&& gBattleMons[gBattleScripting.battler].status1 & STATUS1_ANY
&& (Random() % 100) < 30)
&& (Random() % 100) < 90)
{
if (B_SLEEP_CLAUSE
&& (gBattleMons[gBattleScripting.battler].status1 & STATUS1_SLEEP )
&& gBattleStruct->sleepClause.isActive[GetBattlerSide(gBattleScripting.battler)]
&& gBattleStruct->sleepClause.isCausingSleepClause[GetBattlerSide(battler)][gBattlerPartyIndexes[gBattleScripting.battler]])
{
gBattleStruct->sleepClause.isActive[GetBattlerSide(gBattleScripting.battler)] = FALSE;
gBattleStruct->sleepClause.isCausingSleepClause[GetBattlerSide(gBattleScripting.battler)][gBattlerPartyIndexes[gBattleScripting.battler]] = FALSE;
}
BattleScriptPushCursorAndCallback(BattleScript_HealerActivates);
effect++;
}
Expand Down
13 changes: 8 additions & 5 deletions test/battle/sleep_clause.c
Original file line number Diff line number Diff line change
Expand Up @@ -333,7 +333,7 @@ TO_DO_BATTLE_TEST("Sleep Clause: sleep clause is deactivated when a sleeping mon
// player celebrates until sleeping wob wakes up
// AI switches, player uses spore, AI wob 2 falls asleep


// ADDED HANDLING FOR THIS
TO_DO_BATTLE_TEST("Sleep Clause: sleep clause is deactivated when a sleeping mon is woken up with aromatherapy");
// something like:
// player has wob
Expand All @@ -344,6 +344,7 @@ TO_DO_BATTLE_TEST("Sleep Clause: sleep clause is deactivated when a sleeping mon
// AI wob uses aromatherapy, cures sleeping wob
// player uses spore, it succeeds

// ADDED HANDLING FOR THIS
// might be redundant if they use the same effect
TO_DO_BATTLE_TEST("Sleep Clause: sleep clause is deactivated when a sleeping mon is woken up with heal bell");
// something like:
Expand Down Expand Up @@ -385,11 +386,13 @@ TO_DO_BATTLE_TEST("Sleep Clause: sleep clause is deactivated when a sleeping mon
// ADDED HANDLING FOR THIS
TO_DO_BATTLE_TEST("Sleep Clause: sleep clause is deactivated when a sleeping mon is woken up by the ability hydration in the rain");

// ADDED HANDLING FOR THIS
TO_DO_BATTLE_TEST("Sleep Clause: sleep clause is deactivated when a sleeping mon is woken up by the ability natural cure");

// ADDED HANDLING FOR THIS
TO_DO_BATTLE_TEST("Sleep Clause: sleep clause is deactivated when a sleeping mon is woken up by the ability shed skin");

// ADDED HANDLING FOR THIS
TO_DO_BATTLE_TEST("DOUBLES TEST: Sleep Clause: sleep clause is deactivated when a sleeping mon is woken up by the ability healer");

// ADDED HANDLING FOR THIS
Expand All @@ -408,10 +411,6 @@ TO_DO_BATTLE_TEST("Sleep Clause: sleep clause is deactivated when a sleeping mon
// ADDED HANDLING FOR THIS
TO_DO_BATTLE_TEST("Sleep Clause: sleep clause is deactivated when a sleeping mon faints");

TO_DO_BATTLE_TEST("Sleep Clause: sleep clause is deactivated when a sleeping mon uses sleep talk -> explosion"); // holy fuck if this requires special handling im uninstalling

TO_DO_BATTLE_TEST("Sleep Clause: sleep clause is deactivated when a sleeping mon uses sleep talk -> move that KOs a mon that has used destiny bond");

// ADDED HANDLING FOR THIS
TO_DO_BATTLE_TEST("Sleep Clause: sleep clause is deactivated when a sleeping mon is sent out, has trace, and traces insomnia/vital spirit");

Expand All @@ -421,3 +420,7 @@ TO_DO_BATTLE_TEST("Sleep Clause: sleep clause is deactivated when a sleeping mon

// ADDED HANDLING FOR THIS
TO_DO_BATTLE_TEST("Sleep Clause: sleep clause is deactivated when a sleeping mon is sent out and transforms into a mon with insomnia/vital spirit");

//TODO bug when the mon in the right slot in a double battle uses heal bell/aromatherapy, sleep clause is not deactivated

//TODO treat falling asleep from disobeying the same as rest

0 comments on commit 5e26d03

Please sign in to comment.