Merge branch 'upcoming' of https://github.com/rh-hideout/pokeemerald-expansion into gen_9_move_effects_batch1

This commit is contained in:
LOuroboros 2023-01-02 16:00:13 -03:00
commit 0a00942a26
32 changed files with 1328 additions and 154 deletions

View File

@ -1022,7 +1022,7 @@
.4byte \ptr .4byte \ptr
.endm .endm
.macro trydobeatup endPtr:req, failPtr:req .macro trydobeatup endPtr=NULL, failPtr=NULL
.byte 0xc4 .byte 0xc4
.4byte \endPtr .4byte \endPtr
.4byte \failPtr .4byte \failPtr
@ -1941,6 +1941,31 @@
.macro shellsidearmcheck .macro shellsidearmcheck
various BS_ATTACKER, VARIOUS_SHELL_SIDE_ARM_CHECK various BS_ATTACKER, VARIOUS_SHELL_SIDE_ARM_CHECK
.endm .endm
.macro jumpifrodaffected battler:req, ptr:req
various \battler, VARIOUS_JUMP_IF_ROD
.4byte \ptr
.endm
.macro jumpifabsorbaffected battler:req, ptr:req
various \battler, VARIOUS_JUMP_IF_ABSORB
.4byte \ptr
.endm
.macro jumpifmotoraffected battler:req, ptr:req
various \battler, VARIOUS_JUMP_IF_MOTOR
.4byte \ptr
.endm
.macro jumpifteanoberry ptr:req
various BS_ATTACKER, VARIOUS_TEATIME_TARGETS
.4byte \ptr
.endm
.macro jumpifteainvulnerable battler:req, ptr:req
various \battler, VARIOUS_TEATIME_INVUL
.4byte \ptr
.endm
.macro jumpifcantfling battler:req, ptr:req .macro jumpifcantfling battler:req, ptr:req
various \battler, VARIOUS_JUMP_IF_CANT_FLING various \battler, VARIOUS_JUMP_IF_CANT_FLING
@ -2005,6 +2030,19 @@
.byte \stat .byte \stat
.endm .endm
.macro trywindriderpower battler:req, ptr:req
various \battler, VARIOUS_TRY_WIND_RIDER_POWER
.4byte \ptr
.endm
.macro activateweatherchangeabilities battler:req
various \battler, VARIOUS_ACTIVATE_WEATHER_CHANGE_ABILITIES
.endm
.macro activateterrainchangeabilities battler:req
various \battler, VARIOUS_ACTIVATE_TERRAIN_CHANGE_ABILITIES
.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
@ -2162,3 +2200,34 @@
.macro trysymbiosis .macro trysymbiosis
various BS_ATTACKER, VARIOUS_TRY_SYMBIOSIS various BS_ATTACKER, VARIOUS_TRY_SYMBIOSIS
.endm .endm
@ Tries to increase or decrease a battler's stat's stat stage by a specified amount. If impossible, jumps to \script.
.macro modifybattlerstatstage battler:req, stat:req, mode:req, amount:req, script:req, animation:req, customString
@ \mode parameters
INCREASE = FALSE
DECREASE = TRUE
@ \animation parameters
ANIM_OFF = FALSE
ANIM_ON = TRUE
setstatchanger \stat, \amount, \mode
statbuffchange STAT_CHANGE_ALLOW_PTR, \script
setgraphicalstatchangevalues
.if \animation == TRUE
playanimation \battler, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1
.endif
.ifnb \customString
printstring \customString
.else
.if \mode == DECREASE
printfromtable gStatDownStringIds
.else
.if \mode == INCREASE
printfromtable gStatUpStringIds
.endif
.endif
.endif
waitmessage B_WAIT_TIME_LONG
.endm

View File

@ -13478,7 +13478,18 @@ Move_DRAGON_DARTS::
end end
Move_TEATIME:: Move_TEATIME::
goto Move_MILK_DRINK loadspritegfx ANIM_TAG_TEAPOT
loadspritegfx ANIM_TAG_THOUGHT_BUBBLE
createsprite gThoughtBubbleSpriteTemplate, ANIM_ATTACKER, 11, 0, 100
playsewithpan SE_M_ICY_WIND, SOUND_PAN_ATTACKER
delay 6
createsprite gTeapotSpriteTemplate, ANIM_ATTACKER, 12, 0
createvisualtask AnimTask_RockMonBackAndForth, 5, ANIM_ATTACKER, 2, 0
createvisualtask AnimTask_RockMonBackAndForth, 5, ANIM_ATK_PARTNER, 2, 0
delay 24
loopsewithpan SE_M_HEAL_BELL, SOUND_PAN_ATTACKER, 22, 3
waitforvisualfinish
end
Move_OCTOLOCK:: Move_OCTOLOCK::
loadspritegfx ANIM_TAG_TENDRILS loadspritegfx ANIM_TAG_TENDRILS

View File

@ -410,12 +410,13 @@ gBattleScriptsForMoveEffects::
.4byte BattleScript_EffectCourtChange @ EFFECT_COURT_CHANGE .4byte BattleScript_EffectCourtChange @ EFFECT_COURT_CHANGE
.4byte BattleScript_EffectSteelBeam @ EFFECT_STEEL_BEAM .4byte BattleScript_EffectSteelBeam @ EFFECT_STEEL_BEAM
.4byte BattleScript_EffectExtremeEvoboost @ EFFECT_EXTREME_EVOBOOST .4byte BattleScript_EffectExtremeEvoboost @ EFFECT_EXTREME_EVOBOOST
.4byte BattleScript_EffectTerrainHit @ EFFECT_DAMAGE_SET_TERRAIN .4byte BattleScript_EffectHitSetRemoveTerrain @ EFFECT_HIT_SET_REMOVE_TERRAIN
.4byte BattleScript_EffectDarkVoid @ EFFECT_DARK_VOID .4byte BattleScript_EffectDarkVoid @ EFFECT_DARK_VOID
.4byte BattleScript_EffectSleepHit @ EFFECT_SLEEP_HIT .4byte BattleScript_EffectSleepHit @ EFFECT_SLEEP_HIT
.4byte BattleScript_EffectDoubleShock @ EFFECT_DOUBLE_SHOCK .4byte BattleScript_EffectDoubleShock @ EFFECT_DOUBLE_SHOCK
.4byte BattleScript_EffectSpecialAttackUpHit @ EFFECT_SPECIAL_ATTACK_UP_HIT .4byte BattleScript_EffectSpecialAttackUpHit @ EFFECT_SPECIAL_ATTACK_UP_HIT
.4byte BattleScript_EffectVictoryDance @ EFFECT_VICTORY_DANCE .4byte BattleScript_EffectVictoryDance @ EFFECT_VICTORY_DANCE
.4byte BattleScript_EffectTeatime @ EFFECT_TEATIME
.4byte BattleScript_EffectCeaselessEdge @ EFFECT_CEASELESS_EDGE .4byte BattleScript_EffectCeaselessEdge @ EFFECT_CEASELESS_EDGE
.4byte BattleScript_EffectDireClaw @ EFFECT_DIRE_CLAW .4byte BattleScript_EffectDireClaw @ EFFECT_DIRE_CLAW
.4byte BattleScript_EffectStoneAxe @ EFFECT_STONE_AXE .4byte BattleScript_EffectStoneAxe @ EFFECT_STONE_AXE
@ -439,6 +440,73 @@ BattleScript_EffectCeaselessEdge::
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
BattleScript_EffectTeatime::
attackcanceler
attackstring
ppreduce
jumpifteanoberry BattleScript_ButItFailed
@ at least one battler is affected
attackanimation
waitanimation
BattleScript_TeatimeLoop:
jumpifteainvulnerable BS_TARGET, BattleScript_Teatimevul
jumpifrodaffected BS_TARGET, BattleScript_Teatimerod
jumpifabsorbaffected BS_TARGET, BattleScript_Teatimesorb
jumpifmotoraffected BS_TARGET, BattleScript_Teatimemotor
orword gHitMarker, HITMARKER_NO_ANIMATIONS | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_DISGUISE
setbyte sBERRY_OVERRIDE, TRUE @ override the requirements for eating berries
consumeberry BS_TARGET, TRUE @ consume the berry, then restore the item from changedItems
bicword gHitMarker, HITMARKER_NO_ANIMATIONS | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_DISGUISE
setbyte sBERRY_OVERRIDE, FALSE
removeitem BS_TARGET
moveendto MOVEEND_NEXT_TARGET
jumpifnexttargetvalid BattleScript_TeatimeLoop
moveendcase MOVEEND_CLEAR_BITS
goto BattleScript_MoveEnd
BattleScript_Teatimevul:
moveendto MOVEEND_NEXT_TARGET
jumpifnexttargetvalid BattleScript_TeatimeLoop
moveendcase MOVEEND_CLEAR_BITS
goto BattleScript_MoveEnd
BattleScript_Teatimesorb:
copybyte gBattlerAbility, gBattlerTarget
call BattleScript_AbilityPopUp
moveendto MOVEEND_NEXT_TARGET
jumpifnexttargetvalid BattleScript_TeatimeLoop
moveendcase MOVEEND_CLEAR_BITS
goto BattleScript_MoveEnd
BattleScript_Teatimerod:
copybyte gBattlerAbility, gBattlerTarget
call BattleScript_AbilityPopUp
playstatchangeanimation BS_TARGET, BIT_SPATK, STAT_CHANGE_BY_TWO
setstatchanger STAT_SPATK, 1, FALSE
statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_TeatimeBuffer
jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_TeatimeBuffer
printfromtable gStatUpStringIds
waitmessage 0x40
moveendto MOVEEND_NEXT_TARGET
jumpifnexttargetvalid BattleScript_TeatimeLoop
moveendcase MOVEEND_CLEAR_BITS
goto BattleScript_MoveEnd
BattleScript_Teatimemotor:
copybyte gBattlerAbility, gBattlerTarget
call BattleScript_AbilityPopUp
playstatchangeanimation BS_TARGET, BIT_SPEED, STAT_CHANGE_BY_TWO
setstatchanger STAT_SPEED, 1, FALSE
statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_TeatimeBuffer
jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_TeatimeBuffer
printfromtable gStatUpStringIds
waitmessage 0x40
moveendto MOVEEND_NEXT_TARGET
jumpifnexttargetvalid BattleScript_TeatimeLoop
moveendcase MOVEEND_CLEAR_BITS
goto BattleScript_MoveEnd
BattleScript_TeatimeBuffer:
moveendto MOVEEND_NEXT_TARGET
jumpifnexttargetvalid BattleScript_TeatimeLoop
moveendcase MOVEEND_CLEAR_BITS
goto BattleScript_MoveEnd
BattleScript_AffectionBasedEndurance:: BattleScript_AffectionBasedEndurance::
playanimation BS_TARGET, B_ANIM_AFFECTION_HANGED_ON playanimation BS_TARGET, B_ANIM_AFFECTION_HANGED_ON
printstring STRINGID_TARGETTOUGHEDITOUT printstring STRINGID_TARGETTOUGHEDITOUT
@ -2478,6 +2546,7 @@ BattleScript_EffectPsychicTerrain:
printfromtable gTerrainStringIds printfromtable gTerrainStringIds
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
playanimation BS_ATTACKER, B_ANIM_RESTORE_BG playanimation BS_ATTACKER, B_ANIM_RESTORE_BG
call BattleScript_ActivateTerrainAbilities
call BattleScript_TerrainSeedLoop call BattleScript_TerrainSeedLoop
jumpifabilitypresent ABILITY_MIMICRY, BattleScript_ApplyMimicry jumpifabilitypresent ABILITY_MIMICRY, BattleScript_ApplyMimicry
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
@ -2898,8 +2967,38 @@ BattleScript_EffectTailwind:
waitanimation waitanimation
printstring STRINGID_TAILWINDBLEW printstring STRINGID_TAILWINDBLEW
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
call BattleScript_TryTailwindAbilitiesLoop
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
BattleScript_TryTailwindAbilitiesLoop:
savetarget
setbyte gBattlerTarget, 0
BattleScript_TryTailwindAbilitiesLoop_Iter:
trywindriderpower BS_TARGET, BattleScript_TryTailwindAbilitiesLoop_Increment
jumpifability BS_TARGET, ABILITY_WIND_RIDER, BattleScript_TryTailwindAbilitiesLoop_WindRider
jumpifability BS_TARGET, ABILITY_WIND_POWER, BattleScript_TryTailwindAbilitiesLoop_WindPower
BattleScript_TryTailwindAbilitiesLoop_Increment:
addbyte gBattlerTarget, 0x1
jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_TryTailwindAbilitiesLoop_Iter
BattleScript_TryTailwindAbilitiesLoop_Ret:
restoretarget
return
BattleScript_TryTailwindAbilitiesLoop_WindRider:
call BattleScript_AbilityPopUp
modifybattlerstatstage BS_TARGET, STAT_ATK, INCREASE, 1, BattleScript_TryTailwindAbilitiesLoop_Increment, ANIM_ON
goto BattleScript_TryTailwindAbilitiesLoop_Increment
BattleScript_TryTailwindAbilitiesLoop_WindPower:
call BattleScript_AbilityPopUp
copybyte sSAVED_BATTLER, gBattlerAttacker
copybyte gBattlerAttacker, gBattlerTarget
setcharge
printstring STRINGID_BEINGHITCHARGEDPKMNWITHPOWER
waitmessage B_WAIT_TIME_LONG
copybyte gBattlerAttacker, sSAVED_BATTLER
goto BattleScript_TryTailwindAbilitiesLoop_Increment
BattleScript_EffectMircleEye: BattleScript_EffectMircleEye:
attackcanceler attackcanceler
accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE
@ -2987,6 +3086,7 @@ BattleScript_EffectHitEscape:
resultmessage resultmessage
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
jumpifmovehadnoeffect BattleScript_MoveEnd jumpifmovehadnoeffect BattleScript_MoveEnd
jumpifability BS_TARGET, ABILITY_GUARD_DOG, BattleScript_MoveEnd
seteffectwithchance seteffectwithchance
tryfaintmon BS_TARGET tryfaintmon BS_TARGET
moveendto MOVEEND_ATTACKER_VISIBLE moveendto MOVEEND_ATTACKER_VISIBLE
@ -3131,6 +3231,7 @@ BattleScript_EffectSleep::
jumpifstatus BS_TARGET, STATUS1_SLEEP, BattleScript_AlreadyAsleep jumpifstatus BS_TARGET, STATUS1_SLEEP, BattleScript_AlreadyAsleep
jumpifcantmakeasleep BattleScript_CantMakeAsleep jumpifcantmakeasleep BattleScript_CantMakeAsleep
jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_LeafGuardProtects jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_LeafGuardProtects
jumpifability BS_TARGET, ABILITY_PURIFYING_SALT, BattleScript_LeafGuardProtects
jumpifflowerveil BattleScript_FlowerVeilProtects jumpifflowerveil BattleScript_FlowerVeilProtects
jumpifability BS_TARGET_SIDE, ABILITY_SWEET_VEIL, BattleScript_SweetVeilProtects jumpifability BS_TARGET_SIDE, ABILITY_SWEET_VEIL, BattleScript_SweetVeilProtects
jumpifleafguardprotected BS_TARGET, BattleScript_LeafGuardProtects jumpifleafguardprotected BS_TARGET, BattleScript_LeafGuardProtects
@ -3601,6 +3702,7 @@ BattleScript_EffectRoar::
attackstring attackstring
ppreduce ppreduce
jumpifroarfails BattleScript_ButItFailed jumpifroarfails BattleScript_ButItFailed
jumpifability BS_TARGET, ABILITY_GUARD_DOG, BattleScript_ButItFailed
jumpifability BS_TARGET, ABILITY_SUCTION_CUPS, BattleScript_AbilityPreventsPhasingOut jumpifability BS_TARGET, ABILITY_SUCTION_CUPS, BattleScript_AbilityPreventsPhasingOut
jumpifstatus3 BS_TARGET, STATUS3_ROOTED, BattleScript_PrintMonIsRooted jumpifstatus3 BS_TARGET, STATUS3_ROOTED, BattleScript_PrintMonIsRooted
accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON
@ -3725,6 +3827,7 @@ BattleScript_EffectToxic::
ppreduce ppreduce
jumpifability BS_TARGET, ABILITY_IMMUNITY, BattleScript_ImmunityProtected jumpifability BS_TARGET, ABILITY_IMMUNITY, BattleScript_ImmunityProtected
jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_LeafGuardProtects jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_LeafGuardProtects
jumpifability BS_TARGET, ABILITY_PURIFYING_SALT, BattleScript_LeafGuardProtects
jumpifability BS_TARGET_SIDE, ABILITY_PASTEL_VEIL, BattleScript_PastelVeilProtects jumpifability BS_TARGET_SIDE, ABILITY_PASTEL_VEIL, BattleScript_PastelVeilProtects
jumpifflowerveil BattleScript_FlowerVeilProtects jumpifflowerveil BattleScript_FlowerVeilProtects
jumpifleafguardprotected BS_TARGET, BattleScript_LeafGuardProtects jumpifleafguardprotected BS_TARGET, BattleScript_LeafGuardProtects
@ -4063,6 +4166,7 @@ BattleScript_EffectPoison::
ppreduce ppreduce
jumpifability BS_TARGET, ABILITY_IMMUNITY, BattleScript_ImmunityProtected jumpifability BS_TARGET, ABILITY_IMMUNITY, BattleScript_ImmunityProtected
jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_LeafGuardProtects jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_LeafGuardProtects
jumpifability BS_TARGET, ABILITY_PURIFYING_SALT, BattleScript_LeafGuardProtects
jumpifability BS_TARGET_SIDE, ABILITY_PASTEL_VEIL, BattleScript_PastelVeilProtects jumpifability BS_TARGET_SIDE, ABILITY_PASTEL_VEIL, BattleScript_PastelVeilProtects
jumpifflowerveil BattleScript_FlowerVeilProtects jumpifflowerveil BattleScript_FlowerVeilProtects
jumpifleafguardprotected BS_TARGET, BattleScript_LeafGuardProtects jumpifleafguardprotected BS_TARGET, BattleScript_LeafGuardProtects
@ -4089,6 +4193,7 @@ BattleScript_EffectParalyze:
ppreduce ppreduce
jumpifability BS_TARGET, ABILITY_LIMBER, BattleScript_LimberProtected jumpifability BS_TARGET, ABILITY_LIMBER, BattleScript_LimberProtected
jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_LeafGuardProtects jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_LeafGuardProtects
jumpifability BS_TARGET, ABILITY_PURIFYING_SALT, BattleScript_LeafGuardProtects
jumpifflowerveil BattleScript_FlowerVeilProtects jumpifflowerveil BattleScript_FlowerVeilProtects
jumpifleafguardprotected BS_TARGET, BattleScript_LeafGuardProtects jumpifleafguardprotected BS_TARGET, BattleScript_LeafGuardProtects
jumpifshieldsdown BS_TARGET, BattleScript_LeafGuardProtects jumpifshieldsdown BS_TARGET, BattleScript_LeafGuardProtects
@ -5229,10 +5334,18 @@ BattleScript_EffectTeleportNew:
BattleScript_EffectTeleportNewEnd: BattleScript_EffectTeleportNewEnd:
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
.if B_BEAT_UP < GEN_5
BattleScript_EffectBeatUp:: BattleScript_EffectBeatUp::
attackcanceler attackcanceler
accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE
.if B_BEAT_UP >= GEN_5
attackstring
ppreduce
critcalc
damagecalc
adjustdamage
trydobeatup
goto BattleScript_HitFromAtkAnimation
.else
attackstring attackstring
pause B_WAIT_TIME_SHORT pause B_WAIT_TIME_SHORT
ppreduce ppreduce
@ -5262,12 +5375,6 @@ BattleScript_BeatUpAttack::
goto BattleScript_BeatUpLoop goto BattleScript_BeatUpLoop
BattleScript_BeatUpEnd:: BattleScript_BeatUpEnd::
end end
.else
BattleScript_EffectBeatUp::
attackcanceler
accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE
addbyte gBattleCommunication, 1
goto BattleScript_HitFromAtkString
.endif .endif
BattleScript_EffectSemiInvulnerable:: BattleScript_EffectSemiInvulnerable::
@ -5516,6 +5623,7 @@ BattleScript_EffectWillOWisp::
jumpifability BS_TARGET, ABILITY_WATER_VEIL, BattleScript_WaterVeilPrevents jumpifability BS_TARGET, ABILITY_WATER_VEIL, BattleScript_WaterVeilPrevents
jumpifability BS_TARGET, ABILITY_WATER_BUBBLE, BattleScript_WaterVeilPrevents jumpifability BS_TARGET, ABILITY_WATER_BUBBLE, BattleScript_WaterVeilPrevents
jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_LeafGuardProtects jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_LeafGuardProtects
jumpifability BS_TARGET, ABILITY_PURIFYING_SALT, BattleScript_LeafGuardProtects
jumpifflowerveil BattleScript_FlowerVeilProtects jumpifflowerveil BattleScript_FlowerVeilProtects
jumpifleafguardprotected BS_TARGET, BattleScript_LeafGuardProtects jumpifleafguardprotected BS_TARGET, BattleScript_LeafGuardProtects
jumpifshieldsdown BS_TARGET, BattleScript_LeafGuardProtects jumpifshieldsdown BS_TARGET, BattleScript_LeafGuardProtects
@ -5808,6 +5916,7 @@ BattleScript_EffectYawn::
jumpifability BS_TARGET, ABILITY_VITAL_SPIRIT, BattleScript_PrintBankAbilityMadeIneffective jumpifability BS_TARGET, ABILITY_VITAL_SPIRIT, BattleScript_PrintBankAbilityMadeIneffective
jumpifability BS_TARGET, ABILITY_INSOMNIA, BattleScript_PrintBankAbilityMadeIneffective jumpifability BS_TARGET, ABILITY_INSOMNIA, BattleScript_PrintBankAbilityMadeIneffective
jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_PrintBankAbilityMadeIneffective jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_PrintBankAbilityMadeIneffective
jumpifability BS_TARGET, ABILITY_PURIFYING_SALT, BattleScript_LeafGuardProtects
jumpifflowerveil BattleScript_FlowerVeilProtects jumpifflowerveil BattleScript_FlowerVeilProtects
jumpifleafguardprotected BS_TARGET, BattleScript_LeafGuardProtects jumpifleafguardprotected BS_TARGET, BattleScript_LeafGuardProtects
jumpifshieldsdown BS_TARGET, BattleScript_LeafGuardProtects jumpifshieldsdown BS_TARGET, BattleScript_LeafGuardProtects
@ -6690,6 +6799,27 @@ BattleScript_TailwindEnds::
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
end2 end2
BattleScript_WindPowerActivatesEnd2::
setbyte gBattlerAttacker, 0
BattleScript_WindPowerLoop:
printstring STRINGID_EMPTYSTRING3
jumpifability BS_ATTACKER, ABILITY_WIND_POWER, BattleScript_WindPowerLoop_Cont
goto BattleScript_WindPowerIncrement
BattleScript_WindPowerLoop_Cont:
jumpifstatus3 BS_ATTACKER, STATUS3_CHARGED_UP, BattleScript_WindPowerIncrement
goto BattleScript_WindPower_Activate
BattleScript_WindPower_Activate:
call BattleScript_AbilityPopUp
setcharge
printstring STRINGID_BEINGHITCHARGEDPKMNWITHPOWER
waitmessage B_WAIT_TIME_LONG
BattleScript_WindPowerIncrement:
addbyte gBattlerAttacker, 1
jumpifbytenotequal gBattlerAttacker, gBattlersCount, BattleScript_WindPowerLoop
BattleScript_WindPowerEnd:
destroyabilitypopup
end2
BattleScript_TrickRoomEnds:: BattleScript_TrickRoomEnds::
printstring STRINGID_TRICKROOMENDS printstring STRINGID_TRICKROOMENDS
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
@ -7130,6 +7260,70 @@ BattleScript_GulpMissileGorgingTargetDefenseCantGoLower:
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
return return
BattleScript_SeedSowerActivates::
pause B_WAIT_TIME_SHORT
call BattleScript_AbilityPopUp
printstring STRINGID_TERRAINBECOMESGRASSY
waitmessage B_WAIT_TIME_LONG
playanimation BS_SCRIPTING, B_ANIM_RESTORE_BG
call BattleScript_ActivateTerrainAbilities
call BattleScript_TerrainSeedLoop
return
BattleScript_AngerShellActivates::
call BattleScript_AbilityPopUp
jumpifstat BS_TARGET, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_AngerShellTryDef
jumpifstat BS_TARGET, CMP_LESS_THAN, STAT_SPATK, MAX_STAT_STAGE, BattleScript_AngerShellTryDef
jumpifstat BS_TARGET, CMP_LESS_THAN, STAT_SPEED, MAX_STAT_STAGE, BattleScript_AngerShellTryDef
jumpifstat BS_TARGET, CMP_GREATER_THAN, STAT_DEF, MIN_STAT_STAGE, BattleScript_AngerShellTryDef
jumpifstat BS_TARGET, CMP_EQUAL, STAT_SPDEF, MIN_STAT_STAGE, BattleScript_ButItFailed
BattleScript_AngerShellTryDef::
setbyte sSTAT_ANIM_PLAYED, FALSE
modifybattlerstatstage BS_ATTACKER, STAT_DEF, DECREASE, 1, BattleScript_AngerShellTrySpDef, ANIM_ON
BattleScript_AngerShellTrySpDef:
modifybattlerstatstage BS_ATTACKER, STAT_SPDEF, DECREASE, 1, BattleScript_AngerShellTryAttack, ANIM_ON
BattleScript_AngerShellTryAttack:
setbyte sSTAT_ANIM_PLAYED, FALSE
modifybattlerstatstage BS_ATTACKER, STAT_ATK, INCREASE, 1, BattleScript_AngerShellTrySpAtk, ANIM_ON
BattleScript_AngerShellTrySpAtk:
modifybattlerstatstage BS_ATTACKER, STAT_SPATK, INCREASE, 1, BattleScript_AngerShellTrySpeed, ANIM_ON
BattleScript_AngerShellTrySpeed:
modifybattlerstatstage BS_ATTACKER, STAT_SPEED, INCREASE, 1, BattleScript_AngerShellRet, ANIM_ON
BattleScript_AngerShellRet:
return
BattleScript_WindPowerActivates::
.if B_CHECK_IF_CHARGED_UP == TRUE
jumpifstatus3 BS_ATTACKER, STATUS3_CHARGED_UP, BattleScript_WindPowerActivates_Ret
.endif
call BattleScript_AbilityPopUp
setcharge
printstring STRINGID_BEINGHITCHARGEDPKMNWITHPOWER
waitmessage B_WAIT_TIME_LONG
BattleScript_WindPowerActivates_Ret:
return
BattleScript_ToxicDebrisActivates::
call BattleScript_AbilityPopUp
pause B_WAIT_TIME_SHORT
settoxicspikes BattleScript_ToxicDebrisRet
printstring STRINGID_POISONSPIKESSCATTERED
waitmessage B_WAIT_TIME_LONG
BattleScript_ToxicDebrisRet:
return
BattleScript_EarthEaterActivates::
call BattleScript_AbilityPopUp
pause B_WAIT_TIME_LONG
tryhealquarterhealth BS_TARGET, BattleScript_EarthEaterRet
orword gHitMarker, HITMARKER_SKIP_DMG_TRACK | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE
healthbarupdate BS_TARGET
datahpupdate BS_TARGET
printstring STRINGID_PKMNREGAINEDHEALTH
waitmessage B_WAIT_TIME_LONG
BattleScript_EarthEaterRet:
return
BattleScript_PerishSongCountGoesDown:: BattleScript_PerishSongCountGoesDown::
printstring STRINGID_PKMNPERISHCOUNTFELL printstring STRINGID_PKMNPERISHCOUNTFELL
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
@ -7651,6 +7845,17 @@ BattleScript_BallFetch::
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
end3 end3
BattleScript_CudChewActivates::
pause B_WAIT_TIME_SHORTEST
call BattleScript_AbilityPopUp
setbyte sBERRY_OVERRIDE, 1 @ override the requirements for eating berries
consumeberry BS_TARGET, FALSE
orword gHitMarker, HITMARKER_SKIP_DMG_TRACK | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
setbyte sBERRY_OVERRIDE, 0
end3
BattleScript_TargetFormChange:: BattleScript_TargetFormChange::
pause 5 pause 5
copybyte gBattlerAbility, gBattlerTarget copybyte gBattlerAbility, gBattlerTarget
@ -8261,6 +8466,7 @@ BattleScript_WeatherFormChanges::
setbyte sBATTLER, 0 setbyte sBATTLER, 0
BattleScript_WeatherFormChangesLoop:: BattleScript_WeatherFormChangesLoop::
tryweatherformdatachange tryweatherformdatachange
activateweatherchangeabilities BS_SCRIPTING
addbyte sBATTLER, 1 addbyte sBATTLER, 1
jumpifbytenotequal sBATTLER, gBattlersCount, BattleScript_WeatherFormChangesLoop jumpifbytenotequal sBATTLER, gBattlersCount, BattleScript_WeatherFormChangesLoop
return return
@ -8323,13 +8529,15 @@ BattleScript_IntimidateLoop:
jumpifability BS_TARGET, ABILITY_OWN_TEMPO, BattleScript_IntimidatePrevented jumpifability BS_TARGET, ABILITY_OWN_TEMPO, BattleScript_IntimidatePrevented
jumpifability BS_TARGET, ABILITY_OBLIVIOUS, BattleScript_IntimidatePrevented jumpifability BS_TARGET, ABILITY_OBLIVIOUS, BattleScript_IntimidatePrevented
.endif .endif
jumpifability BS_TARGET, ABILITY_GUARD_DOG, BattleScript_IntimidateInReverse
BattleScript_IntimidateEffect: BattleScript_IntimidateEffect:
copybyte sBATTLER, gBattlerTarget copybyte sBATTLER, gBattlerAttacker
statbuffchange STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, NULL statbuffchange STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_IntimidateLoopIncrement
setgraphicalstatchangevalues setgraphicalstatchangevalues
playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1
printstring STRINGID_PKMNCUTSATTACKWITH printstring STRINGID_PKMNCUTSATTACKWITH
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
copybyte sBATTLER, gBattlerTarget
call BattleScript_TryAdrenalineOrb call BattleScript_TryAdrenalineOrb
BattleScript_IntimidateLoopIncrement: BattleScript_IntimidateLoopIncrement:
addbyte gBattlerTarget, 1 addbyte gBattlerTarget, 1
@ -8349,6 +8557,15 @@ BattleScript_IntimidatePrevented:
call BattleScript_TryAdrenalineOrb call BattleScript_TryAdrenalineOrb
goto BattleScript_IntimidateLoopIncrement goto BattleScript_IntimidateLoopIncrement
BattleScript_IntimidateInReverse:
copybyte sBATTLER, gBattlerTarget
copybyte gBattlerAbility, gBattlerTarget
call BattleScript_AbilityPopUp
pause B_WAIT_TIME_SHORT
modifybattlerstatstage BS_TARGET, STAT_ATK, INCREASE, 1, BattleScript_IntimidateLoopIncrement, ANIM_ON
call BattleScript_TryAdrenalineOrb
goto BattleScript_IntimidateLoopIncrement
BattleScript_DroughtActivates:: BattleScript_DroughtActivates::
pause B_WAIT_TIME_SHORT pause B_WAIT_TIME_SHORT
call BattleScript_AbilityPopUp call BattleScript_AbilityPopUp
@ -8406,6 +8623,42 @@ BattleScript_DeltaStreamActivates::
playanimation BS_ATTACKER, B_ANIM_STRONG_WINDS playanimation BS_ATTACKER, B_ANIM_STRONG_WINDS
end3 end3
BattleScript_ProtosynthesisActivates::
call BattleScript_AbilityPopUp
printstring STRINGID_SUNLIGHTACTIVATEDABILITY
waitmessage B_WAIT_TIME_MED
printstring STRINGID_STATWASHEIGHTENED
waitmessage B_WAIT_TIME_MED
end3
BattleScript_QuarkDriveActivates::
call BattleScript_AbilityPopUp
printstring STRINGID_ELECTRICTERRAINACTIVATEDABILITY
waitmessage B_WAIT_TIME_MED
printstring STRINGID_STATWASHEIGHTENED
waitmessage B_WAIT_TIME_MED
end3
BattleScript_RuinAbilityActivates::
call BattleScript_AbilityPopUp
printstring STRINGID_ABILITYWEAKENEDFSURROUNDINGMONSSTAT
waitmessage B_WAIT_TIME_LONG
end3
BattleScript_SupremeOverlordActivates::
pause B_WAIT_TIME_SHORT
call BattleScript_AbilityPopUp
printstring STRINGID_ATTACKERGAINEDSTRENGTHFROMTHEFALLEN
waitmessage B_WAIT_TIME_LONG
end3
BattleScript_CostarActivates::
pause B_WAIT_TIME_SHORT
call BattleScript_AbilityPopUp
printstring STRINGID_PKMNCOPIEDSTATCHANGES
waitmessage B_WAIT_TIME_LONG
end3
BattleScript_AttackWeakenedByStrongWinds:: BattleScript_AttackWeakenedByStrongWinds::
pause B_WAIT_TIME_SHORT pause B_WAIT_TIME_SHORT
printstring STRINGID_ATTACKWEAKENEDBSTRONGWINDS printstring STRINGID_ATTACKWEAKENEDBSTRONGWINDS
@ -8434,12 +8687,35 @@ BattleScript_TerrainSeedLoop_NextBattler:
restoretarget restoretarget
return return
BattleScript_ActivateSwitchInAbilities:
copybyte sBATTLER, gBattlerAttacker
setbyte gBattlerAttacker, 0
BattleScript_ActivateSwitchInAbilities_Loop:
switchinabilities BS_ATTACKER
BattleScript_ActivateSwitchInAbilities_Increment:
addbyte gBattlerAttacker, 1
jumpifbytenotequal gBattlerAttacker, gBattlersCount, BattleScript_ActivateSwitchInAbilities_Loop
copybyte gBattlerAttacker, sBATTLER
return
BattleScript_ActivateTerrainAbilities:
copybyte sBATTLER, gBattlerAttacker
setbyte gBattlerAttacker, 0
BattleScript_ActivateTerrainAbilities_Loop:
activateterrainchangeabilities BS_ATTACKER
BattleScript_ActivateTerrainAbilities_Increment:
addbyte gBattlerAttacker, 1
jumpifbytenotequal gBattlerAttacker, gBattlersCount, BattleScript_ActivateTerrainAbilities_Loop
copybyte gBattlerAttacker, sBATTLER
return
BattleScript_ElectricSurgeActivates:: BattleScript_ElectricSurgeActivates::
pause B_WAIT_TIME_SHORT pause B_WAIT_TIME_SHORT
call BattleScript_AbilityPopUp call BattleScript_AbilityPopUp
printstring STRINGID_TERRAINBECOMESELECTRIC printstring STRINGID_TERRAINBECOMESELECTRIC
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
playanimation BS_SCRIPTING, B_ANIM_RESTORE_BG playanimation BS_SCRIPTING, B_ANIM_RESTORE_BG
call BattleScript_ActivateTerrainAbilities
call BattleScript_TerrainSeedLoop call BattleScript_TerrainSeedLoop
end3 end3
@ -8449,6 +8725,7 @@ BattleScript_MistySurgeActivates::
printstring STRINGID_TERRAINBECOMESMISTY printstring STRINGID_TERRAINBECOMESMISTY
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
playanimation BS_SCRIPTING, B_ANIM_RESTORE_BG playanimation BS_SCRIPTING, B_ANIM_RESTORE_BG
call BattleScript_ActivateTerrainAbilities
call BattleScript_TerrainSeedLoop call BattleScript_TerrainSeedLoop
end3 end3
@ -8458,6 +8735,7 @@ BattleScript_GrassySurgeActivates::
printstring STRINGID_TERRAINBECOMESGRASSY printstring STRINGID_TERRAINBECOMESGRASSY
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
playanimation BS_SCRIPTING, B_ANIM_RESTORE_BG playanimation BS_SCRIPTING, B_ANIM_RESTORE_BG
call BattleScript_ActivateTerrainAbilities
call BattleScript_TerrainSeedLoop call BattleScript_TerrainSeedLoop
end3 end3
@ -8467,6 +8745,7 @@ BattleScript_PsychicSurgeActivates::
printstring STRINGID_TERRAINBECOMESPSYCHIC printstring STRINGID_TERRAINBECOMESPSYCHIC
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
playanimation BS_SCRIPTING, B_ANIM_RESTORE_BG playanimation BS_SCRIPTING, B_ANIM_RESTORE_BG
call BattleScript_ActivateTerrainAbilities
call BattleScript_TerrainSeedLoop call BattleScript_TerrainSeedLoop
end3 end3
@ -8547,8 +8826,15 @@ BattleScript_MoveStatDrain::
setgraphicalstatchangevalues setgraphicalstatchangevalues
playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1
waitanimation waitanimation
.if B_ABSORBING_ABILITY_STRING >= GEN_5
statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_MoveStatDrain_Cont
printfromtable gStatUpStringIds
waitmessage B_WAIT_TIME_LONG
.else
printstring STRINGID_TARGETABILITYSTATRAISE printstring STRINGID_TARGETABILITYSTATRAISE
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
.endif
BattleScript_MoveStatDrain_Cont:
clearsemiinvulnerablebit clearsemiinvulnerablebit
tryfaintmon BS_ATTACKER tryfaintmon BS_ATTACKER
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
@ -9728,7 +10014,7 @@ BattleScript_ExtremeEvoboostSpDef::
BattleScript_ExtremeEvoboostEnd:: BattleScript_ExtremeEvoboostEnd::
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
BattleScript_EffectTerrainHit: BattleScript_EffectHitSetRemoveTerrain:
attackcanceler attackcanceler
accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE
attackstring attackstring
@ -9750,6 +10036,7 @@ BattleScript_EffectTerrainHit:
setterrain BattleScript_TryFaint setterrain BattleScript_TryFaint
playanimation BS_ATTACKER, B_ANIM_RESTORE_BG playanimation BS_ATTACKER, B_ANIM_RESTORE_BG
printfromtable gTerrainStringIds printfromtable gTerrainStringIds
call BattleScript_ActivateTerrainAbilities
BattleScript_TryFaint: BattleScript_TryFaint:
tryfaintmon BS_TARGET tryfaintmon BS_TARGET
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
@ -9848,6 +10135,35 @@ BattleScript_DarkTypePreventsPrankster::
orhalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT orhalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
BattleScript_WellBakedBodyActivates::
attackstring
ppreduce
pause B_WAIT_TIME_SHORT
showabilitypopup BS_TARGET
orhalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT
modifybattlerstatstage BS_TARGET, STAT_DEF, INCREASE, 1, BattleScript_WellBakedBodyEnd, ANIM_ON
BattleScript_WellBakedBodyEnd:
goto BattleScript_MoveEnd
BattleScript_WindRiderActivatesMoveEnd::
attackstring
ppreduce
pause B_WAIT_TIME_SHORT
showabilitypopup BS_TARGET
orhalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT
modifybattlerstatstage BS_TARGET, STAT_ATK, INCREASE, 1, BattleScript_WindRiderActivatesMoveEnd_End, ANIM_ON
BattleScript_WindRiderActivatesMoveEnd_End:
goto BattleScript_MoveEnd
BattleScript_GoodAsGoldActivates::
attackstring
ppreduce
showabilitypopup BS_TARGET
pause B_WAIT_TIME_SHORT
printstring STRINGID_ITDOESNTAFFECT
waitmessage B_WAIT_TIME_MED
goto BattleScript_MoveEnd
BattleScript_PastelVeilActivates:: BattleScript_PastelVeilActivates::
setbyte gBattleCommunication, 0 setbyte gBattleCommunication, 0
setbyte gBattleCommunication + 1, 0 setbyte gBattleCommunication + 1, 0

View File

@ -145,6 +145,7 @@ BattleFrontier_Lounge7_EventScript_ChooseRightTutorMove::
waitmessage waitmessage
special ShowBattlePointsWindow special ShowBattlePointsWindow
setvar VAR_TEMP_E, 1 setvar VAR_TEMP_E, 1
setvar VAR_0x8004, SCROLL_MULTI_BF_MOVE_TUTOR_2
setvar VAR_0x8006, 0 setvar VAR_0x8006, 0
special ShowScrollableMultichoice special ShowScrollableMultichoice
waitstate waitstate
@ -168,6 +169,7 @@ BattleFrontier_Lounge7_EventScript_ChooseNewRightTutorMove::
message BattleFrontier_Lounge7_Text_TeachWhichMove message BattleFrontier_Lounge7_Text_TeachWhichMove
waitmessage waitmessage
setvar VAR_TEMP_E, 1 setvar VAR_TEMP_E, 1
setvar VAR_0x8004, SCROLL_MULTI_BF_MOVE_TUTOR_2
setvar VAR_0x8006, 1 setvar VAR_0x8006, 1
special ShowScrollableMultichoice special ShowScrollableMultichoice
waitstate waitstate

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
10 247 12
144 141 173
255 255 255
207 232 255
106 104 120
190 211 255
166 169 214
214 171 113
162 119 89
72 71 81
251 255 211
232 207 121
255 255 153
124 86 73
0 0 0
0 0 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 881 B

View File

@ -104,6 +104,7 @@ struct DisableStruct
u8 noRetreat:1; u8 noRetreat:1;
u8 tarShot:1; u8 tarShot:1;
u8 octolock:1; u8 octolock:1;
u8 cudChew:1;
}; };
struct ProtectStruct struct ProtectStruct
@ -650,6 +651,7 @@ struct BattleStruct
u8 skyDropTargets[MAX_BATTLERS_COUNT]; // For Sky Drop, to account for if multiple Pokemon use Sky Drop in a double battle. u8 skyDropTargets[MAX_BATTLERS_COUNT]; // For Sky Drop, to account for if multiple Pokemon use Sky Drop in a double battle.
// When using a move which hits multiple opponents which is then bounced by a target, we need to make sure, the move hits both opponents, the one with bounce, and the one without. // When using a move which hits multiple opponents which is then bounced by a target, we need to make sure, the move hits both opponents, the one with bounce, and the one without.
u8 attackerBeforeBounce:2; u8 attackerBeforeBounce:2;
u8 beatUpSlot:3;
u8 targetsDone[MAX_BATTLERS_COUNT]; // Each battler as a bit. u8 targetsDone[MAX_BATTLERS_COUNT]; // Each battler as a bit.
u16 overwrittenAbilities[MAX_BATTLERS_COUNT]; // abilities overwritten during battle (keep separate from battle history in case of switching) u16 overwrittenAbilities[MAX_BATTLERS_COUNT]; // abilities overwritten during battle (keep separate from battle history in case of switching)
}; };

View File

@ -43,6 +43,7 @@ u16 GetNaturePowerMove(void);
u16 GetSecretPowerMoveEffect(void); u16 GetSecretPowerMoveEffect(void);
void StealTargetItem(u8 battlerStealer, u8 battlerItem); void StealTargetItem(u8 battlerStealer, u8 battlerItem);
u8 GetCatchingBattler(void); u8 GetCatchingBattler(void);
u32 GetHighestStatId(u32 battlerId);
extern void (* const gBattleScriptingCommandsTable[])(void); extern void (* const gBattleScriptingCommandsTable[])(void);
extern const u8 gBattlePalaceNatureToMoveGroupLikelihood[NUM_NATURES][4]; extern const u8 gBattlePalaceNatureToMoveGroupLikelihood[NUM_NATURES][4];

View File

@ -433,6 +433,21 @@ extern const u8 BattleScript_MultiHitPrintStrings[];
extern const u8 BattleScript_BurnUpRemoveType[]; extern const u8 BattleScript_BurnUpRemoveType[];
extern const u8 BattleScript_TargetAbilityStatRaiseRet[]; extern const u8 BattleScript_TargetAbilityStatRaiseRet[];
extern const u8 BattleScript_DoubleShockRemoveType[]; extern const u8 BattleScript_DoubleShockRemoveType[];
extern const u8 BattleScript_SeedSowerActivates[];
extern const u8 BattleScript_AngerShellActivates[];
extern const u8 BattleScript_WellBakedBodyActivates[];
extern const u8 BattleScript_WindRiderActivatesMoveEnd[];
extern const u8 BattleScript_WindPowerActivates[];
extern const u8 BattleScript_WindPowerActivatesEnd2[];
extern const u8 BattleScript_ProtosynthesisActivates[];
extern const u8 BattleScript_QuarkDriveActivates[];
extern const u8 BattleScript_GoodAsGoldActivates[];
extern const u8 BattleScript_RuinAbilityActivates[];
extern const u8 BattleScript_CudChewActivates[];
extern const u8 BattleScript_SupremeOverlordActivates[];
extern const u8 BattleScript_CostarActivates[];
extern const u8 BattleScript_ToxicDebrisActivates[];
extern const u8 BattleScript_EarthEaterActivates[];
// zmoves // zmoves
extern const u8 BattleScript_ZMoveActivateDamaging[]; extern const u8 BattleScript_ZMoveActivateDamaging[];

View File

@ -34,6 +34,8 @@
#define ABILITYEFFECT_MOVE_END_OTHER 12 #define ABILITYEFFECT_MOVE_END_OTHER 12
#define ABILITYEFFECT_NEUTRALIZINGGAS 13 #define ABILITYEFFECT_NEUTRALIZINGGAS 13
#define ABILITYEFFECT_FIELD_SPORT 14 // Only used if B_SPORT_TURNS < GEN_6 #define ABILITYEFFECT_FIELD_SPORT 14 // Only used if B_SPORT_TURNS < GEN_6
#define ABILITYEFFECT_ON_WEATHER 15
#define ABILITYEFFECT_ON_TERRAIN 16
// Special cases // Special cases
#define ABILITYEFFECT_MUD_SPORT 252 // Only used if B_SPORT_TURNS < GEN_6 #define ABILITYEFFECT_MUD_SPORT 252 // Only used if B_SPORT_TURNS < GEN_6
#define ABILITYEFFECT_WATER_SPORT 253 // Only used if B_SPORT_TURNS < GEN_6 #define ABILITYEFFECT_WATER_SPORT 253 // Only used if B_SPORT_TURNS < GEN_6
@ -142,6 +144,7 @@ u16 CalcTypeEffectivenessMultiplier(u16 move, u8 moveType, u8 battlerAtk, u8 bat
u16 CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 abilityDef); u16 CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 abilityDef);
u16 GetTypeModifier(u8 atkType, u8 defType); u16 GetTypeModifier(u8 atkType, u8 defType);
s32 GetStealthHazardDamage(u8 hazardType, u8 battlerId); s32 GetStealthHazardDamage(u8 hazardType, u8 battlerId);
s32 GetStealthHazardDamageByTypesAndHP(u8 hazardType, u8 type1, u8 type2, u32 maxHp);
u16 GetMegaEvolutionSpecies(u16 preEvoSpecies, u16 heldItemId); u16 GetMegaEvolutionSpecies(u16 preEvoSpecies, u16 heldItemId);
u16 GetPrimalReversionSpecies(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);
@ -202,5 +205,7 @@ bool32 CanBeFrozen(u8 battlerId);
bool32 CanBeConfused(u8 battlerId); bool32 CanBeConfused(u8 battlerId);
bool32 IsBattlerTerrainAffected(u8 battlerId, u32 terrainFlag); bool32 IsBattlerTerrainAffected(u8 battlerId, u32 terrainFlag);
u32 GetBattlerFriendshipScore(u8 battlerId); u32 GetBattlerFriendshipScore(u8 battlerId);
u32 CountBattlerStatIncreases(u8 battlerId, bool32 countEvasionAcc);
bool32 IsMyceliumMightOnField(void);
#endif // GUARD_BATTLE_UTIL_H #endif // GUARD_BATTLE_UTIL_H

View File

@ -110,6 +110,8 @@
#define B_PLUS_MINUS_INTERACTION GEN_LATEST // In Gen5+, Plus and Minus can be activated with themselves and the opposite ability. Before, only the opposing ability could activate it. #define B_PLUS_MINUS_INTERACTION GEN_LATEST // In Gen5+, Plus and Minus can be activated with themselves and the opposite ability. Before, only the opposing ability could activate it.
#define B_WEATHER_FORMS GEN_LATEST // In Gen5+, Castform and Cherrim revert to their base form upon losing their respective ability. Cherrim needs Flower Gift to swap forms. #define B_WEATHER_FORMS GEN_LATEST // In Gen5+, Castform and Cherrim revert to their base form upon losing their respective ability. Cherrim needs Flower Gift to swap forms.
#define B_SYMBIOSIS_GEMS GEN_LATEST // In Gen7+, Symbiosis passes an item after a gem-boosted attack. Previously, items are passed before the gem-boosted attack hits, making the item effect apply. #define B_SYMBIOSIS_GEMS GEN_LATEST // In Gen7+, Symbiosis passes an item after a gem-boosted attack. Previously, items are passed before the gem-boosted attack hits, making the item effect apply.
#define B_CHECK_IF_CHARGED_UP TRUE // If set to TRUE, certain abilities such as Electromorphosis WILL check if the STATUS3_CHARGED_UP status flag is applied.
#define B_ABSORBING_ABILITY_STRING GEN_LATEST // In Gen5+, the abilities that absorb moves of a certain type use a generic string for stat increases and decreases.
// Item settings // Item settings
#define B_HP_BERRIES GEN_LATEST // 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_LATEST // In Gen4+, berries which restore hp activate immediately after HP drops to half. In Gen3, the effect occurs at the end of the turn.

View File

@ -9,7 +9,6 @@
#define P_LEGENDARY_PERFECT_IVS GEN_LATEST // Since Gen 6, Legendaries, Mythicals and Ultra Beasts found in the wild or given through gifts have at least 3 perfect IVs. #define P_LEGENDARY_PERFECT_IVS GEN_LATEST // Since Gen 6, Legendaries, Mythicals and Ultra Beasts found in the wild or given through gifts have at least 3 perfect IVs.
#define P_KADABRA_EVERSTONE GEN_LATEST // Since Gen 4, Kadabra can evolve even when holding an Everstone. #define P_KADABRA_EVERSTONE GEN_LATEST // Since Gen 4, Kadabra can evolve even when holding an Everstone.
#define P_NIDORAN_M_DITTO_BREED GEN_LATEST // Since Gen 5, when Nidoran♂ breeds with Ditto it can produce Nidoran♀ offspring. Before, it would only yield male offspring. This change also applies to Volbeat. #define P_NIDORAN_M_DITTO_BREED GEN_LATEST // Since Gen 5, when Nidoran♂ breeds with Ditto it can produce Nidoran♀ offspring. Before, it would only yield male offspring. This change also applies to Volbeat.
#define P_SHINY_BASE_CHANCE GEN_LATEST // Since Gen 6, the base chances of encountering a Shiny Pokémon was raised to 1/4096. This config adds an extra roll to the calculation, which effectively does the same thing.
// 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

@ -292,6 +292,41 @@
#define ABILITIES_COUNT_GEN8 268 #define ABILITIES_COUNT_GEN8 268
#define ABILITIES_COUNT ABILITIES_COUNT_GEN8 // Gen 9
#define ABILITY_LINGERING_AROMA 268
#define ABILITY_SEED_SOWER 269
#define ABILITY_THERMAL_EXCHANGE 270
#define ABILITY_ANGER_SHELL 271
#define ABILITY_PURIFYING_SALT 272
#define ABILITY_WELL_BAKED_BODY 273
#define ABILITY_WIND_RIDER 274
#define ABILITY_GUARD_DOG 275
#define ABILITY_ROCKY_PAYLOAD 276
#define ABILITY_WIND_POWER 277
#define ABILITY_ZERO_TO_HERO 278
#define ABILITY_COMMANDER 279
#define ABILITY_ELECTROMORPHOSIS 280
#define ABILITY_PROTOSYNTHESIS 281
#define ABILITY_QUARK_DRIVE 282
#define ABILITY_GOOD_AS_GOLD 283
#define ABILITY_VESSEL_OF_RUIN 284
#define ABILITY_SWORD_OF_RUIN 285
#define ABILITY_TABLETS_OF_RUIN 286
#define ABILITY_BEADS_OF_RUIN 287
#define ABILITY_ORICHALCUM_PULSE 288
#define ABILITY_HADRON_ENGINE 289
#define ABILITY_OPPORTUNIST 290
#define ABILITY_CUD_CHEW 291
#define ABILITY_SHARPNESS 292
#define ABILITY_SUPREME_OVERLORD 293
#define ABILITY_COSTAR 294
#define ABILITY_TOXIC_DEBRIS 295
#define ABILITY_ARMOR_TAIL 296
#define ABILITY_EARTH_EATER 297
#define ABILITY_MYCELIUM_MIGHT 298
#define ABILITIES_COUNT_GEN9 299
#define ABILITIES_COUNT ABILITIES_COUNT_GEN9
#endif // GUARD_CONSTANTS_ABILITIES_H #endif // GUARD_CONSTANTS_ABILITIES_H

View File

@ -394,6 +394,8 @@
#define ANIM_TAG_OMEGA_SYMBOL (ANIM_SPRITES_START + 382) #define ANIM_TAG_OMEGA_SYMBOL (ANIM_SPRITES_START + 382)
#define ANIM_TAG_STEEL_BEAM (ANIM_SPRITES_START + 383) #define ANIM_TAG_STEEL_BEAM (ANIM_SPRITES_START + 383)
#define ANIM_TAG_POLTERGEIST (ANIM_SPRITES_START + 384) #define ANIM_TAG_POLTERGEIST (ANIM_SPRITES_START + 384)
#define ANIM_TAG_TEAPOT (ANIM_SPRITES_START + 385)
// battlers // battlers
#define ANIM_ATTACKER 0 #define ANIM_ATTACKER 0

View File

@ -391,17 +391,18 @@
#define EFFECT_COURT_CHANGE 385 #define EFFECT_COURT_CHANGE 385
#define EFFECT_STEEL_BEAM 386 #define EFFECT_STEEL_BEAM 386
#define EFFECT_EXTREME_EVOBOOST 387 #define EFFECT_EXTREME_EVOBOOST 387
#define EFFECT_DAMAGE_SET_TERRAIN 388 // genesis supernova #define EFFECT_HIT_SET_REMOVE_TERRAIN 388
#define EFFECT_DARK_VOID 389 #define EFFECT_DARK_VOID 389
#define EFFECT_SLEEP_HIT 390 #define EFFECT_SLEEP_HIT 390
#define EFFECT_DOUBLE_SHOCK 391 #define EFFECT_DOUBLE_SHOCK 391
#define EFFECT_SPECIAL_ATTACK_UP_HIT 392 #define EFFECT_SPECIAL_ATTACK_UP_HIT 392
#define EFFECT_VICTORY_DANCE 393 #define EFFECT_VICTORY_DANCE 393
#define EFFECT_CEASELESS_EDGE 394 #define EFFECT_TEATIME 394
#define EFFECT_DIRE_CLAW 395 #define EFFECT_CEASELESS_EDGE 395
#define EFFECT_STONE_AXE 396 #define EFFECT_DIRE_CLAW 396
#define EFFECT_BARB_BARRAGE 397 #define EFFECT_STONE_AXE 397
#define EFFECT_BARB_BARRAGE 398
#define NUM_BATTLE_MOVE_EFFECTS 398 #define NUM_BATTLE_MOVE_EFFECTS 399
#endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H

View File

@ -247,6 +247,14 @@
#define VARIOUS_GET_BATTLER_SIDE 156 #define VARIOUS_GET_BATTLER_SIDE 156
#define VARIOUS_CHECK_PARENTAL_BOND_COUNTER 157 #define VARIOUS_CHECK_PARENTAL_BOND_COUNTER 157
#define VARIOUS_SWAP_STATS 158 #define VARIOUS_SWAP_STATS 158
#define VARIOUS_JUMP_IF_ROD 159
#define VARIOUS_JUMP_IF_ABSORB 160
#define VARIOUS_JUMP_IF_MOTOR 161
#define VARIOUS_TEATIME_INVUL 162
#define VARIOUS_TEATIME_TARGETS 163
#define VARIOUS_TRY_WIND_RIDER_POWER 164
#define VARIOUS_ACTIVATE_WEATHER_CHANGE_ABILITIES 165
#define VARIOUS_ACTIVATE_TERRAIN_CHANGE_ABILITIES 166
// Cmd_manipulatedamage // Cmd_manipulatedamage
#define DMG_CHANGE_SIGN 0 #define DMG_CHANGE_SIGN 0

View File

@ -632,8 +632,14 @@
#define STRINGID_TARGETTOUGHEDITOUT 630 #define STRINGID_TARGETTOUGHEDITOUT 630
#define STRINGID_ATTACKERLOSTELECTRICTYPE 631 #define STRINGID_ATTACKERLOSTELECTRICTYPE 631
#define STRINGID_ATTACKERSWITCHEDSTATWITHTARGET 632 #define STRINGID_ATTACKERSWITCHEDSTATWITHTARGET 632
#define STRINGID_BEINGHITCHARGEDPKMNWITHPOWER 633
#define STRINGID_SUNLIGHTACTIVATEDABILITY 634
#define STRINGID_STATWASHEIGHTENED 635
#define STRINGID_ELECTRICTERRAINACTIVATEDABILITY 636
#define STRINGID_ABILITYWEAKENEDFSURROUNDINGMONSSTAT 637
#define STRINGID_ATTACKERGAINEDSTRENGTHFROMTHEFALLEN 638
#define BATTLESTRINGS_COUNT 633 #define BATTLESTRINGS_COUNT 639
// This is the string id that gBattleStringsTable starts with. // This is the string id that gBattleStringsTable starts with.
// String ids before this (e.g. STRINGID_INTROMSG) are not in the table, // String ids before this (e.g. STRINGID_INTROMSG) are not in the table,

View File

@ -235,6 +235,8 @@
#define FLAG_THAW_USER (1 << 25) #define FLAG_THAW_USER (1 << 25)
#define FLAG_HIT_IN_SUBSTITUTE (1 << 26) // Hyperspace Fury #define FLAG_HIT_IN_SUBSTITUTE (1 << 26) // Hyperspace Fury
#define FLAG_TWO_STRIKES (1 << 27) // A move with this flag will strike twice, and may apply its effect on each hit #define FLAG_TWO_STRIKES (1 << 27) // A move with this flag will strike twice, and may apply its effect on each hit
#define FLAG_WIND_MOVE (1 << 28)
#define FLAG_SLICING_MOVE (1 << 29)
// Split defines. // Split defines.
#define SPLIT_PHYSICAL 0x0 #define SPLIT_PHYSICAL 0x0

View File

@ -9957,6 +9957,8 @@ extern const u32 gBattleAnimSpriteGfx_Tornado[];
extern const u32 gBattleAnimSpritePal_Tornado[]; extern const u32 gBattleAnimSpritePal_Tornado[];
extern const u32 gBattleAnimSpriteGfx_ZMoveSymbol[]; extern const u32 gBattleAnimSpriteGfx_ZMoveSymbol[];
extern const u32 gBattleAnimSpritePal_ZMoveSymbol[]; extern const u32 gBattleAnimSpritePal_ZMoveSymbol[];
extern const u32 gBattleAnimSpriteGfx_Teapot[];
extern const u32 gBattleAnimSpritePal_Teapot[];
extern const u32 gBattleAnimBgImage_Dark[]; extern const u32 gBattleAnimBgImage_Dark[];
extern const u32 gBattleAnimBgImage_Ghost[]; extern const u32 gBattleAnimBgImage_Ghost[];

View File

@ -2429,19 +2429,41 @@ static bool32 PartyBattlerShouldAvoidHazards(u8 currBattler, u8 switchBattler)
{ {
struct Pokemon *mon = GetPartyBattlerPartyData(currBattler, switchBattler); struct Pokemon *mon = GetPartyBattlerPartyData(currBattler, switchBattler);
u16 ability = GetMonAbility(mon); // we know our own party data u16 ability = GetMonAbility(mon); // we know our own party data
u16 holdEffect = GetBattlerHoldEffect(GetMonData(mon, MON_DATA_HELD_ITEM), TRUE); u16 holdEffect;
u16 species = GetMonData(mon, MON_DATA_SPECIES);
u32 flags = gSideStatuses[GetBattlerSide(currBattler)] & (SIDE_STATUS_SPIKES | SIDE_STATUS_STEALTH_ROCK | SIDE_STATUS_STICKY_WEB | SIDE_STATUS_TOXIC_SPIKES); u32 flags = gSideStatuses[GetBattlerSide(currBattler)] & (SIDE_STATUS_SPIKES | SIDE_STATUS_STEALTH_ROCK | SIDE_STATUS_STICKY_WEB | SIDE_STATUS_TOXIC_SPIKES);
s32 hazardDamage = 0;
u8 type1 = gSpeciesInfo[species].type1;
u8 type2 = gSpeciesInfo[species].type2;
u32 maxHp = GetMonData(mon, MON_DATA_MAX_HP);
if (flags == 0) if (flags == 0)
return FALSE; return FALSE;
if (ability == ABILITY_MAGIC_GUARD || ability == ABILITY_LEVITATE if (ability == ABILITY_MAGIC_GUARD)
|| holdEffect == HOLD_EFFECT_HEAVY_DUTY_BOOTS) return FALSE;
if (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM || ability == ABILITY_KLUTZ)
holdEffect = HOLD_EFFECT_NONE;
else
holdEffect = gItems[GetMonData(mon, MON_DATA_HELD_ITEM)].holdEffect;
if (holdEffect == HOLD_EFFECT_HEAVY_DUTY_BOOTS)
return FALSE; return FALSE;
if (flags & (SIDE_STATUS_SPIKES | SIDE_STATUS_STEALTH_ROCK) && GetMonData(mon, MON_DATA_HP) < (GetMonData(mon, MON_DATA_MAX_HP) / 8)) if (flags & SIDE_STATUS_STEALTH_ROCK)
return TRUE; hazardDamage += GetStealthHazardDamageByTypesAndHP(gBattleMoves[MOVE_STEALTH_ROCK].type, type1, type2, maxHp);
if (flags & SIDE_STATUS_SPIKES && ((type1 != TYPE_FLYING && type2 != TYPE_FLYING
&& ability != ABILITY_LEVITATE && holdEffect != HOLD_EFFECT_AIR_BALLOON)
|| holdEffect == HOLD_EFFECT_IRON_BALL || gFieldStatuses & STATUS_FIELD_GRAVITY))
{
u8 spikesDmg = maxHp / ((5 - gSideTimers[GetBattlerSide(currBattler)].spikesAmount) * 2);
if (spikesDmg == 0)
spikesDmg = 1;
hazardDamage += spikesDmg;
}
if (hazardDamage >= GetMonData(mon, MON_DATA_HP))
return TRUE;
return FALSE; return FALSE;
} }

View File

@ -2447,6 +2447,39 @@ const struct SpriteTemplate gFollowMeFingerSpriteTemplate =
.callback = AnimFollowMeFinger, .callback = AnimFollowMeFinger,
}; };
const union AffineAnimCmd gTeaAffineAnimCmds1[] =
{
AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 0),
AFFINEANIMCMD_FRAME(0x1E, 0x1E, 0, 8),
AFFINEANIMCMD_END,
};
const union AffineAnimCmd gTeaAffineAnimCmds2[] =
{
AFFINEANIMCMD_FRAME(0x0, 0x0, -3, 11),
AFFINEANIMCMD_FRAME(0x0, 0x0, 3, 11),
AFFINEANIMCMD_LOOP(2),
AFFINEANIMCMD_FRAME(0xFFE2, 0xFFE2, 0, 8),
AFFINEANIMCMD_END,
};
const union AffineAnimCmd *const gTeaAffineAnimTable[] =
{
gTeaAffineAnimCmds1,
gTeaAffineAnimCmds2,
};
const struct SpriteTemplate gTeapotSpriteTemplate =
{
.tileTag = ANIM_TAG_TEAPOT,
.paletteTag = ANIM_TAG_TEAPOT,
.oam = &gOamData_AffineDouble_ObjNormal_64x64,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gTeaAffineAnimTable,
.callback = AnimMetronomeFinger,
};
const union AnimCmd gTauntFingerAnimCmds1[] = const union AnimCmd gTauntFingerAnimCmds1[] =
{ {
ANIMCMD_FRAME(0, 1), ANIMCMD_FRAME(0, 1),

View File

@ -1759,7 +1759,7 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data)
{ {
case LIST_ITEM_ABILITY: case LIST_ITEM_ABILITY:
data->modifyArrows.minValue = 0; data->modifyArrows.minValue = 0;
data->modifyArrows.maxValue = ABILITIES_COUNT_GEN8 - 1; data->modifyArrows.maxValue = ABILITIES_COUNT - 1;
data->modifyArrows.maxDigits = 3; data->modifyArrows.maxDigits = 3;
data->modifyArrows.modifiedValPtr = &gBattleMons[data->battlerId].ability; data->modifyArrows.modifiedValPtr = &gBattleMons[data->battlerId].ability;
data->modifyArrows.typeOfVal = VAL_U16; data->modifyArrows.typeOfVal = VAL_U16;

View File

@ -101,7 +101,7 @@ static void SetActionsAndBattlersTurnOrder(void);
static void UpdateBattlerPartyOrdersOnSwitch(void); static void UpdateBattlerPartyOrdersOnSwitch(void);
static bool8 AllAtActionConfirmed(void); static bool8 AllAtActionConfirmed(void);
static void TryChangeTurnOrder(void); static void TryChangeTurnOrder(void);
static void CheckFocusPunch_ClearVarsBeforeTurnStarts(void); static void CheckChosenMoveForEffectsBeforeTurnStarts(void);
static void CheckMegaEvolutionBeforeTurn(void); static void CheckMegaEvolutionBeforeTurn(void);
static void CheckQuickClaw_CustapBerryActivation(void); static void CheckQuickClaw_CustapBerryActivation(void);
static void FreeResetData_ReturnToOvOrDoEvolutions(void); static void FreeResetData_ReturnToOvOrDoEvolutions(void);
@ -3039,6 +3039,7 @@ static void BattleStartClearSetData(void)
gBattleStruct->stickyWebUser = 0xFF; gBattleStruct->stickyWebUser = 0xFF;
gBattleStruct->appearedInBattle = 0; gBattleStruct->appearedInBattle = 0;
gBattleStruct->beatUpSlot = 0;
for (i = 0; i < PARTY_SIZE; i++) for (i = 0; i < PARTY_SIZE; i++)
{ {
@ -4480,6 +4481,7 @@ u32 GetBattlerTotalSpeedStat(u8 battlerId)
u32 speed = gBattleMons[battlerId].speed; u32 speed = gBattleMons[battlerId].speed;
u32 ability = GetBattlerAbility(battlerId); u32 ability = GetBattlerAbility(battlerId);
u32 holdEffect = GetBattlerHoldEffect(battlerId, TRUE); u32 holdEffect = GetBattlerHoldEffect(battlerId, TRUE);
u32 highestStat = GetHighestStatId(battlerId);
// weather abilities // weather abilities
if (WEATHER_HAS_EFFECT) if (WEATHER_HAS_EFFECT)
@ -4501,6 +4503,10 @@ u32 GetBattlerTotalSpeedStat(u8 battlerId)
speed *= 2; speed *= 2;
else if (ability == ABILITY_SLOW_START && gDisableStructs[battlerId].slowStartTimer != 0) else if (ability == ABILITY_SLOW_START && gDisableStructs[battlerId].slowStartTimer != 0)
speed /= 2; speed /= 2;
else if (ability == ABILITY_PROTOSYNTHESIS && gBattleWeather & B_WEATHER_SUN && highestStat == STAT_SPEED)
speed = (speed * 150) / 100;
else if (ability == ABILITY_QUARK_DRIVE && gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN && highestStat == STAT_SPEED)
speed = (speed * 150) / 100;
// stat stages // stat stages
speed *= gStatStageRatios[gBattleMons[battlerId].statStages[STAT_SPEED]][0]; speed *= gStatStageRatios[gBattleMons[battlerId].statStages[STAT_SPEED]][0];
@ -4666,6 +4672,10 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves)
strikesFirst = 1; strikesFirst = 1;
else if (ability2 == ABILITY_STALL && ability1 != ABILITY_STALL) else if (ability2 == ABILITY_STALL && ability1 != ABILITY_STALL)
strikesFirst = 0; strikesFirst = 0;
else if (ability1 == ABILITY_MYCELIUM_MIGHT && ability2 != ABILITY_MYCELIUM_MIGHT && IS_MOVE_STATUS(gCurrentMove))
strikesFirst = 1;
else if (ability2 == ABILITY_MYCELIUM_MIGHT && ability1 != ABILITY_MYCELIUM_MIGHT && IS_MOVE_STATUS(gCurrentMove))
strikesFirst = 0;
else else
{ {
if (speedBattler1 == speedBattler2 && Random() & 1) if (speedBattler1 == speedBattler2 && Random() & 1)
@ -4878,7 +4888,7 @@ static void CheckMegaEvolutionBeforeTurn(void)
} }
#if B_MEGA_EVO_TURN_ORDER <= GEN_6 #if B_MEGA_EVO_TURN_ORDER <= GEN_6
gBattleMainFunc = CheckFocusPunch_ClearVarsBeforeTurnStarts; gBattleMainFunc = CheckChosenMoveForEffectsBeforeTurnStarts;
gBattleStruct->focusPunchBattlerId = 0; gBattleStruct->focusPunchBattlerId = 0;
#else #else
gBattleMainFunc = TryChangeTurnOrder; // This will just do nothing if no mon has mega evolved gBattleMainFunc = TryChangeTurnOrder; // This will just do nothing if no mon has mega evolved
@ -4903,11 +4913,11 @@ static void TryChangeTurnOrder(void)
} }
} }
} }
gBattleMainFunc = CheckFocusPunch_ClearVarsBeforeTurnStarts; gBattleMainFunc = CheckChosenMoveForEffectsBeforeTurnStarts;
gBattleStruct->focusPunchBattlerId = 0; gBattleStruct->focusPunchBattlerId = 0;
} }
static void CheckFocusPunch_ClearVarsBeforeTurnStarts(void) static void CheckChosenMoveForEffectsBeforeTurnStarts(void)
{ {
u32 i; u32 i;
@ -4921,7 +4931,7 @@ static void CheckFocusPunch_ClearVarsBeforeTurnStarts(void)
&& !(gDisableStructs[gBattlerAttacker].truantCounter) && !(gDisableStructs[gBattlerAttacker].truantCounter)
&& !(gProtectStructs[gActiveBattler].noValidMoves)) && !(gProtectStructs[gActiveBattler].noValidMoves))
{ {
switch(gChosenMoveByBattler[gActiveBattler]) switch (gChosenMoveByBattler[gActiveBattler])
{ {
case MOVE_FOCUS_PUNCH: case MOVE_FOCUS_PUNCH:
BattleScriptExecute(BattleScript_FocusPunchSetUp); BattleScriptExecute(BattleScript_FocusPunchSetUp);

View File

@ -616,7 +616,7 @@ static const u8 sText_HealingWishCameTrue[] = _("The healing wish came true\nfor
static const u8 sText_HealingWishHealed[] = _("{B_ATK_NAME_WITH_PREFIX} regained health!"); static const u8 sText_HealingWishHealed[] = _("{B_ATK_NAME_WITH_PREFIX} regained health!");
static const u8 sText_LunarDanceCameTrue[] = _("{B_ATK_NAME_WITH_PREFIX} became cloaked\nin mystical moonlight!"); static const u8 sText_LunarDanceCameTrue[] = _("{B_ATK_NAME_WITH_PREFIX} became cloaked\nin mystical moonlight!");
static const u8 sText_CursedBodyDisabled[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1} was disabled\nby {B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}!"); static const u8 sText_CursedBodyDisabled[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1} was disabled\nby {B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}!");
static const u8 sText_AttackerAquiredAbility[] = _("{B_ATK_NAME_WITH_PREFIX} acquired {B_LAST_ABILITY}!"); static const u8 sText_AttackerAquiredAbility[] = _("{B_ATK_NAME_WITH_PREFIX} acquired\n{B_LAST_ABILITY}!");
static const u8 sText_TargetStatWontGoHigher[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1}\nwon't go higher!"); static const u8 sText_TargetStatWontGoHigher[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1}\nwon't go higher!");
static const u8 sText_PkmnMoveBouncedViaAbility[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_CURRENT_MOVE} was\nbounced back by {B_DEF_NAME_WITH_PREFIX}'s\l{B_DEF_ABILITY}!"); static const u8 sText_PkmnMoveBouncedViaAbility[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_CURRENT_MOVE} was\nbounced back by {B_DEF_NAME_WITH_PREFIX}'s\l{B_DEF_ABILITY}!");
static const u8 sText_ImposterTransform[] = _("{B_ATK_NAME_WITH_PREFIX} transformed into\n{B_DEF_NAME_WITH_PREFIX} using {B_LAST_ABILITY}!"); static const u8 sText_ImposterTransform[] = _("{B_ATK_NAME_WITH_PREFIX} transformed into\n{B_DEF_NAME_WITH_PREFIX} using {B_LAST_ABILITY}!");
@ -761,9 +761,21 @@ static const u8 sText_AttackerMeltedTheIce[] = _("{B_ATK_NAME_WITH_PREFIX} melte
static const u8 sText_TargetToughedItOut[] = _("{B_DEF_NAME_WITH_PREFIX} toughed it out\nto show you its best side!"); static const u8 sText_TargetToughedItOut[] = _("{B_DEF_NAME_WITH_PREFIX} toughed it out\nto show you its best side!");
static const u8 sText_AttackerLostElectricType[] = _("{B_ATK_NAME_WITH_PREFIX} used up all\nof its electricity!"); static const u8 sText_AttackerLostElectricType[] = _("{B_ATK_NAME_WITH_PREFIX} used up all\nof its electricity!");
static const u8 sText_AttackerSwitchedStatWithTarget[] = _("{B_ATK_NAME_WITH_PREFIX} switched {B_BUFF1}\nwith its target!"); static const u8 sText_AttackerSwitchedStatWithTarget[] = _("{B_ATK_NAME_WITH_PREFIX} switched {B_BUFF1}\nwith its target!");
static const u8 sText_BeingHitChargedPkmnWithPower[] = _("Being hit by {B_CURRENT_MOVE}\ncharged {B_ATK_NAME_WITH_PREFIX} with power!");
static const u8 sText_SunlightActivatedAbility[] = _("The harsh sunlight activated\n{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY}!");
static const u8 sText_StatWasHeightened[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1} was heightened!");
static const u8 sText_ElectricTerrainActivatedAbility[] = _("The Electric Terrain activated\n{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY}!");
static const u8 sText_AbilityWeakenedSurroundingMonsStat[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY}\nweakened the {B_BUFF1} of\lall surrounding Pokémon!\p");
static const u8 sText_AttackerGainedStrengthFromTheFallen[] = _("{B_ATK_NAME_WITH_PREFIX} gained strength\nfrom the fallen!");
const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] =
{ {
[STRINGID_ATTACKERGAINEDSTRENGTHFROMTHEFALLEN - BATTLESTRINGS_TABLE_START] = sText_AttackerGainedStrengthFromTheFallen,
[STRINGID_ABILITYWEAKENEDFSURROUNDINGMONSSTAT - BATTLESTRINGS_TABLE_START] = sText_AbilityWeakenedSurroundingMonsStat,
[STRINGID_ELECTRICTERRAINACTIVATEDABILITY - BATTLESTRINGS_TABLE_START] = sText_ElectricTerrainActivatedAbility,
[STRINGID_STATWASHEIGHTENED - BATTLESTRINGS_TABLE_START] = sText_StatWasHeightened,
[STRINGID_SUNLIGHTACTIVATEDABILITY - BATTLESTRINGS_TABLE_START] = sText_SunlightActivatedAbility,
[STRINGID_BEINGHITCHARGEDPKMNWITHPOWER - BATTLESTRINGS_TABLE_START] = sText_BeingHitChargedPkmnWithPower,
[STRINGID_ATTACKERSWITCHEDSTATWITHTARGET - BATTLESTRINGS_TABLE_START] = sText_AttackerSwitchedStatWithTarget, [STRINGID_ATTACKERSWITCHEDSTATWITHTARGET - BATTLESTRINGS_TABLE_START] = sText_AttackerSwitchedStatWithTarget,
[STRINGID_TARGETTOUGHEDITOUT - BATTLESTRINGS_TABLE_START] = sText_TargetToughedItOut, [STRINGID_TARGETTOUGHEDITOUT - BATTLESTRINGS_TABLE_START] = sText_TargetToughedItOut,
[STRINGID_ATTACKERMELTEDTHEICE - BATTLESTRINGS_TABLE_START] = sText_AttackerMeltedTheIce, [STRINGID_ATTACKERMELTEDTHEICE - BATTLESTRINGS_TABLE_START] = sText_AttackerMeltedTheIce,

View File

@ -5769,7 +5769,8 @@ static void Cmd_moveend(void)
if (gCurrentMove != MOVE_DRAGON_TAIL if (gCurrentMove != MOVE_DRAGON_TAIL
&& gCurrentMove != MOVE_CIRCLE_THROW && gCurrentMove != MOVE_CIRCLE_THROW
&& IsBattlerAlive(gBattlerAttacker) && IsBattlerAlive(gBattlerAttacker)
&& !TestSheerForceFlag(gBattlerAttacker, gCurrentMove)) && !TestSheerForceFlag(gBattlerAttacker, gCurrentMove)
&& GetBattlerAbility(gBattlerAttacker) != ABILITY_GUARD_DOG)
{ {
// Since we check if battler was damaged, we don't need to check move result. // Since we check if battler was damaged, we don't need to check move result.
// In fact, doing so actually prevents multi-target moves from activating red card properly // In fact, doing so actually prevents multi-target moves from activating red card properly
@ -7953,7 +7954,7 @@ static void HandleTerrainMove(u16 move)
statusFlag = STATUS_FIELD_PSYCHIC_TERRAIN; statusFlag = STATUS_FIELD_PSYCHIC_TERRAIN;
gBattleCommunication[MULTISTRING_CHOOSER] = 3; gBattleCommunication[MULTISTRING_CHOOSER] = 3;
break; break;
case EFFECT_DAMAGE_SET_TERRAIN: case EFFECT_HIT_SET_REMOVE_TERRAIN:
switch (gBattleMoves[move].argument) switch (gBattleMoves[move].argument)
{ {
case 0: //genesis supernova case 0: //genesis supernova
@ -8111,7 +8112,7 @@ static void RecalcBattlerStats(u32 battler, struct Pokemon *mon)
gBattleMons[battler].type2 = gSpeciesInfo[gBattleMons[battler].species].type2; gBattleMons[battler].type2 = gSpeciesInfo[gBattleMons[battler].species].type2;
} }
static u32 GetHighestStatId(u32 battlerId) u32 GetHighestStatId(u32 battlerId)
{ {
u32 i, highestId = STAT_ATK, highestStat = gBattleMons[battlerId].attack; u32 i, highestId = STAT_ATK, highestStat = gBattleMons[battlerId].attack;
@ -8142,6 +8143,67 @@ static bool32 IsRototillerAffected(u32 battlerId)
return TRUE; return TRUE;
} }
static bool32 IsAbilityRodAffected(void)
{
u32 moveType;
if (gBattleStruct->dynamicMoveType == 0)
moveType = gBattleMoves[gCurrentMove].type;
else if (!(gBattleStruct->dynamicMoveType & 0x40))
moveType = gBattleStruct->dynamicMoveType & 0x3F;
else
moveType = gBattleMoves[gCurrentMove].type;
if (moveType == TYPE_ELECTRIC && GetBattlerAbility(gBattlerTarget) == ABILITY_LIGHTNING_ROD)
return TRUE;
else
return FALSE;
}
static bool32 IsAbilityMotorAffected(void)
{
u32 moveType;
if (gBattleStruct->dynamicMoveType == 0)
moveType = gBattleMoves[gCurrentMove].type;
else if (!(gBattleStruct->dynamicMoveType & 0x40))
moveType = gBattleStruct->dynamicMoveType & 0x3F;
else
moveType = gBattleMoves[gCurrentMove].type;
if (moveType == TYPE_ELECTRIC && GetBattlerAbility(gBattlerTarget) == ABILITY_MOTOR_DRIVE)
return TRUE;
else
return FALSE;
}
static bool32 IsAbilityAbsorbAffected(void)
{
u32 moveType;
if (gBattleStruct->dynamicMoveType == 0)
moveType = gBattleMoves[gCurrentMove].type;
else if (!(gBattleStruct->dynamicMoveType & 0x40))
moveType = gBattleStruct->dynamicMoveType & 0x3F;
else
moveType = gBattleMoves[gCurrentMove].type;
if (moveType == TYPE_ELECTRIC && GetBattlerAbility(gBattlerTarget) == ABILITY_VOLT_ABSORB)
return TRUE;
else
return FALSE;
}
static bool32 IsTeatimeAffected(u32 battlerId)
{
if (ItemId_GetPocket(gBattleMons[battlerId].item) != POCKET_BERRIES)
return FALSE; // Only berries
if (gStatuses3[battlerId] & STATUS3_SEMI_INVULNERABLE)
return FALSE; // Teatime doesn't affected semi-invulnerable battlers
return TRUE;
}
#define COURTCHANGE_SWAP(status, structField, temp) \ #define COURTCHANGE_SWAP(status, structField, temp) \
{ \ { \
temp = gSideStatuses[B_SIDE_PLAYER]; \ temp = gSideStatuses[B_SIDE_PLAYER]; \
@ -9143,9 +9205,10 @@ static void Cmd_various(void)
break; break;
case VARIOUS_TRY_HIT_SWITCH_TARGET: case VARIOUS_TRY_HIT_SWITCH_TARGET:
if (IsBattlerAlive(gBattlerAttacker) if (IsBattlerAlive(gBattlerAttacker)
&& IsBattlerAlive(gBattlerTarget) && IsBattlerAlive(gBattlerTarget)
&& !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
&& TARGET_TURN_DAMAGED) && TARGET_TURN_DAMAGED
&& GetBattlerAbility(gBattlerTarget) != ABILITY_GUARD_DOG)
{ {
gBattleScripting.switchCase = B_SWITCH_HIT; gBattleScripting.switchCase = B_SWITCH_HIT;
gBattlescriptCurrInstr = BattleScript_ForceRandomSwitch; gBattlescriptCurrInstr = BattleScript_ForceRandomSwitch;
@ -10043,7 +10106,7 @@ static void Cmd_various(void)
gBattleMons[gActiveBattler].item = gLastUsedItem; gBattleMons[gActiveBattler].item = gLastUsedItem;
break; break;
case VARIOUS_SET_BEAK_BLAST: case VARIOUS_SET_BEAK_BLAST:
gProtectStructs[gBattlerAttacker].beakBlastCharge = TRUE; gProtectStructs[gActiveBattler].beakBlastCharge = TRUE;
break; break;
case VARIOUS_SWAP_SIDE_STATUSES: case VARIOUS_SWAP_SIDE_STATUSES:
CourtChangeSwapSideStatuses(); CourtChangeSwapSideStatuses();
@ -10110,6 +10173,70 @@ static void Cmd_various(void)
PREPARE_STAT_BUFFER(gBattleTextBuff1, statId); PREPARE_STAT_BUFFER(gBattleTextBuff1, statId);
} }
break; break;
case VARIOUS_TEATIME_TARGETS:
{
u32 count = 0;
for (i = 0; i < gBattlersCount; i++)
{
if (IsTeatimeAffected(i))
count++;
}
if (count == 0)
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); // Teatime fails
else
gBattlescriptCurrInstr += 7;
}
return;
case VARIOUS_TEATIME_INVUL:
if (ItemId_GetPocket(gBattleMons[gActiveBattler].item) == POCKET_BERRIES && !(gStatuses3[gBattlerTarget] & (STATUS3_SEMI_INVULNERABLE)))
gBattlescriptCurrInstr += 7;
else
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3);
return;
case VARIOUS_JUMP_IF_ROD:
if (IsAbilityRodAffected())
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3);
else
gBattlescriptCurrInstr += 7;
return;
case VARIOUS_JUMP_IF_MOTOR:
if (IsAbilityMotorAffected())
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3);
else
gBattlescriptCurrInstr += 7;
return;
case VARIOUS_JUMP_IF_ABSORB:
if (IsAbilityAbsorbAffected())
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3);
else
gBattlescriptCurrInstr += 7;
return;
case VARIOUS_TRY_WIND_RIDER_POWER:
{
u16 ability = GetBattlerAbility(gActiveBattler);
if (GetBattlerSide(gActiveBattler) == GetBattlerSide(gBattlerAttacker)
&& (ability == ABILITY_WIND_RIDER || ability == ABILITY_WIND_POWER))
{
gLastUsedAbility = ability;
RecordAbilityBattle(gActiveBattler, gLastUsedAbility);
gBattlerAbility = gBattleScripting.battler = gActiveBattler;
gBattlescriptCurrInstr += 7;
}
else
{
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3);
}
}
return;
case VARIOUS_ACTIVATE_WEATHER_CHANGE_ABILITIES:
gBattlescriptCurrInstr += 3;
AbilityBattleEffects(ABILITYEFFECT_ON_WEATHER, gActiveBattler, 0, 0, 0);
return;
case VARIOUS_ACTIVATE_TERRAIN_CHANGE_ABILITIES:
gBattlescriptCurrInstr += 3;
AbilityBattleEffects(ABILITYEFFECT_ON_TERRAIN, gActiveBattler, 0, 0, 0);
return;
} // End of switch (gBattlescriptCurrInstr[2]) } // End of switch (gBattlescriptCurrInstr[2])
gBattlescriptCurrInstr += 3; gBattlescriptCurrInstr += 3;
@ -10788,7 +10915,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr
else if ((activeBattlerAbility == ABILITY_CLEAR_BODY else if ((activeBattlerAbility == ABILITY_CLEAR_BODY
|| activeBattlerAbility == ABILITY_FULL_METAL_BODY || activeBattlerAbility == ABILITY_FULL_METAL_BODY
|| activeBattlerAbility == ABILITY_WHITE_SMOKE) || activeBattlerAbility == ABILITY_WHITE_SMOKE)
&& !certain && gCurrentMove != MOVE_CURSE) && !affectsUser && !certain && gCurrentMove != MOVE_CURSE)
{ {
if (flags == STAT_CHANGE_ALLOW_PTR) if (flags == STAT_CHANGE_ALLOW_PTR)
{ {
@ -11938,8 +12065,9 @@ static void Cmd_trysetencore(void)
} }
if (gLastMoves[gBattlerTarget] == MOVE_STRUGGLE if (gLastMoves[gBattlerTarget] == MOVE_STRUGGLE
|| gLastMoves[gBattlerTarget] == MOVE_ENCORE || gLastMoves[gBattlerTarget] == MOVE_ENCORE
|| gLastMoves[gBattlerTarget] == MOVE_MIRROR_MOVE) || gLastMoves[gBattlerTarget] == MOVE_MIRROR_MOVE
|| gLastMoves[gBattlerTarget] == MOVE_SHELL_TRAP)
{ {
i = MAX_MON_MOVES; i = MAX_MON_MOVES;
} }
@ -12867,6 +12995,10 @@ static void Cmd_trysetfutureattack(void)
static void Cmd_trydobeatup(void) static void Cmd_trydobeatup(void)
{ {
#if B_BEAT_UP >= GEN_5
gBattleStruct->beatUpSlot++;
gBattlescriptCurrInstr += 9;
#else
struct Pokemon *party; struct Pokemon *party;
if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)
@ -12910,6 +13042,7 @@ static void Cmd_trydobeatup(void)
else else
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 5); gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 5);
} }
#endif
} }
static void Cmd_setsemiinvulnerablebit(void) static void Cmd_setsemiinvulnerablebit(void)

View File

@ -476,7 +476,7 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] =
[EFFECT_COURT_CHANGE] = 0, // TODO: Assign points [EFFECT_COURT_CHANGE] = 0, // TODO: Assign points
[EFFECT_STEEL_BEAM] = 0, // TODO: Assign points [EFFECT_STEEL_BEAM] = 0, // TODO: Assign points
[EFFECT_EXTREME_EVOBOOST] = 0, // TODO: Assign points [EFFECT_EXTREME_EVOBOOST] = 0, // TODO: Assign points
[EFFECT_DAMAGE_SET_TERRAIN] = 0, // TODO: Assign points [EFFECT_HIT_SET_REMOVE_TERRAIN] = 0, // TODO: Assign points
[EFFECT_DARK_VOID] = 0, // TODO: Assign points [EFFECT_DARK_VOID] = 0, // TODO: Assign points
[EFFECT_SLEEP_HIT] = 1, [EFFECT_SLEEP_HIT] = 1,
[EFFECT_DOUBLE_SHOCK] = 0, // TODO: Assign points [EFFECT_DOUBLE_SHOCK] = 0, // TODO: Assign points

View File

@ -230,8 +230,9 @@ static u8 CalcBeatUpPower(void)
party = gPlayerParty; party = gPlayerParty;
else else
party = gEnemyParty; party = gEnemyParty;
// Party slot is set in the battle script for Beat Up
species = GetMonData(&party[gBattleCommunication[0] - 1], MON_DATA_SPECIES); // Party slot is incremented by the battle script for Beat Up after this damage calculation
species = GetMonData(&party[gBattleStruct->beatUpSlot], MON_DATA_SPECIES);
basePower = (gSpeciesInfo[species].baseAttack / 10) + 5; basePower = (gSpeciesInfo[species].baseAttack / 10) + 5;
return basePower; return basePower;
@ -419,7 +420,7 @@ void HandleAction_UseMove(void)
battlerAbility = GetBattlerAbility(gActiveBattler); battlerAbility = GetBattlerAbility(gActiveBattler);
RecordAbilityBattle(gActiveBattler, gBattleMons[gActiveBattler].ability); RecordAbilityBattle(gActiveBattler, gBattleMons[gActiveBattler].ability);
if (battlerAbility == ABILITY_LIGHTNING_ROD) if (battlerAbility == ABILITY_LIGHTNING_ROD && gCurrentMove != MOVE_TEATIME)
gSpecialStatuses[gActiveBattler].lightningRodRedirected = TRUE; gSpecialStatuses[gActiveBattler].lightningRodRedirected = TRUE;
else if (battlerAbility == ABILITY_STORM_DRAIN) else if (battlerAbility == ABILITY_STORM_DRAIN)
gSpecialStatuses[gActiveBattler].stormDrainRedirected = TRUE; gSpecialStatuses[gActiveBattler].stormDrainRedirected = TRUE;
@ -1065,6 +1066,11 @@ static const u8 sAbilitiesAffectedByMoldBreaker[] =
[ABILITY_ICE_SCALES] = 1, [ABILITY_ICE_SCALES] = 1,
[ABILITY_ICE_FACE] = 1, [ABILITY_ICE_FACE] = 1,
[ABILITY_PASTEL_VEIL] = 1, [ABILITY_PASTEL_VEIL] = 1,
[ABILITY_ARMOR_TAIL] = 1,
[ABILITY_EARTH_EATER] = 1,
[ABILITY_GOOD_AS_GOLD] = 1,
[ABILITY_PURIFYING_SALT] = 1,
[ABILITY_WELL_BAKED_BODY] = 1,
}; };
static const u8 sAbilitiesNotTraced[ABILITIES_COUNT] = static const u8 sAbilitiesNotTraced[ABILITIES_COUNT] =
@ -2654,6 +2660,7 @@ enum
ENDTURN_THROAT_CHOP, ENDTURN_THROAT_CHOP,
ENDTURN_SLOW_START, ENDTURN_SLOW_START,
ENDTURN_PLASMA_FISTS, ENDTURN_PLASMA_FISTS,
ENDTURN_CUD_CHEW,
ENDTURN_BATTLER_COUNT ENDTURN_BATTLER_COUNT
}; };
@ -3195,6 +3202,11 @@ u8 DoBattlerEndTurnEffects(void)
gStatuses4[gActiveBattler] &= ~STATUS4_PLASMA_FISTS; gStatuses4[gActiveBattler] &= ~STATUS4_PLASMA_FISTS;
gBattleStruct->turnEffectsTracker++; gBattleStruct->turnEffectsTracker++;
break; break;
case ENDTURN_CUD_CHEW:
if (GetBattlerAbility(gActiveBattler) == ABILITY_CUD_CHEW && !gDisableStructs[gActiveBattler].cudChew && ItemId_GetPocket(GetUsedHeldItem(gActiveBattler)) == POCKET_BERRIES)
gDisableStructs[gActiveBattler].cudChew = TRUE;
gBattleStruct->turnEffectsTracker++;
break;
case ENDTURN_BATTLER_COUNT: // done case ENDTURN_BATTLER_COUNT: // done
gBattleStruct->turnEffectsTracker = 0; gBattleStruct->turnEffectsTracker = 0;
gBattleStruct->turnEffectsBattlerId++; gBattleStruct->turnEffectsBattlerId++;
@ -3875,7 +3887,7 @@ u8 AtkCanceller_UnableToUseMove(void)
gMultiHitCounter++; gMultiHitCounter++;
} }
gBattleCommunication[0] = 0; // For later gBattleStruct->beatUpSlot = 0;
PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0)
} }
#endif #endif
@ -4719,6 +4731,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
} }
break; break;
case ABILITY_ELECTRIC_SURGE: case ABILITY_ELECTRIC_SURGE:
case ABILITY_HADRON_ENGINE:
if (TryChangeBattleTerrain(battler, STATUS_FIELD_ELECTRIC_TERRAIN, &gFieldTimers.terrainTimer)) if (TryChangeBattleTerrain(battler, STATUS_FIELD_ELECTRIC_TERRAIN, &gFieldTimers.terrainTimer))
{ {
BattleScriptPushCursorAndCallback(BattleScript_ElectricSurgeActivates); BattleScriptPushCursorAndCallback(BattleScript_ElectricSurgeActivates);
@ -4755,19 +4768,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
effect++; effect++;
} }
break; break;
case ABILITY_FORECAST:
#if B_WEATHER_FORMS >= GEN_5
case ABILITY_FLOWER_GIFT:
#else
TRY_WEATHER_FORM:
#endif
effect = TryWeatherFormChange(battler);
if (effect != 0)
{
BattleScriptPushCursorAndCallback(BattleScript_WeatherFormChange);
*(&gBattleStruct->formToChangeInto) = effect - 1;
}
break;
case ABILITY_TRACE: case ABILITY_TRACE:
if (!(gSpecialStatuses[battler].traced)) if (!(gSpecialStatuses[battler].traced))
{ {
@ -4842,6 +4842,89 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
effect++; effect++;
} }
break; break;
case ABILITY_PROTOSYNTHESIS:
if (!gSpecialStatuses[battler].switchInAbilityDone && gBattleWeather & B_WEATHER_SUN)
{
gSpecialStatuses[battler].switchInAbilityDone = TRUE;
PREPARE_STAT_BUFFER(gBattleTextBuff1, GetHighestStatId(battler));
BattleScriptPushCursorAndCallback(BattleScript_ProtosynthesisActivates);
effect++;
}
break;
case ABILITY_QUARK_DRIVE:
if (!gSpecialStatuses[battler].switchInAbilityDone && gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN)
{
gSpecialStatuses[battler].switchInAbilityDone = TRUE;
PREPARE_STAT_BUFFER(gBattleTextBuff1, GetHighestStatId(battler));
BattleScriptPushCursorAndCallback(BattleScript_QuarkDriveActivates);
effect++;
}
break;
case ABILITY_VESSEL_OF_RUIN:
if (!gSpecialStatuses[battler].switchInAbilityDone)
{
PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPATK);
gSpecialStatuses[battler].switchInAbilityDone = TRUE;
BattleScriptPushCursorAndCallback(BattleScript_RuinAbilityActivates);
effect++;
}
break;
case ABILITY_SWORD_OF_RUIN:
if (!gSpecialStatuses[battler].switchInAbilityDone)
{
PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_DEF);
gSpecialStatuses[battler].switchInAbilityDone = TRUE;
BattleScriptPushCursorAndCallback(BattleScript_RuinAbilityActivates);
effect++;
}
break;
case ABILITY_TABLETS_OF_RUIN:
if (!gSpecialStatuses[battler].switchInAbilityDone)
{
PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK);
gSpecialStatuses[battler].switchInAbilityDone = TRUE;
BattleScriptPushCursorAndCallback(BattleScript_RuinAbilityActivates);
effect++;
}
break;
case ABILITY_BEADS_OF_RUIN:
if (!gSpecialStatuses[battler].switchInAbilityDone)
{
PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPDEF);
gSpecialStatuses[battler].switchInAbilityDone = TRUE;
BattleScriptPushCursorAndCallback(BattleScript_RuinAbilityActivates);
effect++;
}
break;
case ABILITY_ORICHALCUM_PULSE:
if (TryChangeBattleWeather(battler, ENUM_WEATHER_SUN, TRUE))
{
BattleScriptPushCursorAndCallback(BattleScript_DroughtActivates);
effect++;
}
break;
case ABILITY_SUPREME_OVERLORD:
if (!gSpecialStatuses[battler].switchInAbilityDone && CountUsablePartyMons(battler) < PARTY_SIZE)
{
gSpecialStatuses[battler].switchInAbilityDone = TRUE;
BattleScriptPushCursorAndCallback(BattleScript_SupremeOverlordActivates);
effect++;
}
break;
case ABILITY_COSTAR:
if (!gSpecialStatuses[battler].switchInAbilityDone
&& IsDoubleBattle()
&& IsBattlerAlive(BATTLE_PARTNER(battler))
&& CountBattlerStatIncreases(BATTLE_PARTNER(battler), FALSE))
{
gSpecialStatuses[battler].switchInAbilityDone = TRUE;
for (i = 0; i < NUM_BATTLE_STATS; i++)
gBattleMons[battler].statStages[i] = gBattleMons[BATTLE_PARTNER(battler)].statStages[i];
gBattlerTarget = BATTLE_PARTNER(battler);
BattleScriptPushCursorAndCallback(BattleScript_CostarActivates);
effect++;
}
break;
#if B_WEATHER_FORMS < GEN_5 #if B_WEATHER_FORMS < GEN_5
default: default:
if (gBattleMons[battler].species == SPECIES_CHERRIM) if (gBattleMons[battler].species == SPECIES_CHERRIM)
@ -5045,48 +5128,66 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
effect++; effect++;
} }
break; break;
case ABILITY_CUD_CHEW:
if (ItemId_GetPocket(GetUsedHeldItem(battler)) == POCKET_BERRIES && gDisableStructs[gActiveBattler].cudChew == TRUE)
{
gLastUsedItem = gBattleStruct->usedHeldItems[battler][GetBattlerSide(battler)];
gBattleStruct->usedHeldItems[battler][GetBattlerSide(battler)] = ITEM_NONE;
BattleScriptPushCursorAndCallback(BattleScript_CudChewActivates);
effect++;
}
break;
} }
} }
break; break;
case ABILITYEFFECT_MOVES_BLOCK: // 2 case ABILITYEFFECT_MOVES_BLOCK: // 2
{ {
u16 moveTarget = GetBattlerMoveTargetType(battler, move); u16 moveTarget = GetBattlerMoveTargetType(battler, move);
u16 battlerAbility = GetBattlerAbility(battler);
u16 targetAbility = GetBattlerAbility(gBattlerTarget);
if ((gLastUsedAbility == ABILITY_SOUNDPROOF && gBattleMoves[move].flags & FLAG_SOUND && !(moveTarget & MOVE_TARGET_USER)) if ((gLastUsedAbility == ABILITY_SOUNDPROOF && gBattleMoves[move].flags & FLAG_SOUND && !(moveTarget & MOVE_TARGET_USER))
|| (gLastUsedAbility == ABILITY_BULLETPROOF && gBattleMoves[move].flags & FLAG_BALLISTIC)) || (gLastUsedAbility == ABILITY_BULLETPROOF && gBattleMoves[move].flags & FLAG_BALLISTIC))
{ {
if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS) if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)
gHitMarker |= HITMARKER_NO_PPDEDUCT; gHitMarker |= HITMARKER_NO_PPDEDUCT;
gBattlescriptCurrInstr = BattleScript_SoundproofProtected; gBattlescriptCurrInstr = BattleScript_SoundproofProtected;
effect = 1; effect = 1;
}
else if ((gLastUsedAbility == ABILITY_DAZZLING || gLastUsedAbility == ABILITY_QUEENLY_MAJESTY || gLastUsedAbility == ABILITY_ARMOR_TAIL || IsBattlerAlive(battler ^= BIT_FLANK))
&& (battlerAbility == ABILITY_DAZZLING || battlerAbility == ABILITY_QUEENLY_MAJESTY || battlerAbility == ABILITY_ARMOR_TAIL)
&& GetChosenMovePriority(gBattlerAttacker) > 0
&& GetBattlerSide(gBattlerAttacker) != GetBattlerSide(battler))
{
if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)
gHitMarker |= HITMARKER_NO_PPDEDUCT;
gBattlescriptCurrInstr = BattleScript_DazzlingProtected;
effect = 1;
}
else if (BlocksPrankster(move, gBattlerAttacker, gBattlerTarget, TRUE) && !(IS_MOVE_STATUS(move) && targetAbility == ABILITY_MAGIC_BOUNCE))
{
if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE) || !(moveTarget & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY)))
CancelMultiTurnMoves(gBattlerAttacker); // Don't cancel moves that can hit two targets bc one target might not be protected
gBattleScripting.battler = gBattlerAbility = gBattlerTarget;
gBattlescriptCurrInstr = BattleScript_DarkTypePreventsPrankster;
effect = 1;
}
else if (GetBattlerAbility(gBattlerTarget) == ABILITY_GOOD_AS_GOLD
&& IS_MOVE_STATUS(gCurrentMove)
&& !(moveTarget & MOVE_TARGET_USER)
&& !(moveTarget & MOVE_TARGET_OPPONENTS_FIELD)
&& !(moveTarget & MOVE_TARGET_ALL_BATTLERS))
{
gBattlescriptCurrInstr = BattleScript_GoodAsGoldActivates;
effect = 1;
}
break;
} }
else if ((((gLastUsedAbility == ABILITY_DAZZLING || gLastUsedAbility == ABILITY_QUEENLY_MAJESTY
|| (IsBattlerAlive(battler ^= BIT_FLANK)
&& ((GetBattlerAbility(battler) == ABILITY_DAZZLING) || GetBattlerAbility(battler) == ABILITY_QUEENLY_MAJESTY)))
))
&& GetChosenMovePriority(gBattlerAttacker) > 0
&& GetBattlerSide(gBattlerAttacker) != GetBattlerSide(battler))
{
if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)
gHitMarker |= HITMARKER_NO_PPDEDUCT;
gBattlescriptCurrInstr = BattleScript_DazzlingProtected;
effect = 1;
}
else if (BlocksPrankster(move, gBattlerAttacker, gBattlerTarget, TRUE)
&& !(IS_MOVE_STATUS(move) && GetBattlerAbility(gBattlerTarget) == ABILITY_MAGIC_BOUNCE))
{
if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE) || !(moveTarget & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY)))
CancelMultiTurnMoves(gBattlerAttacker); // Don't cancel moves that can hit two targets bc one target might not be protected
gBattleScripting.battler = gBattlerAbility = gBattlerTarget;
gBattlescriptCurrInstr = BattleScript_DarkTypePreventsPrankster;
effect = 1;
}
break;
}
case ABILITYEFFECT_ABSORBING: // 3 case ABILITYEFFECT_ABSORBING: // 3
if (move != MOVE_NONE) if (move != MOVE_NONE)
{ {
u8 statId; u8 statId;
u8 statAmount = 1;
switch (gLastUsedAbility) switch (gLastUsedAbility)
{ {
case ABILITY_VOLT_ABSORB: case ABILITY_VOLT_ABSORB:
@ -5144,6 +5245,18 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
} }
} }
break; break;
case ABILITY_WELL_BAKED_BODY:
if (moveType == TYPE_FIRE)
effect = 2, statId = STAT_DEF, statAmount = 2;
break;
case ABILITY_WIND_RIDER:
if (gBattleMoves[gCurrentMove].flags & FLAG_WIND_MOVE && !(GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove) & MOVE_TARGET_USER))
effect = 2, statId = STAT_ATK;
break;
case ABILITY_EARTH_EATER:
if (moveType == TYPE_GROUND)
effect = 1;
break;
} }
if (effect == 1) // Drain Hp ability. if (effect == 1) // Drain Hp ability.
@ -5188,9 +5301,11 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
else else
gBattlescriptCurrInstr = BattleScript_MoveStatDrain_PPLoss; gBattlescriptCurrInstr = BattleScript_MoveStatDrain_PPLoss;
SET_STATCHANGER(statId, 1, FALSE); SET_STATCHANGER(statId, statAmount, FALSE);
#if B_ABSORBING_ABILITY_STRING < GEN_5
gBattleMons[battler].statStages[statId]++; gBattleMons[battler].statStages[statId]++;
PREPARE_STAT_BUFFER(gBattleTextBuff1, statId); PREPARE_STAT_BUFFER(gBattleTextBuff1, statId);
#endif
} }
} }
} }
@ -5324,11 +5439,13 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
effect++; effect++;
} }
break; break;
case ABILITY_LINGERING_AROMA:
case ABILITY_MUMMY: case ABILITY_MUMMY:
if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
&& IsBattlerAlive(gBattlerAttacker) && IsBattlerAlive(gBattlerAttacker)
&& TARGET_TURN_DAMAGED && TARGET_TURN_DAMAGED
&& (IsMoveMakingContact(move, gBattlerAttacker))) && IsMoveMakingContact(move, gBattlerAttacker)
&& gBattleStruct->overwrittenAbilities[gBattlerAttacker] != GetBattlerAbility(gBattlerTarget))
{ {
switch (gBattleMons[gBattlerAttacker].ability) switch (gBattleMons[gBattlerAttacker].ability)
{ {
@ -5344,7 +5461,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
case ABILITY_STANCE_CHANGE: case ABILITY_STANCE_CHANGE:
break; break;
default: default:
gLastUsedAbility = gBattleMons[gBattlerAttacker].ability = gBattleStruct->overwrittenAbilities[gBattlerAttacker] = ABILITY_MUMMY; gLastUsedAbility = gBattleMons[gBattlerAttacker].ability = gBattleStruct->overwrittenAbilities[gBattlerAttacker] = gBattleMons[gBattlerTarget].ability;
BattleScriptPushCursor(); BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_MummyActivates; gBattlescriptCurrInstr = BattleScript_MummyActivates;
effect++; effect++;
@ -5691,6 +5808,75 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
} }
} }
break; break;
case ABILITY_SEED_SOWER:
if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
&& !gProtectStructs[gBattlerAttacker].confusionSelfDmg
&& TARGET_TURN_DAMAGED
&& IsBattlerAlive(gBattlerTarget)
&& TryChangeBattleTerrain(gBattlerTarget, STATUS_FIELD_GRASSY_TERRAIN, &gFieldTimers.terrainTimer))
{
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_SeedSowerActivates;
effect++;
}
break;
case ABILITY_THERMAL_EXCHANGE:
if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
&& TARGET_TURN_DAMAGED
&& IsBattlerAlive(gBattlerTarget)
&& CompareStat(gBattlerTarget, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN)
&& moveType == TYPE_FIRE)
{
gEffectBattler = gBattlerTarget;
SET_STATCHANGER(STAT_ATK, 1, FALSE);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaiseRet;
effect++;
}
break;
case ABILITY_ANGER_SHELL:
if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
&& !gProtectStructs[gBattlerAttacker].confusionSelfDmg
&& TARGET_TURN_DAMAGED
&& (gBattleMons[gBattlerTarget].hp <= gBattleMons[gBattlerTarget].maxHP / 2)
&& !(TestSheerForceFlag(gBattlerAttacker, gCurrentMove)))
{
gBattlerAttacker = gBattlerTarget;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_AngerShellActivates;
effect++;
}
break;
case ABILITY_WIND_POWER:
if (!(gBattleMoves[gCurrentMove].flags & FLAG_WIND_MOVE))
break;
// fall through
case ABILITY_ELECTROMORPHOSIS:
if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
&& !gProtectStructs[gBattlerAttacker].confusionSelfDmg
&& TARGET_TURN_DAMAGED
&& IsBattlerAlive(gBattlerTarget))
{
gBattlerAttacker = gBattlerTarget;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_WindPowerActivates;
effect++;
}
break;
case ABILITY_TOXIC_DEBRIS:
if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
&& !gProtectStructs[gBattlerAttacker].confusionSelfDmg
&& IS_MOVE_PHYSICAL(gCurrentMove)
&& TARGET_TURN_DAMAGED
&& !(gSideStatuses[gBattlerAttacker] & SIDE_STATUS_TOXIC_SPIKES)
&& IsBattlerAlive(gBattlerTarget))
{
gBattlerTarget = gBattlerAttacker;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_ToxicDebrisActivates;
effect++;
}
break;
} }
break; break;
case ABILITYEFFECT_MOVE_END_ATTACKER: // Same as above, but for attacker case ABILITYEFFECT_MOVE_END_ATTACKER: // Same as above, but for attacker
@ -6022,6 +6208,47 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
break; break;
} }
break; break;
case ABILITYEFFECT_ON_WEATHER: // For ability effects that activate when the battle weather changes.
battler = gBattlerAbility = gBattlerAttacker = gBattleScripting.battler;
switch (GetBattlerAbility(battler))
{
case ABILITY_FORECAST:
#if B_WEATHER_FORMS >= GEN_5
case ABILITY_FLOWER_GIFT:
#else
TRY_WEATHER_FORM:
#endif
effect = TryWeatherFormChange(battler);
if (effect != 0)
{
BattleScriptPushCursorAndCallback(BattleScript_WeatherFormChange);
*(&gBattleStruct->formToChangeInto) = effect - 1;
}
break;
case ABILITY_PROTOSYNTHESIS:
if (IsBattlerWeatherAffected(battler, B_WEATHER_SUN))
{
PREPARE_STAT_BUFFER(gBattleTextBuff1, GetHighestStatId(battler));
BattleScriptPushCursorAndCallback(BattleScript_ProtosynthesisActivates);
effect++;
}
break;
}
break;
case ABILITYEFFECT_ON_TERRAIN: // For ability effects that activate when the field terrain changes.
battler = gBattlerAbility = gBattlerAttacker = gBattleScripting.battler;
switch (GetBattlerAbility(battler))
{
case ABILITY_QUARK_DRIVE:
if (IsBattlerTerrainAffected(battler, STATUS_FIELD_ELECTRIC_TERRAIN))
{
PREPARE_STAT_BUFFER(gBattleTextBuff1, GetHighestStatId(battler));
BattleScriptPushCursorAndCallback(BattleScript_QuarkDriveActivates);
effect++;
}
break;
}
break;
} }
if (effect && gLastUsedAbility != 0xFF) if (effect && gLastUsedAbility != 0xFF)
@ -6068,6 +6295,19 @@ bool32 IsNeutralizingGasOnField(void)
return FALSE; return FALSE;
} }
bool32 IsMyceliumMightOnField(void)
{
u32 i;
for (i = 0; i < gBattlersCount; i++)
{
if (IsBattlerAlive(i) && gBattleMons[i].ability == ABILITY_MYCELIUM_MIGHT && IS_MOVE_STATUS(gCurrentMove))
return TRUE;
}
return FALSE;
}
u32 GetBattlerAbility(u8 battlerId) u32 GetBattlerAbility(u8 battlerId)
{ {
if (gStatuses3[battlerId] & STATUS3_GASTRO_ACID) if (gStatuses3[battlerId] & STATUS3_GASTRO_ACID)
@ -6076,6 +6316,9 @@ u32 GetBattlerAbility(u8 battlerId)
if (IsNeutralizingGasOnField() && !IsNeutralizingGasBannedAbility(gBattleMons[battlerId].ability)) if (IsNeutralizingGasOnField() && !IsNeutralizingGasBannedAbility(gBattleMons[battlerId].ability))
return ABILITY_NONE; return ABILITY_NONE;
if (IsMyceliumMightOnField())
return ABILITY_NONE;
if ((((gBattleMons[gBattlerAttacker].ability == ABILITY_MOLD_BREAKER if ((((gBattleMons[gBattlerAttacker].ability == ABILITY_MOLD_BREAKER
|| gBattleMons[gBattlerAttacker].ability == ABILITY_TERAVOLT || gBattleMons[gBattlerAttacker].ability == ABILITY_TERAVOLT
|| gBattleMons[gBattlerAttacker].ability == ABILITY_TURBOBLAZE) || gBattleMons[gBattlerAttacker].ability == ABILITY_TURBOBLAZE)
@ -6249,6 +6492,7 @@ bool32 CanBeBurned(u8 battlerId)
|| ability == ABILITY_WATER_VEIL || ability == ABILITY_WATER_VEIL
|| ability == ABILITY_WATER_BUBBLE || ability == ABILITY_WATER_BUBBLE
|| ability == ABILITY_COMATOSE || ability == ABILITY_COMATOSE
|| ability == ABILITY_THERMAL_EXCHANGE
|| IsAbilityStatusProtected(battlerId) || IsAbilityStatusProtected(battlerId)
|| IsBattlerTerrainAffected(battlerId, STATUS_FIELD_MISTY_TERRAIN)) || IsBattlerTerrainAffected(battlerId, STATUS_FIELD_MISTY_TERRAIN))
return FALSE; return FALSE;
@ -7981,6 +8225,11 @@ bool32 IsBattlerProtected(u8 battlerId, u16 move)
else if (gProtectStructs[battlerId].protected) else if (gProtectStructs[battlerId].protected)
return FALSE; return FALSE;
} }
if (move == MOVE_TEATIME)
{
return FALSE;
}
// Protective Pads doesn't stop Unseen Fist from bypassing Protect effects, so IsMoveMakingContact() isn't used here. // Protective Pads doesn't stop Unseen Fist from bypassing Protect effects, so IsMoveMakingContact() isn't used here.
// This means extra logic is needed to handle Shell Side Arm. // This means extra logic is needed to handle Shell Side Arm.
@ -8503,17 +8752,41 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef)
return basePower; return basePower;
} }
// Supreme Overlord adds a damage boost for each fainted ally.
// The first ally adds a x1.2 boost, and subsequent allies add an extra x0.1 boost each.
static u16 GetSupremeOverlordModifier(u8 battlerId)
{
u32 i;
u8 side = GetBattlerSide(battlerId);
struct Pokemon *party = (side == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty;
u16 modifier = UQ_4_12(1.0);
bool8 appliedFirstBoost = FALSE;
for (i = 0; i < PARTY_SIZE; i++)
{
if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE
&& !GetMonData(&party[i], MON_DATA_IS_EGG)
&& GetMonData(&party[i], MON_DATA_HP) == 0)
modifier += (!appliedFirstBoost) ? UQ_4_12(0.2) : UQ_4_12(0.1);
appliedFirstBoost = TRUE;
}
return modifier;
}
static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, bool32 updateFlags) static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, bool32 updateFlags)
{ {
u32 i, ability; u32 i;
u32 holdEffectAtk, holdEffectParamAtk; u32 holdEffectAtk, holdEffectParamAtk;
u16 basePower = CalcMoveBasePower(move, battlerAtk, battlerDef); u16 basePower = CalcMoveBasePower(move, battlerAtk, battlerDef);
u16 holdEffectModifier; u16 holdEffectModifier;
u16 modifier = UQ_4_12(1.0); u16 modifier = UQ_4_12(1.0);
u32 atkSide = GET_BATTLER_SIDE(battlerAtk); u32 atkSide = GET_BATTLER_SIDE(battlerAtk);
u16 atkAbility = GetBattlerAbility(battlerAtk);
u16 defAbility = GetBattlerAbility(battlerDef);
// attacker's abilities // attacker's abilities
switch (GetBattlerAbility(battlerAtk)) switch (atkAbility)
{ {
case ABILITY_TECHNICIAN: case ABILITY_TECHNICIAN:
if (basePower <= 60) if (basePower <= 60)
@ -8619,11 +8892,44 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe
if (IS_MOVE_PHYSICAL(move)) if (IS_MOVE_PHYSICAL(move))
MulModifier(&modifier, UQ_4_12(1.5)); MulModifier(&modifier, UQ_4_12(1.5));
break; break;
case ABILITY_ROCKY_PAYLOAD:
if (moveType == TYPE_ROCK)
MulModifier(&modifier, UQ_4_12(1.5));
break;
case ABILITY_PROTOSYNTHESIS:
{
u8 atkHighestStat = GetHighestStatId(battlerAtk);
if (gBattleWeather & B_WEATHER_SUN && WEATHER_HAS_EFFECT && (atkHighestStat == STAT_ATK || atkHighestStat == STAT_SPATK))
MulModifier(&modifier, UQ_4_12(1.3));
}
break;
case ABILITY_QUARK_DRIVE:
{
u8 atkHighestStat = GetHighestStatId(battlerAtk);
if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN && (atkHighestStat == STAT_ATK || atkHighestStat == STAT_SPATK))
MulModifier(&modifier, UQ_4_12(1.3));
}
break;
case ABILITY_ORICHALCUM_PULSE:
if (gBattleWeather & B_WEATHER_SUN && WEATHER_HAS_EFFECT)
MulModifier(&modifier, UQ_4_12(1.3));
break;
case ABILITY_HADRON_ENGINE:
if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN)
MulModifier(&modifier, UQ_4_12(1.3));
break;
case ABILITY_SHARPNESS:
if (gBattleMoves[move].flags & FLAG_SLICING_MOVE)
MulModifier(&modifier, UQ_4_12(1.5));
break;
case ABILITY_SUPREME_OVERLORD:
MulModifier(&modifier, GetSupremeOverlordModifier(battlerAtk));
break;
} }
// field abilities // field abilities
if ((IsAbilityOnField(ABILITY_DARK_AURA) && moveType == TYPE_DARK) if ((IsAbilityOnField(ABILITY_DARK_AURA) && moveType == TYPE_DARK)
|| (IsAbilityOnField(ABILITY_FAIRY_AURA) && moveType == TYPE_FAIRY)) || (IsAbilityOnField(ABILITY_FAIRY_AURA) && moveType == TYPE_FAIRY))
{ {
if (IsAbilityOnField(ABILITY_AURA_BREAK)) if (IsAbilityOnField(ABILITY_AURA_BREAK))
MulModifier(&modifier, UQ_4_12(0.75)); MulModifier(&modifier, UQ_4_12(0.75));
@ -8631,6 +8937,18 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe
MulModifier(&modifier, UQ_4_12(1.33)); MulModifier(&modifier, UQ_4_12(1.33));
} }
if (IsAbilityOnField(ABILITY_VESSEL_OF_RUIN) && atkAbility != ABILITY_VESSEL_OF_RUIN && IS_MOVE_SPECIAL(gCurrentMove))
MulModifier(&modifier, UQ_4_12(0.25));
if (IsAbilityOnField(ABILITY_SWORD_OF_RUIN) && defAbility != ABILITY_SWORD_OF_RUIN && IS_MOVE_PHYSICAL(gCurrentMove))
MulModifier(&modifier, UQ_4_12(0.25));
if (IsAbilityOnField(ABILITY_TABLETS_OF_RUIN) && atkAbility != ABILITY_TABLETS_OF_RUIN && IS_MOVE_PHYSICAL(gCurrentMove))
MulModifier(&modifier, UQ_4_12(0.25));
if (IsAbilityOnField(ABILITY_BEADS_OF_RUIN) && defAbility != ABILITY_BEADS_OF_RUIN && IS_MOVE_SPECIAL(gCurrentMove))
MulModifier(&modifier, UQ_4_12(0.25));
// attacker partner's abilities // attacker partner's abilities
if (IsBattlerAlive(BATTLE_PARTNER(battlerAtk))) if (IsBattlerAlive(BATTLE_PARTNER(battlerAtk)))
{ {
@ -8651,8 +8969,7 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe
} }
// target's abilities // target's abilities
ability = GetBattlerAbility(battlerDef); switch (defAbility)
switch (ability)
{ {
case ABILITY_HEATPROOF: case ABILITY_HEATPROOF:
case ABILITY_WATER_BUBBLE: case ABILITY_WATER_BUBBLE:
@ -8660,7 +8977,7 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe
{ {
MulModifier(&modifier, UQ_4_12(0.5)); MulModifier(&modifier, UQ_4_12(0.5));
if (updateFlags) if (updateFlags)
RecordAbilityBattle(battlerDef, ability); RecordAbilityBattle(battlerDef, defAbility);
} }
break; break;
case ABILITY_DRY_SKIN: case ABILITY_DRY_SKIN:
@ -8672,11 +8989,25 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe
{ {
MulModifier(&modifier, UQ_4_12(0.5)); MulModifier(&modifier, UQ_4_12(0.5));
if (updateFlags) if (updateFlags)
RecordAbilityBattle(battlerDef, ability); RecordAbilityBattle(battlerDef, defAbility);
} }
if (moveType == TYPE_FIRE) if (moveType == TYPE_FIRE)
MulModifier(&modifier, UQ_4_12(2.0)); MulModifier(&modifier, UQ_4_12(2.0));
break; break;
case ABILITY_PROTOSYNTHESIS:
{
u8 defHighestStat = GetHighestStatId(battlerDef);
if (gBattleWeather & B_WEATHER_SUN && WEATHER_HAS_EFFECT && (defHighestStat == STAT_DEF || defHighestStat == STAT_SPDEF))
MulModifier(&modifier, UQ_4_12(0.7));
}
break;
case ABILITY_QUARK_DRIVE:
{
u8 defHighestStat = GetHighestStatId(battlerDef);
if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN && (defHighestStat == STAT_DEF || defHighestStat == STAT_SPDEF))
MulModifier(&modifier, UQ_4_12(0.7));
}
break;
} }
holdEffectAtk = GetBattlerHoldEffect(battlerAtk, TRUE); holdEffectAtk = GetBattlerHoldEffect(battlerAtk, TRUE);
@ -8803,7 +9134,7 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe
#define TERRAIN_TYPE_BOOST UQ_4_12(1.5) #define TERRAIN_TYPE_BOOST UQ_4_12(1.5)
#endif #endif
// various effecs // various effects
if (gProtectStructs[battlerAtk].helpingHand) if (gProtectStructs[battlerAtk].helpingHand)
MulModifier(&modifier, UQ_4_12(1.5)); MulModifier(&modifier, UQ_4_12(1.5));
if (gStatuses3[battlerAtk] & STATUS3_CHARGED_UP && moveType == TYPE_ELECTRIC) if (gStatuses3[battlerAtk] & STATUS3_CHARGED_UP && moveType == TYPE_ELECTRIC)
@ -9133,6 +9464,10 @@ static u32 CalcDefenseStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType,
if (gBattleMoves[move].flags & FLAG_SOUND) if (gBattleMoves[move].flags & FLAG_SOUND)
MulModifier(&modifier, UQ_4_12(2.0)); MulModifier(&modifier, UQ_4_12(2.0));
break; break;
case ABILITY_PURIFYING_SALT:
if (gBattleMoves[move].type == TYPE_GHOST)
MulModifier(&modifier, UQ_4_12(2.0));
break;
} }
// ally's abilities // ally's abilities
@ -9600,11 +9935,8 @@ u16 GetTypeModifier(u8 atkType, u8 defType)
return sTypeEffectivenessTable[atkType][defType]; return sTypeEffectivenessTable[atkType][defType];
} }
s32 GetStealthHazardDamage(u8 hazardType, u8 battlerId) s32 GetStealthHazardDamageByTypesAndHP(u8 hazardType, u8 type1, u8 type2, u32 maxHp)
{ {
u8 type1 = gBattleMons[battlerId].type1;
u8 type2 = gBattleMons[battlerId].type2;
u32 maxHp = gBattleMons[battlerId].maxHP;
s32 dmg = 0; s32 dmg = 0;
u16 modifier = UQ_4_12(1.0); u16 modifier = UQ_4_12(1.0);
@ -9647,6 +9979,15 @@ s32 GetStealthHazardDamage(u8 hazardType, u8 battlerId)
return dmg; return dmg;
} }
s32 GetStealthHazardDamage(u8 hazardType, u8 battlerId)
{
u8 type1 = gBattleMons[battlerId].type1;
u8 type2 = gBattleMons[battlerId].type2;
u32 maxHp = gBattleMons[battlerId].maxHP;
return GetStealthHazardDamageByTypesAndHP(hazardType, type1, type2, maxHp);
}
bool32 IsPartnerMonFromSameTrainer(u8 battlerId) bool32 IsPartnerMonFromSameTrainer(u8 battlerId)
{ {
if (GetBattlerSide(battlerId) == B_SIDE_OPPONENT && gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) if (GetBattlerSide(battlerId) == B_SIDE_OPPONENT && gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)

View File

@ -1450,6 +1450,7 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] =
{gBattleAnimSpriteGfx_OmegaSymbol, 0x0200, ANIM_TAG_OMEGA_SYMBOL}, {gBattleAnimSpriteGfx_OmegaSymbol, 0x0200, ANIM_TAG_OMEGA_SYMBOL},
{gBattleAnimSpriteGfx_Orbs, 0x0180, ANIM_TAG_STEEL_BEAM}, {gBattleAnimSpriteGfx_Orbs, 0x0180, ANIM_TAG_STEEL_BEAM},
{gBattleAnimSpriteGfx_AuraSphere, 0x200, ANIM_TAG_POLTERGEIST}, {gBattleAnimSpriteGfx_AuraSphere, 0x200, ANIM_TAG_POLTERGEIST},
{gBattleAnimSpriteGfx_Teapot, 0x1800, ANIM_TAG_TEAPOT},
}; };
const struct CompressedSpritePalette gBattleAnimPaletteTable[] = const struct CompressedSpritePalette gBattleAnimPaletteTable[] =
@ -1900,6 +1901,7 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] =
{gBattleAnimSpritePal_OmegaSymbol, ANIM_TAG_OMEGA_SYMBOL}, {gBattleAnimSpritePal_OmegaSymbol, ANIM_TAG_OMEGA_SYMBOL},
{gBattleAnimSpritePal_SteelBeam, ANIM_TAG_STEEL_BEAM}, {gBattleAnimSpritePal_SteelBeam, ANIM_TAG_STEEL_BEAM},
{gBattleAnimSpritePal_Poltergeist, ANIM_TAG_POLTERGEIST}, {gBattleAnimSpritePal_Poltergeist, ANIM_TAG_POLTERGEIST},
{gBattleAnimSpritePal_Teapot, ANIM_TAG_TEAPOT},
}; };
const struct BattleAnimBackground gBattleAnimBackgroundTable[] = const struct BattleAnimBackground gBattleAnimBackgroundTable[] =

View File

@ -256,7 +256,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
.secondaryEffectChance = 0, .secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED, .target = MOVE_TARGET_SELECTED,
.priority = 0, .priority = 0,
.flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_SLICING_MOVE,
.split = SPLIT_PHYSICAL, .split = SPLIT_PHYSICAL,
.zMovePower = 100, .zMovePower = 100,
.zMoveEffect = Z_EFFECT_NONE, .zMoveEffect = Z_EFFECT_NONE,
@ -272,7 +272,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
.secondaryEffectChance = 0, .secondaryEffectChance = 0,
.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_DMG_2X_IN_AIR, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_DMG_2X_IN_AIR | FLAG_WIND_MOVE,
.split = SPLIT_SPECIAL, .split = SPLIT_SPECIAL,
.zMovePower = 100, .zMovePower = 100,
.zMoveEffect = Z_EFFECT_NONE, .zMoveEffect = Z_EFFECT_NONE,
@ -298,7 +298,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
{ {
#if B_UPDATED_MOVE_DATA >= GEN_6 #if B_UPDATED_MOVE_DATA >= GEN_6
.accuracy = 0, .accuracy = 0,
.flags = FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, .flags = FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_WIND_MOVE,
#elif B_UPDATED_MOVE_DATA == GEN_5 #elif B_UPDATED_MOVE_DATA == GEN_5
.accuracy = 100, .accuracy = 100,
.flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
@ -1073,7 +1073,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
.secondaryEffectChance = 10, .secondaryEffectChance = 10,
.target = MOVE_TARGET_BOTH, .target = MOVE_TARGET_BOTH,
.priority = 0, .priority = 0,
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_WIND_MOVE,
.split = SPLIT_SPECIAL, .split = SPLIT_SPECIAL,
.zMoveEffect = Z_EFFECT_NONE, .zMoveEffect = Z_EFFECT_NONE,
}, },
@ -1354,7 +1354,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
.secondaryEffectChance = 0, .secondaryEffectChance = 0,
.target = MOVE_TARGET_BOTH, .target = MOVE_TARGET_BOTH,
.priority = 0, .priority = 0,
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_HIGH_CRIT, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_HIGH_CRIT | FLAG_SLICING_MOVE,
.split = SPLIT_PHYSICAL, .split = SPLIT_PHYSICAL,
.zMovePower = 100, .zMovePower = 100,
.zMoveEffect = Z_EFFECT_NONE, .zMoveEffect = Z_EFFECT_NONE,
@ -2932,7 +2932,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
.secondaryEffectChance = 0, .secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED, .target = MOVE_TARGET_SELECTED,
.priority = 0, .priority = 0,
.flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_HIGH_CRIT, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_HIGH_CRIT | FLAG_SLICING_MOVE,
.split = SPLIT_PHYSICAL, .split = SPLIT_PHYSICAL,
.zMovePower = 140, .zMovePower = 140,
.zMoveEffect = Z_EFFECT_NONE, .zMoveEffect = Z_EFFECT_NONE,
@ -3541,7 +3541,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
.secondaryEffectChance = 100, .secondaryEffectChance = 100,
.target = MOVE_TARGET_BOTH, .target = MOVE_TARGET_BOTH,
.priority = 0, .priority = 0,
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_WIND_MOVE,
.split = SPLIT_SPECIAL, .split = SPLIT_SPECIAL,
.zMovePower = 100, .zMovePower = 100,
.zMoveEffect = Z_EFFECT_NONE, .zMoveEffect = Z_EFFECT_NONE,
@ -3643,7 +3643,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
.secondaryEffectChance = 0, .secondaryEffectChance = 0,
.target = MOVE_TARGET_ALL_BATTLERS, .target = MOVE_TARGET_ALL_BATTLERS,
.priority = 0, .priority = 0,
.flags = 0, .flags = FLAG_WIND_MOVE,
.split = SPLIT_STATUS, .split = SPLIT_STATUS,
.zMovePower = 0, .zMovePower = 0,
.zMoveEffect = Z_EFFECT_SPD_UP_1, .zMoveEffect = Z_EFFECT_SPD_UP_1,
@ -3819,7 +3819,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
.secondaryEffectChance = 0, .secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED, .target = MOVE_TARGET_SELECTED,
.priority = 0, .priority = 0,
.flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_SLICING_MOVE,
.split = SPLIT_PHYSICAL, .split = SPLIT_PHYSICAL,
.zMovePower = 100, .zMovePower = 100,
.zMoveEffect = Z_EFFECT_NONE, .zMoveEffect = Z_EFFECT_NONE,
@ -4304,7 +4304,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
[MOVE_TWISTER] = [MOVE_TWISTER] =
{ {
#if B_UPDATED_MOVE_DATA >= GEN_5 #if B_UPDATED_MOVE_DATA >= GEN_5
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_DMG_2X_IN_AIR, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_DMG_2X_IN_AIR | FLAG_WIND_MOVE,
#else #else
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_DMG_2X_IN_AIR, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_DMG_2X_IN_AIR,
#endif #endif
@ -4677,7 +4677,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
.secondaryEffectChance = 10, .secondaryEffectChance = 10,
.target = MOVE_TARGET_BOTH, .target = MOVE_TARGET_BOTH,
.priority = 0, .priority = 0,
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_WIND_MOVE,
.split = SPLIT_SPECIAL, .split = SPLIT_SPECIAL,
.zMoveEffect = Z_EFFECT_NONE, .zMoveEffect = Z_EFFECT_NONE,
}, },
@ -5674,7 +5674,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
.secondaryEffectChance = 0, .secondaryEffectChance = 0,
.target = MOVE_TARGET_BOTH, .target = MOVE_TARGET_BOTH,
.priority = 0, .priority = 0,
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_HIGH_CRIT, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_HIGH_CRIT | FLAG_SLICING_MOVE | FLAG_WIND_MOVE,
.split = SPLIT_SPECIAL, .split = SPLIT_SPECIAL,
.zMoveEffect = Z_EFFECT_NONE, .zMoveEffect = Z_EFFECT_NONE,
}, },
@ -6007,7 +6007,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
.secondaryEffectChance = 0, .secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED, .target = MOVE_TARGET_SELECTED,
.priority = 0, .priority = 0,
.flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_SLICING_MOVE,
.split = SPLIT_PHYSICAL, .split = SPLIT_PHYSICAL,
.zMovePower = 120, .zMovePower = 120,
.zMoveEffect = Z_EFFECT_NONE, .zMoveEffect = Z_EFFECT_NONE,
@ -6304,7 +6304,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
.secondaryEffectChance = 0, .secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED, .target = MOVE_TARGET_SELECTED,
.priority = 0, .priority = 0,
.flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_HIGH_CRIT, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_HIGH_CRIT | FLAG_SLICING_MOVE,
.split = SPLIT_PHYSICAL, .split = SPLIT_PHYSICAL,
.zMoveEffect = Z_EFFECT_NONE, .zMoveEffect = Z_EFFECT_NONE,
}, },
@ -6635,7 +6635,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
.secondaryEffectChance = 0, .secondaryEffectChance = 0,
.target = MOVE_TARGET_USER, .target = MOVE_TARGET_USER,
.priority = 0, .priority = 0,
.flags = FLAG_SNATCH_AFFECTED, .flags = FLAG_SNATCH_AFFECTED | FLAG_WIND_MOVE,
.split = SPLIT_STATUS, .split = SPLIT_STATUS,
.zMovePower = 0, .zMovePower = 0,
.zMoveEffect = Z_EFFECT_BOOST_CRITS, .zMoveEffect = Z_EFFECT_BOOST_CRITS,
@ -7239,7 +7239,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
.secondaryEffectChance = 0, .secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED, .target = MOVE_TARGET_SELECTED,
.priority = 0, .priority = 0,
.flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_HIGH_CRIT, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_HIGH_CRIT | FLAG_SLICING_MOVE,
.split = SPLIT_PHYSICAL, .split = SPLIT_PHYSICAL,
.zMovePower = 140, .zMovePower = 140,
.zMoveEffect = Z_EFFECT_NONE, .zMoveEffect = Z_EFFECT_NONE,
@ -7281,7 +7281,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
{ {
#if B_UPDATED_MOVE_DATA >= GEN_6 #if B_UPDATED_MOVE_DATA >= GEN_6
.pp = 15, .pp = 15,
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_SLICING_MOVE,
#elif B_UPDATED_MOVE_DATA == GEN_5 #elif B_UPDATED_MOVE_DATA == GEN_5
.pp = 20, .pp = 20,
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST,
@ -7311,7 +7311,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
.secondaryEffectChance = 0, .secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED, .target = MOVE_TARGET_SELECTED,
.priority = 0, .priority = 0,
.flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_SLICING_MOVE,
.split = SPLIT_PHYSICAL, .split = SPLIT_PHYSICAL,
.zMovePower = 160, .zMovePower = 160,
.zMoveEffect = Z_EFFECT_NONE, .zMoveEffect = Z_EFFECT_NONE,
@ -7721,7 +7721,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
.secondaryEffectChance = 0, .secondaryEffectChance = 0,
.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_HIGH_CRIT, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_HIGH_CRIT | FLAG_SLICING_MOVE,
.split = SPLIT_PHYSICAL, .split = SPLIT_PHYSICAL,
.zMovePower = 140, .zMovePower = 140,
.zMoveEffect = Z_EFFECT_NONE, .zMoveEffect = Z_EFFECT_NONE,
@ -7943,7 +7943,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
.secondaryEffectChance = 10, .secondaryEffectChance = 10,
.target = MOVE_TARGET_SELECTED, .target = MOVE_TARGET_SELECTED,
.priority = 0, .priority = 0,
.flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_HIGH_CRIT | FLAG_SHEER_FORCE_BOOST, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_HIGH_CRIT | FLAG_SHEER_FORCE_BOOST | FLAG_SLICING_MOVE,
.split = SPLIT_PHYSICAL, .split = SPLIT_PHYSICAL,
.zMovePower = 140, .zMovePower = 140,
.zMoveEffect = Z_EFFECT_NONE, .zMoveEffect = Z_EFFECT_NONE,
@ -9559,7 +9559,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
.secondaryEffectChance = 0, .secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED, .target = MOVE_TARGET_SELECTED,
.priority = 0, .priority = 0,
.flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_STAT_STAGES_IGNORED, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_STAT_STAGES_IGNORED | FLAG_SLICING_MOVE,
.split = SPLIT_PHYSICAL, .split = SPLIT_PHYSICAL,
.zMovePower = 175, .zMovePower = 175,
.zMoveEffect = Z_EFFECT_NONE, .zMoveEffect = Z_EFFECT_NONE,
@ -9575,7 +9575,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
.secondaryEffectChance = 50, .secondaryEffectChance = 50,
.target = MOVE_TARGET_SELECTED, .target = MOVE_TARGET_SELECTED,
.priority = 0, .priority = 0,
.flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_SLICING_MOVE,
.split = SPLIT_PHYSICAL, .split = SPLIT_PHYSICAL,
.zMovePower = 140, .zMovePower = 140,
.zMoveEffect = Z_EFFECT_NONE, .zMoveEffect = Z_EFFECT_NONE,
@ -9713,7 +9713,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
.secondaryEffectChance = 30, .secondaryEffectChance = 30,
.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 | FLAG_DMG_IN_AIR, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_DMG_IN_AIR | FLAG_WIND_MOVE,
.split = SPLIT_SPECIAL, .split = SPLIT_SPECIAL,
.zMoveEffect = Z_EFFECT_NONE, .zMoveEffect = Z_EFFECT_NONE,
}, },
@ -10223,7 +10223,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
.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_WIND_MOVE,
.split = SPLIT_PHYSICAL, .split = SPLIT_PHYSICAL,
.zMovePower = 175, .zMovePower = 175,
.zMoveEffect = Z_EFFECT_NONE, .zMoveEffect = Z_EFFECT_NONE,
@ -10422,7 +10422,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
.secondaryEffectChance = 0, .secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED, .target = MOVE_TARGET_SELECTED,
.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_WIND_MOVE,
.split = SPLIT_SPECIAL, .split = SPLIT_SPECIAL,
.zMovePower = 100, .zMovePower = 100,
.zMoveEffect = Z_EFFECT_NONE, .zMoveEffect = Z_EFFECT_NONE,
@ -11208,7 +11208,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
.secondaryEffectChance = 0, .secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED, .target = MOVE_TARGET_SELECTED,
.priority = 0, .priority = 0,
.flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_SLICING_MOVE,
.split = SPLIT_PHYSICAL, .split = SPLIT_PHYSICAL,
.zMovePower = 190, .zMovePower = 190,
.zMoveEffect = Z_EFFECT_NONE, .zMoveEffect = Z_EFFECT_NONE,
@ -12351,13 +12351,13 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
[MOVE_TEATIME] = [MOVE_TEATIME] =
{ {
.effect = EFFECT_PLACEHOLDER, //TODO .effect = EFFECT_TEATIME,
.power = 0, .power = 0,
.type = TYPE_NORMAL, .type = TYPE_NORMAL,
.accuracy = 0, .accuracy = 0,
.pp = 10, .pp = 10,
.secondaryEffectChance = 0, .secondaryEffectChance = 0,
.target = MOVE_TARGET_ALL_BATTLERS, .target = MOVE_TARGET_USER,
.priority = 0, .priority = 0,
.flags = 0, .flags = 0,
.split = SPLIT_STATUS, .split = SPLIT_STATUS,
@ -12535,7 +12535,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
.secondaryEffectChance = 0, .secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED, .target = MOVE_TARGET_SELECTED,
.priority = 0, .priority = 0,
.flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_SLICING_MOVE,
.split = SPLIT_PHYSICAL, .split = SPLIT_PHYSICAL,
.zMovePower = 180, .zMovePower = 180,
.zMoveEffect = Z_EFFECT_NONE, .zMoveEffect = Z_EFFECT_NONE,
@ -13334,7 +13334,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
.secondaryEffectChance = 0, .secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED, .target = MOVE_TARGET_SELECTED,
.priority = 0, .priority = 0,
.flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_SLICING_MOVE,
.split = SPLIT_PHYSICAL, .split = SPLIT_PHYSICAL,
.zMovePower = 120, .zMovePower = 120,
.zMoveEffect = Z_EFFECT_NONE, .zMoveEffect = Z_EFFECT_NONE,
@ -13354,7 +13354,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
.secondaryEffectChance = 30, .secondaryEffectChance = 30,
.target = MOVE_TARGET_SELECTED, .target = MOVE_TARGET_SELECTED,
.priority = 0, .priority = 0,
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_WIND_MOVE,
.split = SPLIT_SPECIAL, .split = SPLIT_SPECIAL,
.zMovePower = 175, .zMovePower = 175,
.zMoveEffect = Z_EFFECT_NONE, .zMoveEffect = Z_EFFECT_NONE,
@ -13610,7 +13610,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
.secondaryEffectChance = 0, .secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED, .target = MOVE_TARGET_SELECTED,
.priority = 0, .priority = 0,
.flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_SLICING_MOVE,
.split = SPLIT_PHYSICAL, .split = SPLIT_PHYSICAL,
.zMovePower = 120, .zMovePower = 120,
.zMoveEffect = Z_EFFECT_NONE, .zMoveEffect = Z_EFFECT_NONE,
@ -13631,7 +13631,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
.secondaryEffectChance = 30, .secondaryEffectChance = 30,
.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 | FLAG_WIND_MOVE,
.split = SPLIT_SPECIAL, .split = SPLIT_SPECIAL,
.zMovePower = 175, .zMovePower = 175,
.zMoveEffect = Z_EFFECT_NONE, .zMoveEffect = Z_EFFECT_NONE,
@ -13652,7 +13652,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
.secondaryEffectChance = 20, .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 | FLAG_WIND_MOVE,
.split = SPLIT_SPECIAL, .split = SPLIT_SPECIAL,
.zMovePower = 175, .zMovePower = 175,
.zMoveEffect = Z_EFFECT_NONE, .zMoveEffect = Z_EFFECT_NONE,
@ -13673,7 +13673,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
.secondaryEffectChance = 20, .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 | FLAG_WIND_MOVE,
.split = SPLIT_SPECIAL, .split = SPLIT_SPECIAL,
.zMovePower = 175, .zMovePower = 175,
.zMoveEffect = Z_EFFECT_NONE, .zMoveEffect = Z_EFFECT_NONE,
@ -13876,7 +13876,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
[MOVE_ICE_SPINNER] = [MOVE_ICE_SPINNER] =
{ {
.effect = EFFECT_DAMAGE_SET_TERRAIN, .effect = EFFECT_HIT_SET_REMOVE_TERRAIN,
.power = 80, .power = 80,
.type = TYPE_ICE, .type = TYPE_ICE,
.accuracy = 100, .accuracy = 100,
@ -13888,7 +13888,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
.split = SPLIT_PHYSICAL, .split = SPLIT_PHYSICAL,
.zMovePower = 160, .zMovePower = 160,
.zMoveEffect = Z_EFFECT_NONE, .zMoveEffect = Z_EFFECT_NONE,
.argument = 1, //remove terrain .argument = 1, // Remove the active field terrain if there is one.
}, },
[MOVE_GLAIVE_RUSH] = [MOVE_GLAIVE_RUSH] =
@ -14843,7 +14843,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
}, },
[MOVE_GENESIS_SUPERNOVA] = [MOVE_GENESIS_SUPERNOVA] =
{ {
.effect = EFFECT_DAMAGE_SET_TERRAIN, .effect = EFFECT_HIT_SET_REMOVE_TERRAIN,
.power = 185, .power = 185,
.type = TYPE_PSYCHIC, .type = TYPE_PSYCHIC,
.accuracy = 0, .accuracy = 0,
@ -14854,7 +14854,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
.flags = 0, .flags = 0,
.zMovePower = 0, .zMovePower = 0,
.split = SPLIT_SPECIAL, .split = SPLIT_SPECIAL,
.argument = 0, //psychic terrain .argument = 0, // Set Psychic Terrain. If there's a different field terrain active, overwrite it.
.zMoveEffect = 0 .zMoveEffect = 0
}, },
[MOVE_SINISTER_ARROW_RAID] = [MOVE_SINISTER_ARROW_RAID] =
@ -14904,7 +14904,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
}, },
[MOVE_SPLINTERED_STORMSHARDS] = [MOVE_SPLINTERED_STORMSHARDS] =
{ {
.effect = EFFECT_DAMAGE_SET_TERRAIN, .effect = EFFECT_HIT_SET_REMOVE_TERRAIN,
.power = 190, .power = 190,
.type = TYPE_ROCK, .type = TYPE_ROCK,
.accuracy = 0, .accuracy = 0,
@ -14915,7 +14915,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
.flags = 0, .flags = 0,
.zMovePower = 0, .zMovePower = 0,
.split = SPLIT_PHYSICAL, .split = SPLIT_PHYSICAL,
.argument = 1, //remove terrain .argument = 1, // Remove the active field terrain if there is one.
.zMoveEffect = 0 .zMoveEffect = 0
}, },
[MOVE_LETS_SNUGGLE_FOREVER] = [MOVE_LETS_SNUGGLE_FOREVER] =

View File

@ -254,6 +254,37 @@ static const u8 sChillingNeighDescription[] = _("KOs boost Attack stat.");
static const u8 sGrimNeighDescription[] = _("KOs boost Sp. Atk stat."); static const u8 sGrimNeighDescription[] = _("KOs boost Sp. Atk stat.");
static const u8 sAsOneIceRiderDescription[] = _("Unnerve and Chilling Neigh."); static const u8 sAsOneIceRiderDescription[] = _("Unnerve and Chilling Neigh.");
static const u8 sAsOneShadowRiderDescription[] = _("Unnerve and Grim Neigh."); static const u8 sAsOneShadowRiderDescription[] = _("Unnerve and Grim Neigh.");
static const u8 sLingeringAromaDescription[] = _("Spreads with contact.");
static const u8 sSeedSowerDescription[] = _("Affects terrain when hit.");
static const u8 sThermalExchangeDescription[] = _("Fire hits up Attack.");
static const u8 sAngerShellDescription[] = _("Gets angry at half HP.");
static const u8 sPurifyingSaltDescription[] = _("Protected by pure salts.");
static const u8 sWellBakedBodyDescription[] = _("Strengthened by Fire.");
static const u8 sWindRiderDescription[] = _("Ups Attack if hit by wind.");
static const u8 sGuardDogDescription[] = _("Cannot be intimidated.");
static const u8 sRockyPayloadDescription[] = _("Powers up Rock moves.");
static const u8 sWindPowerDescription[] = _("Gets charged by wind.");
static const u8 sZeroToHeroDescription[] = _("Changes form on switch out.");
static const u8 sCommanderDescription[] = _("Commands from Dondozo.");
static const u8 sElectromorphosisDescription[] = _("Gets Charged on contact.");
static const u8 sProtosynthesisDescription[] = _("Sun boosts best stat.");
static const u8 sQuarkDriveDescription[] = _("Elec. field ups best stat.");
static const u8 sGoodAsGoldDescription[] = _("Avoids status problems.");
static const u8 sVesselOfRuinDescription[] = _("Lowers foes' sp. damage.");
static const u8 sSwordOfRuinDescription[] = _("Lowers foes' defense.");
static const u8 sTabletsOfRuinDescription[] = _("Lowers foes' damage.");
static const u8 sBeadsOfRuinDescription[] = _("Lowers foes' sp. defense.");
static const u8 sOrichalcumPulseDescription[] = _("Summons sunlight in battle.");
static const u8 sHadronEngineDescription[] = _("Field becomes Electric.");
static const u8 sOpportunistDescription[] = _("Copies foe's stat change.");
static const u8 sCudChewDescription[] = _("Eats a used berry again.");
static const u8 sSharpnessDescription[] = _("Strengthens cutting moves.");
static const u8 sSupremeOverlordDescription[] = _("Inherits fallen's strength.");
static const u8 sCostarDescription[] = _("Copies ally's stat changes.");
static const u8 sToxicDebrisDescription[] = _("Throws poison spikes if hit.");
static const u8 sArmorTailDescription[] = _("Protects from priority.");
static const u8 sEarthEaterDescription[] = _("Eats ground to heal HP.");
static const u8 sMyceliumMightDescription[] = _("Status moves never fail.");
#if B_EXPANDED_ABILITY_NAMES == TRUE #if B_EXPANDED_ABILITY_NAMES == TRUE
const u8 gAbilityNames[ABILITIES_COUNT][ABILITY_NAME_LENGTH + 1] = const u8 gAbilityNames[ABILITIES_COUNT][ABILITY_NAME_LENGTH + 1] =
@ -526,6 +557,37 @@ const u8 gAbilityNames[ABILITIES_COUNT][ABILITY_NAME_LENGTH + 1] =
[ABILITY_GRIM_NEIGH] = _("Grim Neigh"), [ABILITY_GRIM_NEIGH] = _("Grim Neigh"),
[ABILITY_AS_ONE_ICE_RIDER] = _("As One"), [ABILITY_AS_ONE_ICE_RIDER] = _("As One"),
[ABILITY_AS_ONE_SHADOW_RIDER] = _("As One"), [ABILITY_AS_ONE_SHADOW_RIDER] = _("As One"),
[ABILITY_LINGERING_AROMA] = _("Lingering Aroma"),
[ABILITY_SEED_SOWER] = _("Seed Sower"),
[ABILITY_THERMAL_EXCHANGE] = _("Thermal Exchange"),
[ABILITY_ANGER_SHELL] = _("Anger Shell"),
[ABILITY_PURIFYING_SALT] = _("Purifying Salt"),
[ABILITY_WELL_BAKED_BODY] = _("Well-Baked Body"),
[ABILITY_WIND_RIDER] = _("Wind Rider"),
[ABILITY_GUARD_DOG] = _("Guard Dog"),
[ABILITY_ROCKY_PAYLOAD] = _("Rocky Payload"),
[ABILITY_WIND_POWER] = _("Wind Power"),
[ABILITY_ZERO_TO_HERO] = _("Zero to Hero"),
[ABILITY_COMMANDER] = _("Commander"),
[ABILITY_ELECTROMORPHOSIS] = _("Electromorphosis"),
[ABILITY_PROTOSYNTHESIS] = _("Protosynthesis"),
[ABILITY_QUARK_DRIVE] = _("Quark Drive"),
[ABILITY_GOOD_AS_GOLD] = _("Good as Gold"),
[ABILITY_VESSEL_OF_RUIN] = _("Vessel of Ruin"),
[ABILITY_SWORD_OF_RUIN] = _("Sword of Ruin"),
[ABILITY_TABLETS_OF_RUIN] = _("Tablets of Ruin"),
[ABILITY_BEADS_OF_RUIN] = _("Beads of Ruin"),
[ABILITY_ORICHALCUM_PULSE] = _("Orichalcum Pulse"),
[ABILITY_HADRON_ENGINE] = _("Hadron Engine"),
[ABILITY_OPPORTUNIST] = _("Opportunist"),
[ABILITY_CUD_CHEW] = _("Cud Chew"),
[ABILITY_SHARPNESS] = _("Sharpness"),
[ABILITY_SUPREME_OVERLORD] = _("Supreme Overlord"),
[ABILITY_COSTAR] = _("Costar"),
[ABILITY_TOXIC_DEBRIS] = _("Toxic Debris"),
[ABILITY_ARMOR_TAIL] = _("Armor Tail"),
[ABILITY_EARTH_EATER] = _("Earth Eater"),
[ABILITY_MYCELIUM_MIGHT] = _("Mycelium Might"),
}; };
#else // 12 characters #else // 12 characters
const u8 gAbilityNames[ABILITIES_COUNT][ABILITY_NAME_LENGTH + 1] = const u8 gAbilityNames[ABILITIES_COUNT][ABILITY_NAME_LENGTH + 1] =
@ -798,6 +860,37 @@ const u8 gAbilityNames[ABILITIES_COUNT][ABILITY_NAME_LENGTH + 1] =
[ABILITY_GRIM_NEIGH] = _("Grim Neigh"), [ABILITY_GRIM_NEIGH] = _("Grim Neigh"),
[ABILITY_AS_ONE_ICE_RIDER] = _("As One"), [ABILITY_AS_ONE_ICE_RIDER] = _("As One"),
[ABILITY_AS_ONE_SHADOW_RIDER] = _("As One"), [ABILITY_AS_ONE_SHADOW_RIDER] = _("As One"),
[ABILITY_LINGERING_AROMA] = _("LngerngAroma"),
[ABILITY_SEED_SOWER] = _("Seed Sower"),
[ABILITY_THERMAL_EXCHANGE] = _("ThrmlExchnge"),
[ABILITY_ANGER_SHELL] = _("Anger Shell"),
[ABILITY_PURIFYING_SALT] = _("PurfyingSalt"),
[ABILITY_WELL_BAKED_BODY] = _("WellBakedBdy"),
[ABILITY_WIND_RIDER] = _("Wind Rider"),
[ABILITY_GUARD_DOG] = _("Guard Dog"),
[ABILITY_ROCKY_PAYLOAD] = _("RockyPayload"),
[ABILITY_WIND_POWER] = _("Wind Power"),
[ABILITY_ZERO_TO_HERO] = _("Zero to Hero"),
[ABILITY_COMMANDER] = _("Commander"),
[ABILITY_ELECTROMORPHOSIS] = _("Elecmrphosis"),
[ABILITY_PROTOSYNTHESIS] = _("Protosnthsis"),
[ABILITY_QUARK_DRIVE] = _("Quark Drive"),
[ABILITY_GOOD_AS_GOLD] = _("Good as Gold"),
[ABILITY_VESSEL_OF_RUIN] = _("VesselOfRuin"),
[ABILITY_SWORD_OF_RUIN] = _("SwordOfRuin"),
[ABILITY_TABLETS_OF_RUIN] = _("TabltsOfRuin"),
[ABILITY_BEADS_OF_RUIN] = _("BeadsOfRuin"),
[ABILITY_ORICHALCUM_PULSE] = _("OrchlcumPlse"),
[ABILITY_HADRON_ENGINE] = _("HadronEngine"),
[ABILITY_OPPORTUNIST] = _("Opportunist"),
[ABILITY_CUD_CHEW] = _("Cud Chew"),
[ABILITY_SHARPNESS] = _("Sharpness"),
[ABILITY_SUPREME_OVERLORD] = _("SuprmeOvrlrd"),
[ABILITY_COSTAR] = _("Costar"),
[ABILITY_TOXIC_DEBRIS] = _("Toxic Debris"),
[ABILITY_ARMOR_TAIL] = _("Armor Tail"),
[ABILITY_EARTH_EATER] = _("Earth Eater"),
[ABILITY_MYCELIUM_MIGHT] = _("MceliumMight"),
}; };
#endif #endif
@ -1071,4 +1164,35 @@ const u8 *const gAbilityDescriptionPointers[ABILITIES_COUNT] =
[ABILITY_GRIM_NEIGH] = sGrimNeighDescription, [ABILITY_GRIM_NEIGH] = sGrimNeighDescription,
[ABILITY_AS_ONE_ICE_RIDER] = sAsOneIceRiderDescription, [ABILITY_AS_ONE_ICE_RIDER] = sAsOneIceRiderDescription,
[ABILITY_AS_ONE_SHADOW_RIDER] = sAsOneShadowRiderDescription, [ABILITY_AS_ONE_SHADOW_RIDER] = sAsOneShadowRiderDescription,
[ABILITY_LINGERING_AROMA] = sLingeringAromaDescription,
[ABILITY_SEED_SOWER] = sSeedSowerDescription,
[ABILITY_THERMAL_EXCHANGE] = sThermalExchangeDescription,
[ABILITY_ANGER_SHELL] = sAngerShellDescription,
[ABILITY_PURIFYING_SALT] = sPurifyingSaltDescription,
[ABILITY_WELL_BAKED_BODY] = sWellBakedBodyDescription,
[ABILITY_WIND_RIDER] = sWindRiderDescription,
[ABILITY_GUARD_DOG] = sGuardDogDescription,
[ABILITY_ROCKY_PAYLOAD] = sRockyPayloadDescription,
[ABILITY_WIND_POWER] = sWindPowerDescription,
[ABILITY_ZERO_TO_HERO] = sZeroToHeroDescription,
[ABILITY_COMMANDER] = sCommanderDescription,
[ABILITY_ELECTROMORPHOSIS] = sElectromorphosisDescription,
[ABILITY_PROTOSYNTHESIS] = sProtosynthesisDescription,
[ABILITY_QUARK_DRIVE] = sQuarkDriveDescription,
[ABILITY_GOOD_AS_GOLD] = sGoodAsGoldDescription,
[ABILITY_VESSEL_OF_RUIN] = sVesselOfRuinDescription,
[ABILITY_SWORD_OF_RUIN] = sSwordOfRuinDescription,
[ABILITY_TABLETS_OF_RUIN] = sTabletsOfRuinDescription,
[ABILITY_BEADS_OF_RUIN] = sBeadsOfRuinDescription,
[ABILITY_ORICHALCUM_PULSE] = sOrichalcumPulseDescription,
[ABILITY_HADRON_ENGINE] = sHadronEngineDescription,
[ABILITY_OPPORTUNIST] = sOpportunistDescription,
[ABILITY_CUD_CHEW] = sCudChewDescription,
[ABILITY_SHARPNESS] = sSharpnessDescription,
[ABILITY_SUPREME_OVERLORD] = sSupremeOverlordDescription,
[ABILITY_COSTAR] = sCostarDescription,
[ABILITY_TOXIC_DEBRIS] = sToxicDebrisDescription,
[ABILITY_ARMOR_TAIL] = sArmorTailDescription,
[ABILITY_EARTH_EATER] = sEarthEaterDescription,
[ABILITY_MYCELIUM_MIGHT] = sMyceliumMightDescription,
}; };

View File

@ -286,6 +286,8 @@ const u32 gBattleAnimSpritePal_Tornado[] = INCBIN_U32("graphics/battle_anims/spr
const u32 gBattleAnimSpriteGfx_ZMoveSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/z_move_symbol.4bpp.lz"); const u32 gBattleAnimSpriteGfx_ZMoveSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/z_move_symbol.4bpp.lz");
const u32 gBattleAnimSpritePal_ZMoveSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/z_move_symbol.gbapal.lz"); const u32 gBattleAnimSpritePal_ZMoveSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/z_move_symbol.gbapal.lz");
const u32 gBattleAnimSpriteGfx_Teapot[] = INCBIN_U32("graphics/battle_anims/sprites/new/teapot.4bpp.lz");
const u32 gBattleAnimSpritePal_Teapot[] = INCBIN_U32("graphics/battle_anims/sprites/new/teapot.gbapal.lz");
// Battle anims // Battle anims
const u32 gBattleAnimSpriteGfx_Bubble[] = INCBIN_U32("graphics/battle_anims/sprites/bubble.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Bubble[] = INCBIN_U32("graphics/battle_anims/sprites/bubble.4bpp.lz");

View File

@ -3481,11 +3481,7 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV,
else else
#endif #endif
{ {
#if P_SHINY_BASE_CHANCE >= GEN_6
u32 totalRerolls = 1;
#else
u32 totalRerolls = 0; u32 totalRerolls = 0;
#endif
if (CheckBagHasItem(ITEM_SHINY_CHARM, 1)) if (CheckBagHasItem(ITEM_SHINY_CHARM, 1))
totalRerolls += I_SHINY_CHARM_REROLLS; totalRerolls += I_SHINY_CHARM_REROLLS;
if (LURE_STEP_COUNT != 0) if (LURE_STEP_COUNT != 0)
@ -8621,6 +8617,8 @@ void TrySpecialOverworldEvo(void)
bool32 ShouldShowFemaleDifferences(u16 species, u32 personality) bool32 ShouldShowFemaleDifferences(u16 species, u32 personality)
{ {
if (species >= NUM_SPECIES)
return FALSE;
return (gSpeciesInfo[species].flags & SPECIES_FLAG_GENDER_DIFFERENCE) && GetGenderFromSpeciesAndPersonality(species, personality) == MON_FEMALE; return (gSpeciesInfo[species].flags & SPECIES_FLAG_GENDER_DIFFERENCE) && GetGenderFromSpeciesAndPersonality(species, personality) == MON_FEMALE;
} }