mirror of
https://github.com/Ninjdai1/pokeemerald.git
synced 2024-12-26 11:44:17 +01:00
Merge branch 'upcoming' of https://github.com/rh-hideout/pokeemerald-expansion into gen_9_move_effects_batch1
This commit is contained in:
commit
0a00942a26
@ -1022,7 +1022,7 @@
|
||||
.4byte \ptr
|
||||
.endm
|
||||
|
||||
.macro trydobeatup endPtr:req, failPtr:req
|
||||
.macro trydobeatup endPtr=NULL, failPtr=NULL
|
||||
.byte 0xc4
|
||||
.4byte \endPtr
|
||||
.4byte \failPtr
|
||||
@ -1942,6 +1942,31 @@
|
||||
various BS_ATTACKER, VARIOUS_SHELL_SIDE_ARM_CHECK
|
||||
.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
|
||||
various \battler, VARIOUS_JUMP_IF_CANT_FLING
|
||||
.4byte \ptr
|
||||
@ -2005,6 +2030,19 @@
|
||||
.byte \stat
|
||||
.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
|
||||
.macro setstatchanger stat:req, stages:req, down:req
|
||||
setbyte sSTATCHANGER, \stat | \stages << 3 | \down << 7
|
||||
@ -2162,3 +2200,34 @@
|
||||
.macro trysymbiosis
|
||||
various BS_ATTACKER, VARIOUS_TRY_SYMBIOSIS
|
||||
.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
|
||||
|
@ -13478,7 +13478,18 @@ Move_DRAGON_DARTS::
|
||||
end
|
||||
|
||||
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::
|
||||
loadspritegfx ANIM_TAG_TENDRILS
|
||||
|
@ -410,12 +410,13 @@ gBattleScriptsForMoveEffects::
|
||||
.4byte BattleScript_EffectCourtChange @ EFFECT_COURT_CHANGE
|
||||
.4byte BattleScript_EffectSteelBeam @ EFFECT_STEEL_BEAM
|
||||
.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_EffectSleepHit @ EFFECT_SLEEP_HIT
|
||||
.4byte BattleScript_EffectDoubleShock @ EFFECT_DOUBLE_SHOCK
|
||||
.4byte BattleScript_EffectSpecialAttackUpHit @ EFFECT_SPECIAL_ATTACK_UP_HIT
|
||||
.4byte BattleScript_EffectVictoryDance @ EFFECT_VICTORY_DANCE
|
||||
.4byte BattleScript_EffectTeatime @ EFFECT_TEATIME
|
||||
.4byte BattleScript_EffectCeaselessEdge @ EFFECT_CEASELESS_EDGE
|
||||
.4byte BattleScript_EffectDireClaw @ EFFECT_DIRE_CLAW
|
||||
.4byte BattleScript_EffectStoneAxe @ EFFECT_STONE_AXE
|
||||
@ -439,6 +440,73 @@ BattleScript_EffectCeaselessEdge::
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
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::
|
||||
playanimation BS_TARGET, B_ANIM_AFFECTION_HANGED_ON
|
||||
printstring STRINGID_TARGETTOUGHEDITOUT
|
||||
@ -2478,6 +2546,7 @@ BattleScript_EffectPsychicTerrain:
|
||||
printfromtable gTerrainStringIds
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
playanimation BS_ATTACKER, B_ANIM_RESTORE_BG
|
||||
call BattleScript_ActivateTerrainAbilities
|
||||
call BattleScript_TerrainSeedLoop
|
||||
jumpifabilitypresent ABILITY_MIMICRY, BattleScript_ApplyMimicry
|
||||
goto BattleScript_MoveEnd
|
||||
@ -2898,8 +2967,38 @@ BattleScript_EffectTailwind:
|
||||
waitanimation
|
||||
printstring STRINGID_TAILWINDBLEW
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
call BattleScript_TryTailwindAbilitiesLoop
|
||||
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:
|
||||
attackcanceler
|
||||
accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE
|
||||
@ -2987,6 +3086,7 @@ BattleScript_EffectHitEscape:
|
||||
resultmessage
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
jumpifmovehadnoeffect BattleScript_MoveEnd
|
||||
jumpifability BS_TARGET, ABILITY_GUARD_DOG, BattleScript_MoveEnd
|
||||
seteffectwithchance
|
||||
tryfaintmon BS_TARGET
|
||||
moveendto MOVEEND_ATTACKER_VISIBLE
|
||||
@ -3131,6 +3231,7 @@ BattleScript_EffectSleep::
|
||||
jumpifstatus BS_TARGET, STATUS1_SLEEP, BattleScript_AlreadyAsleep
|
||||
jumpifcantmakeasleep BattleScript_CantMakeAsleep
|
||||
jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_LeafGuardProtects
|
||||
jumpifability BS_TARGET, ABILITY_PURIFYING_SALT, BattleScript_LeafGuardProtects
|
||||
jumpifflowerveil BattleScript_FlowerVeilProtects
|
||||
jumpifability BS_TARGET_SIDE, ABILITY_SWEET_VEIL, BattleScript_SweetVeilProtects
|
||||
jumpifleafguardprotected BS_TARGET, BattleScript_LeafGuardProtects
|
||||
@ -3601,6 +3702,7 @@ BattleScript_EffectRoar::
|
||||
attackstring
|
||||
ppreduce
|
||||
jumpifroarfails BattleScript_ButItFailed
|
||||
jumpifability BS_TARGET, ABILITY_GUARD_DOG, BattleScript_ButItFailed
|
||||
jumpifability BS_TARGET, ABILITY_SUCTION_CUPS, BattleScript_AbilityPreventsPhasingOut
|
||||
jumpifstatus3 BS_TARGET, STATUS3_ROOTED, BattleScript_PrintMonIsRooted
|
||||
accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON
|
||||
@ -3725,6 +3827,7 @@ BattleScript_EffectToxic::
|
||||
ppreduce
|
||||
jumpifability BS_TARGET, ABILITY_IMMUNITY, BattleScript_ImmunityProtected
|
||||
jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_LeafGuardProtects
|
||||
jumpifability BS_TARGET, ABILITY_PURIFYING_SALT, BattleScript_LeafGuardProtects
|
||||
jumpifability BS_TARGET_SIDE, ABILITY_PASTEL_VEIL, BattleScript_PastelVeilProtects
|
||||
jumpifflowerveil BattleScript_FlowerVeilProtects
|
||||
jumpifleafguardprotected BS_TARGET, BattleScript_LeafGuardProtects
|
||||
@ -4063,6 +4166,7 @@ BattleScript_EffectPoison::
|
||||
ppreduce
|
||||
jumpifability BS_TARGET, ABILITY_IMMUNITY, BattleScript_ImmunityProtected
|
||||
jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_LeafGuardProtects
|
||||
jumpifability BS_TARGET, ABILITY_PURIFYING_SALT, BattleScript_LeafGuardProtects
|
||||
jumpifability BS_TARGET_SIDE, ABILITY_PASTEL_VEIL, BattleScript_PastelVeilProtects
|
||||
jumpifflowerveil BattleScript_FlowerVeilProtects
|
||||
jumpifleafguardprotected BS_TARGET, BattleScript_LeafGuardProtects
|
||||
@ -4089,6 +4193,7 @@ BattleScript_EffectParalyze:
|
||||
ppreduce
|
||||
jumpifability BS_TARGET, ABILITY_LIMBER, BattleScript_LimberProtected
|
||||
jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_LeafGuardProtects
|
||||
jumpifability BS_TARGET, ABILITY_PURIFYING_SALT, BattleScript_LeafGuardProtects
|
||||
jumpifflowerveil BattleScript_FlowerVeilProtects
|
||||
jumpifleafguardprotected BS_TARGET, BattleScript_LeafGuardProtects
|
||||
jumpifshieldsdown BS_TARGET, BattleScript_LeafGuardProtects
|
||||
@ -5229,10 +5334,18 @@ BattleScript_EffectTeleportNew:
|
||||
BattleScript_EffectTeleportNewEnd:
|
||||
goto BattleScript_MoveEnd
|
||||
|
||||
.if B_BEAT_UP < GEN_5
|
||||
BattleScript_EffectBeatUp::
|
||||
attackcanceler
|
||||
accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE
|
||||
.if B_BEAT_UP >= GEN_5
|
||||
attackstring
|
||||
ppreduce
|
||||
critcalc
|
||||
damagecalc
|
||||
adjustdamage
|
||||
trydobeatup
|
||||
goto BattleScript_HitFromAtkAnimation
|
||||
.else
|
||||
attackstring
|
||||
pause B_WAIT_TIME_SHORT
|
||||
ppreduce
|
||||
@ -5262,12 +5375,6 @@ BattleScript_BeatUpAttack::
|
||||
goto BattleScript_BeatUpLoop
|
||||
BattleScript_BeatUpEnd::
|
||||
end
|
||||
.else
|
||||
BattleScript_EffectBeatUp::
|
||||
attackcanceler
|
||||
accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE
|
||||
addbyte gBattleCommunication, 1
|
||||
goto BattleScript_HitFromAtkString
|
||||
.endif
|
||||
|
||||
BattleScript_EffectSemiInvulnerable::
|
||||
@ -5516,6 +5623,7 @@ BattleScript_EffectWillOWisp::
|
||||
jumpifability BS_TARGET, ABILITY_WATER_VEIL, BattleScript_WaterVeilPrevents
|
||||
jumpifability BS_TARGET, ABILITY_WATER_BUBBLE, BattleScript_WaterVeilPrevents
|
||||
jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_LeafGuardProtects
|
||||
jumpifability BS_TARGET, ABILITY_PURIFYING_SALT, BattleScript_LeafGuardProtects
|
||||
jumpifflowerveil BattleScript_FlowerVeilProtects
|
||||
jumpifleafguardprotected 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_INSOMNIA, BattleScript_PrintBankAbilityMadeIneffective
|
||||
jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_PrintBankAbilityMadeIneffective
|
||||
jumpifability BS_TARGET, ABILITY_PURIFYING_SALT, BattleScript_LeafGuardProtects
|
||||
jumpifflowerveil BattleScript_FlowerVeilProtects
|
||||
jumpifleafguardprotected BS_TARGET, BattleScript_LeafGuardProtects
|
||||
jumpifshieldsdown BS_TARGET, BattleScript_LeafGuardProtects
|
||||
@ -6690,6 +6799,27 @@ BattleScript_TailwindEnds::
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
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::
|
||||
printstring STRINGID_TRICKROOMENDS
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
@ -7130,6 +7260,70 @@ BattleScript_GulpMissileGorgingTargetDefenseCantGoLower:
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
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::
|
||||
printstring STRINGID_PKMNPERISHCOUNTFELL
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
@ -7651,6 +7845,17 @@ BattleScript_BallFetch::
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
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::
|
||||
pause 5
|
||||
copybyte gBattlerAbility, gBattlerTarget
|
||||
@ -8261,6 +8466,7 @@ BattleScript_WeatherFormChanges::
|
||||
setbyte sBATTLER, 0
|
||||
BattleScript_WeatherFormChangesLoop::
|
||||
tryweatherformdatachange
|
||||
activateweatherchangeabilities BS_SCRIPTING
|
||||
addbyte sBATTLER, 1
|
||||
jumpifbytenotequal sBATTLER, gBattlersCount, BattleScript_WeatherFormChangesLoop
|
||||
return
|
||||
@ -8323,13 +8529,15 @@ BattleScript_IntimidateLoop:
|
||||
jumpifability BS_TARGET, ABILITY_OWN_TEMPO, BattleScript_IntimidatePrevented
|
||||
jumpifability BS_TARGET, ABILITY_OBLIVIOUS, BattleScript_IntimidatePrevented
|
||||
.endif
|
||||
jumpifability BS_TARGET, ABILITY_GUARD_DOG, BattleScript_IntimidateInReverse
|
||||
BattleScript_IntimidateEffect:
|
||||
copybyte sBATTLER, gBattlerTarget
|
||||
statbuffchange STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, NULL
|
||||
copybyte sBATTLER, gBattlerAttacker
|
||||
statbuffchange STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_IntimidateLoopIncrement
|
||||
setgraphicalstatchangevalues
|
||||
playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1
|
||||
printstring STRINGID_PKMNCUTSATTACKWITH
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
copybyte sBATTLER, gBattlerTarget
|
||||
call BattleScript_TryAdrenalineOrb
|
||||
BattleScript_IntimidateLoopIncrement:
|
||||
addbyte gBattlerTarget, 1
|
||||
@ -8349,6 +8557,15 @@ BattleScript_IntimidatePrevented:
|
||||
call BattleScript_TryAdrenalineOrb
|
||||
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::
|
||||
pause B_WAIT_TIME_SHORT
|
||||
call BattleScript_AbilityPopUp
|
||||
@ -8406,6 +8623,42 @@ BattleScript_DeltaStreamActivates::
|
||||
playanimation BS_ATTACKER, B_ANIM_STRONG_WINDS
|
||||
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::
|
||||
pause B_WAIT_TIME_SHORT
|
||||
printstring STRINGID_ATTACKWEAKENEDBSTRONGWINDS
|
||||
@ -8434,12 +8687,35 @@ BattleScript_TerrainSeedLoop_NextBattler:
|
||||
restoretarget
|
||||
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::
|
||||
pause B_WAIT_TIME_SHORT
|
||||
call BattleScript_AbilityPopUp
|
||||
printstring STRINGID_TERRAINBECOMESELECTRIC
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
playanimation BS_SCRIPTING, B_ANIM_RESTORE_BG
|
||||
call BattleScript_ActivateTerrainAbilities
|
||||
call BattleScript_TerrainSeedLoop
|
||||
end3
|
||||
|
||||
@ -8449,6 +8725,7 @@ BattleScript_MistySurgeActivates::
|
||||
printstring STRINGID_TERRAINBECOMESMISTY
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
playanimation BS_SCRIPTING, B_ANIM_RESTORE_BG
|
||||
call BattleScript_ActivateTerrainAbilities
|
||||
call BattleScript_TerrainSeedLoop
|
||||
end3
|
||||
|
||||
@ -8458,6 +8735,7 @@ BattleScript_GrassySurgeActivates::
|
||||
printstring STRINGID_TERRAINBECOMESGRASSY
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
playanimation BS_SCRIPTING, B_ANIM_RESTORE_BG
|
||||
call BattleScript_ActivateTerrainAbilities
|
||||
call BattleScript_TerrainSeedLoop
|
||||
end3
|
||||
|
||||
@ -8467,6 +8745,7 @@ BattleScript_PsychicSurgeActivates::
|
||||
printstring STRINGID_TERRAINBECOMESPSYCHIC
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
playanimation BS_SCRIPTING, B_ANIM_RESTORE_BG
|
||||
call BattleScript_ActivateTerrainAbilities
|
||||
call BattleScript_TerrainSeedLoop
|
||||
end3
|
||||
|
||||
@ -8547,8 +8826,15 @@ BattleScript_MoveStatDrain::
|
||||
setgraphicalstatchangevalues
|
||||
playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1
|
||||
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
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
.endif
|
||||
BattleScript_MoveStatDrain_Cont:
|
||||
clearsemiinvulnerablebit
|
||||
tryfaintmon BS_ATTACKER
|
||||
goto BattleScript_MoveEnd
|
||||
@ -9728,7 +10014,7 @@ BattleScript_ExtremeEvoboostSpDef::
|
||||
BattleScript_ExtremeEvoboostEnd::
|
||||
goto BattleScript_MoveEnd
|
||||
|
||||
BattleScript_EffectTerrainHit:
|
||||
BattleScript_EffectHitSetRemoveTerrain:
|
||||
attackcanceler
|
||||
accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE
|
||||
attackstring
|
||||
@ -9750,6 +10036,7 @@ BattleScript_EffectTerrainHit:
|
||||
setterrain BattleScript_TryFaint
|
||||
playanimation BS_ATTACKER, B_ANIM_RESTORE_BG
|
||||
printfromtable gTerrainStringIds
|
||||
call BattleScript_ActivateTerrainAbilities
|
||||
BattleScript_TryFaint:
|
||||
tryfaintmon BS_TARGET
|
||||
goto BattleScript_MoveEnd
|
||||
@ -9848,6 +10135,35 @@ BattleScript_DarkTypePreventsPrankster::
|
||||
orhalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT
|
||||
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::
|
||||
setbyte gBattleCommunication, 0
|
||||
setbyte gBattleCommunication + 1, 0
|
||||
|
@ -145,6 +145,7 @@ BattleFrontier_Lounge7_EventScript_ChooseRightTutorMove::
|
||||
waitmessage
|
||||
special ShowBattlePointsWindow
|
||||
setvar VAR_TEMP_E, 1
|
||||
setvar VAR_0x8004, SCROLL_MULTI_BF_MOVE_TUTOR_2
|
||||
setvar VAR_0x8006, 0
|
||||
special ShowScrollableMultichoice
|
||||
waitstate
|
||||
@ -168,6 +169,7 @@ BattleFrontier_Lounge7_EventScript_ChooseNewRightTutorMove::
|
||||
message BattleFrontier_Lounge7_Text_TeachWhichMove
|
||||
waitmessage
|
||||
setvar VAR_TEMP_E, 1
|
||||
setvar VAR_0x8004, SCROLL_MULTI_BF_MOVE_TUTOR_2
|
||||
setvar VAR_0x8006, 1
|
||||
special ShowScrollableMultichoice
|
||||
waitstate
|
||||
|
19
graphics/battle_anims/sprites/new/teapot.pal
Normal file
19
graphics/battle_anims/sprites/new/teapot.pal
Normal 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
|
BIN
graphics/battle_anims/sprites/new/teapot.png
Normal file
BIN
graphics/battle_anims/sprites/new/teapot.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 881 B |
@ -104,6 +104,7 @@ struct DisableStruct
|
||||
u8 noRetreat:1;
|
||||
u8 tarShot:1;
|
||||
u8 octolock:1;
|
||||
u8 cudChew:1;
|
||||
};
|
||||
|
||||
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.
|
||||
// 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 beatUpSlot:3;
|
||||
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)
|
||||
};
|
||||
|
@ -43,6 +43,7 @@ u16 GetNaturePowerMove(void);
|
||||
u16 GetSecretPowerMoveEffect(void);
|
||||
void StealTargetItem(u8 battlerStealer, u8 battlerItem);
|
||||
u8 GetCatchingBattler(void);
|
||||
u32 GetHighestStatId(u32 battlerId);
|
||||
|
||||
extern void (* const gBattleScriptingCommandsTable[])(void);
|
||||
extern const u8 gBattlePalaceNatureToMoveGroupLikelihood[NUM_NATURES][4];
|
||||
|
@ -433,6 +433,21 @@ extern const u8 BattleScript_MultiHitPrintStrings[];
|
||||
extern const u8 BattleScript_BurnUpRemoveType[];
|
||||
extern const u8 BattleScript_TargetAbilityStatRaiseRet[];
|
||||
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
|
||||
extern const u8 BattleScript_ZMoveActivateDamaging[];
|
||||
|
@ -34,6 +34,8 @@
|
||||
#define ABILITYEFFECT_MOVE_END_OTHER 12
|
||||
#define ABILITYEFFECT_NEUTRALIZINGGAS 13
|
||||
#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
|
||||
#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
|
||||
@ -142,6 +144,7 @@ u16 CalcTypeEffectivenessMultiplier(u16 move, u8 moveType, u8 battlerAtk, u8 bat
|
||||
u16 CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 abilityDef);
|
||||
u16 GetTypeModifier(u8 atkType, u8 defType);
|
||||
s32 GetStealthHazardDamage(u8 hazardType, u8 battlerId);
|
||||
s32 GetStealthHazardDamageByTypesAndHP(u8 hazardType, u8 type1, u8 type2, u32 maxHp);
|
||||
u16 GetMegaEvolutionSpecies(u16 preEvoSpecies, u16 heldItemId);
|
||||
u16 GetPrimalReversionSpecies(u16 preEvoSpecies, u16 heldItemId);
|
||||
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 IsBattlerTerrainAffected(u8 battlerId, u32 terrainFlag);
|
||||
u32 GetBattlerFriendshipScore(u8 battlerId);
|
||||
u32 CountBattlerStatIncreases(u8 battlerId, bool32 countEvasionAcc);
|
||||
bool32 IsMyceliumMightOnField(void);
|
||||
|
||||
#endif // GUARD_BATTLE_UTIL_H
|
||||
|
@ -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_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_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
|
||||
#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.
|
||||
|
@ -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_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_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
|
||||
// To use the following features in scripting, replace the 0s with the flag ID you're assigning it to.
|
||||
|
@ -292,6 +292,41 @@
|
||||
|
||||
#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
|
||||
|
@ -394,6 +394,8 @@
|
||||
#define ANIM_TAG_OMEGA_SYMBOL (ANIM_SPRITES_START + 382)
|
||||
#define ANIM_TAG_STEEL_BEAM (ANIM_SPRITES_START + 383)
|
||||
#define ANIM_TAG_POLTERGEIST (ANIM_SPRITES_START + 384)
|
||||
#define ANIM_TAG_TEAPOT (ANIM_SPRITES_START + 385)
|
||||
|
||||
|
||||
// battlers
|
||||
#define ANIM_ATTACKER 0
|
||||
|
@ -391,17 +391,18 @@
|
||||
#define EFFECT_COURT_CHANGE 385
|
||||
#define EFFECT_STEEL_BEAM 386
|
||||
#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_SLEEP_HIT 390
|
||||
#define EFFECT_DOUBLE_SHOCK 391
|
||||
#define EFFECT_SPECIAL_ATTACK_UP_HIT 392
|
||||
#define EFFECT_VICTORY_DANCE 393
|
||||
#define EFFECT_CEASELESS_EDGE 394
|
||||
#define EFFECT_DIRE_CLAW 395
|
||||
#define EFFECT_STONE_AXE 396
|
||||
#define EFFECT_BARB_BARRAGE 397
|
||||
#define EFFECT_TEATIME 394
|
||||
#define EFFECT_CEASELESS_EDGE 395
|
||||
#define EFFECT_DIRE_CLAW 396
|
||||
#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
|
||||
|
@ -247,6 +247,14 @@
|
||||
#define VARIOUS_GET_BATTLER_SIDE 156
|
||||
#define VARIOUS_CHECK_PARENTAL_BOND_COUNTER 157
|
||||
#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
|
||||
#define DMG_CHANGE_SIGN 0
|
||||
|
@ -632,8 +632,14 @@
|
||||
#define STRINGID_TARGETTOUGHEDITOUT 630
|
||||
#define STRINGID_ATTACKERLOSTELECTRICTYPE 631
|
||||
#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.
|
||||
// String ids before this (e.g. STRINGID_INTROMSG) are not in the table,
|
||||
|
@ -235,6 +235,8 @@
|
||||
#define FLAG_THAW_USER (1 << 25)
|
||||
#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_WIND_MOVE (1 << 28)
|
||||
#define FLAG_SLICING_MOVE (1 << 29)
|
||||
|
||||
// Split defines.
|
||||
#define SPLIT_PHYSICAL 0x0
|
||||
|
@ -9957,6 +9957,8 @@ extern const u32 gBattleAnimSpriteGfx_Tornado[];
|
||||
extern const u32 gBattleAnimSpritePal_Tornado[];
|
||||
extern const u32 gBattleAnimSpriteGfx_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_Ghost[];
|
||||
|
@ -2429,19 +2429,41 @@ static bool32 PartyBattlerShouldAvoidHazards(u8 currBattler, u8 switchBattler)
|
||||
{
|
||||
struct Pokemon *mon = GetPartyBattlerPartyData(currBattler, switchBattler);
|
||||
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);
|
||||
s32 hazardDamage = 0;
|
||||
u8 type1 = gSpeciesInfo[species].type1;
|
||||
u8 type2 = gSpeciesInfo[species].type2;
|
||||
u32 maxHp = GetMonData(mon, MON_DATA_MAX_HP);
|
||||
|
||||
if (flags == 0)
|
||||
return FALSE;
|
||||
|
||||
if (ability == ABILITY_MAGIC_GUARD || ability == ABILITY_LEVITATE
|
||||
|| holdEffect == HOLD_EFFECT_HEAVY_DUTY_BOOTS)
|
||||
if (ability == ABILITY_MAGIC_GUARD)
|
||||
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;
|
||||
|
||||
if (flags & (SIDE_STATUS_SPIKES | SIDE_STATUS_STEALTH_ROCK) && GetMonData(mon, MON_DATA_HP) < (GetMonData(mon, MON_DATA_MAX_HP) / 8))
|
||||
return TRUE;
|
||||
if (flags & SIDE_STATUS_STEALTH_ROCK)
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -2447,6 +2447,39 @@ const struct SpriteTemplate gFollowMeFingerSpriteTemplate =
|
||||
.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[] =
|
||||
{
|
||||
ANIMCMD_FRAME(0, 1),
|
||||
|
@ -1759,7 +1759,7 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data)
|
||||
{
|
||||
case LIST_ITEM_ABILITY:
|
||||
data->modifyArrows.minValue = 0;
|
||||
data->modifyArrows.maxValue = ABILITIES_COUNT_GEN8 - 1;
|
||||
data->modifyArrows.maxValue = ABILITIES_COUNT - 1;
|
||||
data->modifyArrows.maxDigits = 3;
|
||||
data->modifyArrows.modifiedValPtr = &gBattleMons[data->battlerId].ability;
|
||||
data->modifyArrows.typeOfVal = VAL_U16;
|
||||
|
@ -101,7 +101,7 @@ static void SetActionsAndBattlersTurnOrder(void);
|
||||
static void UpdateBattlerPartyOrdersOnSwitch(void);
|
||||
static bool8 AllAtActionConfirmed(void);
|
||||
static void TryChangeTurnOrder(void);
|
||||
static void CheckFocusPunch_ClearVarsBeforeTurnStarts(void);
|
||||
static void CheckChosenMoveForEffectsBeforeTurnStarts(void);
|
||||
static void CheckMegaEvolutionBeforeTurn(void);
|
||||
static void CheckQuickClaw_CustapBerryActivation(void);
|
||||
static void FreeResetData_ReturnToOvOrDoEvolutions(void);
|
||||
@ -3039,6 +3039,7 @@ static void BattleStartClearSetData(void)
|
||||
|
||||
gBattleStruct->stickyWebUser = 0xFF;
|
||||
gBattleStruct->appearedInBattle = 0;
|
||||
gBattleStruct->beatUpSlot = 0;
|
||||
|
||||
for (i = 0; i < PARTY_SIZE; i++)
|
||||
{
|
||||
@ -4480,6 +4481,7 @@ u32 GetBattlerTotalSpeedStat(u8 battlerId)
|
||||
u32 speed = gBattleMons[battlerId].speed;
|
||||
u32 ability = GetBattlerAbility(battlerId);
|
||||
u32 holdEffect = GetBattlerHoldEffect(battlerId, TRUE);
|
||||
u32 highestStat = GetHighestStatId(battlerId);
|
||||
|
||||
// weather abilities
|
||||
if (WEATHER_HAS_EFFECT)
|
||||
@ -4501,6 +4503,10 @@ u32 GetBattlerTotalSpeedStat(u8 battlerId)
|
||||
speed *= 2;
|
||||
else if (ability == ABILITY_SLOW_START && gDisableStructs[battlerId].slowStartTimer != 0)
|
||||
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
|
||||
speed *= gStatStageRatios[gBattleMons[battlerId].statStages[STAT_SPEED]][0];
|
||||
@ -4666,6 +4672,10 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves)
|
||||
strikesFirst = 1;
|
||||
else if (ability2 == ABILITY_STALL && ability1 != ABILITY_STALL)
|
||||
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
|
||||
{
|
||||
if (speedBattler1 == speedBattler2 && Random() & 1)
|
||||
@ -4878,7 +4888,7 @@ static void CheckMegaEvolutionBeforeTurn(void)
|
||||
}
|
||||
|
||||
#if B_MEGA_EVO_TURN_ORDER <= GEN_6
|
||||
gBattleMainFunc = CheckFocusPunch_ClearVarsBeforeTurnStarts;
|
||||
gBattleMainFunc = CheckChosenMoveForEffectsBeforeTurnStarts;
|
||||
gBattleStruct->focusPunchBattlerId = 0;
|
||||
#else
|
||||
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;
|
||||
}
|
||||
|
||||
static void CheckFocusPunch_ClearVarsBeforeTurnStarts(void)
|
||||
static void CheckChosenMoveForEffectsBeforeTurnStarts(void)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
@ -4921,7 +4931,7 @@ static void CheckFocusPunch_ClearVarsBeforeTurnStarts(void)
|
||||
&& !(gDisableStructs[gBattlerAttacker].truantCounter)
|
||||
&& !(gProtectStructs[gActiveBattler].noValidMoves))
|
||||
{
|
||||
switch(gChosenMoveByBattler[gActiveBattler])
|
||||
switch (gChosenMoveByBattler[gActiveBattler])
|
||||
{
|
||||
case MOVE_FOCUS_PUNCH:
|
||||
BattleScriptExecute(BattleScript_FocusPunchSetUp);
|
||||
|
@ -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_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_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_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}!");
|
||||
@ -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_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_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] =
|
||||
{
|
||||
[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_TARGETTOUGHEDITOUT - BATTLESTRINGS_TABLE_START] = sText_TargetToughedItOut,
|
||||
[STRINGID_ATTACKERMELTEDTHEICE - BATTLESTRINGS_TABLE_START] = sText_AttackerMeltedTheIce,
|
||||
|
@ -5769,7 +5769,8 @@ static void Cmd_moveend(void)
|
||||
if (gCurrentMove != MOVE_DRAGON_TAIL
|
||||
&& gCurrentMove != MOVE_CIRCLE_THROW
|
||||
&& 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.
|
||||
// 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;
|
||||
gBattleCommunication[MULTISTRING_CHOOSER] = 3;
|
||||
break;
|
||||
case EFFECT_DAMAGE_SET_TERRAIN:
|
||||
case EFFECT_HIT_SET_REMOVE_TERRAIN:
|
||||
switch (gBattleMoves[move].argument)
|
||||
{
|
||||
case 0: //genesis supernova
|
||||
@ -8111,7 +8112,7 @@ static void RecalcBattlerStats(u32 battler, struct Pokemon *mon)
|
||||
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;
|
||||
|
||||
@ -8142,6 +8143,67 @@ static bool32 IsRototillerAffected(u32 battlerId)
|
||||
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) \
|
||||
{ \
|
||||
temp = gSideStatuses[B_SIDE_PLAYER]; \
|
||||
@ -9143,9 +9205,10 @@ static void Cmd_various(void)
|
||||
break;
|
||||
case VARIOUS_TRY_HIT_SWITCH_TARGET:
|
||||
if (IsBattlerAlive(gBattlerAttacker)
|
||||
&& IsBattlerAlive(gBattlerTarget)
|
||||
&& !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
|
||||
&& TARGET_TURN_DAMAGED)
|
||||
&& IsBattlerAlive(gBattlerTarget)
|
||||
&& !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
|
||||
&& TARGET_TURN_DAMAGED
|
||||
&& GetBattlerAbility(gBattlerTarget) != ABILITY_GUARD_DOG)
|
||||
{
|
||||
gBattleScripting.switchCase = B_SWITCH_HIT;
|
||||
gBattlescriptCurrInstr = BattleScript_ForceRandomSwitch;
|
||||
@ -10043,7 +10106,7 @@ static void Cmd_various(void)
|
||||
gBattleMons[gActiveBattler].item = gLastUsedItem;
|
||||
break;
|
||||
case VARIOUS_SET_BEAK_BLAST:
|
||||
gProtectStructs[gBattlerAttacker].beakBlastCharge = TRUE;
|
||||
gProtectStructs[gActiveBattler].beakBlastCharge = TRUE;
|
||||
break;
|
||||
case VARIOUS_SWAP_SIDE_STATUSES:
|
||||
CourtChangeSwapSideStatuses();
|
||||
@ -10110,6 +10173,70 @@ static void Cmd_various(void)
|
||||
PREPARE_STAT_BUFFER(gBattleTextBuff1, statId);
|
||||
}
|
||||
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])
|
||||
|
||||
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
|
||||
|| activeBattlerAbility == ABILITY_FULL_METAL_BODY
|
||||
|| activeBattlerAbility == ABILITY_WHITE_SMOKE)
|
||||
&& !certain && gCurrentMove != MOVE_CURSE)
|
||||
&& !affectsUser && !certain && gCurrentMove != MOVE_CURSE)
|
||||
{
|
||||
if (flags == STAT_CHANGE_ALLOW_PTR)
|
||||
{
|
||||
@ -11938,8 +12065,9 @@ static void Cmd_trysetencore(void)
|
||||
}
|
||||
|
||||
if (gLastMoves[gBattlerTarget] == MOVE_STRUGGLE
|
||||
|| gLastMoves[gBattlerTarget] == MOVE_ENCORE
|
||||
|| gLastMoves[gBattlerTarget] == MOVE_MIRROR_MOVE)
|
||||
|| gLastMoves[gBattlerTarget] == MOVE_ENCORE
|
||||
|| gLastMoves[gBattlerTarget] == MOVE_MIRROR_MOVE
|
||||
|| gLastMoves[gBattlerTarget] == MOVE_SHELL_TRAP)
|
||||
{
|
||||
i = MAX_MON_MOVES;
|
||||
}
|
||||
@ -12867,6 +12995,10 @@ static void Cmd_trysetfutureattack(void)
|
||||
|
||||
static void Cmd_trydobeatup(void)
|
||||
{
|
||||
#if B_BEAT_UP >= GEN_5
|
||||
gBattleStruct->beatUpSlot++;
|
||||
gBattlescriptCurrInstr += 9;
|
||||
#else
|
||||
struct Pokemon *party;
|
||||
|
||||
if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)
|
||||
@ -12910,6 +13042,7 @@ static void Cmd_trydobeatup(void)
|
||||
else
|
||||
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 5);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static void Cmd_setsemiinvulnerablebit(void)
|
||||
|
@ -476,7 +476,7 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] =
|
||||
[EFFECT_COURT_CHANGE] = 0, // TODO: Assign points
|
||||
[EFFECT_STEEL_BEAM] = 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_SLEEP_HIT] = 1,
|
||||
[EFFECT_DOUBLE_SHOCK] = 0, // TODO: Assign points
|
||||
|
@ -230,8 +230,9 @@ static u8 CalcBeatUpPower(void)
|
||||
party = gPlayerParty;
|
||||
else
|
||||
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;
|
||||
|
||||
return basePower;
|
||||
@ -419,7 +420,7 @@ void HandleAction_UseMove(void)
|
||||
battlerAbility = GetBattlerAbility(gActiveBattler);
|
||||
|
||||
RecordAbilityBattle(gActiveBattler, gBattleMons[gActiveBattler].ability);
|
||||
if (battlerAbility == ABILITY_LIGHTNING_ROD)
|
||||
if (battlerAbility == ABILITY_LIGHTNING_ROD && gCurrentMove != MOVE_TEATIME)
|
||||
gSpecialStatuses[gActiveBattler].lightningRodRedirected = TRUE;
|
||||
else if (battlerAbility == ABILITY_STORM_DRAIN)
|
||||
gSpecialStatuses[gActiveBattler].stormDrainRedirected = TRUE;
|
||||
@ -1065,6 +1066,11 @@ static const u8 sAbilitiesAffectedByMoldBreaker[] =
|
||||
[ABILITY_ICE_SCALES] = 1,
|
||||
[ABILITY_ICE_FACE] = 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] =
|
||||
@ -2654,6 +2660,7 @@ enum
|
||||
ENDTURN_THROAT_CHOP,
|
||||
ENDTURN_SLOW_START,
|
||||
ENDTURN_PLASMA_FISTS,
|
||||
ENDTURN_CUD_CHEW,
|
||||
ENDTURN_BATTLER_COUNT
|
||||
};
|
||||
|
||||
@ -3195,6 +3202,11 @@ u8 DoBattlerEndTurnEffects(void)
|
||||
gStatuses4[gActiveBattler] &= ~STATUS4_PLASMA_FISTS;
|
||||
gBattleStruct->turnEffectsTracker++;
|
||||
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
|
||||
gBattleStruct->turnEffectsTracker = 0;
|
||||
gBattleStruct->turnEffectsBattlerId++;
|
||||
@ -3875,7 +3887,7 @@ u8 AtkCanceller_UnableToUseMove(void)
|
||||
gMultiHitCounter++;
|
||||
}
|
||||
|
||||
gBattleCommunication[0] = 0; // For later
|
||||
gBattleStruct->beatUpSlot = 0;
|
||||
PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0)
|
||||
}
|
||||
#endif
|
||||
@ -4719,6 +4731,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
||||
}
|
||||
break;
|
||||
case ABILITY_ELECTRIC_SURGE:
|
||||
case ABILITY_HADRON_ENGINE:
|
||||
if (TryChangeBattleTerrain(battler, STATUS_FIELD_ELECTRIC_TERRAIN, &gFieldTimers.terrainTimer))
|
||||
{
|
||||
BattleScriptPushCursorAndCallback(BattleScript_ElectricSurgeActivates);
|
||||
@ -4755,19 +4768,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
||||
effect++;
|
||||
}
|
||||
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:
|
||||
if (!(gSpecialStatuses[battler].traced))
|
||||
{
|
||||
@ -4842,6 +4842,89 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
||||
effect++;
|
||||
}
|
||||
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
|
||||
default:
|
||||
if (gBattleMons[battler].species == SPECIES_CHERRIM)
|
||||
@ -5045,48 +5128,66 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
||||
effect++;
|
||||
}
|
||||
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;
|
||||
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))
|
||||
|| (gLastUsedAbility == ABILITY_BULLETPROOF && gBattleMoves[move].flags & FLAG_BALLISTIC))
|
||||
{
|
||||
if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)
|
||||
gHitMarker |= HITMARKER_NO_PPDEDUCT;
|
||||
gBattlescriptCurrInstr = BattleScript_SoundproofProtected;
|
||||
effect = 1;
|
||||
if ((gLastUsedAbility == ABILITY_SOUNDPROOF && gBattleMoves[move].flags & FLAG_SOUND && !(moveTarget & MOVE_TARGET_USER))
|
||||
|| (gLastUsedAbility == ABILITY_BULLETPROOF && gBattleMoves[move].flags & FLAG_BALLISTIC))
|
||||
{
|
||||
if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)
|
||||
gHitMarker |= HITMARKER_NO_PPDEDUCT;
|
||||
gBattlescriptCurrInstr = BattleScript_SoundproofProtected;
|
||||
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
|
||||
if (move != MOVE_NONE)
|
||||
{
|
||||
u8 statId;
|
||||
u8 statAmount = 1;
|
||||
switch (gLastUsedAbility)
|
||||
{
|
||||
case ABILITY_VOLT_ABSORB:
|
||||
@ -5144,6 +5245,18 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
||||
}
|
||||
}
|
||||
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.
|
||||
@ -5188,9 +5301,11 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
||||
else
|
||||
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]++;
|
||||
PREPARE_STAT_BUFFER(gBattleTextBuff1, statId);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -5324,11 +5439,13 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
||||
effect++;
|
||||
}
|
||||
break;
|
||||
case ABILITY_LINGERING_AROMA:
|
||||
case ABILITY_MUMMY:
|
||||
if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
|
||||
&& IsBattlerAlive(gBattlerAttacker)
|
||||
&& TARGET_TURN_DAMAGED
|
||||
&& (IsMoveMakingContact(move, gBattlerAttacker)))
|
||||
&& IsMoveMakingContact(move, gBattlerAttacker)
|
||||
&& gBattleStruct->overwrittenAbilities[gBattlerAttacker] != GetBattlerAbility(gBattlerTarget))
|
||||
{
|
||||
switch (gBattleMons[gBattlerAttacker].ability)
|
||||
{
|
||||
@ -5344,7 +5461,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
||||
case ABILITY_STANCE_CHANGE:
|
||||
break;
|
||||
default:
|
||||
gLastUsedAbility = gBattleMons[gBattlerAttacker].ability = gBattleStruct->overwrittenAbilities[gBattlerAttacker] = ABILITY_MUMMY;
|
||||
gLastUsedAbility = gBattleMons[gBattlerAttacker].ability = gBattleStruct->overwrittenAbilities[gBattlerAttacker] = gBattleMons[gBattlerTarget].ability;
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_MummyActivates;
|
||||
effect++;
|
||||
@ -5691,6 +5808,75 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
||||
}
|
||||
}
|
||||
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;
|
||||
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;
|
||||
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)
|
||||
@ -6068,6 +6295,19 @@ bool32 IsNeutralizingGasOnField(void)
|
||||
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)
|
||||
{
|
||||
if (gStatuses3[battlerId] & STATUS3_GASTRO_ACID)
|
||||
@ -6076,6 +6316,9 @@ u32 GetBattlerAbility(u8 battlerId)
|
||||
if (IsNeutralizingGasOnField() && !IsNeutralizingGasBannedAbility(gBattleMons[battlerId].ability))
|
||||
return ABILITY_NONE;
|
||||
|
||||
if (IsMyceliumMightOnField())
|
||||
return ABILITY_NONE;
|
||||
|
||||
if ((((gBattleMons[gBattlerAttacker].ability == ABILITY_MOLD_BREAKER
|
||||
|| gBattleMons[gBattlerAttacker].ability == ABILITY_TERAVOLT
|
||||
|| gBattleMons[gBattlerAttacker].ability == ABILITY_TURBOBLAZE)
|
||||
@ -6249,6 +6492,7 @@ bool32 CanBeBurned(u8 battlerId)
|
||||
|| ability == ABILITY_WATER_VEIL
|
||||
|| ability == ABILITY_WATER_BUBBLE
|
||||
|| ability == ABILITY_COMATOSE
|
||||
|| ability == ABILITY_THERMAL_EXCHANGE
|
||||
|| IsAbilityStatusProtected(battlerId)
|
||||
|| IsBattlerTerrainAffected(battlerId, STATUS_FIELD_MISTY_TERRAIN))
|
||||
return FALSE;
|
||||
@ -7982,6 +8226,11 @@ bool32 IsBattlerProtected(u8 battlerId, u16 move)
|
||||
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.
|
||||
// This means extra logic is needed to handle Shell Side Arm.
|
||||
if (GetBattlerAbility(gBattlerAttacker) == ABILITY_UNSEEN_FIST
|
||||
@ -8503,17 +8752,41 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef)
|
||||
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)
|
||||
{
|
||||
u32 i, ability;
|
||||
u32 i;
|
||||
u32 holdEffectAtk, holdEffectParamAtk;
|
||||
u16 basePower = CalcMoveBasePower(move, battlerAtk, battlerDef);
|
||||
u16 holdEffectModifier;
|
||||
u16 modifier = UQ_4_12(1.0);
|
||||
u32 atkSide = GET_BATTLER_SIDE(battlerAtk);
|
||||
u16 atkAbility = GetBattlerAbility(battlerAtk);
|
||||
u16 defAbility = GetBattlerAbility(battlerDef);
|
||||
|
||||
// attacker's abilities
|
||||
switch (GetBattlerAbility(battlerAtk))
|
||||
switch (atkAbility)
|
||||
{
|
||||
case ABILITY_TECHNICIAN:
|
||||
if (basePower <= 60)
|
||||
@ -8619,11 +8892,44 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe
|
||||
if (IS_MOVE_PHYSICAL(move))
|
||||
MulModifier(&modifier, UQ_4_12(1.5));
|
||||
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
|
||||
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))
|
||||
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));
|
||||
}
|
||||
|
||||
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
|
||||
if (IsBattlerAlive(BATTLE_PARTNER(battlerAtk)))
|
||||
{
|
||||
@ -8651,8 +8969,7 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe
|
||||
}
|
||||
|
||||
// target's abilities
|
||||
ability = GetBattlerAbility(battlerDef);
|
||||
switch (ability)
|
||||
switch (defAbility)
|
||||
{
|
||||
case ABILITY_HEATPROOF:
|
||||
case ABILITY_WATER_BUBBLE:
|
||||
@ -8660,7 +8977,7 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe
|
||||
{
|
||||
MulModifier(&modifier, UQ_4_12(0.5));
|
||||
if (updateFlags)
|
||||
RecordAbilityBattle(battlerDef, ability);
|
||||
RecordAbilityBattle(battlerDef, defAbility);
|
||||
}
|
||||
break;
|
||||
case ABILITY_DRY_SKIN:
|
||||
@ -8672,11 +8989,25 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe
|
||||
{
|
||||
MulModifier(&modifier, UQ_4_12(0.5));
|
||||
if (updateFlags)
|
||||
RecordAbilityBattle(battlerDef, ability);
|
||||
RecordAbilityBattle(battlerDef, defAbility);
|
||||
}
|
||||
if (moveType == TYPE_FIRE)
|
||||
MulModifier(&modifier, UQ_4_12(2.0));
|
||||
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);
|
||||
@ -8803,7 +9134,7 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe
|
||||
#define TERRAIN_TYPE_BOOST UQ_4_12(1.5)
|
||||
#endif
|
||||
|
||||
// various effecs
|
||||
// various effects
|
||||
if (gProtectStructs[battlerAtk].helpingHand)
|
||||
MulModifier(&modifier, UQ_4_12(1.5));
|
||||
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)
|
||||
MulModifier(&modifier, UQ_4_12(2.0));
|
||||
break;
|
||||
case ABILITY_PURIFYING_SALT:
|
||||
if (gBattleMoves[move].type == TYPE_GHOST)
|
||||
MulModifier(&modifier, UQ_4_12(2.0));
|
||||
break;
|
||||
}
|
||||
|
||||
// ally's abilities
|
||||
@ -9600,11 +9935,8 @@ u16 GetTypeModifier(u8 atkType, u8 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;
|
||||
u16 modifier = UQ_4_12(1.0);
|
||||
|
||||
@ -9647,6 +9979,15 @@ s32 GetStealthHazardDamage(u8 hazardType, u8 battlerId)
|
||||
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)
|
||||
{
|
||||
if (GetBattlerSide(battlerId) == B_SIDE_OPPONENT && gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)
|
||||
|
@ -1450,6 +1450,7 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] =
|
||||
{gBattleAnimSpriteGfx_OmegaSymbol, 0x0200, ANIM_TAG_OMEGA_SYMBOL},
|
||||
{gBattleAnimSpriteGfx_Orbs, 0x0180, ANIM_TAG_STEEL_BEAM},
|
||||
{gBattleAnimSpriteGfx_AuraSphere, 0x200, ANIM_TAG_POLTERGEIST},
|
||||
{gBattleAnimSpriteGfx_Teapot, 0x1800, ANIM_TAG_TEAPOT},
|
||||
};
|
||||
|
||||
const struct CompressedSpritePalette gBattleAnimPaletteTable[] =
|
||||
@ -1900,6 +1901,7 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] =
|
||||
{gBattleAnimSpritePal_OmegaSymbol, ANIM_TAG_OMEGA_SYMBOL},
|
||||
{gBattleAnimSpritePal_SteelBeam, ANIM_TAG_STEEL_BEAM},
|
||||
{gBattleAnimSpritePal_Poltergeist, ANIM_TAG_POLTERGEIST},
|
||||
{gBattleAnimSpritePal_Teapot, ANIM_TAG_TEAPOT},
|
||||
};
|
||||
|
||||
const struct BattleAnimBackground gBattleAnimBackgroundTable[] =
|
||||
|
@ -256,7 +256,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
.secondaryEffectChance = 0,
|
||||
.target = MOVE_TARGET_SELECTED,
|
||||
.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,
|
||||
.zMovePower = 100,
|
||||
.zMoveEffect = Z_EFFECT_NONE,
|
||||
@ -272,7 +272,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
.secondaryEffectChance = 0,
|
||||
.target = MOVE_TARGET_SELECTED,
|
||||
.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,
|
||||
.zMovePower = 100,
|
||||
.zMoveEffect = Z_EFFECT_NONE,
|
||||
@ -298,7 +298,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
{
|
||||
#if B_UPDATED_MOVE_DATA >= GEN_6
|
||||
.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
|
||||
.accuracy = 100,
|
||||
.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,
|
||||
.target = MOVE_TARGET_BOTH,
|
||||
.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,
|
||||
.zMoveEffect = Z_EFFECT_NONE,
|
||||
},
|
||||
@ -1354,7 +1354,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
.secondaryEffectChance = 0,
|
||||
.target = MOVE_TARGET_BOTH,
|
||||
.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,
|
||||
.zMovePower = 100,
|
||||
.zMoveEffect = Z_EFFECT_NONE,
|
||||
@ -2932,7 +2932,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
.secondaryEffectChance = 0,
|
||||
.target = MOVE_TARGET_SELECTED,
|
||||
.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,
|
||||
.zMovePower = 140,
|
||||
.zMoveEffect = Z_EFFECT_NONE,
|
||||
@ -3541,7 +3541,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
.secondaryEffectChance = 100,
|
||||
.target = MOVE_TARGET_BOTH,
|
||||
.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,
|
||||
.zMovePower = 100,
|
||||
.zMoveEffect = Z_EFFECT_NONE,
|
||||
@ -3643,7 +3643,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
.secondaryEffectChance = 0,
|
||||
.target = MOVE_TARGET_ALL_BATTLERS,
|
||||
.priority = 0,
|
||||
.flags = 0,
|
||||
.flags = FLAG_WIND_MOVE,
|
||||
.split = SPLIT_STATUS,
|
||||
.zMovePower = 0,
|
||||
.zMoveEffect = Z_EFFECT_SPD_UP_1,
|
||||
@ -3819,7 +3819,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
.secondaryEffectChance = 0,
|
||||
.target = MOVE_TARGET_SELECTED,
|
||||
.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,
|
||||
.zMovePower = 100,
|
||||
.zMoveEffect = Z_EFFECT_NONE,
|
||||
@ -4304,7 +4304,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
[MOVE_TWISTER] =
|
||||
{
|
||||
#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
|
||||
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_DMG_2X_IN_AIR,
|
||||
#endif
|
||||
@ -4677,7 +4677,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
.secondaryEffectChance = 10,
|
||||
.target = MOVE_TARGET_BOTH,
|
||||
.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,
|
||||
.zMoveEffect = Z_EFFECT_NONE,
|
||||
},
|
||||
@ -5674,7 +5674,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
.secondaryEffectChance = 0,
|
||||
.target = MOVE_TARGET_BOTH,
|
||||
.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,
|
||||
.zMoveEffect = Z_EFFECT_NONE,
|
||||
},
|
||||
@ -6007,7 +6007,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
.secondaryEffectChance = 0,
|
||||
.target = MOVE_TARGET_SELECTED,
|
||||
.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,
|
||||
.zMovePower = 120,
|
||||
.zMoveEffect = Z_EFFECT_NONE,
|
||||
@ -6304,7 +6304,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
.secondaryEffectChance = 0,
|
||||
.target = MOVE_TARGET_SELECTED,
|
||||
.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,
|
||||
.zMoveEffect = Z_EFFECT_NONE,
|
||||
},
|
||||
@ -6635,7 +6635,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
.secondaryEffectChance = 0,
|
||||
.target = MOVE_TARGET_USER,
|
||||
.priority = 0,
|
||||
.flags = FLAG_SNATCH_AFFECTED,
|
||||
.flags = FLAG_SNATCH_AFFECTED | FLAG_WIND_MOVE,
|
||||
.split = SPLIT_STATUS,
|
||||
.zMovePower = 0,
|
||||
.zMoveEffect = Z_EFFECT_BOOST_CRITS,
|
||||
@ -7239,7 +7239,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
.secondaryEffectChance = 0,
|
||||
.target = MOVE_TARGET_SELECTED,
|
||||
.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,
|
||||
.zMovePower = 140,
|
||||
.zMoveEffect = Z_EFFECT_NONE,
|
||||
@ -7281,7 +7281,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
{
|
||||
#if B_UPDATED_MOVE_DATA >= GEN_6
|
||||
.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
|
||||
.pp = 20,
|
||||
.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,
|
||||
.target = MOVE_TARGET_SELECTED,
|
||||
.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,
|
||||
.zMovePower = 160,
|
||||
.zMoveEffect = Z_EFFECT_NONE,
|
||||
@ -7721,7 +7721,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
.secondaryEffectChance = 0,
|
||||
.target = MOVE_TARGET_SELECTED,
|
||||
.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,
|
||||
.zMovePower = 140,
|
||||
.zMoveEffect = Z_EFFECT_NONE,
|
||||
@ -7943,7 +7943,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
.secondaryEffectChance = 10,
|
||||
.target = MOVE_TARGET_SELECTED,
|
||||
.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,
|
||||
.zMovePower = 140,
|
||||
.zMoveEffect = Z_EFFECT_NONE,
|
||||
@ -9559,7 +9559,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
.secondaryEffectChance = 0,
|
||||
.target = MOVE_TARGET_SELECTED,
|
||||
.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,
|
||||
.zMovePower = 175,
|
||||
.zMoveEffect = Z_EFFECT_NONE,
|
||||
@ -9575,7 +9575,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
.secondaryEffectChance = 50,
|
||||
.target = MOVE_TARGET_SELECTED,
|
||||
.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,
|
||||
.zMovePower = 140,
|
||||
.zMoveEffect = Z_EFFECT_NONE,
|
||||
@ -9713,7 +9713,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
.secondaryEffectChance = 30,
|
||||
.target = MOVE_TARGET_SELECTED,
|
||||
.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,
|
||||
.zMoveEffect = Z_EFFECT_NONE,
|
||||
},
|
||||
@ -10223,7 +10223,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
.secondaryEffectChance = 0,
|
||||
.target = MOVE_TARGET_FOES_AND_ALLY,
|
||||
.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,
|
||||
.zMovePower = 175,
|
||||
.zMoveEffect = Z_EFFECT_NONE,
|
||||
@ -10422,7 +10422,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
.secondaryEffectChance = 0,
|
||||
.target = MOVE_TARGET_SELECTED,
|
||||
.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,
|
||||
.zMovePower = 100,
|
||||
.zMoveEffect = Z_EFFECT_NONE,
|
||||
@ -11208,7 +11208,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
.secondaryEffectChance = 0,
|
||||
.target = MOVE_TARGET_SELECTED,
|
||||
.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,
|
||||
.zMovePower = 190,
|
||||
.zMoveEffect = Z_EFFECT_NONE,
|
||||
@ -12351,13 +12351,13 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
|
||||
[MOVE_TEATIME] =
|
||||
{
|
||||
.effect = EFFECT_PLACEHOLDER, //TODO
|
||||
.effect = EFFECT_TEATIME,
|
||||
.power = 0,
|
||||
.type = TYPE_NORMAL,
|
||||
.accuracy = 0,
|
||||
.pp = 10,
|
||||
.secondaryEffectChance = 0,
|
||||
.target = MOVE_TARGET_ALL_BATTLERS,
|
||||
.target = MOVE_TARGET_USER,
|
||||
.priority = 0,
|
||||
.flags = 0,
|
||||
.split = SPLIT_STATUS,
|
||||
@ -12535,7 +12535,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
.secondaryEffectChance = 0,
|
||||
.target = MOVE_TARGET_SELECTED,
|
||||
.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,
|
||||
.zMovePower = 180,
|
||||
.zMoveEffect = Z_EFFECT_NONE,
|
||||
@ -13334,7 +13334,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
.secondaryEffectChance = 0,
|
||||
.target = MOVE_TARGET_SELECTED,
|
||||
.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,
|
||||
.zMovePower = 120,
|
||||
.zMoveEffect = Z_EFFECT_NONE,
|
||||
@ -13354,7 +13354,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
.secondaryEffectChance = 30,
|
||||
.target = MOVE_TARGET_SELECTED,
|
||||
.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,
|
||||
.zMovePower = 175,
|
||||
.zMoveEffect = Z_EFFECT_NONE,
|
||||
@ -13610,7 +13610,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
.secondaryEffectChance = 0,
|
||||
.target = MOVE_TARGET_SELECTED,
|
||||
.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,
|
||||
.zMovePower = 120,
|
||||
.zMoveEffect = Z_EFFECT_NONE,
|
||||
@ -13631,7 +13631,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
.secondaryEffectChance = 30,
|
||||
.target = MOVE_TARGET_SELECTED,
|
||||
.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,
|
||||
.zMovePower = 175,
|
||||
.zMoveEffect = Z_EFFECT_NONE,
|
||||
@ -13652,7 +13652,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
.secondaryEffectChance = 20,
|
||||
.target = MOVE_TARGET_SELECTED,
|
||||
.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,
|
||||
.zMovePower = 175,
|
||||
.zMoveEffect = Z_EFFECT_NONE,
|
||||
@ -13673,7 +13673,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
.secondaryEffectChance = 20,
|
||||
.target = MOVE_TARGET_SELECTED,
|
||||
.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,
|
||||
.zMovePower = 175,
|
||||
.zMoveEffect = Z_EFFECT_NONE,
|
||||
@ -13876,7 +13876,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
|
||||
[MOVE_ICE_SPINNER] =
|
||||
{
|
||||
.effect = EFFECT_DAMAGE_SET_TERRAIN,
|
||||
.effect = EFFECT_HIT_SET_REMOVE_TERRAIN,
|
||||
.power = 80,
|
||||
.type = TYPE_ICE,
|
||||
.accuracy = 100,
|
||||
@ -13888,7 +13888,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
.split = SPLIT_PHYSICAL,
|
||||
.zMovePower = 160,
|
||||
.zMoveEffect = Z_EFFECT_NONE,
|
||||
.argument = 1, //remove terrain
|
||||
.argument = 1, // Remove the active field terrain if there is one.
|
||||
},
|
||||
|
||||
[MOVE_GLAIVE_RUSH] =
|
||||
@ -14843,7 +14843,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
},
|
||||
[MOVE_GENESIS_SUPERNOVA] =
|
||||
{
|
||||
.effect = EFFECT_DAMAGE_SET_TERRAIN,
|
||||
.effect = EFFECT_HIT_SET_REMOVE_TERRAIN,
|
||||
.power = 185,
|
||||
.type = TYPE_PSYCHIC,
|
||||
.accuracy = 0,
|
||||
@ -14854,7 +14854,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
.flags = 0,
|
||||
.zMovePower = 0,
|
||||
.split = SPLIT_SPECIAL,
|
||||
.argument = 0, //psychic terrain
|
||||
.argument = 0, // Set Psychic Terrain. If there's a different field terrain active, overwrite it.
|
||||
.zMoveEffect = 0
|
||||
},
|
||||
[MOVE_SINISTER_ARROW_RAID] =
|
||||
@ -14904,7 +14904,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
},
|
||||
[MOVE_SPLINTERED_STORMSHARDS] =
|
||||
{
|
||||
.effect = EFFECT_DAMAGE_SET_TERRAIN,
|
||||
.effect = EFFECT_HIT_SET_REMOVE_TERRAIN,
|
||||
.power = 190,
|
||||
.type = TYPE_ROCK,
|
||||
.accuracy = 0,
|
||||
@ -14915,7 +14915,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
.flags = 0,
|
||||
.zMovePower = 0,
|
||||
.split = SPLIT_PHYSICAL,
|
||||
.argument = 1, //remove terrain
|
||||
.argument = 1, // Remove the active field terrain if there is one.
|
||||
.zMoveEffect = 0
|
||||
},
|
||||
[MOVE_LETS_SNUGGLE_FOREVER] =
|
||||
|
@ -254,6 +254,37 @@ static const u8 sChillingNeighDescription[] = _("KOs boost Attack stat.");
|
||||
static const u8 sGrimNeighDescription[] = _("KOs boost Sp. Atk stat.");
|
||||
static const u8 sAsOneIceRiderDescription[] = _("Unnerve and Chilling 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
|
||||
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_AS_ONE_ICE_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
|
||||
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_AS_ONE_ICE_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
|
||||
|
||||
@ -1071,4 +1164,35 @@ const u8 *const gAbilityDescriptionPointers[ABILITIES_COUNT] =
|
||||
[ABILITY_GRIM_NEIGH] = sGrimNeighDescription,
|
||||
[ABILITY_AS_ONE_ICE_RIDER] = sAsOneIceRiderDescription,
|
||||
[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,
|
||||
};
|
||||
|
@ -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 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
|
||||
const u32 gBattleAnimSpriteGfx_Bubble[] = INCBIN_U32("graphics/battle_anims/sprites/bubble.4bpp.lz");
|
||||
|
@ -3481,11 +3481,7 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV,
|
||||
else
|
||||
#endif
|
||||
{
|
||||
#if P_SHINY_BASE_CHANCE >= GEN_6
|
||||
u32 totalRerolls = 1;
|
||||
#else
|
||||
u32 totalRerolls = 0;
|
||||
#endif
|
||||
if (CheckBagHasItem(ITEM_SHINY_CHARM, 1))
|
||||
totalRerolls += I_SHINY_CHARM_REROLLS;
|
||||
if (LURE_STEP_COUNT != 0)
|
||||
@ -8621,6 +8617,8 @@ void TrySpecialOverworldEvo(void)
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user