fixed bug bite / bestow

This commit is contained in:
AgustinGDLV 2022-05-06 22:07:25 -07:00
parent 0cb6529ae2
commit 542a0f07b4
4 changed files with 51 additions and 43 deletions

View File

@ -2128,3 +2128,8 @@
.macro skydropyawn
various 0, VARIOUS_SKY_DROP_YAWN
.endm
@ Used by effects that may proc Symbiosis but do not call removeitem.
.macro trysymbiosis
various BS_ATTACKER, VARIOUS_TRY_SYMBIOSIS
.endm

View File

@ -1307,6 +1307,7 @@ BattleScript_MoveEffectBugBite::
consumeberry BS_ATTACKER, TRUE @ consume the berry, then restore the item from changedItems
bicword gHitMarker, HITMARKER_NO_ANIMATIONS
setbyte sBERRY_OVERRIDE, FALSE
trysymbiosis
return
BattleScript_EffectCoreEnforcer:
@ -1678,6 +1679,7 @@ BattleScript_EffectBestow:
waitanimation
printstring STRINGID_BESTOWITEMGIVING
waitmessage B_WAIT_TIME_LONG
trysymbiosis
goto BattleScript_MoveEnd
BattleScript_EffectAfterYou:

View File

@ -241,6 +241,7 @@
#define VARIOUS_BATTLER_ITEM_TO_LAST_USED_ITEM 150
#define VARIOUS_SET_BEAK_BLAST 151
#define VARIOUS_SWAP_SIDE_STATUSES 152
#define VARIOUS_TRY_SYMBIOSIS 153
// Cmd_manipulatedamage
#define DMG_CHANGE_SIGN 0

View File

@ -7030,14 +7030,34 @@ static bool32 TryCheekPouch(u32 battlerId, u32 itemId)
return FALSE;
}
// Notes:
// Symbiosis applies before a move and after a gem is used in Gen 6.
// Symbiosis applies if an ally consumes a berry through Bug Bite / Pluck and doesn't have an item.
// Symbiosis does not apply if an ally has an item stolen, knocked off, or destroyed by Incinerate.
// Symbiosis does not apply after Eject Button (except in Gen 6, where it is bugged).
// Symbiosis does not apply if an ally tricks away their item and does not receive one in return.
#define SYMBIOSIS_CHECK(battler, ally) \
GetBattlerAbility(ally) == ABILITY_SYMBIOSIS \
&& gBattleMons[battler].item == ITEM_NONE \
&& gBattleMons[ally].item != ITEM_NONE \
&& CanBattlerGetOrLoseItem(battler, gBattleMons[ally].item) \
&& CanBattlerGetOrLoseItem(ally, gBattleMons[ally].item) \
&& gBattleMons[battler].hp != 0 \
&& gBattleMons[ally].hp != 0
//itemId is used to check Eject Button or Eject Pack
// Used by Bestow and Symbiosis to take an item from one battler and give to another.
static void BestowItem(u32 battlerAtk, u32 battlerDef)
{
gLastUsedItem = gBattleMons[battlerAtk].item;
gActiveBattler = battlerAtk;
gBattleMons[battlerAtk].item = ITEM_NONE;
BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[battlerAtk].item), &gBattleMons[battlerAtk].item);
MarkBattlerForControllerExec(battlerAtk);
CheckSetUnburden(battlerAtk);
gActiveBattler = battlerDef;
gBattleMons[battlerDef].item = gLastUsedItem;
BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[battlerDef].item), &gBattleMons[battlerDef].item);
MarkBattlerForControllerExec(battlerDef);
gBattleResources->flags->flags[battlerDef] &= ~RESOURCE_FLAG_UNBURDEN;
}
// Called by Cmd_removeitem. itemId represents the item that was removed, not being given.
static bool32 TrySymbiosis(u32 battler, u32 itemId)
{
u32 ally = battler ^ BIT_FLANK;
@ -7046,27 +7066,9 @@ static bool32 TrySymbiosis(u32 battler, u32 itemId)
&& gBattleStruct->changedItems[battler] == ITEM_NONE
&& ItemId_GetHoldEffect(itemId) != HOLD_EFFECT_EJECT_BUTTON
&& ItemId_GetHoldEffect(itemId) != HOLD_EFFECT_EJECT_PACK
&& GetBattlerAbility(ally) == ABILITY_SYMBIOSIS
&& gBattleMons[battler].item == ITEM_NONE
&& gBattleMons[ally].item != ITEM_NONE
&& CanBattlerGetOrLoseItem(battler, gBattleMons[ally].item)
&& CanBattlerGetOrLoseItem(ally, gBattleMons[ally].item)
&& gBattleMons[battler].hp != 0
&& gBattleMons[ally].hp != 0)
&& SYMBIOSIS_CHECK(battler, ally))
{
gLastUsedItem = gBattleMons[ally].item;
gActiveBattler = ally;
gBattleMons[ally].item = ITEM_NONE;
BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[battler].item), &gBattleMons[battler].item);
MarkBattlerForControllerExec(ally);
gActiveBattler = battler;
gBattleMons[battler].item = gLastUsedItem;
BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[battler].item), &gBattleMons[battler].item);
MarkBattlerForControllerExec(battler);
gBattleResources->flags->flags[battler] &= ~RESOURCE_FLAG_UNBURDEN;
BestowItem(ally, battler);
gLastUsedAbility = gBattleMons[ally].ability;
gBattleScripting.battler = gBattlerAbility = ally;
gBattlerTarget = battler;
@ -8863,22 +8865,8 @@ static void Cmd_various(void)
}
else
{
gLastUsedItem = gBattleMons[gBattlerAttacker].item;
gActiveBattler = gBattlerAttacker;
gBattleMons[gActiveBattler].item = ITEM_NONE;
BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].item), &gBattleMons[gActiveBattler].item);
MarkBattlerForControllerExec(gActiveBattler);
CheckSetUnburden(gBattlerAttacker);
gActiveBattler = gBattlerTarget;
gBattleMons[gActiveBattler].item = gLastUsedItem;
BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].item), &gBattleMons[gActiveBattler].item);
MarkBattlerForControllerExec(gActiveBattler);
gBattleResources->flags->flags[gBattlerTarget] &= ~RESOURCE_FLAG_UNBURDEN;
if (!TrySymbiosis(gBattlerAttacker, gLastUsedItem))
gBattlescriptCurrInstr += 7;
BestowItem(gBattlerAttacker, gBattlerTarget);
gBattlescriptCurrInstr += 7;
}
return;
case VARIOUS_ARGUMENT_TO_MOVE_EFFECT:
@ -9619,6 +9607,18 @@ static void Cmd_various(void)
case VARIOUS_SWAP_SIDE_STATUSES:
CourtChangeSwapSideStatuses();
break;
case VARIOUS_TRY_SYMBIOSIS: //called by Bestow and Bug Bite, which have cases that don't call Cmd_removeitem.
if (SYMBIOSIS_CHECK(gActiveBattler, gActiveBattler ^ BIT_FLANK))
{
BestowItem(gActiveBattler ^ BIT_FLANK, gActiveBattler);
gLastUsedAbility = gBattleMons[gActiveBattler ^ BIT_FLANK].ability;
gBattleScripting.battler = gBattlerAbility = gActiveBattler ^ BIT_FLANK;
gBattlerTarget = gActiveBattler;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_SymbiosisActivates;
return;
}
break;
} // End of switch (gBattlescriptCurrInstr[2])
gBattlescriptCurrInstr += 3;