Merge branch 'symbiosis' of https://github.com/AgustinGDLV/pokeemerald into symbiosis

This commit is contained in:
AgustinGDLV 2022-05-15 09:50:53 -07:00
commit 729302c92e
14 changed files with 226 additions and 67 deletions

View File

@ -410,6 +410,51 @@ gBattleScriptsForMoveEffects::
.4byte BattleScript_EffectHit @ EFFECT_RISING_VOLTAGE .4byte BattleScript_EffectHit @ EFFECT_RISING_VOLTAGE
.4byte BattleScript_EffectHit @ EFFECT_BEAK_BLAST .4byte BattleScript_EffectHit @ EFFECT_BEAK_BLAST
.4byte BattleScript_EffectCourtChange @ EFFECT_COURT_CHANGE .4byte BattleScript_EffectCourtChange @ EFFECT_COURT_CHANGE
.4byte BattleScript_EffectSteelBeam @ EFFECT_STEEL_BEAM
BattleScript_EffectSteelBeam::
attackcanceler
attackstring
ppreduce
accuracycheck BattleScript_SteelBeamMiss, ACC_CURR_MOVE
critcalc
damagecalc
adjustdamage
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
jumpifability BS_ATTACKER, ABILITY_MAGIC_GUARD, BattleScript_SteelBeamAfterSelfDamage
call BattleScript_SteelBeamSelfDamage
BattleScript_SteelBeamAfterSelfDamage::
waitstate
tryfaintmon BS_ATTACKER
tryfaintmon BS_TARGET
goto BattleScript_MoveEnd
BattleScript_SteelBeamMiss::
pause B_WAIT_TIME_SHORT
effectivenesssound
resultmessage
waitmessage B_WAIT_TIME_LONG
jumpifability BS_ATTACKER, ABILITY_MAGIC_GUARD, BattleScript_MoveEnd
bichalfword gMoveResultFlags, MOVE_RESULT_MISSED
call BattleScript_SteelBeamSelfDamage
orhalfword gMoveResultFlags, MOVE_RESULT_MISSED
goto BattleScript_SteelBeamAfterSelfDamage
BattleScript_SteelBeamSelfDamage::
dmg_1_2_attackerhp
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
return
BattleScript_EffectCourtChange:: BattleScript_EffectCourtChange::
attackcanceler attackcanceler
@ -1273,6 +1318,7 @@ BattleScript_StrengthSapTryHp:
attackanimation attackanimation
waitanimation waitanimation
BattleScript_StrengthSapHp: BattleScript_StrengthSapHp:
jumpifstatus3 BS_ATTACKER, STATUS3_HEAL_BLOCK, BattleScript_MoveEnd
jumpiffullhp BS_ATTACKER, BattleScript_MoveEnd jumpiffullhp BS_ATTACKER, BattleScript_MoveEnd
manipulatedamage DMG_BIG_ROOT manipulatedamage DMG_BIG_ROOT
healthbarupdate BS_ATTACKER healthbarupdate BS_ATTACKER
@ -2109,7 +2155,9 @@ BattleScript_GrowthDoMoveAnim::
waitanimation waitanimation
setbyte sSTAT_ANIM_PLAYED, FALSE setbyte sSTAT_ANIM_PLAYED, FALSE
playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_SPATK, 0 playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_SPATK, 0
.if B_GROWTH_UNDER_SUN >= GEN_5
jumpifweatheraffected BS_ATTACKER, B_WEATHER_SUN, BattleScript_GrowthAtk2 jumpifweatheraffected BS_ATTACKER, B_WEATHER_SUN, BattleScript_GrowthAtk2
.endif
setstatchanger STAT_ATK, 1, FALSE setstatchanger STAT_ATK, 1, FALSE
goto BattleScript_GrowthAtk goto BattleScript_GrowthAtk
BattleScript_GrowthAtk2: BattleScript_GrowthAtk2:
@ -2120,7 +2168,9 @@ BattleScript_GrowthAtk:
printfromtable gStatUpStringIds printfromtable gStatUpStringIds
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
BattleScript_GrowthTrySpAtk:: BattleScript_GrowthTrySpAtk::
.if B_GROWTH_UNDER_SUN >= GEN_5
jumpifweatheraffected BS_ATTACKER, B_WEATHER_SUN, BattleScript_GrowthSpAtk2 jumpifweatheraffected BS_ATTACKER, B_WEATHER_SUN, BattleScript_GrowthSpAtk2
.endif
setstatchanger STAT_SPATK, 1, FALSE setstatchanger STAT_SPATK, 1, FALSE
goto BattleScript_GrowthSpAtk goto BattleScript_GrowthSpAtk
BattleScript_GrowthSpAtk2: BattleScript_GrowthSpAtk2:
@ -2412,6 +2462,8 @@ BattleScript_EffectHealPulse:
attackcanceler attackcanceler
attackstring attackstring
ppreduce ppreduce
jumpifstatus3 BS_ATTACKER, STATUS3_HEAL_BLOCK, BattleScript_MoveUsedHealBlockPrevents @ stops pollen puff
jumpifstatus3 BS_TARGET, STATUS3_HEAL_BLOCK, BattleScript_MoveUsedHealBlockPrevents
accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON
jumpifsubstituteblocks BattleScript_ButItFailed jumpifsubstituteblocks BattleScript_ButItFailed
tryhealpulse BS_TARGET, BattleScript_AlreadyAtFullHp tryhealpulse BS_TARGET, BattleScript_AlreadyAtFullHp
@ -3106,6 +3158,7 @@ BattleScript_EffectAbsorb::
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
resultmessage resultmessage
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
jumpifstatus3 BS_ATTACKER, STATUS3_HEAL_BLOCK, BattleScript_AbsorbHealBlock
setdrainedhp setdrainedhp
manipulatedamage DMG_BIG_ROOT manipulatedamage DMG_BIG_ROOT
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_DISGUISE orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_DISGUISE
@ -3125,6 +3178,7 @@ BattleScript_AbsorbUpdateHp::
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
BattleScript_AbsorbTryFainting:: BattleScript_AbsorbTryFainting::
tryfaintmon BS_ATTACKER tryfaintmon BS_ATTACKER
BattleScript_AbsorbHealBlock::
tryfaintmon BS_TARGET tryfaintmon BS_TARGET
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
@ -3231,6 +3285,7 @@ BattleScript_DreamEaterWorked:
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
resultmessage resultmessage
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
jumpifstatus3 BS_ATTACKER, STATUS3_HEAL_BLOCK, BattleScript_DreamEaterTryFaintEnd
setdrainedhp setdrainedhp
manipulatedamage DMG_BIG_ROOT manipulatedamage DMG_BIG_ROOT
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE
@ -4536,7 +4591,11 @@ BattleScript_NightmareWorked::
BattleScript_EffectMinimize:: BattleScript_EffectMinimize::
attackcanceler attackcanceler
setminimize setminimize
.if B_MINIMIZE_EVASION >= GEN_5
setstatchanger STAT_EVASION, 2, FALSE
.else
setstatchanger STAT_EVASION, 1, FALSE setstatchanger STAT_EVASION, 1, FALSE
.endif
goto BattleScript_EffectStatUpAfterAtkCanceler goto BattleScript_EffectStatUpAfterAtkCanceler
BattleScript_EffectCurse:: BattleScript_EffectCurse::
@ -7928,7 +7987,7 @@ BattleScript_DrizzleActivates::
call BattleScript_WeatherFormChanges call BattleScript_WeatherFormChanges
end3 end3
BattleScript_DefiantActivates:: BattleScript_AbilityRaisesDefenderStat::
pause B_WAIT_TIME_SHORT pause B_WAIT_TIME_SHORT
call BattleScript_AbilityPopUp call BattleScript_AbilityPopUp
statbuffchange 0, NULL statbuffchange 0, NULL
@ -8208,8 +8267,10 @@ BattleScript_DesolateLandEvaporatesWaterTypeMoves::
attackstring attackstring
pause B_WAIT_TIME_SHORT pause B_WAIT_TIME_SHORT
ppreduce ppreduce
jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_STRING_PRINTED, BattleScript_MoveEnd
printstring STRINGID_MOVEEVAPORATEDINTHEHARSHSUNLIGHT printstring STRINGID_MOVEEVAPORATEDINTHEHARSHSUNLIGHT
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
orword gHitMarker, HITMARKER_STRING_PRINTED
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
BattleScript_PrimordialSeaActivates:: BattleScript_PrimordialSeaActivates::
@ -8226,8 +8287,10 @@ BattleScript_PrimordialSeaFizzlesOutFireTypeMoves::
attackstring attackstring
pause B_WAIT_TIME_SHORT pause B_WAIT_TIME_SHORT
ppreduce ppreduce
jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_STRING_PRINTED, BattleScript_MoveEnd
printstring STRINGID_MOVEFIZZLEDOUTINTHEHEAVYRAIN printstring STRINGID_MOVEFIZZLEDOUTINTHEHEAVYRAIN
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
orword gHitMarker, HITMARKER_STRING_PRINTED
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
BattleScript_DeltaStreamActivates:: BattleScript_DeltaStreamActivates::

View File

@ -469,7 +469,6 @@ struct MegaEvolutionData
bool8 playerSelect; bool8 playerSelect;
u8 triggerSpriteId; u8 triggerSpriteId;
bool8 isWishMegaEvo; bool8 isWishMegaEvo;
bool8 isPrimalReversion;
}; };
struct Illusion struct Illusion

View File

@ -308,7 +308,7 @@ extern const u8 BattleScript_MistySurgeActivates[];
extern const u8 BattleScript_ElectricSurgeActivates[]; extern const u8 BattleScript_ElectricSurgeActivates[];
extern const u8 BattleScript_SpectralThiefSteal[]; extern const u8 BattleScript_SpectralThiefSteal[];
extern const u8 BattleScript_StatUpMsg[]; extern const u8 BattleScript_StatUpMsg[];
extern const u8 BattleScript_DefiantActivates[]; extern const u8 BattleScript_AbilityRaisesDefenderStat[];
extern const u8 BattleScript_PowderMoveNoEffect[]; extern const u8 BattleScript_PowderMoveNoEffect[];
extern const u8 BattleScript_GrassyTerrainHeals[]; extern const u8 BattleScript_GrassyTerrainHeals[];
extern const u8 BattleScript_VCreateStatLoss[]; extern const u8 BattleScript_VCreateStatLoss[];

View File

@ -134,6 +134,7 @@ u16 CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 abilit
u16 GetTypeModifier(u8 atkType, u8 defType); u16 GetTypeModifier(u8 atkType, u8 defType);
s32 GetStealthHazardDamage(u8 hazardType, u8 battlerId); s32 GetStealthHazardDamage(u8 hazardType, u8 battlerId);
u16 GetMegaEvolutionSpecies(u16 preEvoSpecies, u16 heldItemId); u16 GetMegaEvolutionSpecies(u16 preEvoSpecies, u16 heldItemId);
u16 GetPrimalReversionSpecies(u16 preEvoSpecies, u16 heldItemId);
u16 GetWishMegaEvolutionSpecies(u16 preEvoSpecies, u16 moveId1, u16 moveId2, u16 moveId3, u16 moveId4); u16 GetWishMegaEvolutionSpecies(u16 preEvoSpecies, u16 moveId1, u16 moveId2, u16 moveId3, u16 moveId4);
bool32 CanMegaEvolve(u8 battlerId); bool32 CanMegaEvolve(u8 battlerId);
void UndoMegaEvolution(u32 monId); void UndoMegaEvolution(u32 monId);

View File

@ -203,6 +203,7 @@
#define HITMARKER_CHARGING (1 << 27) #define HITMARKER_CHARGING (1 << 27)
#define HITMARKER_FAINTED(battler) (gBitTable[battler] << 28) #define HITMARKER_FAINTED(battler) (gBitTable[battler] << 28)
#define HITMARKER_FAINTED2(battler) ((1 << 28) << battler) #define HITMARKER_FAINTED2(battler) ((1 << 28) << battler)
#define HITMARKER_STRING_PRINTED (1 << 29)
// Per-side statuses that affect an entire party // Per-side statuses that affect an entire party
#define SIDE_STATUS_REFLECT (1 << 0) #define SIDE_STATUS_REFLECT (1 << 0)

View File

@ -99,7 +99,7 @@
#endif #endif
// Calculation settings // Calculation settings
#define B_CRIT_CHANCE GEN_7 // Chances of a critical hit landing. See CalcCritChanceStage. #define B_CRIT_CHANCE GEN_7 // Chances of a critical hit landing. See CalcCritChanceStage. Gen6+ chances guarantee that Farfetch'd and Sirfetch'd always get critical hits while holding a Leek and using high-crit ratio moves.
#define B_CRIT_MULTIPLIER GEN_7 // In Gen6+, critical hits multiply damage by 1.5 instead of 2. #define B_CRIT_MULTIPLIER GEN_7 // In Gen6+, critical hits multiply damage by 1.5 instead of 2.
#define B_PARALYSIS_SPEED GEN_7 // In Gen7+, Speed is decreased by 50% instead of 75%. #define B_PARALYSIS_SPEED GEN_7 // In Gen7+, Speed is decreased by 50% instead of 75%.
#define B_CONFUSION_SELF_DMG_CHANCE GEN_7 // In Gen7+, confusion has a 33.3% of self-damage, instead of 50%. #define B_CONFUSION_SELF_DMG_CHANCE GEN_7 // In Gen7+, confusion has a 33.3% of self-damage, instead of 50%.
@ -116,6 +116,7 @@
// Damage settings // Damage settings
#define B_BURN_DAMAGE GEN_7 // In Gen7+, burn damage is 1/16th of max HP instead of 1/8th. #define B_BURN_DAMAGE GEN_7 // In Gen7+, burn damage is 1/16th of max HP instead of 1/8th.
#define B_BURN_FACADE_DMG GEN_7 // In Gen6+, burn's effect of lowering the Attack stat no longer applies to Facade.
#define B_BINDING_DAMAGE GEN_7 // In Gen6+, binding damage is 1/8 of max HP instead of 1/16. (With Binding Band, 1/6 and 1/8 respectively.) #define B_BINDING_DAMAGE GEN_7 // In Gen6+, binding damage is 1/8 of max HP instead of 1/16. (With Binding Band, 1/6 and 1/8 respectively.)
#define B_PSYWAVE_DMG GEN_7 // Psywave's damage formula. See Cmd_psywavedamageeffect. #define B_PSYWAVE_DMG GEN_7 // Psywave's damage formula. See Cmd_psywavedamageeffect.
#define B_PAYBACK_SWITCH_BOOST GEN_7 // In Gen5+, if the opponent switches out, Payback's damage will no longer be doubled. #define B_PAYBACK_SWITCH_BOOST GEN_7 // In Gen5+, if the opponent switches out, Payback's damage will no longer be doubled.
@ -152,16 +153,18 @@
#define B_RECOIL_IF_MISS_DMG GEN_7 // In Gen5+, Jump Kick and High Jump Kick will always do half of the user's max HP when missing. #define B_RECOIL_IF_MISS_DMG GEN_7 // In Gen5+, Jump Kick and High Jump Kick will always do half of the user's max HP when missing.
#define B_KLUTZ_FLING_INTERACTION GEN_7 // In Gen5+, Pokémon with the Klutz ability can't use Fling. #define B_KLUTZ_FLING_INTERACTION GEN_7 // In Gen5+, Pokémon with the Klutz ability can't use Fling.
#define B_UPDATED_CONVERSION GEN_7 // In Gen6+, Conversion changes the user's type to match their first move's. Before, it would choose a move at random. #define B_UPDATED_CONVERSION GEN_7 // In Gen6+, Conversion changes the user's type to match their first move's. Before, it would choose a move at random.
#define B_PP_REDUCED_BY_SPITE GEN_7 // In Gen4+, Spite reduces the foe's last move's PP by 4, instead of 2 to 5.
#define B_MINIMIZE_EVASION GEN_7 // In Gen5+, Minimize raises evasion by 2 stages instead of 1.
// Move accuracy settings // Move accuracy settings
#define B_TOXIC_NEVER_MISS GEN_7 // In Gen6+, if Toxic is used by a Poison-type Pokémon, it will never miss. #define B_TOXIC_NEVER_MISS GEN_7 // In Gen6+, if Toxic is used by a Poison-type Pokémon, it will never miss.
#define B_MINIMIZE_DMG_ACC GEN_7 // In Gen6+, moves that causes double damage to minimized Pokémon will also skip accuracy checks. #define B_MINIMIZE_DMG_ACC GEN_7 // In Gen6+, moves that causes double damage to minimized Pokémon will also skip accuracy checks.
#define B_BLIZZARD_HAIL GEN_7 // In Gen4+, Blizzard bypasses accuracy checks if it's hailing. #define B_BLIZZARD_HAIL GEN_7 // In Gen4+, Blizzard bypasses accuracy checks if it's hailing.
#define B_SHEER_COLD_ACC GEN_7 // In Gen7+, Sheer Cold's base chance of hitting is reduced to 20% if the user isn't Ice-typed.
// Other move settings // Other move settings
#define B_SOUND_SUBSTITUTE GEN_7 // In Gen6+, sound moves bypass Substitute. #define B_SOUND_SUBSTITUTE GEN_7 // In Gen6+, sound moves bypass Substitute.
#define B_INCINERATE_GEMS GEN_7 // In Gen6+, Incinerate can destroy Gems. #define B_INCINERATE_GEMS GEN_7 // In Gen6+, Incinerate can destroy Gems.
#define B_PP_REDUCED_BY_SPITE GEN_7 // In Gen4+, Spite reduces the foe's last move's PP by 4, instead of 2 to 5.
#define B_CAN_SPITE_FAIL GEN_7 // In Gen4+, Spite can no longer fail if the foe's last move only has 1 remaining PP. #define B_CAN_SPITE_FAIL GEN_7 // In Gen4+, Spite can no longer fail if the foe's last move only has 1 remaining PP.
#define B_CRASH_IF_TARGET_IMMUNE GEN_7 // In Gen4+, The user of Jump Kick or High Jump Kick will "keep going and crash" if it attacks a target that is immune to the move. #define B_CRASH_IF_TARGET_IMMUNE GEN_7 // In Gen4+, The user of Jump Kick or High Jump Kick will "keep going and crash" if it attacks a target that is immune to the move.
#define B_MEMENTO_FAIL GEN_7 // In Gen4+, Memento fails if there is no target or if the target is protected or behind substitute. But not if Atk/Sp. Atk are at -6. #define B_MEMENTO_FAIL GEN_7 // In Gen4+, Memento fails if there is no target or if the target is protected or behind substitute. But not if Atk/Sp. Atk are at -6.
@ -170,6 +173,10 @@
#define B_BRICK_BREAK GEN_7 // In Gen4+, you can destroy your own side's screens. In Gen 5+, screens are not removed if the target is immune. #define B_BRICK_BREAK GEN_7 // In Gen4+, you can destroy your own side's screens. In Gen 5+, screens are not removed if the target is immune.
#define B_WISH_HP_SOURCE GEN_7 // In Gen5+, Wish heals half of the user's max HP instead of the target's. #define B_WISH_HP_SOURCE GEN_7 // In Gen5+, Wish heals half of the user's max HP instead of the target's.
#define B_RAMPAGE_CANCELLING GEN_7 // In Gen5+, a failed Thrash, etc, will cancel except on its last turn. #define B_RAMPAGE_CANCELLING GEN_7 // In Gen5+, a failed Thrash, etc, will cancel except on its last turn.
#define B_HEAL_BLOCKING GEN_7 // In Gen5+, Heal Block prevents healing by Black Sludge, Leftovers, Shell Bell. Affected Pokémon will not consume held HP-restoring Berries or Berry Juice.
// Draining abilities will not heal but will prevent damage. In Gen6+, Heal Block prevents the use of most HP-draining moves.
#define B_ROOTED_GROUNDING GEN_7 // In Gen4+, Ingrain causes the affected Pokémon to become grounded.
#define B_GROWTH_UNDER_SUN GEN_7 // In Gen5+, Growth's effects are doubled when under the effects of the sun.
// Ability settings // Ability settings
#define B_EXPANDED_ABILITY_NAMES TRUE // If TRUE, ability names are increased from 12 characters to 16 characters. #define B_EXPANDED_ABILITY_NAMES TRUE // If TRUE, ability names are increased from 12 characters to 16 characters.
@ -185,6 +192,7 @@
#define B_OBLIVIOUS_TAUNT GEN_7 // In Gen6+, Pokémon with Oblivious can't be taunted. #define B_OBLIVIOUS_TAUNT GEN_7 // In Gen6+, Pokémon with Oblivious can't be taunted.
#define B_SYMBIOSIS_GEMS GEN_7 // In Gen 6, Symbiosis passes an item before the gem-boosted attack hits and the item effect applies. In Gen 7+, items are passed after a gem-boosted attack. #define B_SYMBIOSIS_GEMS GEN_7 // In Gen 6, Symbiosis passes an item before the gem-boosted attack hits and the item effect applies. In Gen 7+, items are passed after a gem-boosted attack.
// Item settings // Item settings
#define B_HP_BERRIES GEN_7 // In Gen4+, berries which restore hp activate immediately after HP drops to half. In Gen3, the effect occurs at the end of the turn. #define B_HP_BERRIES GEN_7 // In Gen4+, berries which restore hp activate immediately after HP drops to half. In Gen3, the effect occurs at the end of the turn.
#define B_BERRIES_INSTANT GEN_7 // In Gen4+, most berries activate on battle start/switch-in if applicable. In Gen3, they only activate either at the move end or turn end. #define B_BERRIES_INSTANT GEN_7 // In Gen4+, most berries activate on battle start/switch-in if applicable. In Gen3, they only activate either at the move end or turn end.
@ -203,7 +211,6 @@
#define B_HEAVY_BALL_MODIFIER GEN_7 // In Gen7+, Heavy Ball's ranges change. See Cmd_handleballthrow. #define B_HEAVY_BALL_MODIFIER GEN_7 // In Gen7+, Heavy Ball's ranges change. See Cmd_handleballthrow.
#define B_DREAM_BALL_MODIFIER GEN_8 // In Gen8, Dream Ball's catch multiplier is x4 when the target is asleep or has the ability Comatose. #define B_DREAM_BALL_MODIFIER GEN_8 // In Gen8, Dream Ball's catch multiplier is x4 when the target is asleep or has the ability Comatose.
#define B_SERENE_GRACE_BOOST GEN_7 // In Gen5+, Serene Grace boosts the added flinch chance of King's Rock and Razor Fang. #define B_SERENE_GRACE_BOOST GEN_7 // In Gen5+, Serene Grace boosts the added flinch chance of King's Rock and Razor Fang.
#define B_LEEK_ALWAYS_CRIT GEN_7 // In Gen6+, if a Farfetch'd or Sirfetch'd holding a Leek use a move with increased Critical Hit ratio, it will always result in a Critical Hit.
// Flag settings // Flag settings
// To use the following features in scripting, replace the 0s with the flag ID you're assigning it to. // To use the following features in scripting, replace the 0s with the flag ID you're assigning it to.

View File

@ -393,7 +393,8 @@
#define EFFECT_RISING_VOLTAGE 387 #define EFFECT_RISING_VOLTAGE 387
#define EFFECT_BEAK_BLAST 388 #define EFFECT_BEAK_BLAST 388
#define EFFECT_COURT_CHANGE 389 #define EFFECT_COURT_CHANGE 389
#define EFFECT_STEEL_BEAM 390
#define NUM_BATTLE_MOVE_EFFECTS 390 #define NUM_BATTLE_MOVE_EFFECTS 391
#endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H

View File

@ -1499,6 +1499,10 @@ bool32 ShouldTryOHKO(u8 battlerAtk, u8 battlerDef, u16 atkAbility, u16 defAbilit
else // test the odds else // test the odds
{ {
u16 odds = accuracy + (gBattleMons[battlerAtk].level - gBattleMons[battlerDef].level); u16 odds = accuracy + (gBattleMons[battlerAtk].level - gBattleMons[battlerDef].level);
#if B_SHEER_COLD_ACC >= GEN_7
if (gCurrentMove == MOVE_SHEER_COLD && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_ICE))
odds -= 10;
#endif
if (Random() % 100 + 1 < odds && gBattleMons[battlerAtk].level >= gBattleMons[battlerDef].level) if (Random() % 100 + 1 < odds && gBattleMons[battlerAtk].level >= gBattleMons[battlerDef].level)
return TRUE; return TRUE;
} }

View File

@ -64,6 +64,8 @@
#include "constants/trainers.h" #include "constants/trainers.h"
#include "cable_club.h" #include "cable_club.h"
extern struct Evolution gEvolutionTable[][EVOS_PER_MON];
extern const struct BgTemplate gBattleBgTemplates[]; extern const struct BgTemplate gBattleBgTemplates[];
extern const struct WindowTemplate *const gBattleWindowTemplates[]; extern const struct WindowTemplate *const gBattleWindowTemplates[];
@ -3635,12 +3637,18 @@ static void TryDoEventsBeforeFirstTurn(void)
// Primal Reversion // Primal Reversion
for (i = 0; i < gBattlersCount; i++) for (i = 0; i < gBattlersCount; i++)
{ {
if (CanMegaEvolve(i) if (GetBattlerHoldEffect(i, TRUE) == HOLD_EFFECT_PRIMAL_ORB)
&& GetBattlerHoldEffect(i, TRUE) == HOLD_EFFECT_PRIMAL_ORB)
{ {
gBattlerAttacker = i; for (j = 0; j < EVOS_PER_MON; j++)
BattleScriptExecute(BattleScript_PrimalReversion); {
return; if (gEvolutionTable[gBattleMons[i].species][j].targetSpecies != SPECIES_NONE
&& gEvolutionTable[gBattleMons[i].species][j].method == EVO_PRIMAL_REVERSION)
{
gBattlerAttacker = i;
BattleScriptExecute(BattleScript_PrimalReversion);
return;
}
}
} }
} }
@ -4020,7 +4028,8 @@ static void HandleTurnActionSelectionState(void)
{ {
BtlController_EmitChoosePokemon(BUFFER_A, PARTY_ACTION_CANT_SWITCH, PARTY_SIZE, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); BtlController_EmitChoosePokemon(BUFFER_A, PARTY_ACTION_CANT_SWITCH, PARTY_SIZE, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]);
} }
else if ((i = IsAbilityPreventingEscape(gActiveBattler))) else if ((i = IsAbilityPreventingEscape(gActiveBattler)
&& ItemId_GetHoldEffect(gBattleMons[gActiveBattler].item) != HOLD_EFFECT_SHED_SHELL))
{ {
BtlController_EmitChoosePokemon(BUFFER_A, ((i - 1) << 4) | PARTY_ACTION_ABILITY_PREVENTS, PARTY_SIZE, gBattleMons[i - 1].ability, gBattleStruct->battlerPartyOrders[gActiveBattler]); BtlController_EmitChoosePokemon(BUFFER_A, ((i - 1) << 4) | PARTY_ACTION_ABILITY_PREVENTS, PARTY_SIZE, gBattleMons[i - 1].ability, gBattleStruct->battlerPartyOrders[gActiveBattler]);
} }

View File

@ -220,7 +220,7 @@ static const u8 sText_PkmnForesawAttack[] = _("{B_ATK_NAME_WITH_PREFIX} foresaw\
static const u8 sText_PkmnTookAttack[] = _("{B_DEF_NAME_WITH_PREFIX} took the\n{B_BUFF1} attack!"); static const u8 sText_PkmnTookAttack[] = _("{B_DEF_NAME_WITH_PREFIX} took the\n{B_BUFF1} attack!");
static const u8 sText_PkmnChoseXAsDestiny[] = _("{B_ATK_NAME_WITH_PREFIX} chose\n{B_CURRENT_MOVE} as its destiny!"); static const u8 sText_PkmnChoseXAsDestiny[] = _("{B_ATK_NAME_WITH_PREFIX} chose\n{B_CURRENT_MOVE} as its destiny!");
static const u8 sText_PkmnAttack[] = _("{B_BUFF1}'s attack!"); static const u8 sText_PkmnAttack[] = _("{B_BUFF1}'s attack!");
static const u8 sText_PkmnCenterAttention[] = _("{B_ATK_NAME_WITH_PREFIX} became the\ncenter of attention!"); static const u8 sText_PkmnCenterAttention[] = _("{B_DEF_NAME_WITH_PREFIX} became the\ncenter of attention!");
static const u8 sText_PkmnChargingPower[] = _("{B_ATK_NAME_WITH_PREFIX} began\ncharging power!"); static const u8 sText_PkmnChargingPower[] = _("{B_ATK_NAME_WITH_PREFIX} began\ncharging power!");
static const u8 sText_NaturePowerTurnedInto[] = _("NATURE POWER turned into\n{B_CURRENT_MOVE}!"); static const u8 sText_NaturePowerTurnedInto[] = _("NATURE POWER turned into\n{B_CURRENT_MOVE}!");
static const u8 sText_PkmnStatusNormal[] = _("{B_ATK_NAME_WITH_PREFIX}'s status\nreturned to normal!"); static const u8 sText_PkmnStatusNormal[] = _("{B_ATK_NAME_WITH_PREFIX}'s status\nreturned to normal!");

View File

@ -1358,24 +1358,20 @@ static void Cmd_attackcanceler(void)
GET_MOVE_TYPE(gCurrentMove, moveType); GET_MOVE_TYPE(gCurrentMove, moveType);
if (moveType == TYPE_FIRE if (WEATHER_HAS_EFFECT && gBattleMoves[gCurrentMove].power)
&& (gBattleWeather & B_WEATHER_RAIN_PRIMAL)
&& WEATHER_HAS_EFFECT
&& gBattleMoves[gCurrentMove].power)
{ {
BattleScriptPushCursor(); if (moveType == TYPE_FIRE && (gBattleWeather & B_WEATHER_RAIN_PRIMAL))
gBattlescriptCurrInstr = BattleScript_PrimordialSeaFizzlesOutFireTypeMoves; {
return; BattleScriptPushCursor();
} gBattlescriptCurrInstr = BattleScript_PrimordialSeaFizzlesOutFireTypeMoves;
return;
if (moveType == TYPE_WATER }
&& (gBattleWeather & B_WEATHER_SUN_PRIMAL) else if (moveType == TYPE_WATER && (gBattleWeather & B_WEATHER_SUN_PRIMAL))
&& WEATHER_HAS_EFFECT {
&& gBattleMoves[gCurrentMove].power) BattleScriptPushCursor();
{ gBattlescriptCurrInstr = BattleScript_DesolateLandEvaporatesWaterTypeMoves;
BattleScriptPushCursor(); return;
gBattlescriptCurrInstr = BattleScript_DesolateLandEvaporatesWaterTypeMoves; }
return;
} }
if (gBattleOutcome != 0) if (gBattleOutcome != 0)
@ -1879,11 +1875,7 @@ s32 CalcCritChanceStage(u8 battlerAtk, u8 battlerDef, u32 move, bool32 recordAbi
else if (gStatuses3[battlerAtk] & STATUS3_LASER_FOCUS else if (gStatuses3[battlerAtk] & STATUS3_LASER_FOCUS
|| gBattleMoves[move].effect == EFFECT_ALWAYS_CRIT || gBattleMoves[move].effect == EFFECT_ALWAYS_CRIT
|| (abilityAtk == ABILITY_MERCILESS && gBattleMons[battlerDef].status1 & STATUS1_PSN_ANY) || (abilityAtk == ABILITY_MERCILESS && gBattleMons[battlerDef].status1 & STATUS1_PSN_ANY)
|| move == MOVE_SURGING_STRIKES || move == MOVE_SURGING_STRIKES)
#if B_LEEK_ALWAYS_CRIT >= GEN_6
|| ((gBattleMoves[gCurrentMove].flags & FLAG_HIGH_CRIT) && BENEFITS_FROM_LEEK(battlerAtk, holdEffectAtk))
#endif
)
{ {
critChance = -2; critChance = -2;
} }
@ -7942,7 +7934,7 @@ static void Cmd_various(void)
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3);
return; return;
case VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS: case VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS:
if ((gStatuses3[gActiveBattler] & (STATUS3_SEMI_INVULNERABLE)) if ((gStatuses3[gActiveBattler] & (STATUS3_SEMI_INVULNERABLE | STATUS3_HEAL_BLOCK))
|| BATTLER_MAX_HP(gActiveBattler) || BATTLER_MAX_HP(gActiveBattler)
|| !gBattleMons[gActiveBattler].hp || !gBattleMons[gActiveBattler].hp
|| !(IsBattlerGrounded(gActiveBattler))) || !(IsBattlerGrounded(gActiveBattler)))
@ -8617,7 +8609,7 @@ static void Cmd_various(void)
gBattleStruct->mega.playerPrimalRevertedSpecies = gBattleStruct->mega.primalRevertedSpecies[gActiveBattler]; gBattleStruct->mega.playerPrimalRevertedSpecies = gBattleStruct->mega.primalRevertedSpecies[gActiveBattler];
} }
// Checks Primal Reversion // Checks Primal Reversion
primalSpecies = GetMegaEvolutionSpecies(gBattleStruct->mega.primalRevertedSpecies[gActiveBattler], gBattleMons[gActiveBattler].item); primalSpecies = GetPrimalReversionSpecies(gBattleStruct->mega.primalRevertedSpecies[gActiveBattler], gBattleMons[gActiveBattler].item);
gBattleMons[gActiveBattler].species = primalSpecies; gBattleMons[gActiveBattler].species = primalSpecies;
PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gActiveBattler].species); PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gActiveBattler].species);
@ -9951,7 +9943,7 @@ static void Cmd_manipulatedamage(void)
gBattleMoveDamage = GetDrainedBigRootHp(gBattlerAttacker, gBattleMoveDamage); gBattleMoveDamage = GetDrainedBigRootHp(gBattlerAttacker, gBattleMoveDamage);
break; break;
case DMG_1_2_ATTACKER_HP: case DMG_1_2_ATTACKER_HP:
gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 2; gBattleMoveDamage = (gBattleMons[gBattlerAttacker].maxHP + 1) / 2; // Half of Max HP Rounded UP
break; break;
case DMG_RECOIL_FROM_IMMUNE: case DMG_RECOIL_FROM_IMMUNE:
gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 2; gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 2;
@ -10971,6 +10963,10 @@ static void Cmd_tryKO(void)
else else
{ {
u16 odds = gBattleMoves[gCurrentMove].accuracy + (gBattleMons[gBattlerAttacker].level - gBattleMons[gBattlerTarget].level); u16 odds = gBattleMoves[gCurrentMove].accuracy + (gBattleMons[gBattlerAttacker].level - gBattleMons[gBattlerTarget].level);
#if B_SHEER_COLD_ACC >= GEN_7
if (gCurrentMove == MOVE_SHEER_COLD && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_ICE))
odds -= 10;
#endif
if (Random() % 100 + 1 < odds && gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level) if (Random() % 100 + 1 < odds && gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level)
lands = TRUE; lands = TRUE;
} }
@ -12466,9 +12462,9 @@ static void Cmd_jumpifattackandspecialattackcannotfall(void) // memento
static void Cmd_setforcedtarget(void) // follow me static void Cmd_setforcedtarget(void) // follow me
{ {
gSideTimers[GetBattlerSide(gBattlerAttacker)].followmeTimer = 1; gSideTimers[GetBattlerSide(gBattlerTarget)].followmeTimer = 1;
gSideTimers[GetBattlerSide(gBattlerAttacker)].followmeTarget = gBattlerAttacker; gSideTimers[GetBattlerSide(gBattlerTarget)].followmeTarget = gBattlerTarget;
gSideTimers[GetBattlerSide(gBattlerAttacker)].followmePowder = TestMoveFlags(gCurrentMove, FLAG_POWDER); gSideTimers[GetBattlerSide(gBattlerTarget)].followmePowder = TestMoveFlags(gCurrentMove, FLAG_POWDER);
gBattlescriptCurrInstr++; gBattlescriptCurrInstr++;
} }
@ -12543,13 +12539,16 @@ static void Cmd_jumpifnodamage(void)
static void Cmd_settaunt(void) static void Cmd_settaunt(void)
{ {
#if B_OBLIVIOUS_TAUNT >= GEN_6
if (GetBattlerAbility(gBattlerTarget) == ABILITY_OBLIVIOUS) if (GetBattlerAbility(gBattlerTarget) == ABILITY_OBLIVIOUS)
{ {
gBattlescriptCurrInstr = BattleScript_NotAffectedAbilityPopUp; gBattlescriptCurrInstr = BattleScript_NotAffectedAbilityPopUp;
gLastUsedAbility = ABILITY_OBLIVIOUS; gLastUsedAbility = ABILITY_OBLIVIOUS;
RecordAbilityBattle(gBattlerTarget, ABILITY_OBLIVIOUS); RecordAbilityBattle(gBattlerTarget, ABILITY_OBLIVIOUS);
} }
else if (gDisableStructs[gBattlerTarget].tauntTimer == 0) else
#endif
if (gDisableStructs[gBattlerTarget].tauntTimer == 0)
{ {
#if B_TAUNT_TURNS >= GEN_5 #if B_TAUNT_TURNS >= GEN_5
u8 turns = 4; u8 turns = 4;

View File

@ -1575,12 +1575,22 @@ void PrepareStringBattle(u16 stringId, u8 battler)
gBattleScripting.stickyWebStatDrop = 0; gBattleScripting.stickyWebStatDrop = 0;
gBattlerAbility = gBattlerTarget; gBattlerAbility = gBattlerTarget;
BattleScriptPushCursor(); BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_DefiantActivates; gBattlescriptCurrInstr = BattleScript_AbilityRaisesDefenderStat;
if (targetAbility == ABILITY_DEFIANT) if (targetAbility == ABILITY_DEFIANT)
SET_STATCHANGER(STAT_ATK, 2, FALSE); SET_STATCHANGER(STAT_ATK, 2, FALSE);
else else
SET_STATCHANGER(STAT_SPATK, 2, FALSE); SET_STATCHANGER(STAT_SPATK, 2, FALSE);
} }
#if B_UPDATED_INTIMIDATE >= GEN_8
else if (stringId == STRINGID_PKMNCUTSATTACKWITH && targetAbility == ABILITY_RATTLED
&& CompareStat(gBattlerTarget, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN))
{
gBattlerAbility = gBattlerTarget;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_AbilityRaisesDefenderStat;
SET_STATCHANGER(STAT_SPEED, 1, FALSE);
}
#endif
gActiveBattler = battler; gActiveBattler = battler;
BtlController_EmitPrintString(BUFFER_A, stringId); BtlController_EmitPrintString(BUFFER_A, stringId);
@ -1680,7 +1690,11 @@ bool32 IsHealBlockPreventingMove(u32 battler, u32 move)
switch (gBattleMoves[move].effect) switch (gBattleMoves[move].effect)
{ {
#if B_HEAL_BLOCKING >= GEN_6
case EFFECT_ABSORB: case EFFECT_ABSORB:
case EFFECT_STRENGTH_SAP:
case EFFECT_DREAM_EATER:
#endif
case EFFECT_MORNING_SUN: case EFFECT_MORNING_SUN:
case EFFECT_MOONLIGHT: case EFFECT_MOONLIGHT:
case EFFECT_RESTORE_HP: case EFFECT_RESTORE_HP:
@ -1688,7 +1702,7 @@ bool32 IsHealBlockPreventingMove(u32 battler, u32 move)
case EFFECT_ROOST: case EFFECT_ROOST:
case EFFECT_HEALING_WISH: case EFFECT_HEALING_WISH:
case EFFECT_WISH: case EFFECT_WISH:
case EFFECT_DREAM_EATER: case EFFECT_HEAL_PULSE:
return TRUE; return TRUE;
default: default:
return FALSE; return FALSE;
@ -4907,7 +4921,11 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
if (effect == 1) // Drain Hp ability. if (effect == 1) // Drain Hp ability.
{ {
#if B_HEAL_BLOCKING >= GEN_5
if (BATTLER_MAX_HP(battler) || gStatuses3[battler] & STATUS3_HEAL_BLOCK) if (BATTLER_MAX_HP(battler) || gStatuses3[battler] & STATUS3_HEAL_BLOCK)
#else
if (BATTLER_MAX_HP(battler))
#endif
{ {
if ((gProtectStructs[gBattlerAttacker].notFirstStrike)) if ((gProtectStructs[gBattlerAttacker].notFirstStrike))
gBattlescriptCurrInstr = BattleScript_MonMadeMoveUseless; gBattlescriptCurrInstr = BattleScript_MonMadeMoveUseless;
@ -6082,7 +6100,11 @@ bool32 HasEnoughHpToEatBerry(u32 battlerId, u32 hpFraction, u32 itemId)
static u8 HealConfuseBerry(u32 battlerId, u32 itemId, u8 flavorId, bool32 end2) static u8 HealConfuseBerry(u32 battlerId, u32 itemId, u8 flavorId, bool32 end2)
{ {
#if B_HEAL_BLOCKING >= GEN_5
if (HasEnoughHpToEatBerry(battlerId, 2, itemId) && !(gStatuses3[battlerId] & STATUS3_HEAL_BLOCK))
#else
if (HasEnoughHpToEatBerry(battlerId, 2, itemId)) if (HasEnoughHpToEatBerry(battlerId, 2, itemId))
#endif
{ {
PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, flavorId); PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, flavorId);
@ -6268,7 +6290,11 @@ u8 TryHandleSeed(u8 battler, u32 terrainFlag, u8 statId, u16 itemId, bool32 exec
static u8 ItemHealHp(u32 battlerId, u32 itemId, bool32 end2, bool32 percentHeal) static u8 ItemHealHp(u32 battlerId, u32 itemId, bool32 end2, bool32 percentHeal)
{ {
#if B_HEAL_BLOCKING >= GEN_5
if (HasEnoughHpToEatBerry(battlerId, 2, itemId) && !(gStatuses3[battlerId] & STATUS3_HEAL_BLOCK)
#else
if (HasEnoughHpToEatBerry(battlerId, 2, itemId) if (HasEnoughHpToEatBerry(battlerId, 2, itemId)
#endif
&& !(gBattleScripting.overrideBerryRequirements && gBattleMons[battlerId].hp == gBattleMons[battlerId].maxHP)) && !(gBattleScripting.overrideBerryRequirements && gBattleMons[battlerId].hp == gBattleMons[battlerId].maxHP))
{ {
if (percentHeal) if (percentHeal)
@ -6707,7 +6733,11 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
break; break;
case HOLD_EFFECT_LEFTOVERS: case HOLD_EFFECT_LEFTOVERS:
LEFTOVERS: LEFTOVERS:
#if B_HEAL_BLOCKING >= GEN_5
if (gBattleMons[battlerId].hp < gBattleMons[battlerId].maxHP && !moveTurn && !(gStatuses3[battlerId] & STATUS3_HEAL_BLOCK))
#else
if (gBattleMons[battlerId].hp < gBattleMons[battlerId].maxHP && !moveTurn) if (gBattleMons[battlerId].hp < gBattleMons[battlerId].maxHP && !moveTurn)
#endif
{ {
gBattleMoveDamage = gBattleMons[battlerId].maxHP / 16; gBattleMoveDamage = gBattleMons[battlerId].maxHP / 16;
if (gBattleMoveDamage == 0) if (gBattleMoveDamage == 0)
@ -7137,7 +7167,11 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
if (gSpecialStatuses[gBattlerAttacker].damagedMons // Need to have done damage if (gSpecialStatuses[gBattlerAttacker].damagedMons // Need to have done damage
&& gBattlerAttacker != gBattlerTarget && gBattlerAttacker != gBattlerTarget
&& gBattleMons[gBattlerAttacker].hp != gBattleMons[gBattlerAttacker].maxHP && gBattleMons[gBattlerAttacker].hp != gBattleMons[gBattlerAttacker].maxHP
#if B_HEAL_BLOCKING >= GEN_5
&& gBattleMons[gBattlerAttacker].hp != 0 && !(gStatuses3[battlerId] & STATUS3_HEAL_BLOCK))
#else
&& gBattleMons[gBattlerAttacker].hp != 0) && gBattleMons[gBattlerAttacker].hp != 0)
#endif
{ {
gLastUsedItem = atkItem; gLastUsedItem = atkItem;
gPotentialItemEffectBattler = gBattlerAttacker; gPotentialItemEffectBattler = gBattlerAttacker;
@ -7734,8 +7768,10 @@ bool32 IsBattlerGrounded(u8 battlerId)
return TRUE; return TRUE;
else if (gFieldStatuses & STATUS_FIELD_GRAVITY) else if (gFieldStatuses & STATUS_FIELD_GRAVITY)
return TRUE; return TRUE;
#if B_ROOTED_GROUNDING >= GEN_4
else if (gStatuses3[battlerId] & STATUS3_ROOTED) else if (gStatuses3[battlerId] & STATUS3_ROOTED)
return TRUE; return TRUE;
#endif
else if (gStatuses3[battlerId] & STATUS3_SMACKED_DOWN) else if (gStatuses3[battlerId] & STATUS3_SMACKED_DOWN)
return TRUE; return TRUE;
@ -8119,7 +8155,8 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef)
basePower *= 2; basePower *= 2;
break; break;
case EFFECT_BOLT_BEAK: case EFFECT_BOLT_BEAK:
if (GetBattlerTurnOrderNum(battlerAtk) < GetBattlerTurnOrderNum(battlerDef)) if (GetBattlerTurnOrderNum(battlerAtk) < GetBattlerTurnOrderNum(battlerDef)
|| gDisableStructs[battlerDef].isFirstTurn == 2)
basePower *= 2; basePower *= 2;
break; break;
case EFFECT_ROUND: case EFFECT_ROUND:
@ -8875,7 +8912,8 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move
// check burn // check burn
if (gBattleMons[battlerAtk].status1 & STATUS1_BURN && IS_MOVE_PHYSICAL(move) if (gBattleMons[battlerAtk].status1 & STATUS1_BURN && IS_MOVE_PHYSICAL(move)
&& gBattleMoves[move].effect != EFFECT_FACADE && abilityAtk != ABILITY_GUTS) && (gBattleMoves[move].effect != EFFECT_FACADE || B_BURN_FACADE_DMG < GEN_6)
&& abilityAtk != ABILITY_GUTS)
dmg = ApplyModifier(UQ_4_12(0.5), dmg); dmg = ApplyModifier(UQ_4_12(0.5), dmg);
// check sunny/rain weather // check sunny/rain weather
@ -9281,8 +9319,20 @@ u16 GetMegaEvolutionSpecies(u16 preEvoSpecies, u16 heldItemId)
for (i = 0; i < EVOS_PER_MON; i++) for (i = 0; i < EVOS_PER_MON; i++)
{ {
if ((gEvolutionTable[preEvoSpecies][i].method == EVO_MEGA_EVOLUTION if (gEvolutionTable[preEvoSpecies][i].method == EVO_MEGA_EVOLUTION
|| gEvolutionTable[preEvoSpecies][i].method == EVO_PRIMAL_REVERSION) && gEvolutionTable[preEvoSpecies][i].param == heldItemId)
return gEvolutionTable[preEvoSpecies][i].targetSpecies;
}
return SPECIES_NONE;
}
u16 GetPrimalReversionSpecies(u16 preEvoSpecies, u16 heldItemId)
{
u32 i;
for (i = 0; i < EVOS_PER_MON; i++)
{
if (gEvolutionTable[preEvoSpecies][i].method == EVO_PRIMAL_REVERSION
&& gEvolutionTable[preEvoSpecies][i].param == heldItemId) && gEvolutionTable[preEvoSpecies][i].param == heldItemId)
return gEvolutionTable[preEvoSpecies][i].targetSpecies; return gEvolutionTable[preEvoSpecies][i].targetSpecies;
} }
@ -9323,12 +9373,10 @@ bool32 CanMegaEvolve(u8 battlerId)
// Check if trainer already mega evolved a pokemon. // Check if trainer already mega evolved a pokemon.
if (mega->alreadyEvolved[battlerPosition]) if (mega->alreadyEvolved[battlerPosition])
return FALSE; return FALSE;
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE
{ && IsPartnerMonFromSameTrainer(battlerId)
if (IsPartnerMonFromSameTrainer(battlerId) && (mega->alreadyEvolved[partnerPosition] || (mega->toEvolve & gBitTable[BATTLE_PARTNER(battlerId)])))
&& (mega->alreadyEvolved[partnerPosition] || (mega->toEvolve & gBitTable[BATTLE_PARTNER(battlerId)]))) return FALSE;
return FALSE;
}
// Check if mon is currently held by Sky Drop // Check if mon is currently held by Sky Drop
if (gStatuses3[battlerId] & STATUS3_SKY_DROPPED) if (gStatuses3[battlerId] & STATUS3_SKY_DROPPED)
@ -9364,14 +9412,6 @@ bool32 CanMegaEvolve(u8 battlerId)
gBattleStruct->mega.isWishMegaEvo = FALSE; gBattleStruct->mega.isWishMegaEvo = FALSE;
return TRUE; return TRUE;
} }
// Can undergo Primal Reversion.
if (holdEffect == HOLD_EFFECT_PRIMAL_ORB)
{
gBattleStruct->mega.isWishMegaEvo = FALSE;
gBattleStruct->mega.isPrimalReversion = TRUE;
return TRUE;
}
} }
// Check if there is an entry in the evolution table for Wish Mega Evolution. // Check if there is an entry in the evolution table for Wish Mega Evolution.
@ -9476,9 +9516,8 @@ bool32 CanBattlerGetOrLoseItem(u8 battlerId, u16 itemId)
// Mail can be stolen now // Mail can be stolen now
if (itemId == ITEM_ENIGMA_BERRY) if (itemId == ITEM_ENIGMA_BERRY)
return FALSE; return FALSE;
else if (GET_BASE_SPECIES_ID(species) == SPECIES_KYOGRE && itemId == ITEM_BLUE_ORB) // includes primal // Primal Reversion inducing items cannot be lost if pokemon's base species can undergo primal reversion with it.
return FALSE; else if (holdEffect == HOLD_EFFECT_PRIMAL_ORB && (GetPrimalReversionSpecies(GET_BASE_SPECIES_ID(species), itemId) != SPECIES_NONE))
else if (GET_BASE_SPECIES_ID(species) == SPECIES_GROUDON && itemId == ITEM_RED_ORB) // includes primal
return FALSE; return FALSE;
// Mega stone cannot be lost if pokemon's base species can mega evolve with it. // Mega stone cannot be lost if pokemon's base species can mega evolve with it.
else if (holdEffect == HOLD_EFFECT_MEGA_STONE && (GetMegaEvolutionSpecies(GET_BASE_SPECIES_ID(species), itemId) != SPECIES_NONE)) else if (holdEffect == HOLD_EFFECT_MEGA_STONE && (GetMegaEvolutionSpecies(GET_BASE_SPECIES_ID(species), itemId) != SPECIES_NONE))

View File

@ -11221,7 +11221,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] =
[MOVE_STEEL_BEAM] = [MOVE_STEEL_BEAM] =
{ {
.effect = EFFECT_RECOIL_50, .effect = EFFECT_STEEL_BEAM,
.power = 140, .power = 140,
.type = TYPE_STEEL, .type = TYPE_STEEL,
.accuracy = 95, .accuracy = 95,

View File

@ -79,7 +79,11 @@ static const u8 sFlyDescription[] = _(
static const u8 sBindDescription[] = _( static const u8 sBindDescription[] = _(
"Binds and squeezes the foe\n" "Binds and squeezes the foe\n"
#if B_BINDING_TURNS >= GEN_5
"for 4 or 5 turns.");
#else
"for 2 to 5 turns."); "for 2 to 5 turns.");
#endif
static const u8 sSlamDescription[] = _( static const u8 sSlamDescription[] = _(
"Slams the foe with a long\n" "Slams the foe with a long\n"
@ -139,7 +143,11 @@ static const u8 sBodySlamDescription[] = _(
static const u8 sWrapDescription[] = _( static const u8 sWrapDescription[] = _(
"Wraps and squeezes the foe\n" "Wraps and squeezes the foe\n"
#if B_BINDING_TURNS >= GEN_5
"4 or 5 times with vines, etc.");
#else
"2 to 5 times with vines, etc."); "2 to 5 times with vines, etc.");
#endif
static const u8 sTakeDownDescription[] = _( static const u8 sTakeDownDescription[] = _(
"A reckless charge attack\n" "A reckless charge attack\n"
@ -331,7 +339,11 @@ static const u8 sDragonRageDescription[] = _(
static const u8 sFireSpinDescription[] = _( static const u8 sFireSpinDescription[] = _(
"Traps the foe in a ring of\n" "Traps the foe in a ring of\n"
#if B_BINDING_TURNS >= GEN_5
"fire for 4 or 5 turns.");
#else
"fire for 2 to 5 turns."); "fire for 2 to 5 turns.");
#endif
static const u8 sThunderShockDescription[] = _( static const u8 sThunderShockDescription[] = _(
"An electrical attack that\n" "An electrical attack that\n"
@ -511,7 +523,11 @@ static const u8 sWaterfallDescription[] = _(
static const u8 sClampDescription[] = _( static const u8 sClampDescription[] = _(
"Traps and squeezes the\n" "Traps and squeezes the\n"
#if B_BINDING_TURNS >= GEN_5
"foe for 4 or 5 turns.");
#else
"foe for 2 to 5 turns."); "foe for 2 to 5 turns.");
#endif
static const u8 sSwiftDescription[] = _( static const u8 sSwiftDescription[] = _(
"Sprays star-shaped rays\n" "Sprays star-shaped rays\n"
@ -999,7 +1015,11 @@ static const u8 sRockSmashDescription[] = _(
static const u8 sWhirlpoolDescription[] = _( static const u8 sWhirlpoolDescription[] = _(
"Traps and hurts the foe in\n" "Traps and hurts the foe in\n"
#if B_BINDING_TURNS >= GEN_5
"a whirlpool for 4 or 5 turns.");
#else
"a whirlpool for 2 to 5 turns."); "a whirlpool for 2 to 5 turns.");
#endif
static const u8 sBeatUpDescription[] = _( static const u8 sBeatUpDescription[] = _(
"Summons party Pokémon to\n" "Summons party Pokémon to\n"
@ -1311,7 +1331,11 @@ static const u8 sSkyUppercutDescription[] = _(
static const u8 sSandTombDescription[] = _( static const u8 sSandTombDescription[] = _(
"Traps and hurts the foe in\n" "Traps and hurts the foe in\n"
#if B_BINDING_TURNS >= GEN_5
"quicksand for 4 or 5 turns.");
#else
"quicksand for 2 to 5 turns."); "quicksand for 2 to 5 turns.");
#endif
static const u8 sSheerColdDescription[] = _( static const u8 sSheerColdDescription[] = _(
"A chilling attack that\n" "A chilling attack that\n"
@ -1815,7 +1839,11 @@ static const u8 sSpacialRendDescription[] = _(
static const u8 sMagmaStormDescription[] = _( static const u8 sMagmaStormDescription[] = _(
"Traps the foe in a vortex\n" "Traps the foe in a vortex\n"
#if B_BINDING_TURNS >= GEN_5
"of fire for 4 or 5 turns.");
#else
"of fire for 2 to 5 turns."); "of fire for 2 to 5 turns.");
#endif
static const u8 sDarkVoidDescription[] = _( static const u8 sDarkVoidDescription[] = _(
"Drags the foe into total\n" "Drags the foe into total\n"
@ -2367,7 +2395,11 @@ static const u8 sNuzzleDescription[] = _(
static const u8 sInfestationDescription[] = _( static const u8 sInfestationDescription[] = _(
"The foe is infested and\n" "The foe is infested and\n"
#if B_BINDING_TURNS >= GEN_5
"attacked for 4 or 5 turns.");
#else
"attacked for 2 to 5 turns."); "attacked for 2 to 5 turns.");
#endif
static const u8 sPowerUpPunchDescription[] = _( static const u8 sPowerUpPunchDescription[] = _(
"A hard punch that raises\n" "A hard punch that raises\n"
@ -2912,7 +2944,11 @@ static const u8 sSurgingStrikesDescription[] = _(
static const u8 sThunderCageDescription[] = _( static const u8 sThunderCageDescription[] = _(
"Traps the foe in a cage of\n" "Traps the foe in a cage of\n"
#if B_BINDING_TURNS >= GEN_5
"electricity for 4 or 5 turns.");
#else
"electricity for 2 to 5 turns."); "electricity for 2 to 5 turns.");
#endif
static const u8 sDragonEnergyDescription[] = _( static const u8 sDragonEnergyDescription[] = _(
"The higher the user's HP\n" "The higher the user's HP\n"