merge rhh/upcoming

This commit is contained in:
AlexOn1ine 2025-02-28 00:21:07 +01:00
commit 0a333dbdc8
134 changed files with 10562 additions and 2324 deletions

View File

@ -23,17 +23,14 @@ body:
label: Version
description: What version of pokeemerald-expansion are you using as a base?
options:
- 1.10.2 (Latest release)
- 1.11.0 (Latest release)
- master (default, unreleased bugfixes)
- upcoming (Edge)
- 1.10.3
- 1.10.2
- 1.10.1
- 1.10.0
- 1.9.4
- 1.9.3
- 1.9.2
- 1.9.1
- 1.9.0
- pre-1.9.0
- pre-1.10.0
validations:
required: true
- type: input

View File

@ -23,17 +23,14 @@ body:
label: Version
description: What version of pokeemerald-expansion are you using as a base?
options:
- 1.10.2 (Latest release)
- 1.11.0 (Latest release)
- master (default, unreleased bugfixes)
- upcoming (Edge)
- 1.10.3
- 1.10.2
- 1.10.1
- 1.10.0
- 1.9.4
- 1.9.3
- 1.9.2
- 1.9.1
- 1.9.0
- pre-1.9.0
- pre-1.10.0
validations:
required: true
- type: input

View File

@ -23,17 +23,14 @@ body:
label: Version
description: What version of pokeemerald-expansion are you using as a base?
options:
- 1.10.2 (Latest release)
- 1.11.0 (Latest release)
- master (default, unreleased bugfixes)
- upcoming (Edge)
- 1.10.3
- 1.10.2
- 1.10.1
- 1.10.0
- 1.9.4
- 1.9.3
- 1.9.2
- 1.9.1
- 1.9.0
- pre-1.9.0
- pre-1.10.0
validations:
required: true
- type: input

View File

@ -10,7 +10,7 @@ The main advantage of using vanilla pokeemerald as a base is being able to link
If you use pokeemerald-expansion in your hack, please add RHH (Rom Hacking Hideout) to your credits list. Optionally, you can list the version used, so it can help players know what features to expect.
You can phrase it as the following:
```
Based off RHH's pokeemerald-expansion 1.10.2 https://github.com/rh-hideout/pokeemerald-expansion/
Based off RHH's pokeemerald-expansion 1.11.0 https://github.com/rh-hideout/pokeemerald-expansion/
```
#### Important: DO NOT use GitHub's "Download Zip" option. Using this option will not download the commit history required to update your expansion version or merge other feature branches. Instead, please read [this guide](https://github.com/Pawkkie/Team-Aquas-Asset-Repo/wiki/The-Basics-of-GitHub) to learn how to fork the repository and clone locally from there.

View File

@ -1640,8 +1640,8 @@
callnative BS_TryTriggerStatusForm
.endm
.macro setphotongeysercategory
callnative BS_SetPhotonGeyserCategory
.macro setdynamicmovecategory
callnative BS_SetDynamicMoveCategory
.endm
.macro tryupperhand failInstr:req

View File

@ -2422,6 +2422,12 @@
.2byte \dest
.endm
@ Hides any follower Pokémon if present, putting them into their Poké Ball; by default waits for their movement to finish.
.macro hidefollower wait=1
callnative ScrFunc_hidefollower
.2byte \wait
.endm
.macro increasedifficulty
callnative Script_IncreaseDifficulty, requests_effects=1
.endm

View File

@ -1880,7 +1880,7 @@ gBattleAnimMove_Avalanche::
loadspritegfx ANIM_TAG_ICE_CHUNK
monbg ANIM_DEF_PARTNER
createsprite gShakeMonOrTerrainSpriteTemplate, ANIM_TARGET, 2, 7, 1, 11, 1
createsprite gAvalancheSpriteTemplate, ANIM_TARGET, 130, 4, -5, 1, -5, 1
createsprite gAvalancheSpriteTemplate, ANIM_TARGET, 130, -5, 1, -5, 1
playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET
delay 2
createsprite gAvalancheSpriteTemplate, ANIM_TARGET, 130, 5, 0, 6, 1
@ -5623,7 +5623,6 @@ gBattleAnimMove_Bulldoze::
gBattleAnimMove_FrostBreath::
loadspritegfx ANIM_TAG_ICE_CHUNK
loadspritegfx ANIM_TAG_SMALL_EMBER
loadspritegfx ANIM_TAG_FIRE_PLUME
fadetobg BG_ICE
waitbgfadeout
createvisualtask AnimTask_StartSlidingBg, 0x5, 0x300, 0x0, 0x0, 0xffff
@ -5635,6 +5634,8 @@ gBattleAnimMove_FrostBreath::
waitforvisualfinish
createsprite gFrostBreathBlueBreathTemplate, ANIM_TARGET, 2, 0x1e, 0xf, 0x0, 0xa, 0xa
waitforvisualfinish
unloadspritegfx ANIM_TAG_SMALL_EMBER
loadspritegfx ANIM_TAG_FIRE_PLUME
loopsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET, 0xb, 0x3
createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 3, 25, 1
createsprite gFrostBreathBlueRageTemplate, ANIM_TARGET, 66, 0x1, 0x5, 0x0
@ -7718,7 +7719,6 @@ gBattleAnimMove_ParabolicCharge::
loadspritegfx ANIM_TAG_SPARK
loadspritegfx ANIM_TAG_LIGHTNING
loadspritegfx ANIM_TAG_ORBS
loadspritegfx ANIM_TAG_BLUE_STAR
monbg ANIM_ATTACKER
setalpha 12, 8
createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 0, 6, RGB(18, 16, 3)
@ -7741,6 +7741,11 @@ gBattleAnimMove_ParabolicCharge::
createvisualtask AnimTask_BlendBattleAnimPal, 5, 4, 0, 0, 0, RGB_BLACK
ParabolicChargeHeal:
waitforvisualfinish
unloadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT
unloadspritegfx ANIM_TAG_ELECTRIC_ORBS
unloadspritegfx ANIM_TAG_SPARK
unloadspritegfx ANIM_TAG_LIGHTNING
loadspritegfx ANIM_TAG_BLUE_STAR
clearmonbg ANIM_ATTACKER
waitforvisualfinish
call HealingEffect
@ -12314,14 +12319,13 @@ ZingZapSparks2:
return
gBattleAnimMove_NaturesMadness::
loadspritegfx ANIM_TAG_ICE_CRYSTALS @small circles
loadspritegfx ANIM_TAG_THIN_RING @ring
loadspritegfx ANIM_TAG_SPARKLE_2 @stars
loadspritegfx ANIM_TAG_PINK_PETAL @pink
loadspritegfx ANIM_TAG_ICE_CHUNK @blue green
loadspritegfx ANIM_TAG_ICE_CRYSTALS @small circles CrystalsTemplate
loadspritegfx ANIM_TAG_THIN_RING @ring PinkRingTemplate, GrayRingTemplate
loadspritegfx ANIM_TAG_SPARKLE_2 @stars PinkStarsTemplate
loadspritegfx ANIM_TAG_PINK_PETAL @pink PinkRingTemplate, PinkStarsTemplate
loadspritegfx ANIM_TAG_ICE_CHUNK @blue green CrystalsTemplate
loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @charge
loadspritegfx ANIM_TAG_TEAL_ALERT @charge particles
loadspritegfx ANIM_TAG_ECLIPSING_ORB @blue green
monbg ANIM_ATTACKER
setalpha 14, 8
delay 0x1
@ -12357,6 +12361,8 @@ gBattleAnimMove_NaturesMadness::
delay 0x1
monbg ANIM_TARGET
waitforvisualfinish
unloadspritegfx ANIM_TAG_SPARKLE_2
loadspritegfx ANIM_TAG_ECLIPSING_ORB @blue green grayRing
createsprite gNaturesMadnessGrayRingTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x1, 0x0
playsewithpan SE_M_HEAL_BELL, SOUND_PAN_ATTACKER
delay 0xe
@ -13140,7 +13146,6 @@ gBattleAnimMove_StuffCheeks::
loadspritegfx ANIM_TAG_BERRY_NORMAL
loadspritegfx ANIM_TAG_SHARP_TEETH
loadspritegfx ANIM_TAG_THIN_RING
loadspritegfx ANIM_TAG_SPARKLE_2
playsewithpan SE_M_METRONOME, 0xc0
createsprite gFloatingBerryTemplate, ANIM_ATTACKER, 1, 0x0
delay 0x45

View File

@ -640,7 +640,7 @@ BattleScript_AffectionBasedStatus_HealFreezeString:
printstring STRINGID_ATTACKERMELTEDTHEICE
goto BattleScript_AffectionBasedStatusHeal_Continue
BattleScript_AffectionBasedStatus_HealFrostbiteString:
printstring STRINGID_ATTACKERMELTEDTHEICE
printstring STRINGID_ATTACKERHEALEDITSFROSTBITE
BattleScript_AffectionBasedStatusHeal_Continue:
waitmessage B_WAIT_TIME_LONG
clearstatus BS_ATTACKER
@ -836,8 +836,8 @@ BattleScript_FlingMissed:
ppreduce
goto BattleScript_MoveMissedPause
BattleScript_EffectPhotonGeyser::
setphotongeysercategory
BattleScript_EffectDynamicCategory::
setdynamicmovecategory
goto BattleScript_EffectHit
BattleScript_EffectAuraWheel:: @ Aura Wheel can only be used by Morpeko
@ -1034,6 +1034,7 @@ BattleScript_EffectCoaching::
setallytonexttarget EffectCoaching_CheckAllyStats
goto BattleScript_ButItFailed
EffectCoaching_CheckAllyStats:
accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON
jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_ATK, MAX_STAT_STAGE, BattleScript_CoachingWorks
jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_DEF, MAX_STAT_STAGE, BattleScript_CoachingWorks
goto BattleScript_ButItFailed @ ally at max atk, def
@ -1563,6 +1564,7 @@ BattleScript_RototillerMoveTargetEnd:
moveendto MOVEEND_NEXT_TARGET
addbyte gBattlerTarget, 1
jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_RototillerLoop
restoretarget
end
BattleScript_RototillerCantRaiseMultipleStats:
@ -1743,8 +1745,6 @@ BattleScript_EffectCopycat::
trycopycat BattleScript_CopycatFail
attackanimation
waitanimation
setbyte sB_ANIM_TURN, 0
setbyte sB_ANIM_TARGETS_HIT, 0
jumptocalledmove TRUE
BattleScript_CopycatFail:
ppreduce
@ -1762,8 +1762,6 @@ BattleScript_EffectInstruct::
copybyte gBattlerTarget, gEffectBattler
printstring STRINGID_USEDINSTRUCTEDMOVE
waitmessage B_WAIT_TIME_LONG
setbyte sB_ANIM_TURN, 0
setbyte sB_ANIM_TARGETS_HIT, 0
jumptocalledmove TRUE
BattleScript_EffectAutotomize::
@ -2187,8 +2185,6 @@ BattleScript_EffectMeFirst::
trymefirst BattleScript_FailedFromPpReduce
attackanimation
waitanimation
setbyte sB_ANIM_TURN, 0
setbyte sB_ANIM_TARGETS_HIT, 0
jumptocalledmove TRUE
BattleScript_EffectAttackSpAttackUp::
@ -3657,12 +3653,12 @@ BattleScript_EffectParalyze::
jumpifmovehadnoeffect BattleScript_ButItFailed
jumpifstatus BS_TARGET, STATUS1_PARALYSIS, BattleScript_AlreadyParalyzed
jumpifelectricabilityaffected BS_TARGET, ABILITY_VOLT_ABSORB, BattleScript_VoltAbsorbHeal
clearmoveresultflags MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE
tryparalyzetype BS_ATTACKER, BS_TARGET, BattleScript_NotAffected
jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed
jumpifterrainaffected BS_TARGET, STATUS_FIELD_MISTY_TERRAIN, BattleScript_MistyTerrainPrevents
accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE
jumpifsafeguard BattleScript_SafeguardProtected
clearmoveresultflags MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE
attackanimation
waitanimation
seteffectprimary MOVE_EFFECT_PARALYSIS
@ -3781,6 +3777,7 @@ BattleScript_TwoTurnMovesSecondTurn::
BattleScript_TwoTurnMovesSecondTurnRet:
setbyte sB_ANIM_TURN, 1
setbyte sB_ANIM_TARGETS_HIT, 0
clearstatusfromeffect BS_ATTACKER, MOVE_EFFECT_CHARGING
clearsemiinvulnerablebit @ only for moves with EFFECT_SEMI_INVULNERABLE/EFFECT_SKY_DROP
return
@ -3843,8 +3840,6 @@ BattleScript_EffectMetronome::
pause B_WAIT_TIME_SHORT
attackanimation
waitanimation
setbyte sB_ANIM_TURN, 0
setbyte sB_ANIM_TARGETS_HIT, 0
metronome
BattleScript_EffectLeechSeed::
@ -4051,8 +4046,6 @@ BattleScript_SleepTalkIsAsleep::
BattleScript_SleepTalkUsingMove::
attackanimation
waitanimation
setbyte sB_ANIM_TURN, 0
setbyte sB_ANIM_TARGETS_HIT, 0
jumptocalledmove TRUE
BattleScript_EffectDestinyBond::
@ -4167,11 +4160,15 @@ BattleScript_CurseTrySpeed::
setbyte sB_ANIM_TURN, 1
attackanimation
waitanimation
setbyte sSTAT_ANIM_PLAYED, FALSE
playstatchangeanimation BS_ATTACKER, BIT_SPEED, STAT_CHANGE_NEGATIVE
setstatchanger STAT_SPEED, 1, TRUE
statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CurseTryAttack
printfromtable gStatDownStringIds
waitmessage B_WAIT_TIME_LONG
BattleScript_CurseTryAttack::
setbyte sSTAT_ANIM_PLAYED, FALSE
playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF, 0
setstatchanger STAT_ATK, 1, FALSE
statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CurseTryDefense
printfromtable gStatUpStringIds
@ -5070,8 +5067,6 @@ BattleScript_EffectAssist::
assistattackselect BattleScript_FailedFromPpReduce
attackanimation
waitanimation
setbyte sB_ANIM_TURN, 0
setbyte sB_ANIM_TARGETS_HIT, 0
jumptocalledmove TRUE
BattleScript_EffectIngrain::
@ -5112,6 +5107,7 @@ BattleScript_EffectBrickBreak::
accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE
attackstring
ppreduce
typecalc
removelightscreenreflect
critcalc
damagecalc
@ -8675,8 +8671,6 @@ BattleScript_BattleBondActivatesOnMoveEndAttacker::
BattleScript_DancerActivates::
call BattleScript_AbilityPopUp
waitmessage B_WAIT_TIME_SHORT
setbyte sB_ANIM_TURN, 0
setbyte sB_ANIM_TARGETS_HIT, 0
orword gHitMarker, HITMARKER_ALLOW_NO_PP
jumptocalledmove TRUE

View File

@ -118,7 +118,6 @@ EventScript_FollowerSwap:
return
EventScript_FollowerMoveNorth:
applymovement OBJ_EVENT_ID_FOLLOWER, Movement_WalkUp
applymovement OBJ_EVENT_ID_PLAYER, Movement_WalkDown
waitmovement 0
applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_FaceUp
@ -126,7 +125,6 @@ EventScript_FollowerMoveNorth:
return
EventScript_FollowerMoveEast:
applymovement OBJ_EVENT_ID_FOLLOWER, Movement_WalkRight
applymovement OBJ_EVENT_ID_PLAYER, Movement_WalkLeft
waitmovement 0
applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_FaceRight
@ -134,7 +132,6 @@ EventScript_FollowerMoveEast:
return
EventScript_FollowerMoveSouth:
applymovement OBJ_EVENT_ID_FOLLOWER, Movement_WalkDown
applymovement OBJ_EVENT_ID_PLAYER, Movement_WalkUp
waitmovement 0
applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_FaceDown
@ -142,7 +139,6 @@ EventScript_FollowerMoveSouth:
return
EventScript_FollowerMoveWest:
applymovement OBJ_EVENT_ID_FOLLOWER, Movement_WalkLeft
applymovement OBJ_EVENT_ID_PLAYER, Movement_WalkRight
waitmovement 0
applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_FaceLeft

View File

@ -33,7 +33,8 @@ EventScript_PkmnCenterNurse_IllTakeYourPkmn2::
return
EventScript_PkmnCenterNurse_TakeAndHealPkmn::
applymovement VAR_0x800B, Movement_PkmnCenterNurse_Turn @ Changed from Common_Movement_WalkInPlaceFasterLeft to force the follower to enter their Poké Ball
hidefollower 0
applymovement VAR_0x800B, Movement_PkmnCenterNurse_Turn
waitmovement 0
dofieldeffect FLDEFF_POKECENTER_HEAL
.if OW_UNION_DISABLE_CHECK == FALSE && OW_FLAG_MOVE_UNION_ROOM_CHECK != 0

View File

@ -8,11 +8,13 @@ Std_MsgboxNPC:
return
Std_MsgboxSign:
setflag FLAG_SAFE_FOLLOWER_MOVEMENT
lockall
message NULL
waitmessage
waitbuttonpress
releaseall
clearflag FLAG_SAFE_FOLLOWER_MOVEMENT
return
Std_MsgboxDefault:

View File

@ -20,7 +20,10 @@
- [How to use the Testing System](tutorials/how_to_testing_system.md)
- [How to add new Trainer Slides](tutorials/how_to_new_trainer_slide.md)
- [Changelog](./CHANGELOG.md)
- [1.11.x]()
- [Version 1.11.0](changelogs/1.11.x/1.11.0.md)
- [1.10.x]()
- [Version 1.10.3](changelogs/1.10.x/1.10.3.md)
- [Version 1.10.2](changelogs/1.10.x/1.10.2.md)
- [Version 1.10.1](changelogs/1.10.x/1.10.1.md)
- [Version 1.10.0](changelogs/1.10.x/1.10.0.md)

View File

@ -0,0 +1,120 @@
```md
## How to update
- If you haven't set up a remote, run the command `git remote add RHH https://github.com/rh-hideout/pokeemerald-expansion`.
- Once you have your remote set up, run the command `git pull RHH test
`.
```
## 🧬 General 🧬
### Fixed
* Fix Using a Safari Ball crashes the game #6206 by @ExMingYan in [#6220](https://github.com/rh-hideout/pokeemerald-expansion/pull/6220)
* Try a new solution to Fix Safari #6206 by @ExMingYan in [#6228](https://github.com/rh-hideout/pokeemerald-expansion/pull/6228)
* Remove obsolete check for steven when retrieving partner name by @u8-Salem and @hedara90 in [#6283](https://github.com/rh-hideout/pokeemerald-expansion/pull/6283)
* Fix spit up getting skipped by @cawtds in [#6295](https://github.com/rh-hideout/pokeemerald-expansion/pull/6295)
## 🗺️ Overworld 🗺️
### Changed
* Merrp merge (12th of February) by @hedara90 in [#6244](https://github.com/rh-hideout/pokeemerald-expansion/pull/6244)
### Fixed
* Follower Object Event refactor by @hedara90 and @AsparagusEduardo in [#6129](https://github.com/rh-hideout/pokeemerald-expansion/pull/6129)
- Adds `OBJ_EVENT_GFX_SPECIES_FEMALE` and `OBJ_EVENT_GFX_SPECIES_SHINY_FEMALE`
* Fixed Kecleon Shiny palette by @hedara90 in [#6298](https://github.com/rh-hideout/pokeemerald-expansion/pull/6298)
* Shifted the follower graphicsIds by @hedara90 in [#6329](https://github.com/rh-hideout/pokeemerald-expansion/pull/6329)
## 🐉 Pokémon 🐉
### Changed
* Add Poltchageist family form data by @Bassoonian and @wiz1989 in [#6163](https://github.com/rh-hideout/pokeemerald-expansion/pull/6163)
### Fixed
* Fixed non-regional forms breeding incorrectly by @AsparagusEduardo and @cawtds in [#4985](https://github.com/rh-hideout/pokeemerald-expansion/pull/4985)
* Fixed compilation error when turning P_GENDER_DIFFERENCES off by @AsparagusEduardo in [#6223](https://github.com/rh-hideout/pokeemerald-expansion/pull/6223)
## ⚔️ Battle General ⚔️
### Fixed
* Fixes battler mutation during the intim script by @AlexOn1ine in [#6151](https://github.com/rh-hideout/pokeemerald-expansion/pull/6151)
* Fixes Dynamic Moves types in SumScreen while in Battle by @AlexOn1ine in [#6145](https://github.com/rh-hideout/pokeemerald-expansion/pull/6145)
* Fixes Dragon Tail missing timing against Rocky Helmet / Iron Barbs by @AlexOn1ine in [#6154](https://github.com/rh-hideout/pokeemerald-expansion/pull/6154)
* Prevent sameMoveTurns from incrementing when unable to use move by @moostoet in [#6167](https://github.com/rh-hideout/pokeemerald-expansion/pull/6167)
* Fixes Suction Cups ability popup and Red Card + Guard Dog interaction by @PhallenTree in [#6171](https://github.com/rh-hideout/pokeemerald-expansion/pull/6171)
* Fixed Unnerve message and wrote tests by @hedara90 in [#6192](https://github.com/rh-hideout/pokeemerald-expansion/pull/6192)
* Fixes Spectral Thief stealing boost at the wrong time by @AlexOn1ine in [#6197](https://github.com/rh-hideout/pokeemerald-expansion/pull/6197)
* Fixes BATTLER_TURN_DAMAGED battler id by @AlexOn1ine in [#6236](https://github.com/rh-hideout/pokeemerald-expansion/pull/6236)
* Fixed multi battle forced switches by @hedara90 in [#6243](https://github.com/rh-hideout/pokeemerald-expansion/pull/6243)
* Fixes ability Embody Aspect triggering multiple times by @AlexOn1ine in [#6259](https://github.com/rh-hideout/pokeemerald-expansion/pull/6259)
* Fixes Called moves ignoring redirection by @PhallenTree in [#6267](https://github.com/rh-hideout/pokeemerald-expansion/pull/6267)
* Fixes Protean not restoring types after ai damage calcs by @AlexOn1ine in [#6280](https://github.com/rh-hideout/pokeemerald-expansion/pull/6280)
* Restoretarget in Rototiller script + Tests by @AlexOn1ine in [#6296](https://github.com/rh-hideout/pokeemerald-expansion/pull/6296)
* Fixes Brick Break/Psychic Fangs/Raging Bull breaking screens if target is immune by @PhallenTree in [#6308](https://github.com/rh-hideout/pokeemerald-expansion/pull/6308)
* Fixes intimidate missing timing during a mega evo / switch by @AlexOn1ine in [#6322](https://github.com/rh-hideout/pokeemerald-expansion/pull/6322)
* Fixes Coaching on semi-invulnerable ally, Air Balloon being stolen, Immunity abilities being ignored by Mold Breaker by @PhallenTree in [#6327](https://github.com/rh-hideout/pokeemerald-expansion/pull/6327)
* Fixes effect paralyze not being absorbed by absorbing abilities by @AlexOn1ine in [#6338](https://github.com/rh-hideout/pokeemerald-expansion/pull/6338)
* Added MOVE_TARGET_OPPONENT and added it to Me First, by @hedara90 in [#6336](https://github.com/rh-hideout/pokeemerald-expansion/pull/6336)
* Fixes recoil moves causing recoil when absorbed by @AlexOn1ine in [#6341](https://github.com/rh-hideout/pokeemerald-expansion/pull/6341)
* Fixed protect not resetting the counter in earlier gens by @hedara90 in [#6342](https://github.com/rh-hideout/pokeemerald-expansion/pull/6342)
## 🤹 Moves 🤹
### Added
* Added missing in-battle "Move Info" button prompt by @AsparagusEduardo and @TeamAquasHideout from who I got the source from and @BelialClover from who Archie got the source from. in [#6155](https://github.com/rh-hideout/pokeemerald-expansion/pull/6155)
### Changed
* Fixes non-Ghost type Curse animation by @PhallenTree in [#6299](https://github.com/rh-hideout/pokeemerald-expansion/pull/6299)
### Fixed
* Fixed Future Sight not being affected by Electrify by @AsparagusEduardo in [#6213](https://github.com/rh-hideout/pokeemerald-expansion/pull/6213)
* Fixes Expanding Force and Spectral Thief move animations by @PhallenTree in [#6185](https://github.com/rh-hideout/pokeemerald-expansion/pull/6185)
## 🧶 Items 🧶
### Fixed
* Fixed curing status2 with items in double battles by @hedara90 and @wiz1989 in [#6335](https://github.com/rh-hideout/pokeemerald-expansion/pull/6335)
## 🤖 Battle AI 🤖
### Fixed
* Fix AI wrongly thinking it strikes first with priority even if player is using priority themselves by @moostoet in [#6274](https://github.com/rh-hideout/pokeemerald-expansion/pull/6274)
* Big Root AI Fix by @Pawkkie in [#6309](https://github.com/rh-hideout/pokeemerald-expansion/pull/6309)
* Fix AI hold effect considerations by @Pawkkie in [#6310](https://github.com/rh-hideout/pokeemerald-expansion/pull/6310)
* fix for multi 2vs1 opponent sends out too many mons bug by @Bivurnum in [#6324](https://github.com/rh-hideout/pokeemerald-expansion/pull/6324)
## 🧹 Other Cleanup 🧹
* Cleanup some global battler ID usage by @ghoulslash in [#6181](https://github.com/rh-hideout/pokeemerald-expansion/pull/6181)
* Fix typo in Nuzzle's description by @Bassoonian in [#6209](https://github.com/rh-hideout/pokeemerald-expansion/pull/6209)
* Remove whitespace from trainers data file by @AsparagusEduardo in [#6234](https://github.com/rh-hideout/pokeemerald-expansion/pull/6234)
* Changed bit order for follower graphicsId creation by @hedara90 in [#6249](https://github.com/rh-hideout/pokeemerald-expansion/pull/6249)
* Use more accurate count in MovesInfo by @AlexOn1ine in [#6260](https://github.com/rh-hideout/pokeemerald-expansion/pull/6260)
* Fix Extra `task->tState++` and `break` in `Task_DrawFieldMessageBox` by @Deokishisu in [#6261](https://github.com/rh-hideout/pokeemerald-expansion/pull/6261)
* Resized gimmick indicators to reduce VRAM usage by @hedara90 in [#6319](https://github.com/rh-hideout/pokeemerald-expansion/pull/6319)
## 🧪 Test Runner 🧪
### Changed
* Tests for Big Pecks by @hedara90 in [#6158](https://github.com/rh-hideout/pokeemerald-expansion/pull/6158)
* Water Compaction tests by @hedara90 in [#6159](https://github.com/rh-hideout/pokeemerald-expansion/pull/6159)
* Wrote tests for Electrify by @hedara90 in [#6179](https://github.com/rh-hideout/pokeemerald-expansion/pull/6179)
* Sheer Force Test Fixes by @ghoulslash in [#6198](https://github.com/rh-hideout/pokeemerald-expansion/pull/6198)
* Minor Terrain Seed Test Improvement by @ghoulslash in [#6207](https://github.com/rh-hideout/pokeemerald-expansion/pull/6207)
* Added test support for 5 battle configs by @AsparagusEduardo in [#5914](https://github.com/rh-hideout/pokeemerald-expansion/pull/5914)
* Added missing Dream Eater and Reflect Type tests by @AsparagusEduardo in [#6245](https://github.com/rh-hideout/pokeemerald-expansion/pull/6245)
### Fixed
* Fixes Brick Break/Psychic Fangs/Raging Bull breaking screens if target is immune by @PhallenTree in [#6308](https://github.com/rh-hideout/pokeemerald-expansion/pull/6308)
## 📚 Documentation 📚
* Update how_to_testing_system.md by @hedara90 in [#6281](https://github.com/rh-hideout/pokeemerald-expansion/pull/6281)
* Update SCOPE.md with Intergenerational Feature Compatibility by @Pawkkie in [#6325](https://github.com/rh-hideout/pokeemerald-expansion/pull/6325)
## 📦 Branch Synchronisation 📦
### pret
* 11th of February in [#6231](https://github.com/rh-hideout/pokeemerald-expansion/pull/6231)
* Replace easy_chat alphabetialOrder magic numbers with EC_INDEX values by @rayrobdod in [pret#2096](https://github.com/pret/pokeemerald/pull/2096)
* Fixed switchout bug in multibattle where order of mons gets messed up by @shachar700 in [pret#2099](https://github.com/pret/pokeemerald/pull/2099)
## New Contributors
* @ExMingYan made their first contribution in [#6220](https://github.com/rh-hideout/pokeemerald-expansion/pull/6220)
* @Deokishisu made their first contribution in [#6261](https://github.com/rh-hideout/pokeemerald-expansion/pull/6261)
* @Bivurnum made their first contribution in [#6324](https://github.com/rh-hideout/pokeemerald-expansion/pull/6324)
**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.10.2...test
<!--Last PR: 6342-->
<!--Used to keep track of the last PR merged in case new ones come in before the changelog is done.-->

View File

@ -0,0 +1,385 @@
```md
## How to update
- If you haven't set up a remote, run the command `git remote add RHH https://github.com/rh-hideout/pokeemerald-expansion`.
- Once you have your remote set up, run the command `git pull RHH test
`.
```
## 🌋 *REFACTORS* 🌋
📜 = Uses a migration script.
* Pursuit refactor by @PhallenTree in [#5707](https://github.com/rh-hideout/pokeemerald-expansion/pull/5707)
* Atk Canceller refactor / reorder / clean up by @AlexOn1ine in [#5885](https://github.com/rh-hideout/pokeemerald-expansion/pull/5885)
* Battle Weather Refactor by @AlexOn1ine in [#5833](https://github.com/rh-hideout/pokeemerald-expansion/pull/5833)
* Replace WEATHER_HAS_EFFECT with HasWeatherEffect by @AlexOn1ine in [#6069](https://github.com/rh-hideout/pokeemerald-expansion/pull/6069)
* Cleaned up Trainer Slides, added automated Trainer Slide tests, add new Enemy Critical Hit Slide by @pkmnsnfrn and @AlexOn1ine, @hedara90, @AsparagusEduardo, @mrgriffin in [#6018](https://github.com/rh-hideout/pokeemerald-expansion/pull/6018)
* If users created new entries in sTrainerSlides, they will need to be ported to the new system.
* Introduces BattleTurnCounter to simplify timer checks by @AlexOn1ine in [#6080](https://github.com/rh-hideout/pokeemerald-expansion/pull/6080)
* Convert max effects to normal move effects by @AlexOn1ine in [#6143](https://github.com/rh-hideout/pokeemerald-expansion/pull/6143)
* Redefine IsBattlerAlive in battle.h as a static inline by @AlexOn1ine in [#6211](https://github.com/rh-hideout/pokeemerald-expansion/pull/6211)
* Consolidated Frontier teams into battle_frontier_trainers.h by @fdeblasio in [#5892](https://github.com/rh-hideout/pokeemerald-expansion/pull/5892)
## 🧬 General 🧬
### Added
* Add Script Cmd for Forcing Save Game by @ghoulslash in [#6090](https://github.com/rh-hideout/pokeemerald-expansion/pull/6090)
* Trainer Party Pools by @hedara90 in [#5731](https://github.com/rh-hideout/pokeemerald-expansion/pull/5731)
- Documentation on how to use this can be found under `docs/tutorials/how_to_trainer_party_pool.md`
* Add Code Entry functionality by @Pawkkie and @PCG06 for the Mystery Gift iteration in [#5951](https://github.com/rh-hideout/pokeemerald-expansion/pull/5951)
### Changed
* Added "Game Clear" flag toggle to debug menu by @AsparagusEduardo in [#5929](https://github.com/rh-hideout/pokeemerald-expansion/pull/5929)
* Initialize m4a and IRQ handler in a loaded section by @SBird1337 in [#5912](https://github.com/rh-hideout/pokeemerald-expansion/pull/5912)
* Debug menu and `createmon` additions/cleanup by @AsparagusEduardo in [#5994](https://github.com/rh-hideout/pokeemerald-expansion/pull/5994)
- Added Tera Type, Dynamax Level, and Gigantamax Factor to the "Give Pokémon (complex)" debug menu option.
- Added `dmaxLevel` option to `givemon` and `createmon`.
- Added `WEATHER_COUNT`.
- Cleaned up repeated code instances in debug menu.
- Fixed mislabel of `ggMaxFactor` in `givemon` and `createmon`. Now it's `gmaxFactor`.
* Introduces BattlerState struct for the Battle Engine by @AlexOn1ine and @mrgriffin provided the framework for this change in [#5954](https://github.com/rh-hideout/pokeemerald-expansion/pull/5954)
* Reorder Makefile rules so that pokeemerald-test.elf builds in build/test by @mrgriffin in [#6004](https://github.com/rh-hideout/pokeemerald-expansion/pull/6004)
* Use SET8 and SET32 consistently by @AZero13 in [#5544](https://github.com/rh-hideout/pokeemerald-expansion/pull/5544)
* Ewram and unused function cleanup sweep by @hedara90 in [#6019](https://github.com/rh-hideout/pokeemerald-expansion/pull/6019)
* Re-removed trainers.h trailing whitespace by @fdeblasio in [#6048](https://github.com/rh-hideout/pokeemerald-expansion/pull/6048)
* Add Steven Multi to debug menu by @Pawkkie in [#6064](https://github.com/rh-hideout/pokeemerald-expansion/pull/6064)
* Remove gDecompressionBuffer by @DizzyEggg in [#6029](https://github.com/rh-hideout/pokeemerald-expansion/pull/6029)
* Trainer Battle Parameter Consolidation by @u8-Salem in [#5982](https://github.com/rh-hideout/pokeemerald-expansion/pull/5982)
Breaking: raw uses of `trainerbattle` need to be adjusted to provide all possible parameter. Unused parameter musst be 0 or an alias. already parameterized macros like `trainerbattle_single` work out of the box.
* Consolidated contest opponent filters into gContestOpponents by @fdeblasio in [#6119](https://github.com/rh-hideout/pokeemerald-expansion/pull/6119)
* Don't use SeedRng some places where it isn't necessary by @tertu-m in [#6156](https://github.com/rh-hideout/pokeemerald-expansion/pull/6156)
* Removed Trainer Slides footgun by @AsparagusEduardo in [#6205](https://github.com/rh-hideout/pokeemerald-expansion/pull/6205)
* Consolidate duplicate dialogue of nature girl in Battle Frontier by @fdeblasio in [#6195](https://github.com/rh-hideout/pokeemerald-expansion/pull/6195)
* Prevented fanfares from playing in headless mode by @pkmnsnfrn and @hedara90, @AsparagusEduardo in [#6219](https://github.com/rh-hideout/pokeemerald-expansion/pull/6219)
### Fixed
* Don't write to NULL in TryFindHiddenPokemon by @DizzyEggg in [#5983](https://github.com/rh-hideout/pokeemerald-expansion/pull/5983)
* Allow Party Menu with 0 Pokemon by @DizzyEggg in [#5997](https://github.com/rh-hideout/pokeemerald-expansion/pull/5997)
* Revert map related enum conversion by @hedara90 in [#6078](https://github.com/rh-hideout/pokeemerald-expansion/pull/6078)
* Revert "Revert map related enum conversion" by @hedara90 in [#6079](https://github.com/rh-hideout/pokeemerald-expansion/pull/6079)
* Revert "Converts a bunch of defines to enums" by @Bassoonian in [#6082](https://github.com/rh-hideout/pokeemerald-expansion/pull/6082)
* Fix upcoming not working on no cash by @DizzyEggg in [#6121](https://github.com/rh-hideout/pokeemerald-expansion/pull/6121)
* Add the header required for TPP tags to work by @hedara90 in [#6162](https://github.com/rh-hideout/pokeemerald-expansion/pull/6162)
* Fixed regression from master/upcoming merge by @AsparagusEduardo and @hedara90 , for doing the original merge when I couldn't in [#6199](https://github.com/rh-hideout/pokeemerald-expansion/pull/6199)
* Fix Using a Safari Ball crashes the game #6206 by @ExMingYan in [#6220](https://github.com/rh-hideout/pokeemerald-expansion/pull/6220)
* Fixed typo in requests_effects by @hedara90 and @purrfectdoodle in [#6215](https://github.com/rh-hideout/pokeemerald-expansion/pull/6215)
* Try a new solution to Fix Safari #6206 by @ExMingYan in [#6228](https://github.com/rh-hideout/pokeemerald-expansion/pull/6228)
* Remove obsolete check for steven when retrieving partner name by @u8-Salem and @hedara90 in [#6283](https://github.com/rh-hideout/pokeemerald-expansion/pull/6283)
* Fix spit up getting skipped by @cawtds in [#6295](https://github.com/rh-hideout/pokeemerald-expansion/pull/6295)
## 🗺️ Overworld 🗺️
### Added
* Adds Dexnav by @ghoulslash in [#4818](https://github.com/rh-hideout/pokeemerald-expansion/pull/4818)
* Fly from Pokenav by @khbsd in [#5679](https://github.com/rh-hideout/pokeemerald-expansion/pull/5679)
* Expanded Pokémon Follower transformation functionality by @AsparagusEduardo in [#5048](https://github.com/rh-hideout/pokeemerald-expansion/pull/5048)
### Changed
* Arbitrary trainer scripts + on frame/trigger softlock prevention by @mrgriffin in [#5033](https://github.com/rh-hideout/pokeemerald-expansion/pull/5033)
* Removed OW_AUTO_SIGNPOST by @pkmnsnfrn in [#5974](https://github.com/rh-hideout/pokeemerald-expansion/pull/5974)
* Fix leftover test change from #5033 by @mrgriffin in [#5987](https://github.com/rh-hideout/pokeemerald-expansion/pull/5987)
* Match current gen behavior for battle environment after fishing by @kittenchilly in [#6099](https://github.com/rh-hideout/pokeemerald-expansion/pull/6099)
* Add Mega Evolution, Primal Reversion, and Ultra Necrozma overworld sprites by @khbsd in [#5874](https://github.com/rh-hideout/pokeemerald-expansion/pull/5874)
* Replaced hardcoded numbers in DexNav with variables by @fdeblasio in [#6241](https://github.com/rh-hideout/pokeemerald-expansion/pull/6241)
* Merrp merge (12th of February) by @hedara90 in [#6244](https://github.com/rh-hideout/pokeemerald-expansion/pull/6244)
* Adds a follower flag define to disable followers on the fly by @AlexOn1ine in [#6174](https://github.com/rh-hideout/pokeemerald-expansion/pull/6174)
### Fixed
* Fix Trainer Hill OOB array access by @SBird1337 in [#5930](https://github.com/rh-hideout/pokeemerald-expansion/pull/5930)
* Revert #5033 change to MapHeaderRunScriptType by @mrgriffin in [#5975](https://github.com/rh-hideout/pokeemerald-expansion/pull/5975)
* Restore lock/lockall/locktrainer/release/releaseall in triggers by @mrgriffin in [#5976](https://github.com/rh-hideout/pokeemerald-expansion/pull/5976)
* Follower Object Event refactor by @hedara90 and @AsparagusEduardo in [#6129](https://github.com/rh-hideout/pokeemerald-expansion/pull/6129)
- Fixes `OBJ_EVENT_GFX_SPECIES_SHINY`
- Adds `OBJ_EVENT_GFX_SPECIES_FEMALE` and `OBJ_EVENT_GFX_SPECIES_SHINY_FEMALE`
* Fixes Static Assert from pr #6174 by @AlexOn1ine in [#6258](https://github.com/rh-hideout/pokeemerald-expansion/pull/6258)
* Fixed Kecleon Shiny palette by @hedara90 in [#6298](https://github.com/rh-hideout/pokeemerald-expansion/pull/6298)
## 🐉 Pokémon 🐉
### Added
* IV/EV Info on Summary Screen by @khbsd in [#6027](https://github.com/rh-hideout/pokeemerald-expansion/pull/6027)
* Add caught mon to full party by sending a different mon to the Box by @fakuzatsu in [#6058](https://github.com/rh-hideout/pokeemerald-expansion/pull/6058)
### Changed
* Remove form change function footguns by @AsparagusEduardo and @AlexOn1ine for letting me know of this potential issue. in [#5995](https://github.com/rh-hideout/pokeemerald-expansion/pull/5995)
- `GetBattleFormChangeTargetSpecies`, `GetFormChangeTargetSpecies` and `GetFormChangeTargetSpeciesBoxMon` now return the current species of the Pokémon instead of `SPECIES_NONE` as a precaution to avoid accidental deletions of Pokémon when using these functions.
* Remove redundant calls to GetMonData in pokemon.c by @AZero13 in [#5545](https://github.com/rh-hideout/pokeemerald-expansion/pull/5545)
* Rename Furfrou Species tags to match Pokemon Showdown exports by @moostoet in [#6041](https://github.com/rh-hideout/pokeemerald-expansion/pull/6041)
* Add Mega Evolution, Primal Reversion, and Ultra Necrozma overworld sprites by @khbsd in [#5874](https://github.com/rh-hideout/pokeemerald-expansion/pull/5874)
* Add Poltchageist family form data by @Bassoonian and @wiz1989 in [#6163](https://github.com/rh-hideout/pokeemerald-expansion/pull/6163)
### Fixed
* Evolution level 1 learn by @hedara90 in [#5791](https://github.com/rh-hideout/pokeemerald-expansion/pull/5791)
* Fixed non-regional forms breeding incorrectly by @AsparagusEduardo and @cawtds in [#4985](https://github.com/rh-hideout/pokeemerald-expansion/pull/4985)
* Fixed compilation error when turning P_GENDER_DIFFERENCES off by @AsparagusEduardo in [#6223](https://github.com/rh-hideout/pokeemerald-expansion/pull/6223)
* Reverted compound literal OW mon pic tables by @AsparagusEduardo in [#6216](https://github.com/rh-hideout/pokeemerald-expansion/pull/6216)
## ⚔️ Battle General ⚔️
### Added
* Add B_FLAG_SLEEP_CLAUSE by @Pawkkie, @Pawkkie and @iriv24 in [#5566](https://github.com/rh-hideout/pokeemerald-expansion/pull/5566)
- Based on Smogon's sleep clause [philosophy](https://www.smogon.com/xy/articles/clauses#:~:text=Sleep%20Clause,t%20be%20put%20to%20sleep.)
- Toggleable per-battle by setting / unsetting the flag assigned to B_FLAG_SLEEP_CLAUSE
* Variadic IS_BATTLER_OF_TYPE and GetBattlerTypes by @mrgriffin in [#5708](https://github.com/rh-hideout/pokeemerald-expansion/pull/5708)
* Simultaneous HP Reduction (CFRU Port) by @AsparagusEduardo and @AlexOn1ine for the port to expansion. @Skeli789 for the CFRU implementation. in [#5770](https://github.com/rh-hideout/pokeemerald-expansion/pull/5770)
* Destiny Bond fails on repeated use in Gen 7+ by @Pawkkie in [#5652](https://github.com/rh-hideout/pokeemerald-expansion/pull/5652)
* Adds Pledge Side Statuses as Starting Statuses by @AlexOn1ine in [#5899](https://github.com/rh-hideout/pokeemerald-expansion/pull/5899)
* Adds B_VAR_DIFFICULTY and related functions READ DESC by @pkmnsnfrn in [#5337](https://github.com/rh-hideout/pokeemerald-expansion/pull/5337)
* Config for move slot rearrangement in battle by @hedara90 and @ghoulslash for pointing out the exact point in the code where move slot rearrangement is handled. in [#6017](https://github.com/rh-hideout/pokeemerald-expansion/pull/6017)
- Move slot rearrangement is disabled by default in battle, set `B_MOVE_REARRANGEMENT_IN_BATTLE` to `GEN_3` to enable rearrangement again.
### Changed
* Sleep Clause global config by @Pawkkie in [#5762](https://github.com/rh-hideout/pokeemerald-expansion/pull/5762)
* Pursuit refactor by @PhallenTree in [#5707](https://github.com/rh-hideout/pokeemerald-expansion/pull/5707)
* Changes Various defines to an Enum by @AlexOn1ine in [#5839](https://github.com/rh-hideout/pokeemerald-expansion/pull/5839)
* move overwrittenAbilities field to DisableStruct by @ghoulslash in [#5946](https://github.com/rh-hideout/pokeemerald-expansion/pull/5946)
* Battle Weather Refactor by @AlexOn1ine in [#5833](https://github.com/rh-hideout/pokeemerald-expansion/pull/5833)
* Easy customizable Hidden Move types by @AsparagusEduardo in [#5872](https://github.com/rh-hideout/pokeemerald-expansion/pull/5872)
- `gTypesInfo` now has a `isHiddenPowerType` field that inserts them into the Hidden Power type calculation.
- ***Warning:*** Changing this from the vanilla settings will change any existing Hidden Power's type, and external calculators will not work either.
* Introduces BattlerState struct for the Battle Engine by @AlexOn1ine and @mrgriffin provided the framework for this change in [#5954](https://github.com/rh-hideout/pokeemerald-expansion/pull/5954)
* Cleaned up Trainer Slides, added automated Trainer Slide tests, add new Enemy Critical Hit Slide by @pkmnsnfrn and @AlexOn1ine, @hedara90, @AsparagusEduardo, @mrgriffin in [#6018](https://github.com/rh-hideout/pokeemerald-expansion/pull/6018)
* If users created new entries in sTrainerSlides, they will need to be ported to the new system.
* Introduces BattleTurnCounter to simplfy timer checks by @AlexOn1ine in [#6080](https://github.com/rh-hideout/pokeemerald-expansion/pull/6080)
* Replace BattleStruct members quickClawRandom/quickDrawRandom with locals by @AlexOn1ine in [#6136](https://github.com/rh-hideout/pokeemerald-expansion/pull/6136)
* Added Difficulty Fallback for Trainer Slides by @pkmnsnfrn in [#6088](https://github.com/rh-hideout/pokeemerald-expansion/pull/6088)
* CanAbilityX Function Cleanup by @ghoulslash in [#6183](https://github.com/rh-hideout/pokeemerald-expansion/pull/6183)
* Unify setreflect/setlightscreen and MOVE_EFFECT_REFLECT/LIGHT_SCREEN by @ghoulslash in [#6196](https://github.com/rh-hideout/pokeemerald-expansion/pull/6196)
### Fixed
* Fix Sleep Clause AI handling of partner sleeping moves by @Pawkkie in [#5761](https://github.com/rh-hideout/pokeemerald-expansion/pull/5761)
* Fix fixed point damage calculation off-by-1s by @SBird1337 in [#5775](https://github.com/rh-hideout/pokeemerald-expansion/pull/5775)
Fixes a bunch of rounding errors that cause wrong outputs in the damage calculation.
* Fixes simu hp reduction when no partner was on field by @AlexOn1ine in [#5799](https://github.com/rh-hideout/pokeemerald-expansion/pull/5799)
* Fixes Regenerator healing past maxHP by @PhallenTree in [#5861](https://github.com/rh-hideout/pokeemerald-expansion/pull/5861)
* Fixes Pursuit + Emergency Exit causing double switches and Pursuit user fainting causing target to not finish switch by @PhallenTree in [#5849](https://github.com/rh-hideout/pokeemerald-expansion/pull/5849)
* Fixes regression caused by argument refactor by @AlexOn1ine in [#5870](https://github.com/rh-hideout/pokeemerald-expansion/pull/5870)
* Fixes Sparkling Aria Shield Dust / Covert Cloak interaction by @AlexOn1ine in [#5911](https://github.com/rh-hideout/pokeemerald-expansion/pull/5911)
* Battle Weather Refactor oversight by @AlexOn1ine in [#5960](https://github.com/rh-hideout/pokeemerald-expansion/pull/5960)
* Shell Bell Clean up / Simplification and Tests by @AlexOn1ine in [#5924](https://github.com/rh-hideout/pokeemerald-expansion/pull/5924)
* Dynamic move type was ignored in doubles for spread moves by @AlexOn1ine in [#5984](https://github.com/rh-hideout/pokeemerald-expansion/pull/5984)
* Fixes self effect moves not procing for spread moves when battler 3 w… by @AlexOn1ine in [#6020](https://github.com/rh-hideout/pokeemerald-expansion/pull/6020)
* Fix UB when accessing move result flags by @cawtds in [#6030](https://github.com/rh-hideout/pokeemerald-expansion/pull/6030)
* Fix Powder (status) config and some terrain timers not using gBattleTurnCounter by @PhallenTree in [#6109](https://github.com/rh-hideout/pokeemerald-expansion/pull/6109)
* Fix Powder config not checking for Powder status by @PhallenTree in [#6113](https://github.com/rh-hideout/pokeemerald-expansion/pull/6113)
* Fixes battler mutation during the intim script by @AlexOn1ine in [#6151](https://github.com/rh-hideout/pokeemerald-expansion/pull/6151)
* Fixes Dynamic Moves types in SumScreen while in Battle by @AlexOn1ine in [#6145](https://github.com/rh-hideout/pokeemerald-expansion/pull/6145)
* Fixes Dragon Tail missing timing against Rocky Helmet / Iron Barbs by @AlexOn1ine in [#6154](https://github.com/rh-hideout/pokeemerald-expansion/pull/6154)
* Prevent sameMoveTurns from incrementing when unable to use move by @moostoet in [#6167](https://github.com/rh-hideout/pokeemerald-expansion/pull/6167)
* Fixes Suction Cups ability popup and Red Card + Guard Dog interaction by @PhallenTree in [#6171](https://github.com/rh-hideout/pokeemerald-expansion/pull/6171)
* Fixed Unnerve message and wrote tests by @hedara90 in [#6192](https://github.com/rh-hideout/pokeemerald-expansion/pull/6192)
* Fixes Spectral Thief stealing boost at the wrong time by @AlexOn1ine in [#6197](https://github.com/rh-hideout/pokeemerald-expansion/pull/6197)
* Fixes BATTLER_TURN_DAMAGED battler id by @AlexOn1ine in [#6236](https://github.com/rh-hideout/pokeemerald-expansion/pull/6236)
* Fixed multi battle forced switches by @hedara90 in [#6243](https://github.com/rh-hideout/pokeemerald-expansion/pull/6243)
* Fixes ability Embody Aspect triggering multiple times by @AlexOn1ine in [#6259](https://github.com/rh-hideout/pokeemerald-expansion/pull/6259)
* Fixes Called moves ignoring redirection by @PhallenTree in [#6267](https://github.com/rh-hideout/pokeemerald-expansion/pull/6267)
* Fixes Protean not restoring types after ai damage calcs by @AlexOn1ine in [#6280](https://github.com/rh-hideout/pokeemerald-expansion/pull/6280)
* Restoretarget in Rototiller script + Tests by @AlexOn1ine in [#6296](https://github.com/rh-hideout/pokeemerald-expansion/pull/6296)
* Fixes inconsistency for Kings rock. by @AlexOn1ine in [#6302](https://github.com/rh-hideout/pokeemerald-expansion/pull/6302)
* Fixes Shell Bell for Spread Moves by @AlexOn1ine in [#6303](https://github.com/rh-hideout/pokeemerald-expansion/pull/6303)
* Fixes Brick Break/Psychic Fangs/Raging Bull breaking screens if target is immune by @PhallenTree in [#6308](https://github.com/rh-hideout/pokeemerald-expansion/pull/6308)
* Fixes doesnt effect message for Thunder Wave by @AlexOn1ine in [#6304](https://github.com/rh-hideout/pokeemerald-expansion/pull/6304)
* Fixes Tera Shell activating on moves that have no effect on target by @AlexOn1ine in [#6271](https://github.com/rh-hideout/pokeemerald-expansion/pull/6271)
* Fixes fainted battler being able to select an action by @PhallenTree in [#6339](https://github.com/rh-hideout/pokeemerald-expansion/pull/6339)
## 🤹 Moves 🤹
### Added
* Added missing in-battle "Move Info" button prompt by @AsparagusEduardo and @TeamAquasHideout from who I got the source from and @BelialClover from who Archie got the source from. in [#6155](https://github.com/rh-hideout/pokeemerald-expansion/pull/6155)
### Changed
* New Volt Switch Animation by @AlexOn1ine in [#5729](https://github.com/rh-hideout/pokeemerald-expansion/pull/5729)
* Refactors argument into a union by @AlexOn1ine in [#5853](https://github.com/rh-hideout/pokeemerald-expansion/pull/5853)
* Encapsulate move data by @AsparagusEduardo in [#5852](https://github.com/rh-hideout/pokeemerald-expansion/pull/5852)
* Removes Resource Flags and moves fields to DisableStruct by @AlexOn1ine in [#5945](https://github.com/rh-hideout/pokeemerald-expansion/pull/5945)
* Tera starstorm by @hedara90 in [#6073](https://github.com/rh-hideout/pokeemerald-expansion/pull/6073)
* Tachyon Cutter and Salt Cure animations by @hedara90 in [#6182](https://github.com/rh-hideout/pokeemerald-expansion/pull/6182)
* Heal Bell/Aromatherapy/Sparkly Swirl improvements and fixes by @AsparagusEduardo in [#6210](https://github.com/rh-hideout/pokeemerald-expansion/pull/6210)
- Removed `EFFECT_SPARKLY_SWIRL` in favor of `MOVE_EFFECT_AROMATHEROPY`.
* Moved sValidApprenticeMove into gMovesInfo by @fdeblasio in [#6254](https://github.com/rh-hideout/pokeemerald-expansion/pull/6254)
* Fixes non-Ghost type Curse animation by @PhallenTree in [#6299](https://github.com/rh-hideout/pokeemerald-expansion/pull/6299)
* Remove pursuitSwitchByMove and additional if statement by @PhallenTree in [#6326](https://github.com/rh-hideout/pokeemerald-expansion/pull/6326)
### Fixed
* Fixes moves based on Dragon Darts with strikeCount > 2 always hitting the same battler from the second hit onwards by @PhallenTree in [#5830](https://github.com/rh-hideout/pokeemerald-expansion/pull/5830)
* Last fix for Sparkling Aria / Covert Cloak / Shield Dust interaction by @AlexOn1ine in [#5956](https://github.com/rh-hideout/pokeemerald-expansion/pull/5956)
* Added WEATHER_DOWNPOUR to Weather Ball's dynamic type by @fdeblasio in [#6100](https://github.com/rh-hideout/pokeemerald-expansion/pull/6100)
* Fixed Future Sight not being affected by Electrify by @AsparagusEduardo in [#6213](https://github.com/rh-hideout/pokeemerald-expansion/pull/6213)
* Fixes Expanding Force and Spectral Thief move animations by @PhallenTree in [#6185](https://github.com/rh-hideout/pokeemerald-expansion/pull/6185)
* Made some move animations fit in VRAM by @hedara90 in [#6289](https://github.com/rh-hideout/pokeemerald-expansion/pull/6289)
## 🧶 Items 🧶
### Fixed
* Adds missing Friend Ball friendship bonus upon catching by @PhallenTree in [#5795](https://github.com/rh-hideout/pokeemerald-expansion/pull/5795)
## 🤖 Battle AI 🤖
### Added
* Smart Switching handles Soundproof by @Pawkkie and @Robdeezy for the idea! in [#5703](https://github.com/rh-hideout/pokeemerald-expansion/pull/5703)
* Add Revival Blessing AI by @Pawkkie in [#5704](https://github.com/rh-hideout/pokeemerald-expansion/pull/5704)
* Add AI_FLAG_WEIGH_ABILITY_PREDICTION by @Pawkkie and @khbsd and @ghoulslash for the idea, @AlexOn1ine and @mrgriffin for getting it working :) in [#5636](https://github.com/rh-hideout/pokeemerald-expansion/pull/5636)
* Add AI_FLAG_PREFER_HIGHEST_DAMAGE_MOVE by @Pawkkie in [#6025](https://github.com/rh-hideout/pokeemerald-expansion/pull/6025)
* Add AI_FLAG_PREDICT_SWITCH by @Pawkkie and @kithr1 in [#6028](https://github.com/rh-hideout/pokeemerald-expansion/pull/6028)
* Add AI_FLAG_PREDICT_INCOMING_MON: AI will score against predicted switchin if predicting switch by @Pawkkie in [#6037](https://github.com/rh-hideout/pokeemerald-expansion/pull/6037)
* Switch trapping AI will consider Trace by @Pawkkie in [#6059](https://github.com/rh-hideout/pokeemerald-expansion/pull/6059)
* AI adds score to Pursuit if it OHKOs by @Pawkkie in [#6166](https://github.com/rh-hideout/pokeemerald-expansion/pull/6166)
* Switch chance config support by @Pawkkie in [#6187](https://github.com/rh-hideout/pokeemerald-expansion/pull/6187)
- Config can be changed in config/ai.h
* Add function to adjust AI scoring for generalized item effects by @moostoet and @AlexOn1ine and @Pawkkie for the input on slight changes to make to the logic (config, no magic numbers...) in [#6247](https://github.com/rh-hideout/pokeemerald-expansion/pull/6247)
### Changed
* Fixed AI not handling type effectiveness beyond x8 by @AsparagusEduardo and @/sshadowzkmao in [#6127](https://github.com/rh-hideout/pokeemerald-expansion/pull/6127)
- Removed the use of `AI_EFFECTIVENESS_` in favor of storing the actual type effectiveness.
- Renamed `AI_GetTypeEffectiveness` to `AI_GetMoveEffectiveness`, removing the original one.
* Remove global sBattler_AI by @AlexOn1ine in [#6128](https://github.com/rh-hideout/pokeemerald-expansion/pull/6128)
* SwitchType enum to clean up GetMostSuitableMonToSwitchInto by @Pawkkie in [#6184](https://github.com/rh-hideout/pokeemerald-expansion/pull/6184)
### Fixed
* Eject item ace flag switch AI fixes by @Pawkkie and @wiz1989 for reporting the bug in [#6098](https://github.com/rh-hideout/pokeemerald-expansion/pull/6098)
* Fix Choice'd mons referring to incorrect move when switching by @Pawkkie and @/capncrunch in [#6204](https://github.com/rh-hideout/pokeemerald-expansion/pull/6204)
* Fix AI switching in absorbing mon incorrectly by @Pawkkie in [#6227](https://github.com/rh-hideout/pokeemerald-expansion/pull/6227)
* Improve Yawn and Status Switching by @Pawkkie and @/Chape for finding this behaviour in [#6202](https://github.com/rh-hideout/pokeemerald-expansion/pull/6202)
* Fix AI wrongly thinking it strikes first with priority even if player is using priority themselves by @moostoet in [#6274](https://github.com/rh-hideout/pokeemerald-expansion/pull/6274)
* Fix AI hazard move handling, minor AI tweaks by @Pawkkie and @ShadowzLmao2 in [#6311](https://github.com/rh-hideout/pokeemerald-expansion/pull/6311)
* Fix Overzealous Absorber Switching by @Pawkkie and @iriv24 and @ravepossum for squinting at a conditional for nearly 30mins with me to find a semicolon in [#6318](https://github.com/rh-hideout/pokeemerald-expansion/pull/6318)
* Fix Substitute / Shed Tail Switch AI by @Pawkkie in [#6334](https://github.com/rh-hideout/pokeemerald-expansion/pull/6334)
## 🧹 Other Cleanup 🧹
* Split "Do nothing" move effects by @AsparagusEduardo in [#5613](https://github.com/rh-hideout/pokeemerald-expansion/pull/5613)
* Sleep Clause global config by @Pawkkie in [#5762](https://github.com/rh-hideout/pokeemerald-expansion/pull/5762)
* Converts multi-choice options to COMPOUND_STRINGs by @fdeblasio in [#5686](https://github.com/rh-hideout/pokeemerald-expansion/pull/5686)
* Converted item-related variables to COMPOUND_STRINGs by @fdeblasio in [#5714](https://github.com/rh-hideout/pokeemerald-expansion/pull/5714)
* Adds SleepClauseBlock enum to CanBeSlept by @Pawkkie and @AlexOn1ine in [#5773](https://github.com/rh-hideout/pokeemerald-expansion/pull/5773)
* Swapped DESELECT and CHECK_TAG to be in right places by @fdeblasio in [#5794](https://github.com/rh-hideout/pokeemerald-expansion/pull/5794)
* Changes target TURN_DAMAGED and MAX_HP to inlines by @AlexOn1ine in [#5822](https://github.com/rh-hideout/pokeemerald-expansion/pull/5822)
* Changes Various defines to an Enum by @AlexOn1ine in [#5839](https://github.com/rh-hideout/pokeemerald-expansion/pull/5839)
* Remove fno-toplevel-reorder by @DizzyEggg in [#5809](https://github.com/rh-hideout/pokeemerald-expansion/pull/5809)
* Refactors argument into a union by @AlexOn1ine in [#5853](https://github.com/rh-hideout/pokeemerald-expansion/pull/5853)
* Clean up redundancy for mugshots by @AlexOn1ine in [#5906](https://github.com/rh-hideout/pokeemerald-expansion/pull/5906)
* Encapsulate move data by @AsparagusEduardo in [#5852](https://github.com/rh-hideout/pokeemerald-expansion/pull/5852)
* Initialize m4a and IRQ handler in a loaded section by @SBird1337 in [#5912](https://github.com/rh-hideout/pokeemerald-expansion/pull/5912)
* Remove EWRAM gHpDealt (not needed anymore) by @AlexOn1ine in [#5925](https://github.com/rh-hideout/pokeemerald-expansion/pull/5925)
* Fix DexNav static asserts by @Bassoonian in [#5944](https://github.com/rh-hideout/pokeemerald-expansion/pull/5944)
* Move overwrittenAbilities field to DisableStruct by @ghoulslash in [#5946](https://github.com/rh-hideout/pokeemerald-expansion/pull/5946)
* Converted 2 various to callnative by @AsparagusEduardo in [#5950](https://github.com/rh-hideout/pokeemerald-expansion/pull/5950)
- Removed `VARIOUS_SWAP_SIDE_STATUSES` and `VARIOUS_SWAP_STATS`.
* Shell Bell Clean up / Simplification and Tests by @AlexOn1ine in [#5924](https://github.com/rh-hideout/pokeemerald-expansion/pull/5924)
* Removed OW_AUTO_SIGNPOST by @pkmnsnfrn, @doejohn126 discovered the issue in [#5974](https://github.com/rh-hideout/pokeemerald-expansion/pull/5974)
* Fix leftover test change from #5033 by @mrgriffin in [#5987](https://github.com/rh-hideout/pokeemerald-expansion/pull/5987)
* Multiple removals of hardcoded move IDs by @AsparagusEduardo in [#5964](https://github.com/rh-hideout/pokeemerald-expansion/pull/5964)
* Missed two uses of new hazard type enum by @Pawkkie in [#5996](https://github.com/rh-hideout/pokeemerald-expansion/pull/5996)
* Debug menu and `createmon` additions/cleanup by @AsparagusEduardo in [#5994](https://github.com/rh-hideout/pokeemerald-expansion/pull/5994)
- Added Tera Type, Dynamax Level, and Gigantamax Factor to the "Give Pokémon (complex)" debug menu option.
- Added `dmaxLevel` option to `givemon` and `createmon`.
- Added `WEATHER_COUNT`.
- Cleaned up repeated code instances in debug menu.
- Fixed mislabel of `ggMaxFactor` in `givemon` and `createmon`. Now it's `gmaxFactor`.
* Free some IWRAM by @DizzyEggg in [#6000](https://github.com/rh-hideout/pokeemerald-expansion/pull/6000)
* Removes Resource Flags and moves fields to DisableStruct by @AlexOn1ine in [#5945](https://github.com/rh-hideout/pokeemerald-expansion/pull/5945)
* Future Sight Innards Out follow up for upcoming by @AlexOn1ine in [#5998](https://github.com/rh-hideout/pokeemerald-expansion/pull/5998)
* Remove redundant calls to GetMonData in pokemon.c by @AZero13 in [#5545](https://github.com/rh-hideout/pokeemerald-expansion/pull/5545)
* Use SET8 and SET32 consistently by @AZero13 in [#5544](https://github.com/rh-hideout/pokeemerald-expansion/pull/5544)
* Rename Furfrou Species tags to match Pokemon Showdown exports by @moostoet in [#6041](https://github.com/rh-hideout/pokeemerald-expansion/pull/6041)
* Rename DexNav flags and vars by @Bassoonian in [#6044](https://github.com/rh-hideout/pokeemerald-expansion/pull/6044)
* Re-removed trainers.h trailing whitespace by @fdeblasio in [#6048](https://github.com/rh-hideout/pokeemerald-expansion/pull/6048)
* Moved front animations frames to gSpeciesInfo by @AsparagusEduardo in [#5605](https://github.com/rh-hideout/pokeemerald-expansion/pull/5605)
* Clean up array access by using index instead of dereferencing the value by @AlexOn1ine in [#6057](https://github.com/rh-hideout/pokeemerald-expansion/pull/6057)
* Add a uniquely striking pair of brackets by @Pawkkie in [#6068](https://github.com/rh-hideout/pokeemerald-expansion/pull/6068)
* Replace WEATHER_HAS_EFFECT with HasWeatherEffect by @AlexOn1ine in [#6069](https://github.com/rh-hideout/pokeemerald-expansion/pull/6069)
* Converts a bunch of defines to enums by @Bassoonian in [#6071](https://github.com/rh-hideout/pokeemerald-expansion/pull/6071)
- Replaced `BATTLE_TERRAIN` #defines with the `BattleTerrain` enum
- Replaced `MAP_TYPE` #defines with the `MapType` enum
- Replaced `MAP_BATTLE_SCENE` #defines with the `MapBattleScene` enum
- Replaced `BACK_ANIM` #defines with the `BackAnim` enum
- Replaced `ANIM` #defines with the `AnimFunctionIDs` enum
- Replaced `INGAME_TRADE` #defines with the `InGameTradeID` enum
- Replaced `TRAINER_CLASS` #defines with the `TRAINER_CLASS` enum
* Return the universe to a state of balanced quilibrium by @Pawkkie in [#6074](https://github.com/rh-hideout/pokeemerald-expansion/pull/6074)
* Cleaned up Debug Menu by @AsparagusEduardo in [#6070](https://github.com/rh-hideout/pokeemerald-expansion/pull/6070)
* Remove gDecompressionBuffer by @DizzyEggg in [#6029](https://github.com/rh-hideout/pokeemerald-expansion/pull/6029)
* Cleaned up Trainer Slides, added automated Trainer Slide tests, add new Enemy Critical Hit Slide by @pkmnsnfrn and @AlexOn1ine, @hedara90, @AsparagusEduardo, @mrgriffin in [#6018](https://github.com/rh-hideout/pokeemerald-expansion/pull/6018)
* If users created new entries in sTrainerSlides, they will need to be ported to the new system.
* Terrain function standarization by @fdeblasio in [#6097](https://github.com/rh-hideout/pokeemerald-expansion/pull/6097)
* Updated trainer pic tutorial by @fdeblasio in [#6049](https://github.com/rh-hideout/pokeemerald-expansion/pull/6049)
* Remove UnusedBattleInit from battle_bg.c by @DizzyEggg in [#6116](https://github.com/rh-hideout/pokeemerald-expansion/pull/6116)
* Consolidated contest opponent filters into gContestOpponents by @fdeblasio in [#6119](https://github.com/rh-hideout/pokeemerald-expansion/pull/6119)
* Replace BattleStruct members quickClawRandom/quickDrawRandom with locals by @AlexOn1ine in [#6136](https://github.com/rh-hideout/pokeemerald-expansion/pull/6136)
* Updated Trainer Ids used in Trainer Slides tests by @pkmnsnfrn and @AlexOn1ine found the original bug, @AsparagusEduardo confirmed it in [#6138](https://github.com/rh-hideout/pokeemerald-expansion/pull/6138)
* Added Difficulty Fallback for Trainer Slides by @pkmnsnfrn in [#6088](https://github.com/rh-hideout/pokeemerald-expansion/pull/6088)
* Clean up follow up for Simultaneous Reduction HP by @AlexOn1ine in [#6139](https://github.com/rh-hideout/pokeemerald-expansion/pull/6139)
* Remove global sBattler_AI by @AlexOn1ine in [#6128](https://github.com/rh-hideout/pokeemerald-expansion/pull/6128)
* Clarify MOVE_EFFECT_SLEEP sleep clause handling by @Pawkkie in [#6161](https://github.com/rh-hideout/pokeemerald-expansion/pull/6161)
* Remove unused PainSplit scripting global by @AlexOn1ine in [#6164](https://github.com/rh-hideout/pokeemerald-expansion/pull/6164)
* Don't use SeedRng some places where it isn't necessary by @tertu-m in [#6156](https://github.com/rh-hideout/pokeemerald-expansion/pull/6156)
* Cleaned up party data access GetPartyBattlerData by @AsparagusEduardo in [#6172](https://github.com/rh-hideout/pokeemerald-expansion/pull/6172)
* Changed two LocalRandom calls to new LocalRandom32 by @hedara90 in [#6173](https://github.com/rh-hideout/pokeemerald-expansion/pull/6173)
* Cleanup some global battler ID usage by @ghoulslash in [#6181](https://github.com/rh-hideout/pokeemerald-expansion/pull/6181)
* Clean up - Add ability args instead of calcing the ability again by @AlexOn1ine in [#6186](https://github.com/rh-hideout/pokeemerald-expansion/pull/6186)
* CanAbilityX Function Cleanup by @ghoulslash in [#6183](https://github.com/rh-hideout/pokeemerald-expansion/pull/6183)
* SwitchType enum to clean up GetMostSuitableMonToSwitchInto by @Pawkkie in [#6184](https://github.com/rh-hideout/pokeemerald-expansion/pull/6184)
* Unify setreflect/setlightscreen and MOVE_EFFECT_REFLECT/LIGHT_SCREEN by @ghoulslash in [#6196](https://github.com/rh-hideout/pokeemerald-expansion/pull/6196)
* Removed Trainer Slides footgun by @AsparagusEduardo in [#6205](https://github.com/rh-hideout/pokeemerald-expansion/pull/6205)
* Fix typo in Nuzzle's description by @Bassoonian in [#6209](https://github.com/rh-hideout/pokeemerald-expansion/pull/6209)
* Consolidate duplicate dialogue of nature girl in Battle Frontier by @fdeblasio in [#6195](https://github.com/rh-hideout/pokeemerald-expansion/pull/6195)
* Fixed missing move encapsulation in upcoming by @AsparagusEduardo in [#6226](https://github.com/rh-hideout/pokeemerald-expansion/pull/6226)
* Consolidated Frontier teams into battle_frontier_trainers.h by @fdeblasio in [#5892](https://github.com/rh-hideout/pokeemerald-expansion/pull/5892)
* Add abstraction layer for battler positions by @AlexOn1ine in [#6212](https://github.com/rh-hideout/pokeemerald-expansion/pull/6212)
* Revert unintentional change by @AlexOn1ine in [#6239](https://github.com/rh-hideout/pokeemerald-expansion/pull/6239)
* Remove whitespace from trainers data file by @AsparagusEduardo in [#6234](https://github.com/rh-hideout/pokeemerald-expansion/pull/6234)
* Replaced hardcoded numbers in DexNav with variables by @fdeblasio in [#6241](https://github.com/rh-hideout/pokeemerald-expansion/pull/6241)
* fix for battle ui for add to party menu (#6229) by @fakuzatsu in [#6240](https://github.com/rh-hideout/pokeemerald-expansion/pull/6240)
* Changed bit order for follower graphicsId creation by @hedara90 in [#6249](https://github.com/rh-hideout/pokeemerald-expansion/pull/6249)
* Minor Clean up for CanAbilityX. Follow up for #6183 by @AlexOn1ine in [#6252](https://github.com/rh-hideout/pokeemerald-expansion/pull/6252)
* Moved sValidApprenticeMove into gMovesInfo by @fdeblasio in [#6254](https://github.com/rh-hideout/pokeemerald-expansion/pull/6254)
* Use more accurate count in MovesInfo by @AlexOn1ine in [#6260](https://github.com/rh-hideout/pokeemerald-expansion/pull/6260)
* Fix Extra `task->tState++` and `break` in `Task_DrawFieldMessageBox` by @Deokishisu in [#6261](https://github.com/rh-hideout/pokeemerald-expansion/pull/6261)
* Expand usage of IsBattlerAlly (rename from IsAlly) by @AlexOn1ine in [#6251](https://github.com/rh-hideout/pokeemerald-expansion/pull/6251)
* Rename SetPhotonGeyser to a more general use and clean up by @AlexOn1ine in [#6272](https://github.com/rh-hideout/pokeemerald-expansion/pull/6272)
* Fix padding amount in MoveInfo by @AlexOn1ine in [#6307](https://github.com/rh-hideout/pokeemerald-expansion/pull/6307)
* Refactor testing flags and vars to not conflict with user ones by @hedara90 in [#6301](https://github.com/rh-hideout/pokeemerald-expansion/pull/6301)
* Clean up leftover from simu hp reduction development by @AlexOn1ine in [#6323](https://github.com/rh-hideout/pokeemerald-expansion/pull/6323)
* Remove pursuitSwitchByMove and additional if statement by @PhallenTree in [#6326](https://github.com/rh-hideout/pokeemerald-expansion/pull/6326)
## 🧪 Test Runner 🧪
### Changed
* New Ally Switch test fails on CI by @AlexOn1ine in [#5896](https://github.com/rh-hideout/pokeemerald-expansion/pull/5896)
* Added final Sparkling Aria+Shield Dust interaction test by @hedara90 in [#5923](https://github.com/rh-hideout/pokeemerald-expansion/pull/5923)
* Converted 2 various to callnative by @AsparagusEduardo in [#5950](https://github.com/rh-hideout/pokeemerald-expansion/pull/5950)
- Removed `VARIOUS_SWAP_SIDE_STATUSES` and `VARIOUS_SWAP_STATS`.
* Cleaned up Trainer Slides, added automated Trainer Slide tests, add new Enemy Critical Hit Slide by @pkmnsnfrn and @AlexOn1ine, @hedara90, @AsparagusEduardo, @mrgriffin in [#6018](https://github.com/rh-hideout/pokeemerald-expansion/pull/6018)
* If users created new entries in sTrainerSlides, they will need to be ported to the new system.
* Tests for Big Pecks by @hedara90 in [#6158](https://github.com/rh-hideout/pokeemerald-expansion/pull/6158)
* Water Compaction tests by @hedara90 in [#6159](https://github.com/rh-hideout/pokeemerald-expansion/pull/6159)
* Wrote tests for Electrify by @hedara90 in [#6179](https://github.com/rh-hideout/pokeemerald-expansion/pull/6179)
* Sheer Force Test Fixes by @ghoulslash in [#6198](https://github.com/rh-hideout/pokeemerald-expansion/pull/6198)
* Minor Terrain Seed Test Improvement by @ghoulslash in [#6207](https://github.com/rh-hideout/pokeemerald-expansion/pull/6207)
* Fix Liquid Ooze + Leech Seed Test by @ghoulslash in [#6217](https://github.com/rh-hideout/pokeemerald-expansion/pull/6217)
* Prevented fanfares from playing in headless mode by @pkmnsnfrn and @hedara90, @AsparagusEduardo in [#6219](https://github.com/rh-hideout/pokeemerald-expansion/pull/6219)
* Added test support for 5 battle configs by @AsparagusEduardo in [#5914](https://github.com/rh-hideout/pokeemerald-expansion/pull/5914)
* Added missing Dream Eater and Reflect Type tests by @AsparagusEduardo in [#6245](https://github.com/rh-hideout/pokeemerald-expansion/pull/6245)
* Refactor testing flags and vars to not conflict with user ones by @hedara90 in [#6301](https://github.com/rh-hideout/pokeemerald-expansion/pull/6301)
### Fixed
* Fix ASSUMPTIONS not working by @DizzyEggg in [#5869](https://github.com/rh-hideout/pokeemerald-expansion/pull/5869)
* Updated Trainer Ids used in Trainer Slides tests by @pkmnsnfrn and @AlexOn1ine found the original bug, @AsparagusEduardo confirmed it in [#6138](https://github.com/rh-hideout/pokeemerald-expansion/pull/6138)
* Adjusted G-Max Depletion test by @AsparagusEduardo and @AlexOn1ine for being a cool dude being patient with me during the PR. in [#6201](https://github.com/rh-hideout/pokeemerald-expansion/pull/6201)
* Do not add TRAINER_FLAG_DOUBLE_BATTLE to recorded battles by @mrgriffin in [#6285](https://github.com/rh-hideout/pokeemerald-expansion/pull/6285)
* Fixes Brick Break/Psychic Fangs/Raging Bull breaking screens if target is immune by @PhallenTree in [#6308](https://github.com/rh-hideout/pokeemerald-expansion/pull/6308)
## 📚 Documentation 📚
* Updating install instructions by @hedara90 in [#5610](https://github.com/rh-hideout/pokeemerald-expansion/pull/5610)
- Install instructions have been moved into individual files under `docs/install/ `
* Documentation for DisableStruct by @AlexOn1ine in [#6066](https://github.com/rh-hideout/pokeemerald-expansion/pull/6066)
* Cleaned up Trainer Slides, added automated Trainer Slide tests, add new Enemy Critical Hit Slide by @pkmnsnfrn and @AlexOn1ine, @hedara90, @AsparagusEduardo, @mrgriffin in [#6018](https://github.com/rh-hideout/pokeemerald-expansion/pull/6018)
* If users created new entries in sTrainerSlides, they will need to be ported to the new system.
* Updated trainer pic tutorial by @fdeblasio in [#6049](https://github.com/rh-hideout/pokeemerald-expansion/pull/6049)
* Update how_to_testing_system.md by @hedara90 in [#6281](https://github.com/rh-hideout/pokeemerald-expansion/pull/6281)
## 📦 Branch Synchronisation 📦
### pret
* 11th of February in [#6231](https://github.com/rh-hideout/pokeemerald-expansion/pull/6231)
* Replace easy_chat alphabetialOrder magic numbers with EC_INDEX values by @rayrobdod in [pret#2096](https://github.com/pret/pokeemerald/pull/2096)
* Fixed switchout bug in multibattle where order of mons gets messed up by @shachar700 in [pret#2099](https://github.com/pret/pokeemerald/pull/2099)
## New Contributors
* @khbsd made their first contribution in [#5679](https://github.com/rh-hideout/pokeemerald-expansion/pull/5679)
* @ExMingYan made their first contribution in [#6220](https://github.com/rh-hideout/pokeemerald-expansion/pull/6220)
* @Deokishisu made their first contribution in [#6261](https://github.com/rh-hideout/pokeemerald-expansion/pull/6261)
**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.10.2...test
<!--Last PR: 6339-->
<!--Used to keep track of the last PR merged in case new ones come in before the changelog is done.-->

View File

@ -54,6 +54,7 @@ Pull Requests that fall into this category are not in scope by default and shoul
2. **Fangame Features**: Adds a popular feature from other fangames
3. **Popular Non-SS Features**: Exceptions can be made for uniquely popular or requested features (Drowsy, PLA Legend Plate, etc.)
4. **External Program**: External programs like poryscript, porymoves, etc.
5. **Intergenerational Feature Compatibility**: Addresses limitations and issues resulting from including all generational behaviours in a GBA native title, and extrapolation of features no longer supported by GameFreak
## Workflow for Proposed Feature Scope Discussion
For the contributor:

View File

@ -554,6 +554,10 @@ Causes the test to fail if a and b compare incorrectly, e.g.
EXPECT_EQ(results[0].damage, Q_4_12(1.5), results[1].damage);
```
### `FORCE_MOVE_ANIM`
`FORCE_MOVE_ANIM(TRUE)`
Forces the moves in the current test to do their animations in headless mode. Useful for debugging animations.
## Overworld Command Reference
### `OVERWORLD_SCRIPT`

Binary file not shown.

Before

Width:  |  Height:  |  Size: 211 B

After

Width:  |  Height:  |  Size: 178 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 568 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 560 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 567 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 268 B

After

Width:  |  Height:  |  Size: 184 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 555 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 570 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 563 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 565 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 568 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 566 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 557 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 551 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 558 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 365 B

After

Width:  |  Height:  |  Size: 218 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 559 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 209 B

After

Width:  |  Height:  |  Size: 177 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 566 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 563 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 563 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 555 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 582 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 560 B

View File

@ -14,6 +14,6 @@ JASC-PAL
96 168 120
64 136 96
232 232 248
152 40 64
39 44 149
0 0 0
0 0 0

View File

@ -814,12 +814,9 @@ struct BattleStruct
u8 additionalEffectsCounter:4; // A counter for the additionalEffects applied by the current move in Cmd_setadditionaleffects
u8 redCardActivates:1;
u8 padding2:2; // padding in the middle so pursuit fields are together
u8 pursuitSwitchByMove:1;
u8 pursuitStoredSwitch; // Stored id for the Pursuit target's switch
s32 battlerExpReward;
u16 prevTurnSpecies[MAX_BATTLERS_COUNT]; // Stores species the AI has in play at start of turn
// Simultaneous hp reduction for spread moves
s32 moveDamage[MAX_BATTLERS_COUNT];
s32 critChance[MAX_BATTLERS_COUNT];
u16 moveResultFlags[MAX_BATTLERS_COUNT];
@ -830,9 +827,13 @@ struct BattleStruct
u8 calculatedSpreadMoveAccuracy:1;
u8 printedStrongWindsWeakenedAttack:1;
u8 numSpreadTargets:2;
u8 padding3:2;
u8 bypassMoldBreakerChecks:1; // for ABILITYEFFECT_IMMUNITY
u8 padding3:1;
u8 usedEjectItem;
u8 usedMicleBerry;
struct MessageStatus slideMessageStatus;
u8 trainerSlideSpriteIds[MAX_BATTLERS_COUNT];
u8 embodyAspectBoost[NUM_BATTLE_SIDES];
};
// The palaceFlags member of struct BattleStruct contains 1 flag per move to indicate which moves the AI should consider,
@ -1241,6 +1242,11 @@ static inline u32 GetBattlerSide(u32 battler)
return GetBattlerPosition(battler) & BIT_SIDE;
}
static inline bool32 IsBattlerAlly(u32 battlerAtk, u32 battlerDef)
{
return (GetBattlerSide(battlerAtk) == GetBattlerSide(battlerDef));
}
static inline u32 GetOpposingSideBattler(u32 battler)
{
return GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerSide(battler)));

View File

@ -35,7 +35,7 @@ typedef s32 (*AiScoreFunc)(u32, u32, u32, s32);
#define POWERFUL_STATUS_MOVE 10 // Moves with this score will be chosen over a move that faints target
#define NO_DAMAGE_OR_FAILS -20 // Move fails or does no damage
// Scores given in AI_CalcMoveEffectScore
// Scores given in AI_CalcMoveEffectScore and AI_CalcHoldEffectMoveScore
#define NO_INCREASE 0
#define WEAK_EFFECT 1
#define DECENT_EFFECT 2

View File

@ -127,7 +127,7 @@ bool32 IsAromaVeilProtectedEffect(u32 moveEffect);
bool32 IsNonVolatileStatusMoveEffect(u32 moveEffect);
bool32 IsMoveRedirectionPrevented(u32 battlerAtk, u32 move, u32 atkAbility);
bool32 IsMoveEncouragedToHit(u32 battlerAtk, u32 battlerDef, u32 move);
bool32 IsHazardMoveEffect(u32 moveEffect);
bool32 IsHazardMove(u32 move);
bool32 IsTwoTurnNotSemiInvulnerableMove(u32 battlerAtk, u32 move);
void ProtectChecks(u32 battlerAtk, u32 battlerDef, u32 move, u32 predictedMove, s32 *score);
bool32 ShouldSetSandstorm(u32 battler, u32 ability, u32 holdEffect);
@ -154,6 +154,8 @@ bool32 HasSubstituteIgnoringMove(u32 battler);
bool32 HasHighCritRatioMove(u32 battler);
bool32 HasMagicCoatAffectedMove(u32 battler);
bool32 HasSnatchAffectedMove(u32 battler);
bool32 IsHazardClearingMove(u32 move);
bool32 IsSubstituteEffect(u32 effect);
// status checks
bool32 AI_CanGetFrostbite(u32 battler, u32 ability);
@ -215,7 +217,9 @@ bool32 AI_ShouldCopyStatChanges(u32 battlerAtk, u32 battlerDef);
bool32 AI_ShouldSetUpHazards(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData);
void IncreaseTidyUpScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score);
bool32 AI_ShouldSpicyExtract(u32 battlerAtk, u32 battlerAtkPartner, u32 move, struct AiLogicData *aiData);
void IncreaseSubstituteMoveScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score);
u32 IncreaseSubstituteMoveScore(u32 battlerAtk, u32 battlerDef, u32 move);
bool32 IsBattlerItemEnabled(u32 battler);
bool32 IsBattlerPredictedToSwitch(u32 battler);
bool32 HasLowAccuracyMove(u32 battlerAtk, u32 battlerDef);
#endif //GUARD_BATTLE_AI_UTIL_H

View File

@ -51,7 +51,6 @@ void StealTargetItem(u8 battlerStealer, u8 battlerItem);
u8 GetCatchingBattler(void);
u32 GetHighestStatId(u32 battlerId);
bool32 ProteanTryChangeType(u32 battler, u32 ability, u32 move, u32 moveType);
bool32 ShouldTeraShellDistortTypeMatchups(u32 move, u32 battlerDef);
bool32 IsMoveNotAllowedInSkyBattles(u32 move);
bool32 DoSwitchInAbilities(u32 battlerId);
u8 GetFirstFaintedPartyIndex(u8 battlerId);

View File

@ -827,7 +827,7 @@ extern const u8 BattleScript_MoveEffectHaze[];
extern const u8 BattleScript_MoveEffectIonDeluge[];
extern const u8 BattleScript_EffectHyperspaceFury[];
extern const u8 BattleScript_EffectAuraWheel[];
extern const u8 BattleScript_EffectPhotonGeyser[];
extern const u8 BattleScript_EffectDynamicCategory[];
extern const u8 BattleScript_EffectNoRetreat[];
extern const u8 BattleScript_EffectTarShot[];
extern const u8 BattleScript_EffectPoltergeist[];

View File

@ -24,8 +24,8 @@
enum AbilityEffectOptions
{
ABILITY_CHECK_TRIGGER,
ABILITY_RUN_SCRIPT,
ABILITY_CHECK_TRIGGER,
ABILITY_RUN_SCRIPT,
};
enum MoveAbsorbed
@ -175,6 +175,7 @@ void HandleAction_ThrowBall(void);
u32 GetCurrentBattleWeather(void);
u32 EndOrContinueWeather(void);
bool32 IsAffectedByFollowMe(u32 battlerAtk, u32 defSide, u32 move);
bool32 HandleMoveTargetRedirection(void);
void HandleAction_UseMove(void);
void HandleAction_Switch(void);
void HandleAction_UseItem(void);

View File

@ -9,6 +9,7 @@
#define SHOULD_SWITCH_WONDER_GUARD_PERCENTAGE 100
#define SHOULD_SWITCH_TRUANT_PERCENTAGE 100
#define SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE 100
#define STAY_IN_STATS_RAISED 2 // Number of stat stages that must be raised across any stats before the AI won't switch mon out in certain cases
// AI smart switching chances; if you want more complex behaviour, modify GetSwitchChance
#define SHOULD_SWITCH_ABSORBS_MOVE_PERCENTAGE 100
@ -43,6 +44,9 @@
#define SHOULD_SWITCH_REGENERATOR_PERCENTAGE 50
#define SHOULD_SWITCH_REGENERATOR_STATS_RAISED_PERCENTAGE 20
// AI held item-based move scoring
#define LOW_ACCURACY_THRESHOLD 75 // Moves with accuracy equal OR below this value are considered low accuracy
// AI prediction chances
#define PREDICT_SWITCH_CHANCE 50

View File

@ -60,6 +60,32 @@
#define OW_FOLLOWERS_WEATHER_FORMS FALSE // If TRUE, Castform and Cherrim gain FORM_CHANGE_OVERWORLD_WEATHER, which will make them transform in the overworld based on the weather.
#define OW_FOLLOWERS_COPY_WILD_PKMN FALSE // If TRUE, follower Pokémon that know Transform or have Illusion/Imposter will copy wild Pokémon at random.
#define OW_BATTLE_ONLY_FORMS TRUE // If TRUE, loads overworld sprites for battle-only forms like Mega Evos. Requires OW_POKEMON_OBJECT_EVENTS.
#define B_FLAG_FOLLOWERS_DISABLED 0 // Enables / Disables followers by using a flag. Helpful to disable followers for a period of time.
#define OW_FOLLOWERS_SCRIPT_MOVEMENT TRUE // TRUE: Script collisions hide follower, FLAG_SAFE_FOLLOWER_MOVEMENT on by default
// FALSE: Script collisions unhandled, FLAG_SAFE_FOLLOWER_MOVEMENT off by default
// If set, the only pokemon allowed to follow you
// will be those matching species, met location,
// and/or met level;
// These accept vars, too: VAR_TEMP_1, etc
#define OW_MON_ALLOWED_SPECIES (0)
#define OW_MON_ALLOWED_MET_LVL (0)
#define OW_MON_ALLOWED_MET_LOC (0)
// Examples:
// Yellow Pikachu:
// #define OW_MON_ALLOWED_SPECIES (SPECIES_PIKACHU)
// #define OW_MON_ALLOWED_MET_LVL (0)
// #define OW_MON_ALLOWED_MET_LOC (MAPSEC_PALLET_TOWN)
// Hoenn Starter:
// #define OW_MON_ALLOWED_SPECIES (0)
// #define OW_MON_ALLOWED_MET_LVL (5)
// #define OW_MON_ALLOWED_MET_LOC (MAPSEC_ROUTE_101)
// Species set in VAR_XXXX:
// #define OW_MON_ALLOWED_SPECIES (VAR_XXXX)
// #define OW_MON_ALLOWED_MET_LVL (0)
// #define OW_MON_ALLOWED_MET_LOC (0)
// Out-of-battle Ability effects
#define OW_SYNCHRONIZE_NATURE GEN_LATEST // In Gen8+, if a Pokémon with Synchronize leads the party, wild Pokémon will always have their same Nature as opposed to the 50% chance in previous games. Gift Pokémon excluded.

View File

@ -1131,10 +1131,10 @@
// Vars
#undef B_VAR_DIFFICULTY
#define B_VAR_DIFFICULTY VAR_UNUSED_0x404E
#define B_VAR_DIFFICULTY TESTING_VAR_DIFFICULTY
// Flags
#undef B_FLAG_SLEEP_CLAUSE
#define B_FLAG_SLEEP_CLAUSE FLAG_SPECIAL_FLAG_UNUSED_0x4003
#define B_FLAG_SLEEP_CLAUSE TESTING_FLAG_SLEEP_CLAUSE
#endif // GUARD_CONFIG_TEST_H

View File

@ -558,7 +558,7 @@ enum MoveEffects
#define MOVE_TARGET_SELECTED 0
#define MOVE_TARGET_DEPENDS (1 << 0)
#define MOVE_TARGET_USER_OR_SELECTED (1 << 1)
#define MOVE_TARGET_OPPONENT (1 << 1)
#define MOVE_TARGET_RANDOM (1 << 2)
#define MOVE_TARGET_BOTH (1 << 3)
#define MOVE_TARGET_USER (1 << 4)

View File

@ -270,10 +270,10 @@
#define OBJ_EVENT_GFX_VAR_E (OBJ_EVENT_GFX_VARS + 0xE)
#define OBJ_EVENT_GFX_VAR_F (OBJ_EVENT_GFX_VARS + 0xF)
#define OBJ_EVENT_MON (1 << 13)
#define OBJ_EVENT_MON_SHINY (1 << 14)
#define OBJ_EVENT_MON_FEMALE (1 << 15)
#define OBJ_EVENT_MON_SPECIES_MASK (OBJ_EVENT_MON - 1)
#define OBJ_EVENT_MON (1u << 14)
#define OBJ_EVENT_MON_SHINY (1u << 13)
#define OBJ_EVENT_MON_FEMALE (1u << 12)
#define OBJ_EVENT_MON_SPECIES_MASK (~(7u << 12))
// Used to call a specific species' follower graphics. Useful for static encounters.
#define OBJ_EVENT_GFX_SPECIES(name) (SPECIES_##name + OBJ_EVENT_MON)

View File

@ -1,9 +1,9 @@
#ifndef GUARD_CONSTANTS_EXPANSION_H
#define GUARD_CONSTANTS_EXPANSION_H
// Last version: 1.10.2
// Last version: 1.11.0
#define EXPANSION_VERSION_MAJOR 1
#define EXPANSION_VERSION_MINOR 11
#define EXPANSION_VERSION_MINOR 12
#define EXPANSION_VERSION_PATCH 0
// FALSE if this this version of Expansion is not a tagged commit, i.e.

View File

@ -1648,6 +1648,7 @@
#define FLAG_SPECIAL_FLAG_UNUSED_0x4003 (SPECIAL_FLAGS_START + 0x3) // Unused Flag
#define FLAG_STORING_ITEMS_IN_PYRAMID_BAG (SPECIAL_FLAGS_START + 0x4)
#define FLAG_SAFE_FOLLOWER_MOVEMENT (SPECIAL_FLAGS_START + 0x5) // When set, applymovement does not put the follower inside a pokeball
// Also, scripted movements on the player will move follower(s), too
// FLAG_SPECIAL_FLAG_0x4005 - 0x407F also exist and are unused
#define SPECIAL_FLAGS_END (SPECIAL_FLAGS_START + 0x7F)
#define NUM_SPECIAL_FLAGS (SPECIAL_FLAGS_END - SPECIAL_FLAGS_START + 1)
@ -1659,4 +1660,16 @@
#define FLAG_TEMP_HIDE_FOLLOWER FLAG_TEMP_E
#define FLAG_TEMP_HIDE_MIRAGE_ISLAND_BERRY_TREE FLAG_TEMP_11
#if TESTING
#define TESTING_FLAGS_START 0x5000
#define TESTING_FLAG_SLEEP_CLAUSE (TESTING_FLAGS_START + 0x0)
#define TESTING_FLAG_UNUSED_1 (TESTING_FLAGS_START + 0x1)
#define TESTING_FLAG_UNUSED_2 (TESTING_FLAGS_START + 0x2)
#define TESTING_FLAG_UNUSED_3 (TESTING_FLAGS_START + 0x3)
#define TESTING_FLAG_UNUSED_4 (TESTING_FLAGS_START + 0x4)
#define TESTING_FLAG_UNUSED_5 (TESTING_FLAGS_START + 0x5)
#define TESTING_FLAG_UNUSED_6 (TESTING_FLAGS_START + 0x6)
#define TESTING_FLAG_UNUSED_7 (TESTING_FLAGS_START + 0x7)
#endif // TESTING
#endif // GUARD_CONSTANTS_FLAGS_H

View File

@ -324,4 +324,16 @@
#define VAR_TEMP_TRANSFERRED_SPECIES VAR_TEMP_1
#if TESTING
#define TESTING_VARS_START 0x9000
#define TESTING_VAR_DIFFICULTY (TESTING_VARS_START + 0x0)
#define TESTING_VAR_UNUSED_1 (TESTING_VARS_START + 0x1)
#define TESTING_VAR_UNUSED_2 (TESTING_VARS_START + 0x2)
#define TESTING_VAR_UNUSED_3 (TESTING_VARS_START + 0x3)
#define TESTING_VAR_UNUSED_4 (TESTING_VARS_START + 0x4)
#define TESTING_VAR_UNUSED_5 (TESTING_VARS_START + 0x5)
#define TESTING_VAR_UNUSED_6 (TESTING_VARS_START + 0x6)
#define TESTING_VAR_UNUSED_7 (TESTING_VARS_START + 0x7)
#endif // TESTING
#endif // GUARD_CONSTANTS_VARS_H

View File

@ -178,6 +178,7 @@ u8 GetWalkInPlaceFastMovementAction(u32);
u8 GetWalkInPlaceNormalMovementAction(u32);
u8 GetWalkInPlaceSlowMovementAction(u32);
u8 GetCollisionAtCoords(struct ObjectEvent *, s16 x, s16 y, u32 dir);
u32 GetObjectObjectCollidesWith(struct ObjectEvent *objectEvent, s16 x, s16 y, bool32 addCoords);
void MoveCoords(u8 direction, s16 *x, s16 *y);
bool8 ObjectEventIsHeldMovementActive(struct ObjectEvent *);
u8 ObjectEventClearHeldMovementIfFinished(struct ObjectEvent *);

View File

@ -104,7 +104,9 @@ struct MoveInfo
bool32 parentalBondBanned:1;
bool32 skyBattleBanned:1;
bool32 sketchBanned:1;
u32 padding:19;
//Other
bool32 validApprenticeMove:1;
u32 padding:3;
// end of word
union {

View File

@ -3,6 +3,7 @@
void ReshowBattleScreenDummy(void);
void ReshowBattleScreenAfterMenu(void);
void ReshowBlankBattleScreenAfterMenu(void);
void CreateBattlerSprite(u32 battler);
#endif // GUARD_RESHOW_BATTLE_SCREEN_H

View File

@ -339,7 +339,7 @@ static u16 GetRandomAlternateMove(u8 monId)
numLearnsetMoves = j;
i = 0;
// i < 5 here is arbitrary, i isnt used and is only incremented when the selected move isnt in sValidApprenticeMoves
// i < 5 here is arbitrary, i isn't used and is only incremented when the selected move isn't valid (determined by the validApprenticeMove value)
// This while loop contains 3 potential infinite loops, though none of them would occur in the base game
while (i < 5)
{
@ -411,7 +411,7 @@ static u16 GetRandomAlternateMove(u8 monId)
if (TrySetMove(monId, moveId))
{
if (sValidApprenticeMoves[moveId])
if (gMovesInfo[moveId].validApprenticeMove)
break;
i++;
}

View File

@ -893,10 +893,10 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
// target ability checks
if (!DoesBattlerIgnoreAbilityChecks(battlerAtk, aiData->abilities[battlerAtk], move))
{
if (CanAbilityBlockMove(battlerAtk, battlerDef, move, aiData->abilities[battlerDef], FALSE))
if (CanAbilityBlockMove(battlerAtk, battlerDef, move, aiData->abilities[battlerDef], ABILITY_CHECK_TRIGGER))
RETURN_SCORE_MINUS(20);
if (CanAbilityAbsorbMove(battlerAtk, battlerDef, aiData->abilities[battlerDef], move, moveType, FALSE))
if (CanAbilityAbsorbMove(battlerAtk, battlerDef, aiData->abilities[battlerDef], move, moveType, ABILITY_CHECK_TRIGGER))
RETURN_SCORE_MINUS(20);
switch (aiData->abilities[battlerDef])
@ -2112,7 +2112,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
if (isDoubleBattle)
{
if (IsHazardMoveEffect(GetMoveEffect(aiData->partnerMove)) // partner is going to set up hazards
if (IsHazardMove(aiData->partnerMove) // partner is going to set up hazards
&& AI_IsFaster(BATTLE_PARTNER(battlerAtk), battlerAtk, aiData->partnerMove)) // partner is going to set up before the potential Defog
{
ADJUST_SCORE(-10);
@ -2349,9 +2349,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
}
break;
case EFFECT_NATURAL_GIFT:
if (aiData->abilities[battlerAtk] == ABILITY_KLUTZ
|| gFieldStatuses & STATUS_FIELD_MAGIC_ROOM
|| GetPocketByItemId(gBattleMons[battlerAtk].item) != POCKET_BERRIES)
if (!IsBattlerItemEnabled(battlerAtk) || GetPocketByItemId(gBattleMons[battlerAtk].item) != POCKET_BERRIES)
ADJUST_SCORE(-10);
break;
case EFFECT_GRASSY_TERRAIN:
@ -2458,9 +2456,8 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
}
break;
case EFFECT_EMBARGO:
if (aiData->abilities[battlerDef] == ABILITY_KLUTZ
|| gFieldStatuses & STATUS_FIELD_MAGIC_ROOM
|| gStatuses3[battlerDef] & STATUS3_EMBARGO
if (!IsBattlerItemEnabled(battlerAtk)
|| gStatuses3[battlerDef] & STATUS3_EMBARGO
|| PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove))
ADJUST_SCORE(-10);
break;
@ -2706,7 +2703,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
} // move effect checks
// Choice items
if (HOLD_EFFECT_CHOICE(aiData->holdEffects[battlerAtk]) && gBattleMons[battlerAtk].ability != ABILITY_KLUTZ)
if (HOLD_EFFECT_CHOICE(aiData->holdEffects[battlerAtk]) && IsBattlerItemEnabled(battlerAtk))
{
// Don't use user-target moves ie. Swords Dance, with exceptions
if ((moveTarget & MOVE_TARGET_USER)
@ -3295,6 +3292,34 @@ static s32 AI_CompareDamagingMoves(u32 battlerAtk, u32 battlerDef, u32 currId)
return score;
}
static u32 AI_CalcHoldEffectMoveScore(u32 battlerAtk, u32 battlerDef, u32 move)
{
struct AiLogicData *aiData = AI_DATA;
u32 holdEffect = aiData->holdEffects[battlerAtk];
s32 score = 0;
switch (holdEffect)
{
case HOLD_EFFECT_BLUNDER_POLICY:
{
u32 moveAcc = aiData->moveAccuracy[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex];
if (moveAcc <= LOW_ACCURACY_THRESHOLD)
{
ADJUST_SCORE(GOOD_EFFECT);
}
else
{
ADJUST_SCORE(-DECENT_EFFECT);
}
}
break;
}
return score;
}
static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move)
{
// move data
@ -3341,6 +3366,12 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move)
if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_BIG_ROOT && effectiveness >= UQ_4_12(1.0))
ADJUST_SCORE(DECENT_EFFECT);
break;
case EFFECT_DREAM_EATER:
case EFFECT_STRENGTH_SAP:
case EFFECT_AQUA_RING:
if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_BIG_ROOT)
ADJUST_SCORE(DECENT_EFFECT);
break;
case EFFECT_EXPLOSION:
case EFFECT_MEMENTO:
if (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_WILL_SUICIDE && gBattleMons[battlerDef].statStages[STAT_EVASION] < 7)
@ -3562,8 +3593,6 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move)
case EFFECT_MOONLIGHT:
if (ShouldRecover(battlerAtk, battlerDef, move, 50))
ADJUST_SCORE(GOOD_EFFECT);
if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_BIG_ROOT)
ADJUST_SCORE(DECENT_EFFECT);
break;
case EFFECT_TOXIC:
case EFFECT_POISON:
@ -3622,7 +3651,8 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move)
break;
case EFFECT_SUBSTITUTE:
case EFFECT_SHED_TAIL:
IncreaseSubstituteMoveScore(battlerAtk, battlerDef, move, &score);
ADJUST_SCORE(IncreaseSubstituteMoveScore(battlerAtk, battlerDef, move));
break;
case EFFECT_MIMIC:
if (AI_IsFaster(battlerAtk, battlerDef, move))
{
@ -3638,7 +3668,8 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move)
|| aiData->abilities[battlerDef] == ABILITY_MAGIC_GUARD)
break;
ADJUST_SCORE(GOOD_EFFECT);
if (!HasDamagingMove(battlerDef) || IsBattlerTrapped(battlerDef, FALSE))
if (!HasDamagingMove(battlerDef) || IsBattlerTrapped(battlerDef, FALSE)
|| aiData->holdEffects[battlerAtk] == HOLD_EFFECT_BIG_ROOT)
ADJUST_SCORE(DECENT_EFFECT);
break;
case EFFECT_DO_NOTHING:
@ -3987,7 +4018,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move)
{
if (isDoubleBattle)
{
if (IsHazardMoveEffect(GetMoveEffect(aiData->partnerMove)) // Partner is going to set up hazards
if (IsHazardMove(aiData->partnerMove) // Partner is going to set up hazards
&& AI_IsSlower(battlerAtk, BATTLE_PARTNER(battlerAtk), move)) // Partner going first
break; // Don't use Defog if partner is going to set up hazards
}
@ -4831,6 +4862,7 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
}
ADJUST_SCORE(AI_CalcMoveEffectScore(battlerAtk, battlerDef, move));
ADJUST_SCORE(AI_CalcHoldEffectMoveScore(battlerAtk, battlerDef, move));
return score;
}

View File

@ -125,6 +125,20 @@ static bool32 IsAceMon(u32 battler, u32 monPartyId)
return FALSE;
}
static bool32 AreStatsRaised(u32 battler)
{
u8 buffedStatsValue = 0;
s32 i;
for (i = 0; i < NUM_BATTLE_STATS; i++)
{
if (gBattleMons[battler].statStages[i] > DEFAULT_STAT_STAGE)
buffedStatsValue += gBattleMons[battler].statStages[i] - DEFAULT_STAT_STAGE;
}
return (buffedStatsValue > STAY_IN_STATS_RAISED);
}
void GetAIPartyIndexes(u32 battler, s32 *firstId, s32 *lastId)
{
if (BATTLE_TWO_VS_ONE_OPPONENT && (battler & BIT_SIDE) == B_SIDE_OPPONENT)
@ -408,7 +422,7 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler)
s32 firstId;
s32 lastId;
struct Pokemon *party;
u16 monAbility;
u16 monAbility, aiMove;
u32 opposingBattler = GetOppositeBattler(battler);
u32 incomingMove = AI_DATA->lastUsedMove[opposingBattler];
u32 incomingType = GetMoveType(incomingMove);
@ -421,9 +435,25 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler)
return FALSE;
if (gBattleStruct->prevTurnSpecies[battler] != gBattleMons[battler].species) // AI mon has changed, player's behaviour no longer reliable; note to override this if using AI_FLAG_PREDICT_MOVE
return FALSE;
if (HasSuperEffectiveMoveAgainstOpponents(battler, TRUE) && (RandomPercentage(RNG_AI_SWITCH_ABSORBING_STAY_IN, STAY_IN_ABSORBING_PERCENTAGE) || AI_DATA->aiSwitchPredictionInProgress))
return FALSE;
if (AreStatsRaised(battler))
return FALSE;
// Don't switch if mon could OHKO
for (i = 0; i < MAX_MON_MOVES; i++)
{
aiMove = gBattleMons[battler].moves[i];
if (aiMove != MOVE_NONE)
{
// Only check damage if it's a damaging move
if (!IsBattleMoveStatus(aiMove))
{
if (AI_DATA->simulatedDmg[battler][opposingBattler][i].expected > gBattleMons[opposingBattler].hp)
return FALSE;
}
}
}
if (IsDoubleBattle())
{
@ -593,6 +623,10 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler)
{
switchMon = TRUE;
// If we don't have a good switchin, not worth switching
if (AI_DATA->mostSuitableMonId[battler] == PARTY_SIZE)
switchMon = FALSE;
// Check if Active Pokemon can KO opponent instead of switching
// Will still fall asleep, but take out opposing Pokemon first
if (AiExpectsToFaintPlayer(battler))
@ -626,7 +660,8 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler)
// Secondary Damage
if (monAbility != ABILITY_MAGIC_GUARD
&& !AiExpectsToFaintPlayer(battler))
&& !AiExpectsToFaintPlayer(battler)
&& AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE)
{
//Toxic
if (((gBattleMons[battler].status1 & STATUS1_TOXIC_COUNTER) >= STATUS1_TOXIC_TURN(2))
@ -654,6 +689,7 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler)
// Infatuation
if (gBattleMons[battler].status2 & STATUS2_INFATUATION
&& !AiExpectsToFaintPlayer(battler)
&& AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE
&& RandomPercentage(RNG_AI_SWITCH_INFATUATION, GetSwitchChance(SHOULD_SWITCH_INFATUATION)))
return SetSwitchinAndSwitch(battler, PARTY_SIZE);
}
@ -756,20 +792,6 @@ static bool32 HasSuperEffectiveMoveAgainstOpponents(u32 battler, bool32 noRng)
return FALSE;
}
static bool32 AreStatsRaised(u32 battler)
{
u8 buffedStatsValue = 0;
s32 i;
for (i = 0; i < NUM_BATTLE_STATS; i++)
{
if (gBattleMons[battler].statStages[i] > DEFAULT_STAT_STAGE)
buffedStatsValue += gBattleMons[battler].statStages[i] - DEFAULT_STAT_STAGE;
}
return (buffedStatsValue > 3);
}
static bool32 FindMonWithFlagsAndSuperEffective(u32 battler, u16 flags, u32 percentChance)
{
u32 battlerIn1, battlerIn2;
@ -902,14 +924,8 @@ static bool32 CanMonSurviveHazardSwitchin(u32 battler)
for (j = 0; j < MAX_MON_MOVES; j++)
{
aiMove = GetMonData(&party[i], MON_DATA_MOVE1 + j, NULL);
u32 aiEffect = GetMoveEffect(aiMove);
if (aiEffect == EFFECT_RAPID_SPIN
|| (B_DEFOG_EFFECT_CLEARING >= GEN_6 && aiEffect == EFFECT_DEFOG)
|| aiEffect == EFFECT_TIDY_UP)
{
// Have a mon that can clear the hazards, so switching out is okay
if (IsHazardClearingMove(aiMove)) // Have a mon that can clear the hazards, so switching out is okay
return TRUE;
}
}
}
// Faints to hazards and party can't clear them, don't switch out
@ -950,7 +966,7 @@ static bool32 ShouldSwitchIfBadChoiceLock(u32 battler)
{
u32 holdEffect = GetBattlerHoldEffect(battler, FALSE);
if (HOLD_EFFECT_CHOICE(holdEffect) && gBattleMons[battler].ability != ABILITY_KLUTZ)
if (HOLD_EFFECT_CHOICE(holdEffect) && IsBattlerItemEnabled(battler))
{
if (GetMoveCategory(AI_DATA->lastUsedMove[battler]) == DAMAGE_CATEGORY_STATUS && RandomPercentage(RNG_AI_SWITCH_CHOICE_LOCKED, GetSwitchChance(SHOULD_SWITCH_CHOICE_LOCKED)))
return SetSwitchinAndSwitch(battler, PARTY_SIZE);
@ -1005,6 +1021,23 @@ static bool32 ShouldSwitchIfAttackingStatsLowered(u32 battler)
return FALSE;
}
static bool32 HasGoodSubstituteMove(u32 battler)
{
int i;
u32 aiMove, aiMoveEffect, opposingBattler = GetOppositeBattler(battler);
for (i = 0; i < MAX_MON_MOVES; i++)
{
aiMove = gBattleMons[battler].moves[i];
aiMoveEffect = GetMoveEffect(aiMove);
if (IsSubstituteEffect(aiMoveEffect))
{
if (IncreaseSubstituteMoveScore(battler, opposingBattler, aiMove) > 0)
return TRUE;
}
}
return FALSE;
}
bool32 ShouldSwitch(u32 battler)
{
u32 battlerIn1, battlerIn2;
@ -1069,19 +1102,21 @@ bool32 ShouldSwitch(u32 battler)
return FALSE;
// NOTE: The sequence of the below functions matter! Do not change unless you have carefully considered the outcome.
// Since the order is sequencial, and some of these functions prompt switch to specific party members.
// Since the order is sequential, and some of these functions prompt switch to specific party members.
// FindMon functions can prompt a switch to specific party members that override GetMostSuitableMonToSwitchInto
// The rest can prompt a switch to party member returned by GetMostSuitableMonToSwitchInto
// These Functions can prompt switch to specific party members that override GetMostSuitableMonToSwitchInto
if (FindMonThatHitsWonderGuard(battler))
return TRUE;
if (FindMonThatAbsorbsOpponentsMove(battler))
return TRUE;
// These Functions can prompt switch to party member returned by GetMostSuitableMonToSwitchInto
if ((AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING) && (CanMonSurviveHazardSwitchin(battler) == FALSE))
return FALSE;
if (HasGoodSubstituteMove(battler))
return FALSE;
if (ShouldSwitchIfTrapperInParty(battler))
return TRUE;
if (FindMonThatAbsorbsOpponentsMove(battler))
return TRUE;
if (ShouldSwitchIfOpponentChargingOrInvulnerable(battler))
return TRUE;
if (ShouldSwitchIfTruant(battler))
@ -1344,10 +1379,10 @@ bool32 IsMonGrounded(u16 heldItemEffect, u32 ability, u8 type1, u8 type2)
{
// List that makes mon not grounded
if (type1 == TYPE_FLYING || type2 == TYPE_FLYING || ability == ABILITY_LEVITATE
|| (heldItemEffect == HOLD_EFFECT_AIR_BALLOON && ability != ABILITY_KLUTZ))
|| (heldItemEffect == HOLD_EFFECT_AIR_BALLOON && !(ability == ABILITY_KLUTZ || (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM))))
{
// List that overrides being off the ground
if ((heldItemEffect == HOLD_EFFECT_IRON_BALL && ability != ABILITY_KLUTZ) || (gFieldStatuses & STATUS_FIELD_GRAVITY) || (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM))
if ((heldItemEffect == HOLD_EFFECT_IRON_BALL && !(ability == ABILITY_KLUTZ || (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM))) || (gFieldStatuses & STATUS_FIELD_GRAVITY) || (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM))
return TRUE;
else
return FALSE;

View File

@ -423,23 +423,14 @@ static inline s32 DmgRoll(s32 dmg)
bool32 IsDamageMoveUnusable(u32 battlerAtk, u32 battlerDef, u32 move, u32 moveType)
{
struct AiLogicData *aiData = AI_DATA;
u32 battlerDefAbility;
if (DoesBattlerIgnoreAbilityChecks(battlerAtk, aiData->abilities[battlerAtk], move))
battlerDefAbility = ABILITY_NONE;
else
battlerDefAbility = aiData->abilities[battlerDef];
if (battlerDef == BATTLE_PARTNER(battlerAtk))
battlerDefAbility = aiData->abilities[battlerDef];
if (gBattleStruct->battlerState[battlerDef].commandingDondozo)
return TRUE;
if (CanAbilityBlockMove(battlerAtk, battlerDef, move, aiData->abilities[battlerDef], FALSE))
if (CanAbilityBlockMove(battlerAtk, battlerDef, move, aiData->abilities[battlerDef], ABILITY_CHECK_TRIGGER))
return TRUE;
if (CanAbilityAbsorbMove(battlerAtk, battlerDef, aiData->abilities[battlerDef], move, moveType, FALSE))
if (CanAbilityAbsorbMove(battlerAtk, battlerDef, aiData->abilities[battlerDef], move, moveType, ABILITY_CHECK_TRIGGER))
return TRUE;
switch (GetMoveEffect(move))
@ -470,7 +461,7 @@ bool32 IsDamageMoveUnusable(u32 battlerAtk, u32 battlerDef, u32 move, u32 moveTy
return TRUE;
break;
case EFFECT_POLTERGEIST:
if (AI_DATA->items[battlerDef] == ITEM_NONE || gFieldStatuses & STATUS_FIELD_MAGIC_ROOM || battlerDefAbility == ABILITY_KLUTZ)
if (AI_DATA->items[battlerDef] == ITEM_NONE || !IsBattlerItemEnabled(battlerDef))
return TRUE;
break;
case EFFECT_FIRST_TURN_ONLY:
@ -533,6 +524,20 @@ static inline s32 SetFixedMoveBasePower(u32 battlerAtk, u32 move)
return fixedBasePower;
}
static inline void AI_StoreBattlerTypes(u32 battlerAtk, u32 *types)
{
types[0] = gBattleMons[battlerAtk].types[0];
types[1] = gBattleMons[battlerAtk].types[1];
types[2] = gBattleMons[battlerAtk].types[2];
}
static inline void AI_RestoreBattlerTypes(u32 battlerAtk, u32 *types)
{
gBattleMons[battlerAtk].types[0] = types[0];
gBattleMons[battlerAtk].types[1] = types[1];
gBattleMons[battlerAtk].types[2] = types[2];
}
static inline void CalcDynamicMoveDamage(struct DamageCalculationData *damageCalcData, s32 *expectedDamage, s32 *minimumDamage, u32 holdEffectAtk, u32 abilityAtk)
{
u32 move = damageCalcData->move;
@ -658,6 +663,9 @@ struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u
{
s32 critChanceIndex, fixedBasePower;
u32 types[3];
AI_StoreBattlerTypes(battlerAtk, types);
ProteanTryChangeType(battlerAtk, aiData->abilities[battlerAtk], move, moveType);
fixedBasePower = SetFixedMoveBasePower(battlerAtk, move);
@ -735,6 +743,8 @@ struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u
aiData->holdEffects[battlerAtk],
aiData->abilities[battlerAtk]);
}
AI_RestoreBattlerTypes(battlerAtk, types);
}
else
{
@ -1068,8 +1078,15 @@ s32 AI_WhoStrikesFirst(u32 battlerAI, u32 battler, u32 moveConsidered)
u32 abilityAI = AI_DATA->abilities[battlerAI];
u32 abilityPlayer = AI_DATA->abilities[battler];
if (GetBattleMovePriority(battlerAI, moveConsidered) > 0)
u32 predictedMove = AI_DATA->lastUsedMove[battler]; // TODO update for move prediction
s8 aiPriority = GetBattleMovePriority(battlerAI, moveConsidered);
s8 playerPriority = GetBattleMovePriority(battler, predictedMove);
if (aiPriority > playerPriority)
return AI_IS_FASTER;
else if (aiPriority < playerPriority)
return AI_IS_SLOWER;
speedBattlerAI = GetBattlerTotalSpeedStatArgs(battlerAI, abilityAI, holdEffectAI);
speedBattler = GetBattlerTotalSpeedStatArgs(battler, abilityPlayer, holdEffectPlayer);
@ -1445,8 +1462,10 @@ bool32 IsConfusionMoveEffect(u32 moveEffect)
}
}
bool32 IsHazardMoveEffect(u32 moveEffect)
bool32 IsHazardMove(u32 move)
{
// Hazard setting moves like Stealth Rock, Spikes, etc.
u32 i, moveEffect = gMovesInfo[move].effect;
switch (moveEffect)
{
case EFFECT_SPIKES:
@ -1454,9 +1473,48 @@ bool32 IsHazardMoveEffect(u32 moveEffect)
case EFFECT_STICKY_WEB:
case EFFECT_STEALTH_ROCK:
return TRUE;
default:
return FALSE;
}
u32 additionalEffectCount = GetMoveAdditionalEffectCount(move);
for (i = 0; i < additionalEffectCount; i++)
{
const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i);
switch (additionalEffect->moveEffect)
{
case MOVE_EFFECT_STEELSURGE:
return TRUE;
}
}
return FALSE;
}
bool32 IsHazardClearingMove(u32 move)
{
// Hazard clearing effects like Rapid Spin, Tidy Up, etc.
u32 i, moveEffect = gMovesInfo[move].effect;
switch (moveEffect)
{
case EFFECT_RAPID_SPIN:
case EFFECT_TIDY_UP:
return TRUE;
case EFFECT_DEFOG:
if (B_DEFOG_EFFECT_CLEARING >= GEN_6)
return TRUE;
break;
}
u32 additionalEffectCount = GetMoveAdditionalEffectCount(move);
for (i = 0; i < additionalEffectCount; i++)
{
const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i);
switch (additionalEffect->moveEffect)
{
case MOVE_EFFECT_DEFOG:
return TRUE;
}
}
return FALSE;
}
bool32 IsMoveRedirectionPrevented(u32 battlerAtk, u32 move, u32 atkAbility)
@ -2360,6 +2418,19 @@ bool32 IsSwitchOutEffect(u32 effect)
}
}
bool32 IsSubstituteEffect(u32 effect)
{
// Substitute effects like Substitute, Shed Tail, etc.
switch (effect)
{
case EFFECT_SUBSTITUTE:
case EFFECT_SHED_TAIL:
return TRUE;
default:
return FALSE;
}
}
bool32 IsChaseEffect(u32 effect)
{
// Effects that hit switching out mons like Pursuit
@ -2931,7 +3002,7 @@ bool32 IsBattlerIncapacitated(u32 battler, u32 ability)
if ((gBattleMons[battler].status1 & STATUS1_FREEZE) && !HasThawingMove(battler))
return TRUE; // if battler has thawing move we assume they will definitely use it, and thus being frozen should be neglected
if (gBattleMons[battler].status1 & STATUS1_SLEEP)
if (gBattleMons[battler].status1 & STATUS1_SLEEP && !HasMoveEffect(battler, EFFECT_SLEEP_TALK))
return TRUE;
if (gBattleMons[battler].status2 & STATUS2_RECHARGE || (ability == ABILITY_TRUANT && gDisableStructs[battler].truantCounter != 0))
@ -3687,6 +3758,20 @@ static const u16 sRecycleEncouragedItems[] =
ITEM_CUSTAP_BERRY,
ITEM_MENTAL_HERB,
ITEM_FOCUS_SASH,
ITEM_SALAC_BERRY,
ITEM_LIECHI_BERRY,
ITEM_AGUAV_BERRY,
ITEM_FIGY_BERRY,
ITEM_IAPAPA_BERRY,
ITEM_MAGO_BERRY,
ITEM_WIKI_BERRY,
ITEM_MENTAL_HERB,
ITEM_POWER_HERB,
ITEM_BERRY_JUICE,
ITEM_WEAKNESS_POLICY,
ITEM_BLUNDER_POLICY,
ITEM_KEE_BERRY,
ITEM_MARANGA_BERRY,
// TODO expand this
};
@ -4065,6 +4150,7 @@ bool32 AI_ShouldCopyStatChanges(u32 battlerAtk, u32 battlerDef)
case STAT_SPATK:
return (HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_SPECIAL));
case STAT_ACC:
return (HasLowAccuracyMove(battlerAtk, battlerDef));
case STAT_EVASION:
case STAT_SPEED:
return TRUE;
@ -4084,7 +4170,10 @@ bool32 AI_ShouldSetUpHazards(u32 battlerAtk, u32 battlerDef, struct AiLogicData
if (aiData->abilities[battlerDef] == ABILITY_MAGIC_BOUNCE
|| CountUsablePartyMons(battlerDef) == 0
|| HasMoveEffect(battlerDef, EFFECT_RAPID_SPIN)
|| HasMoveEffect(battlerDef, EFFECT_DEFOG))
|| HasMoveEffect(battlerDef, EFFECT_TIDY_UP)
|| HasMoveEffect(battlerDef, EFFECT_DEFOG)
|| HasMoveWithAdditionalEffect(battlerDef, MOVE_EFFECT_DEFOG)
|| HasMoveEffect(battlerDef, EFFECT_MAGIC_COAT))
return FALSE;
return TRUE;
@ -4147,31 +4236,32 @@ bool32 AI_ShouldSpicyExtract(u32 battlerAtk, u32 battlerAtkPartner, u32 move, st
&& HasMoveWithCategory(battlerAtkPartner, DAMAGE_CATEGORY_PHYSICAL));
}
void IncreaseSubstituteMoveScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score)
u32 IncreaseSubstituteMoveScore(u32 battlerAtk, u32 battlerDef, u32 move)
{
u32 effect = GetMoveEffect(move);
u32 scoreIncrease = 0;
if (effect == EFFECT_SUBSTITUTE) // Substitute specific
{
if (HasAnyKnownMove(battlerDef) && GetBestDmgFromBattler(battlerDef, battlerAtk) < gBattleMons[battlerAtk].maxHP / 4)
ADJUST_SCORE_PTR(GOOD_EFFECT);
scoreIncrease += GOOD_EFFECT;
}
else if (effect == EFFECT_SHED_TAIL) // Shed Tail specific
{
if ((ShouldPivot(battlerAtk, battlerDef, AI_DATA->abilities[battlerDef], move, AI_THINKING_STRUCT->movesetIndex))
&& (HasAnyKnownMove(battlerDef) && (GetBestDmgFromBattler(battlerDef, battlerAtk) < gBattleMons[battlerAtk].maxHP / 2)))
ADJUST_SCORE_PTR(BEST_EFFECT);
scoreIncrease += BEST_EFFECT;
}
if (gStatuses3[battlerDef] & STATUS3_PERISH_SONG)
ADJUST_SCORE_PTR(GOOD_EFFECT);
scoreIncrease += GOOD_EFFECT;
if (gBattleMons[battlerDef].status1 & STATUS1_SLEEP)
ADJUST_SCORE_PTR(GOOD_EFFECT);
scoreIncrease += GOOD_EFFECT;
else if (gBattleMons[battlerDef].status1 & (STATUS1_BURN | STATUS1_PSN_ANY | STATUS1_FROSTBITE))
ADJUST_SCORE_PTR(DECENT_EFFECT);
scoreIncrease += DECENT_EFFECT;
if (IsBattlerPredictedToSwitch(battlerDef))
ADJUST_SCORE(DECENT_EFFECT);
scoreIncrease += DECENT_EFFECT;
if (HasMoveEffect(battlerDef, EFFECT_SLEEP)
|| HasMoveEffect(battlerDef, EFFECT_TOXIC)
@ -4180,8 +4270,33 @@ void IncreaseSubstituteMoveScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *
|| HasMoveEffect(battlerDef, EFFECT_WILL_O_WISP)
|| HasMoveEffect(battlerDef, EFFECT_CONFUSE)
|| HasMoveEffect(battlerDef, EFFECT_LEECH_SEED))
ADJUST_SCORE_PTR(GOOD_EFFECT);
scoreIncrease += GOOD_EFFECT;
if (AI_DATA->hpPercents[battlerAtk] > 70)
ADJUST_SCORE_PTR(WEAK_EFFECT);
scoreIncrease += WEAK_EFFECT;
return scoreIncrease;
}
bool32 HasLowAccuracyMove(u32 battlerAtk, u32 battlerDef)
{
int i;
for (i = 0; i < MAX_MON_MOVES; i++)
{
if (AI_DATA->moveAccuracy[battlerAtk][battlerDef][i] <= LOW_ACCURACY_THRESHOLD)
return TRUE;
}
return FALSE;
}
bool32 IsBattlerItemEnabled(u32 battler)
{
if (AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_NEGATE_UNAWARE)
return TRUE;
if (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM)
return FALSE;
if (gStatuses3[battler] & STATUS3_EMBARGO)
return FALSE;
if (gBattleMons[battler].ability == ABILITY_KLUTZ && !(gStatuses3[battler] & STATUS3_GASTRO_ACID))
return FALSE;
return TRUE;
}

View File

@ -304,7 +304,7 @@ void DoMoveAnim(u16 move)
// Make sure the anim target of moves hitting everyone is at the opposite side.
if (GetBattlerMoveTargetType(gBattlerAttacker, move) & MOVE_TARGET_FOES_AND_ALLY && IsDoubleBattle())
{
while (GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget))
while (IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget))
{
if (++gBattleAnimTarget >= MAX_BATTLERS_COUNT)
gBattleAnimTarget = 0;
@ -563,7 +563,7 @@ static u8 GetBattleAnimMoveTargets(u8 battlerArgIndex, u8 *targets)
case MOVE_TARGET_BOTH: // all opponents
for (i = 0; i < gBattlersCount; i++)
{
if (i != ignoredTgt && !IsAlly(i, ignoredTgt) && IS_ALIVE_AND_PRESENT(i))
if (i != ignoredTgt && !IsBattlerAlly(i, ignoredTgt) && IS_ALIVE_AND_PRESENT(i))
targets[numTargets++] = i + MAX_BATTLERS_COUNT;
}
break;
@ -2157,8 +2157,7 @@ static void Cmd_teamattack_moveback(void)
sBattleAnimScriptPtr += 2;
// Apply to double battles when attacking own side
if (!IsContest() && IsDoubleBattle()
&& GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget))
if (!IsContest() && IsDoubleBattle() && IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget))
{
if (wantedBattler == ANIM_ATTACKER)
{
@ -2195,7 +2194,7 @@ static void Cmd_teamattack_movefwd(void)
// Apply to double battles when attacking own side
if (!IsContest() && IsDoubleBattle()
&& GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget))
&& IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget))
{
if (wantedBattler == ANIM_ATTACKER)
{

View File

@ -389,7 +389,7 @@ void AnimTranslateStinger(struct Sprite *sprite)
}
}
if (!IsContest() && GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget))
if (!IsContest() && IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget))
{
if (GetBattlerPosition(gBattleAnimTarget) == B_POSITION_PLAYER_LEFT
|| GetBattlerPosition(gBattleAnimTarget) == B_POSITION_OPPONENT_LEFT)

View File

@ -4022,7 +4022,7 @@ static const union AffineAnimCmd *const sAffineAnims_TeraStarstormBeamRing[] =
sAffineAnim_TeraStarstormBeamRing,
};
const struct SpriteTemplate gTeraStarstormBeamSpriteTemplate =
const struct SpriteTemplate gTeraStarstormBeamSpriteTemplate =
{
.tileTag = ANIM_TAG_STARSTORM,
.paletteTag = ANIM_TAG_STARSTORM,
@ -4170,7 +4170,7 @@ void AnimTranslateLinearSingleSineWave(struct Sprite *sprite)
sprite->data[5] = gBattleAnimArgs[5];
InitAnimArcTranslation(sprite);
if (GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget))
if (IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget))
sprite->data[0] = 1;
else
sprite->data[0] = 0;
@ -6845,10 +6845,12 @@ static void TrySwapWishBattlerIds(u32 battlerAtk, u32 battlerPartner)
// if used future sight on opposing side, properly track who used it
if (gSideStatuses[oppSide] & SIDE_STATUS_FUTUREATTACK)
{
u32 battlerAtkSide = GetBattlerSide(battlerAtk);
for (i = 0; i < gBattlersCount; i++)
{
if (IsAlly(i,battlerAtk))
if (battlerAtkSide == GetBattlerSide(i))
continue; // only on opposing side
if (gWishFutureKnock.futureSightBattlerIndex[i] == battlerAtk)
{
// if target was attacked with future sight from us, now they'll be the partner slot

View File

@ -717,7 +717,7 @@ static void AnimSunlight(struct Sprite *sprite)
// arg 6: ? (todo: something related to which mon the pixel offsets are based on)
static void AnimEmberFlare(struct Sprite *sprite)
{
if (GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget)
if (IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget)
&& (gBattleAnimAttacker == GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT)
|| gBattleAnimAttacker == GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)))
gBattleAnimArgs[2] = -gBattleAnimArgs[2];

View File

@ -8896,7 +8896,7 @@ static void SpriteCB_AnimSpriteOnTargetSideCentre(struct Sprite *sprite)
if (!sprite->data[0])
{
if (IsAlly(gBattleAnimAttacker, target))
if (IsBattlerAlly(gBattleAnimAttacker, target))
{
if (IsDoubleBattle())
InitSpritePosToAnimAttackersCentre(sprite, FALSE);
@ -9072,7 +9072,7 @@ static void SpriteCB_DragonEnergyShot(struct Sprite* sprite)
u8 def1 = gBattleAnimTarget;
u8 def2 = BATTLE_PARTNER(def1);
if (!IsDoubleBattle() || IsAlly(gBattleAnimAttacker, gBattleAnimTarget))
if (!IsDoubleBattle() || IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget))
y = GetBattlerSpriteCoord(def1, BATTLER_COORD_Y_PIC_OFFSET);
else
{
@ -9172,7 +9172,7 @@ static void SpriteCB_GlacialLance(struct Sprite* sprite)
sprite->data[0] = gBattleAnimArgs[6];
if (!IsDoubleBattle() || IsAlly(gBattleAnimAttacker, gBattleAnimTarget))
if (!IsDoubleBattle() || IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget))
{
sprite->data[2] = GetBattlerSpriteCoord(def1, BATTLER_COORD_X_2) + gBattleAnimArgs[2]; //Converge on target
sprite->data[4] = GetBattlerSpriteCoord(def1, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3];

View File

@ -501,7 +501,7 @@ static void AnimPsychoCut(struct Sprite *sprite)
}
}
if (!IsContest() && GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget))
if (!IsContest() && IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget))
{
if (GetBattlerPosition(gBattleAnimTarget) == B_POSITION_PLAYER_LEFT
|| GetBattlerPosition(gBattleAnimTarget) == B_POSITION_OPPONENT_LEFT)

View File

@ -403,7 +403,7 @@ void AnimTask_CentredFrozenIceCube(u8 taskId)
u8 battler1 = gBattleAnimTarget;
u8 battler2 = BATTLE_PARTNER(battler1);
if (!IsDoubleBattle() || IsAlly(gBattleAnimAttacker, gBattleAnimTarget))
if (!IsDoubleBattle() || IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget))
{
x = GetBattlerSpriteCoord(battler1, BATTLER_COORD_X_2);
y = GetBattlerSpriteCoord(battler1, BATTLER_COORD_Y_PIC_OFFSET);

View File

@ -1036,7 +1036,7 @@ void AnimTask_SetAnimAttackerAndTargetForEffectTgt(u8 taskId)
void AnimTask_IsTargetSameSide(u8 taskId)
{
if (GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget))
if (IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget))
gBattleAnimArgs[ARG_RET_ID] = TRUE;
else
gBattleAnimArgs[ARG_RET_ID] = FALSE;

View File

@ -940,7 +940,7 @@ static void AnimHydroCannonBeam(struct Sprite *sprite)
{
bool8 animType;
u8 coordType;
if (GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget))
if (IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget))
{
gBattleAnimArgs[0] *= -1;
if (GetBattlerPosition(gBattleAnimAttacker) == B_POSITION_PLAYER_LEFT || GetBattlerPosition(gBattleAnimAttacker) == B_POSITION_OPPONENT_LEFT)

View File

@ -560,7 +560,7 @@ static void OpponentHandleChooseMove(u32 battler)
default:
{
u16 chosenMove = moveInfo->moves[chosenMoveId];
if (GetBattlerMoveTargetType(battler, chosenMove) & (MOVE_TARGET_USER_OR_SELECTED | MOVE_TARGET_USER))
if (GetBattlerMoveTargetType(battler, chosenMove) & MOVE_TARGET_USER)
gBattlerTarget = battler;
if (GetBattlerMoveTargetType(battler, chosenMove) & MOVE_TARGET_BOTH)
{
@ -595,7 +595,7 @@ static void OpponentHandleChooseMove(u32 battler)
move = moveInfo->moves[chosenMoveId];
} while (move == MOVE_NONE);
if (GetBattlerMoveTargetType(battler, move) & (MOVE_TARGET_USER_OR_SELECTED | MOVE_TARGET_USER))
if (GetBattlerMoveTargetType(battler, move) & MOVE_TARGET_USER)
BtlController_EmitTwoReturnValues(battler, BUFFER_B, 10, (chosenMoveId) | (battler << 8));
else if (IsDoubleBattle())
{

View File

@ -495,8 +495,6 @@ void HandleInputChooseTarget(u32 battler)
case B_POSITION_PLAYER_RIGHT:
if (battler != gMultiUsePlayerCursor)
i++;
else if (moveTarget & MOVE_TARGET_USER_OR_SELECTED)
i++;
break;
case B_POSITION_OPPONENT_LEFT:
case B_POSITION_OPPONENT_RIGHT:
@ -505,7 +503,8 @@ void HandleInputChooseTarget(u32 battler)
}
if (gAbsentBattlerFlags & (1u << gMultiUsePlayerCursor)
|| !CanTargetBattler(battler, gMultiUsePlayerCursor, move))
|| !CanTargetBattler(battler, gMultiUsePlayerCursor, move)
|| (moveTarget & MOVE_TARGET_OPPONENT && GetBattlerSide(gMultiUsePlayerCursor) == B_SIDE_PLAYER))
i = 0;
} while (i == 0);
}
@ -545,8 +544,6 @@ void HandleInputChooseTarget(u32 battler)
case B_POSITION_PLAYER_RIGHT:
if (battler != gMultiUsePlayerCursor)
i++;
else if (moveTarget & MOVE_TARGET_USER_OR_SELECTED)
i++;
break;
case B_POSITION_OPPONENT_LEFT:
case B_POSITION_OPPONENT_RIGHT:
@ -555,7 +552,8 @@ void HandleInputChooseTarget(u32 battler)
}
if (gAbsentBattlerFlags & (1u << gMultiUsePlayerCursor)
|| !CanTargetBattler(battler, gMultiUsePlayerCursor, move))
|| !CanTargetBattler(battler, gMultiUsePlayerCursor, move)
|| (moveTarget & MOVE_TARGET_OPPONENT && GetBattlerSide(gMultiUsePlayerCursor) == B_SIDE_PLAYER))
i = 0;
} while (i == 0);
}
@ -690,12 +688,7 @@ void HandleInputChooseMove(u32 battler)
else
gMultiUsePlayerCursor = GetOpposingSideBattler(battler);
if (!gBattleResources->bufferA[battler][1]) // not a double battle
{
if (moveTarget & MOVE_TARGET_USER_OR_SELECTED && !gBattleResources->bufferA[battler][2])
canSelectTarget = 1;
}
else // double battle
if (gBattleResources->bufferA[battler][1]) // a double battle
{
if (!(moveTarget & (MOVE_TARGET_RANDOM | MOVE_TARGET_BOTH | MOVE_TARGET_DEPENDS | MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_USER | MOVE_TARGET_ALLY)))
canSelectTarget = 1; // either selected or user
@ -706,7 +699,7 @@ void HandleInputChooseMove(u32 battler)
{
canSelectTarget = 0;
}
else if (!(moveTarget & (MOVE_TARGET_USER | MOVE_TARGET_USER_OR_SELECTED)) && CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_BATTLER, battler) <= 1)
else if (!(moveTarget & MOVE_TARGET_USER) && CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_BATTLER, battler) <= 1)
{
gMultiUsePlayerCursor = GetDefaultMoveTarget(battler);
canSelectTarget = 0;
@ -749,7 +742,7 @@ void HandleInputChooseMove(u32 battler)
case 1:
gBattlerControllerFuncs[battler] = HandleInputChooseTarget;
if (moveTarget & (MOVE_TARGET_USER | MOVE_TARGET_USER_OR_SELECTED))
if (moveTarget & MOVE_TARGET_USER)
gMultiUsePlayerCursor = battler;
else if (gAbsentBattlerFlags & (1u << GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)))
gMultiUsePlayerCursor = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);

View File

@ -353,7 +353,7 @@ static void PlayerPartnerHandleChooseMove(u32 battler)
gBattlerTarget = gBattleStruct->aiChosenTarget[battler];
u32 moveTarget = GetBattlerMoveTargetType(battler, moveInfo->moves[chosenMoveId]);
if (moveTarget & (MOVE_TARGET_USER | MOVE_TARGET_USER_OR_SELECTED))
if (moveTarget & MOVE_TARGET_USER)
gBattlerTarget = battler;
else if (moveTarget & MOVE_TARGET_BOTH)
{

View File

@ -326,7 +326,7 @@ static u8 GetBattlePalaceMoveGroup(u8 battler, u16 move)
switch (GetBattlerMoveTargetType(battler, move))
{
case MOVE_TARGET_SELECTED:
case MOVE_TARGET_USER_OR_SELECTED:
case MOVE_TARGET_OPPONENT:
case MOVE_TARGET_RANDOM:
case MOVE_TARGET_BOTH:
case MOVE_TARGET_FOES_AND_ALLY:

View File

@ -371,10 +371,10 @@ void UpdateIndicatorLevelData(u32 healthboxId, u32 level)
static const s8 sIndicatorPositions[][2] =
{
[B_POSITION_PLAYER_LEFT] = {53, -9},
[B_POSITION_OPPONENT_LEFT] = {44, -9},
[B_POSITION_PLAYER_RIGHT] = {52, -9},
[B_POSITION_OPPONENT_RIGHT] = {44, -9},
[B_POSITION_PLAYER_LEFT] = {49, -9},
[B_POSITION_OPPONENT_LEFT] = {40, -9},
[B_POSITION_PLAYER_RIGHT] = {48, -9},
[B_POSITION_OPPONENT_RIGHT] = {40, -9},
};
void CreateIndicatorSprite(u32 battler)

View File

@ -513,7 +513,8 @@ static void CB2_InitBattleInternal(void)
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && !(gBattleTypeFlags & (BATTLE_TYPE_FRONTIER
| BATTLE_TYPE_EREADER_TRAINER
| BATTLE_TYPE_TRAINER_HILL)))
| BATTLE_TYPE_TRAINER_HILL
| BATTLE_TYPE_RECORDED)))
{
gBattleTypeFlags |= (IsTrainerDoubleBattle(TRAINER_BATTLE_PARAM.opponentA) ? BATTLE_TYPE_DOUBLE : 0);
}
@ -3205,6 +3206,9 @@ void SwitchInClearSetData(u32 battler)
gCurrentMove = MOVE_NONE;
gBattleStruct->arenaTurnCounter = 0xFF;
// Restore struct member so replacement does not miss timing
gSpecialStatuses[battler].switchInAbilityDone = FALSE;
// Reset damage to prevent things like red card activating if the switched-in mon is holding it
gSpecialStatuses[battler].physicalDmg = 0;
gSpecialStatuses[battler].specialDmg = 0;
@ -3875,7 +3879,7 @@ static void TryDoEventsBeforeFirstTurn(void)
gBattleStruct->monToSwitchIntoId[i] = PARTY_SIZE;
gChosenActionByBattler[i] = B_ACTION_NONE;
gChosenMoveByBattler[i] = MOVE_NONE;
gBattleStruct->battlerState[i].absentBattlerFlags = gAbsentBattlerFlags & (1u << i);
gBattleStruct->battlerState[i].absentBattlerFlags = (gAbsentBattlerFlags & (1u << i) ? TRUE : FALSE);
}
TurnValuesCleanUp(FALSE);
SpecialStatusesClear();
@ -3985,7 +3989,7 @@ void BattleTurnPassed(void)
{
gChosenActionByBattler[i] = B_ACTION_NONE;
gChosenMoveByBattler[i] = MOVE_NONE;
gBattleStruct->battlerState[i].absentBattlerFlags = gAbsentBattlerFlags & (1u << i);
gBattleStruct->battlerState[i].absentBattlerFlags = (gAbsentBattlerFlags & (1u << i) ? TRUE : FALSE);
gBattleStruct->monToSwitchIntoId[i] = PARTY_SIZE;
gStatuses4[i] &= ~STATUS4_ELECTRIFIED;
gBattleMons[i].status2 &= ~STATUS2_FLINCHED;

View File

@ -344,6 +344,7 @@ static bool8 CanBurnHitThaw(u16 move);
static u32 GetNextTarget(u32 moveTarget, bool32 excludeCurrent);
static void TryUpdateEvolutionTracker(u32 evolutionMethod, u32 upAmount, u16 usedMove);
static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u8 *failInstr, u16 move);
static void ResetValuesForCalledMove(void);
static void Cmd_attackcanceler(void);
static void Cmd_accuracycheck(void);
@ -1147,19 +1148,6 @@ bool32 ProteanTryChangeType(u32 battler, u32 ability, u32 move, u32 moveType)
return FALSE;
}
bool32 ShouldTeraShellDistortTypeMatchups(u32 move, u32 battlerDef)
{
if (!gSpecialStatuses[battlerDef].distortedTypeMatchups
&& gBattleMons[battlerDef].species == SPECIES_TERAPAGOS_TERASTAL
&& gBattleMons[battlerDef].hp == gBattleMons[battlerDef].maxHP
&& !IsBattleMoveStatus(move)
&& !(gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_NO_EFFECT)
&& GetBattlerAbility(battlerDef) == ABILITY_TERA_SHELL)
return TRUE;
return FALSE;
}
bool32 IsMoveNotAllowedInSkyBattles(u32 move)
{
return (gBattleStruct->isSkyBattle && IsMoveSkyBattleBanned(gCurrentMove));
@ -1209,6 +1197,9 @@ static void Cmd_attackcanceler(void)
if (AbilityBattleEffects(ABILITYEFFECT_MOVES_BLOCK, gBattlerTarget, 0, 0, 0))
return;
if (gMovesInfo[gCurrentMove].effect == EFFECT_PARALYZE && AbilityBattleEffects(ABILITYEFFECT_ABSORBING, gBattlerTarget, 0, 0, gCurrentMove))
return;
if (!gBattleMons[gBattlerAttacker].pp[gCurrMovePos] && gCurrentMove != MOVE_STRUGGLE
&& !(gHitMarker & (HITMARKER_ALLOW_NO_PP | HITMARKER_NO_ATTACKSTRING | HITMARKER_NO_PPDEDUCT))
&& !(gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS))
@ -2008,10 +1999,21 @@ static void Cmd_critcalc(void)
gBattlescriptCurrInstr = cmd->nextInstr;
}
static inline void GetShellSideArmCategory(u32 battlerDef)
static inline void CalculateAndSetMoveDamage(struct DamageCalculationData *damageCalcData, u32 battlerDef)
{
if (GetMoveEffect(gCurrentMove) == EFFECT_SHELL_SIDE_ARM)
gBattleStruct->swapDamageCategory = (gBattleStruct->shellSideArmCategory[gBattlerAttacker][battlerDef] != GetMoveCategory(gCurrentMove));
damageCalcData->battlerDef = battlerDef;
damageCalcData->isCrit = gSpecialStatuses[battlerDef].criticalHit;
gBattleStruct->moveDamage[battlerDef] = CalculateMoveDamage(damageCalcData, 0);
// Slighly hacky but we need to check move result flags for distortion match-up as well but it can only be done after damage calcs
if (gSpecialStatuses[battlerDef].distortedTypeMatchups && gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_NO_EFFECT)
{
gSpecialStatuses[battlerDef].distortedTypeMatchups = FALSE;
gSpecialStatuses[battlerDef].teraShellAbilityDone = FALSE;
}
}
static void Cmd_damagecalc(void)
@ -2043,28 +2045,12 @@ static void Cmd_damagecalc(void)
|| gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_NO_EFFECT)
continue;
if (ShouldTeraShellDistortTypeMatchups(gCurrentMove, battlerDef))
{
gSpecialStatuses[battlerDef].distortedTypeMatchups = TRUE;
gSpecialStatuses[battlerDef].teraShellAbilityDone = TRUE;
}
GetShellSideArmCategory(battlerDef);
damageCalcData.battlerDef = battlerDef;
damageCalcData.isCrit = gSpecialStatuses[battlerDef].criticalHit;
gBattleStruct->moveDamage[battlerDef] = CalculateMoveDamage(&damageCalcData, 0);
CalculateAndSetMoveDamage(&damageCalcData, battlerDef);
}
}
else
{
if (ShouldTeraShellDistortTypeMatchups(gCurrentMove, gBattlerTarget))
{
gSpecialStatuses[gBattlerTarget].distortedTypeMatchups = TRUE;
gSpecialStatuses[gBattlerTarget].teraShellAbilityDone = TRUE;
}
GetShellSideArmCategory(gBattlerTarget);
damageCalcData.battlerDef = gBattlerTarget;
damageCalcData.isCrit = gSpecialStatuses[gBattlerTarget].criticalHit;
gBattleStruct->moveDamage[gBattlerTarget] = CalculateMoveDamage(&damageCalcData, 0);
CalculateAndSetMoveDamage(&damageCalcData, gBattlerTarget);
}
gBattlescriptCurrInstr = cmd->nextInstr;
@ -3901,7 +3887,7 @@ void SetMoveEffect(bool32 primary, bool32 certain)
gProtectStructs[gBattlerTarget].banefulBunkered = FALSE;
gProtectStructs[gBattlerTarget].obstructed = FALSE;
gProtectStructs[gBattlerTarget].silkTrapped = FALSE;
gProtectStructs[gBattlerAttacker].burningBulwarked = FALSE;
gProtectStructs[gBattlerTarget].burningBulwarked = FALSE;
BattleScriptPush(gBattlescriptCurrInstr + 1);
if (gCurrentMove == MOVE_HYPERSPACE_FURY)
gBattlescriptCurrInstr = BattleScript_HyperspaceFuryRemoveProtect;
@ -6377,6 +6363,7 @@ static void Cmd_moveend(void)
else if (moveRecoil > 0
&& !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)
&& IsBattlerAlive(gBattlerAttacker)
&& IsBattlerTurnDamaged(gBattlerTarget)
&& gBattleScripting.savedDmg != 0) // Some checks may be redundant alongside this one
{
gBattleStruct->moveDamage[gBattlerAttacker] = max(1, gBattleScripting.savedDmg * max(1, moveRecoil) / 100);
@ -7346,7 +7333,7 @@ static void Cmd_moveend(void)
else if (IsBattlerAlive(gBattlerTarget))
{
gBattlerAttacker = gBattlerTarget;
if (gBattleStruct->pursuitSwitchByMove)
if (gBattleStruct->pursuitStoredSwitch == PARTY_SIZE)
gBattlescriptCurrInstr = BattleScript_MoveSwitchOpenPartyScreen;
else
gBattlescriptCurrInstr = BattleScript_DoSwitchOut;
@ -8747,6 +8734,18 @@ static void Cmd_hidepartystatussummary(void)
gBattlescriptCurrInstr = cmd->nextInstr;
}
static void ResetValuesForCalledMove(void)
{
if (gBattlerByTurnOrder[gCurrentTurnActionNumber] != gBattlerAttacker)
gBattleStruct->atkCancellerTracker = 0;
else
SetAtkCancellerForCalledMove();
gBattleScripting.animTurn = 0;
gBattleScripting.animTargetsHit = 0;
SetTypeBeforeUsingMove(gCurrentMove, gBattlerAttacker);
HandleMoveTargetRedirection();
}
static void Cmd_jumptocalledmove(void)
{
CMD_ARGS(bool8 notChosenMove);
@ -8756,6 +8755,8 @@ static void Cmd_jumptocalledmove(void)
else
gChosenMove = gCurrentMove = gCalledMove;
ResetValuesForCalledMove();
gBattlescriptCurrInstr = GetMoveBattleScript(gCurrentMove);
}
@ -10812,10 +10813,8 @@ static void Cmd_various(void)
gBattlescriptCurrInstr = cmd->failInstr;
else
{
SetTypeBeforeUsingMove(gCalledMove, gBattlerTarget);
gEffectBattler = gBattleStruct->lastMoveTarget[gBattlerTarget];
gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED;
gBattleStruct->atkCancellerTracker = 0;
PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, battler, gBattlerPartyIndexes[battler]);
gBattlescriptCurrInstr = cmd->nextInstr;
}
@ -11611,7 +11610,8 @@ static void TryResetProtectUseCounter(u32 battler)
u32 lastEffect = GetMoveEffect(lastMove);
if (lastMove == MOVE_UNAVAILABLE
|| (!gBattleMoveEffects[lastEffect].usesProtectCounter
&& (B_ALLY_SWITCH_FAIL_CHANCE >= GEN_9 && lastEffect != EFFECT_ALLY_SWITCH)))
&& ((B_ALLY_SWITCH_FAIL_CHANCE >= GEN_9 && lastEffect != EFFECT_ALLY_SWITCH)
|| B_ALLY_SWITCH_FAIL_CHANCE < GEN_9)))
gDisableStructs[battler].protectUses = 0;
}
@ -11805,8 +11805,8 @@ static void SetMoveForMirrorMove(u32 move)
gCurrentMove = move;
}
SetAtkCancellerForCalledMove();
gBattlerTarget = GetBattleMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE);
ResetValuesForCalledMove();
gBattlescriptCurrInstr = GetMoveBattleScript(gCurrentMove);
}
@ -12490,7 +12490,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr
// Check Mirror Herb / Opportunist
for (index = 0; index < gBattlersCount; index++)
{
if (GetBattlerSide(index) == GetBattlerSide(battler))
if (IsBattlerAlly(index, battler))
continue; // Only triggers on opposing side
if (GetBattlerAbility(index) == ABILITY_OPPORTUNIST
@ -12615,7 +12615,6 @@ static void Cmd_forcerandomswitch(void)
{
CMD_ARGS(const u8 *failInstr);
s32 i;
s32 battler1PartyId = 0;
s32 battler2PartyId = 0;
@ -12750,7 +12749,7 @@ static void Cmd_forcerandomswitch(void)
battler1PartyId = gBattlerPartyIndexes[gBattlerTarget];
}
for (i = firstMonId; i < lastMonId; i++)
for (u32 i = firstMonId; i < lastMonId; i++)
{
if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE
&& !GetMonData(&party[i], MON_DATA_IS_EGG)
@ -12781,12 +12780,12 @@ static void Cmd_forcerandomswitch(void)
|| (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK && gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER)
|| (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK && gBattleTypeFlags & BATTLE_TYPE_MULTI))
{
SwitchPartyOrderLinkMulti(gBattlerTarget, i, 0);
SwitchPartyOrderLinkMulti(BATTLE_PARTNER(gBattlerTarget), i, 1);
SwitchPartyOrderLinkMulti(gBattlerTarget, gBattleStruct->monToSwitchIntoId[gBattlerTarget], 0);
SwitchPartyOrderLinkMulti(BATTLE_PARTNER(gBattlerTarget), gBattleStruct->monToSwitchIntoId[gBattlerTarget], 1);
}
if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER)
SwitchPartyOrderInGameMulti(gBattlerTarget, i);
SwitchPartyOrderInGameMulti(gBattlerTarget, gBattleStruct->monToSwitchIntoId[gBattlerTarget]);
}
}
else
@ -13335,10 +13334,10 @@ static void Cmd_metronome(void)
#endif
gCurrentMove = RandomUniformExcept(RNG_METRONOME, 1, moveCount - 1, InvalidMetronomeMove);
SetAtkCancellerForCalledMove();
PrepareStringBattle(STRINGID_WAGGLINGAFINGER, gBattlerAttacker);
gBattlescriptCurrInstr = GetMoveBattleScript(gCurrentMove);
gBattlerTarget = GetBattleMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE);
ResetValuesForCalledMove();
}
static void Cmd_dmgtolevel(void)
@ -14277,7 +14276,6 @@ static void Cmd_jumpifnopursuitswitchdmg(void)
{
ChangeOrderTargetAfterAttacker();
gBattleStruct->battlerState[gBattlerAttacker].pursuitTarget = TRUE;
gBattleStruct->pursuitSwitchByMove = gActionsByTurnOrder[gCurrentTurnActionNumber] == B_ACTION_USE_MOVE;
gBattleStruct->pursuitStoredSwitch = gBattleStruct->monToSwitchIntoId[gBattlerAttacker];
gBattleStruct->moveTarget[gBattlerTarget] = gBattlerAttacker;
gBattlerTarget = savedTarget;
@ -16347,12 +16345,13 @@ static void Cmd_trygivecaughtmonnick(void)
{
GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_NICKNAME, gBattleStruct->caughtMonNick);
FreeAllWindowBuffers();
MainCallback callback = CalculatePlayerPartyCount() == PARTY_SIZE ? ReshowBlankBattleScreenAfterMenu : BattleMainCB2;
DoNamingScreen(NAMING_SCREEN_CAUGHT_MON, gBattleStruct->caughtMonNick,
GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_SPECIES),
GetMonGender(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]]),
GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_PERSONALITY, NULL),
ReshowBattleScreenAfterMenu);
callback);
gBattleCommunication[MULTIUSE_STATE]++;
}
@ -17696,13 +17695,25 @@ void BS_AllySwitchFailChance(void)
gBattlescriptCurrInstr = cmd->nextInstr;
}
void BS_SetPhotonGeyserCategory(void)
void BS_SetDynamicMoveCategory(void)
{
NATIVE_ARGS();
u32 effect = GetMoveEffect(gCurrentMove);
if (!((effect == EFFECT_TERA_BLAST && GetActiveGimmick(gBattlerAttacker) != GIMMICK_TERA)
|| (effect == EFFECT_TERA_STARSTORM && GetActiveGimmick(gBattlerAttacker) != GIMMICK_TERA && gBattleMons[gBattlerAttacker].species == SPECIES_TERAPAGOS_STELLAR)))
switch (GetMoveEffect(gCurrentMove))
{
case EFFECT_TERA_BLAST:
if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_TERA)
gBattleStruct->swapDamageCategory = (GetCategoryBasedOnStats(gBattlerAttacker) != GetMoveCategory(gCurrentMove));
break;
case EFFECT_TERA_STARSTORM:
if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_TERA && gBattleMons[gBattlerAttacker].species == SPECIES_TERAPAGOS_STELLAR)
gBattleStruct->swapDamageCategory = (GetCategoryBasedOnStats(gBattlerAttacker) != GetMoveCategory(gCurrentMove));
break;
default:
gBattleStruct->swapDamageCategory = (GetCategoryBasedOnStats(gBattlerAttacker) != GetMoveCategory(gCurrentMove));
break;
}
gBattlescriptCurrInstr = cmd->nextInstr;
}
@ -17950,7 +17961,7 @@ void BS_JumpIfSleepClause(void)
NATIVE_ARGS(const u8 *jumpInstr);
// Can freely sleep own partner
if (IsDoubleBattle() && IsSleepClauseEnabled() && GetBattlerSide(gBattlerAttacker) == GetBattlerSide(gBattlerTarget))
if (IsDoubleBattle() && IsSleepClauseEnabled() && IsBattlerAlly(gBattlerAttacker, gBattlerTarget))
{
gBattleStruct->battlerState[gBattlerTarget].sleepClauseEffectExempt = TRUE;
gBattlescriptCurrInstr = cmd->nextInstr;
@ -18025,14 +18036,10 @@ void BS_JumpIfBlockedBySoundproof(void)
void BS_SetMagicCoatTarget(void)
{
NATIVE_ARGS();
u32 side;
gBattleStruct->attackerBeforeBounce = gBattleScripting.battler = gBattlerAttacker;
gBattlerAttacker = gBattlerTarget;
side = BATTLE_OPPOSITE(GetBattlerSide(gBattlerAttacker));
if (IsAffectedByFollowMe(gBattlerAttacker, side, gCurrentMove))
gBattlerTarget = gSideTimers[side].followmeTarget;
else
gBattlerTarget = gBattleStruct->attackerBeforeBounce;
gBattlerTarget = gBattleStruct->attackerBeforeBounce;
HandleMoveTargetRedirection();
gBattlescriptCurrInstr = cmd->nextInstr;
}
@ -18070,7 +18077,7 @@ void BS_TryWindRiderPower(void)
u32 battler = GetBattlerForBattleScript(cmd->battler);
u16 ability = GetBattlerAbility(battler);
if (GetBattlerSide(battler) == GetBattlerSide(gBattlerAttacker)
if (IsBattlerAlly(battler, gBattlerAttacker)
&& (ability == ABILITY_WIND_RIDER || ability == ABILITY_WIND_POWER))
{
gLastUsedAbility = ability;

View File

@ -65,6 +65,7 @@ static u32 GetFlingPowerFromItemId(u32 itemId);
static void SetRandomMultiHitCounter();
static u32 GetBattlerItemHoldEffectParam(u32 battler, u32 item);
static bool32 CanBeInfinitelyConfused(u32 battler);
ARM_FUNC NOINLINE static uq4_12_t PercentToUQ4_12(u32 percent);
ARM_FUNC NOINLINE static uq4_12_t PercentToUQ4_12_Floored(u32 percent);
@ -243,10 +244,10 @@ u32 EndOrContinueWeather(void)
return 0;
}
static u8 CalcBeatUpPower(void)
static u32 CalcBeatUpPower(void)
{
u8 basePower;
u16 species;
u32 basePower;
u32 species;
struct Pokemon *party = GetBattlerParty(gBattlerAttacker);
// Party slot is incremented by the battle script for Beat Up after this damage calculation
@ -256,6 +257,18 @@ static u8 CalcBeatUpPower(void)
return basePower;
}
static bool32 ShouldTeraShellDistortTypeMatchups(u32 move, u32 battlerDef, u32 abilityDef)
{
if (!gSpecialStatuses[battlerDef].distortedTypeMatchups
&& gBattleMons[battlerDef].species == SPECIES_TERAPAGOS_TERASTAL
&& gBattleMons[battlerDef].hp == gBattleMons[battlerDef].maxHP
&& !IsBattleMoveStatus(move)
&& abilityDef == ABILITY_TERA_SHELL)
return TRUE;
return FALSE;
}
bool32 IsAffectedByFollowMe(u32 battlerAtk, u32 defSide, u32 move)
{
u32 ability = GetBattlerAbility(battlerAtk);
@ -276,11 +289,69 @@ bool32 IsAffectedByFollowMe(u32 battlerAtk, u32 defSide, u32 move)
return TRUE;
}
bool32 HandleMoveTargetRedirection(void)
{
u32 redirectorOrderNum = MAX_BATTLERS_COUNT;
u16 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove);
u32 moveType = GetBattleMoveType(gCurrentMove);
u32 moveEffect = GetMoveEffect(gCurrentMove);
u32 side = BATTLE_OPPOSITE(GetBattlerSide(gBattlerAttacker));
u32 ability = GetBattlerAbility(gBattleStruct->moveTarget[gBattlerAttacker]);
if (IsAffectedByFollowMe(gBattlerAttacker, side, gCurrentMove)
&& moveTarget == MOVE_TARGET_SELECTED
&& GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gSideTimers[side].followmeTarget))
{
gBattleStruct->moveTarget[gBattlerAttacker] = gBattlerTarget = gSideTimers[side].followmeTarget; // follow me moxie fix
return TRUE;
}
else if (IsDoubleBattle()
&& gSideTimers[side].followmeTimer == 0
&& (!IsBattleMoveStatus(gCurrentMove) || (moveTarget != MOVE_TARGET_USER && moveTarget != MOVE_TARGET_ALL_BATTLERS))
&& ((ability != ABILITY_LIGHTNING_ROD && moveType == TYPE_ELECTRIC)
|| (ability != ABILITY_STORM_DRAIN && moveType == TYPE_WATER)))
{
// Find first battler that redirects the move (in turn order)
u32 battler;
for (battler = 0; battler < gBattlersCount; battler++)
{
ability = GetBattlerAbility(battler);
if ((B_REDIRECT_ABILITY_ALLIES >= GEN_4 || !IsAlly(gBattlerAttacker, battler))
&& battler != gBattlerAttacker
&& gBattleStruct->moveTarget[gBattlerAttacker] != battler
&& ((ability == ABILITY_LIGHTNING_ROD && moveType == TYPE_ELECTRIC)
|| (ability == ABILITY_STORM_DRAIN && moveType == TYPE_WATER))
&& GetBattlerTurnOrderNum(battler) < redirectorOrderNum
&& moveEffect != EFFECT_SNIPE_SHOT
&& moveEffect != EFFECT_PLEDGE
&& GetBattlerAbility(gBattlerAttacker) != ABILITY_PROPELLER_TAIL
&& GetBattlerAbility(gBattlerAttacker) != ABILITY_STALWART)
{
redirectorOrderNum = GetBattlerTurnOrderNum(battler);
}
}
if (redirectorOrderNum != MAX_BATTLERS_COUNT)
{
u16 battlerAbility;
battler = gBattlerByTurnOrder[redirectorOrderNum];
battlerAbility = GetBattlerAbility(battler);
RecordAbilityBattle(battler, gBattleMons[battler].ability);
if (battlerAbility == ABILITY_LIGHTNING_ROD && gCurrentMove != MOVE_TEATIME)
gSpecialStatuses[battler].lightningRodRedirected = TRUE;
else if (battlerAbility == ABILITY_STORM_DRAIN)
gSpecialStatuses[battler].stormDrainRedirected = TRUE;
gBattlerTarget = battler;
return TRUE;
}
}
return FALSE;
}
// Functions
void HandleAction_UseMove(void)
{
u32 battler, i, side, moveType, ability, var = MAX_BATTLERS_COUNT;
u16 moveTarget;
u32 i;
gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber];
if (gBattleStruct->battlerState[gBattlerAttacker].absentBattlerFlags
@ -350,7 +421,6 @@ void HandleAction_UseMove(void)
// Set dynamic move type.
SetTypeBeforeUsingMove(gChosenMove, gBattlerAttacker);
moveType = GetBattleMoveType(gCurrentMove);
// check Z-Move used
if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE && !IsBattleMoveStatus(gCurrentMove) && !IsZMove(gCurrentMove))
@ -365,117 +435,44 @@ void HandleAction_UseMove(void)
gCurrentMove = gChosenMove = GetMaxMove(gBattlerAttacker, gCurrentMove);
}
moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove);
u32 moveEffect = GetMoveEffect(gCurrentMove);
// choose target
side = BATTLE_OPPOSITE(GetBattlerSide(gBattlerAttacker));
ability = GetBattlerAbility(gBattleStruct->moveTarget[gBattlerAttacker]);
if (IsAffectedByFollowMe(gBattlerAttacker, side, gCurrentMove)
&& moveTarget == MOVE_TARGET_SELECTED
&& GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gSideTimers[side].followmeTarget))
if (!HandleMoveTargetRedirection())
{
gBattleStruct->moveTarget[gBattlerAttacker] = gBattlerTarget = gSideTimers[side].followmeTarget; // follow me moxie fix
}
else if (IsDoubleBattle()
&& gSideTimers[side].followmeTimer == 0
&& !gBattleStruct->battlerState[gBattleStruct->moveTarget[gBattlerAttacker]].pursuitTarget
&& (!IsBattleMoveStatus(gCurrentMove) || (moveTarget != MOVE_TARGET_USER && moveTarget != MOVE_TARGET_ALL_BATTLERS))
&& ((ability != ABILITY_LIGHTNING_ROD && moveType == TYPE_ELECTRIC)
|| (ability != ABILITY_STORM_DRAIN && moveType == TYPE_WATER)))
{
// Find first battler that redirects the move (in turn order)
for (battler = 0; battler < gBattlersCount; battler++)
u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove);
if (IsDoubleBattle() && moveTarget & MOVE_TARGET_RANDOM)
{
ability = GetBattlerAbility(battler);
if ((B_REDIRECT_ABILITY_ALLIES >= GEN_4 || !IsAlly(gBattlerAttacker, battler))
&& battler != gBattlerAttacker
&& gBattleStruct->moveTarget[gBattlerAttacker] != battler
&& ((ability == ABILITY_LIGHTNING_ROD && moveType == TYPE_ELECTRIC)
|| (ability == ABILITY_STORM_DRAIN && moveType == TYPE_WATER))
&& GetBattlerTurnOrderNum(battler) < var
&& moveEffect != EFFECT_SNIPE_SHOT
&& moveEffect != EFFECT_PLEDGE
&& GetBattlerAbility(gBattlerAttacker) != ABILITY_PROPELLER_TAIL
&& GetBattlerAbility(gBattlerAttacker) != ABILITY_STALWART)
{
var = GetBattlerTurnOrderNum(battler);
}
}
if (var == MAX_BATTLERS_COUNT)
{
if (moveTarget & MOVE_TARGET_RANDOM)
{
gBattlerTarget = SetRandomTarget(gBattlerAttacker);
}
else if (moveTarget & MOVE_TARGET_FOES_AND_ALLY)
{
for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++)
{
if (gBattlerTarget == gBattlerAttacker)
continue;
if (IsBattlerAlive(gBattlerTarget))
break;
}
}
else
{
gBattlerTarget = gBattleStruct->moveTarget[gBattlerAttacker];
}
if (!IsBattlerAlive(gBattlerTarget) && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget))
gBattlerTarget = SetRandomTarget(gBattlerAttacker);
if (gAbsentBattlerFlags & (1u << gBattlerTarget)
&& GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget))
{
gBattlerTarget = GetPartnerBattler(gBattlerTarget);
}
}
else if (moveTarget == MOVE_TARGET_ALLY)
{
if (IsBattlerAlive(BATTLE_PARTNER(gBattlerAttacker)))
gBattlerTarget = BATTLE_PARTNER(gBattlerAttacker);
else
gBattlerTarget = gBattlerAttacker;
}
else if (IsDoubleBattle() && moveTarget == MOVE_TARGET_FOES_AND_ALLY)
{
for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++)
{
if (gBattlerTarget == gBattlerAttacker)
continue;
if (IsBattlerAlive(gBattlerTarget))
break;
}
}
else
{
u16 battlerAbility;
battler = gBattlerByTurnOrder[var];
battlerAbility = GetBattlerAbility(battler);
RecordAbilityBattle(battler, gBattleMons[battler].ability);
if (battlerAbility == ABILITY_LIGHTNING_ROD && gCurrentMove != MOVE_TEATIME)
gSpecialStatuses[battler].lightningRodRedirected = TRUE;
else if (battlerAbility == ABILITY_STORM_DRAIN)
gSpecialStatuses[battler].stormDrainRedirected = TRUE;
gBattlerTarget = battler;
}
}
else if (IsDoubleBattle() && moveTarget & MOVE_TARGET_RANDOM)
{
gBattlerTarget = SetRandomTarget(gBattlerAttacker);
if (gAbsentBattlerFlags & (1u << gBattlerTarget)
&& GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget))
{
gBattlerTarget = GetPartnerBattler(gBattlerTarget);
}
}
else if (moveTarget == MOVE_TARGET_ALLY)
{
if (IsBattlerAlive(BATTLE_PARTNER(gBattlerAttacker)))
gBattlerTarget = BATTLE_PARTNER(gBattlerAttacker);
else
gBattlerTarget = gBattlerAttacker;
}
else if (IsDoubleBattle() && moveTarget == MOVE_TARGET_FOES_AND_ALLY)
{
for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++)
{
if (gBattlerTarget == gBattlerAttacker)
continue;
if (IsBattlerAlive(gBattlerTarget))
break;
}
}
else
{
gBattlerTarget = gBattleStruct->moveTarget[gBattlerAttacker];
if (!IsBattlerAlive(gBattlerTarget)
&& moveTarget != MOVE_TARGET_OPPONENTS_FIELD
&& (GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget)))
{
gBattlerTarget = GetPartnerBattler(gBattlerTarget);
gBattlerTarget = *(gBattleStruct->moveTarget + gBattlerAttacker);
if (!IsBattlerAlive(gBattlerTarget)
&& moveTarget != MOVE_TARGET_OPPONENTS_FIELD
&& (GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget)))
{
gBattlerTarget = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerTarget)));
}
}
}
@ -500,7 +497,7 @@ void HandleAction_UseMove(void)
}
}
if ((GetBattlerSide(gBattlerAttacker) == GetBattlerSide(gBattlerTarget))
if ((IsBattlerAlly(gBattlerAttacker, gBattlerTarget))
&& (!IsBattlerAlive(gBattlerTarget) || gProtectStructs[BATTLE_PARTNER(gBattlerAttacker)].usedAllySwitch))
{
gBattlescriptCurrInstr = BattleScript_FailedFromAtkCanceler;
@ -1896,7 +1893,8 @@ static void CancellerAsleep(u32 *effect)
gBattleMons[gBattlerAttacker].status1 -= toSub;
if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP)
{
if (gChosenMove != MOVE_SNORE && gChosenMove != MOVE_SLEEP_TALK)
u32 moveEffect = GetMoveEffect(gChosenMove);
if (moveEffect != EFFECT_SNORE && moveEffect != EFFECT_SLEEP_TALK)
{
gBattlescriptCurrInstr = BattleScript_MoveUsedIsAsleep;
gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE;
@ -2232,7 +2230,7 @@ static void CancellerThaw(u32 *effect)
static void CancellerStanceChangeTwo(u32 *effect)
{
if (B_STANCE_CHANGE_FAIL >= GEN_7 && TryFormChangeBeforeMove())
if (B_STANCE_CHANGE_FAIL >= GEN_7 && !gBattleStruct->isAtkCancelerForCalledMove && TryFormChangeBeforeMove())
*effect = 1;
}
@ -2570,6 +2568,21 @@ bool32 HasNoMonsToSwitch(u32 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2
playerId = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);
party = gEnemyParty;
// Edge case: If both opposing Pokemon were knocked out on the same turn,
// make sure opponent only sents out the final Pokemon once.
if (battler == playerId
&& (gHitMarker & HITMARKER_FAINTED(flankId))
&& (gHitMarker & HITMARKER_FAINTED(playerId)))
{
u8 count = 0;
for (i = 0; i < PARTY_SIZE; i++)
if (IsValidForBattle(&party[i]))
count++;
if (count < 2)
return TRUE;
}
if (partyIdBattlerOn1 == PARTY_SIZE)
partyIdBattlerOn1 = gBattlerPartyIndexes[flankId];
if (partyIdBattlerOn2 == PARTY_SIZE)
@ -2934,7 +2947,7 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 move, u32 ability
case ABILITY_DAZZLING:
case ABILITY_QUEENLY_MAJESTY:
case ABILITY_ARMOR_TAIL:
if (atkPriority > 0 && !IsAlly(battlerAtk, battlerDef))
if (atkPriority > 0 && !IsBattlerAlly(battlerAtk, battlerDef))
{
if (gBattleMons[battlerAtk].status2 & STATUS2_MULTIPLETURNS)
gHitMarker |= HITMARKER_NO_PPDEDUCT;
@ -2959,7 +2972,7 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 move, u32 ability
case ABILITY_DAZZLING:
case ABILITY_QUEENLY_MAJESTY:
case ABILITY_ARMOR_TAIL:
if (atkPriority > 0 && !IsAlly(battlerAtk, BATTLE_PARTNER(battlerDef)))
if (atkPriority > 0 && !IsBattlerAlly(battlerAtk, BATTLE_PARTNER(battlerDef)))
{
if (gBattleMons[battlerAtk].status2 & STATUS2_MULTIPLETURNS)
gHitMarker |= HITMARKER_NO_PPDEDUCT;
@ -3989,7 +4002,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
case ABILITY_EMBODY_ASPECT_HEARTHFLAME_MASK:
case ABILITY_EMBODY_ASPECT_WELLSPRING_MASK:
case ABILITY_EMBODY_ASPECT_CORNERSTONE_MASK:
if (!gSpecialStatuses[battler].switchInAbilityDone)
if (!gSpecialStatuses[battler].switchInAbilityDone
&& !(gBattleStruct->embodyAspectBoost[GetBattlerSide(battler)] & (1u << gBattlerPartyIndexes[battler])))
{
u32 stat;
@ -4008,6 +4022,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
gBattleScripting.savedBattler = gBattlerAttacker;
gBattlerAttacker = battler;
gSpecialStatuses[battler].switchInAbilityDone = TRUE;
gBattleStruct->embodyAspectBoost[GetBattlerSide(battler)] |= 1u << gBattlerPartyIndexes[battler];
SET_STATCHANGER(stat, 1, FALSE);
BattleScriptPushCursorAndCallback(BattleScript_BattlerAbilityStatRaiseOnSwitchIn);
effect++;
@ -5004,7 +5019,6 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
// Set bit and save Dancer mon's original target
gSpecialStatuses[battler].dancerUsedMove = TRUE;
gSpecialStatuses[battler].dancerOriginalTarget = gBattleStruct->moveTarget[battler] | 0x4;
gBattleStruct->atkCancellerTracker = 0;
gBattlerAttacker = gBattlerAbility = battler;
gCalledMove = gCurrentMove;
@ -5013,10 +5027,9 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
// Edge case for dance moves that hit multiply targets
gHitMarker &= ~HITMARKER_NO_ATTACKSTRING;
SetTypeBeforeUsingMove(gCalledMove, battler);
// Make sure that the target isn't an ally - if it is, target the original user
if (GetBattlerSide(gBattlerTarget) == GetBattlerSide(gBattlerAttacker))
if (IsBattlerAlly(gBattlerTarget, gBattlerAttacker))
gBattlerTarget = (gBattleScripting.savedBattler & 0xF0) >> 4;
gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED;
BattleScriptExecute(BattleScript_DancerActivates);
@ -5049,6 +5062,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
}
break;
case ABILITYEFFECT_IMMUNITY:
gBattleStruct->bypassMoldBreakerChecks = TRUE;
for (battler = 0; battler < gBattlersCount; battler++)
{
switch (GetBattlerAbility(battler))
@ -5140,6 +5154,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
return effect;
}
}
gBattleStruct->bypassMoldBreakerChecks = FALSE;
break;
case ABILITYEFFECT_SYNCHRONIZE:
if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONISE_EFFECT))
@ -5379,7 +5394,9 @@ u32 GetBattlerAbility(u32 battler)
&& gBattleMons[battler].ability == ABILITY_COMATOSE)
return ABILITY_NONE;
if (noAbilityShield && CanBreakThroughAbility(gBattlerAttacker, battler, gBattleMons[gBattlerAttacker].ability))
if (!gBattleStruct->bypassMoldBreakerChecks
&& noAbilityShield
&& CanBreakThroughAbility(gBattlerAttacker, battler, gBattleMons[gBattlerAttacker].ability))
return ABILITY_NONE;
return gBattleMons[battler].ability;
@ -5393,7 +5410,9 @@ u32 GetBattlerAbility(u32 battler)
&& noAbilityShield)
return ABILITY_NONE;
if (noAbilityShield && CanBreakThroughAbility(gBattlerAttacker, battler, gBattleMons[gBattlerAttacker].ability))
if (!gBattleStruct->bypassMoldBreakerChecks
&& noAbilityShield
&& CanBreakThroughAbility(gBattlerAttacker, battler, gBattleMons[gBattlerAttacker].ability))
return ABILITY_NONE;
return gBattleMons[battler].ability;
@ -6853,9 +6872,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn)
atkHoldEffectParam *= 2;
if (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_RAINBOW && gCurrentMove != MOVE_SECRET_POWER)
atkHoldEffectParam *= 2;
if (gBattleStruct->moveDamage[battler] != 0 // Need to have done damage
&& !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)
&& IsBattlerTurnDamaged(gBattlerTarget)
if (IsBattlerTurnDamaged(gBattlerTarget)
&& !MoveIgnoresKingsRock(gCurrentMove)
&& gBattleMons[gBattlerTarget].hp
&& RandomPercentage(RNG_HOLD_EFFECT_FLINCH, atkHoldEffectParam)
@ -6889,7 +6906,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn)
{
case HOLD_EFFECT_SHELL_BELL:
if (gBattleScripting.savedDmg > 0
&& !(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT)
&& !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)
&& gBattlerAttacker != gBattlerTarget
&& !IsBattlerAtMaxHp(gBattlerAttacker)
&& IsBattlerAlive(gBattlerAttacker)
@ -7229,6 +7246,7 @@ u32 GetBattleMoveTarget(u16 move, u8 setTarget)
switch (moveTarget)
{
case MOVE_TARGET_SELECTED:
case MOVE_TARGET_OPPONENT:
side = BATTLE_OPPOSITE(GetBattlerSide(gBattlerAttacker));
if (IsAffectedByFollowMe(gBattlerAttacker, side, move))
{
@ -7288,7 +7306,6 @@ u32 GetBattleMoveTarget(u16 move, u8 setTarget)
else
targetBattler = GetOpposingSideBattler(gBattlerAttacker);
break;
case MOVE_TARGET_USER_OR_SELECTED:
case MOVE_TARGET_USER:
default:
targetBattler = gBattlerAttacker;
@ -7427,7 +7444,7 @@ u32 GetBattlerHoldEffectInternal(u32 battler, bool32 checkNegating, bool32 check
return HOLD_EFFECT_NONE;
if (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM)
return HOLD_EFFECT_NONE;
if (checkAbility && GetBattlerAbility(battler) == ABILITY_KLUTZ)
if (checkAbility && GetBattlerAbility(battler) == ABILITY_KLUTZ && !(gStatuses3[battler] & STATUS3_GASTRO_ACID))
return HOLD_EFFECT_NONE;
}
@ -7639,7 +7656,7 @@ u32 GetMoveTargetCount(struct DamageCalculationData *damageCalcData)
case MOVE_TARGET_DEPENDS:
case MOVE_TARGET_SELECTED:
case MOVE_TARGET_RANDOM:
case MOVE_TARGET_USER_OR_SELECTED:
case MOVE_TARGET_OPPONENT:
return IsBattlerAlive(battlerDef);
case MOVE_TARGET_USER:
return IsBattlerAlive(battlerAtk);
@ -9286,7 +9303,7 @@ s32 CalculateMoveDamageVars(struct DamageCalculationData *damageCalcData, u32 fi
holdEffectAtk, holdEffectDef, abilityAtk, abilityDef);
}
static inline void MulByTypeEffectiveness(uq4_12_t *modifier, u32 move, u32 moveType, u32 battlerDef, u32 defType, u32 battlerAtk, bool32 recordAbilities)
static inline void MulByTypeEffectiveness(uq4_12_t *modifier, u32 move, u32 moveType, u32 battlerDef, u32 defAbility, u32 defType, u32 battlerAtk, bool32 recordAbilities)
{
uq4_12_t mod = GetTypeModifier(moveType, defType);
u32 abilityAtk = GetBattlerAbility(battlerAtk);
@ -9326,11 +9343,15 @@ static inline void MulByTypeEffectiveness(uq4_12_t *modifier, u32 move, u32 move
mod = UQ_4_12(1.0);
}
if (gSpecialStatuses[battlerDef].distortedTypeMatchups || (AI_DATA->aiCalcInProgress && ShouldTeraShellDistortTypeMatchups(move, battlerDef)))
if (gSpecialStatuses[battlerDef].distortedTypeMatchups || (mod > UQ_4_12(0.0) && ShouldTeraShellDistortTypeMatchups(move, battlerDef, defAbility)))
{
mod = UQ_4_12(0.5);
if (recordAbilities)
RecordAbilityBattle(battlerDef, GetBattlerAbility(battlerDef));
{
RecordAbilityBattle(battlerDef, defAbility);
gSpecialStatuses[battlerDef].distortedTypeMatchups = TRUE;
gSpecialStatuses[battlerDef].teraShellAbilityDone = TRUE;
}
}
*modifier = uq4_12_multiply(*modifier, mod);
@ -9340,9 +9361,9 @@ static inline void TryNoticeIllusionInTypeEffectiveness(u32 move, u32 moveType,
{
// Check if the type effectiveness would've been different if the pokemon really had the types as the disguise.
uq4_12_t presumedModifier = UQ_4_12(1.0);
MulByTypeEffectiveness(&presumedModifier, move, moveType, battlerDef, gSpeciesInfo[illusionSpecies].types[0], battlerAtk, FALSE);
MulByTypeEffectiveness(&presumedModifier, move, moveType, battlerDef, ABILITY_ILLUSION, gSpeciesInfo[illusionSpecies].types[0], battlerAtk, FALSE);
if (gSpeciesInfo[illusionSpecies].types[1] != gSpeciesInfo[illusionSpecies].types[0])
MulByTypeEffectiveness(&presumedModifier, move, moveType, battlerDef, gSpeciesInfo[illusionSpecies].types[1], battlerAtk, FALSE);
MulByTypeEffectiveness(&presumedModifier, move, moveType, battlerDef, ABILITY_ILLUSION, gSpeciesInfo[illusionSpecies].types[1], battlerAtk, FALSE);
if (presumedModifier != resultingModifier)
RecordAbilityBattle(battlerDef, ABILITY_ILLUSION);
@ -9378,11 +9399,11 @@ static inline uq4_12_t CalcTypeEffectivenessMultiplierInternal(u32 move, u32 mov
u32 types[3];
GetBattlerTypes(battlerDef, FALSE, types);
MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, types[0], battlerAtk, recordAbilities);
MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, defAbility, types[0], battlerAtk, recordAbilities);
if (types[1] != types[0])
MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, types[1], battlerAtk, recordAbilities);
MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, defAbility, types[1], battlerAtk, recordAbilities);
if (types[2] != TYPE_MYSTERY && types[2] != types[1] && types[2] != types[0])
MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, types[2], battlerAtk, recordAbilities);
MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, defAbility, types[2], battlerAtk, recordAbilities);
if (moveType == TYPE_FIRE && gDisableStructs[battlerDef].tarShot)
modifier = uq4_12_multiply(modifier, UQ_4_12(2.0));
@ -9464,9 +9485,9 @@ uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 a
if (move != MOVE_STRUGGLE && moveType != TYPE_MYSTERY)
{
MulByTypeEffectiveness(&modifier, move, moveType, 0, gSpeciesInfo[speciesDef].types[0], 0, FALSE);
MulByTypeEffectiveness(&modifier, move, moveType, 0, 0, gSpeciesInfo[speciesDef].types[0], 0, FALSE);
if (gSpeciesInfo[speciesDef].types[1] != gSpeciesInfo[speciesDef].types[0])
MulByTypeEffectiveness(&modifier, move, moveType, 0, gSpeciesInfo[speciesDef].types[1], 0, FALSE);
MulByTypeEffectiveness(&modifier, move, moveType, 0, 0, gSpeciesInfo[speciesDef].types[1], 0, FALSE);
if (moveType == TYPE_GROUND && abilityDef == ABILITY_LEVITATE && !(gFieldStatuses & STATUS_FIELD_GRAVITY))
modifier = UQ_4_12(0.0);
@ -9502,9 +9523,9 @@ uq4_12_t GetOverworldTypeEffectiveness(struct Pokemon *mon, u8 moveType)
if (moveType != TYPE_MYSTERY)
{
MulByTypeEffectiveness(&modifier, MOVE_POUND, moveType, 0, type1, 0, FALSE);
MulByTypeEffectiveness(&modifier, MOVE_POUND, moveType, 0, 0, type1, 0, FALSE);
if (type2 != type1)
MulByTypeEffectiveness(&modifier, MOVE_POUND, moveType, 0, type2, 0, FALSE);
MulByTypeEffectiveness(&modifier, MOVE_POUND, moveType, 0, 0, type2, 0, FALSE);
if ((modifier <= UQ_4_12(1.0) && abilityDef == ABILITY_WONDER_GUARD)
|| (moveType == TYPE_FIRE && abilityDef == ABILITY_FLASH_FIRE)
@ -10241,8 +10262,12 @@ bool32 CanStealItem(u32 battlerStealing, u32 battlerItem, u16 item)
return FALSE;
}
// It's supposed to pop before trying to steal but this also works
if (ItemId_GetHoldEffect(item) == HOLD_EFFECT_AIR_BALLOON)
return FALSE;
if (!CanBattlerGetOrLoseItem(battlerItem, item) // Battler with item cannot have it stolen
||!CanBattlerGetOrLoseItem(battlerStealing, item)) // Stealer cannot take the item
|| !CanBattlerGetOrLoseItem(battlerStealing, item)) // Stealer cannot take the item
return FALSE;
return TRUE;
@ -10385,7 +10410,7 @@ bool32 BlocksPrankster(u16 move, u32 battlerPrankster, u32 battlerDef, bool32 ch
return FALSE;
if (!gProtectStructs[battlerPrankster].pranksterElevated)
return FALSE;
if (GetBattlerSide(battlerPrankster) == GetBattlerSide(battlerDef))
if (IsBattlerAlly(battlerPrankster, battlerDef))
return FALSE;
if (checkTarget && (GetBattlerMoveTargetType(battlerPrankster, move) & (MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_DEPENDS)))
return FALSE;
@ -10452,12 +10477,13 @@ u32 GetBattlerMoveTargetType(u32 battler, u32 move)
bool32 CanTargetBattler(u32 battlerAtk, u32 battlerDef, u16 move)
{
if (GetMoveEffect(move) == EFFECT_HIT_ENEMY_HEAL_ALLY
&& GetBattlerSide(battlerAtk) == GetBattlerSide(battlerDef)
&& gStatuses3[battlerAtk] & STATUS3_HEAL_BLOCK)
&& IsBattlerAlly(battlerAtk, battlerDef)
&& gStatuses3[battlerAtk] & STATUS3_HEAL_BLOCK)
return FALSE; // Pokémon affected by Heal Block cannot target allies with Pollen Puff
if ((GetActiveGimmick(battlerAtk) == GIMMICK_DYNAMAX || IsGimmickSelected(battlerAtk, GIMMICK_DYNAMAX))
&& GetBattlerSide(battlerAtk) == GetBattlerSide(battlerDef))
if (IsBattlerAlly(battlerAtk, battlerDef) && (GetActiveGimmick(battlerAtk) == GIMMICK_DYNAMAX
|| IsGimmickSelected(battlerAtk, GIMMICK_DYNAMAX)))
return FALSE;
return TRUE;
}
@ -10578,11 +10604,6 @@ bool32 MoveEffectIsGuaranteed(u32 battler, u32 battlerAbility, const struct Addi
return additionalEffect->chance == 0 || CalcSecondaryEffectChance(battler, battlerAbility, additionalEffect) >= 100;
}
bool32 IsAlly(u32 battlerAtk, u32 battlerDef)
{
return (GetBattlerSide(battlerAtk) == GetBattlerSide(battlerDef));
}
bool32 IsGen6ExpShareEnabled(void)
{
if (I_EXP_SHARE_FLAG <= TEMP_FLAGS_END)
@ -10967,8 +10988,7 @@ void ClearPursuitValues(void)
{
for (u32 i = 0; i < gBattlersCount; i++)
gBattleStruct->battlerState[i].pursuitTarget = FALSE;
gBattleStruct->pursuitSwitchByMove = FALSE;
gBattleStruct->pursuitStoredSwitch = 0;
gBattleStruct->pursuitStoredSwitch = PARTY_SIZE;
}
void ClearPursuitValuesIfSet(u32 battler)

View File

@ -5485,10 +5485,10 @@ static void SetMoveTargetPosition(u16 move)
{
switch (GetBattlerMoveTargetType(gBattlerAttacker, move))
{
case MOVE_TARGET_USER_OR_SELECTED:
case MOVE_TARGET_USER:
gBattlerTarget = B_POSITION_PLAYER_RIGHT;
break;
case MOVE_TARGET_OPPONENT:
case MOVE_TARGET_SELECTED:
case MOVE_TARGET_RANDOM:
case MOVE_TARGET_BOTH:

View File

@ -568,367 +568,6 @@ static const u8 *const sApprenticeChallengeTexts[NUM_APPRENTICES] =
gText_ApprenticeChallenge15,
};
// Unclear what the criteria are for valid moves
// Notably, a large percentage of multi-strike moves are not valid
static const bool8 sValidApprenticeMoves[MOVES_COUNT] =
{
[MOVE_NONE] = FALSE,
[MOVE_POUND] = FALSE,
[MOVE_KARATE_CHOP] = TRUE,
[MOVE_DOUBLE_SLAP] = TRUE,
[MOVE_COMET_PUNCH] = FALSE,
[MOVE_MEGA_PUNCH] = TRUE,
[MOVE_PAY_DAY] = FALSE,
[MOVE_FIRE_PUNCH] = TRUE,
[MOVE_ICE_PUNCH] = TRUE,
[MOVE_THUNDER_PUNCH] = TRUE,
[MOVE_SCRATCH] = FALSE,
[MOVE_VISE_GRIP] = FALSE,
[MOVE_GUILLOTINE] = TRUE,
[MOVE_RAZOR_WIND] = FALSE,
[MOVE_SWORDS_DANCE] = TRUE,
[MOVE_CUT] = FALSE,
[MOVE_GUST] = FALSE,
[MOVE_WING_ATTACK] = FALSE,
[MOVE_WHIRLWIND] = TRUE,
[MOVE_FLY] = TRUE,
[MOVE_BIND] = TRUE,
[MOVE_SLAM] = TRUE,
[MOVE_VINE_WHIP] = FALSE,
[MOVE_STOMP] = TRUE,
[MOVE_DOUBLE_KICK] = TRUE,
[MOVE_MEGA_KICK] = TRUE,
[MOVE_JUMP_KICK] = TRUE,
[MOVE_ROLLING_KICK] = TRUE,
[MOVE_SAND_ATTACK] = TRUE,
[MOVE_HEADBUTT] = TRUE,
[MOVE_HORN_ATTACK] = FALSE,
[MOVE_FURY_ATTACK] = FALSE,
[MOVE_HORN_DRILL] = TRUE,
[MOVE_TACKLE] = FALSE,
[MOVE_BODY_SLAM] = TRUE,
[MOVE_WRAP] = TRUE,
[MOVE_TAKE_DOWN] = TRUE,
[MOVE_THRASH] = TRUE,
[MOVE_DOUBLE_EDGE] = TRUE,
[MOVE_TAIL_WHIP] = FALSE,
[MOVE_POISON_STING] = FALSE,
[MOVE_TWINEEDLE] = TRUE,
[MOVE_PIN_MISSILE] = FALSE,
[MOVE_LEER] = FALSE,
[MOVE_BITE] = TRUE,
[MOVE_GROWL] = FALSE,
[MOVE_ROAR] = TRUE,
[MOVE_SING] = TRUE,
[MOVE_SUPERSONIC] = TRUE,
[MOVE_SONIC_BOOM] = TRUE,
[MOVE_DISABLE] = TRUE,
[MOVE_ACID] = FALSE,
[MOVE_EMBER] = FALSE,
[MOVE_FLAMETHROWER] = TRUE,
[MOVE_MIST] = TRUE,
[MOVE_WATER_GUN] = FALSE,
[MOVE_HYDRO_PUMP] = TRUE,
[MOVE_SURF] = TRUE,
[MOVE_ICE_BEAM] = TRUE,
[MOVE_BLIZZARD] = TRUE,
[MOVE_PSYBEAM] = TRUE,
[MOVE_BUBBLE_BEAM] = FALSE,
[MOVE_AURORA_BEAM] = FALSE,
[MOVE_HYPER_BEAM] = TRUE,
[MOVE_PECK] = FALSE,
[MOVE_DRILL_PECK] = TRUE,
[MOVE_SUBMISSION] = TRUE,
[MOVE_LOW_KICK] = TRUE,
[MOVE_COUNTER] = TRUE,
[MOVE_SEISMIC_TOSS] = TRUE,
[MOVE_STRENGTH] = TRUE,
[MOVE_ABSORB] = FALSE,
[MOVE_MEGA_DRAIN] = FALSE,
[MOVE_LEECH_SEED] = TRUE,
[MOVE_GROWTH] = TRUE,
[MOVE_RAZOR_LEAF] = TRUE,
[MOVE_SOLAR_BEAM] = TRUE,
[MOVE_POISON_POWDER] = TRUE,
[MOVE_STUN_SPORE] = TRUE,
[MOVE_SLEEP_POWDER] = TRUE,
[MOVE_PETAL_DANCE] = TRUE,
[MOVE_STRING_SHOT] = FALSE,
[MOVE_DRAGON_RAGE] = TRUE,
[MOVE_FIRE_SPIN] = TRUE,
[MOVE_THUNDER_SHOCK] = FALSE,
[MOVE_THUNDERBOLT] = TRUE,
[MOVE_THUNDER_WAVE] = TRUE,
[MOVE_THUNDER] = TRUE,
[MOVE_ROCK_THROW] = FALSE,
[MOVE_EARTHQUAKE] = TRUE,
[MOVE_FISSURE] = TRUE,
[MOVE_DIG] = TRUE,
[MOVE_TOXIC] = TRUE,
[MOVE_CONFUSION] = FALSE,
[MOVE_PSYCHIC] = TRUE,
[MOVE_HYPNOSIS] = TRUE,
[MOVE_MEDITATE] = TRUE,
[MOVE_AGILITY] = TRUE,
[MOVE_QUICK_ATTACK] = TRUE,
[MOVE_RAGE] = FALSE,
[MOVE_TELEPORT] = FALSE,
[MOVE_NIGHT_SHADE] = TRUE,
[MOVE_MIMIC] = TRUE,
[MOVE_SCREECH] = TRUE,
[MOVE_DOUBLE_TEAM] = TRUE,
[MOVE_RECOVER] = TRUE,
[MOVE_HARDEN] = TRUE,
[MOVE_MINIMIZE] = TRUE,
[MOVE_SMOKESCREEN] = TRUE,
[MOVE_CONFUSE_RAY] = TRUE,
[MOVE_WITHDRAW] = TRUE,
[MOVE_DEFENSE_CURL] = TRUE,
[MOVE_BARRIER] = TRUE,
[MOVE_LIGHT_SCREEN] = TRUE,
[MOVE_HAZE] = TRUE,
[MOVE_REFLECT] = TRUE,
[MOVE_FOCUS_ENERGY] = TRUE,
[MOVE_BIDE] = FALSE,
[MOVE_METRONOME] = TRUE,
[MOVE_MIRROR_MOVE] = TRUE,
[MOVE_SELF_DESTRUCT] = TRUE,
[MOVE_EGG_BOMB] = TRUE,
[MOVE_LICK] = TRUE,
[MOVE_SMOG] = FALSE,
[MOVE_SLUDGE] = FALSE,
[MOVE_BONE_CLUB] = FALSE,
[MOVE_FIRE_BLAST] = TRUE,
[MOVE_WATERFALL] = TRUE,
[MOVE_CLAMP] = TRUE,
[MOVE_SWIFT] = TRUE,
[MOVE_SKULL_BASH] = TRUE,
[MOVE_SPIKE_CANNON] = FALSE,
[MOVE_CONSTRICT] = FALSE,
[MOVE_AMNESIA] = TRUE,
[MOVE_KINESIS] = TRUE,
[MOVE_SOFT_BOILED] = TRUE,
[MOVE_HIGH_JUMP_KICK] = TRUE,
[MOVE_GLARE] = TRUE,
[MOVE_DREAM_EATER] = TRUE,
[MOVE_POISON_GAS] = FALSE,
[MOVE_BARRAGE] = FALSE,
[MOVE_LEECH_LIFE] = FALSE,
[MOVE_LOVELY_KISS] = TRUE,
[MOVE_SKY_ATTACK] = TRUE,
[MOVE_TRANSFORM] = TRUE,
[MOVE_BUBBLE] = FALSE,
[MOVE_DIZZY_PUNCH] = TRUE,
[MOVE_SPORE] = TRUE,
[MOVE_FLASH] = TRUE,
[MOVE_PSYWAVE] = TRUE,
[MOVE_SPLASH] = FALSE,
[MOVE_ACID_ARMOR] = TRUE,
[MOVE_CRABHAMMER] = TRUE,
[MOVE_EXPLOSION] = TRUE,
[MOVE_FURY_SWIPES] = FALSE,
[MOVE_BONEMERANG] = TRUE,
[MOVE_REST] = TRUE,
[MOVE_ROCK_SLIDE] = TRUE,
[MOVE_HYPER_FANG] = TRUE,
[MOVE_SHARPEN] = TRUE,
[MOVE_CONVERSION] = TRUE,
[MOVE_TRI_ATTACK] = TRUE,
[MOVE_SUPER_FANG] = TRUE,
[MOVE_SLASH] = TRUE,
[MOVE_SUBSTITUTE] = TRUE,
[MOVE_STRUGGLE] = TRUE,
[MOVE_SKETCH] = TRUE,
[MOVE_TRIPLE_KICK] = TRUE,
[MOVE_THIEF] = TRUE,
[MOVE_SPIDER_WEB] = TRUE,
[MOVE_MIND_READER] = TRUE,
[MOVE_NIGHTMARE] = TRUE,
[MOVE_FLAME_WHEEL] = FALSE,
[MOVE_SNORE] = TRUE,
[MOVE_CURSE] = TRUE,
[MOVE_FLAIL] = TRUE,
[MOVE_CONVERSION_2] = TRUE,
[MOVE_AEROBLAST] = TRUE,
[MOVE_COTTON_SPORE] = TRUE,
[MOVE_REVERSAL] = TRUE,
[MOVE_SPITE] = TRUE,
[MOVE_POWDER_SNOW] = FALSE,
[MOVE_PROTECT] = TRUE,
[MOVE_MACH_PUNCH] = TRUE,
[MOVE_SCARY_FACE] = TRUE,
[MOVE_FEINT_ATTACK] = TRUE,
[MOVE_SWEET_KISS] = TRUE,
[MOVE_BELLY_DRUM] = TRUE,
[MOVE_SLUDGE_BOMB] = TRUE,
[MOVE_MUD_SLAP] = TRUE,
[MOVE_OCTAZOOKA] = TRUE,
[MOVE_SPIKES] = TRUE,
[MOVE_ZAP_CANNON] = TRUE,
[MOVE_FORESIGHT] = TRUE,
[MOVE_DESTINY_BOND] = TRUE,
[MOVE_PERISH_SONG] = TRUE,
[MOVE_ICY_WIND] = TRUE,
[MOVE_DETECT] = TRUE,
[MOVE_BONE_RUSH] = FALSE,
[MOVE_LOCK_ON] = TRUE,
[MOVE_OUTRAGE] = TRUE,
[MOVE_SANDSTORM] = TRUE,
[MOVE_GIGA_DRAIN] = TRUE,
[MOVE_ENDURE] = TRUE,
[MOVE_CHARM] = TRUE,
[MOVE_ROLLOUT] = TRUE,
[MOVE_FALSE_SWIPE] = TRUE,
[MOVE_SWAGGER] = TRUE,
[MOVE_MILK_DRINK] = TRUE,
[MOVE_SPARK] = FALSE,
[MOVE_FURY_CUTTER] = TRUE,
[MOVE_STEEL_WING] = TRUE,
[MOVE_MEAN_LOOK] = TRUE,
[MOVE_ATTRACT] = TRUE,
[MOVE_SLEEP_TALK] = TRUE,
[MOVE_HEAL_BELL] = TRUE,
[MOVE_RETURN] = TRUE,
[MOVE_PRESENT] = TRUE,
[MOVE_FRUSTRATION] = TRUE,
[MOVE_SAFEGUARD] = TRUE,
[MOVE_PAIN_SPLIT] = TRUE,
[MOVE_SACRED_FIRE] = TRUE,
[MOVE_MAGNITUDE] = FALSE,
[MOVE_DYNAMIC_PUNCH] = TRUE,
[MOVE_MEGAHORN] = TRUE,
[MOVE_DRAGON_BREATH] = TRUE,
[MOVE_BATON_PASS] = TRUE,
[MOVE_ENCORE] = TRUE,
[MOVE_PURSUIT] = TRUE,
[MOVE_RAPID_SPIN] = TRUE,
[MOVE_SWEET_SCENT] = TRUE,
[MOVE_IRON_TAIL] = TRUE,
[MOVE_METAL_CLAW] = TRUE,
[MOVE_VITAL_THROW] = TRUE,
[MOVE_MORNING_SUN] = TRUE,
[MOVE_SYNTHESIS] = TRUE,
[MOVE_MOONLIGHT] = TRUE,
[MOVE_HIDDEN_POWER] = TRUE,
[MOVE_CROSS_CHOP] = TRUE,
[MOVE_TWISTER] = FALSE,
[MOVE_RAIN_DANCE] = TRUE,
[MOVE_SUNNY_DAY] = TRUE,
[MOVE_CRUNCH] = TRUE,
[MOVE_MIRROR_COAT] = TRUE,
[MOVE_PSYCH_UP] = TRUE,
[MOVE_EXTREME_SPEED] = TRUE,
[MOVE_ANCIENT_POWER] = TRUE,
[MOVE_SHADOW_BALL] = TRUE,
[MOVE_FUTURE_SIGHT] = TRUE,
[MOVE_ROCK_SMASH] = TRUE,
[MOVE_WHIRLPOOL] = TRUE,
[MOVE_BEAT_UP] = TRUE,
[MOVE_FAKE_OUT] = TRUE,
[MOVE_UPROAR] = TRUE,
[MOVE_STOCKPILE] = TRUE,
[MOVE_SPIT_UP] = TRUE,
[MOVE_SWALLOW] = TRUE,
[MOVE_HEAT_WAVE] = TRUE,
[MOVE_HAIL] = TRUE,
[MOVE_TORMENT] = TRUE,
[MOVE_FLATTER] = TRUE,
[MOVE_WILL_O_WISP] = TRUE,
[MOVE_MEMENTO] = TRUE,
[MOVE_FACADE] = TRUE,
[MOVE_FOCUS_PUNCH] = TRUE,
[MOVE_SMELLING_SALTS] = TRUE,
[MOVE_FOLLOW_ME] = TRUE,
[MOVE_NATURE_POWER] = TRUE,
[MOVE_CHARGE] = TRUE,
[MOVE_TAUNT] = TRUE,
[MOVE_HELPING_HAND] = TRUE,
[MOVE_TRICK] = TRUE,
[MOVE_ROLE_PLAY] = TRUE,
[MOVE_WISH] = TRUE,
[MOVE_ASSIST] = TRUE,
[MOVE_INGRAIN] = TRUE,
[MOVE_SUPERPOWER] = TRUE,
[MOVE_MAGIC_COAT] = TRUE,
[MOVE_RECYCLE] = TRUE,
[MOVE_REVENGE] = TRUE,
[MOVE_BRICK_BREAK] = TRUE,
[MOVE_YAWN] = TRUE,
[MOVE_KNOCK_OFF] = TRUE,
[MOVE_ENDEAVOR] = TRUE,
[MOVE_ERUPTION] = TRUE,
[MOVE_SKILL_SWAP] = TRUE,
[MOVE_IMPRISON] = TRUE,
[MOVE_REFRESH] = TRUE,
[MOVE_GRUDGE] = TRUE,
[MOVE_SNATCH] = TRUE,
[MOVE_SECRET_POWER] = TRUE,
[MOVE_DIVE] = TRUE,
[MOVE_ARM_THRUST] = FALSE,
[MOVE_CAMOUFLAGE] = TRUE,
[MOVE_TAIL_GLOW] = TRUE,
[MOVE_LUSTER_PURGE] = TRUE,
[MOVE_MIST_BALL] = TRUE,
[MOVE_FEATHER_DANCE] = TRUE,
[MOVE_TEETER_DANCE] = TRUE,
[MOVE_BLAZE_KICK] = TRUE,
[MOVE_MUD_SPORT] = TRUE,
[MOVE_ICE_BALL] = FALSE,
[MOVE_NEEDLE_ARM] = TRUE,
[MOVE_SLACK_OFF] = TRUE,
[MOVE_HYPER_VOICE] = TRUE,
[MOVE_POISON_FANG] = FALSE,
[MOVE_CRUSH_CLAW] = TRUE,
[MOVE_BLAST_BURN] = TRUE,
[MOVE_HYDRO_CANNON] = TRUE,
[MOVE_METEOR_MASH] = TRUE,
[MOVE_ASTONISH] = TRUE,
[MOVE_WEATHER_BALL] = TRUE,
[MOVE_AROMATHERAPY] = TRUE,
[MOVE_FAKE_TEARS] = TRUE,
[MOVE_AIR_CUTTER] = TRUE,
[MOVE_OVERHEAT] = TRUE,
[MOVE_ODOR_SLEUTH] = TRUE,
[MOVE_ROCK_TOMB] = TRUE,
[MOVE_SILVER_WIND] = TRUE,
[MOVE_METAL_SOUND] = TRUE,
[MOVE_GRASS_WHISTLE] = TRUE,
[MOVE_TICKLE] = TRUE,
[MOVE_COSMIC_POWER] = TRUE,
[MOVE_WATER_SPOUT] = TRUE,
[MOVE_SIGNAL_BEAM] = TRUE,
[MOVE_SHADOW_PUNCH] = TRUE,
[MOVE_EXTRASENSORY] = TRUE,
[MOVE_SKY_UPPERCUT] = TRUE,
[MOVE_SAND_TOMB] = TRUE,
[MOVE_SHEER_COLD] = TRUE,
[MOVE_MUDDY_WATER] = TRUE,
[MOVE_BULLET_SEED] = FALSE,
[MOVE_AERIAL_ACE] = TRUE,
[MOVE_ICICLE_SPEAR] = FALSE,
[MOVE_IRON_DEFENSE] = TRUE,
[MOVE_BLOCK] = TRUE,
[MOVE_HOWL] = TRUE,
[MOVE_DRAGON_CLAW] = TRUE,
[MOVE_FRENZY_PLANT] = TRUE,
[MOVE_BULK_UP] = TRUE,
[MOVE_BOUNCE] = TRUE,
[MOVE_MUD_SHOT] = FALSE,
[MOVE_POISON_TAIL] = TRUE,
[MOVE_COVET] = TRUE,
[MOVE_VOLT_TACKLE] = TRUE,
[MOVE_MAGICAL_LEAF] = TRUE,
[MOVE_WATER_SPORT] = TRUE,
[MOVE_CALM_MIND] = TRUE,
[MOVE_LEAF_BLADE] = TRUE,
[MOVE_DRAGON_DANCE] = TRUE,
[MOVE_ROCK_BLAST] = FALSE,
[MOVE_SHOCK_WAVE] = TRUE,
[MOVE_WATER_PULSE] = TRUE,
[MOVE_DOOM_DESIRE] = TRUE,
[MOVE_PSYCHO_BOOST] = TRUE,
};
// The possible questions to ask after the initial 3 WHICH MON questions. Retrieved from here and shuffled
// WHAT_ITEM has max 3 occurrences, one for each party member
// WHICH_MOVE has max 5 occurrences, defined as NUM_WHICH_MOVE_QUESTIONS

View File

@ -1909,7 +1909,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] =
[EFFECT_PHOTON_GEYSER] =
{
.battleScript = BattleScript_EffectPhotonGeyser,
.battleScript = BattleScript_EffectDynamicCategory,
.battleTvScore = 0, // TODO: Assign points
},
@ -2201,13 +2201,13 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] =
[EFFECT_TERA_BLAST] =
{
.battleScript = BattleScript_EffectPhotonGeyser,
.battleScript = BattleScript_EffectDynamicCategory,
.battleTvScore = 0, // TODO: Assign points
},
[EFFECT_TERA_STARSTORM] =
{
.battleScript = BattleScript_EffectPhotonGeyser,
.battleScript = BattleScript_EffectDynamicCategory,
.battleTvScore = 0, // TODO: Assign points
},

View File

@ -135,8 +135,8 @@ static const struct SpritePalette sSpritePalette_TeraIndicator = {sTeraIndicator
static const struct OamData sOamData_GimmickIndicator =
{
.shape = SPRITE_SHAPE(16x16),
.size = SPRITE_SIZE(16x16),
.shape = SPRITE_SHAPE(8x16),
.size = SPRITE_SIZE(8x16),
.priority = 1,
};

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -45,7 +45,7 @@
#define OVERWORLD_PAL_FEMALE(...)
#endif //OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE
#define OVERWORLD_DATA(objEventPic, _size, shadow, _tracks, _anims) \
#define OVERWORLD_DATA(picTable, _size, shadow, _tracks, _anims) \
{ \
.tileTag = TAG_NONE, \
.paletteTag = OBJ_EVENT_PAL_TAG_DYNAMIC, \
@ -61,7 +61,7 @@
.oam = (_size == SIZE_32x32 ? &gObjectEventBaseOam_32x32 : &gObjectEventBaseOam_64x64), \
.subspriteTables = (_size == SIZE_32x32 ? sOamTables_32x32 : sOamTables_64x64), \
.anims = _anims, \
.images = (const struct SpriteFrameImage[]) { overworld_ascending_frames(objEventPic, SIZE_32x32 ? 4 : 8, SIZE_32x32 ? 4 : 8), }, \
.images = picTable, \
.affineAnims = gDummySpriteAffineAnimTable, \
}
@ -139,7 +139,7 @@ const struct SpeciesInfo gSpeciesInfo[] =
.oam = &gObjectEventBaseOam_32x32,
.subspriteTables = sOamTables_32x32,
.anims = sAnimTable_Following,
.images = (const struct SpriteFrameImage[]) { overworld_ascending_frames(gObjectEventPic_Substitute, 4, 4), },
.images = sPicTable_Substitute,
.affineAnims = gDummySpriteAffineAnimTable,
},
#endif

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -58,7 +58,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(1, 2, SHADOW_SIZE_S)
FOOTPRINT(Turtwig)
OVERWORLD(
gObjectEventPic_Turtwig,
sPicTable_Turtwig,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -127,7 +127,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(1, 2, SHADOW_SIZE_L)
FOOTPRINT(Grotle)
OVERWORLD(
gObjectEventPic_Grotle,
sPicTable_Grotle,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -201,7 +201,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(1, 10, SHADOW_SIZE_L)
FOOTPRINT(Torterra)
OVERWORLD(
gObjectEventPic_Torterra,
sPicTable_Torterra,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -273,7 +273,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(4, 3, SHADOW_SIZE_S)
FOOTPRINT(Chimchar)
OVERWORLD(
gObjectEventPic_Chimchar,
sPicTable_Chimchar,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -345,7 +345,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(-7, 6, SHADOW_SIZE_S)
FOOTPRINT(Monferno)
OVERWORLD(
gObjectEventPic_Monferno,
sPicTable_Monferno,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -420,7 +420,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(0, 9, SHADOW_SIZE_L)
FOOTPRINT(Infernape)
OVERWORLD(
gObjectEventPic_Infernape,
sPicTable_Infernape,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -492,7 +492,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(0, -1, SHADOW_SIZE_S)
FOOTPRINT(Piplup)
OVERWORLD(
gObjectEventPic_Piplup,
sPicTable_Piplup,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -570,7 +570,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(0, 7, SHADOW_SIZE_M)
FOOTPRINT(Prinplup)
OVERWORLD(
gObjectEventPic_Prinplup,
sPicTable_Prinplup,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -647,7 +647,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(2, 12, SHADOW_SIZE_M)
FOOTPRINT(Empoleon)
OVERWORLD(
gObjectEventPic_Empoleon,
sPicTable_Empoleon,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -727,7 +727,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(-2, 1, SHADOW_SIZE_S)
FOOTPRINT(Starly)
OVERWORLD(
gObjectEventPic_Starly,
sPicTable_Starly,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -736,7 +736,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
gShinyOverworldPalette_Starly
)
OVERWORLD_FEMALE(
gObjectEventPic_StarlyF,
sPicTable_StarlyF,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -807,7 +807,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(-1, 5, SHADOW_SIZE_S)
FOOTPRINT(Staravia)
OVERWORLD(
gObjectEventPic_Staravia,
sPicTable_Staravia,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -816,7 +816,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
gShinyOverworldPalette_Staravia
)
OVERWORLD_FEMALE(
gObjectEventPic_StaraviaF,
sPicTable_StaraviaF,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -892,7 +892,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(1, 10, SHADOW_SIZE_M)
FOOTPRINT(Staraptor)
OVERWORLD(
gObjectEventPic_Staraptor,
sPicTable_Staraptor,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -901,7 +901,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
gShinyOverworldPalette_Staraptor
)
OVERWORLD_FEMALE(
gObjectEventPic_StaraptorF,
sPicTable_StaraptorF,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -977,7 +977,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(1, 1, SHADOW_SIZE_M)
FOOTPRINT(Bidoof)
OVERWORLD(
gObjectEventPic_Bidoof,
sPicTable_Bidoof,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -986,7 +986,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
gShinyOverworldPalette_Bidoof
)
OVERWORLD_FEMALE(
gObjectEventPic_BidoofF,
sPicTable_BidoofF,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1058,7 +1058,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(-5, 5, SHADOW_SIZE_M)
FOOTPRINT(Bibarel)
OVERWORLD(
gObjectEventPic_Bibarel,
sPicTable_Bibarel,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1067,7 +1067,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
gShinyOverworldPalette_Bibarel
)
OVERWORLD_FEMALE(
gObjectEventPic_BibarelF,
sPicTable_BibarelF,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1153,7 +1153,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(-5, 2, SHADOW_SIZE_S)
FOOTPRINT(Kricketot)
OVERWORLD(
gObjectEventPic_Kricketot,
sPicTable_Kricketot,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1162,7 +1162,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
gShinyOverworldPalette_Kricketot
)
OVERWORLD_FEMALE(
gObjectEventPic_KricketotF,
sPicTable_KricketotF,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1239,7 +1239,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(-3, 6, SHADOW_SIZE_S)
FOOTPRINT(Kricketune)
OVERWORLD(
gObjectEventPic_Kricketune,
sPicTable_Kricketune,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1248,7 +1248,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
gShinyOverworldPalette_Kricketune
)
OVERWORLD_FEMALE(
gObjectEventPic_KricketuneF,
sPicTable_KricketuneF,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1320,7 +1320,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(-1, 1, SHADOW_SIZE_S)
FOOTPRINT(Shinx)
OVERWORLD(
gObjectEventPic_Shinx,
sPicTable_Shinx,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1329,7 +1329,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
gShinyOverworldPalette_Shinx
)
OVERWORLD_FEMALE(
gObjectEventPic_ShinxF,
sPicTable_ShinxF,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1400,7 +1400,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(-4, 2, SHADOW_SIZE_M)
FOOTPRINT(Luxio)
OVERWORLD(
gObjectEventPic_Luxio,
sPicTable_Luxio,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1409,7 +1409,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
gShinyOverworldPalette_Luxio
)
OVERWORLD_FEMALE(
gObjectEventPic_LuxioF,
sPicTable_LuxioF,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1488,7 +1488,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(-1, 10, SHADOW_SIZE_L)
FOOTPRINT(Luxray)
OVERWORLD(
gObjectEventPic_Luxray,
sPicTable_Luxray,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1497,7 +1497,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
gShinyOverworldPalette_Luxray
)
OVERWORLD_FEMALE(
gObjectEventPic_LuxrayF,
sPicTable_LuxrayF,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1562,7 +1562,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(4, 4, SHADOW_SIZE_S)
FOOTPRINT(Cranidos)
OVERWORLD(
gObjectEventPic_Cranidos,
sPicTable_Cranidos,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1632,7 +1632,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(7, 11, SHADOW_SIZE_L)
FOOTPRINT(Rampardos)
OVERWORLD(
gObjectEventPic_Rampardos,
sPicTable_Rampardos,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1700,7 +1700,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(3, -1, SHADOW_SIZE_S)
FOOTPRINT(Shieldon)
OVERWORLD(
gObjectEventPic_Shieldon,
sPicTable_Shieldon,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1768,7 +1768,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(1, 6, SHADOW_SIZE_L)
FOOTPRINT(Bastiodon)
OVERWORLD(
gObjectEventPic_Bastiodon,
sPicTable_Bastiodon,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1833,7 +1833,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(-1, 8, SHADOW_SIZE_S)
FOOTPRINT(Burmy)
OVERWORLD(
gObjectEventPic_BurmyPlant,
sPicTable_BurmyPlant,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1901,7 +1901,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(-1, 9, SHADOW_SIZE_S)
FOOTPRINT(Burmy)
OVERWORLD(
gObjectEventPic_BurmySandy,
sPicTable_BurmySandy,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1969,7 +1969,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(-1, 13, SHADOW_SIZE_S)
FOOTPRINT(Burmy)
OVERWORLD(
gObjectEventPic_BurmyTrash,
sPicTable_BurmyTrash,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2038,7 +2038,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(0, 9, SHADOW_SIZE_S)
FOOTPRINT(Wormadam)
OVERWORLD(
gObjectEventPic_WormadamPlant,
sPicTable_WormadamPlant,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2103,7 +2103,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(-1, 9, SHADOW_SIZE_S)
FOOTPRINT(Wormadam)
OVERWORLD(
gObjectEventPic_WormadamSandy,
sPicTable_WormadamSandy,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2169,7 +2169,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(0, 9, SHADOW_SIZE_S)
FOOTPRINT(Wormadam)
OVERWORLD(
gObjectEventPic_WormadamTrash,
sPicTable_WormadamTrash,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2230,8 +2230,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
.iconPalIndex = 0, \
SHADOW(-1, 9, SHADOW_SIZE_S) \
FOOTPRINT(Mothim) \
OVERWORLD( \
gObjectEventPic_Mothim, \
OVERWORLD( \
sPicTable_Mothim, \
SIZE_32x32, \
SHADOW_SIZE_M, \
TRACKS_FOOT, \
@ -2314,7 +2314,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(-4, 10, SHADOW_SIZE_S)
FOOTPRINT(Combee)
OVERWORLD(
gObjectEventPic_Combee,
sPicTable_Combee,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2323,7 +2323,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
gShinyOverworldPalette_Combee
)
OVERWORLD_FEMALE(
gObjectEventPic_CombeeF,
sPicTable_CombeeF,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2398,7 +2398,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(-1, 11, SHADOW_SIZE_L)
FOOTPRINT(Vespiquen)
OVERWORLD(
gObjectEventPic_Vespiquen,
sPicTable_Vespiquen,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2476,7 +2476,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(-2, 1, SHADOW_SIZE_S)
FOOTPRINT(Pachirisu)
OVERWORLD(
gObjectEventPic_Pachirisu,
sPicTable_Pachirisu,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2485,7 +2485,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
gShinyOverworldPalette_Pachirisu
)
OVERWORLD_FEMALE(
gObjectEventPic_PachirisuF,
sPicTable_PachirisuF,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2556,7 +2556,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(1, 4, SHADOW_SIZE_S)
FOOTPRINT(Buizel)
OVERWORLD(
gObjectEventPic_Buizel,
sPicTable_Buizel,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2565,7 +2565,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
gShinyOverworldPalette_Buizel
)
OVERWORLD_FEMALE(
gObjectEventPic_BuizelF,
sPicTable_BuizelF,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2638,7 +2638,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(-4, 10, SHADOW_SIZE_M)
FOOTPRINT(Floatzel)
OVERWORLD(
gObjectEventPic_Floatzel,
sPicTable_Floatzel,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2647,7 +2647,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
gShinyOverworldPalette_Floatzel
)
OVERWORLD_FEMALE(
gObjectEventPic_FloatzelF,
sPicTable_FloatzelF,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2720,7 +2720,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(-4, -2, SHADOW_SIZE_S)
FOOTPRINT(Cherubi)
OVERWORLD(
gObjectEventPic_Cherubi,
sPicTable_Cherubi,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2791,7 +2791,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(0, 6, SHADOW_SIZE_S)
FOOTPRINT(Cherrim)
OVERWORLD(
gObjectEventPic_CherrimOvercast,
sPicTable_CherrimOvercast,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2920,7 +2920,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(1, 0, SHADOW_SIZE_S)
FOOTPRINT(Shellos)
OVERWORLD(
gObjectEventPic_ShellosWestSea,
sPicTable_ShellosWestSea,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2985,7 +2985,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(2, -1, SHADOW_SIZE_S)
FOOTPRINT(Shellos)
OVERWORLD(
gObjectEventPic_ShellosEast,
sPicTable_ShellosEast,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3050,7 +3050,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(1, 3, SHADOW_SIZE_M)
FOOTPRINT(Gastrodon)
OVERWORLD(
gObjectEventPic_GastrodonWestSea,
sPicTable_GastrodonWestSea,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3113,7 +3113,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(2, 4, SHADOW_SIZE_M)
FOOTPRINT(Gastrodon)
OVERWORLD(
gObjectEventPic_GastrodonEast,
sPicTable_GastrodonEast,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3184,7 +3184,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(1, 9, SHADOW_SIZE_S)
FOOTPRINT(Drifloon)
OVERWORLD(
gObjectEventPic_Drifloon,
sPicTable_Drifloon,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3256,7 +3256,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(0, 11, SHADOW_SIZE_M)
FOOTPRINT(Drifblim)
OVERWORLD(
gObjectEventPic_Drifblim,
sPicTable_Drifblim,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3323,7 +3323,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(3, 5, SHADOW_SIZE_S)
FOOTPRINT(Buneary)
OVERWORLD(
gObjectEventPic_Buneary,
sPicTable_Buneary,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3391,7 +3391,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(0, 10, SHADOW_SIZE_S)
FOOTPRINT(Lopunny)
OVERWORLD(
gObjectEventPic_Lopunny,
sPicTable_Lopunny,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3457,7 +3457,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
FOOTPRINT(Lopunny)
#if OW_BATTLE_ONLY_FORMS
OVERWORLD(
gObjectEventPic_LopunnyMega,
sPicTable_LopunnyMega,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3530,7 +3530,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(-3, 6, SHADOW_SIZE_S)
FOOTPRINT(Glameow)
OVERWORLD(
gObjectEventPic_Glameow,
sPicTable_Glameow,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3602,7 +3602,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(4, 8, SHADOW_SIZE_L)
FOOTPRINT(Purugly)
OVERWORLD(
gObjectEventPic_Purugly,
sPicTable_Purugly,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3672,7 +3672,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(-1, 0, SHADOW_SIZE_M)
FOOTPRINT(Stunky)
OVERWORLD(
gObjectEventPic_Stunky,
sPicTable_Stunky,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3740,7 +3740,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(-3, 6, SHADOW_SIZE_L)
FOOTPRINT(Skuntank)
OVERWORLD(
gObjectEventPic_Skuntank,
sPicTable_Skuntank,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3817,7 +3817,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(0, 6, SHADOW_SIZE_S)
FOOTPRINT(Bronzor)
OVERWORLD(
gObjectEventPic_Bronzor,
sPicTable_Bronzor,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3889,7 +3889,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(5, 12, SHADOW_SIZE_M)
FOOTPRINT(Bronzong)
OVERWORLD(
gObjectEventPic_Bronzong,
sPicTable_Bronzong,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3971,7 +3971,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(-1, 3, SHADOW_SIZE_S)
FOOTPRINT(Chatot)
OVERWORLD(
gObjectEventPic_Chatot,
sPicTable_Chatot,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4040,7 +4040,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(-1, 7, SHADOW_SIZE_L)
FOOTPRINT(Spiritomb)
OVERWORLD(
gObjectEventPic_Spiritomb,
sPicTable_Spiritomb,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4115,7 +4115,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(1, 5, SHADOW_SIZE_M)
FOOTPRINT(Gible)
OVERWORLD(
gObjectEventPic_Gible,
sPicTable_Gible,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4124,7 +4124,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
gShinyOverworldPalette_Gible
)
OVERWORLD_FEMALE(
gObjectEventPic_GibleF,
sPicTable_GibleF,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4195,7 +4195,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(3, 8, SHADOW_SIZE_M)
FOOTPRINT(Gabite)
OVERWORLD(
gObjectEventPic_Gabite,
sPicTable_Gabite,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4204,7 +4204,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
gShinyOverworldPalette_Gabite
)
OVERWORLD_FEMALE(
gObjectEventPic_GabiteF,
sPicTable_GabiteF,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4282,7 +4282,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(5, 11, SHADOW_SIZE_L)
FOOTPRINT(Garchomp)
OVERWORLD(
gObjectEventPic_Garchomp,
sPicTable_Garchomp,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4291,7 +4291,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
gShinyOverworldPalette_Garchomp
)
OVERWORLD_FEMALE(
gObjectEventPic_GarchompF,
sPicTable_GarchompF,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4355,7 +4355,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
FOOTPRINT(Garchomp)
#if OW_BATTLE_ONLY_FORMS
OVERWORLD(
gObjectEventPic_GarchompMega,
sPicTable_GarchompMega,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4429,7 +4429,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(3, 3, SHADOW_SIZE_S)
FOOTPRINT(Riolu)
OVERWORLD(
gObjectEventPic_Riolu,
sPicTable_Riolu,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4497,7 +4497,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(-1, 7, SHADOW_SIZE_M)
FOOTPRINT(Lucario)
OVERWORLD(
gObjectEventPic_Lucario,
sPicTable_Lucario,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4564,7 +4564,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
FOOTPRINT(Lucario)
#if OW_BATTLE_ONLY_FORMS
OVERWORLD(
gObjectEventPic_LucarioMega,
sPicTable_LucarioMega,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4645,7 +4645,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(2, -1, SHADOW_SIZE_L)
FOOTPRINT(Hippopotas)
OVERWORLD(
gObjectEventPic_Hippopotas,
sPicTable_Hippopotas,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4654,7 +4654,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
gShinyOverworldPalette_Hippopotas
)
OVERWORLD_FEMALE(
gObjectEventPic_HippopotasF,
sPicTable_HippopotasF,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4727,7 +4727,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
NO_SHADOW
FOOTPRINT(Hippowdon)
OVERWORLD(
gObjectEventPic_Hippowdon,
sPicTable_Hippowdon,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4813,7 +4813,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(-2, 3, SHADOW_SIZE_S)
FOOTPRINT(Skorupi)
OVERWORLD(
gObjectEventPic_Skorupi,
sPicTable_Skorupi,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4888,7 +4888,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(-3, 6, SHADOW_SIZE_L)
FOOTPRINT(Drapion)
OVERWORLD(
gObjectEventPic_Drapion,
sPicTable_Drapion,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4964,7 +4964,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(2, 4, SHADOW_SIZE_S)
FOOTPRINT(Croagunk)
OVERWORLD(
gObjectEventPic_Croagunk,
sPicTable_Croagunk,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4973,7 +4973,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
gShinyOverworldPalette_Croagunk
)
OVERWORLD_FEMALE(
gObjectEventPic_CroagunkF,
sPicTable_CroagunkF,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5048,7 +5048,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(3, 7, SHADOW_SIZE_M)
FOOTPRINT(Toxicroak)
OVERWORLD(
gObjectEventPic_Toxicroak,
sPicTable_Toxicroak,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5057,7 +5057,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
gShinyOverworldPalette_Toxicroak
)
OVERWORLD_FEMALE(
gObjectEventPic_ToxicroakF,
sPicTable_ToxicroakF,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5133,7 +5133,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(0, 9, SHADOW_SIZE_XL_BATTLE_ONLY)
FOOTPRINT(Carnivine)
OVERWORLD(
gObjectEventPic_Carnivine,
sPicTable_Carnivine,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5213,7 +5213,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(0, 1, SHADOW_SIZE_S)
FOOTPRINT(Finneon)
OVERWORLD(
gObjectEventPic_Finneon,
sPicTable_Finneon,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5222,7 +5222,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
gShinyOverworldPalette_Finneon
)
OVERWORLD_FEMALE(
gObjectEventPic_FinneonF,
sPicTable_FinneonF,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5297,7 +5297,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(-1, 8, SHADOW_SIZE_M)
FOOTPRINT(Lumineon)
OVERWORLD(
gObjectEventPic_Lumineon,
sPicTable_Lumineon,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5306,7 +5306,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
gShinyOverworldPalette_Lumineon
)
OVERWORLD_FEMALE(
gObjectEventPic_LumineonF,
sPicTable_LumineonF,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5379,7 +5379,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(1, 4, SHADOW_SIZE_M)
FOOTPRINT(Snover)
OVERWORLD(
gObjectEventPic_Snover,
sPicTable_Snover,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5388,7 +5388,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
gShinyOverworldPalette_Snover
)
OVERWORLD_FEMALE(
gObjectEventPic_SnoverF,
sPicTable_SnoverF,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5460,7 +5460,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(0, 11, SHADOW_SIZE_L)
FOOTPRINT(Abomasnow)
OVERWORLD(
gObjectEventPic_Abomasnow,
sPicTable_Abomasnow,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5469,7 +5469,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
gShinyOverworldPalette_Abomasnow
)
OVERWORLD_FEMALE(
gObjectEventPic_AbomasnowF,
sPicTable_AbomasnowF,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5535,7 +5535,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
FOOTPRINT(Abomasnow)
#if OW_BATTLE_ONLY_FORMS
OVERWORLD(
gObjectEventPic_AbomasnowMega,
sPicTable_AbomasnowMega,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5612,7 +5612,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(0, 10, SHADOW_SIZE_S)
FOOTPRINT(Rotom)
OVERWORLD(
gObjectEventPic_Rotom,
sPicTable_Rotom,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5690,7 +5690,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(-1, 7, SHADOW_SIZE_M)
FOOTPRINT(Rotom)
OVERWORLD(
gObjectEventPic_RotomHeat,
sPicTable_RotomHeat,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5761,7 +5761,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(0, 10, SHADOW_SIZE_M)
FOOTPRINT(Rotom)
OVERWORLD(
gObjectEventPic_RotomWash,
sPicTable_RotomWash,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5830,7 +5830,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(0, 13, SHADOW_SIZE_M)
FOOTPRINT(Rotom)
OVERWORLD(
gObjectEventPic_RotomFrost,
sPicTable_RotomFrost,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5924,7 +5924,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(4, 9, SHADOW_SIZE_S)
FOOTPRINT(Rotom)
OVERWORLD(
gObjectEventPic_RotomFan,
sPicTable_RotomFan,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5996,7 +5996,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(2, 14, SHADOW_SIZE_M)
FOOTPRINT(Rotom)
OVERWORLD(
gObjectEventPic_RotomMow,
sPicTable_RotomMow,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6074,7 +6074,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(2, 11, SHADOW_SIZE_S)
FOOTPRINT(Uxie)
OVERWORLD(
gObjectEventPic_Uxie,
sPicTable_Uxie,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6158,7 +6158,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(0, 13, SHADOW_SIZE_S)
FOOTPRINT(Mesprit)
OVERWORLD(
gObjectEventPic_Mesprit,
sPicTable_Mesprit,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6236,7 +6236,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(0, 17, SHADOW_SIZE_S)
FOOTPRINT(Azelf)
OVERWORLD(
gObjectEventPic_Azelf,
sPicTable_Azelf,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6313,7 +6313,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(4, 12, SHADOW_SIZE_L)
FOOTPRINT(Dialga)
OVERWORLD(
gObjectEventPic_Dialga,
sPicTable_Dialga,
SIZE_64x64,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6380,7 +6380,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(2, 11, SHADOW_SIZE_L)
FOOTPRINT(Dialga)
OVERWORLD(
gObjectEventPic_DialgaOrigin,
sPicTable_DialgaOrigin,
SIZE_64x64,
SHADOW_SIZE_M,
TRACKS_NONE,
@ -6460,7 +6460,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(0, 10, SHADOW_SIZE_L)
FOOTPRINT(Palkia)
OVERWORLD(
gObjectEventPic_Palkia,
sPicTable_Palkia,
SIZE_64x64,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6527,7 +6527,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(-3, 14, SHADOW_SIZE_L)
FOOTPRINT(Palkia)
OVERWORLD(
gObjectEventPic_PalkiaOrigin,
sPicTable_PalkiaOrigin,
SIZE_64x64,
SHADOW_SIZE_M,
TRACKS_NONE,
@ -6606,7 +6606,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(2, 2, SHADOW_SIZE_XL_BATTLE_ONLY)
FOOTPRINT(Heatran)
OVERWORLD(
gObjectEventPic_Heatran,
sPicTable_Heatran,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6681,7 +6681,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(3, 10, SHADOW_SIZE_XL_BATTLE_ONLY)
FOOTPRINT(Regigigas)
OVERWORLD(
gObjectEventPic_Regigigas,
sPicTable_Regigigas,
SIZE_64x64,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6759,7 +6759,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(3, 11, SHADOW_SIZE_L)
FOOTPRINT(GiratinaAltered)
OVERWORLD(
gObjectEventPic_GiratinaAltered,
sPicTable_GiratinaAltered,
SIZE_64x64,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6833,7 +6833,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(0, 18, SHADOW_SIZE_L)
FOOTPRINT(GiratinaOrigin)
OVERWORLD(
gObjectEventPic_GiratinaOrigin,
sPicTable_GiratinaOrigin,
SIZE_64x64,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6916,7 +6916,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(-2, 12, SHADOW_SIZE_M)
FOOTPRINT(Cresselia)
OVERWORLD(
gObjectEventPic_Cresselia,
sPicTable_Cresselia,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6993,7 +6993,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(0, 7, SHADOW_SIZE_S)
FOOTPRINT(Phione)
OVERWORLD(
gObjectEventPic_Phione,
sPicTable_Phione,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -7069,7 +7069,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(-5, 8, SHADOW_SIZE_S)
FOOTPRINT(Manaphy)
OVERWORLD(
gObjectEventPic_Manaphy,
sPicTable_Manaphy,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -7148,7 +7148,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(4, 12, SHADOW_SIZE_M)
FOOTPRINT(Darkrai)
OVERWORLD(
gObjectEventPic_Darkrai,
sPicTable_Darkrai,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -7229,7 +7229,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(1, -3, SHADOW_SIZE_S)
FOOTPRINT(Shaymin)
OVERWORLD(
gObjectEventPic_ShayminLand,
sPicTable_ShayminLand,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -7307,7 +7307,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(3, 7, SHADOW_SIZE_M)
FOOTPRINT(Shaymin)
OVERWORLD(
gObjectEventPic_ShayminSky,
sPicTable_ShayminSky,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -7388,7 +7388,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] =
SHADOW(-1, 15, SHADOW_SIZE_XL_BATTLE_ONLY) \
FOOTPRINT(Arceus) \
OVERWORLD( \
gObjectEventPic_Arceus ##typeName, \
sPicTable_Arceus ##typeName, \
SIZE_64x64, \
SHADOW_SIZE_M, \
TRACKS_FOOT, \

File diff suppressed because it is too large Load Diff

View File

@ -60,7 +60,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(-2, 3, SHADOW_SIZE_S)
FOOTPRINT(Chespin)
OVERWORLD(
gObjectEventPic_Chespin,
sPicTable_Chespin,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -130,7 +130,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(2, 4, SHADOW_SIZE_M)
FOOTPRINT(Quilladin)
OVERWORLD(
gObjectEventPic_Quilladin,
sPicTable_Quilladin,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -197,7 +197,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(4, 10, SHADOW_SIZE_L)
FOOTPRINT(Chesnaught)
OVERWORLD(
gObjectEventPic_Chesnaught,
sPicTable_Chesnaught,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -269,7 +269,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(0, 4, SHADOW_SIZE_S)
FOOTPRINT(Fennekin)
OVERWORLD(
gObjectEventPic_Fennekin,
sPicTable_Fennekin,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -337,7 +337,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(-2, 10, SHADOW_SIZE_M)
FOOTPRINT(Braixen)
OVERWORLD(
gObjectEventPic_Braixen,
sPicTable_Braixen,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -408,7 +408,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(7, 14, SHADOW_SIZE_M)
FOOTPRINT(Delphox)
OVERWORLD(
gObjectEventPic_Delphox,
sPicTable_Delphox,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -480,7 +480,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(2, 0, SHADOW_SIZE_S)
FOOTPRINT(Froakie)
OVERWORLD(
gObjectEventPic_Froakie,
sPicTable_Froakie,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -547,7 +547,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(0, 5, SHADOW_SIZE_M)
FOOTPRINT(Frogadier)
OVERWORLD(
gObjectEventPic_Frogadier,
sPicTable_Frogadier,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -607,7 +607,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(4, 6, SHADOW_SIZE_L)
FOOTPRINT(Greninja)
OVERWORLD(
gObjectEventPic_Greninja,
sPicTable_Greninja,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -667,7 +667,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(4, 6, SHADOW_SIZE_L)
FOOTPRINT(Greninja)
OVERWORLD(
gObjectEventPic_Greninja,
sPicTable_Greninja,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -794,7 +794,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(3, 9, SHADOW_SIZE_S)
FOOTPRINT(Bunnelby)
OVERWORLD(
gObjectEventPic_Bunnelby,
sPicTable_Bunnelby,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -861,7 +861,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(8, 10, SHADOW_SIZE_M)
FOOTPRINT(Diggersby)
OVERWORLD(
gObjectEventPic_Diggersby,
sPicTable_Diggersby,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -932,7 +932,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(-2, 0, SHADOW_SIZE_S)
FOOTPRINT(Fletchling)
OVERWORLD(
gObjectEventPic_Fletchling,
sPicTable_Fletchling,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1006,7 +1006,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(0, 12, SHADOW_SIZE_S)
FOOTPRINT(Fletchinder)
OVERWORLD(
gObjectEventPic_Fletchinder,
sPicTable_Fletchinder,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1073,7 +1073,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(-2, 17, SHADOW_SIZE_M)
FOOTPRINT(Talonflame)
OVERWORLD(
gObjectEventPic_Talonflame,
sPicTable_Talonflame,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1133,7 +1133,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(1, 1, SHADOW_SIZE_S) \
FOOTPRINT(Scatterbug) \
OVERWORLD( \
gObjectEventPic_Scatterbug, \
sPicTable_Scatterbug, \
SIZE_32x32, \
SHADOW_SIZE_M, \
TRACKS_FOOT, \
@ -1216,7 +1216,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(0, 2, SHADOW_SIZE_M) \
FOOTPRINT(Spewpa) \
OVERWORLD( \
gObjectEventPic_Spewpa, \
sPicTable_Spewpa, \
SIZE_32x32, \
SHADOW_SIZE_M, \
TRACKS_FOOT, \
@ -1299,7 +1299,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(0, 20, SHADOW_SIZE_M) \
FOOTPRINT(Vivillon) \
OVERWORLD( \
gObjectEventPic_Vivillon ##form, \
sPicTable_Vivillon ##form, \
SIZE_32x32, \
SHADOW_SIZE_M, \
TRACKS_FOOT, \
@ -1548,7 +1548,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(2, 3, SHADOW_SIZE_S)
FOOTPRINT(Litleo)
OVERWORLD(
gObjectEventPic_Litleo,
sPicTable_Litleo,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1623,7 +1623,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(-2, 11, SHADOW_SIZE_XL_BATTLE_ONLY)
FOOTPRINT(Pyroar)
OVERWORLD(
gObjectEventPic_Pyroar,
sPicTable_Pyroar,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1632,7 +1632,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
gShinyOverworldPalette_Pyroar
)
OVERWORLD_FEMALE(
gObjectEventPic_PyroarF,
sPicTable_PyroarF,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1689,11 +1689,11 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(0, 11, SHADOW_SIZE_S) \
FOOTPRINT(Flabebe) \
OVERWORLD( \
gObjectEventPic_Flabebe##Form, \
sPicTable_Flabebe##Form, \
SIZE_32x32, \
SHADOW_SIZE_M, \
TRACKS_FOOT, \
sAnimTable_Following, \
sAnimTable_Following, \
gOverworldPalette_Flabebe##Form, \
gShinyOverworldPalette_Flabebe##Form \
) \
@ -1778,7 +1778,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(-3, 12, SHADOW_SIZE_S) \
FOOTPRINT(Floette) \
OVERWORLD( \
gObjectEventPic_Floette ##form, \
sPicTable_Floette ##form, \
SIZE_32x32, \
SHADOW_SIZE_M, \
TRACKS_FOOT, \
@ -1927,7 +1927,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(-5, 15, SHADOW_SIZE_M) \
FOOTPRINT(Florges) \
OVERWORLD( \
gObjectEventPic_Florges ##Form, \
sPicTable_Florges ##Form, \
SIZE_32x32, \
SHADOW_SIZE_M, \
TRACKS_FOOT, \
@ -2039,7 +2039,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(2, 7, SHADOW_SIZE_M)
FOOTPRINT(Skiddo)
OVERWORLD(
gObjectEventPic_Skiddo,
sPicTable_Skiddo,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2107,7 +2107,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(2, 9, SHADOW_SIZE_XL_BATTLE_ONLY)
FOOTPRINT(Gogoat)
OVERWORLD(
gObjectEventPic_Gogoat,
sPicTable_Gogoat,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2179,7 +2179,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(-2, 2, SHADOW_SIZE_S)
FOOTPRINT(Pancham)
OVERWORLD(
gObjectEventPic_Pancham,
sPicTable_Pancham,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2251,7 +2251,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(-2, 13, SHADOW_SIZE_XL_BATTLE_ONLY)
FOOTPRINT(Pangoro)
OVERWORLD(
gObjectEventPic_Pangoro,
sPicTable_Pangoro,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2312,7 +2312,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(3, 10, SHADOW_SIZE_XL_BATTLE_ONLY) \
FOOTPRINT(Furfrou) \
OVERWORLD( \
gObjectEventPic_Furfrou##_form, \
sPicTable_Furfrou##_form, \
SIZE_32x32, \
SHADOW_SIZE_M, \
TRACKS_FOOT, \
@ -2398,7 +2398,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(-1, 4, SHADOW_SIZE_S)
FOOTPRINT(Espurr)
OVERWORLD(
gObjectEventPic_Espurr,
sPicTable_Espurr,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2463,7 +2463,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(-2, 11, SHADOW_SIZE_S)
FOOTPRINT(Meowstic)
OVERWORLD(
gObjectEventPic_MeowsticM,
sPicTable_MeowsticM,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2526,7 +2526,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(-2, 12, SHADOW_SIZE_S)
FOOTPRINT(Meowstic)
OVERWORLD(
gObjectEventPic_MeowsticF,
sPicTable_MeowsticF,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2596,7 +2596,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(-10, 11, SHADOW_SIZE_S)
FOOTPRINT(Honedge)
OVERWORLD(
gObjectEventPic_Honedge,
sPicTable_Honedge,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2667,7 +2667,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(8, 11, SHADOW_SIZE_M)
FOOTPRINT(Doublade)
OVERWORLD(
gObjectEventPic_Doublade,
sPicTable_Doublade,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2740,7 +2740,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(0, 14, SHADOW_SIZE_M)
FOOTPRINT(Aegislash)
OVERWORLD(
gObjectEventPic_AegislashShield,
sPicTable_AegislashShield,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2882,7 +2882,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(-1, 13, SHADOW_SIZE_S)
FOOTPRINT(Spritzee)
OVERWORLD(
gObjectEventPic_Spritzee,
sPicTable_Spritzee,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2950,7 +2950,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(0, 10, SHADOW_SIZE_M)
FOOTPRINT(Aromatisse)
OVERWORLD(
gObjectEventPic_Aromatisse,
sPicTable_Aromatisse,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3022,7 +3022,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(0, -1, SHADOW_SIZE_S)
FOOTPRINT(Swirlix)
OVERWORLD(
gObjectEventPic_Swirlix,
sPicTable_Swirlix,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3093,7 +3093,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(1, 6, SHADOW_SIZE_M)
FOOTPRINT(Slurpuff)
OVERWORLD(
gObjectEventPic_Slurpuff,
sPicTable_Slurpuff,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3163,7 +3163,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(-1, 11, SHADOW_SIZE_S)
FOOTPRINT(Inkay)
OVERWORLD(
gObjectEventPic_Inkay,
sPicTable_Inkay,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3232,7 +3232,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(5, 14, SHADOW_SIZE_M)
FOOTPRINT(Malamar)
OVERWORLD(
gObjectEventPic_Malamar,
sPicTable_Malamar,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3303,7 +3303,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(-3, 5, SHADOW_SIZE_M)
FOOTPRINT(Binacle)
OVERWORLD(
gObjectEventPic_Binacle,
sPicTable_Binacle,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3371,7 +3371,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(4, 14, SHADOW_SIZE_L)
FOOTPRINT(Barbaracle)
OVERWORLD(
gObjectEventPic_Barbaracle,
sPicTable_Barbaracle,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3444,7 +3444,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(3, 5, SHADOW_SIZE_S)
FOOTPRINT(Skrelp)
OVERWORLD(
gObjectEventPic_Skrelp,
sPicTable_Skrelp,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3513,7 +3513,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(-3, 14, SHADOW_SIZE_M)
FOOTPRINT(Dragalge)
OVERWORLD(
gObjectEventPic_Dragalge,
sPicTable_Dragalge,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3584,7 +3584,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(4, -6, SHADOW_SIZE_M)
FOOTPRINT(Clauncher)
OVERWORLD(
gObjectEventPic_Clauncher,
sPicTable_Clauncher,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3658,7 +3658,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(6, 1, SHADOW_SIZE_L)
FOOTPRINT(Clawitzer)
OVERWORLD(
gObjectEventPic_Clawitzer,
sPicTable_Clawitzer,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3726,7 +3726,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(-1, 1, SHADOW_SIZE_S)
FOOTPRINT(Helioptile)
OVERWORLD(
gObjectEventPic_Helioptile,
sPicTable_Helioptile,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3795,7 +3795,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(-2, 10, SHADOW_SIZE_M)
FOOTPRINT(Heliolisk)
OVERWORLD(
gObjectEventPic_Heliolisk,
sPicTable_Heliolisk,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3864,7 +3864,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(3, 2, SHADOW_SIZE_M)
FOOTPRINT(Tyrunt)
OVERWORLD(
gObjectEventPic_Tyrunt,
sPicTable_Tyrunt,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3931,7 +3931,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(-2, 14, SHADOW_SIZE_L)
FOOTPRINT(Tyrantrum)
OVERWORLD(
gObjectEventPic_Tyrantrum,
sPicTable_Tyrantrum,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4006,7 +4006,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(0, 8, SHADOW_SIZE_S)
FOOTPRINT(Amaura)
OVERWORLD(
gObjectEventPic_Amaura,
sPicTable_Amaura,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4073,7 +4073,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(-6, 14, SHADOW_SIZE_L)
FOOTPRINT(Aurorus)
OVERWORLD(
gObjectEventPic_Aurorus,
sPicTable_Aurorus,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4146,7 +4146,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(3, 6, SHADOW_SIZE_S)
FOOTPRINT(Hawlucha)
OVERWORLD(
gObjectEventPic_Hawlucha,
sPicTable_Hawlucha,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4215,7 +4215,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(-2, 1, SHADOW_SIZE_S)
FOOTPRINT(Dedenne)
OVERWORLD(
gObjectEventPic_Dedenne,
sPicTable_Dedenne,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4292,7 +4292,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(-1, 5, SHADOW_SIZE_S)
FOOTPRINT(Carbink)
OVERWORLD(
gObjectEventPic_Carbink,
sPicTable_Carbink,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4361,7 +4361,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(-1, -1, SHADOW_SIZE_S)
FOOTPRINT(Goomy)
OVERWORLD(
gObjectEventPic_Goomy,
sPicTable_Goomy,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4431,7 +4431,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(1, 6, SHADOW_SIZE_S)
FOOTPRINT(Sliggoo)
OVERWORLD(
gObjectEventPic_Sliggoo,
sPicTable_Sliggoo,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4502,7 +4502,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(-2, 14, SHADOW_SIZE_M)
FOOTPRINT(Goodra)
OVERWORLD(
gObjectEventPic_Goodra,
sPicTable_Goodra,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4567,7 +4567,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(2, 6, SHADOW_SIZE_M)
FOOTPRINT(Sliggoo)
OVERWORLD(
gObjectEventPic_SliggooHisui,
sPicTable_SliggooHisui,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4633,7 +4633,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(1, 12, SHADOW_SIZE_M)
FOOTPRINT(Goodra)
OVERWORLD(
gObjectEventPic_GoodraHisui,
sPicTable_GoodraHisui,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4712,7 +4712,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(-1, 12, SHADOW_SIZE_S)
FOOTPRINT(Klefki)
OVERWORLD(
gObjectEventPic_Klefki,
sPicTable_Klefki,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4782,7 +4782,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(-1, 5, SHADOW_SIZE_S)
FOOTPRINT(Phantump)
OVERWORLD(
gObjectEventPic_Phantump,
sPicTable_Phantump,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4854,7 +4854,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(-1, 13, SHADOW_SIZE_M)
FOOTPRINT(Trevenant)
OVERWORLD(
gObjectEventPic_Trevenant,
sPicTable_Trevenant,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4918,7 +4918,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(0, 1, SHADOW_SIZE_S)
FOOTPRINT(Pumpkaboo)
OVERWORLD(
gObjectEventPic_PumpkabooAverage,
sPicTable_PumpkabooAverage,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4983,7 +4983,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(-1, -1, SHADOW_SIZE_S)
FOOTPRINT(Pumpkaboo)
OVERWORLD(
gObjectEventPic_PumpkabooSmall,
sPicTable_PumpkabooSmall,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5048,7 +5048,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(0, 2, SHADOW_SIZE_S)
FOOTPRINT(Pumpkaboo)
OVERWORLD(
gObjectEventPic_PumpkabooLarge,
sPicTable_PumpkabooLarge,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5115,7 +5115,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(1, 4, SHADOW_SIZE_S)
FOOTPRINT(Pumpkaboo)
OVERWORLD(
gObjectEventPic_PumpkabooSuper,
sPicTable_PumpkabooSuper,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5181,7 +5181,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(3, 10, SHADOW_SIZE_M)
FOOTPRINT(Gourgeist)
OVERWORLD(
gObjectEventPic_GourgeistAverage,
sPicTable_GourgeistAverage,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5244,7 +5244,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(4, 9, SHADOW_SIZE_S)
FOOTPRINT(Gourgeist)
OVERWORLD(
gObjectEventPic_GourgeistSmall,
sPicTable_GourgeistSmall,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5307,7 +5307,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(4, 12, SHADOW_SIZE_M)
FOOTPRINT(Gourgeist)
OVERWORLD(
gObjectEventPic_GourgeistLarge,
sPicTable_GourgeistLarge,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5372,7 +5372,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(4, 14, SHADOW_SIZE_M)
FOOTPRINT(Gourgeist)
OVERWORLD(
gObjectEventPic_GourgeistSuper,
sPicTable_GourgeistSuper,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5449,7 +5449,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(1, -1, SHADOW_SIZE_S)
FOOTPRINT(Bergmite)
OVERWORLD(
gObjectEventPic_Bergmite,
sPicTable_Bergmite,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5519,7 +5519,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(1, -1, SHADOW_SIZE_XL_BATTLE_ONLY)
FOOTPRINT(Avalugg)
OVERWORLD(
gObjectEventPic_Avalugg,
sPicTable_Avalugg,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5582,7 +5582,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(2, -2, SHADOW_SIZE_L)
FOOTPRINT(Avalugg)
OVERWORLD(
gObjectEventPic_AvaluggHisui,
sPicTable_AvaluggHisui,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5663,7 +5663,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(2, 11, SHADOW_SIZE_L)
FOOTPRINT(Noibat)
OVERWORLD(
gObjectEventPic_Noibat,
sPicTable_Noibat,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5734,7 +5734,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(5, 10, SHADOW_SIZE_L)
FOOTPRINT(Noivern)
OVERWORLD(
gObjectEventPic_Noivern,
sPicTable_Noivern,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5794,7 +5794,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(3, 14, SHADOW_SIZE_M)
FOOTPRINT(Xerneas)
OVERWORLD(
gObjectEventPic_XerneasNeutral,
sPicTable_XerneasNeutral,
SIZE_64x64,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5857,7 +5857,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(3, 14, SHADOW_SIZE_M)
FOOTPRINT(Xerneas)
OVERWORLD(
gObjectEventPic_XerneasActive,
sPicTable_XerneasActive,
SIZE_64x64,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5932,7 +5932,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(0, 16, SHADOW_SIZE_L)
FOOTPRINT(Yveltal)
OVERWORLD(
gObjectEventPic_Yveltal,
sPicTable_Yveltal,
SIZE_64x64,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5996,7 +5996,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(0, 13, SHADOW_SIZE_L)
FOOTPRINT(Zygarde)
OVERWORLD(
gObjectEventPic_Zygarde50,
sPicTable_Zygarde50,
SIZE_64x64,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6059,7 +6059,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(0, 13, SHADOW_SIZE_L)
FOOTPRINT(Zygarde)
OVERWORLD(
gObjectEventPic_Zygarde50,
sPicTable_Zygarde50,
SIZE_64x64,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6122,7 +6122,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(1, 11, SHADOW_SIZE_L)
FOOTPRINT(Zygarde)
OVERWORLD(
gObjectEventPic_Zygarde10,
sPicTable_Zygarde10,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6186,7 +6186,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(1, 11, SHADOW_SIZE_L)
FOOTPRINT(Zygarde)
OVERWORLD(
gObjectEventPic_Zygarde10,
sPicTable_Zygarde10,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6258,7 +6258,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(-3, 13, SHADOW_SIZE_XL_BATTLE_ONLY)
FOOTPRINT(Zygarde)
OVERWORLD(
gObjectEventPic_ZygardeComplete,
sPicTable_ZygardeComplete,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6332,7 +6332,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(0, 13, SHADOW_SIZE_S)
FOOTPRINT(Diancie)
OVERWORLD(
gObjectEventPic_Diancie,
sPicTable_Diancie,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6402,7 +6402,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
FOOTPRINT(Diancie)
#if OW_BATTLE_ONLY_FORMS
OVERWORLD(
gObjectEventPic_DiancieMega,
sPicTable_DiancieMega,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6485,7 +6485,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(0, 13, SHADOW_SIZE_S)
FOOTPRINT(Hoopa)
OVERWORLD(
gObjectEventPic_HoopaConfined,
sPicTable_HoopaConfined,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6556,7 +6556,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(1, 14, SHADOW_SIZE_L)
FOOTPRINT(Hoopa)
OVERWORLD(
gObjectEventPic_HoopaUnbound,
sPicTable_HoopaUnbound,
SIZE_64x64,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6628,7 +6628,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] =
SHADOW(0, 12, SHADOW_SIZE_XL_BATTLE_ONLY)
FOOTPRINT(Volcanion)
OVERWORLD(
gObjectEventPic_Volcanion,
sPicTable_Volcanion,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,

View File

@ -57,7 +57,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-1, 1, SHADOW_SIZE_S)
FOOTPRINT(Rowlet)
OVERWORLD(
gObjectEventPic_Rowlet,
sPicTable_Rowlet,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -125,7 +125,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(0, 5, SHADOW_SIZE_S)
FOOTPRINT(Dartrix)
OVERWORLD(
gObjectEventPic_Dartrix,
sPicTable_Dartrix,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -192,7 +192,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-1, 13, SHADOW_SIZE_S)
FOOTPRINT(Decidueye)
OVERWORLD(
gObjectEventPic_Decidueye,
sPicTable_Decidueye,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -256,7 +256,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-1, 14, SHADOW_SIZE_L)
FOOTPRINT(Decidueye)
OVERWORLD(
gObjectEventPic_DecidueyeHisui,
sPicTable_DecidueyeHisui,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -323,7 +323,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(1, 1, SHADOW_SIZE_S)
FOOTPRINT(Litten)
OVERWORLD(
gObjectEventPic_Litten,
sPicTable_Litten,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -387,7 +387,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(5, 7, SHADOW_SIZE_M)
FOOTPRINT(Torracat)
OVERWORLD(
gObjectEventPic_Torracat,
sPicTable_Torracat,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -450,7 +450,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(4, 14, SHADOW_SIZE_L)
FOOTPRINT(Incineroar)
OVERWORLD(
gObjectEventPic_Incineroar,
sPicTable_Incineroar,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -514,7 +514,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(0, 1, SHADOW_SIZE_S)
FOOTPRINT(Popplio)
OVERWORLD(
gObjectEventPic_Popplio,
sPicTable_Popplio,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -578,7 +578,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-5, 6, SHADOW_SIZE_M)
FOOTPRINT(Brionne)
OVERWORLD(
gObjectEventPic_Brionne,
sPicTable_Brionne,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -641,7 +641,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-6, 11, SHADOW_SIZE_L)
FOOTPRINT(Primarina)
OVERWORLD(
gObjectEventPic_Primarina,
sPicTable_Primarina,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -710,7 +710,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(0, 3, SHADOW_SIZE_S)
FOOTPRINT(Pikipek)
OVERWORLD(
gObjectEventPic_Pikipek,
sPicTable_Pikipek,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -780,7 +780,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(1, 8, SHADOW_SIZE_S)
FOOTPRINT(Trumbeak)
OVERWORLD(
gObjectEventPic_Trumbeak,
sPicTable_Trumbeak,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -847,7 +847,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(9, 12, SHADOW_SIZE_M)
FOOTPRINT(Toucannon)
OVERWORLD(
gObjectEventPic_Toucannon,
sPicTable_Toucannon,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -912,7 +912,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-9, 1, SHADOW_SIZE_M)
FOOTPRINT(Yungoos)
OVERWORLD(
gObjectEventPic_Yungoos,
sPicTable_Yungoos,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -973,7 +973,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-2, 8, SHADOW_SIZE_M)
FOOTPRINT(Gumshoos)
OVERWORLD(
gObjectEventPic_Gumshoos,
sPicTable_Gumshoos,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1033,7 +1033,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-2, 8, SHADOW_SIZE_M)
FOOTPRINT(Gumshoos)
OVERWORLD(
gObjectEventPic_Gumshoos,
sPicTable_Gumshoos,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1100,7 +1100,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(0, -4, SHADOW_SIZE_M)
FOOTPRINT(Grubbin)
OVERWORLD(
gObjectEventPic_Grubbin,
sPicTable_Grubbin,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1169,7 +1169,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
NO_SHADOW
FOOTPRINT(Charjabug)
OVERWORLD(
gObjectEventPic_Charjabug,
sPicTable_Charjabug,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1231,7 +1231,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-1, 16, SHADOW_SIZE_S)
FOOTPRINT(Vikavolt)
OVERWORLD(
gObjectEventPic_Vikavolt,
sPicTable_Vikavolt,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1299,7 +1299,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-1, 16, SHADOW_SIZE_S)
FOOTPRINT(Vikavolt)
OVERWORLD(
gObjectEventPic_Vikavolt,
sPicTable_Vikavolt,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1367,7 +1367,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(7, 6, SHADOW_SIZE_M)
FOOTPRINT(Crabrawler)
OVERWORLD(
gObjectEventPic_Crabrawler,
sPicTable_Crabrawler,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1433,7 +1433,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(1, 14, SHADOW_SIZE_L)
FOOTPRINT(Crabominable)
OVERWORLD(
gObjectEventPic_Crabominable,
sPicTable_Crabominable,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1498,7 +1498,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-4, 9, SHADOW_SIZE_S)
FOOTPRINT(Oricorio)
OVERWORLD(
gObjectEventPic_OricorioBaile,
sPicTable_OricorioBaile,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1564,7 +1564,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(5, 8, SHADOW_SIZE_S)
FOOTPRINT(Oricorio)
OVERWORLD(
gObjectEventPic_OricorioPomPom,
sPicTable_OricorioPomPom,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1630,7 +1630,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-3, 11, SHADOW_SIZE_S)
FOOTPRINT(Oricorio)
OVERWORLD(
gObjectEventPic_OricorioPau,
sPicTable_OricorioPau,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1696,7 +1696,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(7, 10, SHADOW_SIZE_S)
FOOTPRINT(Oricorio)
OVERWORLD(
gObjectEventPic_OricorioSensu,
sPicTable_OricorioSensu,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1798,7 +1798,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(0, 5, SHADOW_SIZE_S)
FOOTPRINT(Cutiefly)
OVERWORLD(
gObjectEventPic_Cutiefly,
sPicTable_Cutiefly,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1861,7 +1861,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-1, 12, SHADOW_SIZE_S)
FOOTPRINT(Ribombee)
OVERWORLD(
gObjectEventPic_Ribombee,
sPicTable_Ribombee,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1922,7 +1922,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-1, 12, SHADOW_SIZE_S)
FOOTPRINT(Ribombee)
OVERWORLD(
gObjectEventPic_Ribombee,
sPicTable_Ribombee,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1985,7 +1985,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-2, 2, SHADOW_SIZE_S)
FOOTPRINT(Rockruff)
OVERWORLD(
gObjectEventPic_Rockruff,
sPicTable_Rockruff,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2047,7 +2047,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-2, 2, SHADOW_SIZE_S)
FOOTPRINT(Rockruff)
OVERWORLD(
gObjectEventPic_Rockruff,
sPicTable_Rockruff,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2115,7 +2115,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(5, 7, SHADOW_SIZE_L)
FOOTPRINT(Lycanroc)
OVERWORLD(
gObjectEventPic_LycanrocMidday,
sPicTable_LycanrocMidday,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2181,7 +2181,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(5, 13, SHADOW_SIZE_L)
FOOTPRINT(Lycanroc)
OVERWORLD(
gObjectEventPic_LycanrocMidnight,
sPicTable_LycanrocMidnight,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2247,7 +2247,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(5, 7, SHADOW_SIZE_L)
FOOTPRINT(Lycanroc)
OVERWORLD(
gObjectEventPic_LycanrocDusk,
sPicTable_LycanrocDusk,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2313,7 +2313,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-1, 3, SHADOW_SIZE_S)
FOOTPRINT(Wishiwashi)
OVERWORLD(
gObjectEventPic_WishiwashiSolo,
sPicTable_WishiwashiSolo,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2437,7 +2437,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(0, -1, SHADOW_SIZE_M)
FOOTPRINT(Mareanie)
OVERWORLD(
gObjectEventPic_Mareanie,
sPicTable_Mareanie,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2502,7 +2502,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(0, 6, SHADOW_SIZE_XL_BATTLE_ONLY)
FOOTPRINT(Toxapex)
OVERWORLD(
gObjectEventPic_Toxapex,
sPicTable_Toxapex,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2567,7 +2567,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(2, 6, SHADOW_SIZE_M)
FOOTPRINT(Mudbray)
OVERWORLD(
gObjectEventPic_Mudbray,
sPicTable_Mudbray,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2632,7 +2632,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(4, 13, SHADOW_SIZE_L)
FOOTPRINT(Mudsdale)
OVERWORLD(
gObjectEventPic_Mudsdale,
sPicTable_Mudsdale,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2704,7 +2704,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(1, 2, SHADOW_SIZE_S)
FOOTPRINT(Dewpider)
OVERWORLD(
gObjectEventPic_Dewpider,
sPicTable_Dewpider,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2766,7 +2766,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-6, 9, SHADOW_SIZE_M)
FOOTPRINT(Araquanid)
OVERWORLD(
gObjectEventPic_Araquanid,
sPicTable_Araquanid,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2826,7 +2826,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-6, 9, SHADOW_SIZE_S)
FOOTPRINT(Araquanid)
OVERWORLD(
gObjectEventPic_Araquanid,
sPicTable_Araquanid,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2894,7 +2894,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(0, 3, SHADOW_SIZE_S)
FOOTPRINT(Fomantis)
OVERWORLD(
gObjectEventPic_Fomantis,
sPicTable_Fomantis,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2956,7 +2956,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-1, 12, SHADOW_SIZE_S)
FOOTPRINT(Lurantis)
OVERWORLD(
gObjectEventPic_Lurantis,
sPicTable_Lurantis,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3016,7 +3016,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-1, 12, SHADOW_SIZE_S)
FOOTPRINT(Lurantis)
OVERWORLD(
gObjectEventPic_Lurantis,
sPicTable_Lurantis,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3085,7 +3085,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-1, 4, SHADOW_SIZE_S)
FOOTPRINT(Morelull)
OVERWORLD(
gObjectEventPic_Morelull,
sPicTable_Morelull,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3151,7 +3151,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(0, 10, SHADOW_SIZE_S)
FOOTPRINT(Shiinotic)
OVERWORLD(
gObjectEventPic_Shiinotic,
sPicTable_Shiinotic,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3220,7 +3220,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(3, 1, SHADOW_SIZE_M)
FOOTPRINT(Salandit)
OVERWORLD(
gObjectEventPic_Salandit,
sPicTable_Salandit,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3282,7 +3282,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-4, 9, SHADOW_SIZE_XL_BATTLE_ONLY)
FOOTPRINT(Salazzle)
OVERWORLD(
gObjectEventPic_Salazzle,
sPicTable_Salazzle,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3342,7 +3342,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-4, 9, SHADOW_SIZE_XL_BATTLE_ONLY)
FOOTPRINT(Salazzle)
OVERWORLD(
gObjectEventPic_Salazzle,
sPicTable_Salazzle,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3413,7 +3413,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(0, 3, SHADOW_SIZE_M)
FOOTPRINT(Stufful)
OVERWORLD(
gObjectEventPic_Stufful,
sPicTable_Stufful,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3481,7 +3481,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-1, 13, SHADOW_SIZE_M)
FOOTPRINT(Bewear)
OVERWORLD(
gObjectEventPic_Bewear,
sPicTable_Bewear,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3546,7 +3546,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-2, -3, SHADOW_SIZE_S)
FOOTPRINT(Bounsweet)
OVERWORLD(
gObjectEventPic_Bounsweet,
sPicTable_Bounsweet,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3612,7 +3612,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-2, 7, SHADOW_SIZE_S)
FOOTPRINT(Steenee)
OVERWORLD(
gObjectEventPic_Steenee,
sPicTable_Steenee,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3677,7 +3677,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(1, 13, SHADOW_SIZE_M)
FOOTPRINT(Tsareena)
OVERWORLD(
gObjectEventPic_Tsareena,
sPicTable_Tsareena,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3744,7 +3744,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(0, 10, SHADOW_SIZE_M)
FOOTPRINT(Comfey)
OVERWORLD(
gObjectEventPic_Comfey,
sPicTable_Comfey,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3812,7 +3812,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-2, 6, SHADOW_SIZE_M)
FOOTPRINT(Oranguru)
OVERWORLD(
gObjectEventPic_Oranguru,
sPicTable_Oranguru,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3880,7 +3880,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-4, 12, SHADOW_SIZE_L)
FOOTPRINT(Passimian)
OVERWORLD(
gObjectEventPic_Passimian,
sPicTable_Passimian,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3949,7 +3949,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-4, -3, SHADOW_SIZE_S)
FOOTPRINT(Wimpod)
OVERWORLD(
gObjectEventPic_Wimpod,
sPicTable_Wimpod,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4017,7 +4017,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(2, 13, SHADOW_SIZE_L)
FOOTPRINT(Golisopod)
OVERWORLD(
gObjectEventPic_Golisopod,
sPicTable_Golisopod,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4082,7 +4082,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
NO_SHADOW
FOOTPRINT(Sandygast)
OVERWORLD(
gObjectEventPic_Sandygast,
sPicTable_Sandygast,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4147,7 +4147,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
NO_SHADOW
FOOTPRINT(Palossand)
OVERWORLD(
gObjectEventPic_Palossand,
sPicTable_Palossand,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4215,7 +4215,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-3, -3, SHADOW_SIZE_S)
FOOTPRINT(Pyukumuku)
OVERWORLD(
gObjectEventPic_Pyukumuku,
sPicTable_Pyukumuku,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4280,7 +4280,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(1, 11, SHADOW_SIZE_L)
FOOTPRINT(Type_Null)
OVERWORLD(
gObjectEventPic_TypeNull,
sPicTable_TypeNull,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4343,7 +4343,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(1, 13, SHADOW_SIZE_L) \
FOOTPRINT(Silvally) \
OVERWORLD( \
gObjectEventPic_Silvally, \
sPicTable_Silvally, \
SIZE_32x32, \
SHADOW_SIZE_M, \
TRACKS_FOOT, \
@ -4435,7 +4435,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
.iconPalIndex = 0, \
SHADOW(0, 14, SHADOW_SIZE_S) \
OVERWORLD( \
gObjectEventPic_MiniorMeteor, \
sPicTable_MiniorMeteor, \
SIZE_32x32, \
SHADOW_SIZE_M, \
TRACKS_FOOT, \
@ -4543,7 +4543,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-4, 0, SHADOW_SIZE_S)
FOOTPRINT(Komala)
OVERWORLD(
gObjectEventPic_Komala,
sPicTable_Komala,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4613,7 +4613,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-3, 12, SHADOW_SIZE_L)
FOOTPRINT(Turtonator)
OVERWORLD(
gObjectEventPic_Turtonator,
sPicTable_Turtonator,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4675,7 +4675,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-1, 4, SHADOW_SIZE_S)
FOOTPRINT(Togedemaru)
OVERWORLD(
gObjectEventPic_Togedemaru,
sPicTable_Togedemaru,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4736,7 +4736,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-1, 4, SHADOW_SIZE_S)
FOOTPRINT(Togedemaru)
OVERWORLD(
gObjectEventPic_Togedemaru,
sPicTable_Togedemaru,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4801,7 +4801,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-3, 1, SHADOW_SIZE_S)
FOOTPRINT(Mimikyu)
OVERWORLD(
gObjectEventPic_MimikyuDisguised,
sPicTable_MimikyuDisguised,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4916,7 +4916,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-3, 1, SHADOW_SIZE_S)
FOOTPRINT(Mimikyu)
OVERWORLD(
gObjectEventPic_MimikyuDisguised,
sPicTable_MimikyuDisguised,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5041,7 +5041,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(0, -1, SHADOW_SIZE_M)
FOOTPRINT(Bruxish)
OVERWORLD(
gObjectEventPic_Bruxish,
sPicTable_Bruxish,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5110,7 +5110,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(5, 13, SHADOW_SIZE_XL_BATTLE_ONLY)
FOOTPRINT(Drampa)
OVERWORLD(
gObjectEventPic_Drampa,
sPicTable_Drampa,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5177,7 +5177,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-1, 12, SHADOW_SIZE_M)
FOOTPRINT(Dhelmise)
OVERWORLD(
gObjectEventPic_Dhelmise,
sPicTable_Dhelmise,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5245,7 +5245,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(0, 5, SHADOW_SIZE_S)
FOOTPRINT(JangmoO)
OVERWORLD(
gObjectEventPic_JangmoO,
sPicTable_JangmoO,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5313,7 +5313,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-2, 12, SHADOW_SIZE_M)
FOOTPRINT(HakamoO)
OVERWORLD(
gObjectEventPic_HakamoO,
sPicTable_HakamoO,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5374,7 +5374,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(0, 13, SHADOW_SIZE_L)
FOOTPRINT(KommoO)
OVERWORLD(
gObjectEventPic_KommoO,
sPicTable_KommoO,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5440,7 +5440,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(0, 13, SHADOW_SIZE_L)
FOOTPRINT(KommoO)
OVERWORLD(
gObjectEventPic_KommoO,
sPicTable_KommoO,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5516,7 +5516,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-1, 19, SHADOW_SIZE_M)
FOOTPRINT(TapuKoko)
OVERWORLD(
gObjectEventPic_TapuKoko,
sPicTable_TapuKoko,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5587,7 +5587,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(0, 13, SHADOW_SIZE_S)
FOOTPRINT(TapuLele)
OVERWORLD(
gObjectEventPic_TapuLele,
sPicTable_TapuLele,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5660,7 +5660,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(4, 16, SHADOW_SIZE_M)
FOOTPRINT(TapuBulu)
OVERWORLD(
gObjectEventPic_TapuBulu,
sPicTable_TapuBulu,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5732,7 +5732,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(1, 15, SHADOW_SIZE_M)
FOOTPRINT(TapuFini)
OVERWORLD(
gObjectEventPic_TapuFini,
sPicTable_TapuFini,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5799,7 +5799,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(0, 8, SHADOW_SIZE_S)
FOOTPRINT(Cosmog)
OVERWORLD(
gObjectEventPic_Cosmog,
sPicTable_Cosmog,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5868,7 +5868,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(0, 5, SHADOW_SIZE_M)
FOOTPRINT(Cosmoem)
OVERWORLD(
gObjectEventPic_Cosmoem,
sPicTable_Cosmoem,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5936,7 +5936,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-1, 11, SHADOW_SIZE_XL_BATTLE_ONLY)
FOOTPRINT(Solgaleo)
OVERWORLD(
gObjectEventPic_Solgaleo,
sPicTable_Solgaleo,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6002,7 +6002,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(4, 17, SHADOW_SIZE_L)
FOOTPRINT(Lunala)
OVERWORLD(
gObjectEventPic_Lunala,
sPicTable_Lunala,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6070,7 +6070,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-2, 14, SHADOW_SIZE_S)
FOOTPRINT(Nihilego)
OVERWORLD(
gObjectEventPic_Nihilego,
sPicTable_Nihilego,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6137,7 +6137,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-2, 12, SHADOW_SIZE_XL_BATTLE_ONLY)
FOOTPRINT(Buzzwole)
OVERWORLD(
gObjectEventPic_Buzzwole,
sPicTable_Buzzwole,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6203,7 +6203,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(0, 13, SHADOW_SIZE_S)
FOOTPRINT(Pheromosa)
OVERWORLD(
gObjectEventPic_Pheromosa,
sPicTable_Pheromosa,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6269,7 +6269,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(0, 13, SHADOW_SIZE_L)
FOOTPRINT(Xurkitree)
OVERWORLD(
gObjectEventPic_Xurkitree,
sPicTable_Xurkitree,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6337,7 +6337,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-1, 13, SHADOW_SIZE_M)
FOOTPRINT(Celesteela)
OVERWORLD(
gObjectEventPic_Celesteela,
sPicTable_Celesteela,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6404,7 +6404,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(2, 14, SHADOW_SIZE_M)
FOOTPRINT(Kartana)
OVERWORLD(
gObjectEventPic_Kartana,
sPicTable_Kartana,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6470,7 +6470,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(4, 10, SHADOW_SIZE_XL_BATTLE_ONLY)
FOOTPRINT(Guzzlord)
OVERWORLD(
gObjectEventPic_Guzzlord,
sPicTable_Guzzlord,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6539,7 +6539,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-1, 15, SHADOW_SIZE_M)
FOOTPRINT(Necrozma)
OVERWORLD(
gObjectEventPic_Necrozma,
sPicTable_Necrozma,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6607,7 +6607,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-3, 11, SHADOW_SIZE_XL_BATTLE_ONLY)
FOOTPRINT(Necrozma)
OVERWORLD(
gObjectEventPic_NecrozmaDuskMane,
sPicTable_NecrozmaDuskMane,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6677,7 +6677,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(3, 17, SHADOW_SIZE_L)
FOOTPRINT(Necrozma)
OVERWORLD(
gObjectEventPic_NecrozmaDawnWings,
sPicTable_NecrozmaDawnWings,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6751,7 +6751,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
FOOTPRINT(Necrozma)
#if OW_BATTLE_ONLY_FORMS
OVERWORLD(
gObjectEventPic_NecrozmaUltra,
sPicTable_NecrozmaUltra,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6824,7 +6824,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-2, 14, SHADOW_SIZE_M)
FOOTPRINT(Magearna)
OVERWORLD(
gObjectEventPic_Magearna,
sPicTable_Magearna,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6889,7 +6889,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-2, 14, SHADOW_SIZE_M)
FOOTPRINT(Magearna)
OVERWORLD(
gObjectEventPic_MagearnaOriginal,
sPicTable_MagearnaOriginal,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6963,7 +6963,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(0, 5, SHADOW_SIZE_S)
FOOTPRINT(Marshadow)
OVERWORLD(
gObjectEventPic_Marshadow,
sPicTable_Marshadow,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -7030,7 +7030,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-1, 12, SHADOW_SIZE_S)
FOOTPRINT(Poipole)
OVERWORLD(
gObjectEventPic_Poipole,
sPicTable_Poipole,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -7095,7 +7095,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(7, 17, SHADOW_SIZE_M)
FOOTPRINT(Naganadel)
OVERWORLD(
gObjectEventPic_Naganadel,
sPicTable_Naganadel,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -7161,7 +7161,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(2, 15, SHADOW_SIZE_XL_BATTLE_ONLY)
FOOTPRINT(Stakataka)
OVERWORLD(
gObjectEventPic_Stakataka,
sPicTable_Stakataka,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -7227,7 +7227,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(0, 13, SHADOW_SIZE_M)
FOOTPRINT(Blacephalon)
OVERWORLD(
gObjectEventPic_Blacephalon,
sPicTable_Blacephalon,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -7292,7 +7292,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(0, 9, SHADOW_SIZE_XL_BATTLE_ONLY)
FOOTPRINT(Zeraora)
OVERWORLD(
gObjectEventPic_Zeraora,
sPicTable_Zeraora,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -7358,7 +7358,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(-1, 2, SHADOW_SIZE_S)
FOOTPRINT(Meltan)
OVERWORLD(
gObjectEventPic_Meltan,
sPicTable_Meltan,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -7422,7 +7422,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
SHADOW(3, 10, SHADOW_SIZE_L)
FOOTPRINT(Melmetal)
OVERWORLD(
gObjectEventPic_Melmetal,
sPicTable_Melmetal,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,

View File

@ -54,7 +54,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(1, 1, SHADOW_SIZE_S)
FOOTPRINT(Grookey)
OVERWORLD(
gObjectEventPic_Grookey,
sPicTable_Grookey,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -117,7 +117,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(5, 6, SHADOW_SIZE_M)
FOOTPRINT(Thwackey)
OVERWORLD(
gObjectEventPic_Thwackey,
sPicTable_Thwackey,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -179,7 +179,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(2, 8, SHADOW_SIZE_L)
FOOTPRINT(Rillaboom)
OVERWORLD(
gObjectEventPic_Rillaboom,
sPicTable_Rillaboom,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -302,7 +302,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-1, 6, SHADOW_SIZE_S)
FOOTPRINT(Scorbunny)
OVERWORLD(
gObjectEventPic_Scorbunny,
sPicTable_Scorbunny,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -365,7 +365,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-4, 5, SHADOW_SIZE_S)
FOOTPRINT(Raboot)
OVERWORLD(
gObjectEventPic_Raboot,
sPicTable_Raboot,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -428,7 +428,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(0, 14, SHADOW_SIZE_M)
FOOTPRINT(Cinderace)
OVERWORLD(
gObjectEventPic_Cinderace,
sPicTable_Cinderace,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -553,7 +553,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-3, 3, SHADOW_SIZE_S)
FOOTPRINT(Sobble)
OVERWORLD(
gObjectEventPic_Sobble,
sPicTable_Sobble,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -616,7 +616,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(2, 5, SHADOW_SIZE_M)
FOOTPRINT(Drizzile)
OVERWORLD(
gObjectEventPic_Drizzile,
sPicTable_Drizzile,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -679,7 +679,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-5, 12, SHADOW_SIZE_S)
FOOTPRINT(Inteleon)
OVERWORLD(
gObjectEventPic_Inteleon,
sPicTable_Inteleon,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -803,7 +803,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-7, 5, SHADOW_SIZE_S)
FOOTPRINT(Skwovet)
OVERWORLD(
gObjectEventPic_Skwovet,
sPicTable_Skwovet,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -868,7 +868,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-11, 10, SHADOW_SIZE_M)
FOOTPRINT(Greedent)
OVERWORLD(
gObjectEventPic_Greedent,
sPicTable_Greedent,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -940,7 +940,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-1, -3, SHADOW_SIZE_S)
FOOTPRINT(Rookidee)
OVERWORLD(
gObjectEventPic_Rookidee,
sPicTable_Rookidee,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1013,7 +1013,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(2, 16, SHADOW_SIZE_S)
FOOTPRINT(Corvisquire)
OVERWORLD(
gObjectEventPic_Corvisquire,
sPicTable_Corvisquire,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1080,7 +1080,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-1, 9, SHADOW_SIZE_L)
FOOTPRINT(Corviknight)
OVERWORLD(
gObjectEventPic_Corviknight,
sPicTable_Corviknight,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1203,7 +1203,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(2, 1, SHADOW_SIZE_S)
FOOTPRINT(Blipbug)
OVERWORLD(
gObjectEventPic_Blipbug,
sPicTable_Blipbug,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1269,7 +1269,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-1, 0, SHADOW_SIZE_M)
FOOTPRINT(Dottler)
OVERWORLD(
gObjectEventPic_Dottler,
sPicTable_Dottler,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1334,7 +1334,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(0, 15, SHADOW_SIZE_M)
FOOTPRINT(Orbeetle)
OVERWORLD(
gObjectEventPic_Orbeetle,
sPicTable_Orbeetle,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1459,7 +1459,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(0, 4, SHADOW_SIZE_M)
FOOTPRINT(Nickit)
OVERWORLD(
gObjectEventPic_Nickit,
sPicTable_Nickit,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1523,7 +1523,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-9, 7, SHADOW_SIZE_M)
FOOTPRINT(Thievul)
OVERWORLD(
gObjectEventPic_Thievul,
sPicTable_Thievul,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1587,7 +1587,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(0, 2, SHADOW_SIZE_S)
FOOTPRINT(Gossifleur)
OVERWORLD(
gObjectEventPic_Gossifleur,
sPicTable_Gossifleur,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1651,7 +1651,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-2, 8, SHADOW_SIZE_S)
FOOTPRINT(Eldegoss)
OVERWORLD(
gObjectEventPic_Eldegoss,
sPicTable_Eldegoss,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1715,7 +1715,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(1, 1, SHADOW_SIZE_S)
FOOTPRINT(Wooloo)
OVERWORLD(
gObjectEventPic_Wooloo,
sPicTable_Wooloo,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1779,7 +1779,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(2, 8, SHADOW_SIZE_M)
FOOTPRINT(Dubwool)
OVERWORLD(
gObjectEventPic_Dubwool,
sPicTable_Dubwool,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1846,7 +1846,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(3, 1, SHADOW_SIZE_S)
FOOTPRINT(Chewtle)
OVERWORLD(
gObjectEventPic_Chewtle,
sPicTable_Chewtle,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -1913,7 +1913,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-2, 4, SHADOW_SIZE_L)
FOOTPRINT(Drednaw)
OVERWORLD(
gObjectEventPic_Drednaw,
sPicTable_Drednaw,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2037,7 +2037,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-1, 2, SHADOW_SIZE_M)
FOOTPRINT(Yamper)
OVERWORLD(
gObjectEventPic_Yamper,
sPicTable_Yamper,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2101,7 +2101,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(0, 7, SHADOW_SIZE_M)
FOOTPRINT(Boltund)
OVERWORLD(
gObjectEventPic_Boltund,
sPicTable_Boltund,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2165,7 +2165,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(0, -3, SHADOW_SIZE_S)
FOOTPRINT(Rolycoly)
OVERWORLD(
gObjectEventPic_Rolycoly,
sPicTable_Rolycoly,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2228,7 +2228,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(0, 3, SHADOW_SIZE_M)
FOOTPRINT(Carkol)
OVERWORLD(
gObjectEventPic_Carkol,
sPicTable_Carkol,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2291,7 +2291,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(1, 12, SHADOW_SIZE_L)
FOOTPRINT(Coalossal)
OVERWORLD(
gObjectEventPic_Coalossal,
sPicTable_Coalossal,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2415,7 +2415,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-1, -3, SHADOW_SIZE_S)
FOOTPRINT(Applin)
OVERWORLD(
gObjectEventPic_Applin,
sPicTable_Applin,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2482,7 +2482,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-6, 11, SHADOW_SIZE_S)
FOOTPRINT(Flapple)
OVERWORLD(
gObjectEventPic_Flapple,
sPicTable_Flapple,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2603,7 +2603,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(5, 6, SHADOW_SIZE_L)
FOOTPRINT(Appletun)
OVERWORLD(
gObjectEventPic_Appletun,
sPicTable_Appletun,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2725,7 +2725,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-4, 8, SHADOW_SIZE_S)
FOOTPRINT(Dipplin)
OVERWORLD(
gObjectEventPic_Dipplin,
sPicTable_Dipplin,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2788,7 +2788,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(1, 12, SHADOW_SIZE_L)
FOOTPRINT(Hydrapple)
OVERWORLD(
gObjectEventPic_Hydrapple,
sPicTable_Hydrapple,
SIZE_64x64,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2852,7 +2852,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(3, 1, SHADOW_SIZE_M)
FOOTPRINT(Silicobra)
OVERWORLD(
gObjectEventPic_Silicobra,
sPicTable_Silicobra,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -2916,7 +2916,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(2, -1, SHADOW_SIZE_XL_BATTLE_ONLY)
FOOTPRINT(Sandaconda)
OVERWORLD(
gObjectEventPic_Sandaconda,
sPicTable_Sandaconda,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3039,7 +3039,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(5, 14, SHADOW_SIZE_M)
FOOTPRINT(Cramorant)
OVERWORLD(
gObjectEventPic_Cramorant,
sPicTable_Cramorant,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3218,7 +3218,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-1, -5, SHADOW_SIZE_S)
FOOTPRINT(Arrokuda)
OVERWORLD(
gObjectEventPic_Arrokuda,
sPicTable_Arrokuda,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3282,7 +3282,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(4, 5, SHADOW_SIZE_M)
FOOTPRINT(Barraskewda)
OVERWORLD(
gObjectEventPic_Barraskewda,
sPicTable_Barraskewda,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3346,7 +3346,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-2, 1, SHADOW_SIZE_M)
FOOTPRINT(Toxel)
OVERWORLD(
gObjectEventPic_Toxel,
sPicTable_Toxel,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3411,7 +3411,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-6, 13, SHADOW_SIZE_M)
FOOTPRINT(Toxtricity)
OVERWORLD(
gObjectEventPic_ToxtricityAmped,
sPicTable_ToxtricityAmped,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3528,7 +3528,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(1, 12, SHADOW_SIZE_M)
FOOTPRINT(Toxtricity)
OVERWORLD(
gObjectEventPic_ToxtricityLowKey,
sPicTable_ToxtricityLowKey,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3651,7 +3651,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(6, -4, SHADOW_SIZE_S)
FOOTPRINT(Sizzlipede)
OVERWORLD(
gObjectEventPic_Sizzlipede,
sPicTable_Sizzlipede,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3719,7 +3719,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-3, 7, SHADOW_SIZE_M)
FOOTPRINT(Centiskorch)
OVERWORLD(
gObjectEventPic_Centiskorch,
sPicTable_Centiskorch,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3843,7 +3843,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(1, -2, SHADOW_SIZE_S)
FOOTPRINT(Clobbopus)
OVERWORLD(
gObjectEventPic_Clobbopus,
sPicTable_Clobbopus,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3906,7 +3906,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(4, 9, SHADOW_SIZE_M)
FOOTPRINT(Grapploct)
OVERWORLD(
gObjectEventPic_Grapploct,
sPicTable_Grapploct,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -3970,7 +3970,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(3, 3, SHADOW_SIZE_S)
FOOTPRINT(Sinistea)
OVERWORLD(
gObjectEventPic_Sinistea,
sPicTable_Sinistea,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4035,7 +4035,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(3, 4, SHADOW_SIZE_S)
FOOTPRINT(Sinistea)
OVERWORLD(
gObjectEventPic_Sinistea,
sPicTable_Sinistea,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4099,7 +4099,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(0, 12, SHADOW_SIZE_S)
FOOTPRINT(Polteageist)
OVERWORLD(
gObjectEventPic_Polteageist,
sPicTable_Polteageist,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4163,7 +4163,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(0, 11, SHADOW_SIZE_S)
FOOTPRINT(Polteageist)
OVERWORLD(
gObjectEventPic_Polteageist,
sPicTable_Polteageist,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4228,7 +4228,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(0, 1, SHADOW_SIZE_M)
FOOTPRINT(Hatenna)
OVERWORLD(
gObjectEventPic_Hatenna,
sPicTable_Hatenna,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4291,7 +4291,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(0, 5, SHADOW_SIZE_M)
FOOTPRINT(Hattrem)
OVERWORLD(
gObjectEventPic_Hattrem,
sPicTable_Hattrem,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4353,7 +4353,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(6, 13, SHADOW_SIZE_S)
FOOTPRINT(Hatterene)
OVERWORLD(
gObjectEventPic_Hatterene,
sPicTable_Hatterene,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4477,7 +4477,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(0, 2, SHADOW_SIZE_S)
FOOTPRINT(Impidimp)
OVERWORLD(
gObjectEventPic_Impidimp,
sPicTable_Impidimp,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4540,7 +4540,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(0, 7, SHADOW_SIZE_M)
FOOTPRINT(Morgrem)
OVERWORLD(
gObjectEventPic_Morgrem,
sPicTable_Morgrem,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4603,7 +4603,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(1, 11, SHADOW_SIZE_L)
FOOTPRINT(Grimmsnarl)
OVERWORLD(
gObjectEventPic_Grimmsnarl,
sPicTable_Grimmsnarl,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4727,7 +4727,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(0, 6, SHADOW_SIZE_S)
FOOTPRINT(Milcery)
OVERWORLD(
gObjectEventPic_Milcery,
sPicTable_Milcery,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -4798,7 +4798,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(0, 5, SHADOW_SIZE_S) \
FOOTPRINT(Alcremie) \
OVERWORLD( \
gObjectEventPic_AlcremieStrawberry, /*Alcremie ##sweet*/ \
sPicTable_AlcremieStrawberry, /*Alcremie ##sweet*/ \
SIZE_32x32, \
SHADOW_SIZE_M, \
TRACKS_FOOT, \
@ -4968,7 +4968,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-7, 5, SHADOW_SIZE_S)
FOOTPRINT(Falinks)
OVERWORLD(
gObjectEventPic_Falinks,
sPicTable_Falinks,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5031,7 +5031,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-1, -4, SHADOW_SIZE_S)
FOOTPRINT(Pincurchin)
OVERWORLD(
gObjectEventPic_Pincurchin,
sPicTable_Pincurchin,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5097,7 +5097,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-2, -7, SHADOW_SIZE_S)
FOOTPRINT(Snom)
OVERWORLD(
gObjectEventPic_Snom,
sPicTable_Snom,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5162,7 +5162,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-7, 13, SHADOW_SIZE_XL_BATTLE_ONLY)
FOOTPRINT(Frosmoth)
OVERWORLD(
gObjectEventPic_Frosmoth,
sPicTable_Frosmoth,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5226,7 +5226,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(0, 10, SHADOW_SIZE_L)
FOOTPRINT(Stonjourner)
OVERWORLD(
gObjectEventPic_Stonjourner,
sPicTable_Stonjourner,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5291,7 +5291,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-1, 13, SHADOW_SIZE_S)
FOOTPRINT(Eiscue)
OVERWORLD(
gObjectEventPic_EiscueIce,
sPicTable_EiscueIce,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5414,7 +5414,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(2, 4, SHADOW_SIZE_S)
FOOTPRINT(Indeedee)
OVERWORLD(
gObjectEventPic_IndeedeeM,
sPicTable_IndeedeeM,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5477,7 +5477,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(2, 4, SHADOW_SIZE_S)
FOOTPRINT(Indeedee)
OVERWORLD(
gObjectEventPic_IndeedeeF,
sPicTable_IndeedeeF,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5543,7 +5543,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(0, 0, SHADOW_SIZE_S)
FOOTPRINT(Morpeko)
OVERWORLD(
gObjectEventPic_MorpekoFullBelly,
sPicTable_MorpekoFullBelly,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5667,7 +5667,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(5, 2, SHADOW_SIZE_M)
FOOTPRINT(Cufant)
OVERWORLD(
gObjectEventPic_Cufant,
sPicTable_Cufant,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5731,7 +5731,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(6, 7, SHADOW_SIZE_L)
FOOTPRINT(Copperajah)
OVERWORLD(
gObjectEventPic_Copperajah,
sPicTable_Copperajah,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5856,7 +5856,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-4, 10, SHADOW_SIZE_L)
FOOTPRINT(Dracozolt)
OVERWORLD(
gObjectEventPic_Dracozolt,
sPicTable_Dracozolt,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5919,7 +5919,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-2, 11, SHADOW_SIZE_M)
FOOTPRINT(Arctozolt)
OVERWORLD(
gObjectEventPic_Arctozolt,
sPicTable_Arctozolt,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -5983,7 +5983,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(2, 11, SHADOW_SIZE_M)
FOOTPRINT(Dracovish)
OVERWORLD(
gObjectEventPic_Dracovish,
sPicTable_Dracovish,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6047,7 +6047,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(0, 11, SHADOW_SIZE_L)
FOOTPRINT(Arctovish)
OVERWORLD(
gObjectEventPic_Arctovish,
sPicTable_Arctovish,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6114,7 +6114,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(2, 11, SHADOW_SIZE_L)
FOOTPRINT(Duraludon)
OVERWORLD(
gObjectEventPic_Duraludon,
sPicTable_Duraludon,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6240,7 +6240,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(4, 14, SHADOW_SIZE_XL_BATTLE_ONLY)
FOOTPRINT(Archaludon)
OVERWORLD(
gObjectEventPic_Archaludon,
sPicTable_Archaludon,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6306,7 +6306,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(0, 2, SHADOW_SIZE_S)
FOOTPRINT(Dreepy)
OVERWORLD(
gObjectEventPic_Dreepy,
sPicTable_Dreepy,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6370,7 +6370,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(0, 9, SHADOW_SIZE_M)
FOOTPRINT(Drakloak)
OVERWORLD(
gObjectEventPic_Drakloak,
sPicTable_Drakloak,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6434,7 +6434,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(0, 12, SHADOW_SIZE_M)
FOOTPRINT(Dragapult)
OVERWORLD(
gObjectEventPic_Dragapult,
sPicTable_Dragapult,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6497,7 +6497,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-1, 9, SHADOW_SIZE_L)
FOOTPRINT(Zacian)
OVERWORLD(
gObjectEventPic_ZacianHero,
sPicTable_ZacianHero,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6564,7 +6564,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-3, 12, SHADOW_SIZE_L)
FOOTPRINT(Zacian)
OVERWORLD(
gObjectEventPic_ZacianCrowned,
sPicTable_ZacianCrowned,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6633,7 +6633,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-1, 12, SHADOW_SIZE_L)
FOOTPRINT(Zamazenta)
OVERWORLD(
gObjectEventPic_ZamazentaHero,
sPicTable_ZamazentaHero,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6700,7 +6700,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(0, 12, SHADOW_SIZE_L)
FOOTPRINT(Zamazenta)
OVERWORLD(
gObjectEventPic_ZamazentaCrowned,
sPicTable_ZamazentaCrowned,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6770,7 +6770,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(0, 14, SHADOW_SIZE_L)
FOOTPRINT(Eternatus)
OVERWORLD(
gObjectEventPic_Eternatus,
sPicTable_Eternatus,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6895,7 +6895,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-2, 5, SHADOW_SIZE_S)
FOOTPRINT(Kubfu)
OVERWORLD(
gObjectEventPic_Kubfu,
sPicTable_Kubfu,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -6963,7 +6963,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(0, 14, SHADOW_SIZE_L)
FOOTPRINT(Urshifu)
OVERWORLD(
gObjectEventPic_Urshifu,
sPicTable_Urshifu,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -7088,7 +7088,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(4, 14, SHADOW_SIZE_M)
FOOTPRINT(Urshifu)
OVERWORLD(
gObjectEventPic_Urshifu,
sPicTable_Urshifu,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -7216,7 +7216,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(5, 11, SHADOW_SIZE_L)
FOOTPRINT(Zarude)
OVERWORLD(
gObjectEventPic_Zarude,
sPicTable_Zarude,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -7341,7 +7341,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-3, 14, SHADOW_SIZE_S)
FOOTPRINT(Regieleki)
OVERWORLD(
gObjectEventPic_Regieleki,
sPicTable_Regieleki,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -7408,7 +7408,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(0, 13, SHADOW_SIZE_M)
FOOTPRINT(Regidrago)
OVERWORLD(
gObjectEventPic_Regidrago,
sPicTable_Regidrago,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -7473,7 +7473,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-5, 11, SHADOW_SIZE_L)
FOOTPRINT(Glastrier)
OVERWORLD(
gObjectEventPic_Glastrier,
sPicTable_Glastrier,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -7539,7 +7539,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-6, 12, SHADOW_SIZE_L)
FOOTPRINT(Spectrier)
OVERWORLD(
gObjectEventPic_Spectrier,
sPicTable_Spectrier,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -7605,7 +7605,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-1, 12, SHADOW_SIZE_S)
FOOTPRINT(Calyrex)
OVERWORLD(
gObjectEventPic_Calyrex,
sPicTable_Calyrex,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -7672,7 +7672,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-5, 11, SHADOW_SIZE_L)
FOOTPRINT(Calyrex)
OVERWORLD(
gObjectEventPic_CalyrexIce,
sPicTable_CalyrexIce,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -7739,7 +7739,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-5, 12, SHADOW_SIZE_L)
FOOTPRINT(Calyrex)
OVERWORLD(
gObjectEventPic_CalyrexShadow,
sPicTable_CalyrexShadow,
SIZE_32x32,
SHADOW_SIZE_M,
TRACKS_FOOT,
@ -7810,7 +7810,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(-3, 19, SHADOW_SIZE_M)
FOOTPRINT(Enamorus)
OVERWORLD(
gObjectEventPic_EnamorusIncarnate,
sPicTable_EnamorusIncarnate,
SIZE_64x64,
SHADOW_SIZE_M,
TRACKS_NONE,
@ -7876,7 +7876,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
SHADOW(2, 8, SHADOW_SIZE_L)
FOOTPRINT(Enamorus)
OVERWORLD(
gObjectEventPic_EnamorusTherian,
sPicTable_EnamorusTherian,
SIZE_64x64,
SHADOW_SIZE_M,
TRACKS_NONE,

File diff suppressed because it is too large Load Diff

View File

@ -3439,7 +3439,7 @@ static void DebugAction_Give_Pokemon_ComplexCreateMon(u8 taskId) //https://githu
//Moves
for (i = 0; i < MAX_MON_MOVES; i++)
{
if (moves[i] == MOVE_NONE || moves[i] == 0xFF || moves[i] >= MOVES_COUNT)
if (moves[i] == MOVE_NONE || moves[i] >= MOVES_COUNT)
continue;
SetMonMoveSlot(&mon, moves[i], i);

View File

@ -27,6 +27,13 @@ EWRAM_DATA u16 gSpecialVar_MonBoxPos = 0;
EWRAM_DATA u16 gSpecialVar_Unused_0x8014 = 0;
EWRAM_DATA static u8 sSpecialFlags[SPECIAL_FLAGS_SIZE] = {0};
#if TESTING
#define TEST_FLAGS_SIZE 1
#define TEST_VARS_SIZE 8
EWRAM_DATA static u8 sTestFlags[TEST_FLAGS_SIZE] = {0};
EWRAM_DATA static u16 sTestVars[TEST_VARS_SIZE] = {0};
#endif // TESTING
extern u16 *const gSpecialVars[];
const u16 gBadgeFlags[NUM_BADGES] =
@ -179,6 +186,10 @@ u16 *GetVarPointer(u16 id)
return NULL;
else if (id < SPECIAL_VARS_START)
return &gSaveBlock1Ptr->vars[id - VARS_START];
#if TESTING
else if (id >= TESTING_VARS_START)
return &sTestVars[id - TESTING_VARS_START];
#endif // TESTING
else
return gSpecialVars[id - SPECIAL_VARS_START];
}
@ -219,6 +230,10 @@ u8 *GetFlagPointer(u16 id)
return NULL;
else if (id < SPECIAL_FLAGS_START)
return &gSaveBlock1Ptr->flags[id / 8];
#if TESTING
else if (id >= TESTING_FLAGS_START)
return &sTestFlags[(id - TESTING_FLAGS_START) / 8];
#endif // TESTING
else
return &sSpecialFlags[(id - SPECIAL_FLAGS_START) / 8];
}

View File

@ -381,7 +381,7 @@ static const bool8 sMovementTypeHasRange[NUM_MOVEMENT_TYPES] = {
[MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE_IN_GRASS] = TRUE,
};
const u8 gInitialMovementTypeFacingDirections[] = {
const u8 gInitialMovementTypeFacingDirections[NUM_MOVEMENT_TYPES] = {
[MOVEMENT_TYPE_NONE] = DIR_SOUTH,
[MOVEMENT_TYPE_LOOK_AROUND] = DIR_SOUTH,
[MOVEMENT_TYPE_WANDER_AROUND] = DIR_SOUTH,
@ -463,6 +463,7 @@ const u8 gInitialMovementTypeFacingDirections[] = {
[MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_UP] = DIR_NORTH,
[MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_LEFT] = DIR_WEST,
[MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_RIGHT] = DIR_EAST,
[MOVEMENT_TYPE_FOLLOW_PLAYER] = DIR_SOUTH,
};
#include "data/object_events/object_event_graphics_info_pointers.h"
@ -1925,6 +1926,14 @@ struct Pokemon *GetFirstLiveMon(void)
u32 i;
for (i = 0; i < PARTY_SIZE; i++)
{
struct Pokemon *mon = &gPlayerParty[i];
if ((OW_MON_ALLOWED_SPECIES && GetMonData(mon, MON_DATA_SPECIES_OR_EGG) != VarGet(OW_MON_ALLOWED_SPECIES))
|| (OW_MON_ALLOWED_MET_LVL && GetMonData(mon, MON_DATA_MET_LEVEL) != VarGet(OW_MON_ALLOWED_MET_LVL))
|| (OW_MON_ALLOWED_MET_LOC && GetMonData(mon, MON_DATA_MET_LOCATION) != VarGet(OW_MON_ALLOWED_MET_LOC)))
{
continue;
}
if (gPlayerParty[i].hp > 0 && !(gPlayerParty[i].box.isEgg || gPlayerParty[i].box.isBadEgg))
return &gPlayerParty[i];
}
@ -2179,6 +2188,7 @@ void UpdateFollowingPokemon(void)
// 3. flag is set
if (OW_POKEMON_OBJECT_EVENTS == FALSE
|| OW_FOLLOWERS_ENABLED == FALSE
|| FlagGet(B_FLAG_FOLLOWERS_DISABLED)
|| !GetFollowerInfo(&species, &shiny, &female)
|| SpeciesToGraphicsInfo(species, shiny, female) == NULL
|| (gMapHeader.mapType == MAP_TYPE_INDOOR && SpeciesToGraphicsInfo(species, shiny, female)->oam->size > ST_OAM_SIZE_2)
@ -5423,6 +5433,7 @@ bool8 MovementType_FollowPlayer_Moving(struct ObjectEvent *objectEvent, struct S
objectEvent->movementActionId = MOVEMENT_ACTION_NONE;
sprite->sActionFuncId = 0;
objectEvent->singleMovementActive = FALSE;
objectEvent->facingDirectionLocked = FALSE;
if (sprite->sTypeFuncId) // restore nonzero state
sprite->sTypeFuncId = 1;
}
@ -5493,7 +5504,8 @@ bool8 FollowablePlayerMovement_Step(struct ObjectEvent *objectEvent, struct Spri
{
// Animate exiting pokeball
// Player is jumping, but follower is invisible
if (PlayerGetCopyableMovement() == COPY_MOVE_JUMP2)
// don't emerge if player is jumping or moving via script
if (PlayerGetCopyableMovement() == COPY_MOVE_JUMP2 || ArePlayerFieldControlsLocked())
{
sprite->sTypeFuncId = 0; // return to shadowing state
return FALSE;
@ -5514,6 +5526,15 @@ bool8 FollowablePlayerMovement_Step(struct ObjectEvent *objectEvent, struct Spri
// Follow player
direction = GetDirectionToFace(x, y, targetX, targetY);
// During a script, if player sidesteps or backsteps,
// mirror player's direction instead
if (ArePlayerFieldControlsLocked()
&& gObjectEvents[gPlayerAvatar.objectEventId].facingDirection != gObjectEvents[gPlayerAvatar.objectEventId].movementDirection)
{
direction = gObjectEvents[gPlayerAvatar.objectEventId].movementDirection;
objectEvent->facingDirectionLocked = TRUE;
}
MoveCoords(direction, &x, &y);
GetCollisionAtCoords(objectEvent, x, y, direction); // Sets directionOverwrite for stairs
if (GetLedgeJumpDirection(x, y, direction) != DIR_NONE)
@ -5521,53 +5542,28 @@ bool8 FollowablePlayerMovement_Step(struct ObjectEvent *objectEvent, struct Spri
// InitJumpRegular will set the proper speed
ObjectEventSetSingleMovement(objectEvent, sprite, GetJump2MovementAction(direction));
}
else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH))
else if (playerAction >= MOVEMENT_ACTION_WALK_SLOW_DOWN && playerAction <= MOVEMENT_ACTION_WALK_SLOW_RIGHT)
{
// Set follow speed according to player's speed
if (playerAction >= MOVEMENT_ACTION_RUN_DOWN_SLOW && playerAction <= MOVEMENT_ACTION_RUN_RIGHT_SLOW)
if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH)) // on sideways stairs
objectEvent->movementActionId = GetWalkNormalMovementAction(direction);
else
objectEvent->movementActionId = GetWalkFastMovementAction(direction);
}
else if (PlayerGetCopyableMovement() == COPY_MOVE_JUMP2)
{
ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkSlowMovementAction(direction));
}
else
{
if (playerAction >= MOVEMENT_ACTION_WALK_SLOW_DOWN && playerAction <= MOVEMENT_ACTION_WALK_SLOW_RIGHT)
{
ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkSlowMovementAction(direction));
}
else
{
objectEvent->movementActionId = GetWalkNormalMovementAction(direction);
if (OW_FOLLOWERS_BOBBING == TRUE)
sprite->y2 = -1;
}
}
sprite->sActionFuncId = 0;
if (GetLedgeJumpDirection(x, y, direction) != DIR_NONE)
{
// InitJumpRegular will set the proper speed
ObjectEventSetSingleMovement(objectEvent, sprite, GetJump2MovementAction(direction));
}
else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH))
{
// Set follow speed according to player's speed
ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkFastMovementAction(direction));
}
else if (PlayerGetCopyableMovement() == COPY_MOVE_JUMP2)
{
// If *player* jumps, make step take twice as long
ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkSlowMovementAction(direction));
}
else if (gSprites[gPlayerAvatar.spriteId].data[4] == MOVE_SPEED_FAST_1)
{
objectEvent->movementActionId = GetWalkFastMovementAction(direction);
}
else
{
ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkNormalMovementAction(direction));
objectEvent->movementActionId = GetWalkNormalMovementAction(direction);
if (OW_FOLLOWERS_BOBBING == TRUE)
sprite->y2 = -1;
}
sprite->sActionFuncId = 0;
objectEvent->singleMovementActive = TRUE;
sprite->sTypeFuncId = 2;
return TRUE;
@ -6231,13 +6227,19 @@ static bool8 IsMetatileDirectionallyImpassable(struct ObjectEvent *objectEvent,
return FALSE;
}
static bool8 DoesObjectCollideWithObjectAt(struct ObjectEvent *objectEvent, s16 x, s16 y)
u32 GetObjectObjectCollidesWith(struct ObjectEvent *objectEvent, s16 x, s16 y, bool32 addCoords)
{
u8 i;
struct ObjectEvent *curObject;
if (objectEvent->localId == OBJ_EVENT_ID_FOLLOWER)
return FALSE; // follower cannot collide with other objects, but they can collide with it
return OBJECT_EVENTS_COUNT; // follower cannot collide with other objects, but they can collide with it
if (addCoords)
{
x += objectEvent->currentCoords.x;
y += objectEvent->currentCoords.y;
}
for (i = 0; i < OBJECT_EVENTS_COUNT; i++)
{
@ -6248,11 +6250,16 @@ static bool8 DoesObjectCollideWithObjectAt(struct ObjectEvent *objectEvent, s16
if ((curObject->currentCoords.x == x && curObject->currentCoords.y == y) || (curObject->previousCoords.x == x && curObject->previousCoords.y == y))
{
if (AreElevationsCompatible(objectEvent->currentElevation, curObject->currentElevation))
return TRUE;
return i;
}
}
}
return FALSE;
return OBJECT_EVENTS_COUNT;
}
static bool8 DoesObjectCollideWithObjectAt(struct ObjectEvent *objectEvent, s16 x, s16 y)
{
return (GetObjectObjectCollidesWith(objectEvent, x, y, FALSE) < OBJECT_EVENTS_COUNT);
}
bool8 IsBerryTreeSparkling(u8 localId, u8 mapNum, u8 mapGroup)
@ -6404,6 +6411,19 @@ static u8 TryUpdateMovementActionOnStairs(struct ObjectEvent *objectEvent, u8 mo
}
}
static const u8 sActionIdToCopyableMovement[] = {
[MOVEMENT_ACTION_FACE_DOWN ... MOVEMENT_ACTION_FACE_RIGHT] = COPY_MOVE_FACE,
[MOVEMENT_ACTION_WALK_SLOW_DOWN ... MOVEMENT_ACTION_WALK_NORMAL_RIGHT] = COPY_MOVE_WALK,
[MOVEMENT_ACTION_JUMP_2_DOWN ... MOVEMENT_ACTION_JUMP_2_RIGHT] = COPY_MOVE_JUMP2,
[MOVEMENT_ACTION_WALK_FAST_DOWN ... MOVEMENT_ACTION_WALK_FAST_RIGHT] = COPY_MOVE_WALK,
[MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN ... MOVEMENT_ACTION_PLAYER_RUN_RIGHT] = COPY_MOVE_WALK,
// Not a typo; follower needs to take an action with a duration == JUMP's,
// and JUMP2 here will lead to WALK_SLOW later
[MOVEMENT_ACTION_JUMP_DOWN ... MOVEMENT_ACTION_JUMP_RIGHT] = COPY_MOVE_JUMP2,
[MOVEMENT_ACTION_NONE] = COPY_MOVE_NONE,
};
bool8 ObjectEventSetHeldMovement(struct ObjectEvent *objectEvent, u8 movementActionId)
{
if (ObjectEventIsMovementOverridden(objectEvent))
@ -6416,6 +6436,16 @@ bool8 ObjectEventSetHeldMovement(struct ObjectEvent *objectEvent, u8 movementAct
objectEvent->heldMovementActive = TRUE;
objectEvent->heldMovementFinished = FALSE;
gSprites[objectEvent->spriteId].sActionFuncId = 0;
// When player is moved via script, set copyable movement
// for any followers via a lookup table
if (ArePlayerFieldControlsLocked()
&& objectEvent->isPlayer
&& FlagGet(FLAG_SAFE_FOLLOWER_MOVEMENT))
{
objectEvent->playerCopyableMovement = sActionIdToCopyableMovement[objectEvent->movementActionId];
}
return FALSE;
}
@ -6439,6 +6469,15 @@ void ObjectEventClearHeldMovement(struct ObjectEvent *objectEvent)
objectEvent->heldMovementFinished = FALSE;
gSprites[objectEvent->spriteId].sTypeFuncId = 0;
gSprites[objectEvent->spriteId].sActionFuncId = 0;
// When player is moved via script, set copyable movement
// for any followers via a lookup table
if (ArePlayerFieldControlsLocked()
&& objectEvent->isPlayer
&& FlagGet(FLAG_SAFE_FOLLOWER_MOVEMENT))
{
objectEvent->playerCopyableMovement = sActionIdToCopyableMovement[objectEvent->movementActionId];
}
}
u8 ObjectEventCheckHeldMovementStatus(struct ObjectEvent *objectEvent)

View File

@ -38,8 +38,6 @@ static void Task_DrawFieldMessage(u8 taskId)
LoadMessageBoxAndBorderGfx();
task->tState++;
break;
task->tState++;
break;
case 1:
DrawDialogueFrame(0, TRUE);
task->tState++;

View File

@ -1186,6 +1186,15 @@ void ItemUseInBattle_PartyMenuChooseMove(u8 taskId)
ItemUseInBattle_ShowPartyMenu(taskId);
}
static bool32 SelectedMonHasStatus2(u16 itemId)
{
if (gPartyMenu.slotId == 0)
return gBattleMons[0].status2 & GetItemStatus2Mask(itemId);
else if (gBattleTypeFlags & (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI) && gPartyMenu.slotId == 1)
return gBattleMons[2].status2 & GetItemStatus2Mask(itemId);
return FALSE;
}
// Returns whether an item can be used in battle and sets the fail text.
bool32 CannotUseItemsInBattle(u16 itemId, struct Pokemon *mon)
{
@ -1258,13 +1267,13 @@ bool32 CannotUseItemsInBattle(u16 itemId, struct Pokemon *mon)
break;
case EFFECT_ITEM_CURE_STATUS:
if (!((GetMonData(mon, MON_DATA_STATUS) & GetItemStatus1Mask(itemId))
|| (gPartyMenu.slotId == 0 && gBattleMons[gBattlerInMenuId].status2 & GetItemStatus2Mask(itemId))))
|| SelectedMonHasStatus2(itemId)))
cannotUse = TRUE;
break;
case EFFECT_ITEM_HEAL_AND_CURE_STATUS:
if ((hp == 0 || hp == GetMonData(mon, MON_DATA_MAX_HP))
&& !((GetMonData(mon, MON_DATA_STATUS) & GetItemStatus1Mask(itemId))
|| (gPartyMenu.slotId == 0 && gBattleMons[gBattlerInMenuId].status2 & GetItemStatus2Mask(itemId))))
|| SelectedMonHasStatus2(itemId)))
cannotUse = TRUE;
break;
case EFFECT_ITEM_REVIVE:

View File

@ -73,6 +73,8 @@
#include "constants/trainer_hill.h"
#include "constants/weather.h"
STATIC_ASSERT((B_FLAG_FOLLOWERS_DISABLED == 0 || OW_FOLLOWERS_ENABLED), FollowersFlagAssignedWithoutEnablingThem);
struct CableClubPlayer
{
u8 playerId;

Some files were not shown because too many files have changed in this diff Show More