thru atkee
This commit is contained in:
File diff suppressed because it is too large
Load Diff
+2
-1
@@ -347,7 +347,7 @@ struct WishFutureKnock
|
|||||||
s32 futureSightDmg[MAX_BATTLERS_COUNT];
|
s32 futureSightDmg[MAX_BATTLERS_COUNT];
|
||||||
u16 futureSightMove[MAX_BATTLERS_COUNT];
|
u16 futureSightMove[MAX_BATTLERS_COUNT];
|
||||||
u8 wishCounter[MAX_BATTLERS_COUNT];
|
u8 wishCounter[MAX_BATTLERS_COUNT];
|
||||||
u8 wishUserID[MAX_BATTLERS_COUNT];
|
u8 wishMonId[MAX_BATTLERS_COUNT];
|
||||||
u8 weatherDuration;
|
u8 weatherDuration;
|
||||||
u8 knockedOffMons[2];
|
u8 knockedOffMons[2];
|
||||||
};
|
};
|
||||||
@@ -930,5 +930,6 @@ extern u16 gLastResultingMoves[MAX_BATTLERS_COUNT];
|
|||||||
extern u16 gLastPrintedMoves[MAX_BATTLERS_COUNT];
|
extern u16 gLastPrintedMoves[MAX_BATTLERS_COUNT];
|
||||||
extern u8 gActionsByTurnOrder[MAX_BATTLERS_COUNT];
|
extern u8 gActionsByTurnOrder[MAX_BATTLERS_COUNT];
|
||||||
extern u8 gChosenActionByBattler[MAX_BATTLERS_COUNT];
|
extern u8 gChosenActionByBattler[MAX_BATTLERS_COUNT];
|
||||||
|
extern u8 gBattleTerrain;
|
||||||
|
|
||||||
#endif // GUARD_BATTLE_H
|
#endif // GUARD_BATTLE_H
|
||||||
|
|||||||
@@ -212,7 +212,7 @@
|
|||||||
#define WEATHER_SUN_ANY (WEATHER_SUN_TEMPORARY | WEATHER_SUN_PERMANENT)
|
#define WEATHER_SUN_ANY (WEATHER_SUN_TEMPORARY | WEATHER_SUN_PERMANENT)
|
||||||
#define WEATHER_HAIL (1 << 7)
|
#define WEATHER_HAIL (1 << 7)
|
||||||
#define WEATHER_HAIL_ANY (WEATHER_HAIL)
|
#define WEATHER_HAIL_ANY (WEATHER_HAIL)
|
||||||
#define WEATHER_ANY (WEATHER_RAIN_ANY | WEATHER_SANDSTORM_ANY | WEATHER_SUNNY_ANY | WEATHER_HAIL_ANY)
|
#define WEATHER_ANY (WEATHER_RAIN_ANY | WEATHER_SANDSTORM_ANY | WEATHER_SUN_ANY | WEATHER_HAIL_ANY)
|
||||||
|
|
||||||
// Move Effects
|
// Move Effects
|
||||||
#define MOVE_EFFECT_SLEEP 0x1
|
#define MOVE_EFFECT_SLEEP 0x1
|
||||||
@@ -281,4 +281,17 @@
|
|||||||
#define MOVE_EFFECT_AFFECTS_USER 0x40
|
#define MOVE_EFFECT_AFFECTS_USER 0x40
|
||||||
#define MOVE_EFFECT_CERTAIN 0x80
|
#define MOVE_EFFECT_CERTAIN 0x80
|
||||||
|
|
||||||
|
// Battle terrain defines for gBattleTerrain.
|
||||||
|
#define BATTLE_TERRAIN_GRASS 0
|
||||||
|
#define BATTLE_TERRAIN_LONG_GRASS 1
|
||||||
|
#define BATTLE_TERRAIN_SAND 2
|
||||||
|
#define BATTLE_TERRAIN_UNDERWATER 3
|
||||||
|
#define BATTLE_TERRAIN_WATER 4
|
||||||
|
#define BATTLE_TERRAIN_POND 5
|
||||||
|
#define BATTLE_TERRAIN_MOUNTAIN 6
|
||||||
|
#define BATTLE_TERRAIN_CAVE 7
|
||||||
|
#define BATTLE_TERRAIN_BUILDING 8
|
||||||
|
#define BATTLE_TERRAIN_PLAIN 9
|
||||||
|
|
||||||
|
|
||||||
#endif // GUARD_CONSTANTS_BATTLE_H
|
#endif // GUARD_CONSTANTS_BATTLE_H
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ bool8 sub_8026648(void);
|
|||||||
void PutMonIconOnLvlUpBox(void);
|
void PutMonIconOnLvlUpBox(void);
|
||||||
void PutLevelAndGenderOnLvlUpBox(void);
|
void PutLevelAndGenderOnLvlUpBox(void);
|
||||||
|
|
||||||
void SpriteCB_MonIconOnLvlUpBox(struct Sprite* sprite);
|
void SpriteCB_MonIconOnLvlUpBox(struct Sprite *sprite);
|
||||||
|
|
||||||
void atk00_attackcanceler(void);
|
void atk00_attackcanceler(void);
|
||||||
void atk01_accuracycheck(void);
|
void atk01_accuracycheck(void);
|
||||||
@@ -8550,3 +8550,898 @@ void atkC0_recoverbasedonsunlight(void)
|
|||||||
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void atkC1_hiddenpowercalc(void)
|
||||||
|
{
|
||||||
|
s32 powerBits, typeBits;
|
||||||
|
|
||||||
|
powerBits = ((gBattleMons[gBattlerAttacker].hpIV & 2) >> 1)
|
||||||
|
| ((gBattleMons[gBattlerAttacker].attackIV & 2) << 0)
|
||||||
|
| ((gBattleMons[gBattlerAttacker].defenseIV & 2) << 1)
|
||||||
|
| ((gBattleMons[gBattlerAttacker].speedIV & 2) << 2)
|
||||||
|
| ((gBattleMons[gBattlerAttacker].spAttackIV & 2) << 3)
|
||||||
|
| ((gBattleMons[gBattlerAttacker].spDefenseIV & 2) << 4);
|
||||||
|
typeBits = ((gBattleMons[gBattlerAttacker].hpIV & 1) << 0)
|
||||||
|
| ((gBattleMons[gBattlerAttacker].attackIV & 1) << 1)
|
||||||
|
| ((gBattleMons[gBattlerAttacker].defenseIV & 1) << 2)
|
||||||
|
| ((gBattleMons[gBattlerAttacker].speedIV & 1) << 3)
|
||||||
|
| ((gBattleMons[gBattlerAttacker].spAttackIV & 1) << 4)
|
||||||
|
| ((gBattleMons[gBattlerAttacker].spDefenseIV & 1) << 5);
|
||||||
|
gDynamicBasePower = (40 * powerBits) / 63 + 30;
|
||||||
|
gBattleStruct->dynamicMoveType = (15 * typeBits) / 63 + 1;
|
||||||
|
if (gBattleStruct->dynamicMoveType >= TYPE_MYSTERY)
|
||||||
|
++gBattleStruct->dynamicMoveType;
|
||||||
|
gBattleStruct->dynamicMoveType |= 0xC0;
|
||||||
|
++gBattlescriptCurrInstr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkC2_selectfirstvalidtarget(void)
|
||||||
|
{
|
||||||
|
for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; ++gBattlerTarget)
|
||||||
|
{
|
||||||
|
if (gBattlerTarget == gBattlerAttacker)
|
||||||
|
continue;
|
||||||
|
if (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget]))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
++gBattlescriptCurrInstr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkC3_trysetfutureattack(void)
|
||||||
|
{
|
||||||
|
if (gWishFutureKnock.futureSightCounter[gBattlerTarget] != 0)
|
||||||
|
{
|
||||||
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gWishFutureKnock.futureSightMove[gBattlerTarget] = gCurrentMove;
|
||||||
|
gWishFutureKnock.futureSightAttacker[gBattlerTarget] = gBattlerAttacker;
|
||||||
|
gWishFutureKnock.futureSightCounter[gBattlerTarget] = 3;
|
||||||
|
gWishFutureKnock.futureSightDmg[gBattlerTarget] = CalculateBaseDamage(&gBattleMons[gBattlerAttacker],
|
||||||
|
&gBattleMons[gBattlerTarget],
|
||||||
|
gCurrentMove,
|
||||||
|
gSideStatuses[GET_BATTLER_SIDE(gBattlerTarget)],
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
gBattlerAttacker,
|
||||||
|
gBattlerTarget);
|
||||||
|
if (gProtectStructs[gBattlerAttacker].helpingHand)
|
||||||
|
gWishFutureKnock.futureSightDmg[gBattlerTarget] = gWishFutureKnock.futureSightDmg[gBattlerTarget] * 15 / 10;
|
||||||
|
if (gCurrentMove == MOVE_DOOM_DESIRE)
|
||||||
|
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
|
||||||
|
else
|
||||||
|
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
|
||||||
|
gBattlescriptCurrInstr += 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkC4_trydobeatup(void)
|
||||||
|
{
|
||||||
|
struct Pokemon *party;
|
||||||
|
|
||||||
|
if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)
|
||||||
|
party = gPlayerParty;
|
||||||
|
else
|
||||||
|
party = gEnemyParty;
|
||||||
|
if (gBattleMons[gBattlerTarget].hp == 0)
|
||||||
|
{
|
||||||
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
u8 beforeLoop = gBattleCommunication[0];
|
||||||
|
|
||||||
|
for (;gBattleCommunication[0] < 6; ++gBattleCommunication[0])
|
||||||
|
{
|
||||||
|
if (GetMonData(&party[gBattleCommunication[0]], MON_DATA_HP)
|
||||||
|
&& GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES2)
|
||||||
|
&& GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES2) != SPECIES_EGG
|
||||||
|
&& !GetMonData(&party[gBattleCommunication[0]], MON_DATA_STATUS))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (gBattleCommunication[0] < 6)
|
||||||
|
{
|
||||||
|
PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gBattlerAttacker, gBattleCommunication[0])
|
||||||
|
gBattlescriptCurrInstr += 9;
|
||||||
|
gBattleMoveDamage = gBaseStats[GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES)].baseAttack;
|
||||||
|
gBattleMoveDamage *= gBattleMoves[gCurrentMove].power;
|
||||||
|
gBattleMoveDamage *= (GetMonData(&party[gBattleCommunication[0]], MON_DATA_LEVEL) * 2 / 5 + 2);
|
||||||
|
gBattleMoveDamage /= gBaseStats[gBattleMons[gBattlerTarget].species].baseDefense;
|
||||||
|
gBattleMoveDamage = (gBattleMoveDamage / 50) + 2;
|
||||||
|
if (gProtectStructs[gBattlerAttacker].helpingHand)
|
||||||
|
gBattleMoveDamage = gBattleMoveDamage * 15 / 10;
|
||||||
|
++gBattleCommunication[0];
|
||||||
|
}
|
||||||
|
else if (beforeLoop != 0)
|
||||||
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
|
||||||
|
else
|
||||||
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkC5_setsemiinvulnerablebit(void)
|
||||||
|
{
|
||||||
|
switch (gCurrentMove)
|
||||||
|
{
|
||||||
|
case MOVE_FLY:
|
||||||
|
case MOVE_BOUNCE:
|
||||||
|
gStatuses3[gBattlerAttacker] |= STATUS3_ON_AIR;
|
||||||
|
break;
|
||||||
|
case MOVE_DIG:
|
||||||
|
gStatuses3[gBattlerAttacker] |= STATUS3_UNDERGROUND;
|
||||||
|
break;
|
||||||
|
case MOVE_DIVE:
|
||||||
|
gStatuses3[gBattlerAttacker] |= STATUS3_UNDERWATER;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
++gBattlescriptCurrInstr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkC6_clearsemiinvulnerablebit(void)
|
||||||
|
{
|
||||||
|
switch (gCurrentMove)
|
||||||
|
{
|
||||||
|
case MOVE_FLY:
|
||||||
|
case MOVE_BOUNCE:
|
||||||
|
gStatuses3[gBattlerAttacker] &= ~STATUS3_ON_AIR;
|
||||||
|
break;
|
||||||
|
case MOVE_DIG:
|
||||||
|
gStatuses3[gBattlerAttacker] &= ~STATUS3_UNDERGROUND;
|
||||||
|
break;
|
||||||
|
case MOVE_DIVE:
|
||||||
|
gStatuses3[gBattlerAttacker] &= ~STATUS3_UNDERWATER;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
++gBattlescriptCurrInstr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkC7_setminimize(void)
|
||||||
|
{
|
||||||
|
if (gHitMarker & HITMARKER_OBEYS)
|
||||||
|
gStatuses3[gBattlerAttacker] |= STATUS3_MINIMIZED;
|
||||||
|
++gBattlescriptCurrInstr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkC8_sethail(void)
|
||||||
|
{
|
||||||
|
if (gBattleWeather & WEATHER_HAIL_ANY)
|
||||||
|
{
|
||||||
|
gMoveResultFlags |= MOVE_RESULT_MISSED;
|
||||||
|
gBattleCommunication[MULTISTRING_CHOOSER] = 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gBattleWeather = WEATHER_HAIL;
|
||||||
|
gBattleCommunication[MULTISTRING_CHOOSER] = 5;
|
||||||
|
gWishFutureKnock.weatherDuration = 5;
|
||||||
|
}
|
||||||
|
++gBattlescriptCurrInstr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkC9_jumpifattackandspecialattackcannotfall(void) // memento
|
||||||
|
{
|
||||||
|
if (gBattleMons[gBattlerTarget].statStages[STAT_ATK] == 0
|
||||||
|
&& gBattleMons[gBattlerTarget].statStages[STAT_SPATK] == 0
|
||||||
|
&& gBattleCommunication[6] != 1)
|
||||||
|
{
|
||||||
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gActiveBattler = gBattlerAttacker;
|
||||||
|
gBattleMoveDamage = gBattleMons[gActiveBattler].hp;
|
||||||
|
BtlController_EmitHealthBarUpdate(0, INSTANT_HP_BAR_DROP);
|
||||||
|
MarkBattlerForControllerExec(gActiveBattler);
|
||||||
|
gBattlescriptCurrInstr += 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkCA_setforcedtarget(void) // follow me
|
||||||
|
{
|
||||||
|
gSideTimers[GetBattlerSide(gBattlerAttacker)].followmeTimer = 1;
|
||||||
|
gSideTimers[GetBattlerSide(gBattlerAttacker)].followmeTarget = gBattlerAttacker;
|
||||||
|
++gBattlescriptCurrInstr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkCB_setcharge(void)
|
||||||
|
{
|
||||||
|
gStatuses3[gBattlerAttacker] |= STATUS3_CHARGED_UP;
|
||||||
|
gDisableStructs[gBattlerAttacker].chargeTimer = 2;
|
||||||
|
gDisableStructs[gBattlerAttacker].chargeTimerStartValue = 2;
|
||||||
|
++gBattlescriptCurrInstr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkCC_callterrainattack(void) // nature power
|
||||||
|
{
|
||||||
|
gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED);
|
||||||
|
gCurrentMove = sNaturePowerMoves[gBattleTerrain];
|
||||||
|
gBattlerTarget = GetMoveTarget(gCurrentMove, 0);
|
||||||
|
BattleScriptPush(gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]);
|
||||||
|
++gBattlescriptCurrInstr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkCD_cureifburnedparalysedorpoisoned(void) // refresh
|
||||||
|
{
|
||||||
|
if (gBattleMons[gBattlerAttacker].status1 & (STATUS1_POISON | STATUS1_BURN | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON))
|
||||||
|
{
|
||||||
|
gBattleMons[gBattlerAttacker].status1 = 0;
|
||||||
|
gBattlescriptCurrInstr += 5;
|
||||||
|
gActiveBattler = gBattlerAttacker;
|
||||||
|
BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1);
|
||||||
|
MarkBattlerForControllerExec(gActiveBattler);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkCE_settorment(void)
|
||||||
|
{
|
||||||
|
if (gBattleMons[gBattlerTarget].status2 & STATUS2_TORMENT)
|
||||||
|
{
|
||||||
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gBattleMons[gBattlerTarget].status2 |= STATUS2_TORMENT;
|
||||||
|
gBattlescriptCurrInstr += 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkCF_jumpifnodamage(void)
|
||||||
|
{
|
||||||
|
if (gProtectStructs[gBattlerAttacker].physicalDmg || gProtectStructs[gBattlerAttacker].specialDmg)
|
||||||
|
gBattlescriptCurrInstr += 5;
|
||||||
|
else
|
||||||
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkD0_settaunt(void)
|
||||||
|
{
|
||||||
|
if (gDisableStructs[gBattlerTarget].tauntTimer == 0)
|
||||||
|
{
|
||||||
|
gDisableStructs[gBattlerTarget].tauntTimer = 2;
|
||||||
|
gDisableStructs[gBattlerTarget].tauntTimer2 = 2;
|
||||||
|
gBattlescriptCurrInstr += 5;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkD1_trysethelpinghand(void)
|
||||||
|
{
|
||||||
|
gBattlerTarget = GetBattlerAtPosition(GetBattlerPosition(gBattlerAttacker) ^ BIT_FLANK);
|
||||||
|
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE
|
||||||
|
&& !(gAbsentBattlerFlags & gBitTable[gBattlerTarget])
|
||||||
|
&& !gProtectStructs[gBattlerAttacker].helpingHand
|
||||||
|
&& !gProtectStructs[gBattlerTarget].helpingHand)
|
||||||
|
{
|
||||||
|
gProtectStructs[gBattlerTarget].helpingHand = 1;
|
||||||
|
gBattlescriptCurrInstr += 5;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkD2_tryswapitems(void) // trick
|
||||||
|
{
|
||||||
|
// opponent can't swap items with player in regular battles
|
||||||
|
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_TOWER
|
||||||
|
|| (GetBattlerSide(gBattlerAttacker) == B_SIDE_OPPONENT
|
||||||
|
&& !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER))
|
||||||
|
&& gTrainerBattleOpponent_A != 0x400))
|
||||||
|
{
|
||||||
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
u8 sideAttacker = GetBattlerSide(gBattlerAttacker);
|
||||||
|
u8 sideTarget = GetBattlerSide(gBattlerTarget);
|
||||||
|
|
||||||
|
// you can't swap items if they were knocked off in regular battles
|
||||||
|
if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER))
|
||||||
|
&& gTrainerBattleOpponent_A != 0x400
|
||||||
|
&& (gWishFutureKnock.knockedOffMons[sideAttacker] & gBitTable[gBattlerPartyIndexes[gBattlerAttacker]]
|
||||||
|
|| gWishFutureKnock.knockedOffMons[sideTarget] & gBitTable[gBattlerPartyIndexes[gBattlerTarget]]))
|
||||||
|
{
|
||||||
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
|
||||||
|
}
|
||||||
|
// can't swap if two pokemon don't have an item
|
||||||
|
// or if either of them is an enigma berry or a mail
|
||||||
|
else if ((gBattleMons[gBattlerAttacker].item == 0 && gBattleMons[gBattlerTarget].item == 0)
|
||||||
|
|| gBattleMons[gBattlerAttacker].item == ITEM_ENIGMA_BERRY
|
||||||
|
|| gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY
|
||||||
|
|| IS_ITEM_MAIL(gBattleMons[gBattlerAttacker].item)
|
||||||
|
|| IS_ITEM_MAIL(gBattleMons[gBattlerTarget].item))
|
||||||
|
{
|
||||||
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
|
||||||
|
}
|
||||||
|
// check if ability prevents swapping
|
||||||
|
else if (gBattleMons[gBattlerTarget].ability == ABILITY_STICKY_HOLD)
|
||||||
|
{
|
||||||
|
gBattlescriptCurrInstr = BattleScript_StickyHoldActivates;
|
||||||
|
gLastUsedAbility = gBattleMons[gBattlerTarget].ability;
|
||||||
|
RecordAbilityBattle(gBattlerTarget, gLastUsedAbility);
|
||||||
|
}
|
||||||
|
// took a while, but all checks passed and items can be safely swapped
|
||||||
|
else
|
||||||
|
{
|
||||||
|
u16 oldItemAtk, *newItemAtk;
|
||||||
|
|
||||||
|
newItemAtk = &gBattleStruct->changedItems[gBattlerAttacker];
|
||||||
|
oldItemAtk = gBattleMons[gBattlerAttacker].item;
|
||||||
|
*newItemAtk = gBattleMons[gBattlerTarget].item;
|
||||||
|
gBattleMons[gBattlerAttacker].item = 0;
|
||||||
|
gBattleMons[gBattlerTarget].item = oldItemAtk;
|
||||||
|
gActiveBattler = gBattlerAttacker;
|
||||||
|
BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, newItemAtk);
|
||||||
|
MarkBattlerForControllerExec(gBattlerAttacker);
|
||||||
|
gActiveBattler = gBattlerTarget;
|
||||||
|
BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gBattlerTarget].item);
|
||||||
|
MarkBattlerForControllerExec(gBattlerTarget);
|
||||||
|
*(u8 *)((u8 *)(&gBattleStruct->choicedMove[gBattlerTarget]) + 0) = 0;
|
||||||
|
*(u8 *)((u8 *)(&gBattleStruct->choicedMove[gBattlerTarget]) + 1) = 0;
|
||||||
|
|
||||||
|
*(u8 *)((u8 *)(&gBattleStruct->choicedMove[gBattlerAttacker]) + 0) = 0;
|
||||||
|
*(u8 *)((u8 *)(&gBattleStruct->choicedMove[gBattlerAttacker]) + 1) = 0;
|
||||||
|
gBattlescriptCurrInstr += 5;
|
||||||
|
PREPARE_ITEM_BUFFER(gBattleTextBuff1, *newItemAtk)
|
||||||
|
PREPARE_ITEM_BUFFER(gBattleTextBuff2, oldItemAtk)
|
||||||
|
if (oldItemAtk != ITEM_NONE && *newItemAtk != ITEM_NONE)
|
||||||
|
gBattleCommunication[MULTISTRING_CHOOSER] = 2; // attacker's item -> <- target's item
|
||||||
|
else if (oldItemAtk == ITEM_NONE && *newItemAtk != ITEM_NONE)
|
||||||
|
gBattleCommunication[MULTISTRING_CHOOSER] = 0; // nothing -> <- target's item
|
||||||
|
else
|
||||||
|
gBattleCommunication[MULTISTRING_CHOOSER] = 1; // attacker's item -> <- nothing
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkD3_trycopyability(void) // role play
|
||||||
|
{
|
||||||
|
if (gBattleMons[gBattlerTarget].ability != ABILITY_NONE && gBattleMons[gBattlerTarget].ability != ABILITY_WONDER_GUARD)
|
||||||
|
{
|
||||||
|
gBattleMons[gBattlerAttacker].ability = gBattleMons[gBattlerTarget].ability;
|
||||||
|
gLastUsedAbility = gBattleMons[gBattlerTarget].ability;
|
||||||
|
gBattlescriptCurrInstr += 5;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkD4_trywish(void)
|
||||||
|
{
|
||||||
|
switch (gBattlescriptCurrInstr[1])
|
||||||
|
{
|
||||||
|
case 0: // use wish
|
||||||
|
if (gWishFutureKnock.wishCounter[gBattlerAttacker] == 0)
|
||||||
|
{
|
||||||
|
gWishFutureKnock.wishCounter[gBattlerAttacker] = 2;
|
||||||
|
gWishFutureKnock.wishMonId[gBattlerAttacker] = gBattlerPartyIndexes[gBattlerAttacker];
|
||||||
|
gBattlescriptCurrInstr += 6;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 1: // heal effect
|
||||||
|
PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gBattlerTarget, gWishFutureKnock.wishMonId[gBattlerTarget])
|
||||||
|
gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 2;
|
||||||
|
if (gBattleMoveDamage == 0)
|
||||||
|
gBattleMoveDamage = 1;
|
||||||
|
gBattleMoveDamage *= -1;
|
||||||
|
if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP)
|
||||||
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2);
|
||||||
|
else
|
||||||
|
gBattlescriptCurrInstr += 6;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkD5_trysetroots(void) // ingrain
|
||||||
|
{
|
||||||
|
if (gStatuses3[gBattlerAttacker] & STATUS3_ROOTED)
|
||||||
|
{
|
||||||
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gStatuses3[gBattlerAttacker] |= STATUS3_ROOTED;
|
||||||
|
gBattlescriptCurrInstr += 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkD6_doubledamagedealtifdamaged(void)
|
||||||
|
{
|
||||||
|
if ((gProtectStructs[gBattlerAttacker].physicalDmg != 0
|
||||||
|
&& gProtectStructs[gBattlerAttacker].physicalBattlerId == gBattlerTarget)
|
||||||
|
|| (gProtectStructs[gBattlerAttacker].specialDmg != 0
|
||||||
|
&& gProtectStructs[gBattlerAttacker].specialBattlerId == gBattlerTarget))
|
||||||
|
{
|
||||||
|
gBattleScripting.dmgMultiplier = 2;
|
||||||
|
}
|
||||||
|
++gBattlescriptCurrInstr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkD7_setyawn(void)
|
||||||
|
{
|
||||||
|
if (gStatuses3[gBattlerTarget] & STATUS3_YAWN
|
||||||
|
|| gBattleMons[gBattlerTarget].status1 & STATUS1_ANY)
|
||||||
|
{
|
||||||
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gStatuses3[gBattlerTarget] |= 0x1000;
|
||||||
|
gBattlescriptCurrInstr += 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkD8_setdamagetohealthdifference(void)
|
||||||
|
{
|
||||||
|
if (gBattleMons[gBattlerTarget].hp <= gBattleMons[gBattlerAttacker].hp)
|
||||||
|
{
|
||||||
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - gBattleMons[gBattlerAttacker].hp;
|
||||||
|
gBattlescriptCurrInstr += 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkD9_scaledamagebyhealthratio(void)
|
||||||
|
{
|
||||||
|
if (gDynamicBasePower == 0)
|
||||||
|
{
|
||||||
|
u8 power = gBattleMoves[gCurrentMove].power;
|
||||||
|
|
||||||
|
gDynamicBasePower = gBattleMons[gBattlerAttacker].hp * power / gBattleMons[gBattlerAttacker].maxHP;
|
||||||
|
if (gDynamicBasePower == 0)
|
||||||
|
gDynamicBasePower = 1;
|
||||||
|
}
|
||||||
|
++gBattlescriptCurrInstr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkDA_tryswapabilities(void) // skill swap
|
||||||
|
{
|
||||||
|
if ((gBattleMons[gBattlerAttacker].ability == 0
|
||||||
|
&& gBattleMons[gBattlerTarget].ability == 0)
|
||||||
|
|| gBattleMons[gBattlerAttacker].ability == ABILITY_WONDER_GUARD
|
||||||
|
|| gBattleMons[gBattlerTarget].ability == ABILITY_WONDER_GUARD
|
||||||
|
|| gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
|
||||||
|
{
|
||||||
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
u8 abilityAtk = gBattleMons[gBattlerAttacker].ability;
|
||||||
|
|
||||||
|
gBattleMons[gBattlerAttacker].ability = gBattleMons[gBattlerTarget].ability;
|
||||||
|
gBattleMons[gBattlerTarget].ability = abilityAtk;
|
||||||
|
|
||||||
|
gBattlescriptCurrInstr += 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkDB_tryimprison(void)
|
||||||
|
{
|
||||||
|
if ((gStatuses3[gBattlerAttacker] & STATUS3_IMPRISONED_OTHERS))
|
||||||
|
{
|
||||||
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
u8 battlerId, sideAttacker;
|
||||||
|
|
||||||
|
sideAttacker = GetBattlerSide(gBattlerAttacker);
|
||||||
|
PressurePPLoseOnUsingImprison(gBattlerAttacker);
|
||||||
|
for (battlerId = 0; battlerId < gBattlersCount; ++battlerId)
|
||||||
|
{
|
||||||
|
if (sideAttacker != GetBattlerSide(battlerId))
|
||||||
|
{
|
||||||
|
s32 attackerMoveId;
|
||||||
|
|
||||||
|
for (attackerMoveId = 0; attackerMoveId < MAX_MON_MOVES; ++attackerMoveId)
|
||||||
|
{
|
||||||
|
s32 i;
|
||||||
|
|
||||||
|
for (i = 0; i < MAX_MON_MOVES; ++i)
|
||||||
|
{
|
||||||
|
if (gBattleMons[gBattlerAttacker].moves[attackerMoveId] == gBattleMons[battlerId].moves[i]
|
||||||
|
&& gBattleMons[gBattlerAttacker].moves[attackerMoveId] != MOVE_NONE)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i != MAX_MON_MOVES)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (attackerMoveId != MAX_MON_MOVES)
|
||||||
|
{
|
||||||
|
gStatuses3[gBattlerAttacker] |= STATUS3_IMPRISONED_OTHERS;
|
||||||
|
gBattlescriptCurrInstr += 5;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (battlerId == gBattlersCount) // In Generation 3 games, Imprison fails if the user doesn't share any moves with any of the foes
|
||||||
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkDC_trysetgrudge(void)
|
||||||
|
{
|
||||||
|
if (gStatuses3[gBattlerAttacker] & STATUS3_GRUDGE)
|
||||||
|
{
|
||||||
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gStatuses3[gBattlerAttacker] |= STATUS3_GRUDGE;
|
||||||
|
gBattlescriptCurrInstr += 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkDD_weightdamagecalculation(void)
|
||||||
|
{
|
||||||
|
s32 i;
|
||||||
|
|
||||||
|
for (i = 0; sWeightToDamageTable[i] != 0xFFFF; i += 2)
|
||||||
|
{
|
||||||
|
if (sWeightToDamageTable[i] > GetPokedexHeightWeight(SpeciesToNationalPokedexNum(gBattleMons[gBattlerTarget].species), 1))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (sWeightToDamageTable[i] != 0xFFFF)
|
||||||
|
gDynamicBasePower = sWeightToDamageTable[i + 1];
|
||||||
|
else
|
||||||
|
gDynamicBasePower = 120;
|
||||||
|
++gBattlescriptCurrInstr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkDE_assistattackselect(void)
|
||||||
|
{
|
||||||
|
s32 chooseableMovesNo = 0;
|
||||||
|
struct Pokemon *party;
|
||||||
|
s32 monId, moveId;
|
||||||
|
u16 *movesArray = gBattleStruct->assistPossibleMoves;
|
||||||
|
|
||||||
|
if (GET_BATTLER_SIDE(gBattlerAttacker) != B_SIDE_PLAYER)
|
||||||
|
party = gEnemyParty;
|
||||||
|
else
|
||||||
|
party = gPlayerParty;
|
||||||
|
for (monId = 0; monId < PARTY_SIZE; ++monId)
|
||||||
|
{
|
||||||
|
if (monId == gBattlerPartyIndexes[gBattlerAttacker]
|
||||||
|
|| GetMonData(&party[monId], MON_DATA_SPECIES2) == SPECIES_NONE
|
||||||
|
|| GetMonData(&party[monId], MON_DATA_SPECIES2) == SPECIES_EGG)
|
||||||
|
continue;
|
||||||
|
for (moveId = 0; moveId < MAX_MON_MOVES; ++moveId)
|
||||||
|
{
|
||||||
|
s32 i = 0;
|
||||||
|
u16 move = GetMonData(&party[monId], MON_DATA_MOVE1 + moveId);
|
||||||
|
|
||||||
|
if (IsInvalidForSleepTalkOrAssist(move))
|
||||||
|
continue;
|
||||||
|
for (; sMovesForbiddenToCopy[i] != ASSIST_FORBIDDEN_END && move != sMovesForbiddenToCopy[i]; ++i);
|
||||||
|
if (sMovesForbiddenToCopy[i] != ASSIST_FORBIDDEN_END || move == MOVE_NONE)
|
||||||
|
continue;
|
||||||
|
movesArray[chooseableMovesNo] = move;
|
||||||
|
++chooseableMovesNo;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (chooseableMovesNo)
|
||||||
|
{
|
||||||
|
gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED);
|
||||||
|
gCalledMove = movesArray[((Random() & 0xFF) * chooseableMovesNo) >> 8];
|
||||||
|
gBattlerTarget = GetMoveTarget(gCalledMove, 0);
|
||||||
|
gBattlescriptCurrInstr += 5;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkDF_trysetmagiccoat(void)
|
||||||
|
{
|
||||||
|
gBattlerTarget = gBattlerAttacker;
|
||||||
|
gSpecialStatuses[gBattlerAttacker].ppNotAffectedByPressure = 1;
|
||||||
|
if (gCurrentTurnActionNumber == gBattlersCount - 1) // moves last turn
|
||||||
|
{
|
||||||
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gProtectStructs[gBattlerAttacker].bounceMove = 1;
|
||||||
|
gBattlescriptCurrInstr += 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkE0_trysetsnatch(void) // snatch
|
||||||
|
{
|
||||||
|
gSpecialStatuses[gBattlerAttacker].ppNotAffectedByPressure = 1;
|
||||||
|
if (gCurrentTurnActionNumber == gBattlersCount - 1) // moves last turn
|
||||||
|
{
|
||||||
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gProtectStructs[gBattlerAttacker].stealMove = 1;
|
||||||
|
gBattlescriptCurrInstr += 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkE1_trygetintimidatetarget(void)
|
||||||
|
{
|
||||||
|
u8 side;
|
||||||
|
|
||||||
|
gBattleScripting.battler = gBattleStruct->intimidateBattler;
|
||||||
|
side = GetBattlerSide(gBattleScripting.battler);
|
||||||
|
PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gBattleMons[gBattleScripting.battler].ability)
|
||||||
|
for (;gBattlerTarget < gBattlersCount; ++gBattlerTarget)
|
||||||
|
{
|
||||||
|
if (GetBattlerSide(gBattlerTarget) == side)
|
||||||
|
continue;
|
||||||
|
if (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget]))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (gBattlerTarget >= gBattlersCount)
|
||||||
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
|
||||||
|
else
|
||||||
|
gBattlescriptCurrInstr += 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkE2_switchoutabilities(void)
|
||||||
|
{
|
||||||
|
gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
|
||||||
|
switch (gBattleMons[gActiveBattler].ability)
|
||||||
|
{
|
||||||
|
case ABILITY_NATURAL_CURE:
|
||||||
|
gBattleMons[gActiveBattler].status1 = 0;
|
||||||
|
BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, gBitTable[*(gBattleStruct->field_58 + gActiveBattler)], 4, &gBattleMons[gActiveBattler].status1);
|
||||||
|
MarkBattlerForControllerExec(gActiveBattler);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
gBattlescriptCurrInstr += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkE3_jumpifhasnohp(void)
|
||||||
|
{
|
||||||
|
gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
|
||||||
|
|
||||||
|
if (gBattleMons[gActiveBattler].hp == 0)
|
||||||
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2);
|
||||||
|
else
|
||||||
|
gBattlescriptCurrInstr += 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkE4_getsecretpowereffect(void)
|
||||||
|
{
|
||||||
|
switch (gBattleTerrain)
|
||||||
|
{
|
||||||
|
case BATTLE_TERRAIN_GRASS:
|
||||||
|
gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_POISON;
|
||||||
|
break;
|
||||||
|
case BATTLE_TERRAIN_LONG_GRASS:
|
||||||
|
gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_SLEEP;
|
||||||
|
break;
|
||||||
|
case BATTLE_TERRAIN_SAND:
|
||||||
|
gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_ACC_MINUS_1;
|
||||||
|
break;
|
||||||
|
case BATTLE_TERRAIN_UNDERWATER:
|
||||||
|
gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_DEF_MINUS_1;
|
||||||
|
break;
|
||||||
|
case BATTLE_TERRAIN_WATER:
|
||||||
|
gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_ATK_MINUS_1;
|
||||||
|
break;
|
||||||
|
case BATTLE_TERRAIN_POND:
|
||||||
|
gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_SPD_MINUS_1;
|
||||||
|
break;
|
||||||
|
case BATTLE_TERRAIN_MOUNTAIN:
|
||||||
|
gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_CONFUSION;
|
||||||
|
break;
|
||||||
|
case BATTLE_TERRAIN_CAVE:
|
||||||
|
gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_FLINCH;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_PARALYSIS;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
++gBattlescriptCurrInstr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkE5_pickup(void)
|
||||||
|
{
|
||||||
|
s32 i;
|
||||||
|
u32 j;
|
||||||
|
u16 species, heldItem;
|
||||||
|
u32 ability;
|
||||||
|
|
||||||
|
for (i = 0; i < PARTY_SIZE; ++i)
|
||||||
|
{
|
||||||
|
species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
|
||||||
|
heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM);
|
||||||
|
if (GetMonData(&gPlayerParty[i], MON_DATA_ABILITY_NUM) != ABILITY_NONE)
|
||||||
|
ability = gBaseStats[species].abilities[1];
|
||||||
|
else
|
||||||
|
ability = gBaseStats[species].abilities[0];
|
||||||
|
if (ability == ABILITY_PICKUP && species != SPECIES_NONE && species != SPECIES_EGG && heldItem == ITEM_NONE && !(Random() % 10))
|
||||||
|
{
|
||||||
|
s32 random = Random() % 100;
|
||||||
|
|
||||||
|
for (j = 0; j < 15; ++j)
|
||||||
|
if (sPickupItems[j].chance > random)
|
||||||
|
break;
|
||||||
|
SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &sPickupItems[j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
++gBattlescriptCurrInstr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkE6_docastformchangeanimation(void)
|
||||||
|
{
|
||||||
|
gActiveBattler = gBattleScripting.battler;
|
||||||
|
if (gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE)
|
||||||
|
*(&gBattleStruct->formToChangeInto) |= 0x80;
|
||||||
|
BtlController_EmitBattleAnimation(0, B_ANIM_CASTFORM_CHANGE, gBattleStruct->formToChangeInto);
|
||||||
|
MarkBattlerForControllerExec(gActiveBattler);
|
||||||
|
++gBattlescriptCurrInstr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkE7_trycastformdatachange(void)
|
||||||
|
{
|
||||||
|
u8 form;
|
||||||
|
|
||||||
|
++gBattlescriptCurrInstr;
|
||||||
|
form = CastformDataTypeChange(gBattleScripting.battler);
|
||||||
|
if (form)
|
||||||
|
{
|
||||||
|
BattleScriptPushCursorAndCallback(BattleScript_CastformChange);
|
||||||
|
*(&gBattleStruct->formToChangeInto) = form - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkE8_settypebasedhalvers(void) // water and mud sport
|
||||||
|
{
|
||||||
|
bool8 worked = FALSE;
|
||||||
|
|
||||||
|
if (gBattleMoves[gCurrentMove].effect == EFFECT_MUD_SPORT)
|
||||||
|
{
|
||||||
|
if (!(gStatuses3[gBattlerAttacker] & STATUS3_MUDSPORT))
|
||||||
|
{
|
||||||
|
gStatuses3[gBattlerAttacker] |= STATUS3_MUDSPORT;
|
||||||
|
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
|
||||||
|
worked = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // water sport
|
||||||
|
{
|
||||||
|
if (!(gStatuses3[gBattlerAttacker] & STATUS3_WATERSPORT))
|
||||||
|
{
|
||||||
|
gStatuses3[gBattlerAttacker] |= STATUS3_WATERSPORT;
|
||||||
|
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
|
||||||
|
worked = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (worked)
|
||||||
|
gBattlescriptCurrInstr += 5;
|
||||||
|
else
|
||||||
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkE9_setweatherballtype(void)
|
||||||
|
{
|
||||||
|
if (WEATHER_HAS_EFFECT)
|
||||||
|
{
|
||||||
|
if (gBattleWeather & WEATHER_ANY)
|
||||||
|
gBattleScripting.dmgMultiplier = 2;
|
||||||
|
if (gBattleWeather & WEATHER_RAIN_ANY)
|
||||||
|
*(&gBattleStruct->dynamicMoveType) = TYPE_WATER | 0x80;
|
||||||
|
else if (gBattleWeather & WEATHER_SANDSTORM_ANY)
|
||||||
|
*(&gBattleStruct->dynamicMoveType) = TYPE_ROCK | 0x80;
|
||||||
|
else if (gBattleWeather & WEATHER_SUN_ANY)
|
||||||
|
*(&gBattleStruct->dynamicMoveType) = TYPE_FIRE | 0x80;
|
||||||
|
else if (gBattleWeather & WEATHER_HAIL_ANY)
|
||||||
|
*(&gBattleStruct->dynamicMoveType) = TYPE_ICE | 0x80;
|
||||||
|
else
|
||||||
|
*(&gBattleStruct->dynamicMoveType) = TYPE_NORMAL | 0x80;
|
||||||
|
}
|
||||||
|
++gBattlescriptCurrInstr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkEA_tryrecycleitem(void)
|
||||||
|
{
|
||||||
|
u16 *usedHeldItem;
|
||||||
|
|
||||||
|
gActiveBattler = gBattlerAttacker;
|
||||||
|
usedHeldItem = &gBattleStruct->usedHeldItems[gActiveBattler];
|
||||||
|
if (*usedHeldItem != ITEM_NONE && gBattleMons[gActiveBattler].item == ITEM_NONE)
|
||||||
|
{
|
||||||
|
gLastUsedItem = *usedHeldItem;
|
||||||
|
*usedHeldItem = ITEM_NONE;
|
||||||
|
gBattleMons[gActiveBattler].item = gLastUsedItem;
|
||||||
|
BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBattler].item);
|
||||||
|
MarkBattlerForControllerExec(gActiveBattler);
|
||||||
|
gBattlescriptCurrInstr += 5;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkEB_settypetoterrain(void)
|
||||||
|
{
|
||||||
|
if (!IS_BATTLER_OF_TYPE(gBattlerAttacker, sTerrainToType[gBattleTerrain]))
|
||||||
|
{
|
||||||
|
SET_BATTLER_TYPE(gBattlerAttacker, sTerrainToType[gBattleTerrain]);
|
||||||
|
PREPARE_TYPE_BUFFER(gBattleTextBuff1, sTerrainToType[gBattleTerrain]);
|
||||||
|
gBattlescriptCurrInstr += 5;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkEC_pursuitrelated(void)
|
||||||
|
{
|
||||||
|
gActiveBattler = GetBattlerAtPosition(GetBattlerPosition(gBattlerAttacker) ^ BIT_FLANK);
|
||||||
|
|
||||||
|
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE
|
||||||
|
&& !(gAbsentBattlerFlags & gBitTable[gActiveBattler])
|
||||||
|
&& gChosenActionByBattler[gActiveBattler] == 0
|
||||||
|
&& gChosenMoveByBattler[gActiveBattler] == MOVE_PURSUIT)
|
||||||
|
{
|
||||||
|
gActionsByTurnOrder[gActiveBattler] = 11;
|
||||||
|
gCurrentMove = MOVE_PURSUIT;
|
||||||
|
gBattlescriptCurrInstr += 5;
|
||||||
|
gBattleScripting.animTurn = 1;
|
||||||
|
gBattleScripting.field_20 = gBattlerAttacker;
|
||||||
|
gBattlerAttacker = gActiveBattler;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkED_snatchsetbattlers(void)
|
||||||
|
{
|
||||||
|
gEffectBattler = gBattlerAttacker;
|
||||||
|
if (gBattlerAttacker == gBattlerTarget)
|
||||||
|
gBattlerAttacker = gBattlerTarget = gBattleScripting.battler;
|
||||||
|
else
|
||||||
|
gBattlerTarget = gBattleScripting.battler;
|
||||||
|
gBattleScripting.battler = gEffectBattler;
|
||||||
|
++gBattlescriptCurrInstr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void atkEE_removelightscreenreflect(void) // brick break
|
||||||
|
{
|
||||||
|
u8 opposingSide = GetBattlerSide(gBattlerAttacker) ^ BIT_SIDE;
|
||||||
|
|
||||||
|
if (gSideTimers[opposingSide].reflectTimer || gSideTimers[opposingSide].lightscreenTimer)
|
||||||
|
{
|
||||||
|
gSideStatuses[opposingSide] &= ~(SIDE_STATUS_REFLECT);
|
||||||
|
gSideStatuses[opposingSide] &= ~(SIDE_STATUS_LIGHTSCREEN);
|
||||||
|
gSideTimers[opposingSide].reflectTimer = 0;
|
||||||
|
gSideTimers[opposingSide].lightscreenTimer = 0;
|
||||||
|
gBattleScripting.animTurn = 1;
|
||||||
|
gBattleScripting.animTargetsHit = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gBattleScripting.animTurn = 0;
|
||||||
|
gBattleScripting.animTargetsHit = 0;
|
||||||
|
}
|
||||||
|
++gBattlescriptCurrInstr;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user