mirror of
https://github.com/Ninjdai1/pokeemerald.git
synced 2025-02-04 18:30:07 +01:00
Merge pull request #1817 from LOuroboros/photonGeyser
Implemented Photon Geyser and Shell Side Arm
This commit is contained in:
commit
5acebe32aa
@ -1883,6 +1883,14 @@
|
|||||||
.4byte \ptr
|
.4byte \ptr
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
.macro photongeysercheck
|
||||||
|
various BS_ATTACKER, VARIOUS_PHOTON_GEYSER_CHECK
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro shellsidearmcheck
|
||||||
|
various BS_ATTACKER, VARIOUS_SHELL_SIDE_ARM_CHECK
|
||||||
|
.endm
|
||||||
|
|
||||||
@ helpful macros
|
@ helpful macros
|
||||||
.macro setstatchanger stat:req, stages:req, down:req
|
.macro setstatchanger stat:req, stages:req, down:req
|
||||||
setbyte sSTATCHANGER \stat | \stages << 3 | \down << 7
|
setbyte sSTATCHANGER \stat | \stages << 3 | \down << 7
|
||||||
|
@ -14026,7 +14026,50 @@ Move_METEOR_BEAM::
|
|||||||
end @to do:
|
end @to do:
|
||||||
|
|
||||||
Move_SHELL_SIDE_ARM::
|
Move_SHELL_SIDE_ARM::
|
||||||
end @to do:
|
launchtask AnimTask_ShellSideArm 0x5 0x0
|
||||||
|
jumpargeq 0x0, TRUE, Move_SHELL_SIDE_ARM_PHYSICAL
|
||||||
|
jumpargeq 0x0, FALSE, Move_SHELL_SIDE_ARM_SPECIAL
|
||||||
|
Move_SHELL_SIDE_ARM_PHYSICAL: @ Modified Body Slam, placeholder
|
||||||
|
loadspritegfx ANIM_TAG_IMPACT
|
||||||
|
createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT, 0, 6, 6, RGB_MAGENTA
|
||||||
|
monbg ANIM_DEF_PARTNER
|
||||||
|
setalpha 12, 8
|
||||||
|
playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER
|
||||||
|
createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 6, 1, ANIM_ATTACKER
|
||||||
|
waitforvisualfinish
|
||||||
|
delay 11
|
||||||
|
createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 26, 0, 0, 5
|
||||||
|
delay 6
|
||||||
|
createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, -10, 0, ANIM_TARGET, 0
|
||||||
|
loopsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET, 10, 2
|
||||||
|
delay 1
|
||||||
|
createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -28, 0, 0, 3
|
||||||
|
waitforvisualfinish
|
||||||
|
createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1
|
||||||
|
waitforvisualfinish
|
||||||
|
delay 10
|
||||||
|
createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 6
|
||||||
|
delay 5
|
||||||
|
createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 6
|
||||||
|
waitforvisualfinish
|
||||||
|
clearmonbg ANIM_DEF_PARTNER
|
||||||
|
blendoff
|
||||||
|
end
|
||||||
|
Move_SHELL_SIDE_ARM_SPECIAL: @ Modified Snipe Shot, placeholder
|
||||||
|
loadspritegfx ANIM_TAG_IMPACT_2
|
||||||
|
loadspritegfx ANIM_TAG_LEER
|
||||||
|
createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT_2, 0, 6, 6, RGB_MAGENTA
|
||||||
|
createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_LEER, 0, 6, 6, RGB_MAGENTA
|
||||||
|
launchtemplate gLeerSpriteTemplate 0x82, 2 0x18 -12
|
||||||
|
playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER
|
||||||
|
waitforvisualfinish
|
||||||
|
delay 0x20
|
||||||
|
playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET
|
||||||
|
launchtemplate gSnipeShotBallTemplate 0x82, 3, 0 0 24,
|
||||||
|
waitforvisualfinish
|
||||||
|
launchtask AnimTask_ShakeMon2 2 5 1 4 0 8, 1
|
||||||
|
waitforvisualfinish
|
||||||
|
end
|
||||||
|
|
||||||
Move_MISTY_EXPLOSION::
|
Move_MISTY_EXPLOSION::
|
||||||
end @to do:
|
end @to do:
|
||||||
|
@ -393,6 +393,37 @@ gBattleScriptsForMoveEffects::
|
|||||||
.4byte BattleScript_EffectPlasmaFists @ EFFECT_PLASMA_FISTS
|
.4byte BattleScript_EffectPlasmaFists @ EFFECT_PLASMA_FISTS
|
||||||
.4byte BattleScript_EffectHyperspaceFury @ EFFECT_HYPERSPACE_FURY
|
.4byte BattleScript_EffectHyperspaceFury @ EFFECT_HYPERSPACE_FURY
|
||||||
.4byte BattleScript_EffectAuraWheel @ EFFECT_AURA_WHEEL
|
.4byte BattleScript_EffectAuraWheel @ EFFECT_AURA_WHEEL
|
||||||
|
.4byte BattleScript_EffectPhotonGeyser @ EFFECT_PHOTON_GEYSER
|
||||||
|
.4byte BattleScript_EffectShellSideArm @ EFFECT_SHELL_SIDE_ARM
|
||||||
|
|
||||||
|
BattleScript_EffectShellSideArm:
|
||||||
|
shellsidearmcheck
|
||||||
|
setmoveeffect MOVE_EFFECT_POISON
|
||||||
|
goto BattleScript_EffectHit
|
||||||
|
|
||||||
|
BattleScript_EffectPhotonGeyser:
|
||||||
|
attackcanceler
|
||||||
|
accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE
|
||||||
|
attackstring
|
||||||
|
ppreduce
|
||||||
|
critcalc
|
||||||
|
damagecalc
|
||||||
|
adjustdamage
|
||||||
|
photongeysercheck
|
||||||
|
attackanimation
|
||||||
|
waitanimation
|
||||||
|
effectivenesssound
|
||||||
|
hitanimation BS_TARGET
|
||||||
|
waitstate
|
||||||
|
healthbarupdate BS_TARGET
|
||||||
|
datahpupdate BS_TARGET
|
||||||
|
critmessage
|
||||||
|
waitmessage B_WAIT_TIME_LONG
|
||||||
|
resultmessage
|
||||||
|
waitmessage B_WAIT_TIME_LONG
|
||||||
|
seteffectwithchance
|
||||||
|
tryfaintmon BS_TARGET, FALSE, NULL
|
||||||
|
goto BattleScript_MoveEnd
|
||||||
|
|
||||||
BattleScript_EffectAuraWheel: @ Aura Wheel can only be used by Morpeko
|
BattleScript_EffectAuraWheel: @ Aura Wheel can only be used by Morpeko
|
||||||
jumpifspecies BS_ATTACKER, SPECIES_MORPEKO, BattleScript_EffectSpeedUpHit
|
jumpifspecies BS_ATTACKER, SPECIES_MORPEKO, BattleScript_EffectSpeedUpHit
|
||||||
|
@ -929,5 +929,6 @@ extern u8 gBattleControllerData[MAX_BATTLERS_COUNT];
|
|||||||
extern bool8 gHasFetchedBall;
|
extern bool8 gHasFetchedBall;
|
||||||
extern u8 gLastUsedBall;
|
extern u8 gLastUsedBall;
|
||||||
extern u16 gLastThrownBall;
|
extern u16 gLastThrownBall;
|
||||||
|
extern bool8 gSwapDamageCategory; // Photon Geyser, Shell Side Arm, Light That Burns the Sky
|
||||||
|
|
||||||
#endif // GUARD_BATTLE_H
|
#endif // GUARD_BATTLE_H
|
||||||
|
@ -376,7 +376,9 @@
|
|||||||
#define EFFECT_PLASMA_FISTS 370
|
#define EFFECT_PLASMA_FISTS 370
|
||||||
#define EFFECT_HYPERSPACE_FURY 371
|
#define EFFECT_HYPERSPACE_FURY 371
|
||||||
#define EFFECT_AURA_WHEEL 372
|
#define EFFECT_AURA_WHEEL 372
|
||||||
|
#define EFFECT_PHOTON_GEYSER 373
|
||||||
|
#define EFFECT_SHELL_SIDE_ARM 374
|
||||||
|
|
||||||
#define NUM_BATTLE_MOVE_EFFECTS 373
|
#define NUM_BATTLE_MOVE_EFFECTS 375
|
||||||
|
|
||||||
#endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H
|
#endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H
|
||||||
|
@ -199,6 +199,8 @@
|
|||||||
#define VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED 126
|
#define VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED 126
|
||||||
#define VARIOUS_SET_ATTACKER_STICKY_WEB_USER 127
|
#define VARIOUS_SET_ATTACKER_STICKY_WEB_USER 127
|
||||||
#define VARIOUS_TRY_TO_APPLY_MIMICRY 128
|
#define VARIOUS_TRY_TO_APPLY_MIMICRY 128
|
||||||
|
#define VARIOUS_PHOTON_GEYSER_CHECK 129
|
||||||
|
#define VARIOUS_SHELL_SIDE_ARM_CHECK 130
|
||||||
|
|
||||||
// Cmd_manipulatedamage
|
// Cmd_manipulatedamage
|
||||||
#define DMG_CHANGE_SIGN 0
|
#define DMG_CHANGE_SIGN 0
|
||||||
|
@ -5064,3 +5064,12 @@ void AnimTask_PrimalReversion(u8 taskId)
|
|||||||
gBattleAnimArgs[0] = 0;
|
gBattleAnimArgs[0] = 0;
|
||||||
DestroyAnimVisualTask(taskId);
|
DestroyAnimVisualTask(taskId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AnimTask_ShellSideArm(u8 taskId)
|
||||||
|
{
|
||||||
|
if (gSwapDamageCategory)
|
||||||
|
gBattleAnimArgs[0] = TRUE;
|
||||||
|
else
|
||||||
|
gBattleAnimArgs[0] = FALSE;
|
||||||
|
DestroyAnimVisualTask(taskId);
|
||||||
|
}
|
||||||
|
@ -232,6 +232,7 @@ EWRAM_DATA struct TotemBoost gTotemBoosts[MAX_BATTLERS_COUNT] = {0};
|
|||||||
EWRAM_DATA bool8 gHasFetchedBall = FALSE;
|
EWRAM_DATA bool8 gHasFetchedBall = FALSE;
|
||||||
EWRAM_DATA u8 gLastUsedBall = 0;
|
EWRAM_DATA u8 gLastUsedBall = 0;
|
||||||
EWRAM_DATA u16 gLastThrownBall = 0;
|
EWRAM_DATA u16 gLastThrownBall = 0;
|
||||||
|
EWRAM_DATA bool8 gSwapDamageCategory = FALSE; // Photon Geyser, Shell Side Arm, Light That Burns the Sky
|
||||||
|
|
||||||
// IWRAM common vars
|
// IWRAM common vars
|
||||||
void (*gPreBattleCallback1)(void);
|
void (*gPreBattleCallback1)(void);
|
||||||
@ -2941,6 +2942,8 @@ static void BattleStartClearSetData(void)
|
|||||||
gBattleStruct->usedHeldItems[i][1] = 0;
|
gBattleStruct->usedHeldItems[i][1] = 0;
|
||||||
gBattleStruct->itemStolen[i].originalItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM);
|
gBattleStruct->itemStolen[i].originalItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gSwapDamageCategory = FALSE; // Photon Geyser, Shell Side Arm, Light That Burns the Sky
|
||||||
}
|
}
|
||||||
|
|
||||||
void SwitchInClearSetData(void)
|
void SwitchInClearSetData(void)
|
||||||
|
@ -1504,7 +1504,7 @@ static void Cmd_attackcanceler(void)
|
|||||||
&& ((!IsTwoTurnsMove(gCurrentMove) || (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)))
|
&& ((!IsTwoTurnsMove(gCurrentMove) || (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)))
|
||||||
&& gBattleMoves[gCurrentMove].effect != EFFECT_SUCKER_PUNCH)
|
&& gBattleMoves[gCurrentMove].effect != EFFECT_SUCKER_PUNCH)
|
||||||
{
|
{
|
||||||
if (gBattleMoves[gCurrentMove].flags & FLAG_MAKES_CONTACT)
|
if (IsMoveMakingContact(gCurrentMove, gBattlerAttacker))
|
||||||
gProtectStructs[gBattlerAttacker].touchedProtectLike = TRUE;
|
gProtectStructs[gBattlerAttacker].touchedProtectLike = TRUE;
|
||||||
CancelMultiTurnMoves(gBattlerAttacker);
|
CancelMultiTurnMoves(gBattlerAttacker);
|
||||||
gMoveResultFlags |= MOVE_RESULT_MISSED;
|
gMoveResultFlags |= MOVE_RESULT_MISSED;
|
||||||
@ -9023,6 +9023,61 @@ static void Cmd_various(void)
|
|||||||
else
|
else
|
||||||
gBattlescriptCurrInstr += 9;
|
gBattlescriptCurrInstr += 9;
|
||||||
return;
|
return;
|
||||||
|
case VARIOUS_PHOTON_GEYSER_CHECK:
|
||||||
|
{
|
||||||
|
u32 attackerAtkStat = gBattleMons[gBattlerAttacker].attack;
|
||||||
|
u8 attackerAtkStage = gBattleMons[gBattlerAttacker].statStages[STAT_ATK];
|
||||||
|
u32 attackerSpAtkStat = gBattleMons[gBattlerAttacker].spAttack;
|
||||||
|
|
||||||
|
gSwapDamageCategory = FALSE;
|
||||||
|
|
||||||
|
attackerAtkStat *= gStatStageRatios[attackerAtkStage][0];
|
||||||
|
attackerAtkStat /= gStatStageRatios[attackerAtkStage][1];
|
||||||
|
|
||||||
|
attackerAtkStage = gBattleMons[gBattlerAttacker].statStages[STAT_SPATK];
|
||||||
|
attackerSpAtkStat *= gStatStageRatios[attackerAtkStage][0];
|
||||||
|
attackerSpAtkStat /= gStatStageRatios[attackerAtkStage][1];
|
||||||
|
|
||||||
|
if (attackerAtkStat > attackerSpAtkStat)
|
||||||
|
gSwapDamageCategory = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case VARIOUS_SHELL_SIDE_ARM_CHECK: // 0% chance GameFreak actually checks this way according to DaWobblefet, but this is the only functional explanation at the moment
|
||||||
|
{
|
||||||
|
u32 attackerAtkStat = gBattleMons[gBattlerAttacker].attack;
|
||||||
|
u32 targetDefStat = gBattleMons[gBattlerTarget].defense;
|
||||||
|
u32 attackerSpAtkStat = gBattleMons[gBattlerAttacker].spAttack;
|
||||||
|
u32 targetSpDefStat = gBattleMons[gBattlerTarget].spDefense;
|
||||||
|
u8 statStage;
|
||||||
|
u32 physical;
|
||||||
|
u32 special;
|
||||||
|
|
||||||
|
gSwapDamageCategory = FALSE;
|
||||||
|
|
||||||
|
statStage = gBattleMons[gBattlerAttacker].statStages[STAT_ATK];
|
||||||
|
attackerAtkStat *= gStatStageRatios[statStage][0];
|
||||||
|
attackerAtkStat /= gStatStageRatios[statStage][1];
|
||||||
|
|
||||||
|
statStage = gBattleMons[gBattlerTarget].statStages[STAT_DEF];
|
||||||
|
targetDefStat *= gStatStageRatios[statStage][0];
|
||||||
|
targetDefStat /= gStatStageRatios[statStage][1];
|
||||||
|
|
||||||
|
physical = ((((2 * gBattleMons[gBattlerAttacker].level / 5 + 2) * gBattleMoves[gCurrentMove].power * attackerAtkStat) / targetDefStat) / 50);
|
||||||
|
|
||||||
|
statStage = gBattleMons[gBattlerAttacker].statStages[STAT_SPATK];
|
||||||
|
attackerSpAtkStat *= gStatStageRatios[statStage][0];
|
||||||
|
attackerSpAtkStat /= gStatStageRatios[statStage][1];
|
||||||
|
|
||||||
|
statStage = gBattleMons[gBattlerTarget].statStages[STAT_SPDEF];
|
||||||
|
targetSpDefStat *= gStatStageRatios[statStage][0];
|
||||||
|
targetSpDefStat /= gStatStageRatios[statStage][1];
|
||||||
|
|
||||||
|
special = ((((2 * gBattleMons[gBattlerAttacker].level / 5 + 2) * gBattleMoves[gCurrentMove].power * attackerSpAtkStat) / targetSpDefStat) / 50);
|
||||||
|
|
||||||
|
if (((physical > special) || (physical == special && (Random() % 2) == 0)))
|
||||||
|
gSwapDamageCategory = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
case VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED:
|
case VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED:
|
||||||
if (IsLeafGuardProtected(gActiveBattler))
|
if (IsLeafGuardProtected(gActiveBattler))
|
||||||
{
|
{
|
||||||
@ -13357,4 +13412,3 @@ static bool32 CriticalCapture(u32 odds)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4916,7 +4916,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
|||||||
if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
|
if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
|
||||||
&& IsBattlerAlive(gBattlerAttacker)
|
&& IsBattlerAlive(gBattlerAttacker)
|
||||||
&& TARGET_TURN_DAMAGED
|
&& TARGET_TURN_DAMAGED
|
||||||
&& (gBattleMoves[move].flags & FLAG_MAKES_CONTACT))
|
&& (IsMoveMakingContact(move, gBattlerAttacker)))
|
||||||
{
|
{
|
||||||
switch (gBattleMons[gBattlerAttacker].ability)
|
switch (gBattleMons[gBattlerAttacker].ability)
|
||||||
{
|
{
|
||||||
@ -5135,7 +5135,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
|||||||
if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
|
if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
|
||||||
&& gBattleMons[gBattlerAttacker].hp != 0
|
&& gBattleMons[gBattlerAttacker].hp != 0
|
||||||
&& !gProtectStructs[gBattlerAttacker].confusionSelfDmg
|
&& !gProtectStructs[gBattlerAttacker].confusionSelfDmg
|
||||||
&& (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)
|
&& (IsMoveMakingContact(move, gBattlerAttacker))
|
||||||
&& TARGET_TURN_DAMAGED
|
&& TARGET_TURN_DAMAGED
|
||||||
&& CanBeBurned(gBattlerAttacker)
|
&& CanBeBurned(gBattlerAttacker)
|
||||||
&& (Random() % 3) == 0)
|
&& (Random() % 3) == 0)
|
||||||
@ -5151,7 +5151,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
|||||||
if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
|
if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
|
||||||
&& gBattleMons[gBattlerAttacker].hp != 0
|
&& gBattleMons[gBattlerAttacker].hp != 0
|
||||||
&& !gProtectStructs[gBattlerAttacker].confusionSelfDmg
|
&& !gProtectStructs[gBattlerAttacker].confusionSelfDmg
|
||||||
&& (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)
|
&& (IsMoveMakingContact(move, gBattlerAttacker))
|
||||||
&& TARGET_TURN_DAMAGED
|
&& TARGET_TURN_DAMAGED
|
||||||
&& gBattleMons[gBattlerTarget].hp != 0
|
&& gBattleMons[gBattlerTarget].hp != 0
|
||||||
&& (Random() % 3) == 0
|
&& (Random() % 3) == 0
|
||||||
@ -5227,7 +5227,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
|||||||
&& !gProtectStructs[gBattlerAttacker].confusionSelfDmg
|
&& !gProtectStructs[gBattlerAttacker].confusionSelfDmg
|
||||||
&& TARGET_TURN_DAMAGED
|
&& TARGET_TURN_DAMAGED
|
||||||
&& IsBattlerAlive(battler)
|
&& IsBattlerAlive(battler)
|
||||||
&& (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)
|
&& (IsMoveMakingContact(move, gBattlerAttacker))
|
||||||
&& !(gStatuses3[gBattlerAttacker] & STATUS3_PERISH_SONG))
|
&& !(gStatuses3[gBattlerAttacker] & STATUS3_PERISH_SONG))
|
||||||
{
|
{
|
||||||
if (!(gStatuses3[battler] & STATUS3_PERISH_SONG))
|
if (!(gStatuses3[battler] & STATUS3_PERISH_SONG))
|
||||||
@ -7411,13 +7411,24 @@ u32 GetBattlerHoldEffectParam(u8 battlerId)
|
|||||||
bool32 IsMoveMakingContact(u16 move, u8 battlerAtk)
|
bool32 IsMoveMakingContact(u16 move, u8 battlerAtk)
|
||||||
{
|
{
|
||||||
if (!(gBattleMoves[move].flags & FLAG_MAKES_CONTACT))
|
if (!(gBattleMoves[move].flags & FLAG_MAKES_CONTACT))
|
||||||
return FALSE;
|
{
|
||||||
|
if (gBattleMoves[move].effect == EFFECT_SHELL_SIDE_ARM && gSwapDamageCategory)
|
||||||
|
return TRUE;
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
else if (GetBattlerAbility(battlerAtk) == ABILITY_LONG_REACH)
|
else if (GetBattlerAbility(battlerAtk) == ABILITY_LONG_REACH)
|
||||||
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
}
|
||||||
else if (GetBattlerHoldEffect(battlerAtk, TRUE) == HOLD_EFFECT_PROTECTIVE_PADS)
|
else if (GetBattlerHoldEffect(battlerAtk, TRUE) == HOLD_EFFECT_PROTECTIVE_PADS)
|
||||||
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool32 IsBattlerGrounded(u8 battlerId)
|
bool32 IsBattlerGrounded(u8 battlerId)
|
||||||
@ -7925,7 +7936,7 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe
|
|||||||
MulModifier(&modifier, UQ_4_12(1.3));
|
MulModifier(&modifier, UQ_4_12(1.3));
|
||||||
break;
|
break;
|
||||||
case ABILITY_TOUGH_CLAWS:
|
case ABILITY_TOUGH_CLAWS:
|
||||||
if (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)
|
if (IsMoveMakingContact(move, battlerAtk))
|
||||||
MulModifier(&modifier, UQ_4_12(1.3));
|
MulModifier(&modifier, UQ_4_12(1.3));
|
||||||
break;
|
break;
|
||||||
case ABILITY_STRONG_JAW:
|
case ABILITY_STRONG_JAW:
|
||||||
@ -9221,7 +9232,9 @@ bool8 ShouldGetStatBadgeBoost(u16 badgeFlag, u8 battlerId)
|
|||||||
|
|
||||||
u8 GetBattleMoveSplit(u32 moveId)
|
u8 GetBattleMoveSplit(u32 moveId)
|
||||||
{
|
{
|
||||||
if (IS_MOVE_STATUS(moveId) || B_PHYSICAL_SPECIAL_SPLIT >= GEN_4)
|
if (gSwapDamageCategory) // Photon Geyser, Shell Side Arm, Light That Burns the Sky
|
||||||
|
return SPLIT_PHYSICAL;
|
||||||
|
else if (IS_MOVE_STATUS(moveId) || B_PHYSICAL_SPECIAL_SPLIT >= GEN_4)
|
||||||
return gBattleMoves[moveId].split;
|
return gBattleMoves[moveId].split;
|
||||||
else if (gBattleMoves[moveId].type < TYPE_MYSTERY)
|
else if (gBattleMoves[moveId].type < TYPE_MYSTERY)
|
||||||
return SPLIT_PHYSICAL;
|
return SPLIT_PHYSICAL;
|
||||||
|
@ -10455,7 +10455,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] =
|
|||||||
|
|
||||||
[MOVE_PHOTON_GEYSER] =
|
[MOVE_PHOTON_GEYSER] =
|
||||||
{
|
{
|
||||||
.effect = EFFECT_PLACEHOLDER, // Needs a custom move effect
|
.effect = EFFECT_PHOTON_GEYSER,
|
||||||
.power = 100,
|
.power = 100,
|
||||||
.type = TYPE_PSYCHIC,
|
.type = TYPE_PSYCHIC,
|
||||||
.accuracy = 100,
|
.accuracy = 100,
|
||||||
@ -10463,7 +10463,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] =
|
|||||||
.secondaryEffectChance = 0,
|
.secondaryEffectChance = 0,
|
||||||
.target = MOVE_TARGET_FOES_AND_ALLY,
|
.target = MOVE_TARGET_FOES_AND_ALLY,
|
||||||
.priority = 0,
|
.priority = 0,
|
||||||
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,
|
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_TARGET_ABILITY_IGNORED,
|
||||||
.split = SPLIT_SPECIAL,
|
.split = SPLIT_SPECIAL,
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -11291,12 +11291,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] =
|
|||||||
|
|
||||||
[MOVE_SHELL_SIDE_ARM] =
|
[MOVE_SHELL_SIDE_ARM] =
|
||||||
{
|
{
|
||||||
.effect = EFFECT_PLACEHOLDER, //TODO
|
.effect = EFFECT_SHELL_SIDE_ARM,
|
||||||
.power = 90,
|
.power = 90,
|
||||||
.type = TYPE_POISON,
|
.type = TYPE_POISON,
|
||||||
.accuracy = 100,
|
.accuracy = 100,
|
||||||
.pp = 10,
|
.pp = 10,
|
||||||
.secondaryEffectChance = 0,
|
.secondaryEffectChance = 20,
|
||||||
.target = MOVE_TARGET_SELECTED,
|
.target = MOVE_TARGET_SELECTED,
|
||||||
.priority = 0,
|
.priority = 0,
|
||||||
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST,
|
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST,
|
||||||
|
@ -2839,7 +2839,7 @@ static const u8 sMETEOR_BEAMDescription[] = _(
|
|||||||
"Sp. Attack before attacking.");
|
"Sp. Attack before attacking.");
|
||||||
|
|
||||||
static const u8 sSHELL_SIDE_ARMDescription[] = _(
|
static const u8 sSHELL_SIDE_ARMDescription[] = _(
|
||||||
"Uses higher of physical and\n"
|
"Deals better of physical and\n"
|
||||||
"special damage. May poison.");
|
"special damage. May poison.");
|
||||||
|
|
||||||
static const u8 sMISTY_EXPLOSIONDescription[] = _(
|
static const u8 sMISTY_EXPLOSIONDescription[] = _(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user