mirror of
https://github.com/Ninjdai1/pokeemerald.git
synced 2024-12-26 11:44:17 +01:00
Merge branch 'RHH/upcoming' into RHH/pr/sync/pretmerge_20221030
# Conflicts: # src/rom_header_gf.c
This commit is contained in:
commit
f2d0e547ac
@ -1290,7 +1290,7 @@
|
||||
.4byte \ptr
|
||||
.endm
|
||||
|
||||
.macro trygetbaddreamstarget ptr:req
|
||||
.macro unused ptr:req
|
||||
.byte 0xfd
|
||||
.4byte \ptr
|
||||
.endm
|
||||
@ -1789,9 +1789,9 @@
|
||||
various BS_ATTACKER, VARIOUS_SET_Z_EFFECT
|
||||
.endm
|
||||
|
||||
.macro consumeberry battler:req, restoreItem=FALSE
|
||||
.macro consumeberry battler:req, frombattler:req
|
||||
various \battler, VARIOUS_CONSUME_BERRY
|
||||
.byte \restoreItem
|
||||
.byte \frombattler
|
||||
.endm
|
||||
|
||||
.macro activateitemeffects battler:req
|
||||
@ -1988,6 +1988,12 @@
|
||||
various \battler, VARIOUS_GET_BATTLER_SIDE
|
||||
.endm
|
||||
|
||||
.macro checkparentalbondcounter counter:req, ptr:req
|
||||
various BS_ATTACKER, VARIOUS_CHECK_PARENTAL_BOND_COUNTER
|
||||
.byte \counter
|
||||
.4byte \ptr
|
||||
.endm
|
||||
|
||||
@ helpful macros
|
||||
.macro setstatchanger stat:req, stages:req, down:req
|
||||
setbyte sSTATCHANGER, \stat | \stages << 3 | \down << 7
|
||||
|
@ -51,7 +51,7 @@ gBattleScriptsForMoveEffects::
|
||||
.4byte BattleScript_EffectBide @ EFFECT_BIDE
|
||||
.4byte BattleScript_EffectRampage @ EFFECT_RAMPAGE
|
||||
.4byte BattleScript_EffectRoar @ EFFECT_ROAR
|
||||
.4byte BattleScript_EffectMultiHit @ EFFECT_MULTI_HIT
|
||||
.4byte BattleScript_EffectHit @ EFFECT_MULTI_HIT
|
||||
.4byte BattleScript_EffectConversion @ EFFECT_CONVERSION
|
||||
.4byte BattleScript_EffectFlinchHit @ EFFECT_FLINCH_HIT
|
||||
.4byte BattleScript_EffectRestoreHp @ EFFECT_RESTORE_HP
|
||||
@ -66,11 +66,10 @@ gBattleScriptsForMoveEffects::
|
||||
.4byte BattleScript_EffectDragonRage @ EFFECT_DRAGON_RAGE
|
||||
.4byte BattleScript_EffectTrap @ EFFECT_TRAP
|
||||
.4byte BattleScript_EffectHealBlock @ EFFECT_HEAL_BLOCK
|
||||
.4byte BattleScript_EffectDoubleHit @ EFFECT_DOUBLE_HIT
|
||||
.4byte BattleScript_EffectRecoilIfMiss @ EFFECT_RECOIL_IF_MISS
|
||||
.4byte BattleScript_EffectMist @ EFFECT_MIST
|
||||
.4byte BattleScript_EffectFocusEnergy @ EFFECT_FOCUS_ENERGY
|
||||
.4byte BattleScript_EffectRecoil25 @ EFFECT_RECOIL_25
|
||||
.4byte BattleScript_EffectHit @ EFFECT_RECOIL_25
|
||||
.4byte BattleScript_EffectConfuse @ EFFECT_CONFUSE
|
||||
.4byte BattleScript_EffectAttackUp2 @ EFFECT_ATTACK_UP_2
|
||||
.4byte BattleScript_EffectDefenseUp2 @ EFFECT_DEFENSE_UP_2
|
||||
@ -99,7 +98,6 @@ gBattleScriptsForMoveEffects::
|
||||
.4byte BattleScript_EffectHit @ EFFECT_EVASION_DOWN_HIT
|
||||
.4byte BattleScript_EffectTwoTurnsAttack @ EFFECT_TWO_TURNS_ATTACK
|
||||
.4byte BattleScript_EffectConfuseHit @ EFFECT_CONFUSE_HIT
|
||||
.4byte BattleScript_EffectTwineedle @ EFFECT_TWINEEDLE
|
||||
.4byte BattleScript_EffectHit @ EFFECT_VITAL_THROW
|
||||
.4byte BattleScript_EffectSubstitute @ EFFECT_SUBSTITUTE
|
||||
.4byte BattleScript_EffectRecharge @ EFFECT_RECHARGE
|
||||
@ -220,7 +218,7 @@ gBattleScriptsForMoveEffects::
|
||||
.4byte BattleScript_EffectSnatch @ EFFECT_SNATCH
|
||||
.4byte BattleScript_EffectHit @ EFFECT_LOW_KICK
|
||||
.4byte BattleScript_EffectSecretPower @ EFFECT_SECRET_POWER
|
||||
.4byte BattleScript_EffectRecoil33 @ EFFECT_RECOIL_33
|
||||
.4byte BattleScript_EffectHit @ EFFECT_RECOIL_33
|
||||
.4byte BattleScript_EffectTeeterDance @ EFFECT_TEETER_DANCE
|
||||
.4byte BattleScript_EffectHitEscape @ EFFECT_HIT_ESCAPE
|
||||
.4byte BattleScript_EffectMudSport @ EFFECT_MUD_SPORT
|
||||
@ -309,9 +307,9 @@ gBattleScriptsForMoveEffects::
|
||||
.4byte BattleScript_EffectGrowth @ EFFECT_GROWTH
|
||||
.4byte BattleScript_EffectCloseCombat @ EFFECT_CLOSE_COMBAT
|
||||
.4byte BattleScript_EffectLastResort @ EFFECT_LAST_RESORT
|
||||
.4byte BattleScript_EffectRecoil33Status @ EFFECT_RECOIL_33_STATUS
|
||||
.4byte BattleScript_EffectHit @ EFFECT_RECOIL_33_STATUS
|
||||
.4byte BattleScript_EffectFlinchStatus @ EFFECT_FLINCH_STATUS
|
||||
.4byte BattleScript_EffectRecoil50 @ EFFECT_RECOIL_50
|
||||
.4byte BattleScript_EffectHit @ EFFECT_RECOIL_50
|
||||
.4byte BattleScript_EffectShellSmash @ EFFECT_SHELL_SMASH
|
||||
.4byte BattleScript_EffectShiftGear @ EFFECT_SHIFT_GEAR
|
||||
.4byte BattleScript_EffectDefenseUp3 @ EFFECT_DEFENSE_UP_3
|
||||
@ -381,12 +379,10 @@ gBattleScriptsForMoveEffects::
|
||||
.4byte BattleScript_EffectHit @ EFFECT_DYNAMAX_DOUBLE_DMG
|
||||
.4byte BattleScript_EffectDecorate @ EFFECT_DECORATE
|
||||
.4byte BattleScript_EffectHit @ EFFECT_SNIPE_SHOT
|
||||
.4byte BattleScript_EffectTripleHit @ EFFECT_TRIPLE_HIT
|
||||
.4byte BattleScript_EffectRecoilHP25 @ EFFECT_RECOIL_HP_25
|
||||
.4byte BattleScript_EffectStuffCheeks @ EFFECT_STUFF_CHEEKS
|
||||
.4byte BattleScript_EffectDefenseDownHit @ EFFECT_GRAV_APPLE
|
||||
.4byte BattleScript_EffectEvasionUpHit @ EFFECT_EVASION_UP_HIT
|
||||
.4byte BattleScript_EffectDoubleIronBash @ EFFECT_DOUBLE_IRON_BASH
|
||||
.4byte BattleScript_EffectGlitzyGlow @ EFFECT_GLITZY_GLOW
|
||||
.4byte BattleScript_EffectBaddyBad @ EFFECT_BADDY_BAD
|
||||
.4byte BattleScript_EffectSappySeed @ EFFECT_SAPPY_SEED
|
||||
@ -415,6 +411,7 @@ gBattleScriptsForMoveEffects::
|
||||
.4byte BattleScript_EffectSteelBeam @ EFFECT_STEEL_BEAM
|
||||
.4byte BattleScript_EffectExtremeEvoboost @ EFFECT_EXTREME_EVOBOOST
|
||||
.4byte BattleScript_EffectTerrainHit @ EFFECT_DAMAGE_SET_TERRAIN
|
||||
.4byte BattleScript_EffectDarkVoid @ EFFECT_DARK_VOID
|
||||
|
||||
BattleScript_AffectionBasedEndurance::
|
||||
playanimation BS_TARGET, B_ANIM_AFFECTION_HANGED_ON
|
||||
@ -698,11 +695,11 @@ BattleScript_EffectFling:
|
||||
BattleScript_EffectFlingConsumeBerry:
|
||||
savebattleritem BS_TARGET
|
||||
battleritemtolastuseditem BS_TARGET
|
||||
setbyte sBERRY_OVERRIDE, TRUE @ override the requirements for eating berries
|
||||
setbyte sBERRY_OVERRIDE, 1 @ override the requirements for eating berries
|
||||
orword gHitMarker, HITMARKER_NO_ANIMATIONS
|
||||
consumeberry BS_TARGET
|
||||
consumeberry BS_TARGET, TRUE
|
||||
bicword gHitMarker, HITMARKER_NO_ANIMATIONS
|
||||
setbyte sBERRY_OVERRIDE, FALSE
|
||||
setbyte sBERRY_OVERRIDE, 0
|
||||
restorebattleritem BS_TARGET
|
||||
BattleScript_FlingEnd:
|
||||
tryfaintmon BS_TARGET
|
||||
@ -779,9 +776,7 @@ BattleScript_EffectPhotonGeyser:
|
||||
BattleScript_EffectAuraWheel: @ Aura Wheel can only be used by Morpeko
|
||||
jumpifspecies BS_ATTACKER, SPECIES_MORPEKO, BattleScript_EffectSpeedUpHit
|
||||
jumpifspecies BS_ATTACKER, SPECIES_MORPEKO_HANGRY, BattleScript_EffectSpeedUpHit
|
||||
printstring STRINGID_BUTPOKEMONCANTUSETHEMOVE
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
goto BattleScript_MoveEnd
|
||||
goto BattleScript_PokemonCantUseTheMove
|
||||
|
||||
BattleScript_EffectClangorousSoul:
|
||||
attackcanceler
|
||||
@ -893,9 +888,7 @@ BattleScript_BothCanNoLongerEscape::
|
||||
BattleScript_EffectHyperspaceFury:
|
||||
jumpifspecies BS_ATTACKER, SPECIES_HOOPA_UNBOUND, BattleScript_EffectHyperspaceFuryUnbound
|
||||
jumpifspecies BS_ATTACKER, SPECIES_HOOPA, BattleScript_ButHoopaCantUseIt
|
||||
printstring STRINGID_BUTPOKEMONCANTUSETHEMOVE
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
goto BattleScript_MoveEnd
|
||||
goto BattleScript_PokemonCantUseTheMove
|
||||
|
||||
BattleScript_EffectHyperspaceFuryUnbound::
|
||||
attackcanceler
|
||||
@ -1074,16 +1067,6 @@ BattleScript_EffectGlitzyGlow:
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
goto BattleScript_MoveEnd
|
||||
|
||||
BattleScript_EffectDoubleIronBash:
|
||||
attackcanceler
|
||||
accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE
|
||||
attackstring
|
||||
ppreduce
|
||||
setmultihitcounter 2
|
||||
initmultihitstring
|
||||
sethword sMULTIHIT_EFFECT, MOVE_EFFECT_FLINCH
|
||||
goto BattleScript_MultiHitLoop
|
||||
|
||||
BattleScript_EffectEvasionUpHit:
|
||||
setmoveeffect MOVE_EFFECT_EVS_PLUS_1 | MOVE_EFFECT_AFFECTS_USER
|
||||
goto BattleScript_EffectHit
|
||||
@ -1096,11 +1079,12 @@ BattleScript_EffectStuffCheeks::
|
||||
attackanimation
|
||||
waitanimation
|
||||
BattleScript_StuffCheeksEatBerry:
|
||||
setbyte sBERRY_OVERRIDE, TRUE
|
||||
setbyte sBERRY_OVERRIDE, 1
|
||||
orword gHitMarker, HITMARKER_NO_ANIMATIONS
|
||||
consumeberry BS_ATTACKER
|
||||
consumeberry BS_ATTACKER, TRUE
|
||||
bicword gHitMarker, HITMARKER_NO_ANIMATIONS
|
||||
setbyte sBERRY_OVERRIDE, FALSE
|
||||
setbyte sBERRY_OVERRIDE, 0
|
||||
removeitem BS_ATTACKER
|
||||
setstatchanger STAT_DEF, 2, FALSE
|
||||
statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_StuffCheeksEnd
|
||||
setgraphicalstatchangevalues
|
||||
@ -1286,27 +1270,16 @@ BattleScript_EffectBurnUp:
|
||||
ppreduce
|
||||
jumpiftype BS_ATTACKER, TYPE_FIRE, BattleScript_BurnUpWorks
|
||||
goto BattleScript_ButItFailed
|
||||
|
||||
BattleScript_BurnUpWorks:
|
||||
accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE
|
||||
critcalc
|
||||
damagecalc
|
||||
adjustdamage
|
||||
attackanimation
|
||||
waitanimation
|
||||
effectivenesssound
|
||||
hitanimation BS_TARGET
|
||||
waitstate
|
||||
healthbarupdate BS_TARGET
|
||||
datahpupdate BS_TARGET
|
||||
critmessage
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
resultmessage
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
setmoveeffect MOVE_EFFECT_BURN_UP | MOVE_EFFECT_CERTAIN
|
||||
goto BattleScript_EffectHit
|
||||
|
||||
BattleScript_BurnUpRemoveType::
|
||||
losetype BS_ATTACKER, TYPE_FIRE
|
||||
printstring STRINGID_ATTACKERLOSTFIRETYPE
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
tryfaintmon BS_TARGET
|
||||
goto BattleScript_MoveEnd
|
||||
return
|
||||
|
||||
BattleScript_EffectPurify:
|
||||
attackcanceler
|
||||
@ -1389,11 +1362,13 @@ BattleScript_MoveEffectBugBite::
|
||||
printstring STRINGID_BUGBITE
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
orword gHitMarker, HITMARKER_NO_ANIMATIONS
|
||||
setbyte sBERRY_OVERRIDE, TRUE @ override the requirements for eating berries
|
||||
consumeberry BS_ATTACKER, TRUE @ consume the berry, then restore the item from changedItems
|
||||
setbyte sBERRY_OVERRIDE, 1 @ override the requirements for eating berries
|
||||
savetarget
|
||||
consumeberry BS_ATTACKER, FALSE
|
||||
bicword gHitMarker, HITMARKER_NO_ANIMATIONS
|
||||
setbyte sBERRY_OVERRIDE, FALSE
|
||||
setbyte sBERRY_OVERRIDE, 0
|
||||
trysymbiosis
|
||||
restoretarget
|
||||
return
|
||||
|
||||
BattleScript_EffectCoreEnforcer:
|
||||
@ -3026,6 +3001,7 @@ BattleScript_EffectNaturalGift:
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
seteffectwithchance
|
||||
jumpifmovehadnoeffect BattleScript_EffectNaturalGiftEnd
|
||||
checkparentalbondcounter 2, BattleScript_EffectNaturalGiftEnd
|
||||
removeitem BS_ATTACKER
|
||||
BattleScript_EffectNaturalGiftEnd:
|
||||
tryfaintmon BS_TARGET
|
||||
@ -3044,6 +3020,11 @@ BattleScript_MoveMissed::
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
goto BattleScript_MoveEnd
|
||||
|
||||
BattleScript_EffectDarkVoid::
|
||||
.if B_DARK_VOID_FAIL >= GEN_7
|
||||
jumpifspecies BS_ATTACKER, SPECIES_DARKRAI, BattleScript_EffectSleep
|
||||
goto BattleScript_PokemonCantUseTheMove
|
||||
.endif
|
||||
BattleScript_EffectSleep::
|
||||
attackcanceler
|
||||
attackstring
|
||||
@ -3571,6 +3552,8 @@ BattleScript_MultiHitPrintStrings::
|
||||
copyarray gBattleTextBuff1, sMULTIHIT_STRING, 6
|
||||
printstring STRINGID_HITXTIMES
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
return
|
||||
|
||||
BattleScript_MultiHitEnd::
|
||||
seteffectwithchance
|
||||
tryfaintmon BS_TARGET
|
||||
@ -3789,26 +3772,6 @@ BattleScript_EffectTrap::
|
||||
setmoveeffect MOVE_EFFECT_WRAP
|
||||
goto BattleScript_EffectHit
|
||||
|
||||
BattleScript_EffectTripleHit::
|
||||
attackcanceler
|
||||
accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE
|
||||
attackstring
|
||||
ppreduce
|
||||
setmultihitcounter 3
|
||||
initmultihitstring
|
||||
sethword sMULTIHIT_EFFECT, 0
|
||||
goto BattleScript_MultiHitLoop
|
||||
|
||||
BattleScript_EffectDoubleHit::
|
||||
attackcanceler
|
||||
accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE
|
||||
attackstring
|
||||
ppreduce
|
||||
setmultihitcounter 2
|
||||
initmultihitstring
|
||||
sethword sMULTIHIT_EFFECT, 0
|
||||
goto BattleScript_MultiHitLoop
|
||||
|
||||
BattleScript_EffectRecoilIfMiss::
|
||||
attackcanceler
|
||||
accuracycheck BattleScript_MoveMissedDoDamage, ACC_CURR_MOVE
|
||||
@ -4165,16 +4128,6 @@ BattleScript_EffectConfuseHit::
|
||||
setmoveeffect MOVE_EFFECT_CONFUSION
|
||||
goto BattleScript_EffectHit
|
||||
|
||||
BattleScript_EffectTwineedle::
|
||||
attackcanceler
|
||||
accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE
|
||||
sethword sMULTIHIT_EFFECT, MOVE_EFFECT_POISON
|
||||
attackstring
|
||||
ppreduce
|
||||
setmultihitcounter 2
|
||||
initmultihitstring
|
||||
goto BattleScript_MultiHitLoop
|
||||
|
||||
BattleScript_EffectSubstitute::
|
||||
attackcanceler
|
||||
ppreduce
|
||||
@ -4520,64 +4473,16 @@ BattleScript_PartyHealEnd::
|
||||
|
||||
BattleScript_EffectTripleKick::
|
||||
attackcanceler
|
||||
accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE
|
||||
attackstring
|
||||
ppreduce
|
||||
sethword sTRIPLE_KICK_POWER, 0
|
||||
initmultihitstring
|
||||
setmultihit 3
|
||||
BattleScript_TripleKickLoop::
|
||||
jumpifhasnohp BS_ATTACKER, BattleScript_TripleKickEnd
|
||||
jumpifhasnohp BS_TARGET, BattleScript_TripleKickNoMoreHits
|
||||
jumpifhalfword CMP_EQUAL, gChosenMove, MOVE_SLEEP_TALK, BattleScript_DoTripleKickAttack
|
||||
jumpifstatus BS_ATTACKER, STATUS1_SLEEP, BattleScript_TripleKickNoMoreHits
|
||||
BattleScript_DoTripleKickAttack::
|
||||
accuracycheck BattleScript_TripleKickNoMoreHits, ACC_CURR_MOVE
|
||||
movevaluescleanup
|
||||
jumpifmove MOVE_SURGING_STRIKES, EffectTripleKick_DoDmgCalcs @ no power boost each hit
|
||||
jumpifmove MOVE_TRIPLE_AXEL, EffectTripleKick_TripleAxelBoost @ triple axel gets +20 power
|
||||
addbyte sTRIPLE_KICK_POWER, 10 @ triple kick gets +10 power
|
||||
goto EffectTripleKick_DoDmgCalcs
|
||||
EffectTripleKick_TripleAxelBoost:
|
||||
addbyte sTRIPLE_KICK_POWER, 20
|
||||
EffectTripleKick_DoDmgCalcs:
|
||||
addbyte sTRIPLE_KICK_POWER, 10
|
||||
addbyte sMULTIHIT_STRING + 4, 1
|
||||
critcalc
|
||||
damagecalc
|
||||
adjustdamage
|
||||
jumpifmovehadnoeffect BattleScript_TripleKickNoMoreHits
|
||||
attackanimation
|
||||
waitanimation
|
||||
effectivenesssound
|
||||
hitanimation BS_TARGET
|
||||
waitstate
|
||||
healthbarupdate BS_TARGET
|
||||
datahpupdate BS_TARGET
|
||||
critmessage
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
printstring STRINGID_EMPTYSTRING3
|
||||
waitmessage 1
|
||||
moveendto MOVEEND_NEXT_TARGET
|
||||
jumpifbyte CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_FOE_ENDURED, BattleScript_TripleKickPrintStrings
|
||||
decrementmultihit BattleScript_TripleKickLoop
|
||||
goto BattleScript_TripleKickPrintStrings
|
||||
BattleScript_TripleKickNoMoreHits::
|
||||
pause B_WAIT_TIME_SHORT
|
||||
jumpifbyte CMP_EQUAL, sMULTIHIT_STRING + 4, 0, BattleScript_TripleKickPrintStrings
|
||||
bichalfword gMoveResultFlags, MOVE_RESULT_MISSED
|
||||
BattleScript_TripleKickPrintStrings::
|
||||
resultmessage
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
jumpifbyte CMP_EQUAL, sMULTIHIT_STRING + 4, 0, BattleScript_TripleKickEnd
|
||||
jumpifhalfword CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_TripleKickEnd
|
||||
copyarray gBattleTextBuff1, sMULTIHIT_STRING, 6
|
||||
printstring STRINGID_HITXTIMES
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
BattleScript_TripleKickEnd::
|
||||
seteffectwithchance
|
||||
tryfaintmon BS_TARGET
|
||||
moveendfrom MOVEEND_UPDATE_LAST_MOVES
|
||||
end
|
||||
jumpifmove MOVE_TRIPLE_AXEL BS_TripleAxel
|
||||
addbyte sTRIPLE_KICK_POWER, 10 @ triple kick gets +10 power
|
||||
goto BattleScript_HitFromAtkString
|
||||
|
||||
BS_TripleAxel:
|
||||
addbyte sTRIPLE_KICK_POWER, 20 @ triple axel gets +20 power
|
||||
goto BattleScript_HitFromAtkString
|
||||
|
||||
BattleScript_EffectThief::
|
||||
setmoveeffect MOVE_EFFECT_STEAL_ITEM
|
||||
@ -5217,6 +5122,7 @@ BattleScript_EffectTeleportNew:
|
||||
BattleScript_EffectTeleportNewEnd:
|
||||
goto BattleScript_MoveEnd
|
||||
|
||||
.if B_BEAT_UP < GEN_5
|
||||
BattleScript_EffectBeatUp::
|
||||
attackcanceler
|
||||
accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE
|
||||
@ -5249,6 +5155,13 @@ 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::
|
||||
jumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_SecondTurnSemiInvulnerable
|
||||
@ -5411,9 +5324,11 @@ BattleScript_EffectSpitUp::
|
||||
stockpiletobasedamage BattleScript_SpitUpFail
|
||||
goto BattleScript_HitFromAtkAnimation
|
||||
BattleScript_SpitUpFail::
|
||||
checkparentalbondcounter 2, BattleScript_SpitUpEnd
|
||||
pause B_WAIT_TIME_SHORT
|
||||
printstring STRINGID_FAILEDTOSPITUP
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
BattleScript_SpitUpEnd:
|
||||
goto BattleScript_MoveEnd
|
||||
|
||||
BattleScript_SpitUpFailProtect::
|
||||
@ -5898,24 +5813,6 @@ BattleScript_EffectSecretPower::
|
||||
getsecretpowereffect
|
||||
goto BattleScript_EffectHit
|
||||
|
||||
BattleScript_EffectRecoil25:
|
||||
setmoveeffect MOVE_EFFECT_RECOIL_25 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN
|
||||
jumpifnotmove MOVE_STRUGGLE, BattleScript_EffectHit
|
||||
incrementgamestat GAME_STAT_USED_STRUGGLE
|
||||
goto BattleScript_EffectHit
|
||||
|
||||
BattleScript_EffectRecoil33::
|
||||
setmoveeffect MOVE_EFFECT_RECOIL_33 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN
|
||||
goto BattleScript_EffectHit
|
||||
|
||||
BattleScript_EffectRecoil33Status:
|
||||
setmoveeffect MOVE_EFFECT_RECOIL_33_STATUS | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN
|
||||
goto BattleScript_EffectHit
|
||||
|
||||
BattleScript_EffectRecoil50:
|
||||
setmoveeffect MOVE_EFFECT_RECOIL_50 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN
|
||||
goto BattleScript_EffectHit
|
||||
|
||||
BattleScript_EffectRecoilHP25:
|
||||
setmoveeffect MOVE_EFFECT_RECOIL_HP_25 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN
|
||||
jumpifnotmove MOVE_STRUGGLE, BattleScript_EffectHit
|
||||
@ -8045,7 +7942,6 @@ BattleScript_MoveEffectConfusion::
|
||||
|
||||
BattleScript_MoveEffectRecoilWithStatus::
|
||||
argumentstatuseffect
|
||||
copyword gBattleMoveDamage, sSAVED_DMG
|
||||
BattleScript_MoveEffectRecoil::
|
||||
jumpifmove MOVE_STRUGGLE, BattleScript_DoRecoil
|
||||
jumpifability BS_ATTACKER, ABILITY_ROCK_HEAD, BattleScript_RecoilEnd
|
||||
@ -8467,24 +8363,33 @@ BattleScript_PsychicSurgeActivates::
|
||||
call BattleScript_TerrainSeedLoop
|
||||
end3
|
||||
|
||||
BattleScript_BadDreamsActivates::
|
||||
setbyte gBattlerTarget, 0
|
||||
call BattleScript_AbilityPopUp
|
||||
BattleScript_BadDreamsLoop:
|
||||
trygetbaddreamstarget BattleScript_BadDreamsEnd
|
||||
dmg_1_8_targethp
|
||||
BattleScript_HurtTarget_NoString:
|
||||
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE
|
||||
printstring STRINGID_BADDREAMSDMG
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
jumpifability BS_TARGET, ABILITY_MAGIC_GUARD, BattleScript_BadDreamsIncrement
|
||||
healthbarupdate BS_TARGET
|
||||
datahpupdate BS_TARGET
|
||||
tryfaintmon BS_TARGET
|
||||
checkteamslost BattleScript_BadDreamsIncrement
|
||||
return
|
||||
|
||||
BattleScript_BadDreamsActivates::
|
||||
call BattleScript_AbilityPopUp
|
||||
setbyte sFIXED_ABILITY_POPUP, TRUE
|
||||
setbyte gBattlerTarget, 0
|
||||
BattleScript_BadDreamsLoop:
|
||||
jumpiftargetally BattleScript_BadDreamsIncrement
|
||||
jumpifability BS_TARGET, ABILITY_MAGIC_GUARD, BattleScript_BadDreamsIncrement
|
||||
jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_BadDreams_Dmg
|
||||
jumpifstatus BS_TARGET, STATUS1_SLEEP, BattleScript_BadDreams_Dmg
|
||||
goto BattleScript_BadDreamsIncrement
|
||||
BattleScript_BadDreams_Dmg:
|
||||
printstring STRINGID_BADDREAMSDMG
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
dmg_1_8_targethp
|
||||
call BattleScript_HurtTarget_NoString
|
||||
BattleScript_BadDreamsIncrement:
|
||||
addbyte gBattlerTarget, 1
|
||||
goto BattleScript_BadDreamsLoop
|
||||
jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_BadDreamsLoop
|
||||
BattleScript_BadDreamsEnd:
|
||||
destroyabilitypopup
|
||||
end3
|
||||
|
||||
BattleScript_TookAttack::
|
||||
@ -9126,6 +9031,7 @@ BattleScript_BerryCureSlpRet::
|
||||
BattleScript_GemActivates::
|
||||
playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT
|
||||
waitanimation
|
||||
setlastuseditem BS_ATTACKER
|
||||
printstring STRINGID_GEMACTIVATES
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
removeitem BS_ATTACKER
|
||||
@ -9134,6 +9040,7 @@ BattleScript_GemActivates::
|
||||
BattleScript_BerryReduceDmg::
|
||||
playanimation BS_TARGET, B_ANIM_HELD_ITEM_EFFECT
|
||||
waitanimation
|
||||
setlastuseditem BS_TARGET
|
||||
printstring STRINGID_TARGETATEITEM
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
removeitem BS_TARGET
|
||||
@ -9382,11 +9289,15 @@ BattleScript_BerryStatRaiseRet_Anim:
|
||||
BattleScript_BerryStatRaiseRet_End:
|
||||
return
|
||||
|
||||
BattleScript_BerryFocusEnergyEnd2::
|
||||
playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT
|
||||
BattleScript_BerryFocusEnergyRet::
|
||||
playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT
|
||||
printstring STRINGID_PKMNUSEDXTOGETPUMPED
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
removeitem BS_ATTACKER
|
||||
removeitem BS_SCRIPTING
|
||||
return
|
||||
|
||||
BattleScript_BerryFocusEnergyEnd2::
|
||||
call BattleScript_BerryFocusEnergyRet
|
||||
end2
|
||||
|
||||
BattleScript_ActionSelectionItemsCantBeUsed::
|
||||
@ -9880,3 +9791,21 @@ BattleScript_SymbiosisActivates::
|
||||
printstring STRINGID_SYMBIOSISITEMPASS
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
return
|
||||
|
||||
BattleScript_TargetAbilityStatRaiseRet::
|
||||
copybyte gBattlerAbility, gEffectBattler
|
||||
copybyte gBattlerAttacker, gBattlerTarget
|
||||
call BattleScript_AbilityPopUp
|
||||
statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN, BattleScript_TargetAbilityStatRaiseRet_End
|
||||
setgraphicalstatchangevalues
|
||||
call BattleScript_StatUp
|
||||
BattleScript_TargetAbilityStatRaiseRet_End:
|
||||
return
|
||||
|
||||
BattleScript_PokemonCantUseTheMove::
|
||||
attackstring
|
||||
ppreduce
|
||||
pause B_WAIT_TIME_SHORT
|
||||
printstring STRINGID_BUTPOKEMONCANTUSETHEMOVE
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
goto BattleScript_MoveEnd
|
||||
|
@ -30,6 +30,7 @@
|
||||
#include "constants/frontier_util.h"
|
||||
#include "constants/game_stat.h"
|
||||
#include "constants/item.h"
|
||||
#include "constants/item_config.h"
|
||||
#include "constants/items.h"
|
||||
#include "constants/heal_locations.h"
|
||||
#include "constants/layouts.h"
|
||||
|
@ -1,6 +1,115 @@
|
||||
EventScript_RepelWoreOff::
|
||||
.if I_REPEL_LURE_MENU == TRUE
|
||||
checkitem ITEM_REPEL, 1
|
||||
goto_if_eq VAR_RESULT, TRUE, EventScript_RepelUseAnother
|
||||
checkitem ITEM_SUPER_REPEL, 1
|
||||
goto_if_eq VAR_RESULT, TRUE, EventScript_RepelUseAnother
|
||||
checkitem ITEM_MAX_REPEL, 1
|
||||
goto_if_eq VAR_RESULT, TRUE, EventScript_RepelUseAnother
|
||||
.else
|
||||
checkitem VAR_LAST_REPEL_LURE_USED, 1
|
||||
goto_if_eq VAR_RESULT, TRUE, EventScript_RepelUseAnother
|
||||
.endif
|
||||
lock
|
||||
msgbox Text_RepelWoreOff, MSGBOX_SIGN
|
||||
release
|
||||
end
|
||||
|
||||
EventScript_RepelUseAnother:
|
||||
lock
|
||||
msgbox Text_UseAnotherRepel, MSGBOX_YESNO
|
||||
.if I_REPEL_LURE_MENU == TRUE
|
||||
callnative TryDrawRepelMenu
|
||||
goto_if_eq VAR_RESULT, FALSE, EventScript_RepelWoreOff_Chose
|
||||
waitstate
|
||||
goto_if_eq VAR_RESULT, 127, EventScript_RepelWoreOff_End
|
||||
EventScript_RepelWoreOff_Chose:
|
||||
callnative HandleRepelMenuChoice
|
||||
bufferitemname 1, VAR_0x8004
|
||||
removeitem VAR_0x8004, 1
|
||||
playse SE_REPEL
|
||||
msgbox Text_UsedNewRepelLure, MSGBOX_SIGN
|
||||
.else
|
||||
goto_if_eq VAR_RESULT, YES, EventScript_UsedRepel
|
||||
.endif
|
||||
EventScript_RepelWoreOff_End:
|
||||
release
|
||||
end
|
||||
|
||||
EventScript_UsedRepel:
|
||||
bufferitemname 1, VAR_LAST_REPEL_LURE_USED
|
||||
playse SE_REPEL
|
||||
lock
|
||||
msgbox Text_UsedNewRepelLure, MSGBOX_SIGN
|
||||
removeitem VAR_LAST_REPEL_LURE_USED, 1
|
||||
waitse
|
||||
callnative HandleUseExpiredRepel
|
||||
release
|
||||
end
|
||||
|
||||
EventScript_LureWoreOff::
|
||||
.if I_REPEL_LURE_MENU == TRUE
|
||||
checkitem ITEM_LURE, 1
|
||||
goto_if_eq VAR_RESULT, TRUE, EventScript_LureUseAnother
|
||||
checkitem ITEM_SUPER_LURE, 1
|
||||
goto_if_eq VAR_RESULT, TRUE, EventScript_LureUseAnother
|
||||
checkitem ITEM_MAX_LURE, 1
|
||||
goto_if_eq VAR_RESULT, TRUE, EventScript_LureUseAnother
|
||||
.else
|
||||
checkitem VAR_LAST_REPEL_LURE_USED, 1
|
||||
goto_if_eq VAR_RESULT, TRUE, EventScript_LureUseAnother
|
||||
.endif
|
||||
lock
|
||||
msgbox Text_LureWoreOff, MSGBOX_SIGN
|
||||
release
|
||||
end
|
||||
|
||||
EventScript_LureUseAnother:
|
||||
lock
|
||||
msgbox Text_UseAnotherLure, MSGBOX_YESNO
|
||||
.if I_REPEL_LURE_MENU == TRUE
|
||||
callnative TryDrawLureMenu
|
||||
goto_if_eq VAR_RESULT, FALSE, EventScript_LureWoreOff_Chose
|
||||
waitstate
|
||||
goto_if_eq VAR_RESULT, 127, EventScript_LureWoreOff_End
|
||||
EventScript_LureWoreOff_Chose:
|
||||
callnative HandleLureMenuChoice
|
||||
bufferitemname 1, VAR_0x8004
|
||||
removeitem VAR_0x8004, 1
|
||||
playse SE_REPEL
|
||||
msgbox Text_UsedNewRepelLure, MSGBOX_SIGN
|
||||
.else
|
||||
goto_if_eq VAR_RESULT, YES, EventScript_UsedLure
|
||||
.endif
|
||||
EventScript_LureWoreOff_End:
|
||||
release
|
||||
end
|
||||
|
||||
EventScript_UsedLure:
|
||||
bufferitemname 1, VAR_LAST_REPEL_LURE_USED
|
||||
playse SE_REPEL
|
||||
lock
|
||||
msgbox Text_UsedNewRepelLure, MSGBOX_SIGN
|
||||
removeitem VAR_LAST_REPEL_LURE_USED, 1
|
||||
waitse
|
||||
callnative HandleUseExpiredLure
|
||||
release
|
||||
end
|
||||
|
||||
Text_RepelWoreOff:
|
||||
.string "REPEL's effect wore off…$"
|
||||
|
||||
Text_UseAnotherRepel::
|
||||
.string "REPEL's effect wore off!\n"
|
||||
.string "Use another?$"
|
||||
|
||||
Text_LureWoreOff:
|
||||
.string "Lure's effect wore off…$"
|
||||
|
||||
Text_UseAnotherLure::
|
||||
.string "Lure's effect wore off!\n"
|
||||
.string "Use another?$"
|
||||
|
||||
Text_UsedNewRepelLure::
|
||||
.string "{PLAYER} used the\n"
|
||||
.string "{STR_VAR_2}.$"
|
||||
|
@ -163,15 +163,20 @@ struct SpecialStatus
|
||||
u8 ppNotAffectedByPressure:1;
|
||||
u8 faintedHasReplacement:1;
|
||||
u8 focusBanded:1;
|
||||
// End of byte
|
||||
u8 focusSashed:1;
|
||||
u8 sturdied:1;
|
||||
u8 stormDrainRedirected:1;
|
||||
u8 switchInAbilityDone:1;
|
||||
u8 switchInItemDone:1;
|
||||
u8 instructedChosenTarget:3;
|
||||
// End of byte
|
||||
u8 berryReduced:1;
|
||||
u8 gemBoost:1;
|
||||
u8 rototillerAffected:1; // to be affected by rototiller
|
||||
u8 parentalBondState:2;
|
||||
u8 multiHitOn:1;
|
||||
// End of byte, two bits unused
|
||||
u8 gemParam;
|
||||
u8 damagedMons:4; // Mons that have been damaged directly by using a move, includes substitute.
|
||||
u8 dancerUsedMove:1;
|
||||
|
@ -216,6 +216,7 @@ extern const u8 BattleScript_BerryConfuseHealEnd2[];
|
||||
extern const u8 BattleScript_BerryConfuseHealRet[];
|
||||
extern const u8 BattleScript_BerryStatRaiseEnd2[];
|
||||
extern const u8 BattleScript_BerryStatRaiseRet[];
|
||||
extern const u8 BattleScript_BerryFocusEnergyRet[];
|
||||
extern const u8 BattleScript_BerryFocusEnergyEnd2[];
|
||||
extern const u8 BattleScript_ActionSelectionItemsCantBeUsed[];
|
||||
extern const u8 BattleScript_ArenaTurnBeginning[];
|
||||
@ -429,6 +430,9 @@ extern const u8 BattleScript_DefDownSpeedUp[];
|
||||
extern const u8 BattleScript_AffectionBasedStatusHeal[];
|
||||
extern const u8 BattleScript_AffectionBasedEndurance[];
|
||||
extern const u8 BattleScript_SymbiosisActivates[];
|
||||
extern const u8 BattleScript_MultiHitPrintStrings[];
|
||||
extern const u8 BattleScript_BurnUpRemoveType[];
|
||||
extern const u8 BattleScript_TargetAbilityStatRaiseRet[];
|
||||
|
||||
// zmoves
|
||||
extern const u8 BattleScript_ZMoveActivateDamaging[];
|
||||
|
@ -51,7 +51,7 @@
|
||||
#define ITEMEFFECT_TARGET 5
|
||||
#define ITEMEFFECT_ORBS 6
|
||||
#define ITEMEFFECT_LIFEORB_SHELLBELL 7
|
||||
#define ITEMEFFECT_BATTLER_MOVE_END 8 // move end effects for just the battler, not whole field
|
||||
#define ITEMEFFECT_USE_LAST_ITEM 8 // move end effects for just the battler, not whole field
|
||||
|
||||
#define WEATHER_HAS_EFFECT ((!IsAbilityOnField(ABILITY_CLOUD_NINE) && !IsAbilityOnField(ABILITY_AIR_LOCK)))
|
||||
|
||||
@ -186,6 +186,7 @@ void TryToRevertMimicry(void);
|
||||
void RestoreBattlerOriginalTypes(u8 battlerId);
|
||||
u32 GetBattlerMoveTargetType(u8 battlerId, u16 move);
|
||||
bool32 CanTargetBattler(u8 battlerAtk, u8 battlerDef, u16 move);
|
||||
bool8 IsMoveAffectedByParentalBond(u16 move, u8 battlerId);
|
||||
// Ability checks
|
||||
bool32 IsRolePlayBannedAbilityAtk(u16 ability);
|
||||
bool32 IsRolePlayBannedAbility(u16 ability);
|
||||
|
@ -312,7 +312,7 @@
|
||||
#define MOVE_EFFECT_PAYDAY 0xB
|
||||
#define MOVE_EFFECT_CHARGING 0xC
|
||||
#define MOVE_EFFECT_WRAP 0xD
|
||||
#define MOVE_EFFECT_RECOIL_25 0xE
|
||||
#define MOVE_EFFECT_BURN_UP 0xE // MOVE_EFFECT_BURN_UP replaces unused MOVE_EFFECT_RECOIL_25 so that stat change animations don't break
|
||||
#define MOVE_EFFECT_ATK_PLUS_1 0xF
|
||||
#define MOVE_EFFECT_DEF_PLUS_1 0x10
|
||||
#define MOVE_EFFECT_SPD_PLUS_1 0x11
|
||||
@ -336,7 +336,7 @@
|
||||
#define MOVE_EFFECT_RAPIDSPIN 0x23
|
||||
#define MOVE_EFFECT_REMOVE_STATUS 0x24
|
||||
#define MOVE_EFFECT_ATK_DEF_DOWN 0x25
|
||||
#define MOVE_EFFECT_RECOIL_33 0x26
|
||||
#define MOVE_EFFECT_SCALE_SHOT 0x26 // MOVE_EFFECT_SCALE_SHOT replaces unused MOVE_EFFECT_RECOIL_33 so that stat change animations don't break
|
||||
#define MOVE_EFFECT_ATK_PLUS_2 0x27
|
||||
#define MOVE_EFFECT_DEF_PLUS_2 0x28
|
||||
#define MOVE_EFFECT_SPD_PLUS_2 0x29
|
||||
@ -354,27 +354,23 @@
|
||||
#define MOVE_EFFECT_THRASH 0x35
|
||||
#define MOVE_EFFECT_KNOCK_OFF 0x36
|
||||
#define MOVE_EFFECT_DEF_SPDEF_DOWN 0x37
|
||||
#define MOVE_EFFECT_RECOIL_33_STATUS 0x38
|
||||
#define MOVE_EFFECT_RECOIL_50 0x39
|
||||
#define MOVE_EFFECT_CLEAR_SMOG 0x3A
|
||||
#define MOVE_EFFECT_SP_ATK_TWO_DOWN 0x3B
|
||||
#define MOVE_EFFECT_SMACK_DOWN 0x3C
|
||||
#define MOVE_EFFECT_FLAME_BURST 0x3D
|
||||
#define MOVE_EFFECT_FEINT 0x3E
|
||||
#define MOVE_EFFECT_SPECTRAL_THIEF 0x3F
|
||||
#define MOVE_EFFECT_V_CREATE 0x40
|
||||
#define MOVE_EFFECT_HAPPY_HOUR 0x41
|
||||
#define MOVE_EFFECT_CORE_ENFORCER 0x42
|
||||
#define MOVE_EFFECT_THROAT_CHOP 0x43
|
||||
#define MOVE_EFFECT_INCINERATE 0x44
|
||||
#define MOVE_EFFECT_BUG_BITE 0x45
|
||||
#define MOVE_EFFECT_RECOIL_HP_25 0x46
|
||||
#define MOVE_EFFECT_RELIC_SONG 0x47
|
||||
#define MOVE_EFFECT_TRAP_BOTH 0x48
|
||||
#define MOVE_EFFECT_SKY_DROP 0x49
|
||||
#define MOVE_EFFECT_SCALE_SHOT 0x4A
|
||||
#define MOVE_EFFECT_CLEAR_SMOG 0x38
|
||||
#define MOVE_EFFECT_SP_ATK_TWO_DOWN 0x39
|
||||
#define MOVE_EFFECT_SMACK_DOWN 0x3A
|
||||
#define MOVE_EFFECT_FLAME_BURST 0x3B
|
||||
#define MOVE_EFFECT_FEINT 0x3C
|
||||
#define MOVE_EFFECT_SPECTRAL_THIEF 0x3D
|
||||
#define MOVE_EFFECT_V_CREATE 0x3E
|
||||
#define MOVE_EFFECT_HAPPY_HOUR 0x3F
|
||||
#define MOVE_EFFECT_CORE_ENFORCER 0x40
|
||||
#define MOVE_EFFECT_THROAT_CHOP 0x41
|
||||
#define MOVE_EFFECT_INCINERATE 0x42
|
||||
#define MOVE_EFFECT_BUG_BITE 0x43
|
||||
#define MOVE_EFFECT_RECOIL_HP_25 0x44
|
||||
#define MOVE_EFFECT_RELIC_SONG 0x45
|
||||
#define MOVE_EFFECT_TRAP_BOTH 0x46
|
||||
|
||||
#define NUM_MOVE_EFFECTS 0x4B
|
||||
#define NUM_MOVE_EFFECTS 0x47
|
||||
|
||||
#define MOVE_EFFECT_AFFECTS_USER 0x4000
|
||||
#define MOVE_EFFECT_CERTAIN 0x8000
|
||||
@ -488,4 +484,9 @@
|
||||
// For the second argument of GetMoveTarget, when no target override is needed
|
||||
#define NO_TARGET_OVERRIDE 0
|
||||
|
||||
// Constants for Parental Bond
|
||||
#define PARENTAL_BOND_1ST_HIT 2
|
||||
#define PARENTAL_BOND_2ND_HIT 1
|
||||
#define PARENTAL_BOND_OFF 0
|
||||
|
||||
#endif // GUARD_CONSTANTS_BATTLE_H
|
||||
|
@ -29,6 +29,7 @@
|
||||
#define B_KNOCK_OFF_DMG GEN_LATEST // In Gen6+, Knock Off deals 50% more damage when knocking off an item.
|
||||
#define B_SPORT_DMG_REDUCTION GEN_LATEST // In Gen5+, Water/Mud Sport reduce Fire/Electric Damage by 67% instead of 50%.
|
||||
#define B_EXPLOSION_DEFENSE GEN_LATEST // In Gen5+, Self-Destruct and Explosion don't halve the targets' defense.
|
||||
#define B_PARENTAL_BOND_DMG GEN_LATEST // In Gen7+, Parental Bond's second hit does 25% of the initial hits damage. Before, it did 50%.
|
||||
|
||||
// Type settings
|
||||
#define B_GHOSTS_ESCAPE GEN_LATEST // In Gen6+, abilities like Shadow Tag or moves like Mean Look fail on Ghost-type Pokémon. They can also escape any Wild Battle.
|
||||
@ -89,6 +90,8 @@
|
||||
#define B_ROOTED_GROUNDING GEN_LATEST // In Gen4+, Ingrain causes the affected Pokémon to become grounded.
|
||||
#define B_METRONOME_MOVES GEN_LATEST // This config will determine up to which generation will Metronome pull moves from.
|
||||
#define B_TELEPORT_BEHAVIOR GEN_LATEST // In Gen7+, starting with Pokémon LGPE, Teleport allows the user to swap out with another party member.
|
||||
#define B_BEAT_UP GEN_LATEST // In Gen5+, Beat Up uses a different formula to calculate its damage, and deals Dark-type damage. Prior to Gen 5, each hit also announces the party member's name.
|
||||
#define B_DARK_VOID_FAIL GEN_LATEST // In Gen7+, only Darkrai can use Dark Void.
|
||||
|
||||
// Ability settings
|
||||
#define B_EXPANDED_ABILITY_NAMES TRUE // If TRUE, ability names are increased from 12 characters to 16 characters.
|
||||
|
@ -1,402 +1,399 @@
|
||||
#ifndef GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H
|
||||
#define GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H
|
||||
|
||||
#define EFFECT_HIT 0
|
||||
#define EFFECT_SLEEP 1
|
||||
#define EFFECT_POISON_HIT 2
|
||||
#define EFFECT_ABSORB 3
|
||||
#define EFFECT_BURN_HIT 4
|
||||
#define EFFECT_FREEZE_HIT 5
|
||||
#define EFFECT_PARALYZE_HIT 6
|
||||
#define EFFECT_EXPLOSION 7
|
||||
#define EFFECT_DREAM_EATER 8
|
||||
#define EFFECT_MIRROR_MOVE 9
|
||||
#define EFFECT_ATTACK_UP 10
|
||||
#define EFFECT_DEFENSE_UP 11
|
||||
#define EFFECT_SPEED_UP 12
|
||||
#define EFFECT_SPECIAL_ATTACK_UP 13
|
||||
#define EFFECT_SPECIAL_DEFENSE_UP 14
|
||||
#define EFFECT_ACCURACY_UP 15
|
||||
#define EFFECT_EVASION_UP 16
|
||||
#define EFFECT_SPECIAL_ATTACK_UP_3 17
|
||||
#define EFFECT_ATTACK_DOWN 18
|
||||
#define EFFECT_DEFENSE_DOWN 19
|
||||
#define EFFECT_SPEED_DOWN 20
|
||||
#define EFFECT_SPECIAL_ATTACK_DOWN 21
|
||||
#define EFFECT_SPECIAL_DEFENSE_DOWN 22
|
||||
#define EFFECT_ACCURACY_DOWN 23
|
||||
#define EFFECT_EVASION_DOWN 24
|
||||
#define EFFECT_HAZE 25
|
||||
#define EFFECT_BIDE 26
|
||||
#define EFFECT_RAMPAGE 27
|
||||
#define EFFECT_ROAR 28
|
||||
#define EFFECT_MULTI_HIT 29
|
||||
#define EFFECT_CONVERSION 30
|
||||
#define EFFECT_FLINCH_HIT 31
|
||||
#define EFFECT_RESTORE_HP 32
|
||||
#define EFFECT_TOXIC 33
|
||||
#define EFFECT_PAY_DAY 34
|
||||
#define EFFECT_LIGHT_SCREEN 35
|
||||
#define EFFECT_TRI_ATTACK 36
|
||||
#define EFFECT_REST 37
|
||||
#define EFFECT_OHKO 38
|
||||
#define EFFECT_FUSION_COMBO 39
|
||||
#define EFFECT_SUPER_FANG 40
|
||||
#define EFFECT_DRAGON_RAGE 41
|
||||
#define EFFECT_TRAP 42
|
||||
#define EFFECT_HEAL_BLOCK 43
|
||||
#define EFFECT_DOUBLE_HIT 44
|
||||
#define EFFECT_RECOIL_IF_MISS 45
|
||||
#define EFFECT_MIST 46
|
||||
#define EFFECT_FOCUS_ENERGY 47
|
||||
#define EFFECT_RECOIL_25 48
|
||||
#define EFFECT_CONFUSE 49
|
||||
#define EFFECT_ATTACK_UP_2 50
|
||||
#define EFFECT_DEFENSE_UP_2 51
|
||||
#define EFFECT_SPEED_UP_2 52
|
||||
#define EFFECT_SPECIAL_ATTACK_UP_2 53
|
||||
#define EFFECT_SPECIAL_DEFENSE_UP_2 54
|
||||
#define EFFECT_ACCURACY_UP_2 55
|
||||
#define EFFECT_EVASION_UP_2 56
|
||||
#define EFFECT_TRANSFORM 57
|
||||
#define EFFECT_ATTACK_DOWN_2 58
|
||||
#define EFFECT_DEFENSE_DOWN_2 59
|
||||
#define EFFECT_SPEED_DOWN_2 60
|
||||
#define EFFECT_SPECIAL_ATTACK_DOWN_2 61
|
||||
#define EFFECT_SPECIAL_DEFENSE_DOWN_2 62
|
||||
#define EFFECT_ACCURACY_DOWN_2 63
|
||||
#define EFFECT_EVASION_DOWN_2 64
|
||||
#define EFFECT_REFLECT 65
|
||||
#define EFFECT_POISON 66
|
||||
#define EFFECT_PARALYZE 67
|
||||
#define EFFECT_ATTACK_DOWN_HIT 68
|
||||
#define EFFECT_DEFENSE_DOWN_HIT 69
|
||||
#define EFFECT_SPEED_DOWN_HIT 70
|
||||
#define EFFECT_SPECIAL_ATTACK_DOWN_HIT 71
|
||||
#define EFFECT_SPECIAL_DEFENSE_DOWN_HIT 72
|
||||
#define EFFECT_ACCURACY_DOWN_HIT 73
|
||||
#define EFFECT_EVASION_DOWN_HIT 74
|
||||
#define EFFECT_TWO_TURNS_ATTACK 75
|
||||
#define EFFECT_CONFUSE_HIT 76
|
||||
#define EFFECT_TWINEEDLE 77
|
||||
#define EFFECT_VITAL_THROW 78
|
||||
#define EFFECT_SUBSTITUTE 79
|
||||
#define EFFECT_RECHARGE 80
|
||||
#define EFFECT_RAGE 81
|
||||
#define EFFECT_MIMIC 82
|
||||
#define EFFECT_METRONOME 83
|
||||
#define EFFECT_LEECH_SEED 84
|
||||
#define EFFECT_DO_NOTHING 85
|
||||
#define EFFECT_DISABLE 86
|
||||
#define EFFECT_LEVEL_DAMAGE 87
|
||||
#define EFFECT_PSYWAVE 88
|
||||
#define EFFECT_COUNTER 89
|
||||
#define EFFECT_ENCORE 90
|
||||
#define EFFECT_PAIN_SPLIT 91
|
||||
#define EFFECT_SNORE 92
|
||||
#define EFFECT_CONVERSION_2 93
|
||||
#define EFFECT_LOCK_ON 94
|
||||
#define EFFECT_SKETCH 95
|
||||
#define EFFECT_HAMMER_ARM 96
|
||||
#define EFFECT_SLEEP_TALK 97
|
||||
#define EFFECT_DESTINY_BOND 98
|
||||
#define EFFECT_FLAIL 99
|
||||
#define EFFECT_SPITE 100
|
||||
#define EFFECT_FALSE_SWIPE 101
|
||||
#define EFFECT_HEAL_BELL 102
|
||||
#define EFFECT_ALWAYS_CRIT 103
|
||||
#define EFFECT_TRIPLE_KICK 104
|
||||
#define EFFECT_THIEF 105
|
||||
#define EFFECT_MEAN_LOOK 106
|
||||
#define EFFECT_NIGHTMARE 107
|
||||
#define EFFECT_MINIMIZE 108
|
||||
#define EFFECT_CURSE 109
|
||||
#define EFFECT_HEALING_WISH 110
|
||||
#define EFFECT_PROTECT 111
|
||||
#define EFFECT_SPIKES 112
|
||||
#define EFFECT_FORESIGHT 113
|
||||
#define EFFECT_PERISH_SONG 114
|
||||
#define EFFECT_SANDSTORM 115
|
||||
#define EFFECT_ENDURE 116
|
||||
#define EFFECT_ROLLOUT 117
|
||||
#define EFFECT_SWAGGER 118
|
||||
#define EFFECT_FURY_CUTTER 119
|
||||
#define EFFECT_ATTRACT 120
|
||||
#define EFFECT_RETURN 121
|
||||
#define EFFECT_PRESENT 122
|
||||
#define EFFECT_FRUSTRATION 123
|
||||
#define EFFECT_SAFEGUARD 124
|
||||
#define EFFECT_UNUSED_125 125
|
||||
#define EFFECT_MAGNITUDE 126
|
||||
#define EFFECT_BATON_PASS 127
|
||||
#define EFFECT_PURSUIT 128
|
||||
#define EFFECT_RAPID_SPIN 129
|
||||
#define EFFECT_SONICBOOM 130
|
||||
#define EFFECT_CAPTIVATE 131
|
||||
#define EFFECT_MORNING_SUN 132
|
||||
#define EFFECT_SYNTHESIS 133
|
||||
#define EFFECT_MOONLIGHT 134
|
||||
#define EFFECT_HIDDEN_POWER 135
|
||||
#define EFFECT_RAIN_DANCE 136
|
||||
#define EFFECT_SUNNY_DAY 137
|
||||
#define EFFECT_DEFENSE_UP_HIT 138
|
||||
#define EFFECT_ATTACK_UP_HIT 139
|
||||
#define EFFECT_ALL_STATS_UP_HIT 140
|
||||
#define EFFECT_FELL_STINGER 141
|
||||
#define EFFECT_BELLY_DRUM 142
|
||||
#define EFFECT_PSYCH_UP 143
|
||||
#define EFFECT_MIRROR_COAT 144
|
||||
#define EFFECT_SKULL_BASH 145
|
||||
#define EFFECT_TWISTER 146
|
||||
#define EFFECT_EARTHQUAKE 147
|
||||
#define EFFECT_FUTURE_SIGHT 148
|
||||
#define EFFECT_GUST 149
|
||||
#define EFFECT_FLINCH_MINIMIZE_HIT 150
|
||||
#define EFFECT_SOLAR_BEAM 151
|
||||
#define EFFECT_THUNDER 152
|
||||
#define EFFECT_TELEPORT 153
|
||||
#define EFFECT_BEAT_UP 154
|
||||
#define EFFECT_SEMI_INVULNERABLE 155
|
||||
#define EFFECT_DEFENSE_CURL 156
|
||||
#define EFFECT_SOFTBOILED 157
|
||||
#define EFFECT_FAKE_OUT 158
|
||||
#define EFFECT_UPROAR 159
|
||||
#define EFFECT_STOCKPILE 160
|
||||
#define EFFECT_SPIT_UP 161
|
||||
#define EFFECT_SWALLOW 162
|
||||
#define EFFECT_WORRY_SEED 163
|
||||
#define EFFECT_HAIL 164
|
||||
#define EFFECT_TORMENT 165
|
||||
#define EFFECT_FLATTER 166
|
||||
#define EFFECT_WILL_O_WISP 167
|
||||
#define EFFECT_MEMENTO 168
|
||||
#define EFFECT_FACADE 169
|
||||
#define EFFECT_FOCUS_PUNCH 170
|
||||
#define EFFECT_SMELLINGSALT 171
|
||||
#define EFFECT_FOLLOW_ME 172
|
||||
#define EFFECT_NATURE_POWER 173
|
||||
#define EFFECT_CHARGE 174
|
||||
#define EFFECT_TAUNT 175
|
||||
#define EFFECT_HELPING_HAND 176
|
||||
#define EFFECT_TRICK 177
|
||||
#define EFFECT_ROLE_PLAY 178
|
||||
#define EFFECT_WISH 179
|
||||
#define EFFECT_ASSIST 180
|
||||
#define EFFECT_INGRAIN 181
|
||||
#define EFFECT_SUPERPOWER 182
|
||||
#define EFFECT_MAGIC_COAT 183
|
||||
#define EFFECT_RECYCLE 184
|
||||
#define EFFECT_REVENGE 185
|
||||
#define EFFECT_BRICK_BREAK 186
|
||||
#define EFFECT_YAWN 187
|
||||
#define EFFECT_KNOCK_OFF 188
|
||||
#define EFFECT_ENDEAVOR 189
|
||||
#define EFFECT_ERUPTION 190
|
||||
#define EFFECT_SKILL_SWAP 191
|
||||
#define EFFECT_IMPRISON 192
|
||||
#define EFFECT_REFRESH 193
|
||||
#define EFFECT_GRUDGE 194
|
||||
#define EFFECT_SNATCH 195
|
||||
#define EFFECT_LOW_KICK 196
|
||||
#define EFFECT_SECRET_POWER 197
|
||||
#define EFFECT_RECOIL_33 198
|
||||
#define EFFECT_TEETER_DANCE 199
|
||||
#define EFFECT_HIT_ESCAPE 200
|
||||
#define EFFECT_MUD_SPORT 201
|
||||
#define EFFECT_POISON_FANG 202
|
||||
#define EFFECT_WEATHER_BALL 203
|
||||
#define EFFECT_OVERHEAT 204
|
||||
#define EFFECT_TICKLE 205
|
||||
#define EFFECT_COSMIC_POWER 206
|
||||
#define EFFECT_SKY_UPPERCUT 207
|
||||
#define EFFECT_BULK_UP 208
|
||||
#define EFFECT_PLACEHOLDER 209
|
||||
#define EFFECT_WATER_SPORT 210
|
||||
#define EFFECT_CALM_MIND 211
|
||||
#define EFFECT_DRAGON_DANCE 212
|
||||
#define EFFECT_CAMOUFLAGE 213
|
||||
#define EFFECT_HIT 0
|
||||
#define EFFECT_SLEEP 1
|
||||
#define EFFECT_POISON_HIT 2
|
||||
#define EFFECT_ABSORB 3
|
||||
#define EFFECT_BURN_HIT 4
|
||||
#define EFFECT_FREEZE_HIT 5
|
||||
#define EFFECT_PARALYZE_HIT 6
|
||||
#define EFFECT_EXPLOSION 7
|
||||
#define EFFECT_DREAM_EATER 8
|
||||
#define EFFECT_MIRROR_MOVE 9
|
||||
#define EFFECT_ATTACK_UP 10
|
||||
#define EFFECT_DEFENSE_UP 11
|
||||
#define EFFECT_SPEED_UP 12
|
||||
#define EFFECT_SPECIAL_ATTACK_UP 13
|
||||
#define EFFECT_SPECIAL_DEFENSE_UP 14
|
||||
#define EFFECT_ACCURACY_UP 15
|
||||
#define EFFECT_EVASION_UP 16
|
||||
#define EFFECT_SPECIAL_ATTACK_UP_3 17
|
||||
#define EFFECT_ATTACK_DOWN 18
|
||||
#define EFFECT_DEFENSE_DOWN 19
|
||||
#define EFFECT_SPEED_DOWN 20
|
||||
#define EFFECT_SPECIAL_ATTACK_DOWN 21
|
||||
#define EFFECT_SPECIAL_DEFENSE_DOWN 22
|
||||
#define EFFECT_ACCURACY_DOWN 23
|
||||
#define EFFECT_EVASION_DOWN 24
|
||||
#define EFFECT_HAZE 25
|
||||
#define EFFECT_BIDE 26
|
||||
#define EFFECT_RAMPAGE 27
|
||||
#define EFFECT_ROAR 28
|
||||
#define EFFECT_MULTI_HIT 29
|
||||
#define EFFECT_CONVERSION 30
|
||||
#define EFFECT_FLINCH_HIT 31
|
||||
#define EFFECT_RESTORE_HP 32
|
||||
#define EFFECT_TOXIC 33
|
||||
#define EFFECT_PAY_DAY 34
|
||||
#define EFFECT_LIGHT_SCREEN 35
|
||||
#define EFFECT_TRI_ATTACK 36
|
||||
#define EFFECT_REST 37
|
||||
#define EFFECT_OHKO 38
|
||||
#define EFFECT_FUSION_COMBO 39
|
||||
#define EFFECT_SUPER_FANG 40
|
||||
#define EFFECT_DRAGON_RAGE 41
|
||||
#define EFFECT_TRAP 42
|
||||
#define EFFECT_HEAL_BLOCK 43
|
||||
#define EFFECT_RECOIL_IF_MISS 44
|
||||
#define EFFECT_MIST 45
|
||||
#define EFFECT_FOCUS_ENERGY 46
|
||||
#define EFFECT_RECOIL_25 47
|
||||
#define EFFECT_CONFUSE 48
|
||||
#define EFFECT_ATTACK_UP_2 49
|
||||
#define EFFECT_DEFENSE_UP_2 50
|
||||
#define EFFECT_SPEED_UP_2 51
|
||||
#define EFFECT_SPECIAL_ATTACK_UP_2 52
|
||||
#define EFFECT_SPECIAL_DEFENSE_UP_2 53
|
||||
#define EFFECT_ACCURACY_UP_2 54
|
||||
#define EFFECT_EVASION_UP_2 55
|
||||
#define EFFECT_TRANSFORM 56
|
||||
#define EFFECT_ATTACK_DOWN_2 57
|
||||
#define EFFECT_DEFENSE_DOWN_2 58
|
||||
#define EFFECT_SPEED_DOWN_2 59
|
||||
#define EFFECT_SPECIAL_ATTACK_DOWN_2 60
|
||||
#define EFFECT_SPECIAL_DEFENSE_DOWN_2 61
|
||||
#define EFFECT_ACCURACY_DOWN_2 62
|
||||
#define EFFECT_EVASION_DOWN_2 63
|
||||
#define EFFECT_REFLECT 64
|
||||
#define EFFECT_POISON 65
|
||||
#define EFFECT_PARALYZE 66
|
||||
#define EFFECT_ATTACK_DOWN_HIT 67
|
||||
#define EFFECT_DEFENSE_DOWN_HIT 68
|
||||
#define EFFECT_SPEED_DOWN_HIT 69
|
||||
#define EFFECT_SPECIAL_ATTACK_DOWN_HIT 70
|
||||
#define EFFECT_SPECIAL_DEFENSE_DOWN_HIT 71
|
||||
#define EFFECT_ACCURACY_DOWN_HIT 72
|
||||
#define EFFECT_EVASION_DOWN_HIT 73
|
||||
#define EFFECT_TWO_TURNS_ATTACK 74
|
||||
#define EFFECT_CONFUSE_HIT 75
|
||||
#define EFFECT_VITAL_THROW 76
|
||||
#define EFFECT_SUBSTITUTE 77
|
||||
#define EFFECT_RECHARGE 78
|
||||
#define EFFECT_RAGE 79
|
||||
#define EFFECT_MIMIC 80
|
||||
#define EFFECT_METRONOME 81
|
||||
#define EFFECT_LEECH_SEED 82
|
||||
#define EFFECT_DO_NOTHING 83
|
||||
#define EFFECT_DISABLE 84
|
||||
#define EFFECT_LEVEL_DAMAGE 85
|
||||
#define EFFECT_PSYWAVE 86
|
||||
#define EFFECT_COUNTER 87
|
||||
#define EFFECT_ENCORE 88
|
||||
#define EFFECT_PAIN_SPLIT 89
|
||||
#define EFFECT_SNORE 90
|
||||
#define EFFECT_CONVERSION_2 91
|
||||
#define EFFECT_LOCK_ON 92
|
||||
#define EFFECT_SKETCH 93
|
||||
#define EFFECT_HAMMER_ARM 94
|
||||
#define EFFECT_SLEEP_TALK 95
|
||||
#define EFFECT_DESTINY_BOND 96
|
||||
#define EFFECT_FLAIL 97
|
||||
#define EFFECT_SPITE 98
|
||||
#define EFFECT_FALSE_SWIPE 99
|
||||
#define EFFECT_HEAL_BELL 100
|
||||
#define EFFECT_ALWAYS_CRIT 101
|
||||
#define EFFECT_TRIPLE_KICK 102
|
||||
#define EFFECT_THIEF 103
|
||||
#define EFFECT_MEAN_LOOK 104
|
||||
#define EFFECT_NIGHTMARE 105
|
||||
#define EFFECT_MINIMIZE 106
|
||||
#define EFFECT_CURSE 107
|
||||
#define EFFECT_HEALING_WISH 108
|
||||
#define EFFECT_PROTECT 109
|
||||
#define EFFECT_SPIKES 110
|
||||
#define EFFECT_FORESIGHT 111
|
||||
#define EFFECT_PERISH_SONG 112
|
||||
#define EFFECT_SANDSTORM 113
|
||||
#define EFFECT_ENDURE 114
|
||||
#define EFFECT_ROLLOUT 115
|
||||
#define EFFECT_SWAGGER 116
|
||||
#define EFFECT_FURY_CUTTER 117
|
||||
#define EFFECT_ATTRACT 118
|
||||
#define EFFECT_RETURN 119
|
||||
#define EFFECT_PRESENT 120
|
||||
#define EFFECT_FRUSTRATION 121
|
||||
#define EFFECT_SAFEGUARD 122
|
||||
#define EFFECT_UNUSED_125 123
|
||||
#define EFFECT_MAGNITUDE 124
|
||||
#define EFFECT_BATON_PASS 125
|
||||
#define EFFECT_PURSUIT 126
|
||||
#define EFFECT_RAPID_SPIN 127
|
||||
#define EFFECT_SONICBOOM 128
|
||||
#define EFFECT_CAPTIVATE 129
|
||||
#define EFFECT_MORNING_SUN 130
|
||||
#define EFFECT_SYNTHESIS 131
|
||||
#define EFFECT_MOONLIGHT 132
|
||||
#define EFFECT_HIDDEN_POWER 133
|
||||
#define EFFECT_RAIN_DANCE 134
|
||||
#define EFFECT_SUNNY_DAY 135
|
||||
#define EFFECT_DEFENSE_UP_HIT 136
|
||||
#define EFFECT_ATTACK_UP_HIT 137
|
||||
#define EFFECT_ALL_STATS_UP_HIT 138
|
||||
#define EFFECT_FELL_STINGER 139
|
||||
#define EFFECT_BELLY_DRUM 140
|
||||
#define EFFECT_PSYCH_UP 141
|
||||
#define EFFECT_MIRROR_COAT 142
|
||||
#define EFFECT_SKULL_BASH 143
|
||||
#define EFFECT_TWISTER 144
|
||||
#define EFFECT_EARTHQUAKE 145
|
||||
#define EFFECT_FUTURE_SIGHT 146
|
||||
#define EFFECT_GUST 147
|
||||
#define EFFECT_FLINCH_MINIMIZE_HIT 148
|
||||
#define EFFECT_SOLAR_BEAM 149
|
||||
#define EFFECT_THUNDER 150
|
||||
#define EFFECT_TELEPORT 151
|
||||
#define EFFECT_BEAT_UP 152
|
||||
#define EFFECT_SEMI_INVULNERABLE 153
|
||||
#define EFFECT_DEFENSE_CURL 154
|
||||
#define EFFECT_SOFTBOILED 155
|
||||
#define EFFECT_FAKE_OUT 156
|
||||
#define EFFECT_UPROAR 157
|
||||
#define EFFECT_STOCKPILE 158
|
||||
#define EFFECT_SPIT_UP 159
|
||||
#define EFFECT_SWALLOW 160
|
||||
#define EFFECT_WORRY_SEED 161
|
||||
#define EFFECT_HAIL 162
|
||||
#define EFFECT_TORMENT 163
|
||||
#define EFFECT_FLATTER 164
|
||||
#define EFFECT_WILL_O_WISP 165
|
||||
#define EFFECT_MEMENTO 166
|
||||
#define EFFECT_FACADE 167
|
||||
#define EFFECT_FOCUS_PUNCH 168
|
||||
#define EFFECT_SMELLINGSALT 169
|
||||
#define EFFECT_FOLLOW_ME 170
|
||||
#define EFFECT_NATURE_POWER 171
|
||||
#define EFFECT_CHARGE 172
|
||||
#define EFFECT_TAUNT 173
|
||||
#define EFFECT_HELPING_HAND 174
|
||||
#define EFFECT_TRICK 175
|
||||
#define EFFECT_ROLE_PLAY 176
|
||||
#define EFFECT_WISH 177
|
||||
#define EFFECT_ASSIST 178
|
||||
#define EFFECT_INGRAIN 179
|
||||
#define EFFECT_SUPERPOWER 180
|
||||
#define EFFECT_MAGIC_COAT 181
|
||||
#define EFFECT_RECYCLE 182
|
||||
#define EFFECT_REVENGE 183
|
||||
#define EFFECT_BRICK_BREAK 184
|
||||
#define EFFECT_YAWN 185
|
||||
#define EFFECT_KNOCK_OFF 186
|
||||
#define EFFECT_ENDEAVOR 187
|
||||
#define EFFECT_ERUPTION 188
|
||||
#define EFFECT_SKILL_SWAP 189
|
||||
#define EFFECT_IMPRISON 190
|
||||
#define EFFECT_REFRESH 191
|
||||
#define EFFECT_GRUDGE 192
|
||||
#define EFFECT_SNATCH 193
|
||||
#define EFFECT_LOW_KICK 194
|
||||
#define EFFECT_SECRET_POWER 195
|
||||
#define EFFECT_RECOIL_33 196
|
||||
#define EFFECT_TEETER_DANCE 197
|
||||
#define EFFECT_HIT_ESCAPE 198
|
||||
#define EFFECT_MUD_SPORT 199
|
||||
#define EFFECT_POISON_FANG 200
|
||||
#define EFFECT_WEATHER_BALL 201
|
||||
#define EFFECT_OVERHEAT 202
|
||||
#define EFFECT_TICKLE 203
|
||||
#define EFFECT_COSMIC_POWER 204
|
||||
#define EFFECT_SKY_UPPERCUT 205
|
||||
#define EFFECT_BULK_UP 206
|
||||
#define EFFECT_PLACEHOLDER 207
|
||||
#define EFFECT_WATER_SPORT 208
|
||||
#define EFFECT_CALM_MIND 209
|
||||
#define EFFECT_DRAGON_DANCE 210
|
||||
#define EFFECT_CAMOUFLAGE 211
|
||||
|
||||
// New move effects
|
||||
#define EFFECT_PLEDGE 214
|
||||
#define EFFECT_FLING 215
|
||||
#define EFFECT_NATURAL_GIFT 216
|
||||
#define EFFECT_WAKE_UP_SLAP 217
|
||||
#define EFFECT_WRING_OUT 218
|
||||
#define EFFECT_HEX 219
|
||||
#define EFFECT_ASSURANCE 220
|
||||
#define EFFECT_TRUMP_CARD 221
|
||||
#define EFFECT_ACROBATICS 222
|
||||
#define EFFECT_HEAT_CRASH 223
|
||||
#define EFFECT_PUNISHMENT 224
|
||||
#define EFFECT_STORED_POWER 225
|
||||
#define EFFECT_ELECTRO_BALL 226
|
||||
#define EFFECT_GYRO_BALL 227
|
||||
#define EFFECT_ECHOED_VOICE 228
|
||||
#define EFFECT_PAYBACK 229
|
||||
#define EFFECT_ROUND 230
|
||||
#define EFFECT_BRINE 231
|
||||
#define EFFECT_VENOSHOCK 232
|
||||
#define EFFECT_RETALIATE 233
|
||||
#define EFFECT_BULLDOZE 234
|
||||
#define EFFECT_FOUL_PLAY 235
|
||||
#define EFFECT_PSYSHOCK 236
|
||||
#define EFFECT_ROOST 237
|
||||
#define EFFECT_GRAVITY 238
|
||||
#define EFFECT_MIRACLE_EYE 239
|
||||
#define EFFECT_TAILWIND 240
|
||||
#define EFFECT_EMBARGO 241
|
||||
#define EFFECT_AQUA_RING 242
|
||||
#define EFFECT_TRICK_ROOM 243
|
||||
#define EFFECT_WONDER_ROOM 244
|
||||
#define EFFECT_MAGIC_ROOM 245
|
||||
#define EFFECT_MAGNET_RISE 246
|
||||
#define EFFECT_TOXIC_SPIKES 247
|
||||
#define EFFECT_GASTRO_ACID 248
|
||||
#define EFFECT_STEALTH_ROCK 249
|
||||
#define EFFECT_TELEKINESIS 250
|
||||
#define EFFECT_POWER_SWAP 251
|
||||
#define EFFECT_GUARD_SWAP 252
|
||||
#define EFFECT_HEART_SWAP 253
|
||||
#define EFFECT_POWER_SPLIT 254
|
||||
#define EFFECT_GUARD_SPLIT 255
|
||||
#define EFFECT_STICKY_WEB 256
|
||||
#define EFFECT_METAL_BURST 257
|
||||
#define EFFECT_LUCKY_CHANT 258
|
||||
#define EFFECT_SUCKER_PUNCH 259
|
||||
#define EFFECT_SPECIAL_DEFENSE_DOWN_HIT_2 260
|
||||
#define EFFECT_SIMPLE_BEAM 261
|
||||
#define EFFECT_ENTRAINMENT 262
|
||||
#define EFFECT_HEAL_PULSE 263
|
||||
#define EFFECT_QUASH 264
|
||||
#define EFFECT_ION_DELUGE 265
|
||||
#define EFFECT_FREEZE_DRY 266
|
||||
#define EFFECT_TOPSY_TURVY 267
|
||||
#define EFFECT_MISTY_TERRAIN 268
|
||||
#define EFFECT_GRASSY_TERRAIN 269
|
||||
#define EFFECT_ELECTRIC_TERRAIN 270
|
||||
#define EFFECT_PSYCHIC_TERRAIN 271
|
||||
#define EFFECT_ATTACK_ACCURACY_UP 272
|
||||
#define EFFECT_ATTACK_SPATK_UP 273
|
||||
#define EFFECT_HURRICANE 274
|
||||
#define EFFECT_TWO_TYPED_MOVE 275
|
||||
#define EFFECT_ME_FIRST 276
|
||||
#define EFFECT_SPEED_UP_HIT 277
|
||||
#define EFFECT_QUIVER_DANCE 278
|
||||
#define EFFECT_COIL 279
|
||||
#define EFFECT_ELECTRIFY 280
|
||||
#define EFFECT_SCALD 281
|
||||
#define EFFECT_REFLECT_TYPE 282
|
||||
#define EFFECT_SOAK 283
|
||||
#define EFFECT_GROWTH 284
|
||||
#define EFFECT_CLOSE_COMBAT 285
|
||||
#define EFFECT_LAST_RESORT 286
|
||||
#define EFFECT_RECOIL_33_STATUS 287
|
||||
#define EFFECT_FLINCH_STATUS 288
|
||||
#define EFFECT_RECOIL_50 289
|
||||
#define EFFECT_SHELL_SMASH 290
|
||||
#define EFFECT_SHIFT_GEAR 291
|
||||
#define EFFECT_DEFENSE_UP_3 292
|
||||
#define EFFECT_NOBLE_ROAR 293
|
||||
#define EFFECT_VENOM_DRENCH 294
|
||||
#define EFFECT_TOXIC_THREAD 295
|
||||
#define EFFECT_CLEAR_SMOG 296
|
||||
#define EFFECT_HIT_SWITCH_TARGET 297
|
||||
#define EFFECT_FINAL_GAMBIT 298
|
||||
#define EFFECT_CHANGE_TYPE_ON_ITEM 299
|
||||
#define EFFECT_AUTOTOMIZE 300
|
||||
#define EFFECT_COPYCAT 301
|
||||
#define EFFECT_DEFOG 302
|
||||
#define EFFECT_HIT_ENEMY_HEAL_ALLY 303
|
||||
#define EFFECT_SMACK_DOWN 304
|
||||
#define EFFECT_SYNCHRONOISE 305
|
||||
#define EFFECT_PSYCHO_SHIFT 306
|
||||
#define EFFECT_POWER_TRICK 307
|
||||
#define EFFECT_FLAME_BURST 308
|
||||
#define EFFECT_AFTER_YOU 309
|
||||
#define EFFECT_BESTOW 310
|
||||
#define EFFECT_ROTOTILLER 311
|
||||
#define EFFECT_FLOWER_SHIELD 312
|
||||
#define EFFECT_HIT_PREVENT_ESCAPE 313
|
||||
#define EFFECT_SPEED_SWAP 314
|
||||
#define EFFECT_DEFENSE_UP2_HIT 315
|
||||
#define EFFECT_REVELATION_DANCE 316
|
||||
#define EFFECT_AURORA_VEIL 317
|
||||
#define EFFECT_THIRD_TYPE 318
|
||||
#define EFFECT_FEINT 319
|
||||
#define EFFECT_SPARKLING_ARIA 320
|
||||
#define EFFECT_ACUPRESSURE 321
|
||||
#define EFFECT_AROMATIC_MIST 322
|
||||
#define EFFECT_POWDER 323
|
||||
#define EFFECT_SP_ATTACK_UP_HIT 324
|
||||
#define EFFECT_BELCH 325
|
||||
#define EFFECT_PARTING_SHOT 326
|
||||
#define EFFECT_SPECTRAL_THIEF 327
|
||||
#define EFFECT_V_CREATE 328
|
||||
#define EFFECT_MAT_BLOCK 329
|
||||
#define EFFECT_STOMPING_TANTRUM 330
|
||||
#define EFFECT_CORE_ENFORCER 331
|
||||
#define EFFECT_INSTRUCT 332
|
||||
#define EFFECT_THROAT_CHOP 333
|
||||
#define EFFECT_LASER_FOCUS 334
|
||||
#define EFFECT_MAGNETIC_FLUX 335
|
||||
#define EFFECT_GEAR_UP 336
|
||||
#define EFFECT_INCINERATE 337
|
||||
#define EFFECT_BUG_BITE 338
|
||||
#define EFFECT_STRENGTH_SAP 339
|
||||
#define EFFECT_MIND_BLOWN 340
|
||||
#define EFFECT_PURIFY 341
|
||||
#define EFFECT_BURN_UP 342
|
||||
#define EFFECT_SHORE_UP 343
|
||||
#define EFFECT_GEOMANCY 344
|
||||
#define EFFECT_FAIRY_LOCK 345
|
||||
#define EFFECT_ALLY_SWITCH 346
|
||||
#define EFFECT_RELIC_SONG 347
|
||||
#define EFFECT_ATTACKER_DEFENSE_DOWN_HIT 348
|
||||
#define EFFECT_BODY_PRESS 349
|
||||
#define EFFECT_EERIE_SPELL 350
|
||||
#define EFFECT_JUNGLE_HEALING 351
|
||||
#define EFFECT_COACHING 352
|
||||
#define EFFECT_LASH_OUT 353
|
||||
#define EFFECT_GRASSY_GLIDE 354
|
||||
#define EFFECT_REMOVE_TERRAIN 355
|
||||
#define EFFECT_DYNAMAX_DOUBLE_DMG 356
|
||||
#define EFFECT_DECORATE 357
|
||||
#define EFFECT_SNIPE_SHOT 358
|
||||
#define EFFECT_TRIPLE_HIT 359
|
||||
#define EFFECT_RECOIL_HP_25 360
|
||||
#define EFFECT_STUFF_CHEEKS 361
|
||||
#define EFFECT_GRAV_APPLE 362
|
||||
#define EFFECT_EVASION_UP_HIT 363
|
||||
#define EFFECT_DOUBLE_IRON_BASH 364
|
||||
#define EFFECT_GLITZY_GLOW 365
|
||||
#define EFFECT_BADDY_BAD 366
|
||||
#define EFFECT_SAPPY_SEED 367
|
||||
#define EFFECT_FREEZY_FROST 368
|
||||
#define EFFECT_SPARKLY_SWIRL 369
|
||||
#define EFFECT_PLASMA_FISTS 370
|
||||
#define EFFECT_HYPERSPACE_FURY 371
|
||||
#define EFFECT_AURA_WHEEL 372
|
||||
#define EFFECT_PHOTON_GEYSER 373
|
||||
#define EFFECT_SHELL_SIDE_ARM 374
|
||||
#define EFFECT_TERRAIN_PULSE 375
|
||||
#define EFFECT_JAW_LOCK 376
|
||||
#define EFFECT_NO_RETREAT 377
|
||||
#define EFFECT_TAR_SHOT 378
|
||||
#define EFFECT_POLTERGEIST 379
|
||||
#define EFFECT_OCTOLOCK 380
|
||||
#define EFFECT_CLANGOROUS_SOUL 381
|
||||
#define EFFECT_BOLT_BEAK 382
|
||||
#define EFFECT_SKY_DROP 383
|
||||
#define EFFECT_EXPANDING_FORCE 384
|
||||
#define EFFECT_SCALE_SHOT 385
|
||||
#define EFFECT_METEOR_BEAM 386
|
||||
#define EFFECT_RISING_VOLTAGE 387
|
||||
#define EFFECT_BEAK_BLAST 388
|
||||
#define EFFECT_COURT_CHANGE 389
|
||||
#define EFFECT_STEEL_BEAM 390
|
||||
#define EFFECT_EXTREME_EVOBOOST 391
|
||||
#define EFFECT_DAMAGE_SET_TERRAIN 392 // genesis supernova
|
||||
#define EFFECT_PLEDGE 212
|
||||
#define EFFECT_FLING 213
|
||||
#define EFFECT_NATURAL_GIFT 214
|
||||
#define EFFECT_WAKE_UP_SLAP 215
|
||||
#define EFFECT_WRING_OUT 216
|
||||
#define EFFECT_HEX 217
|
||||
#define EFFECT_ASSURANCE 218
|
||||
#define EFFECT_TRUMP_CARD 219
|
||||
#define EFFECT_ACROBATICS 220
|
||||
#define EFFECT_HEAT_CRASH 221
|
||||
#define EFFECT_PUNISHMENT 222
|
||||
#define EFFECT_STORED_POWER 223
|
||||
#define EFFECT_ELECTRO_BALL 224
|
||||
#define EFFECT_GYRO_BALL 225
|
||||
#define EFFECT_ECHOED_VOICE 226
|
||||
#define EFFECT_PAYBACK 227
|
||||
#define EFFECT_ROUND 228
|
||||
#define EFFECT_BRINE 229
|
||||
#define EFFECT_VENOSHOCK 230
|
||||
#define EFFECT_RETALIATE 231
|
||||
#define EFFECT_BULLDOZE 232
|
||||
#define EFFECT_FOUL_PLAY 233
|
||||
#define EFFECT_PSYSHOCK 234
|
||||
#define EFFECT_ROOST 235
|
||||
#define EFFECT_GRAVITY 236
|
||||
#define EFFECT_MIRACLE_EYE 237
|
||||
#define EFFECT_TAILWIND 238
|
||||
#define EFFECT_EMBARGO 239
|
||||
#define EFFECT_AQUA_RING 240
|
||||
#define EFFECT_TRICK_ROOM 241
|
||||
#define EFFECT_WONDER_ROOM 242
|
||||
#define EFFECT_MAGIC_ROOM 243
|
||||
#define EFFECT_MAGNET_RISE 244
|
||||
#define EFFECT_TOXIC_SPIKES 245
|
||||
#define EFFECT_GASTRO_ACID 246
|
||||
#define EFFECT_STEALTH_ROCK 247
|
||||
#define EFFECT_TELEKINESIS 248
|
||||
#define EFFECT_POWER_SWAP 249
|
||||
#define EFFECT_GUARD_SWAP 250
|
||||
#define EFFECT_HEART_SWAP 251
|
||||
#define EFFECT_POWER_SPLIT 252
|
||||
#define EFFECT_GUARD_SPLIT 253
|
||||
#define EFFECT_STICKY_WEB 254
|
||||
#define EFFECT_METAL_BURST 255
|
||||
#define EFFECT_LUCKY_CHANT 256
|
||||
#define EFFECT_SUCKER_PUNCH 257
|
||||
#define EFFECT_SPECIAL_DEFENSE_DOWN_HIT_2 258
|
||||
#define EFFECT_SIMPLE_BEAM 259
|
||||
#define EFFECT_ENTRAINMENT 260
|
||||
#define EFFECT_HEAL_PULSE 261
|
||||
#define EFFECT_QUASH 262
|
||||
#define EFFECT_ION_DELUGE 263
|
||||
#define EFFECT_FREEZE_DRY 264
|
||||
#define EFFECT_TOPSY_TURVY 265
|
||||
#define EFFECT_MISTY_TERRAIN 266
|
||||
#define EFFECT_GRASSY_TERRAIN 267
|
||||
#define EFFECT_ELECTRIC_TERRAIN 268
|
||||
#define EFFECT_PSYCHIC_TERRAIN 269
|
||||
#define EFFECT_ATTACK_ACCURACY_UP 270
|
||||
#define EFFECT_ATTACK_SPATK_UP 271
|
||||
#define EFFECT_HURRICANE 272
|
||||
#define EFFECT_TWO_TYPED_MOVE 273
|
||||
#define EFFECT_ME_FIRST 274
|
||||
#define EFFECT_SPEED_UP_HIT 275
|
||||
#define EFFECT_QUIVER_DANCE 276
|
||||
#define EFFECT_COIL 277
|
||||
#define EFFECT_ELECTRIFY 278
|
||||
#define EFFECT_SCALD 279
|
||||
#define EFFECT_REFLECT_TYPE 280
|
||||
#define EFFECT_SOAK 281
|
||||
#define EFFECT_GROWTH 282
|
||||
#define EFFECT_CLOSE_COMBAT 283
|
||||
#define EFFECT_LAST_RESORT 284
|
||||
#define EFFECT_RECOIL_33_STATUS 285
|
||||
#define EFFECT_FLINCH_STATUS 286
|
||||
#define EFFECT_RECOIL_50 287
|
||||
#define EFFECT_SHELL_SMASH 288
|
||||
#define EFFECT_SHIFT_GEAR 289
|
||||
#define EFFECT_DEFENSE_UP_3 290
|
||||
#define EFFECT_NOBLE_ROAR 291
|
||||
#define EFFECT_VENOM_DRENCH 292
|
||||
#define EFFECT_TOXIC_THREAD 293
|
||||
#define EFFECT_CLEAR_SMOG 294
|
||||
#define EFFECT_HIT_SWITCH_TARGET 295
|
||||
#define EFFECT_FINAL_GAMBIT 296
|
||||
#define EFFECT_CHANGE_TYPE_ON_ITEM 297
|
||||
#define EFFECT_AUTOTOMIZE 298
|
||||
#define EFFECT_COPYCAT 299
|
||||
#define EFFECT_DEFOG 300
|
||||
#define EFFECT_HIT_ENEMY_HEAL_ALLY 301
|
||||
#define EFFECT_SMACK_DOWN 302
|
||||
#define EFFECT_SYNCHRONOISE 303
|
||||
#define EFFECT_PSYCHO_SHIFT 304
|
||||
#define EFFECT_POWER_TRICK 305
|
||||
#define EFFECT_FLAME_BURST 306
|
||||
#define EFFECT_AFTER_YOU 307
|
||||
#define EFFECT_BESTOW 308
|
||||
#define EFFECT_ROTOTILLER 309
|
||||
#define EFFECT_FLOWER_SHIELD 310
|
||||
#define EFFECT_HIT_PREVENT_ESCAPE 311
|
||||
#define EFFECT_SPEED_SWAP 312
|
||||
#define EFFECT_DEFENSE_UP2_HIT 313
|
||||
#define EFFECT_REVELATION_DANCE 314
|
||||
#define EFFECT_AURORA_VEIL 315
|
||||
#define EFFECT_THIRD_TYPE 316
|
||||
#define EFFECT_FEINT 317
|
||||
#define EFFECT_SPARKLING_ARIA 318
|
||||
#define EFFECT_ACUPRESSURE 319
|
||||
#define EFFECT_AROMATIC_MIST 320
|
||||
#define EFFECT_POWDER 321
|
||||
#define EFFECT_SP_ATTACK_UP_HIT 322
|
||||
#define EFFECT_BELCH 323
|
||||
#define EFFECT_PARTING_SHOT 324
|
||||
#define EFFECT_SPECTRAL_THIEF 325
|
||||
#define EFFECT_V_CREATE 326
|
||||
#define EFFECT_MAT_BLOCK 327
|
||||
#define EFFECT_STOMPING_TANTRUM 328
|
||||
#define EFFECT_CORE_ENFORCER 329
|
||||
#define EFFECT_INSTRUCT 330
|
||||
#define EFFECT_THROAT_CHOP 331
|
||||
#define EFFECT_LASER_FOCUS 332
|
||||
#define EFFECT_MAGNETIC_FLUX 333
|
||||
#define EFFECT_GEAR_UP 334
|
||||
#define EFFECT_INCINERATE 335
|
||||
#define EFFECT_BUG_BITE 336
|
||||
#define EFFECT_STRENGTH_SAP 337
|
||||
#define EFFECT_MIND_BLOWN 338
|
||||
#define EFFECT_PURIFY 339
|
||||
#define EFFECT_BURN_UP 340
|
||||
#define EFFECT_SHORE_UP 341
|
||||
#define EFFECT_GEOMANCY 342
|
||||
#define EFFECT_FAIRY_LOCK 343
|
||||
#define EFFECT_ALLY_SWITCH 344
|
||||
#define EFFECT_RELIC_SONG 345
|
||||
#define EFFECT_ATTACKER_DEFENSE_DOWN_HIT 346
|
||||
#define EFFECT_BODY_PRESS 347
|
||||
#define EFFECT_EERIE_SPELL 348
|
||||
#define EFFECT_JUNGLE_HEALING 349
|
||||
#define EFFECT_COACHING 350
|
||||
#define EFFECT_LASH_OUT 351
|
||||
#define EFFECT_GRASSY_GLIDE 352
|
||||
#define EFFECT_REMOVE_TERRAIN 353
|
||||
#define EFFECT_DYNAMAX_DOUBLE_DMG 354
|
||||
#define EFFECT_DECORATE 355
|
||||
#define EFFECT_SNIPE_SHOT 356
|
||||
#define EFFECT_RECOIL_HP_25 357
|
||||
#define EFFECT_STUFF_CHEEKS 358
|
||||
#define EFFECT_GRAV_APPLE 359
|
||||
#define EFFECT_EVASION_UP_HIT 360
|
||||
#define EFFECT_GLITZY_GLOW 361
|
||||
#define EFFECT_BADDY_BAD 362
|
||||
#define EFFECT_SAPPY_SEED 363
|
||||
#define EFFECT_FREEZY_FROST 364
|
||||
#define EFFECT_SPARKLY_SWIRL 365
|
||||
#define EFFECT_PLASMA_FISTS 366
|
||||
#define EFFECT_HYPERSPACE_FURY 367
|
||||
#define EFFECT_AURA_WHEEL 368
|
||||
#define EFFECT_PHOTON_GEYSER 369
|
||||
#define EFFECT_SHELL_SIDE_ARM 370
|
||||
#define EFFECT_TERRAIN_PULSE 371
|
||||
#define EFFECT_JAW_LOCK 372
|
||||
#define EFFECT_NO_RETREAT 373
|
||||
#define EFFECT_TAR_SHOT 374
|
||||
#define EFFECT_POLTERGEIST 375
|
||||
#define EFFECT_OCTOLOCK 376
|
||||
#define EFFECT_CLANGOROUS_SOUL 377
|
||||
#define EFFECT_BOLT_BEAK 378
|
||||
#define EFFECT_SKY_DROP 379
|
||||
#define EFFECT_EXPANDING_FORCE 380
|
||||
#define EFFECT_SCALE_SHOT 381
|
||||
#define EFFECT_METEOR_BEAM 382
|
||||
#define EFFECT_RISING_VOLTAGE 383
|
||||
#define EFFECT_BEAK_BLAST 384
|
||||
#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_DARK_VOID 389
|
||||
|
||||
#define NUM_BATTLE_MOVE_EFFECTS 393
|
||||
#define NUM_BATTLE_MOVE_EFFECTS 389
|
||||
|
||||
#endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H
|
||||
|
@ -245,6 +245,7 @@
|
||||
#define VARIOUS_TRY_SYMBIOSIS 154
|
||||
#define VARIOUS_CAN_TELEPORT 155
|
||||
#define VARIOUS_GET_BATTLER_SIDE 156
|
||||
#define VARIOUS_CHECK_PARENTAL_BOND_COUNTER 157
|
||||
|
||||
// Cmd_manipulatedamage
|
||||
#define DMG_CHANGE_SIGN 0
|
||||
@ -284,40 +285,43 @@
|
||||
#define PARTY_SCREEN_OPTIONAL (1 << 7) // Flag for first argument to openpartyscreen
|
||||
|
||||
// cases for Cmd_moveend
|
||||
#define MOVEEND_PROTECT_LIKE_EFFECT 0
|
||||
#define MOVEEND_RAGE 1
|
||||
#define MOVEEND_DEFROST 2
|
||||
#define MOVEEND_SUM_DAMAGE 0
|
||||
#define MOVEEND_PROTECT_LIKE_EFFECT 1
|
||||
#define MOVEEND_RAGE 2
|
||||
#define MOVEEND_SYNCHRONIZE_TARGET 3
|
||||
#define MOVEEND_ABILITIES 4
|
||||
#define MOVEEND_ABILITIES_ATTACKER 5
|
||||
#define MOVEEND_STATUS_IMMUNITY_ABILITIES 6
|
||||
#define MOVEEND_SYNCHRONIZE_ATTACKER 7
|
||||
#define MOVEEND_CHOICE_MOVE 8
|
||||
#define MOVEEND_CHANGED_ITEMS 9
|
||||
#define MOVEEND_ATTACKER_INVISIBLE 10
|
||||
#define MOVEEND_ATTACKER_VISIBLE 11
|
||||
#define MOVEEND_TARGET_VISIBLE 12
|
||||
#define MOVEEND_ITEM_EFFECTS_TARGET 13
|
||||
#define MOVEEND_MOVE_EFFECTS2 14
|
||||
#define MOVEEND_ITEM_EFFECTS_ALL 15
|
||||
#define MOVEEND_KINGSROCK 16 // These item effects will occur each strike of a multi-hit move
|
||||
#define MOVEEND_SUBSTITUTE 17
|
||||
#define MOVEEND_SKY_DROP_CONFUSE 18
|
||||
#define MOVEEND_UPDATE_LAST_MOVES 19
|
||||
#define MOVEEND_MIRROR_MOVE 20
|
||||
#define MOVEEND_NEXT_TARGET 21 // Everything up until here is handled for each strike of a multi-hit move
|
||||
#define MOVEEND_MAGICIAN 22 // Occurs after final multi-hit strike, and after other items/abilities would activate
|
||||
#define MOVEEND_EJECT_BUTTON 23
|
||||
#define MOVEEND_RED_CARD 24
|
||||
#define MOVEEND_EJECT_PACK 25
|
||||
#define MOVEEND_LIFEORB_SHELLBELL 26 // Includes shell bell, throat spray, etc
|
||||
#define MOVEEND_PICKPOCKET 27
|
||||
#define MOVEEND_DANCER 28
|
||||
#define MOVEEND_EMERGENCY_EXIT 29
|
||||
#define MOVEEND_WEATHER_FORM 30
|
||||
#define MOVEEND_SYMBIOSIS 31
|
||||
#define MOVEEND_CLEAR_BITS 32
|
||||
#define MOVEEND_COUNT 33
|
||||
#define MOVEEND_ATTACKER_INVISIBLE 9
|
||||
#define MOVEEND_ATTACKER_VISIBLE 10
|
||||
#define MOVEEND_TARGET_VISIBLE 11
|
||||
#define MOVEEND_ITEM_EFFECTS_TARGET 12
|
||||
#define MOVEEND_ITEM_EFFECTS_ALL 13
|
||||
#define MOVEEND_KINGSROCK 14 // These item effects will occur each strike of a multi-hit move
|
||||
#define MOVEEND_SUBSTITUTE 15
|
||||
#define MOVEEND_SKY_DROP_CONFUSE 16
|
||||
#define MOVEEND_UPDATE_LAST_MOVES 17
|
||||
#define MOVEEND_MIRROR_MOVE 18
|
||||
#define MOVEEND_NEXT_TARGET 19 // Everything up until here is handled for each strike of a multi-hit move
|
||||
#define MOVEEND_MULTIHIT_MOVE 20
|
||||
#define MOVEEND_DEFROST 21
|
||||
#define MOVEEND_MOVE_EFFECTS2 22
|
||||
#define MOVEEND_RECOIL 23
|
||||
#define MOVEEND_MAGICIAN 24 // Occurs after final multi-hit strike, and after other items/abilities would activate
|
||||
#define MOVEEND_EJECT_BUTTON 25
|
||||
#define MOVEEND_RED_CARD 26
|
||||
#define MOVEEND_EJECT_PACK 27
|
||||
#define MOVEEND_LIFEORB_SHELLBELL 28 // Includes shell bell, throat spray, etc
|
||||
#define MOVEEND_CHANGED_ITEMS 29
|
||||
#define MOVEEND_PICKPOCKET 30
|
||||
#define MOVEEND_DANCER 31
|
||||
#define MOVEEND_EMERGENCY_EXIT 32
|
||||
#define MOVEEND_WEATHER_FORM 33
|
||||
#define MOVEEND_SYMBIOSIS 34
|
||||
#define MOVEEND_CLEAR_BITS 35
|
||||
#define MOVEEND_COUNT 36
|
||||
|
||||
// switch cases
|
||||
#define B_SWITCH_NORMAL 0
|
||||
|
@ -16,4 +16,10 @@
|
||||
#define KEYITEMS_POCKET 4
|
||||
#define POCKETS_COUNT 5
|
||||
|
||||
#define REPEL_LURE_MASK (1 << 15)
|
||||
#define IS_LAST_USED_LURE(var) (var & REPEL_LURE_MASK)
|
||||
#define REPEL_LURE_STEPS(var) (var & (REPEL_LURE_MASK - 1))
|
||||
#define LURE_STEP_COUNT (IS_LAST_USED_LURE(VarGet(VAR_REPEL_STEP_COUNT)) ? REPEL_LURE_STEPS(VarGet(VAR_REPEL_STEP_COUNT)) : 0)
|
||||
#define REPEL_STEP_COUNT (!IS_LAST_USED_LURE(VarGet(VAR_REPEL_STEP_COUNT)) ? REPEL_LURE_STEPS(VarGet(VAR_REPEL_STEP_COUNT)) : 0)
|
||||
|
||||
#endif // GUARD_ITEM_CONSTANTS_H
|
||||
|
@ -9,4 +9,9 @@
|
||||
#define I_SITRUS_BERRY_HEAL GEN_LATEST // In Gen4+, Sitrus Berry was changed from healing 30 HP to healing 25% of Max HP.
|
||||
#define I_VITAMIN_EV_CAP GEN_LATEST // In Gen8, the Vitamins no longer have a cap of 100 EV per stat.
|
||||
|
||||
// Repel/Lure config
|
||||
// These two settings are both independent and complementary.
|
||||
#define VAR_LAST_REPEL_LURE_USED 0 // If this var has been assigned, last Repel/Lure used will be saved and the player will get prompted with the vanilla repel YES/NO option, unless I_REPEL_LURE_MENU is set to TRUE.
|
||||
#define I_REPEL_LURE_MENU TRUE // If TRUE, the player is able to choose which Repel/Lure to use once the previous one runs out. Cursor position is saved by VAR_LAST_REPEL_LURE_USED if not 0.
|
||||
|
||||
#endif // GUARD_CONSTANTS_ITEM_CONFIG_H
|
||||
|
@ -16,6 +16,5 @@
|
||||
|
||||
// Replace the used flags with others or disable with a 0
|
||||
#define DEBUG_FLAG_NO_COLLISION 0 // If this flag is set, the debug function in the Utility submenu to disable player collision can be used.
|
||||
#define DEBUG_FLAG_PC_FROM_DEBUG_MENU 0 // If this flag is set, the debug function in debug menu to access the player PC works.
|
||||
|
||||
#endif // GUARD_CONSTANTS_OVERWORLD_CONFIG_H
|
||||
|
@ -329,9 +329,10 @@
|
||||
#define MON_PIC_HEIGHT 64
|
||||
#define MON_PIC_SIZE (MON_PIC_WIDTH * MON_PIC_HEIGHT / 2)
|
||||
|
||||
#define BATTLE_ALIVE_EXCEPT_ACTIVE 0
|
||||
#define BATTLE_ALIVE_ATK_SIDE 1
|
||||
#define BATTLE_ALIVE_DEF_SIDE 2
|
||||
#define BATTLE_ALIVE_EXCEPT_ACTIVE 0
|
||||
#define BATTLE_ALIVE_ATK_SIDE 1
|
||||
#define BATTLE_ALIVE_DEF_SIDE 2
|
||||
#define BATTLE_ALIVE_EXCEPT_ATTACKER 3
|
||||
|
||||
#define SKIP_FRONT_ANIM (1 << 7)
|
||||
|
||||
|
@ -35,6 +35,7 @@ bool8 FldEff_UseStrength(void);
|
||||
// sweet scent
|
||||
bool8 SetUpFieldMove_SweetScent(void);
|
||||
bool8 FldEff_SweetScent(void);
|
||||
void StartSweetScentFieldEffect(void);
|
||||
|
||||
// teleport
|
||||
bool8 SetUpFieldMove_Teleport(void);
|
||||
|
@ -20,6 +20,7 @@ void ItemUseOutOfBattle_PPUp(u8);
|
||||
void ItemUseOutOfBattle_RareCandy(u8);
|
||||
void ItemUseOutOfBattle_TMHM(u8);
|
||||
void ItemUseOutOfBattle_Repel(u8);
|
||||
void ItemUseOutOfBattle_Lure(u8);
|
||||
void ItemUseOutOfBattle_EscapeRope(u8);
|
||||
void ItemUseOutOfBattle_BlackWhiteFlute(u8);
|
||||
void ItemUseOutOfBattle_EvolutionStone(u8);
|
||||
@ -27,6 +28,7 @@ void ItemUseOutOfBattle_Berry(u8);
|
||||
void ItemUseOutOfBattle_EnigmaBerry(u8);
|
||||
void ItemUseOutOfBattle_FormChange(u8);
|
||||
void ItemUseOutOfBattle_FormChange_ConsumedOnUse(u8);
|
||||
void ItemUseOutOfBattle_Honey(u8);
|
||||
void ItemUseOutOfBattle_CannotUse(u8);
|
||||
void ItemUseInBattle_PokeBall(u8);
|
||||
void ItemUseInBattle_StatIncrease(u8);
|
||||
|
@ -938,6 +938,7 @@ extern const u8 gText_BootedUpTM[];
|
||||
extern const u8 gText_TMHMContainedVar1[];
|
||||
extern const u8 gText_PlayerUsedVar2[];
|
||||
extern const u8 gText_RepelEffectsLingered[];
|
||||
extern const u8 gText_LureEffectsLingered[];
|
||||
extern const u8 gText_UsedVar2WildLured[];
|
||||
extern const u8 gText_UsedVar2WildRepelled[];
|
||||
extern const u8 gText_BoxFull[];
|
||||
|
@ -17,7 +17,7 @@ SECTIONS {
|
||||
gflib/*.o(ewram_data);
|
||||
|
||||
. = 0x40000;
|
||||
}
|
||||
}
|
||||
|
||||
. = 0x3000000;
|
||||
|
||||
|
@ -3407,7 +3407,6 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score)
|
||||
score += min(CountPositiveStatStages(battlerDef), 4);
|
||||
break;
|
||||
case EFFECT_MULTI_HIT:
|
||||
case EFFECT_DOUBLE_HIT:
|
||||
case EFFECT_TRIPLE_KICK:
|
||||
if (AI_MoveMakesContact(AI_DATA->abilities[battlerAtk], AI_DATA->holdEffects[battlerAtk], move)
|
||||
&& AI_DATA->abilities[battlerAtk] != ABILITY_MAGIC_GUARD
|
||||
|
@ -1548,18 +1548,17 @@ static void OpponentHandleYesNoBox(void)
|
||||
|
||||
static void OpponentHandleChooseMove(void)
|
||||
{
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
|
||||
{
|
||||
BtlController_EmitTwoReturnValues(BUFFER_B, 10, ChooseMoveAndTargetInBattlePalace());
|
||||
OpponentBufferExecCompleted();
|
||||
}
|
||||
else
|
||||
{
|
||||
u8 chosenMoveId;
|
||||
struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct *)(&gBattleResources->bufferA[gActiveBattler][4]);
|
||||
u8 chosenMoveId;
|
||||
struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct *)(&gBattleResources->bufferA[gActiveBattler][4]);
|
||||
|
||||
if (gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_FIRST_BATTLE | BATTLE_TYPE_SAFARI | BATTLE_TYPE_ROAMER)
|
||||
|| IsWildMonSmart())
|
||||
if (gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_FIRST_BATTLE | BATTLE_TYPE_SAFARI | BATTLE_TYPE_ROAMER)
|
||||
|| IsWildMonSmart())
|
||||
{
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
|
||||
{
|
||||
BtlController_EmitTwoReturnValues(BUFFER_B, 10, ChooseMoveAndTargetInBattlePalace());
|
||||
}
|
||||
else
|
||||
{
|
||||
chosenMoveId = gBattleStruct->aiMoveOrAction[gActiveBattler];
|
||||
gBattlerTarget = gBattleStruct->aiChosenTarget[gActiveBattler];
|
||||
@ -1598,66 +1597,66 @@ static void OpponentHandleChooseMove(void)
|
||||
}
|
||||
break;
|
||||
}
|
||||
OpponentBufferExecCompleted();
|
||||
}
|
||||
else // Wild pokemon - use random move
|
||||
OpponentBufferExecCompleted();
|
||||
}
|
||||
else // Wild pokemon - use random move
|
||||
{
|
||||
u16 move;
|
||||
u8 target;
|
||||
do
|
||||
{
|
||||
u16 move;
|
||||
u8 target;
|
||||
do
|
||||
{
|
||||
chosenMoveId = Random() & 3;
|
||||
move = moveInfo->moves[chosenMoveId];
|
||||
} while (move == MOVE_NONE);
|
||||
chosenMoveId = Random() & 3;
|
||||
move = moveInfo->moves[chosenMoveId];
|
||||
} while (move == MOVE_NONE);
|
||||
|
||||
if (GetBattlerMoveTargetType(gActiveBattler, move) & (MOVE_TARGET_USER_OR_SELECTED | MOVE_TARGET_USER))
|
||||
BtlController_EmitTwoReturnValues(BUFFER_B, 10, (chosenMoveId) | (gActiveBattler << 8));
|
||||
else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
|
||||
{
|
||||
do {
|
||||
target = GetBattlerAtPosition(Random() & 2);
|
||||
} while (!CanTargetBattler(gActiveBattler, target, move));
|
||||
if (GetBattlerMoveTargetType(gActiveBattler, move) & (MOVE_TARGET_USER_OR_SELECTED | MOVE_TARGET_USER))
|
||||
BtlController_EmitTwoReturnValues(BUFFER_B, 10, (chosenMoveId) | (gActiveBattler << 8));
|
||||
else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
|
||||
{
|
||||
do {
|
||||
target = GetBattlerAtPosition(Random() & 2);
|
||||
} while (!CanTargetBattler(gActiveBattler, target, move));
|
||||
|
||||
#if B_WILD_NATURAL_ENEMIES == TRUE
|
||||
// Don't bother to loop through table if the move can't attack ally
|
||||
if (!(gBattleMoves[move].target & MOVE_TARGET_BOTH))
|
||||
#if B_WILD_NATURAL_ENEMIES == TRUE
|
||||
// Don't bother to loop through table if the move can't attack ally
|
||||
if (!(gBattleMoves[move].target & MOVE_TARGET_BOTH))
|
||||
{
|
||||
u16 i, speciesAttacker, speciesTarget, isPartnerEnemy = FALSE;
|
||||
static const u16 naturalEnemies[][2] =
|
||||
{
|
||||
u16 i, speciesAttacker, speciesTarget, isPartnerEnemy = FALSE;
|
||||
static const u16 naturalEnemies[][2] =
|
||||
{
|
||||
// Attacker Target
|
||||
{SPECIES_ZANGOOSE, SPECIES_SEVIPER},
|
||||
{SPECIES_SEVIPER, SPECIES_ZANGOOSE},
|
||||
{SPECIES_HEATMOR, SPECIES_DURANT},
|
||||
{SPECIES_DURANT, SPECIES_HEATMOR},
|
||||
{SPECIES_SABLEYE, SPECIES_CARBINK},
|
||||
{SPECIES_MAREANIE, SPECIES_CORSOLA},
|
||||
};
|
||||
speciesAttacker = gBattleMons[gActiveBattler].species;
|
||||
speciesTarget = gBattleMons[GetBattlerAtPosition(BATTLE_PARTNER(gActiveBattler))].species;
|
||||
// Attacker Target
|
||||
{SPECIES_ZANGOOSE, SPECIES_SEVIPER},
|
||||
{SPECIES_SEVIPER, SPECIES_ZANGOOSE},
|
||||
{SPECIES_HEATMOR, SPECIES_DURANT},
|
||||
{SPECIES_DURANT, SPECIES_HEATMOR},
|
||||
{SPECIES_SABLEYE, SPECIES_CARBINK},
|
||||
{SPECIES_MAREANIE, SPECIES_CORSOLA},
|
||||
};
|
||||
speciesAttacker = gBattleMons[gActiveBattler].species;
|
||||
speciesTarget = gBattleMons[GetBattlerAtPosition(BATTLE_PARTNER(gActiveBattler))].species;
|
||||
|
||||
for (i = 0; i < ARRAY_COUNT(naturalEnemies); i++)
|
||||
for (i = 0; i < ARRAY_COUNT(naturalEnemies); i++)
|
||||
{
|
||||
if (speciesAttacker == naturalEnemies[i][0] && speciesTarget == naturalEnemies[i][1])
|
||||
{
|
||||
if (speciesAttacker == naturalEnemies[i][0] && speciesTarget == naturalEnemies[i][1])
|
||||
{
|
||||
isPartnerEnemy = TRUE;
|
||||
break;
|
||||
}
|
||||
isPartnerEnemy = TRUE;
|
||||
break;
|
||||
}
|
||||
if (isPartnerEnemy && CanTargetBattler(gActiveBattler, target, move))
|
||||
BtlController_EmitTwoReturnValues(BUFFER_B, 10, (chosenMoveId) | (GetBattlerAtPosition(BATTLE_PARTNER(gActiveBattler)) << 8));
|
||||
else
|
||||
BtlController_EmitTwoReturnValues(BUFFER_B, 10, (chosenMoveId) | (target << 8));
|
||||
}
|
||||
if (isPartnerEnemy && CanTargetBattler(gActiveBattler, target, move))
|
||||
BtlController_EmitTwoReturnValues(BUFFER_B, 10, (chosenMoveId) | (GetBattlerAtPosition(BATTLE_PARTNER(gActiveBattler)) << 8));
|
||||
else
|
||||
#endif
|
||||
BtlController_EmitTwoReturnValues(BUFFER_B, 10, (chosenMoveId) | (target << 8));
|
||||
}
|
||||
else
|
||||
BtlController_EmitTwoReturnValues(BUFFER_B, 10, (chosenMoveId) | (GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) << 8));
|
||||
|
||||
OpponentBufferExecCompleted();
|
||||
#endif
|
||||
BtlController_EmitTwoReturnValues(BUFFER_B, 10, (chosenMoveId) | (target << 8));
|
||||
}
|
||||
else
|
||||
BtlController_EmitTwoReturnValues(BUFFER_B, 10, (chosenMoveId) | (GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) << 8));
|
||||
|
||||
OpponentBufferExecCompleted();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -271,6 +271,7 @@ static const struct BitfieldInfo sStatus2Bitfield[] =
|
||||
{/*Multiple Turns*/ 1, 12},
|
||||
// Wrap bits are omitted. Done in various.
|
||||
// In Love bits are omitted. Done in various.
|
||||
{/*(Focus Energy*/ 1, 20},
|
||||
{/*Transformed*/ 1, 21},
|
||||
{/*Recharge*/ 1, 22},
|
||||
{/*Rage*/ 1, 23},
|
||||
|
@ -164,6 +164,7 @@ u16 ChooseMoveAndTargetInBattlePalace(void)
|
||||
{
|
||||
gBattleStruct->palaceFlags &= 0xF;
|
||||
gBattleStruct->palaceFlags |= (selectedMoves << 4);
|
||||
sBattler_AI = gActiveBattler;
|
||||
BattleAI_SetupAIData(selectedMoves);
|
||||
chosenMoveId = BattleAI_ChooseMoveOrAction();
|
||||
}
|
||||
@ -171,8 +172,9 @@ u16 ChooseMoveAndTargetInBattlePalace(void)
|
||||
// If no moves matched the selected group, pick a new move from groups the pokemon has
|
||||
// In this case the AI is not checked again, so the choice may be worse
|
||||
// If a move is chosen this way, there's a 50% chance that it will be unable to use it anyway
|
||||
if (chosenMoveId == -1)
|
||||
if (chosenMoveId == -1 || chosenMoveId >= MAX_MON_MOVES)
|
||||
{
|
||||
chosenMoveId = -1;
|
||||
if (unusableMovesBits != 0xF)
|
||||
{
|
||||
validMoveFlags = 0, numValidMoveGroups = 0;
|
||||
|
@ -3001,6 +3001,7 @@ static void BattleStartClearSetData(void)
|
||||
gBattleScripting.monCaught = FALSE;
|
||||
|
||||
gMultiHitCounter = 0;
|
||||
gBattleScripting.savedDmg = 0;
|
||||
gBattleOutcome = 0;
|
||||
gBattleControllerExecFlags = 0;
|
||||
gPaydayMoney = 0;
|
||||
@ -3973,7 +3974,8 @@ static void HandleTurnActionSelectionState(void)
|
||||
gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN;
|
||||
|
||||
// Do AI score computations here so we can use them in AI_TrySwitchOrUseItem
|
||||
if ((gBattleTypeFlags & BATTLE_TYPE_HAS_AI || IsWildMonSmart()) && IsBattlerAIControlled(gActiveBattler)) {
|
||||
if ((gBattleTypeFlags & BATTLE_TYPE_HAS_AI || IsWildMonSmart())
|
||||
&& (IsBattlerAIControlled(gActiveBattler) && !(gBattleTypeFlags & BATTLE_TYPE_PALACE))) {
|
||||
gBattleStruct->aiMoveOrAction[gActiveBattler] = ComputeBattleAiScores(gActiveBattler);
|
||||
}
|
||||
break;
|
||||
@ -4841,6 +4843,8 @@ static void TurnValuesCleanUp(bool8 var0)
|
||||
|
||||
if (gDisableStructs[gActiveBattler].substituteHP == 0)
|
||||
gBattleMons[gActiveBattler].status2 &= ~STATUS2_SUBSTITUTE;
|
||||
|
||||
gSpecialStatuses[gActiveBattler].parentalBondState = PARENTAL_BOND_OFF;
|
||||
}
|
||||
|
||||
gSideStatuses[0] &= ~(SIDE_STATUS_QUICK_GUARD | SIDE_STATUS_WIDE_GUARD | SIDE_STATUS_CRAFTY_SHIELD | SIDE_STATUS_MAT_BLOCK);
|
||||
|
@ -589,7 +589,7 @@ static const u8 sText_PsychicTerrainEnds[] = _("The weirdness disappeared\nfrom
|
||||
static const u8 sText_GrassyTerrainEnds[] = _("The grass disappeared\nfrom the battlefield.");
|
||||
static const u8 sText_TargetsStatWasMaxedOut[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} maxed\nits {B_BUFF1}!");
|
||||
static const u8 sText_PoisonHealHpUp[] = _("The poisoning healed {B_ATK_NAME_WITH_PREFIX}\na little bit!");
|
||||
static const u8 sText_BadDreamsDmg[] = _("{B_DEF_NAME_WITH_PREFIX} is tormented\nby {B_ATK_ABILITY}!");
|
||||
static const u8 sText_BadDreamsDmg[] = _("{B_DEF_NAME_WITH_PREFIX} is tormented!");
|
||||
static const u8 sText_MoldBreakerEnters[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} breaks the mold!");
|
||||
static const u8 sText_TeravoltEnters[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is radiating \na bursting aura!");
|
||||
static const u8 sText_TurboblazeEnters[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is radiating\na blazing aura!");
|
||||
|
@ -318,6 +318,7 @@ static void DrawLevelUpBannerText(void);
|
||||
static void SpriteCB_MonIconOnLvlUpBanner(struct Sprite *sprite);
|
||||
static bool32 CriticalCapture(u32 odds);
|
||||
static void BestowItem(u32 battlerAtk, u32 battlerDef);
|
||||
static bool8 IsFinalStrikeEffect(u16 move);
|
||||
|
||||
static void Cmd_attackcanceler(void);
|
||||
static void Cmd_accuracycheck(void);
|
||||
@ -572,7 +573,7 @@ static void Cmd_settelekinesis(void);
|
||||
static void Cmd_swapstatstages(void);
|
||||
static void Cmd_averagestats(void);
|
||||
static void Cmd_jumpifoppositegenders(void);
|
||||
static void Cmd_trygetbaddreamstarget(void);
|
||||
static void Cmd_unused(void);
|
||||
static void Cmd_tryworryseed(void);
|
||||
static void Cmd_metalburstdamagecalculator(void);
|
||||
|
||||
@ -831,7 +832,7 @@ void (* const gBattleScriptingCommandsTable[])(void) =
|
||||
Cmd_swapstatstages, //0xFA
|
||||
Cmd_averagestats, //0xFB
|
||||
Cmd_jumpifoppositegenders, //0xFC
|
||||
Cmd_trygetbaddreamstarget, //0xFD
|
||||
Cmd_unused, //0xFD
|
||||
Cmd_tryworryseed, //0xFE
|
||||
Cmd_metalburstdamagecalculator, //0xFF
|
||||
};
|
||||
@ -884,8 +885,6 @@ static const u8 *const sMoveEffectBS_Ptrs[] =
|
||||
[MOVE_EFFECT_UPROAR] = BattleScript_MoveEffectUproar,
|
||||
[MOVE_EFFECT_PAYDAY] = BattleScript_MoveEffectPayDay,
|
||||
[MOVE_EFFECT_WRAP] = BattleScript_MoveEffectWrap,
|
||||
[MOVE_EFFECT_RECOIL_25] = BattleScript_MoveEffectRecoil,
|
||||
[MOVE_EFFECT_RECOIL_33] = BattleScript_MoveEffectRecoil,
|
||||
};
|
||||
|
||||
static const struct WindowTemplate sUnusedWinTemplate =
|
||||
@ -938,6 +937,7 @@ static const u16 sProtectSuccessRates[] = {USHRT_MAX, USHRT_MAX / 2, USHRT_MAX /
|
||||
#define FORBIDDEN_COPYCAT (1 << 3)
|
||||
#define FORBIDDEN_SLEEP_TALK (1 << 4)
|
||||
#define FORBIDDEN_INSTRUCT (1 << 5)
|
||||
#define FORBIDDEN_PARENTAL_BOND (1 << 6)
|
||||
|
||||
static const u8 sForbiddenMoves[MOVES_COUNT] =
|
||||
{
|
||||
@ -945,28 +945,35 @@ static const u8 sForbiddenMoves[MOVES_COUNT] =
|
||||
[MOVE_STRUGGLE] = 0xFF, // Neither Struggle
|
||||
[MOVE_AFTER_YOU] = FORBIDDEN_METRONOME,
|
||||
[MOVE_APPLE_ACID] = FORBIDDEN_METRONOME,
|
||||
[MOVE_ARM_THRUST] = FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_ASSIST] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_ASTRAL_BARRAGE] = FORBIDDEN_METRONOME,
|
||||
[MOVE_AURA_WHEEL] = FORBIDDEN_METRONOME,
|
||||
[MOVE_BADDY_BAD] = FORBIDDEN_METRONOME,
|
||||
[MOVE_BANEFUL_BUNKER] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
|
||||
[MOVE_BARRAGE] = FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_BEAK_BLAST] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_BEAT_UP] = FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_BEHEMOTH_BASH] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
|
||||
[MOVE_BEHEMOTH_BLADE] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
|
||||
[MOVE_BELCH] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_BESTOW] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
|
||||
[MOVE_BIDE] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_BIDE] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT | FORBIDDEN_PARENTAL_BOND, // Note: Bide should work with Parental Bond. This will be addressed in future.
|
||||
[MOVE_BLAST_BURN] = FORBIDDEN_INSTRUCT,
|
||||
[MOVE_BODY_PRESS] = FORBIDDEN_METRONOME,
|
||||
[MOVE_BOUNCE] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_BONE_RUSH] = FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_BONEMERANG] = FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_BOUNCE] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT | FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_BOUNCY_BUBBLE] = FORBIDDEN_METRONOME,
|
||||
[MOVE_BRANCH_POKE] = FORBIDDEN_METRONOME,
|
||||
[MOVE_BREAKING_SWIPE] = FORBIDDEN_METRONOME,
|
||||
[MOVE_BULLET_SEED] = FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_BUZZY_BUZZ] = FORBIDDEN_METRONOME,
|
||||
[MOVE_CELEBRATE] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_CHATTER] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_MIMIC | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_CIRCLE_THROW] = FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
|
||||
[MOVE_CLANGOROUS_SOUL] = FORBIDDEN_METRONOME,
|
||||
[MOVE_COMET_PUNCH] = FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_COPYCAT] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_COUNTER] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
|
||||
[MOVE_COVET] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
|
||||
@ -975,41 +982,57 @@ static const u8 sForbiddenMoves[MOVES_COUNT] =
|
||||
[MOVE_DESTINY_BOND] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
|
||||
[MOVE_DETECT] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
|
||||
[MOVE_DIAMOND_STORM] = FORBIDDEN_METRONOME,
|
||||
[MOVE_DIG] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_DIVE] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_DOUBLE_IRON_BASH] = FORBIDDEN_METRONOME,
|
||||
[MOVE_DIG] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT | FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_DIVE] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT | FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_DOUBLE_IRON_BASH] = FORBIDDEN_METRONOME | FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_DOUBLE_HIT] = FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_DOUBLE_KICK] = FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_DOUBLE_SLAP] = FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_DRAGON_ASCENT] = FORBIDDEN_METRONOME,
|
||||
[MOVE_DRAGON_ENERGY] = FORBIDDEN_METRONOME,
|
||||
[MOVE_DRAGON_DARTS] = FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_DRAGON_TAIL] = FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
|
||||
[MOVE_DRUM_BEATING] = FORBIDDEN_METRONOME,
|
||||
[MOVE_DUAL_CHOP] = FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_DUAL_WINGBEAT] = FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_DYNAMAX_CANNON] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_ENDEAVOR] = FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_ENDURE] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
|
||||
[MOVE_ETERNABEAM] = FORBIDDEN_METRONOME | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_EXPLOSION] = FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_FALSE_SURRENDER] = FORBIDDEN_METRONOME,
|
||||
[MOVE_FEINT] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
|
||||
[MOVE_FIERY_WRATH] = FORBIDDEN_METRONOME,
|
||||
[MOVE_FINAL_GAMBIT] = FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_FISSURE] = FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_FLEUR_CANNON] = FORBIDDEN_METRONOME,
|
||||
[MOVE_FLING] = FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_FLOATY_FALL] = FORBIDDEN_METRONOME,
|
||||
[MOVE_FLY] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_FLY] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT | FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_FOCUS_PUNCH] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_FOLLOW_ME] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
|
||||
[MOVE_FREEZE_SHOCK] = FORBIDDEN_METRONOME | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_FREEZE_SHOCK] = FORBIDDEN_METRONOME | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT| FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_FREEZING_GLARE] = FORBIDDEN_METRONOME,
|
||||
[MOVE_FREEZY_FROST] = FORBIDDEN_METRONOME,
|
||||
[MOVE_FRENZY_PLANT] = FORBIDDEN_INSTRUCT,
|
||||
[MOVE_GEOMANCY] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_FURY_ATTACK] = FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_FURY_SWIPES] = FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_GEAR_GRIND] = FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_GEOMANCY] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT | FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_GIGA_IMPACT] = FORBIDDEN_INSTRUCT,
|
||||
[MOVE_GLACIAL_LANCE] = FORBIDDEN_METRONOME,
|
||||
[MOVE_GLITZY_GLOW] = FORBIDDEN_METRONOME,
|
||||
[MOVE_GRAV_APPLE] = FORBIDDEN_METRONOME,
|
||||
[MOVE_GUILLOTINE] = FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_HELPING_HAND] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
|
||||
[MOVE_HOLD_HANDS] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_HORN_DRILL] = FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_HYDRO_CANNON] = FORBIDDEN_INSTRUCT,
|
||||
[MOVE_HYPER_BEAM] = FORBIDDEN_INSTRUCT,
|
||||
[MOVE_HYPERSPACE_FURY] = FORBIDDEN_METRONOME,
|
||||
[MOVE_HYPERSPACE_HOLE] = FORBIDDEN_METRONOME,
|
||||
[MOVE_ICE_BALL] = FORBIDDEN_INSTRUCT,
|
||||
[MOVE_ICE_BURN] = FORBIDDEN_METRONOME | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_ICE_BALL] = FORBIDDEN_INSTRUCT | FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_ICE_BURN] = FORBIDDEN_METRONOME | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT | FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_ICICLE_SPEAR] = FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_INSTRUCT] = FORBIDDEN_METRONOME | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_JUNGLE_HEALING] = FORBIDDEN_METRONOME,
|
||||
[MOVE_KINGS_SHIELD] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_INSTRUCT,
|
||||
@ -1018,12 +1041,13 @@ static const u8 sForbiddenMoves[MOVES_COUNT] =
|
||||
[MOVE_MAT_BLOCK] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
|
||||
[MOVE_ME_FIRST] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_METEOR_ASSAULT] = FORBIDDEN_METRONOME | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_METEOR_BEAM] = FORBIDDEN_INSTRUCT,
|
||||
[MOVE_METEOR_BEAM] = FORBIDDEN_INSTRUCT | FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_METRONOME] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_MIMIC] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_MIMIC | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_MIND_BLOWN] = FORBIDDEN_METRONOME,
|
||||
[MOVE_MIRROR_COAT] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
|
||||
[MOVE_MIRROR_MOVE] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_MISTY_EXPLOSION] = FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_MOONGEIST_BEAM] = FORBIDDEN_METRONOME,
|
||||
[MOVE_NATURE_POWER] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_NATURES_MADNESS] = FORBIDDEN_METRONOME,
|
||||
@ -1031,42 +1055,43 @@ static const u8 sForbiddenMoves[MOVES_COUNT] =
|
||||
[MOVE_ORIGIN_PULSE] = FORBIDDEN_METRONOME,
|
||||
[MOVE_OUTRAGE] = FORBIDDEN_INSTRUCT,
|
||||
[MOVE_OVERDRIVE] = FORBIDDEN_METRONOME,
|
||||
[MOVE_PETAL_DANCE] = FORBIDDEN_INSTRUCT,
|
||||
[MOVE_PHANTOM_FORCE] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_PHANTOM_FORCE] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT | FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_PHOTON_GEYSER] = FORBIDDEN_METRONOME,
|
||||
[MOVE_PIKA_PAPOW] = FORBIDDEN_METRONOME,
|
||||
[MOVE_PLASMA_FISTS] = FORBIDDEN_METRONOME,
|
||||
[MOVE_PRECIPICE_BLADES] = FORBIDDEN_METRONOME,
|
||||
[MOVE_PRISMATIC_LASER] = FORBIDDEN_INSTRUCT,
|
||||
[MOVE_PROTECT] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
|
||||
[MOVE_PYRO_BALL] = FORBIDDEN_METRONOME,
|
||||
[MOVE_QUASH] = FORBIDDEN_METRONOME,
|
||||
[MOVE_QUICK_GUARD] = FORBIDDEN_METRONOME,
|
||||
[MOVE_RAGE_POWDER] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
|
||||
[MOVE_RAZOR_WIND] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_RAZOR_WIND] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT | FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_RELIC_SONG] = FORBIDDEN_METRONOME,
|
||||
[MOVE_ROAR] = FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
|
||||
[MOVE_ROAR_OF_TIME] = FORBIDDEN_INSTRUCT,
|
||||
[MOVE_ROCK_BLAST] = FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_ROCK_WRECKER] = FORBIDDEN_INSTRUCT,
|
||||
[MOVE_ROLLOUT] = FORBIDDEN_INSTRUCT,
|
||||
[MOVE_ROLLOUT] = FORBIDDEN_INSTRUCT | FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_SAPPY_SEED] = FORBIDDEN_METRONOME,
|
||||
[MOVE_SCALE_SHOT] = FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_SECRET_SWORD] = FORBIDDEN_METRONOME,
|
||||
[MOVE_SHADOW_FORCE] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_SELF_DESTRUCT] = FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_SHADOW_FORCE] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT | FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_SHEER_COLD] = FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_SHELL_TRAP] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_SIZZLY_SLIDE] = FORBIDDEN_METRONOME,
|
||||
[MOVE_SKETCH] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_MIMIC | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_SKULL_BASH] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_SKY_ATTACK] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_SKY_DROP] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_SKULL_BASH] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT | FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_SKY_ATTACK] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT | FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_SKY_DROP] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT | FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_SLEEP_TALK] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_SNAP_TRAP] = FORBIDDEN_METRONOME,
|
||||
[MOVE_SNARL] = FORBIDDEN_METRONOME,
|
||||
[MOVE_SNATCH] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_SNORE] = FORBIDDEN_METRONOME,
|
||||
[MOVE_SOLAR_BEAM] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_SOLAR_BLADE] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_SOLAR_BEAM] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT | FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_SOLAR_BLADE] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT | FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_SPARKLY_SWIRL] = FORBIDDEN_METRONOME,
|
||||
[MOVE_SPECTRAL_THIEF] = FORBIDDEN_METRONOME,
|
||||
[MOVE_SPIKE_CANNON] = FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_SPIKY_SHIELD] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
|
||||
[MOVE_SPIRIT_BREAK] = FORBIDDEN_METRONOME,
|
||||
[MOVE_SPLISHY_SPLASH] = FORBIDDEN_METRONOME,
|
||||
@ -1075,8 +1100,9 @@ static const u8 sForbiddenMoves[MOVES_COUNT] =
|
||||
[MOVE_STEEL_BEAM] = FORBIDDEN_METRONOME,
|
||||
[MOVE_STRANGE_STEAM] = FORBIDDEN_METRONOME,
|
||||
[MOVE_SUNSTEEL_STRIKE] = FORBIDDEN_METRONOME,
|
||||
[MOVE_SURGING_STRIKES] = FORBIDDEN_METRONOME,
|
||||
[MOVE_SURGING_STRIKES] = FORBIDDEN_METRONOME | FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_SWITCHEROO] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
|
||||
[MOVE_TAIL_SLAP] = FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_TECHNO_BLAST] = FORBIDDEN_METRONOME,
|
||||
[MOVE_THIEF] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
|
||||
[MOVE_THOUSAND_ARROWS] = FORBIDDEN_METRONOME,
|
||||
@ -1086,15 +1112,36 @@ static const u8 sForbiddenMoves[MOVES_COUNT] =
|
||||
[MOVE_THUNDEROUS_KICK] = FORBIDDEN_METRONOME,
|
||||
[MOVE_TRANSFORM] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_MIMIC | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_TRICK] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
|
||||
[MOVE_UPROAR] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
|
||||
[MOVE_TRIPLE_AXEL] = FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_TRIPLE_KICK] = FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_TWINEEDLE] = FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_UPROAR] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT | FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_V_CREATE] = FORBIDDEN_METRONOME,
|
||||
[MOVE_VEEVEE_VOLLEY] = FORBIDDEN_METRONOME,
|
||||
[MOVE_WATER_SHURIKEN] = FORBIDDEN_PARENTAL_BOND,
|
||||
[MOVE_WHIRLWIND] = FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
|
||||
[MOVE_WICKED_BLOW] = FORBIDDEN_METRONOME,
|
||||
[MOVE_WIDE_GUARD] = FORBIDDEN_METRONOME,
|
||||
[MOVE_ZIPPY_ZAP] = FORBIDDEN_METRONOME,
|
||||
};
|
||||
|
||||
static const u16 sFinalStrikeOnlyEffects[] =
|
||||
{
|
||||
EFFECT_RELIC_SONG,
|
||||
EFFECT_BUG_BITE,
|
||||
EFFECT_THIEF,
|
||||
EFFECT_BURN_UP,
|
||||
EFFECT_SECRET_POWER,
|
||||
EFFECT_SMACK_DOWN,
|
||||
EFFECT_SPARKLING_ARIA,
|
||||
EFFECT_SMELLINGSALT,
|
||||
EFFECT_WAKE_UP_SLAP,
|
||||
EFFECT_HIT_ESCAPE,
|
||||
EFFECT_RECOIL_HP_25,
|
||||
EFFECT_HIT_PREVENT_ESCAPE,
|
||||
EFFECT_HIT_SWITCH_TARGET,
|
||||
};
|
||||
|
||||
static const u16 sNaturePowerMoves[BATTLE_TERRAIN_COUNT] =
|
||||
{
|
||||
#if B_NATURE_POWER_MOVES >= GEN_7
|
||||
@ -1404,6 +1451,18 @@ static void Cmd_attackcanceler(void)
|
||||
if (AtkCanceller_UnableToUseMove())
|
||||
return;
|
||||
|
||||
if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_OFF
|
||||
&& GetBattlerAbility(gBattlerAttacker) == ABILITY_PARENTAL_BOND
|
||||
&& IsMoveAffectedByParentalBond(gCurrentMove, gBattlerAttacker)
|
||||
&& !(gAbsentBattlerFlags & gBitTable[gBattlerTarget])
|
||||
&& gBattleStruct->zmove.toBeUsed[gBattlerAttacker] == MOVE_NONE)
|
||||
{
|
||||
gSpecialStatuses[gBattlerAttacker].parentalBondState = PARENTAL_BOND_1ST_HIT;
|
||||
gMultiHitCounter = 2;
|
||||
PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0)
|
||||
return;
|
||||
}
|
||||
|
||||
// Check Protean activation.
|
||||
if ((attackerAbility == ABILITY_PROTEAN || attackerAbility == ABILITY_LIBERO)
|
||||
&& (gBattleMons[gBattlerAttacker].type1 != moveType || gBattleMons[gBattlerAttacker].type2 != moveType ||
|
||||
@ -1535,6 +1594,13 @@ static void Cmd_attackcanceler(void)
|
||||
gMoveResultFlags |= MOVE_RESULT_MISSED;
|
||||
gLastLandedMoves[gBattlerTarget] = 0;
|
||||
gLastHitByType[gBattlerTarget] = 0;
|
||||
|
||||
if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_1ST_HIT)
|
||||
{
|
||||
gSpecialStatuses[gBattlerAttacker].parentalBondState = PARENTAL_BOND_OFF; // No second hit if first hit was blocked
|
||||
gSpecialStatuses[gBattlerAttacker].multiHitOn = 0;
|
||||
gMultiHitCounter = 0;
|
||||
}
|
||||
gBattleCommunication[MISS_TYPE] = B_MSG_PROTECTED;
|
||||
gBattlescriptCurrInstr++;
|
||||
}
|
||||
@ -1784,6 +1850,13 @@ static void Cmd_accuracycheck(void)
|
||||
else if (!JumpIfMoveAffectedByProtect(0))
|
||||
gBattlescriptCurrInstr += 7;
|
||||
}
|
||||
else if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_2ND_HIT
|
||||
|| (gSpecialStatuses[gBattlerAttacker].multiHitOn && (gBattleMoves[move].effect != EFFECT_TRIPLE_KICK
|
||||
|| GetBattlerAbility(gBattlerAttacker) == ABILITY_SKILL_LINK)))
|
||||
{
|
||||
// No acc checks for second hit of Parental Bond or multi hit moves, except Triple Kick/Triple Axel
|
||||
gBattlescriptCurrInstr += 7;
|
||||
}
|
||||
else
|
||||
{
|
||||
GET_MOVE_TYPE(move, type);
|
||||
@ -1866,7 +1939,8 @@ static void Cmd_ppreduce(void)
|
||||
// For item Metronome, echoed voice
|
||||
if (gCurrentMove == gLastResultingMoves[gBattlerAttacker]
|
||||
&& !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
|
||||
&& !WasUnableToUseMove(gBattlerAttacker))
|
||||
&& !WasUnableToUseMove(gBattlerAttacker)
|
||||
&& gSpecialStatuses[gBattlerAttacker].parentalBondState != PARENTAL_BOND_1ST_HIT) // Don't increment counter on first hit
|
||||
gBattleStruct->sameMoveTurns[gBattlerAttacker]++;
|
||||
else
|
||||
gBattleStruct->sameMoveTurns[gBattlerAttacker] = 0;
|
||||
@ -2183,6 +2257,12 @@ static void Cmd_attackanimation(void)
|
||||
}
|
||||
else
|
||||
{
|
||||
if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_2ND_HIT) // No animation on second hit
|
||||
{
|
||||
gBattlescriptCurrInstr++;
|
||||
return;
|
||||
}
|
||||
|
||||
if ((moveTarget & MOVE_TARGET_BOTH
|
||||
|| moveTarget & MOVE_TARGET_FOES_AND_ALLY
|
||||
|| moveTarget & MOVE_TARGET_DEPENDS)
|
||||
@ -2470,10 +2550,12 @@ static void Cmd_resultmessage(void)
|
||||
switch (gMoveResultFlags & ~MOVE_RESULT_MISSED)
|
||||
{
|
||||
case MOVE_RESULT_SUPER_EFFECTIVE:
|
||||
stringId = STRINGID_SUPEREFFECTIVE;
|
||||
if (!gMultiHitCounter) // Don't print effectiveness on each hit in a multi hit attack
|
||||
stringId = STRINGID_SUPEREFFECTIVE;
|
||||
break;
|
||||
case MOVE_RESULT_NOT_VERY_EFFECTIVE:
|
||||
stringId = STRINGID_NOTVERYEFFECTIVE;
|
||||
if (!gMultiHitCounter)
|
||||
stringId = STRINGID_NOTVERYEFFECTIVE;
|
||||
break;
|
||||
case MOVE_RESULT_ONE_HIT_KO:
|
||||
stringId = STRINGID_ONEHITKO;
|
||||
@ -2562,7 +2644,6 @@ static void Cmd_resultmessage(void)
|
||||
if (gSpecialStatuses[gBattlerTarget].berryReduced
|
||||
&& !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT))
|
||||
{
|
||||
gLastUsedItem = gBattleMons[gBattlerTarget].item;
|
||||
gSpecialStatuses[gBattlerTarget].berryReduced = FALSE;
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_PrintBerryReduceString;
|
||||
@ -2709,9 +2790,19 @@ void SetMoveEffect(bool32 primary, u32 certain)
|
||||
u32 flags = 0;
|
||||
u16 battlerAbility;
|
||||
|
||||
if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_1ST_HIT
|
||||
&& gBattleMons[gBattlerTarget].hp != 0
|
||||
&& IsFinalStrikeEffect(gCurrentMove))
|
||||
{
|
||||
gBattlescriptCurrInstr++;
|
||||
return;
|
||||
}
|
||||
|
||||
switch (gBattleScripting.moveEffect) // Set move effects which happen later on
|
||||
{
|
||||
case MOVE_EFFECT_KNOCK_OFF:
|
||||
case MOVE_EFFECT_SMACK_DOWN:
|
||||
case MOVE_EFFECT_REMOVE_STATUS:
|
||||
gBattleStruct->moveEffect2 = gBattleScripting.moveEffect;
|
||||
gBattlescriptCurrInstr++;
|
||||
return;
|
||||
@ -2748,7 +2839,8 @@ void SetMoveEffect(bool32 primary, u32 certain)
|
||||
|
||||
if (gBattleMons[gEffectBattler].hp == 0
|
||||
&& gBattleScripting.moveEffect != MOVE_EFFECT_PAYDAY
|
||||
&& gBattleScripting.moveEffect != MOVE_EFFECT_STEAL_ITEM)
|
||||
&& gBattleScripting.moveEffect != MOVE_EFFECT_STEAL_ITEM
|
||||
&& gBattleScripting.moveEffect != MOVE_EFFECT_BUG_BITE)
|
||||
INCREMENT_RESET_RETURN
|
||||
|
||||
if (DoesSubstituteBlockMove(gBattlerAttacker, gEffectBattler, gCurrentMove) && affectsUser != MOVE_EFFECT_AFFECTS_USER)
|
||||
@ -3074,15 +3166,21 @@ void SetMoveEffect(bool32 primary, u32 certain)
|
||||
}
|
||||
break;
|
||||
case MOVE_EFFECT_PAYDAY:
|
||||
if (GET_BATTLER_SIDE(gBattlerAttacker) == B_SIDE_PLAYER)
|
||||
// Don't scatter coins on the second hit of Parental Bond
|
||||
if (GET_BATTLER_SIDE(gBattlerAttacker) == B_SIDE_PLAYER && gSpecialStatuses[gBattlerAttacker].parentalBondState!= PARENTAL_BOND_2ND_HIT)
|
||||
{
|
||||
u16 payday = gPaydayMoney;
|
||||
gPaydayMoney += (gBattleMons[gBattlerAttacker].level * 5);
|
||||
if (payday > gPaydayMoney)
|
||||
gPaydayMoney = 0xFFFF;
|
||||
|
||||
BattleScriptPush(gBattlescriptCurrInstr + 1);
|
||||
gBattlescriptCurrInstr = BattleScript_MoveEffectPayDay;
|
||||
}
|
||||
else
|
||||
{
|
||||
gBattlescriptCurrInstr++;
|
||||
}
|
||||
BattleScriptPush(gBattlescriptCurrInstr + 1);
|
||||
gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleScripting.moveEffect];
|
||||
break;
|
||||
case MOVE_EFFECT_HAPPY_HOUR:
|
||||
if (GET_BATTLER_SIDE(gBattlerAttacker) == B_SIDE_PLAYER && !gBattleStruct->moneyMultiplierMove)
|
||||
@ -3320,34 +3418,6 @@ void SetMoveEffect(bool32 primary, u32 certain)
|
||||
BattleScriptPush(gBattlescriptCurrInstr + 1);
|
||||
gBattlescriptCurrInstr = BattleScript_RapidSpinAway;
|
||||
break;
|
||||
case MOVE_EFFECT_REMOVE_STATUS: // Smelling salts
|
||||
if (!(gBattleMons[gBattlerTarget].status1 & gBattleMoves[gCurrentMove].argument))
|
||||
{
|
||||
gBattlescriptCurrInstr++;
|
||||
}
|
||||
else
|
||||
{
|
||||
gBattleMons[gBattlerTarget].status1 &= ~gBattleMoves[gCurrentMove].argument;
|
||||
|
||||
gActiveBattler = gBattlerTarget;
|
||||
BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1);
|
||||
MarkBattlerForControllerExec(gActiveBattler);
|
||||
|
||||
BattleScriptPush(gBattlescriptCurrInstr + 1);
|
||||
switch (gBattleMoves[gCurrentMove].argument)
|
||||
{
|
||||
case STATUS1_PARALYSIS:
|
||||
gBattlescriptCurrInstr = BattleScript_TargetPRLZHeal;
|
||||
break;
|
||||
case STATUS1_SLEEP:
|
||||
gBattlescriptCurrInstr = BattleScript_TargetWokeUp;
|
||||
break;
|
||||
case STATUS1_BURN:
|
||||
gBattlescriptCurrInstr = BattleScript_TargetBurnHeal;
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case MOVE_EFFECT_ATK_DEF_DOWN: // SuperPower
|
||||
if (!NoAliveMonsForEitherParty())
|
||||
{
|
||||
@ -3362,42 +3432,12 @@ void SetMoveEffect(bool32 primary, u32 certain)
|
||||
gBattlescriptCurrInstr = BattleScript_DefSpDefDown;
|
||||
}
|
||||
break;
|
||||
case MOVE_EFFECT_RECOIL_25: // Take Down, 25% recoil
|
||||
gBattleMoveDamage = (gHpDealt) / 4;
|
||||
if (gBattleMoveDamage == 0)
|
||||
gBattleMoveDamage = 1;
|
||||
|
||||
BattleScriptPush(gBattlescriptCurrInstr + 1);
|
||||
gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleScripting.moveEffect];
|
||||
break;
|
||||
case MOVE_EFFECT_RECOIL_33: // Double Edge, 33 % recoil
|
||||
gBattleMoveDamage = gHpDealt / 3;
|
||||
if (gBattleMoveDamage == 0)
|
||||
gBattleMoveDamage = 1;
|
||||
|
||||
BattleScriptPush(gBattlescriptCurrInstr + 1);
|
||||
gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleScripting.moveEffect];
|
||||
break;
|
||||
case MOVE_EFFECT_RECOIL_50: // Head Smash, 50 % recoil
|
||||
gBattleMoveDamage = gHpDealt / 2;
|
||||
if (gBattleMoveDamage == 0)
|
||||
gBattleMoveDamage = 1;
|
||||
|
||||
BattleScriptPush(gBattlescriptCurrInstr + 1);
|
||||
gBattlescriptCurrInstr = BattleScript_MoveEffectRecoil;
|
||||
break;
|
||||
case MOVE_EFFECT_RECOIL_33_STATUS: // Flare Blitz - can burn, Volt Tackle - can paralyze
|
||||
gBattleScripting.savedDmg = gHpDealt / 3;
|
||||
if (gBattleScripting.savedDmg == 0)
|
||||
gBattleScripting.savedDmg = 1;
|
||||
|
||||
BattleScriptPush(gBattlescriptCurrInstr + 1);
|
||||
gBattlescriptCurrInstr = BattleScript_MoveEffectRecoilWithStatus;
|
||||
break;
|
||||
case MOVE_EFFECT_RECOIL_HP_25: // Struggle
|
||||
gBattleMoveDamage = (gBattleMons[gEffectBattler].maxHP) / 4;
|
||||
if (gBattleMoveDamage == 0)
|
||||
gBattleMoveDamage = 1;
|
||||
if (GetBattlerAbility(gEffectBattler) == ABILITY_PARENTAL_BOND)
|
||||
gBattleMoveDamage *= 2;
|
||||
|
||||
BattleScriptPush(gBattlescriptCurrInstr + 1);
|
||||
gBattlescriptCurrInstr = BattleScript_MoveEffectRecoil;
|
||||
@ -3435,15 +3475,6 @@ void SetMoveEffect(bool32 primary, u32 certain)
|
||||
gBattlescriptCurrInstr = BattleScript_MoveEffectClearSmog;
|
||||
}
|
||||
break;
|
||||
case MOVE_EFFECT_SMACK_DOWN:
|
||||
if (!IsBattlerGrounded(gBattlerTarget))
|
||||
{
|
||||
gStatuses3[gBattlerTarget] |= STATUS3_SMACKED_DOWN;
|
||||
gStatuses3[gBattlerTarget] &= ~(STATUS3_MAGNET_RISE | STATUS3_TELEKINESIS | STATUS3_ON_AIR);
|
||||
BattleScriptPush(gBattlescriptCurrInstr + 1);
|
||||
gBattlescriptCurrInstr = BattleScript_MoveEffectSmackDown;
|
||||
}
|
||||
break;
|
||||
case MOVE_EFFECT_FLAME_BURST:
|
||||
if (IsBattlerAlive(BATTLE_PARTNER(gBattlerTarget)) && GetBattlerAbility(BATTLE_PARTNER(gBattlerTarget)) != ABILITY_MAGIC_GUARD)
|
||||
{
|
||||
@ -3570,11 +3601,6 @@ void SetMoveEffect(bool32 primary, u32 certain)
|
||||
|
||||
BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gEffectBattler].item), &gBattleMons[gEffectBattler].item);
|
||||
MarkBattlerForControllerExec(gActiveBattler);
|
||||
|
||||
// attacker temporarily gains their item
|
||||
gBattleStruct->changedItems[gBattlerAttacker] = gBattleMons[gBattlerAttacker].item;
|
||||
gBattleMons[gBattlerAttacker].item = gLastUsedItem;
|
||||
|
||||
BattleScriptPush(gBattlescriptCurrInstr + 1);
|
||||
gBattlescriptCurrInstr = BattleScript_MoveEffectBugBite;
|
||||
}
|
||||
@ -3616,6 +3642,11 @@ void SetMoveEffect(bool32 primary, u32 certain)
|
||||
gBattlescriptCurrInstr = BattleScript_DefDownSpeedUp;
|
||||
}
|
||||
break;
|
||||
case MOVE_EFFECT_BURN_UP:
|
||||
// This seems unnecessary but is done to make it work properly with Parental Bond
|
||||
BattleScriptPush(gBattlescriptCurrInstr + 1);
|
||||
gBattlescriptCurrInstr = BattleScript_BurnUpRemoveType;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -5134,6 +5165,10 @@ static void Cmd_moveend(void)
|
||||
{
|
||||
switch (gBattleScripting.moveendState)
|
||||
{
|
||||
case MOVEEND_SUM_DAMAGE: // Sum and store damage dealt for multi strike recoil
|
||||
gBattleScripting.savedDmg += gHpDealt;
|
||||
gBattleScripting.moveendState++;
|
||||
break;
|
||||
case MOVEEND_PROTECT_LIKE_EFFECT:
|
||||
if (gProtectStructs[gBattlerAttacker].touchedProtectLike)
|
||||
{
|
||||
@ -5232,6 +5267,42 @@ static void Cmd_moveend(void)
|
||||
}
|
||||
gBattleScripting.moveendState++;
|
||||
break;
|
||||
case MOVEEND_RECOIL:
|
||||
if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
|
||||
&& !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE)
|
||||
&& IsBattlerAlive(gBattlerAttacker)
|
||||
&& gBattleScripting.savedDmg != 0) // Some checks may be redundant alongside this one
|
||||
{
|
||||
switch (gBattleMoves[gCurrentMove].effect)
|
||||
{
|
||||
case EFFECT_RECOIL_25: // Take Down, 25% recoil
|
||||
gBattleMoveDamage = max(1, gBattleScripting.savedDmg / 4);
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_MoveEffectRecoil;
|
||||
effect = TRUE;
|
||||
break;
|
||||
case EFFECT_RECOIL_33: // Double Edge, 33 % recoil
|
||||
gBattleMoveDamage = max(1, gBattleScripting.savedDmg / 3);
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_MoveEffectRecoil;
|
||||
effect = TRUE;
|
||||
break;
|
||||
case EFFECT_RECOIL_50: // Head Smash, 50 % recoil
|
||||
gBattleMoveDamage = max(1, gBattleScripting.savedDmg / 2);
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_MoveEffectRecoil;
|
||||
effect = TRUE;
|
||||
break;
|
||||
case EFFECT_RECOIL_33_STATUS: // Flare Blitz - can burn, Volt Tackle - can paralyze
|
||||
gBattleMoveDamage = max(1, gBattleScripting.savedDmg / 3);
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_MoveEffectRecoilWithStatus;
|
||||
effect = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
gBattleScripting.moveendState++;
|
||||
break;
|
||||
case MOVEEND_SYNCHRONIZE_TARGET: // target synchronize
|
||||
if (AbilityBattleEffects(ABILITYEFFECT_SYNCHRONIZE, gBattlerTarget, 0, 0, 0))
|
||||
effect = TRUE;
|
||||
@ -5299,15 +5370,51 @@ static void Cmd_moveend(void)
|
||||
gBattleScripting.moveendState++;
|
||||
break;
|
||||
case MOVEEND_MOVE_EFFECTS2: // For effects which should happen after target items, for example Knock Off after damage from Rocky Helmet.
|
||||
{
|
||||
switch (gBattleStruct->moveEffect2)
|
||||
{
|
||||
case MOVE_EFFECT_KNOCK_OFF:
|
||||
effect = TryKnockOffBattleScript(gBattlerTarget);
|
||||
break;
|
||||
case MOVE_EFFECT_SMACK_DOWN:
|
||||
if (!IsBattlerGrounded(gBattlerTarget) && IsBattlerAlive(gBattlerTarget))
|
||||
{
|
||||
gStatuses3[gBattlerTarget] |= STATUS3_SMACKED_DOWN;
|
||||
gStatuses3[gBattlerTarget] &= ~(STATUS3_MAGNET_RISE | STATUS3_TELEKINESIS | STATUS3_ON_AIR);
|
||||
effect = TRUE;
|
||||
BattleScriptPush(gBattlescriptCurrInstr + 1);
|
||||
gBattlescriptCurrInstr = BattleScript_MoveEffectSmackDown;
|
||||
}
|
||||
break;
|
||||
case MOVE_EFFECT_REMOVE_STATUS: // Smelling salts, Wake-Up Slap, Sparkling Aria
|
||||
if ((gBattleMons[gBattlerTarget].status1 & gBattleMoves[gCurrentMove].argument) && IsBattlerAlive(gBattlerTarget))
|
||||
{
|
||||
gBattleMons[gBattlerTarget].status1 &= ~(gBattleMoves[gCurrentMove].argument);
|
||||
|
||||
gActiveBattler = gBattlerTarget;
|
||||
BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1);
|
||||
MarkBattlerForControllerExec(gActiveBattler);
|
||||
effect = TRUE;
|
||||
BattleScriptPush(gBattlescriptCurrInstr + 1);
|
||||
switch (gBattleMoves[gCurrentMove].argument)
|
||||
{
|
||||
case STATUS1_PARALYSIS:
|
||||
gBattlescriptCurrInstr = BattleScript_TargetPRLZHeal;
|
||||
break;
|
||||
case STATUS1_SLEEP:
|
||||
gBattlescriptCurrInstr = BattleScript_TargetWokeUp;
|
||||
break;
|
||||
case STATUS1_BURN:
|
||||
gBattlescriptCurrInstr = BattleScript_TargetBurnHeal;
|
||||
break;
|
||||
}
|
||||
}
|
||||
break; // MOVE_EFFECT_REMOVE_STATUS
|
||||
}
|
||||
gBattleStruct->moveEffect2 = 0;
|
||||
gBattleScripting.moveendState++;
|
||||
break;
|
||||
break; // MOVEEND_MOVE_EFFECTS2
|
||||
}
|
||||
case MOVEEND_ITEM_EFFECTS_ALL: // item effects for all battlers
|
||||
if (ItemBattleEffects(ITEMEFFECT_MOVE_END, 0, FALSE))
|
||||
effect = TRUE;
|
||||
@ -5555,6 +5662,61 @@ static void Cmd_moveend(void)
|
||||
gBattleScripting.moveendState++;
|
||||
break;
|
||||
}
|
||||
case MOVEEND_MULTIHIT_MOVE:
|
||||
{
|
||||
if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
|
||||
&& !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE)
|
||||
&& gMultiHitCounter
|
||||
&& !(gCurrentMove == MOVE_PRESENT && gBattleStruct->presentBasePower == 0)) // Silly edge case
|
||||
{
|
||||
gBattleScripting.multihitString[4]++;
|
||||
if (--gMultiHitCounter == 0)
|
||||
{
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_MultiHitPrintStrings;
|
||||
effect = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (gCurrentMove == MOVE_DRAGON_DARTS)
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
|
||||
if (gBattleMons[gBattlerAttacker].hp
|
||||
&& gBattleMons[gBattlerTarget].hp
|
||||
&& (gChosenMove == MOVE_SLEEP_TALK || !(gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP))
|
||||
&& !(gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE))
|
||||
{
|
||||
if (gSpecialStatuses[gBattlerAttacker].parentalBondState)
|
||||
gSpecialStatuses[gBattlerAttacker].parentalBondState--;
|
||||
|
||||
gHitMarker |= (HITMARKER_NO_PPDEDUCT | HITMARKER_NO_ATTACKSTRING);
|
||||
gBattleScripting.animTargetsHit = 0;
|
||||
gBattleScripting.moveendState = 0;
|
||||
gSpecialStatuses[gBattlerTarget].sturdied = 0;
|
||||
gSpecialStatuses[gBattlerTarget].focusBanded = 0; // Delete this line to make Focus Band last for the duration of the whole move turn.
|
||||
gSpecialStatuses[gBattlerTarget].focusSashed = 0; // Delete this line to make Focus Sash last for the duration of the whole move turn.
|
||||
gSpecialStatuses[gBattlerAttacker].multiHitOn = TRUE;
|
||||
MoveValuesCleanUp();
|
||||
BattleScriptPush(gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]);
|
||||
gBattlescriptCurrInstr = BattleScript_FlushMessageBox;
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_MultiHitPrintStrings;
|
||||
effect = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
gMultiHitCounter = 0;
|
||||
gSpecialStatuses[gBattlerAttacker].parentalBondState = PARENTAL_BOND_OFF;
|
||||
gSpecialStatuses[gBattlerAttacker].multiHitOn = 0;
|
||||
gBattleScripting.moveendState++;
|
||||
break;
|
||||
}
|
||||
case MOVEEND_EJECT_BUTTON:
|
||||
if (gCurrentMove != MOVE_DRAGON_TAIL
|
||||
&& gCurrentMove != MOVE_CIRCLE_THROW
|
||||
@ -7319,6 +7481,13 @@ static void Cmd_removeitem(void)
|
||||
{
|
||||
u16 itemId = 0;
|
||||
|
||||
if (gBattleScripting.overrideBerryRequirements)
|
||||
{
|
||||
// bug bite / pluck - don't remove current item
|
||||
gBattlescriptCurrInstr += 2;
|
||||
return;
|
||||
}
|
||||
|
||||
gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
|
||||
itemId = gBattleMons[gActiveBattler].item;
|
||||
|
||||
@ -8023,14 +8192,10 @@ static bool32 CourtChangeSwapSideStatuses(void)
|
||||
|
||||
static bool32 CanTeleport(u8 battlerId)
|
||||
{
|
||||
struct Pokemon* party = NULL;
|
||||
u8 side = GetBattlerSide(battlerId);
|
||||
struct Pokemon *party = (side == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty;
|
||||
u32 species, count, i;
|
||||
|
||||
if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)
|
||||
party = gPlayerParty;
|
||||
else
|
||||
party = gEnemyParty;
|
||||
|
||||
for (i = 0; i < PARTY_SIZE; i++)
|
||||
{
|
||||
species = GetMonData(&party[i], MON_DATA_SPECIES2);
|
||||
@ -8041,11 +8206,11 @@ static bool32 CanTeleport(u8 battlerId)
|
||||
switch (GetBattlerSide(battlerId))
|
||||
{
|
||||
case B_SIDE_OPPONENT:
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
|
||||
if (count == 1 || gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
|
||||
return FALSE;
|
||||
break;
|
||||
case B_SIDE_PLAYER:
|
||||
if (count == 1 || (count <= 2 && gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
|
||||
if (count == 1 || (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && count <= 2))
|
||||
return FALSE;
|
||||
break;
|
||||
}
|
||||
@ -9584,24 +9749,18 @@ static void Cmd_various(void)
|
||||
}
|
||||
break;
|
||||
case VARIOUS_CONSUME_BERRY:
|
||||
if (ItemId_GetHoldEffect(gBattleMons[gActiveBattler].item) == HOLD_EFFECT_NONE)
|
||||
if (gBattleScripting.overrideBerryRequirements == 2)
|
||||
{
|
||||
gBattlescriptCurrInstr += 4;
|
||||
return;
|
||||
}
|
||||
|
||||
gBattleScripting.battler = gEffectBattler = gBattlerTarget = gActiveBattler; // Cover all berry effect battlerId cases. e.g. ChangeStatBuffs uses target ID
|
||||
// Do move end berry effects for just a single battler, instead of looping through all battlers
|
||||
if (ItemBattleEffects(ITEMEFFECT_BATTLER_MOVE_END, gActiveBattler, FALSE))
|
||||
return;
|
||||
|
||||
if (gBattlescriptCurrInstr[3])
|
||||
{
|
||||
gBattleMons[gActiveBattler].item = gBattleStruct->changedItems[gActiveBattler];
|
||||
gBattleStruct->changedItems[gActiveBattler] = ITEM_NONE;
|
||||
gBattleResources->flags->flags[gActiveBattler] &= ~RESOURCE_FLAG_UNBURDEN;
|
||||
}
|
||||
gLastUsedItem = gBattleMons[gActiveBattler].item;
|
||||
|
||||
gBattleScripting.battler = gEffectBattler = gBattlerTarget = gActiveBattler; // Cover all berry effect battlerId cases. e.g. ChangeStatBuffs uses target ID
|
||||
if (ItemBattleEffects(ITEMEFFECT_USE_LAST_ITEM, gActiveBattler, FALSE))
|
||||
return;
|
||||
gBattlescriptCurrInstr += 4;
|
||||
return;
|
||||
case VARIOUS_JUMP_IF_CANT_REVERT_TO_PRIMAL:
|
||||
@ -9898,6 +10057,18 @@ static void Cmd_various(void)
|
||||
else
|
||||
gBattleCommunication[0] = B_SIDE_OPPONENT;
|
||||
break;
|
||||
case VARIOUS_CHECK_PARENTAL_BOND_COUNTER:
|
||||
{
|
||||
// Some effects should only happen on the first or second strike of Parental Bond,
|
||||
// so a way to check this in battle scripts is useful
|
||||
u8 counter = T1_READ_8(gBattlescriptCurrInstr + 3);
|
||||
if (gSpecialStatuses[gBattlerAttacker].parentalBondState == counter && gBattleMons[gBattlerTarget].hp != 0)
|
||||
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 4);
|
||||
else
|
||||
gBattlescriptCurrInstr += 8;
|
||||
return;
|
||||
}
|
||||
break;
|
||||
} // End of switch (gBattlescriptCurrInstr[2])
|
||||
|
||||
gBattlescriptCurrInstr += 3;
|
||||
@ -10372,10 +10543,13 @@ static void Cmd_stockpiletobasedamage(void)
|
||||
if (gBattleCommunication[MISS_TYPE] != B_MSG_PROTECTED)
|
||||
gBattleScripting.animTurn = gDisableStructs[gBattlerAttacker].stockpileCounter;
|
||||
|
||||
gDisableStructs[gBattlerAttacker].stockpileCounter = 0;
|
||||
// Restore stat changes from stockpile.
|
||||
gBattleMons[gBattlerAttacker].statStages[STAT_DEF] -= gDisableStructs[gBattlerAttacker].stockpileDef;
|
||||
gBattleMons[gBattlerAttacker].statStages[STAT_SPDEF] -= gDisableStructs[gBattlerAttacker].stockpileSpDef;
|
||||
if (!(gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_1ST_HIT && gBattleMons[gBattlerTarget].hp != 0))
|
||||
{
|
||||
gDisableStructs[gBattlerAttacker].stockpileCounter = 0;
|
||||
// Restore stat changes from stockpile.
|
||||
gBattleMons[gBattlerAttacker].statStages[STAT_DEF] -= gDisableStructs[gBattlerAttacker].stockpileDef;
|
||||
gBattleMons[gBattlerAttacker].statStages[STAT_SPDEF] -= gDisableStructs[gBattlerAttacker].stockpileSpDef;
|
||||
}
|
||||
gBattlescriptCurrInstr += 5;
|
||||
}
|
||||
}
|
||||
@ -12266,7 +12440,8 @@ static void Cmd_handlefurycutter(void)
|
||||
}
|
||||
else
|
||||
{
|
||||
if (gDisableStructs[gBattlerAttacker].furyCutterCounter != 5)
|
||||
if (gDisableStructs[gBattlerAttacker].furyCutterCounter != 5
|
||||
&& gSpecialStatuses[gBattlerAttacker].parentalBondState != PARENTAL_BOND_1ST_HIT) // Don't increment counter on first hit
|
||||
gDisableStructs[gBattlerAttacker].furyCutterCounter++;
|
||||
|
||||
gBattlescriptCurrInstr++;
|
||||
@ -12291,27 +12466,37 @@ static void Cmd_presentdamagecalculation(void)
|
||||
{
|
||||
u32 rand = Random() & 0xFF;
|
||||
|
||||
if (rand < 102)
|
||||
/* Don't reroll present effect/power for the second hit of Parental Bond.
|
||||
* Not sure if this is the correct behaviour, but bulbapedia states
|
||||
* that if present heals the foe, it doesn't strike twice, and if it deals
|
||||
* damage, the second strike will always deal damage too. This is a simple way
|
||||
* to replicate that effect.
|
||||
*/
|
||||
if (gSpecialStatuses[gBattlerAttacker].parentalBondState != PARENTAL_BOND_2ND_HIT)
|
||||
{
|
||||
gBattleStruct->presentBasePower = 40;
|
||||
}
|
||||
else if (rand < 178)
|
||||
{
|
||||
gBattleStruct->presentBasePower = 80;
|
||||
}
|
||||
else if (rand < 204)
|
||||
{
|
||||
gBattleStruct->presentBasePower = 120;
|
||||
}
|
||||
else
|
||||
{
|
||||
gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 4;
|
||||
if (gBattleMoveDamage == 0)
|
||||
gBattleMoveDamage = 1;
|
||||
gBattleMoveDamage *= -1;
|
||||
if (rand < 102)
|
||||
{
|
||||
gBattleStruct->presentBasePower = 40;
|
||||
}
|
||||
else if (rand < 178)
|
||||
{
|
||||
gBattleStruct->presentBasePower = 80;
|
||||
}
|
||||
else if (rand < 204)
|
||||
{
|
||||
gBattleStruct->presentBasePower = 120;
|
||||
}
|
||||
else
|
||||
{
|
||||
gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 4;
|
||||
if (gBattleMoveDamage == 0)
|
||||
gBattleMoveDamage = 1;
|
||||
gBattleMoveDamage *= -1;
|
||||
gBattleStruct->presentBasePower = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (rand < 204)
|
||||
if (gBattleStruct->presentBasePower)
|
||||
{
|
||||
gBattlescriptCurrInstr = BattleScript_HitFromCritCalc;
|
||||
}
|
||||
@ -14542,22 +14727,8 @@ static void Cmd_jumpifoppositegenders(void)
|
||||
gBattlescriptCurrInstr += 5;
|
||||
}
|
||||
|
||||
static void Cmd_trygetbaddreamstarget(void)
|
||||
static void Cmd_unused(void)
|
||||
{
|
||||
u8 badDreamsMonSide = GetBattlerSide(gBattlerAttacker);
|
||||
for (;gBattlerTarget < gBattlersCount; gBattlerTarget++)
|
||||
{
|
||||
if (GetBattlerSide(gBattlerTarget) == badDreamsMonSide)
|
||||
continue;
|
||||
if ((gBattleMons[gBattlerTarget].status1 & STATUS1_SLEEP || GetBattlerAbility(gBattlerTarget) == ABILITY_COMATOSE)
|
||||
&& IsBattlerAlive(gBattlerTarget))
|
||||
break;
|
||||
}
|
||||
|
||||
if (gBattlerTarget >= gBattlersCount)
|
||||
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
|
||||
else
|
||||
gBattlescriptCurrInstr += 5;
|
||||
}
|
||||
|
||||
static void Cmd_tryworryseed(void)
|
||||
@ -14643,3 +14814,44 @@ static bool32 CriticalCapture(u32 odds)
|
||||
return FALSE;
|
||||
#endif
|
||||
}
|
||||
|
||||
bool8 IsMoveAffectedByParentalBond(u16 move, u8 battlerId)
|
||||
{
|
||||
if (gBattleMoves[move].split != SPLIT_STATUS
|
||||
&& !(sForbiddenMoves[move] & FORBIDDEN_PARENTAL_BOND))
|
||||
{
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
|
||||
{
|
||||
switch (GetBattlerMoveTargetType(battlerId, move))
|
||||
{
|
||||
// Both foes are alive, spread move strikes once
|
||||
case MOVE_TARGET_BOTH:
|
||||
if (CountAliveMonsInBattle(BATTLE_ALIVE_DEF_SIDE) >= 2)
|
||||
return FALSE;
|
||||
break;
|
||||
// Either both foes or one foe and its ally are alive; spread move strikes once
|
||||
case MOVE_TARGET_FOES_AND_ALLY:
|
||||
if (CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_ATTACKER) >= 2)
|
||||
return FALSE;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static bool8 IsFinalStrikeEffect(u16 move)
|
||||
{
|
||||
u32 i;
|
||||
u16 moveEffect = gBattleMoves[move].effect;
|
||||
|
||||
for (i = 0; i < ARRAY_COUNT(sFinalStrikeOnlyEffects); i++)
|
||||
{
|
||||
if (moveEffect == sFinalStrikeOnlyEffects[i])
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
@ -130,7 +130,7 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] =
|
||||
[EFFECT_DRAGON_RAGE] = 2,
|
||||
[EFFECT_TRAP] = 4,
|
||||
// [EFFECT_HIGH_CRITICAL] = 1,
|
||||
[EFFECT_DOUBLE_HIT] = 1,
|
||||
// [EFFECT_DOUBLE_HIT] = 1,
|
||||
[EFFECT_RECOIL_IF_MISS] = 1,
|
||||
[EFFECT_MIST] = 5,
|
||||
[EFFECT_FOCUS_ENERGY] = 1,
|
||||
@ -163,7 +163,7 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] =
|
||||
[EFFECT_EVASION_DOWN_HIT] = 1,
|
||||
// [EFFECT_SKY_ATTACK] = 4,
|
||||
[EFFECT_CONFUSE_HIT] = 1,
|
||||
[EFFECT_TWINEEDLE] = 1,
|
||||
// [EFFECT_TWINEEDLE] = 1,
|
||||
[EFFECT_VITAL_THROW] = 1,
|
||||
[EFFECT_SUBSTITUTE] = 4,
|
||||
[EFFECT_RECHARGE] = 5,
|
||||
|
@ -59,6 +59,8 @@ functions instead of at the top of the file with the other declarations.
|
||||
static bool32 TryRemoveScreens(u8 battler);
|
||||
static bool32 IsUnnerveAbilityOnOpposingSide(u8 battlerId);
|
||||
static u8 GetFlingPowerFromItemId(u16 itemId);
|
||||
static void SetRandomMultiHitCounter();
|
||||
static u32 GetBattlerItemHoldEffectParam(u8 battlerId, u16 item);
|
||||
|
||||
extern const u8 *const gBattleScriptsForMoveEffects[];
|
||||
extern const u8 *const gBattlescriptsForRunningByItem[];
|
||||
@ -218,6 +220,23 @@ static const u16 sEntrainmentTargetSimpleBeamBannedAbilities[] =
|
||||
ABILITY_GULP_MISSILE,
|
||||
};
|
||||
|
||||
static u8 CalcBeatUpPower(void)
|
||||
{
|
||||
struct Pokemon *party;
|
||||
u8 basePower;
|
||||
u16 species;
|
||||
|
||||
if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)
|
||||
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);
|
||||
basePower = (gBaseStats[species].baseAttack / 10) + 5;
|
||||
|
||||
return basePower;
|
||||
}
|
||||
|
||||
bool32 IsAffectedByFollowMe(u32 battlerAtk, u32 defSide, u32 move)
|
||||
{
|
||||
u32 ability = GetBattlerAbility(battlerAtk);
|
||||
@ -252,6 +271,7 @@ void HandleAction_UseMove(void)
|
||||
gBattleStruct->atkCancellerTracker = 0;
|
||||
gMoveResultFlags = 0;
|
||||
gMultiHitCounter = 0;
|
||||
gBattleScripting.savedDmg = 0;
|
||||
gBattleCommunication[MISS_TYPE] = 0;
|
||||
gBattleScripting.savedMoveEffect = 0;
|
||||
gCurrMovePos = gChosenMovePos = *(gBattleStruct->chosenMovePositions + gBattlerAttacker);
|
||||
@ -3457,6 +3477,7 @@ enum
|
||||
CANCELLER_POWDER_MOVE,
|
||||
CANCELLER_POWDER_STATUS,
|
||||
CANCELLER_THROAT_CHOP,
|
||||
CANCELLER_MULTIHIT_MOVES,
|
||||
CANCELLER_Z_MOVES,
|
||||
CANCELLER_END,
|
||||
CANCELLER_PSYCHIC_TERRAIN,
|
||||
@ -3474,6 +3495,7 @@ u8 AtkCanceller_UnableToUseMove(void)
|
||||
case CANCELLER_FLAGS: // flags clear
|
||||
gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_DESTINY_BOND;
|
||||
gStatuses3[gBattlerAttacker] &= ~STATUS3_GRUDGE;
|
||||
gBattleScripting.tripleKickPower = 0;
|
||||
gBattleStruct->atkCancellerTracker++;
|
||||
break;
|
||||
case CANCELLER_SKY_DROP:
|
||||
@ -3831,6 +3853,67 @@ u8 AtkCanceller_UnableToUseMove(void)
|
||||
}
|
||||
gBattleStruct->atkCancellerTracker++;
|
||||
break;
|
||||
case CANCELLER_MULTIHIT_MOVES:
|
||||
if (gBattleMoves[gCurrentMove].effect == EFFECT_MULTI_HIT)
|
||||
{
|
||||
u16 ability = gBattleMons[gBattlerAttacker].ability;
|
||||
|
||||
if (ability == ABILITY_SKILL_LINK)
|
||||
{
|
||||
gMultiHitCounter = 5;
|
||||
}
|
||||
else if (ability == ABILITY_BATTLE_BOND
|
||||
&& gCurrentMove == MOVE_WATER_SHURIKEN
|
||||
&& gBattleMons[gBattlerAttacker].species == SPECIES_GRENINJA_ASH)
|
||||
{
|
||||
gMultiHitCounter = 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
SetRandomMultiHitCounter();
|
||||
}
|
||||
PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0)
|
||||
}
|
||||
else if (gBattleMoves[gCurrentMove].flags & FLAG_TWO_STRIKES)
|
||||
{
|
||||
gMultiHitCounter = 2;
|
||||
PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0)
|
||||
if (gCurrentMove == MOVE_DRAGON_DARTS)
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
}
|
||||
else if (gBattleMoves[gCurrentMove].effect == EFFECT_TRIPLE_KICK || gCurrentMove == MOVE_SURGING_STRIKES)
|
||||
{
|
||||
gMultiHitCounter = 3;
|
||||
PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0)
|
||||
}
|
||||
#if B_BEAT_UP >= GEN_5
|
||||
else if (gBattleMoves[gCurrentMove].effect == EFFECT_BEAT_UP)
|
||||
{
|
||||
struct Pokemon* party;
|
||||
int i;
|
||||
|
||||
if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)
|
||||
party = gPlayerParty;
|
||||
else
|
||||
party = gEnemyParty;
|
||||
|
||||
for (i = 0; i < PARTY_SIZE; i++)
|
||||
{
|
||||
if (GetMonData(&party[i], MON_DATA_HP)
|
||||
&& GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE
|
||||
&& !GetMonData(&party[i], MON_DATA_IS_EGG)
|
||||
&& !GetMonData(&party[i], MON_DATA_STATUS))
|
||||
gMultiHitCounter++;
|
||||
}
|
||||
|
||||
gBattleCommunication[0] = 0; // For later
|
||||
PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0)
|
||||
}
|
||||
#endif
|
||||
gBattleStruct->atkCancellerTracker++;
|
||||
break;
|
||||
case CANCELLER_END:
|
||||
break;
|
||||
}
|
||||
@ -4921,14 +5004,8 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
||||
gDisableStructs[gBattlerAttacker].truantCounter ^= 1;
|
||||
break;
|
||||
case ABILITY_BAD_DREAMS:
|
||||
if (gBattleMons[battler].status1 & STATUS1_SLEEP
|
||||
|| gBattleMons[BATTLE_OPPOSITE(battler)].status1 & STATUS1_SLEEP
|
||||
|| GetBattlerAbility(battler) == ABILITY_COMATOSE
|
||||
|| GetBattlerAbility(BATTLE_OPPOSITE(battler)) == ABILITY_COMATOSE)
|
||||
{
|
||||
BattleScriptPushCursorAndCallback(BattleScript_BadDreamsActivates);
|
||||
effect++;
|
||||
}
|
||||
BattleScriptPushCursorAndCallback(BattleScript_BadDreamsActivates);
|
||||
effect++;
|
||||
break;
|
||||
SOLAR_POWER_HP_DROP:
|
||||
case ABILITY_SOLAR_POWER:
|
||||
@ -5159,9 +5236,10 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
||||
&& moveType == TYPE_DARK
|
||||
&& CompareStat(battler, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN))
|
||||
{
|
||||
gEffectBattler = battler;
|
||||
SET_STATCHANGER(STAT_ATK, 1, FALSE);
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaiseOnMoveEnd;
|
||||
gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaiseRet;
|
||||
effect++;
|
||||
}
|
||||
break;
|
||||
@ -5172,9 +5250,10 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
||||
&& (moveType == TYPE_DARK || moveType == TYPE_BUG || moveType == TYPE_GHOST)
|
||||
&& CompareStat(battler, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN))
|
||||
{
|
||||
gEffectBattler = battler;
|
||||
SET_STATCHANGER(STAT_SPEED, 1, FALSE);
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaiseOnMoveEnd;
|
||||
gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaiseRet;
|
||||
effect++;
|
||||
}
|
||||
break;
|
||||
@ -5185,9 +5264,10 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
||||
&& moveType == TYPE_WATER
|
||||
&& CompareStat(battler, STAT_DEF, MAX_STAT_STAGE, CMP_LESS_THAN))
|
||||
{
|
||||
gEffectBattler = battler;
|
||||
SET_STATCHANGER(STAT_DEF, 2, FALSE);
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaiseOnMoveEnd;
|
||||
gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaiseRet;
|
||||
effect++;
|
||||
}
|
||||
break;
|
||||
@ -5197,9 +5277,10 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
||||
&& IsBattlerAlive(battler)
|
||||
&& CompareStat(battler, STAT_DEF, MAX_STAT_STAGE, CMP_LESS_THAN))
|
||||
{
|
||||
gEffectBattler = battler;
|
||||
SET_STATCHANGER(STAT_DEF, 1, FALSE);
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaiseOnMoveEnd;
|
||||
gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaiseRet;
|
||||
effect++;
|
||||
}
|
||||
break;
|
||||
@ -5214,9 +5295,10 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
||||
&& !(TestSheerForceFlag(gBattlerAttacker, gCurrentMove))
|
||||
&& CompareStat(battler, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN))
|
||||
{
|
||||
gEffectBattler = battler;
|
||||
SET_STATCHANGER(STAT_SPATK, 1, FALSE);
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaiseOnMoveEnd;
|
||||
gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaiseRet;
|
||||
effect++;
|
||||
}
|
||||
break;
|
||||
@ -5554,9 +5636,10 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
||||
&& CompareStat(battler, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN)
|
||||
&& (moveType == TYPE_FIRE || moveType == TYPE_WATER))
|
||||
{
|
||||
gEffectBattler = battler;
|
||||
SET_STATCHANGER(STAT_SPEED, 6, FALSE);
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaiseOnMoveEnd;
|
||||
gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaiseRet;
|
||||
effect++;
|
||||
}
|
||||
break;
|
||||
@ -6309,7 +6392,7 @@ static u8 HealConfuseBerry(u32 battlerId, u32 itemId, u8 flavorId, bool32 end2)
|
||||
{
|
||||
PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, flavorId);
|
||||
|
||||
gBattleMoveDamage = gBattleMons[battlerId].maxHP / GetBattlerHoldEffectParam(battlerId);
|
||||
gBattleMoveDamage = gBattleMons[battlerId].maxHP / GetBattlerItemHoldEffectParam(battlerId, itemId);
|
||||
if (gBattleMoveDamage == 0)
|
||||
gBattleMoveDamage = 1;
|
||||
gBattleMoveDamage *= -1;
|
||||
@ -6345,7 +6428,7 @@ static u8 HealConfuseBerry(u32 battlerId, u32 itemId, u8 flavorId, bool32 end2)
|
||||
|
||||
static u8 StatRaiseBerry(u32 battlerId, u32 itemId, u32 statId, bool32 end2)
|
||||
{
|
||||
if (CompareStat(battlerId, statId, MAX_STAT_STAGE, CMP_LESS_THAN) && HasEnoughHpToEatBerry(battlerId, GetBattlerHoldEffectParam(battlerId), itemId))
|
||||
if (CompareStat(battlerId, statId, MAX_STAT_STAGE, CMP_LESS_THAN) && HasEnoughHpToEatBerry(battlerId, GetBattlerItemHoldEffectParam(battlerId, itemId), itemId))
|
||||
{
|
||||
BufferStatChange(battlerId, statId, STRINGID_STATROSE);
|
||||
gEffectBattler = battlerId;
|
||||
@ -6381,7 +6464,7 @@ static u8 RandomStatRaiseBerry(u32 battlerId, u32 itemId, bool32 end2)
|
||||
if (CompareStat(battlerId, STAT_ATK + i, MAX_STAT_STAGE, CMP_LESS_THAN))
|
||||
break;
|
||||
}
|
||||
if (i != NUM_STATS - 1 && HasEnoughHpToEatBerry(battlerId, GetBattlerHoldEffectParam(battlerId), itemId))
|
||||
if (i != NUM_STATS - 1 && HasEnoughHpToEatBerry(battlerId, GetBattlerItemHoldEffectParam(battlerId, itemId), itemId))
|
||||
{
|
||||
u16 battlerAbility = GetBattlerAbility(battlerId);
|
||||
do
|
||||
@ -6500,9 +6583,9 @@ static u8 ItemHealHp(u32 battlerId, u32 itemId, bool32 end2, bool32 percentHeal)
|
||||
&& HasEnoughHpToEatBerry(battlerId, 2, itemId))
|
||||
{
|
||||
if (percentHeal)
|
||||
gBattleMoveDamage = (gBattleMons[battlerId].maxHP * GetBattlerHoldEffectParam(battlerId) / 100) * -1;
|
||||
gBattleMoveDamage = (gBattleMons[battlerId].maxHP * GetBattlerItemHoldEffectParam(battlerId, itemId) / 100) * -1;
|
||||
else
|
||||
gBattleMoveDamage = GetBattlerHoldEffectParam(battlerId) * -1;
|
||||
gBattleMoveDamage = GetBattlerItemHoldEffectParam(battlerId, itemId) * -1;
|
||||
|
||||
// check ripen
|
||||
if (ItemId_GetPocket(itemId) == POCKET_BERRIES && GetBattlerAbility(battlerId) == ABILITY_RIPEN)
|
||||
@ -6585,6 +6668,192 @@ static bool32 GetMentalHerbEffect(u8 battlerId)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static u8 ItemEffectMoveEnd(u32 battlerId, u16 holdEffect)
|
||||
{
|
||||
u8 effect = 0;
|
||||
u32 i;
|
||||
|
||||
switch (holdEffect)
|
||||
{
|
||||
#if B_HP_BERRIES >= GEN_4
|
||||
case HOLD_EFFECT_MICLE_BERRY:
|
||||
effect = TrySetMicleBerry(battlerId, gLastUsedItem, FALSE);
|
||||
break;
|
||||
case HOLD_EFFECT_RESTORE_HP:
|
||||
effect = ItemHealHp(battlerId, gLastUsedItem, FALSE, FALSE);
|
||||
break;
|
||||
#endif
|
||||
#if B_BERRIES_INSTANT >= GEN_4
|
||||
case HOLD_EFFECT_RESTORE_PCT_HP:
|
||||
effect = ItemHealHp(battlerId, gLastUsedItem, FALSE, TRUE);
|
||||
break;
|
||||
case HOLD_EFFECT_CONFUSE_SPICY:
|
||||
effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_SPICY, FALSE);
|
||||
break;
|
||||
case HOLD_EFFECT_CONFUSE_DRY:
|
||||
effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_DRY, FALSE);
|
||||
break;
|
||||
case HOLD_EFFECT_CONFUSE_SWEET:
|
||||
effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_SWEET, FALSE);
|
||||
break;
|
||||
case HOLD_EFFECT_CONFUSE_BITTER:
|
||||
effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_BITTER, FALSE);
|
||||
break;
|
||||
case HOLD_EFFECT_CONFUSE_SOUR:
|
||||
effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_SOUR, FALSE);
|
||||
break;
|
||||
case HOLD_EFFECT_ATTACK_UP:
|
||||
effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_ATK, FALSE);
|
||||
break;
|
||||
case HOLD_EFFECT_DEFENSE_UP:
|
||||
effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_DEF, FALSE);
|
||||
break;
|
||||
case HOLD_EFFECT_SPEED_UP:
|
||||
effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_SPEED, FALSE);
|
||||
break;
|
||||
case HOLD_EFFECT_SP_ATTACK_UP:
|
||||
effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_SPATK, FALSE);
|
||||
break;
|
||||
case HOLD_EFFECT_SP_DEFENSE_UP:
|
||||
effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_SPDEF, FALSE);
|
||||
break;
|
||||
case HOLD_EFFECT_RANDOM_STAT_UP:
|
||||
effect = RandomStatRaiseBerry(battlerId, gLastUsedItem, FALSE);
|
||||
break;
|
||||
#endif
|
||||
case HOLD_EFFECT_CURE_PAR:
|
||||
if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS && !UnnerveOn(battlerId, gLastUsedItem))
|
||||
{
|
||||
gBattleMons[battlerId].status1 &= ~STATUS1_PARALYSIS;
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_BerryCureParRet;
|
||||
effect = ITEM_STATUS_CHANGE;
|
||||
}
|
||||
break;
|
||||
case HOLD_EFFECT_CURE_PSN:
|
||||
if (gBattleMons[battlerId].status1 & STATUS1_PSN_ANY && !UnnerveOn(battlerId, gLastUsedItem))
|
||||
{
|
||||
gBattleMons[battlerId].status1 &= ~(STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER);
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_BerryCurePsnRet;
|
||||
effect = ITEM_STATUS_CHANGE;
|
||||
}
|
||||
break;
|
||||
case HOLD_EFFECT_CURE_BRN:
|
||||
if (gBattleMons[battlerId].status1 & STATUS1_BURN && !UnnerveOn(battlerId, gLastUsedItem))
|
||||
{
|
||||
gBattleMons[battlerId].status1 &= ~STATUS1_BURN;
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_BerryCureBrnRet;
|
||||
effect = ITEM_STATUS_CHANGE;
|
||||
}
|
||||
break;
|
||||
case HOLD_EFFECT_CURE_FRZ:
|
||||
if (gBattleMons[battlerId].status1 & STATUS1_FREEZE && !UnnerveOn(battlerId, gLastUsedItem))
|
||||
{
|
||||
gBattleMons[battlerId].status1 &= ~STATUS1_FREEZE;
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_BerryCureFrzRet;
|
||||
effect = ITEM_STATUS_CHANGE;
|
||||
}
|
||||
break;
|
||||
case HOLD_EFFECT_CURE_SLP:
|
||||
if (gBattleMons[battlerId].status1 & STATUS1_SLEEP && !UnnerveOn(battlerId, gLastUsedItem))
|
||||
{
|
||||
gBattleMons[battlerId].status1 &= ~STATUS1_SLEEP;
|
||||
gBattleMons[battlerId].status2 &= ~STATUS2_NIGHTMARE;
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_BerryCureSlpRet;
|
||||
effect = ITEM_STATUS_CHANGE;
|
||||
}
|
||||
break;
|
||||
case HOLD_EFFECT_CURE_CONFUSION:
|
||||
if (gBattleMons[battlerId].status2 & STATUS2_CONFUSION && !UnnerveOn(battlerId, gLastUsedItem))
|
||||
{
|
||||
gBattleMons[battlerId].status2 &= ~STATUS2_CONFUSION;
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_BerryCureConfusionRet;
|
||||
effect = ITEM_EFFECT_OTHER;
|
||||
}
|
||||
break;
|
||||
case HOLD_EFFECT_MENTAL_HERB:
|
||||
if (GetMentalHerbEffect(battlerId))
|
||||
{
|
||||
gBattleScripting.savedBattler = gBattlerAttacker;
|
||||
gBattlerAttacker = battlerId;
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_MentalHerbCureRet;
|
||||
effect = ITEM_EFFECT_OTHER;
|
||||
}
|
||||
break;
|
||||
case HOLD_EFFECT_CURE_STATUS:
|
||||
if ((gBattleMons[battlerId].status1 & STATUS1_ANY || gBattleMons[battlerId].status2 & STATUS2_CONFUSION) && !UnnerveOn(battlerId, gLastUsedItem))
|
||||
{
|
||||
if (gBattleMons[battlerId].status1 & STATUS1_PSN_ANY)
|
||||
StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn);
|
||||
|
||||
if (gBattleMons[battlerId].status1 & STATUS1_SLEEP)
|
||||
{
|
||||
gBattleMons[battlerId].status2 &= ~STATUS2_NIGHTMARE;
|
||||
StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn);
|
||||
}
|
||||
|
||||
if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS)
|
||||
StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn);
|
||||
|
||||
if (gBattleMons[battlerId].status1 & STATUS1_BURN)
|
||||
StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn);
|
||||
|
||||
if (gBattleMons[battlerId].status1 & STATUS1_FREEZE)
|
||||
StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn);
|
||||
|
||||
if (gBattleMons[battlerId].status2 & STATUS2_CONFUSION)
|
||||
StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn);
|
||||
|
||||
gBattleMons[battlerId].status1 = 0;
|
||||
gBattleMons[battlerId].status2 &= ~STATUS2_CONFUSION;
|
||||
BattleScriptPushCursor();
|
||||
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM;
|
||||
gBattlescriptCurrInstr = BattleScript_BerryCureChosenStatusRet;
|
||||
effect = ITEM_STATUS_CHANGE;
|
||||
}
|
||||
break;
|
||||
case HOLD_EFFECT_RESTORE_STATS:
|
||||
for (i = 0; i < NUM_BATTLE_STATS; i++)
|
||||
{
|
||||
if (gBattleMons[battlerId].statStages[i] < DEFAULT_STAT_STAGE)
|
||||
{
|
||||
gBattleMons[battlerId].statStages[i] = DEFAULT_STAT_STAGE;
|
||||
effect = ITEM_STATS_CHANGE;
|
||||
}
|
||||
}
|
||||
if (effect != 0)
|
||||
{
|
||||
gBattleScripting.battler = battlerId;
|
||||
gPotentialItemEffectBattler = battlerId;
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_WhiteHerbRet;
|
||||
return effect;
|
||||
}
|
||||
break;
|
||||
case HOLD_EFFECT_CRITICAL_UP: // lansat berry
|
||||
if (B_BERRIES_INSTANT >= GEN_4
|
||||
&& !(gBattleMons[battlerId].status2 & STATUS2_FOCUS_ENERGY)
|
||||
&& HasEnoughHpToEatBerry(battlerId, GetBattlerItemHoldEffectParam(battlerId, gLastUsedItem), gLastUsedItem))
|
||||
{
|
||||
gBattleMons[battlerId].status2 |= STATUS2_FOCUS_ENERGY;
|
||||
gBattleScripting.battler = battlerId;
|
||||
gPotentialItemEffectBattler = battlerId;
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_BerryFocusEnergyRet;
|
||||
effect = ITEM_EFFECT_OTHER;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return effect;
|
||||
}
|
||||
|
||||
u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
|
||||
{
|
||||
int i = 0, moveType;
|
||||
@ -6594,8 +6863,10 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
|
||||
u8 atkHoldEffectParam;
|
||||
u16 atkItem;
|
||||
|
||||
gLastUsedItem = gBattleMons[battlerId].item;
|
||||
battlerHoldEffect = GetBattlerHoldEffect(battlerId, TRUE);
|
||||
if (caseID != ITEMEFFECT_USE_LAST_ITEM) {
|
||||
gLastUsedItem = gBattleMons[battlerId].item;
|
||||
battlerHoldEffect = GetBattlerHoldEffect(battlerId, TRUE);
|
||||
}
|
||||
|
||||
atkItem = gBattleMons[gBattlerAttacker].item;
|
||||
atkHoldEffect = GetBattlerHoldEffect(gBattlerAttacker, TRUE);
|
||||
@ -6664,9 +6935,10 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
|
||||
effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_SPDEF, TRUE);
|
||||
break;
|
||||
case HOLD_EFFECT_CRITICAL_UP:
|
||||
if (!(gBattleMons[battlerId].status2 & STATUS2_FOCUS_ENERGY) && HasEnoughHpToEatBerry(battlerId, GetBattlerHoldEffectParam(battlerId), gLastUsedItem))
|
||||
if (!(gBattleMons[battlerId].status2 & STATUS2_FOCUS_ENERGY) && HasEnoughHpToEatBerry(battlerId, GetBattlerItemHoldEffectParam(battlerId, gLastUsedItem), gLastUsedItem))
|
||||
{
|
||||
gBattleMons[battlerId].status2 |= STATUS2_FOCUS_ENERGY;
|
||||
gBattleScripting.battler = battlerId;
|
||||
BattleScriptExecute(BattleScript_BerryFocusEnergyEnd2);
|
||||
effect = ITEM_EFFECT_OTHER;
|
||||
}
|
||||
@ -6980,9 +7252,10 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
|
||||
break;
|
||||
case HOLD_EFFECT_CRITICAL_UP:
|
||||
if (!moveTurn && !(gBattleMons[battlerId].status2 & STATUS2_FOCUS_ENERGY)
|
||||
&& HasEnoughHpToEatBerry(battlerId, GetBattlerHoldEffectParam(battlerId), gLastUsedItem))
|
||||
&& HasEnoughHpToEatBerry(battlerId, GetBattlerItemHoldEffectParam(battlerId, gLastUsedItem), gLastUsedItem))
|
||||
{
|
||||
gBattleMons[battlerId].status2 |= STATUS2_FOCUS_ENERGY;
|
||||
gBattleScripting.battler = battlerId;
|
||||
BattleScriptExecute(BattleScript_BerryFocusEnergyEnd2);
|
||||
effect = ITEM_EFFECT_OTHER;
|
||||
}
|
||||
@ -7117,179 +7390,25 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ITEMEFFECT_BATTLER_MOVE_END:
|
||||
goto DO_ITEMEFFECT_MOVE_END; // this hurts a bit to do, but is an easy solution
|
||||
case ITEMEFFECT_USE_LAST_ITEM:
|
||||
effect = ItemEffectMoveEnd(battlerId, ItemId_GetHoldEffect(gLastUsedItem));
|
||||
gBattleScripting.overrideBerryRequirements = 2; // to exit VARIOUS_CONSUME_BERRIES
|
||||
if (effect)
|
||||
{
|
||||
gActiveBattler = gPotentialItemEffectBattler = gBattleScripting.battler = battlerId;
|
||||
if (effect == ITEM_STATUS_CHANGE)
|
||||
{
|
||||
BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1);
|
||||
MarkBattlerForControllerExec(gActiveBattler);
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case ITEMEFFECT_MOVE_END:
|
||||
for (battlerId = 0; battlerId < gBattlersCount; battlerId++)
|
||||
{
|
||||
gLastUsedItem = gBattleMons[battlerId].item;
|
||||
battlerHoldEffect = GetBattlerHoldEffect(battlerId, TRUE);
|
||||
DO_ITEMEFFECT_MOVE_END:
|
||||
switch (battlerHoldEffect)
|
||||
{
|
||||
#if B_HP_BERRIES >= GEN_4
|
||||
case HOLD_EFFECT_MICLE_BERRY:
|
||||
effect = TrySetMicleBerry(battlerId, gLastUsedItem, FALSE);
|
||||
break;
|
||||
case HOLD_EFFECT_RESTORE_HP:
|
||||
effect = ItemHealHp(battlerId, gLastUsedItem, FALSE, FALSE);
|
||||
break;
|
||||
#endif
|
||||
#if B_BERRIES_INSTANT >= GEN_4
|
||||
case HOLD_EFFECT_RESTORE_PCT_HP:
|
||||
effect = ItemHealHp(battlerId, gLastUsedItem, FALSE, TRUE);
|
||||
break;
|
||||
case HOLD_EFFECT_CONFUSE_SPICY:
|
||||
effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_SPICY, FALSE);
|
||||
break;
|
||||
case HOLD_EFFECT_CONFUSE_DRY:
|
||||
effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_DRY, FALSE);
|
||||
break;
|
||||
case HOLD_EFFECT_CONFUSE_SWEET:
|
||||
effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_SWEET, FALSE);
|
||||
break;
|
||||
case HOLD_EFFECT_CONFUSE_BITTER:
|
||||
effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_BITTER, FALSE);
|
||||
break;
|
||||
case HOLD_EFFECT_CONFUSE_SOUR:
|
||||
effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_SOUR, FALSE);
|
||||
break;
|
||||
case HOLD_EFFECT_ATTACK_UP:
|
||||
effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_ATK, FALSE);
|
||||
break;
|
||||
case HOLD_EFFECT_DEFENSE_UP:
|
||||
effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_DEF, FALSE);
|
||||
break;
|
||||
case HOLD_EFFECT_SPEED_UP:
|
||||
effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_SPEED, FALSE);
|
||||
break;
|
||||
case HOLD_EFFECT_SP_ATTACK_UP:
|
||||
effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_SPATK, FALSE);
|
||||
break;
|
||||
case HOLD_EFFECT_SP_DEFENSE_UP:
|
||||
effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_SPDEF, FALSE);
|
||||
break;
|
||||
case HOLD_EFFECT_RANDOM_STAT_UP:
|
||||
effect = RandomStatRaiseBerry(battlerId, gLastUsedItem, FALSE);
|
||||
break;
|
||||
#endif
|
||||
case HOLD_EFFECT_CURE_PAR:
|
||||
if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS && !UnnerveOn(battlerId, gLastUsedItem))
|
||||
{
|
||||
gBattleMons[battlerId].status1 &= ~STATUS1_PARALYSIS;
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_BerryCureParRet;
|
||||
effect = ITEM_STATUS_CHANGE;
|
||||
}
|
||||
break;
|
||||
case HOLD_EFFECT_CURE_PSN:
|
||||
if (gBattleMons[battlerId].status1 & STATUS1_PSN_ANY && !UnnerveOn(battlerId, gLastUsedItem))
|
||||
{
|
||||
gBattleMons[battlerId].status1 &= ~(STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER);
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_BerryCurePsnRet;
|
||||
effect = ITEM_STATUS_CHANGE;
|
||||
}
|
||||
break;
|
||||
case HOLD_EFFECT_CURE_BRN:
|
||||
if (gBattleMons[battlerId].status1 & STATUS1_BURN && !UnnerveOn(battlerId, gLastUsedItem))
|
||||
{
|
||||
gBattleMons[battlerId].status1 &= ~STATUS1_BURN;
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_BerryCureBrnRet;
|
||||
effect = ITEM_STATUS_CHANGE;
|
||||
}
|
||||
break;
|
||||
case HOLD_EFFECT_CURE_FRZ:
|
||||
if (gBattleMons[battlerId].status1 & STATUS1_FREEZE && !UnnerveOn(battlerId, gLastUsedItem))
|
||||
{
|
||||
gBattleMons[battlerId].status1 &= ~STATUS1_FREEZE;
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_BerryCureFrzRet;
|
||||
effect = ITEM_STATUS_CHANGE;
|
||||
}
|
||||
break;
|
||||
case HOLD_EFFECT_CURE_SLP:
|
||||
if (gBattleMons[battlerId].status1 & STATUS1_SLEEP && !UnnerveOn(battlerId, gLastUsedItem))
|
||||
{
|
||||
gBattleMons[battlerId].status1 &= ~STATUS1_SLEEP;
|
||||
gBattleMons[battlerId].status2 &= ~STATUS2_NIGHTMARE;
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_BerryCureSlpRet;
|
||||
effect = ITEM_STATUS_CHANGE;
|
||||
}
|
||||
break;
|
||||
case HOLD_EFFECT_CURE_CONFUSION:
|
||||
if (gBattleMons[battlerId].status2 & STATUS2_CONFUSION && !UnnerveOn(battlerId, gLastUsedItem))
|
||||
{
|
||||
gBattleMons[battlerId].status2 &= ~STATUS2_CONFUSION;
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_BerryCureConfusionRet;
|
||||
effect = ITEM_EFFECT_OTHER;
|
||||
}
|
||||
break;
|
||||
case HOLD_EFFECT_MENTAL_HERB:
|
||||
if (GetMentalHerbEffect(battlerId))
|
||||
{
|
||||
gBattleScripting.savedBattler = gBattlerAttacker;
|
||||
gBattlerAttacker = battlerId;
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_MentalHerbCureRet;
|
||||
effect = ITEM_EFFECT_OTHER;
|
||||
}
|
||||
break;
|
||||
case HOLD_EFFECT_CURE_STATUS:
|
||||
if ((gBattleMons[battlerId].status1 & STATUS1_ANY || gBattleMons[battlerId].status2 & STATUS2_CONFUSION) && !UnnerveOn(battlerId, gLastUsedItem))
|
||||
{
|
||||
if (gBattleMons[battlerId].status1 & STATUS1_PSN_ANY)
|
||||
StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn);
|
||||
|
||||
if (gBattleMons[battlerId].status1 & STATUS1_SLEEP)
|
||||
{
|
||||
gBattleMons[battlerId].status2 &= ~STATUS2_NIGHTMARE;
|
||||
StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn);
|
||||
}
|
||||
|
||||
if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS)
|
||||
StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn);
|
||||
|
||||
if (gBattleMons[battlerId].status1 & STATUS1_BURN)
|
||||
StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn);
|
||||
|
||||
if (gBattleMons[battlerId].status1 & STATUS1_FREEZE)
|
||||
StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn);
|
||||
|
||||
if (gBattleMons[battlerId].status2 & STATUS2_CONFUSION)
|
||||
StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn);
|
||||
|
||||
gBattleMons[battlerId].status1 = 0;
|
||||
gBattleMons[battlerId].status2 &= ~STATUS2_CONFUSION;
|
||||
BattleScriptPushCursor();
|
||||
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM;
|
||||
gBattlescriptCurrInstr = BattleScript_BerryCureChosenStatusRet;
|
||||
effect = ITEM_STATUS_CHANGE;
|
||||
}
|
||||
break;
|
||||
case HOLD_EFFECT_RESTORE_STATS:
|
||||
for (i = 0; i < NUM_BATTLE_STATS; i++)
|
||||
{
|
||||
if (gBattleMons[battlerId].statStages[i] < DEFAULT_STAT_STAGE)
|
||||
{
|
||||
gBattleMons[battlerId].statStages[i] = DEFAULT_STAT_STAGE;
|
||||
effect = ITEM_STATS_CHANGE;
|
||||
}
|
||||
}
|
||||
if (effect != 0)
|
||||
{
|
||||
gBattleScripting.battler = battlerId;
|
||||
gPotentialItemEffectBattler = battlerId;
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_WhiteHerbRet;
|
||||
return effect;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (effect != 0)
|
||||
effect = ItemEffectMoveEnd(battlerId, GetBattlerHoldEffect(battlerId, TRUE));
|
||||
if (effect)
|
||||
{
|
||||
gActiveBattler = gPotentialItemEffectBattler = gBattleScripting.battler = battlerId;
|
||||
if (effect == ITEM_STATUS_CHANGE)
|
||||
@ -7866,6 +7985,15 @@ u32 GetBattlerHoldEffect(u8 battlerId, bool32 checkNegating)
|
||||
return ItemId_GetHoldEffect(gBattleMons[battlerId].item);
|
||||
}
|
||||
|
||||
//
|
||||
static u32 GetBattlerItemHoldEffectParam(u8 battlerId, u16 item)
|
||||
{
|
||||
if (item == ITEM_ENIGMA_BERRY)
|
||||
return gEnigmaBerries[battlerId].holdEffectParam;
|
||||
else
|
||||
return ItemId_GetHoldEffectParam(item);
|
||||
}
|
||||
|
||||
u32 GetBattlerHoldEffectParam(u8 battlerId)
|
||||
{
|
||||
if (gBattleMons[battlerId].item == ITEM_ENIGMA_BERRY)
|
||||
@ -8404,6 +8532,11 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef)
|
||||
if (IsBattlerTerrainAffected(gBattlerTarget, STATUS_FIELD_ELECTRIC_TERRAIN))
|
||||
basePower *= 2;
|
||||
break;
|
||||
case EFFECT_BEAT_UP:
|
||||
#if B_BEAT_UP >= GEN_5
|
||||
basePower = CalcBeatUpPower();
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
|
||||
// Move-specific base power changes
|
||||
@ -9178,6 +9311,15 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move
|
||||
MulModifier(&finalModifier, UQ_4_12(0.5));
|
||||
}
|
||||
|
||||
// Parental Bond Second Strike
|
||||
if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_2ND_HIT)
|
||||
{
|
||||
if (B_PARENTAL_BOND_DMG < GEN_7)
|
||||
MulModifier(&finalModifier, UQ_4_12(0.5));
|
||||
else
|
||||
MulModifier(&finalModifier, UQ_4_12(0.25));
|
||||
}
|
||||
|
||||
// attacker's abilities
|
||||
switch (abilityAtk)
|
||||
{
|
||||
@ -10396,3 +10538,31 @@ bool32 CanTargetBattler(u8 battlerAtk, u8 battlerDef, u16 move)
|
||||
return FALSE; // Pokémon affected by Heal Block cannot target allies with Pollen Puff
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void SetRandomMultiHitCounter()
|
||||
{
|
||||
#if (B_MULTI_HIT_CHANCE >= GEN_5)
|
||||
// Based on Gen 5's odds
|
||||
// 35% for 2 hits
|
||||
// 35% for 3 hits
|
||||
// 15% for 4 hits
|
||||
// 15% for 5 hits
|
||||
gMultiHitCounter = Random() % 100;
|
||||
if (gMultiHitCounter < 35)
|
||||
gMultiHitCounter = 2;
|
||||
else if (gMultiHitCounter < 35 + 35)
|
||||
gMultiHitCounter = 3;
|
||||
else if (gMultiHitCounter < 35 + 35 + 15)
|
||||
gMultiHitCounter = 4;
|
||||
else
|
||||
gMultiHitCounter = 5;
|
||||
#else
|
||||
// 2 and 3 hits: 37.5%
|
||||
// 4 and 5 hits: 12.5%
|
||||
gMultiHitCounter = Random() % 4;
|
||||
if (gMultiHitCounter > 1)
|
||||
gMultiHitCounter = (Random() % 4) + 2;
|
||||
else
|
||||
gMultiHitCounter += 2;
|
||||
#endif
|
||||
}
|
||||
|
@ -417,7 +417,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
|
||||
[MOVE_DOUBLE_KICK] =
|
||||
{
|
||||
.effect = EFFECT_DOUBLE_HIT,
|
||||
.effect = EFFECT_HIT,
|
||||
.power = 30,
|
||||
.type = TYPE_FIGHTING,
|
||||
.accuracy = 100,
|
||||
@ -725,7 +725,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
|
||||
[MOVE_TWINEEDLE] =
|
||||
{
|
||||
.effect = EFFECT_TWINEEDLE,
|
||||
.effect = EFFECT_POISON_HIT,
|
||||
.power = 25,
|
||||
.type = TYPE_BUG,
|
||||
.accuracy = 100,
|
||||
@ -2782,7 +2782,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
|
||||
[MOVE_BONEMERANG] =
|
||||
{
|
||||
.effect = EFFECT_DOUBLE_HIT,
|
||||
.effect = EFFECT_HIT,
|
||||
.power = 50,
|
||||
.type = TYPE_GROUND,
|
||||
.accuracy = 90,
|
||||
@ -8224,7 +8224,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
|
||||
[MOVE_DOUBLE_HIT] =
|
||||
{
|
||||
.effect = EFFECT_DOUBLE_HIT,
|
||||
.effect = EFFECT_HIT,
|
||||
.power = 35,
|
||||
.type = TYPE_NORMAL,
|
||||
.accuracy = 90,
|
||||
@ -8339,7 +8339,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
#else
|
||||
.accuracy = 80,
|
||||
#endif
|
||||
.effect = EFFECT_SLEEP,
|
||||
.effect = EFFECT_DARK_VOID,
|
||||
.power = 0,
|
||||
.type = TYPE_DARK,
|
||||
.pp = 10,
|
||||
@ -9477,7 +9477,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
|
||||
[MOVE_DUAL_CHOP] =
|
||||
{
|
||||
.effect = EFFECT_DOUBLE_HIT,
|
||||
.effect = EFFECT_HIT,
|
||||
.power = 40,
|
||||
.type = TYPE_DRAGON,
|
||||
.accuracy = 90,
|
||||
@ -9714,7 +9714,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
|
||||
[MOVE_GEAR_GRIND] =
|
||||
{
|
||||
.effect = EFFECT_DOUBLE_HIT,
|
||||
.effect = EFFECT_HIT,
|
||||
.power = 50,
|
||||
.type = TYPE_STEEL,
|
||||
.accuracy = 85,
|
||||
@ -11387,7 +11387,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
.type = TYPE_FIRE,
|
||||
.accuracy = 100,
|
||||
.pp = 5,
|
||||
.secondaryEffectChance = 0,
|
||||
.secondaryEffectChance = 100,
|
||||
.target = MOVE_TARGET_SELECTED,
|
||||
.priority = 0,
|
||||
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_THAW_USER,
|
||||
@ -12181,7 +12181,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
#else
|
||||
.flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_DMG_MINIMIZE | FLAG_IRON_FIST_BOOST | FLAG_SHEER_FORCE_BOOST | FLAG_TWO_STRIKES,
|
||||
#endif
|
||||
.effect = EFFECT_DOUBLE_IRON_BASH,
|
||||
.effect = EFFECT_FLINCH_HIT,
|
||||
.power = 60,
|
||||
.type = TYPE_STEEL,
|
||||
.accuracy = 100,
|
||||
@ -13029,7 +13029,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
|
||||
[MOVE_DUAL_WINGBEAT] =
|
||||
{
|
||||
.effect = EFFECT_DOUBLE_HIT,
|
||||
.effect = EFFECT_HIT,
|
||||
.power = 40,
|
||||
.type = TYPE_FLYING,
|
||||
.accuracy = 90,
|
||||
@ -13092,7 +13092,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
|
||||
[MOVE_SURGING_STRIKES] =
|
||||
{
|
||||
.effect = EFFECT_TRIPLE_HIT,
|
||||
.effect = EFFECT_ALWAYS_CRIT,
|
||||
.power = 25,
|
||||
.type = TYPE_WATER,
|
||||
.accuracy = 100,
|
||||
|
@ -1565,7 +1565,7 @@ const struct Item gItems[] =
|
||||
.description = sLureDesc,
|
||||
.pocket = POCKET_ITEMS,
|
||||
.type = ITEM_USE_BAG_MENU,
|
||||
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
|
||||
.fieldUseFunc = ItemUseOutOfBattle_Lure,
|
||||
.secondaryId = 0,
|
||||
.flingPower = 30,
|
||||
},
|
||||
@ -1579,7 +1579,7 @@ const struct Item gItems[] =
|
||||
.description = sSuperLureDesc,
|
||||
.pocket = POCKET_ITEMS,
|
||||
.type = ITEM_USE_BAG_MENU,
|
||||
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
|
||||
.fieldUseFunc = ItemUseOutOfBattle_Lure,
|
||||
.secondaryId = 0,
|
||||
.flingPower = 30,
|
||||
},
|
||||
@ -1593,7 +1593,7 @@ const struct Item gItems[] =
|
||||
.description = sMaxLureDesc,
|
||||
.pocket = POCKET_ITEMS,
|
||||
.type = ITEM_USE_BAG_MENU,
|
||||
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
|
||||
.fieldUseFunc = ItemUseOutOfBattle_Lure,
|
||||
.secondaryId = 0,
|
||||
.flingPower = 30,
|
||||
},
|
||||
@ -2035,8 +2035,8 @@ const struct Item gItems[] =
|
||||
.price = 300,
|
||||
.description = sHoneyDesc,
|
||||
.pocket = POCKET_ITEMS,
|
||||
.type = ITEM_USE_BAG_MENU,
|
||||
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
|
||||
.type = ITEM_USE_FIELD,
|
||||
.fieldUseFunc = ItemUseOutOfBattle_Honey,
|
||||
.flingPower = 30,
|
||||
},
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
10
src/debug.c
10
src/debug.c
@ -2792,16 +2792,6 @@ static void DebugAction_Give_CHEAT(u8 taskId)
|
||||
ScriptContext_SetupScript(Debug_CheatStart);
|
||||
}
|
||||
|
||||
static void Task_WaitFadeAccessPC(u8 taskId)
|
||||
{
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
DestroyTask(taskId);
|
||||
FlagSet(DEBUG_FLAG_PC_FROM_DEBUG_MENU);
|
||||
EnterPokeStorage(2);
|
||||
}
|
||||
}
|
||||
|
||||
static void DebugAction_AccessPC(u8 taskId)
|
||||
{
|
||||
Debug_DestroyMenu_Full(taskId);
|
||||
|
@ -19,7 +19,6 @@
|
||||
#include "constants/songs.h"
|
||||
|
||||
static void FieldCallback_SweetScent(void);
|
||||
static void StartSweetScentFieldEffect(void);
|
||||
static void TrySweetScentEncounter(u8 taskId);
|
||||
static void FailSweetScentEncounter(u8 taskId);
|
||||
|
||||
@ -47,14 +46,15 @@ bool8 FldEff_SweetScent(void)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void StartSweetScentFieldEffect(void)
|
||||
void StartSweetScentFieldEffect(void)
|
||||
{
|
||||
u8 taskId;
|
||||
u32 palettes = ~(1 << (gSprites[GetPlayerAvatarSpriteId()].oam.paletteNum + 16) | (1 << 13) | (1 << 14) | (1 << 15));
|
||||
|
||||
PlaySE(SE_M_SWEET_SCENT);
|
||||
CpuFastSet(gPlttBufferUnfaded, gPaletteDecompressionBuffer, 0x100);
|
||||
CpuFastSet(gPlttBufferFaded, gPlttBufferUnfaded, 0x100);
|
||||
BeginNormalPaletteFade(~(1 << (gSprites[GetPlayerAvatarSpriteId()].oam.paletteNum + 16)), 4, 0, 8, RGB_RED);
|
||||
BeginNormalPaletteFade(palettes, 4, 0, 8, RGB_RED);
|
||||
taskId = CreateTask(TrySweetScentEncounter, 0);
|
||||
gTasks[taskId].data[0] = 0;
|
||||
FieldEffectActiveListRemove(FLDEFF_SWEET_SCENT);
|
||||
|
@ -880,12 +880,6 @@ const u8 *ItemId_GetName(u16 itemId)
|
||||
return gItems[SanitizeItemId(itemId)].name;
|
||||
}
|
||||
|
||||
// Unused
|
||||
u16 ItemId_GetId(u16 itemId)
|
||||
{
|
||||
return gItems[SanitizeItemId(itemId)].itemId;
|
||||
}
|
||||
|
||||
u16 ItemId_GetPrice(u16 itemId)
|
||||
{
|
||||
return gItems[SanitizeItemId(itemId)].price;
|
||||
|
@ -18,6 +18,7 @@
|
||||
#include "field_player_avatar.h"
|
||||
#include "field_screen_effect.h"
|
||||
#include "field_weather.h"
|
||||
#include "fldeff.h"
|
||||
#include "item.h"
|
||||
#include "item_menu.h"
|
||||
#include "item_use.h"
|
||||
@ -67,10 +68,13 @@ static void Task_ShowTMHMContainedMessage(u8);
|
||||
static void UseTMHMYesNo(u8);
|
||||
static void UseTMHM(u8);
|
||||
static void Task_StartUseRepel(u8);
|
||||
static void Task_StartUseLure(u8 taskId);
|
||||
static void Task_UseRepel(u8);
|
||||
static void Task_UseLure(u8 taskId);
|
||||
static void Task_CloseCantUseKeyItemMessage(u8);
|
||||
static void SetDistanceOfClosestHiddenItem(u8, s16, s16);
|
||||
static void CB2_OpenPokeblockFromBag(void);
|
||||
static void ItemUseOnFieldCB_Honey(u8 taskId);
|
||||
|
||||
// EWRAM variables
|
||||
EWRAM_DATA static void(*sItemUseOnFieldCB)(u8 taskId) = NULL;
|
||||
@ -846,7 +850,7 @@ static void RemoveUsedItem(void)
|
||||
|
||||
void ItemUseOutOfBattle_Repel(u8 taskId)
|
||||
{
|
||||
if (VarGet(VAR_REPEL_STEP_COUNT) == 0)
|
||||
if (REPEL_STEP_COUNT == 0)
|
||||
gTasks[taskId].func = Task_StartUseRepel;
|
||||
else if (!InBattlePyramid())
|
||||
DisplayItemMessage(taskId, FONT_NORMAL, gText_RepelEffectsLingered, CloseItemMessage);
|
||||
@ -871,6 +875,9 @@ static void Task_UseRepel(u8 taskId)
|
||||
if (!IsSEPlaying())
|
||||
{
|
||||
VarSet(VAR_REPEL_STEP_COUNT, ItemId_GetHoldEffectParam(gSpecialVar_ItemId));
|
||||
#if VAR_LAST_REPEL_LURE_USED != 0
|
||||
VarSet(VAR_LAST_REPEL_LURE_USED, gSpecialVar_ItemId);
|
||||
#endif
|
||||
RemoveUsedItem();
|
||||
if (!InBattlePyramid())
|
||||
DisplayItemMessage(taskId, FONT_NORMAL, gStringVar4, CloseItemMessage);
|
||||
@ -878,6 +885,57 @@ static void Task_UseRepel(u8 taskId)
|
||||
DisplayItemMessageInBattlePyramid(taskId, gStringVar4, Task_CloseBattlePyramidBagMessage);
|
||||
}
|
||||
}
|
||||
void HandleUseExpiredRepel(void)
|
||||
{
|
||||
#if VAR_LAST_REPEL_LURE_USED != 0
|
||||
VarSet(VAR_REPEL_STEP_COUNT, ItemId_GetHoldEffectParam(VarGet(VAR_LAST_REPEL_LURE_USED)));
|
||||
#endif
|
||||
}
|
||||
|
||||
void ItemUseOutOfBattle_Lure(u8 taskId)
|
||||
{
|
||||
if (LURE_STEP_COUNT == 0)
|
||||
gTasks[taskId].func = Task_StartUseLure;
|
||||
else if (!InBattlePyramid())
|
||||
DisplayItemMessage(taskId, FONT_NORMAL, gText_LureEffectsLingered, CloseItemMessage);
|
||||
else
|
||||
DisplayItemMessageInBattlePyramid(taskId, gText_LureEffectsLingered, Task_CloseBattlePyramidBagMessage);
|
||||
}
|
||||
|
||||
static void Task_StartUseLure(u8 taskId)
|
||||
{
|
||||
s16* data = gTasks[taskId].data;
|
||||
|
||||
if (++data[8] > 7)
|
||||
{
|
||||
data[8] = 0;
|
||||
PlaySE(SE_REPEL);
|
||||
gTasks[taskId].func = Task_UseLure;
|
||||
}
|
||||
}
|
||||
|
||||
static void Task_UseLure(u8 taskId)
|
||||
{
|
||||
if (!IsSEPlaying())
|
||||
{
|
||||
VarSet(VAR_REPEL_STEP_COUNT, ItemId_GetHoldEffectParam(gSpecialVar_ItemId) | REPEL_LURE_MASK);
|
||||
#if VAR_LAST_REPEL_LURE_USED != 0
|
||||
VarSet(VAR_LAST_REPEL_LURE_USED, gSpecialVar_ItemId);
|
||||
#endif
|
||||
RemoveUsedItem();
|
||||
if (!InBattlePyramid())
|
||||
DisplayItemMessage(taskId, FONT_NORMAL, gStringVar4, CloseItemMessage);
|
||||
else
|
||||
DisplayItemMessageInBattlePyramid(taskId, gStringVar4, Task_CloseBattlePyramidBagMessage);
|
||||
}
|
||||
}
|
||||
|
||||
void HandleUseExpiredLure(void)
|
||||
{
|
||||
#if VAR_LAST_REPEL_LURE_USED != 0
|
||||
VarSet(VAR_REPEL_STEP_COUNT, ItemId_GetHoldEffectParam(VarGet(VAR_LAST_REPEL_LURE_USED)) | REPEL_LURE_MASK);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void Task_UsedBlackWhiteFlute(u8 taskId)
|
||||
{
|
||||
@ -1202,6 +1260,29 @@ void ItemUseOutOfBattle_FormChange_ConsumedOnUse(u8 taskId)
|
||||
SetUpItemUseCallback(taskId);
|
||||
}
|
||||
|
||||
void Task_UseHoneyOnField(u8 taskId)
|
||||
{
|
||||
//ResetInitialPlayerAvatarState();
|
||||
StartSweetScentFieldEffect();
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
|
||||
static void ItemUseOnFieldCB_Honey(u8 taskId)
|
||||
{
|
||||
Overworld_ResetStateAfterDigEscRope();
|
||||
RemoveUsedItem();
|
||||
gTasks[taskId].data[0] = 0;
|
||||
DisplayItemMessageOnField(taskId, gStringVar4, Task_UseHoneyOnField);
|
||||
}
|
||||
|
||||
void ItemUseOutOfBattle_Honey(u8 taskId)
|
||||
{
|
||||
sItemUseOnFieldCB = ItemUseOnFieldCB_Honey;
|
||||
gFieldCallback = FieldCB_UseItemOnField;
|
||||
gBagMenu->newScreenCallback = CB2_ReturnToField;
|
||||
Task_FadeAndCloseBagMenu(taskId);
|
||||
}
|
||||
|
||||
void ItemUseOutOfBattle_CannotUse(u8 taskId)
|
||||
{
|
||||
DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].tUsingRegisteredKeyItem);
|
||||
|
901
src/pokemon.c
901
src/pokemon.c
File diff suppressed because it is too large
Load Diff
@ -1668,18 +1668,10 @@ static void FieldTask_ReturnToPcMenu(void)
|
||||
MainCallback vblankCb = gMain.vblankCallback;
|
||||
|
||||
SetVBlankCallback(NULL);
|
||||
if (!FlagGet(DEBUG_FLAG_PC_FROM_DEBUG_MENU))
|
||||
{
|
||||
taskId = CreateTask(Task_PCMainMenu, 80);
|
||||
gTasks[taskId].tState = 0;
|
||||
gTasks[taskId].tSelectedOption = sPreviousBoxOption;
|
||||
Task_PCMainMenu(taskId);
|
||||
}
|
||||
else
|
||||
{
|
||||
FlagClear(DEBUG_FLAG_PC_FROM_DEBUG_MENU);
|
||||
ScriptContext_Enable();
|
||||
}
|
||||
taskId = CreateTask(Task_PCMainMenu, 80);
|
||||
gTasks[taskId].tState = 0;
|
||||
gTasks[taskId].tSelectedOption = sPreviousBoxOption;
|
||||
Task_PCMainMenu(taskId);
|
||||
SetVBlankCallback(vblankCb);
|
||||
FadeInFromBlack();
|
||||
}
|
||||
|
@ -33,7 +33,8 @@ struct GFRomHeader
|
||||
u32 flagsOffset;
|
||||
u32 varsOffset;
|
||||
u32 pokedexOffset;
|
||||
u32 seenOffset;
|
||||
u32 seen1Offset;
|
||||
u32 seen2Offset;
|
||||
u32 pokedexVar;
|
||||
u32 pokedexFlag;
|
||||
u32 mysteryEventFlag;
|
||||
@ -112,7 +113,8 @@ static const struct GFRomHeader sGFRomHeader = {
|
||||
.flagsOffset = offsetof(struct SaveBlock1, flags),
|
||||
.varsOffset = offsetof(struct SaveBlock1, vars),
|
||||
.pokedexOffset = offsetof(struct SaveBlock2, pokedex),
|
||||
.seenOffset = offsetof(struct SaveBlock1, dexSeen),
|
||||
.seen1Offset = offsetof(struct SaveBlock1, dexSeen),
|
||||
.seen2Offset = offsetof(struct SaveBlock1, dexSeen), // dex flags are combined, just provide the same pointer
|
||||
.pokedexVar = VAR_NATIONAL_DEX - VARS_START,
|
||||
.pokedexFlag = FLAG_RECEIVED_POKEDEX_FROM_BIRCH,
|
||||
.mysteryEventFlag = FLAG_SYS_MYSTERY_EVENT_ENABLE,
|
||||
|
@ -90,12 +90,10 @@ static u16 GetLengthWithExpandedPlayerName(const u8 *str)
|
||||
return length;
|
||||
}
|
||||
|
||||
static void DrawMultichoiceMenu(u8 left, u8 top, u8 multichoiceId, bool8 ignoreBPress, u8 cursorPos)
|
||||
static void DrawMultichoiceMenuInternal(u8 left, u8 top, u8 multichoiceId, bool8 ignoreBPress, u8 cursorPos, const struct MenuAction *actions, int count)
|
||||
{
|
||||
int i;
|
||||
u8 windowId;
|
||||
u8 count = sMultichoiceLists[multichoiceId].count;
|
||||
const struct MenuAction *actions = sMultichoiceLists[multichoiceId].list;
|
||||
int width = 0;
|
||||
u8 newWidth;
|
||||
|
||||
@ -114,6 +112,84 @@ static void DrawMultichoiceMenu(u8 left, u8 top, u8 multichoiceId, bool8 ignoreB
|
||||
InitMultichoiceCheckWrap(ignoreBPress, count, windowId, multichoiceId);
|
||||
}
|
||||
|
||||
static void DrawMultichoiceMenu(u8 left, u8 top, u8 multichoiceId, bool8 ignoreBPress, u8 cursorPos)
|
||||
{
|
||||
DrawMultichoiceMenuInternal(left, top, multichoiceId, ignoreBPress, cursorPos, sMultichoiceLists[multichoiceId].list, sMultichoiceLists[multichoiceId].count);
|
||||
}
|
||||
|
||||
#if I_REPEL_LURE_MENU == TRUE
|
||||
void TryDrawRepelMenu(void)
|
||||
{
|
||||
static const u16 repelItems[] = {ITEM_REPEL, ITEM_SUPER_REPEL, ITEM_MAX_REPEL};
|
||||
struct MenuAction menuItems[ARRAY_COUNT(repelItems) + 1] = {NULL};
|
||||
int i, count = 0, menuPos = 0;
|
||||
|
||||
for (i = 0; i < ARRAY_COUNT(repelItems); i++)
|
||||
{
|
||||
if (CheckBagHasItem(repelItems[i], 1))
|
||||
{
|
||||
VarSet(VAR_0x8004 + count, repelItems[i]);
|
||||
#if VAR_LAST_REPEL_LURE_USED != 0
|
||||
if (VarGet(VAR_LAST_REPEL_LURE_USED) == repelItems[i])
|
||||
menuPos = count;
|
||||
#endif
|
||||
menuItems[count].text = ItemId_GetName(repelItems[i]);
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
if (count > 1)
|
||||
DrawMultichoiceMenuInternal(0, 0, 0, FALSE, menuPos, menuItems, count);
|
||||
|
||||
gSpecialVar_Result = (count > 1);
|
||||
}
|
||||
|
||||
void HandleRepelMenuChoice(void)
|
||||
{
|
||||
gSpecialVar_0x8004 = VarGet(VAR_0x8004 + gSpecialVar_Result); // Get item Id;
|
||||
VarSet(VAR_REPEL_STEP_COUNT, ItemId_GetHoldEffectParam(gSpecialVar_0x8004));
|
||||
#if VAR_LAST_REPEL_LURE_USED != 0
|
||||
VarSet(VAR_LAST_REPEL_LURE_USED, gSpecialVar_0x8004);
|
||||
#endif
|
||||
}
|
||||
|
||||
void TryDrawLureMenu(void)
|
||||
{
|
||||
static const u16 lureItems[] = {ITEM_LURE, ITEM_SUPER_LURE, ITEM_MAX_LURE};
|
||||
struct MenuAction menuItems[ARRAY_COUNT(lureItems) + 1] = {NULL};
|
||||
int i, count = 0, menuPos = 0;
|
||||
|
||||
|
||||
for (i = 0; i < ARRAY_COUNT(lureItems); i++)
|
||||
{
|
||||
if (CheckBagHasItem(lureItems[i], 1))
|
||||
{
|
||||
VarSet(VAR_0x8004 + count, lureItems[i]);
|
||||
#if VAR_LAST_REPEL_LURE_USED != 0
|
||||
if (VarGet(VAR_LAST_REPEL_LURE_USED) == lureItems[i])
|
||||
menuPos = count;
|
||||
#endif
|
||||
menuItems[count].text = ItemId_GetName(lureItems[i]);
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
if (count > 1)
|
||||
DrawMultichoiceMenuInternal(0, 0, 0, FALSE, menuPos, menuItems, count);
|
||||
|
||||
gSpecialVar_Result = (count > 1);
|
||||
}
|
||||
|
||||
void HandleLureMenuChoice(void)
|
||||
{
|
||||
gSpecialVar_0x8004 = VarGet(VAR_0x8004 + gSpecialVar_Result); // Get item Id;
|
||||
VarSet(VAR_REPEL_STEP_COUNT, ItemId_GetHoldEffectParam(gSpecialVar_0x8004) | REPEL_LURE_MASK);
|
||||
#if VAR_LAST_REPEL_LURE_USED != 0
|
||||
VarSet(VAR_LAST_REPEL_LURE_USED, gSpecialVar_0x8004);
|
||||
#endif
|
||||
}
|
||||
#endif //I_REPEL_LURE_MENU == TRUE
|
||||
|
||||
#define tLeft data[0]
|
||||
#define tTop data[1]
|
||||
#define tRight data[2]
|
||||
|
@ -244,6 +244,7 @@ const u8 gText_BootedUpHM[] = _("Booted up an HM.");
|
||||
const u8 gText_TMHMContainedVar1[] = _("It contained\n{STR_VAR_1}.\pTeach {STR_VAR_1}\nto a POKéMON?");
|
||||
const u8 gText_PlayerUsedVar2[] = _("{PLAYER} used the\n{STR_VAR_2}.{PAUSE_UNTIL_PRESS}");
|
||||
const u8 gText_RepelEffectsLingered[] = _("But the effects of a REPEL\nlingered from earlier.{PAUSE_UNTIL_PRESS}");
|
||||
const u8 gText_LureEffectsLingered[] = _("But the effects of a Lure\nlingered from earlier.{PAUSE_UNTIL_PRESS}");
|
||||
const u8 gText_UsedVar2WildLured[] = _("{PLAYER} used the\n{STR_VAR_2}.\pWild POKéMON will be lured.{PAUSE_UNTIL_PRESS}");
|
||||
const u8 gText_UsedVar2WildRepelled[] = _("{PLAYER} used the\n{STR_VAR_2}.\pWild POKéMON will be repelled.{PAUSE_UNTIL_PRESS}");
|
||||
const u8 gText_BoxFull[] = _("The BOX is full.{PAUSE_UNTIL_PRESS}");
|
||||
|
@ -20,11 +20,13 @@
|
||||
#include "constants/abilities.h"
|
||||
#include "constants/battle_config.h"
|
||||
#include "constants/game_stat.h"
|
||||
#include "constants/item.h"
|
||||
#include "constants/items.h"
|
||||
#include "constants/layouts.h"
|
||||
#include "constants/weather.h"
|
||||
|
||||
extern const u8 EventScript_RepelWoreOff[];
|
||||
extern const u8 EventScript_LureWoreOff[];
|
||||
|
||||
#define MAX_ENCOUNTER_RATE 2880
|
||||
|
||||
@ -54,6 +56,7 @@ static void FeebasSeedRng(u16 seed);
|
||||
static bool8 IsWildLevelAllowedByRepel(u8 level);
|
||||
static void ApplyFluteEncounterRateMod(u32 *encRate);
|
||||
static void ApplyCleanseTagEncounterRateMod(u32 *encRate);
|
||||
static u8 GetMaxLevelOfSpeciesInWildTable(const struct WildPokemon *wildMon, u16 species, u8 area);
|
||||
static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u16 ability, u8 *monIndex);
|
||||
static bool8 IsAbilityAllowingEncounter(u8 level);
|
||||
|
||||
@ -181,58 +184,82 @@ static void FeebasSeedRng(u16 seed)
|
||||
// LAND_WILD_COUNT
|
||||
static u8 ChooseWildMonIndex_Land(void)
|
||||
{
|
||||
u8 wildMonIndex = 0;
|
||||
bool8 swap = FALSE;
|
||||
u8 rand = Random() % ENCOUNTER_CHANCE_LAND_MONS_TOTAL;
|
||||
|
||||
if (rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_0)
|
||||
return 0;
|
||||
wildMonIndex = 0;
|
||||
else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_0 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_1)
|
||||
return 1;
|
||||
wildMonIndex = 1;
|
||||
else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_1 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_2)
|
||||
return 2;
|
||||
wildMonIndex = 2;
|
||||
else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_2 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_3)
|
||||
return 3;
|
||||
wildMonIndex = 3;
|
||||
else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_3 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_4)
|
||||
return 4;
|
||||
wildMonIndex = 4;
|
||||
else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_4 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_5)
|
||||
return 5;
|
||||
wildMonIndex = 5;
|
||||
else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_5 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_6)
|
||||
return 6;
|
||||
wildMonIndex = 6;
|
||||
else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_6 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_7)
|
||||
return 7;
|
||||
wildMonIndex = 7;
|
||||
else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_7 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_8)
|
||||
return 8;
|
||||
wildMonIndex = 8;
|
||||
else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_8 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_9)
|
||||
return 9;
|
||||
wildMonIndex = 9;
|
||||
else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_9 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_10)
|
||||
return 10;
|
||||
wildMonIndex = 10;
|
||||
else
|
||||
return 11;
|
||||
wildMonIndex = 11;
|
||||
|
||||
if (LURE_STEP_COUNT != 0 && (Random() % 10 < 2))
|
||||
swap = TRUE;
|
||||
|
||||
if (swap)
|
||||
wildMonIndex = 11 - wildMonIndex;
|
||||
|
||||
return wildMonIndex;
|
||||
}
|
||||
|
||||
// ROCK_WILD_COUNT / WATER_WILD_COUNT
|
||||
static u8 ChooseWildMonIndex_WaterRock(void)
|
||||
{
|
||||
u8 wildMonIndex = 0;
|
||||
bool8 swap = FALSE;
|
||||
u8 rand = Random() % ENCOUNTER_CHANCE_WATER_MONS_TOTAL;
|
||||
|
||||
if (rand < ENCOUNTER_CHANCE_WATER_MONS_SLOT_0)
|
||||
return 0;
|
||||
wildMonIndex = 0;
|
||||
else if (rand >= ENCOUNTER_CHANCE_WATER_MONS_SLOT_0 && rand < ENCOUNTER_CHANCE_WATER_MONS_SLOT_1)
|
||||
return 1;
|
||||
wildMonIndex = 1;
|
||||
else if (rand >= ENCOUNTER_CHANCE_WATER_MONS_SLOT_1 && rand < ENCOUNTER_CHANCE_WATER_MONS_SLOT_2)
|
||||
return 2;
|
||||
wildMonIndex = 2;
|
||||
else if (rand >= ENCOUNTER_CHANCE_WATER_MONS_SLOT_2 && rand < ENCOUNTER_CHANCE_WATER_MONS_SLOT_3)
|
||||
return 3;
|
||||
wildMonIndex = 3;
|
||||
else
|
||||
return 4;
|
||||
wildMonIndex = 4;
|
||||
|
||||
if (LURE_STEP_COUNT != 0 && (Random() % 10 < 2))
|
||||
swap = TRUE;
|
||||
|
||||
if (swap)
|
||||
wildMonIndex = 4 - wildMonIndex;
|
||||
|
||||
return wildMonIndex;
|
||||
}
|
||||
|
||||
// FISH_WILD_COUNT
|
||||
static u8 ChooseWildMonIndex_Fishing(u8 rod)
|
||||
{
|
||||
u8 wildMonIndex = 0;
|
||||
bool8 swap = FALSE;
|
||||
u8 rand = Random() % max(max(ENCOUNTER_CHANCE_FISHING_MONS_OLD_ROD_TOTAL, ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_TOTAL),
|
||||
ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_TOTAL);
|
||||
|
||||
if (LURE_STEP_COUNT != 0 && (Random() % 10 < 2))
|
||||
swap = TRUE;
|
||||
|
||||
switch (rod)
|
||||
{
|
||||
case OLD_ROD:
|
||||
@ -240,6 +267,9 @@ static u8 ChooseWildMonIndex_Fishing(u8 rod)
|
||||
wildMonIndex = 0;
|
||||
else
|
||||
wildMonIndex = 1;
|
||||
|
||||
if (swap)
|
||||
wildMonIndex = 1 - wildMonIndex;
|
||||
break;
|
||||
case GOOD_ROD:
|
||||
if (rand < ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_2)
|
||||
@ -248,6 +278,9 @@ static u8 ChooseWildMonIndex_Fishing(u8 rod)
|
||||
wildMonIndex = 3;
|
||||
if (rand >= ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_3 && rand < ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_4)
|
||||
wildMonIndex = 4;
|
||||
|
||||
if (swap)
|
||||
wildMonIndex = 6 - wildMonIndex;
|
||||
break;
|
||||
case SUPER_ROD:
|
||||
if (rand < ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_5)
|
||||
@ -260,46 +293,61 @@ static u8 ChooseWildMonIndex_Fishing(u8 rod)
|
||||
wildMonIndex = 8;
|
||||
if (rand >= ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_8 && rand < ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_9)
|
||||
wildMonIndex = 9;
|
||||
|
||||
if (swap)
|
||||
wildMonIndex = 14 - wildMonIndex;
|
||||
break;
|
||||
}
|
||||
return wildMonIndex;
|
||||
}
|
||||
|
||||
static u8 ChooseWildMonLevel(const struct WildPokemon *wildPokemon)
|
||||
static u8 ChooseWildMonLevel(const struct WildPokemon *wildPokemon, u8 wildMonIndex, u8 area)
|
||||
{
|
||||
u8 min;
|
||||
u8 max;
|
||||
u8 range;
|
||||
u8 rand;
|
||||
|
||||
// Make sure minimum level is less than maximum level
|
||||
if (wildPokemon->maxLevel >= wildPokemon->minLevel)
|
||||
if (LURE_STEP_COUNT == 0)
|
||||
{
|
||||
min = wildPokemon->minLevel;
|
||||
max = wildPokemon->maxLevel;
|
||||
// Make sure minimum level is less than maximum level
|
||||
if (wildPokemon[wildMonIndex].maxLevel >= wildPokemon[wildMonIndex].minLevel)
|
||||
{
|
||||
min = wildPokemon[wildMonIndex].minLevel;
|
||||
max = wildPokemon[wildMonIndex].maxLevel;
|
||||
}
|
||||
else
|
||||
{
|
||||
min = wildPokemon[wildMonIndex].maxLevel;
|
||||
max = wildPokemon[wildMonIndex].minLevel;
|
||||
}
|
||||
range = max - min + 1;
|
||||
rand = Random() % range;
|
||||
|
||||
// check ability for max level mon
|
||||
if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG))
|
||||
{
|
||||
u16 ability = GetMonAbility(&gPlayerParty[0]);
|
||||
if (ability == ABILITY_HUSTLE || ability == ABILITY_VITAL_SPIRIT || ability == ABILITY_PRESSURE)
|
||||
{
|
||||
if (Random() % 2 == 0)
|
||||
return max;
|
||||
|
||||
if (rand != 0)
|
||||
rand--;
|
||||
}
|
||||
}
|
||||
return min + rand;
|
||||
}
|
||||
else
|
||||
{
|
||||
min = wildPokemon->maxLevel;
|
||||
max = wildPokemon->minLevel;
|
||||
// Looks for the max level of all slots that share the same species as the selected slot.
|
||||
max = GetMaxLevelOfSpeciesInWildTable(wildPokemon, wildPokemon[wildMonIndex].species, area);
|
||||
if (max > 0)
|
||||
return max + 1;
|
||||
else // Failsafe
|
||||
return wildPokemon[wildMonIndex].maxLevel + 1;
|
||||
}
|
||||
range = max - min + 1;
|
||||
rand = Random() % range;
|
||||
|
||||
// check ability for max level mon
|
||||
if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG))
|
||||
{
|
||||
u16 ability = GetMonAbility(&gPlayerParty[0]);
|
||||
if (ability == ABILITY_HUSTLE || ability == ABILITY_VITAL_SPIRIT || ability == ABILITY_PRESSURE)
|
||||
{
|
||||
if (Random() % 2 == 0)
|
||||
return max;
|
||||
|
||||
if (rand != 0)
|
||||
rand--;
|
||||
}
|
||||
}
|
||||
return min + rand;
|
||||
}
|
||||
|
||||
static u16 GetCurrentMapWildMonHeaderId(void)
|
||||
@ -461,7 +509,7 @@ static bool8 TryGenerateWildMon(const struct WildPokemonInfo *wildMonInfo, u8 ar
|
||||
break;
|
||||
}
|
||||
|
||||
level = ChooseWildMonLevel(&wildMonInfo->wildPokemon[wildMonIndex]);
|
||||
level = ChooseWildMonLevel(wildMonInfo->wildPokemon, wildMonIndex, area);
|
||||
if (flags & WILD_CHECK_REPEL && !IsWildLevelAllowedByRepel(level))
|
||||
return FALSE;
|
||||
if (gMapHeader.mapLayoutId != LAYOUT_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_WILD_MONS && flags & WILD_CHECK_KEEN_EYE && !IsAbilityAllowingEncounter(level))
|
||||
@ -474,7 +522,7 @@ static bool8 TryGenerateWildMon(const struct WildPokemonInfo *wildMonInfo, u8 ar
|
||||
static u16 GenerateFishingWildMon(const struct WildPokemonInfo *wildMonInfo, u8 rod)
|
||||
{
|
||||
u8 wildMonIndex = ChooseWildMonIndex_Fishing(rod);
|
||||
u8 level = ChooseWildMonLevel(&wildMonInfo->wildPokemon[wildMonIndex]);
|
||||
u8 level = ChooseWildMonLevel(wildMonInfo->wildPokemon, wildMonIndex, WILD_AREA_FISHING);
|
||||
|
||||
CreateWildMon(wildMonInfo->wildPokemon[wildMonIndex].species, level);
|
||||
return wildMonInfo->wildPokemon[wildMonIndex].species;
|
||||
@ -522,6 +570,8 @@ static bool8 WildEncounterCheck(u32 encounterRate, bool8 ignoreAbility)
|
||||
encounterRate = encounterRate * 80 / 100;
|
||||
ApplyFluteEncounterRateMod(&encounterRate);
|
||||
ApplyCleanseTagEncounterRateMod(&encounterRate);
|
||||
if (LURE_STEP_COUNT != 0)
|
||||
encounterRate *= 2;
|
||||
if (!ignoreAbility && !GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG))
|
||||
{
|
||||
u32 ability = GetMonAbility(&gPlayerParty[0]);
|
||||
@ -828,7 +878,7 @@ void FishingWildEncounter(u8 rod)
|
||||
|
||||
if (CheckFeebas() == TRUE)
|
||||
{
|
||||
u8 level = ChooseWildMonLevel(&sWildFeebas);
|
||||
u8 level = ChooseWildMonLevel(&sWildFeebas, 0, WILD_AREA_FISHING);
|
||||
|
||||
species = sWildFeebas.species;
|
||||
CreateWildMon(species, level);
|
||||
@ -895,24 +945,37 @@ u16 GetLocalWaterMon(void)
|
||||
|
||||
bool8 UpdateRepelCounter(void)
|
||||
{
|
||||
u16 steps;
|
||||
u16 repelLureVar = VarGet(VAR_REPEL_STEP_COUNT);
|
||||
u16 steps = REPEL_LURE_STEPS(repelLureVar);
|
||||
bool32 isLure = IS_LAST_USED_LURE(repelLureVar);
|
||||
|
||||
if (InBattlePike() || InBattlePyramid())
|
||||
return FALSE;
|
||||
if (InUnionRoom() == TRUE)
|
||||
return FALSE;
|
||||
|
||||
steps = VarGet(VAR_REPEL_STEP_COUNT);
|
||||
|
||||
if (steps != 0)
|
||||
{
|
||||
steps--;
|
||||
VarSet(VAR_REPEL_STEP_COUNT, steps);
|
||||
if (steps == 0)
|
||||
if (!isLure)
|
||||
{
|
||||
ScriptContext_SetupScript(EventScript_RepelWoreOff);
|
||||
return TRUE;
|
||||
VarSet(VAR_REPEL_STEP_COUNT, steps);
|
||||
if (steps == 0)
|
||||
{
|
||||
ScriptContext_SetupScript(EventScript_RepelWoreOff);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
VarSet(VAR_REPEL_STEP_COUNT, steps | REPEL_LURE_MASK);
|
||||
if (steps == 0)
|
||||
{
|
||||
ScriptContext_SetupScript(EventScript_LureWoreOff);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
@ -921,7 +984,7 @@ static bool8 IsWildLevelAllowedByRepel(u8 wildLevel)
|
||||
{
|
||||
u8 i;
|
||||
|
||||
if (!VarGet(VAR_REPEL_STEP_COUNT))
|
||||
if (!REPEL_STEP_COUNT)
|
||||
return TRUE;
|
||||
|
||||
for (i = 0; i < PARTY_SIZE; i++)
|
||||
@ -979,6 +1042,34 @@ static bool8 TryGetRandomWildMonIndexByType(const struct WildPokemon *wildMon, u
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#include "data.h"
|
||||
|
||||
static u8 GetMaxLevelOfSpeciesInWildTable(const struct WildPokemon *wildMon, u16 species, u8 area)
|
||||
{
|
||||
u8 i, maxLevel = 0, numMon = 0;
|
||||
|
||||
switch (area)
|
||||
{
|
||||
case WILD_AREA_LAND:
|
||||
numMon = LAND_WILD_COUNT;
|
||||
break;
|
||||
case WILD_AREA_WATER:
|
||||
numMon = WATER_WILD_COUNT;
|
||||
break;
|
||||
case WILD_AREA_ROCKS:
|
||||
numMon = ROCK_WILD_COUNT;
|
||||
break;
|
||||
}
|
||||
|
||||
for (i = 0; i < numMon; i++)
|
||||
{
|
||||
if (wildMon[i].species == species && wildMon[i].maxLevel > maxLevel)
|
||||
maxLevel = wildMon[i].maxLevel;
|
||||
}
|
||||
|
||||
return maxLevel;
|
||||
}
|
||||
|
||||
static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u16 ability, u8 *monIndex)
|
||||
{
|
||||
if (GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG))
|
||||
|
Loading…
Reference in New Issue
Block a user