diff --git a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml index edebc1bbf0a4..8240a5680191 100644 --- a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml +++ b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml @@ -23,9 +23,11 @@ body: label: Version description: What version of pokeemerald-expansion are you using as a base? options: - - 1.9.1 (Latest release) + - 1.9.3 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.9.2 + - 1.9.1 - 1.9.0 - 1.8.6 - 1.8.5 diff --git a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml index dd3024230be5..5688f8a7fb9b 100644 --- a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml +++ b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml @@ -23,9 +23,11 @@ body: label: Version description: What version of pokeemerald-expansion are you using as a base? options: - - 1.9.1 (Latest release) + - 1.9.3 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.9.2 + - 1.9.1 - 1.9.0 - 1.8.6 - 1.8.5 diff --git a/.github/ISSUE_TEMPLATE/04_other_errors.yaml b/.github/ISSUE_TEMPLATE/04_other_errors.yaml index 29960c267b88..add0633d956f 100644 --- a/.github/ISSUE_TEMPLATE/04_other_errors.yaml +++ b/.github/ISSUE_TEMPLATE/04_other_errors.yaml @@ -23,9 +23,11 @@ body: label: Version description: What version of pokeemerald-expansion are you using as a base? options: - - 1.9.1 (Latest release) + - 1.9.3 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.9.2 + - 1.9.1 - 1.9.0 - 1.8.6 - 1.8.5 diff --git a/CHANGELOG.md b/CHANGELOG.md index fb2f38af1d7c..bb9fec3e7e8c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Pokeemerald-Expansion Changelogs ## 1.9.x +- **[Version 1.9.2](docs/changelogs/1.9.x/1.9.2.md) - 🧹 Bugfix Release** - **[Version 1.9.1](docs/changelogs/1.9.x/1.9.1.md) - 🧹 Bugfix Release** - **[Version 1.9.0](docs/changelogs/1.9.x/1.9.0.md) - ✨ Feature Release** diff --git a/README.md b/README.md index f09f5a7d9099..427caafd0a8d 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ pokeemerald-expansion is a decomp hack base project based off pret's [pokeemeral 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.9.1 https://github.com/rh-hideout/pokeemerald-expansion/ +Based off RHH's pokeemerald-expansion 1.9.3 https://github.com/rh-hideout/pokeemerald-expansion/ ``` ## What features are included? @@ -178,7 +178,7 @@ With this, you'll get the latest version of pokeemerald-expansion, plus a couple - Check your current version. - You can check in the debug menu's `Utilities -> Expansion Version` option. - If the option is not available, you possibly have version 1.6.2 or older. In that case, please check the [changelogs](CHANGELOG.md) to determine your version based on the features available on your repository. -- Once you have your remote set up, run the command `git pull RHH expansion/X.Y.Z`, replacing X, Y and Z with the digits of the respective version you want to update to (eg, to update to 1.8.4, use `git pull RHH expansion/1.8.4`). +- Once you have your remote set up, run the command `git pull RHH expansion/X.Y.Z`, replacing X, Y and Z with the digits of the respective version you want to update to (eg, to update to 1.9.3, use `git pull RHH expansion/1.9.3`). - ***Important:*** If you are several versions behind, we recommend updating one minor version at a time, skipping directly to the latest patch version (eg, 1.5.3 -> 1.6.2 -> 1.7.4 and so on) - Alternatively, you can update to unreleased versions of the expansion. - ***master (stable):*** It contains unreleased **bugfixes** that will come in the next patch version. To merge, use `git pull RHH master`. diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 5982716bc91b..f5338531421d 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1351,7 +1351,6 @@ .4byte \func .endm -@ callnative macros .macro savetarget callnative BS_SaveTarget .endm @@ -1727,6 +1726,19 @@ .4byte \failInstr .endm + .macro jumpifcommanderactive jumpInstr:req + callnative BS_JumpIfCommanderActive + .4byte \jumpInstr + .endm + + .macro checkpokeflute + callnative BS_CheckPokeFlute + .endm + + .macro waitfanfare + callnative BS_WaitFanfare + .endm + @ various command changed to more readable macros .macro cancelmultiturnmoves battler:req various \battler, VARIOUS_CANCEL_MULTI_TURN_MOVES diff --git a/asm/macros/event.inc b/asm/macros/event.inc index 43be72298f87..7b9d7b36fe1d 100644 --- a/asm/macros/event.inc +++ b/asm/macros/event.inc @@ -2105,15 +2105,15 @@ @ The rest of the arguments are the stat change values to each stat. @ For example, giving the first opponent +1 to atk and -2 to speed would be: settotemboost B_POSITION_OPPONENT_LEFT, 1, 0, -2 .macro settotemboost battler:req, atk=0,def=0,speed=0,spatk=0,spdef=0,acc=0,evas=0 - setvar VAR_0x8000, \battler - setvar VAR_0x8001, \atk - setvar VAR_0x8002, \def - setvar VAR_0x8003, \speed - setvar VAR_0x8004, \spatk - setvar VAR_0x8005, \spdef - setvar VAR_0x8006, \acc - setvar VAR_0x8007, \evas - special SetTotemBoost + callnative ScriptSetTotemBoost + .2byte \battler + .2byte \atk + .2byte \def + .2byte \speed + .2byte \spatk + .2byte \spdef + .2byte \acc + .2byte \evas .endm @ useful totem boost macros diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 14f9a3f592d1..215b8deaffeb 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -934,6 +934,44 @@ gBattleAnimMove_ToxicSpikes:: end gBattleAnimMove_HeartSwap:: + loadspritegfx ANIM_TAG_RED_HEART + loadspritegfx ANIM_TAG_PINKVIO_ORB + loadspritegfx ANIM_TAG_SPARKLE_2 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 3, 0, 8, RGB(31, 24, 26) + createvisualtask AnimTask_HeartSwap, 3, ANIM_TARGET + createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_TARGET, RGB_WHITE, 12, 3, 1 + loopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER, 10, 8 + delay 16 + createvisualtask AnimTask_HeartSwap, 3, ANIM_ATTACKER + createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_ATTACKER, RGB_WHITE, 12, 3, 1 + waitforvisualfinish + createsprite gGrantingStarsSpriteTemplate, ANIM_ATTACKER, 2, -15, 0, 0, 0, 32, 60 + createsprite gGrantingStarsSpriteTemplate, ANIM_TARGET, 2, -15, 0, 0, 0, 32, 60 + delay 8 + createsprite gGrantingStarsSpriteTemplate, ANIM_ATTACKER, 2, 12, -5, 0, 0, 32, 60 + createsprite gGrantingStarsSpriteTemplate, ANIM_TARGET, 2, 12, -5, 0, 0, 32, 60 + delay 4 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_ATTACKER, RGB(31, 25, 27), 12, 3, 1 + createvisualtask AnimTask_ScaleMonAndRestore, 5, -3, -3, 16, ANIM_ATTACKER, 0 + createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_TARGET, RGB(31, 25, 27), 12, 3, 1 + createvisualtask AnimTask_ScaleMonAndRestore, 5, -3, -3, 16, ANIM_TARGET, 0 + createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, 160, -32 + createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, -256, -40 + createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, 128, -16 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 3, 8, 0, RGB(31, 24, 26) + createsprite gRedHeartCharmSpriteTemplate, ANIM_ATTACKER, 3, 0, 20 + playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER + delay 15 + createsprite gRedHeartCharmSpriteTemplate, ANIM_ATTACKER, 3, -20, 20 + playsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER + delay 15 + createsprite gRedHeartCharmSpriteTemplate, ANIM_ATTACKER, 3, 20, 20 + playsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER + waitforvisualfinish + clearmonbg ANIM_ATTACKER + clearmonbg ANIM_TARGET + blendoff end gBattleAnimMove_AquaRing:: @@ -7672,6 +7710,17 @@ gBattleAnimMove_NobleRoar:: end gBattleAnimMove_IonDeluge:: + loadspritegfx ANIM_TAG_IONS + loopsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER, 10, 12 + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 2, 0, 4, RGB_YELLOW + waitforvisualfinish + createvisualtask AnimTask_CreateIons, 2, 0, 3, 120 + createvisualtask AnimTask_CreateIons, 2, 0, 3, 120 + delay 120 + delay 30 + waitforvisualfinish + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 2, 4, 0, RGB_YELLOW + waitforvisualfinish end gBattleAnimMove_ParabolicCharge:: @@ -28451,7 +28500,7 @@ gBattleAnimGeneral_MegaEvolution:: delay 20 createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA waitforvisualfinish - createvisualtask AnimTask_TransformMon, 2, 1, 0 + createvisualtask AnimTask_HideSwapSprite, 2, 1, 0 createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14 waitforvisualfinish @@ -28642,7 +28691,7 @@ General_PrimalReversion_Alpha: delay 20 createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA waitforvisualfinish - createvisualtask AnimTask_TransformMon, 2, 1, 0 + createvisualtask AnimTask_HideSwapSprite, 2, 1, 0 createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14 waitforvisualfinish @@ -28669,7 +28718,7 @@ General_PrimalReversion_Omega: delay 20 createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA waitforvisualfinish - createvisualtask AnimTask_TransformMon, 2, 1, 0 + createvisualtask AnimTask_HideSwapSprite, 2, 1, 0 createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14 waitforvisualfinish @@ -28705,7 +28754,7 @@ gBattleAnimGeneral_UltraBurst:: call LightThatBurnsTheSkyGreenSparks delay 20 createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA - createvisualtask AnimTask_TransformMon, 2, 1, 0 + createvisualtask AnimTask_HideSwapSprite, 2, 1, 0 createsprite gUltraBurstSymbolSpriteTemplate, ANIM_ATTACKER, 0x0, 0x0, 0x0, 0x0, 0x0 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 04784ccdacdb..05eb64d15a7f 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -3265,6 +3265,7 @@ BattleScript_EffectRoar:: attackstring ppreduce jumpifroarfails BattleScript_ButItFailed + jumpifcommanderactive BattleScript_ButItFailed jumpifability BS_TARGET, ABILITY_GUARD_DOG, BattleScript_ButItFailed jumpifability BS_TARGET, ABILITY_SUCTION_CUPS, BattleScript_AbilityPreventsPhasingOut jumpifstatus3 BS_TARGET, STATUS3_ROOTED, BattleScript_PrintMonIsRooted @@ -3279,51 +3280,17 @@ BattleScript_RoarBlockedByDynamax: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_MultiHitLoop:: - jumpifhasnohp BS_ATTACKER, BattleScript_MultiHitEnd - jumpifhasnohp BS_TARGET, BattleScript_MultiHitPrintStrings - jumpifhalfword CMP_EQUAL, gChosenMove, MOVE_SLEEP_TALK, BattleScript_DoMultiHit - jumpifstatus BS_ATTACKER, STATUS1_SLEEP, BattleScript_MultiHitPrintStrings -BattleScript_DoMultiHit:: - movevaluescleanup - copyhword sMOVE_EFFECT, sMULTIHIT_EFFECT - critcalc - damagecalc - jumpifmovehadnoeffect BattleScript_MultiHitNoMoreHits - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - multihitresultmessage - flushtextbox - addbyte sMULTIHIT_STRING + 4, 1 - moveendto MOVEEND_NEXT_TARGET - jumpifbyte CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_FOE_ENDURED, BattleScript_MultiHitPrintStrings - decrementmultihit BattleScript_MultiHitLoop - goto BattleScript_MultiHitPrintStrings -BattleScript_MultiHitNoMoreHits:: - pause B_WAIT_TIME_SHORT BattleScript_MultiHitPrintStrings:: resultmessage waitmessage B_WAIT_TIME_LONG - jumpifmovehadnoeffect BattleScript_MultiHitEnd copyarray gBattleTextBuff1, sMULTIHIT_STRING, 6 printstring STRINGID_HITXTIMES waitmessage B_WAIT_TIME_LONG return -BattleScript_MultiHitEnd:: - setadditionaleffects - tryfaintmon BS_TARGET - moveendcase MOVEEND_SYNCHRONIZE_TARGET - moveendfrom MOVEEND_STATUS_IMMUNITY_ABILITIES - end +BattleScript_ScaleShot:: + call BattleScript_MultiHitPrintStrings + goto BattleScript_DefDownSpeedUp BattleScript_EffectConversion:: attackcanceler @@ -7001,12 +6968,12 @@ BattleScript_WishMegaEvolution:: BattleScript_PrimalReversion:: call BattleScript_PrimalReversionRet - end2 + end3 BattleScript_PrimalReversionRestoreAttacker:: call BattleScript_PrimalReversionRet copybyte gBattlerAttacker, sSAVED_BATTLER - end2 + end3 BattleScript_PrimalReversionRet:: flushtextbox @@ -7715,15 +7682,11 @@ BattleScript_EmergencyExitWildNoPopUp:: BattleScript_TraceActivates:: pause B_WAIT_TIME_SHORT - call BattleScript_AbilityPopUp + call BattleScript_AbilityPopUpScripting printstring STRINGID_PKMNTRACED waitmessage B_WAIT_TIME_LONG settracedability BS_SCRIPTING switchinabilities BS_SCRIPTING - return - -BattleScript_TraceActivatesEnd3:: - call BattleScript_TraceActivates end3 BattleScript_ReceiverActivates:: @@ -8046,11 +8009,52 @@ BattleScript_CostarActivates:: BattleScript_ZeroToHeroActivates:: pause B_WAIT_TIME_SHORT - call BattleScript_AbilityPopUp + call BattleScript_AbilityPopUpScripting printstring STRINGID_ZEROTOHEROTRANSFORMATION waitmessage B_WAIT_TIME_LONG end3 +BattleScript_CommanderActivates:: + pause B_WAIT_TIME_SHORT + call BattleScript_AbilityPopUpScripting + printstring STRINGID_COMMANDERACTIVATES + waitmessage B_WAIT_TIME_LONG +BattleScript_CommanderAtkIncrease: + setbyte sSTAT_ANIM_PLAYED, FALSE + playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF | BIT_SPATK | BIT_SPDEF | BIT_SPEED, STAT_CHANGE_BY_TWO + setstatchanger STAT_ATK, 2, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderDefIncrease + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CommanderDefIncrease + printfromtable gStatUpStringIds + waitmessage B_WAIT_TIME_LONG +BattleScript_CommanderDefIncrease: + setstatchanger STAT_DEF, 2, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderSpAtkIncrease + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CommanderSpAtkIncrease + printfromtable gStatUpStringIds + waitmessage B_WAIT_TIME_LONG +BattleScript_CommanderSpAtkIncrease: + setstatchanger STAT_SPATK, 2, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderSpDefIncrease + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CommanderSpDefIncrease + printfromtable gStatUpStringIds + waitmessage B_WAIT_TIME_LONG +BattleScript_CommanderSpDefIncrease: + setstatchanger STAT_SPDEF, 2, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderSpeedIncrease + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CommanderSpeedIncrease + printfromtable gStatUpStringIds + waitmessage B_WAIT_TIME_LONG +BattleScript_CommanderSpeedIncrease: + setstatchanger STAT_SPEED, 2, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CommanderEnd + printfromtable gStatUpStringIds + waitmessage B_WAIT_TIME_LONG +BattleScript_CommanderEnd: + restoreattacker + end3 + BattleScript_HospitalityActivates:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp @@ -9410,6 +9414,16 @@ BattleScript_ZMoveActivateStatus:: copybyte sSTATCHANGER, sSAVED_STAT_CHANGER return +BattleScript_ZMoveActivatePowder:: + flushtextbox + trytrainerslidezmovemsg + savetarget + printstring STRINGID_ZPOWERSURROUNDS + playanimation BS_ATTACKER, B_ANIM_ZMOVE_ACTIVATE, NULL + setzeffect + restoretarget + goto BattleScript_MoveUsedPowder + BattleScript_ZEffectPrintString:: printfromtable gZEffectStringIds waitmessage B_WAIT_TIME_LONG @@ -9561,6 +9575,14 @@ BattleScript_StickyBarbTransfer:: removeitem BS_TARGET return +BattleScript_RedCardActivationNoSwitch:: + playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT + printstring STRINGID_REDCARDACTIVATE + waitmessage B_WAIT_TIME_LONG + removeitem BS_SCRIPTING + restoretarget + return + BattleScript_RedCardActivates:: playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT printstring STRINGID_REDCARDACTIVATE @@ -10041,7 +10063,7 @@ BattleScript_BerserkGeneRet_End: BattleScript_BoosterEnergyEnd2:: playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT, sB_ANIM_ARG1 - call BattleScript_AbilityPopUpTarget + call BattleScript_AbilityPopUpScripting printstring STRINGID_BOOSTERENERGYACTIVATES waitmessage B_WAIT_TIME_MED printstring STRINGID_STATWASHEIGHTENED diff --git a/data/battle_scripts_2.s b/data/battle_scripts_2.s index be6c04e32eb9..b68a57066488 100644 --- a/data/battle_scripts_2.s +++ b/data/battle_scripts_2.s @@ -25,6 +25,7 @@ gBattlescriptsForUsingItem:: .4byte BattleScript_ItemRestoreHP @ EFFECT_ITEM_REVIVE .4byte BattleScript_ItemRestorePP @ EFFECT_ITEM_RESTORE_PP .4byte BattleScript_ItemIncreaseAllStats @ EFFECT_ITEM_INCREASE_ALL_STATS + .4byte BattleScript_UsePokeFlute @ EFFECT_ITEM_USE_POKE_FLUTE .align 2 gBattlescriptsForSafariActions:: @@ -110,6 +111,25 @@ BattleScript_ItemIncreaseStat:: waitmessage B_WAIT_TIME_LONG end +BattleScript_UsePokeFlute:: + checkpokeflute + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 1, BattleScript_PokeFluteWakeUp + printstring STRINGID_POKEFLUTECATCHY + waitmessage B_WAIT_TIME_LONG + goto BattleScript_PokeFluteEnd + +BattleScript_PokeFluteWakeUp:: + printstring STRINGID_POKEFLUTE + waitmessage B_WAIT_TIME_LONG + fanfare MUS_RG_POKE_FLUTE + waitfanfare + printstring STRINGID_MONHEARINGFLUTEAWOKE + waitmessage B_WAIT_TIME_LONG + updatestatusicon BS_PLAYER2 + waitstate +BattleScript_PokeFluteEnd:: + finishaction + BattleScript_ItemSetMist:: call BattleScript_UseItemMessage setmist diff --git a/data/scripts/cable_club.inc b/data/scripts/cable_club.inc index e810e354a5b8..9120787ea956 100644 --- a/data/scripts/cable_club.inc +++ b/data/scripts/cable_club.inc @@ -1258,7 +1258,11 @@ EventScript_CloseMossdeepGameCornerBarrier:: CableClub_OnResume: special InitUnionRoom +.if OW_FLAG_MOVE_UNION_ROOM_CHECK != 0 + return +.else end +.endif MossdeepCity_GameCorner_1F_EventScript_InfoMan2:: lock diff --git a/data/scripts/pkmn_center_nurse.inc b/data/scripts/pkmn_center_nurse.inc index 5cef4587494e..4aca9d768b2f 100644 --- a/data/scripts/pkmn_center_nurse.inc +++ b/data/scripts/pkmn_center_nurse.inc @@ -36,6 +36,11 @@ EventScript_PkmnCenterNurse_TakeAndHealPkmn:: applymovement VAR_0x800B, Movement_PkmnCenterNurse_Turn @ Changed from Common_Movement_WalkInPlaceFasterLeft to force the follower to enter their Poké Ball waitmovement 0 dofieldeffect FLDEFF_POKECENTER_HEAL +.if OW_UNION_DISABLE_CHECK == FALSE && OW_FLAG_MOVE_UNION_ROOM_CHECK != 0 + setflag OW_FLAG_MOVE_UNION_ROOM_CHECK + call CableClub_OnResume + clearflag OW_FLAG_MOVE_UNION_ROOM_CHECK +.endif waitfieldeffect FLDEFF_POKECENTER_HEAL applymovement VAR_0x800B, Common_Movement_WalkInPlaceFasterDown waitmovement 0 diff --git a/data/specials.inc b/data/specials.inc index 044d794bc8b0..4d2bea3d33f4 100644 --- a/data/specials.inc +++ b/data/specials.inc @@ -534,7 +534,6 @@ gSpecials:: def_special RemoveRecordsWindow def_special CloseDeptStoreElevatorWindow def_special TrySetBattleTowerLinkType - def_special SetTotemBoost def_special TrySpecialOverworldEvo def_special GetNumberSprayStrength def_special GetSprayId diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 603fa225db6f..ac4698fdc32f 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -5,20 +5,23 @@ - [Setting up WSL1 (Legacy Portion)](./legacy_WSL1_INSTALL.md) - [Run documentation site locally](local_mdbook/index.md) - [Ubuntu WSL1/WSL2](local_mdbook/ubuntu_WSL.md) -- [AI Flags](./ai_flags.md) - [Tutorials]() - - [How to add new AI Flags](./ai_logic.md) - - [How to add new battle script commands/macros](./how_to_battle_script_command_macro.md) - - [How to add a new move](./how_to_new_move.md) - - [How to add a new trainer class](./how_to_trainer_class.md) + - [What are AI Flags?](tutorials/ai_flags.md) + - [How to add new AI Flags](tutorials/ai_logic.md) + - [How to add new battle script commands/macros](tutorials/how_to_battle_script_command_macro.md) + - [How to add a new move](tutorials/how_to_new_move.md) + - [How to add a new trainer class](tutorials/how_to_trainer_class.md) - [How to add a new Pokémon]() - - [v1.9.x](./how_to_new_pokemon_1_9_0.md) - - [v1.8.x](./how_to_new_pokemon_1_8_0.md) - - [v1.7.x](./how_to_new_pokemon_1_7_0.md) - - [v1.6.x](./how_to_new_pokemon_1_6_0.md) - - [How to use the Testing System](./how_to_testing_system.md) + - [v1.9.x](tutorials/how_to_new_pokemon_1_9_0.md) + - [v1.8.x](tutorials/how_to_new_pokemon_1_8_0.md) + - [v1.7.x](tutorials/how_to_new_pokemon_1_7_0.md) + - [v1.6.x](tutorials/how_to_new_pokemon_1_6_0.md) + - [How to use the Testing System](tutorials/how_to_testing_system.md) - [Changelog](./CHANGELOG.md) - [1.9.x]() + - [Version 1.9.3](changelogs/1.9.x/1.9.3.md) + - [Version 1.9.2](changelogs/1.9.x/1.9.2.md) + - [Version 1.9.1](changelogs/1.9.x/1.9.1.md) - [Version 1.9.0](changelogs/1.9.x/1.9.0.md) - [1.8.x]() - [Version 1.8.6](changelogs/1.8.x/1.8.6.md) @@ -28,43 +31,36 @@ - [Version 1.8.2](changelogs/1.8.x/1.8.2.md) - [Version 1.8.1](changelogs/1.8.x/1.8.1.md) - [Version 1.8.0](changelogs/1.8.x/1.8.0.md) - - [1.7.x]() - [Version 1.7.4](changelogs/1.7.x/1.7.4.md) - [Version 1.7.3](changelogs/1.7.x/1.7.3.md) - [Version 1.7.2](changelogs/1.7.x/1.7.2.md) - [Version 1.7.1](changelogs/1.7.x/1.7.1.md) - [Version 1.7.0](changelogs/1.7.x/1.7.0.md) - - [1.6.x]() - [Version 1.6.2](changelogs/1.6.x/1.6.2.md) - [Version 1.6.1](changelogs/1.6.x/1.6.1.md) - [Version 1.6.0](changelogs/1.6.x/1.6.0.md) - - [1.5.x]() - [Version 1.5.3](changelogs/1.5.x/1.5.3.md) - [Version 1.5.2](changelogs/1.5.x/1.5.2.md) - [Version 1.5.1](changelogs/1.5.x/1.5.1.md) - [Version 1.5.0](changelogs/1.5.x/1.5.0.md) - - [1.4.x]() - [Version 1.4.3](changelogs/1.4.x/1.4.3.md) - [Version 1.4.2](changelogs/1.4.x/1.4.2.md) - [Version 1.4.1](changelogs/1.4.x/1.4.1.md) - [Version 1.4.0](changelogs/1.4.x/1.4.0.md) - - [1.3.x]() - [Version 1.3.0](changelogs/1.3.x/1.3.0.md) - - [1.2.x]() - [Version 1.2.0](changelogs/1.2.x/1.2.0.md) - - [1.1.x]() - [Version 1.1.1](changelogs/1.1.x/1.1.1.md) - [Version 1.1.0](changelogs/1.1.x/1.1.0.md) - - [1.0.x]() - [Version 1.0.0](changelogs/1.0.x/1.0.0.md) - - [Pre-1.0.x]() - [Version 0.9.0](changelogs/0.9.x/0.9.0.md) +- [Team Procedures]() + - [How to make an Expansion version](team_procedures/expansion_versions.md) diff --git a/docs/changelogs/1.9.x/1.9.0.md b/docs/changelogs/1.9.x/1.9.0.md index 0d39f109ed69..b0815c6e2ac5 100644 --- a/docs/changelogs/1.9.x/1.9.0.md +++ b/docs/changelogs/1.9.x/1.9.0.md @@ -551,6 +551,6 @@ * @rayrobdod made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4727 * @innocenthedgehog made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4988 -**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.8.5...expansion/1.9.0 +**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.8.6...expansion/1.9.0 diff --git a/docs/changelogs/1.9.x/1.9.1.md b/docs/changelogs/1.9.x/1.9.1.md index 8393727c2aa3..dfe8946bd99e 100644 --- a/docs/changelogs/1.9.x/1.9.1.md +++ b/docs/changelogs/1.9.x/1.9.1.md @@ -120,14 +120,14 @@ * Improved 1.8 ⇒ 1.9 non-Competitive syntax migration instructions by @mrgriffin in [#5079](https://github.com/rh-hideout/pokeemerald-expansion/pull/5079) ## 📦 Branch Synchronisation 📦 -### pret +### pret's base pokeemerald * 5th of August in [#5098](https://github.com/rh-hideout/pokeemerald-expansion/pull/5098) * Fixed bottom half of Mt. Pyre not being labeled in PokeNav by @fdeblasio in [pret#2018](https://github.com/pret/pokeemerald/pull/2018) * 7th of August in [#5116](https://github.com/rh-hideout/pokeemerald-expansion/pull/5116) * Changed type1 and type2 to be consistent by @pkmnsnfrn in [pret#2021](https://github.com/pret/pokeemerald/pull/2021) * 14th of August in [#5165](https://github.com/rh-hideout/pokeemerald-expansion/pull/5165) * Fix type for offset in MapConnection by @GriffinRichards in [pret#2011](https://github.com/pret/pokeemerald/pull/2011) -### Followers +### merrp/aarant's followers * 7th of August in [#5110](https://github.com/rh-hideout/pokeemerald-expansion/pull/5110) * Fixed expanded OW IDs by @pkmnsnfrn in [aarant#38](https://github.com/aarant/pokeemerald/pull/38) * Fix two small text errors in follower dialogue by @Bassoonian in [aarant#39](https://github.com/aarant/pokeemerald/pull/39) diff --git a/docs/changelogs/1.9.x/1.9.2.md b/docs/changelogs/1.9.x/1.9.2.md new file mode 100644 index 000000000000..4d95fc95f986 --- /dev/null +++ b/docs/changelogs/1.9.x/1.9.2.md @@ -0,0 +1,202 @@ +# Version 1.9.2 + +```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 expansion/1.9.2`. +``` + +## 🌋 *REFACTORS* 🌋 +📜 = Uses a migration script. +* Remove unused `BattleScript_WindPowerActivatesEnd2` in [#5257](https://github.com/rh-hideout/pokeemerald-expansion/pull/5257) +* Refactored in-battle disobedience to fix bug in [#5245](https://github.com/rh-hideout/pokeemerald-expansion/pull/5245) + +## 💥 *Hardlock/Softlock/Crash/Compiling fixes* 💥 +* Fixed hardlock when Hyperspace Fury is used by Hoopa Unbound by @AlexOn1ine in [#5237](https://github.com/rh-hideout/pokeemerald-expansion/pull/5237) +* Fixed compile error when `OW_POKEMON_OBJECT_EVENTS` is `TRUE` but `P_HISUIAN_FORMS` is `FALSE` around Basculin by @hjk321 in [#5256](https://github.com/rh-hideout/pokeemerald-expansion/pull/5256) +* Fixed hardlock when the AI cannot choose moves due to its opponent having Wonder Guard by @Pawkkie and Wiz in [#5317](https://github.com/rh-hideout/pokeemerald-expansion/pull/5317) +* Fixed multiple Pledge move hardlocks + * Fixed potential hardlock when attempting to use Pledge moves on the same turn that the user would wake up by @PhallenTree in [#5330](https://github.com/rh-hideout/pokeemerald-expansion/pull/5330) + * Fixed hardlock when the opponent's combo doesn't happen when cancelled by sleep by @hedara90 and @PhallenTree in [#5339](https://github.com/rh-hideout/pokeemerald-expansion/pull/5339) + * Fixes hardlock when the opponent's combo doesn't happen when cancelled by freeze by @PhallenTree in [#5340](https://github.com/rh-hideout/pokeemerald-expansion/pull/5340) + * Fixed hardlock when the opponent's combo doesn't happen when cancelled by Powder by @hedara90 in [#5341](https://github.com/rh-hideout/pokeemerald-expansion/pull/5341) + +## 🧬 General 🧬 +### Fixed +* Fixed loading into the wrong version of a map after saving in areas with multiple layouts by @hedara90 in [#5347](https://github.com/rh-hideout/pokeemerald-expansion/pull/5347) + +## 🐉 Pokémon 🐉 +### Added +* Added `OVERWORLD_SET_ANIM` macro to allow using custom animation tables for Overworld Pokémon by @hedara90 in [#5309](https://github.com/rh-hideout/pokeemerald-expansion/pull/5309) + * Added asymetrical Farfetch'd sprites using a previously unused table from merrp's followers branch. +* Added unique sprites for overworld Pumpkaboo and Gourgeist forms by @hedara90 in [#5390](https://github.com/rh-hideout/pokeemerald-expansion/pull/5390) +* Added missing Sirfetch'd competitive alias (`SPECIES_SIRFETCH_D`) by @cawtds in [#5283](https://github.com/rh-hideout/pokeemerald-expansion/pull/5283) +* Added Paldean Wooper and Clodsire overworld sprites by @Cafeei in [#5277](https://github.com/rh-hideout/pokeemerald-expansion/pull/5277) +* Added missing Gen 9 Overworld sprites by @Liamjd14 in [#5304](https://github.com/rh-hideout/pokeemerald-expansion/pull/5304) + * Original sprites by Darkus_Shadow, Princess-Phoenix, shaderr31, Molfang62, CarmaNekko, EduarPokeN, Larryturbo, TyranitarDark and Anarlaurendil + * Sources: + * Normal: https://www.deviantart.com/darkusshadow/art/Gen-9-Paldea-Pokemon-Overworld-Sprites-967776690 + * Shiny: https://www.deviantart.com/darkusshadow/art/SHINY-Gen-9-Paldea-Pokemon-Overworld-Sprites-967779547 +* Added missing overworld sprites by @Liamjd14 in [#5336](https://github.com/rh-hideout/pokeemerald-expansion/pull/5336) + * **New Sprites:** + * Oricorio Pom Pom/Pa'U/Sensu, Zygarde 10%/Complete and Original Color Magearna + * Credits to: Princess-Phoenix, Larryturbo, Kidkatt, Zender1752 and SageDeoxys. + * Black/White Kyurem + * Credits to: Larryturbo. + * Shaymin Sky and Therian Tornadus/Thundurus/Landorus + * Credits to: @Liamjd14 + * **Using their base form's sprites** + * Totem Raticate/Mimikyu/Marowak and Partner Pikachu/Eevee +* Added Added asymmetrical overworld sprites by @Liamjd14 in [#5336](https://github.com/rh-hideout/pokeemerald-expansion/pull/5336) + * Slowbro (Galarian), Tinkatink, Tinkatuff, Tinkaton and Scovillain + * Enabled in `gSpeciesInfo` by @Liamjd14 in [#5385](https://github.com/rh-hideout/pokeemerald-expansion/pull/5385) +### Changed +* Improved Garganacl and Naclstack battle sprites by using the ones from @CyanSMP64's repo by @kittenchilly in [#5142](https://github.com/rh-hideout/pokeemerald-expansion/pull/5142) +* Improved both shiny Indeedee by @Cafeei in [#5285](https://github.com/rh-hideout/pokeemerald-expansion/pull/5285) +* Shiny Combusken now uses its Gen8+ palette by @Cafeei in [#5333](https://github.com/rh-hideout/pokeemerald-expansion/pull/5333) +### Fixed +* Reenabled unused female Indeedee overworld sprite by @Cafeei in [#5285](https://github.com/rh-hideout/pokeemerald-expansion/pull/5285) +* Fixed G-Max Corviknight and Centiskorch's expanded names by @PhallenTree in [#5296](https://github.com/rh-hideout/pokeemerald-expansion/pull/5296) +* Fixed G-Max Cinderace back sprite by @hedara90 in [#5295](https://github.com/rh-hideout/pokeemerald-expansion/pull/5295) +* Fixed Shiny Mothim' by @Cafeei in [#5333](https://github.com/rh-hideout/pokeemerald-expansion/pull/5333) +* Fixed multiple battle sprite issues by @kittenchilly in [#5142](https://github.com/rh-hideout/pokeemerald-expansion/pull/5142) + * **Sprite issues:** + * Bombirdier, Mega Absol/Aerodactyl/Latias/Latios/Salamence, Orthworm and Veluza. + * **Shiny issues:** + * Bombirdier, Kilowattrel, Landorus, Magearna, Mega Diancie/Medicham, Galarian Ponyta, Shroodle, Spidops and Wattrel. +* Fixed multiple overworld Pokémon sprites - Part 1 by @Cafeei in [#5241](https://github.com/rh-hideout/pokeemerald-expansion/pull/5241) + * **"Blinking pixels":** + * Dwebble, Krookodile, Servine, Throh and Vulpix. + * **Shiny Palettes** + * Crustle, Excadrill, Lillipup, Serperior, Servine, Sigilyph, Swoobat, Tranquil and Venipede. + * **Misc fixes:** + * Archen, Basculin, Blitzle, Crustle, Escavalier, Krokorok, Krookodile, Sawsbuck, secondary, Serperior, Snivy, Throh, Woobat, Zebstrika +* Fixed multiple overworld Pokémon sprites - Part 2 by @Cafeei in [#5333](https://github.com/rh-hideout/pokeemerald-expansion/pull/5333) + * **Palette Fixes:** + * Shiny Riolu/Snover, Oshawott, Kabutops, Shieldon, Kingler and Groudon. + * **Fixed "Blinking pixels":** + * Abomasnow, Aggron, Alakazam, Ariados, Articuno, Azumarill, Barboach, Bayleef, Bibarel, Blastoise, Celebi, Charmeleon, Cherrim, Chinchou, Cloyster, Corphish, Corsola, Crawdaunt, Cubone, Dewott, Doduo, Dusknoir, Electabuzz, Espeon, Exeggcute, Farfetch'd, Feraligatr, Flaafy, Flareon, Floatzel, Furret, Gastly, Girafarig, Giratina, Gligar, Gloom, Golbat, Grumpig, Hariyama, Heatran (just reduced), Hoppip, Jolteon, Jumpluff, Kricketot, Larvitar, Leafeon, Lileep, Lumineon, Luxio, Luxray, Machamp, Magneton, Mantine, Mantyke, Marowak, Meowth, Mesprit, Mew, Mewtwo, Mime Jr, Moltres, Numel, Oshawott, Phione, Pinsir, Politoed, Porygon-Z, Probopass, Quilava, Qwilfish, Rampardos, Rapidash, Regirock, Sceptile, Scizor, Seel, Shieldon, Shiftry, Slowking, Smoochum, Sneasel, Spheal, Steelix, Sudowoodo, Suicune, Swellow, Swinub, Tentacruel, Togekiss, Togepi, Vaporeon, Vibrava, Wartortle, Wooper, Yanma, Yanma, Yanmega, Zangoose, Zapdos, Zubat + * **Misc. Sprite Fixes**: Dewott, Misdreavus, Oshawott, Torkoal and Victini. +* Overworld sprite fixes by @Liamjd14 (with help from @hedara90 to solve conflicts) in [#5334](https://github.com/rh-hideout/pokeemerald-expansion/pull/5334) + * **Palette Fixes**: Shieldon. + * **Misc. Sprite Fixes** Torkoal. + * **"Blinking pixels":** + * Ambipom, Armaldo, Crawdaunt, Crobat, Donphan, Flaaffy, Flygon, Grovyle, Hoppip, Igglybuff, Illumise, Jumpluff, Ledian, Ledyba, Mamoswine, Mantine, Marshtomp, Meganium, Mightyena, Miltank, Numel, Prinplup, Raikou, Roserade, Skarmory, Skiploom, Spinarak, Staraptor, Stunky, Torkoal, Wooper, Xatu, Yanma +* Overworld Pokémon sprite changes by @Liamjd14 in [#5336](https://github.com/rh-hideout/pokeemerald-expansion/pull/5336) + * **Fixed "blinking pixels":** + * Alolan Graveler/Golem/Alolan/Ninetales + * Dawn Wings Necrozma + * Hisuian Growlithe/Arcanine + * Winter Sawsbuck + * **Added missing Shiny Palettes** + * Calyrex Ice/Shadow Rider, Origin Dialga/Palkia, White-Striped Basculin, Therian Enamorus and Low-Key Toxtricity. + * **Removed Gigantamax Low-Key Toxtricity using base Low-Key follower sprites.** + * **Fixed Shiny palettes** + * Alolan Marowak/Raichu, Eternal Flower Floette, Flabébé (All), Galarian Ponyta/Rapidash + * Typhlosion-Hisui follower shiny stomach color wrong - done + * **Other sprite/palette fixes** + * Alolan Exeggutor/Marowak/Persian/Raichu/Sandshrew, Hisuian Sligoo/Goodra and Winter Sawsbuck. +## ⚔️ Battle General ⚔️ ## +### Changed +* Updated Damage Category icons to match Gen6+ colors by @kittenchilly in [#5080](https://github.com/rh-hideout/pokeemerald-expansion/pull/5080) +### Fixed +* Fixed Slateport Battle Tent/Battle Factory issues by @SarnPoke in [#5281](https://github.com/rh-hideout/pokeemerald-expansion/pull/5281) + * Choosing the "SWAP" option no longer shows invalid Pokémon ("??????????"). + * Reloading after choosing "REST" no longer resets the player's challenge party to invalid Pokémon ("??????????"). +* Fixed Starting Status happening Wild Battles from a previous Trainer Battle by @PhallenTree in [#5248](https://github.com/rh-hideout/pokeemerald-expansion/pull/5248) +* Fixed bugged behavior caused by Z-Moves and disobedience by @hedara90 in [#5245](https://github.com/rh-hideout/pokeemerald-expansion/pull/5245) +* Fixed Entry Hazards targeting wrong side of the field if the opponent fainted by @PhallenTree in [#5262](https://github.com/rh-hideout/pokeemerald-expansion/pull/5262) +* Fixed being able to use multiple of the same Gimmick in Double Battles by @AgustinGDLV in [#5235](https://github.com/rh-hideout/pokeemerald-expansion/pull/5235) +* Fixed Terastallization not granting immunity to Tar Shot by @AlexOn1ine in [#5302](https://github.com/rh-hideout/pokeemerald-expansion/pull/5302) +* Fixed `Cmd_trainerslidein/out` using the incorrect function by @ghoulslash in [#5326](https://github.com/rh-hideout/pokeemerald-expansion/pull/5326) + * Cleanup by @hedara90 in [#5344](https://github.com/rh-hideout/pokeemerald-expansion/pull/5344) + +## 🤹 Moves 🤹 +### Added +* Added Charge's Gen 9 behavior via `B_CHARGE` config by @AlexOn1ine in [#5274](https://github.com/rh-hideout/pokeemerald-expansion/pull/5274) +* Added Powder's Gen 7+ behavior of not causing damage when under Heavy Rain via `B_POWDER_RAIN` by @PhallenTree in [#5370](https://github.com/rh-hideout/pokeemerald-expansion/pull/5370) +### Fixed +* Fixed move descriptions missing periods (Decorate, Collision Course, Electro Drift) by @Pawkkie and Kasen in [#5221](https://github.com/rh-hideout/pokeemerald-expansion/pull/5221) +* Fixed Confide not being blocked by Crafty Shield interaction by @hedara90 in [#5202](https://github.com/rh-hideout/pokeemerald-expansion/pull/5202) +* Fixed message for switch out moves by @kittenchilly in [#5258](https://github.com/rh-hideout/pokeemerald-expansion/pull/5258) +* Fixed Ice Fang's descriptions using the opposite of what they're supposed to do based on `B_USE_FROSTBITE` by @laserXdolphin in [#5273](https://github.com/rh-hideout/pokeemerald-expansion/pull/5273) +* Fixes to Instruct by @PhallenTree in [#5262](https://github.com/rh-hideout/pokeemerald-expansion/pull/5262) + * Fixed Instruct bypassing AtkCanceler checks (Instruct allowed the target to act while asleep, flinched, etc.) and its interaction with First Turn Only moves (Fake Out, First Impression, Mat Block). + * Fixed Instruct's animation using the attacker and target of the called move. +* Fixed Scale Shot's effect not activating if the opponent fainted before all hits finished by @AlexOn1ine in [#5292](https://github.com/rh-hideout/pokeemerald-expansion/pull/5292) +* Fixed Round not preserving turn order for non-Round users if there's a switch out at the beginning of the turn by @AlexOn1ine in [#5292](https://github.com/rh-hideout/pokeemerald-expansion/pull/5292) +* Fixed Max Moves ignoring absorbing abilities (+ test) by @PhallenTree in [#5296](https://github.com/rh-hideout/pokeemerald-expansion/pull/5296) +* Fixed attack string for Max Moves not being printed if it's blocked by Max Guard by @hedara90 in [#5312](https://github.com/rh-hideout/pokeemerald-expansion/pull/5312) +* Fixed some Pledge move combo issues by @PhallenTree in [#5330](https://github.com/rh-hideout/pokeemerald-expansion/pull/5330) + * Fixed Pledge move combos attempting to be executed multiple times in a turn, causing mons to decrement sleep timer multiple times during the turn or causing infinite loops. +* Fixed potential issue with custom non-sound moves that use `EFFECT_ATTACK_UP_USER_ALLY` or `EFFECT_PERISH_SONG` being blocked by Soundproof anyway by @AlexOn1ine in [#5301](https://github.com/rh-hideout/pokeemerald-expansion/pull/5301) +* Fixed Pledge combinations not being absorbed by absorption Abilities (Sap Sipper, Storm Drain, etc.) by @hedara90 in [#5364](https://github.com/rh-hideout/pokeemerald-expansion/pull/5364) +* Fixed Toxic Thread decreasing speed by 2 stages instead of 1 by @AsparagusEduardo in [#5369](https://github.com/rh-hideout/pokeemerald-expansion/pull/5369) +* Fixed Destiny Bond not working if the user was fainted by a multi-Hit move's non-first hit by @AlexOn1ine in [#5377](https://github.com/rh-hideout/pokeemerald-expansion/pull/5377) +* Fixed Powder interactions by @PhallenTree in [#5370](https://github.com/rh-hideout/pokeemerald-expansion/pull/5370) + * Fixed Magic Guard not protecting against Powder's secondary damage when using a Fire-type move. + * Fixed Fire/Water Pledge combination being cancelled by Powder. + * Fixed Fire Z-Moves not playing their animations and not granting their secondary effects when the user is under Powder's effect +* Fixed After You/Shell Trap not updating battlers' actions correctly by @PhallenTree in [#5384](https://github.com/rh-hideout/pokeemerald-expansion/pull/5384) + +## 🎭 Abilities 🎭 +### Fixed +* Fixed weather abilities not activating when Cloud Nine user leaves the field by @AlexOn1ine in [#5209](https://github.com/rh-hideout/pokeemerald-expansion/pull/5209) +* Fixed missing `break` for Poison Puppeteer's code by @u8-Salem in [#5243](https://github.com/rh-hideout/pokeemerald-expansion/pull/5243) +* Fixed Pokémon with Purifying Salt being poisoned by Toxic Spikes by @AlexOn1ine in [#5252](https://github.com/rh-hideout/pokeemerald-expansion/pull/5252) +* Fixed Parental Bond not affecting Snore by @hedara90 in [#5264](https://github.com/rh-hideout/pokeemerald-expansion/pull/5264) +* Fixed Tera Shift's description by @AsparagusEduardo in [#5351](https://github.com/rh-hideout/pokeemerald-expansion/pull/5351) + +## 🧶 Items 🧶 +### Fixed +* Fixed berries missing their timing after passive damage by @AlexOn1ine in [#5300](https://github.com/rh-hideout/pokeemerald-expansion/pull/5300) +* Fixed Micle Berry not increasing accuracy on the next turn by @AlexOn1ine in [#5358](https://github.com/rh-hideout/pokeemerald-expansion/pull/5358) + +## 🤖 Battle AI 🤖 +### Changed +* AI is encouraged to use "always crit" moves on partner with Anger Point by @SarnPoke in [#5244](https://github.com/rh-hideout/pokeemerald-expansion/pull/5244) +### Fixed +* Fixed AI not seeing the power of Max Moves by @AlexOn1ine in [#5299](https://github.com/rh-hideout/pokeemerald-expansion/pull/5299) +* Fixed minor wrong order in `AI_CalcDamage` that made Nature Power not be considered for Z-Moves by @AlexOn1ine in [#5155](https://github.com/rh-hideout/pokeemerald-expansion/pull/5155) +* Fixed AI not considering Tera Blast/Tera Storm by @AlexOn1ine in [#5155](https://github.com/rh-hideout/pokeemerald-expansion/pull/5155) +* Fixed `AI_IsMoveEffectInPlus` reading the incorrect stat for secondary effects that reduce stats by 2 stages by @ghoulslash and @Pawkkie in [#5366](https://github.com/rh-hideout/pokeemerald-expansion/pull/5366) + +## 🧹 Other Cleanup 🧹 +### Changed +* Remove unused `BattleScript_WindPowerActivatesEnd2` signature by @u8-Salem in [#5257](https://github.com/rh-hideout/pokeemerald-expansion/pull/5257) +* Replaced all usages of tabs in C files with spaces by @hedara90 in [#5261](https://github.com/rh-hideout/pokeemerald-expansion/pull/5261) +* Fixed missing `break`s in two `ENDTURN` cases by @ghoulslash in [#5350](https://github.com/rh-hideout/pokeemerald-expansion/pull/5350) +* `ShouldSwitchIfWonderGuard` cleanup by @Pawkkie in [#5383](https://github.com/rh-hideout/pokeemerald-expansion/pull/5383) + +## 🧪 Test Runner 🧪 +### Added +* Added missing Adaptability, Aerilate, Aftermath tests by @kittenchilly in [#5242](https://github.com/rh-hideout/pokeemerald-expansion/pull/5242) +* Added missing Disguise tests by @hedara90 in [#5249](https://github.com/rh-hideout/pokeemerald-expansion/pull/5249) +* Added some missing Instruct tests by @PhallenTree in [#5262](https://github.com/rh-hideout/pokeemerald-expansion/pull/5262) +* Added missing Powder tests by @PhallenTree in [#5370](https://github.com/rh-hideout/pokeemerald-expansion/pull/5370) +* Added `ShouldSwitchIfWonderGuard` AI tests by @Pawkkie in [#5383](https://github.com/rh-hideout/pokeemerald-expansion/pull/5383) +### Changed +* Moved `ASSUME`s to inside `GIVEN` blocks to prevent them from being added correctly to the totals in the test summary by @AsparagusEduardo in [#5308](https://github.com/rh-hideout/pokeemerald-expansion/pull/5308) + +## 📚 Documentation 📚 +### Fixed +* Fixed test system documentation saying that `make check TESTS="Spikes"` could be done with single quotes instead of double quotes by @AsparagusEduardo in [#5266](https://github.com/rh-hideout/pokeemerald-expansion/pull/5266) + +## 📦 Branch Synchronisation 📦 +### pret's base pokeemerald +* N/A +### merrp/aarant's followers +* Merrp merge (September 9th) by @AsparagusEduardo in [#5359](https://github.com/rh-hideout/pokeemerald-expansion/pull/5359) + * aarant#40 (discarded, as it was already part of the expansion) + * New features: + * [Static OW pokemon now bob while walking in place](https://github.com/rh-hideout/pokeemerald-expansion/commit/839cf2e79012e0fc9159af5ab9e6a497e86bbfa4) + * Toggled by `OW_FOLLOWERS_BOBBING`. + * [Added `OW_MON_WANDER_WALK` config option](https://github.com/rh-hideout/pokeemerald-expansion/commit/42d9f24c8472a67d742d9d9da106480c84514336) + * If true, OW pokemon with `MOVEMENT_TYPE_WANDER*` will walk-in-place in between steps. + +## New Contributors +* @laserXdolphin made their first contribution in [#5273](https://github.com/rh-hideout/pokeemerald-expansion/pull/5273) +* @Liamjd14 made their first contribution in [#5304](https://github.com/rh-hideout/pokeemerald-expansion/pull/5304) + +**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.9.1...expansion/1.9.2 + diff --git a/docs/changelogs/1.9.x/1.9.3.md b/docs/changelogs/1.9.x/1.9.3.md new file mode 100644 index 000000000000..2fe981435e47 --- /dev/null +++ b/docs/changelogs/1.9.x/1.9.3.md @@ -0,0 +1,106 @@ +# Version 1.9.3 + +```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 expansion/1.9.3`. +``` + +## 🌋 *REFACTORS* 🌋 +📜 = Uses a migration script. +* Converted `settotemboost` command to `callnative` in [#5418](https://github.com/rh-hideout/pokeemerald-expansion/pull/5418) +* Removed unused `RESOURCE_FLAG_TRACED` in [#5430](https://github.com/rh-hideout/pokeemerald-expansion/pull/5430) +* Changed `MOVEEND_` defines to an enum in [#5449](https://github.com/rh-hideout/pokeemerald-expansion/pull/5449) + +## ✨ Feature Branches ✨ +### ***merrp/aarant's Followers*** +#### Fixed +* Fixed Expansion-exclusive issue that caused trainers to not play their "pointing" animation when Followers were out during battle intro by @kittenchilly in [#5406](https://github.com/rh-hideout/pokeemerald-expansion/pull/5406) + +## ⚔️ Battle General ⚔️ ## +### Changed +* Improved Mega evolution animation to make it a little smoother by @kleenxfeu in [#4816](https://github.com/rh-hideout/pokeemerald-expansion/pull/4816) +### Fixed +* Fixed affection check for exp multiplier by @Bassoonian in [#5421](https://github.com/rh-hideout/pokeemerald-expansion/pull/5421) +* Fixed multiple Primal Reversions not occurring if multiple battlers fainted on the previous turn by @PhallenTree in [#5430](https://github.com/rh-hideout/pokeemerald-expansion/pull/5430) + +## 🤹 Moves 🤹 +### Added +* Added missing `B_AFTER_YOU_TURN_ORDER` config by @PhallenTree in [#5400](https://github.com/rh-hideout/pokeemerald-expansion/pull/5400) + * Gen 5-7: After You fails if the order remains the same after using After You. + * Gen 8+: After You no longer fails if the turn order remains the same after using After You. +* Added missing `B_QUASH_TURN_ORDER` config by @PhallenTree in [#5400](https://github.com/rh-hideout/pokeemerald-expansion/pull/5400) + * Gen 5-7: If multiple Pokémon are affected by Quash, they move in the order they were affected by Quash. + * Gen 8+: If multiple Pokémon are affected by Quash, they now move fastest to slowest. +* Added missing updated `B_UPDATED_CONVERSION_2` by @wiz1989 in [#5453](https://github.com/rh-hideout/pokeemerald-expansion/pull/5453) + * Gens 2-4: Conversion 2 changes the user's type to a type that is resistant/immune to the last move the user was hit by. + * Gen 5+: Conversion 2 changes the user's type to a type that resists the last move used by the selected target. +### Fixed +* Fixed Scale Shot corrupting the move used on the next turn by @AlexOn1ine in [#5397](https://github.com/rh-hideout/pokeemerald-expansion/pull/5397) +* Fixed Growth's description not being updated based on `B_GROWTH_STAT_RAISE` by @nescioquid in [#5398](https://github.com/rh-hideout/pokeemerald-expansion/pull/5398) +* Fixed Quash not updating the battlers' actions correctly by @PhallenTree in [#5400](https://github.com/rh-hideout/pokeemerald-expansion/pull/5400) + * Cleanup by @PhallenTree in [#5430](https://github.com/rh-hideout/pokeemerald-expansion/pull/5430) +* Fixed Snatched Swallow not recovering HP if the Snatcher is not under the effect of Stockpile (should still heal) by @PhallenTree in [#5430](https://github.com/rh-hideout/pokeemerald-expansion/pull/5430) +* Fixed Counter users being damaged by Spiky Shield by @AlexOn1ine in [#5402](https://github.com/rh-hideout/pokeemerald-expansion/pull/5402) +* Fixed Electrified Dragon Darts not correctly avoiding targets with ability immunity (Volt Absorb, Motor Drive) by @PhallenTree in [#5430](https://github.com/rh-hideout/pokeemerald-expansion/pull/5430) +* Fixed Trace not activating a switch-in ability it traces (eg. Intimidate) by @PhallenTree in [#5430](https://github.com/rh-hideout/pokeemerald-expansion/pull/5430) + * Removed unused `RESOURCE_FLAG_TRACED`. +* Fixed recoil damage not triggering healing berries by @AlexOn1ine in [#5449](https://github.com/rh-hideout/pokeemerald-expansion/pull/5449) + * Also changed `MOVEEND_` defines to an enum. +## 🎭 Abilities 🎭 +### Fixed +* Fixed Dancer activating even if the dance move is stolen by Snatch by @PhallenTree in [#5430](https://github.com/rh-hideout/pokeemerald-expansion/pull/5430) +* Fixed Ability popup when multiple Pokémon faint at the same time by @PhallenTree in [#5430](https://github.com/rh-hideout/pokeemerald-expansion/pull/5430) +* Multiple ability fixes by @PhallenTree in [#5447](https://github.com/rh-hideout/pokeemerald-expansion/pull/5447) + * Fixed Protosynthesis/Quark Drive sometimes not activating ability popup despite still gaining the boost as they should. + * Fixed Protosynthesis/Quark Drive activating on Transformed battlers. + * Fixed Protosynthesis activating despite Cloud Nine being present on the field. + * Fixed Quark Drive not activating if the battler is not grounded. + * Fixed Protosynthesis/Quark Drive/Beast Boost stat raise priority when multiple stats are tied for the highest one. + * Before: `Attack, Defense, Speed, Special Attack, Special Defense`. + * After: `Attack, Defense, Special Attack, Special Defense, Speed`. + +## 🧶 Items 🧶 +### Fixed +* Fixed Ogerpon's Masks not increasing the power of moves by 20% by @AlexOn1ine in [#5391](https://github.com/rh-hideout/pokeemerald-expansion/pull/5391) +* Fixed Jubilife Muffin not working by @kittenchilly in [#5444](https://github.com/rh-hideout/pokeemerald-expansion/pull/5444) +* Fixed duplicating flute bug in double battles by @ghoulslash in [#5436](https://github.com/rh-hideout/pokeemerald-expansion/pull/5436) + +## 🤖 Battle AI 🤖 +### Fixed +* Fixed Trick/Switcheroo giving AI score even if the opponent has no held item by @kittenchilly in [#5412](https://github.com/rh-hideout/pokeemerald-expansion/pull/5412) +* Various AI fixes in `AI_CalcMoveEffectScore` by @ghoulslash in [#5474](https://github.com/rh-hideout/pokeemerald-expansion/pull/5474) + * Missing break from `EFFECT_ABSORB` switch case. + * Using last used move for Mirror Move instead of predicted move. + +## 🧹 Other Cleanup 🧹 +### Changed +* Converted `settotemboost` command to `callnative` by @ghoulslash in [#5418](https://github.com/rh-hideout/pokeemerald-expansion/pull/5418) +* Removed trailing whitespace by @kittenchilly in [#5455](https://github.com/rh-hideout/pokeemerald-expansion/pull/5455) +* Removed binary match workaround for Rayquaza's tail in Sootopolis' cutscene by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/5480 +### Fixed +* Fixed potential uninitialized behavior in `ChangeOrderTargetAfterAttacker` by @AlexOn1ine in [#5393](https://github.com/rh-hideout/pokeemerald-expansion/pull/5393) +* Fallback on default BW map pop-up theme to reduce potential for error by @ravepossum in [#5392](https://github.com/rh-hideout/pokeemerald-expansion/pull/5392) +* Multiple typo fixes by @nescioquid in [#5398](https://github.com/rh-hideout/pokeemerald-expansion/pull/5398) +* VS Seeker documentation fix by @Bassoonian in [#5415](https://github.com/rh-hideout/pokeemerald-expansion/pull/5415) + +## 🧪 Test Runner 🧪 +### Added +* Added missing After You and Quash tests by @PhallenTree in [#5400](https://github.com/rh-hideout/pokeemerald-expansion/pull/5400) +### Changed +* Improved Tangling Hair test to make sure that chained effects do not overwrite relevant battler IDs by @ghoulslash in [#5423](https://github.com/rh-hideout/pokeemerald-expansion/pull/5423) +* Improved Full Heal item tests by @kittenchilly in [#5444](https://github.com/rh-hideout/pokeemerald-expansion/pull/5444) +### Fixed +* Fixed Wake-Up Slap test typo by @Pawkkie in [#5442](https://github.com/rh-hideout/pokeemerald-expansion/pull/5442) +* Fixed test assumption fail summary fields using more memory than needed by @AsparagusEduardo in [#5443](https://github.com/rh-hideout/pokeemerald-expansion/pull/5443) +* Fixed issue with `PASSES_RANDOMLY` in AI tests by @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/5486 + +## New Contributors +* @nescioquid made their first contribution in [#5398](https://github.com/rh-hideout/pokeemerald-expansion/pull/5398) +* @kleenxfeu made their first contribution in [#4816](https://github.com/rh-hideout/pokeemerald-expansion/pull/4816) +* @wiz1989 made their first contribution in [#5453](https://github.com/rh-hideout/pokeemerald-expansion/pull/5453) + +**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.9.2...expansion/1.9.3 + + + diff --git a/docs/changelogs/template.md b/docs/changelogs/template.md index a40afebad35c..fe4191f58994 100644 --- a/docs/changelogs/template.md +++ b/docs/changelogs/template.md @@ -10,7 +10,7 @@ 📜 = Uses a migration script. * N/A -## 💥 *Softlock/Crash fixes* 💥 +## 💥 *Hardlock/Softlock/Crash/Compiling fixes* 💥 * N/A ## 🧬 General 🧬 @@ -122,6 +122,14 @@ ### Fixed * N/A +## 📚 Documentation 📚 +### Added +* N/A +### Changed +* N/A +### Fixed +* N/A + ## 📦 Branch Synchronisation 📦 ### pret's base pokeemerald * N/A @@ -135,3 +143,4 @@ **Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.Y.Z...expansion/1.Y.Z + diff --git a/docs/team_procedures/expansion_versions.md b/docs/team_procedures/expansion_versions.md new file mode 100644 index 000000000000..b53631bfa5a6 --- /dev/null +++ b/docs/team_procedures/expansion_versions.md @@ -0,0 +1,187 @@ +# How to make an Expansion version + +*If you need instructions on how to release a new Expansion version, check out the enclosed instruction book. - AsparagusEduardo* + +## 1.- Autogenerating a changelog for the `master` branch. + *Requires Write access to the repo.* + +If the changelog you're making is for a minor version (Eg. 1.3.0), make sure to sync the `upcoming` branch with `master` before starting. Keep in mind that if there are unreleased changes in `master`, they should be made into a patch version released alongside minor version. +- Go to https://github.com/rh-hideout/pokeemerald-expansion/releases. +- Press the option "Draft a new release". +- Fill the following fields: + - In "Choose a tag", write the name of the tag for the desired release number. + - Eg. for version 1.2.3, write `expansion/1.2.3`. ***It cannot be an existing tag.*** + - In "Target" choose `master`. + - In "Previous tag", select the latest version released. +- Press "Generate release notes". This will fill the description with a list of PRs made to the `master` branch since the lastest release. +- You may copy the contents to your editor of choice for step 2. +- If the changelog you're making is for a minor version (Eg. 1.3.0), proceed to step 1B, without closing the current window. + +## 1B.- Autogenerating a changelog for the `upcoming` branch. +- Delete the text and title generated in the site. +- Change "Target" to `upcoming`. +- Press "Generate release notes". This will autogenerate the description with changes from both branches, as they've been merged. +- Use a comparison tool to remove any shared PRs from `master`. (I use [WinMerge](https://winmerge.org/) for this). + - Also remove any shared "New Contributor" entries. +- You should now have a text that only contains PRs made to `upcoming`. + +## 2.- Sorting PRs in the changelog +- Copy the `docs/changelogs/template.md` file into a new file with the corresponding version for file and folder. Eg, for 1.2.3, you copy the file into `docs/changelogs/1.2.x/1.2.3.md`. +- Use the following Regex to adapt all PR links into the format currently used: + - Search + ``` + in https://github\.com/rh-hideout/pokeemerald-expansion/pull/(\d+) + ``` + - Replace + ``` + in [#$1](https://github.com/rh-hideout/pokeemerald-expansion/pull/$1) + ``` +- At the bottom of the template, replace the "____" in `` with the number of the last PR in your autogenerated changelog. This will help you keep track of any new PRs that are merged in before you're finished with your changelog. +- Sort the PRs by the categories present in the PR taking the following considerations: + - Keep the language of the changelog as newbie friendly as possible, explaining how the PR affects them. + - The format of the main line is the following: + ``` + {{Description of the change}} by @{{GitHub user}} in {{PR link}} + ``` + - If a PR reverted by a different PR, both should be removed. + - If the reverted PR's contents are then re-added it should be treated as if it's the first time added, with all the proper documentation needed. + - If a PR's content fits into multiple categories, like fixing two unrelated Ability and Move effects, you may duplicate the PR line and put it in both categories, changing the description of it accordingly. + - When refering to an element present in the code, always enclose them with ` to easily tell them apart. Eg: + - "Converted `settotemboost` command to `callnative`" + - "Changed `MOVEEND_` defines to an enum" + - A PR's technical changes that may conflict with user changes should have an entry in the "**REFACTORS**" section at the beginning of the changelog. Any of these changes that requires a migration script should also be marked as such by appending the corresponding emoji listed there. The section should include, but it's not limited to: + - Massive data format and/or structuring changes. + - Converting defines to enums. + - Renaming structs and/or their fields. + - Removing enums/defines/structs. + - For fixes: + - Once on their respective categories, if a PR fixes multiple issues at once in that category, you may make a sublist of those issues to properly detail each one and avoid just writing "Fixed multiple ability issues" or an overly verbose sentence for the PR. + - Try to fit the contents of a PR as a single sentence in past tense that. + - ***DON'T*** write something like "Fixed Parental Bond", as this doesn't explain *what* was fixed in Parental Bond. Instead, write something like "Fixed Parental Bond not affecting Snore". + - For new configs: + - Add the name of the config as part of the sentence, with subitems explaining what they do based on their generation if it's a generational config. Eg: + ``` + * Added missing `B_AFTER_YOU_TURN_ORDER` config by @PhallenTree in [#5400](https://github.com/rh-hideout/pokeemerald-expansion/pull/5400) + * Gen 5-7: After You fails if the order remains the same after using After You. + * Gen 8+: After You no longer fails if the turn order remains the same after using After You. + ``` + - For other new features: + - Explain how to use the feature completely, listing all its features as needed. For now, this is the only source of documentation for these features, so it's important to be thorough. + +# 3.- Preparing the code for the new version +- Search for all non-changelog instances of the previous released version and update them to the newer version. As of writing, it's these files: + - `README.md`: + ```diff + -Based off RHH's pokeemerald-expansion 1.2.2 https://github.com/rh-hideout/pokeemerald-expansion/ + +Based off RHH's pokeemerald-expansion 1.2.3 https://github.com/rh-hideout/pokeemerald-expansion/ + ``` + ```diff + -- Once you have your remote set up, run the command `git pull RHH expansion/X.Y.Z`, replacing X, Y and Z with the digits of the respective version you want to update to (eg, to update to 1.2.2, use `git pull RHH expansion/1.2.2`). + +- Once you have your remote set up, run the command `git pull RHH expansion/X.Y.Z`, replacing X, Y and Z with the digits of the respective version you want to update to (eg, to update to 1.2.3, use `git pull RHH expansion/1.2.3`). + ``` + - `.github/ISSUE_TEMPLATE/*.yaml` + - Patch version: + ```diff + options: + - 1.2.2 (Latest release) + + 1.2.3 (Latest release) + master (default, unreleased bugfixes) + upcoming (Edge) + + 1.2.2 + 1.2.1 + 1.2.0 + ``` + - Minor Version: + ```diff + options: + - 1.2.2 (Latest release) + + 1.2.3 (Latest release) + master (default, unreleased bugfixes) + upcoming (Edge) + + 1.2.2 + 1.2.1 + 1.2.0 + - 1.1.6 + - 1.1.5 + - 1.1.4 + - 1.1.3 + - 1.1.2 + - 1.1.1 + - 1.1.0 + - pre-1.1.0 + + pre-1.2.0 + ``` + - `docs/SUMMARY.md`: + - Patch version: + ```diff + [Changelog](./CHANGELOG.md) + - [1.2.x]() + + - [Version 1.2.3](changelogs/1.2.x/1.2.3.md) + - [Version 1.2.2](changelogs/1.2.x/1.2.2.md) + - [Version 1.2.1](changelogs/1.2.x/1.2.1.md) + - [Version 1.2.0](changelogs/1.2.x/1.2.0.md) + ``` + - Minor version: + ```diff + [Changelog](./CHANGELOG.md) + + - [1.3.x]() + + - [Version 1.3.0](changelogs/1.3.x/1.3.0.md) + - [1.2.x]() + - [Version 1.2.2](changelogs/1.2.x/1.2.2.md) + - [Version 1.2.1](changelogs/1.2.x/1.2.1.md) + - [Version 1.2.0](changelogs/1.2.x/1.2.0.md) + ``` + - `include/constants/expansion.h`: + - The defines should already have the version we're targetting as part of the previous changelog process. + ```diff + -// Last version: 1.2.2 + +// Last version: 1.2.3 + #define EXPANSION_VERSION_MAJOR 1 + #define EXPANSION_VERSION_MINOR 2 + #define EXPANSION_VERSION_PATCH 3 + + // FALSE if this this version of Expansion is not a tagged commit, i.e. + // it contains unreleased changes. + -#define EXPANSION_TAGGED_RELEASE FALSE + +#define EXPANSION_TAGGED_RELEASE TRUE + ``` +# 4.- Make a PR with the changes listed in Steps 2/3. +- Also post the changelog for feedback from contributors and maintainers. +- Once all feedback has been addresses, you may merge. +# 5.- Create the release on GitHub +- Copy the contents of your manual changelog into the description of your release. +- Modify the title to "Version {{version}}", eg. "Version 1.2.3" +- Be sure to have the "Set as the latest release" option set, +- Press "Publish Release". +- This will create a new tag in the repo that users can pull from like they can with branches. +# 6.- Post-release handling +- ***DON'T ACCEPT ANY NEW PRs YET.*** We have to prepare for the next cycle first. +- Go to `include/constants/expansion.h` and merge the following changes to the repo (PR or direct commit, doesn't matter much): + - Patch version: + ```diff + // Last version: 1.2.3 + #define EXPANSION_VERSION_MAJOR 1 + #define EXPANSION_VERSION_MINOR 2 + - #define EXPANSION_VERSION_PATCH 3 + + #define EXPANSION_VERSION_PATCH 4 + + // FALSE if this this version of Expansion is not a tagged commit, i.e. + // it contains unreleased changes. + -#define EXPANSION_TAGGED_RELEASE TRUE + +#define EXPANSION_TAGGED_RELEASE FALSE + ``` +With this, the repo is ready again to receive new PRs. + +# Now you're ready to make the announcements! +- We tend to post on the following Discord Servers: + - [RH-Hideout](https://discord.gg/6CzjAG6GZk) + - Requires role to post in #announcements channel. + - [Team Aqua's Hideout](https://discord.gg/team-aqua-s-hideout-976252009114140682) + - Requires role to post in #romhacking-updates channel. + - [What a Hack!](https://discord.gg/whack-a-hack-292436944670162955) + - Announcements are done in Spanish, but not the changelogs themselves. + - Requires role to ping "Decompilaciones" role. + - [pret](https://discord.gg/R4c3FA95dP) + - [PokéCommunity](https://discord.gg/pokecommunity) + +You can make a highlight of changes in the announcement itself, but it's not needed. (I also like using Discord emotes to highlight certain features during announcements, but gain, it's not needed). diff --git a/docs/ai_flags.md b/docs/tutorials/ai_flags.md similarity index 100% rename from docs/ai_flags.md rename to docs/tutorials/ai_flags.md diff --git a/docs/ai_logic.md b/docs/tutorials/ai_logic.md similarity index 100% rename from docs/ai_logic.md rename to docs/tutorials/ai_logic.md diff --git a/docs/how_to_battle_script_command_macro.md b/docs/tutorials/how_to_battle_script_command_macro.md similarity index 100% rename from docs/how_to_battle_script_command_macro.md rename to docs/tutorials/how_to_battle_script_command_macro.md diff --git a/docs/how_to_new_move.md b/docs/tutorials/how_to_new_move.md similarity index 100% rename from docs/how_to_new_move.md rename to docs/tutorials/how_to_new_move.md diff --git a/docs/how_to_new_pokemon_1_6_0.md b/docs/tutorials/how_to_new_pokemon_1_6_0.md similarity index 100% rename from docs/how_to_new_pokemon_1_6_0.md rename to docs/tutorials/how_to_new_pokemon_1_6_0.md diff --git a/docs/how_to_new_pokemon_1_7_0.md b/docs/tutorials/how_to_new_pokemon_1_7_0.md similarity index 100% rename from docs/how_to_new_pokemon_1_7_0.md rename to docs/tutorials/how_to_new_pokemon_1_7_0.md diff --git a/docs/how_to_new_pokemon_1_8_0.md b/docs/tutorials/how_to_new_pokemon_1_8_0.md similarity index 100% rename from docs/how_to_new_pokemon_1_8_0.md rename to docs/tutorials/how_to_new_pokemon_1_8_0.md diff --git a/docs/how_to_new_pokemon_1_9_0.md b/docs/tutorials/how_to_new_pokemon_1_9_0.md similarity index 100% rename from docs/how_to_new_pokemon_1_9_0.md rename to docs/tutorials/how_to_new_pokemon_1_9_0.md diff --git a/docs/how_to_testing_system.md b/docs/tutorials/how_to_testing_system.md similarity index 100% rename from docs/how_to_testing_system.md rename to docs/tutorials/how_to_testing_system.md diff --git a/docs/how_to_trainer_class.md b/docs/tutorials/how_to_trainer_class.md similarity index 100% rename from docs/how_to_trainer_class.md rename to docs/tutorials/how_to_trainer_class.md diff --git a/graphics/battle_anims/sprites/pinkvio_orb.png b/graphics/battle_anims/sprites/pinkvio_orb.png new file mode 100644 index 000000000000..d0d7c927549b Binary files /dev/null and b/graphics/battle_anims/sprites/pinkvio_orb.png differ diff --git a/graphics/pokemon/abomasnow/overworldf.png b/graphics/pokemon/abomasnow/overworldf.png new file mode 100644 index 000000000000..d6f07b6323e1 Binary files /dev/null and b/graphics/pokemon/abomasnow/overworldf.png differ diff --git a/graphics/pokemon/aipom/overworldf.png b/graphics/pokemon/aipom/overworldf.png new file mode 100644 index 000000000000..fe6424c39851 Binary files /dev/null and b/graphics/pokemon/aipom/overworldf.png differ diff --git a/graphics/pokemon/alakazam/overworldf.png b/graphics/pokemon/alakazam/overworldf.png new file mode 100644 index 000000000000..02b76111fd16 Binary files /dev/null and b/graphics/pokemon/alakazam/overworldf.png differ diff --git a/graphics/pokemon/ambipom/overworld.png b/graphics/pokemon/ambipom/overworld.png index 1f47b4d3e17c..24389b6a9a9d 100644 Binary files a/graphics/pokemon/ambipom/overworld.png and b/graphics/pokemon/ambipom/overworld.png differ diff --git a/graphics/pokemon/ambipom/overworldf.png b/graphics/pokemon/ambipom/overworldf.png new file mode 100644 index 000000000000..1f47b4d3e17c Binary files /dev/null and b/graphics/pokemon/ambipom/overworldf.png differ diff --git a/graphics/pokemon/arcanine/hisuian/overworld.png b/graphics/pokemon/arcanine/hisuian/overworld.png index a3c67a34d335..ec9fb5d8f846 100644 Binary files a/graphics/pokemon/arcanine/hisuian/overworld.png and b/graphics/pokemon/arcanine/hisuian/overworld.png differ diff --git a/graphics/pokemon/basculin/white_striped/overworld_shiny.pal b/graphics/pokemon/basculin/white_striped/overworld_shiny.pal index b4e0639fc85d..9f7acd30907b 100644 --- a/graphics/pokemon/basculin/white_striped/overworld_shiny.pal +++ b/graphics/pokemon/basculin/white_striped/overworld_shiny.pal @@ -6,13 +6,13 @@ JASC-PAL 255 255 255 172 197 255 0 0 0 -32 139 65 +80 112 40 16 98 41 123 172 172 172 222 230 -41 189 90 +120 168 56 74 74 74 -90 90 90 +64 80 80 57 74 82 123 148 197 123 148 189 diff --git a/graphics/pokemon/beautifly/overworld.png b/graphics/pokemon/beautifly/overworld.png index 36c31fed279a..d0727723a917 100644 Binary files a/graphics/pokemon/beautifly/overworld.png and b/graphics/pokemon/beautifly/overworld.png differ diff --git a/graphics/pokemon/beautifly/overworldf.png b/graphics/pokemon/beautifly/overworldf.png new file mode 100644 index 000000000000..36c31fed279a Binary files /dev/null and b/graphics/pokemon/beautifly/overworldf.png differ diff --git a/graphics/pokemon/bibarel/overworld.png b/graphics/pokemon/bibarel/overworld.png index f5751466a91a..6a3a4aace40a 100644 Binary files a/graphics/pokemon/bibarel/overworld.png and b/graphics/pokemon/bibarel/overworld.png differ diff --git a/graphics/pokemon/bibarel/overworldf.png b/graphics/pokemon/bibarel/overworldf.png new file mode 100644 index 000000000000..f5751466a91a Binary files /dev/null and b/graphics/pokemon/bibarel/overworldf.png differ diff --git a/graphics/pokemon/bidoof/overworld.png b/graphics/pokemon/bidoof/overworld.png index 9fe63802b4e4..756f2a8dcfd8 100644 Binary files a/graphics/pokemon/bidoof/overworld.png and b/graphics/pokemon/bidoof/overworld.png differ diff --git a/graphics/pokemon/bidoof/overworldf.png b/graphics/pokemon/bidoof/overworldf.png new file mode 100644 index 000000000000..9fe63802b4e4 Binary files /dev/null and b/graphics/pokemon/bidoof/overworldf.png differ diff --git a/graphics/pokemon/blaziken/overworldf.png b/graphics/pokemon/blaziken/overworldf.png new file mode 100644 index 000000000000..951d9bce61a7 Binary files /dev/null and b/graphics/pokemon/blaziken/overworldf.png differ diff --git a/graphics/pokemon/buizel/overworldf.png b/graphics/pokemon/buizel/overworldf.png new file mode 100644 index 000000000000..e41623536d01 Binary files /dev/null and b/graphics/pokemon/buizel/overworldf.png differ diff --git a/graphics/pokemon/butterfree/overworld.png b/graphics/pokemon/butterfree/overworld.png index c29f337badf4..f7edb449428e 100644 Binary files a/graphics/pokemon/butterfree/overworld.png and b/graphics/pokemon/butterfree/overworld.png differ diff --git a/graphics/pokemon/butterfree/overworld_normal.pal b/graphics/pokemon/butterfree/overworld_normal.pal index 1ce5a15e5d70..4756c9d723eb 100644 --- a/graphics/pokemon/butterfree/overworld_normal.pal +++ b/graphics/pokemon/butterfree/overworld_normal.pal @@ -15,5 +15,5 @@ JASC-PAL 104 200 248 80 144 224 48 64 144 -0 0 0 +73 73 73 0 0 0 diff --git a/graphics/pokemon/butterfree/overworld_shiny.pal b/graphics/pokemon/butterfree/overworld_shiny.pal index 222adecce1f0..1db4b7343345 100644 --- a/graphics/pokemon/butterfree/overworld_shiny.pal +++ b/graphics/pokemon/butterfree/overworld_shiny.pal @@ -15,5 +15,5 @@ JASC-PAL 248 112 136 176 72 96 112 40 56 -0 0 0 +73 73 73 0 0 0 diff --git a/graphics/pokemon/butterfree/overworldf.png b/graphics/pokemon/butterfree/overworldf.png new file mode 100644 index 000000000000..4402aaf26312 Binary files /dev/null and b/graphics/pokemon/butterfree/overworldf.png differ diff --git a/graphics/pokemon/cacturne/overworldf.png b/graphics/pokemon/cacturne/overworldf.png new file mode 100644 index 000000000000..cceeea05fbac Binary files /dev/null and b/graphics/pokemon/cacturne/overworldf.png differ diff --git a/graphics/pokemon/calyrex/ice_rider/overworld.png b/graphics/pokemon/calyrex/ice_rider/overworld.png index 24b3b6215a11..48952c59fa26 100644 Binary files a/graphics/pokemon/calyrex/ice_rider/overworld.png and b/graphics/pokemon/calyrex/ice_rider/overworld.png differ diff --git a/graphics/pokemon/calyrex/ice_rider/overworld_shiny.pal b/graphics/pokemon/calyrex/ice_rider/overworld_shiny.pal index 9eb0730f2323..4a45354c8389 100644 --- a/graphics/pokemon/calyrex/ice_rider/overworld_shiny.pal +++ b/graphics/pokemon/calyrex/ice_rider/overworld_shiny.pal @@ -7,13 +7,13 @@ JASC-PAL 0 37 32 146 175 206 183 206 229 -0 75 65 +0 88 72 52 69 167 -66 119 111 +0 112 96 100 100 100 242 242 242 64 83 103 -216 215 206 +208 200 144 0 0 0 -169 160 155 +168 136 88 191 191 191 diff --git a/graphics/pokemon/calyrex/shadow_rider/overworld.png b/graphics/pokemon/calyrex/shadow_rider/overworld.png index bb8c91b2f3a2..8aa1a2247e99 100644 Binary files a/graphics/pokemon/calyrex/shadow_rider/overworld.png and b/graphics/pokemon/calyrex/shadow_rider/overworld.png differ diff --git a/graphics/pokemon/calyrex/shadow_rider/overworld_normal.pal b/graphics/pokemon/calyrex/shadow_rider/overworld_normal.pal index 8114f67fe8ab..5454cdbe6e7d 100644 --- a/graphics/pokemon/calyrex/shadow_rider/overworld_normal.pal +++ b/graphics/pokemon/calyrex/shadow_rider/overworld_normal.pal @@ -8,7 +8,7 @@ JASC-PAL 246 242 246 65 64 74 32 36 65 -49 68 164 +0 75 65 213 210 205 0 32 24 148 174 205 diff --git a/graphics/pokemon/calyrex/shadow_rider/overworld_shiny.pal b/graphics/pokemon/calyrex/shadow_rider/overworld_shiny.pal index 8114f67fe8ab..61607ea95b22 100644 --- a/graphics/pokemon/calyrex/shadow_rider/overworld_shiny.pal +++ b/graphics/pokemon/calyrex/shadow_rider/overworld_shiny.pal @@ -8,12 +8,12 @@ JASC-PAL 246 242 246 65 64 74 32 36 65 -49 68 164 -213 210 205 +0 88 72 +208 200 144 0 32 24 148 174 205 74 52 148 -172 161 156 +168 136 88 98 101 98 24 16 65 49 36 115 diff --git a/graphics/pokemon/camerupt/overworldf.png b/graphics/pokemon/camerupt/overworldf.png new file mode 100644 index 000000000000..8adc7d5c407d Binary files /dev/null and b/graphics/pokemon/camerupt/overworldf.png differ diff --git a/graphics/pokemon/combee/followerf.png b/graphics/pokemon/combee/followerf.png deleted file mode 100644 index e39109ce825f..000000000000 Binary files a/graphics/pokemon/combee/followerf.png and /dev/null differ diff --git a/graphics/pokemon/combee/overworld.png b/graphics/pokemon/combee/overworld.png index 459538f5f07c..b0395e4fa8a2 100644 Binary files a/graphics/pokemon/combee/overworld.png and b/graphics/pokemon/combee/overworld.png differ diff --git a/graphics/pokemon/combee/overworld_normal.pal b/graphics/pokemon/combee/overworld_normal.pal index ae404c011250..d2eb1abe83ea 100644 --- a/graphics/pokemon/combee/overworld_normal.pal +++ b/graphics/pokemon/combee/overworld_normal.pal @@ -14,6 +14,6 @@ JASC-PAL 200 104 40 152 184 232 248 216 120 -0 0 0 +160 32 56 0 0 0 0 0 0 diff --git a/graphics/pokemon/combee/overworld_shiny.pal b/graphics/pokemon/combee/overworld_shiny.pal index 01483e8cd601..8db856dbe42f 100644 --- a/graphics/pokemon/combee/overworld_shiny.pal +++ b/graphics/pokemon/combee/overworld_shiny.pal @@ -14,6 +14,6 @@ JASC-PAL 200 104 40 152 184 232 248 176 128 -0 0 0 +160 32 56 0 0 0 0 0 0 diff --git a/graphics/pokemon/combee/overworldf.png b/graphics/pokemon/combee/overworldf.png new file mode 100644 index 000000000000..de523067d81e Binary files /dev/null and b/graphics/pokemon/combee/overworldf.png differ diff --git a/graphics/pokemon/combusken/overworld.png b/graphics/pokemon/combusken/overworld.png index b4302f91aa97..8b4e71d03a79 100644 Binary files a/graphics/pokemon/combusken/overworld.png and b/graphics/pokemon/combusken/overworld.png differ diff --git a/graphics/pokemon/combusken/overworldf.png b/graphics/pokemon/combusken/overworldf.png new file mode 100644 index 000000000000..b4302f91aa97 Binary files /dev/null and b/graphics/pokemon/combusken/overworldf.png differ diff --git a/graphics/pokemon/croagunk/overworldf.png b/graphics/pokemon/croagunk/overworldf.png new file mode 100644 index 000000000000..feeb323df1c7 Binary files /dev/null and b/graphics/pokemon/croagunk/overworldf.png differ diff --git a/graphics/pokemon/dialga/origin/overworld_shiny.pal b/graphics/pokemon/dialga/origin/overworld_shiny.pal index e6bfc48201b1..24814df9dfb3 100644 --- a/graphics/pokemon/dialga/origin/overworld_shiny.pal +++ b/graphics/pokemon/dialga/origin/overworld_shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -98 182 49 +0 40 128 0 0 0 65 129 255 189 32 16 246 80 65 57 121 180 -98 121 139 -32 64 106 -16 56 90 -24 64 106 +156 172 115 +8 106 123 +8 106 123 +8 148 156 189 202 222 -32 89 148 -139 161 180 -156 210 246 +8 148 156 +115 189 156 +156 246 148 16 16 16 24 40 49 diff --git a/graphics/pokemon/dodrio/overworldf.png b/graphics/pokemon/dodrio/overworldf.png new file mode 100644 index 000000000000..678d8546a1a1 Binary files /dev/null and b/graphics/pokemon/dodrio/overworldf.png differ diff --git a/graphics/pokemon/doduo/overworldf.png b/graphics/pokemon/doduo/overworldf.png new file mode 100644 index 000000000000..8639a0c77bcc Binary files /dev/null and b/graphics/pokemon/doduo/overworldf.png differ diff --git a/graphics/pokemon/donphan/overworldf.png b/graphics/pokemon/donphan/overworldf.png new file mode 100644 index 000000000000..709d1cbbd392 Binary files /dev/null and b/graphics/pokemon/donphan/overworldf.png differ diff --git a/graphics/pokemon/dustox/overworldf.png b/graphics/pokemon/dustox/overworldf.png new file mode 100644 index 000000000000..a92edca30b6c Binary files /dev/null and b/graphics/pokemon/dustox/overworldf.png differ diff --git a/graphics/pokemon/eevee/overworldf.png b/graphics/pokemon/eevee/overworldf.png new file mode 100644 index 000000000000..4fe402bbe8c6 Binary files /dev/null and b/graphics/pokemon/eevee/overworldf.png differ diff --git a/graphics/pokemon/enamorus/overworld_shiny.pal b/graphics/pokemon/enamorus/overworld_shiny.pal index 88fa42851ff7..d1281fa8830c 100644 --- a/graphics/pokemon/enamorus/overworld_shiny.pal +++ b/graphics/pokemon/enamorus/overworld_shiny.pal @@ -4,16 +4,16 @@ JASC-PAL 41 165 49 0 0 0 164 133 41 -230 117 156 -189 60 90 -172 72 82 +230 131 164 +255 90 0 +189 82 106 238 234 255 32 36 32 57 60 57 205 202 222 -148 32 24 +164 24 24 255 198 57 16 16 16 -246 85 139 +255 139 238 82 80 90 115 48 57 diff --git a/graphics/pokemon/enamorus/therian/overworld.png b/graphics/pokemon/enamorus/therian/overworld.png index f588895eb276..c52037dfe4bc 100644 Binary files a/graphics/pokemon/enamorus/therian/overworld.png and b/graphics/pokemon/enamorus/therian/overworld.png differ diff --git a/graphics/pokemon/enamorus/therian/overworld_shiny.pal b/graphics/pokemon/enamorus/therian/overworld_shiny.pal index c799ddfb8975..e650396bc814 100644 --- a/graphics/pokemon/enamorus/therian/overworld_shiny.pal +++ b/graphics/pokemon/enamorus/therian/overworld_shiny.pal @@ -6,14 +6,14 @@ JASC-PAL 118 50 58 232 232 248 200 200 216 -224 116 156 -174 74 87 +213 106 156 +213 65 57 16 16 16 243 46 46 -199 46 41 +74 74 74 147 33 30 -243 84 143 -187 62 94 +238 131 230 +203 0 128 247 238 76 255 197 60 0 0 0 diff --git a/graphics/pokemon/exeggutor/alolan/overworld.png b/graphics/pokemon/exeggutor/alolan/overworld.png index 6597515899cf..07e24d5c6c19 100644 Binary files a/graphics/pokemon/exeggutor/alolan/overworld.png and b/graphics/pokemon/exeggutor/alolan/overworld.png differ diff --git a/graphics/pokemon/finneon/overworldf.png b/graphics/pokemon/finneon/overworldf.png new file mode 100644 index 000000000000..53aa2a1a1211 Binary files /dev/null and b/graphics/pokemon/finneon/overworldf.png differ diff --git a/graphics/pokemon/flabebe/blue_flower/overworld.png b/graphics/pokemon/flabebe/blue_flower/overworld.png index 02176b255c3d..cd98db3a57e2 100644 Binary files a/graphics/pokemon/flabebe/blue_flower/overworld.png and b/graphics/pokemon/flabebe/blue_flower/overworld.png differ diff --git a/graphics/pokemon/flabebe/blue_flower/overworld_shiny.pal b/graphics/pokemon/flabebe/blue_flower/overworld_shiny.pal index 4a019608b5c4..2ee9713e2610 100644 --- a/graphics/pokemon/flabebe/blue_flower/overworld_shiny.pal +++ b/graphics/pokemon/flabebe/blue_flower/overworld_shiny.pal @@ -12,8 +12,8 @@ JASC-PAL 221 181 0 243 86 75 21 44 77 -69 66 127 +31 95 31 70 144 248 -154 149 228 +184 216 153 96 90 188 0 0 0 diff --git a/graphics/pokemon/flabebe/orange_flower/overworld.png b/graphics/pokemon/flabebe/orange_flower/overworld.png index af5fe1322db5..482ff4f29ecb 100644 Binary files a/graphics/pokemon/flabebe/orange_flower/overworld.png and b/graphics/pokemon/flabebe/orange_flower/overworld.png differ diff --git a/graphics/pokemon/flabebe/orange_flower/overworld_shiny.pal b/graphics/pokemon/flabebe/orange_flower/overworld_shiny.pal index 678dd2b20533..d5000f723445 100644 --- a/graphics/pokemon/flabebe/orange_flower/overworld_shiny.pal +++ b/graphics/pokemon/flabebe/orange_flower/overworld_shiny.pal @@ -12,8 +12,8 @@ JASC-PAL 221 181 0 243 86 75 171 61 1 -69 66 127 +31 95 31 253 145 59 -154 149 228 +184 216 153 96 90 188 0 0 0 diff --git a/graphics/pokemon/flabebe/overworld.png b/graphics/pokemon/flabebe/overworld.png index 922fed03cd94..3ad946f5f8f3 100644 Binary files a/graphics/pokemon/flabebe/overworld.png and b/graphics/pokemon/flabebe/overworld.png differ diff --git a/graphics/pokemon/flabebe/overworld_shiny.pal b/graphics/pokemon/flabebe/overworld_shiny.pal index 4b3bd7e5c5ab..e9ea843e5004 100644 --- a/graphics/pokemon/flabebe/overworld_shiny.pal +++ b/graphics/pokemon/flabebe/overworld_shiny.pal @@ -12,8 +12,8 @@ JASC-PAL 221 181 0 243 86 75 107 36 33 -96 90 188 -154 149 228 +31 95 31 +184 216 153 96 90 188 0 0 0 0 0 0 diff --git a/graphics/pokemon/flabebe/white_flower/overworld.png b/graphics/pokemon/flabebe/white_flower/overworld.png index 843d45c96d8a..35b4b2f358ad 100644 Binary files a/graphics/pokemon/flabebe/white_flower/overworld.png and b/graphics/pokemon/flabebe/white_flower/overworld.png differ diff --git a/graphics/pokemon/flabebe/white_flower/overworld_shiny.pal b/graphics/pokemon/flabebe/white_flower/overworld_shiny.pal index 66317d403732..43b725acc247 100644 --- a/graphics/pokemon/flabebe/white_flower/overworld_shiny.pal +++ b/graphics/pokemon/flabebe/white_flower/overworld_shiny.pal @@ -11,8 +11,8 @@ JASC-PAL 232 153 2 221 181 0 243 86 75 -69 66 127 -154 149 228 +31 95 31 +184 216 153 96 90 188 0 0 0 0 0 0 diff --git a/graphics/pokemon/flabebe/yellow_flower/overworld.png b/graphics/pokemon/flabebe/yellow_flower/overworld.png index d170322b186c..b0f7a47f7a3e 100644 Binary files a/graphics/pokemon/flabebe/yellow_flower/overworld.png and b/graphics/pokemon/flabebe/yellow_flower/overworld.png differ diff --git a/graphics/pokemon/flabebe/yellow_flower/overworld_shiny.pal b/graphics/pokemon/flabebe/yellow_flower/overworld_shiny.pal index 04f701918cee..5c527f5608bd 100644 --- a/graphics/pokemon/flabebe/yellow_flower/overworld_shiny.pal +++ b/graphics/pokemon/flabebe/yellow_flower/overworld_shiny.pal @@ -12,8 +12,8 @@ JASC-PAL 221 181 0 243 86 75 148 81 2 -69 66 127 +31 95 31 230 206 10 -154 149 228 +184 216 153 96 90 188 0 0 0 diff --git a/graphics/pokemon/floatzel/overworldf.png b/graphics/pokemon/floatzel/overworldf.png new file mode 100644 index 000000000000..bb4483fc557f Binary files /dev/null and b/graphics/pokemon/floatzel/overworldf.png differ diff --git a/graphics/pokemon/floette/eternal_flower/overworld_shiny.pal b/graphics/pokemon/floette/eternal_flower/overworld_shiny.pal index 3917a8c5fc88..2f377aa0ed8f 100644 --- a/graphics/pokemon/floette/eternal_flower/overworld_shiny.pal +++ b/graphics/pokemon/floette/eternal_flower/overworld_shiny.pal @@ -9,8 +9,8 @@ JASC-PAL 255 93 135 59 55 55 205 39 81 -25 105 88 -12 180 149 +127 63 79 +207 143 159 251 254 255 99 113 115 197 199 199 diff --git a/graphics/pokemon/frillish/overworld_normalf.pal b/graphics/pokemon/frillish/overworld_normalf.pal new file mode 100644 index 000000000000..dbe974dc0574 --- /dev/null +++ b/graphics/pokemon/frillish/overworld_normalf.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +152 208 160 +184 128 160 +140 83 98 +208 176 184 +248 216 224 +248 176 208 +120 56 80 +11 11 11 +229 229 247 +168 48 64 +88 160 192 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/frillish/overworld_shinyf.pal b/graphics/pokemon/frillish/overworld_shinyf.pal new file mode 100644 index 000000000000..271de05df9b5 --- /dev/null +++ b/graphics/pokemon/frillish/overworld_shinyf.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +152 208 160 +192 120 120 +120 56 80 +208 176 232 +232 224 248 +248 152 152 +120 56 80 +11 11 11 +248 248 248 +128 24 136 +72 152 136 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/frillish/followerf.png b/graphics/pokemon/frillish/overworldf.png similarity index 100% rename from graphics/pokemon/frillish/followerf.png rename to graphics/pokemon/frillish/overworldf.png diff --git a/graphics/pokemon/gabite/overworldf.png b/graphics/pokemon/gabite/overworldf.png new file mode 100644 index 000000000000..e3c5f2892df2 Binary files /dev/null and b/graphics/pokemon/gabite/overworldf.png differ diff --git a/graphics/pokemon/garchomp/overworldf.png b/graphics/pokemon/garchomp/overworldf.png new file mode 100644 index 000000000000..3d66472a65c9 Binary files /dev/null and b/graphics/pokemon/garchomp/overworldf.png differ diff --git a/graphics/pokemon/gible/overworldf.png b/graphics/pokemon/gible/overworldf.png new file mode 100644 index 000000000000..4481b2870f43 Binary files /dev/null and b/graphics/pokemon/gible/overworldf.png differ diff --git a/graphics/pokemon/girafarig/overworldf.png b/graphics/pokemon/girafarig/overworldf.png new file mode 100644 index 000000000000..057145b098ce Binary files /dev/null and b/graphics/pokemon/girafarig/overworldf.png differ diff --git a/graphics/pokemon/gligar/overworldf.png b/graphics/pokemon/gligar/overworldf.png new file mode 100644 index 000000000000..65ad45ac2567 Binary files /dev/null and b/graphics/pokemon/gligar/overworldf.png differ diff --git a/graphics/pokemon/gloom/overworldf.png b/graphics/pokemon/gloom/overworldf.png new file mode 100644 index 000000000000..4b5ba180a5ae Binary files /dev/null and b/graphics/pokemon/gloom/overworldf.png differ diff --git a/graphics/pokemon/golbat/overworld.png b/graphics/pokemon/golbat/overworld.png index 658023601d46..ed4e7059be53 100644 Binary files a/graphics/pokemon/golbat/overworld.png and b/graphics/pokemon/golbat/overworld.png differ diff --git a/graphics/pokemon/golbat/overworldf.png b/graphics/pokemon/golbat/overworldf.png new file mode 100644 index 000000000000..658023601d46 Binary files /dev/null and b/graphics/pokemon/golbat/overworldf.png differ diff --git a/graphics/pokemon/goldeen/overworldf.png b/graphics/pokemon/goldeen/overworldf.png new file mode 100644 index 000000000000..8bc987e9e6e1 Binary files /dev/null and b/graphics/pokemon/goldeen/overworldf.png differ diff --git a/graphics/pokemon/golem/alolan/overworld.png b/graphics/pokemon/golem/alolan/overworld.png index d5d950f84dd5..b083d1df8a5e 100644 Binary files a/graphics/pokemon/golem/alolan/overworld.png and b/graphics/pokemon/golem/alolan/overworld.png differ diff --git a/graphics/pokemon/goodra/hisuian/overworld.png b/graphics/pokemon/goodra/hisuian/overworld.png index 5bc1d200c897..23f160b786b5 100644 Binary files a/graphics/pokemon/goodra/hisuian/overworld.png and b/graphics/pokemon/goodra/hisuian/overworld.png differ diff --git a/graphics/pokemon/gourgeist/large/overworld.png b/graphics/pokemon/gourgeist/large/overworld.png new file mode 100644 index 000000000000..e542ea438599 Binary files /dev/null and b/graphics/pokemon/gourgeist/large/overworld.png differ diff --git a/graphics/pokemon/gourgeist/overworld.png b/graphics/pokemon/gourgeist/overworld.png index f2184b2cfc56..82e5a0595c62 100644 Binary files a/graphics/pokemon/gourgeist/overworld.png and b/graphics/pokemon/gourgeist/overworld.png differ diff --git a/graphics/pokemon/gourgeist/small/overworld.png b/graphics/pokemon/gourgeist/small/overworld.png new file mode 100644 index 000000000000..cbbd3cca8a83 Binary files /dev/null and b/graphics/pokemon/gourgeist/small/overworld.png differ diff --git a/graphics/pokemon/gourgeist/super/overworld.png b/graphics/pokemon/gourgeist/super/overworld.png new file mode 100644 index 000000000000..d9494d1971b3 Binary files /dev/null and b/graphics/pokemon/gourgeist/super/overworld.png differ diff --git a/graphics/pokemon/graveler/alolan/overworld.png b/graphics/pokemon/graveler/alolan/overworld.png index 7ff3687da6b7..d1c9b50f17ee 100644 Binary files a/graphics/pokemon/graveler/alolan/overworld.png and b/graphics/pokemon/graveler/alolan/overworld.png differ diff --git a/graphics/pokemon/growlithe/hisuian/overworld.png b/graphics/pokemon/growlithe/hisuian/overworld.png index f9cb0ef6cca6..fdacc9134559 100644 Binary files a/graphics/pokemon/growlithe/hisuian/overworld.png and b/graphics/pokemon/growlithe/hisuian/overworld.png differ diff --git a/graphics/pokemon/gulpin/overworldf.png b/graphics/pokemon/gulpin/overworldf.png new file mode 100644 index 000000000000..73838f715180 Binary files /dev/null and b/graphics/pokemon/gulpin/overworldf.png differ diff --git a/graphics/pokemon/gyarados/overworld.png b/graphics/pokemon/gyarados/overworld.png index 7c0400b1e5b7..e2ab6d3ac522 100644 Binary files a/graphics/pokemon/gyarados/overworld.png and b/graphics/pokemon/gyarados/overworld.png differ diff --git a/graphics/pokemon/gyarados/overworldf.png b/graphics/pokemon/gyarados/overworldf.png new file mode 100644 index 000000000000..7c0400b1e5b7 Binary files /dev/null and b/graphics/pokemon/gyarados/overworldf.png differ diff --git a/graphics/pokemon/heracross/overworldf.png b/graphics/pokemon/heracross/overworldf.png new file mode 100644 index 000000000000..84b22f6a8e76 Binary files /dev/null and b/graphics/pokemon/heracross/overworldf.png differ diff --git a/graphics/pokemon/hippopotas/followerf.png b/graphics/pokemon/hippopotas/followerf.png deleted file mode 100644 index e8802de5c496..000000000000 Binary files a/graphics/pokemon/hippopotas/followerf.png and /dev/null differ diff --git a/graphics/pokemon/hippopotas/overworldf.png b/graphics/pokemon/hippopotas/overworldf.png new file mode 100644 index 000000000000..dcc8875b4ba6 Binary files /dev/null and b/graphics/pokemon/hippopotas/overworldf.png differ diff --git a/graphics/pokemon/hippowdon/followerf.png b/graphics/pokemon/hippowdon/followerf.png deleted file mode 100644 index 20ac193d7458..000000000000 Binary files a/graphics/pokemon/hippowdon/followerf.png and /dev/null differ diff --git a/graphics/pokemon/hippowdon/overworld_normalf.pal b/graphics/pokemon/hippowdon/overworld_normalf.pal new file mode 100644 index 000000000000..64198bd35c67 --- /dev/null +++ b/graphics/pokemon/hippowdon/overworld_normalf.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +152 208 160 +0 0 0 +96 96 96 +48 48 48 +72 72 72 +88 88 104 +136 136 144 +192 56 80 +168 168 168 +200 200 208 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/hippowdon/overworld_shinyf.pal b/graphics/pokemon/hippowdon/overworld_shinyf.pal new file mode 100644 index 000000000000..022b4b542c0d --- /dev/null +++ b/graphics/pokemon/hippowdon/overworld_shinyf.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +152 208 160 +0 0 0 +136 136 104 +48 48 48 +96 96 72 +160 160 128 +184 192 152 +192 56 80 +152 208 160 +200 200 208 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/houndoom/overworldf.png b/graphics/pokemon/houndoom/overworldf.png new file mode 100644 index 000000000000..85091448d9ee Binary files /dev/null and b/graphics/pokemon/houndoom/overworldf.png differ diff --git a/graphics/pokemon/hypno/overworldf.png b/graphics/pokemon/hypno/overworldf.png new file mode 100644 index 000000000000..0120f60a908f Binary files /dev/null and b/graphics/pokemon/hypno/overworldf.png differ diff --git a/graphics/pokemon/jellicent/followerf.png b/graphics/pokemon/jellicent/followerf.png deleted file mode 100644 index 1de8ee407b9c..000000000000 Binary files a/graphics/pokemon/jellicent/followerf.png and /dev/null differ diff --git a/graphics/pokemon/jellicent/overworld_normalf.pal b/graphics/pokemon/jellicent/overworld_normalf.pal new file mode 100644 index 000000000000..8d94142d60dd --- /dev/null +++ b/graphics/pokemon/jellicent/overworld_normalf.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +152 208 160 +7 7 7 +247 212 238 +109 46 69 +203 117 168 +247 151 194 +185 151 177 +185 151 177 +247 247 247 +214 53 26 +45 20 29 +32 69 142 +0 0 0 +247 212 238 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/jellicent/overworld_shinyf.pal b/graphics/pokemon/jellicent/overworld_shinyf.pal new file mode 100644 index 000000000000..d8bd8e5c4b98 --- /dev/null +++ b/graphics/pokemon/jellicent/overworld_shinyf.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +152 208 160 +7 7 7 +240 216 248 +88 64 112 +160 120 224 +208 176 248 +168 152 184 +185 151 177 +247 247 247 +200 32 192 +45 20 29 +32 69 142 +0 0 0 +247 212 238 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/jellicent/overworldf.png b/graphics/pokemon/jellicent/overworldf.png new file mode 100644 index 000000000000..1a0cd24b0200 Binary files /dev/null and b/graphics/pokemon/jellicent/overworldf.png differ diff --git a/graphics/pokemon/kadabra/overworldf.png b/graphics/pokemon/kadabra/overworldf.png new file mode 100644 index 000000000000..6ddb321401d6 Binary files /dev/null and b/graphics/pokemon/kadabra/overworldf.png differ diff --git a/graphics/pokemon/kricketot/overworldf.png b/graphics/pokemon/kricketot/overworldf.png new file mode 100644 index 000000000000..703b898276ee Binary files /dev/null and b/graphics/pokemon/kricketot/overworldf.png differ diff --git a/graphics/pokemon/kricketune/overworldf.png b/graphics/pokemon/kricketune/overworldf.png new file mode 100644 index 000000000000..fcb57067b054 Binary files /dev/null and b/graphics/pokemon/kricketune/overworldf.png differ diff --git a/graphics/pokemon/kyurem/black/overworld.png b/graphics/pokemon/kyurem/black/overworld.png new file mode 100644 index 000000000000..2818f3b943b8 Binary files /dev/null and b/graphics/pokemon/kyurem/black/overworld.png differ diff --git a/graphics/pokemon/kyurem/black/overworld_normal.pal b/graphics/pokemon/kyurem/black/overworld_normal.pal new file mode 100644 index 000000000000..ee43680d4c1d --- /dev/null +++ b/graphics/pokemon/kyurem/black/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 18 128 +16 16 16 +40 40 40 +48 48 42 +56 56 56 +72 72 72 +71 86 86 +96 96 96 +248 232 8 +144 136 120 +239 173 74 +72 72 72 +136 152 144 +184 176 152 +179 204 187 +232 232 248 diff --git a/graphics/pokemon/kyurem/black/overworld_shiny.pal b/graphics/pokemon/kyurem/black/overworld_shiny.pal new file mode 100644 index 000000000000..b7782d0c29c9 --- /dev/null +++ b/graphics/pokemon/kyurem/black/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +125 146 158 +16 16 16 +40 40 40 +48 48 42 +57 62 66 +72 72 72 +71 86 86 +48 80 56 +240 64 180 +96 128 108 +194 52 146 +72 72 72 +173 228 247 +184 176 152 +122 147 201 +232 232 248 diff --git a/graphics/pokemon/kyurem/white/overworld.png b/graphics/pokemon/kyurem/white/overworld.png new file mode 100644 index 000000000000..d4651912d4f0 Binary files /dev/null and b/graphics/pokemon/kyurem/white/overworld.png differ diff --git a/graphics/pokemon/kyurem/white/overworld_normal.pal b/graphics/pokemon/kyurem/white/overworld_normal.pal new file mode 100644 index 000000000000..0f6dd354dc06 --- /dev/null +++ b/graphics/pokemon/kyurem/white/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +238 27 128 +16 16 16 +48 48 42 +62 62 66 +80 96 96 +96 96 96 +80 96 96 +232 232 248 +236 220 10 +144 136 120 +239 173 74 +136 152 144 +184 176 152 +182 207 190 +196 196 209 +232 232 248 diff --git a/graphics/pokemon/kyurem/white/overworld_shiny.pal b/graphics/pokemon/kyurem/white/overworld_shiny.pal new file mode 100644 index 000000000000..922002fe5b24 --- /dev/null +++ b/graphics/pokemon/kyurem/white/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +238 27 128 +16 16 16 +48 48 42 +62 62 66 +80 96 96 +48 75 81 +80 96 96 +232 232 248 +237 90 188 +90 115 128 +170 45 128 +122 147 200 +184 176 152 +196 203 240 +196 196 209 +232 232 248 diff --git a/graphics/pokemon/landorus/therian/overworld.png b/graphics/pokemon/landorus/therian/overworld.png new file mode 100644 index 000000000000..0f3b0219572d Binary files /dev/null and b/graphics/pokemon/landorus/therian/overworld.png differ diff --git a/graphics/pokemon/landorus/therian/overworld_normal.pal b/graphics/pokemon/landorus/therian/overworld_normal.pal new file mode 100644 index 000000000000..68ee7e89de25 --- /dev/null +++ b/graphics/pokemon/landorus/therian/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +152 208 160 +84 86 84 +109 127 139 +237 237 246 +198 198 211 +22 37 14 +142 85 23 +219 152 23 +246 131 142 +87 78 43 +212 99 49 +225 80 74 +38 37 38 +214 195 61 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/landorus/therian/overworld_shiny.pal b/graphics/pokemon/landorus/therian/overworld_shiny.pal new file mode 100644 index 000000000000..36e4944980c5 --- /dev/null +++ b/graphics/pokemon/landorus/therian/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +152 208 160 +103 64 40 +103 128 140 +237 237 246 +160 184 160 +22 37 14 +158 97 23 +248 160 40 +229 89 32 +38 37 38 +158 97 23 +229 89 32 +38 37 38 +214 195 61 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/ledian/overworldf.png b/graphics/pokemon/ledian/overworldf.png new file mode 100644 index 000000000000..61d46f847742 Binary files /dev/null and b/graphics/pokemon/ledian/overworldf.png differ diff --git a/graphics/pokemon/ledyba/overworldf.png b/graphics/pokemon/ledyba/overworldf.png new file mode 100644 index 000000000000..a46f3549c646 Binary files /dev/null and b/graphics/pokemon/ledyba/overworldf.png differ diff --git a/graphics/pokemon/ludicolo/overworld.png b/graphics/pokemon/ludicolo/overworld.png index 28a1e23d8ba5..0414f960c1de 100644 Binary files a/graphics/pokemon/ludicolo/overworld.png and b/graphics/pokemon/ludicolo/overworld.png differ diff --git a/graphics/pokemon/ludicolo/overworldf.png b/graphics/pokemon/ludicolo/overworldf.png new file mode 100644 index 000000000000..28a1e23d8ba5 Binary files /dev/null and b/graphics/pokemon/ludicolo/overworldf.png differ diff --git a/graphics/pokemon/lumineon/overworldf.png b/graphics/pokemon/lumineon/overworldf.png new file mode 100644 index 000000000000..44101d055e71 Binary files /dev/null and b/graphics/pokemon/lumineon/overworldf.png differ diff --git a/graphics/pokemon/luxio/overworldf.png b/graphics/pokemon/luxio/overworldf.png new file mode 100644 index 000000000000..6646e4262bda Binary files /dev/null and b/graphics/pokemon/luxio/overworldf.png differ diff --git a/graphics/pokemon/luxray/overworldf.png b/graphics/pokemon/luxray/overworldf.png new file mode 100644 index 000000000000..bc4cc97e7566 Binary files /dev/null and b/graphics/pokemon/luxray/overworldf.png differ diff --git a/graphics/pokemon/lycanroc/overworld.png b/graphics/pokemon/lycanroc/overworld.png index e625ff82502f..5b8ebcb1f6aa 100644 Binary files a/graphics/pokemon/lycanroc/overworld.png and b/graphics/pokemon/lycanroc/overworld.png differ diff --git a/graphics/pokemon/lycanroc/overworld_normal.pal b/graphics/pokemon/lycanroc/overworld_normal.pal index 87f56c95fa63..f75ed7c8f839 100644 --- a/graphics/pokemon/lycanroc/overworld_normal.pal +++ b/graphics/pokemon/lycanroc/overworld_normal.pal @@ -1,12 +1,12 @@ JASC-PAL 0100 16 -255 255 255 +243 18 128 199 162 141 184 181 175 92 170 238 128 128 128 -88 146 214 +255 255 255 85 129 197 141 116 102 178 98 156 diff --git a/graphics/pokemon/lycanroc/overworld_shiny.pal b/graphics/pokemon/lycanroc/overworld_shiny.pal index 03f98160dbb7..fe310eee2174 100644 --- a/graphics/pokemon/lycanroc/overworld_shiny.pal +++ b/graphics/pokemon/lycanroc/overworld_shiny.pal @@ -1,12 +1,12 @@ JASC-PAL 0100 16 -255 255 255 +243 18 128 136 168 200 184 181 175 92 170 238 128 128 128 -88 146 214 +255 255 240 85 129 197 96 120 176 248 152 136 diff --git a/graphics/pokemon/magearna/original_color/overworld.png b/graphics/pokemon/magearna/original_color/overworld.png new file mode 100644 index 000000000000..0e6c49271e76 Binary files /dev/null and b/graphics/pokemon/magearna/original_color/overworld.png differ diff --git a/graphics/pokemon/magearna/original_color/overworld_normal.pal b/graphics/pokemon/magearna/original_color/overworld_normal.pal new file mode 100644 index 000000000000..5a44a547071c --- /dev/null +++ b/graphics/pokemon/magearna/original_color/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +152 208 160 +49 44 43 +179 74 68 +203 98 96 +179 74 68 +0 0 0 +232 227 162 +203 98 96 +186 177 108 +94 84 82 +70 153 169 +168 161 155 +239 229 115 +231 227 224 +186 177 108 +0 0 0 diff --git a/graphics/pokemon/magearna/original_color/overworld_shiny.pal b/graphics/pokemon/magearna/original_color/overworld_shiny.pal new file mode 100644 index 000000000000..167f426783e4 --- /dev/null +++ b/graphics/pokemon/magearna/original_color/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +152 208 160 +49 44 43 +90 85 84 +216 120 144 +179 74 68 +0 0 0 +206 200 197 +135 129 126 +153 146 143 +105 93 91 +70 153 169 +168 161 155 +232 220 110 +206 200 197 +167 157 71 +0 0 0 diff --git a/graphics/pokemon/magikarp/overworld.png b/graphics/pokemon/magikarp/overworld.png index debcdb492539..05f918c64f46 100644 Binary files a/graphics/pokemon/magikarp/overworld.png and b/graphics/pokemon/magikarp/overworld.png differ diff --git a/graphics/pokemon/magikarp/overworldf.png b/graphics/pokemon/magikarp/overworldf.png new file mode 100644 index 000000000000..debcdb492539 Binary files /dev/null and b/graphics/pokemon/magikarp/overworldf.png differ diff --git a/graphics/pokemon/mamoswine/overworldf.png b/graphics/pokemon/mamoswine/overworldf.png new file mode 100644 index 000000000000..d89769a98cc4 Binary files /dev/null and b/graphics/pokemon/mamoswine/overworldf.png differ diff --git a/graphics/pokemon/marowak/alolan/overworld.png b/graphics/pokemon/marowak/alolan/overworld.png index 07dc3ff981a1..655c37491ef3 100644 Binary files a/graphics/pokemon/marowak/alolan/overworld.png and b/graphics/pokemon/marowak/alolan/overworld.png differ diff --git a/graphics/pokemon/marowak/alolan/overworld_normal.pal b/graphics/pokemon/marowak/alolan/overworld_normal.pal index e8ff3de95a9e..8d978ff30dad 100644 --- a/graphics/pokemon/marowak/alolan/overworld_normal.pal +++ b/graphics/pokemon/marowak/alolan/overworld_normal.pal @@ -7,13 +7,13 @@ JASC-PAL 72 72 72 0 0 0 216 224 224 -81 51 79 -50 142 66 -211 248 121 +48 48 80 +40 216 176 +160 248 240 52 35 51 -112 71 82 -4 107 56 -48 189 120 -137 86 133 -170 130 145 +112 64 80 +40 216 176 +24 168 136 +80 72 136 +168 128 144 172 229 196 diff --git a/graphics/pokemon/marowak/alolan/overworld_shiny.pal b/graphics/pokemon/marowak/alolan/overworld_shiny.pal index d42162967550..e60d46828034 100644 --- a/graphics/pokemon/marowak/alolan/overworld_shiny.pal +++ b/graphics/pokemon/marowak/alolan/overworld_shiny.pal @@ -7,13 +7,13 @@ JASC-PAL 72 72 72 0 0 0 216 224 224 -67 58 109 -50 142 66 -211 248 121 -54 49 81 -67 67 67 -4 107 56 -48 189 120 -101 87 164 -112 112 112 +96 64 136 +40 216 176 +160 248 240 +52 35 51 +40 32 32 +40 216 176 +24 168 136 +136 96 192 +64 48 48 172 229 196 diff --git a/graphics/pokemon/medicham/overworldf.png b/graphics/pokemon/medicham/overworldf.png new file mode 100644 index 000000000000..d48352aa9ee4 Binary files /dev/null and b/graphics/pokemon/medicham/overworldf.png differ diff --git a/graphics/pokemon/meditite/overworld.png b/graphics/pokemon/meditite/overworld.png index 53adfb2b00d5..8fb9cdef3fcc 100644 Binary files a/graphics/pokemon/meditite/overworld.png and b/graphics/pokemon/meditite/overworld.png differ diff --git a/graphics/pokemon/meditite/overworldf.png b/graphics/pokemon/meditite/overworldf.png new file mode 100644 index 000000000000..53adfb2b00d5 Binary files /dev/null and b/graphics/pokemon/meditite/overworldf.png differ diff --git a/graphics/pokemon/meganium/overworldf.png b/graphics/pokemon/meganium/overworldf.png new file mode 100644 index 000000000000..2217fd815731 Binary files /dev/null and b/graphics/pokemon/meganium/overworldf.png differ diff --git a/graphics/pokemon/milotic/overworldf.png b/graphics/pokemon/milotic/overworldf.png new file mode 100644 index 000000000000..3314e55fdd71 Binary files /dev/null and b/graphics/pokemon/milotic/overworldf.png differ diff --git a/graphics/pokemon/murkrow/overworld.png b/graphics/pokemon/murkrow/overworld.png index c70c19ba2cbf..1b72d9093076 100644 Binary files a/graphics/pokemon/murkrow/overworld.png and b/graphics/pokemon/murkrow/overworld.png differ diff --git a/graphics/pokemon/murkrow/overworldf.png b/graphics/pokemon/murkrow/overworldf.png new file mode 100644 index 000000000000..c70c19ba2cbf Binary files /dev/null and b/graphics/pokemon/murkrow/overworldf.png differ diff --git a/graphics/pokemon/necrozma/dawn_wings/overworld.png b/graphics/pokemon/necrozma/dawn_wings/overworld.png index 3bae5a72f9ae..af658b2ebc28 100644 Binary files a/graphics/pokemon/necrozma/dawn_wings/overworld.png and b/graphics/pokemon/necrozma/dawn_wings/overworld.png differ diff --git a/graphics/pokemon/ninetales/alolan/overworld.png b/graphics/pokemon/ninetales/alolan/overworld.png index 0abf5d6433ba..d13aa001d0cd 100644 Binary files a/graphics/pokemon/ninetales/alolan/overworld.png and b/graphics/pokemon/ninetales/alolan/overworld.png differ diff --git a/graphics/pokemon/ninetales/alolan/overworld_shiny.pal b/graphics/pokemon/ninetales/alolan/overworld_shiny.pal index dfb053a96177..0336fd62a9c1 100644 --- a/graphics/pokemon/ninetales/alolan/overworld_shiny.pal +++ b/graphics/pokemon/ninetales/alolan/overworld_shiny.pal @@ -2,7 +2,7 @@ JASC-PAL 0100 16 152 208 160 -91 74 138 +112 80 112 0 0 0 178 178 219 230 225 246 diff --git a/graphics/pokemon/numel/overworldf.png b/graphics/pokemon/numel/overworldf.png new file mode 100644 index 000000000000..b62cf188e8b7 Binary files /dev/null and b/graphics/pokemon/numel/overworldf.png differ diff --git a/graphics/pokemon/nuzleaf/overworldf.png b/graphics/pokemon/nuzleaf/overworldf.png new file mode 100644 index 000000000000..5c4365306b2c Binary files /dev/null and b/graphics/pokemon/nuzleaf/overworldf.png differ diff --git a/graphics/pokemon/octillery/overworldf.png b/graphics/pokemon/octillery/overworldf.png new file mode 100644 index 000000000000..40972e08b046 Binary files /dev/null and b/graphics/pokemon/octillery/overworldf.png differ diff --git a/graphics/pokemon/oricorio/pau/overworld.png b/graphics/pokemon/oricorio/pau/overworld.png new file mode 100644 index 000000000000..16674ed09b22 Binary files /dev/null and b/graphics/pokemon/oricorio/pau/overworld.png differ diff --git a/graphics/pokemon/oricorio/pau/overworld_normal.pal b/graphics/pokemon/oricorio/pau/overworld_normal.pal new file mode 100644 index 000000000000..212161819469 --- /dev/null +++ b/graphics/pokemon/oricorio/pau/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +115 197 164 +32 32 32 +192 173 154 +252 234 216 +144 128 112 +104 59 68 +239 183 188 +184 142 145 +0 0 0 +191 137 141 +199 132 137 +242 106 141 +135 104 106 +237 243 238 +230 97 131 +255 190 197 diff --git a/graphics/pokemon/oricorio/pau/overworld_shiny.pal b/graphics/pokemon/oricorio/pau/overworld_shiny.pal new file mode 100644 index 000000000000..4a3a9d46d221 --- /dev/null +++ b/graphics/pokemon/oricorio/pau/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +115 197 164 +32 32 32 +223 90 124 +252 152 158 +158 54 72 +104 59 68 +239 183 188 +202 86 116 +0 0 0 +252 152 158 +199 132 137 +254 236 199 +135 104 106 +237 243 238 +220 174 133 +254 236 199 diff --git a/graphics/pokemon/oricorio/pom_pom/overworld.png b/graphics/pokemon/oricorio/pom_pom/overworld.png new file mode 100644 index 000000000000..42f23c505b5d Binary files /dev/null and b/graphics/pokemon/oricorio/pom_pom/overworld.png differ diff --git a/graphics/pokemon/oricorio/pom_pom/overworld_normal.pal b/graphics/pokemon/oricorio/pom_pom/overworld_normal.pal new file mode 100644 index 000000000000..ca737b138752 --- /dev/null +++ b/graphics/pokemon/oricorio/pom_pom/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +115 197 164 +0 0 0 +244 234 66 +175 167 45 +72 58 37 +240 224 112 +161 150 73 +215 201 100 +135 104 106 +105 101 27 +184 142 145 +237 243 238 +87 87 87 +237 183 187 +135 104 106 +255 237 191 diff --git a/graphics/pokemon/oricorio/pom_pom/overworld_shiny.pal b/graphics/pokemon/oricorio/pom_pom/overworld_shiny.pal new file mode 100644 index 000000000000..9b2793d01273 --- /dev/null +++ b/graphics/pokemon/oricorio/pom_pom/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +115 197 164 +0 0 0 +240 240 240 +207 207 207 +72 65 54 +240 224 112 +161 150 73 +215 201 100 +135 135 135 +135 135 135 +184 142 145 +237 243 238 +87 87 87 +246 190 194 +135 104 106 +255 237 191 diff --git a/graphics/pokemon/oricorio/sensu/overworld.png b/graphics/pokemon/oricorio/sensu/overworld.png new file mode 100644 index 000000000000..d321b7820706 Binary files /dev/null and b/graphics/pokemon/oricorio/sensu/overworld.png differ diff --git a/graphics/pokemon/oricorio/sensu/overworld_normal.pal b/graphics/pokemon/oricorio/sensu/overworld_normal.pal new file mode 100644 index 000000000000..715bf6904611 --- /dev/null +++ b/graphics/pokemon/oricorio/sensu/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +115 197 164 +27 64 78 +210 249 248 +55 97 92 +240 230 248 +0 0 0 +162 232 232 +60 61 86 +169 171 225 +148 148 250 +184 142 145 +122 124 160 +246 190 194 +229 177 181 +135 104 106 +72 58 37 diff --git a/graphics/pokemon/oricorio/sensu/overworld_shiny.pal b/graphics/pokemon/oricorio/sensu/overworld_shiny.pal new file mode 100644 index 000000000000..85a6c623baf2 --- /dev/null +++ b/graphics/pokemon/oricorio/sensu/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +115 197 164 +27 64 78 +131 131 241 +48 58 68 +240 230 248 +0 0 0 +148 148 250 +48 58 68 +169 197 225 +148 209 250 +184 142 145 +122 147 160 +246 190 194 +229 177 181 +135 104 106 +72 58 37 diff --git a/graphics/pokemon/pachirisu/overworldf.png b/graphics/pokemon/pachirisu/overworldf.png new file mode 100644 index 000000000000..a2f9c4312005 Binary files /dev/null and b/graphics/pokemon/pachirisu/overworldf.png differ diff --git a/graphics/pokemon/palkia/origin/overworld.png b/graphics/pokemon/palkia/origin/overworld.png index e40c8c6a3f00..65b6491cc232 100644 Binary files a/graphics/pokemon/palkia/origin/overworld.png and b/graphics/pokemon/palkia/origin/overworld.png differ diff --git a/graphics/pokemon/palkia/origin/overworld_normal.pal b/graphics/pokemon/palkia/origin/overworld_normal.pal index 8a6f0c4ab8e6..d437a7405300 100644 --- a/graphics/pokemon/palkia/origin/overworld_normal.pal +++ b/graphics/pokemon/palkia/origin/overworld_normal.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -32 97 0 -0 0 0 -246 80 65 -172 161 180 -255 238 238 -246 161 156 -131 121 148 +115 197 164 +72 76 80 +248 248 248 +176 184 192 +200 216 232 +120 136 144 +136 120 144 16 16 16 -197 190 213 -246 194 189 -164 80 164 -205 137 197 -106 97 24 -222 218 246 -65 72 74 -82 80 90 +208 192 216 +232 216 248 +200 136 192 +240 80 64 +240 160 152 +232 216 248 +160 80 160 +104 96 24 diff --git a/graphics/pokemon/palkia/origin/overworld_shiny.pal b/graphics/pokemon/palkia/origin/overworld_shiny.pal index 8a6f0c4ab8e6..9d2cd643afc7 100644 --- a/graphics/pokemon/palkia/origin/overworld_shiny.pal +++ b/graphics/pokemon/palkia/origin/overworld_shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -32 97 0 -0 0 0 -246 80 65 -172 161 180 -255 238 238 -246 161 156 -131 121 148 +115 197 164 +72 76 80 +248 248 248 +191 175 192 +228 193 232 +137 125 144 +164 120 144 16 16 16 -197 190 213 -246 194 189 -164 80 164 -205 137 197 -106 97 24 -222 218 246 -65 72 74 -82 80 90 +217 183 216 +240 193 248 +224 128 186 +240 80 64 +240 160 152 +251 227 225 +164 120 144 +104 96 24 diff --git a/graphics/pokemon/persian/alolan/overworld.png b/graphics/pokemon/persian/alolan/overworld.png index 94b2269630c1..e97a04815190 100644 Binary files a/graphics/pokemon/persian/alolan/overworld.png and b/graphics/pokemon/persian/alolan/overworld.png differ diff --git a/graphics/pokemon/pikachu/overworldf.png b/graphics/pokemon/pikachu/overworldf.png new file mode 100644 index 000000000000..b354642fe9ef Binary files /dev/null and b/graphics/pokemon/pikachu/overworldf.png differ diff --git a/graphics/pokemon/piloswine/overworldf.png b/graphics/pokemon/piloswine/overworldf.png new file mode 100644 index 000000000000..87459a519d5f Binary files /dev/null and b/graphics/pokemon/piloswine/overworldf.png differ diff --git a/graphics/pokemon/politoed/overworldf.png b/graphics/pokemon/politoed/overworldf.png new file mode 100644 index 000000000000..1c4ad784f980 Binary files /dev/null and b/graphics/pokemon/politoed/overworldf.png differ diff --git a/graphics/pokemon/ponyta/galarian/overworld.png b/graphics/pokemon/ponyta/galarian/overworld.png index 683780312b2b..1c37a3d1af75 100644 Binary files a/graphics/pokemon/ponyta/galarian/overworld.png and b/graphics/pokemon/ponyta/galarian/overworld.png differ diff --git a/graphics/pokemon/ponyta/galarian/overworld_normal.pal b/graphics/pokemon/ponyta/galarian/overworld_normal.pal index 288903139216..d35f7c3b100b 100644 --- a/graphics/pokemon/ponyta/galarian/overworld_normal.pal +++ b/graphics/pokemon/ponyta/galarian/overworld_normal.pal @@ -10,10 +10,10 @@ JASC-PAL 65 113 106 213 153 213 189 186 189 -246 226 172 +72 200 232 238 234 255 0 0 0 106 222 222 115 113 65 -230 186 230 +48 152 168 246 242 222 diff --git a/graphics/pokemon/ponyta/galarian/overworld_shiny.pal b/graphics/pokemon/ponyta/galarian/overworld_shiny.pal index 143612d3ead1..b9846e29d748 100644 --- a/graphics/pokemon/ponyta/galarian/overworld_shiny.pal +++ b/graphics/pokemon/ponyta/galarian/overworld_shiny.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -200 144 48 +199 171 123 131 121 90 32 32 32 192 216 200 -240 200 80 -66 149 97 -248 240 160 +240 219 158 +48 152 168 +247 244 203 189 186 189 -71 180 150 +72 200 232 238 234 255 0 0 0 -128 248 176 -72 88 72 -229 218 105 +106 222 222 +16 16 16 +48 152 168 232 248 240 diff --git a/graphics/pokemon/pumpkaboo/large/overworld.png b/graphics/pokemon/pumpkaboo/large/overworld.png new file mode 100644 index 000000000000..5c9d3e7f9614 Binary files /dev/null and b/graphics/pokemon/pumpkaboo/large/overworld.png differ diff --git a/graphics/pokemon/pumpkaboo/overworld.png b/graphics/pokemon/pumpkaboo/overworld.png index 67542d25d920..07102d06aa97 100644 Binary files a/graphics/pokemon/pumpkaboo/overworld.png and b/graphics/pokemon/pumpkaboo/overworld.png differ diff --git a/graphics/pokemon/pumpkaboo/small/overworld.png b/graphics/pokemon/pumpkaboo/small/overworld.png new file mode 100644 index 000000000000..975796f82a2a Binary files /dev/null and b/graphics/pokemon/pumpkaboo/small/overworld.png differ diff --git a/graphics/pokemon/pumpkaboo/super/overworld.png b/graphics/pokemon/pumpkaboo/super/overworld.png new file mode 100644 index 000000000000..4887049ed923 Binary files /dev/null and b/graphics/pokemon/pumpkaboo/super/overworld.png differ diff --git a/graphics/pokemon/pyroar/followerf.png b/graphics/pokemon/pyroar/followerf.png deleted file mode 100644 index d6163f0f1c5a..000000000000 Binary files a/graphics/pokemon/pyroar/followerf.png and /dev/null differ diff --git a/graphics/pokemon/pyroar/overworldf.png b/graphics/pokemon/pyroar/overworldf.png new file mode 100644 index 000000000000..b4de3bd2f7a8 Binary files /dev/null and b/graphics/pokemon/pyroar/overworldf.png differ diff --git a/graphics/pokemon/quagsire/overworld.png b/graphics/pokemon/quagsire/overworld.png index 21a7622cda57..d0001424a785 100644 Binary files a/graphics/pokemon/quagsire/overworld.png and b/graphics/pokemon/quagsire/overworld.png differ diff --git a/graphics/pokemon/quagsire/overworldf.png b/graphics/pokemon/quagsire/overworldf.png new file mode 100644 index 000000000000..21a7622cda57 Binary files /dev/null and b/graphics/pokemon/quagsire/overworldf.png differ diff --git a/graphics/pokemon/raichu/alolan/overworld_shiny.pal b/graphics/pokemon/raichu/alolan/overworld_shiny.pal index 1d2eb4fe6178..4ea7665b8b8a 100644 --- a/graphics/pokemon/raichu/alolan/overworld_shiny.pal +++ b/graphics/pokemon/raichu/alolan/overworld_shiny.pal @@ -2,16 +2,16 @@ JASC-PAL 0100 16 152 208 160 -112 105 18 -240 225 38 +144 88 40 +248 176 72 0 0 0 -81 54 41 -150 141 24 +168 104 64 +112 40 40 151 117 86 102 68 37 -123 87 56 +136 72 56 112 72 40 -255 239 225 +232 216 176 44 29 27 78 201 201 204 188 174 diff --git a/graphics/pokemon/raichu/overworldf.png b/graphics/pokemon/raichu/overworldf.png new file mode 100644 index 000000000000..1f24d06fec9c Binary files /dev/null and b/graphics/pokemon/raichu/overworldf.png differ diff --git a/graphics/pokemon/rapidash/galarian/overworld.png b/graphics/pokemon/rapidash/galarian/overworld.png index 1271349061dc..f81fceb9b0e5 100644 Binary files a/graphics/pokemon/rapidash/galarian/overworld.png and b/graphics/pokemon/rapidash/galarian/overworld.png differ diff --git a/graphics/pokemon/rapidash/galarian/overworld_shiny.pal b/graphics/pokemon/rapidash/galarian/overworld_shiny.pal index fa425be9b7f7..71b5d50d4815 100644 --- a/graphics/pokemon/rapidash/galarian/overworld_shiny.pal +++ b/graphics/pokemon/rapidash/galarian/overworld_shiny.pal @@ -4,16 +4,16 @@ JASC-PAL 152 208 160 18 2 31 0 24 96 -71 113 111 -107 220 217 -167 235 232 +32 128 120 +56 192 168 +128 224 200 62 62 62 -176 144 32 +176 160 104 245 243 220 -237 237 137 +224 220 175 255 255 255 0 0 0 -233 217 173 -248 248 208 +224 220 175 +247 247 228 232 232 248 230 223 160 diff --git a/graphics/pokemon/raticate/overworldf.png b/graphics/pokemon/raticate/overworldf.png new file mode 100644 index 000000000000..8b0c83e8ae9f Binary files /dev/null and b/graphics/pokemon/raticate/overworldf.png differ diff --git a/graphics/pokemon/rattata/overworldf.png b/graphics/pokemon/rattata/overworldf.png new file mode 100644 index 000000000000..4065e7d8d658 Binary files /dev/null and b/graphics/pokemon/rattata/overworldf.png differ diff --git a/graphics/pokemon/relicanth/overworldf.png b/graphics/pokemon/relicanth/overworldf.png new file mode 100644 index 000000000000..cafb2a0fd05c Binary files /dev/null and b/graphics/pokemon/relicanth/overworldf.png differ diff --git a/graphics/pokemon/rhydon/overworldf.png b/graphics/pokemon/rhydon/overworldf.png new file mode 100644 index 000000000000..39a1d35b64da Binary files /dev/null and b/graphics/pokemon/rhydon/overworldf.png differ diff --git a/graphics/pokemon/rhyhorn/overworldf.png b/graphics/pokemon/rhyhorn/overworldf.png new file mode 100644 index 000000000000..55f1e6f5fb15 Binary files /dev/null and b/graphics/pokemon/rhyhorn/overworldf.png differ diff --git a/graphics/pokemon/rhyperior/overworldf.png b/graphics/pokemon/rhyperior/overworldf.png new file mode 100644 index 000000000000..47cb4fa9d588 Binary files /dev/null and b/graphics/pokemon/rhyperior/overworldf.png differ diff --git a/graphics/pokemon/roselia/overworld.png b/graphics/pokemon/roselia/overworld.png index e648e28ceb08..2dd6d8151436 100644 Binary files a/graphics/pokemon/roselia/overworld.png and b/graphics/pokemon/roselia/overworld.png differ diff --git a/graphics/pokemon/roselia/overworldf.png b/graphics/pokemon/roselia/overworldf.png new file mode 100644 index 000000000000..1ea251f891f0 Binary files /dev/null and b/graphics/pokemon/roselia/overworldf.png differ diff --git a/graphics/pokemon/roserade/overworldf.png b/graphics/pokemon/roserade/overworldf.png new file mode 100644 index 000000000000..9afcd4ecd6a9 Binary files /dev/null and b/graphics/pokemon/roserade/overworldf.png differ diff --git a/graphics/pokemon/sandshrew/alolan/overworld.png b/graphics/pokemon/sandshrew/alolan/overworld.png index 8b6c58a6699a..1ca8f0e17d33 100644 Binary files a/graphics/pokemon/sandshrew/alolan/overworld.png and b/graphics/pokemon/sandshrew/alolan/overworld.png differ diff --git a/graphics/pokemon/sawsbuck/winter/overworld.png b/graphics/pokemon/sawsbuck/winter/overworld.png index 29748fd3e933..7c742bdc7b0e 100644 Binary files a/graphics/pokemon/sawsbuck/winter/overworld.png and b/graphics/pokemon/sawsbuck/winter/overworld.png differ diff --git a/graphics/pokemon/scizor/overworldf.png b/graphics/pokemon/scizor/overworldf.png new file mode 100644 index 000000000000..ee19b5565618 Binary files /dev/null and b/graphics/pokemon/scizor/overworldf.png differ diff --git a/graphics/pokemon/scovillain/overworld.png b/graphics/pokemon/scovillain/overworld.png index a0dcf4043394..6eb5fac3e42c 100644 Binary files a/graphics/pokemon/scovillain/overworld.png and b/graphics/pokemon/scovillain/overworld.png differ diff --git a/graphics/pokemon/scyther/overworldf.png b/graphics/pokemon/scyther/overworldf.png new file mode 100644 index 000000000000..c7a16339f97a Binary files /dev/null and b/graphics/pokemon/scyther/overworldf.png differ diff --git a/graphics/pokemon/seaking/overworldf.png b/graphics/pokemon/seaking/overworldf.png new file mode 100644 index 000000000000..80590bc05341 Binary files /dev/null and b/graphics/pokemon/seaking/overworldf.png differ diff --git a/graphics/pokemon/shaymin/sky/overworld.png b/graphics/pokemon/shaymin/sky/overworld.png new file mode 100644 index 000000000000..0ef9f6a09d14 Binary files /dev/null and b/graphics/pokemon/shaymin/sky/overworld.png differ diff --git a/graphics/pokemon/shaymin/sky/overworld_normal.pal b/graphics/pokemon/shaymin/sky/overworld_normal.pal new file mode 100644 index 000000000000..81840ca69608 --- /dev/null +++ b/graphics/pokemon/shaymin/sky/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +152 208 160 +88 88 112 +176 224 96 +120 168 48 +240 192 0 +240 128 168 +128 128 152 +184 56 56 +248 40 48 +48 152 72 +232 232 248 +168 168 208 +64 64 64 +104 128 0 +40 88 56 +0 0 0 diff --git a/graphics/pokemon/shaymin/sky/overworld_shiny.pal b/graphics/pokemon/shaymin/sky/overworld_shiny.pal new file mode 100644 index 000000000000..391cbc17919d --- /dev/null +++ b/graphics/pokemon/shaymin/sky/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +152 208 160 +88 88 112 +136 208 192 +80 168 152 +240 192 0 +240 128 168 +128 128 152 +184 56 56 +248 40 48 +48 152 72 +232 232 248 +168 168 208 +64 64 64 +104 128 0 +56 104 96 +0 0 0 diff --git a/graphics/pokemon/shiftry/overworld.png b/graphics/pokemon/shiftry/overworld.png index 0d7e72ce99ea..113383d549d9 100644 Binary files a/graphics/pokemon/shiftry/overworld.png and b/graphics/pokemon/shiftry/overworld.png differ diff --git a/graphics/pokemon/shiftry/overworldf.png b/graphics/pokemon/shiftry/overworldf.png new file mode 100644 index 000000000000..0d7e72ce99ea Binary files /dev/null and b/graphics/pokemon/shiftry/overworldf.png differ diff --git a/graphics/pokemon/shinx/overworldf.png b/graphics/pokemon/shinx/overworldf.png new file mode 100644 index 000000000000..74f17d30b524 Binary files /dev/null and b/graphics/pokemon/shinx/overworldf.png differ diff --git a/graphics/pokemon/sliggoo/hisuian/overworld.png b/graphics/pokemon/sliggoo/hisuian/overworld.png index 511b750d83cc..a195d8204726 100644 Binary files a/graphics/pokemon/sliggoo/hisuian/overworld.png and b/graphics/pokemon/sliggoo/hisuian/overworld.png differ diff --git a/graphics/pokemon/sliggoo/hisuian/overworld_normal.pal b/graphics/pokemon/sliggoo/hisuian/overworld_normal.pal index 66b17f5ba276..875167548a1e 100644 --- a/graphics/pokemon/sliggoo/hisuian/overworld_normal.pal +++ b/graphics/pokemon/sliggoo/hisuian/overworld_normal.pal @@ -10,8 +10,8 @@ JASC-PAL 189 148 205 222 197 255 139 82 139 -0 0 0 -0 0 0 +96 156 144 +64 108 96 0 0 0 0 0 0 0 0 0 diff --git a/graphics/pokemon/sliggoo/hisuian/overworld_shiny.pal b/graphics/pokemon/sliggoo/hisuian/overworld_shiny.pal index d9dcb3cab257..3d0290753af5 100644 --- a/graphics/pokemon/sliggoo/hisuian/overworld_shiny.pal +++ b/graphics/pokemon/sliggoo/hisuian/overworld_shiny.pal @@ -10,8 +10,8 @@ JASC-PAL 189 148 205 222 197 255 139 82 139 -0 0 0 -0 0 0 +170 171 96 +134 124 71 0 0 0 0 0 0 0 0 0 diff --git a/graphics/pokemon/slowbro/galarian/overworld.png b/graphics/pokemon/slowbro/galarian/overworld.png index f62e2b3bdd84..b618754adb0c 100644 Binary files a/graphics/pokemon/slowbro/galarian/overworld.png and b/graphics/pokemon/slowbro/galarian/overworld.png differ diff --git a/graphics/pokemon/sneasel/hisuian/overworldf.png b/graphics/pokemon/sneasel/hisuian/overworldf.png new file mode 100644 index 000000000000..f85e643e6259 Binary files /dev/null and b/graphics/pokemon/sneasel/hisuian/overworldf.png differ diff --git a/graphics/pokemon/sneasel/overworldf.png b/graphics/pokemon/sneasel/overworldf.png new file mode 100644 index 000000000000..0929570d64ce Binary files /dev/null and b/graphics/pokemon/sneasel/overworldf.png differ diff --git a/graphics/pokemon/snover/overworldf.png b/graphics/pokemon/snover/overworldf.png new file mode 100644 index 000000000000..74d3c0a15e01 Binary files /dev/null and b/graphics/pokemon/snover/overworldf.png differ diff --git a/graphics/pokemon/staraptor/overworldf.png b/graphics/pokemon/staraptor/overworldf.png new file mode 100644 index 000000000000..0515e2ec685e Binary files /dev/null and b/graphics/pokemon/staraptor/overworldf.png differ diff --git a/graphics/pokemon/staravia/overworldf.png b/graphics/pokemon/staravia/overworldf.png new file mode 100644 index 000000000000..0a023d81c774 Binary files /dev/null and b/graphics/pokemon/staravia/overworldf.png differ diff --git a/graphics/pokemon/starly/overworldf.png b/graphics/pokemon/starly/overworldf.png new file mode 100644 index 000000000000..feb607651504 Binary files /dev/null and b/graphics/pokemon/starly/overworldf.png differ diff --git a/graphics/pokemon/steelix/overworldf.png b/graphics/pokemon/steelix/overworldf.png new file mode 100644 index 000000000000..53a7dc53afb6 Binary files /dev/null and b/graphics/pokemon/steelix/overworldf.png differ diff --git a/graphics/pokemon/sudowoodo/overworldf.png b/graphics/pokemon/sudowoodo/overworldf.png new file mode 100644 index 000000000000..14cea4319d23 Binary files /dev/null and b/graphics/pokemon/sudowoodo/overworldf.png differ diff --git a/graphics/pokemon/swalot/overworld.png b/graphics/pokemon/swalot/overworld.png index 0d0850d8aedc..666f56d7507e 100644 Binary files a/graphics/pokemon/swalot/overworld.png and b/graphics/pokemon/swalot/overworld.png differ diff --git a/graphics/pokemon/swalot/overworldf.png b/graphics/pokemon/swalot/overworldf.png new file mode 100644 index 000000000000..0d0850d8aedc Binary files /dev/null and b/graphics/pokemon/swalot/overworldf.png differ diff --git a/graphics/pokemon/tangrowth/overworldf.png b/graphics/pokemon/tangrowth/overworldf.png new file mode 100644 index 000000000000..b3ab26c6d8ca Binary files /dev/null and b/graphics/pokemon/tangrowth/overworldf.png differ diff --git a/graphics/pokemon/thundurus/therian/overworld.png b/graphics/pokemon/thundurus/therian/overworld.png new file mode 100644 index 000000000000..e8b76b77a177 Binary files /dev/null and b/graphics/pokemon/thundurus/therian/overworld.png differ diff --git a/graphics/pokemon/thundurus/therian/overworld_normal.pal b/graphics/pokemon/thundurus/therian/overworld_normal.pal new file mode 100644 index 000000000000..30e45bed09ea --- /dev/null +++ b/graphics/pokemon/thundurus/therian/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +152 208 160 +77 77 99 +237 237 246 +44 43 44 +198 198 210 +22 38 14 +145 97 201 +164 140 247 +19 82 87 +96 185 218 +78 156 180 +107 192 222 +95 135 105 +168 152 48 +248 224 64 +0 0 0 diff --git a/graphics/pokemon/thundurus/therian/overworld_shiny.pal b/graphics/pokemon/thundurus/therian/overworld_shiny.pal new file mode 100644 index 000000000000..15920a815db1 --- /dev/null +++ b/graphics/pokemon/thundurus/therian/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +152 208 160 +77 77 99 +237 237 246 +44 43 44 +198 198 210 +22 38 14 +144 32 176 +164 140 247 +24 40 72 +128 152 200 +72 96 136 +17 79 81 +128 152 200 +148 144 48 +248 200 112 +0 0 0 diff --git a/graphics/pokemon/tinkatink/overworld.png b/graphics/pokemon/tinkatink/overworld.png index 85e9bf94ee64..bc045052330a 100644 Binary files a/graphics/pokemon/tinkatink/overworld.png and b/graphics/pokemon/tinkatink/overworld.png differ diff --git a/graphics/pokemon/tinkaton/overworld.png b/graphics/pokemon/tinkaton/overworld.png index d34001d5cb2a..382f3b4200e7 100644 Binary files a/graphics/pokemon/tinkaton/overworld.png and b/graphics/pokemon/tinkaton/overworld.png differ diff --git a/graphics/pokemon/tinkatuff/overworld.png b/graphics/pokemon/tinkatuff/overworld.png index 451d70e0301c..e6800214b9e1 100644 Binary files a/graphics/pokemon/tinkatuff/overworld.png and b/graphics/pokemon/tinkatuff/overworld.png differ diff --git a/graphics/pokemon/torchic/overworld.png b/graphics/pokemon/torchic/overworld.png index 5513342c36fb..8cd550ae52ba 100644 Binary files a/graphics/pokemon/torchic/overworld.png and b/graphics/pokemon/torchic/overworld.png differ diff --git a/graphics/pokemon/torchic/overworld_normal.pal b/graphics/pokemon/torchic/overworld_normal.pal index 3fd0cd45f491..37aee0ac45d6 100644 --- a/graphics/pokemon/torchic/overworld_normal.pal +++ b/graphics/pokemon/torchic/overworld_normal.pal @@ -11,7 +11,7 @@ JASC-PAL 208 96 0 248 208 96 232 232 248 -0 0 0 +99 99 99 0 0 0 0 0 0 0 0 0 diff --git a/graphics/pokemon/torchic/overworld_shiny.pal b/graphics/pokemon/torchic/overworld_shiny.pal index 41312ee0f967..bca621cfcb10 100644 --- a/graphics/pokemon/torchic/overworld_shiny.pal +++ b/graphics/pokemon/torchic/overworld_shiny.pal @@ -11,7 +11,7 @@ JASC-PAL 200 168 48 248 208 152 232 232 248 -0 0 0 +99 99 99 0 0 0 0 0 0 0 0 0 diff --git a/graphics/pokemon/torchic/overworldf.png b/graphics/pokemon/torchic/overworldf.png new file mode 100644 index 000000000000..db5074b0019c Binary files /dev/null and b/graphics/pokemon/torchic/overworldf.png differ diff --git a/graphics/pokemon/tornadus/therian/overworld.png b/graphics/pokemon/tornadus/therian/overworld.png new file mode 100644 index 000000000000..9891fba57fb4 Binary files /dev/null and b/graphics/pokemon/tornadus/therian/overworld.png differ diff --git a/graphics/pokemon/tornadus/therian/overworld_normal.pal b/graphics/pokemon/tornadus/therian/overworld_normal.pal new file mode 100644 index 000000000000..2e30907ae2a7 --- /dev/null +++ b/graphics/pokemon/tornadus/therian/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +152 208 160 +81 81 82 +218 218 229 +22 37 14 +216 203 66 +140 124 69 +108 55 149 +128 72 168 +38 37 38 +89 223 46 +215 106 214 +63 168 40 +73 164 46 +216 56 40 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/tornadus/therian/overworld_shiny.pal b/graphics/pokemon/tornadus/therian/overworld_shiny.pal new file mode 100644 index 000000000000..2dc9ab5e7e81 --- /dev/null +++ b/graphics/pokemon/tornadus/therian/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +152 208 160 +38 37 38 +198 198 210 +22 37 14 +213 164 75 +186 116 43 +38 37 38 +72 64 119 +57 80 55 +104 160 24 +72 64 119 +71 144 42 +71 144 42 +216 56 40 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/toxicroak/overworldf.png b/graphics/pokemon/toxicroak/overworldf.png new file mode 100644 index 000000000000..16c53a9b7536 Binary files /dev/null and b/graphics/pokemon/toxicroak/overworldf.png differ diff --git a/graphics/pokemon/toxtricity/low_key/overworld_shiny.pal b/graphics/pokemon/toxtricity/low_key/overworld_shiny.pal index 4ffcb8ad61dd..b562ec57e3ce 100644 --- a/graphics/pokemon/toxtricity/low_key/overworld_shiny.pal +++ b/graphics/pokemon/toxtricity/low_key/overworld_shiny.pal @@ -4,11 +4,11 @@ JASC-PAL 128 128 128 33 46 49 0 0 0 -162 205 214 +144 216 240 26 14 32 -114 150 158 -152 83 187 -97 51 119 +112 152 216 +168 72 104 +112 64 72 255 255 255 132 98 147 167 141 178 diff --git a/graphics/pokemon/typhlosion/hisuian/overworld.png b/graphics/pokemon/typhlosion/hisuian/overworld.png index d98d72059186..b289e6c03386 100644 Binary files a/graphics/pokemon/typhlosion/hisuian/overworld.png and b/graphics/pokemon/typhlosion/hisuian/overworld.png differ diff --git a/graphics/pokemon/typhlosion/hisuian/overworld_shiny.pal b/graphics/pokemon/typhlosion/hisuian/overworld_shiny.pal index c4e051efca40..95ef9e487f71 100644 --- a/graphics/pokemon/typhlosion/hisuian/overworld_shiny.pal +++ b/graphics/pokemon/typhlosion/hisuian/overworld_shiny.pal @@ -6,12 +6,12 @@ JASC-PAL 238 98 230 246 74 106 246 90 164 -74 65 16 -180 180 123 +164 139 74 +255 255 255 0 0 0 24 57 74 57 98 123 -139 131 82 +213 197 115 57 139 172 222 222 172 238 238 255 diff --git a/graphics/pokemon/unfezant/overworld_normalf.pal b/graphics/pokemon/unfezant/overworld_normalf.pal new file mode 100644 index 000000000000..1d5dbfc8282e --- /dev/null +++ b/graphics/pokemon/unfezant/overworld_normalf.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 210 164 +36 36 36 +66 66 66 +0 0 0 +141 141 141 +207 207 207 +159 124 25 +246 187 37 +106 106 106 +51 37 25 +246 187 31 +226 226 246 +141 98 44 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/unfezant/overworld_shinyf.pal b/graphics/pokemon/unfezant/overworld_shinyf.pal new file mode 100644 index 000000000000..db2e72e0eea7 --- /dev/null +++ b/graphics/pokemon/unfezant/overworld_shinyf.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 210 164 +32 32 24 +88 64 40 +0 0 0 +168 160 128 +200 200 176 +160 120 64 +246 187 37 +106 106 106 +51 37 25 +248 184 0 +226 226 246 +248 152 32 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/unfezant/followerf.png b/graphics/pokemon/unfezant/overworldf.png similarity index 100% rename from graphics/pokemon/unfezant/followerf.png rename to graphics/pokemon/unfezant/overworldf.png diff --git a/graphics/pokemon/unfezant_f/overworld.png b/graphics/pokemon/unfezant_f/overworld.png deleted file mode 100644 index ae5e096b4bc2..000000000000 Binary files a/graphics/pokemon/unfezant_f/overworld.png and /dev/null differ diff --git a/graphics/pokemon/ursaring/overworldf.png b/graphics/pokemon/ursaring/overworldf.png new file mode 100644 index 000000000000..f36f7c4cdeab Binary files /dev/null and b/graphics/pokemon/ursaring/overworldf.png differ diff --git a/graphics/pokemon/venusaur/overworldf.png b/graphics/pokemon/venusaur/overworldf.png new file mode 100644 index 000000000000..d58b1c7c3872 Binary files /dev/null and b/graphics/pokemon/venusaur/overworldf.png differ diff --git a/graphics/pokemon/vileplume/overworldf.png b/graphics/pokemon/vileplume/overworldf.png new file mode 100644 index 000000000000..9cf8512f7dc6 Binary files /dev/null and b/graphics/pokemon/vileplume/overworldf.png differ diff --git a/graphics/pokemon/vulpix/alolan/overworld.png b/graphics/pokemon/vulpix/alolan/overworld.png index 2557ae031421..74211d12c3df 100644 Binary files a/graphics/pokemon/vulpix/alolan/overworld.png and b/graphics/pokemon/vulpix/alolan/overworld.png differ diff --git a/graphics/pokemon/weavile/overworldf.png b/graphics/pokemon/weavile/overworldf.png new file mode 100644 index 000000000000..4e844665065d Binary files /dev/null and b/graphics/pokemon/weavile/overworldf.png differ diff --git a/graphics/pokemon/wobbuffet/overworld.png b/graphics/pokemon/wobbuffet/overworld.png index 04b136113566..eddc7af72de3 100644 Binary files a/graphics/pokemon/wobbuffet/overworld.png and b/graphics/pokemon/wobbuffet/overworld.png differ diff --git a/graphics/pokemon/wobbuffet/overworld_normal.pal b/graphics/pokemon/wobbuffet/overworld_normal.pal index 208392f976f7..393b4da868aa 100644 --- a/graphics/pokemon/wobbuffet/overworld_normal.pal +++ b/graphics/pokemon/wobbuffet/overworld_normal.pal @@ -10,8 +10,8 @@ JASC-PAL 32 48 64 56 80 112 168 184 208 -0 0 0 -0 0 0 +208 56 24 +136 24 0 0 0 0 0 0 0 0 0 0 diff --git a/graphics/pokemon/wobbuffet/overworld_shiny.pal b/graphics/pokemon/wobbuffet/overworld_shiny.pal index 126ef8e8c9e0..4db78ef302b7 100644 --- a/graphics/pokemon/wobbuffet/overworld_shiny.pal +++ b/graphics/pokemon/wobbuffet/overworld_shiny.pal @@ -10,8 +10,8 @@ JASC-PAL 32 48 64 56 80 112 168 184 208 -0 0 0 -0 0 0 +208 56 24 +136 24 0 0 0 0 0 0 0 0 0 0 diff --git a/graphics/pokemon/wobbuffet/overworldf.png b/graphics/pokemon/wobbuffet/overworldf.png new file mode 100644 index 000000000000..36dee1d36cd7 Binary files /dev/null and b/graphics/pokemon/wobbuffet/overworldf.png differ diff --git a/graphics/pokemon/wooper/overworldf.png b/graphics/pokemon/wooper/overworldf.png new file mode 100644 index 000000000000..50ab4d9a7008 Binary files /dev/null and b/graphics/pokemon/wooper/overworldf.png differ diff --git a/graphics/pokemon/xatu/overworld.png b/graphics/pokemon/xatu/overworld.png index 223ef9309826..a1a6ae917632 100644 Binary files a/graphics/pokemon/xatu/overworld.png and b/graphics/pokemon/xatu/overworld.png differ diff --git a/graphics/pokemon/xatu/overworldf.png b/graphics/pokemon/xatu/overworldf.png new file mode 100644 index 000000000000..223ef9309826 Binary files /dev/null and b/graphics/pokemon/xatu/overworldf.png differ diff --git a/graphics/pokemon/zubat/overworld.png b/graphics/pokemon/zubat/overworld.png index cd1ba2a2ca0b..ea7569268e96 100644 Binary files a/graphics/pokemon/zubat/overworld.png and b/graphics/pokemon/zubat/overworld.png differ diff --git a/graphics/pokemon/zubat/overworldf.png b/graphics/pokemon/zubat/overworldf.png new file mode 100644 index 000000000000..cd1ba2a2ca0b Binary files /dev/null and b/graphics/pokemon/zubat/overworldf.png differ diff --git a/graphics/pokemon/zygarde/10_percent/overworld.png b/graphics/pokemon/zygarde/10_percent/overworld.png new file mode 100644 index 000000000000..1b72c1eeef3c Binary files /dev/null and b/graphics/pokemon/zygarde/10_percent/overworld.png differ diff --git a/graphics/pokemon/zygarde/10_percent/overworld_normal.pal b/graphics/pokemon/zygarde/10_percent/overworld_normal.pal new file mode 100644 index 000000000000..d084071aa575 --- /dev/null +++ b/graphics/pokemon/zygarde/10_percent/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +115 197 164 +0 0 0 +82 97 80 +55 65 54 +12 45 2 +21 26 21 +222 253 213 +138 217 32 +24 82 33 +41 49 40 +67 155 30 +21 26 21 +254 141 141 +41 49 40 +254 82 82 +0 0 0 diff --git a/graphics/pokemon/zygarde/10_percent/overworld_shiny.pal b/graphics/pokemon/zygarde/10_percent/overworld_shiny.pal new file mode 100644 index 000000000000..5ea188226b89 --- /dev/null +++ b/graphics/pokemon/zygarde/10_percent/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +115 197 164 +29 29 29 +222 222 216 +162 162 152 +23 47 41 +29 29 29 +116 248 213 +68 216 176 +40 117 95 +29 29 29 +54 154 127 +0 0 0 +254 141 141 +136 136 136 +254 82 82 +0 0 0 diff --git a/graphics/pokemon/zygarde/complete/overworld.png b/graphics/pokemon/zygarde/complete/overworld.png new file mode 100644 index 000000000000..6b7303c36e57 Binary files /dev/null and b/graphics/pokemon/zygarde/complete/overworld.png differ diff --git a/graphics/pokemon/zygarde/complete/overworld_normal.pal b/graphics/pokemon/zygarde/complete/overworld_normal.pal new file mode 100644 index 000000000000..c70f440e11de --- /dev/null +++ b/graphics/pokemon/zygarde/complete/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +115 197 164 +46 45 45 +8 8 8 +89 89 83 +25 22 22 +176 216 88 +59 58 58 +248 248 248 +120 144 64 +122 122 115 +16 15 15 +80 152 216 +232 64 88 +232 176 64 +144 208 248 +41 49 22 diff --git a/graphics/pokemon/zygarde/complete/overworld_shiny.pal b/graphics/pokemon/zygarde/complete/overworld_shiny.pal new file mode 100644 index 000000000000..9f9a249ea740 --- /dev/null +++ b/graphics/pokemon/zygarde/complete/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +115 197 164 +86 84 84 +8 8 8 +197 197 187 +61 61 61 +90 194 166 +135 134 134 +248 248 248 +69 139 120 +235 235 230 +135 134 134 +80 152 216 +232 64 88 +232 176 64 +144 208 248 +23 47 41 diff --git a/graphics/rayquaza_scene/scene_3/rayquaza_tail.png b/graphics/rayquaza_scene/scene_3/rayquaza_tail.png index 7e0577df1556..796548e56a83 100644 Binary files a/graphics/rayquaza_scene/scene_3/rayquaza_tail.png and b/graphics/rayquaza_scene/scene_3/rayquaza_tail.png differ diff --git a/graphics_file_rules.mk b/graphics_file_rules.mk index 1b514b8ed3ed..06316ea6a98f 100644 --- a/graphics_file_rules.mk +++ b/graphics_file_rules.mk @@ -393,10 +393,6 @@ $(RAYQUAZAGFXDIR)/scene_2/bg.4bpp: %.4bpp: %.png $(RAYQUAZAGFXDIR)/scene_3/rayquaza.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 124 -Wnum_tiles -$(RAYQUAZAGFXDIR)/scene_3/rayquaza_tail_fix.4bpp: $(RAYQUAZAGFXDIR)/scene_3/rayquaza_tail.4bpp - cp $< $@ - head -c 12 /dev/zero >> $@ - $(RAYQUAZAGFXDIR)/scene_4/streaks.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 19 -Wnum_tiles diff --git a/include/battle.h b/include/battle.h index 7ccbcfbfe43a..894b74ffde6c 100644 --- a/include/battle.h +++ b/include/battle.h @@ -93,7 +93,7 @@ struct ResourceFlags #define RESOURCE_FLAG_ROOST 0x2 #define RESOURCE_FLAG_UNBURDEN 0x4 #define RESOURCE_FLAG_UNUSED 0x8 -#define RESOURCE_FLAG_TRACED 0x10 +#define RESOURCE_FLAG_UNUSED_2 0x10 #define RESOURCE_FLAG_EMERGENCY_EXIT 0x20 #define RESOURCE_FLAG_NEUTRALIZING_GAS 0x40 #define RESOURCE_FLAG_ICE_FACE 0x80 @@ -184,9 +184,9 @@ struct ProtectStruct u32 powderSelfDmg:1; u32 usedThroatChopPreventedMove:1; u32 statRaised:1; - u32 usedMicleBerry:1; u32 usedCustapBerry:1; // also quick claw u32 touchedProtectLike:1; + u32 unused:1; // End of 32-bit bitfield u16 disableEjectPack:1; u16 statFell:1; @@ -201,10 +201,13 @@ struct ProtectStruct u16 eatMirrorHerb:1; u16 activateOpportunist:2; // 2 - to copy stats. 1 - stats copied (do not repeat). 0 - no stats to copy u16 usedAllySwitch:1; + u16 padding:2; + // End of 16-bit bitfield u32 physicalDmg; u32 specialDmg; u8 physicalBattlerId; u8 specialBattlerId; + }; struct SpecialStatus @@ -366,11 +369,16 @@ struct AiLogicData u8 effectiveness[MAX_BATTLERS_COUNT][MAX_BATTLERS_COUNT][MAX_MON_MOVES]; // attacker, target, moveIndex u8 moveAccuracy[MAX_BATTLERS_COUNT][MAX_BATTLERS_COUNT][MAX_MON_MOVES]; // attacker, target, moveIndex u8 moveLimitations[MAX_BATTLERS_COUNT]; - bool8 shouldSwitchMon; // Because all available moves have no/little effect. Each bit per battler. + u8 shouldSwitchIfBadMoves; // Because all available moves have no/little effect. Each bit per battler. u8 monToSwitchId[MAX_BATTLERS_COUNT]; // ID of the mon to switch. - bool8 weatherHasEffect; // The same as WEATHER_HAS_EFFECT. Stored here, so it's called only once. u8 mostSuitableMonId[MAX_BATTLERS_COUNT]; // Stores result of GetMostSuitableMonToSwitchInto, which decides which generic mon the AI would switch into if they decide to switch. This can be overruled by specific mons found in ShouldSwitch; the final resulting mon is stored in AI_monToSwitchIntoId. struct SwitchinCandidate switchinCandidate; // Struct used for deciding which mon to switch to in battle_ai_switch_items.c + u8 weatherHasEffect:1; // The same as WEATHER_HAS_EFFECT. Stored here, so it's called only once. + u8 ejectButtonSwitch:1; // Tracks whether current switch out was from Eject Button + u8 ejectPackSwitch:1; // Tracks whether current switch out was from Eject Pack + u8 padding:5; + u8 shouldSwitch; // Stores result of ShouldSwitch, which decides whether a mon should be switched out + u8 aiCalcInProgress:1; }; struct AI_ThinkingStruct @@ -709,7 +717,6 @@ struct BattleStruct } multiBuffer; u8 wishPerishSongState; u8 wishPerishSongBattlerId; - u8 aiCalcInProgress:1; u8 overworldWeatherDone:1; u8 startingStatusDone:1; u8 isAtkCancelerForCalledMove:1; // Certain cases in atk canceler should only be checked once, when the original move is called, however others need to be checked the twice. @@ -768,6 +775,7 @@ struct BattleStruct u8 blunderPolicy:1; // should blunder policy activate u8 swapDamageCategory:1; // Photon Geyser, Shell Side Arm, Light That Burns the Sky u8 bouncedMoveIsUsed:1; + u8 snatchedMoveIsUsed:1; u8 descriptionSubmenu:1; // For Move Description window in move selection screen u8 ackBallUseBtn:1; // Used for the last used ball feature u8 ballSwapped:1; // Used for the last used ball feature @@ -816,9 +824,14 @@ struct BattleStruct u8 boosterEnergyActivates; u8 distortedTypeMatchups; u8 categoryOverride; // for Z-Moves and Max Moves + u8 commandingDondozo; + u16 commanderActive[NUM_BATTLE_SIDES]; u32 stellarBoostFlags[NUM_BATTLE_SIDES]; // stored as a bitfield of flags for all types for each side u8 fickleBeamBoosted:1; u8 obedienceResult:3; + u8 padding:4; + u8 usedEjectItem; + u8 usedMicleBerry; }; // The palaceFlags member of struct BattleStruct contains 1 flag per move to indicate which moves the AI should consider, @@ -1081,6 +1094,7 @@ extern u16 gLastPrintedMoves[MAX_BATTLERS_COUNT]; extern u16 gLastMoves[MAX_BATTLERS_COUNT]; extern u16 gLastLandedMoves[MAX_BATTLERS_COUNT]; extern u16 gLastHitByType[MAX_BATTLERS_COUNT]; +extern u16 gLastUsedMoveType[MAX_BATTLERS_COUNT]; extern u16 gLastResultingMoves[MAX_BATTLERS_COUNT]; extern u16 gLockedMoves[MAX_BATTLERS_COUNT]; extern u16 gLastUsedMove; diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 5fecdd5f47e8..a3cd38293b0c 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -15,6 +15,13 @@ enum DamageRollType DMG_ROLL_HIGHEST, }; +enum AIPivot +{ + DONT_PIVOT, + CAN_TRY_PIVOT, + SHOULD_PIVOT, +}; + bool32 AI_IsFaster(u32 battlerAi, u32 battlerDef, u32 move); bool32 AI_IsSlower(u32 battlerAi, u32 battlerDef, u32 move); bool32 AI_RandLessThan(u32 val); @@ -31,6 +38,7 @@ void RecordItemEffectBattle(u32 battlerId, u32 itemEffect); void ClearBattlerItemEffectHistory(u32 battlerId); void SaveBattlerData(u32 battlerId); void SetBattlerData(u32 battlerId); +void SetBattlerAiData(u32 battlerId, struct AiLogicData *aiData); void RestoreBattlerData(u32 battlerId); u32 GetAIChosenMove(u32 battlerId); u32 GetTotalBaseStat(u32 species); @@ -51,8 +59,6 @@ bool32 DoesBattlerIgnoreAbilityChecks(u32 atkAbility, u32 move); u32 AI_GetWeather(struct AiLogicData *aiData); bool32 CanAIFaintTarget(u32 battlerAtk, u32 battlerDef, u32 numHits); bool32 CanIndexMoveFaintTarget(u32 battlerAtk, u32 battlerDef, u32 index, u32 numHits); -bool32 AI_IsTerrainAffected(u32 battlerId, u32 flags); -bool32 AI_IsBattlerGrounded(u32 battlerId); bool32 HasDamagingMove(u32 battlerId); bool32 HasDamagingMoveOfType(u32 battlerId, u32 type); u32 GetBattlerSecondaryDamage(u32 battlerId); @@ -64,7 +70,7 @@ u32 GetBattlerSideSpeedAverage(u32 battler); bool32 ShouldAbsorb(u32 battlerAtk, u32 battlerDef, u32 move, s32 damage); bool32 ShouldRecover(u32 battlerAtk, u32 battlerDef, u32 move, u32 healPercent); bool32 ShouldSetScreen(u32 battlerAtk, u32 battlerDef, u32 moveEffect); -bool32 ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 moveIndex); +enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 moveIndex); bool32 IsRecycleEncouragedItem(u32 item); bool32 ShouldRestoreHpBerry(u32 battlerAtk, u32 item); bool32 IsStatBoostingBerry(u32 item); @@ -79,7 +85,6 @@ bool32 AnyStatIsRaised(u32 battlerId); bool32 ShouldLowerStat(u32 battler, u32 battlerAbility, u32 stat); bool32 BattlerStatCanRise(u32 battler, u32 battlerAbility, u32 stat); bool32 AreBattlersStatsMaxed(u32 battler); -bool32 BattlerHasAnyStatRaised(u32 battlerId); u32 CountPositiveStatStages(u32 battlerId); u32 CountNegativeStatStages(u32 battlerId); bool32 ShouldLowerAttack(u32 battlerAtk, u32 battlerDef, u32 defAbility); @@ -119,7 +124,6 @@ bool32 HasMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef, u32 accCheck, bool bool32 HasAnyKnownMove(u32 battlerId); bool32 IsAromaVeilProtectedMove(u32 move); bool32 IsNonVolatileStatusMoveEffect(u32 moveEffect); -bool32 IsStatLoweringMoveEffect(u32 moveEffect); bool32 IsMoveRedirectionPrevented(u32 move, u32 atkAbility); bool32 IsMoveEncouragedToHit(u32 battlerAtk, u32 battlerDef, u32 move); bool32 IsHazardMoveEffect(u32 moveEffect); @@ -140,6 +144,7 @@ bool32 HasThawingMove(u32 battler); bool32 IsStatRaisingEffect(u32 effect); bool32 IsStatLoweringEffect(u32 effect); bool32 IsSelfStatLoweringEffect(u32 effect); +bool32 IsSwitchOutEffect(u32 effect); bool32 IsAttackBoostMoveEffect(u32 effect); bool32 IsUngroundingEffect(u32 effect); bool32 IsSemiInvulnerable(u32 battlerDef, u32 move); @@ -171,7 +176,6 @@ bool32 AI_IsBattlerAsleepOrComatose(u32 battlerId); #define IS_TARGETING_PARTNER(battlerAtk, battlerDef)((battlerAtk) == (battlerDef ^ BIT_FLANK)) u32 GetAllyChosenMove(u32 battlerId); bool32 IsValidDoubleBattle(u32 battlerAtk); -bool32 IsTargetingPartner(u32 battlerAtk, u32 battlerDef); bool32 DoesPartnerHaveSameMoveEffect(u32 battlerAtkPartner, u32 battlerDef, u32 move, u32 partnerMove); bool32 PartnerHasSameMoveEffectWithoutTarget(u32 battlerAtkPartner, u32 move, u32 partnerMove); bool32 PartnerMoveEffectIsStatusSameTarget(u32 battlerAtkPartner, u32 battlerDef, u32 partnerMove); @@ -201,6 +205,7 @@ void IncreaseConfusionScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score void IncreaseFrostbiteScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score); s32 AI_CalcPartyMonDamage(u32 move, u32 battlerAtk, u32 battlerDef, struct BattlePokemon switchinCandidate, bool32 isPartyMonAttacker, enum DamageRollType rollType); +u32 AI_WhoStrikesFirstPartyMon(u32 battlerAtk, u32 battlerDef, struct BattlePokemon switchinCandidate, u32 moveConsidered); s32 AI_TryToClearStats(u32 battlerAtk, u32 battlerDef, bool32 isDoubleBattle); bool32 AI_ShouldCopyStatChanges(u32 battlerAtk, u32 battlerDef); bool32 AI_ShouldSetUpHazards(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData); diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index 4f1593d4d821..7326647d419d 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -57,6 +57,8 @@ bool32 IsMoveNotAllowedInSkyBattles(u32 move); bool32 DoSwitchInAbilities(u32 battlerId); u8 GetFirstFaintedPartyIndex(u8 battlerId); bool32 IsMoveAffectedByParentalBond(u32 move, u32 battler); +void SaveBattlerTarget(u32 battler); +void SaveBattlerAttacker(u32 battler); extern void (* const gBattleScriptingCommandsTable[])(void); extern const struct StatFractions gAccuracyStageRatios[]; diff --git a/include/battle_scripts.h b/include/battle_scripts.h index fb1e72af247f..9e2fb84485f8 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -166,7 +166,6 @@ extern const u8 BattleScript_ItemSteal[]; extern const u8 BattleScript_DrizzleActivates[]; extern const u8 BattleScript_SpeedBoostActivates[]; extern const u8 BattleScript_TraceActivates[]; -extern const u8 BattleScript_TraceActivatesEnd3[]; extern const u8 BattleScript_RainDishActivates[]; extern const u8 BattleScript_SandstreamActivates[]; extern const u8 BattleScript_ShedSkinActivates[]; @@ -329,6 +328,7 @@ extern const u8 BattleScript_ProteanActivates[]; extern const u8 BattleScript_DazzlingProtected[]; extern const u8 BattleScript_MoveUsedPsychicTerrainPrevents[]; extern const u8 BattleScript_MoveUsedPowder[]; +extern const u8 BattleScript_ZMoveActivatePowder[]; extern const u8 BattleScript_SelectingNotAllowedStuffCheeks[]; extern const u8 BattleScript_SelectingNotAllowedStuffCheeksInPalace[]; extern const u8 BattleScript_SelectingNotAllowedBelch[]; @@ -412,6 +412,7 @@ extern const u8 BattleScript_BattlerGotOverItsInfatuation[]; extern const u8 BattleScript_Pickpocket[]; extern const u8 BattleScript_StickyBarbTransfer[]; extern const u8 BattleScript_AttackerItemStatRaise[]; +extern const u8 BattleScript_RedCardActivationNoSwitch[]; extern const u8 BattleScript_RedCardActivates[]; extern const u8 BattleScript_EjectButtonActivates[]; extern const u8 BattleScript_EjectPackActivate_Ret[]; @@ -459,6 +460,7 @@ extern const u8 BattleScript_DefDownSpeedUp[]; extern const u8 BattleScript_AffectionBasedStatusHeal[]; extern const u8 BattleScript_AffectionBasedEndurance[]; extern const u8 BattleScript_SymbiosisActivates[]; +extern const u8 BattleScript_ScaleShot[]; extern const u8 BattleScript_MultiHitPrintStrings[]; extern const u8 BattleScript_RemoveFireType[]; extern const u8 BattleScript_TargetAbilityStatRaiseRet[]; @@ -476,6 +478,7 @@ extern const u8 BattleScript_CudChewActivates[]; extern const u8 BattleScript_SupremeOverlordActivates[]; extern const u8 BattleScript_CostarActivates[]; extern const u8 BattleScript_ZeroToHeroActivates[]; +extern const u8 BattleScript_CommanderActivates[]; extern const u8 BattleScript_HospitalityActivates[]; extern const u8 BattleScript_ToxicDebrisActivates[]; extern const u8 BattleScript_EarthEaterActivates[]; diff --git a/include/battle_util.h b/include/battle_util.h index 82f49da52565..504c3be3ad1b 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -20,6 +20,23 @@ #define MOVE_LIMITATION_PLACEHOLDER (1 << 15) #define MOVE_LIMITATIONS_ALL 0xFFFF +enum MoveBlocked +{ + MOVE_BLOCKED_BY_NO_ABILITY, + MOVE_BLOCKED_BY_SOUNDPROOF_OR_BULLETPROOF, + MOVE_BLOCKED_BY_DAZZLING, + MOVE_BLOCKED_BY_PARTNER_DAZZLING, + MOVE_BLOCKED_BY_GOOD_AS_GOLD, +}; + +enum MoveAbsorbed +{ + MOVE_ABSORBED_BY_NO_ABILITY, + MOVE_ABSORBED_BY_DRAIN_HP_ABILITY, + MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY, + MOVE_ABSORBED_BY_BOOST_FLASH_FIRE, +}; + enum { ABILITYEFFECT_ON_SWITCHIN, ABILITYEFFECT_ENDTURN, @@ -161,6 +178,9 @@ void SetAtkCancellerForCalledMove(void); u8 AtkCanceller_UnableToUseMove2(void); bool32 HasNoMonsToSwitch(u32 battler, u8 r1, u8 r2); bool32 TryChangeBattleWeather(u32 battler, u32 weatherEnumId, bool32 viaAbility); +u32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 move, u32 abilityDef); +u32 CanPartnerAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 move, u32 abilityDef); +u32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 move, u32 moveType); u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 moveArg); bool32 TryPrimalReversion(u32 battler); bool32 IsNeutralizingGasOnField(void); @@ -256,7 +276,7 @@ bool32 MoveHasAdditionalEffectSelf(u32 move, u32 moveEffect); bool32 MoveHasAdditionalEffectSelfArg(u32 move, u32 moveEffect, u32 argument); bool32 MoveHasChargeTurnAdditionalEffect(u32 move); bool32 CanTargetPartner(u32 battlerAtk, u32 battlerDef); -bool32 TargetFullyImmuneToCurrMove(u32 BattlerAtk, u32 battlerDef); +bool32 TargetFullyImmuneToCurrMove(u32 battlerAtk, u32 battlerDef); bool32 CanBeSlept(u32 battler, u32 ability); bool32 CanBePoisoned(u32 battlerAtk, u32 battlerDef, u32 defAbility); diff --git a/include/level_caps.h b/include/caps.h similarity index 68% rename from include/level_caps.h rename to include/caps.h index c4554080797a..f6dd61b632fd 100644 --- a/include/level_caps.h +++ b/include/caps.h @@ -1,5 +1,5 @@ -#ifndef GUARD_LEVEL_CAP_H -#define GUARD_LEVEL_CAP_H +#ifndef GUARD_CAPS_H +#define GUARD_CAPS_H #if B_EXP_CAP_TYPE != EXP_CAP_NONE && B_EXP_CAP_TYPE != EXP_CAP_HARD && B_EXP_CAP_TYPE != EXP_CAP_SOFT #error "Invalid choice for B_EXP_CAP_TYPE, must be of [EXP_CAP_NONE, EXP_CAP_HARD, EXP_CAP_SOFT]" @@ -14,7 +14,12 @@ #endif #endif +#if B_EV_CAP_TYPE != EV_CAP_NONE && B_EV_CAP_TYPE != EV_CAP_FLAG_LIST && B_EV_CAP_TYPE != EV_CAP_VARIABLE && B_EV_CAP_TYPE != EV_CAP_NO_GAIN +#error "Invalid choice for B_EV_CAP_TYPE, must be one of [EV_CAP_NONE, EV_CAP_FLAG_LIST, EV_CAP_VARIABLE, EV_CAP_NO_GAIN]" +#endif + u32 GetCurrentLevelCap(void); u32 GetSoftLevelCapExpValue(u32 level, u32 expValue); +u32 GetCurrentEVCap(void); -#endif /* GUARD_LEVEL_CAP_H */ +#endif /* GUARD_CAPS_H */ diff --git a/include/config/battle.h b/include/config/battle.h index c29563781bea..fd3ada3b00f1 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -69,6 +69,7 @@ #define B_RECOIL_IF_MISS_DMG GEN_LATEST // In Gen5+, Jump Kick and High Jump Kick will always do half of the user's max HP when missing. #define B_KLUTZ_FLING_INTERACTION GEN_LATEST // In Gen5+, Pokémon with the Klutz ability can't use Fling. #define B_UPDATED_CONVERSION GEN_LATEST // In Gen6+, Conversion changes the user's type to match their first move's. Before, it would choose a move at random. +#define B_UPDATED_CONVERSION_2 GEN_LATEST // In Gen5+, Conversion 2 changes the user's type to a type that resists the last move used by the selected target. Before, it would consider the last move being successfully hit by. Additionally, Struggle is considered Normal type before Gen 5. #define B_PP_REDUCED_BY_SPITE GEN_LATEST // In Gen4+, Spite reduces the foe's last move's PP by 4, instead of 2 to 5. #define B_EXTRAPOLATED_MOVE_FLAGS TRUE // Adds move flags to moves that they don't officially have but would likely have if they were in the latest core series game. @@ -121,6 +122,9 @@ #define B_KNOCK_OFF_REMOVAL GEN_LATEST // In Gen5+, Knock Off removes the foe's item instead of rendering it unusable. #define B_HEAL_BELL_SOUNDPROOF GEN_LATEST // In Gen5, Heal Bell affects all mons with Soundproof. In Gen6-8 it affects inactive mons, but not battlers. In Gen9 it always affects the user. #define B_CHARGE GEN_LATEST // In Gen8-, Charge status is lost regardless of the typing of the next move. +#define B_POWDER_RAIN GEN_LATEST // In Gen7+, Powder doesn't damage the user of a Fire type move in heavy rain. +#define B_AFTER_YOU_TURN_ORDER GEN_LATEST // In Gen8+, After You doesn't fail if the turn order wouldn't change after use. +#define B_QUASH_TURN_ORDER GEN_LATEST // In Gen8+, Quash-affected battlers move according to speed order. Before Gen8, Quash-affected battlers move in the order they were affected by Quash. // Ability settings #define B_ABILITY_WEATHER GEN_LATEST // In Gen6+, ability-induced weather lasts 5 turns. Before, it lasted until the battle ended or until it was changed by a move or a different weather-affecting ability. @@ -162,7 +166,7 @@ #define B_RESTORE_HELD_BATTLE_ITEMS GEN_LATEST // In Gen9, all non-berry items are restored after battle. #define B_SOUL_DEW_BOOST GEN_LATEST // In Gens3-6, Soul Dew boosts Latis' Sp. Atk and Sp. Def. In Gen7+ it boosts the power of their Psychic and Dragon type moves instead. #define B_NET_BALL_MODIFIER GEN_LATEST // In Gen7+, Net Ball's catch multiplier is x5 instead of x3. -#define B_DIVE_BALL_MODIFIER GEN_LATEST // In Gen4+, Dive Ball's effectiveness increases by when Surfing or Fishing. +#define B_DIVE_BALL_MODIFIER GEN_LATEST // In Gen4+, Dive Ball's effectiveness increases by x3.5 when Surfing or Fishing. #define B_NEST_BALL_MODIFIER GEN_LATEST // Nest Ball's formula varies depending on the Gen. See Cmd_handleballthrow. #define B_REPEAT_BALL_MODIFIER GEN_LATEST // In Gen7+, Repeat Ball's catch multiplier is x3.5 instead of x3. #define B_TIMER_BALL_MODIFIER GEN_LATEST // In Gen5+, Timer Ball's effectiveness increases by x0.3 per turn instead of x0.1 diff --git a/include/config/level_caps.h b/include/config/caps.h similarity index 55% rename from include/config/level_caps.h rename to include/config/caps.h index e8d7b8818e05..2debe442cf14 100644 --- a/include/config/level_caps.h +++ b/include/config/caps.h @@ -1,7 +1,7 @@ -#ifndef GUARD_CONFIG_LEVEL_CAP_H -#define GUARD_CONFIG_LEVEL_CAP_H +#ifndef GUARD_CONFIG_CAPS_H +#define GUARD_CONFIG_CAPS_H -// Constants +// Level Cap Constants #define EXP_CAP_NONE 0 // Regular behavior, no level caps are applied #define EXP_CAP_HARD 1 // Pokémon with a level >= the level cap cannot gain any experience #define EXP_CAP_SOFT 2 // Pokémon with a level >= the level cap will gain reduced experience @@ -10,7 +10,7 @@ #define LEVEL_CAP_FLAG_LIST 1 // Level cap is chosen according to the first unset flag in `sLevelCapFlagMap` #define LEVEL_CAP_VARIABLE 2 // Level cap is chosen according to the contents of the event variable specified by B_LEVEL_CAP_VARIABLE -// Configs +// Level Cap Configs #define B_EXP_CAP_TYPE EXP_CAP_NONE // [EXP_CAP_NONE, EXP_CAP_HARD, EXP_CAP_SOFT] choose the type of level cap to apply #define B_LEVEL_CAP_TYPE LEVEL_CAP_NONE // [LEVEL_CAP_NONE, LEVEL_CAP_FLAG_LIST, LEVEL_CAP_VARIABLE] choose the method to derive the level cap #define B_LEVEL_CAP_VARIABLE 0 // event variable used to derive level cap if B_LEVEL_CAP_TYPE is set to LEVEL_CAP_VARIABLE @@ -18,4 +18,16 @@ #define B_RARE_CANDY_CAP FALSE // If set to true, Rare Candies can't be used to go over the level cap #define B_LEVEL_CAP_EXP_UP FALSE // If set to true, mons under level cap will receive more experience -#endif /* GUARD_CONFIG_LEVEL_CAP_H */ +// EV Cap Constants +#define EV_CAP_NONE 0 // Regular behavior, no EV caps are applied +#define EV_CAP_FLAG_LIST 1 // EV cap is chosen according to the first unset flag in `sEVCapFlagMap` +#define EV_CAP_VARIABLE 2 // EV cap is chosen according to the contents of the event variable specified by B_EV_CAP_VARIABLE +#define EV_CAP_NO_GAIN 3 // No EVs can be gained + +// EV Cap Configs +#define B_EV_CAP_TYPE EV_CAP_NONE // [EV_CAP_NONE, EV_CAP_FLAG_LIST, EV_CAP_VARIABLE, EV_CAP_NO_GAIN] choose the type of EV cap to apply#define B_EV_CAP_VARIABLE 12 // event variable used to derive EV cap if B_EV_CAP_TYPE is set to EV_CAP_VARIABLE +#define B_EV_CAP_VARIABLE 8 // event variable used to derive EV cap if B_EV_CAP_TYPE is set to EV_CAP_VARIABLE + +#define B_EV_ITEMS_CAP FALSE // If set to true, EV-boosting items can't be used to go over the EV cap + +#endif /* GUARD_CONFIG_CAPS_H */ diff --git a/include/config/ev_caps.h b/include/config/ev_caps.h deleted file mode 100644 index 0513ff086ed7..000000000000 --- a/include/config/ev_caps.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef GUARD_CONFIG_EV_CAP_H -#define GUARD_CONFIG_EV_CAP_H - -// Constants for EV Cap Types -#define EV_CAP_NONE 0 // Regular behavior, no EV caps are applied -#define EV_CAP_FLAG_LIST 1 // EV cap is chosen according to the first unset flag in `sEVCapFlagMap` -#define EV_CAP_VARIABLE 2 // EV cap is chosen according to the contents of the event variable specified by B_EV_CAP_VARIABLE -#define EV_CAP_NO_GAIN 3 // No EVs can be gained - -// Configs for EV Cap -#define B_EV_CAP_TYPE EV_CAP_NONE // [EV_CAP_NONE, EV_CAP_FLAG_LIST, EV_CAP_VARIABLE, EV_CAP_NO_GAIN] choose the type of EV cap to apply#define B_EV_CAP_VARIABLE 12 // event variable used to derive EV cap if B_EV_CAP_TYPE is set to EV_CAP_VARIABLE -#define B_EV_CAP_VARIABLE 8 // event variable used to derive EV cap if B_EV_CAP_TYPE is set to EV_CAP_VARIABLE - -#define B_EV_ITEMS_CAP FALSE // If set to true, EV-boosting items can't be used to go over the EV cap - -#endif /*GUARD_CONFIG_EV_CAP_H*/ diff --git a/include/config/overworld.h b/include/config/overworld.h index cd1f2ace4046..dd109b71048b 100644 --- a/include/config/overworld.h +++ b/include/config/overworld.h @@ -4,6 +4,7 @@ // Movement config #define OW_RUNNING_INDOORS GEN_LATEST // In Gen4+, players are allowed to run indoors. #define OW_AUTO_SIGNPOST FALSE // When enabled, if the tile that the player is facing has MB_SIGNPOST, MB_POKEMART_SIGN, or MB_POKEMON_CENTER_SIGN, the player will automatically read the signpost, as seen in FRLG. +#define SLOW_MOVEMENT_ON_STAIRS FALSE // If enabled, the player will move slower up/down stairs like in FR // Other settings #define OW_POISON_DAMAGE GEN_LATEST // In Gen4, Pokémon no longer faint from Poison in the overworld. In Gen5+, they no longer take damage at all. @@ -51,6 +52,7 @@ // Compressed gfx are incompatible with non-power-of-two sprite sizes: // (You should not use 48x48 sprites/tables for compressed gfx) // 16x32, 32x32, 64x64 etc are fine +#define OW_MON_WANDER_WALK TRUE // If true, OW pokemon with MOVEMENT_TYPE_WANDER will walk-in-place in between steps. // Follower Pokémon #define OW_FOLLOWERS_ENABLED FALSE // Enables follower Pokémon, HGSS style. Requires OW_POKEMON_OBJECT_EVENTS. Note that additional scripting may be required for them to be fully supported! #define OW_FOLLOWERS_BOBBING TRUE // If true, follower pokemon will bob up and down during their idle & walking animations @@ -87,7 +89,7 @@ // Map pop-up config #define OW_POPUP_GENERATION GEN_3 // Different generations display location names in overworld pop-ups differently. - // Only choies are currently GEN_3 and GEN_5, all others will default to Gen3 pop-ups. + // Only choices are currently GEN_3 and GEN_5, all others will default to Gen3 pop-ups. // Gen5 map pop-up config // Constants @@ -104,6 +106,8 @@ #define OW_POPUP_BW_ALPHA_BLEND FALSE // Enables alpha blending/transparency for the pop-ups. Mainly intended to be used with the black color option. // Pokémon Center -#define OW_IGNORE_EGGS_ON_HEAL GEN_LATEST // In Gen 4+, the nurse in the Pokémon Center does not heal Eggs on healing machine. +#define OW_IGNORE_EGGS_ON_HEAL GEN_LATEST // In Gen 4+, the nurse in the Pokémon Center does not heal Eggs on healing machine. +#define OW_UNION_DISABLE_CHECK FALSE // When TRUE, the nurse does not inform the player if there is a trainer waiting in the Union Room. This speeds up the loading of the Pokémon Center. +#define OW_FLAG_MOVE_UNION_ROOM_CHECK 0 // If this flag is set, the game will only check if players are in the Union Room while healing Pokémon, and not when players enter the Pokémon Center. This speeds up the loading of the Pokémon Center. This is ignored if OW_UNION_DISABLE_CHECK is TRUE. #endif // GUARD_CONFIG_OVERWORLD_H diff --git a/include/config/pokemon.h b/include/config/pokemon.h index 15db4881b551..cabaea2c7c57 100644 --- a/include/config/pokemon.h +++ b/include/config/pokemon.h @@ -22,15 +22,16 @@ #define P_FRIENDSHIP_EVO_THRESHOLD GEN_LATEST // Since Gen 8, Pokémon that evolve by friendship evolve at or above 160 friendship instead of 220. // Breeding settings -#define P_NIDORAN_M_DITTO_BREED GEN_LATEST // Since Gen 5, when Nidoran♂ breeds with Ditto it can produce Nidoran♀ offspring. Before, it would only yield male offspring. This change also applies to Volbeat. -#define P_INCENSE_BREEDING GEN_LATEST // Since Gen 9, cross-generation Baby Pokémon don't require Incense being held by the parents to be obtained via breeding. -#define P_EGG_HATCH_LEVEL GEN_LATEST // Since Gen 4, Pokémon will hatch from eggs at level 1 instead of 5. -#define P_BALL_INHERITING GEN_LATEST // Since Gen 6, Eggs from the Daycare will inherit the Poké Ball from their mother. From Gen 7 onwards, the father can pass it down as well, as long as it's of the same species as the mother. -#define P_TM_INHERITANCE GEN_LATEST // Since Gen 6, the father no longer passes down TMs to the baby. -#define P_MOTHER_EGG_MOVE_INHERITANCE GEN_LATEST // Since Gen 6, the mother can also pass down Egg Moves. -#define P_NATURE_INHERITANCE GEN_LATEST // In Gen 3, Everstone grants Ditto and mothers a 50% chance to pass on Nature. Since Gen 4, anyone can pass on nature. Since Gen 5, the chance is 100%. -#define P_ABILITY_INHERITANCE GEN_LATEST // In B2W2, a female Pokémon has an 80% chance of passing down their ability if bred with a male. Since Gen 6, the chance is 80% for normal ability and 60% for Hidden Ability, and anyone can pass down their abilities if bred with Ditto. NOTE: BW's effect: 60% chance to pass down HA and random for normal ability has been omitted. -#define P_EGG_MOVE_TRANSFER GEN_LATEST // Starting in Gen 8, if two Pokémon of the same species are together in the Daycare, one knows an Egg Move, and the other has an empty slot, the other Pokémon will receive the Egg Move in the empty slot. In Gen 9, if a Pokémon holds a Mirror Herb, it will receive Egg Moves from the other regardless of species. +#define P_NIDORAN_M_DITTO_BREED GEN_LATEST // Since Gen 5, when Nidoran♂ breeds with Ditto it can produce Nidoran♀ offspring. Before, it would only yield male offspring. This change also applies to Volbeat. +#define P_INCENSE_BREEDING GEN_LATEST // Since Gen 9, cross-generation Baby Pokémon don't require Incense being held by the parents to be obtained via breeding. +#define P_EGG_HATCH_LEVEL GEN_LATEST // Since Gen 4, Pokémon will hatch from eggs at level 1 instead of 5. +#define P_BALL_INHERITING GEN_LATEST // Since Gen 6, Eggs from the Daycare will inherit the Poké Ball from their mother. From Gen 7 onwards, the father can pass it down as well, as long as it's of the same species as the mother. +#define P_TM_INHERITANCE GEN_LATEST // Since Gen 6, the father no longer passes down TMs to the baby. +#define P_MOTHER_EGG_MOVE_INHERITANCE GEN_LATEST // Since Gen 6, the mother can also pass down Egg Moves. +#define P_NATURE_INHERITANCE GEN_LATEST // In Gen 3, Everstone grants Ditto and mothers a 50% chance to pass on Nature. Since Gen 4, anyone can pass on nature. Since Gen 5, the chance is 100%. +#define P_ABILITY_INHERITANCE GEN_LATEST // In B2W2, a female Pokémon has an 80% chance of passing down their ability if bred with a male. Since Gen 6, the chance is 80% for normal ability and 60% for Hidden Ability, and anyone can pass down their abilities if bred with Ditto. NOTE: BW's effect: 60% chance to pass down HA and random for normal ability has been omitted. +#define P_EGG_MOVE_TRANSFER GEN_LATEST // Starting in Gen 8, if two Pokémon of the same species are together in the Daycare, one knows an Egg Move, and the other has an empty slot, the other Pokémon will receive the Egg Move in the empty slot. In Gen 9, if a Pokémon holds a Mirror Herb, it will receive Egg Moves from the other regardless of species. +#define P_SCATTERBUG_LINE_FORM_BREED SPECIES_SCATTERBUG_FANCY // Choose the Scatterbug form all Vivillon/Spewpa/Scatterbug will breed into, basically aligning with the "location" of the player's game. // Species-specific settings #define P_SHEDINJA_BALL GEN_LATEST // Since Gen 4, Shedinja requires a Poké Ball for its evolution. In Gen 3, Shedinja inherits Nincada's Ball. diff --git a/include/constants/battle.h b/include/constants/battle.h index f9800ef4b3aa..560448159ab5 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -166,7 +166,7 @@ #define STATUS3_YAWN_TURN(num) (((num) << 11) & STATUS3_YAWN) #define STATUS3_IMPRISONED_OTHERS (1 << 13) #define STATUS3_GRUDGE (1 << 14) -#define STATUS3___UNUSED (1 << 15) +#define STATUS3_COMMANDER (1 << 15) #define STATUS3_GASTRO_ACID (1 << 16) #define STATUS3_EMBARGO (1 << 17) #define STATUS3_UNDERWATER (1 << 18) @@ -183,7 +183,8 @@ #define STATUS3_LASER_FOCUS (1 << 29) #define STATUS3_POWER_TRICK (1 << 30) #define STATUS3_SKY_DROPPED (1 << 31) // Target of Sky Drop -#define STATUS3_SEMI_INVULNERABLE (STATUS3_UNDERGROUND | STATUS3_ON_AIR | STATUS3_UNDERWATER | STATUS3_PHANTOM_FORCE) +#define STATUS3_SEMI_INVULNERABLE_NO_COMMANDER (STATUS3_UNDERGROUND | STATUS3_ON_AIR | STATUS3_UNDERWATER | STATUS3_PHANTOM_FORCE) // Exception for Transform / Imposter +#define STATUS3_SEMI_INVULNERABLE (STATUS3_SEMI_INVULNERABLE_NO_COMMANDER | STATUS3_COMMANDER) #define STATUS4_ELECTRIFIED (1 << 0) #define STATUS4_MUD_SPORT (1 << 1) // Only used if B_SPORT_TURNS < GEN_6 @@ -401,8 +402,9 @@ #define MOVE_EFFECT_SECRET_POWER 77 #define MOVE_EFFECT_PSYCHIC_NOISE 78 #define MOVE_EFFECT_TERA_BLAST 79 +#define MOVE_EFFECT_ORDER_UP 80 -#define NUM_MOVE_EFFECTS 80 +#define NUM_MOVE_EFFECTS 81 #define MOVE_EFFECT_AFFECTS_USER 0x2000 #define MOVE_EFFECT_CERTAIN 0x4000 diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index 4601b452a2fa..00253642473d 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -416,6 +416,7 @@ #define ANIM_TAG_BEAM (ANIM_SPRITES_START + 402) #define ANIM_TAG_RED_EXPLOSION (ANIM_SPRITES_START + 403) #define ANIM_TAG_PURPLE_CHAIN (ANIM_SPRITES_START + 404) +#define ANIM_TAG_PINKVIO_ORB (ANIM_SPRITES_START + 405) // battlers #define ANIM_ATTACKER 0 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 5da278110f2c..770e773f806d 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -354,6 +354,7 @@ enum { EFFECT_DRAGON_DARTS, EFFECT_GUARDIAN_OF_ALOLA, EFFECT_SHELL_SIDE_ARM, + EFFECT_ORDER_UP, NUM_BATTLE_MOVE_EFFECTS, }; diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 156eeda61357..3476dc5ef2ce 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -265,46 +265,50 @@ #define PARTY_SCREEN_OPTIONAL (1 << 7) // Flag for first argument to openpartyscreen // cases for Cmd_moveend -#define MOVEEND_SUM_DAMAGE 0 -#define MOVEEND_PROTECT_LIKE_EFFECT 1 -#define MOVEEND_RAGE 2 -#define MOVEEND_SYNCHRONIZE_TARGET 3 -#define MOVEEND_ABILITIES 4 -#define MOVEEND_ABILITIES_ATTACKER 5 -#define MOVEEND_STATUS_IMMUNITY_ABILITIES 6 -#define MOVEEND_SYNCHRONIZE_ATTACKER 7 -#define MOVEEND_CHOICE_MOVE 8 -#define MOVEEND_ATTACKER_INVISIBLE 9 -#define MOVEEND_ATTACKER_VISIBLE 10 -#define MOVEEND_TARGET_VISIBLE 11 -#define MOVEEND_ITEM_EFFECTS_TARGET 12 -#define MOVEEND_MOVE_EFFECTS2 13 -#define MOVEEND_ITEM_EFFECTS_ALL 14 -#define MOVEEND_KINGSROCK 15 // These item effects will occur each strike of a multi-hit move -#define MOVEEND_NUM_HITS 16 -#define MOVEEND_SUBSTITUTE 17 -#define MOVEEND_SKY_DROP_CONFUSE 18 -#define MOVEEND_UPDATE_LAST_MOVES 19 -#define MOVEEND_MIRROR_MOVE 20 -#define MOVEEND_NEXT_TARGET 21 // Everything up until here is handled for each strike of a multi-hit move -#define MOVEEND_MULTIHIT_MOVE 22 -#define MOVEEND_DEFROST 23 -#define MOVEEND_RECOIL 24 -#define MOVEEND_MAGICIAN 25 // Occurs after final multi-hit strike, and after other items/abilities would activate -#define MOVEEND_EJECT_ITEMS 26 -#define MOVEEND_WHITE_HERB 27 -#define MOVEEND_RED_CARD 28 -#define MOVEEND_LIFEORB_SHELLBELL 29 // Includes shell bell, throat spray, etc -#define MOVEEND_CHANGED_ITEMS 30 -#define MOVEEND_PICKPOCKET 31 -#define MOVEEND_DANCER 32 -#define MOVEEND_EMERGENCY_EXIT 33 -#define MOVEEND_SYMBIOSIS 34 -#define MOVEEND_OPPORTUNIST 35 // Occurs after other stat change items/abilities to try and copy the boosts -#define MOVEEND_SAME_MOVE_TURNS 36 -#define MOVEEND_SET_EVOLUTION_TRACKER 37 -#define MOVEEND_CLEAR_BITS 38 -#define MOVEEND_COUNT 39 +enum MoveEndEffects +{ + MOVEEND_SUM_DAMAGE, + MOVEEND_PROTECT_LIKE_EFFECT, + MOVEEND_RAGE, + MOVEEND_SYNCHRONIZE_TARGET, + MOVEEND_ABILITIES, + MOVEEND_ABILITIES_ATTACKER, + MOVEEND_STATUS_IMMUNITY_ABILITIES, + MOVEEND_SYNCHRONIZE_ATTACKER, + MOVEEND_CHOICE_MOVE, + MOVEEND_ATTACKER_INVISIBLE, + MOVEEND_ATTACKER_VISIBLE, + MOVEEND_TARGET_VISIBLE, + MOVEEND_ITEM_EFFECTS_TARGET, + MOVEEND_MOVE_EFFECTS2, + MOVEEND_ITEM_EFFECTS_ALL, + MOVEEND_KINGSROCK, // These item effects will occur each strike of a multi-hit move + MOVEEND_NUM_HITS, + MOVEEND_SUBSTITUTE, + MOVEEND_SKY_DROP_CONFUSE, + MOVEEND_UPDATE_LAST_MOVES, + MOVEEND_MIRROR_MOVE, + MOVEEND_NEXT_TARGET, // Everything up until here is handled for each strike of a multi-hit move + MOVEEND_MULTIHIT_MOVE, + MOVEEND_DEFROST, + MOVEEND_RECOIL, + MOVEEND_ITEM_EFFECTS_ATTACKER, + MOVEEND_MAGICIAN, // Occurs after final multi-hit strike, and after other items/abilities would activate + MOVEEND_EJECT_ITEMS, + MOVEEND_WHITE_HERB, + MOVEEND_RED_CARD, + MOVEEND_LIFEORB_SHELLBELL, // Includes shell bell, throat spray, etc + MOVEEND_CHANGED_ITEMS, + MOVEEND_PICKPOCKET, + MOVEEND_DANCER, + MOVEEND_EMERGENCY_EXIT, + MOVEEND_SYMBIOSIS, + MOVEEND_OPPORTUNIST, // Occurs after other stat change items/abilities to try and copy the boosts + MOVEEND_SAME_MOVE_TURNS, + MOVEEND_SET_EVOLUTION_TRACKER, + MOVEEND_CLEAR_BITS, + MOVEEND_COUNT, +}; // switch cases #define B_SWITCH_NORMAL 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 9fbb70a22397..1cb56573911a 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -712,8 +712,12 @@ #define STRINGID_FOGLIFTED 710 #define STRINGID_PKMNMADESHELLGLEAM 711 #define STRINGID_FICKLEBEAMDOUBLED 712 +#define STRINGID_COMMANDERACTIVATES 713 +#define STRINGID_POKEFLUTECATCHY 714 +#define STRINGID_POKEFLUTE 715 +#define STRINGID_MONHEARINGFLUTEAWOKE 716 -#define BATTLESTRINGS_COUNT 713 +#define BATTLESTRINGS_COUNT 717 // This is the string id that gBattleStringsTable starts with. // String ids before this (e.g. STRINGID_INTROMSG) are not in the table, diff --git a/include/constants/cries.h b/include/constants/cries.h index 3213f62d3fba..ca1529bbdfa3 100644 --- a/include/constants/cries.h +++ b/include/constants/cries.h @@ -1636,7 +1636,7 @@ enum { #if P_FAMILY_FLABEBE CRY_FLABEBE, CRY_FLOETTE, - CRY_FLOETTE_ETERNAL_FLOWER, + CRY_FLOETTE_ETERNAL, CRY_FLORGES, #endif //P_FAMILY_FLABEBE #if P_FAMILY_SKIDDO @@ -2084,12 +2084,12 @@ enum { CRY_STONJOURNER, #endif //P_FAMILY_STONJOURNER #if P_FAMILY_EISCUE - CRY_EISCUE_ICE_FACE, + CRY_EISCUE_ICE, CRY_EISCUE_NOICE_FACE, #endif //P_FAMILY_EISCUE #if P_FAMILY_INDEEDEE - CRY_INDEEDEE_MALE, - CRY_INDEEDEE_FEMALE, + CRY_INDEEDEE_M, + CRY_INDEEDEE_F, #endif //P_FAMILY_INDEEDEE #if P_FAMILY_MORPEKO CRY_MORPEKO_FULL_BELLY, @@ -2123,11 +2123,11 @@ enum { CRY_DRAGAPULT, #endif //P_FAMILY_DREEPY #if P_FAMILY_ZACIAN - CRY_ZACIAN_HERO_OF_MANY_BATTLES, + CRY_ZACIAN_HERO, CRY_ZACIAN_CROWNED_SWORD, #endif //P_FAMILY_ZACIAN #if P_FAMILY_ZAMAZENTA - CRY_ZAMAZENTA_HERO_OF_MANY_BATTLES, + CRY_ZAMAZENTA_HERO, CRY_ZAMAZENTA_CROWNED_SHIELD, #endif //P_FAMILY_ZAMAZENTA #if P_FAMILY_ETERNATUS @@ -2182,8 +2182,8 @@ enum { #endif //P_FAMILY_QUAXLY #if P_FAMILY_LECHONK CRY_LECHONK, - CRY_OINKOLOGNE_MALE, - CRY_OINKOLOGNE_FEMALE, + CRY_OINKOLOGNE_M, + CRY_OINKOLOGNE_F, #endif //P_FAMILY_LECHONK #if P_FAMILY_TAROUNTULA CRY_TAROUNTULA, diff --git a/include/constants/event_object_movement.h b/include/constants/event_object_movement.h index e7641f982602..650a6a2357c4 100755 --- a/include/constants/event_object_movement.h +++ b/include/constants/event_object_movement.h @@ -247,6 +247,10 @@ #define MOVEMENT_ACTION_EMOTE_DOUBLE_EXCL_MARK 0x9F #define MOVEMENT_ACTION_EXIT_POKEBALL 0xA0 #define MOVEMENT_ACTION_ENTER_POKEBALL 0xA1 +#define MOVEMENT_ACTION_RUN_DOWN_SLOW 0xA2 // slow running for rocky stairs +#define MOVEMENT_ACTION_RUN_UP_SLOW 0xA3 +#define MOVEMENT_ACTION_RUN_LEFT_SLOW 0xA4 +#define MOVEMENT_ACTION_RUN_RIGHT_SLOW 0xA5 #define MOVEMENT_ACTION_STEP_END 0xFE #define MOVEMENT_ACTION_NONE 0xFF diff --git a/include/constants/event_objects.h b/include/constants/event_objects.h index 07853a69a836..8891ab27fbe4 100644 --- a/include/constants/event_objects.h +++ b/include/constants/event_objects.h @@ -281,6 +281,9 @@ #define OW_SPECIES(x) (((x)->graphicsId & OBJ_EVENT_GFX_SPECIES_MASK) - OBJ_EVENT_GFX_MON_BASE) #define OW_FORM(x) ((x)->graphicsId >> OBJ_EVENT_GFX_SPECIES_BITS) +// Whether Object Event is an OW pokemon +#define IS_OW_MON_OBJ(obj) ((obj)->graphicsId >= OBJ_EVENT_GFX_MON_BASE) + #define SHADOW_SIZE_S 0 #define SHADOW_SIZE_M 1 #define SHADOW_SIZE_L 2 diff --git a/include/constants/expansion.h b/include/constants/expansion.h index 72a48652425e..327a502e22db 100644 --- a/include/constants/expansion.h +++ b/include/constants/expansion.h @@ -1,7 +1,7 @@ #ifndef GUARD_CONSTANTS_EXPANSION_H #define GUARD_CONSTANTS_EXPANSION_H -// 1.10.0 +// Last version: 1.9.3 #define EXPANSION_VERSION_MAJOR 1 #define EXPANSION_VERSION_MINOR 10 #define EXPANSION_VERSION_PATCH 0 diff --git a/include/constants/global.h b/include/constants/global.h index a4623c9d8ba5..89508e374d82 100644 --- a/include/constants/global.h +++ b/include/constants/global.h @@ -5,10 +5,9 @@ #include "config/battle.h" #include "config/debug.h" #include "config/item.h" -#include "config/level_caps.h" +#include "config/caps.h" #include "config/pokemon.h" #include "config/overworld.h" -#include "config/ev_caps.h" // Invalid Versions show as "----------" in Gen 4 and Gen 5's summary screen. // In Gens 6 and 7, invalid versions instead show "a distant land" in the summary screen. diff --git a/include/constants/hold_effects.h b/include/constants/hold_effects.h index 0f364d2462cf..c85ec8230203 100644 --- a/include/constants/hold_effects.h +++ b/include/constants/hold_effects.h @@ -1,170 +1,167 @@ #ifndef GUARD_HOLD_EFFECTS_H #define GUARD_HOLD_EFFECTS_H -#define HOLD_EFFECT_NONE 0 -#define HOLD_EFFECT_RESTORE_HP 1 -#define HOLD_EFFECT_CURE_PAR 2 -#define HOLD_EFFECT_CURE_SLP 3 -#define HOLD_EFFECT_CURE_PSN 4 -#define HOLD_EFFECT_CURE_BRN 5 -#define HOLD_EFFECT_CURE_FRZ 6 -#define HOLD_EFFECT_RESTORE_PP 7 -#define HOLD_EFFECT_CURE_CONFUSION 8 -#define HOLD_EFFECT_CURE_STATUS 9 -#define HOLD_EFFECT_CONFUSE_SPICY 10 -#define HOLD_EFFECT_CONFUSE_DRY 11 -#define HOLD_EFFECT_CONFUSE_SWEET 12 -#define HOLD_EFFECT_CONFUSE_BITTER 13 -#define HOLD_EFFECT_CONFUSE_SOUR 14 -#define HOLD_EFFECT_ATTACK_UP 15 -#define HOLD_EFFECT_DEFENSE_UP 16 -#define HOLD_EFFECT_SPEED_UP 17 -#define HOLD_EFFECT_SP_ATTACK_UP 18 -#define HOLD_EFFECT_SP_DEFENSE_UP 19 -#define HOLD_EFFECT_CRITICAL_UP 20 -#define HOLD_EFFECT_RANDOM_STAT_UP 21 -#define HOLD_EFFECT_EVASION_UP 22 -#define HOLD_EFFECT_RESTORE_STATS 23 -#define HOLD_EFFECT_MACHO_BRACE 24 -#define HOLD_EFFECT_EXP_SHARE 25 -#define HOLD_EFFECT_QUICK_CLAW 26 -#define HOLD_EFFECT_FRIENDSHIP_UP 27 -#define HOLD_EFFECT_MENTAL_HERB 28 -#define HOLD_EFFECT_CHOICE_BAND 29 -#define HOLD_EFFECT_FLINCH 30 -#define HOLD_EFFECT_BUG_POWER 31 -#define HOLD_EFFECT_DOUBLE_PRIZE 32 -#define HOLD_EFFECT_REPEL 33 -#define HOLD_EFFECT_SOUL_DEW 34 -#define HOLD_EFFECT_DEEP_SEA_TOOTH 35 -#define HOLD_EFFECT_DEEP_SEA_SCALE 36 -#define HOLD_EFFECT_CAN_ALWAYS_RUN 37 -#define HOLD_EFFECT_PREVENT_EVOLVE 38 -#define HOLD_EFFECT_FOCUS_BAND 39 -#define HOLD_EFFECT_LUCKY_EGG 40 -#define HOLD_EFFECT_SCOPE_LENS 41 -#define HOLD_EFFECT_STEEL_POWER 42 -#define HOLD_EFFECT_LEFTOVERS 43 -#define HOLD_EFFECT_DRAGON_SCALE 44 -#define HOLD_EFFECT_LIGHT_BALL 45 -#define HOLD_EFFECT_GROUND_POWER 46 -#define HOLD_EFFECT_ROCK_POWER 47 -#define HOLD_EFFECT_GRASS_POWER 48 -#define HOLD_EFFECT_DARK_POWER 49 -#define HOLD_EFFECT_FIGHTING_POWER 50 -#define HOLD_EFFECT_ELECTRIC_POWER 51 -#define HOLD_EFFECT_WATER_POWER 52 -#define HOLD_EFFECT_FLYING_POWER 53 -#define HOLD_EFFECT_POISON_POWER 54 -#define HOLD_EFFECT_ICE_POWER 55 -#define HOLD_EFFECT_GHOST_POWER 56 -#define HOLD_EFFECT_PSYCHIC_POWER 57 -#define HOLD_EFFECT_FIRE_POWER 58 -#define HOLD_EFFECT_DRAGON_POWER 59 -#define HOLD_EFFECT_NORMAL_POWER 60 -#define HOLD_EFFECT_UPGRADE 61 -#define HOLD_EFFECT_SHELL_BELL 62 -#define HOLD_EFFECT_LUCKY_PUNCH 63 -#define HOLD_EFFECT_METAL_POWDER 64 -#define HOLD_EFFECT_THICK_CLUB 65 -#define HOLD_EFFECT_LEEK 66 +enum ItemHoldEffect +{ + HOLD_EFFECT_NONE, + HOLD_EFFECT_RESTORE_HP, + HOLD_EFFECT_CURE_PAR, + HOLD_EFFECT_CURE_SLP, + HOLD_EFFECT_CURE_PSN, + HOLD_EFFECT_CURE_BRN, + HOLD_EFFECT_CURE_FRZ, + HOLD_EFFECT_RESTORE_PP, + HOLD_EFFECT_CURE_CONFUSION, + HOLD_EFFECT_CURE_STATUS, + HOLD_EFFECT_CONFUSE_SPICY, + HOLD_EFFECT_CONFUSE_DRY, + HOLD_EFFECT_CONFUSE_SWEET, + HOLD_EFFECT_CONFUSE_BITTER, + HOLD_EFFECT_CONFUSE_SOUR, + HOLD_EFFECT_ATTACK_UP, + HOLD_EFFECT_DEFENSE_UP, + HOLD_EFFECT_SPEED_UP, + HOLD_EFFECT_SP_ATTACK_UP, + HOLD_EFFECT_SP_DEFENSE_UP, + HOLD_EFFECT_CRITICAL_UP, + HOLD_EFFECT_RANDOM_STAT_UP, + HOLD_EFFECT_EVASION_UP, + HOLD_EFFECT_RESTORE_STATS, + HOLD_EFFECT_MACHO_BRACE, + HOLD_EFFECT_EXP_SHARE, + HOLD_EFFECT_QUICK_CLAW, + HOLD_EFFECT_FRIENDSHIP_UP, + HOLD_EFFECT_MENTAL_HERB, + HOLD_EFFECT_CHOICE_BAND, + HOLD_EFFECT_FLINCH, + HOLD_EFFECT_BUG_POWER, + HOLD_EFFECT_DOUBLE_PRIZE, + HOLD_EFFECT_REPEL, + HOLD_EFFECT_SOUL_DEW, + HOLD_EFFECT_DEEP_SEA_TOOTH, + HOLD_EFFECT_DEEP_SEA_SCALE, + HOLD_EFFECT_CAN_ALWAYS_RUN, + HOLD_EFFECT_PREVENT_EVOLVE, + HOLD_EFFECT_FOCUS_BAND, + HOLD_EFFECT_LUCKY_EGG, + HOLD_EFFECT_SCOPE_LENS, + HOLD_EFFECT_STEEL_POWER, + HOLD_EFFECT_LEFTOVERS, + HOLD_EFFECT_DRAGON_SCALE, + HOLD_EFFECT_LIGHT_BALL, + HOLD_EFFECT_GROUND_POWER, + HOLD_EFFECT_ROCK_POWER, + HOLD_EFFECT_GRASS_POWER, + HOLD_EFFECT_DARK_POWER, + HOLD_EFFECT_FIGHTING_POWER, + HOLD_EFFECT_ELECTRIC_POWER, + HOLD_EFFECT_WATER_POWER, + HOLD_EFFECT_FLYING_POWER, + HOLD_EFFECT_POISON_POWER, + HOLD_EFFECT_ICE_POWER, + HOLD_EFFECT_GHOST_POWER, + HOLD_EFFECT_PSYCHIC_POWER, + HOLD_EFFECT_FIRE_POWER, + HOLD_EFFECT_DRAGON_POWER, + HOLD_EFFECT_NORMAL_POWER, + HOLD_EFFECT_UPGRADE, + HOLD_EFFECT_SHELL_BELL, + HOLD_EFFECT_LUCKY_PUNCH, + HOLD_EFFECT_METAL_POWDER, + HOLD_EFFECT_THICK_CLUB, + HOLD_EFFECT_LEEK, + // Gen4 hold effects. + HOLD_EFFECT_CHOICE_SCARF, + HOLD_EFFECT_CHOICE_SPECS, + HOLD_EFFECT_DAMP_ROCK, + HOLD_EFFECT_GRIP_CLAW, + HOLD_EFFECT_HEAT_ROCK, + HOLD_EFFECT_ICY_ROCK, + HOLD_EFFECT_LIGHT_CLAY, + HOLD_EFFECT_SMOOTH_ROCK, + HOLD_EFFECT_POWER_HERB, + HOLD_EFFECT_BIG_ROOT, + HOLD_EFFECT_EXPERT_BELT, + HOLD_EFFECT_LIFE_ORB, + HOLD_EFFECT_METRONOME, + HOLD_EFFECT_MUSCLE_BAND, + HOLD_EFFECT_WIDE_LENS, + HOLD_EFFECT_WISE_GLASSES, + HOLD_EFFECT_ZOOM_LENS, + HOLD_EFFECT_LAGGING_TAIL, + HOLD_EFFECT_FOCUS_SASH, + HOLD_EFFECT_FLAME_ORB, + HOLD_EFFECT_TOXIC_ORB, + HOLD_EFFECT_STICKY_BARB, + HOLD_EFFECT_IRON_BALL, + HOLD_EFFECT_BLACK_SLUDGE, + HOLD_EFFECT_DESTINY_KNOT, + HOLD_EFFECT_SHED_SHELL, + HOLD_EFFECT_QUICK_POWDER, + HOLD_EFFECT_ADAMANT_ORB, + HOLD_EFFECT_LUSTROUS_ORB, + HOLD_EFFECT_GRISEOUS_ORB, + HOLD_EFFECT_ENIGMA_BERRY, + HOLD_EFFECT_RESIST_BERRY, + HOLD_EFFECT_POWER_ITEM, + HOLD_EFFECT_RESTORE_PCT_HP, + HOLD_EFFECT_MICLE_BERRY, + HOLD_EFFECT_CUSTAP_BERRY, + HOLD_EFFECT_JABOCA_BERRY, + HOLD_EFFECT_ROWAP_BERRY, + HOLD_EFFECT_KEE_BERRY, + HOLD_EFFECT_MARANGA_BERRY, + HOLD_EFFECT_PLATE, + // Gen5 hold effects + HOLD_EFFECT_FLOAT_STONE, + HOLD_EFFECT_EVIOLITE, + HOLD_EFFECT_ASSAULT_VEST, + HOLD_EFFECT_DRIVE, + HOLD_EFFECT_GEMS, + HOLD_EFFECT_ROCKY_HELMET, + HOLD_EFFECT_AIR_BALLOON, + HOLD_EFFECT_RED_CARD, + HOLD_EFFECT_RING_TARGET, + HOLD_EFFECT_BINDING_BAND, + HOLD_EFFECT_EJECT_BUTTON, + HOLD_EFFECT_ABSORB_BULB, + HOLD_EFFECT_CELL_BATTERY, + // Gen6 hold effects + HOLD_EFFECT_FAIRY_POWER, + HOLD_EFFECT_MEGA_STONE, + HOLD_EFFECT_SAFETY_GOGGLES, + HOLD_EFFECT_LUMINOUS_MOSS, + HOLD_EFFECT_SNOWBALL, + HOLD_EFFECT_WEAKNESS_POLICY, + HOLD_EFFECT_PRIMAL_ORB, + // Gen7 hold effects + HOLD_EFFECT_PROTECTIVE_PADS, + HOLD_EFFECT_TERRAIN_EXTENDER, + HOLD_EFFECT_SEEDS, + HOLD_EFFECT_ADRENALINE_ORB, + HOLD_EFFECT_MEMORY, + HOLD_EFFECT_Z_CRYSTAL, + // Gen8 hold effects + HOLD_EFFECT_UTILITY_UMBRELLA, + HOLD_EFFECT_EJECT_PACK, + HOLD_EFFECT_ROOM_SERVICE, + HOLD_EFFECT_BLUNDER_POLICY, + HOLD_EFFECT_HEAVY_DUTY_BOOTS, + HOLD_EFFECT_THROAT_SPRAY, + // Gen9 hold effects + HOLD_EFFECT_ABILITY_SHIELD, + HOLD_EFFECT_CLEAR_AMULET, + HOLD_EFFECT_MIRROR_HERB, + HOLD_EFFECT_PUNCHING_GLOVE, + HOLD_EFFECT_COVERT_CLOAK, + HOLD_EFFECT_LOADED_DICE, + HOLD_EFFECT_BOOSTER_ENERGY, + HOLD_EFFECT_OGERPON_MASK, + // Gen2 hold effect + HOLD_EFFECT_BERSERK_GENE, +}; -// Gen4 hold effects. -#define HOLD_EFFECT_CHOICE_SCARF 67 -#define HOLD_EFFECT_CHOICE_SPECS 68 -#define HOLD_EFFECT_DAMP_ROCK 69 -#define HOLD_EFFECT_GRIP_CLAW 70 -#define HOLD_EFFECT_HEAT_ROCK 71 -#define HOLD_EFFECT_ICY_ROCK 72 -#define HOLD_EFFECT_LIGHT_CLAY 73 -#define HOLD_EFFECT_SMOOTH_ROCK 74 -#define HOLD_EFFECT_POWER_HERB 75 -#define HOLD_EFFECT_BIG_ROOT 76 -#define HOLD_EFFECT_EXPERT_BELT 77 -#define HOLD_EFFECT_LIFE_ORB 78 -#define HOLD_EFFECT_METRONOME 79 -#define HOLD_EFFECT_MUSCLE_BAND 80 -#define HOLD_EFFECT_WIDE_LENS 81 -#define HOLD_EFFECT_WISE_GLASSES 82 -#define HOLD_EFFECT_ZOOM_LENS 83 -#define HOLD_EFFECT_LAGGING_TAIL 84 -#define HOLD_EFFECT_FOCUS_SASH 85 -#define HOLD_EFFECT_FLAME_ORB 86 -#define HOLD_EFFECT_TOXIC_ORB 87 -#define HOLD_EFFECT_STICKY_BARB 88 -#define HOLD_EFFECT_IRON_BALL 89 -#define HOLD_EFFECT_BLACK_SLUDGE 90 -#define HOLD_EFFECT_DESTINY_KNOT 91 -#define HOLD_EFFECT_SHED_SHELL 92 -#define HOLD_EFFECT_QUICK_POWDER 93 -#define HOLD_EFFECT_ADAMANT_ORB 94 -#define HOLD_EFFECT_LUSTROUS_ORB 95 -#define HOLD_EFFECT_GRISEOUS_ORB 96 -#define HOLD_EFFECT_ENIGMA_BERRY 97 -#define HOLD_EFFECT_RESIST_BERRY 98 -#define HOLD_EFFECT_POWER_ITEM 99 -#define HOLD_EFFECT_RESTORE_PCT_HP 100 -#define HOLD_EFFECT_MICLE_BERRY 101 -#define HOLD_EFFECT_CUSTAP_BERRY 102 -#define HOLD_EFFECT_JABOCA_BERRY 103 -#define HOLD_EFFECT_ROWAP_BERRY 104 -#define HOLD_EFFECT_KEE_BERRY 105 -#define HOLD_EFFECT_MARANGA_BERRY 106 -#define HOLD_EFFECT_PLATE 107 - -// Gen5 hold effects -#define HOLD_EFFECT_FLOAT_STONE 117 -#define HOLD_EFFECT_EVIOLITE 118 -#define HOLD_EFFECT_ASSAULT_VEST 119 -#define HOLD_EFFECT_DRIVE 120 -#define HOLD_EFFECT_GEMS 121 -#define HOLD_EFFECT_ROCKY_HELMET 122 -#define HOLD_EFFECT_AIR_BALLOON 123 -#define HOLD_EFFECT_RED_CARD 124 -#define HOLD_EFFECT_RING_TARGET 125 -#define HOLD_EFFECT_BINDING_BAND 126 -#define HOLD_EFFECT_EJECT_BUTTON 127 -#define HOLD_EFFECT_ABSORB_BULB 128 -#define HOLD_EFFECT_CELL_BATTERY 129 - -// Gen6 hold effects -#define HOLD_EFFECT_FAIRY_POWER 139 -#define HOLD_EFFECT_MEGA_STONE 140 -#define HOLD_EFFECT_SAFETY_GOGGLES 141 -#define HOLD_EFFECT_LUMINOUS_MOSS 142 -#define HOLD_EFFECT_SNOWBALL 143 -#define HOLD_EFFECT_WEAKNESS_POLICY 144 -#define HOLD_EFFECT_PRIMAL_ORB 145 - -// Gen7 hold effects -#define HOLD_EFFECT_PROTECTIVE_PADS 154 -#define HOLD_EFFECT_TERRAIN_EXTENDER 155 -#define HOLD_EFFECT_SEEDS 156 -#define HOLD_EFFECT_ADRENALINE_ORB 157 -#define HOLD_EFFECT_MEMORY 158 -#define HOLD_EFFECT_Z_CRYSTAL 159 - -// Gen8 hold effects -#define HOLD_EFFECT_UTILITY_UMBRELLA 169 -#define HOLD_EFFECT_EJECT_PACK 170 -#define HOLD_EFFECT_ROOM_SERVICE 171 -#define HOLD_EFFECT_BLUNDER_POLICY 172 -#define HOLD_EFFECT_HEAVY_DUTY_BOOTS 173 -#define HOLD_EFFECT_THROAT_SPRAY 174 - -// Gen9 hold effects -#define HOLD_EFFECT_ABILITY_SHIELD 175 -#define HOLD_EFFECT_CLEAR_AMULET 176 -#define HOLD_EFFECT_MIRROR_HERB 177 // Not implemented. -#define HOLD_EFFECT_PUNCHING_GLOVE 178 -#define HOLD_EFFECT_COVERT_CLOAK 179 -#define HOLD_EFFECT_LOADED_DICE 180 -#define HOLD_EFFECT_BOOSTER_ENERGY 181 // Not implemented. - -// Gen2 hold effect -#define HOLD_EFFECT_BERSERK_GENE 184 - -#define HOLD_EFFECT_CHOICE(holdEffect)((holdEffect == HOLD_EFFECT_CHOICE_BAND || holdEffect == HOLD_EFFECT_CHOICE_SCARF || holdEffect == HOLD_EFFECT_CHOICE_SPECS)) +#define HOLD_EFFECT_CHOICE(holdEffect) ((holdEffect == HOLD_EFFECT_CHOICE_BAND || holdEffect == HOLD_EFFECT_CHOICE_SCARF || holdEffect == HOLD_EFFECT_CHOICE_SPECS)) // Terrain seed params #define HOLD_EFFECT_PARAM_ELECTRIC_TERRAIN 0 diff --git a/include/constants/items.h b/include/constants/items.h index bc9fdf2dc401..c5bd7096a912 100644 --- a/include/constants/items.h +++ b/include/constants/items.h @@ -1077,6 +1077,7 @@ #define EFFECT_ITEM_REVIVE 9 #define EFFECT_ITEM_RESTORE_PP 10 #define EFFECT_ITEM_INCREASE_ALL_STATS 11 +#define EFFECT_ITEM_USE_POKE_FLUTE 12 // Enigma Berry dummy constant #define EFFECT_ITEM_ENIGMA_BERRY_EREADER 1 diff --git a/include/constants/metatile_behaviors.h b/include/constants/metatile_behaviors.h index 780e4525316a..f5a8f38506a2 100755 --- a/include/constants/metatile_behaviors.h +++ b/include/constants/metatile_behaviors.h @@ -74,13 +74,13 @@ #define MB_SLIDE_NORTH 0x46 #define MB_SLIDE_SOUTH 0x47 #define MB_TRICK_HOUSE_PUZZLE_8_FLOOR 0x48 -#define MB_UNUSED_49 0x49 -#define MB_UNUSED_4A 0x4A -#define MB_UNUSED_4B 0x4B -#define MB_UNUSED_4C 0x4C -#define MB_UNUSED_4D 0x4D -#define MB_UNUSED_4E 0x4E -#define MB_UNUSED_4F 0x4F +#define MB_SIDEWAYS_STAIRS_RIGHT_SIDE 0x49 +#define MB_SIDEWAYS_STAIRS_LEFT_SIDE 0x4A +#define MB_SIDEWAYS_STAIRS_RIGHT_SIDE_TOP 0x4B +#define MB_SIDEWAYS_STAIRS_LEFT_SIDE_TOP 0x4C +#define MB_SIDEWAYS_STAIRS_RIGHT_SIDE_BOTTOM 0x4D +#define MB_SIDEWAYS_STAIRS_LEFT_SIDE_BOTTOM 0x4E +#define MB_ROCK_STAIRS 0x4F #define MB_EASTWARD_CURRENT 0x50 #define MB_WESTWARD_CURRENT 0x51 #define MB_NORTHWARD_CURRENT 0x52 @@ -236,10 +236,10 @@ #define MB_WIRELESS_BOX_RESULTS 0xE8 #define MB_TRAINER_HILL_TIMER 0xE9 #define MB_SKY_PILLAR_CLOSED_DOOR 0xEA -#define MB_UNUSED_EB 0xEB -#define MB_UNUSED_EC 0xEC -#define MB_UNUSED_ED 0xED -#define MB_UNUSED_EE 0xEE +#define MB_UP_RIGHT_STAIR_WARP 0xEB +#define MB_UP_LEFT_STAIR_WARP 0xEC +#define MB_DOWN_RIGHT_STAIR_WARP 0xED +#define MB_DOWN_LEFT_STAIR_WARP 0xEE #define MB_UNUSED_EF 0xEF #define NUM_METATILE_BEHAVIORS 0xF0 diff --git a/include/constants/species.h b/include/constants/species.h index a0cce513982d..4c9a32bb1362 100644 --- a/include/constants/species.h +++ b/include/constants/species.h @@ -1,6 +1,11 @@ #ifndef GUARD_CONSTANTS_SPECIES_H #define GUARD_CONSTANTS_SPECIES_H +// NOTE: The defines here are named in order to match Pokémon Showdown's naming conventions. This is done to avoid issues with trainerproc parsing species names. If a Pokémon does not have an entry on Showdown, use your best judgement. +// Additionally, we have tried to reduce down to as few defines as possible, because programs like porymap does not always properly handle having multiple defines. +// Discussion: https://github.com/rh-hideout/pokeemerald-expansion/pull/5075#issuecomment-2384088602 +// Showdown: https://github.com/smogon/Pokemon-Showdown/blob/master/data/pokedex.ts + #define SPECIES_NONE 0 #define SPECIES_BULBASAUR 1 #define SPECIES_IVYSAUR 2 @@ -415,12 +420,12 @@ #define SPECIES_RAMPARDOS 409 #define SPECIES_SHIELDON 410 #define SPECIES_BASTIODON 411 -#define SPECIES_BURMY SPECIES_BURMY_PLANT_CLOAK -#define SPECIES_BURMY_PLANT_CLOAK 412 -#define SPECIES_WORMADAM SPECIES_WORMADAM_PLANT_CLOAK -#define SPECIES_WORMADAM_PLANT_CLOAK 413 -#define SPECIES_MOTHIM SPECIES_MOTHIM_PLANT_CLOAK -#define SPECIES_MOTHIM_PLANT_CLOAK 414 +#define SPECIES_BURMY_PLANT 412 +#define SPECIES_BURMY SPECIES_BURMY_PLANT +#define SPECIES_WORMADAM_PLANT 413 +#define SPECIES_WORMADAM SPECIES_WORMADAM_PLANT +#define SPECIES_MOTHIM_PLANT 414 +#define SPECIES_MOTHIM SPECIES_MOTHIM_PLANT #define SPECIES_COMBEE 415 #define SPECIES_VESPIQUEN 416 #define SPECIES_PACHIRISU 417 @@ -429,10 +434,10 @@ #define SPECIES_CHERUBI 420 #define SPECIES_CHERRIM SPECIES_CHERRIM_OVERCAST #define SPECIES_CHERRIM_OVERCAST 421 -#define SPECIES_SHELLOS SPECIES_SHELLOS_WEST_SEA -#define SPECIES_SHELLOS_WEST_SEA 422 -#define SPECIES_GASTRODON SPECIES_GASTRODON_WEST_SEA -#define SPECIES_GASTRODON_WEST_SEA 423 +#define SPECIES_SHELLOS_WEST 422 +#define SPECIES_SHELLOS SPECIES_SHELLOS_WEST +#define SPECIES_GASTRODON_WEST 423 +#define SPECIES_GASTRODON SPECIES_GASTRODON_WEST #define SPECIES_AMBIPOM 424 #define SPECIES_DRIFLOON 425 #define SPECIES_DRIFBLIM 426 @@ -568,8 +573,8 @@ #define SPECIES_KROKOROK 552 #define SPECIES_KROOKODILE 553 #define SPECIES_DARUMAKA 554 -#define SPECIES_DARMANITAN SPECIES_DARMANITAN_STANDARD_MODE -#define SPECIES_DARMANITAN_STANDARD_MODE 555 +#define SPECIES_DARMANITAN SPECIES_DARMANITAN_STANDARD +#define SPECIES_DARMANITAN_STANDARD 555 #define SPECIES_MARACTUS 556 #define SPECIES_DWEBBLE 557 #define SPECIES_CRUSTLE 558 @@ -693,12 +698,12 @@ #define SPECIES_VIVILLON_ICY_SNOW 666 #define SPECIES_LITLEO 667 #define SPECIES_PYROAR 668 -#define SPECIES_FLABEBE SPECIES_FLABEBE_RED_FLOWER -#define SPECIES_FLABEBE_RED_FLOWER 669 -#define SPECIES_FLOETTE SPECIES_FLOETTE_RED_FLOWER -#define SPECIES_FLOETTE_RED_FLOWER 670 -#define SPECIES_FLORGES SPECIES_FLORGES_RED_FLOWER -#define SPECIES_FLORGES_RED_FLOWER 671 +#define SPECIES_FLABEBE SPECIES_FLABEBE_RED +#define SPECIES_FLABEBE_RED 669 +#define SPECIES_FLOETTE SPECIES_FLOETTE_RED +#define SPECIES_FLOETTE_RED 670 +#define SPECIES_FLORGES SPECIES_FLORGES_RED +#define SPECIES_FLORGES_RED 671 #define SPECIES_SKIDDO 672 #define SPECIES_GOGOAT 673 #define SPECIES_PANCHAM 674 @@ -706,8 +711,8 @@ #define SPECIES_FURFROU SPECIES_FURFROU_NATURAL #define SPECIES_FURFROU_NATURAL 676 #define SPECIES_ESPURR 677 -#define SPECIES_MEOWSTIC SPECIES_MEOWSTIC_MALE -#define SPECIES_MEOWSTIC_MALE 678 +#define SPECIES_MEOWSTIC SPECIES_MEOWSTIC_M +#define SPECIES_MEOWSTIC_M 678 #define SPECIES_HONEDGE 679 #define SPECIES_DOUBLADE 680 #define SPECIES_AEGISLASH SPECIES_AEGISLASH_SHIELD @@ -752,8 +757,7 @@ #define SPECIES_XERNEAS_NEUTRAL 716 #define SPECIES_YVELTAL 717 #define SPECIES_ZYGARDE SPECIES_ZYGARDE_50 -#define SPECIES_ZYGARDE_50 SPECIES_ZYGARDE_50_AURA_BREAK -#define SPECIES_ZYGARDE_50_AURA_BREAK 718 +#define SPECIES_ZYGARDE_50 718 #define SPECIES_DIANCIE 719 #define SPECIES_HOOPA SPECIES_HOOPA_CONFINED #define SPECIES_HOOPA_CONFINED 720 @@ -925,10 +929,10 @@ #define SPECIES_SNOM 872 #define SPECIES_FROSMOTH 873 #define SPECIES_STONJOURNER 874 -#define SPECIES_EISCUE SPECIES_EISCUE_ICE_FACE -#define SPECIES_EISCUE_ICE_FACE 875 -#define SPECIES_INDEEDEE SPECIES_INDEEDEE_MALE -#define SPECIES_INDEEDEE_MALE 876 +#define SPECIES_EISCUE SPECIES_EISCUE_ICE +#define SPECIES_EISCUE_ICE 875 +#define SPECIES_INDEEDEE SPECIES_INDEEDEE_M +#define SPECIES_INDEEDEE_M 876 #define SPECIES_MORPEKO SPECIES_MORPEKO_FULL_BELLY #define SPECIES_MORPEKO_FULL_BELLY 877 #define SPECIES_CUFANT 878 @@ -941,14 +945,14 @@ #define SPECIES_DREEPY 885 #define SPECIES_DRAKLOAK 886 #define SPECIES_DRAGAPULT 887 -#define SPECIES_ZACIAN SPECIES_ZACIAN_HERO_OF_MANY_BATTLES -#define SPECIES_ZACIAN_HERO_OF_MANY_BATTLES 888 -#define SPECIES_ZAMAZENTA SPECIES_ZAMAZENTA_HERO_OF_MANY_BATTLES -#define SPECIES_ZAMAZENTA_HERO_OF_MANY_BATTLES 889 +#define SPECIES_ZACIAN SPECIES_ZACIAN_HERO +#define SPECIES_ZACIAN_HERO 888 +#define SPECIES_ZAMAZENTA SPECIES_ZAMAZENTA_HERO +#define SPECIES_ZAMAZENTA_HERO 889 #define SPECIES_ETERNATUS 890 #define SPECIES_KUBFU 891 -#define SPECIES_URSHIFU SPECIES_URSHIFU_SINGLE_STRIKE_STYLE -#define SPECIES_URSHIFU_SINGLE_STRIKE_STYLE 892 +#define SPECIES_URSHIFU SPECIES_URSHIFU_SINGLE_STRIKE +#define SPECIES_URSHIFU_SINGLE_STRIKE 892 #define SPECIES_ZARUDE 893 #define SPECIES_REGIELEKI 894 #define SPECIES_REGIDRAGO 895 @@ -958,8 +962,8 @@ #define SPECIES_WYRDEER 899 #define SPECIES_KLEAVOR 900 #define SPECIES_URSALUNA 901 -#define SPECIES_BASCULEGION SPECIES_BASCULEGION_MALE -#define SPECIES_BASCULEGION_MALE 902 +#define SPECIES_BASCULEGION SPECIES_BASCULEGION_M +#define SPECIES_BASCULEGION_M 902 #define SPECIES_SNEASLER 903 #define SPECIES_OVERQWIL 904 #define SPECIES_ENAMORUS SPECIES_ENAMORUS_INCARNATE @@ -1014,78 +1018,78 @@ #define SPECIES_RAYQUAZA_MEGA 953 #define SPECIES_KYOGRE_PRIMAL 954 #define SPECIES_GROUDON_PRIMAL 955 -#define SPECIES_RATTATA_ALOLAN 956 -#define SPECIES_RATICATE_ALOLAN 957 -#define SPECIES_RAICHU_ALOLAN 958 -#define SPECIES_SANDSHREW_ALOLAN 959 -#define SPECIES_SANDSLASH_ALOLAN 960 -#define SPECIES_VULPIX_ALOLAN 961 -#define SPECIES_NINETALES_ALOLAN 962 -#define SPECIES_DIGLETT_ALOLAN 963 -#define SPECIES_DUGTRIO_ALOLAN 964 -#define SPECIES_MEOWTH_ALOLAN 965 -#define SPECIES_PERSIAN_ALOLAN 966 -#define SPECIES_GEODUDE_ALOLAN 967 -#define SPECIES_GRAVELER_ALOLAN 968 -#define SPECIES_GOLEM_ALOLAN 969 -#define SPECIES_GRIMER_ALOLAN 970 -#define SPECIES_MUK_ALOLAN 971 -#define SPECIES_EXEGGUTOR_ALOLAN 972 -#define SPECIES_MAROWAK_ALOLAN 973 -#define SPECIES_MEOWTH_GALARIAN 974 -#define SPECIES_PONYTA_GALARIAN 975 -#define SPECIES_RAPIDASH_GALARIAN 976 -#define SPECIES_SLOWPOKE_GALARIAN 977 -#define SPECIES_SLOWBRO_GALARIAN 978 -#define SPECIES_FARFETCHD_GALARIAN 979 -#define SPECIES_WEEZING_GALARIAN 980 -#define SPECIES_MR_MIME_GALARIAN 981 -#define SPECIES_ARTICUNO_GALARIAN 982 -#define SPECIES_ZAPDOS_GALARIAN 983 -#define SPECIES_MOLTRES_GALARIAN 984 -#define SPECIES_SLOWKING_GALARIAN 985 -#define SPECIES_CORSOLA_GALARIAN 986 -#define SPECIES_ZIGZAGOON_GALARIAN 987 -#define SPECIES_LINOONE_GALARIAN 988 -#define SPECIES_DARUMAKA_GALARIAN 989 -#define SPECIES_DARMANITAN_GALARIAN SPECIES_DARMANITAN_GALARIAN_STANDARD_MODE -#define SPECIES_DARMANITAN_GALARIAN_STANDARD_MODE 990 -#define SPECIES_YAMASK_GALARIAN 991 -#define SPECIES_STUNFISK_GALARIAN 992 +#define SPECIES_RATTATA_ALOLA 956 +#define SPECIES_RATICATE_ALOLA 957 +#define SPECIES_RAICHU_ALOLA 958 +#define SPECIES_SANDSHREW_ALOLA 959 +#define SPECIES_SANDSLASH_ALOLA 960 +#define SPECIES_VULPIX_ALOLA 961 +#define SPECIES_NINETALES_ALOLA 962 +#define SPECIES_DIGLETT_ALOLA 963 +#define SPECIES_DUGTRIO_ALOLA 964 +#define SPECIES_MEOWTH_ALOLA 965 +#define SPECIES_PERSIAN_ALOLA 966 +#define SPECIES_GEODUDE_ALOLA 967 +#define SPECIES_GRAVELER_ALOLA 968 +#define SPECIES_GOLEM_ALOLA 969 +#define SPECIES_GRIMER_ALOLA 970 +#define SPECIES_MUK_ALOLA 971 +#define SPECIES_EXEGGUTOR_ALOLA 972 +#define SPECIES_MAROWAK_ALOLA 973 +#define SPECIES_MEOWTH_GALAR 974 +#define SPECIES_PONYTA_GALAR 975 +#define SPECIES_RAPIDASH_GALAR 976 +#define SPECIES_SLOWPOKE_GALAR 977 +#define SPECIES_SLOWBRO_GALAR 978 +#define SPECIES_FARFETCHD_GALAR 979 +#define SPECIES_WEEZING_GALAR 980 +#define SPECIES_MR_MIME_GALAR 981 +#define SPECIES_ARTICUNO_GALAR 982 +#define SPECIES_ZAPDOS_GALAR 983 +#define SPECIES_MOLTRES_GALAR 984 +#define SPECIES_SLOWKING_GALAR 985 +#define SPECIES_CORSOLA_GALAR 986 +#define SPECIES_ZIGZAGOON_GALAR 987 +#define SPECIES_LINOONE_GALAR 988 +#define SPECIES_DARUMAKA_GALAR 989 +#define SPECIES_DARMANITAN_GALAR_STANDARD 990 +#define SPECIES_DARMANITAN_GALAR SPECIES_DARMANITAN_GALAR_STANDARD +#define SPECIES_YAMASK_GALAR 991 +#define SPECIES_STUNFISK_GALAR 992 //Hisuian Forms -#define SPECIES_GROWLITHE_HISUIAN 993 -#define SPECIES_ARCANINE_HISUIAN 994 -#define SPECIES_VOLTORB_HISUIAN 995 -#define SPECIES_ELECTRODE_HISUIAN 996 -#define SPECIES_TYPHLOSION_HISUIAN 997 -#define SPECIES_QWILFISH_HISUIAN 998 -#define SPECIES_SNEASEL_HISUIAN 999 -#define SPECIES_SAMUROTT_HISUIAN 1000 -#define SPECIES_LILLIGANT_HISUIAN 1001 -#define SPECIES_ZORUA_HISUIAN 1002 -#define SPECIES_ZOROARK_HISUIAN 1003 -#define SPECIES_BRAVIARY_HISUIAN 1004 -#define SPECIES_SLIGGOO_HISUIAN 1005 -#define SPECIES_GOODRA_HISUIAN 1006 -#define SPECIES_AVALUGG_HISUIAN 1007 -#define SPECIES_DECIDUEYE_HISUIAN 1008 +#define SPECIES_GROWLITHE_HISUI 993 +#define SPECIES_ARCANINE_HISUI 994 +#define SPECIES_VOLTORB_HISUI 995 +#define SPECIES_ELECTRODE_HISUI 996 +#define SPECIES_TYPHLOSION_HISUI 997 +#define SPECIES_QWILFISH_HISUI 998 +#define SPECIES_SNEASEL_HISUI 999 +#define SPECIES_SAMUROTT_HISUI 1000 +#define SPECIES_LILLIGANT_HISUI 1001 +#define SPECIES_ZORUA_HISUI 1002 +#define SPECIES_ZOROARK_HISUI 1003 +#define SPECIES_BRAVIARY_HISUI 1004 +#define SPECIES_SLIGGOO_HISUI 1005 +#define SPECIES_GOODRA_HISUI 1006 +#define SPECIES_AVALUGG_HISUI 1007 +#define SPECIES_DECIDUEYE_HISUI 1008 // Misc Forms #define SPECIES_PIKACHU_COSPLAY 1009 #define SPECIES_PIKACHU_ROCK_STAR 1010 #define SPECIES_PIKACHU_BELLE 1011 #define SPECIES_PIKACHU_POP_STAR 1012 -#define SPECIES_PIKACHU_PH_D 1013 +#define SPECIES_PIKACHU_PHD 1013 #define SPECIES_PIKACHU_LIBRE 1014 -#define SPECIES_PIKACHU_ORIGINAL_CAP 1015 -#define SPECIES_PIKACHU_HOENN_CAP 1016 -#define SPECIES_PIKACHU_SINNOH_CAP 1017 -#define SPECIES_PIKACHU_UNOVA_CAP 1018 -#define SPECIES_PIKACHU_KALOS_CAP 1019 -#define SPECIES_PIKACHU_ALOLA_CAP 1020 +#define SPECIES_PIKACHU_ORIGINAL 1015 +#define SPECIES_PIKACHU_HOENN 1016 +#define SPECIES_PIKACHU_SINNOH 1017 +#define SPECIES_PIKACHU_UNOVA 1018 +#define SPECIES_PIKACHU_KALOS 1019 +#define SPECIES_PIKACHU_ALOLA 1020 #define SPECIES_PIKACHU_PARTNER_CAP 1021 -#define SPECIES_PIKACHU_WORLD_CAP 1022 +#define SPECIES_PIKACHU_WORLD 1022 #define SPECIES_PICHU_SPIKY_EARED 1023 #define SPECIES_UNOWN_B 1024 #define SPECIES_UNOWN_C 1025 @@ -1112,21 +1116,21 @@ #define SPECIES_UNOWN_X 1046 #define SPECIES_UNOWN_Y 1047 #define SPECIES_UNOWN_Z 1048 -#define SPECIES_UNOWN_EMARK 1049 -#define SPECIES_UNOWN_QMARK 1050 +#define SPECIES_UNOWN_EXCLAMATION 1049 +#define SPECIES_UNOWN_QUESTION 1050 #define SPECIES_CASTFORM_SUNNY 1051 #define SPECIES_CASTFORM_RAINY 1052 #define SPECIES_CASTFORM_SNOWY 1053 #define SPECIES_DEOXYS_ATTACK 1054 #define SPECIES_DEOXYS_DEFENSE 1055 #define SPECIES_DEOXYS_SPEED 1056 -#define SPECIES_BURMY_SANDY_CLOAK 1057 -#define SPECIES_BURMY_TRASH_CLOAK 1058 -#define SPECIES_WORMADAM_SANDY_CLOAK 1059 -#define SPECIES_WORMADAM_TRASH_CLOAK 1060 +#define SPECIES_BURMY_SANDY 1057 +#define SPECIES_BURMY_TRASH 1058 +#define SPECIES_WORMADAM_SANDY 1059 +#define SPECIES_WORMADAM_TRASH 1060 #define SPECIES_CHERRIM_SUNSHINE 1061 -#define SPECIES_SHELLOS_EAST_SEA 1062 -#define SPECIES_GASTRODON_EAST_SEA 1063 +#define SPECIES_SHELLOS_EAST 1062 +#define SPECIES_GASTRODON_EAST 1063 #define SPECIES_ROTOM_HEAT 1064 #define SPECIES_ROTOM_WASH 1065 #define SPECIES_ROTOM_FROST 1066 @@ -1155,8 +1159,8 @@ #define SPECIES_ARCEUS_FAIRY 1089 #define SPECIES_BASCULIN_BLUE_STRIPED 1090 #define SPECIES_BASCULIN_WHITE_STRIPED 1091 -#define SPECIES_DARMANITAN_ZEN_MODE 1092 -#define SPECIES_DARMANITAN_GALARIAN_ZEN_MODE 1093 +#define SPECIES_DARMANITAN_ZEN 1092 +#define SPECIES_DARMANITAN_GALAR_ZEN 1093 #define SPECIES_DEERLING_SUMMER 1094 #define SPECIES_DEERLING_AUTUMN 1095 #define SPECIES_DEERLING_WINTER 1096 @@ -1171,11 +1175,12 @@ #define SPECIES_KYUREM_BLACK 1105 #define SPECIES_KELDEO_RESOLUTE 1106 #define SPECIES_MELOETTA_PIROUETTE 1107 -#define SPECIES_GENESECT_DOUSE_DRIVE 1108 -#define SPECIES_GENESECT_SHOCK_DRIVE 1109 -#define SPECIES_GENESECT_BURN_DRIVE 1110 -#define SPECIES_GENESECT_CHILL_DRIVE 1111 -#define SPECIES_GRENINJA_BATTLE_BOND 1112 +#define SPECIES_GENESECT_DOUSE 1108 +#define SPECIES_GENESECT_SHOCK 1109 +#define SPECIES_GENESECT_BURN 1110 +#define SPECIES_GENESECT_CHILL 1111 +#define SPECIES_GRENINJA_BOND 1112 +#define SPECIES_GRENINJA_BATTLE_BOND SPECIES_GRENINJA_BOND #define SPECIES_GRENINJA_ASH 1113 #define SPECIES_VIVILLON_POLAR 1114 #define SPECIES_VIVILLON_TUNDRA 1115 @@ -1195,20 +1200,20 @@ #define SPECIES_VIVILLON_OCEAN 1129 #define SPECIES_VIVILLON_JUNGLE 1130 #define SPECIES_VIVILLON_FANCY 1131 -#define SPECIES_VIVILLON_POKE_BALL 1132 -#define SPECIES_FLABEBE_YELLOW_FLOWER 1133 -#define SPECIES_FLABEBE_ORANGE_FLOWER 1134 -#define SPECIES_FLABEBE_BLUE_FLOWER 1135 -#define SPECIES_FLABEBE_WHITE_FLOWER 1136 -#define SPECIES_FLOETTE_YELLOW_FLOWER 1137 -#define SPECIES_FLOETTE_ORANGE_FLOWER 1138 -#define SPECIES_FLOETTE_BLUE_FLOWER 1139 -#define SPECIES_FLOETTE_WHITE_FLOWER 1140 -#define SPECIES_FLOETTE_ETERNAL_FLOWER 1141 -#define SPECIES_FLORGES_YELLOW_FLOWER 1142 -#define SPECIES_FLORGES_ORANGE_FLOWER 1143 -#define SPECIES_FLORGES_BLUE_FLOWER 1144 -#define SPECIES_FLORGES_WHITE_FLOWER 1145 +#define SPECIES_VIVILLON_POKEBALL 1132 +#define SPECIES_FLABEBE_YELLOW 1133 +#define SPECIES_FLABEBE_ORANGE 1134 +#define SPECIES_FLABEBE_BLUE 1135 +#define SPECIES_FLABEBE_WHITE 1136 +#define SPECIES_FLOETTE_YELLOW 1137 +#define SPECIES_FLOETTE_ORANGE 1138 +#define SPECIES_FLOETTE_BLUE 1139 +#define SPECIES_FLOETTE_WHITE 1140 +#define SPECIES_FLOETTE_ETERNAL 1141 +#define SPECIES_FLORGES_YELLOW 1142 +#define SPECIES_FLORGES_ORANGE 1143 +#define SPECIES_FLORGES_BLUE 1144 +#define SPECIES_FLORGES_WHITE 1145 #define SPECIES_FURFROU_HEART_TRIM 1146 #define SPECIES_FURFROU_STAR_TRIM 1147 #define SPECIES_FURFROU_DIAMOND_TRIM 1148 @@ -1218,7 +1223,7 @@ #define SPECIES_FURFROU_LA_REINE_TRIM 1152 #define SPECIES_FURFROU_KABUKI_TRIM 1153 #define SPECIES_FURFROU_PHARAOH_TRIM 1154 -#define SPECIES_MEOWSTIC_FEMALE 1155 +#define SPECIES_MEOWSTIC_F 1155 #define SPECIES_AEGISLASH_BLADE 1156 #define SPECIES_PUMPKABOO_SMALL 1157 #define SPECIES_PUMPKABOO_LARGE 1158 @@ -1281,7 +1286,7 @@ #define SPECIES_NECROZMA_DUSK_MANE 1207 #define SPECIES_NECROZMA_DAWN_WINGS 1208 #define SPECIES_NECROZMA_ULTRA 1209 -#define SPECIES_MAGEARNA_ORIGINAL_COLOR 1210 +#define SPECIES_MAGEARNA_ORIGINAL 1210 #define SPECIES_CRAMORANT_GULPING 1211 #define SPECIES_CRAMORANT_GORGING 1212 #define SPECIES_TOXTRICITY_LOW_KEY 1213 @@ -1303,17 +1308,17 @@ #define SPECIES_ALCREMIE_STRAWBERRY_RUBY_SWIRL 1221 #define SPECIES_ALCREMIE_STRAWBERRY_CARAMEL_SWIRL 1222 #define SPECIES_ALCREMIE_STRAWBERRY_RAINBOW_SWIRL 1223 -#define SPECIES_EISCUE_NOICE_FACE 1224 -#define SPECIES_INDEEDEE_FEMALE 1225 +#define SPECIES_EISCUE_NOICE 1224 +#define SPECIES_INDEEDEE_F 1225 #define SPECIES_MORPEKO_HANGRY 1226 -#define SPECIES_ZACIAN_CROWNED_SWORD 1227 -#define SPECIES_ZAMAZENTA_CROWNED_SHIELD 1228 +#define SPECIES_ZACIAN_CROWNED 1227 +#define SPECIES_ZAMAZENTA_CROWNED 1228 #define SPECIES_ETERNATUS_ETERNAMAX 1229 -#define SPECIES_URSHIFU_RAPID_STRIKE_STYLE 1230 +#define SPECIES_URSHIFU_RAPID_STRIKE 1230 #define SPECIES_ZARUDE_DADA 1231 -#define SPECIES_CALYREX_ICE_RIDER 1232 -#define SPECIES_CALYREX_SHADOW_RIDER 1233 -#define SPECIES_BASCULEGION_FEMALE 1234 +#define SPECIES_CALYREX_ICE 1232 +#define SPECIES_CALYREX_SHADOW 1233 +#define SPECIES_BASCULEGION_F 1234 #define SPECIES_ALCREMIE_BERRY SPECIES_ALCREMIE_BERRY_VANILLA_CREAM #define SPECIES_ALCREMIE_BERRY_VANILLA_CREAM 1235 #define SPECIES_ALCREMIE_BERRY_RUBY_CREAM 1236 @@ -1387,9 +1392,9 @@ #define SPECIES_QUAXWELL 1296 #define SPECIES_QUAQUAVAL 1297 #define SPECIES_LECHONK 1298 -#define SPECIES_OINKOLOGNE SPECIES_OINKOLOGNE_MALE -#define SPECIES_OINKOLOGNE_MALE 1299 -#define SPECIES_OINKOLOGNE_FEMALE 1300 +#define SPECIES_OINKOLOGNE SPECIES_OINKOLOGNE_M +#define SPECIES_OINKOLOGNE_M 1299 +#define SPECIES_OINKOLOGNE_F 1300 #define SPECIES_TAROUNTULA 1301 #define SPECIES_SPIDOPS 1302 #define SPECIES_NYMBLE 1303 @@ -1398,19 +1403,19 @@ #define SPECIES_PAWMO 1306 #define SPECIES_PAWMOT 1307 #define SPECIES_TANDEMAUS 1308 -#define SPECIES_MAUSHOLD SPECIES_MAUSHOLD_FAMILY_OF_THREE -#define SPECIES_MAUSHOLD_FAMILY_OF_THREE 1309 -#define SPECIES_MAUSHOLD_FAMILY_OF_FOUR 1310 +#define SPECIES_MAUSHOLD SPECIES_MAUSHOLD_THREE +#define SPECIES_MAUSHOLD_THREE 1309 +#define SPECIES_MAUSHOLD_FOUR 1310 #define SPECIES_FIDOUGH 1311 #define SPECIES_DACHSBUN 1312 #define SPECIES_SMOLIV 1313 #define SPECIES_DOLLIV 1314 #define SPECIES_ARBOLIVA 1315 -#define SPECIES_SQUAWKABILLY SPECIES_SQUAWKABILLY_GREEN_PLUMAGE -#define SPECIES_SQUAWKABILLY_GREEN_PLUMAGE 1316 -#define SPECIES_SQUAWKABILLY_BLUE_PLUMAGE 1317 -#define SPECIES_SQUAWKABILLY_YELLOW_PLUMAGE 1318 -#define SPECIES_SQUAWKABILLY_WHITE_PLUMAGE 1319 +#define SPECIES_SQUAWKABILLY SPECIES_SQUAWKABILLY_GREEN +#define SPECIES_SQUAWKABILLY_GREEN 1316 +#define SPECIES_SQUAWKABILLY_BLUE 1317 +#define SPECIES_SQUAWKABILLY_YELLOW 1318 +#define SPECIES_SQUAWKABILLY_WHITE 1319 #define SPECIES_NACLI 1320 #define SPECIES_NACLSTACK 1321 #define SPECIES_GARGANACL 1322 @@ -1498,10 +1503,10 @@ #define SPECIES_KORAIDON 1400 #define SPECIES_MIRAIDON 1401 // Paldean Forms -#define SPECIES_TAUROS_PALDEAN_COMBAT_BREED 1402 -#define SPECIES_TAUROS_PALDEAN_BLAZE_BREED 1403 -#define SPECIES_TAUROS_PALDEAN_AQUA_BREED 1404 -#define SPECIES_WOOPER_PALDEAN 1405 +#define SPECIES_TAUROS_PALDEA_COMBAT 1402 +#define SPECIES_TAUROS_PALDEA_BLAZE 1403 +#define SPECIES_TAUROS_PALDEA_AQUA 1404 +#define SPECIES_WOOPER_PALDEA 1405 // Scarlet and Violet 1.2.0 #define SPECIES_WALKING_WAKE 1406 #define SPECIES_IRON_LEAVES 1407 @@ -1516,15 +1521,15 @@ #define SPECIES_OKIDOGI 1413 #define SPECIES_MUNKIDORI 1414 #define SPECIES_FEZANDIPITI 1415 -#define SPECIES_OGERPON SPECIES_OGERPON_TEAL_MASK -#define SPECIES_OGERPON_TEAL_MASK 1416 -#define SPECIES_OGERPON_WELLSPRING_MASK 1417 -#define SPECIES_OGERPON_HEARTHFLAME_MASK 1418 -#define SPECIES_OGERPON_CORNERSTONE_MASK 1419 -#define SPECIES_OGERPON_TEAL_MASK_TERA 1420 -#define SPECIES_OGERPON_WELLSPRING_MASK_TERA 1421 -#define SPECIES_OGERPON_HEARTHFLAME_MASK_TERA 1422 -#define SPECIES_OGERPON_CORNERSTONE_MASK_TERA 1423 +#define SPECIES_OGERPON SPECIES_OGERPON_TEAL +#define SPECIES_OGERPON_TEAL 1416 +#define SPECIES_OGERPON_WELLSPRING 1417 +#define SPECIES_OGERPON_HEARTHFLAME 1418 +#define SPECIES_OGERPON_CORNERSTONE 1419 +#define SPECIES_OGERPON_TEAL_TERA 1420 +#define SPECIES_OGERPON_WELLSPRING_TERA 1421 +#define SPECIES_OGERPON_HEARTHFLAME_TERA 1422 +#define SPECIES_OGERPON_CORNERSTONE_TERA 1423 #define SPECIES_URSALUNA_BLOODMOON 1424 // Indigo Disk #define SPECIES_ARCHALUDON 1425 @@ -1539,8 +1544,8 @@ #define SPECIES_TERAPAGOS_STELLAR 1433 #define SPECIES_PECHARUNT 1434 #define SPECIES_LUGIA_SHADOW 1435 -#define SPECIES_MOTHIM_SANDY_CLOAK 1436 -#define SPECIES_MOTHIM_TRASH_CLOAK 1437 +#define SPECIES_MOTHIM_SANDY 1436 +#define SPECIES_MOTHIM_TRASH 1437 #define SPECIES_SCATTERBUG_POLAR 1438 #define SPECIES_SCATTERBUG_TUNDRA 1439 #define SPECIES_SCATTERBUG_CONTINENTAL 1440 @@ -1559,7 +1564,7 @@ #define SPECIES_SCATTERBUG_OCEAN 1453 #define SPECIES_SCATTERBUG_JUNGLE 1454 #define SPECIES_SCATTERBUG_FANCY 1455 -#define SPECIES_SCATTERBUG_POKE_BALL 1456 +#define SPECIES_SCATTERBUG_POKEBALL 1456 #define SPECIES_SPEWPA_POLAR 1457 #define SPECIES_SPEWPA_TUNDRA 1458 #define SPECIES_SPEWPA_CONTINENTAL 1459 @@ -1578,8 +1583,8 @@ #define SPECIES_SPEWPA_OCEAN 1472 #define SPECIES_SPEWPA_JUNGLE 1473 #define SPECIES_SPEWPA_FANCY 1474 -#define SPECIES_SPEWPA_POKE_BALL 1475 -#define SPECIES_RATICATE_ALOLAN_TOTEM 1476 +#define SPECIES_SPEWPA_POKEBALL 1475 +#define SPECIES_RATICATE_ALOLA_TOTEM 1476 #define SPECIES_GUMSHOOS_TOTEM 1477 #define SPECIES_VIKAVOLT_TOTEM 1478 #define SPECIES_LURANTIS_TOTEM 1479 @@ -1587,191 +1592,56 @@ #define SPECIES_MIMIKYU_TOTEM SPECIES_MIMIKYU_TOTEM_DISGUISED #define SPECIES_MIMIKYU_TOTEM_DISGUISED 1481 #define SPECIES_KOMMO_O_TOTEM 1482 -#define SPECIES_MAROWAK_ALOLAN_TOTEM 1483 +#define SPECIES_MAROWAK_ALOLA_TOTEM 1483 #define SPECIES_RIBOMBEE_TOTEM 1484 #define SPECIES_ARAQUANID_TOTEM 1485 #define SPECIES_TOGEDEMARU_TOTEM 1486 -#define SPECIES_PIKACHU_PARTNER 1487 -#define SPECIES_EEVEE_PARTNER 1488 -#define SPECIES_VENUSAUR_GIGANTAMAX 1489 -#define SPECIES_BLASTOISE_GIGANTAMAX 1490 -#define SPECIES_CHARIZARD_GIGANTAMAX 1491 -#define SPECIES_BUTTERFREE_GIGANTAMAX 1492 -#define SPECIES_PIKACHU_GIGANTAMAX 1493 -#define SPECIES_MEOWTH_GIGANTAMAX 1494 -#define SPECIES_MACHAMP_GIGANTAMAX 1495 -#define SPECIES_GENGAR_GIGANTAMAX 1496 -#define SPECIES_KINGLER_GIGANTAMAX 1497 -#define SPECIES_LAPRAS_GIGANTAMAX 1498 -#define SPECIES_EEVEE_GIGANTAMAX 1499 -#define SPECIES_SNORLAX_GIGANTAMAX 1500 -#define SPECIES_GARBODOR_GIGANTAMAX 1501 -#define SPECIES_MELMETAL_GIGANTAMAX 1502 -#define SPECIES_RILLABOOM_GIGANTAMAX 1503 -#define SPECIES_CINDERACE_GIGANTAMAX 1504 -#define SPECIES_INTELEON_GIGANTAMAX 1505 -#define SPECIES_CORVIKNIGHT_GIGANTAMAX 1506 -#define SPECIES_ORBEETLE_GIGANTAMAX 1507 -#define SPECIES_DREDNAW_GIGANTAMAX 1508 -#define SPECIES_COALOSSAL_GIGANTAMAX 1509 -#define SPECIES_FLAPPLE_GIGANTAMAX 1510 -#define SPECIES_APPLETUN_GIGANTAMAX 1511 -#define SPECIES_SANDACONDA_GIGANTAMAX 1512 -#define SPECIES_TOXTRICITY_AMPED_GIGANTAMAX 1513 -#define SPECIES_TOXTRICITY_LOW_KEY_GIGANTAMAX 1514 -#define SPECIES_CENTISKORCH_GIGANTAMAX 1515 -#define SPECIES_HATTERENE_GIGANTAMAX 1516 -#define SPECIES_GRIMMSNARL_GIGANTAMAX 1517 -#define SPECIES_ALCREMIE_GIGANTAMAX 1518 -#define SPECIES_COPPERAJAH_GIGANTAMAX 1519 -#define SPECIES_DURALUDON_GIGANTAMAX 1520 -#define SPECIES_URSHIFU_SINGLE_STRIKE_STYLE_GIGANTAMAX 1521 -#define SPECIES_URSHIFU_RAPID_STRIKE_STYLE_GIGANTAMAX 1522 -#define SPECIES_MIMIKYU_TOTEM_BUSTED 1523 +#define SPECIES_PIKACHU_STARTER 1487 +#define SPECIES_EEVEE_STARTER 1488 +#define SPECIES_VENUSAUR_GMAX 1489 +#define SPECIES_BLASTOISE_GMAX 1490 +#define SPECIES_CHARIZARD_GMAX 1491 +#define SPECIES_BUTTERFREE_GMAX 1492 +#define SPECIES_PIKACHU_GMAX 1493 +#define SPECIES_MEOWTH_GMAX 1494 +#define SPECIES_MACHAMP_GMAX 1495 +#define SPECIES_GENGAR_GMAX 1496 +#define SPECIES_KINGLER_GMAX 1497 +#define SPECIES_LAPRAS_GMAX 1498 +#define SPECIES_EEVEE_GMAX 1499 +#define SPECIES_SNORLAX_GMAX 1500 +#define SPECIES_GARBODOR_GMAX 1501 +#define SPECIES_MELMETAL_GMAX 1502 +#define SPECIES_RILLABOOM_GMAX 1503 +#define SPECIES_CINDERACE_GMAX 1504 +#define SPECIES_INTELEON_GMAX 1505 +#define SPECIES_CORVIKNIGHT_GMAX 1506 +#define SPECIES_ORBEETLE_GMAX 1507 +#define SPECIES_DREDNAW_GMAX 1508 +#define SPECIES_COALOSSAL_GMAX 1509 +#define SPECIES_FLAPPLE_GMAX 1510 +#define SPECIES_APPLETUN_GMAX 1511 +#define SPECIES_SANDACONDA_GMAX 1512 +#define SPECIES_TOXTRICITY_AMPED_GMAX 1513 +#define SPECIES_TOXTRICITY_LOW_KEY_GMAX 1514 +#define SPECIES_CENTISKORCH_GMAX 1515 +#define SPECIES_HATTERENE_GMAX 1516 +#define SPECIES_GRIMMSNARL_GMAX 1517 +#define SPECIES_ALCREMIE_GMAX 1518 +#define SPECIES_COPPERAJAH_GMAX 1519 +#define SPECIES_DURALUDON_GMAX 1520 +#define SPECIES_URSHIFU_SINGLE_STRIKE_GMAX 1521 +#define SPECIES_URSHIFU_GMAX SPECIES_URSHIFU_SINGLE_STRIKE_GMAX +#define SPECIES_URSHIFU_SINGLE_STRIKE_STYLE_GMAX SPECIES_URSHIFU_SINGLE_STRIKE_GMAX +#define SPECIES_URSHIFU_RAPID_STRIKE_GMAX 1522 +#define SPECIES_URSHIFU_RAPID_STRIKE_STYLE_GMAX SPECIES_URSHIFU_RAPID_STRIKE_GMAX +#define SPECIES_MIMIKYU_BUSTED_TOTEM 1523 +#define SPECIES_MIMIKYU_TOTEM_BUSTED SPECIES_MIMIKYU_BUSTED_TOTEM -#define SPECIES_EGG (SPECIES_MIMIKYU_TOTEM_BUSTED + 1) +#define SPECIES_EGG (SPECIES_MIMIKYU_BUSTED_TOTEM + 1) #define NUM_SPECIES SPECIES_EGG #define SPECIES_SHINY_TAG 5000 -// Competitive format aliases -#define SPECIES_ALCREMIE_GMAX SPECIES_ALCREMIE_GIGANTAMAX -#define SPECIES_APPLETUN_GMAX SPECIES_APPLETUN_GIGANTAMAX -#define SPECIES_ARCANINE_HISUI SPECIES_ARCANINE_HISUIAN -#define SPECIES_ARTICUNO_GALAR SPECIES_ARTICUNO_GALARIAN -#define SPECIES_AVALUGG_HISUI SPECIES_AVALUGG_HISUIAN -#define SPECIES_BLASTOISE_GMAX SPECIES_BLASTOISE_GIGANTAMAX -#define SPECIES_BRAVIARY_HISUI SPECIES_BRAVIARY_HISUIAN -#define SPECIES_BURMY_SANDY SPECIES_BURMY_SANDY_CLOAK -#define SPECIES_BURMY_TRASH SPECIES_BURMY_TRASH_CLOAK -#define SPECIES_BUTTERFREE_GMAX SPECIES_BUTTERFREE_GIGANTAMAX -#define SPECIES_CALYREX_ICE SPECIES_CALYREX_ICE_RIDER -#define SPECIES_CALYREX_SHADOW SPECIES_CALYREX_SHADOW_RIDER -#define SPECIES_CENTISKORCH_GMAX SPECIES_CENTISKORCH_GIGANTAMAX -#define SPECIES_CHARIZARD_GMAX SPECIES_CHARIZARD_GIGANTAMAX -#define SPECIES_CINDERACE_GMAX SPECIES_CINDERACE_GIGANTAMAX -#define SPECIES_COALOSSAL_GMAX SPECIES_COALOSSAL_GIGANTAMAX -#define SPECIES_COPPERAJAH_GMAX SPECIES_COPPERAJAH_GIGANTAMAX -#define SPECIES_CORSOLA_GALAR SPECIES_CORSOLA_GALARIAN -#define SPECIES_CORVIKNIGHT_GMAX SPECIES_CORVIKNIGHT_GIGANTAMAX -#define SPECIES_DARMANITAN_GALAR SPECIES_DARMANITAN_GALARIAN_STANDARD_MODE -#define SPECIES_DARMANITAN_GALAR_ZEN SPECIES_DARMANITAN_GALARIAN_ZEN_MODE -#define SPECIES_DARMANITAN_ZEN SPECIES_DARMANITAN_ZEN_MODE -#define SPECIES_DARUMAKA_GALAR SPECIES_DARUMAKA_GALARIAN -#define SPECIES_DECIDUEYE_HISUI SPECIES_DECIDUEYE_HISUIAN -#define SPECIES_DIGLETT_ALOLA SPECIES_DIGLETT_ALOLAN -#define SPECIES_DREDNAW_GMAX SPECIES_DREDNAW_GIGANTAMAX -#define SPECIES_DUGTRIO_ALOLA SPECIES_DUGTRIO_ALOLAN -#define SPECIES_DURALUDON_GMAX SPECIES_DURALUDON_GIGANTAMAX -#define SPECIES_EEVEE_GMAX SPECIES_EEVEE_GIGANTAMAX -#define SPECIES_EEVEE_STARTER SPECIES_EEVEE_PARTNER -#define SPECIES_EISCUE_NOICE SPECIES_EISCUE_NOICE_FACE -#define SPECIES_ELECTRODE_HISUI SPECIES_ELECTRODE_HISUIAN -#define SPECIES_EXEGGUTOR_ALOLA SPECIES_EXEGGUTOR_ALOLAN -#define SPECIES_FARFETCHD_GALAR SPECIES_FARFETCHD_GALARIAN -#define SPECIES_FLAPPLE_GMAX SPECIES_FLAPPLE_GIGANTAMAX -#define SPECIES_FLOETTE_ETERNAL SPECIES_FLOETTE_ETERNAL_FLOWER -#define SPECIES_GARBODOR_GMAX SPECIES_GARBODOR_GIGANTAMAX -#define SPECIES_GASTRODON_EAST SPECIES_GASTRODON_EAST_SEA -#define SPECIES_GENESECT_BURN SPECIES_GENESECT_BURN_DRIVE -#define SPECIES_GENESECT_CHILL SPECIES_GENESECT_CHILL_DRIVE -#define SPECIES_GENESECT_DOUSE SPECIES_GENESECT_DOUSE_DRIVE -#define SPECIES_GENESECT_SHOCK SPECIES_GENESECT_SHOCK_DRIVE -#define SPECIES_GENGAR_GMAX SPECIES_GENGAR_GIGANTAMAX -#define SPECIES_GEODUDE_ALOLA SPECIES_GEODUDE_ALOLAN -#define SPECIES_GOLEM_ALOLA SPECIES_GOLEM_ALOLAN -#define SPECIES_GOODRA_HISUI SPECIES_GOODRA_HISUIAN -#define SPECIES_GRAVELER_ALOLA SPECIES_GRAVELER_ALOLAN -#define SPECIES_GRENINJA_BOND SPECIES_GRENINJA_BATTLE_BOND -#define SPECIES_GRIMER_ALOLA SPECIES_GRIMER_ALOLAN -#define SPECIES_GRIMMSNARL_GMAX SPECIES_GRIMMSNARL_GIGANTAMAX -#define SPECIES_GROWLITHE_HISUI SPECIES_GROWLITHE_HISUIAN -#define SPECIES_HATTERENE_GMAX SPECIES_HATTERENE_GIGANTAMAX -#define SPECIES_INTELEON_GMAX SPECIES_INTELEON_GIGANTAMAX -#define SPECIES_KINGLER_GMAX SPECIES_KINGLER_GIGANTAMAX -#define SPECIES_LAPRAS_GMAX SPECIES_LAPRAS_GIGANTAMAX -#define SPECIES_LILLIGANT_HISUI SPECIES_LILLIGANT_HISUIAN -#define SPECIES_LINOONE_GALAR SPECIES_LINOONE_GALARIAN -#define SPECIES_MACHAMP_GMAX SPECIES_MACHAMP_GIGANTAMAX -#define SPECIES_MAGEARNA_ORIGINAL SPECIES_MAGEARNA_ORIGINAL_COLOR -#define SPECIES_MAROWAK_ALOLA SPECIES_MAROWAK_ALOLAN -#define SPECIES_MAROWAK_ALOLA_TOTEM SPECIES_MAROWAK_ALOLAN_TOTEM -#define SPECIES_MAUSHOLD_FOUR SPECIES_MAUSHOLD_FAMILY_OF_FOUR -#define SPECIES_MELMETAL_GMAX SPECIES_MELMETAL_GIGANTAMAX -#define SPECIES_MEOWTH_ALOLA SPECIES_MEOWTH_ALOLAN -#define SPECIES_MEOWTH_GALAR SPECIES_MEOWTH_GALARIAN -#define SPECIES_MEOWTH_GMAX SPECIES_MEOWTH_GIGANTAMAX -#define SPECIES_MOLTRES_GALAR SPECIES_MOLTRES_GALARIAN -#define SPECIES_MR_MIME_GALAR SPECIES_MR_MIME_GALARIAN -#define SPECIES_MUK_ALOLA SPECIES_MUK_ALOLAN -#define SPECIES_NINETALES_ALOLA SPECIES_NINETALES_ALOLAN -#define SPECIES_OGERPON_TEAL SPECIES_OGERPON_TEAL_MASK -#define SPECIES_OGERPON_WELLSPRING SPECIES_OGERPON_WELLSPRING_MASK -#define SPECIES_OGERPON_HEARTHFLAME SPECIES_OGERPON_HEARTHFLAME_MASK -#define SPECIES_OGERPON_CORNERSTONE SPECIES_OGERPON_CORNERSTONE_MASK -#define SPECIES_ORBEETLE_GMAX SPECIES_ORBEETLE_GIGANTAMAX -#define SPECIES_PERSIAN_ALOLA SPECIES_PERSIAN_ALOLAN -#define SPECIES_PIKACHU_ALOLA SPECIES_PIKACHU_ALOLA_CAP -#define SPECIES_PIKACHU_GMAX SPECIES_PIKACHU_GIGANTAMAX -#define SPECIES_PIKACHU_HOENN SPECIES_PIKACHU_HOENN_CAP -#define SPECIES_PIKACHU_KALOS SPECIES_PIKACHU_KALOS_CAP -#define SPECIES_PIKACHU_ORIGINAL SPECIES_PIKACHU_ORIGINAL_CAP -//#define SPECIES_PIKACHU_PARTNER SPECIES_PIKACHU_PARTNER_CAP -#define SPECIES_PIKACHU_PHD SPECIES_PIKACHU_PH_D -#define SPECIES_PIKACHU_SINNOH SPECIES_PIKACHU_SINNOH_CAP -#define SPECIES_PIKACHU_STARTER SPECIES_PIKACHU_PARTNER -#define SPECIES_PIKACHU_UNOVA SPECIES_PIKACHU_UNOVA_CAP -#define SPECIES_PIKACHU_WORLD SPECIES_PIKACHU_WORLD_CAP -#define SPECIES_PONYTA_GALAR SPECIES_PONYTA_GALARIAN -#define SPECIES_QWILFISH_HISUI SPECIES_QWILFISH_HISUIAN -#define SPECIES_RAICHU_ALOLA SPECIES_RAICHU_ALOLAN -#define SPECIES_RAPIDASH_GALAR SPECIES_RAPIDASH_GALARIAN -#define SPECIES_RATICATE_ALOLA SPECIES_RATICATE_ALOLAN -#define SPECIES_RATICATE_ALOLA_TOTEM SPECIES_RATICATE_ALOLAN_TOTEM -#define SPECIES_RATTATA_ALOLA SPECIES_RATTATA_ALOLAN -#define SPECIES_RILLABOOM_GMAX SPECIES_RILLABOOM_GIGANTAMAX -#define SPECIES_SAMUROTT_HISUI SPECIES_SAMUROTT_HISUIAN -#define SPECIES_SANDACONDA_GMAX SPECIES_SANDACONDA_GIGANTAMAX -#define SPECIES_SANDSHREW_ALOLA SPECIES_SANDSHREW_ALOLAN -#define SPECIES_SANDSLASH_ALOLA SPECIES_SANDSLASH_ALOLAN -#define SPECIES_SHELLOS_EAST SPECIES_SHELLOS_EAST_SEA -#define SPECIES_SIRFETCH_D SPECIES_SIRFETCHD -#define SPECIES_SLIGGOO_HISUI SPECIES_SLIGGOO_HISUIAN -#define SPECIES_SLOWBRO_GALAR SPECIES_SLOWBRO_GALARIAN -#define SPECIES_SLOWKING_GALAR SPECIES_SLOWKING_GALARIAN -#define SPECIES_SLOWPOKE_GALAR SPECIES_SLOWPOKE_GALARIAN -#define SPECIES_SNEASEL_HISUI SPECIES_SNEASEL_HISUIAN -#define SPECIES_SNORLAX_GMAX SPECIES_SNORLAX_GIGANTAMAX -#define SPECIES_SQUAWKABILLY_BLUE SPECIES_SQUAWKABILLY_BLUE_PLUMAGE -#define SPECIES_SQUAWKABILLY_WHITE SPECIES_SQUAWKABILLY_WHITE_PLUMAGE -#define SPECIES_SQUAWKABILLY_YELLOW SPECIES_SQUAWKABILLY_YELLOW_PLUMAGE -#define SPECIES_STUNFISK_GALAR SPECIES_STUNFISK_GALARIAN -#define SPECIES_TAUROS_PALDEA_AQUA SPECIES_TAUROS_PALDEAN_AQUA_BREED -#define SPECIES_TAUROS_PALDEA_BLAZE SPECIES_TAUROS_PALDEAN_BLAZE_BREED -#define SPECIES_TAUROS_PALDEA_COMBAT SPECIES_TAUROS_PALDEAN_COMBAT_BREED -#define SPECIES_TOXTRICITY_AMPED_GMAX SPECIES_TOXTRICITY_AMPED_GIGANTAMAX -#define SPECIES_TOXTRICITY_LOW_KEY_GMAX SPECIES_TOXTRICITY_LOW_KEY_GIGANTAMAX -#define SPECIES_TYPHLOSION_HISUI SPECIES_TYPHLOSION_HISUIAN -#define SPECIES_UNOWN_EXCLAMATION SPECIES_UNOWN_EMARK -#define SPECIES_UNOWN_QUESTION SPECIES_UNOWN_QMARK -#define SPECIES_URSHIFU_GMAX SPECIES_URSHIFU_SINGLE_STRIKE_STYLE_GIGANTAMAX -#define SPECIES_URSHIFU_RAPID_STRIKE SPECIES_URSHIFU_RAPID_STRIKE_STYLE -#define SPECIES_URSHIFU_RAPID_STRIKE_GMAX SPECIES_URSHIFU_RAPID_STRIKE_STYLE_GIGANTAMAX -#define SPECIES_VENUSAUR_GMAX SPECIES_VENUSAUR_GIGANTAMAX -#define SPECIES_VIVILLON_POKEBALL SPECIES_VIVILLON_POKE_BALL -#define SPECIES_VOLTORB_HISUI SPECIES_VOLTORB_HISUIAN -#define SPECIES_VULPIX_ALOLA SPECIES_VULPIX_ALOLAN -#define SPECIES_WEEZING_GALAR SPECIES_WEEZING_GALARIAN -#define SPECIES_WOOPER_PALDEA SPECIES_WOOPER_PALDEAN -#define SPECIES_WORMADAM_SANDY SPECIES_WORMADAM_SANDY_CLOAK -#define SPECIES_WORMADAM_TRASH SPECIES_WORMADAM_TRASH_CLOAK -#define SPECIES_YAMASK_GALAR SPECIES_YAMASK_GALARIAN -#define SPECIES_ZACIAN_CROWNED SPECIES_ZACIAN_CROWNED_SWORD -#define SPECIES_ZAMAZENTA_CROWNED SPECIES_ZAMAZENTA_CROWNED_SHIELD -#define SPECIES_ZAPDOS_GALAR SPECIES_ZAPDOS_GALARIAN -#define SPECIES_ZIGZAGOON_GALAR SPECIES_ZIGZAGOON_GALARIAN -#define SPECIES_ZOROARK_HISUI SPECIES_ZOROARK_HISUIAN -#define SPECIES_ZORUA_HISUI SPECIES_ZORUA_HISUIAN - #endif // GUARD_CONSTANTS_SPECIES_H diff --git a/include/ev_caps.h b/include/ev_caps.h deleted file mode 100644 index 2b2dd0b02bd7..000000000000 --- a/include/ev_caps.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef GUARD_EV_CAP_H -#define GUARD_EV_CAP_H - -#if B_EV_CAP_TYPE != EV_CAP_NONE && B_EV_CAP_TYPE != EV_CAP_FLAG_LIST && B_EV_CAP_TYPE != EV_CAP_VARIABLE && B_EV_CAP_TYPE != EV_CAP_NO_GAIN -#error "Invalid choice for B_EV_CAP_TYPE, must be one of [EV_CAP_NONE, EV_CAP_FLAG_LIST, EV_CAP_VARIABLE, EV_CAP_NO_GAIN]" -#endif - -u32 GetCurrentEVCap(void); - -#endif /* GUARD_EV_CAP_H */ diff --git a/include/event_object_movement.h b/include/event_object_movement.h index 2906789b3754..22993cddd90d 100644 --- a/include/event_object_movement.h +++ b/include/event_object_movement.h @@ -113,6 +113,7 @@ extern const struct OamData gObjectEventBaseOam_64x64; extern const struct SubspriteTable sOamTables_32x32[]; extern const struct SubspriteTable sOamTables_64x64[]; extern const union AnimCmd *const sAnimTable_Following[]; +extern const union AnimCmd *const sAnimTable_Following_Asym[]; extern const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[]; extern const u8 gReflectionEffectPaletteMap[]; @@ -309,7 +310,7 @@ u8 CreateCopySpriteAt(struct Sprite *sprite, s16 x, s16 y, u8 subpriority); u8 MovementType_WanderAround_Step0(struct ObjectEvent *, struct Sprite *); u8 MovementType_WanderAround_Step1(struct ObjectEvent *, struct Sprite *); u8 MovementType_WanderAround_Step2(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WanderAround_Step3(struct ObjectEvent *, struct Sprite *); +u8 MovementType_Wander_Step3(struct ObjectEvent *, struct Sprite *); u8 MovementType_WanderAround_Step4(struct ObjectEvent *, struct Sprite *); u8 MovementType_WanderAround_Step5(struct ObjectEvent *, struct Sprite *); u8 MovementType_WanderAround_Step6(struct ObjectEvent *, struct Sprite *); @@ -332,14 +333,12 @@ u8 MovementType_LookAround_Step4(struct ObjectEvent *, struct Sprite *); u8 MovementType_WanderUpAndDown_Step0(struct ObjectEvent *, struct Sprite *); u8 MovementType_WanderUpAndDown_Step1(struct ObjectEvent *, struct Sprite *); u8 MovementType_WanderUpAndDown_Step2(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WanderUpAndDown_Step3(struct ObjectEvent *, struct Sprite *); u8 MovementType_WanderUpAndDown_Step4(struct ObjectEvent *, struct Sprite *); u8 MovementType_WanderUpAndDown_Step5(struct ObjectEvent *, struct Sprite *); u8 MovementType_WanderUpAndDown_Step6(struct ObjectEvent *, struct Sprite *); u8 MovementType_WanderLeftAndRight_Step0(struct ObjectEvent *, struct Sprite *); u8 MovementType_WanderLeftAndRight_Step1(struct ObjectEvent *, struct Sprite *); u8 MovementType_WanderLeftAndRight_Step2(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WanderLeftAndRight_Step3(struct ObjectEvent *, struct Sprite *); u8 MovementType_WanderLeftAndRight_Step4(struct ObjectEvent *, struct Sprite *); u8 MovementType_WanderLeftAndRight_Step5(struct ObjectEvent *, struct Sprite *); u8 MovementType_WanderLeftAndRight_Step6(struct ObjectEvent *, struct Sprite *); @@ -484,6 +483,15 @@ void SetVirtualObjectInvisibility(u8 virtualObjId, bool32 invisible); bool32 IsVirtualObjectInvisible(u8 virtualObjId); void SetVirtualObjectSpriteAnim(u8 virtualObjId, u8 animNum); bool32 IsVirtualObjectAnimating(u8 virtualObjId); +u8 GetObjectEventIdByLocalId(u8 localId); +bool32 IsFollowerVisible(void); + +// run slow +u8 GetPlayerRunSlowMovementAction(u32); +//sideways stairs +u8 GetSidewaysStairsToRightDirection(s16, s16, u8); +u8 GetSidewaysStairsToLeftDirection(s16, s16, u8); +u8 GetSidewaysStairsCollision(struct ObjectEvent *objectEvent, u8 dir, u8 currentBehavior, u8 nextBehavior, u8 collision); bool8 MovementAction_EmoteX_Step0(struct ObjectEvent *, struct Sprite *); bool8 MovementAction_EmoteDoubleExclamationMark_Step0(struct ObjectEvent *, struct Sprite *); diff --git a/include/field_player_avatar.h b/include/field_player_avatar.h index caf28afb876a..12de71be8f1e 100644 --- a/include/field_player_avatar.h +++ b/include/field_player_avatar.h @@ -64,5 +64,9 @@ bool32 IsPlayerSpinExitActive(void); void SetPlayerInvisibility(bool8 invisible); u8 player_get_pos_including_state_based_drift(s16 *x, s16 *y); void StartFishing(u8 rod); +bool8 ObjectMovingOnRockStairs(struct ObjectEvent *objectEvent, u8 direction); +//sideways stairs +u8 GetRightSideStairsDirection(u8 direction); +u8 GetLeftSideStairsDirection(u8 direction); #endif // GUARD_FIELD_PLAYER_AVATAR_H diff --git a/include/field_screen_effect.h b/include/field_screen_effect.h index 9b3aa6229e5f..3f120ffdeba4 100644 --- a/include/field_screen_effect.h +++ b/include/field_screen_effect.h @@ -42,5 +42,7 @@ void DoOrbEffect(void); void FadeOutOrbEffect(void); void WriteFlashScanlineEffectBuffer(u8 flashLevel); bool8 IsPlayerStandingStill(void); +void DoStairWarp(u16 metatileBehavior, u16 delay); +bool32 IsDirectionalStairWarpMetatileBehavior(u16 metatileBehavior, u8 playerDirection); #endif // GUARD_FIELD_SCREEN_EFFECT_H diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h index 29249712b6e5..a9b859209ba5 100644 --- a/include/global.fieldmap.h +++ b/include/global.fieldmap.h @@ -217,7 +217,8 @@ struct ObjectEvent /*0x1D*/ u8 trainerRange_berryTreeId; /*0x1E*/ u8 currentMetatileBehavior; /*0x1F*/ u8 previousMetatileBehavior; - /*0x20*/ u8 previousMovementDirection; + /*0x20*/ u8 previousMovementDirection:4; + u8 directionOverwrite:4; /*0x21*/ u8 directionSequenceIndex; /*0x22*/ u8 playerCopyableMovement; // COPY_MOVE_* /*0x23*/ u8 spriteId; @@ -297,6 +298,9 @@ enum COLLISION_ISOLATED_HORIZONTAL_RAIL, COLLISION_VERTICAL_RAIL, COLLISION_HORIZONTAL_RAIL, + COLLISION_STAIR_WARP, + COLLISION_SIDEWAYS_STAIRS_TO_RIGHT, + COLLISION_SIDEWAYS_STAIRS_TO_LEFT }; // player running states diff --git a/include/graphics.h b/include/graphics.h index e11acf897805..06b5ab1b2d9f 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -2887,6 +2887,8 @@ extern const u32 gBattleAnimSpritePal_IvyCudgelGrass[]; extern const u32 gBattleAnimSpritePal_IvyCudgelFire[]; extern const u32 gBattleAnimSpritePal_IvyCudgelRock[]; extern const u32 gBattleAnimSpritePal_IvyCudgelWater[]; +extern const u32 gBattleAnimSpriteGfx_PinkVioletOrb[]; +extern const u32 gBattleAnimSpritePal_PinkVioletOrb[]; extern const u32 gBattleAnimBgImage_Dark[]; extern const u32 gBattleAnimBgImage_Ghost[]; diff --git a/include/item_use.h b/include/item_use.h index c5a21862fd6d..d7871fd6f2c1 100644 --- a/include/item_use.h +++ b/include/item_use.h @@ -47,6 +47,8 @@ u8 CheckIfItemIsTMHMOrEvolutionStone(u16 itemId); void FieldUseFunc_VsSeeker(u8 taskId); void Task_ItemUse_CloseMessageBoxAndReturnToField_VsSeeker(u8 taskId); void DisplayDadsAdviceCannotUseItemMessage(u8 taskId, bool8 isUsingRegisteredKeyItemOnField); +void ItemUseOutOfBattle_PokeFlute(u8 taskId); +void ItemUseOutOfBattle_TownMap(u8 taskId); enum { BALL_THROW_UNABLE_TWO_MONS, diff --git a/include/link.h b/include/link.h index 66dd5fecd2af..676306505515 100644 --- a/include/link.h +++ b/include/link.h @@ -344,5 +344,6 @@ bool8 DoesLinkPlayerCountMatchSaved(void); void SetCloseLinkCallbackAndType(u16 type); bool32 IsSendingKeysToLink(void); u32 GetLinkRecvQueueLength(void); +bool32 ShouldCheckForUnionRoom(void); #endif // GUARD_LINK_H diff --git a/include/metatile_behavior.h b/include/metatile_behavior.h index 5bb95bc18e3f..58eb83ea7b22 100644 --- a/include/metatile_behavior.h +++ b/include/metatile_behavior.h @@ -148,8 +148,22 @@ bool8 MetatileBehavior_IsQuestionnaire(u8); bool8 MetatileBehavior_IsLongGrass_Duplicate(u8); bool8 MetatileBehavior_IsLongGrassSouthEdge(u8); bool8 MetatileBehavior_IsTrainerHillTimer(u8); -bool32 MetatileBehavior_IsSignpost(u32); -bool32 MetatileBehavior_IsPokemonCenterSign(u32); -bool32 MetatileBehavior_IsPokeMartSign(u32); +bool8 MetatileBehavior_IsDirectionalUpRightStairWarp(u8 metatileBehavior); +bool8 MetatileBehavior_IsDirectionalUpLeftStairWarp(u8 metatileBehavior); +bool8 MetatileBehavior_IsDirectionalDownRightStairWarp(u8 metatileBehavior); +bool8 MetatileBehavior_IsDirectionalDownLeftStairWarp(u8 metatileBehavior); +bool8 MetatileBehavior_IsDirectionalStairWarp(u8 metatileBehavior); +bool8 MetatileBehavior_IsSignpost(u32); +bool8 MetatileBehavior_IsPokemonCenterSign(u32); +bool8 MetatileBehavior_IsPokeMartSign(u32); +bool8 MetatileBehavior_IsRockStairs(u8); +bool8 MetatileBehavior_IsSidewaysStairsRightSide(u8); +bool8 MetatileBehavior_IsSidewaysStairsLeftSide(u8); +bool8 MetatileBehavior_IsSidewaysStairsRightSideTop(u8 metatileBehavior); +bool8 MetatileBehavior_IsSidewaysStairsLeftSideTop(u8 metatileBehavior); +bool8 MetatileBehavior_IsSidewaysStairsRightSideBottom(u8 metatileBehavior); +bool8 MetatileBehavior_IsSidewaysStairsLeftSideBottom(u8 metatileBehavior); +bool8 MetatileBehavior_IsSidewaysStairsRightSideAny(u8 metatileBehavior); +bool8 MetatileBehavior_IsSidewaysStairsLeftSideAny(u8 metatileBehavior); #endif // GUARD_METATILE_BEHAVIOR_H diff --git a/include/overworld.h b/include/overworld.h index 3e9dbc30b6c2..28a4aa9277b7 100644 --- a/include/overworld.h +++ b/include/overworld.h @@ -51,6 +51,7 @@ extern void (*gFieldCallback)(void); extern bool8 (*gFieldCallback2)(void); extern u8 gLocalLinkPlayerId; extern u8 gFieldLinkPlayerCount; +extern bool8 gExitStairsMovementDisabled; extern const struct UCoords32 gDirectionToVectors[]; diff --git a/include/party_menu.h b/include/party_menu.h index a34f06cec6bb..abea29b6bbbe 100644 --- a/include/party_menu.h +++ b/include/party_menu.h @@ -102,5 +102,6 @@ void MoveDeleterForgetMove(void); void BufferMoveDeleterNicknameAndMove(void); void GetNumMovesSelectedMonHas(void); void MoveDeleterChooseMoveToForget(void); +bool32 IsItemFlute(u16 item); #endif // GUARD_PARTY_MENU_H diff --git a/include/pokemon.h b/include/pokemon.h index 4dbd86a39118..14288ddee778 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -457,9 +457,12 @@ struct SpeciesInfo /*0xC4*/ /* 0x94 */ const struct FormChange *formChangeTable; #if OW_POKEMON_OBJECT_EVENTS /* 0x98 */ struct ObjectEventGraphicsInfo overworldData; + struct ObjectEventGraphicsInfo overworldDataFemale; #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE /* 0xBC */ const void* overworldPalette; + const void* overworldPaletteFemale; /* 0xC0 */ const void* overworldShinyPalette; + const void* overworldShinyPaletteFemale; #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS }; diff --git a/include/random.h b/include/random.h index b5ce987f3900..d41e4785435b 100644 --- a/include/random.h +++ b/include/random.h @@ -161,7 +161,12 @@ enum RandomTag RNG_TRACE, RNG_FICKLE_BEAM, RNG_AI_ABILITY, - RNG_AI_HASBADODDS, + RNG_AI_SWITCH_HASBADODDS, + RNG_AI_SWITCH_WONDER_GUARD, + RNG_AI_SWITCH_BADLY_POISONED, + RNG_AI_SWITCH_CURSED, + RNG_AI_SWITCH_NIGHTMARE, + RNG_AI_SWITCH_SEEDED, RNG_SHELL_SIDE_ARM, }; diff --git a/include/strings.h b/include/strings.h index 84f87ff491fa..b1078bed0a99 100644 --- a/include/strings.h +++ b/include/strings.h @@ -833,6 +833,9 @@ extern const u8 gText_UsedVar2WildRepelled[]; extern const u8 gText_BoxFull[]; extern const u8 gText_WontHaveEffect[]; extern const u8 gText_NextFusionMon[]; +extern const u8 gText_PlayedPokeFluteCatchy[]; +extern const u8 gText_PlayedPokeFlute[]; +extern const u8 gText_PokeFluteAwakenedMon[]; extern const u8 gText_LevelSymbol[]; extern const u8 gText_PkmnInfo[]; diff --git a/include/test/battle.h b/include/test/battle.h index c28410948deb..041ebc1c725b 100644 --- a/include/test/battle.h +++ b/include/test/battle.h @@ -645,6 +645,15 @@ struct AILogLine s16 score; }; +// Data which is updated by the test runner during a battle and needs to +// be reset between trials. +struct BattleTrialData +{ + u8 lastActionTurn; + u8 queuedEvent; + u8 aiActionsPlayed[MAX_BATTLERS_COUNT]; +}; + struct BattleTestData { u8 stack[BATTLE_TEST_STACK_SIZE]; @@ -676,20 +685,19 @@ struct BattleTestData u8 battleRecordSourceLineOffsets[MAX_BATTLERS_COUNT][BATTLER_RECORD_SIZE]; u16 recordIndexes[MAX_BATTLERS_COUNT]; struct BattlerTurn battleRecordTurns[MAX_TURNS][MAX_BATTLERS_COUNT]; - u8 lastActionTurn; u8 queuedEventsCount; u8 queueGroupType; u8 queueGroupStart; - u8 queuedEvent; struct QueuedEvent queuedEvents[MAX_QUEUED_EVENTS]; u8 expectedAiActionIndex[MAX_BATTLERS_COUNT]; - u8 aiActionsPlayed[MAX_BATTLERS_COUNT]; struct ExpectedAIAction expectedAiActions[MAX_BATTLERS_COUNT][MAX_EXPECTED_ACTIONS]; struct ExpectedAiScore expectedAiScores[MAX_BATTLERS_COUNT][MAX_TURNS][MAX_AI_SCORE_COMPARISION_PER_TURN]; // Max 4 comparisions per turn struct AILogLine aiLogLines[MAX_BATTLERS_COUNT][MAX_MON_MOVES][MAX_AI_LOG_LINES]; u8 aiLogPrintedForMove[MAX_BATTLERS_COUNT]; // Marks ai score log as printed for move, so the same log isn't displayed multiple times. u16 flagId; + + struct BattleTrialData trial; }; struct BattleTestRunnerState diff --git a/migration_scripts/README.md b/migration_scripts/README.md index 5ae26c1c0afc..5ff925d8ef2e 100644 --- a/migration_scripts/README.md +++ b/migration_scripts/README.md @@ -11,7 +11,7 @@ These scripts exist to help developers make the transition between refactored sy All migration scripts require [`python3`](https://www.python.org/downloads/) to be installed. Migration scripts are executed by running the following commands from the root directory of a developer's project. ```bash -chmod +x migration_scripts/*.py ; #give permision to make the script executable +chmod +x migration_scripts/*.py ; #give permission to make the script executable python3 migration_scripts/*.py ; #run the migration script ``` diff --git a/spritesheet_rules.mk b/spritesheet_rules.mk index e97b1b5ffe87..5e9a4d7532e9 100644 --- a/spritesheet_rules.mk +++ b/spritesheet_rules.mk @@ -744,6 +744,9 @@ $(POKEMONGFXDIR)/ivysaur/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/venusaur/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/venusaur/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/charmander/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -771,6 +774,9 @@ $(POKEMONGFXDIR)/metapod/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/butterfree/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/butterfree/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/weedle/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -792,9 +798,15 @@ $(POKEMONGFXDIR)/pidgeot/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/rattata/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/rattata/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/raticate/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/raticate/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/spearow/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -810,9 +822,15 @@ $(POKEMONGFXDIR)/arbok/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/pikachu/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/pikachu/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/raichu/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/raichu/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/sandshrew/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -858,18 +876,30 @@ $(POKEMONGFXDIR)/wigglytuff/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/zubat/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/zubat/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/golbat/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/golbat/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/oddish/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 $(POKEMONGFXDIR)/gloom/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/gloom/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/vileplume/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/vileplume/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/paras/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -927,9 +957,15 @@ $(POKEMONGFXDIR)/abra/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/kadabra/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/kadabra/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/alakazam/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/alakazam/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/machop/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -987,9 +1023,15 @@ $(POKEMONGFXDIR)/farfetchd/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/doduo/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/doduo/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/dodrio/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/dodrio/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/seel/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1026,6 +1068,9 @@ $(POKEMONGFXDIR)/drowzee/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/hypno/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/hypno/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/krabby/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1068,9 +1113,15 @@ $(POKEMONGFXDIR)/weezing/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/rhyhorn/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/rhyhorn/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/rhydon/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/rhydon/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/chansey/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1089,9 +1140,15 @@ $(POKEMONGFXDIR)/seadra/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/goldeen/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/goldeen/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/seaking/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/seaking/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/staryu/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1104,6 +1161,9 @@ $(POKEMONGFXDIR)/mr_mime/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/scyther/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/scyther/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/jynx/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1122,9 +1182,15 @@ $(POKEMONGFXDIR)/tauros/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/magikarp/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/magikarp/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/gyarados/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/gyarados/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/lapras/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1134,6 +1200,9 @@ $(POKEMONGFXDIR)/ditto/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/eevee/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/eevee/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/vaporeon/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1197,6 +1266,9 @@ $(POKEMONGFXDIR)/bayleef/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/meganium/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/meganium/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/cyndaquil/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1230,9 +1302,15 @@ $(POKEMONGFXDIR)/noctowl/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/ledyba/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/ledyba/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/ledian/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/ledian/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/spinarak/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1269,6 +1347,9 @@ $(POKEMONGFXDIR)/natu/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/xatu/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/xatu/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/mareep/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1290,9 +1371,15 @@ $(POKEMONGFXDIR)/azumarill/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/sudowoodo/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/sudowoodo/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/politoed/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/politoed/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/hoppip/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1305,6 +1392,9 @@ $(POKEMONGFXDIR)/jumpluff/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/aipom/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/aipom/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/sunkern/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1317,9 +1407,15 @@ $(POKEMONGFXDIR)/yanma/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/wooper/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/wooper/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/quagsire/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/quagsire/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/espeon/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1329,6 +1425,9 @@ $(POKEMONGFXDIR)/umbreon/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/murkrow/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/murkrow/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/slowking/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1422,9 +1521,15 @@ $(POKEMONGFXDIR)/unown/question_mark/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/wobbuffet/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/wobbuffet/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/girafarig/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/girafarig/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/pineco/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1437,9 +1542,15 @@ $(POKEMONGFXDIR)/dunsparce/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/gligar/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/gligar/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/steelix/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 8 -mheight 8 +$(POKEMONGFXDIR)/steelix/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 8 -mheight 8 + $(POKEMONGFXDIR)/snubbull/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1452,21 +1563,33 @@ $(POKEMONGFXDIR)/qwilfish/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/scizor/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/scizor/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/shuckle/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 $(POKEMONGFXDIR)/heracross/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/heracross/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/sneasel/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/sneasel/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/teddiursa/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 $(POKEMONGFXDIR)/ursaring/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/ursaring/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/slugma/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1479,6 +1602,9 @@ $(POKEMONGFXDIR)/swinub/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/piloswine/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/piloswine/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/corsola/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1488,6 +1614,9 @@ $(POKEMONGFXDIR)/remoraid/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/octillery/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/octillery/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/delibird/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1503,6 +1632,9 @@ $(POKEMONGFXDIR)/houndour/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/houndoom/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/houndoom/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/kingdra/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1512,6 +1644,9 @@ $(POKEMONGFXDIR)/phanpy/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/donphan/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/donphan/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/porygon2/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1581,12 +1716,21 @@ $(POKEMONGFXDIR)/sceptile/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/torchic/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/torchic/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/combusken/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/combusken/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/blaziken/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/blaziken/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/mudkip/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1617,12 +1761,18 @@ $(POKEMONGFXDIR)/silcoon/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/beautifly/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/beautifly/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/cascoon/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 $(POKEMONGFXDIR)/dustox/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/dustox/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/lotad/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1632,15 +1782,24 @@ $(POKEMONGFXDIR)/lombre/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/ludicolo/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/ludicolo/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/seedot/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 $(POKEMONGFXDIR)/nuzleaf/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/nuzleaf/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/shiftry/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/shiftry/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/taillow/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1737,9 +1896,15 @@ $(POKEMONGFXDIR)/aggron/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/meditite/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/meditite/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/medicham/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/medicham/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/electrike/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1761,12 +1926,21 @@ $(POKEMONGFXDIR)/illumise/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/roselia/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/roselia/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/gulpin/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/gulpin/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/swalot/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/swalot/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/carvanha/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1782,9 +1956,15 @@ $(POKEMONGFXDIR)/wailord/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/numel/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/numel/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/camerupt/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/camerupt/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/torkoal/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1812,6 +1992,9 @@ $(POKEMONGFXDIR)/cacnea/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/cacturne/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/cacturne/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/swablu/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1866,6 +2049,9 @@ $(POKEMONGFXDIR)/feebas/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/milotic/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/milotic/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/castform/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1932,6 +2118,9 @@ $(POKEMONGFXDIR)/gorebyss/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/relicanth/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/relicanth/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/luvdisc/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -2013,39 +2202,72 @@ $(POKEMONGFXDIR)/empoleon/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/starly/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/starly/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/staravia/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/staravia/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/staraptor/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/staraptor/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/bidoof/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/bidoof/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/bibarel/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/bibarel/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/kricketot/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/kricketot/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/kricketune/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/kricketune/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/shinx/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/shinx/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/luxio/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/luxio/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/luxray/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/luxray/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/budew/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 $(POKEMONGFXDIR)/roserade/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/roserade/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/cranidos/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -2070,18 +2292,30 @@ $(POKEMONGFXDIR)/mothim/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/combee/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/combee/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/vespiquen/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 $(POKEMONGFXDIR)/pachirisu/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/pachirisu/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/buizel/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/buizel/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/floatzel/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/floatzel/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/cherubi/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -2097,6 +2331,9 @@ $(POKEMONGFXDIR)/gastrodon/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/ambipom/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/ambipom/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/drifloon/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -2154,12 +2391,21 @@ $(POKEMONGFXDIR)/spiritomb/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/gible/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/gible/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/gabite/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/gabite/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/garchomp/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/garchomp/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/munchlax/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -2172,9 +2418,15 @@ $(POKEMONGFXDIR)/lucario/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/hippopotas/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/hippopotas/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/hippowdon/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/hippowdon/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/skorupi/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -2184,30 +2436,51 @@ $(POKEMONGFXDIR)/drapion/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/croagunk/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/croagunk/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/toxicroak/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/toxicroak/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/carnivine/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 $(POKEMONGFXDIR)/finneon/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/finneon/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/lumineon/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/lumineon/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/mantyke/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 $(POKEMONGFXDIR)/snover/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/snover/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/abomasnow/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/abomasnow/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/weavile/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/weavile/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/magnezone/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -2217,9 +2490,15 @@ $(POKEMONGFXDIR)/lickilicky/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/rhyperior/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/rhyperior/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/tangrowth/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/tangrowth/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/electivire/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -2244,6 +2523,9 @@ $(POKEMONGFXDIR)/gliscor/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/mamoswine/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/mamoswine/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/porygon_z/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -2388,6 +2670,9 @@ $(POKEMONGFXDIR)/tranquill/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/unfezant/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/unfezant/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/blitzle/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -2601,9 +2886,15 @@ $(POKEMONGFXDIR)/amoonguss/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/frillish/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/frillish/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/jellicent/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/jellicent/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/alomomola/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -2829,6 +3120,9 @@ $(POKEMONGFXDIR)/litleo/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/pyroar/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/pyroar/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/flabebe/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -3633,6 +3927,9 @@ $(POKEMONGFXDIR)/qwilfish/hisuian/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/sneasel/hisuian/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/sneasel/hisuian/overworldf.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/zorua/hisuian/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -4413,6 +4710,60 @@ $(POKEMONGFXDIR)/tauros/paldean_combat_breed/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/ursaluna/bloodmoon/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/shaymin/sky/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(POKEMONGFXDIR)/oricorio/pom_pom/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(POKEMONGFXDIR)/oricorio/pau/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(POKEMONGFXDIR)/oricorio/sensu/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(POKEMONGFXDIR)/zygarde/10_percent/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(POKEMONGFXDIR)/zygarde/complete/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(POKEMONGFXDIR)/magearna/original_color/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(POKEMONGFXDIR)/kyurem/white/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(POKEMONGFXDIR)/kyurem/black/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(POKEMONGFXDIR)/tornadus/therian/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 8 -mheight 8 + +$(POKEMONGFXDIR)/thundurus/therian/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 8 -mheight 8 + +$(POKEMONGFXDIR)/landorus/therian/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(POKEMONGFXDIR)/pumpkaboo/small/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(POKEMONGFXDIR)/pumpkaboo/large/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(POKEMONGFXDIR)/pumpkaboo/super/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(POKEMONGFXDIR)/gourgeist/small/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(POKEMONGFXDIR)/gourgeist/large/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(POKEMONGFXDIR)/gourgeist/super/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(MISCGFXDIR)/emotes.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index af6557e967fa..fd253b519772 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -389,7 +389,7 @@ void Ai_UpdateFaintData(u32 battler) aiMon->isFainted = TRUE; } -static void SetBattlerAiData(u32 battler, struct AiLogicData *aiData) +void SetBattlerAiData(u32 battler, struct AiLogicData *aiData) { u32 ability, holdEffect; @@ -477,6 +477,7 @@ void SetAiLogicDataForTurn(struct AiLogicData *aiData) // get/assume all battler data and simulate AI damage battlersCount = gBattlersCount; + AI_DATA->aiCalcInProgress = TRUE; for (battlerAtk = 0; battlerAtk < battlersCount; battlerAtk++) { if (!IsBattlerAlive(battlerAtk)) @@ -492,6 +493,7 @@ void SetAiLogicDataForTurn(struct AiLogicData *aiData) SetBattlerAiMovesData(aiData, battlerAtk, battlersCount); } + AI_DATA->aiCalcInProgress = FALSE; } static bool32 AI_SwitchMonIfSuitable(u32 battler, bool32 doubleBattle) @@ -504,12 +506,12 @@ static bool32 AI_SwitchMonIfSuitable(u32 battler, bool32 doubleBattle) if (doubleBattle) { u32 partner = BATTLE_PARTNER(battler); - if (AI_DATA->shouldSwitchMon & (1u << partner) && AI_DATA->monToSwitchId[partner] == monToSwitchId) + if (AI_DATA->shouldSwitchIfBadMoves & (1u << partner) && AI_DATA->monToSwitchId[partner] == monToSwitchId) { return FALSE; } } - AI_DATA->shouldSwitchMon |= 1 << battler; + AI_DATA->shouldSwitchIfBadMoves |= 1 << battler; AI_DATA->monToSwitchId[battler] = monToSwitchId; return TRUE; } @@ -835,6 +837,9 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (IsTwoTurnNotSemiInvulnerableMove(battlerAtk, move) && CanTargetFaintAi(battlerDef, battlerAtk)) RETURN_SCORE_MINUS(10); + if (gBattleStruct->commandingDondozo & (1u << battlerDef)) + RETURN_SCORE_MINUS(20); + // check if negates type switch (effectiveness) { @@ -870,6 +875,12 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // target ability checks if (!DoesBattlerIgnoreAbilityChecks(aiData->abilities[battlerAtk], move)) { + if (CanAbilityBlockMove(battlerAtk, battlerDef, move, aiData->abilities[battlerDef])) + RETURN_SCORE_MINUS(20); + + if (CanAbilityAbsorbMove(battlerAtk, battlerDef, aiData->abilities[battlerDef], move, moveType)) + RETURN_SCORE_MINUS(20); + switch (aiData->abilities[battlerDef]) { case ABILITY_MAGIC_GUARD: @@ -900,12 +911,6 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) && (moveType == TYPE_DARK || moveType == TYPE_GHOST || moveType == TYPE_BUG)) RETURN_SCORE_MINUS(10); break; - case ABILITY_DAZZLING: - case ABILITY_QUEENLY_MAJESTY: - case ABILITY_ARMOR_TAIL: - if (atkPriority > 0) - RETURN_SCORE_MINUS(10); - break; case ABILITY_AROMA_VEIL: if (IsAromaVeilProtectedMove(move)) RETURN_SCORE_MINUS(10); @@ -969,37 +974,14 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) && IsNonVolatileStatusMoveEffect(moveEffect)) RETURN_SCORE_MINUS(10); break; - case ABILITY_LIGHTNING_ROD: - if (B_REDIRECT_ABILITY_IMMUNITY < GEN_5) - break; - // Fallthrough - case ABILITY_MOTOR_DRIVE: - case ABILITY_VOLT_ABSORB: - if (moveType == TYPE_ELECTRIC) - RETURN_SCORE_MINUS(20); - break; - case ABILITY_STORM_DRAIN: - if (B_REDIRECT_ABILITY_IMMUNITY < GEN_5) - break; - // Fallthrough - case ABILITY_WATER_ABSORB: - case ABILITY_DRY_SKIN: - if (moveType == TYPE_WATER) - RETURN_SCORE_MINUS(20); - break; - case ABILITY_FLASH_FIRE: - if (moveType == TYPE_FIRE) - RETURN_SCORE_MINUS(20); - break; - case ABILITY_EARTH_EATER: - if (moveType == TYPE_GROUND) - RETURN_SCORE_MINUS(20); - break; } // def ability checks // target partner ability checks & not attacking partner if (isDoubleBattle) { + if (CanPartnerAbilityBlockMove(battlerAtk, battlerDef, move, aiData->abilities[BATTLE_PARTNER(battlerDef)])) + RETURN_SCORE_MINUS(20); + switch (aiData->abilities[BATTLE_PARTNER(battlerDef)]) { case ABILITY_LIGHTNING_ROD: @@ -1026,12 +1008,6 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (IsAromaVeilProtectedMove(move)) RETURN_SCORE_MINUS(10); break; - case ABILITY_DAZZLING: - case ABILITY_QUEENLY_MAJESTY: - case ABILITY_ARMOR_TAIL: - if (atkPriority > 0) - RETURN_SCORE_MINUS(10); - break; } } // def partner ability checks } // ignore def ability check @@ -1043,19 +1019,19 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) RETURN_SCORE_MINUS(10); // terrain & effect checks - if (AI_IsTerrainAffected(battlerDef, STATUS_FIELD_ELECTRIC_TERRAIN)) + if (IsBattlerTerrainAffected(battlerDef, STATUS_FIELD_ELECTRIC_TERRAIN)) { if (moveEffect == EFFECT_SLEEP || moveEffect == EFFECT_YAWN) RETURN_SCORE_MINUS(20); } - if (AI_IsTerrainAffected(battlerDef, STATUS_FIELD_MISTY_TERRAIN)) + if (IsBattlerTerrainAffected(battlerDef, STATUS_FIELD_MISTY_TERRAIN)) { if (IsNonVolatileStatusMoveEffect(moveEffect) || IsConfusionMoveEffect(moveEffect)) RETURN_SCORE_MINUS(20); } - if (AI_IsTerrainAffected(battlerAtk, STATUS_FIELD_PSYCHIC_TERRAIN) && atkPriority > 0) + if (IsBattlerTerrainAffected(battlerAtk, STATUS_FIELD_PSYCHIC_TERRAIN) && atkPriority > 0) { RETURN_SCORE_MINUS(20); } @@ -1276,10 +1252,10 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (isDoubleBattle) { if (!(IS_BATTLER_OF_TYPE(battlerAtk, TYPE_GRASS) - && AI_IsBattlerGrounded(battlerAtk) + && IsBattlerGrounded(battlerAtk) && (BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_ATK) || BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_SPATK))) && !(IS_BATTLER_OF_TYPE(BATTLE_PARTNER(battlerAtk), TYPE_GRASS) - && AI_IsBattlerGrounded(BATTLE_PARTNER(battlerAtk)) + && IsBattlerGrounded(BATTLE_PARTNER(battlerAtk)) && aiData->abilities[BATTLE_PARTNER(battlerAtk)] != ABILITY_CONTRARY && (BattlerStatCanRise(BATTLE_PARTNER(battlerAtk), aiData->abilities[BATTLE_PARTNER(battlerAtk)], STAT_ATK) || BattlerStatCanRise(BATTLE_PARTNER(battlerAtk), aiData->abilities[BATTLE_PARTNER(battlerAtk)], STAT_SPATK)))) @@ -1288,7 +1264,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } } else if (!(IS_BATTLER_OF_TYPE(battlerAtk, TYPE_GRASS) - && AI_IsBattlerGrounded(battlerAtk) + && IsBattlerGrounded(battlerAtk) && (BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_ATK) || BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_SPATK)))) { ADJUST_SCORE(-10); @@ -3345,6 +3321,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case EFFECT_ABSORB: if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_BIG_ROOT && effectiveness >= AI_EFFECTIVENESS_x1) 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) @@ -3359,7 +3336,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) break; case EFFECT_MIRROR_MOVE: if (predictedMove != MOVE_NONE) - return AI_CheckViability(battlerAtk, battlerDef, gLastMoves[battlerDef], score); + return AI_CheckViability(battlerAtk, battlerDef, predictedMove, score); break; case EFFECT_ATTACK_UP: case EFFECT_ATTACK_UP_USER_ALLY: @@ -3659,12 +3636,12 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) { switch (ShouldPivot(battlerAtk, battlerDef, aiData->abilities[battlerDef], move, movesetIndex)) { - case 0: // no + case DONT_PIVOT: ADJUST_SCORE(-10); // technically should go in CheckBadMove, but this is easier/less computationally demanding break; - case 1: // maybe + case CAN_TRY_PIVOT: break; - case 2: // yes + case SHOULD_PIVOT: ADJUST_SCORE(BEST_EFFECT); break; } @@ -3679,7 +3656,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) } break; case EFFECT_BATON_PASS: - if (ShouldSwitch(battlerAtk, FALSE) && (gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE + if ((AI_DATA->shouldSwitch & (1u << battlerAtk)) && (gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE || (gStatuses3[battlerAtk] & (STATUS3_ROOTED | STATUS3_AQUA_RING | STATUS3_MAGNET_RISE | STATUS3_POWER_TRICK)) || AnyStatIsRaised(battlerAtk))) ADJUST_SCORE(BEST_EFFECT); @@ -3972,7 +3949,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_SAFEGUARD: - if (!AI_IsTerrainAffected(battlerAtk, STATUS_FIELD_MISTY_TERRAIN) || !IsBattlerGrounded(battlerAtk)) + if (!IsBattlerTerrainAffected(battlerAtk, STATUS_FIELD_MISTY_TERRAIN) || !IsBattlerGrounded(battlerAtk)) ADJUST_SCORE(DECENT_EFFECT); // TODO: check if opp has status move? //if (CountUsablePartyMons(battlerDef) != 0) //ADJUST_SCORE(8); @@ -4090,7 +4067,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(DECENT_EFFECT); // Force 'em out next turn break; default: - if (gMovesInfo[gCurrentMove].effect != EFFECT_BESTOW && aiData->items[battlerAtk] == ITEM_NONE) + if (gMovesInfo[move].effect != EFFECT_BESTOW && aiData->items[battlerAtk] == ITEM_NONE && aiData->items[battlerDef] != ITEM_NONE) { switch (aiData->holdEffects[battlerDef]) { diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index c33878465a8e..0400f18b5310 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -180,7 +180,7 @@ static bool32 HasBadOdds(u32 battler, bool32 emitResult) && gBattleMons[battler].hp >= gBattleMons[battler].maxHP / 4))) { // 50% chance to stay in regardless - if (!RandomPercentage(RNG_AI_HASBADODDS, 50)) + if (RandomPercentage(RNG_AI_SWITCH_HASBADODDS, 50)) return FALSE; // Switch mon out @@ -203,7 +203,7 @@ static bool32 HasBadOdds(u32 battler, bool32 emitResult) return FALSE; // 50% chance to stay in regardless - if (!RandomPercentage(RNG_AI_HASBADODDS, 50)) + if (RandomPercentage(RNG_AI_SWITCH_HASBADODDS, 50)) return FALSE; // Switch mon out @@ -218,9 +218,9 @@ static bool32 HasBadOdds(u32 battler, bool32 emitResult) static bool32 ShouldSwitchIfAllBadMoves(u32 battler, bool32 emitResult) { - if (AI_DATA->shouldSwitchMon & (1u << battler)) + if (AI_DATA->shouldSwitchIfBadMoves & (1u << battler)) { - AI_DATA->shouldSwitchMon &= ~(1u << battler); + AI_DATA->shouldSwitchIfBadMoves &= ~(1u << battler); gBattleStruct->AI_monToSwitchIntoId[battler] = AI_DATA->monToSwitchId[battler]; if (emitResult) BtlController_EmitTwoReturnValues(battler, BUFFER_B, B_ACTION_SWITCH, 0); @@ -284,7 +284,7 @@ static bool32 ShouldSwitchIfWonderGuard(u32 battler, bool32 emitResult) move = GetMonData(&party[i], MON_DATA_MOVE1 + j); if (move != MOVE_NONE) { - if (AI_GetTypeEffectiveness(move, battler, opposingBattler) >= UQ_4_12(2.0) && Random() % 3 < 2) + if (AI_GetTypeEffectiveness(move, battler, opposingBattler) >= UQ_4_12(2.0) && (RandomPercentage(RNG_AI_SWITCH_WONDER_GUARD, 66) || ((AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_SMART_SWITCHING)))) { // We found a mon. gBattleStruct->AI_monToSwitchIntoId[battler] = i; @@ -462,16 +462,12 @@ static bool32 ShouldSwitchIfGameStatePrompt(u32 battler, bool32 emitResult) u16 holdEffect = AI_DATA->holdEffects[battler]; u8 opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(battler)); u8 opposingBattler = GetBattlerAtPosition(opposingPosition); - s32 moduloChance = 4; //25% Chance Default - s32 chanceReducer = 1; //No Reduce default. Increase to reduce + bool32 hasStatRaised = AnyStatIsRaised(battler); s32 firstId; s32 lastId; s32 i; struct Pokemon *party; - if (AnyStatIsRaised(battler)) - chanceReducer = 5; // Reduce switchout probability by factor of 5 if setup - //Perish Song if (gStatuses3[battler] & STATUS3_PERISH_SONG && gDisableStructs[battler].perishSongTimer == 0 @@ -567,28 +563,24 @@ static bool32 ShouldSwitchIfGameStatePrompt(u32 battler, bool32 emitResult) && !AiExpectsToFaintPlayer(battler)) { //Toxic - moduloChance = 2; //50% if (((gBattleMons[battler].status1 & STATUS1_TOXIC_COUNTER) >= STATUS1_TOXIC_TURN(2)) && gBattleMons[battler].hp >= (gBattleMons[battler].maxHP / 3) - && (Random() % (moduloChance*chanceReducer)) == 0) + && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_BADLY_POISONED, 20) : RandomPercentage(RNG_AI_SWITCH_BADLY_POISONED, 50))) switchMon = TRUE; //Cursed - moduloChance = 2; //50% if (gBattleMons[battler].status2 & STATUS2_CURSED - && (Random() % (moduloChance*chanceReducer)) == 0) + && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_CURSED, 20) : RandomPercentage(RNG_AI_SWITCH_CURSED, 50))) switchMon = TRUE; //Nightmare - moduloChance = 3; //33.3% if (gBattleMons[battler].status2 & STATUS2_NIGHTMARE - && (Random() % (moduloChance*chanceReducer)) == 0) + && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_NIGHTMARE, 15) : RandomPercentage(RNG_AI_SWITCH_NIGHTMARE, 33))) switchMon = TRUE; //Leech Seed - moduloChance = 4; //25% if (gStatuses3[battler] & STATUS3_LEECHSEED - && (Random() % (moduloChance*chanceReducer)) == 0) + && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_SEEDED, 10) : RandomPercentage(RNG_AI_SWITCH_SEEDED, 25))) switchMon = TRUE; } @@ -606,7 +598,7 @@ static bool32 ShouldSwitchIfGameStatePrompt(u32 battler, bool32 emitResult) if (FindMonThatAbsorbsOpponentsMove(battler, FALSE)) // Switch if absorber found. Note: FindMonThatAbsorbsOpponentsMove already provides id of the mon to switch into to gBattleStruct->AI_monToSwitchIntoId. switchMon = TRUE, monIdChosen = TRUE; if (!AI_OpponentCanFaintAiWithMod(battler, 0) - && AnyStatIsRaised(battler)) + && hasStatRaised) switchMon = FALSE; if (AiExpectsToFaintPlayer(battler) && AI_IsSlower(battler, opposingBattler, 0) @@ -1789,30 +1781,60 @@ static bool32 CanAbilityTrapOpponent(u16 ability, u32 opponent) return FALSE; } -// This function splits switching behaviour mid-battle from after a KO. -// Mid battle, it integrates GetBestMonTypeMatchup (vanilla with modifications), GetBestMonDefensive (custom), and GetBestMonBatonPass (vanilla with modifications) -// After a KO, integrates GetBestMonRevengeKiller (custom), GetBestMonTypeMatchup (vanilla with modifications), GetBestMonBatonPass (vanilla with modifications), and GetBestMonDmg (vanilla) -// the Type Matchup code will prioritize switching into a mon with the best type matchup and also a super effective move, or just best type matchup if no super effective move is found -// the Most Defensive code will prioritize switching into the mon that takes the most hits to KO, with a minimum of 4 hits required to be considered a valid option -// the Baton Pass code will prioritize switching into a mon with Baton Pass if it can get in, boost, and BP out without being KO'd, and randomizes between multiple valid options -// the Revenge Killer code will prioritize, in order, OHKO and outspeeds / OHKO, slower but not 2HKO'd / 2HKO, outspeeds and not OHKO'd / 2HKO, slower but not 3HKO'd -// the Most Damage code will prioritize switching into whatever mon deals the most damage, which is generally not as good as having a good Type Matchup -// Everything runs in the same loop to minimize computation time. This makes it harder to read, but hopefully the comments can guide you! +static inline bool32 IsFreeSwitch(bool32 isSwitchAfterKO, u32 battlerSwitchingOut, u32 opposingBattler) +{ + bool32 movedSecond = GetBattlerTurnOrderNum(battlerSwitchingOut) > GetBattlerTurnOrderNum(opposingBattler) ? TRUE : FALSE; + + // Switch out effects + if (!IsDoubleBattle()) // Not handling doubles' additional complexity + { + if (IsSwitchOutEffect(gMovesInfo[gLastUsedMove].effect) && movedSecond) + return TRUE; + if (AI_DATA->ejectButtonSwitch) + return TRUE; + if (AI_DATA->ejectPackSwitch) + { + // If faster, not a free switch; likely lowered own stats + if (!movedSecond) + return FALSE; + // Otherwise, free switch + return TRUE; + } + } + // Post KO check has to be last because the GetMostSuitableMonToSwitchInto call in OpponentHandleChoosePokemon assumes a KO rather than a forced switch choice + if (isSwitchAfterKO) + return TRUE; + else + return FALSE; +} + +static inline bool32 CanSwitchinWin1v1(u32 hitsToKOAI, u32 hitsToKOPlayer, bool32 isSwitchinFirst, bool32 isFreeSwitch) +{ + // Free switch, need to outspeed or take 1 extra hit + if (isFreeSwitch) + { + if (hitsToKOAI > hitsToKOPlayer || (hitsToKOAI == hitsToKOPlayer && isSwitchinFirst)) + return TRUE; + } + // Mid battle switch, need to take 1 or 2 extra hits depending on speed + if (hitsToKOAI > hitsToKOPlayer + 1 || (hitsToKOAI == hitsToKOPlayer + 1 && isSwitchinFirst)) + return TRUE; + return FALSE; +} + +// This function splits switching behaviour depending on whether the switch is free. +// Everything runs in the same loop to minimize computation time. This makes it harder to read, but hopefully the comments can guide you! static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, u32 battler, u32 opposingBattler, u32 battlerIn1, u32 battlerIn2, bool32 isSwitchAfterKO) { int revengeKillerId = PARTY_SIZE, slowRevengeKillerId = PARTY_SIZE, fastThreatenId = PARTY_SIZE, slowThreatenId = PARTY_SIZE, damageMonId = PARTY_SIZE; int batonPassId = PARTY_SIZE, typeMatchupId = PARTY_SIZE, typeMatchupEffectiveId = PARTY_SIZE, defensiveMonId = PARTY_SIZE, aceMonId = PARTY_SIZE, trapperId = PARTY_SIZE; int i, j, aliveCount = 0, bits = 0; s32 defensiveMonHitKOThreshold = 3; // 3HKO threshold that candidate defensive mons must exceed - u32 aiMove, hitsToKOAI, hitsToKOPlayer, hitsToKOAIThreshold, maxHitsToKO = 0; - s32 playerMonSpeed = gBattleMons[opposingBattler].speed, playerMonHP = gBattleMons[opposingBattler].hp, aiMonSpeed, aiMovePriority = 0, maxDamageDealt = 0, damageDealt = 0; + s32 playerMonHP = gBattleMons[opposingBattler].hp, maxDamageDealt = 0, damageDealt = 0; + u32 aiMove, hitsToKOAI, maxHitsToKO = 0; u16 bestResist = UQ_4_12(1.0), bestResistEffective = UQ_4_12(1.0), typeMatchup; - - if (isSwitchAfterKO) - hitsToKOAIThreshold = 1; // After a KO, mons at minimum need to not be 1-shot, as they switch in for free - else - hitsToKOAIThreshold = 2; // When switching in otherwise need to not be 2-shot, as they do not switch in for free + bool32 isFreeSwitch = IsFreeSwitch(isSwitchAfterKO, battlerIn1, opposingBattler), isSwitchinFirst, canSwitchinWin1v1; // Iterate through mons for (i = firstId; i < lastId; i++) @@ -1841,10 +1863,11 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, if (AI_DATA->switchinCandidate.battleMon.ability == ABILITY_TRUANT && IsTruantMonVulnerable(battler, opposingBattler)) continue; - // Get max number of hits for player to KO AI mon + // Get max number of hits for player to KO AI mon and type matchup for defensive switching hitsToKOAI = GetSwitchinHitsToKO(GetMaxDamagePlayerCouldDealToSwitchin(battler, opposingBattler, AI_DATA->switchinCandidate.battleMon), battler); + typeMatchup = GetSwitchinTypeMatchup(opposingBattler, AI_DATA->switchinCandidate.battleMon); - // Track max hits to KO and set GetBestMonDefensive if applicable + // Track max hits to KO and set defensive mon if(hitsToKOAI > maxHitsToKO) { maxHitsToKO = hitsToKOAI; @@ -1852,28 +1875,12 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, defensiveMonId = i; } - typeMatchup = GetSwitchinTypeMatchup(opposingBattler, AI_DATA->switchinCandidate.battleMon); - - // Check that good type matchups gets at least two turns and set GetBestMonTypeMatchup if applicable - if (typeMatchup < bestResist) - { - if ((hitsToKOAI > hitsToKOAIThreshold && AI_DATA->switchinCandidate.battleMon.speed > playerMonSpeed) || hitsToKOAI > hitsToKOAIThreshold + 1) // Need to take an extra hit if slower - { - bestResist = typeMatchup; - typeMatchupId = i; - } - } - - aiMonSpeed = AI_DATA->switchinCandidate.battleMon.speed; - // Check through current mon's moves for (j = 0; j < MAX_MON_MOVES; j++) { aiMove = AI_DATA->switchinCandidate.battleMon.moves[j]; - aiMovePriority = gMovesInfo[aiMove].priority; - // Only do damage calc if switching after KO, don't need it otherwise and saves ~0.02s per turn - if (isSwitchAfterKO && aiMove != MOVE_NONE && gMovesInfo[aiMove].power != 0) + if (aiMove != MOVE_NONE && gMovesInfo[aiMove].power != 0) { if (AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_CONSERVATIVE) damageDealt = AI_CalcPartyMonDamage(aiMove, battler, opposingBattler, AI_DATA->switchinCandidate.battleMon, TRUE, DMG_ROLL_LOWEST); @@ -1881,19 +1888,35 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, damageDealt = AI_CalcPartyMonDamage(aiMove, battler, opposingBattler, AI_DATA->switchinCandidate.battleMon, TRUE, DMG_ROLL_DEFAULT); } + // Offensive switchin decisions are based on which whether switchin moves first and whether it can win a 1v1 + isSwitchinFirst = AI_WhoStrikesFirstPartyMon(battler, opposingBattler, AI_DATA->switchinCandidate.battleMon, aiMove); + canSwitchinWin1v1 = CanSwitchinWin1v1(hitsToKOAI, GetNoOfHitsToKOBattlerDmg(damageDealt, opposingBattler), isSwitchinFirst, isFreeSwitch); + // Check for Baton Pass; hitsToKO requirements mean mon can boost and BP without dying whether it's slower or not - if (aiMove == MOVE_BATON_PASS && ((hitsToKOAI > hitsToKOAIThreshold + 1 && AI_DATA->switchinCandidate.battleMon.speed < playerMonSpeed) || (hitsToKOAI > hitsToKOAIThreshold && AI_DATA->switchinCandidate.battleMon.speed > playerMonSpeed))) - bits |= 1u << i; + if (aiMove == MOVE_BATON_PASS) + { + if ((isSwitchinFirst && hitsToKOAI > 1) || hitsToKOAI > 2) // Need to take an extra hit if slower + bits |= 1u << i; + } + + // Check that good type matchups get at least two turns and set best type matchup mon + if (typeMatchup < bestResist) + { + if (canSwitchinWin1v1) + { + bestResist = typeMatchup; + typeMatchupId = i; + } + } - // Check for mon with resistance and super effective move for GetBestMonTypeMatchup + // Check for mon with resistance and super effective move for best type matchup mon with effective move if (aiMove != MOVE_NONE && gMovesInfo[aiMove].power != 0) { if (typeMatchup < bestResistEffective) { if (AI_GetTypeEffectiveness(aiMove, battler, opposingBattler) >= UQ_4_12(2.0)) { - // Assuming a super effective move would do significant damage or scare the player out, so not being as conservative here - if (hitsToKOAI > hitsToKOAIThreshold) + if (canSwitchinWin1v1) { bestResistEffective = typeMatchup; typeMatchupEffectiveId = i; @@ -1905,10 +1928,10 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, if (gMovesInfo[aiMove].effect == EFFECT_EXPLOSION && damageDealt < playerMonHP) continue; - // Check that mon isn't one shot and set GetBestMonDmg if applicable + // Check that mon isn't one shot and set best damage mon if (damageDealt > maxDamageDealt) { - if(hitsToKOAI > hitsToKOAIThreshold) + if((isFreeSwitch && hitsToKOAI > 1) || hitsToKOAI > 2) // This is a "default", we have uniquely low standards { maxDamageDealt = damageDealt; damageMonId = i; @@ -1919,74 +1942,40 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, // If AI mon can one shot if (damageDealt > playerMonHP) { - // If AI mon outspeeds and doesn't die to hazards - if ((((aiMonSpeed > playerMonSpeed && !(gFieldStatuses & STATUS_FIELD_TRICK_ROOM)) || aiMovePriority > 0) // Outspeed if not Trick Room - || ((gFieldStatuses & STATUS_FIELD_TRICK_ROOM) // Trick Room - && (aiMonSpeed < playerMonSpeed || (ItemId_GetHoldEffect(AI_DATA->switchinCandidate.battleMon.item) == HOLD_EFFECT_ROOM_SERVICE && aiMonSpeed * 2 / 3 < playerMonSpeed)))) // Trick Room speeds - && AI_DATA->switchinCandidate.battleMon.hp > GetSwitchinHazardsDamage(battler, &AI_DATA->switchinCandidate.battleMon)) // Hazards + if (canSwitchinWin1v1) { - // We have a revenge killer - revengeKillerId = i; - } - - // If AI mon is outsped - else - { - // If AI mon can't be OHKO'd - if (hitsToKOAI > hitsToKOAIThreshold) - { - // We have a slow revenge killer + if (isSwitchinFirst) + revengeKillerId = i; + else slowRevengeKillerId = i; - } } } // If AI mon can two shot if (damageDealt > playerMonHP / 2) { - // If AI mon outspeeds - if (((aiMonSpeed > playerMonSpeed && !(gFieldStatuses & STATUS_FIELD_TRICK_ROOM)) || aiMovePriority > 0) // Outspeed if not Trick Room - || (((gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && gFieldTimers.trickRoomTimer > 1) // Trick Room has at least 2 turns left - && (aiMonSpeed < playerMonSpeed || (ItemId_GetHoldEffect(AI_DATA->switchinCandidate.battleMon.item) == HOLD_EFFECT_ROOM_SERVICE && aiMonSpeed * 2/ 3 < playerMonSpeed)))) // Trick Room speeds + if (canSwitchinWin1v1) { - // If AI mon can't be OHKO'd - if (hitsToKOAI > hitsToKOAIThreshold) - { - // We have a fast threaten + if (isSwitchinFirst) fastThreatenId = i; - } - } - // If AI mon is outsped - else - { - // If AI mon can't be 2HKO'd - if (hitsToKOAI > hitsToKOAIThreshold + 1) - { - // We have a slow threaten + else slowThreatenId = i; - } } } // If mon can trap - if (CanAbilityTrapOpponent(AI_DATA->switchinCandidate.battleMon.ability, opposingBattler)) - { - hitsToKOPlayer = GetNoOfHitsToKOBattlerDmg(damageDealt, opposingBattler); - if (CountUsablePartyMons(opposingBattler) > 0 - && (((hitsToKOAI > hitsToKOPlayer && isSwitchAfterKO) // If can 1v1 after a KO - || (hitsToKOAI == hitsToKOPlayer && isSwitchAfterKO && (aiMonSpeed > playerMonSpeed || aiMovePriority > 0))) - || ((hitsToKOAI > hitsToKOPlayer + 1 && !isSwitchAfterKO) // If can 1v1 after mid battle - || (hitsToKOAI == hitsToKOPlayer + 1 && !isSwitchAfterKO && (aiMonSpeed > playerMonSpeed || aiMovePriority > 0))))) - trapperId = i; - } + if (CanAbilityTrapOpponent(AI_DATA->switchinCandidate.battleMon.ability, opposingBattler) + && CountUsablePartyMons(opposingBattler) > 0 + && canSwitchinWin1v1) + trapperId = i; } } } batonPassId = GetRandomSwitchinWithBatonPass(aliveCount, bits, firstId, lastId, i); - // Different switching priorities depending on switching mid battle vs switching after a KO - if (isSwitchAfterKO) + // Different switching priorities depending on switching mid battle vs switching after a KO or slow switch + if (isFreeSwitch) { // Return Trapper > Revenge Killer > Type Matchup > Baton Pass > Best Damage if (trapperId != PARTY_SIZE) return trapperId; @@ -2009,8 +1998,7 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, else if (batonPassId != PARTY_SIZE) return batonPassId; } // If ace mon is the last available Pokemon and U-Turn/Volt Switch was used - switch to the mon. - if (aceMonId != PARTY_SIZE - && (gMovesInfo[gLastUsedMove].effect == EFFECT_HIT_ESCAPE || gMovesInfo[gLastUsedMove].effect == EFFECT_PARTING_SHOT || gMovesInfo[gLastUsedMove].effect == EFFECT_BATON_PASS || gMovesInfo[gLastUsedMove].effect == EFFECT_CHILLY_RECEPTION || gMovesInfo[gLastUsedMove].effect == EFFECT_SHED_TAIL)) + if (aceMonId != PARTY_SIZE && IsSwitchOutEffect(gMovesInfo[gLastUsedMove].effect)) return aceMonId; return PARTY_SIZE; @@ -2082,7 +2070,6 @@ u32 GetMostSuitableMonToSwitchInto(u32 battler, bool32 switchAfterMonKOd) return bestMonId; } - // Split ideal mon decision between after previous mon KO'd (prioritize offensive options) and after switching active mon out (prioritize defensive options), and expand the scope of both. // Only use better mon selection if AI_FLAG_SMART_MON_CHOICES is set for the trainer. if (AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_SMART_MON_CHOICES && !IsDoubleBattle()) // Double Battles aren't included in AI_FLAG_SMART_MON_CHOICE. Defaults to regular switch in logic { @@ -2103,11 +2090,11 @@ u32 GetMostSuitableMonToSwitchInto(u32 battler, bool32 switchAfterMonKOd) || gBattlerPartyIndexes[battlerIn2] == i || i == gBattleStruct->monToSwitchIntoId[battlerIn1] || i == gBattleStruct->monToSwitchIntoId[battlerIn2] - || (GetMonAbility(&party[i]) == ABILITY_TRUANT && IsTruantMonVulnerable(battler, opposingBattler))) // While not really invalid per se, not really wise to switch into this mon.) + || (GetMonAbility(&party[i]) == ABILITY_TRUANT && IsTruantMonVulnerable(battler, opposingBattler))) // While not really invalid per se, not really wise to switch into this mon. { invalidMons |= 1u << i; } - else if (IsAceMon(battler, i))// Save Ace Pokemon for last. + else if (IsAceMon(battler, i)) // Save Ace Pokemon for last. { aceMonId = i; invalidMons |= 1u << i; @@ -2249,6 +2236,10 @@ static bool32 ShouldUseItem(u32 battler) if (gBattleStruct->itemPartyIndex[battler] != PARTY_SIZE) // Revive if possible. shouldUse = TRUE; break; + case EFFECT_ITEM_USE_POKE_FLUTE: + if (gBattleMons[battler].status1 & STATUS1_SLEEP) + shouldUse = TRUE; + break; default: return FALSE; } diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 3f08ace39321..c01a119a3d66 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -402,57 +402,34 @@ bool32 IsDamageMoveUnusable(u32 move, u32 battlerAtk, u32 battlerDef) { struct AiLogicData *aiData = AI_DATA; u32 battlerDefAbility; + u32 partnerBattlerDefAbility; u32 moveType = GetMoveType(move); if (DoesBattlerIgnoreAbilityChecks(aiData->abilities[battlerAtk], move)) + { battlerDefAbility = ABILITY_NONE; + partnerBattlerDefAbility = ABILITY_NONE; + } else + { battlerDefAbility = aiData->abilities[battlerDef]; + partnerBattlerDefAbility = aiData->abilities[BATTLE_PARTNER(battlerDef)]; + } if (battlerDef == BATTLE_PARTNER(battlerAtk)) battlerDefAbility = aiData->abilities[battlerDef]; - switch (battlerDefAbility) - { - case ABILITY_LIGHTNING_ROD: - if (B_REDIRECT_ABILITY_IMMUNITY < GEN_5) - break; - // Fallthrough - case ABILITY_VOLT_ABSORB: - case ABILITY_MOTOR_DRIVE: - if (moveType == TYPE_ELECTRIC) - return TRUE; - break; - case ABILITY_STORM_DRAIN: - if (B_REDIRECT_ABILITY_IMMUNITY < GEN_5) - break; - // Fallthrough - case ABILITY_WATER_ABSORB: - case ABILITY_DRY_SKIN: - if (moveType == TYPE_WATER) - return TRUE; - break; - case ABILITY_FLASH_FIRE: - if (moveType == TYPE_FIRE) - return TRUE; - break; - case ABILITY_SOUNDPROOF: - if (gMovesInfo[move].soundMove) - return TRUE; - break; - case ABILITY_BULLETPROOF: - if (gMovesInfo[move].ballisticMove) - return TRUE; - break; - case ABILITY_SAP_SIPPER: - if (moveType == TYPE_GRASS) - return TRUE; - break; - case ABILITY_EARTH_EATER: - if (moveType == TYPE_GROUND) - return TRUE; - break; - } + if (gBattleStruct->commandingDondozo & (1u << battlerDef)) + return TRUE; + + if (CanAbilityBlockMove(battlerAtk, battlerDef, move, aiData->abilities[battlerDef])) + return TRUE; + + if (CanPartnerAbilityBlockMove(battlerAtk, battlerDef, move, partnerBattlerDefAbility)) + return TRUE; + + if (CanAbilityAbsorbMove(battlerAtk, battlerDef, aiData->abilities[battlerDef], move, moveType)) + return TRUE; switch (gMovesInfo[move].effect) { @@ -523,7 +500,7 @@ struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u bool32 isDamageMoveUnusable = FALSE; bool32 toggledGimmick = FALSE; struct AiLogicData *aiData = AI_DATA; - gBattleStruct->aiCalcInProgress = TRUE; + AI_DATA->aiCalcInProgress = TRUE; if (moveEffect == EFFECT_NATURE_POWER) move = GetNaturePowerMove(battlerAtk); @@ -733,12 +710,11 @@ struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u *typeEffectiveness = AI_GetEffectiveness(effectivenessMultiplier); // Undo temporary settings - gBattleStruct->aiCalcInProgress = FALSE; gBattleStruct->swapDamageCategory = FALSE; gBattleStruct->zmove.baseMoves[battlerAtk] = MOVE_NONE; if (toggledGimmick) SetActiveGimmick(battlerAtk, GIMMICK_NONE); - + AI_DATA->aiCalcInProgress = FALSE; return simDamage; } @@ -1368,42 +1344,6 @@ u32 AI_DecideHoldEffectForTurn(u32 battlerId) return holdEffect; } -bool32 AI_IsTerrainAffected(u32 battlerId, u32 flags) -{ - if (gStatuses3[battlerId] & STATUS3_SEMI_INVULNERABLE) - return FALSE; - else if (!(gFieldStatuses & flags)) - return FALSE; - return AI_IsBattlerGrounded(battlerId); -} - -// different from IsBattlerGrounded in that we don't always know battler's hold effect or ability -bool32 AI_IsBattlerGrounded(u32 battlerId) -{ - u32 holdEffect = AI_DATA->holdEffects[battlerId]; - - if (holdEffect == HOLD_EFFECT_IRON_BALL) - return TRUE; - else if (gFieldStatuses & STATUS_FIELD_GRAVITY) - return TRUE; - else if (gStatuses3[battlerId] & STATUS3_ROOTED) - return TRUE; - else if (gStatuses3[battlerId] & STATUS3_SMACKED_DOWN) - return TRUE; - else if (gStatuses3[battlerId] & STATUS3_TELEKINESIS) - return FALSE; - else if (gStatuses3[battlerId] & STATUS3_MAGNET_RISE) - return FALSE; - else if (holdEffect == HOLD_EFFECT_AIR_BALLOON) - return FALSE; - else if (AI_DATA->abilities[battlerId] == ABILITY_LEVITATE) - return FALSE; - else if (IS_BATTLER_OF_TYPE(battlerId, TYPE_FLYING)) - return FALSE; - else - return TRUE; -} - bool32 DoesBattlerIgnoreAbilityChecks(u32 atkAbility, u32 move) { if (AI_THINKING_STRUCT->aiFlags[sBattler_AI] & AI_FLAG_NEGATE_UNAWARE) @@ -1508,6 +1448,8 @@ bool32 IsSemiInvulnerable(u32 battlerDef, u32 move) { if (gStatuses3[battlerDef] & STATUS3_PHANTOM_FORCE) return TRUE; + else if (gBattleStruct->commandingDondozo & (1u << battlerDef)) + return TRUE; else if (!gMovesInfo[move].damagesAirborne && gStatuses3[battlerDef] & STATUS3_ON_AIR) return TRUE; else if (!gMovesInfo[move].damagesUnderwater && gStatuses3[battlerDef] & STATUS3_UNDERWATER) @@ -2370,6 +2312,22 @@ bool32 IsSelfStatLoweringEffect(u32 effect) } } +bool32 IsSwitchOutEffect(u32 effect) +{ + // Switch out effects like U-Turn, Volt Switch, etc. + switch (effect) + { + case EFFECT_HIT_ESCAPE: + case EFFECT_PARTING_SHOT: + case EFFECT_BATON_PASS: + case EFFECT_CHILLY_RECEPTION: + case EFFECT_SHED_TAIL: + return TRUE; + default: + return FALSE; + } +} + bool32 HasDamagingMove(u32 battlerId) { u32 i; @@ -2691,18 +2649,11 @@ static bool32 PartyBattlerShouldAvoidHazards(u32 currBattler, u32 switchBattler) return FALSE; } -enum { - DONT_PIVOT, - CAN_TRY_PIVOT, - PIVOT, -}; -bool32 ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 moveIndex) +enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 moveIndex) { bool32 hasStatBoost = AnyUsefulStatIsRaised(battlerAtk) || gBattleMons[battlerDef].statStages[STAT_EVASION] >= 9; //Significant boost in evasion for any class - bool32 shouldSwitch; u32 battlerToSwitch; - shouldSwitch = ShouldSwitch(battlerAtk, FALSE); battlerToSwitch = gBattleStruct->AI_monToSwitchIntoId[battlerAtk]; if (PartyBattlerShouldAvoidHazards(battlerAtk, battlerToSwitch)) @@ -2715,7 +2666,7 @@ bool32 ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 //TODO - predict opponent switching /*if (IsPredictedToSwitch(battlerDef, battlerAtk) && !hasStatBoost) - return PIVOT; // Try pivoting so you can switch to a better matchup to counter your new opponent*/ + return SHOULD_PIVOT; // Try pivoting so you can switch to a better matchup to counter your new opponent*/ if (AI_IsFaster(battlerAtk, battlerDef, move)) // Attacker goes first { @@ -2725,14 +2676,14 @@ bool32 ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 { // attacker can kill target in two hits (theoretically) if (CanTargetFaintAi(battlerDef, battlerAtk)) - return PIVOT; // Won't get the two turns, pivot + return SHOULD_PIVOT; // Won't get the two turns, pivot - if (!IS_MOVE_STATUS(move) && (shouldSwitch + if (!IS_MOVE_STATUS(move) && ((AI_DATA->shouldSwitch & (1u << battlerAtk)) || (AtMaxHp(battlerDef) && (AI_DATA->holdEffects[battlerDef] == HOLD_EFFECT_FOCUS_SASH || (B_STURDY >= GEN_5 && defAbility == ABILITY_STURDY) || defAbility == ABILITY_MULTISCALE || defAbility == ABILITY_SHADOW_SHIELD)))) - return PIVOT; // pivot to break sash/sturdy/multiscale + return SHOULD_PIVOT; // pivot to break sash/sturdy/multiscale } else if (!hasStatBoost) { @@ -2740,17 +2691,17 @@ bool32 ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 || (B_STURDY >= GEN_5 && defAbility == ABILITY_STURDY) || defAbility == ABILITY_MULTISCALE || defAbility == ABILITY_SHADOW_SHIELD))) - return PIVOT; // pivot to break sash/sturdy/multiscale + return SHOULD_PIVOT; // pivot to break sash/sturdy/multiscale - if (shouldSwitch) - return PIVOT; + if (AI_DATA->shouldSwitch & (1u << battlerAtk)) + return SHOULD_PIVOT; /* TODO - check if switchable mon unafffected by/will remove hazards if (gSideStatuses[battlerAtk] & SIDE_STATUS_SPIKES && switchScore >= SWITCHING_INCREASE_CAN_REMOVE_HAZARDS) - return PIVOT;*/ + return SHOULD_PIVOT;*/ /*if (BattlerWillFaintFromSecondaryDamage(battlerAtk, AI_DATA->abilities[battlerAtk]) && switchScore >= SWITCHING_INCREASE_WALLS_FOE) - return PIVOT;*/ + return SHOULD_PIVOT;*/ /*if (IsClassDamager(class) && switchScore >= SWITCHING_INCREASE_HAS_SUPER_EFFECTIVE_MOVE) { @@ -2761,20 +2712,20 @@ bool32 ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 if (physMoveInMoveset && !specMoveInMoveset) { if (STAT_STAGE_ATK < 6) - return PIVOT; + return SHOULD_PIVOT; } else if (!physMoveInMoveset && specMoveInMoveset) { if (STAT_STAGE_SPATK < 6) - return PIVOT; + return SHOULD_PIVOT; } else if (physMoveInMoveset && specMoveInMoveset) { if (STAT_STAGE_ATK < 6 && STAT_STAGE_SPATK < 6) - return PIVOT; + return SHOULD_PIVOT; } - return CAN_TRY_PIVOT; + return SHOULD_PIVOT; }*/ } } @@ -2797,7 +2748,7 @@ bool32 ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 } else // Can't KO the foe { - return PIVOT; + return SHOULD_PIVOT; } } else // Foe can 3HKO+ AI @@ -2813,7 +2764,7 @@ bool32 ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 else if (CanAIFaintTarget(battlerAtk, battlerDef, 2)) { // can knock out foe in 2 hits - if (IS_MOVE_STATUS(move) && (shouldSwitch //Damaging move + if (IS_MOVE_STATUS(move) && ((AI_DATA->shouldSwitch & (1u << battlerAtk)) //Damaging move //&& (switchScore >= SWITCHING_INCREASE_RESIST_ALL_MOVES + SWITCHING_INCREASE_KO_FOE //remove hazards || (AI_DATA->holdEffects[battlerDef] == HOLD_EFFECT_FOCUS_SASH && AtMaxHp(battlerDef)))) return DONT_PIVOT; // Pivot to break the sash @@ -2823,17 +2774,17 @@ bool32 ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 else { //if (IsClassDamager(class) && switchScore >= SWITCHING_INCREASE_KO_FOE) - //return PIVOT; //Only switch if way better matchup + //return SHOULD_PIVOT; //Only switch if way better matchup if (!hasStatBoost) { // TODO - check if switching prevents/removes hazards //if (gSideStatuses[battlerAtk] & SIDE_STATUS_SPIKES && switchScore >= SWITCHING_INCREASE_CAN_REMOVE_HAZARDS) - //return PIVOT; + //return SHOULD_PIVOT; // TODO - not always a good idea //if (BattlerWillFaintFromSecondaryDamage(battlerAtk) && switchScore >= SWITCHING_INCREASE_HAS_SUPER_EFFECTIVE_MOVE) - //return PIVOT; + //return SHOULD_PIVOT; /*if (IsClassDamager(class) && switchScore >= SWITCHING_INCREASE_HAS_SUPER_EFFECTIVE_MOVE) { @@ -2844,17 +2795,17 @@ bool32 ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 if (physMoveInMoveset && !specMoveInMoveset) { if (STAT_STAGE_ATK < 6) - return PIVOT; + return SHOULD_PIVOT; } else if (!physMoveInMoveset && specMoveInMoveset) { if (STAT_STAGE_SPATK < 6) - return PIVOT; + return SHOULD_PIVOT; } else if (physMoveInMoveset && specMoveInMoveset) { if (STAT_STAGE_ATK < 6 && STAT_STAGE_SPATK < 6) - return PIVOT; + return SHOULD_PIVOT; } }*/ @@ -3489,14 +3440,14 @@ s32 AI_CalcPartyMonDamage(u32 move, u32 battlerAtk, u32 battlerDef, struct Battl { gBattleMons[battlerAtk] = switchinCandidate; AI_THINKING_STRUCT->saved[battlerDef].saved = TRUE; - SetBattlerData(battlerDef); // set known opposing battler data + SetBattlerAiData(battlerDef, AI_DATA); // set known opposing battler data AI_THINKING_STRUCT->saved[battlerDef].saved = FALSE; } else { gBattleMons[battlerDef] = switchinCandidate; AI_THINKING_STRUCT->saved[battlerAtk].saved = TRUE; - SetBattlerData(battlerAtk); // set known opposing battler data + SetBattlerAiData(battlerAtk, AI_DATA); // set known opposing battler data AI_THINKING_STRUCT->saved[battlerAtk].saved = FALSE; } @@ -3506,6 +3457,18 @@ s32 AI_CalcPartyMonDamage(u32 move, u32 battlerAtk, u32 battlerDef, struct Battl return dmg.expected; } +u32 AI_WhoStrikesFirstPartyMon(u32 battlerAtk, u32 battlerDef, struct BattlePokemon switchinCandidate, u32 moveConsidered) +{ + struct BattlePokemon *savedBattleMons = AllocSaveBattleMons(); + gBattleMons[battlerAtk] = switchinCandidate; + + SetBattlerAiData(battlerAtk, AI_DATA); + u32 aiMonFaster = AI_IsFaster(battlerAtk, battlerDef, moveConsidered); + FreeRestoreBattleMons(savedBattleMons); + + return aiMonFaster; +} + s32 CountUsablePartyMons(u32 battlerId) { s32 battlerOnField1, battlerOnField2, i, ret; @@ -3950,7 +3913,7 @@ bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove) return FALSE; // Don't waste a Z-Move busting disguise if (gBattleMons[battlerDef].ability == ABILITY_ICE_FACE && !gMovesInfo[zMove].ignoresTargetAbility - && gBattleMons[battlerDef].species == SPECIES_EISCUE_ICE_FACE && IS_MOVE_PHYSICAL(chosenMove)) + && gBattleMons[battlerDef].species == SPECIES_EISCUE_ICE && IS_MOVE_PHYSICAL(chosenMove)) return FALSE; // Don't waste a Z-Move busting Ice Face if (IS_MOVE_STATUS(chosenMove) && !IS_MOVE_STATUS(zMove)) diff --git a/src/battle_anim_effects_2.c b/src/battle_anim_effects_2.c index b33c0a8bb652..0a94cad2dc53 100755 --- a/src/battle_anim_effects_2.c +++ b/src/battle_anim_effects_2.c @@ -953,6 +953,18 @@ const struct SpriteTemplate gRedHeartRisingSpriteTemplate = .callback = AnimRedHeartRising, }; +// New struct that's just a copy of 'gMagentaHeartSpriteTemplate', without need to make new anim tags +const struct SpriteTemplate gRedHeartCharmSpriteTemplate = +{ + .tileTag = ANIM_TAG_RED_HEART, + .paletteTag = ANIM_TAG_RED_HEART, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimMagentaHeart, +}; + const union AffineAnimCmd gHiddenPowerOrbAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(0x80, 0x80, 0, 0), diff --git a/src/battle_anim_effects_3.c b/src/battle_anim_effects_3.c index 8c2d73ff8013..1530fa37a5f9 100644 --- a/src/battle_anim_effects_3.c +++ b/src/battle_anim_effects_3.c @@ -2389,6 +2389,88 @@ void AnimTask_SwallowDeformMon(u8 taskId) } } +void AnimTask_HideSwapSprite(u8 taskId) +{ + int i, j; + u8 position; + struct BattleAnimBgData animBg; + u8 *dest; + u8 *src; + u16 *bgTilemap; + + u8 spriteId = gBattlerSpriteIds[gBattleAnimAttacker]; + + switch (gTasks[taskId].data[0]) + { + case 0: + gTasks[taskId].data[11] = gSprites[spriteId].x; // Save battler position + gSprites[spriteId].x = -64; // hide it from screen to avoid the blip/glitch effect when swapping the sprite. + gTasks[taskId].data[10] = gBattleAnimArgs[0]; + gTasks[taskId].data[0]++; + break; + case 1: + HandleSpeciesGfxDataChange(gBattleAnimAttacker, gBattleAnimTarget, gTasks[taskId].data[10], gBattleAnimArgs[1]); + GetBgDataForTransform(&animBg, gBattleAnimAttacker); + + if (IsContest()) + position = 0; + else + position = GetBattlerPosition(gBattleAnimAttacker); + + src = gMonSpritesGfxPtr->spritesGfx[position]; + dest = animBg.bgTiles; + CpuCopy32(src, dest, MON_PIC_SIZE); + LoadBgTiles(1, animBg.bgTiles, 0x800, animBg.tilesOffset); + if (IsContest()) + { + if (IsSpeciesNotUnown(gContestResources->moveAnim->species) != IsSpeciesNotUnown(gContestResources->moveAnim->targetSpecies)) + { + bgTilemap = (u16 *)animBg.bgTilemap; + for (i = 0; i < 8; i++) + { + for (j = 0; j < 4; j++) + { + u16 temp = bgTilemap[j + i * 0x20]; + bgTilemap[j + i * 0x20] = bgTilemap[(7 - j) + i * 0x20]; + bgTilemap[(7 - j) + i * 0x20] = temp; + } + } + + for (i = 0; i < 8; i++) + { + for (j = 0; j < 8; j++) + { + bgTilemap[j + i * 0x20] ^= 0x400; + } + } + } + + if (IsSpeciesNotUnown(gContestResources->moveAnim->targetSpecies)) + gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].affineAnims = gAffineAnims_BattleSpriteContest; + else + gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].affineAnims = gAffineAnims_BattleSpriteOpponentSide; + + StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[gBattleAnimAttacker]], BATTLER_AFFINE_NORMAL); + } + + gTasks[taskId].data[0]++; + break; + case 2: + gSprites[spriteId].x = gTasks[taskId].data[11]; // restores battler position + if (!IsContest()) + { + if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT) + { + if (gTasks[taskId].data[10] == 0) + SetBattlerShadowSpriteCallback(gBattleAnimAttacker, gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies); + } + } + + DestroyAnimVisualTask(taskId); + break; + } +} + void AnimTask_TransformMon(u8 taskId) { int i, j; diff --git a/src/battle_anim_electric.c b/src/battle_anim_electric.c index de6d82026406..64114227e17f 100644 --- a/src/battle_anim_electric.c +++ b/src/battle_anim_electric.c @@ -29,6 +29,8 @@ static bool8 CreateShockWaveBoltSprite(struct Task *task, u8 taskId); static void AnimShockWaveProgressingBolt(struct Sprite *); static bool8 CreateShockWaveLightningSprite(struct Task *task, u8 taskId); static void AnimShockWaveLightning(struct Sprite *sprite); +static void AnimIon(struct Sprite *); +static void AnimIon_Step(struct Sprite *); static const union AnimCmd sAnim_Lightning[] = { @@ -559,6 +561,34 @@ const struct SpriteTemplate gSeedFlareGreenChargeTemplate = .callback = AnimGrowingChargeOrb }; +static const union AnimCmd sAnim_Ion[] = +{ + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(8, 2), + ANIMCMD_FRAME(16, 2), + ANIMCMD_FRAME(24, 6), + ANIMCMD_FRAME(32, 2), + ANIMCMD_FRAME(40, 2), + ANIMCMD_FRAME(48, 2), + ANIMCMD_END, +}; + +static const union AnimCmd *const sAnims_Ion[] = +{ + sAnim_Ion, +}; + +const struct SpriteTemplate gIonSpriteTemplate = +{ + .tileTag = ANIM_TAG_IONS, + .paletteTag = ANIM_TAG_IONS, + .oam = &gOamData_AffineOff_ObjNormal_16x32, + .anims = sAnims_Ion, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimIon, +}; + // functions static void AnimLightning(struct Sprite *sprite) { @@ -1452,3 +1482,44 @@ static void AnimShockWaveLightning(struct Sprite *sprite) DestroySprite(sprite); } } + +// Copy of Rain Dance's function but displays the ion sprite instead +// arg 0: initial step +// arg 1: amount (?) +// arg 2: duration +void AnimTask_CreateIons(u8 taskId) +{ + u8 x, y; + + if (gTasks[taskId].data[0] == 0) + { + gTasks[taskId].data[1] = gBattleAnimArgs[0]; + gTasks[taskId].data[2] = gBattleAnimArgs[1]; + gTasks[taskId].data[3] = gBattleAnimArgs[2]; + } + gTasks[taskId].data[0]++; + if (gTasks[taskId].data[0] % gTasks[taskId].data[2] == 1) + { + x = Random2() % DISPLAY_WIDTH; + y = Random2() % (DISPLAY_HEIGHT / 2); + CreateSprite(&gIonSpriteTemplate, x, y, 4); + } + if (gTasks[taskId].data[0] == gTasks[taskId].data[3]) + DestroyAnimVisualTask(taskId); +} + +static void AnimIon(struct Sprite *sprite) +{ + sprite->callback = AnimIon_Step; +} + +static void AnimIon_Step(struct Sprite *sprite) +{ + if (++sprite->data[0] <= 13) + { + sprite->x2++; + sprite->y2 += 4; + } + if (sprite->animEnded) + DestroySprite(sprite); +} diff --git a/src/battle_anim_psychic.c b/src/battle_anim_psychic.c index 1c998e9c56e9..a9c1f0cf6727 100644 --- a/src/battle_anim_psychic.c +++ b/src/battle_anim_psychic.c @@ -25,6 +25,7 @@ static void AnimTask_MeditateStretchAttacker_Step(u8); static void AnimTask_Teleport_Step(u8); static void AnimTask_ImprisonOrbs_Step(u8); static void AnimTask_SkillSwap_Step(u8); +static void AnimTask_HeartSwap_Step(u8); static void AnimTask_ExtrasensoryDistortion_Step(u8); static void AnimTask_TransparentCloneGrowAndShrink_Step(u8); static void AnimateZenHeadbutt(struct Sprite *sprite); @@ -359,6 +360,18 @@ const struct SpriteTemplate gSkillSwapOrbSpriteTemplate = .callback = AnimSkillSwapOrb, }; +// Pink version of the Skill Swap orbs +const struct SpriteTemplate gHeartSwapOrbSpriteTemplate = +{ + .tileTag = ANIM_TAG_PINKVIO_ORB, + .paletteTag = ANIM_TAG_PINKVIO_ORB, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = sAffineAnims_SkillSwapOrb, + .callback = AnimSkillSwapOrb, +}; + static const union AffineAnimCmd sAffineAnim_LusterPurgeCircle[] = { AFFINEANIMCMD_FRAME(0x20, 0x20, 0, 0), @@ -1001,7 +1014,7 @@ void AnimTask_SkillSwap(u8 taskId) } else { - if (gBattleAnimArgs[0] == 1) + if (gBattleAnimArgs[0] == ANIM_TARGET) { task->data[10] = -10; task->data[11] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_LEFT) + 8; @@ -1023,6 +1036,55 @@ void AnimTask_SkillSwap(u8 taskId) task->func = AnimTask_SkillSwap_Step; } +// Copy of Skill Swap's function to get position of the user and target +// arg 0: move target +void AnimTask_HeartSwap(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + if (IsContest()) + { + if (gBattleAnimArgs[0] == ANIM_TARGET) + { + task->data[10] = -10; + task->data[11] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_RIGHT) - 8; + task->data[12] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_TOP) + 8; + task->data[13] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_RIGHT) - 8; + task->data[14] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_TOP) + 8; + } + else + { + task->data[10] = 10; + task->data[11] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_LEFT) + 8; + task->data[12] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_BOTTOM) - 8; + task->data[13] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_LEFT) + 8; + task->data[14] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_BOTTOM) - 8; + } + } + else + { + if (gBattleAnimArgs[0] == ANIM_TARGET) + { + task->data[10] = -10; + task->data[11] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_LEFT) + 8; + task->data[12] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_TOP) + 8; + task->data[13] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_LEFT) + 8; + task->data[14] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_TOP) + 8; + } + else + { + task->data[10] = 10; + task->data[11] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_RIGHT) - 8; + task->data[12] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_BOTTOM) - 8; + task->data[13] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_RIGHT) - 8; + task->data[14] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_BOTTOM) - 8; + } + } + + task->data[1] = 6; + task->func = AnimTask_HeartSwap_Step; +} + static void AnimTask_SkillSwap_Step(u8 taskId) { u8 spriteId; @@ -1057,6 +1119,42 @@ static void AnimTask_SkillSwap_Step(u8 taskId) } } +// Copy of Skill Swap's function to vault the series of orbs between the user and target +// CreateSprite modified so it uses the pink orbs instead of the blue/green ones +static void AnimTask_HeartSwap_Step(u8 taskId) +{ + u8 spriteId; + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + if (++task->data[1] > 6) + { + task->data[1] = 0; + spriteId = CreateSprite(&gHeartSwapOrbSpriteTemplate, task->data[11], task->data[12], 0); + if (spriteId != MAX_SPRITES) + { + gSprites[spriteId].data[0] = 16; + gSprites[spriteId].data[2] = task->data[13]; + gSprites[spriteId].data[4] = task->data[14]; + gSprites[spriteId].data[5] = task->data[10]; + + InitAnimArcTranslation(&gSprites[spriteId]); + StartSpriteAffineAnim(&gSprites[spriteId], task->data[2] & 3); + } + + if (++task->data[2] == 12) + task->data[0]++; + } + break; + case 1: + if (++task->data[1] > 17) + DestroyAnimVisualTask(taskId); + break; + } +} + static void AnimSkillSwapOrb(struct Sprite *sprite) { if (TranslateAnimHorizontalArc(sprite)) diff --git a/src/battle_anim_rock.c b/src/battle_anim_rock.c index b6239ca063db..354fb21014e6 100644 --- a/src/battle_anim_rock.c +++ b/src/battle_anim_rock.c @@ -479,7 +479,7 @@ void AnimRockFragment(struct Sprite *sprite) void AnimParticleInVortex(struct Sprite *sprite) { if (IsDoubleBattle() //got a little lazy here will fix later - && (gAnimMoveIndex == MOVE_BLEAKWIND_STORM + && (gAnimMoveIndex == MOVE_BLEAKWIND_STORM || gAnimMoveIndex == MOVE_SANDSEAR_STORM || gAnimMoveIndex == MOVE_SPRINGTIDE_STORM || gAnimMoveIndex == MOVE_WILDBOLT_STORM)) diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index 57ebccf7fad6..01ec74f9c212 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -661,7 +661,7 @@ static void OpponentHandleChoosePokemon(u32 battler) chosenMonId = gSelectedMonPartyId = GetFirstFaintedPartyIndex(battler); } // Switching out - else if (*(gBattleStruct->AI_monToSwitchIntoId + battler) == PARTY_SIZE) + else if (gBattleStruct->AI_monToSwitchIntoId[battler] == PARTY_SIZE) { chosenMonId = GetMostSuitableMonToSwitchInto(battler, TRUE); if (chosenMonId == PARTY_SIZE) @@ -680,27 +680,27 @@ static void OpponentHandleChoosePokemon(u32 battler) } GetAIPartyIndexes(battler, &firstId, &lastId); - for (chosenMonId = (lastId-1); chosenMonId >= firstId; chosenMonId--) { - if (IsValidForBattle(&gEnemyParty[chosenMonId]) - && chosenMonId != gBattlerPartyIndexes[battler1] - && chosenMonId != gBattlerPartyIndexes[battler2] - && (!(AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_ACE_POKEMON) - || chosenMonId != CalculateEnemyPartyCount() - 1 - || CountAIAliveNonEggMonsExcept(PARTY_SIZE) == pokemonInBattle)) - { - break; - } + if (!IsValidForBattle(&gEnemyParty[chosenMonId])) + continue; + if (chosenMonId == gBattlerPartyIndexes[battler1] + || chosenMonId == gBattlerPartyIndexes[battler2]) + continue; + if ((AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_ACE_POKEMON) + && ((chosenMonId != CalculateEnemyPartyCount() - 1) || CountAIAliveNonEggMonsExcept(PARTY_SIZE) == pokemonInBattle)) + continue; + // mon is valid + break; } } - *(gBattleStruct->monToSwitchIntoId + battler) = chosenMonId; + gBattleStruct->monToSwitchIntoId[battler] = chosenMonId; } else { - chosenMonId = *(gBattleStruct->AI_monToSwitchIntoId + battler); - *(gBattleStruct->AI_monToSwitchIntoId + battler) = PARTY_SIZE; - *(gBattleStruct->monToSwitchIntoId + battler) = chosenMonId; + chosenMonId = gBattleStruct->AI_monToSwitchIntoId[battler]; + gBattleStruct->AI_monToSwitchIntoId[battler] = PARTY_SIZE; + gBattleStruct->monToSwitchIntoId[battler] = chosenMonId; } #if TESTING TestRunner_Battle_CheckSwitch(battler, chosenMonId); diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index afff143266d2..16fae14e480d 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -41,7 +41,7 @@ #include "constants/songs.h" #include "constants/trainers.h" #include "constants/rgb.h" -#include "level_caps.h" +#include "caps.h" #include "menu.h" #include "pokemon_summary_screen.h" #include "type_icons.h" @@ -384,8 +384,8 @@ static void HandleInputChooseAction(u32 battler) && !(gAbsentBattlerFlags & (1u << GetBattlerAtPosition(B_POSITION_PLAYER_LEFT))) && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) { - // Return item to bag if partner had selected one. - if (gBattleResources->bufferA[battler][1] == B_ACTION_USE_ITEM) + // Return item to bag if partner had selected one (except flutes). + if (gBattleResources->bufferA[battler][1] == B_ACTION_USE_ITEM && !IsItemFlute(itemId)) { AddBagItem(itemId, 1); } @@ -1725,9 +1725,9 @@ static void MoveSelectionDisplayMoveType(u32 battler) { speciesId = gBattleMons[battler].species; - if (speciesId == SPECIES_OGERPON_WELLSPRING_MASK || speciesId == SPECIES_OGERPON_WELLSPRING_MASK_TERA - || speciesId == SPECIES_OGERPON_HEARTHFLAME_MASK || speciesId == SPECIES_OGERPON_HEARTHFLAME_MASK_TERA - || speciesId == SPECIES_OGERPON_CORNERSTONE_MASK || speciesId == SPECIES_OGERPON_CORNERSTONE_MASK_TERA) + if (speciesId == SPECIES_OGERPON_WELLSPRING || speciesId == SPECIES_OGERPON_WELLSPRING_TERA + || speciesId == SPECIES_OGERPON_HEARTHFLAME || speciesId == SPECIES_OGERPON_HEARTHFLAME_TERA + || speciesId == SPECIES_OGERPON_CORNERSTONE || speciesId == SPECIES_OGERPON_CORNERSTONE_TERA) type = gBattleMons[battler].types[1]; } else if (gMovesInfo[moveInfo->moves[gMoveSelectionCursor[battler]]].category == DAMAGE_CATEGORY_STATUS diff --git a/src/battle_controllers.c b/src/battle_controllers.c index c5d6e3ebdd3c..56a1b8e92f9e 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -2903,7 +2903,7 @@ void BtlController_HandleIntroTrainerBallThrow(u32 battler, u16 tagTrainerPal, c if (side == B_SIDE_PLAYER) { StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[battler]], SpriteCB_FreePlayerSpriteLoadMonSprite); - StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], 1); + StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], ShouldDoSlideInAnim() ? 2 : 1); paletteNum = AllocSpritePalette(tagTrainerPal); LoadCompressedPalette(trainerPal, OBJ_PLTT_ID(paletteNum), PLTT_SIZE_4BPP); diff --git a/src/battle_debug.c b/src/battle_debug.c index a5421a932b34..b03ef194f042 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -2430,6 +2430,7 @@ static const u8 sText_HoldEffectCovertCloak[] = _("Covert Cloak"); static const u8 sText_HoldEffectLoadedDice[] = _("Loaded Dice"); static const u8 sText_HoldEffectBoosterEnergy[] = _("Booster Energy"); static const u8 sText_HoldEffectBerserkGene[] = _("Berserk Gene"); +static const u8 sText_HoldEffectOgerponMask[] = _("Ogerpon Mask"); static const u8 *const sHoldEffectNames[] = { [HOLD_EFFECT_NONE] = sText_HoldEffectNone, @@ -2580,6 +2581,7 @@ static const u8 *const sHoldEffectNames[] = [HOLD_EFFECT_LOADED_DICE] = sText_HoldEffectLoadedDice, [HOLD_EFFECT_BOOSTER_ENERGY] = sText_HoldEffectBoosterEnergy, [HOLD_EFFECT_BERSERK_GENE] = sText_HoldEffectBerserkGene, + [HOLD_EFFECT_OGERPON_MASK] = sText_HoldEffectOgerponMask, }; static const u8 *GetHoldEffectName(u16 holdEffect) { diff --git a/src/battle_dynamax.c b/src/battle_dynamax.c index 073e2c55bcbd..75ea78460ce8 100644 --- a/src/battle_dynamax.c +++ b/src/battle_dynamax.c @@ -34,40 +34,40 @@ struct GMaxMove static const struct GMaxMove sGMaxMoveTable[] = { - {SPECIES_VENUSAUR_GIGANTAMAX, TYPE_GRASS, MOVE_G_MAX_VINE_LASH}, - {SPECIES_BLASTOISE_GIGANTAMAX, TYPE_WATER, MOVE_G_MAX_CANNONADE}, - {SPECIES_CHARIZARD_GIGANTAMAX, TYPE_FIRE, MOVE_G_MAX_WILDFIRE}, - {SPECIES_BUTTERFREE_GIGANTAMAX, TYPE_BUG, MOVE_G_MAX_BEFUDDLE}, - {SPECIES_PIKACHU_GIGANTAMAX, TYPE_ELECTRIC, MOVE_G_MAX_VOLT_CRASH}, - {SPECIES_MEOWTH_GIGANTAMAX, TYPE_NORMAL, MOVE_G_MAX_GOLD_RUSH}, - {SPECIES_MACHAMP_GIGANTAMAX, TYPE_FIGHTING, MOVE_G_MAX_CHI_STRIKE}, - {SPECIES_GENGAR_GIGANTAMAX, TYPE_GHOST, MOVE_G_MAX_TERROR}, - {SPECIES_KINGLER_GIGANTAMAX, TYPE_WATER, MOVE_G_MAX_FOAM_BURST}, - {SPECIES_LAPRAS_GIGANTAMAX, TYPE_ICE, MOVE_G_MAX_RESONANCE}, - {SPECIES_EEVEE_GIGANTAMAX, TYPE_NORMAL, MOVE_G_MAX_CUDDLE}, - {SPECIES_SNORLAX_GIGANTAMAX, TYPE_NORMAL, MOVE_G_MAX_REPLENISH}, - {SPECIES_GARBODOR_GIGANTAMAX, TYPE_POISON, MOVE_G_MAX_MALODOR}, - {SPECIES_MELMETAL_GIGANTAMAX, TYPE_STEEL, MOVE_G_MAX_MELTDOWN}, - {SPECIES_RILLABOOM_GIGANTAMAX, TYPE_GRASS, MOVE_G_MAX_DRUM_SOLO}, - {SPECIES_CINDERACE_GIGANTAMAX, TYPE_FIRE, MOVE_G_MAX_FIREBALL}, - {SPECIES_INTELEON_GIGANTAMAX, TYPE_WATER, MOVE_G_MAX_HYDROSNIPE}, - {SPECIES_CORVIKNIGHT_GIGANTAMAX, TYPE_FLYING, MOVE_G_MAX_WIND_RAGE}, - {SPECIES_ORBEETLE_GIGANTAMAX, TYPE_PSYCHIC, MOVE_G_MAX_GRAVITAS}, - {SPECIES_DREDNAW_GIGANTAMAX, TYPE_WATER, MOVE_G_MAX_STONESURGE}, - {SPECIES_COALOSSAL_GIGANTAMAX, TYPE_ROCK, MOVE_G_MAX_VOLCALITH}, - {SPECIES_FLAPPLE_GIGANTAMAX, TYPE_GRASS, MOVE_G_MAX_TARTNESS}, - {SPECIES_APPLETUN_GIGANTAMAX, TYPE_GRASS, MOVE_G_MAX_SWEETNESS}, - {SPECIES_SANDACONDA_GIGANTAMAX, TYPE_GROUND, MOVE_G_MAX_SANDBLAST}, - {SPECIES_TOXTRICITY_AMPED_GIGANTAMAX, TYPE_ELECTRIC, MOVE_G_MAX_STUN_SHOCK}, - {SPECIES_TOXTRICITY_LOW_KEY_GIGANTAMAX, TYPE_ELECTRIC, MOVE_G_MAX_STUN_SHOCK}, - {SPECIES_CENTISKORCH_GIGANTAMAX, TYPE_FIRE, MOVE_G_MAX_CENTIFERNO}, - {SPECIES_HATTERENE_GIGANTAMAX, TYPE_FAIRY, MOVE_G_MAX_SMITE}, - {SPECIES_GRIMMSNARL_GIGANTAMAX, TYPE_DARK, MOVE_G_MAX_SNOOZE}, - {SPECIES_ALCREMIE_GIGANTAMAX, TYPE_FAIRY, MOVE_G_MAX_FINALE}, - {SPECIES_COPPERAJAH_GIGANTAMAX, TYPE_STEEL, MOVE_G_MAX_STEELSURGE}, - {SPECIES_DURALUDON_GIGANTAMAX, TYPE_DRAGON, MOVE_G_MAX_DEPLETION}, - {SPECIES_URSHIFU_SINGLE_STRIKE_STYLE_GIGANTAMAX,TYPE_DARK, MOVE_G_MAX_ONE_BLOW}, - {SPECIES_URSHIFU_RAPID_STRIKE_STYLE_GIGANTAMAX, TYPE_WATER, MOVE_G_MAX_RAPID_FLOW}, + {SPECIES_VENUSAUR_GMAX, TYPE_GRASS, MOVE_G_MAX_VINE_LASH}, + {SPECIES_BLASTOISE_GMAX, TYPE_WATER, MOVE_G_MAX_CANNONADE}, + {SPECIES_CHARIZARD_GMAX, TYPE_FIRE, MOVE_G_MAX_WILDFIRE}, + {SPECIES_BUTTERFREE_GMAX, TYPE_BUG, MOVE_G_MAX_BEFUDDLE}, + {SPECIES_PIKACHU_GMAX, TYPE_ELECTRIC, MOVE_G_MAX_VOLT_CRASH}, + {SPECIES_MEOWTH_GMAX, TYPE_NORMAL, MOVE_G_MAX_GOLD_RUSH}, + {SPECIES_MACHAMP_GMAX, TYPE_FIGHTING, MOVE_G_MAX_CHI_STRIKE}, + {SPECIES_GENGAR_GMAX, TYPE_GHOST, MOVE_G_MAX_TERROR}, + {SPECIES_KINGLER_GMAX, TYPE_WATER, MOVE_G_MAX_FOAM_BURST}, + {SPECIES_LAPRAS_GMAX, TYPE_ICE, MOVE_G_MAX_RESONANCE}, + {SPECIES_EEVEE_GMAX, TYPE_NORMAL, MOVE_G_MAX_CUDDLE}, + {SPECIES_SNORLAX_GMAX, TYPE_NORMAL, MOVE_G_MAX_REPLENISH}, + {SPECIES_GARBODOR_GMAX, TYPE_POISON, MOVE_G_MAX_MALODOR}, + {SPECIES_MELMETAL_GMAX, TYPE_STEEL, MOVE_G_MAX_MELTDOWN}, + {SPECIES_RILLABOOM_GMAX, TYPE_GRASS, MOVE_G_MAX_DRUM_SOLO}, + {SPECIES_CINDERACE_GMAX, TYPE_FIRE, MOVE_G_MAX_FIREBALL}, + {SPECIES_INTELEON_GMAX, TYPE_WATER, MOVE_G_MAX_HYDROSNIPE}, + {SPECIES_CORVIKNIGHT_GMAX, TYPE_FLYING, MOVE_G_MAX_WIND_RAGE}, + {SPECIES_ORBEETLE_GMAX, TYPE_PSYCHIC, MOVE_G_MAX_GRAVITAS}, + {SPECIES_DREDNAW_GMAX, TYPE_WATER, MOVE_G_MAX_STONESURGE}, + {SPECIES_COALOSSAL_GMAX, TYPE_ROCK, MOVE_G_MAX_VOLCALITH}, + {SPECIES_FLAPPLE_GMAX, TYPE_GRASS, MOVE_G_MAX_TARTNESS}, + {SPECIES_APPLETUN_GMAX, TYPE_GRASS, MOVE_G_MAX_SWEETNESS}, + {SPECIES_SANDACONDA_GMAX, TYPE_GROUND, MOVE_G_MAX_SANDBLAST}, + {SPECIES_TOXTRICITY_AMPED_GMAX, TYPE_ELECTRIC, MOVE_G_MAX_STUN_SHOCK}, + {SPECIES_TOXTRICITY_LOW_KEY_GMAX, TYPE_ELECTRIC, MOVE_G_MAX_STUN_SHOCK}, + {SPECIES_CENTISKORCH_GMAX, TYPE_FIRE, MOVE_G_MAX_CENTIFERNO}, + {SPECIES_HATTERENE_GMAX, TYPE_FAIRY, MOVE_G_MAX_SMITE}, + {SPECIES_GRIMMSNARL_GMAX, TYPE_DARK, MOVE_G_MAX_SNOOZE}, + {SPECIES_ALCREMIE_GMAX, TYPE_FAIRY, MOVE_G_MAX_FINALE}, + {SPECIES_COPPERAJAH_GMAX, TYPE_STEEL, MOVE_G_MAX_STEELSURGE}, + {SPECIES_DURALUDON_GMAX, TYPE_DRAGON, MOVE_G_MAX_DEPLETION}, + {SPECIES_URSHIFU_SINGLE_STRIKE_GMAX,TYPE_DARK, MOVE_G_MAX_ONE_BLOW}, + {SPECIES_URSHIFU_RAPID_STRIKE_GMAX, TYPE_WATER, MOVE_G_MAX_RAPID_FLOW}, }; // Returns whether a battler can Dynamax. diff --git a/src/battle_interface.c b/src/battle_interface.c index 4c17322b5333..5c514a0d80d8 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -33,7 +33,7 @@ #include "constants/rgb.h" #include "constants/songs.h" #include "constants/items.h" -#include "level_caps.h" +#include "caps.h" enum { // Corresponds to gHealthboxElementsGfxTable (and the tables after it) in graphics.c diff --git a/src/battle_main.c b/src/battle_main.c index c7f6eeafda2c..b2b6e14447a8 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -44,6 +44,7 @@ #include "roamer.h" #include "safari_zone.h" #include "scanline_effect.h" +#include "script.h" #include "sound.h" #include "sprite.h" #include "string_util.h" @@ -182,6 +183,7 @@ EWRAM_DATA u16 gLastPrintedMoves[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gLastMoves[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gLastLandedMoves[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gLastHitByType[MAX_BATTLERS_COUNT] = {0}; +EWRAM_DATA u16 gLastUsedMoveType[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gLastResultingMoves[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gLockedMoves[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gLastUsedMove = 0; @@ -3020,6 +3022,7 @@ static void BattleStartClearSetData(void) gLastMoves[i] = MOVE_NONE; gLastLandedMoves[i] = MOVE_NONE; gLastHitByType[i] = 0; + gLastUsedMoveType[i] = 0; gLastResultingMoves[i] = MOVE_NONE; gLastHitBy[i] = 0xFF; gLockedMoves[i] = MOVE_NONE; @@ -3198,6 +3201,7 @@ void SwitchInClearSetData(u32 battler) gLastMoves[battler] = MOVE_NONE; gLastLandedMoves[battler] = MOVE_NONE; gLastHitByType[battler] = 0; + gLastUsedMoveType[battler] = 0; gLastResultingMoves[battler] = MOVE_NONE; gLastPrintedMoves[battler] = MOVE_NONE; gLastHitBy[battler] = 0xFF; @@ -3238,6 +3242,10 @@ void SwitchInClearSetData(u32 battler) gSpecialStatuses[battler].specialDmg = 0; gBattleStruct->enduredDamage &= ~(1u << battler); + // Reset Eject Button / Eject Pack switch detection + AI_DATA->ejectButtonSwitch = FALSE; + AI_DATA->ejectPackSwitch = FALSE; + // Reset G-Max Chi Strike boosts. gBattleStruct->bonusCritStages[battler] = 0; @@ -3327,6 +3335,7 @@ const u8* FaintClearSetData(u32 battler) gLastMoves[battler] = MOVE_NONE; gLastLandedMoves[battler] = MOVE_NONE; gLastHitByType[battler] = 0; + gLastUsedMoveType[battler] = 0; gLastResultingMoves[battler] = MOVE_NONE; gLastPrintedMoves[battler] = MOVE_NONE; gLastHitBy[battler] = 0xFF; @@ -3342,6 +3351,16 @@ const u8* FaintClearSetData(u32 battler) gBattleStruct->palaceFlags &= ~(1u << battler); gBattleStruct->boosterEnergyActivates &= ~(1u << battler); + if (gBattleStruct->commanderActive[battler] != SPECIES_NONE) + { + u32 partner = BATTLE_PARTNER(battler); + if (IsBattlerAlive(partner)) + { + BtlController_EmitSpriteInvisibility(partner, BUFFER_A, FALSE); + MarkBattlerForControllerExec(partner); + } + } + for (i = 0; i < ARRAY_COUNT(gSideTimers); i++) { // User of sticky web fainted, so reset the stored battler ID @@ -4177,11 +4196,16 @@ static void HandleTurnActionSelectionState(void) if ((gBattleTypeFlags & BATTLE_TYPE_HAS_AI || IsWildMonSmart()) && (BattlerHasAi(battler) && !(gBattleTypeFlags & BATTLE_TYPE_PALACE))) { + AI_DATA->aiCalcInProgress = TRUE; + if (ShouldSwitch(battler, FALSE)) + AI_DATA->shouldSwitch |= (1u << battler); if (AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_RISKY) // Risky AI switches aggressively even mid battle AI_DATA->mostSuitableMonId[battler] = GetMostSuitableMonToSwitchInto(battler, TRUE); else AI_DATA->mostSuitableMonId[battler] = GetMostSuitableMonToSwitchInto(battler, FALSE); + gBattleStruct->aiMoveOrAction[battler] = ComputeBattleAiScores(battler); + AI_DATA->aiCalcInProgress = FALSE; } // fallthrough case STATE_BEFORE_ACTION_CHOSEN: // Choose an action. @@ -4191,7 +4215,7 @@ static void HandleTurnActionSelectionState(void) || gBattleStruct->absentBattlerFlags & (1u << GetBattlerAtPosition(BATTLE_PARTNER(position))) || gBattleCommunication[GetBattlerAtPosition(BATTLE_PARTNER(position))] == STATE_WAIT_ACTION_CONFIRMED) { - if (gBattleStruct->absentBattlerFlags & (1u << battler)) + if ((gBattleStruct->absentBattlerFlags & (1u << battler)) || (gBattleStruct->commandingDondozo & (1u << battler))) { gChosenActionByBattler[battler] = B_ACTION_NOTHING_FAINTED; if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) @@ -4731,9 +4755,9 @@ u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, u32 holdEffect) speed *= 2; else if (ability == ABILITY_SLOW_START && gDisableStructs[battler].slowStartTimer != 0) speed /= 2; - else if (ability == ABILITY_PROTOSYNTHESIS && (gBattleWeather & B_WEATHER_SUN || gBattleStruct->boosterEnergyActivates & (1u << battler))) + else if (ability == ABILITY_PROTOSYNTHESIS && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) && ((gBattleWeather & B_WEATHER_SUN && WEATHER_HAS_EFFECT) || gBattleStruct->boosterEnergyActivates & (1u << battler))) speed = (GetHighestStatId(battler) == STAT_SPEED) ? (speed * 150) / 100 : speed; - else if (ability == ABILITY_QUARK_DRIVE && (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gBattleStruct->boosterEnergyActivates & (1u << battler))) + else if (ability == ABILITY_QUARK_DRIVE && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) && (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gBattleStruct->boosterEnergyActivates & (1u << battler))) speed = (GetHighestStatId(battler) == STAT_SPEED) ? (speed * 150) / 100 : speed; // stat stages @@ -5113,6 +5137,9 @@ static void TurnValuesCleanUp(bool8 var0) if (gDisableStructs[i].substituteHP == 0) gBattleMons[i].status2 &= ~STATUS2_SUBSTITUTE; + if (!(gStatuses3[i] & STATUS3_COMMANDER)) + gBattleStruct->commandingDondozo &= ~(1u << i); + gSpecialStatuses[i].parentalBondState = PARENTAL_BOND_OFF; } @@ -5121,6 +5148,7 @@ static void TurnValuesCleanUp(bool8 var0) gSideTimers[B_SIDE_PLAYER].followmeTimer = 0; gSideTimers[B_SIDE_OPPONENT].followmeTimer = 0; + gBattleStruct->usedEjectItem = 0; gBattleStruct->pledgeMove = FALSE; // combined pledge move may not have been used due to a canceller } @@ -5184,15 +5212,15 @@ static bool32 TryDoMoveEffectsBeforeMoves(void) { gBattleStruct->focusPunchBattlers |= 1u << battlers[i]; gBattlerAttacker = battlers[i]; - switch (gChosenMoveByBattler[gBattlerAttacker]) + switch (gMovesInfo[gChosenMoveByBattler[gBattlerAttacker]].effect) { - case MOVE_FOCUS_PUNCH: + case EFFECT_FOCUS_PUNCH: BattleScriptExecute(BattleScript_FocusPunchSetUp); return TRUE; - case MOVE_BEAK_BLAST: + case EFFECT_BEAK_BLAST: BattleScriptExecute(BattleScript_BeakBlastSetUp); return TRUE; - case MOVE_SHELL_TRAP: + case EFFECT_SHELL_TRAP: BattleScriptExecute(BattleScript_ShellTrapSetUp); return TRUE; } @@ -5808,8 +5836,9 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, u8 *ateBoost) type3 = TYPE_MYSTERY; } - if (moveEffect == EFFECT_WEATHER_BALL) + switch (moveEffect) { + case EFFECT_WEATHER_BALL: if (gMain.inBattle && WEATHER_HAS_EFFECT) { if (gBattleWeather & B_WEATHER_RAIN && holdEffect != HOLD_EFFECT_UTILITY_UMBRELLA) @@ -5843,79 +5872,86 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, u8 *ateBoost) } return moveType; } - } - else if (moveEffect == EFFECT_HIDDEN_POWER) - { - u8 typeBits; - if (gMain.inBattle) + break; + case EFFECT_HIDDEN_POWER: { - typeBits = ((gBattleMons[battler].hpIV & 1) << 0) - | ((gBattleMons[battler].attackIV & 1) << 1) - | ((gBattleMons[battler].defenseIV & 1) << 2) - | ((gBattleMons[battler].speedIV & 1) << 3) - | ((gBattleMons[battler].spAttackIV & 1) << 4) - | ((gBattleMons[battler].spDefenseIV & 1) << 5); + u32 typeBits = 0; + if (gMain.inBattle) + { + typeBits = ((gBattleMons[battler].hpIV & 1) << 0) + | ((gBattleMons[battler].attackIV & 1) << 1) + | ((gBattleMons[battler].defenseIV & 1) << 2) + | ((gBattleMons[battler].speedIV & 1) << 3) + | ((gBattleMons[battler].spAttackIV & 1) << 4) + | ((gBattleMons[battler].spDefenseIV & 1) << 5); + } + else + { + typeBits = ((GetMonData(mon, MON_DATA_HP_IV) & 1) << 0) + | ((GetMonData(mon, MON_DATA_ATK_IV) & 1) << 1) + | ((GetMonData(mon, MON_DATA_DEF_IV) & 1) << 2) + | ((GetMonData(mon, MON_DATA_SPEED_IV) & 1) << 3) + | ((GetMonData(mon, MON_DATA_SPATK_IV) & 1) << 4) + | ((GetMonData(mon, MON_DATA_SPDEF_IV) & 1) << 5); + } + + // Subtract 6 instead of 1 below because 5 types are excluded (TYPE_NONE, TYPE_NORMAL, TYPE_MYSTERY, TYPE_FAIRY and TYPE_STELLAR) + // The final + 2 skips past TYPE_NONE and Normal. + moveType = ((NUMBER_OF_MON_TYPES - 6) * typeBits) / 63 + 2; + if (moveType >= TYPE_MYSTERY) + moveType++; + return ((moveType | F_DYNAMIC_TYPE_IGNORE_PHYSICALITY) & 0x3F); } - else + break; + case EFFECT_CHANGE_TYPE_ON_ITEM: + if (holdEffect == gMovesInfo[move].argument) + return ItemId_GetSecondaryId(heldItem); + break; + case EFFECT_REVELATION_DANCE: + if (GetActiveGimmick(battler) != GIMMICK_Z_MOVE) + { + u32 teraType; + if (GetActiveGimmick(battler) == GIMMICK_TERA && ((teraType = GetMonData(mon, MON_DATA_TERA_TYPE)) != TYPE_STELLAR)) + return teraType; + else if (type1 != TYPE_MYSTERY && !(gBattleResources->flags->flags[battler] & RESOURCE_FLAG_ROOST && type1 == TYPE_FLYING)) + return type1; + else if (type2 != TYPE_MYSTERY && !(gBattleResources->flags->flags[battler] & RESOURCE_FLAG_ROOST && type2 == TYPE_FLYING)) + return type2; + else if (gBattleResources->flags->flags[battler] & RESOURCE_FLAG_ROOST) + return (B_ROOST_PURE_FLYING >= GEN_5 ? TYPE_NORMAL : TYPE_MYSTERY); + else if (type3 != TYPE_MYSTERY) + return type3; + else + return TYPE_MYSTERY; + } + break; + case EFFECT_RAGING_BULL: + switch (species) { - typeBits = ((GetMonData(mon, MON_DATA_HP_IV) & 1) << 0) - | ((GetMonData(mon, MON_DATA_ATK_IV) & 1) << 1) - | ((GetMonData(mon, MON_DATA_DEF_IV) & 1) << 2) - | ((GetMonData(mon, MON_DATA_SPEED_IV) & 1) << 3) - | ((GetMonData(mon, MON_DATA_SPATK_IV) & 1) << 4) - | ((GetMonData(mon, MON_DATA_SPDEF_IV) & 1) << 5); + case SPECIES_TAUROS_PALDEA_COMBAT: + case SPECIES_TAUROS_PALDEA_BLAZE: + case SPECIES_TAUROS_PALDEA_AQUA: + return type2; } - - // Subtract 6 instead of 1 below because 5 types are excluded (TYPE_NONE, TYPE_NORMAL, TYPE_MYSTERY, TYPE_FAIRY and TYPE_STELLAR) - // The final + 2 skips past TYPE_NONE and Normal. - moveType = ((NUMBER_OF_MON_TYPES - 6) * typeBits) / 63 + 2; - if (moveType >= TYPE_MYSTERY) - moveType++; - return (moveType | F_DYNAMIC_TYPE_IGNORE_PHYSICALITY); - } - else if (moveEffect == EFFECT_CHANGE_TYPE_ON_ITEM && holdEffect == gMovesInfo[move].argument) - { - return ItemId_GetSecondaryId(heldItem); - } - else if (moveEffect == EFFECT_REVELATION_DANCE && GetActiveGimmick(battler) != GIMMICK_Z_MOVE) - { - u8 teraType; - if (GetActiveGimmick(battler) == GIMMICK_TERA && ((teraType = GetMonData(mon, MON_DATA_TERA_TYPE)) != TYPE_STELLAR)) - return teraType; - else if (type1 != TYPE_MYSTERY && !(gBattleResources->flags->flags[battler] & RESOURCE_FLAG_ROOST && type1 == TYPE_FLYING)) - return type1; - else if (type2 != TYPE_MYSTERY && !(gBattleResources->flags->flags[battler] & RESOURCE_FLAG_ROOST && type2 == TYPE_FLYING)) + break; + case EFFECT_IVY_CUDGEL: + switch (species) + { + case SPECIES_OGERPON_WELLSPRING: + case SPECIES_OGERPON_HEARTHFLAME: + case SPECIES_OGERPON_CORNERSTONE: + case SPECIES_OGERPON_WELLSPRING_TERA: + case SPECIES_OGERPON_HEARTHFLAME_TERA: + case SPECIES_OGERPON_CORNERSTONE_TERA: return type2; - else if (gBattleResources->flags->flags[battler] & RESOURCE_FLAG_ROOST) - return (B_ROOST_PURE_FLYING >= GEN_5 ? TYPE_NORMAL : TYPE_MYSTERY); - else if (type3 != TYPE_MYSTERY) - return type3; - else - return TYPE_MYSTERY; - } - else if (moveEffect == EFFECT_RAGING_BULL - && (species == SPECIES_TAUROS_PALDEAN_COMBAT_BREED - || species == SPECIES_TAUROS_PALDEAN_BLAZE_BREED - || species == SPECIES_TAUROS_PALDEAN_AQUA_BREED)) - { - return type2; - } - else if (moveEffect == EFFECT_IVY_CUDGEL - && (species == SPECIES_OGERPON_WELLSPRING_MASK || species == SPECIES_OGERPON_WELLSPRING_MASK_TERA - || species == SPECIES_OGERPON_HEARTHFLAME_MASK || species == SPECIES_OGERPON_HEARTHFLAME_MASK_TERA - || species == SPECIES_OGERPON_CORNERSTONE_MASK || species == SPECIES_OGERPON_CORNERSTONE_MASK_TERA)) - { - return type2; - } - else if (moveEffect == EFFECT_NATURAL_GIFT) - { + } + break; + case EFFECT_NATURAL_GIFT: if (ItemId_GetPocket(heldItem) == POCKET_BERRIES) return gNaturalGiftTable[ITEM_TO_BERRY(heldItem)].type; else return moveType; - } - else if (moveEffect == EFFECT_TERRAIN_PULSE) - { + case EFFECT_TERRAIN_PULSE: if (gMain.inBattle) { if (IsBattlerTerrainAffected(battler, STATUS_FIELD_TERRAIN_ANY)) @@ -5948,14 +5984,15 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, u8 *ateBoost) } return moveType; } - } - else if (moveEffect == EFFECT_TERA_BLAST && GetActiveGimmick(battler) == GIMMICK_TERA) - { - return GetMonData(mon, MON_DATA_TERA_TYPE); - } - else if (moveEffect == EFFECT_TERA_STARSTORM && species == SPECIES_TERAPAGOS_STELLAR) - { - return TYPE_STELLAR; + break; + case EFFECT_TERA_BLAST: + if (GetActiveGimmick(battler) == GIMMICK_TERA) + return GetMonData(mon, MON_DATA_TERA_TYPE); + break; + case EFFECT_TERA_STARSTORM: + if (species == SPECIES_TERAPAGOS_STELLAR) + return TYPE_STELLAR; + break; } if (moveType == TYPE_NORMAL @@ -6017,21 +6054,20 @@ void SetTypeBeforeUsingMove(u32 move, u32 battler) } } -// special to set a field's totem boost(s) -// inputs: -// var8000: battler -// var8001 - var8007: stat changes -void SetTotemBoost(void) +// Queues stat boosts for a given battler for totem battles +void ScriptSetTotemBoost(struct ScriptContext *ctx) { - u32 battler = gSpecialVar_0x8000; + u32 battler = VarGet(ScriptReadHalfword(ctx)); + u32 stat; u32 i; for (i = 0; i < (NUM_BATTLE_STATS - 1); i++) { - if (*(&gSpecialVar_0x8001 + i)) + stat = VarGet(ScriptReadHalfword(ctx)); + if (stat) { gQueuedStatBoosts[battler].stats |= (1 << i); - gQueuedStatBoosts[battler].statChanges[i] = *(&gSpecialVar_0x8001 + i); + gQueuedStatBoosts[battler].statChanges[i] = stat; gQueuedStatBoosts[battler].stats |= 0x80; // used as a flag for the "totem flared to life" script } } diff --git a/src/battle_message.c b/src/battle_message.c index 4a9a701ac81e..687cd89176e6 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -517,6 +517,9 @@ static const u8 sText_PkmnsItemRestoredHPALittle[] = _("{B_SCR_ACTIVE_NAME_WITH_ static const u8 sText_ItemAllowsOnlyYMove[] = _("{B_LAST_ITEM} allows the\nuse of only {B_CURRENT_MOVE}!\p"); static const u8 sText_PkmnHungOnWithX[] = _("{B_DEF_NAME_WITH_PREFIX} hung on\nusing its {B_LAST_ITEM}!"); const u8 gText_EmptyString3[] = _(""); +static const u8 sText_PlayedFluteCatchyTune[] = _("{B_PLAYER_NAME} played the {B_LAST_ITEM}.\pNow, that's a catchy tune!"); +static const u8 sText_PlayedThe[] = _("{B_PLAYER_NAME} played the\n{B_LAST_ITEM}."); +static const u8 sText_PkmnHearingFluteAwoke[] = _("The POKéMON hearing the FLUTE\nawoke!"); static const u8 sText_YouThrowABallNowRight[] = _("You throw a BALL now, right?\nI… I'll do my best!"); // early declaration of strings @@ -830,7 +833,8 @@ static const u8 sText_TargetIsBeingSaltCured[] = _("{B_DEF_NAME_WITH_PREFIX} is static const u8 sText_TargetIsHurtBySaltCure[] = _("{B_DEF_NAME_WITH_PREFIX} is hurt by {B_BUFF1}!"); static const u8 sText_TargetCoveredInStickyCandySyrup[] = _("{B_DEF_NAME_WITH_PREFIX} got covered\nin sticky syrup!"); static const u8 sText_PkmnTellChillingReceptionJoke[] = _("{B_ATK_NAME_WITH_PREFIX} is preparing to tell a\nchillingly bad joke!"); -static const u8 sText_ZeroToHeroTransformation[] = _("{B_ATK_NAME_WITH_PREFIX} underwent a heroic\ntransformation!"); +static const u8 sText_ZeroToHeroTransformation[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} underwent a heroic\ntransformation!"); +static const u8 sText_CommanderActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} was swallowed by Dondozo\nand became Dondozo's commander!"); static const u8 sText_TheTwoMovesBecomeOne[] = _("The two moves become one!\nIt's a combined move!{PAUSE 16}"); static const u8 sText_ARainbowAppearedOnSide[] = _("A rainbow appeared in the sky\non {B_ATK_TEAM2} team's side!"); static const u8 sText_TheRainbowDisappeared[] = _("The rainbow on {B_ATK_TEAM2}\nside disappeared!"); @@ -869,6 +873,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_ARAINBOWAPPEAREDONSIDE - BATTLESTRINGS_TABLE_START] = sText_ARainbowAppearedOnSide, [STRINGID_THETWOMOVESBECOMEONE - BATTLESTRINGS_TABLE_START] = sText_TheTwoMovesBecomeOne, [STRINGID_ZEROTOHEROTRANSFORMATION - BATTLESTRINGS_TABLE_START] = sText_ZeroToHeroTransformation, + [STRINGID_COMMANDERACTIVATES - BATTLESTRINGS_TABLE_START] = sText_CommanderActivates, [STRINGID_PKMNTELLCHILLINGRECEPTIONJOKE - BATTLESTRINGS_TABLE_START] = sText_PkmnTellChillingReceptionJoke, [STRINGID_MOVEBLOCKEDBYDYNAMAX - BATTLESTRINGS_TABLE_START] = sText_MoveBlockedByDynamax, [STRINGID_TARGETISHURTBYSALTCURE - BATTLESTRINGS_TABLE_START] = sText_TargetIsHurtBySaltCure, @@ -1553,6 +1558,9 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_ITEMWASUSEDUP - BATTLESTRINGS_TABLE_START] = sText_ItemWasUsedUp, [STRINGID_ATTACKERLOSTITSTYPE - BATTLESTRINGS_TABLE_START] = sText_AttackerLostItsType, [STRINGID_CLOAKEDINAHARSHLIGHT - BATTLESTRINGS_TABLE_START] = sText_PkmnIsCloakedInAHarshLight, + [STRINGID_POKEFLUTECATCHY - BATTLESTRINGS_TABLE_START] = sText_PlayedFluteCatchyTune, + [STRINGID_POKEFLUTE - BATTLESTRINGS_TABLE_START] = sText_PlayedThe, + [STRINGID_MONHEARINGFLUTEAWOKE - BATTLESTRINGS_TABLE_START] = sText_PkmnHearingFluteAwoke, }; const u16 gTrainerUsedItemStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 283f42a23b3a..da1a8754e106 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -27,7 +27,7 @@ #include "bg.h" #include "string_util.h" #include "pokemon_icon.h" -#include "level_caps.h" +#include "caps.h" #include "m4a.h" #include "mail.h" #include "event_data.h" @@ -337,8 +337,6 @@ 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 SaveBattlerAttacker(u32 battler); -static void SaveBattlerTarget(u32 battler); static void Cmd_attackcanceler(void); static void Cmd_accuracycheck(void); @@ -1197,6 +1195,13 @@ static void Cmd_attackcanceler(void) u16 attackerAbility = GetBattlerAbility(gBattlerAttacker); u32 moveType = GetMoveType(gCurrentMove); + if (gBattleStruct->usedEjectItem & (1u << gBattlerAttacker)) + { + gBattleStruct->usedEjectItem = 0; + gCurrentActionFuncId = B_ACTION_TRY_FINISH; + return; + } + // Weight-based moves are blocked by Dynamax. if ((GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX) && IsMoveBlockedByDynamax(gCurrentMove)) { @@ -1401,6 +1406,7 @@ static void Cmd_attackcanceler(void) if ((gProtectStructs[gBattlerByTurnOrder[i]].stealMove) && gMovesInfo[gCurrentMove].snatchAffected) { gProtectStructs[gBattlerByTurnOrder[i]].stealMove = FALSE; + gBattleStruct->snatchedMoveIsUsed = TRUE; gBattleScripting.battler = gBattlerByTurnOrder[i]; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_SnatchedMove; @@ -1515,14 +1521,17 @@ static bool32 AccuracyCalcHelper(u16 move) return TRUE; } // If the attacker has the ability No Guard and they aren't targeting a Pokemon involved in a Sky Drop with the move Sky Drop, move hits. - else if (GetBattlerAbility(gBattlerAttacker) == ABILITY_NO_GUARD && (gMovesInfo[move].effect != EFFECT_SKY_DROP || gBattleStruct->skyDropTargets[gBattlerTarget] == 0xFF)) + else if (GetBattlerAbility(gBattlerAttacker) == ABILITY_NO_GUARD + && !(gStatuses3[gBattlerTarget] & STATUS3_COMMANDER) + && (gMovesInfo[move].effect != EFFECT_SKY_DROP || gBattleStruct->skyDropTargets[gBattlerTarget] == 0xFF)) { if (!JumpIfMoveFailed(7, move)) RecordAbilityBattle(gBattlerAttacker, ABILITY_NO_GUARD); return TRUE; } // If the target has the ability No Guard and they aren't involved in a Sky Drop or the current move isn't Sky Drop, move hits. - else if (GetBattlerAbility(gBattlerTarget) == ABILITY_NO_GUARD && (gMovesInfo[move].effect != EFFECT_SKY_DROP || gBattleStruct->skyDropTargets[gBattlerTarget] == 0xFF)) + else if (GetBattlerAbility(gBattlerTarget) == ABILITY_NO_GUARD + && (gMovesInfo[move].effect != EFFECT_SKY_DROP || gBattleStruct->skyDropTargets[gBattlerTarget] == 0xFF)) { if (!JumpIfMoveFailed(7, move)) RecordAbilityBattle(gBattlerTarget, ABILITY_NO_GUARD); @@ -1530,8 +1539,8 @@ static bool32 AccuracyCalcHelper(u16 move) } // If the target is under the effects of Telekinesis, and the move isn't a OH-KO move, move hits. else if (gStatuses3[gBattlerTarget] & STATUS3_TELEKINESIS - && !(gStatuses3[gBattlerTarget] & STATUS3_SEMI_INVULNERABLE) - && gMovesInfo[move].effect != EFFECT_OHKO) + && !(gStatuses3[gBattlerTarget] & STATUS3_SEMI_INVULNERABLE) + && gMovesInfo[move].effect != EFFECT_OHKO) { JumpIfMoveFailed(7, move); return TRUE; @@ -1543,10 +1552,11 @@ static bool32 AccuracyCalcHelper(u16 move) return TRUE; } - if ((gStatuses3[gBattlerTarget] & STATUS3_PHANTOM_FORCE) - || ((gStatuses3[gBattlerTarget] & STATUS3_ON_AIR) && !(gMovesInfo[move].damagesAirborne || gMovesInfo[move].damagesAirborneDoubleDamage)) - || ((gStatuses3[gBattlerTarget] & STATUS3_UNDERGROUND) && !gMovesInfo[move].damagesUnderground) - || ((gStatuses3[gBattlerTarget] & STATUS3_UNDERWATER) && !gMovesInfo[move].damagesUnderwater)) + if ((gStatuses3[gBattlerTarget] & STATUS3_COMMANDER) + || (gStatuses3[gBattlerTarget] & STATUS3_PHANTOM_FORCE) + || ((gStatuses3[gBattlerTarget] & STATUS3_ON_AIR) && !(gMovesInfo[move].damagesAirborne || gMovesInfo[move].damagesAirborneDoubleDamage)) + || ((gStatuses3[gBattlerTarget] & STATUS3_UNDERGROUND) && !gMovesInfo[move].damagesUnderground) + || ((gStatuses3[gBattlerTarget] & STATUS3_UNDERWATER) && !gMovesInfo[move].damagesUnderwater)) { gMoveResultFlags |= MOVE_RESULT_MISSED; JumpIfMoveFailed(7, move); @@ -1689,9 +1699,8 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u break; } - if (gProtectStructs[battlerAtk].usedMicleBerry) + if (gBattleStruct->usedMicleBerry & 1u << battlerAtk) { - gProtectStructs[battlerAtk].usedMicleBerry = FALSE; if (atkAbility == ABILITY_RIPEN) calc = (calc * 140) / 100; // ripen gives 40% acc boost else @@ -1948,6 +1957,79 @@ s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordA u32 holdEffectAtk = GetBattlerHoldEffect(battlerAtk, TRUE); return CalcCritChanceStageArgs(battlerAtk, battlerDef, move, recordAbility, abilityAtk, abilityDef, holdEffectAtk); } + +// Bulbapedia: https://bulbapedia.bulbagarden.net/wiki/Critical_hit#Generation_I +// Crit chance = Threshold / 256, Threshold maximum of 255 +// Threshold = Base Speed / 2 +// High crit move = 8 * (Base Speed / 2) +// Focus Energy = 4 * (Base Speed / 2) +s32 CalcCritChanceStageGen1(u8 battlerAtk, u8 battlerDef, u32 move, bool32 recordAbility) +{ + // Vanilla + u32 focusEnergyScaler = 4; + u32 highCritRatioScaler = 8; + + // Not vanilla + u32 superLuckScaler = 4; + u32 scopeLensScaler = 4; + u32 luckyPunchScaler = 8; + u32 farfetchedLeekScaler = 8; + + s32 critChance = 0; + s32 moveCritStage = gMovesInfo[gCurrentMove].criticalHitStage; + s32 bonusCritStage = gBattleStruct->bonusCritStages[gBattlerAttacker]; // G-Max Chi Strike + u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); + u32 abilityDef = GetBattlerAbility(gBattlerTarget); + u32 holdEffectAtk = GetBattlerHoldEffect(battlerAtk, TRUE); + u16 baseSpeed = gSpeciesInfo[gBattleMons[battlerAtk].species].baseSpeed; + + critChance = baseSpeed / 2; + + // Crit scaling + if (moveCritStage > 0) + critChance = critChance * highCritRatioScaler * moveCritStage; + + if (bonusCritStage > 0) + critChance = critChance * bonusCritStage; + + if ((gBattleMons[gBattlerAttacker].status2 & STATUS2_FOCUS_ENERGY_ANY) != 0) + critChance = critChance * focusEnergyScaler; + + if (holdEffectAtk == HOLD_EFFECT_SCOPE_LENS) + critChance = critChance * scopeLensScaler; + + if (holdEffectAtk == HOLD_EFFECT_LUCKY_PUNCH && gBattleMons[gBattlerAttacker].species == SPECIES_CHANSEY) + critChance = critChance * luckyPunchScaler; + + if (BENEFITS_FROM_LEEK(battlerAtk, holdEffectAtk)) + critChance = critChance * farfetchedLeekScaler; + + if (abilityAtk == ABILITY_SUPER_LUCK) + critChance = critChance * superLuckScaler; + + if (critChance > 255) + critChance = 255; + + // Prevented crits + if (gSideStatuses[battlerDef] & SIDE_STATUS_LUCKY_CHANT) + critChance = -1; + else if (abilityDef == ABILITY_BATTLE_ARMOR || abilityDef == ABILITY_SHELL_ARMOR) + { + if (recordAbility) + RecordAbilityBattle(battlerDef, abilityDef); + critChance = -1; + } + + // Guaranteed crits + else if (gStatuses3[battlerAtk] & STATUS3_LASER_FOCUS + || gMovesInfo[move].alwaysCriticalHit == TRUE + || (abilityAtk == ABILITY_MERCILESS && gBattleMons[battlerDef].status1 & STATUS1_PSN_ANY)) + { + critChance = -2; + } + + return critChance; +} #undef BENEFITS_FROM_LEEK s32 GetCritHitOdds(s32 critChanceIndex) @@ -1963,7 +2045,13 @@ static void Cmd_critcalc(void) CMD_ARGS(); u16 partySlot; - s32 critChance = CalcCritChanceStage(gBattlerAttacker, gBattlerTarget, gCurrentMove, TRUE); + s32 critChance; + + if (B_CRIT_CHANCE == GEN_1) + critChance = CalcCritChanceStageGen1(gBattlerAttacker, gBattlerTarget, gCurrentMove, TRUE); + else + critChance = CalcCritChanceStage(gBattlerAttacker, gBattlerTarget, gCurrentMove, TRUE); + gPotentialItemEffectBattler = gBattlerAttacker; if (gBattleTypeFlags & (BATTLE_TYPE_WALLY_TUTORIAL | BATTLE_TYPE_FIRST_BATTLE)) @@ -1973,7 +2061,18 @@ static void Cmd_critcalc(void) else if (critChance == -2) gIsCriticalHit = TRUE; else - gIsCriticalHit = RandomChance(RNG_CRITICAL_HIT, 1, sCriticalHitOdds[critChance]); + { + if (B_CRIT_CHANCE == GEN_1) + { + u8 critRoll = RandomUniform(RNG_CRITICAL_HIT, 1, 256); + if (critRoll <= critChance) + gIsCriticalHit = 1; + else + gIsCriticalHit = 0; + } + else + gIsCriticalHit = RandomChance(RNG_CRITICAL_HIT, 1, sCriticalHitOdds[critChance]); + } // Counter for EVO_CRITICAL_HITS. partySlot = gBattlerPartyIndexes[gBattlerAttacker]; @@ -2333,7 +2432,7 @@ static void Cmd_datahpupdate(void) if (gBattleStruct->changedSpecies[side][gBattlerPartyIndexes[battler]] == SPECIES_NONE) gBattleStruct->changedSpecies[side][gBattlerPartyIndexes[battler]] = gBattleMons[battler].species; if (gBattleMons[battler].species == SPECIES_MIMIKYU_TOTEM_DISGUISED) - gBattleMons[battler].species = SPECIES_MIMIKYU_TOTEM_BUSTED; + gBattleMons[battler].species = SPECIES_MIMIKYU_BUSTED_TOTEM; else gBattleMons[battler].species = SPECIES_MIMIKYU_BUSTED; if (B_DISGUISE_HP_LOSS >= GEN_8) @@ -2518,7 +2617,7 @@ static void Cmd_resultmessage(void) if (gBattleResources->flags->flags[gBattlerTarget] & RESOURCE_FLAG_ICE_FACE) { gBattleResources->flags->flags[gBattlerTarget] &= ~(RESOURCE_FLAG_ICE_FACE); - gBattleMons[gBattlerTarget].species = SPECIES_EISCUE_NOICE_FACE; + gBattleMons[gBattlerTarget].species = SPECIES_EISCUE_NOICE; gBattleScripting.battler = gBattlerTarget; // For STRINGID_PKMNTRANSFORMED BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_IceFaceNullsDamage; @@ -2853,9 +2952,10 @@ void SetMoveEffect(bool32 primary, bool32 certain) INCREMENT_RESET_RETURN if (!(gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) - && TestIfSheerForceAffected(gBattlerAttacker, gCurrentMove) - && !primary - && gBattleScripting.moveEffect != MOVE_EFFECT_CHARGING) + && TestIfSheerForceAffected(gBattlerAttacker, gCurrentMove) + && !(gMovesInfo[gCurrentMove].effect == EFFECT_ORDER_UP && gBattleStruct->commanderActive[gBattlerAttacker]) + && !primary + && gBattleScripting.moveEffect != MOVE_EFFECT_CHARGING) INCREMENT_RESET_RETURN if (!IsBattlerAlive(gEffectBattler) && !activateAfterFaint) @@ -3829,6 +3929,43 @@ void SetMoveEffect(bool32 primary, bool32 certain) gBattlescriptCurrInstr = BattleScript_LowerAtkSpAtk; } break; + case MOVE_EFFECT_ORDER_UP: + { + u32 stat = 0; + bool32 commanderAffected = TRUE; + switch (gBattleStruct->commanderActive[gEffectBattler]) + { + case SPECIES_TATSUGIRI_CURLY: + stat = STAT_ATK; + break; + case SPECIES_TATSUGIRI_DROOPY: + stat = STAT_DEF; + break; + case SPECIES_TATSUGIRI_STRETCHY: + stat = STAT_SPEED; + break; + default: + commanderAffected = FALSE; + break; + } + if (!commanderAffected + || NoAliveMonsForEitherParty() + || ChangeStatBuffs(SET_STAT_BUFF_VALUE(1), + stat, + affectsUser | STAT_CHANGE_UPDATE_MOVE_EFFECT, + 0) == STAT_CHANGE_DIDNT_WORK) + { + gBattlescriptCurrInstr++; + } + else + { + gBattleScripting.animArg1 = gBattleScripting.moveEffect & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); + gBattleScripting.animArg2 = 0; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_StatUp; + } + } + break; } } } @@ -4675,7 +4812,8 @@ static void MoveValuesCleanUp(void) gIsCriticalHit = FALSE; gBattleScripting.moveEffect = 0; gBattleCommunication[MISS_TYPE] = 0; - gHitMarker &= ~HITMARKER_DESTINYBOND; + if (!gMultiHitCounter) + gHitMarker &= ~HITMARKER_DESTINYBOND; gHitMarker &= ~HITMARKER_SYNCHRONISE_EFFECT; } @@ -5391,17 +5529,17 @@ static bool32 TryKnockOffBattleScript(u32 battlerDef) static u32 GetNextTarget(u32 moveTarget, bool32 excludeCurrent) { - u32 i; - for (i = 0; i < MAX_BATTLERS_COUNT; i++) + u32 battler; + for (battler = 0; battler < MAX_BATTLERS_COUNT; battler++) { - if (i != gBattlerAttacker - && !(excludeCurrent && i == gBattlerTarget) - && IsBattlerAlive(i) - && !(gBattleStruct->targetsDone[gBattlerAttacker] & (1u << i)) - && (GetBattlerSide(i) != GetBattlerSide(gBattlerAttacker) || moveTarget == MOVE_TARGET_FOES_AND_ALLY)) - break; + if (battler != gBattlerAttacker + && !(excludeCurrent && battler == gBattlerTarget) + && IsBattlerAlive(battler) + && !(gBattleStruct->targetsDone[gBattlerAttacker] & (1u << battler)) + && (GetBattlerSide(battler) != GetBattlerSide(gBattlerAttacker) || moveTarget == MOVE_TARGET_FOES_AND_ALLY)) + break; } - return i; + return battler; } static void Cmd_moveend(void) @@ -5437,7 +5575,9 @@ static void Cmd_moveend(void) case MOVEEND_PROTECT_LIKE_EFFECT: if (gProtectStructs[gBattlerAttacker].touchedProtectLike) { - if (gProtectStructs[gBattlerTarget].spikyShielded && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) + if (gProtectStructs[gBattlerTarget].spikyShielded + && gMovesInfo[gCurrentMove].effect != EFFECT_COUNTER + && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) { gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 8; @@ -5600,6 +5740,11 @@ static void Cmd_moveend(void) } gBattleScripting.moveendState++; break; + case MOVEEND_ITEM_EFFECTS_ATTACKER: + if (ItemBattleEffects(ITEMEFFECT_MOVE_END, gBattlerAttacker, FALSE)) + effect = TRUE; + gBattleScripting.moveendState++; + break; case MOVEEND_SYNCHRONIZE_TARGET: // target synchronize if (AbilityBattleEffects(ABILITYEFFECT_SYNCHRONIZE, gBattlerTarget, 0, 0, 0)) effect = TRUE; @@ -5897,12 +6042,14 @@ static void Cmd_moveend(void) gLastMoves[gBattlerAttacker] = gChosenMove; RecordKnownMove(gBattlerAttacker, gChosenMove); gLastResultingMoves[gBattlerAttacker] = gCurrentMove; + gLastUsedMoveType[gBattlerAttacker] = GetMoveType(gCurrentMove); } } else { gLastMoves[gBattlerAttacker] = MOVE_UNAVAILABLE; gLastResultingMoves[gBattlerAttacker] = MOVE_UNAVAILABLE; + gLastUsedMoveType[gBattlerAttacker] = 0; } if (!(gHitMarker & HITMARKER_FAINTED(gBattlerTarget))) @@ -6019,13 +6166,11 @@ static void Cmd_moveend(void) gBattleScripting.multihitString[4]++; if (gMultiHitCounter == 0) { - if (gMovesInfo[gCurrentMove].argument == MOVE_EFFECT_SCALE_SHOT && !NoAliveMonsForEitherParty()) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_DefDownSpeedUp; - } BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MultiHitPrintStrings; + if (gMovesInfo[gCurrentMove].argument == MOVE_EFFECT_SCALE_SHOT && !NoAliveMonsForEitherParty()) + gBattlescriptCurrInstr = BattleScript_ScaleShot; + else + gBattlescriptCurrInstr = BattleScript_MultiHitPrintStrings; effect = TRUE; } else @@ -6154,13 +6299,16 @@ static void Cmd_moveend(void) gBattlescriptCurrInstr = BattleScript_MoveEnd; // Prevent user switch-in selection effect = TRUE; BattleScriptPushCursor(); + gBattleStruct->usedEjectItem |= 1u << battler; if (ejectButtonBattlers & (1u << battler)) { gBattlescriptCurrInstr = BattleScript_EjectButtonActivates; + AI_DATA->ejectButtonSwitch = TRUE; } else // Eject Pack { gBattlescriptCurrInstr = BattleScript_EjectPackActivates; + AI_DATA->ejectPackSwitch = TRUE; // Are these 2 lines below needed? gProtectStructs[battler].statFell = FALSE; gSpecialStatuses[gBattlerAttacker].preventLifeOrbDamage = TRUE; @@ -6223,8 +6371,15 @@ static void Cmd_moveend(void) if (gMovesInfo[gCurrentMove].effect == EFFECT_HIT_ESCAPE) gBattlescriptCurrInstr = BattleScript_MoveEnd; // Prevent user switch-in selection BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_RedCardActivates; - gSpecialStatuses[gBattlerAttacker].preventLifeOrbDamage = TRUE; + if (gBattleStruct->commanderActive[gBattlerAttacker] != SPECIES_NONE) + { + gBattlescriptCurrInstr = BattleScript_RedCardActivationNoSwitch; + } + else + { + gBattlescriptCurrInstr = BattleScript_RedCardActivates; + gSpecialStatuses[gBattlerAttacker].preventLifeOrbDamage = TRUE; + } effect = TRUE; break; // Only fastest red card activates } @@ -6276,22 +6431,23 @@ static void Cmd_moveend(void) gBattleScripting.moveendState++; break; case MOVEEND_DANCER: // Special case because it's so annoying - if (gMovesInfo[gCurrentMove].danceMove) + if (gMovesInfo[gCurrentMove].danceMove && !gBattleStruct->snatchedMoveIsUsed) { u32 battler, nextDancer = 0; - bool32 turnOnHitmarker = FALSE; + bool32 hasDancerTriggered = FALSE; for (battler = 0; battler < gBattlersCount; battler++) { if (gSpecialStatuses[battler].dancerUsedMove) { // in case a battler fails to act on a Dancer-called move - turnOnHitmarker = TRUE; + hasDancerTriggered = TRUE; break; } } if (!(gMoveResultFlags & (MOVE_RESULT_FAILED | MOVE_RESULT_DOESNT_AFFECT_FOE) + || (gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE && !hasDancerTriggered) || (!gSpecialStatuses[gBattlerAttacker].dancerUsedMove && gBattleStruct->bouncedMoveIsUsed))) { // Dance move succeeds // Set target for other Dancer mons; set bit so that mon cannot activate Dancer off of its own move @@ -6305,8 +6461,6 @@ static void Cmd_moveend(void) { if (GetBattlerAbility(battler) == ABILITY_DANCER && !gSpecialStatuses[battler].dancerUsedMove) { - if (turnOnHitmarker) - gHitMarker |= HITMARKER_ATTACKSTRING_PRINTED; if (!nextDancer || (gBattleMons[battler].speed < gBattleMons[nextDancer & 0x3].speed)) nextDancer = battler | 0x4; } @@ -6388,8 +6542,6 @@ static void Cmd_moveend(void) && (gBattleMons[gBattlerAttacker].status2 & STATUS2_LOCK_CONFUSE) != STATUS2_LOCK_CONFUSE_TURN(1)) // And won't end this turn CancelMultiTurnMoves(gBattlerAttacker); // Cancel it - - if (gBattleStruct->savedAttackerCount > 0) { // #if TESTING @@ -6406,7 +6558,6 @@ static void Cmd_moveend(void) DebugPrintfLevel(MGBA_LOG_WARN, "savedTargetCount is greater than 0! More calls to SaveBattlerTarget than RestoreBattlerTarget!"); // #endif } - gBattleStruct->targetsDone[gBattlerAttacker] = 0; gProtectStructs[gBattlerAttacker].targetAffected = FALSE; gProtectStructs[gBattlerAttacker].shellTrap = FALSE; @@ -6422,11 +6573,13 @@ static void Cmd_moveend(void) gBattleStruct->swapDamageCategory = FALSE; gBattleStruct->categoryOverride = FALSE; gBattleStruct->bouncedMoveIsUsed = FALSE; + gBattleStruct->snatchedMoveIsUsed = FALSE; gBattleStruct->enduredDamage = 0; gBattleStruct->additionalEffectsCounter = 0; gBattleStruct->poisonPuppeteerConfusion = FALSE; gBattleStruct->fickleBeamBoosted = FALSE; gBattleStruct->distortedTypeMatchups = 0; + gBattleStruct->usedMicleBerry &= ~(1u << gBattlerAttacker); if (gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) gBattleStruct->pledgeMove = FALSE; if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE) @@ -6434,6 +6587,18 @@ static void Cmd_moveend(void) if (B_CHARGE <= GEN_8 || moveType == TYPE_ELECTRIC) gStatuses3[gBattlerAttacker] &= ~(STATUS3_CHARGED_UP); memset(gQueuedStatBoosts, 0, sizeof(gQueuedStatBoosts)); + + for (i = 0; i < gBattlersCount; i++) + { + if (gBattleStruct->commanderActive[i] != SPECIES_NONE && !IsBattlerAlive(i)) + { + u32 partner = BATTLE_PARTNER(i); + gBattleStruct->commanderActive[i] = SPECIES_NONE; + if (IsBattlerAlive(partner)) + gStatuses3[partner] &= ~STATUS3_COMMANDER; + } + } + gBattleScripting.moveendState++; break; case MOVEEND_COUNT: @@ -6832,126 +6997,53 @@ static void Cmd_openpartyscreen(void) } else if (IsDoubleBattle()) { - bool8 hasReplacement_0, hasReplacement_1, hasReplacement_2, hasReplacement_3; - + bool32 hasReplacement; + hitmarkerFaintBits = gHitMarker >> 28; - - if (1u & hitmarkerFaintBits) - { - battler = 0; - if (HasNoMonsToSwitch(battler, PARTY_SIZE, PARTY_SIZE)) - { - gAbsentBattlerFlags |= 1u << battler; - gHitMarker &= ~HITMARKER_FAINTED(battler); - BtlController_EmitCantSwitch(battler, BUFFER_A); - MarkBattlerForControllerExec(battler); - } - else if (!gSpecialStatuses[battler].faintedHasReplacement) - { - ChooseMonToSendOut(battler, gBattleStruct->monToSwitchIntoId[2]); - gSpecialStatuses[battler].faintedHasReplacement = TRUE; - } - else - { - BtlController_EmitLinkStandbyMsg(battler, BUFFER_A, LINK_STANDBY_MSG_ONLY, FALSE); - MarkBattlerForControllerExec(battler); - flags |= 1; - } - } - if (4u & hitmarkerFaintBits && !(1u & hitmarkerFaintBits)) - { - battler = 2; - if (HasNoMonsToSwitch(battler, PARTY_SIZE, PARTY_SIZE)) - { - gAbsentBattlerFlags |= 1u << battler; - gHitMarker &= ~HITMARKER_FAINTED(battler); - BtlController_EmitCantSwitch(battler, BUFFER_A); - MarkBattlerForControllerExec(battler); - } - else if (!gSpecialStatuses[battler].faintedHasReplacement) - { - ChooseMonToSendOut(battler, gBattleStruct->monToSwitchIntoId[0]); - gSpecialStatuses[battler].faintedHasReplacement = TRUE; - } - else if (!(flags & 1)) - { - BtlController_EmitLinkStandbyMsg(battler, BUFFER_A, LINK_STANDBY_MSG_ONLY, FALSE); - MarkBattlerForControllerExec(battler); - } - } - if (2 & hitmarkerFaintBits) - { - battler = 1; - if (HasNoMonsToSwitch(battler, PARTY_SIZE, PARTY_SIZE)) - { - gAbsentBattlerFlags |= 1u << battler; - gHitMarker &= ~HITMARKER_FAINTED(battler); - BtlController_EmitCantSwitch(battler, BUFFER_A); - MarkBattlerForControllerExec(battler); - } - else if (!gSpecialStatuses[battler].faintedHasReplacement) - { - ChooseMonToSendOut(battler, gBattleStruct->monToSwitchIntoId[3]); - gSpecialStatuses[battler].faintedHasReplacement = TRUE; - } - else - { - BtlController_EmitLinkStandbyMsg(battler, BUFFER_A, LINK_STANDBY_MSG_ONLY, FALSE); - MarkBattlerForControllerExec(battler); - flags |= 2; - } - } - if (8 & hitmarkerFaintBits && !(2 & hitmarkerFaintBits)) - { - battler = 3; - if (HasNoMonsToSwitch(battler, PARTY_SIZE, PARTY_SIZE)) - { - gAbsentBattlerFlags |= 1u << battler; - gHitMarker &= ~HITMARKER_FAINTED(battler); - BtlController_EmitCantSwitch(battler, BUFFER_A); - MarkBattlerForControllerExec(battler); - } - else if (!gSpecialStatuses[battler].faintedHasReplacement) - { - ChooseMonToSendOut(battler, gBattleStruct->monToSwitchIntoId[1]); - gSpecialStatuses[battler].faintedHasReplacement = TRUE; - } - else if (!(flags & 2)) - { - BtlController_EmitLinkStandbyMsg(battler, BUFFER_A, LINK_STANDBY_MSG_ONLY, FALSE); - MarkBattlerForControllerExec(battler); - } - } - - hasReplacement_0 = gSpecialStatuses[0].faintedHasReplacement; - if (!hasReplacement_0) + for (i = 0; i < gBattlersCount; i++) { - hasReplacement_2 = gSpecialStatuses[2].faintedHasReplacement; - if (!hasReplacement_2 && hitmarkerFaintBits != 0) + if (((1u << i) & hitmarkerFaintBits)) { - if (gAbsentBattlerFlags & 1) - battler = 2; - else - battler = 0; - - BtlController_EmitLinkStandbyMsg(battler, BUFFER_A, LINK_STANDBY_MSG_ONLY, FALSE); - MarkBattlerForControllerExec(battler); + if (i > 1 && ((1u << BATTLE_PARTNER(i)) & hitmarkerFaintBits)) + continue; + + battler = i; + if (HasNoMonsToSwitch(battler, PARTY_SIZE, PARTY_SIZE)) + { + gAbsentBattlerFlags |= 1u << battler; + gHitMarker &= ~HITMARKER_FAINTED(battler); + BtlController_EmitCantSwitch(battler, BUFFER_A); + MarkBattlerForControllerExec(battler); + } + else if (!gSpecialStatuses[battler].faintedHasReplacement) + { + ChooseMonToSendOut(battler, gBattleStruct->monToSwitchIntoId[BATTLE_PARTNER(battler)]); + gSpecialStatuses[battler].faintedHasReplacement = TRUE; + } + else if (battler < 2 || (battler > 1 && !(flags & BATTLE_PARTNER(battler)))) + { + BtlController_EmitLinkStandbyMsg(battler, BUFFER_A, LINK_STANDBY_MSG_ONLY, FALSE); + MarkBattlerForControllerExec(battler); + flags |= battler; + } } - } - hasReplacement_1 = gSpecialStatuses[1].faintedHasReplacement; - if (!hasReplacement_1) + + for (i = 0; i < NUM_BATTLE_SIDES; i++) { - hasReplacement_3 = gSpecialStatuses[3].faintedHasReplacement; - if (!hasReplacement_3 && hitmarkerFaintBits != 0) + if (!(gSpecialStatuses[i].faintedHasReplacement)) { - if (gAbsentBattlerFlags & 2) - battler = 3; - else - battler = 1; + hasReplacement = gSpecialStatuses[BATTLE_PARTNER(i)].faintedHasReplacement; + if (!hasReplacement && hitmarkerFaintBits != 0) + { + if (gAbsentBattlerFlags & (1 << i)) + battler = BATTLE_PARTNER(i); + else + battler = i; - BtlController_EmitLinkStandbyMsg(battler, BUFFER_A, LINK_STANDBY_MSG_ONLY, FALSE); - MarkBattlerForControllerExec(battler); + BtlController_EmitLinkStandbyMsg(battler, BUFFER_A, LINK_STANDBY_MSG_ONLY, FALSE); + MarkBattlerForControllerExec(battler); + } } } } @@ -6964,36 +7056,23 @@ static void Cmd_openpartyscreen(void) if (IsDoubleBattle()) { hitmarkerFaintBits = gHitMarker >> 28; - if (4 & hitmarkerFaintBits && 1 & hitmarkerFaintBits) + for (i = 0; i < NUM_BATTLE_SIDES; i++) { - battler = 2; - if (HasNoMonsToSwitch(battler, gBattleResources->bufferB[0][1], PARTY_SIZE)) + if ((1 << BATTLE_PARTNER(i)) & hitmarkerFaintBits && (1 << i) & hitmarkerFaintBits) { - gAbsentBattlerFlags |= 1u << battler; - gHitMarker &= ~HITMARKER_FAINTED(battler); - BtlController_EmitCantSwitch(battler, BUFFER_A); - MarkBattlerForControllerExec(battler); - } - else if (!gSpecialStatuses[battler].faintedHasReplacement) - { - ChooseMonToSendOut(battler, gBattleStruct->monToSwitchIntoId[0]); - gSpecialStatuses[battler].faintedHasReplacement = TRUE; - } - } - if (8u & hitmarkerFaintBits && hitmarkerFaintBits & 2u) - { - battler = 3; - if (HasNoMonsToSwitch(battler, gBattleResources->bufferB[1][1], PARTY_SIZE)) - { - gAbsentBattlerFlags |= 1u << battler; - gHitMarker &= ~HITMARKER_FAINTED(battler); - BtlController_EmitCantSwitch(battler, BUFFER_A); - MarkBattlerForControllerExec(battler); - } - else if (!gSpecialStatuses[battler].faintedHasReplacement) - { - ChooseMonToSendOut(battler, gBattleStruct->monToSwitchIntoId[1]); - gSpecialStatuses[battler].faintedHasReplacement = TRUE; + battler = BATTLE_PARTNER(i); + if (HasNoMonsToSwitch(battler, PARTY_SIZE, PARTY_SIZE)) + { + gAbsentBattlerFlags |= (1u << battler); + gHitMarker &= ~(HITMARKER_FAINTED(battler)); + BtlController_EmitCantSwitch(battler, BUFFER_A); + MarkBattlerForControllerExec(battler); + } + else if (!gSpecialStatuses[battler].faintedHasReplacement) + { + ChooseMonToSendOut(battler, gBattleStruct->monToSwitchIntoId[i]); + gSpecialStatuses[battler].faintedHasReplacement = TRUE; + } } } gBattlescriptCurrInstr = cmd->nextInstr; @@ -7334,6 +7413,7 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) switch (GetBattlerAbility(i)) { case ABILITY_TRACE: + case ABILITY_COMMANDER: if (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, i, 0, 0, 0)) return TRUE; break; @@ -8768,12 +8848,15 @@ u32 GetHighestStatId(u32 battler) for (i = STAT_DEF; i < NUM_STATS; i++) { u16 *statVal = &gBattleMons[battler].attack + (i - 1); - if (*statVal > highestStat) + if (*statVal > highestStat && i != STAT_SPEED) { highestStat = *statVal; highestId = i; } } + if (gBattleMons[battler].speed > highestStat) + highestId = STAT_SPEED; + return highestId; } @@ -8927,29 +9010,40 @@ static bool32 ChangeOrderTargetAfterAttacker(void) { u32 i; u8 data[MAX_BATTLERS_COUNT]; + u8 actionsData[MAX_BATTLERS_COUNT]; - if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget) - || GetBattlerTurnOrderNum(gBattlerAttacker) + 1 == GetBattlerTurnOrderNum(gBattlerTarget)) + if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget)) return FALSE; + if (GetBattlerTurnOrderNum(gBattlerAttacker) + 1 == GetBattlerTurnOrderNum(gBattlerTarget)) + return B_AFTER_YOU_TURN_ORDER >= GEN_8; - for (i = 0; i < gBattlersCount; i++) + for (i = 0; i < MAX_BATTLERS_COUNT; i++) + { data[i] = gBattlerByTurnOrder[i]; + actionsData[i] = gActionsByTurnOrder[i]; + } if (GetBattlerTurnOrderNum(gBattlerAttacker) == 0 && GetBattlerTurnOrderNum(gBattlerTarget) == 2) { gBattlerByTurnOrder[1] = gBattlerTarget; + gActionsByTurnOrder[1] = actionsData[2]; gBattlerByTurnOrder[2] = data[1]; - gBattlerByTurnOrder[3] = data[3]; + gActionsByTurnOrder[2] = actionsData[1]; } else if (GetBattlerTurnOrderNum(gBattlerAttacker) == 0 && GetBattlerTurnOrderNum(gBattlerTarget) == 3) { gBattlerByTurnOrder[1] = gBattlerTarget; + gActionsByTurnOrder[1] = actionsData[3]; gBattlerByTurnOrder[2] = data[1]; + gActionsByTurnOrder[2] = actionsData[1]; gBattlerByTurnOrder[3] = data[2]; + gActionsByTurnOrder[3] = actionsData[2]; } else // Attacker == 1, Target == 3 { gBattlerByTurnOrder[2] = gBattlerTarget; + gActionsByTurnOrder[2] = actionsData[3]; gBattlerByTurnOrder[3] = data[2]; + gActionsByTurnOrder[3] = actionsData[2]; } return TRUE; } @@ -11403,7 +11497,7 @@ static void Cmd_stockpiletohpheal(void) const u8 *failInstr = cmd->failInstr; - if (gDisableStructs[gBattlerAttacker].stockpileCounter == 0) + if (gDisableStructs[gBattlerAttacker].stockpileCounter == 0 && !gBattleStruct->snatchedMoveIsUsed) { gBattlescriptCurrInstr = failInstr; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWALLOW_FAILED; @@ -11419,14 +11513,22 @@ static void Cmd_stockpiletohpheal(void) } else { - gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / (1 << (3 - gDisableStructs[gBattlerAttacker].stockpileCounter)); + if (gDisableStructs[gBattlerAttacker].stockpileCounter > 0) + { + gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / (1 << (3 - gDisableStructs[gBattlerAttacker].stockpileCounter)); + gBattleScripting.animTurn = gDisableStructs[gBattlerAttacker].stockpileCounter; + gBattleStruct->moveEffect2 = MOVE_EFFECT_STOCKPILE_WORE_OFF; + } + else // Snatched move + { + gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; + gBattleScripting.animTurn = 1; + } if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattleMoveDamage *= -1; - gBattleScripting.animTurn = gDisableStructs[gBattlerAttacker].stockpileCounter; - gBattleStruct->moveEffect2 = MOVE_EFFECT_STOCKPILE_WORE_OFF; gBattlescriptCurrInstr = cmd->nextInstr; gBattlerTarget = gBattlerAttacker; } @@ -12378,14 +12480,19 @@ static void Cmd_updatestatusicon(void) if (gBattleControllerExecFlags) return; - if (cmd->battler != BS_ATTACKER_WITH_PARTNER) + if (cmd->battler == BS_PLAYER2) { - battler = GetBattlerForBattleScript(cmd->battler); - BtlController_EmitStatusIconUpdate(battler, BUFFER_A, gBattleMons[battler].status1, gBattleMons[battler].status2); - MarkBattlerForControllerExec(battler); + for (battler = gBattleControllerExecFlags; battler < gBattlersCount; battler++) + { + if (!(gAbsentBattlerFlags & (1u << battler))) + { + BtlController_EmitStatusIconUpdate(battler, BUFFER_A, gBattleMons[battler].status1, gBattleMons[battler].status2); + MarkBattlerForControllerExec(battler); + } + } gBattlescriptCurrInstr = cmd->nextInstr; } - else + else if (cmd->battler == BS_ATTACKER_WITH_PARTNER) { battler = gBattlerAttacker; if (!(gAbsentBattlerFlags & (1u << battler))) @@ -12404,6 +12511,13 @@ static void Cmd_updatestatusicon(void) } gBattlescriptCurrInstr = cmd->nextInstr; } + else + { + battler = GetBattlerForBattleScript(cmd->battler); + BtlController_EmitStatusIconUpdate(battler, BUFFER_A, gBattleMons[battler].status1, gBattleMons[battler].status2); + MarkBattlerForControllerExec(battler); + gBattlescriptCurrInstr = cmd->nextInstr; + } } static void Cmd_setmist(void) @@ -12457,7 +12571,7 @@ static void Cmd_transformdataexecution(void) gBattlescriptCurrInstr = cmd->nextInstr; if (gBattleMons[gBattlerTarget].status2 & STATUS2_TRANSFORMED || gBattleStruct->illusion[gBattlerTarget].on - || gStatuses3[gBattlerTarget] & STATUS3_SEMI_INVULNERABLE) + || gStatuses3[gBattlerTarget] & STATUS3_SEMI_INVULNERABLE_NO_COMMANDER) { gMoveResultFlags |= MOVE_RESULT_FAILED; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TRANSFORM_FAILED; @@ -12801,60 +12915,122 @@ static void Cmd_settypetorandomresistance(void) { CMD_ARGS(const u8 *failInstr); - if (gLastLandedMoves[gBattlerAttacker] == MOVE_NONE - || gLastLandedMoves[gBattlerAttacker] == MOVE_UNAVAILABLE) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else if (gBattleMoveEffects[gMovesInfo[gLastLandedMoves[gBattlerAttacker]].effect].twoTurnEffect - && gBattleMons[gLastHitBy[gBattlerAttacker]].status2 & STATUS2_MULTIPLETURNS) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_TERA) + // Before Gen 5 Conversion 2 only worked on a move the attacker was actually hit by. + // This changed later to the last move used by the selected target. + if (B_UPDATED_CONVERSION_2 < GEN_5) { - gBattlescriptCurrInstr = cmd->failInstr; - } - else if (gLastHitByType[gBattlerAttacker] == TYPE_STELLAR || gLastHitByType[gBattlerAttacker] == TYPE_MYSTERY) - { - gBattlescriptCurrInstr = cmd->failInstr; + if (gLastLandedMoves[gBattlerAttacker] == MOVE_NONE + || gLastLandedMoves[gBattlerAttacker] == MOVE_UNAVAILABLE) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else if (gBattleMoveEffects[gMovesInfo[gLastLandedMoves[gBattlerAttacker]].effect].twoTurnEffect + && gBattleMons[gLastHitBy[gBattlerAttacker]].status2 & STATUS2_MULTIPLETURNS) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_TERA) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else if (gLastHitByType[gBattlerAttacker] == TYPE_STELLAR || gLastHitByType[gBattlerAttacker] == TYPE_MYSTERY) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else + { + u32 i, resistTypes = 0; + u32 hitByType = gLastHitByType[gBattlerAttacker]; + + for (i = 0; i < NUMBER_OF_MON_TYPES; i++) // Find all types that resist. + { + switch (GetTypeModifier(hitByType, i)) + { + case UQ_4_12(0): + case UQ_4_12(0.5): + resistTypes |= 1u << i; + break; + } + } + + while (resistTypes != 0) + { + i = Random() % NUMBER_OF_MON_TYPES; + if (resistTypes & 1u << i) + { + if (IS_BATTLER_OF_TYPE(gBattlerAttacker, i)) + { + resistTypes &= ~(1u << i); // Type resists, but the user is already of this type. + } + else + { + SET_BATTLER_TYPE(gBattlerAttacker, i); + PREPARE_TYPE_BUFFER(gBattleTextBuff1, i); + gBattlescriptCurrInstr = cmd->nextInstr; + return; + } + } + } + + gBattlescriptCurrInstr = cmd->failInstr; + } } else { - u32 i, resistTypes = 0; - u32 hitByType = gLastHitByType[gBattlerAttacker]; - - for (i = 0; i < NUMBER_OF_MON_TYPES; i++) // Find all types that resist. + if (gLastResultingMoves[gBattlerTarget] == MOVE_NONE + || gLastResultingMoves[gBattlerTarget] == MOVE_UNAVAILABLE + || gLastResultingMoves[gBattlerTarget] == MOVE_STRUGGLE) { - switch (GetTypeModifier(hitByType, i)) - { - case UQ_4_12(0): - case UQ_4_12(0.5): - resistTypes |= 1u << i; - break; - } + gBattlescriptCurrInstr = cmd->failInstr; } - - while (resistTypes != 0) + else if (IsSemiInvulnerable(gBattlerTarget, gCurrentMove)) { - i = Random() % NUMBER_OF_MON_TYPES; - if (resistTypes & (1u << i)) + gBattlescriptCurrInstr = cmd->failInstr; + } + else if (gLastUsedMoveType[gBattlerTarget] == TYPE_NONE || gLastUsedMoveType[gBattlerTarget] == TYPE_STELLAR || gLastUsedMoveType[gBattlerTarget] == TYPE_MYSTERY) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_TERA) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else + { + u32 i, resistTypes = 0; + + for (i = 0; i < NUMBER_OF_MON_TYPES; i++) // Find all types that resist. { - if (IS_BATTLER_OF_TYPE(gBattlerAttacker, i)) + switch (GetTypeModifier(gLastUsedMoveType[gBattlerTarget], i)) { - resistTypes &= ~(1u << i); // Type resists, but the user is already of this type. + case UQ_4_12(0): + case UQ_4_12(0.5): + resistTypes |= 1u << i; + break; } - else + } + + while (resistTypes != 0) + { + i = Random() % NUMBER_OF_MON_TYPES; + if (resistTypes & 1u << i) { - SET_BATTLER_TYPE(gBattlerAttacker, i); - PREPARE_TYPE_BUFFER(gBattleTextBuff1, i); - gBattlescriptCurrInstr = cmd->nextInstr; - return; + if (IS_BATTLER_OF_TYPE(gBattlerAttacker, i)) + { + resistTypes &= ~(1u << i); // Type resists, but the user is already of this type. + } + else + { + SET_BATTLER_TYPE(gBattlerAttacker, i); + PREPARE_TYPE_BUFFER(gBattleTextBuff1, i); + gBattlescriptCurrInstr = cmd->nextInstr; + return; + } } } - } - gBattlescriptCurrInstr = cmd->failInstr; + gBattlescriptCurrInstr = cmd->failInstr; + } } } @@ -13247,7 +13423,8 @@ static void Cmd_trysetperishsong(void) { if (gStatuses3[i] & STATUS3_PERISH_SONG || GetBattlerAbility(i) == ABILITY_SOUNDPROOF - || BlocksPrankster(gCurrentMove, gBattlerAttacker, i, TRUE)) + || BlocksPrankster(gCurrentMove, gBattlerAttacker, i, TRUE) + || gStatuses3[i] & STATUS3_COMMANDER) { notAffectedCount++; } @@ -15536,8 +15713,8 @@ static const u16 sTelekinesisBanList[] = { SPECIES_DIGLETT, SPECIES_DUGTRIO, - SPECIES_DIGLETT_ALOLAN, - SPECIES_DUGTRIO_ALOLAN, + SPECIES_DIGLETT_ALOLA, + SPECIES_DUGTRIO_ALOLA, SPECIES_SANDYGAST, SPECIES_PALOSSAND, SPECIES_GENGAR_MEGA, @@ -15657,7 +15834,7 @@ static void Cmd_callnative(void) // Callnative Funcs -static void SaveBattlerTarget(u32 battler) +void SaveBattlerTarget(u32 battler) { if (gBattleStruct->savedTargetCount < NELEMS(gBattleStruct->savedBattlerTarget)) gBattleStruct->savedBattlerTarget[gBattleStruct->savedTargetCount++] = battler; @@ -15665,7 +15842,7 @@ static void SaveBattlerTarget(u32 battler) DebugPrintfLevel(MGBA_LOG_WARN, "Attempting to exceed savedBattlerTarget array size!"); } -static void SaveBattlerAttacker(u32 battler) +void SaveBattlerAttacker(u32 battler) { if (gBattleStruct->savedAttackerCount < NELEMS(gBattleStruct->savedBattlerAttacker)) gBattleStruct->savedBattlerAttacker[gBattleStruct->savedAttackerCount++] = battler; @@ -16059,7 +16236,7 @@ void ApplyExperienceMultipliers(s32 *expAmount, u8 expGetterMonId, u8 faintedBat *expAmount = (*expAmount * 150) / 100; if (B_UNEVOLVED_EXP_MULTIPLIER >= GEN_6 && IsMonPastEvolutionLevel(&gPlayerParty[expGetterMonId])) *expAmount = (*expAmount * 4915) / 4096; - if (B_AFFECTION_MECHANICS == TRUE && GetBattlerAffectionHearts(expGetterMonId) >= AFFECTION_FOUR_HEARTS) + if (B_AFFECTION_MECHANICS == TRUE && GetMonAffectionHearts(&gPlayerParty[expGetterMonId]) >= AFFECTION_FOUR_HEARTS) *expAmount = (*expAmount * 4915) / 4096; if (CheckBagHasItem(ITEM_EXP_CHARM, 1)) //is also for other exp boosting Powers if/when implemented *expAmount = (*expAmount * 150) / 100; @@ -16976,7 +17153,7 @@ void BS_TryActivateGulpMissile(void) void BS_TryQuash(void) { NATIVE_ARGS(const u8 *failInstr); - u32 i; + u32 i, j; // It's true if foe is faster, has a bigger priority, or switches if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget)) @@ -16987,20 +17164,18 @@ void BS_TryQuash(void) // If the above condition is not true, it means we are faster than the foe, so we can set the quash bit gProtectStructs[gBattlerTarget].quash = TRUE; - for (i = 0; i < gBattlersCount; i++) - { - gBattlerByTurnOrder[i] = i; - } - for (i = 0; i < gBattlersCount - 1; i++) + + // this implementation assumes turn order is correct when using Quash + i = GetBattlerTurnOrderNum(gBattlerTarget); + for (j = i + 1; j < gBattlersCount; j++) { - s32 j; - for (j = i + 1; j < gBattlersCount; j++) - { - if (!gProtectStructs[i].quash - && !gProtectStructs[j].quash - && GetWhichBattlerFaster(gBattlerByTurnOrder[i], gBattlerByTurnOrder[j], FALSE) == -1) - SwapTurnOrder(i, j); - } + // Gen 7- config makes target go last so that the order of quash targets is kept for the correct turn order + // Gen 8+ config alters Turn Order of the target according to speed, dynamic speed should handle the rest + if (B_QUASH_TURN_ORDER < GEN_8 || GetWhichBattlerFaster(gBattlerByTurnOrder[i], gBattlerByTurnOrder[j], FALSE) == -1) + SwapTurnOrder(i, j); + else + break; + i++; } gBattlescriptCurrInstr = cmd->nextInstr; } @@ -17236,3 +17411,74 @@ void BS_TryRevivalBlessing(void) MarkBattlerForControllerExec(gBattlerAttacker); } } + +void BS_JumpIfCommanderActive(void) +{ + NATIVE_ARGS(const u8 *jumpInstr); + + if (gBattleStruct->commanderActive[gBattlerTarget] != SPECIES_NONE) + gBattlescriptCurrInstr = cmd->jumpInstr; + else if (gStatuses3[gBattlerTarget] & STATUS3_COMMANDER) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; +} + +static void UpdatePokeFlutePartyStatus(struct Pokemon* party, u8 position) +{ + s32 i; + u8 battler; + u32 monToCheck, status; + u16 species, abilityNum; + monToCheck = 0; + for (i = 0; i < PARTY_SIZE; i++) + { + species = GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG); + abilityNum = GetMonData(&party[i], MON_DATA_ABILITY_NUM); + status = GetMonData(&party[i], MON_DATA_STATUS); + if (species != SPECIES_NONE + && species != SPECIES_EGG + && status & AILMENT_FNT + && GetAbilityBySpecies(species, abilityNum) != ABILITY_SOUNDPROOF) + monToCheck |= (1 << i); + } + if (monToCheck) + { + battler = GetBattlerAtPosition(position); + status = 0; + BtlController_EmitSetMonData(battler, BUFFER_A, REQUEST_STATUS_BATTLE, monToCheck, 4, &status); + MarkBattlerForControllerExec(battler); + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + } +} + +void BS_CheckPokeFlute(void) +{ + NATIVE_ARGS(); + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + + s32 i; + for (i = 0; i < gBattlersCount; i++) + { + if (GetBattlerAbility(i) != ABILITY_SOUNDPROOF) + { + gBattleMons[i].status1 &= ~STATUS1_SLEEP; + gBattleMons[i].status2 &= ~STATUS2_NIGHTMARE; + } + } + + UpdatePokeFlutePartyStatus(gPlayerParty, B_POSITION_PLAYER_LEFT); + UpdatePokeFlutePartyStatus(gEnemyParty, B_POSITION_OPPONENT_LEFT); + + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_WaitFanfare(void) +{ + NATIVE_ARGS(); + + if (!IsFanfareTaskInactive()) + return; + + gBattlescriptCurrInstr = cmd->nextInstr; +} diff --git a/src/battle_util.c b/src/battle_util.c index a54e8a12c8de..83ed114c0778 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -130,7 +130,9 @@ void HandleAction_UseMove(void) u16 moveTarget; gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; - if (gBattleStruct->absentBattlerFlags & (1u << gBattlerAttacker) || !IsBattlerAlive(gBattlerAttacker)) + if (gBattleStruct->absentBattlerFlags & (1u << gBattlerAttacker) + || gBattleStruct->commandingDondozo & (1u << gBattlerAttacker) + || !IsBattlerAlive(gBattlerAttacker)) { gCurrentActionFuncId = B_ACTION_FINISHED; return; @@ -737,8 +739,6 @@ void HandleAction_ActionFinished(void) gMoveResultFlags = 0; gBattleScripting.animTurn = 0; gBattleScripting.animTargetsHit = 0; - gLastLandedMoves[gBattlerAttacker] = 0; - gLastHitByType[gBattlerAttacker] = 0; gBattleStruct->dynamicMoveType = 0; gBattleScripting.moveendState = 0; gBattleCommunication[3] = 0; @@ -3557,11 +3557,20 @@ u8 AtkCanceller_UnableToUseMove(u32 moveType) case CANCELLER_POWDER_STATUS: if (gBattleMons[gBattlerAttacker].status2 & STATUS2_POWDER) { - if (moveType == TYPE_FIRE) + u32 partnerMove = gBattleMons[BATTLE_PARTNER(gBattlerAttacker)].moves[gBattleStruct->chosenMovePositions[BATTLE_PARTNER(gBattlerAttacker)]]; + if ((moveType == TYPE_FIRE && !gBattleStruct->pledgeMove) + || (gCurrentMove == MOVE_FIRE_PLEDGE && partnerMove == MOVE_GRASS_PLEDGE) + || (gCurrentMove == MOVE_GRASS_PLEDGE && partnerMove == MOVE_FIRE_PLEDGE && gBattleStruct->pledgeMove)) { gProtectStructs[gBattlerAttacker].powderSelfDmg = TRUE; - gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; - gBattlescriptCurrInstr = BattleScript_MoveUsedPowder; + if (GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD + && (B_POWDER_RAIN < GEN_7 || !IsBattlerWeatherAffected(gBattlerAttacker, B_WEATHER_RAIN_PRIMAL))) + gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; + + if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE + || gBattleStruct->obedienceResult != OBEYS + || HasTrainerUsedGimmick(gBattlerAttacker, GIMMICK_Z_MOVE)) + gBattlescriptCurrInstr = BattleScript_MoveUsedPowder; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; effect = 1; } @@ -3591,7 +3600,15 @@ u8 AtkCanceller_UnableToUseMove(u32 moveType) SetGimmickAsActivated(gBattlerAttacker, GIMMICK_Z_MOVE); gBattleScripting.battler = gBattlerAttacker; - if (gMovesInfo[gCurrentMove].category == DAMAGE_CATEGORY_STATUS) + if (gProtectStructs[gBattlerAttacker].powderSelfDmg) + { + if (!alreadyUsed) + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ZMoveActivatePowder; + } + } + else if (gMovesInfo[gCurrentMove].category == DAMAGE_CATEGORY_STATUS) { if (!alreadyUsed) { @@ -4090,13 +4107,126 @@ static void ChooseStatBoostAnimation(u32 battler) #undef ANIM_STAT_ACC #undef ANIM_STAT_EVASION +u32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 move, u32 abilityDef) +{ + enum MoveBlocked effect = MOVE_BLOCKED_BY_NO_ABILITY; + + switch (abilityDef) + { + case ABILITY_SOUNDPROOF: + if (gMovesInfo[move].soundMove && !(GetBattlerMoveTargetType(battlerAtk, move) & MOVE_TARGET_USER)) + effect = MOVE_BLOCKED_BY_SOUNDPROOF_OR_BULLETPROOF; + break; + case ABILITY_BULLETPROOF: + if (gMovesInfo[move].ballisticMove) + effect = MOVE_BLOCKED_BY_SOUNDPROOF_OR_BULLETPROOF; + break; + case ABILITY_DAZZLING: + case ABILITY_QUEENLY_MAJESTY: + case ABILITY_ARMOR_TAIL: + if (GetBattlerSide(battlerAtk) != GetBattlerSide(battlerDef)) + { + u32 priority = AI_DATA->aiCalcInProgress ? GetMovePriority(battlerAtk, move) : GetChosenMovePriority(battlerAtk); + if (priority > 0) + effect = MOVE_BLOCKED_BY_DAZZLING; + } + break; + case ABILITY_GOOD_AS_GOLD: + if (IS_MOVE_STATUS(move)) + { + u32 moveTarget = GetBattlerMoveTargetType(battlerAtk, move); + if (!(moveTarget & MOVE_TARGET_OPPONENTS_FIELD) && !(moveTarget & MOVE_TARGET_ALL_BATTLERS)) + effect = MOVE_BLOCKED_BY_GOOD_AS_GOLD; + } + break; + } + + if (!effect) + effect = CanPartnerAbilityBlockMove(battlerAtk, battlerDef, move, GetBattlerAbility(BATTLE_PARTNER(battlerDef))); + + return effect; +} + +u32 CanPartnerAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 move, u32 abilityDef) +{ + switch (abilityDef) + { + case ABILITY_DAZZLING: + case ABILITY_QUEENLY_MAJESTY: + case ABILITY_ARMOR_TAIL: + if (GetBattlerSide(battlerAtk) != GetBattlerSide(battlerDef)) + { + s32 priority = AI_DATA->aiCalcInProgress ? GetMovePriority(battlerAtk, move) : GetChosenMovePriority(battlerAtk); + if (priority > 0) + return MOVE_BLOCKED_BY_PARTNER_DAZZLING; + } + break; + } + return MOVE_BLOCKED_BY_NO_ABILITY; +} + +u32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 move, u32 moveType) +{ + enum MoveAbsorbed effect = MOVE_ABSORBED_BY_NO_ABILITY; + + switch (abilityDef) + { + default: + effect = MOVE_ABSORBED_BY_NO_ABILITY; + break; + case ABILITY_VOLT_ABSORB: + if (moveType == TYPE_ELECTRIC && gMovesInfo[move].target != MOVE_TARGET_ALL_BATTLERS) + effect = MOVE_ABSORBED_BY_DRAIN_HP_ABILITY; + break; + case ABILITY_WATER_ABSORB: + case ABILITY_DRY_SKIN: + if (moveType == TYPE_WATER) + effect = MOVE_ABSORBED_BY_DRAIN_HP_ABILITY; + break; + case ABILITY_EARTH_EATER: + if (moveType == TYPE_GROUND) + effect = MOVE_ABSORBED_BY_DRAIN_HP_ABILITY; + break; + case ABILITY_MOTOR_DRIVE: + if (moveType == TYPE_ELECTRIC && gMovesInfo[move].target != MOVE_TARGET_ALL_BATTLERS) // Potential bug in singles (might be solved with simu hp reudction) + effect = MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY; + break; + case ABILITY_LIGHTNING_ROD: + if (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5 && moveType == TYPE_ELECTRIC && gMovesInfo[move].target != MOVE_TARGET_ALL_BATTLERS) // Potential bug in singles (might be solved with simu hp reudction) + effect = MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY; + break; + case ABILITY_STORM_DRAIN: + if (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5 && moveType == TYPE_WATER) + effect = MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY; + break; + case ABILITY_SAP_SIPPER: + if (moveType == TYPE_GRASS) + effect = MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY; + break; + case ABILITY_WELL_BAKED_BODY: + if (moveType == TYPE_FIRE) + effect = MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY; + break; + case ABILITY_WIND_RIDER: + if (gMovesInfo[move].windMove && !(GetBattlerMoveTargetType(battlerAtk, move) & MOVE_TARGET_USER)) + effect = MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY; + break; + case ABILITY_FLASH_FIRE: + if (moveType == TYPE_FIRE && (B_FLASH_FIRE_FROZEN >= GEN_5 || !(gBattleMons[battlerDef].status1 & STATUS1_FREEZE))) + effect = MOVE_ABSORBED_BY_BOOST_FLASH_FIRE; + break; + } + + return effect; +} + u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 moveArg) { u32 effect = 0; - u32 moveType, move; - u32 side; - u32 i, j; - u32 partner; + u32 moveType = 0, move = 0; + u32 side = 0; + u32 i = 0, j = 0; + u32 partner = 0; struct Pokemon *mon; if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) @@ -4350,13 +4480,10 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (gSpecialStatuses[battler].switchInAbilityDone) break; - if (gBattleResources->flags->flags[battler] & RESOURCE_FLAG_TRACED) - break; side = (BATTLE_OPPOSITE(GetBattlerPosition(battler))) & BIT_SIDE; target1 = GetBattlerAtPosition(side); target2 = GetBattlerAtPosition(side + BIT_FLANK); - gSpecialStatuses[battler].switchInAbilityDone = TRUE; if (IsDoubleBattle()) { if (!gAbilitiesInfo[gBattleMons[target1].ability].cantBeTraced && gBattleMons[target1].hp != 0 @@ -4375,11 +4502,10 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (effect != 0) { - BattleScriptPushCursorAndCallback(BattleScript_TraceActivatesEnd3); - gBattleResources->flags->flags[battler] &= ~RESOURCE_FLAG_TRACED; + BattleScriptPushCursorAndCallback(BattleScript_TraceActivates); gBattleStruct->tracedAbility[battler] = gLastUsedAbility = gBattleMons[chosenTarget].ability; RecordAbilityBattle(chosenTarget, gLastUsedAbility); // Record the opposing battler has this ability - battler = gBattlerAbility = gBattleScripting.battler = battler; + gBattlerAbility = battler; PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, chosenTarget, gBattlerPartyIndexes[chosenTarget]) PREPARE_ABILITY_BUFFER(gBattleTextBuff2, gLastUsedAbility) @@ -4391,7 +4517,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && !(gBattleMons[BATTLE_OPPOSITE(battler)].status2 & (STATUS2_TRANSFORMED | STATUS2_SUBSTITUTE)) && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) && !(gBattleStruct->illusion[BATTLE_OPPOSITE(battler)].on) - && !(gStatuses3[BATTLE_OPPOSITE(battler)] & STATUS3_SEMI_INVULNERABLE)) + && !(gStatuses3[BATTLE_OPPOSITE(battler)] & STATUS3_SEMI_INVULNERABLE_NO_COMMANDER)) { gBattlerAttacker = battler; gBattlerTarget = BATTLE_OPPOSITE(battler); @@ -4894,7 +5020,6 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && !(gBattleStruct->transformZeroToHero[side] & (1u << gBattlerPartyIndexes[battler]))) { gSpecialStatuses[battler].switchInAbilityDone = TRUE; - gBattlerAttacker = battler; gBattleStruct->transformZeroToHero[side] |= 1u << gBattlerPartyIndexes[battler]; BattleScriptPushCursorAndCallback(BattleScript_ZeroToHeroActivates); effect++; @@ -4958,15 +5083,37 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; case ABILITY_ICE_FACE: if (IsBattlerWeatherAffected(battler, B_WEATHER_HAIL | B_WEATHER_SNOW) - && gBattleMons[battler].species == SPECIES_EISCUE_NOICE_FACE + && gBattleMons[battler].species == SPECIES_EISCUE_NOICE && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED)) { // TODO: Convert this to a proper FORM_CHANGE type. - gBattleMons[battler].species = SPECIES_EISCUE_ICE_FACE; + gBattleMons[battler].species = SPECIES_EISCUE_ICE; BattleScriptPushCursorAndCallback(BattleScript_BattlerFormChangeWithStringEnd3); effect++; } break; + case ABILITY_COMMANDER: + partner = BATTLE_PARTNER(battler); + if (!gSpecialStatuses[battler].switchInAbilityDone + && gBattleStruct->commanderActive[partner] == SPECIES_NONE + && gBattleMons[partner].species == SPECIES_DONDOZO + && GET_BASE_SPECIES_ID(GetMonData(GetPartyBattlerData(battler), MON_DATA_SPECIES)) == SPECIES_TATSUGIRI) + { + SaveBattlerAttacker(gBattlerAttacker); + gSpecialStatuses[battler].switchInAbilityDone = TRUE; + gBattlerAttacker = partner; + gBattleStruct->commandingDondozo |= 1u << battler; + gBattleStruct->commanderActive[partner] = gBattleMons[battler].species; + gStatuses3[battler] |= STATUS3_COMMANDER; + if (gBattleMons[battler].status2 & STATUS2_CONFUSION + && !(gStatuses4[battler] & STATUS4_INFINITE_CONFUSION)) + gBattleMons[battler].status2 -= STATUS2_CONFUSION_TURN(1); + BtlController_EmitSpriteInvisibility(battler, BUFFER_A, TRUE); + MarkBattlerForControllerExec(battler); + BattleScriptPushCursorAndCallback(BattleScript_CommanderActivates); + effect++; + } + break; } break; case ABILITYEFFECT_ENDTURN: @@ -5172,154 +5319,87 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } } break; - case ABILITYEFFECT_MOVES_BLOCK: case ABILITYEFFECT_WOULD_BLOCK: + effect = CanAbilityBlockMove(gBattlerAttacker, battler, move, gLastUsedAbility); + if (effect && gLastUsedAbility != 0xFFFF) + RecordAbilityBattle(battler, gLastUsedAbility); + break; + case ABILITYEFFECT_MOVES_BLOCK: { - u16 moveTarget = GetBattlerMoveTargetType(battler, move); + effect = CanAbilityBlockMove(gBattlerAttacker, battler, move, gLastUsedAbility); const u8 * battleScriptBlocksMove = NULL; - - switch (gLastUsedAbility) - { - case ABILITY_SOUNDPROOF: - if (gMovesInfo[move].soundMove && !(moveTarget & MOVE_TARGET_USER)) - effect = 1; - break; - case ABILITY_BULLETPROOF: - if (gMovesInfo[move].ballisticMove) - effect = 1; - break; - case ABILITY_DAZZLING: - case ABILITY_QUEENLY_MAJESTY: - case ABILITY_ARMOR_TAIL: - if (GetChosenMovePriority(gBattlerAttacker) > 0 && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(battler)) - effect = 2; - break; - case ABILITY_GOOD_AS_GOLD: - if (IS_MOVE_STATUS(gCurrentMove) - && !(moveTarget & MOVE_TARGET_USER) - && !(moveTarget & MOVE_TARGET_OPPONENTS_FIELD) - && !(moveTarget & MOVE_TARGET_ALL_BATTLERS)) - effect = 3; - break; - } - - if (!effect) - { - switch (GetBattlerAbility(BATTLE_PARTNER(battler))) - { - case ABILITY_DAZZLING: - case ABILITY_QUEENLY_MAJESTY: - case ABILITY_ARMOR_TAIL: - if (GetChosenMovePriority(gBattlerAttacker) > 0 && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(battler)) - effect = 4; - break; - } - } - - if (effect == 1) + switch (effect) { + case MOVE_BLOCKED_BY_SOUNDPROOF_OR_BULLETPROOF: if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS) gHitMarker |= HITMARKER_NO_PPDEDUCT; battleScriptBlocksMove = BattleScript_SoundproofProtected; - } - else if (effect == 2 || effect == 4) - { - if (effect == 4) + break; + case MOVE_BLOCKED_BY_DAZZLING: + case MOVE_BLOCKED_BY_PARTNER_DAZZLING: + if (effect == MOVE_BLOCKED_BY_PARTNER_DAZZLING) gBattleScripting.battler = BATTLE_PARTNER(battler); else gBattleScripting.battler = battler; - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS) gHitMarker |= HITMARKER_NO_PPDEDUCT; battleScriptBlocksMove = BattleScript_DazzlingProtected; - } - else if (effect == 3) - { + break; + case MOVE_BLOCKED_BY_GOOD_AS_GOLD: battleScriptBlocksMove = BattleScript_GoodAsGoldActivates; + break; + default: + if (GetChosenMovePriority(gBattlerAttacker) > 0 + && BlocksPrankster(move, gBattlerAttacker, gBattlerTarget, TRUE) + && !(IS_MOVE_STATUS(move) && (gLastUsedAbility == ABILITY_MAGIC_BOUNCE || gProtectStructs[gBattlerTarget].bounceMove))) + { + if (!IsDoubleBattle() + || !(GetBattlerMoveTargetType(gBattlerAttacker, move) & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY))) + CancelMultiTurnMoves(gBattlerAttacker); // Don't cancel moves that can hit two targets bc one target might not be protected + gBattleScripting.battler = gBattlerAbility = gBattlerTarget; + battleScriptBlocksMove = BattleScript_DarkTypePreventsPrankster; + effect = 1; + } } - else if (GetChosenMovePriority(gBattlerAttacker) > 0 - && BlocksPrankster(move, gBattlerAttacker, gBattlerTarget, TRUE) - && !(IS_MOVE_STATUS(move) && (gLastUsedAbility == ABILITY_MAGIC_BOUNCE || gProtectStructs[gBattlerTarget].bounceMove))) - { - if (!IsDoubleBattle() || !(moveTarget & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY))) - CancelMultiTurnMoves(gBattlerAttacker); // Don't cancel moves that can hit two targets bc one target might not be protected - gBattleScripting.battler = gBattlerAbility = gBattlerTarget; - battleScriptBlocksMove = BattleScript_DarkTypePreventsPrankster; - effect = 1; - } - if (caseID == ABILITYEFFECT_WOULD_BLOCK) - { - if (effect && gLastUsedAbility != 0xFFFF) - RecordAbilityBattle(battler, gLastUsedAbility); - - return effect; - } - else if (effect) - { + if (effect) gBattlescriptCurrInstr = battleScriptBlocksMove; - } - break; } - case ABILITYEFFECT_ABSORBING: + break; case ABILITYEFFECT_WOULD_ABSORB: - if (move != MOVE_NONE) + effect = CanAbilityAbsorbMove(gBattlerAttacker, battler, gLastUsedAbility, move, moveType); + gBattleStruct->pledgeMove = FALSE; + if (effect && gLastUsedAbility != 0xFFFF) + RecordAbilityBattle(battler, gLastUsedAbility); + return effect; + case ABILITYEFFECT_ABSORBING: { - u8 statId = 0; - u8 statAmount = 1; - switch (gLastUsedAbility) - { - case ABILITY_VOLT_ABSORB: - if (moveType == TYPE_ELECTRIC && gMovesInfo[move].target != MOVE_TARGET_ALL_BATTLERS) - effect = 1; - break; - case ABILITY_WATER_ABSORB: - case ABILITY_DRY_SKIN: - if (moveType == TYPE_WATER) - effect = 1; - break; - case ABILITY_MOTOR_DRIVE: - if (moveType == TYPE_ELECTRIC && gMovesInfo[move].target != MOVE_TARGET_ALL_BATTLERS) - effect = 2, statId = STAT_SPEED; - break; - case ABILITY_LIGHTNING_ROD: - if (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5 && moveType == TYPE_ELECTRIC && gMovesInfo[move].target != MOVE_TARGET_ALL_BATTLERS) - effect = 2, statId = STAT_SPATK; - break; - case ABILITY_STORM_DRAIN: - if (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5 && moveType == TYPE_WATER) - effect = 2, statId = STAT_SPATK; - break; - case ABILITY_SAP_SIPPER: - if (moveType == TYPE_GRASS) - effect = 2, statId = STAT_ATK; - break; - case ABILITY_FLASH_FIRE: - if (moveType == TYPE_FIRE && (B_FLASH_FIRE_FROZEN >= GEN_5 || !(gBattleMons[battler].status1 & STATUS1_FREEZE))) - effect = 3; - break; - case ABILITY_WELL_BAKED_BODY: - if (moveType == TYPE_FIRE) - effect = 2, statId = STAT_DEF, statAmount = 2; - break; - case ABILITY_WIND_RIDER: - if (gMovesInfo[gCurrentMove].windMove && !(GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove) & MOVE_TARGET_USER)) - effect = 2, statId = STAT_ATK; - break; - case ABILITY_EARTH_EATER: - if (moveType == TYPE_GROUND) - effect = 1; - break; - } - if (caseID == ABILITYEFFECT_WOULD_ABSORB) + u32 statId = 0; + u32 statAmount = 1; + effect = CanAbilityAbsorbMove(gBattlerAttacker, battler, gLastUsedAbility, move, moveType); + if (effect) { - gBattleStruct->pledgeMove = FALSE; - if (effect && gLastUsedAbility != 0xFFFF) - RecordAbilityBattle(battler, gLastUsedAbility); - - return effect; + switch(gLastUsedAbility) + { + case ABILITY_MOTOR_DRIVE: + statId = STAT_SPEED; + break; + case ABILITY_LIGHTNING_ROD: + case ABILITY_STORM_DRAIN: + statId = STAT_SPATK; + break; + case ABILITY_SAP_SIPPER: + case ABILITY_WIND_RIDER: + statId = STAT_ATK; + break; + case ABILITY_WELL_BAKED_BODY: + statAmount = 2; + statId = STAT_DEF; + break; + } } - else if (effect == 1) // Drain Hp ability. + switch (effect) { + case MOVE_ABSORBED_BY_DRAIN_HP_ABILITY: gBattleStruct->pledgeMove = FALSE; if (BATTLER_MAX_HP(battler) || (B_HEAL_BLOCKING >= GEN_5 && gStatuses3[battler] & STATUS3_HEAL_BLOCK)) { @@ -5340,9 +5420,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gBattleMoveDamage = 1; gBattleMoveDamage *= -1; } - } - else if (effect == 2) // Boost Stat ability; - { + break; + case MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY: gBattleStruct->pledgeMove = FALSE; if (!CompareStat(battler, statId, MAX_STAT_STAGE, CMP_LESS_THAN)) { @@ -5362,9 +5441,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (B_ABSORBING_ABILITY_STRING < GEN_5) PREPARE_STAT_BUFFER(gBattleTextBuff1, statId); } - } - else if (effect == 3) - { + break; + case MOVE_ABSORBED_BY_BOOST_FLASH_FIRE: gBattleStruct->pledgeMove = FALSE; if (!(gBattleResources->flags->flags[battler] & RESOURCE_FLAG_FLASH_FIRE)) { @@ -5383,10 +5461,11 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 else gBattlescriptCurrInstr = BattleScript_FlashFireBoost_PPLoss; } + break; } - if (effect) gMultiHitCounter = 0; // Prevent multi-hit moves from hitting more than once after move has been absorbed. + } break; case ABILITYEFFECT_MOVE_END: // Think contact abilities. @@ -6056,7 +6135,6 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (IsBattlerAlive(battler) && (gMovesInfo[gCurrentMove].danceMove) && !gSpecialStatuses[battler].dancerUsedMove - && (gHitMarker & HITMARKER_ATTACKSTRING_PRINTED) && gBattlerAttacker != battler) { // Set bit and save Dancer mon's original target @@ -6305,18 +6383,21 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; case ABILITY_ICE_FACE: if (IsBattlerWeatherAffected(battler, B_WEATHER_HAIL | B_WEATHER_SNOW) - && gBattleMons[battler].species == SPECIES_EISCUE_NOICE_FACE + && gBattleMons[battler].species == SPECIES_EISCUE_NOICE && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED)) { // TODO: Convert this to a proper FORM_CHANGE type. gBattleScripting.battler = battler; - gBattleMons[battler].species = SPECIES_EISCUE_ICE_FACE; + gBattleMons[battler].species = SPECIES_EISCUE_ICE; BattleScriptPushCursorAndCallback(BattleScript_BattlerFormChangeWithStringEnd3); effect++; } break; case ABILITY_PROTOSYNTHESIS: - if (!gDisableStructs[battler].weatherAbilityDone && IsBattlerWeatherAffected(battler, B_WEATHER_SUN)) + if (!gDisableStructs[battler].weatherAbilityDone + && (gBattleWeather & B_WEATHER_SUN) && WEATHER_HAS_EFFECT + && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) + && !(gBattleStruct->boosterEnergyActivates & (1u << battler))) { gDisableStructs[battler].weatherAbilityDone = TRUE; PREPARE_STAT_BUFFER(gBattleTextBuff1, GetHighestStatId(battler)); @@ -6342,7 +6423,10 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_QUARK_DRIVE: - if (!gDisableStructs[battler].terrainAbilityDone && IsBattlerTerrainAffected(battler, STATUS_FIELD_ELECTRIC_TERRAIN)) + if (!gDisableStructs[battler].terrainAbilityDone + && gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN + && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) + && !(gBattleStruct->boosterEnergyActivates & (1u << battler))) { gDisableStructs[battler].terrainAbilityDone = TRUE; PREPARE_STAT_BUFFER(gBattleTextBuff1, GetHighestStatId(battler)); @@ -6370,14 +6454,14 @@ bool32 TryPrimalReversion(u32 battler) { if (gBattlerAttacker == battler) { - BattleScriptExecute(BattleScript_PrimalReversion); + BattleScriptPushCursorAndCallback(BattleScript_PrimalReversion); } else { // edge case for scenarios like a switch-in after activated eject button gBattleScripting.savedBattler = gBattlerAttacker; gBattlerAttacker = battler; - BattleScriptExecute(BattleScript_PrimalReversionRestoreAttacker); + BattleScriptPushCursorAndCallback(BattleScript_PrimalReversionRestoreAttacker); } return TRUE; } @@ -6508,7 +6592,9 @@ u32 IsAbilityPreventingEscape(u32 battler) bool32 CanBattlerEscape(u32 battler) // no ability check { - if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_SHED_SHELL) + if (gBattleStruct->commanderActive[battler] != SPECIES_NONE) + return FALSE; + else if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_SHED_SHELL) return TRUE; else if (B_GHOSTS_ESCAPE >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) return TRUE; @@ -6807,8 +6893,7 @@ static u8 TrySetMicleBerry(u32 battler, u32 itemId, bool32 end2) { if (HasEnoughHpToEatBerry(battler, 4, itemId)) { - gProtectStructs[battler].usedMicleBerry = TRUE; // battler's next attack has increased accuracy - + gBattleStruct->usedMicleBerry |= 1u << battler; if (end2) { BattleScriptExecute(BattleScript_MicleBerryActivateEnd2); @@ -7582,7 +7667,8 @@ u8 ItemBattleEffects(u8 caseID, u32 battler, bool32 moveTurn) break; case HOLD_EFFECT_BOOSTER_ENERGY: if (!(gBattleStruct->boosterEnergyActivates & (1u << battler)) - && (((GetBattlerAbility(battler) == ABILITY_PROTOSYNTHESIS) && !(gBattleWeather & B_WEATHER_SUN)) + && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) + && (((GetBattlerAbility(battler) == ABILITY_PROTOSYNTHESIS) && !((gBattleWeather & B_WEATHER_SUN) && WEATHER_HAS_EFFECT)) || ((GetBattlerAbility(battler) == ABILITY_QUARK_DRIVE) && !(gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN)))) { PREPARE_STAT_BUFFER(gBattleTextBuff1, GetHighestStatId(battler)); @@ -7849,7 +7935,8 @@ u8 ItemBattleEffects(u8 caseID, u32 battler, bool32 moveTurn) break; case HOLD_EFFECT_BOOSTER_ENERGY: if (!(gBattleStruct->boosterEnergyActivates & (1u << battler)) - && (((GetBattlerAbility(battler) == ABILITY_PROTOSYNTHESIS) && !(gBattleWeather & B_WEATHER_SUN)) + && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) + && (((GetBattlerAbility(battler) == ABILITY_PROTOSYNTHESIS) && !((gBattleWeather & B_WEATHER_SUN) && WEATHER_HAS_EFFECT)) || ((GetBattlerAbility(battler) == ABILITY_QUARK_DRIVE) && !(gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN)))) { PREPARE_STAT_BUFFER(gBattleTextBuff1, GetHighestStatId(battler)); @@ -8578,7 +8665,7 @@ bool32 IsBattlerProtected(u32 battlerAtk, u32 battlerDef, u32 move) } // Only called directly when calculating damage type effectiveness -static bool32 IsBattlerGrounded2(u32 battler, bool32 considerInverse) +static bool32 IsBattlerGroundedInverseCheck(u32 battler, bool32 considerInverse) { u32 holdEffect = GetBattlerHoldEffect(battler, TRUE); @@ -8596,7 +8683,7 @@ static bool32 IsBattlerGrounded2(u32 battler, bool32 considerInverse) return FALSE; if (holdEffect == HOLD_EFFECT_AIR_BALLOON) return FALSE; - if (GetBattlerAbility(battler) == ABILITY_LEVITATE) + if ((AI_DATA->aiCalcInProgress ? AI_DATA->abilities[battler] : GetBattlerAbility(battler)) == ABILITY_LEVITATE) return FALSE; if (IS_BATTLER_OF_TYPE(battler, TYPE_FLYING) && (!considerInverse || !FlagGet(B_FLAG_INVERSE_BATTLE))) return FALSE; @@ -8605,7 +8692,7 @@ static bool32 IsBattlerGrounded2(u32 battler, bool32 considerInverse) bool32 IsBattlerGrounded(u32 battler) { - return IsBattlerGrounded2(battler, FALSE); + return IsBattlerGroundedInverseCheck(battler, FALSE); } bool32 IsBattlerAlive(u32 battler) @@ -8684,7 +8771,7 @@ u32 CountBattlerStatIncreases(u32 battler, bool32 countEvasionAcc) u32 GetMoveTargetCount(u32 move, u32 battlerAtk, u32 battlerDef) { - switch (GetBattlerMoveTargetType(gBattlerAttacker, move)) + switch (GetBattlerMoveTargetType(battlerAtk, move)) { case MOVE_TARGET_BOTH: return !(gAbsentBattlerFlags & (1u << battlerDef)) @@ -9268,8 +9355,9 @@ static inline u32 CalcMoveBasePowerAfterModifiers(u32 move, u32 battlerAtk, u32 case ABILITY_PROTOSYNTHESIS: { u8 atkHighestStat = GetHighestStatId(battlerAtk); - if ((weather & B_WEATHER_SUN || gBattleStruct->boosterEnergyActivates & (1u << battlerAtk)) - && ((IS_MOVE_PHYSICAL(move) && atkHighestStat == STAT_ATK) || (IS_MOVE_SPECIAL(move) && atkHighestStat == STAT_SPATK))) + if (((weather & B_WEATHER_SUN && WEATHER_HAS_EFFECT) || gBattleStruct->boosterEnergyActivates & (1u << battlerAtk)) + && ((IS_MOVE_PHYSICAL(move) && atkHighestStat == STAT_ATK) || (IS_MOVE_SPECIAL(move) && atkHighestStat == STAT_SPATK)) + && !(gBattleMons[battlerAtk].status2 & STATUS2_TRANSFORMED)) modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); } break; @@ -9277,16 +9365,17 @@ static inline u32 CalcMoveBasePowerAfterModifiers(u32 move, u32 battlerAtk, u32 { u8 atkHighestStat = GetHighestStatId(battlerAtk); if ((gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gBattleStruct->boosterEnergyActivates & (1u << battlerAtk)) - && ((IS_MOVE_PHYSICAL(move) && atkHighestStat == STAT_ATK) || (IS_MOVE_SPECIAL(move) && atkHighestStat == STAT_SPATK))) + && ((IS_MOVE_PHYSICAL(move) && atkHighestStat == STAT_ATK) || (IS_MOVE_SPECIAL(move) && atkHighestStat == STAT_SPATK)) + && !(gBattleMons[battlerAtk].status2 & STATUS2_TRANSFORMED)) modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); } break; case ABILITY_ORICHALCUM_PULSE: - if (weather & B_WEATHER_SUN) + if (weather & B_WEATHER_SUN && WEATHER_HAS_EFFECT && IS_MOVE_PHYSICAL(move)) modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); break; case ABILITY_HADRON_ENGINE: - if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) + if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN && IS_MOVE_SPECIAL(move)) modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); break; case ABILITY_SHARPNESS: @@ -9346,8 +9435,9 @@ static inline u32 CalcMoveBasePowerAfterModifiers(u32 move, u32 battlerAtk, u32 case ABILITY_PROTOSYNTHESIS: { u8 defHighestStat = GetHighestStatId(battlerDef); - if ((weather & B_WEATHER_SUN || gBattleStruct->boosterEnergyActivates & (1u << battlerDef)) - && ((IS_MOVE_PHYSICAL(move) && defHighestStat == STAT_DEF) || (IS_MOVE_SPECIAL(move) && defHighestStat == STAT_SPDEF))) + if (((weather & B_WEATHER_SUN && WEATHER_HAS_EFFECT) || gBattleStruct->boosterEnergyActivates & (1u << battlerDef)) + && ((IS_MOVE_PHYSICAL(move) && defHighestStat == STAT_DEF) || (IS_MOVE_SPECIAL(move) && defHighestStat == STAT_SPDEF)) + && !(gBattleMons[battlerDef].status2 & STATUS2_TRANSFORMED)) modifier = uq4_12_multiply(modifier, UQ_4_12(0.7)); } break; @@ -9355,7 +9445,8 @@ static inline u32 CalcMoveBasePowerAfterModifiers(u32 move, u32 battlerAtk, u32 { u8 defHighestStat = GetHighestStatId(battlerDef); if ((gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gBattleStruct->boosterEnergyActivates & (1u << battlerDef)) - && ((IS_MOVE_PHYSICAL(move) && defHighestStat == STAT_DEF) || (IS_MOVE_SPECIAL(move) && defHighestStat == STAT_SPDEF))) + && ((IS_MOVE_PHYSICAL(move) && defHighestStat == STAT_DEF) || (IS_MOVE_SPECIAL(move) && defHighestStat == STAT_SPDEF)) + && !(gBattleMons[battlerDef].status2 & STATUS2_TRANSFORMED)) modifier = uq4_12_multiply(modifier, UQ_4_12(0.7)); } break; @@ -9432,6 +9523,10 @@ static inline u32 CalcMoveBasePowerAfterModifiers(u32 move, u32 battlerAtk, u32 if (gMovesInfo[move].punchingMove) modifier = uq4_12_multiply(modifier, UQ_4_12(1.1)); break; + case HOLD_EFFECT_OGERPON_MASK: + if (GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species) == SPECIES_OGERPON) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.2)); + break; } // Terastallization boosts weak, non-priority, non-multi hit moves after modifiers to 60 BP. @@ -10322,7 +10417,7 @@ static inline void MulByTypeEffectiveness(uq4_12_t *modifier, u32 move, u32 move mod = UQ_4_12(1.0); } - if (gBattleStruct->distortedTypeMatchups & (1u << battlerDef) || (gBattleStruct->aiCalcInProgress && ShouldTeraShellDistortTypeMatchups(move, battlerDef))) + if (gBattleStruct->distortedTypeMatchups & (1u << battlerDef) || (AI_DATA->aiCalcInProgress && ShouldTeraShellDistortTypeMatchups(move, battlerDef))) { mod = UQ_4_12(0.5); if (recordAbilities) @@ -10389,7 +10484,7 @@ static inline uq4_12_t CalcTypeEffectivenessMultiplierInternal(u32 move, u32 mov if (B_GLARE_GHOST < GEN_4 && move == MOVE_GLARE && IS_BATTLER_OF_TYPE(battlerDef, TYPE_GHOST)) modifier = UQ_4_12(0.0); } - else if (moveType == TYPE_GROUND && !IsBattlerGrounded2(battlerDef, TRUE) && !(gMovesInfo[move].ignoreTypeIfFlyingAndUngrounded)) + else if (moveType == TYPE_GROUND && !IsBattlerGroundedInverseCheck(battlerDef, TRUE) && !(gMovesInfo[move].ignoreTypeIfFlyingAndUngrounded)) { modifier = UQ_4_12(0.0); if (recordAbilities && defAbility == ABILITY_LEVITATE) @@ -11781,18 +11876,18 @@ bool32 CanTargetPartner(u32 battlerAtk, u32 battlerDef) && battlerDef != BATTLE_PARTNER(battlerAtk)); } -static inline bool32 DoesCurrentTargetHaveAbilityImmunity(void) +static inline bool32 DoesBattlerHaveAbilityImmunity(u32 battlerDef) { - return (AbilityBattleEffects(ABILITYEFFECT_WOULD_BLOCK, gBattlerTarget, 0, 0, 0) - || AbilityBattleEffects(ABILITYEFFECT_WOULD_ABSORB, gBattlerTarget, 0, 0, 0)); + return (AbilityBattleEffects(ABILITYEFFECT_WOULD_BLOCK, battlerDef, 0, 0, 0) + || AbilityBattleEffects(ABILITYEFFECT_WOULD_ABSORB, battlerDef, 0, 0, 0)); } -bool32 TargetFullyImmuneToCurrMove(u32 BattlerAtk, u32 battlerDef) +bool32 TargetFullyImmuneToCurrMove(u32 battlerAtk, u32 battlerDef) { - return ((CalcTypeEffectivenessMultiplier(gCurrentMove, GetMoveType(gCurrentMove), BattlerAtk, battlerDef, GetBattlerAbility(battlerDef), FALSE) == UQ_4_12(0.0)) - || IsBattlerProtected(BattlerAtk, battlerDef, gCurrentMove) + return ((CalcTypeEffectivenessMultiplier(gCurrentMove, GetMoveType(gCurrentMove), battlerAtk, battlerDef, GetBattlerAbility(battlerDef), FALSE) == UQ_4_12(0.0)) + || IsBattlerProtected(battlerAtk, battlerDef, gCurrentMove) || IsSemiInvulnerable(battlerDef, gCurrentMove) - || DoesCurrentTargetHaveAbilityImmunity()); + || DoesBattlerHaveAbilityImmunity(battlerDef)); } u32 GetMoveType(u32 move) diff --git a/src/battle_z_move.c b/src/battle_z_move.c index 5a5816142c22..436ffb84288f 100644 --- a/src/battle_z_move.c +++ b/src/battle_z_move.c @@ -56,10 +56,10 @@ static const struct SignatureZMove sSignatureZMoves[] = {SPECIES_PIKACHU_ROCK_STAR, ITEM_PIKANIUM_Z, MOVE_VOLT_TACKLE, MOVE_CATASTROPIKA}, {SPECIES_PIKACHU_BELLE, ITEM_PIKANIUM_Z, MOVE_VOLT_TACKLE, MOVE_CATASTROPIKA}, {SPECIES_PIKACHU_POP_STAR, ITEM_PIKANIUM_Z, MOVE_VOLT_TACKLE, MOVE_CATASTROPIKA}, - {SPECIES_PIKACHU_PH_D, ITEM_PIKANIUM_Z, MOVE_VOLT_TACKLE, MOVE_CATASTROPIKA}, + {SPECIES_PIKACHU_PHD, ITEM_PIKANIUM_Z, MOVE_VOLT_TACKLE, MOVE_CATASTROPIKA}, {SPECIES_PIKACHU_LIBRE, ITEM_PIKANIUM_Z, MOVE_VOLT_TACKLE, MOVE_CATASTROPIKA}, - {SPECIES_RAICHU_ALOLAN, ITEM_ALORAICHIUM_Z, MOVE_THUNDERBOLT, MOVE_STOKED_SPARKSURFER}, + {SPECIES_RAICHU_ALOLA, ITEM_ALORAICHIUM_Z, MOVE_THUNDERBOLT, MOVE_STOKED_SPARKSURFER}, {SPECIES_DECIDUEYE, ITEM_DECIDIUM_Z, MOVE_SPIRIT_SHACKLE, MOVE_SINISTER_ARROW_RAID}, {SPECIES_INCINEROAR, ITEM_INCINIUM_Z, MOVE_DARKEST_LARIAT, MOVE_MALICIOUS_MOONSAULT}, {SPECIES_KOMMO_O, ITEM_KOMMONIUM_Z, MOVE_CLANGING_SCALES, MOVE_CLANGOROUS_SOULBLAZE}, @@ -72,15 +72,15 @@ static const struct SignatureZMove sSignatureZMoves[] = {SPECIES_MIMIKYU_DISGUISED, ITEM_MIMIKIUM_Z, MOVE_PLAY_ROUGH, MOVE_LETS_SNUGGLE_FOREVER}, {SPECIES_MIMIKYU_BUSTED, ITEM_MIMIKIUM_Z, MOVE_PLAY_ROUGH, MOVE_LETS_SNUGGLE_FOREVER}, {SPECIES_MIMIKYU_TOTEM_DISGUISED, ITEM_MIMIKIUM_Z, MOVE_PLAY_ROUGH, MOVE_LETS_SNUGGLE_FOREVER}, - {SPECIES_MIMIKYU_TOTEM_BUSTED, ITEM_MIMIKIUM_Z, MOVE_PLAY_ROUGH, MOVE_LETS_SNUGGLE_FOREVER}, - {SPECIES_PIKACHU_ORIGINAL_CAP, ITEM_PIKASHUNIUM_Z, MOVE_THUNDERBOLT, MOVE_10000000_VOLT_THUNDERBOLT}, - {SPECIES_PIKACHU_HOENN_CAP, ITEM_PIKASHUNIUM_Z, MOVE_THUNDERBOLT, MOVE_10000000_VOLT_THUNDERBOLT}, - {SPECIES_PIKACHU_SINNOH_CAP, ITEM_PIKASHUNIUM_Z, MOVE_THUNDERBOLT, MOVE_10000000_VOLT_THUNDERBOLT}, - {SPECIES_PIKACHU_UNOVA_CAP, ITEM_PIKASHUNIUM_Z, MOVE_THUNDERBOLT, MOVE_10000000_VOLT_THUNDERBOLT}, - {SPECIES_PIKACHU_KALOS_CAP, ITEM_PIKASHUNIUM_Z, MOVE_THUNDERBOLT, MOVE_10000000_VOLT_THUNDERBOLT}, - {SPECIES_PIKACHU_ALOLA_CAP, ITEM_PIKASHUNIUM_Z, MOVE_THUNDERBOLT, MOVE_10000000_VOLT_THUNDERBOLT}, + {SPECIES_MIMIKYU_BUSTED_TOTEM, ITEM_MIMIKIUM_Z, MOVE_PLAY_ROUGH, MOVE_LETS_SNUGGLE_FOREVER}, + {SPECIES_PIKACHU_ORIGINAL, ITEM_PIKASHUNIUM_Z, MOVE_THUNDERBOLT, MOVE_10000000_VOLT_THUNDERBOLT}, + {SPECIES_PIKACHU_HOENN, ITEM_PIKASHUNIUM_Z, MOVE_THUNDERBOLT, MOVE_10000000_VOLT_THUNDERBOLT}, + {SPECIES_PIKACHU_SINNOH, ITEM_PIKASHUNIUM_Z, MOVE_THUNDERBOLT, MOVE_10000000_VOLT_THUNDERBOLT}, + {SPECIES_PIKACHU_UNOVA, ITEM_PIKASHUNIUM_Z, MOVE_THUNDERBOLT, MOVE_10000000_VOLT_THUNDERBOLT}, + {SPECIES_PIKACHU_KALOS, ITEM_PIKASHUNIUM_Z, MOVE_THUNDERBOLT, MOVE_10000000_VOLT_THUNDERBOLT}, + {SPECIES_PIKACHU_ALOLA, ITEM_PIKASHUNIUM_Z, MOVE_THUNDERBOLT, MOVE_10000000_VOLT_THUNDERBOLT}, {SPECIES_PIKACHU_PARTNER_CAP, ITEM_PIKASHUNIUM_Z, MOVE_THUNDERBOLT, MOVE_10000000_VOLT_THUNDERBOLT}, - {SPECIES_PIKACHU_WORLD_CAP, ITEM_PIKASHUNIUM_Z, MOVE_THUNDERBOLT, MOVE_10000000_VOLT_THUNDERBOLT}, + {SPECIES_PIKACHU_WORLD, ITEM_PIKASHUNIUM_Z, MOVE_THUNDERBOLT, MOVE_10000000_VOLT_THUNDERBOLT}, {SPECIES_PRIMARINA, ITEM_PRIMARIUM_Z, MOVE_SPARKLING_ARIA, MOVE_OCEANIC_OPERETTA}, {SPECIES_SOLGALEO, ITEM_SOLGANIUM_Z, MOVE_SUNSTEEL_STRIKE, MOVE_SEARING_SUNRAZE_SMASH}, {SPECIES_NECROZMA_DUSK_MANE, ITEM_SOLGANIUM_Z, MOVE_SUNSTEEL_STRIKE, MOVE_SEARING_SUNRAZE_SMASH}, diff --git a/src/berry.c b/src/berry.c index 5c23623e3bcb..1f41973e7406 100644 --- a/src/berry.c +++ b/src/berry.c @@ -2144,7 +2144,7 @@ void ObjectEventInteractionGetBerryCountString(void) u8 treeId = GetObjectEventBerryTreeId(gSelectedObjectEvent); u8 berry = GetBerryTypeByBerryTreeId(treeId); u8 count = GetBerryCountByBerryTreeId(treeId); - + gSpecialVar_0x8006 = BerryTypeToItemId(berry); CopyItemNameHandlePlural(BerryTypeToItemId(berry), gStringVar1, count); berry = GetTreeMutationValue(treeId); @@ -2422,7 +2422,7 @@ static u16 GetBerryPestSpecies(u8 berryId) return P_FAMILY_VOLBEAT_ILLUMISE ? SPECIES_ILLUMISE : SPECIES_NONE; break; case BERRY_COLOR_GREEN: - return P_FAMILY_BURMY ? SPECIES_BURMY_PLANT_CLOAK : SPECIES_NONE; + return P_FAMILY_BURMY ? SPECIES_BURMY_PLANT : SPECIES_NONE; break; case BERRY_COLOR_YELLOW: return P_FAMILY_COMBEE ? SPECIES_COMBEE : SPECIES_NONE; diff --git a/src/bike.c b/src/bike.c index de150dae4bff..b369883093ef 100644 --- a/src/bike.c +++ b/src/bike.c @@ -143,6 +143,19 @@ static u8 GetMachBikeTransition(u8 *dirTraveling) // if the dir updated before this function, get the relevent new direction to check later. u8 direction = GetPlayerMovementDirection(); + // fix direction when moving on sideways stairs + switch (direction) + { + case DIR_SOUTHWEST: + case DIR_NORTHWEST: + direction = DIR_WEST; + break; + case DIR_SOUTHEAST: + case DIR_NORTHEAST: + direction = DIR_EAST; + break; + } + // is the player standing still? if (*dirTraveling == 0) { @@ -234,6 +247,9 @@ static void MachBikeTransition_TrySpeedUp(u8 direction) else { // we did not hit anything that can slow us down, so perform the advancement callback depending on the bikeFrameCounter and try to increase the mach bike's speed. + if (ObjectMovingOnRockStairs(playerObjEvent, direction) && gPlayerAvatar.bikeFrameCounter > 1) + gPlayerAvatar.bikeFrameCounter--; + sMachBikeSpeedCallbacks[gPlayerAvatar.bikeFrameCounter](direction); gPlayerAvatar.bikeSpeed = gPlayerAvatar.bikeFrameCounter + (gPlayerAvatar.bikeFrameCounter >> 1); // same as dividing by 2, but compiler is insistent on >> 1 if (gPlayerAvatar.bikeFrameCounter < 2) // do not go faster than the last element in the mach bike array @@ -368,6 +384,7 @@ static u8 AcroBikeHandleInputWheelieStanding(u8 *newDirection, u16 newKeys, u16 struct ObjectEvent *playerObjEvent; direction = GetPlayerMovementDirection(); + playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; gPlayerAvatar.runningState = NOT_MOVING; @@ -563,7 +580,10 @@ static void AcroBikeTransition_Moving(u8 direction) } else { - PlayerRideWaterCurrent(direction); + if (ObjectMovingOnRockStairs(playerObjEvent, direction)) + PlayerWalkFast(direction); + else + PlayerRideWaterCurrent(direction); } } @@ -696,6 +716,7 @@ static void AcroBikeTransition_WheelieMoving(u8 direction) } return; } + PlayerWheelieMove(direction); gPlayerAvatar.runningState = MOVING; } @@ -730,6 +751,7 @@ static void AcroBikeTransition_WheelieRisingMoving(u8 direction) } return; } + PlayerPopWheelieWhileMoving(direction); gPlayerAvatar.runningState = MOVING; } @@ -753,6 +775,7 @@ static void AcroBikeTransition_WheelieLoweringMoving(u8 direction) PlayerEndWheelie(direction); return; } + PlayerEndWheelieWhileMoving(direction); } diff --git a/src/level_caps.c b/src/caps.c similarity index 69% rename from src/level_caps.c rename to src/caps.c index 61b4c8dc8f30..9c30e5552750 100644 --- a/src/level_caps.c +++ b/src/caps.c @@ -1,7 +1,7 @@ #include "global.h" #include "battle.h" #include "event_data.h" -#include "level_caps.h" +#include "caps.h" #include "pokemon.h" @@ -81,3 +81,39 @@ u32 GetSoftLevelCapExpValue(u32 level, u32 expValue) return expValue; } } + +u32 GetCurrentEVCap(void) +{ + + static const u16 sEvCapFlagMap[][2] = { + // Define EV caps for each milestone + {FLAG_BADGE01_GET, 30}, + {FLAG_BADGE02_GET, 90}, + {FLAG_BADGE03_GET, 150}, + {FLAG_BADGE04_GET, 210}, + {FLAG_BADGE05_GET, 270}, + {FLAG_BADGE06_GET, 330}, + {FLAG_BADGE07_GET, 390}, + {FLAG_BADGE08_GET, 450}, + {FLAG_IS_CHAMPION, MAX_TOTAL_EVS}, + }; + + if (B_EV_CAP_TYPE == EV_CAP_FLAG_LIST) + { + for (u32 evCap = 0; evCap < ARRAY_COUNT(sEvCapFlagMap); evCap++) + { + if (!FlagGet(sEvCapFlagMap[evCap][0])) + return sEvCapFlagMap[evCap][1]; + } + } + else if (B_EV_CAP_TYPE == EV_CAP_VARIABLE) + { + return VarGet(B_EV_CAP_VARIABLE); + } + else if (B_EV_CAP_TYPE == EV_CAP_NO_GAIN) + { + return 0; + } + + return MAX_TOTAL_EVS; +} diff --git a/src/data/abilities.h b/src/data/abilities.h index 7c67f2da17d7..30a34ffe90b9 100644 --- a/src/data/abilities.h +++ b/src/data/abilities.h @@ -2141,6 +2141,7 @@ const struct Ability gAbilitiesInfo[ABILITIES_COUNT] = .cantBeSwapped = TRUE, .cantBeTraced = TRUE, .cantBeSuppressed = TRUE, + .cantBeOverwritten = TRUE, }, [ABILITY_ELECTROMORPHOSIS] = diff --git a/src/data/battle_anim.h b/src/data/battle_anim.h index 2ab982d2d72c..a09c8d72c8cc 100644 --- a/src/data/battle_anim.h +++ b/src/data/battle_anim.h @@ -1465,6 +1465,7 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_RedExplosion, 0x0800, ANIM_TAG_RED_EXPLOSION}, {gBattleAnimSpriteGfx_Beam, 0x0800, ANIM_TAG_BEAM}, {gBattleAnimSpriteGfx_PurpleChain, 0x1000, ANIM_TAG_PURPLE_CHAIN}, + {gBattleAnimSpriteGfx_PinkVioletOrb, 0x0080, ANIM_TAG_PINKVIO_ORB}, }; const struct CompressedSpritePalette gBattleAnimPaletteTable[] = @@ -1931,6 +1932,7 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_RedExplosion, ANIM_TAG_RED_EXPLOSION}, {gBattleAnimSpritePal_Beam, ANIM_TAG_BEAM}, {gBattleAnimSpritePal_PurpleChain, ANIM_TAG_PURPLE_CHAIN}, + {gBattleAnimSpritePal_PinkVioletOrb, ANIM_TAG_PINKVIO_ORB}, }; const struct BattleAnimBackground gBattleAnimBackgroundTable[] = diff --git a/src/data/battle_move_effects.h b/src/data/battle_move_effects.h index ead7cee6f1ef..776563bbec47 100644 --- a/src/data/battle_move_effects.h +++ b/src/data/battle_move_effects.h @@ -2255,4 +2255,10 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleScript = BattleScript_EffectHit, .battleTvScore = 0, // TODO: Assign points }, + + [EFFECT_ORDER_UP] = + { + .battleScript = BattleScript_EffectHit, + .battleTvScore = 0, // TODO: Assign points + }, }; diff --git a/src/data/graphics/pokemon.h b/src/data/graphics/pokemon.h index e43fa7c565ea..9a3c1d171154 100644 --- a/src/data/graphics/pokemon.h +++ b/src/data/graphics/pokemon.h @@ -65,6 +65,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_VenusaurF[] = INCBIN_U32("graphics/pokemon/venusaur/anim_frontf.4bpp.lz"); const u32 gMonBackPic_VenusaurF[] = INCBIN_U32("graphics/pokemon/venusaur/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_VenusaurF[] = INCBIN_COMP("graphics/pokemon/venusaur/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS const u32 gMonFrontPic_VenusaurMega[] = INCBIN_U32("graphics/pokemon/venusaur/mega/front.4bpp.lz"); @@ -321,6 +324,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_ButterfreeF[] = INCBIN_U32("graphics/pokemon/butterfree/anim_frontf.4bpp.lz"); const u32 gMonBackPic_ButterfreeF[] = INCBIN_U32("graphics/pokemon/butterfree/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_ButterfreeF[] = INCBIN_COMP("graphics/pokemon/butterfree/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS const u32 gMonFrontPic_ButterfreeGigantamax[] = INCBIN_U32("graphics/pokemon/butterfree/gigantamax/front.4bpp.lz"); @@ -487,6 +493,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_RattataF[] = INCBIN_U32("graphics/pokemon/rattata/anim_frontf.4bpp.lz"); const u32 gMonBackPic_RattataF[] = INCBIN_U32("graphics/pokemon/rattata/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_RattataF[] = INCBIN_COMP("graphics/pokemon/rattata/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_Raticate[] = INCBIN_U32("graphics/pokemon/raticate/anim_front.4bpp.lz"); const u32 gMonPalette_Raticate[] = INCBIN_U32("graphics/pokemon/raticate/normal.gbapal.lz"); @@ -506,6 +515,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_RaticateF[] = INCBIN_U32("graphics/pokemon/raticate/anim_frontf.4bpp.lz"); const u32 gMonBackPic_RaticateF[] = INCBIN_U32("graphics/pokemon/raticate/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_RaticateF[] = INCBIN_COMP("graphics/pokemon/raticate/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #if P_ALOLAN_FORMS const u32 gMonFrontPic_RattataAlolan[] = INCBIN_U32("graphics/pokemon/rattata/alolan/front.4bpp.lz"); @@ -657,6 +669,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_CUSTOM_GENDER_DIFF_ICONS const u8 gMonIcon_PikachuF[] = INCBIN_U8("graphics/pokemon/pikachu/iconf.4bpp"); #endif +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_PikachuF[] = INCBIN_COMP("graphics/pokemon/pikachu/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #if P_COSPLAY_PIKACHU_FORMS const u32 gMonFrontPic_PikachuCosplay[] = INCBIN_U32("graphics/pokemon/pikachu/cosplay/front.4bpp.lz"); @@ -803,6 +818,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_RaichuF[] = INCBIN_U32("graphics/pokemon/raichu/anim_frontf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_RaichuF[] = INCBIN_COMP("graphics/pokemon/raichu/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #if P_ALOLAN_FORMS const u32 gMonFrontPic_RaichuAlolan[] = INCBIN_U32("graphics/pokemon/raichu/alolan/front.4bpp.lz"); @@ -1165,6 +1183,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_ZubatF[] = INCBIN_U32("graphics/pokemon/zubat/anim_frontf.4bpp.lz"); const u32 gMonBackPic_ZubatF[] = INCBIN_U32("graphics/pokemon/zubat/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_ZubatF[] = INCBIN_COMP("graphics/pokemon/zubat/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_Golbat[] = INCBIN_U32("graphics/pokemon/golbat/anim_front.4bpp.lz"); const u32 gMonPalette_Golbat[] = INCBIN_U32("graphics/pokemon/golbat/normal.gbapal.lz"); @@ -1184,6 +1205,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_GolbatF[] = INCBIN_U32("graphics/pokemon/golbat/anim_frontf.4bpp.lz"); const u32 gMonBackPic_GolbatF[] = INCBIN_U32("graphics/pokemon/golbat/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_GolbatF[] = INCBIN_COMP("graphics/pokemon/golbat/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_2_CROSS_EVOS const u32 gMonFrontPic_Crobat[] = INCBIN_U32("graphics/pokemon/crobat/anim_front.4bpp.lz"); @@ -1239,6 +1263,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_GloomF[] = INCBIN_U32("graphics/pokemon/gloom/anim_frontf.4bpp.lz"); const u32 gMonBackPic_GloomF[] = INCBIN_U32("graphics/pokemon/gloom/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_GloomF[] = INCBIN_COMP("graphics/pokemon/gloom/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_Vileplume[] = INCBIN_U32("graphics/pokemon/vileplume/anim_front.4bpp.lz"); const u32 gMonPalette_Vileplume[] = INCBIN_U32("graphics/pokemon/vileplume/normal.gbapal.lz"); @@ -1258,6 +1285,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_VileplumeF[] = INCBIN_U32("graphics/pokemon/vileplume/anim_frontf.4bpp.lz"); const u32 gMonBackPic_VileplumeF[] = INCBIN_U32("graphics/pokemon/vileplume/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_VileplumeF[] = INCBIN_COMP("graphics/pokemon/vileplume/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_2_CROSS_EVOS const u32 gMonFrontPic_Bellossom[] = INCBIN_U32("graphics/pokemon/bellossom/anim_front.4bpp.lz"); @@ -1732,6 +1762,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_PolitoedF[] = INCBIN_U32("graphics/pokemon/politoed/anim_frontf.4bpp.lz"); const u32 gMonBackPic_PolitoedF[] = INCBIN_U32("graphics/pokemon/politoed/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_PolitoedF[] = INCBIN_COMP("graphics/pokemon/politoed/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GEN_2_CROSS_EVOS #endif //P_FAMILY_POLIWAG @@ -1770,6 +1803,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_KadabraF[] = INCBIN_U32("graphics/pokemon/kadabra/anim_frontf.4bpp.lz"); const u32 gMonBackPic_KadabraF[] = INCBIN_U32("graphics/pokemon/kadabra/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_KadabraF[] = INCBIN_COMP("graphics/pokemon/kadabra/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_Alakazam[] = INCBIN_U32("graphics/pokemon/alakazam/anim_front.4bpp.lz"); const u32 gMonPalette_Alakazam[] = INCBIN_U32("graphics/pokemon/alakazam/normal.gbapal.lz"); @@ -1789,6 +1825,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_AlakazamF[] = INCBIN_U32("graphics/pokemon/alakazam/anim_frontf.4bpp.lz"); const u32 gMonBackPic_AlakazamF[] = INCBIN_U32("graphics/pokemon/alakazam/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_AlakazamF[] = INCBIN_COMP("graphics/pokemon/alakazam/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS const u32 gMonFrontPic_AlakazamMega[] = INCBIN_U32("graphics/pokemon/alakazam/mega/front.4bpp.lz"); @@ -2338,6 +2377,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_DoduoF[] = INCBIN_U32("graphics/pokemon/doduo/anim_frontf.4bpp.lz"); const u32 gMonBackPic_DoduoF[] = INCBIN_U32("graphics/pokemon/doduo/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_DoduoF[] = INCBIN_COMP("graphics/pokemon/doduo/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_Dodrio[] = INCBIN_U32("graphics/pokemon/dodrio/anim_front.4bpp.lz"); const u32 gMonPalette_Dodrio[] = INCBIN_U32("graphics/pokemon/dodrio/normal.gbapal.lz"); @@ -2357,6 +2399,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_DodrioF[] = INCBIN_U32("graphics/pokemon/dodrio/anim_frontf.4bpp.lz"); const u32 gMonBackPic_DodrioF[] = INCBIN_U32("graphics/pokemon/dodrio/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_DodrioF[] = INCBIN_COMP("graphics/pokemon/dodrio/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_DODUO #if P_FAMILY_SEEL @@ -2605,6 +2650,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_SteelixF[] = INCBIN_U32("graphics/pokemon/steelix/anim_frontf.4bpp.lz"); const u32 gMonBackPic_SteelixF[] = INCBIN_U32("graphics/pokemon/steelix/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_SteelixF[] = INCBIN_COMP("graphics/pokemon/steelix/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS const u32 gMonFrontPic_SteelixMega[] = INCBIN_U32("graphics/pokemon/steelix/mega/front.4bpp.lz"); @@ -2658,6 +2706,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_HypnoF[] = INCBIN_U32("graphics/pokemon/hypno/anim_frontf.4bpp.lz"); const u32 gMonBackPic_HypnoF[] = INCBIN_U32("graphics/pokemon/hypno/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_HypnoF[] = INCBIN_COMP("graphics/pokemon/hypno/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_DROWZEE #if P_FAMILY_KRABBY @@ -3043,6 +3094,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_RhyhornF[] = INCBIN_U32("graphics/pokemon/rhyhorn/anim_frontf.4bpp.lz"); const u32 gMonBackPic_RhyhornF[] = INCBIN_U32("graphics/pokemon/rhyhorn/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_RhyhornF[] = INCBIN_COMP("graphics/pokemon/rhyhorn/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_Rhydon[] = INCBIN_U32("graphics/pokemon/rhydon/anim_front.4bpp.lz"); const u32 gMonPalette_Rhydon[] = INCBIN_U32("graphics/pokemon/rhydon/normal.gbapal.lz"); @@ -3062,6 +3116,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_RhydonF[] = INCBIN_U32("graphics/pokemon/rhydon/anim_frontf.4bpp.lz"); const u32 gMonBackPic_RhydonF[] = INCBIN_U32("graphics/pokemon/rhydon/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_RhydonF[] = INCBIN_COMP("graphics/pokemon/rhydon/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_4_CROSS_EVOS const u32 gMonFrontPic_Rhyperior[] = INCBIN_U32("graphics/pokemon/rhyperior/anim_front.4bpp.lz"); @@ -3082,6 +3139,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_RhyperiorF[] = INCBIN_U32("graphics/pokemon/rhyperior/anim_frontf.4bpp.lz"); const u32 gMonBackPic_RhyperiorF[] = INCBIN_U32("graphics/pokemon/rhyperior/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_RhyperiorF[] = INCBIN_COMP("graphics/pokemon/rhyperior/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GEN_4_CROSS_EVOS #endif //P_FAMILY_RHYHORN @@ -3174,6 +3234,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_TangrowthF[] = INCBIN_U32("graphics/pokemon/tangrowth/anim_frontf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_TangrowthF[] = INCBIN_COMP("graphics/pokemon/tangrowth/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GEN_4_CROSS_EVOS #endif //P_FAMILY_TANGELA @@ -3281,6 +3344,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_GoldeenF[] = INCBIN_U32("graphics/pokemon/goldeen/anim_frontf.4bpp.lz"); const u32 gMonBackPic_GoldeenF[] = INCBIN_U32("graphics/pokemon/goldeen/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_GoldeenF[] = INCBIN_COMP("graphics/pokemon/goldeen/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_Seaking[] = INCBIN_U32("graphics/pokemon/seaking/anim_front.4bpp.lz"); const u32 gMonPalette_Seaking[] = INCBIN_U32("graphics/pokemon/seaking/normal.gbapal.lz"); @@ -3300,6 +3366,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_SeakingF[] = INCBIN_U32("graphics/pokemon/seaking/anim_frontf.4bpp.lz"); const u32 gMonBackPic_SeakingF[] = INCBIN_U32("graphics/pokemon/seaking/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_SeakingF[] = INCBIN_COMP("graphics/pokemon/seaking/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_GOLDEEN #if P_FAMILY_STARYU @@ -3421,6 +3490,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_ScytherF[] = INCBIN_U32("graphics/pokemon/scyther/anim_frontf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_ScytherF[] = INCBIN_COMP("graphics/pokemon/scyther/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_2_CROSS_EVOS const u32 gMonFrontPic_Scizor[] = INCBIN_U32("graphics/pokemon/scizor/anim_front.4bpp.lz"); @@ -3440,6 +3512,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_ScizorF[] = INCBIN_U32("graphics/pokemon/scizor/anim_frontf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_ScizorF[] = INCBIN_COMP("graphics/pokemon/scizor/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS const u32 gMonFrontPic_ScizorMega[] = INCBIN_U32("graphics/pokemon/scizor/mega/front.4bpp.lz"); @@ -3724,6 +3799,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_MagikarpF[] = INCBIN_U32("graphics/pokemon/magikarp/anim_frontf.4bpp.lz"); const u32 gMonBackPic_MagikarpF[] = INCBIN_U32("graphics/pokemon/magikarp/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_MagikarpF[] = INCBIN_COMP("graphics/pokemon/magikarp/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_Gyarados[] = INCBIN_U32("graphics/pokemon/gyarados/anim_front.4bpp.lz"); const u32 gMonPalette_Gyarados[] = INCBIN_U32("graphics/pokemon/gyarados/normal.gbapal.lz"); @@ -3743,6 +3821,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_GyaradosF[] = INCBIN_U32("graphics/pokemon/gyarados/anim_frontf.4bpp.lz"); const u32 gMonBackPic_GyaradosF[] = INCBIN_U32("graphics/pokemon/gyarados/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_GyaradosF[] = INCBIN_COMP("graphics/pokemon/gyarados/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS const u32 gMonFrontPic_GyaradosMega[] = INCBIN_U32("graphics/pokemon/gyarados/mega/front.4bpp.lz"); @@ -3830,6 +3911,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_EeveeF[] = INCBIN_U32("graphics/pokemon/eevee/anim_frontf.4bpp.lz"); const u32 gMonBackPic_EeveeF[] = INCBIN_U32("graphics/pokemon/eevee/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_EeveeF[] = INCBIN_COMP("graphics/pokemon/eevee/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS const u32 gMonFrontPic_EeveeGigantamax[] = INCBIN_U32("graphics/pokemon/eevee/gigantamax/front.4bpp.lz"); @@ -4456,6 +4540,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_MeganiumF[] = INCBIN_U32("graphics/pokemon/meganium/anim_frontf.4bpp.lz"); const u32 gMonBackPic_MeganiumF[] = INCBIN_U32("graphics/pokemon/meganium/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_MeganiumF[] = INCBIN_COMP("graphics/pokemon/meganium/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_CHIKORITA #if P_FAMILY_CYNDAQUIL @@ -4660,6 +4747,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_LedybaF[] = INCBIN_U32("graphics/pokemon/ledyba/anim_frontf.4bpp.lz"); const u32 gMonBackPic_LedybaF[] = INCBIN_U32("graphics/pokemon/ledyba/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_LedybaF[] = INCBIN_COMP("graphics/pokemon/ledyba/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_Ledian[] = INCBIN_U32("graphics/pokemon/ledian/anim_front.4bpp.lz"); const u32 gMonPalette_Ledian[] = INCBIN_U32("graphics/pokemon/ledian/normal.gbapal.lz"); @@ -4679,6 +4769,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_LedianF[] = INCBIN_U32("graphics/pokemon/ledian/anim_frontf.4bpp.lz"); const u32 gMonBackPic_LedianF[] = INCBIN_U32("graphics/pokemon/ledian/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_LedianF[] = INCBIN_COMP("graphics/pokemon/ledian/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_LEDYBA #if P_FAMILY_SPINARAK @@ -4835,6 +4928,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_XatuF[] = INCBIN_U32("graphics/pokemon/xatu/anim_frontf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_XatuF[] = INCBIN_COMP("graphics/pokemon/xatu/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_NATU #if P_FAMILY_MAREEP @@ -4991,6 +5087,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_SudowoodoF[] = INCBIN_U32("graphics/pokemon/sudowoodo/anim_frontf.4bpp.lz"); const u32 gMonBackPic_SudowoodoF[] = INCBIN_U32("graphics/pokemon/sudowoodo/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_SudowoodoF[] = INCBIN_COMP("graphics/pokemon/sudowoodo/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_SUDOWOODO #if P_FAMILY_HOPPIP @@ -5062,6 +5161,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_AipomF[] = INCBIN_U32("graphics/pokemon/aipom/anim_frontf.4bpp.lz"); const u32 gMonBackPic_AipomF[] = INCBIN_U32("graphics/pokemon/aipom/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_AipomF[] = INCBIN_COMP("graphics/pokemon/aipom/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_4_CROSS_EVOS const u32 gMonFrontPic_Ambipom[] = INCBIN_U32("graphics/pokemon/ambipom/anim_front.4bpp.lz"); @@ -5082,6 +5184,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_AmbipomF[] = INCBIN_U32("graphics/pokemon/ambipom/anim_frontf.4bpp.lz"); const u32 gMonBackPic_AmbipomF[] = INCBIN_U32("graphics/pokemon/ambipom/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_AmbipomF[] = INCBIN_COMP("graphics/pokemon/ambipom/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GEN_4_CROSS_EVOS #endif //P_FAMILY_AIPOM @@ -5174,6 +5279,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_WooperF[] = INCBIN_U32("graphics/pokemon/wooper/anim_frontf.4bpp.lz"); const u32 gMonBackPic_WooperF[] = INCBIN_U32("graphics/pokemon/wooper/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_WooperF[] = INCBIN_COMP("graphics/pokemon/wooper/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_Quagsire[] = INCBIN_U32("graphics/pokemon/quagsire/anim_front.4bpp.lz"); const u32 gMonPalette_Quagsire[] = INCBIN_U32("graphics/pokemon/quagsire/normal.gbapal.lz"); @@ -5193,6 +5301,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_QuagsireF[] = INCBIN_U32("graphics/pokemon/quagsire/anim_frontf.4bpp.lz"); const u32 gMonBackPic_QuagsireF[] = INCBIN_U32("graphics/pokemon/quagsire/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_QuagsireF[] = INCBIN_COMP("graphics/pokemon/quagsire/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #if P_PALDEAN_FORMS const u32 gMonFrontPic_WooperPaldean[] = INCBIN_U32("graphics/pokemon/wooper/wooper_paldean/front.4bpp.lz"); @@ -5245,6 +5356,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_MurkrowF[] = INCBIN_U32("graphics/pokemon/murkrow/anim_frontf.4bpp.lz"); const u32 gMonBackPic_MurkrowF[] = INCBIN_U32("graphics/pokemon/murkrow/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_MurkrowF[] = INCBIN_COMP("graphics/pokemon/murkrow/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_4_CROSS_EVOS const u32 gMonFrontPic_Honchkrow[] = INCBIN_U32("graphics/pokemon/honchkrow/anim_front.4bpp.lz"); @@ -5496,6 +5610,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_CUSTOM_GENDER_DIFF_ICONS const u8 gMonIcon_WobbuffetF[] = INCBIN_U8("graphics/pokemon/wobbuffet/iconf.4bpp"); #endif +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_WobbuffetF[] = INCBIN_COMP("graphics/pokemon/wobbuffet/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_WOBBUFFET #if P_FAMILY_GIRAFARIG @@ -5517,6 +5634,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_GirafarigF[] = INCBIN_U32("graphics/pokemon/girafarig/anim_frontf.4bpp.lz"); const u32 gMonBackPic_GirafarigF[] = INCBIN_U32("graphics/pokemon/girafarig/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_GirafarigF[] = INCBIN_COMP("graphics/pokemon/girafarig/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_9_CROSS_EVOS const u32 gMonFrontPic_Farigiraf[] = INCBIN_U32("graphics/pokemon/farigiraf/front.4bpp.lz"); @@ -5633,6 +5753,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_GligarF[] = INCBIN_U32("graphics/pokemon/gligar/anim_frontf.4bpp.lz"); const u32 gMonBackPic_GligarF[] = INCBIN_U32("graphics/pokemon/gligar/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_GligarF[] = INCBIN_COMP("graphics/pokemon/gligar/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_4_CROSS_EVOS const u32 gMonFrontPic_Gliscor[] = INCBIN_U32("graphics/pokemon/gliscor/anim_front.4bpp.lz"); @@ -5773,6 +5896,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_HeracrossF[] = INCBIN_U32("graphics/pokemon/heracross/anim_frontf.4bpp.lz"); const u32 gMonBackPic_HeracrossF[] = INCBIN_U32("graphics/pokemon/heracross/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_HeracrossF[] = INCBIN_COMP("graphics/pokemon/heracross/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS const u32 gMonFrontPic_HeracrossMega[] = INCBIN_U32("graphics/pokemon/heracross/mega/front.4bpp.lz"); @@ -5809,6 +5935,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_SneaselF[] = INCBIN_U32("graphics/pokemon/sneasel/anim_frontf.4bpp.lz"); const u32 gMonBackPic_SneaselF[] = INCBIN_U32("graphics/pokemon/sneasel/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_SneaselF[] = INCBIN_COMP("graphics/pokemon/sneasel/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_4_CROSS_EVOS const u32 gMonFrontPic_Weavile[] = INCBIN_U32("graphics/pokemon/weavile/anim_front.4bpp.lz"); @@ -5829,6 +5958,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_WeavileF[] = INCBIN_U32("graphics/pokemon/weavile/anim_frontf.4bpp.lz"); const u32 gMonBackPic_WeavileF[] = INCBIN_U32("graphics/pokemon/weavile/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_WeavileF[] = INCBIN_COMP("graphics/pokemon/weavile/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GEN_4_CROSS_EVOS #if P_HISUIAN_FORMS @@ -5847,6 +5979,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_SneaselHisuianF[] = INCBIN_U32("graphics/pokemon/sneasel/hisuian/frontf.4bpp.lz"); const u32 gMonBackPic_SneaselHisuianF[] = INCBIN_U32("graphics/pokemon/sneasel/hisuian/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_SneaselHisuianF[] = INCBIN_COMP("graphics/pokemon/sneasel/hisuian/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_Sneasler[] = INCBIN_U32("graphics/pokemon/sneasler/front.4bpp.lz"); const u32 gMonPalette_Sneasler[] = INCBIN_U32("graphics/pokemon/sneasler/normal.gbapal.lz"); @@ -5901,6 +6036,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_UrsaringF[] = INCBIN_U32("graphics/pokemon/ursaring/anim_frontf.4bpp.lz"); const u32 gMonBackPic_UrsaringF[] = INCBIN_U32("graphics/pokemon/ursaring/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_UrsaringF[] = INCBIN_COMP("graphics/pokemon/ursaring/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_8_CROSS_EVOS const u32 gMonFrontPic_Ursaluna[] = INCBIN_U32("graphics/pokemon/ursaluna/front.4bpp.lz"); @@ -6003,6 +6141,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_PiloswineF[] = INCBIN_U32("graphics/pokemon/piloswine/anim_frontf.4bpp.lz"); const u32 gMonBackPic_PiloswineF[] = INCBIN_U32("graphics/pokemon/piloswine/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_PiloswineF[] = INCBIN_COMP("graphics/pokemon/piloswine/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_4_CROSS_EVOS const u32 gMonFrontPic_Mamoswine[] = INCBIN_U32("graphics/pokemon/mamoswine/anim_front.4bpp.lz"); @@ -6022,6 +6163,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_MamoswineF[] = INCBIN_U32("graphics/pokemon/mamoswine/anim_frontf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_MamoswineF[] = INCBIN_COMP("graphics/pokemon/mamoswine/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GEN_4_CROSS_EVOS #endif //P_FAMILY_SWINUB @@ -6109,6 +6253,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_OctilleryF[] = INCBIN_U32("graphics/pokemon/octillery/anim_frontf.4bpp.lz"); const u32 gMonBackPic_OctilleryF[] = INCBIN_U32("graphics/pokemon/octillery/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_OctilleryF[] = INCBIN_COMP("graphics/pokemon/octillery/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_REMORAID #if P_FAMILY_DELIBIRD @@ -6218,6 +6365,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_HoundoomF[] = INCBIN_U32("graphics/pokemon/houndoom/anim_frontf.4bpp.lz"); const u32 gMonBackPic_HoundoomF[] = INCBIN_U32("graphics/pokemon/houndoom/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_HoundoomF[] = INCBIN_COMP("graphics/pokemon/houndoom/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS const u32 gMonFrontPic_HoundoomMega[] = INCBIN_U32("graphics/pokemon/houndoom/mega/front.4bpp.lz"); @@ -6270,6 +6420,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_DonphanF[] = INCBIN_U32("graphics/pokemon/donphan/anim_frontf.4bpp.lz"); const u32 gMonBackPic_DonphanF[] = INCBIN_U32("graphics/pokemon/donphan/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_DonphanF[] = INCBIN_COMP("graphics/pokemon/donphan/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_PHANPY #if P_FAMILY_STANTLER @@ -6600,6 +6753,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonBackPic_TorchicF[] = INCBIN_U32("graphics/pokemon/torchic/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_TorchicF[] = INCBIN_COMP("graphics/pokemon/torchic/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_Combusken[] = INCBIN_U32("graphics/pokemon/combusken/anim_front.4bpp.lz"); const u32 gMonPalette_Combusken[] = INCBIN_U32("graphics/pokemon/combusken/normal.gbapal.lz"); @@ -6619,6 +6775,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_CombuskenF[] = INCBIN_U32("graphics/pokemon/combusken/anim_frontf.4bpp.lz"); const u32 gMonBackPic_CombuskenF[] = INCBIN_U32("graphics/pokemon/combusken/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_CombuskenF[] = INCBIN_COMP("graphics/pokemon/combusken/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_Blaziken[] = INCBIN_U32("graphics/pokemon/blaziken/anim_front.4bpp.lz"); const u32 gMonPalette_Blaziken[] = INCBIN_U32("graphics/pokemon/blaziken/normal.gbapal.lz"); @@ -6638,6 +6797,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_BlazikenF[] = INCBIN_U32("graphics/pokemon/blaziken/anim_frontf.4bpp.lz"); const u32 gMonBackPic_BlazikenF[] = INCBIN_U32("graphics/pokemon/blaziken/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_BlazikenF[] = INCBIN_COMP("graphics/pokemon/blaziken/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS const u32 gMonFrontPic_BlazikenMega[] = INCBIN_U32("graphics/pokemon/blaziken/mega/front.4bpp.lz"); @@ -6883,6 +7045,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_BeautiflyF[] = INCBIN_U32("graphics/pokemon/beautifly/anim_frontf.4bpp.lz"); const u32 gMonBackPic_BeautiflyF[] = INCBIN_U32("graphics/pokemon/beautifly/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_BeautiflyF[] = INCBIN_COMP("graphics/pokemon/beautifly/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_Cascoon[] = INCBIN_U32("graphics/pokemon/cascoon/anim_front.4bpp.lz"); const u32 gMonPalette_Cascoon[] = INCBIN_U32("graphics/pokemon/cascoon/normal.gbapal.lz"); @@ -6918,6 +7083,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_DustoxF[] = INCBIN_U32("graphics/pokemon/dustox/anim_frontf.4bpp.lz"); const u32 gMonBackPic_DustoxF[] = INCBIN_U32("graphics/pokemon/dustox/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_DustoxF[] = INCBIN_COMP("graphics/pokemon/dustox/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_WURMPLE #if P_FAMILY_LOTAD @@ -6971,6 +7139,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_LudicoloF[] = INCBIN_U32("graphics/pokemon/ludicolo/anim_frontf.4bpp.lz"); const u32 gMonBackPic_LudicoloF[] = INCBIN_U32("graphics/pokemon/ludicolo/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_LudicoloF[] = INCBIN_COMP("graphics/pokemon/ludicolo/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_LOTAD #if P_FAMILY_SEEDOT @@ -7008,6 +7179,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_NuzleafF[] = INCBIN_U32("graphics/pokemon/nuzleaf/anim_frontf.4bpp.lz"); const u32 gMonBackPic_NuzleafF[] = INCBIN_U32("graphics/pokemon/nuzleaf/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_NuzleafF[] = INCBIN_COMP("graphics/pokemon/nuzleaf/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_Shiftry[] = INCBIN_U32("graphics/pokemon/shiftry/anim_front.4bpp.lz"); const u32 gMonPalette_Shiftry[] = INCBIN_U32("graphics/pokemon/shiftry/normal.gbapal.lz"); @@ -7027,6 +7201,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_ShiftryF[] = INCBIN_U32("graphics/pokemon/shiftry/anim_frontf.4bpp.lz"); const u32 gMonBackPic_ShiftryF[] = INCBIN_U32("graphics/pokemon/shiftry/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_ShiftryF[] = INCBIN_COMP("graphics/pokemon/shiftry/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_SEEDOT #if P_FAMILY_TAILLOW @@ -7667,6 +7844,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_MedititeF[] = INCBIN_U32("graphics/pokemon/meditite/anim_frontf.4bpp.lz"); const u32 gMonBackPic_MedititeF[] = INCBIN_U32("graphics/pokemon/meditite/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_MedititeF[] = INCBIN_COMP("graphics/pokemon/meditite/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_Medicham[] = INCBIN_U32("graphics/pokemon/medicham/anim_front.4bpp.lz"); const u32 gMonPalette_Medicham[] = INCBIN_U32("graphics/pokemon/medicham/normal.gbapal.lz"); @@ -7686,6 +7866,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_MedichamF[] = INCBIN_U32("graphics/pokemon/medicham/anim_frontf.4bpp.lz"); const u32 gMonBackPic_MedichamF[] = INCBIN_U32("graphics/pokemon/medicham/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_MedichamF[] = INCBIN_COMP("graphics/pokemon/medicham/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS const u32 gMonFrontPic_MedichamMega[] = INCBIN_U32("graphics/pokemon/medicham/mega/front.4bpp.lz"); @@ -7859,6 +8042,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_RoseliaF[] = INCBIN_U32("graphics/pokemon/roselia/anim_frontf.4bpp.lz"); const u32 gMonBackPic_RoseliaF[] = INCBIN_U32("graphics/pokemon/roselia/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_RoseliaF[] = INCBIN_COMP("graphics/pokemon/roselia/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_4_CROSS_EVOS const u32 gMonFrontPic_Roserade[] = INCBIN_U32("graphics/pokemon/roserade/anim_front.4bpp.lz"); @@ -7879,6 +8065,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_RoseradeF[] = INCBIN_U32("graphics/pokemon/roserade/anim_frontf.4bpp.lz"); const u32 gMonBackPic_RoseradeF[] = INCBIN_U32("graphics/pokemon/roserade/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_RoseradeF[] = INCBIN_COMP("graphics/pokemon/roserade/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GEN_4_CROSS_EVOS #endif //P_FAMILY_ROSELIA @@ -7901,6 +8090,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_GulpinF[] = INCBIN_U32("graphics/pokemon/gulpin/anim_frontf.4bpp.lz"); const u32 gMonBackPic_GulpinF[] = INCBIN_U32("graphics/pokemon/gulpin/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_GulpinF[] = INCBIN_COMP("graphics/pokemon/gulpin/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_Swalot[] = INCBIN_U32("graphics/pokemon/swalot/anim_front.4bpp.lz"); const u32 gMonPalette_Swalot[] = INCBIN_U32("graphics/pokemon/swalot/normal.gbapal.lz"); @@ -7920,6 +8112,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_SwalotF[] = INCBIN_U32("graphics/pokemon/swalot/anim_frontf.4bpp.lz"); const u32 gMonBackPic_SwalotF[] = INCBIN_U32("graphics/pokemon/swalot/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_SwalotF[] = INCBIN_COMP("graphics/pokemon/swalot/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_GULPIN #if P_FAMILY_CARVANHA @@ -8024,6 +8219,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_NumelF[] = INCBIN_U32("graphics/pokemon/numel/anim_frontf.4bpp.lz"); const u32 gMonBackPic_NumelF[] = INCBIN_U32("graphics/pokemon/numel/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_NumelF[] = INCBIN_COMP("graphics/pokemon/numel/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_Camerupt[] = INCBIN_U32("graphics/pokemon/camerupt/anim_front.4bpp.lz"); const u32 gMonPalette_Camerupt[] = INCBIN_U32("graphics/pokemon/camerupt/normal.gbapal.lz"); @@ -8043,6 +8241,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_CameruptF[] = INCBIN_U32("graphics/pokemon/camerupt/anim_frontf.4bpp.lz"); const u32 gMonBackPic_CameruptF[] = INCBIN_U32("graphics/pokemon/camerupt/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_CameruptF[] = INCBIN_COMP("graphics/pokemon/camerupt/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS const u32 gMonFrontPic_CameruptMega[] = INCBIN_U32("graphics/pokemon/camerupt/mega/front.4bpp.lz"); @@ -8214,6 +8415,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_CacturneF[] = INCBIN_U32("graphics/pokemon/cacturne/anim_frontf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_CacturneF[] = INCBIN_COMP("graphics/pokemon/cacturne/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_CACNEA #if P_FAMILY_SWABLU @@ -8542,6 +8746,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_MiloticF[] = INCBIN_U32("graphics/pokemon/milotic/anim_frontf.4bpp.lz"); const u32 gMonBackPic_MiloticF[] = INCBIN_U32("graphics/pokemon/milotic/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_MiloticF[] = INCBIN_COMP("graphics/pokemon/milotic/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_FEEBAS #if P_FAMILY_CASTFORM @@ -8982,6 +9189,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_RelicanthF[] = INCBIN_U32("graphics/pokemon/relicanth/anim_frontf.4bpp.lz"); const u32 gMonBackPic_RelicanthF[] = INCBIN_U32("graphics/pokemon/relicanth/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_RelicanthF[] = INCBIN_COMP("graphics/pokemon/relicanth/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_RELICANTH #if P_FAMILY_LUVDISC @@ -9584,6 +9794,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_StarlyF[] = INCBIN_U32("graphics/pokemon/starly/anim_frontf.4bpp.lz"); const u32 gMonBackPic_StarlyF[] = INCBIN_U32("graphics/pokemon/starly/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_StarlyF[] = INCBIN_COMP("graphics/pokemon/starly/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_Staravia[] = INCBIN_U32("graphics/pokemon/staravia/anim_front.4bpp.lz"); const u32 gMonPalette_Staravia[] = INCBIN_U32("graphics/pokemon/staravia/normal.gbapal.lz"); @@ -9603,6 +9816,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_StaraviaF[] = INCBIN_U32("graphics/pokemon/staravia/anim_frontf.4bpp.lz"); const u32 gMonBackPic_StaraviaF[] = INCBIN_U32("graphics/pokemon/staravia/back.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_StaraviaF[] = INCBIN_COMP("graphics/pokemon/staravia/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_Staraptor[] = INCBIN_U32("graphics/pokemon/staraptor/anim_front.4bpp.lz"); const u32 gMonPalette_Staraptor[] = INCBIN_U32("graphics/pokemon/staraptor/normal.gbapal.lz"); @@ -9621,6 +9837,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_StaraptorF[] = INCBIN_U32("graphics/pokemon/staraptor/anim_frontf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_StaraptorF[] = INCBIN_COMP("graphics/pokemon/staraptor/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_STARLY #if P_FAMILY_BIDOOF @@ -9642,6 +9861,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_BidoofF[] = INCBIN_U32("graphics/pokemon/bidoof/anim_frontf.4bpp.lz"); const u32 gMonBackPic_BidoofF[] = INCBIN_U32("graphics/pokemon/bidoof/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_BidoofF[] = INCBIN_COMP("graphics/pokemon/bidoof/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_Bibarel[] = INCBIN_U32("graphics/pokemon/bibarel/anim_front.4bpp.lz"); const u32 gMonPalette_Bibarel[] = INCBIN_U32("graphics/pokemon/bibarel/normal.gbapal.lz"); @@ -9660,6 +9882,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_BibarelF[] = INCBIN_U32("graphics/pokemon/bibarel/anim_frontf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_BibarelF[] = INCBIN_COMP("graphics/pokemon/bibarel/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_BIDOOF #if P_FAMILY_KRICKETOT @@ -9681,6 +9906,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_KricketotF[] = INCBIN_U32("graphics/pokemon/kricketot/anim_frontf.4bpp.lz"); const u32 gMonBackPic_KricketotF[] = INCBIN_U32("graphics/pokemon/kricketot/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_KricketotF[] = INCBIN_COMP("graphics/pokemon/kricketot/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_Kricketune[] = INCBIN_U32("graphics/pokemon/kricketune/anim_front.4bpp.lz"); const u32 gMonPalette_Kricketune[] = INCBIN_U32("graphics/pokemon/kricketune/normal.gbapal.lz"); @@ -9700,6 +9928,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_KricketuneF[] = INCBIN_U32("graphics/pokemon/kricketune/anim_frontf.4bpp.lz"); const u32 gMonBackPic_KricketuneF[] = INCBIN_U32("graphics/pokemon/kricketune/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_KricketuneF[] = INCBIN_COMP("graphics/pokemon/kricketune/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_KRICKETOT #if P_FAMILY_SHINX @@ -9721,6 +9952,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_ShinxF[] = INCBIN_U32("graphics/pokemon/shinx/anim_frontf.4bpp.lz"); const u32 gMonBackPic_ShinxF[] = INCBIN_U32("graphics/pokemon/shinx/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_ShinxF[] = INCBIN_COMP("graphics/pokemon/shinx/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_Luxio[] = INCBIN_U32("graphics/pokemon/luxio/anim_front.4bpp.lz"); const u32 gMonPalette_Luxio[] = INCBIN_U32("graphics/pokemon/luxio/normal.gbapal.lz"); @@ -9740,6 +9974,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_LuxioF[] = INCBIN_U32("graphics/pokemon/luxio/anim_frontf.4bpp.lz"); const u32 gMonBackPic_LuxioF[] = INCBIN_U32("graphics/pokemon/luxio/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_LuxioF[] = INCBIN_COMP("graphics/pokemon/luxio/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_Luxray[] = INCBIN_U32("graphics/pokemon/luxray/anim_front.4bpp.lz"); const u32 gMonPalette_Luxray[] = INCBIN_U32("graphics/pokemon/luxray/normal.gbapal.lz"); @@ -9759,6 +9996,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_LuxrayF[] = INCBIN_U32("graphics/pokemon/luxray/anim_frontf.4bpp.lz"); const u32 gMonBackPic_LuxrayF[] = INCBIN_U32("graphics/pokemon/luxray/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_LuxrayF[] = INCBIN_COMP("graphics/pokemon/luxray/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_SHINX #if P_FAMILY_CRANIDOS @@ -9937,7 +10177,7 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonPalette_CombeeF[] = INCBIN_U32("graphics/pokemon/combee/normalf.gbapal.lz"); const u32 gMonShinyPalette_CombeeF[] = INCBIN_U32("graphics/pokemon/combee/shinyf.gbapal.lz"); #if OW_POKEMON_OBJECT_EVENTS - const u32 gObjectEventPic_CombeeF[] = INCBIN_COMP("graphics/pokemon/combee/followerf.4bpp"); + const u32 gObjectEventPic_CombeeF[] = INCBIN_COMP("graphics/pokemon/combee/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_Vespiquen[] = INCBIN_U32("graphics/pokemon/vespiquen/anim_front.4bpp.lz"); @@ -9975,6 +10215,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_PachirisuF[] = INCBIN_U32("graphics/pokemon/pachirisu/anim_frontf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_PachirisuF[] = INCBIN_COMP("graphics/pokemon/pachirisu/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_PACHIRISU #if P_FAMILY_BUIZEL @@ -9995,6 +10238,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonBackPic_BuizelF[] = INCBIN_U32("graphics/pokemon/buizel/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_BuizelF[] = INCBIN_COMP("graphics/pokemon/buizel/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_Floatzel[] = INCBIN_U32("graphics/pokemon/floatzel/anim_front.4bpp.lz"); const u32 gMonPalette_Floatzel[] = INCBIN_U32("graphics/pokemon/floatzel/normal.gbapal.lz"); @@ -10013,6 +10259,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonBackPic_FloatzelF[] = INCBIN_U32("graphics/pokemon/floatzel/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_FloatzelF[] = INCBIN_COMP("graphics/pokemon/floatzel/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_BUIZEL #if P_FAMILY_CHERUBI @@ -10352,6 +10601,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_GibleF[] = INCBIN_U32("graphics/pokemon/gible/anim_frontf.4bpp.lz"); const u32 gMonBackPic_GibleF[] = INCBIN_U32("graphics/pokemon/gible/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_GibleF[] = INCBIN_COMP("graphics/pokemon/gible/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_Gabite[] = INCBIN_U32("graphics/pokemon/gabite/anim_front.4bpp.lz"); const u32 gMonPalette_Gabite[] = INCBIN_U32("graphics/pokemon/gabite/normal.gbapal.lz"); @@ -10371,6 +10623,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_GabiteF[] = INCBIN_U32("graphics/pokemon/gabite/anim_frontf.4bpp.lz"); const u32 gMonBackPic_GabiteF[] = INCBIN_U32("graphics/pokemon/gabite/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_GabiteF[] = INCBIN_COMP("graphics/pokemon/gabite/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_Garchomp[] = INCBIN_U32("graphics/pokemon/garchomp/anim_front.4bpp.lz"); const u32 gMonPalette_Garchomp[] = INCBIN_U32("graphics/pokemon/garchomp/normal.gbapal.lz"); @@ -10389,6 +10644,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_GarchompF[] = INCBIN_U32("graphics/pokemon/garchomp/anim_frontf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_GarchompF[] = INCBIN_COMP("graphics/pokemon/garchomp/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS const u32 gMonFrontPic_GarchompMega[] = INCBIN_U32("graphics/pokemon/garchomp/mega/front.4bpp.lz"); @@ -10478,11 +10736,7 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u8 gMonIcon_HippopotasF[] = INCBIN_U8("graphics/pokemon/hippopotas/iconf.4bpp"); #endif #if OW_POKEMON_OBJECT_EVENTS - const u32 gObjectEventPic_HippopotasF[] = INCBIN_COMP("graphics/pokemon/hippopotas/overworld.4bpp"); -#if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_HippopotasF[] = INCBIN_U32("graphics/pokemon/hippopotas/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_HippopotasF[] = INCBIN_U32("graphics/pokemon/hippopotas/overworld_shiny.gbapal.lz"); -#endif //OW_PKMN_OBJECTS_SHARE_PALETTES + const u32 gObjectEventPic_HippopotasF[] = INCBIN_COMP("graphics/pokemon/hippopotas/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_Hippowdon[] = INCBIN_U32("graphics/pokemon/hippowdon/anim_front.4bpp.lz"); @@ -10507,10 +10761,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u8 gMonIcon_HippowdonF[] = INCBIN_U8("graphics/pokemon/hippowdon/iconf.4bpp"); #endif #if OW_POKEMON_OBJECT_EVENTS - const u32 gObjectEventPic_HippowdonF[] = INCBIN_COMP("graphics/pokemon/hippowdon/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_HippowdonF[] = INCBIN_U32("graphics/pokemon/hippowdon/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_HippowdonF[] = INCBIN_U32("graphics/pokemon/hippowdon/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_HippowdonF[] = INCBIN_U32("graphics/pokemon/hippowdon/overworld_normalf.gbapal.lz"); + const u32 gShinyOverworldPalette_HippowdonF[] = INCBIN_U32("graphics/pokemon/hippowdon/overworld_shinyf.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_HIPPOPOTAS @@ -10568,6 +10821,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_CroagunkF[] = INCBIN_U32("graphics/pokemon/croagunk/anim_frontf.4bpp.lz"); const u32 gMonBackPic_CroagunkF[] = INCBIN_U32("graphics/pokemon/croagunk/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_CroagunkF[] = INCBIN_COMP("graphics/pokemon/croagunk/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_Toxicroak[] = INCBIN_U32("graphics/pokemon/toxicroak/anim_front.4bpp.lz"); const u32 gMonPalette_Toxicroak[] = INCBIN_U32("graphics/pokemon/toxicroak/normal.gbapal.lz"); @@ -10587,6 +10843,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_ToxicroakF[] = INCBIN_U32("graphics/pokemon/toxicroak/anim_frontf.4bpp.lz"); const u32 gMonBackPic_ToxicroakF[] = INCBIN_U32("graphics/pokemon/toxicroak/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_ToxicroakF[] = INCBIN_COMP("graphics/pokemon/toxicroak/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_CROAGUNK #if P_FAMILY_CARNIVINE @@ -10626,6 +10885,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_FinneonF[] = INCBIN_U32("graphics/pokemon/finneon/anim_frontf.4bpp.lz"); const u32 gMonBackPic_FinneonF[] = INCBIN_U32("graphics/pokemon/finneon/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_FinneonF[] = INCBIN_COMP("graphics/pokemon/finneon/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_Lumineon[] = INCBIN_U32("graphics/pokemon/lumineon/anim_front.4bpp.lz"); const u32 gMonPalette_Lumineon[] = INCBIN_U32("graphics/pokemon/lumineon/normal.gbapal.lz"); @@ -10645,6 +10907,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_LumineonF[] = INCBIN_U32("graphics/pokemon/lumineon/anim_frontf.4bpp.lz"); const u32 gMonBackPic_LumineonF[] = INCBIN_U32("graphics/pokemon/lumineon/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_LumineonF[] = INCBIN_COMP("graphics/pokemon/lumineon/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_FINNEON #if P_FAMILY_SNOVER @@ -10666,6 +10931,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonFrontPic_SnoverF[] = INCBIN_U32("graphics/pokemon/snover/anim_frontf.4bpp.lz"); const u32 gMonBackPic_SnoverF[] = INCBIN_U32("graphics/pokemon/snover/backf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_SnoverF[] = INCBIN_COMP("graphics/pokemon/snover/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_Abomasnow[] = INCBIN_U32("graphics/pokemon/abomasnow/anim_front.4bpp.lz"); const u32 gMonPalette_Abomasnow[] = INCBIN_U32("graphics/pokemon/abomasnow/normal.gbapal.lz"); @@ -10684,6 +10952,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonFrontPic_AbomasnowF[] = INCBIN_U32("graphics/pokemon/abomasnow/anim_frontf.4bpp.lz"); +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_AbomasnowF[] = INCBIN_COMP("graphics/pokemon/abomasnow/overworldf.4bpp"); +#endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS const u32 gMonFrontPic_AbomasnowMega[] = INCBIN_U32("graphics/pokemon/abomasnow/mega/front.4bpp.lz"); @@ -11044,10 +11315,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonShinyPalette_ShayminSky[] = INCBIN_U32("graphics/pokemon/shaymin/sky/shiny.gbapal.lz"); const u8 gMonIcon_ShayminSky[] = INCBIN_U8("graphics/pokemon/shaymin/sky/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_ShayminSky[] = INCBIN_COMP("graphics/pokemon/shaymin/sky/overworld.4bpp"); + const u32 gObjectEventPic_ShayminSky[] = INCBIN_COMP("graphics/pokemon/shaymin/sky/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_ShayminSky[] = INCBIN_U32("graphics/pokemon/shaymin/sky/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_ShayminSky[] = INCBIN_U32("graphics/pokemon/shaymin/sky/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_ShayminSky[] = INCBIN_U32("graphics/pokemon/shaymin/sky/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_ShayminSky[] = INCBIN_U32("graphics/pokemon/shaymin/sky/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_SHAYMIN @@ -11685,10 +11956,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonShinyPalette_UnfezantF[] = INCBIN_U32("graphics/pokemon/unfezant/shinyf.gbapal.lz"); const u8 gMonIcon_UnfezantF[] = INCBIN_U8("graphics/pokemon/unfezant/iconf.4bpp"); #if OW_POKEMON_OBJECT_EVENTS - const u32 gObjectEventPic_UnfezantF[] = INCBIN_COMP("graphics/pokemon/unfezant_f/overworld.4bpp"); + const u32 gObjectEventPic_UnfezantF[] = INCBIN_COMP("graphics/pokemon/unfezant/overworldf.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_UnfezantF[] = INCBIN_U32("graphics/pokemon/unfezant_f/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_UnfezantF[] = INCBIN_U32("graphics/pokemon/unfezant_f/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_UnfezantF[] = INCBIN_U32("graphics/pokemon/unfezant/overworld_normalf.gbapal.lz"); + const u32 gShinyOverworldPalette_UnfezantF[] = INCBIN_U32("graphics/pokemon/unfezant/overworld_shinyf.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_PIDOVE @@ -13165,10 +13436,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonShinyPalette_FrillishF[] = INCBIN_U32("graphics/pokemon/frillish/shinyf.gbapal.lz"); const u8 gMonIcon_FrillishF[] = INCBIN_U8("graphics/pokemon/frillish/iconf.4bpp"); #if OW_POKEMON_OBJECT_EVENTS - const u32 gObjectEventPic_FrillishF[] = INCBIN_COMP("graphics/pokemon/frillish/followerf.4bpp"); + const u32 gObjectEventPic_FrillishF[] = INCBIN_COMP("graphics/pokemon/frillish/overworldf.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_FrillishF[] = INCBIN_U32("graphics/pokemon/frillish/overworld_normalf.gbapal.lz"); - // const u32 gShinyOverworldPalette_FrillishF[] = INCBIN_U32("graphics/pokemon/frillish/overworld_shinyf.gbapal.lz"); + const u32 gOverworldPalette_FrillishF[] = INCBIN_U32("graphics/pokemon/frillish/overworld_normalf.gbapal.lz"); + const u32 gShinyOverworldPalette_FrillishF[] = INCBIN_U32("graphics/pokemon/frillish/overworld_shinyf.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS @@ -13194,10 +13465,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonShinyPalette_JellicentF[] = INCBIN_U32("graphics/pokemon/jellicent/shinyf.gbapal.lz"); const u8 gMonIcon_JellicentF[] = INCBIN_U8("graphics/pokemon/jellicent/iconf.4bpp"); #if OW_POKEMON_OBJECT_EVENTS - const u32 gObjectEventPic_JellicentF[] = INCBIN_COMP("graphics/pokemon/jellicent/followerf.4bpp"); + const u32 gObjectEventPic_JellicentF[] = INCBIN_COMP("graphics/pokemon/jellicent/overworldf.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_JellicentF[] = INCBIN_U32("graphics/pokemon/jellicent/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_JellicentF[] = INCBIN_U32("graphics/pokemon/jellicent/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_JellicentF[] = INCBIN_U32("graphics/pokemon/jellicent/overworld_normalf.gbapal.lz"); + const u32 gShinyOverworldPalette_JellicentF[] = INCBIN_U32("graphics/pokemon/jellicent/overworld_shinyf.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_FRILLISH @@ -14077,10 +14348,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonShinyPalette_TornadusTherian[] = INCBIN_U32("graphics/pokemon/tornadus/therian/shiny.gbapal.lz"); const u8 gMonIcon_TornadusTherian[] = INCBIN_U8("graphics/pokemon/tornadus/therian/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS - //const u32 gObjectEventPic_TornadusTherian[] = INCBIN_COMP("graphics/pokemon/tornadus/therian/overworld.4bpp"); + const u32 gObjectEventPic_TornadusTherian[] = INCBIN_COMP("graphics/pokemon/tornadus/therian/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - //const u32 gOverworldPalette_TornadusTherian[] = INCBIN_U32("graphics/pokemon/tornadus/therian/overworld_normal.gbapal.lz"); - //const u32 gShinyOverworldPalette_TornadusTherian[] = INCBIN_U32("graphics/pokemon/tornadus/therian/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_TornadusTherian[] = INCBIN_U32("graphics/pokemon/tornadus/therian/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_TornadusTherian[] = INCBIN_U32("graphics/pokemon/tornadus/therian/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_TORNADUS @@ -14108,10 +14379,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonShinyPalette_ThundurusTherian[] = INCBIN_U32("graphics/pokemon/thundurus/therian/shiny.gbapal.lz"); const u8 gMonIcon_ThundurusTherian[] = INCBIN_U8("graphics/pokemon/thundurus/therian/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS - //const u32 gObjectEventPic_ThundurusTherian[] = INCBIN_COMP("graphics/pokemon/thundurus/therian/overworld.4bpp"); + const u32 gObjectEventPic_ThundurusTherian[] = INCBIN_COMP("graphics/pokemon/thundurus/therian/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - //const u32 gOverworldPalette_ThundurusTherian[] = INCBIN_U32("graphics/pokemon/thundurus/therian/overworld_normal.gbapal.lz"); - //const u32 gShinyOverworldPalette_ThundurusTherian[] = INCBIN_U32("graphics/pokemon/thundurus/therian/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_ThundurusTherian[] = INCBIN_U32("graphics/pokemon/thundurus/therian/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_ThundurusTherian[] = INCBIN_U32("graphics/pokemon/thundurus/therian/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_THUNDURUS @@ -14175,10 +14446,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonShinyPalette_LandorusTherian[] = INCBIN_U32("graphics/pokemon/landorus/therian/shiny.gbapal.lz"); const u8 gMonIcon_LandorusTherian[] = INCBIN_U8("graphics/pokemon/landorus/therian/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS - //const u32 gObjectEventPic_LandorusTherian[] = INCBIN_COMP("graphics/pokemon/landorus/therian/overworld.4bpp"); + const u32 gObjectEventPic_LandorusTherian[] = INCBIN_COMP("graphics/pokemon/landorus/therian/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - //const u32 gOverworldPalette_LandorusTherian[] = INCBIN_U32("graphics/pokemon/landorus/therian/overworld_normal.gbapal.lz"); - //const u32 gShinyOverworldPalette_LandorusTherian[] = INCBIN_U32("graphics/pokemon/landorus/therian/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_LandorusTherian[] = INCBIN_U32("graphics/pokemon/landorus/therian/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_LandorusTherian[] = INCBIN_U32("graphics/pokemon/landorus/therian/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_LANDORUS @@ -14238,10 +14509,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonShinyPalette_KyuremWhite[] = INCBIN_U32("graphics/pokemon/kyurem/white/shiny.gbapal.lz"); const u8 gMonIcon_KyuremWhite[] = INCBIN_U8("graphics/pokemon/kyurem/white/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_KyuremWhite[] = INCBIN_COMP("graphics/pokemon/kyurem/white/overworld.4bpp"); + const u32 gObjectEventPic_KyuremWhite[] = INCBIN_COMP("graphics/pokemon/kyurem/white/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_KyuremWhite[] = INCBIN_U32("graphics/pokemon/kyurem/white/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_KyuremWhite[] = INCBIN_U32("graphics/pokemon/kyurem/white/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_KyuremWhite[] = INCBIN_U32("graphics/pokemon/kyurem/white/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_KyuremWhite[] = INCBIN_U32("graphics/pokemon/kyurem/white/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS @@ -14251,10 +14522,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonShinyPalette_KyuremBlack[] = INCBIN_U32("graphics/pokemon/kyurem/black/shiny.gbapal.lz"); const u8 gMonIcon_KyuremBlack[] = INCBIN_U8("graphics/pokemon/kyurem/black/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_KyuremBlack[] = INCBIN_COMP("graphics/pokemon/kyurem/black/overworld.4bpp"); + const u32 gObjectEventPic_KyuremBlack[] = INCBIN_COMP("graphics/pokemon/kyurem/black/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_KyuremBlack[] = INCBIN_U32("graphics/pokemon/kyurem/black/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_KyuremBlack[] = INCBIN_U32("graphics/pokemon/kyurem/black/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_KyuremBlack[] = INCBIN_U32("graphics/pokemon/kyurem/black/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_KyuremBlack[] = INCBIN_U32("graphics/pokemon/kyurem/black/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FUSION_FORMS @@ -14858,11 +15129,7 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_PyroarF[] = INCBIN_U32("graphics/pokemon/pyroar/backf.4bpp.lz"); const u8 gMonIcon_PyroarF[] = INCBIN_U8("graphics/pokemon/pyroar/iconf.4bpp"); #if OW_POKEMON_OBJECT_EVENTS - const u32 gObjectEventPic_PyroarF[] = INCBIN_COMP("graphics/pokemon/pyroar/followerf.4bpp"); -#if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_PyroarF[] = INCBIN_U32("graphics/pokemon/pyroar/overworld_normalf.gbapal.lz"); - // const u32 gShinyOverworldPalette_PyroarF[] = INCBIN_U32("graphics/pokemon/pyroar/overworld_shinyf.gbapal.lz"); -#endif //OW_PKMN_OBJECTS_SHARE_PALETTES + const u32 gObjectEventPic_PyroarF[] = INCBIN_COMP("graphics/pokemon/pyroar/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_LITLEO @@ -15812,9 +16079,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_PumpkabooAverage[] = INCBIN_COMP("graphics/pokemon/pumpkaboo/overworld.4bpp"); - // const u32 gObjectEventPic_PumpkabooSmall[] = INCBIN_COMP("graphics/pokemon/pumpkaboo/small/overworld.4bpp"); - // const u32 gObjectEventPic_PumpkabooLarge[] = INCBIN_COMP("graphics/pokemon/pumpkaboo/large/overworld.4bpp"); - // const u32 gObjectEventPic_PumpkabooSuper[] = INCBIN_COMP("graphics/pokemon/pumpkaboo/super/overworld.4bpp"); + const u32 gObjectEventPic_PumpkabooSmall[] = INCBIN_COMP("graphics/pokemon/pumpkaboo/small/overworld.4bpp"); + const u32 gObjectEventPic_PumpkabooLarge[] = INCBIN_COMP("graphics/pokemon/pumpkaboo/large/overworld.4bpp"); + const u32 gObjectEventPic_PumpkabooSuper[] = INCBIN_COMP("graphics/pokemon/pumpkaboo/super/overworld.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonPalette_Gourgeist[] = INCBIN_U32("graphics/pokemon/gourgeist/normal.gbapal.lz"); @@ -15843,9 +16110,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_GourgeistAverage[] = INCBIN_COMP("graphics/pokemon/gourgeist/overworld.4bpp"); - // const u32 gObjectEventPic_GourgeistSmall[] = INCBIN_COMP("graphics/pokemon/gourgeist/small/overworld.4bpp"); - // const u32 gObjectEventPic_GourgeistLarge[] = INCBIN_COMP("graphics/pokemon/gourgeist/large/overworld.4bpp"); - // const u32 gObjectEventPic_GourgeistSuper[] = INCBIN_COMP("graphics/pokemon/gourgeist/super/overworld.4bpp"); + const u32 gObjectEventPic_GourgeistSmall[] = INCBIN_COMP("graphics/pokemon/gourgeist/small/overworld.4bpp"); + const u32 gObjectEventPic_GourgeistLarge[] = INCBIN_COMP("graphics/pokemon/gourgeist/large/overworld.4bpp"); + const u32 gObjectEventPic_GourgeistSuper[] = INCBIN_COMP("graphics/pokemon/gourgeist/super/overworld.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_PUMPKABOO @@ -16005,10 +16272,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonShinyPalette_Zygarde10[] = INCBIN_U32("graphics/pokemon/zygarde/10_percent/shiny.gbapal.lz"); const u8 gMonIcon_Zygarde10[] = INCBIN_U8("graphics/pokemon/zygarde/10_percent/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS - //const u32 gObjectEventPic_Zygarde10[] = INCBIN_COMP("graphics/pokemon/zygarde/10_percent/overworld.4bpp"); + const u32 gObjectEventPic_Zygarde10[] = INCBIN_COMP("graphics/pokemon/zygarde/10_percent/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - //const u32 gOverworldPalette_Zygarde10[] = INCBIN_U32("graphics/pokemon/zygarde/10_percent/overworld_normal.gbapal.lz"); - //const u32 gShinyOverworldPalette_Zygarde10[] = INCBIN_U32("graphics/pokemon/zygarde/10_percent/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_Zygarde10[] = INCBIN_U32("graphics/pokemon/zygarde/10_percent/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_Zygarde10[] = INCBIN_U32("graphics/pokemon/zygarde/10_percent/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS @@ -16018,10 +16285,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonShinyPalette_ZygardeComplete[] = INCBIN_U32("graphics/pokemon/zygarde/complete/shiny.gbapal.lz"); const u8 gMonIcon_ZygardeComplete[] = INCBIN_U8("graphics/pokemon/zygarde/complete/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS - //const u32 gObjectEventPic_ZygardeComplete[] = INCBIN_COMP("graphics/pokemon/zygarde/complete/overworld.4bpp"); + const u32 gObjectEventPic_ZygardeComplete[] = INCBIN_COMP("graphics/pokemon/zygarde/complete/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - //const u32 gOverworldPalette_ZygardeComplete[] = INCBIN_U32("graphics/pokemon/zygarde/complete/overworld_normal.gbapal.lz"); - //const u32 gShinyOverworldPalette_ZygardeComplete[] = INCBIN_U32("graphics/pokemon/zygarde/complete/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_ZygardeComplete[] = INCBIN_U32("graphics/pokemon/zygarde/complete/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_ZygardeComplete[] = INCBIN_U32("graphics/pokemon/zygarde/complete/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_ZYGARDE @@ -16464,10 +16731,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonShinyPalette_OricorioPomPom[] = INCBIN_U32("graphics/pokemon/oricorio/pom_pom/shiny.gbapal.lz"); const u8 gMonIcon_OricorioPomPom[] = INCBIN_U8("graphics/pokemon/oricorio/pom_pom/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_OricorioPomPom[] = INCBIN_COMP("graphics/pokemon/oricorio/pom_pom/overworld.4bpp"); + const u32 gObjectEventPic_OricorioPomPom[] = INCBIN_COMP("graphics/pokemon/oricorio/pom_pom/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_OricorioPomPom[] = INCBIN_U32("graphics/pokemon/oricorio/pom_pom/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_OricorioPomPom[] = INCBIN_U32("graphics/pokemon/oricorio/pom_pom/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_OricorioPomPom[] = INCBIN_U32("graphics/pokemon/oricorio/pom_pom/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_OricorioPomPom[] = INCBIN_U32("graphics/pokemon/oricorio/pom_pom/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS @@ -16477,10 +16744,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonShinyPalette_OricorioPau[] = INCBIN_U32("graphics/pokemon/oricorio/pau/shiny.gbapal.lz"); const u8 gMonIcon_OricorioPau[] = INCBIN_U8("graphics/pokemon/oricorio/pau/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_OricorioPau[] = INCBIN_COMP("graphics/pokemon/oricorio/pau/overworld.4bpp"); + const u32 gObjectEventPic_OricorioPau[] = INCBIN_COMP("graphics/pokemon/oricorio/pau/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_OricorioPau[] = INCBIN_U32("graphics/pokemon/oricorio/pau/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_OricorioPau[] = INCBIN_U32("graphics/pokemon/oricorio/pau/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_OricorioPau[] = INCBIN_U32("graphics/pokemon/oricorio/pau/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_OricorioPau[] = INCBIN_U32("graphics/pokemon/oricorio/pau/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS @@ -16490,10 +16757,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonShinyPalette_OricorioSensu[] = INCBIN_U32("graphics/pokemon/oricorio/sensu/shiny.gbapal.lz"); const u8 gMonIcon_OricorioSensu[] = INCBIN_U8("graphics/pokemon/oricorio/sensu/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_OricorioSensu[] = INCBIN_COMP("graphics/pokemon/oricorio/sensu/overworld.4bpp"); + const u32 gObjectEventPic_OricorioSensu[] = INCBIN_COMP("graphics/pokemon/oricorio/sensu/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_OricorioSensu[] = INCBIN_U32("graphics/pokemon/oricorio/sensu/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_OricorioSensu[] = INCBIN_U32("graphics/pokemon/oricorio/sensu/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_OricorioSensu[] = INCBIN_U32("graphics/pokemon/oricorio/sensu/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_OricorioSensu[] = INCBIN_U32("graphics/pokemon/oricorio/sensu/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_ORICORIO @@ -17718,10 +17985,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonShinyPalette_MagearnaOriginalColor[] = INCBIN_U32("graphics/pokemon/magearna/original_color/shiny.gbapal.lz"); const u8 gMonIcon_MagearnaOriginalColor[] = INCBIN_U8("graphics/pokemon/magearna/original_color/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_MagearnaOriginalColor[] = INCBIN_COMP("graphics/pokemon/magearna/original_color/overworld.4bpp"); + const u32 gObjectEventPic_MagearnaOriginalColor[] = INCBIN_COMP("graphics/pokemon/magearna/original_color/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_MagearnaOriginalColor[] = INCBIN_U32("graphics/pokemon/magearna/original_color/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_MagearnaOriginalColor[] = INCBIN_U32("graphics/pokemon/magearna/original_color/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_MagearnaOriginalColor[] = INCBIN_U32("graphics/pokemon/magearna/original_color/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_MagearnaOriginalColor[] = INCBIN_U32("graphics/pokemon/magearna/original_color/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_MAGEARNA @@ -21882,7 +22149,7 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gShinyOverworldPalette_OgerponCornerstoneMask[] = INCBIN_U32("graphics/pokemon/ogerpon/cornerstone/overworld_shiny.gbapal.lz"); const u32 gOverworldPalette_OgerponTealMask[] = INCBIN_U32("graphics/pokemon/ogerpon/overworld_normal.gbapal.lz"); const u32 gShinyOverworldPalette_OgerponTealMask[] = INCBIN_U32("graphics/pokemon/ogerpon/overworld_shiny.gbapal.lz"); - + const u32 gObjectEventPic_OgerponTealMaskTeraTera[] = INCBIN_COMP("graphics/pokemon/ogerpon/overworld.4bpp"); const u32 gObjectEventPic_OgerponWellspringMaskTera[] = INCBIN_COMP("graphics/pokemon/ogerpon/wellspring/overworld.4bpp"); const u32 gObjectEventPic_OgerponHearthflameMaskTera[] = INCBIN_COMP("graphics/pokemon/ogerpon/hearthflame/overworld.4bpp"); diff --git a/src/data/graphics/rayquaza_scene.h b/src/data/graphics/rayquaza_scene.h index 660f07416cb5..e999e947fb31 100644 --- a/src/data/graphics/rayquaza_scene.h +++ b/src/data/graphics/rayquaza_scene.h @@ -24,9 +24,7 @@ const u32 gRaySceneTakesFlight_Bg_Tilemap[] = INCBIN_U32("graphics/rayquaz // Scene 3 (RAY_ANIM_DESCENDS) const u32 gRaySceneDescends_Rayquaza_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/rayquaza.4bpp.lz"); -// for some reason there are an extra 0xC bytes at the end of the original rayquaza_tail.4bpp, so in order to produce the correct lz, -// we have to cat the bytes at the end with a make rule. not sure why those bytes are there, it may have been a bug in Game Freak's software. -const u32 gRaySceneDescends_RayquazaTail_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/rayquaza_tail_fix.4bpp.lz"); +const u32 gRaySceneDescends_RayquazaTail_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/rayquaza_tail.4bpp.lz"); const u32 gRaySceneDescends_Bg_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/bg.4bpp.lz"); const u32 gRaySceneDescends_Light_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/light.4bpp.lz"); // uses pal 2 of gRaySceneDescends_Bg_Pal const u32 gRaySceneDescends_Bg_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/bg.gbapal.lz"); diff --git a/src/data/heal_locations_pkm_center.h b/src/data/heal_locations_pkm_center.h index 58be0be05ed6..278f5d68b0a4 100644 --- a/src/data/heal_locations_pkm_center.h +++ b/src/data/heal_locations_pkm_center.h @@ -24,7 +24,7 @@ static const struct HealLocation sHealLocationsPokemonCenter[HEAL_LOCATION_COUNT }, [HEAL_LOCATION_SLATEPORT_CITY - 1] = { - .group = MAP_GROUP(SLATEPORT_CITY_POKEMON_CENTER_1F), + .group = MAP_GROUP(SLATEPORT_CITY_POKEMON_CENTER_1F), .map = MAP_NUM(SLATEPORT_CITY_POKEMON_CENTER_1F), DEFAULT_POKEMON_CENTER_COORDS, }, diff --git a/src/data/items.h b/src/data/items.h index 27d98298995f..c3d8469e68fa 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -12262,7 +12262,7 @@ const struct Item gItemsInfo[] = .importance = 1, .pocket = POCKET_KEY_ITEMS, .type = ITEM_USE_BAG_MENU, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .fieldUseFunc = ItemUseOutOfBattle_TownMap, .iconPic = gItemIcon_TownMap, .iconPalette = gItemIconPalette_TownMap, }, @@ -12442,7 +12442,8 @@ const struct Item gItemsInfo[] = .importance = 1, .pocket = POCKET_KEY_ITEMS, .type = ITEM_USE_BAG_MENU, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .fieldUseFunc = ItemUseOutOfBattle_PokeFlute, + .battleUsage = EFFECT_ITEM_USE_POKE_FLUTE, .iconPic = gItemIcon_PokeFlute, .iconPalette = gItemIconPalette_PokeFlute, }, @@ -13653,6 +13654,8 @@ const struct Item gItemsInfo[] = { .name = _("Cornerstone Mask"), .price = 0, + .holdEffect = HOLD_EFFECT_OGERPON_MASK, + .holdEffectParam = 20, .description = COMPOUND_STRING( "Allows Ogerpon to\n" "wield the Rock-\n" @@ -13668,6 +13671,8 @@ const struct Item gItemsInfo[] = { .name = _("Wellspring Mask"), .price = 0, + .holdEffect = HOLD_EFFECT_OGERPON_MASK, + .holdEffectParam = 20, .description = COMPOUND_STRING( "Allows Ogerpon to\n" "wield the Water-\n" @@ -13683,6 +13688,8 @@ const struct Item gItemsInfo[] = { .name = _("Hearthflame Mask"), .price = 0, + .holdEffect = HOLD_EFFECT_OGERPON_MASK, + .holdEffectParam = 20, .description = COMPOUND_STRING( "Allows Ogerpon to\n" "wield the Fire-\n" @@ -13855,6 +13862,7 @@ const struct Item gItemsInfo[] = .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, + .effect = gItemEffect_FullHeal, .flingPower = 30, .iconPic = gItemIcon_JubilifeMuffin, .iconPalette = gItemIconPalette_JubilifeMuffin, diff --git a/src/data/moves_info.h b/src/data/moves_info.h index 6dac60de27f7..f42886bf61cd 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -1932,8 +1932,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = { .name = COMPOUND_STRING("Growth"), .description = COMPOUND_STRING( + #if B_GROWTH_STAT_RAISE >= GEN_5 + "Forces the body to grow,\n" + "raising Attack and Sp. Atk."), + #else "Forces the body to grow\n" "and heightens Sp. Atk."), + #endif .effect = B_GROWTH_STAT_RAISE >= GEN_5 ? EFFECT_GROWTH : EFFECT_SPECIAL_ATTACK_UP, .power = 0, .type = TYPE_NORMAL, @@ -4500,7 +4505,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 30, - .target = MOVE_TARGET_USER, + .target = B_UPDATED_MOVE_DATA >= GEN_5 ? MOVE_TARGET_SELECTED : MOVE_TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RECOVER_HP }, @@ -19320,7 +19325,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .description = COMPOUND_STRING( "Boosts a user's stats\n" "depending on Tatsugiri."), - .effect = EFFECT_PLACEHOLDER, // EFFECT_ORDER_UP + .effect = EFFECT_ORDER_UP, .power = 80, .type = TYPE_DRAGON, .accuracy = 100, @@ -19330,6 +19335,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .category = DAMAGE_CATEGORY_PHYSICAL, .mirrorMoveBanned = TRUE, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_ORDER_UP, + .self = TRUE, + .chance = 100, + }), .battleAnimScript = gBattleAnimMove_OrderUp, }, diff --git a/src/data/object_events/movement_action_func_tables.h b/src/data/object_events/movement_action_func_tables.h index a605b3f0b2d4..dda5ff399171 100755 --- a/src/data/object_events/movement_action_func_tables.h +++ b/src/data/object_events/movement_action_func_tables.h @@ -266,6 +266,11 @@ u8 MovementAction_FlyUp_Step1(struct ObjectEvent *, struct Sprite *); u8 MovementAction_Fly_Finish(struct ObjectEvent *, struct Sprite *); u8 MovementAction_FlyDown_Step0(struct ObjectEvent *, struct Sprite *); u8 MovementAction_FlyDown_Step1(struct ObjectEvent *, struct Sprite *); +u8 MovementActionFunc_RunSlowDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); +u8 MovementActionFunc_RunSlowUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); +u8 MovementActionFunc_RunSlowLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); +u8 MovementActionFunc_RunSlowRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); +u8 MovementActionFunc_RunSlow_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); u8 (*const gMovementActionFuncs_FaceDown[])(struct ObjectEvent *, struct Sprite *); u8 (*const gMovementActionFuncs_FaceUp[])(struct ObjectEvent *, struct Sprite *); @@ -429,6 +434,10 @@ u8 (*const gMovementActionFuncs_FlyUp[])(struct ObjectEvent *, struct Sprite *); u8 (*const gMovementActionFuncs_FlyDown[])(struct ObjectEvent *, struct Sprite *); u8 (*const gMovementActionFuncs_EmoteX[])(struct ObjectEvent *, struct Sprite *); u8 (*const gMovementActionFuncs_EmoteDoubleExclMark[])(struct ObjectEvent *, struct Sprite *); +u8 (*const gMovementActionFuncs_RunDownSlow[])(struct ObjectEvent *, struct Sprite *); +u8 (*const gMovementActionFuncs_RunUpSlow[])(struct ObjectEvent *, struct Sprite *); +u8 (*const gMovementActionFuncs_RunLeftSlow[])(struct ObjectEvent *, struct Sprite *); +u8 (*const gMovementActionFuncs_RunRightSlow[])(struct ObjectEvent *, struct Sprite *); u8 (*const *const gMovementActionFuncs[])(struct ObjectEvent *, struct Sprite *) = { [MOVEMENT_ACTION_FACE_DOWN] = gMovementActionFuncs_FaceDown, @@ -593,6 +602,10 @@ u8 (*const *const gMovementActionFuncs[])(struct ObjectEvent *, struct Sprite *) [MOVEMENT_ACTION_EMOTE_DOUBLE_EXCL_MARK] = gMovementActionFuncs_EmoteDoubleExclMark, [MOVEMENT_ACTION_EXIT_POKEBALL] = gMovementActionFuncs_ExitPokeball, [MOVEMENT_ACTION_ENTER_POKEBALL] = gMovementActionFuncs_EnterPokeball, + [MOVEMENT_ACTION_RUN_DOWN_SLOW] = gMovementActionFuncs_RunDownSlow, + [MOVEMENT_ACTION_RUN_UP_SLOW] = gMovementActionFuncs_RunUpSlow, + [MOVEMENT_ACTION_RUN_LEFT_SLOW] = gMovementActionFuncs_RunLeftSlow, + [MOVEMENT_ACTION_RUN_RIGHT_SLOW] = gMovementActionFuncs_RunRightSlow, }; u8 (*const gMovementActionFuncs_FaceDown[])(struct ObjectEvent *, struct Sprite *) = { @@ -1554,3 +1567,27 @@ u8 (*const gMovementActionFuncs_EmoteDoubleExclMark[])(struct ObjectEvent *, str MovementAction_EmoteDoubleExclamationMark_Step0, MovementAction_Finish, }; + +u8 (*const gMovementActionFuncs_RunDownSlow[])(struct ObjectEvent *, struct Sprite *) = { + MovementActionFunc_RunSlowDown_Step0, + MovementActionFunc_RunSlow_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_RunUpSlow[])(struct ObjectEvent *, struct Sprite *) = { + MovementActionFunc_RunSlowUp_Step0, + MovementActionFunc_RunSlow_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_RunLeftSlow[])(struct ObjectEvent *, struct Sprite *) = { + MovementActionFunc_RunSlowLeft_Step0, + MovementActionFunc_RunSlow_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_RunRightSlow[])(struct ObjectEvent *, struct Sprite *) = { + MovementActionFunc_RunSlowRight_Step0, + MovementActionFunc_RunSlow_Step1, + MovementAction_PauseSpriteAnim, +}; diff --git a/src/data/object_events/movement_type_func_tables.h b/src/data/object_events/movement_type_func_tables.h index 749c14969c58..35180f5b3ca4 100755 --- a/src/data/object_events/movement_type_func_tables.h +++ b/src/data/object_events/movement_type_func_tables.h @@ -2,7 +2,7 @@ u8 (*const gMovementTypeFuncs_WanderAround[])(struct ObjectEvent *, struct Sprit MovementType_WanderAround_Step0, MovementType_WanderAround_Step1, MovementType_WanderAround_Step2, - MovementType_WanderAround_Step3, + MovementType_Wander_Step3, MovementType_WanderAround_Step4, MovementType_WanderAround_Step5, MovementType_WanderAround_Step6, @@ -36,7 +36,7 @@ u8 (*const gMovementTypeFuncs_WanderUpAndDown[])(struct ObjectEvent *, struct Sp MovementType_WanderUpAndDown_Step0, MovementType_WanderUpAndDown_Step1, MovementType_WanderUpAndDown_Step2, - MovementType_WanderUpAndDown_Step3, + MovementType_Wander_Step3, MovementType_WanderUpAndDown_Step4, MovementType_WanderUpAndDown_Step5, MovementType_WanderUpAndDown_Step6, @@ -48,7 +48,7 @@ u8 (*const gMovementTypeFuncs_WanderLeftAndRight[])(struct ObjectEvent *, struct MovementType_WanderLeftAndRight_Step0, MovementType_WanderLeftAndRight_Step1, MovementType_WanderLeftAndRight_Step2, - MovementType_WanderLeftAndRight_Step3, + MovementType_Wander_Step3, MovementType_WanderLeftAndRight_Step4, MovementType_WanderLeftAndRight_Step5, MovementType_WanderLeftAndRight_Step6, diff --git a/src/data/object_events/object_event_anims.h b/src/data/object_events/object_event_anims.h index bde3c3b0d5db..d6229e57c97e 100755 --- a/src/data/object_events/object_event_anims.h +++ b/src/data/object_events/object_event_anims.h @@ -1173,7 +1173,7 @@ const union AnimCmd *const sAnimTable_Following[] = { }; // Like the above, but has separate frames for facing right -static const union AnimCmd *const sAnimTable_Following_Asym[] = { +const union AnimCmd *const sAnimTable_Following_Asym[] = { [ANIM_STD_FACE_SOUTH] = sAnim_FaceSouth, [ANIM_STD_FACE_NORTH] = sAnim_FaceNorth2F, [ANIM_STD_FACE_WEST] = sAnim_FaceWest2F, diff --git a/src/data/object_events/object_event_pic_tables_followers.h b/src/data/object_events/object_event_pic_tables_followers.h index 1e20ef37983b..1164e92c52e3 100644 --- a/src/data/object_events/object_event_pic_tables_followers.h +++ b/src/data/object_events/object_event_pic_tables_followers.h @@ -13,6 +13,9 @@ static const struct SpriteFrameImage sPicTable_Ivysaur[] = { static const struct SpriteFrameImage sPicTable_Venusaur[] = { overworld_ascending_frames(gObjectEventPic_Venusaur, 4, 4), }; +static const struct SpriteFrameImage sPicTable_VenusaurF[] = { + overworld_ascending_frames(gObjectEventPic_VenusaurF, 4, 4), +}; #if P_MEGA_EVOLUTIONS /*static const struct SpriteFrameImage sPicTable_VenusaurMega[] = { overworld_ascending_frames(gObjectEventPic_VenusaurMega, 4, 4), @@ -82,6 +85,9 @@ static const struct SpriteFrameImage sPicTable_Metapod[] = { static const struct SpriteFrameImage sPicTable_Butterfree[] = { overworld_ascending_frames(gObjectEventPic_Butterfree, 4, 4), }; +static const struct SpriteFrameImage sPicTable_ButterfreeF[] = { + overworld_ascending_frames(gObjectEventPic_ButterfreeF, 4, 4), +}; #if P_GIGANTAMAX_FORMS /*static const struct SpriteFrameImage sPicTable_ButterfreeGigantamax[] = { overworld_ascending_frames(gObjectEventPic_ButterfreeGigantamax, 4, 4), @@ -127,9 +133,15 @@ static const struct SpriteFrameImage sPicTable_Pidgeot[] = { static const struct SpriteFrameImage sPicTable_Rattata[] = { overworld_ascending_frames(gObjectEventPic_Rattata, 4, 4), }; +static const struct SpriteFrameImage sPicTable_RattataF[] = { + overworld_ascending_frames(gObjectEventPic_RattataF, 4, 4), +}; static const struct SpriteFrameImage sPicTable_Raticate[] = { overworld_ascending_frames(gObjectEventPic_Raticate, 4, 4), }; +static const struct SpriteFrameImage sPicTable_RaticateF[] = { + overworld_ascending_frames(gObjectEventPic_RaticateF, 4, 4), +}; #if P_ALOLAN_FORMS static const struct SpriteFrameImage sPicTable_RattataAlolan[] = { overworld_ascending_frames(gObjectEventPic_RattataAlolan, 4, 4), @@ -170,6 +182,9 @@ static const struct SpriteFrameImage sPicTable_PichuSpikyEared[] = { static const struct SpriteFrameImage sPicTable_Pikachu[] = { overworld_ascending_frames(gObjectEventPic_Pikachu, 4, 4), }; +static const struct SpriteFrameImage sPicTable_PikachuF[] = { + overworld_ascending_frames(gObjectEventPic_PikachuF, 4, 4), +}; #if P_COSPLAY_PIKACHU_FORMS /*static const struct SpriteFrameImage sPicTable_PikachuCosplay[] = { overworld_ascending_frames(gObjectEventPic_PikachuCosplay, 4, 4), @@ -227,6 +242,9 @@ static const struct SpriteFrameImage sPicTable_PikachuWorldCap[] = { static const struct SpriteFrameImage sPicTable_Raichu[] = { overworld_ascending_frames(gObjectEventPic_Raichu, 4, 4), }; +static const struct SpriteFrameImage sPicTable_RaichuF[] = { + overworld_ascending_frames(gObjectEventPic_RaichuF, 4, 4), +}; #if P_ALOLAN_FORMS static const struct SpriteFrameImage sPicTable_RaichuAlolan[] = { overworld_ascending_frames(gObjectEventPic_RaichuAlolan, 4, 4), @@ -321,9 +339,15 @@ static const struct SpriteFrameImage sPicTable_Wigglytuff[] = { static const struct SpriteFrameImage sPicTable_Zubat[] = { overworld_ascending_frames(gObjectEventPic_Zubat, 4, 4), }; +static const struct SpriteFrameImage sPicTable_ZubatF[] = { + overworld_ascending_frames(gObjectEventPic_ZubatF, 4, 4), +}; static const struct SpriteFrameImage sPicTable_Golbat[] = { overworld_ascending_frames(gObjectEventPic_Golbat, 4, 4), }; +static const struct SpriteFrameImage sPicTable_GolbatF[] = { + overworld_ascending_frames(gObjectEventPic_GolbatF, 4, 4), +}; #if P_GEN_2_CROSS_EVOS static const struct SpriteFrameImage sPicTable_Crobat[] = { overworld_ascending_frames(gObjectEventPic_Crobat, 4, 4), @@ -338,9 +362,15 @@ static const struct SpriteFrameImage sPicTable_Oddish[] = { static const struct SpriteFrameImage sPicTable_Gloom[] = { overworld_ascending_frames(gObjectEventPic_Gloom, 4, 4), }; +static const struct SpriteFrameImage sPicTable_GloomF[] = { + overworld_ascending_frames(gObjectEventPic_GloomF, 4, 4), +}; static const struct SpriteFrameImage sPicTable_Vileplume[] = { overworld_ascending_frames(gObjectEventPic_Vileplume, 4, 4), }; +static const struct SpriteFrameImage sPicTable_VileplumeF[] = { + overworld_ascending_frames(gObjectEventPic_VileplumeF, 4, 4), +}; #if P_GEN_2_CROSS_EVOS static const struct SpriteFrameImage sPicTable_Bellossom[] = { overworld_ascending_frames(gObjectEventPic_Bellossom, 4, 4), @@ -469,7 +499,9 @@ static const struct SpriteFrameImage sPicTable_Poliwrath[] = { static const struct SpriteFrameImage sPicTable_Politoed[] = { overworld_ascending_frames(gObjectEventPic_Politoed, 4, 4), }; - +static const struct SpriteFrameImage sPicTable_PolitoedF[] = { + overworld_ascending_frames(gObjectEventPic_PolitoedF, 4, 4), +}; #endif //P_GEN_2_CROSS_EVOS #endif //P_FAMILY_POLIWAG @@ -480,9 +512,15 @@ static const struct SpriteFrameImage sPicTable_Abra[] = { static const struct SpriteFrameImage sPicTable_Kadabra[] = { overworld_ascending_frames(gObjectEventPic_Kadabra, 4, 4), }; +static const struct SpriteFrameImage sPicTable_KadabraF[] = { + overworld_ascending_frames(gObjectEventPic_KadabraF, 4, 4), +}; static const struct SpriteFrameImage sPicTable_Alakazam[] = { overworld_ascending_frames(gObjectEventPic_Alakazam, 4, 4), }; +static const struct SpriteFrameImage sPicTable_AlakazamF[] = { + overworld_ascending_frames(gObjectEventPic_AlakazamF, 4, 4), +}; #if P_MEGA_EVOLUTIONS /*static const struct SpriteFrameImage sPicTable_AlakazamMega[] = { overworld_ascending_frames(gObjectEventPic_AlakazamMega, 4, 4), @@ -634,9 +672,15 @@ static const struct SpriteFrameImage sPicTable_Sirfetchd[] = { static const struct SpriteFrameImage sPicTable_Doduo[] = { overworld_ascending_frames(gObjectEventPic_Doduo, 4, 4), }; +static const struct SpriteFrameImage sPicTable_DoduoF[] = { + overworld_ascending_frames(gObjectEventPic_DoduoF, 4, 4), +}; static const struct SpriteFrameImage sPicTable_Dodrio[] = { overworld_ascending_frames(gObjectEventPic_Dodrio, 4, 4), }; +static const struct SpriteFrameImage sPicTable_DodrioF[] = { + overworld_ascending_frames(gObjectEventPic_DodrioF, 4, 4), +}; #endif //P_FAMILY_DODUO #if P_FAMILY_SEEL @@ -704,6 +748,9 @@ static const struct SpriteFrameImage sPicTable_Onix[] = { static const struct SpriteFrameImage sPicTable_Steelix[] = { overworld_ascending_frames(gObjectEventPic_Steelix, 4, 4), }; +static const struct SpriteFrameImage sPicTable_SteelixF[] = { + overworld_ascending_frames(gObjectEventPic_SteelixF, 4, 4), +}; #if P_MEGA_EVOLUTIONS /*static const struct SpriteFrameImage sPicTable_SteelixMega[] = { overworld_ascending_frames(gObjectEventPic_SteelixMega, 4, 4), @@ -719,6 +766,9 @@ static const struct SpriteFrameImage sPicTable_Drowzee[] = { static const struct SpriteFrameImage sPicTable_Hypno[] = { overworld_ascending_frames(gObjectEventPic_Hypno, 4, 4), }; +static const struct SpriteFrameImage sPicTable_HypnoF[] = { + overworld_ascending_frames(gObjectEventPic_HypnoF, 4, 4), +}; #endif //P_FAMILY_DROWZEE #if P_FAMILY_KRABBY @@ -828,14 +878,22 @@ static const struct SpriteFrameImage sPicTable_WeezingGalarian[] = { static const struct SpriteFrameImage sPicTable_Rhyhorn[] = { overworld_ascending_frames(gObjectEventPic_Rhyhorn, 4, 4), }; +static const struct SpriteFrameImage sPicTable_RhyhornF[] = { + overworld_ascending_frames(gObjectEventPic_RhyhornF, 4, 4), +}; static const struct SpriteFrameImage sPicTable_Rhydon[] = { overworld_ascending_frames(gObjectEventPic_Rhydon, 4, 4), }; +static const struct SpriteFrameImage sPicTable_RhydonF[] = { + overworld_ascending_frames(gObjectEventPic_RhydonF, 4, 4), +}; #if P_GEN_4_CROSS_EVOS static const struct SpriteFrameImage sPicTable_Rhyperior[] = { overworld_ascending_frames(gObjectEventPic_Rhyperior, 4, 4), }; - +static const struct SpriteFrameImage sPicTable_RhyperiorF[] = { + overworld_ascending_frames(gObjectEventPic_RhyperiorF, 4, 4), +}; #endif //P_GEN_4_CROSS_EVOS #endif //P_FAMILY_RHYHORN @@ -863,7 +921,9 @@ static const struct SpriteFrameImage sPicTable_Tangela[] = { static const struct SpriteFrameImage sPicTable_Tangrowth[] = { overworld_ascending_frames(gObjectEventPic_Tangrowth, 4, 4), }; - +static const struct SpriteFrameImage sPicTable_TangrowthF[] = { + overworld_ascending_frames(gObjectEventPic_TangrowthF, 4, 4), +}; #endif //P_GEN_4_CROSS_EVOS #endif //P_FAMILY_TANGELA @@ -896,9 +956,15 @@ static const struct SpriteFrameImage sPicTable_Kingdra[] = { static const struct SpriteFrameImage sPicTable_Goldeen[] = { overworld_ascending_frames(gObjectEventPic_Goldeen, 4, 4), }; +static const struct SpriteFrameImage sPicTable_GoldeenF[] = { + overworld_ascending_frames(gObjectEventPic_GoldeenF, 4, 4), +}; static const struct SpriteFrameImage sPicTable_Seaking[] = { overworld_ascending_frames(gObjectEventPic_Seaking, 4, 4), }; +static const struct SpriteFrameImage sPicTable_SeakingF[] = { + overworld_ascending_frames(gObjectEventPic_SeakingF, 4, 4), +}; #endif //P_FAMILY_GOLDEEN #if P_FAMILY_STARYU @@ -933,10 +999,16 @@ static const struct SpriteFrameImage sPicTable_MrRime[] = { static const struct SpriteFrameImage sPicTable_Scyther[] = { overworld_ascending_frames(gObjectEventPic_Scyther, 4, 4), }; +static const struct SpriteFrameImage sPicTable_ScytherF[] = { + overworld_ascending_frames(gObjectEventPic_ScytherF, 4, 4), +}; #if P_GEN_2_CROSS_EVOS static const struct SpriteFrameImage sPicTable_Scizor[] = { overworld_ascending_frames(gObjectEventPic_Scizor, 4, 4), }; +static const struct SpriteFrameImage sPicTable_ScizorF[] = { + overworld_ascending_frames(gObjectEventPic_ScizorF, 4, 4), +}; #if P_MEGA_EVOLUTIONS /*static const struct SpriteFrameImage sPicTable_ScizorMega[] = { overworld_ascending_frames(gObjectEventPic_ScizorMega, 4, 4), @@ -1026,9 +1098,15 @@ static const struct SpriteFrameImage sPicTable_TaurosPaldeanAquaBreed[] = { static const struct SpriteFrameImage sPicTable_Magikarp[] = { overworld_ascending_frames(gObjectEventPic_Magikarp, 4, 4), }; +static const struct SpriteFrameImage sPicTable_MagikarpF[] = { + overworld_ascending_frames(gObjectEventPic_MagikarpF, 4, 4), +}; static const struct SpriteFrameImage sPicTable_Gyarados[] = { overworld_ascending_frames(gObjectEventPic_Gyarados, 4, 4), }; +static const struct SpriteFrameImage sPicTable_GyaradosF[] = { + overworld_ascending_frames(gObjectEventPic_GyaradosF, 4, 4), +}; #if P_MEGA_EVOLUTIONS /*static const struct SpriteFrameImage sPicTable_GyaradosMega[] = { overworld_ascending_frames(gObjectEventPic_GyaradosMega, 4, 4), @@ -1057,6 +1135,9 @@ static const struct SpriteFrameImage sPicTable_Ditto[] = { static const struct SpriteFrameImage sPicTable_Eevee[] = { overworld_ascending_frames(gObjectEventPic_Eevee, 4, 4), }; +static const struct SpriteFrameImage sPicTable_EeveeF[] = { + overworld_ascending_frames(gObjectEventPic_EeveeF, 4, 4), +}; #if P_GIGANTAMAX_FORMS /*static const struct SpriteFrameImage sPicTable_EeveeGigantamax[] = { overworld_ascending_frames(gObjectEventPic_EeveeGigantamax, 4, 4), @@ -1233,6 +1314,9 @@ static const struct SpriteFrameImage sPicTable_Bayleef[] = { static const struct SpriteFrameImage sPicTable_Meganium[] = { overworld_ascending_frames(gObjectEventPic_Meganium, 4, 4), }; +static const struct SpriteFrameImage sPicTable_MeganiumF[] = { + overworld_ascending_frames(gObjectEventPic_MeganiumF, 4, 4), +}; #endif //P_FAMILY_CHIKORITA #if P_FAMILY_CYNDAQUIL @@ -1286,9 +1370,15 @@ static const struct SpriteFrameImage sPicTable_Noctowl[] = { static const struct SpriteFrameImage sPicTable_Ledyba[] = { overworld_ascending_frames(gObjectEventPic_Ledyba, 4, 4), }; +static const struct SpriteFrameImage sPicTable_LedybaF[] = { + overworld_ascending_frames(gObjectEventPic_LedybaF, 4, 4), +}; static const struct SpriteFrameImage sPicTable_Ledian[] = { overworld_ascending_frames(gObjectEventPic_Ledian, 4, 4), }; +static const struct SpriteFrameImage sPicTable_LedianF[] = { + overworld_ascending_frames(gObjectEventPic_LedianF, 4, 4), +}; #endif //P_FAMILY_LEDYBA #if P_FAMILY_SPINARAK @@ -1330,6 +1420,9 @@ static const struct SpriteFrameImage sPicTable_Natu[] = { static const struct SpriteFrameImage sPicTable_Xatu[] = { overworld_ascending_frames(gObjectEventPic_Xatu, 4, 4), }; +static const struct SpriteFrameImage sPicTable_XatuF[] = { + overworld_ascending_frames(gObjectEventPic_XatuF, 4, 4), +}; #endif //P_FAMILY_NATU #if P_FAMILY_MAREEP @@ -1372,6 +1465,9 @@ static const struct SpriteFrameImage sPicTable_Bonsly[] = { static const struct SpriteFrameImage sPicTable_Sudowoodo[] = { overworld_ascending_frames(gObjectEventPic_Sudowoodo, 4, 4), }; +static const struct SpriteFrameImage sPicTable_SudowoodoF[] = { + overworld_ascending_frames(gObjectEventPic_SudowoodoF, 4, 4), +}; #endif //P_FAMILY_SUDOWOODO #if P_FAMILY_HOPPIP @@ -1390,11 +1486,16 @@ static const struct SpriteFrameImage sPicTable_Jumpluff[] = { static const struct SpriteFrameImage sPicTable_Aipom[] = { overworld_ascending_frames(gObjectEventPic_Aipom, 4, 4), }; +static const struct SpriteFrameImage sPicTable_AipomF[] = { + overworld_ascending_frames(gObjectEventPic_AipomF, 4, 4), +}; #if P_GEN_4_CROSS_EVOS static const struct SpriteFrameImage sPicTable_Ambipom[] = { overworld_ascending_frames(gObjectEventPic_Ambipom, 4, 4), }; - +static const struct SpriteFrameImage sPicTable_AmbipomF[] = { + overworld_ascending_frames(gObjectEventPic_AmbipomF, 4, 4), +}; #endif //P_GEN_4_CROSS_EVOS #endif //P_FAMILY_AIPOM @@ -1422,9 +1523,15 @@ static const struct SpriteFrameImage sPicTable_Yanmega[] = { static const struct SpriteFrameImage sPicTable_Wooper[] = { overworld_ascending_frames(gObjectEventPic_Wooper, 4, 4), }; +static const struct SpriteFrameImage sPicTable_WooperF[] = { + overworld_ascending_frames(gObjectEventPic_WooperF, 4, 4), +}; static const struct SpriteFrameImage sPicTable_Quagsire[] = { overworld_ascending_frames(gObjectEventPic_Quagsire, 4, 4), }; +static const struct SpriteFrameImage sPicTable_QuagsireF[] = { + overworld_ascending_frames(gObjectEventPic_QuagsireF, 4, 4), +}; #if P_PALDEAN_FORMS static const struct SpriteFrameImage sPicTable_WooperPaldean[] = { overworld_ascending_frames(gObjectEventPic_WooperPaldean, 4, 4), @@ -1439,6 +1546,9 @@ static const struct SpriteFrameImage sPicTable_Clodsire[] = { static const struct SpriteFrameImage sPicTable_Murkrow[] = { overworld_ascending_frames(gObjectEventPic_Murkrow, 4, 4), }; +static const struct SpriteFrameImage sPicTable_MurkrowF[] = { + overworld_ascending_frames(gObjectEventPic_MurkrowF, 4, 4), +}; #if P_GEN_4_CROSS_EVOS static const struct SpriteFrameImage sPicTable_Honchkrow[] = { overworld_ascending_frames(gObjectEventPic_Honchkrow, 4, 4), @@ -1553,12 +1663,18 @@ static const struct SpriteFrameImage sPicTable_Wynaut[] = { static const struct SpriteFrameImage sPicTable_Wobbuffet[] = { overworld_ascending_frames(gObjectEventPic_Wobbuffet, 4, 4), }; +static const struct SpriteFrameImage sPicTable_WobbuffetF[] = { + overworld_ascending_frames(gObjectEventPic_WobbuffetF, 4, 4), +}; #endif //P_FAMILY_WOBBUFFET #if P_FAMILY_GIRAFARIG static const struct SpriteFrameImage sPicTable_Girafarig[] = { overworld_ascending_frames(gObjectEventPic_Girafarig, 4, 4), }; +static const struct SpriteFrameImage sPicTable_GirafarigF[] = { + overworld_ascending_frames(gObjectEventPic_GirafarigF, 4, 4), +}; #if P_GEN_9_CROSS_EVOS static const struct SpriteFrameImage sPicTable_Farigiraf[] = { overworld_ascending_frames(gObjectEventPic_Farigiraf, 4, 4), @@ -1595,6 +1711,9 @@ static const struct SpriteFrameImage sPicTable_DudunsparceThreeSegment[] = { static const struct SpriteFrameImage sPicTable_Gligar[] = { overworld_ascending_frames(gObjectEventPic_Gligar, 4, 4), }; +static const struct SpriteFrameImage sPicTable_GligarF[] = { + overworld_ascending_frames(gObjectEventPic_GligarF, 4, 4), +}; #if P_GEN_4_CROSS_EVOS static const struct SpriteFrameImage sPicTable_Gliscor[] = { overworld_ascending_frames(gObjectEventPic_Gliscor, 4, 4), @@ -1635,6 +1754,9 @@ static const struct SpriteFrameImage sPicTable_Shuckle[] = { static const struct SpriteFrameImage sPicTable_Heracross[] = { overworld_ascending_frames(gObjectEventPic_Heracross, 4, 4), }; +static const struct SpriteFrameImage sPicTable_HeracrossF[] = { + overworld_ascending_frames(gObjectEventPic_HeracrossF, 4, 4), +}; #if P_MEGA_EVOLUTIONS /*static const struct SpriteFrameImage sPicTable_HeracrossMega[] = { overworld_ascending_frames(gObjectEventPic_HeracrossMega, 4, 4), @@ -1646,17 +1768,25 @@ static const struct SpriteFrameImage sPicTable_Heracross[] = { static const struct SpriteFrameImage sPicTable_Sneasel[] = { overworld_ascending_frames(gObjectEventPic_Sneasel, 4, 4), }; +static const struct SpriteFrameImage sPicTable_SneaselF[] = { + overworld_ascending_frames(gObjectEventPic_SneaselF, 4, 4), +}; #if P_GEN_4_CROSS_EVOS static const struct SpriteFrameImage sPicTable_Weavile[] = { overworld_ascending_frames(gObjectEventPic_Weavile, 4, 4), }; - +static const struct SpriteFrameImage sPicTable_WeavileF[] = { + overworld_ascending_frames(gObjectEventPic_WeavileF, 4, 4), +}; #endif //P_GEN_4_CROSS_EVOS #if P_HISUIAN_FORMS static const struct SpriteFrameImage sPicTable_SneaselHisuian[] = { overworld_ascending_frames(gObjectEventPic_SneaselHisuian, 4, 4), }; +static const struct SpriteFrameImage sPicTable_SneaselHisuianF[] = { + overworld_ascending_frames(gObjectEventPic_SneaselHisuianF, 4, 4), +}; static const struct SpriteFrameImage sPicTable_Sneasler[] = { overworld_ascending_frames(gObjectEventPic_Sneasler, 4, 4), }; @@ -1670,6 +1800,9 @@ static const struct SpriteFrameImage sPicTable_Teddiursa[] = { static const struct SpriteFrameImage sPicTable_Ursaring[] = { overworld_ascending_frames(gObjectEventPic_Ursaring, 4, 4), }; +static const struct SpriteFrameImage sPicTable_UrsaringF[] = { + overworld_ascending_frames(gObjectEventPic_UrsaringF, 4, 4), +}; #if P_GEN_8_CROSS_EVOS static const struct SpriteFrameImage sPicTable_Ursaluna[] = { overworld_ascending_frames(gObjectEventPic_Ursaluna, 4, 4), @@ -1696,11 +1829,16 @@ static const struct SpriteFrameImage sPicTable_Swinub[] = { static const struct SpriteFrameImage sPicTable_Piloswine[] = { overworld_ascending_frames(gObjectEventPic_Piloswine, 4, 4), }; +static const struct SpriteFrameImage sPicTable_PiloswineF[] = { + overworld_ascending_frames(gObjectEventPic_PiloswineF, 4, 4), +}; #if P_GEN_4_CROSS_EVOS static const struct SpriteFrameImage sPicTable_Mamoswine[] = { overworld_ascending_frames(gObjectEventPic_Mamoswine, 4, 4), }; - +static const struct SpriteFrameImage sPicTable_MamoswineF[] = { + overworld_ascending_frames(gObjectEventPic_MamoswineF, 4, 4), +}; #endif //P_GEN_4_CROSS_EVOS #endif //P_FAMILY_SWINUB @@ -1725,6 +1863,9 @@ static const struct SpriteFrameImage sPicTable_Remoraid[] = { static const struct SpriteFrameImage sPicTable_Octillery[] = { overworld_ascending_frames(gObjectEventPic_Octillery, 4, 4), }; +static const struct SpriteFrameImage sPicTable_OctilleryF[] = { + overworld_ascending_frames(gObjectEventPic_OctilleryF, 4, 4), +}; #endif //P_FAMILY_REMORAID #if P_FAMILY_DELIBIRD @@ -1757,6 +1898,9 @@ static const struct SpriteFrameImage sPicTable_Houndour[] = { static const struct SpriteFrameImage sPicTable_Houndoom[] = { overworld_ascending_frames(gObjectEventPic_Houndoom, 4, 4), }; +static const struct SpriteFrameImage sPicTable_HoundoomF[] = { + overworld_ascending_frames(gObjectEventPic_HoundoomF, 4, 4), +}; #if P_MEGA_EVOLUTIONS /*static const struct SpriteFrameImage sPicTable_HoundoomMega[] = { overworld_ascending_frames(gObjectEventPic_HoundoomMega, 4, 4), @@ -1771,6 +1915,9 @@ static const struct SpriteFrameImage sPicTable_Phanpy[] = { static const struct SpriteFrameImage sPicTable_Donphan[] = { overworld_ascending_frames(gObjectEventPic_Donphan, 4, 4), }; +static const struct SpriteFrameImage sPicTable_DonphanF[] = { + overworld_ascending_frames(gObjectEventPic_DonphanF, 4, 4), +}; #endif //P_FAMILY_PHANPY #if P_FAMILY_STANTLER @@ -1870,12 +2017,21 @@ static const struct SpriteFrameImage sPicTable_Sceptile[] = { static const struct SpriteFrameImage sPicTable_Torchic[] = { overworld_ascending_frames(gObjectEventPic_Torchic, 4, 4), }; +static const struct SpriteFrameImage sPicTable_TorchicF[] = { + overworld_ascending_frames(gObjectEventPic_TorchicF, 4, 4), +}; static const struct SpriteFrameImage sPicTable_Combusken[] = { overworld_ascending_frames(gObjectEventPic_Combusken, 4, 4), }; +static const struct SpriteFrameImage sPicTable_CombuskenF[] = { + overworld_ascending_frames(gObjectEventPic_CombuskenF, 4, 4), +}; static const struct SpriteFrameImage sPicTable_Blaziken[] = { overworld_ascending_frames(gObjectEventPic_Blaziken, 4, 4), }; +static const struct SpriteFrameImage sPicTable_BlazikenF[] = { + overworld_ascending_frames(gObjectEventPic_BlazikenF, 4, 4), +}; #if P_MEGA_EVOLUTIONS /*static const struct SpriteFrameImage sPicTable_BlazikenMega[] = { overworld_ascending_frames(gObjectEventPic_BlazikenMega, 4, 4), @@ -1939,12 +2095,18 @@ static const struct SpriteFrameImage sPicTable_Silcoon[] = { static const struct SpriteFrameImage sPicTable_Beautifly[] = { overworld_ascending_frames(gObjectEventPic_Beautifly, 4, 4), }; +static const struct SpriteFrameImage sPicTable_BeautiflyF[] = { + overworld_ascending_frames(gObjectEventPic_BeautiflyF, 4, 4), +}; static const struct SpriteFrameImage sPicTable_Cascoon[] = { overworld_ascending_frames(gObjectEventPic_Cascoon, 4, 4), }; static const struct SpriteFrameImage sPicTable_Dustox[] = { overworld_ascending_frames(gObjectEventPic_Dustox, 4, 4), }; +static const struct SpriteFrameImage sPicTable_DustoxF[] = { + overworld_ascending_frames(gObjectEventPic_DustoxF, 4, 4), +}; #endif //P_FAMILY_WURMPLE #if P_FAMILY_LOTAD @@ -1957,6 +2119,9 @@ static const struct SpriteFrameImage sPicTable_Lombre[] = { static const struct SpriteFrameImage sPicTable_Ludicolo[] = { overworld_ascending_frames(gObjectEventPic_Ludicolo, 4, 4), }; +static const struct SpriteFrameImage sPicTable_LudicoloF[] = { + overworld_ascending_frames(gObjectEventPic_LudicoloF, 4, 4), +}; #endif //P_FAMILY_LOTAD #if P_FAMILY_SEEDOT @@ -1966,9 +2131,15 @@ static const struct SpriteFrameImage sPicTable_Seedot[] = { static const struct SpriteFrameImage sPicTable_Nuzleaf[] = { overworld_ascending_frames(gObjectEventPic_Nuzleaf, 4, 4), }; +static const struct SpriteFrameImage sPicTable_NuzleafF[] = { + overworld_ascending_frames(gObjectEventPic_NuzleafF, 4, 4), +}; static const struct SpriteFrameImage sPicTable_Shiftry[] = { overworld_ascending_frames(gObjectEventPic_Shiftry, 4, 4), }; +static const struct SpriteFrameImage sPicTable_ShiftryF[] = { + overworld_ascending_frames(gObjectEventPic_ShiftryF, 4, 4), +}; #endif //P_FAMILY_SEEDOT #if P_FAMILY_TAILLOW @@ -2143,9 +2314,15 @@ static const struct SpriteFrameImage sPicTable_Aggron[] = { static const struct SpriteFrameImage sPicTable_Meditite[] = { overworld_ascending_frames(gObjectEventPic_Meditite, 4, 4), }; +static const struct SpriteFrameImage sPicTable_MedititeF[] = { + overworld_ascending_frames(gObjectEventPic_MedititeF, 4, 4), +}; static const struct SpriteFrameImage sPicTable_Medicham[] = { overworld_ascending_frames(gObjectEventPic_Medicham, 4, 4), }; +static const struct SpriteFrameImage sPicTable_MedichamF[] = { + overworld_ascending_frames(gObjectEventPic_MedichamF, 4, 4), +}; #if P_MEGA_EVOLUTIONS /*static const struct SpriteFrameImage sPicTable_MedichamMega[] = { overworld_ascending_frames(gObjectEventPic_MedichamMega, 4, 4), @@ -2197,10 +2374,16 @@ static const struct SpriteFrameImage sPicTable_Budew[] = { static const struct SpriteFrameImage sPicTable_Roselia[] = { overworld_ascending_frames(gObjectEventPic_Roselia, 4, 4), }; +static const struct SpriteFrameImage sPicTable_RoseliaF[] = { + overworld_ascending_frames(gObjectEventPic_RoseliaF, 4, 4), +}; #if P_GEN_4_CROSS_EVOS static const struct SpriteFrameImage sPicTable_Roserade[] = { overworld_ascending_frames(gObjectEventPic_Roserade, 4, 4), }; +static const struct SpriteFrameImage sPicTable_RoseradeF[] = { + overworld_ascending_frames(gObjectEventPic_RoseradeF, 4, 4), +}; #endif //P_GEN_4_CROSS_EVOS #endif //P_FAMILY_ROSELIA @@ -2209,9 +2392,15 @@ static const struct SpriteFrameImage sPicTable_Roserade[] = { static const struct SpriteFrameImage sPicTable_Gulpin[] = { overworld_ascending_frames(gObjectEventPic_Gulpin, 4, 4), }; +static const struct SpriteFrameImage sPicTable_GulpinF[] = { + overworld_ascending_frames(gObjectEventPic_GulpinF, 4, 4), +}; static const struct SpriteFrameImage sPicTable_Swalot[] = { overworld_ascending_frames(gObjectEventPic_Swalot, 4, 4), }; +static const struct SpriteFrameImage sPicTable_SwalotF[] = { + overworld_ascending_frames(gObjectEventPic_SwalotF, 4, 4), +}; #endif //P_FAMILY_GULPIN #if P_FAMILY_CARVANHA @@ -2241,9 +2430,15 @@ static const struct SpriteFrameImage sPicTable_Wailord[] = { static const struct SpriteFrameImage sPicTable_Numel[] = { overworld_ascending_frames(gObjectEventPic_Numel, 4, 4), }; +static const struct SpriteFrameImage sPicTable_NumelF[] = { + overworld_ascending_frames(gObjectEventPic_NumelF, 4, 4), +}; static const struct SpriteFrameImage sPicTable_Camerupt[] = { overworld_ascending_frames(gObjectEventPic_Camerupt, 4, 4), }; +static const struct SpriteFrameImage sPicTable_CameruptF[] = { + overworld_ascending_frames(gObjectEventPic_CameruptF, 4, 4), +}; #if P_MEGA_EVOLUTIONS /*static const struct SpriteFrameImage sPicTable_CameruptMega[] = { overworld_ascending_frames(gObjectEventPic_CameruptMega, 4, 4), @@ -2291,6 +2486,9 @@ static const struct SpriteFrameImage sPicTable_Cacnea[] = { static const struct SpriteFrameImage sPicTable_Cacturne[] = { overworld_ascending_frames(gObjectEventPic_Cacturne, 4, 4), }; +static const struct SpriteFrameImage sPicTable_CacturneF[] = { + overworld_ascending_frames(gObjectEventPic_CacturneF, 4, 4), +}; #endif //P_FAMILY_CACNEA #if P_FAMILY_SWABLU @@ -2383,6 +2581,9 @@ static const struct SpriteFrameImage sPicTable_Feebas[] = { static const struct SpriteFrameImage sPicTable_Milotic[] = { overworld_ascending_frames(gObjectEventPic_Milotic, 4, 4), }; +static const struct SpriteFrameImage sPicTable_MiloticF[] = { + overworld_ascending_frames(gObjectEventPic_MiloticF, 4, 4), +}; #endif //P_FAMILY_FEEBAS #if P_FAMILY_CASTFORM @@ -2510,6 +2711,9 @@ static const struct SpriteFrameImage sPicTable_Gorebyss[] = { static const struct SpriteFrameImage sPicTable_Relicanth[] = { overworld_ascending_frames(gObjectEventPic_Relicanth, 4, 4), }; +static const struct SpriteFrameImage sPicTable_RelicanthF[] = { + overworld_ascending_frames(gObjectEventPic_RelicanthF, 4, 4), +}; #endif //P_FAMILY_RELICANTH #if P_FAMILY_LUVDISC @@ -2686,42 +2890,72 @@ static const struct SpriteFrameImage sPicTable_Empoleon[] = { static const struct SpriteFrameImage sPicTable_Starly[] = { overworld_ascending_frames(gObjectEventPic_Starly, 4, 4), }; +static const struct SpriteFrameImage sPicTable_StarlyF[] = { + overworld_ascending_frames(gObjectEventPic_StarlyF, 4, 4), +}; static const struct SpriteFrameImage sPicTable_Staravia[] = { overworld_ascending_frames(gObjectEventPic_Staravia, 4, 4), }; +static const struct SpriteFrameImage sPicTable_StaraviaF[] = { + overworld_ascending_frames(gObjectEventPic_StaraviaF, 4, 4), +}; static const struct SpriteFrameImage sPicTable_Staraptor[] = { overworld_ascending_frames(gObjectEventPic_Staraptor, 4, 4), }; +static const struct SpriteFrameImage sPicTable_StaraptorF[] = { + overworld_ascending_frames(gObjectEventPic_StaraptorF, 4, 4), +}; #endif //P_FAMILY_STARLY #if P_FAMILY_BIDOOF static const struct SpriteFrameImage sPicTable_Bidoof[] = { overworld_ascending_frames(gObjectEventPic_Bidoof, 4, 4), }; +static const struct SpriteFrameImage sPicTable_BidoofF[] = { + overworld_ascending_frames(gObjectEventPic_BidoofF, 4, 4), +}; static const struct SpriteFrameImage sPicTable_Bibarel[] = { overworld_ascending_frames(gObjectEventPic_Bibarel, 4, 4), }; +static const struct SpriteFrameImage sPicTable_BibarelF[] = { + overworld_ascending_frames(gObjectEventPic_BibarelF, 4, 4), +}; #endif //P_FAMILY_BIDOOF #if P_FAMILY_KRICKETOT static const struct SpriteFrameImage sPicTable_Kricketot[] = { overworld_ascending_frames(gObjectEventPic_Kricketot, 4, 4), }; +static const struct SpriteFrameImage sPicTable_KricketotF[] = { + overworld_ascending_frames(gObjectEventPic_KricketotF, 4, 4), +}; static const struct SpriteFrameImage sPicTable_Kricketune[] = { overworld_ascending_frames(gObjectEventPic_Kricketune, 4, 4), }; +static const struct SpriteFrameImage sPicTable_KricketuneF[] = { + overworld_ascending_frames(gObjectEventPic_KricketuneF, 4, 4), +}; #endif //P_FAMILY_KRICKETOT #if P_FAMILY_SHINX static const struct SpriteFrameImage sPicTable_Shinx[] = { overworld_ascending_frames(gObjectEventPic_Shinx, 4, 4), }; +static const struct SpriteFrameImage sPicTable_ShinxF[] = { + overworld_ascending_frames(gObjectEventPic_ShinxF, 4, 4), +}; static const struct SpriteFrameImage sPicTable_Luxio[] = { overworld_ascending_frames(gObjectEventPic_Luxio, 4, 4), }; +static const struct SpriteFrameImage sPicTable_LuxioF[] = { + overworld_ascending_frames(gObjectEventPic_LuxioF, 4, 4), +}; static const struct SpriteFrameImage sPicTable_Luxray[] = { overworld_ascending_frames(gObjectEventPic_Luxray, 4, 4), }; +static const struct SpriteFrameImage sPicTable_LuxrayF[] = { + overworld_ascending_frames(gObjectEventPic_LuxrayF, 4, 4), +}; #endif //P_FAMILY_SHINX #if P_FAMILY_CRANIDOS @@ -2782,15 +3016,24 @@ static const struct SpriteFrameImage sPicTable_Vespiquen[] = { static const struct SpriteFrameImage sPicTable_Pachirisu[] = { overworld_ascending_frames(gObjectEventPic_Pachirisu, 4, 4), }; +static const struct SpriteFrameImage sPicTable_PachirisuF[] = { + overworld_ascending_frames(gObjectEventPic_PachirisuF, 4, 4), +}; #endif //P_FAMILY_PACHIRISU #if P_FAMILY_BUIZEL static const struct SpriteFrameImage sPicTable_Buizel[] = { overworld_ascending_frames(gObjectEventPic_Buizel, 4, 4), }; +static const struct SpriteFrameImage sPicTable_BuizelF[] = { + overworld_ascending_frames(gObjectEventPic_BuizelF, 4, 4), +}; static const struct SpriteFrameImage sPicTable_Floatzel[] = { overworld_ascending_frames(gObjectEventPic_Floatzel, 4, 4), }; +static const struct SpriteFrameImage sPicTable_FloatzelF[] = { + overworld_ascending_frames(gObjectEventPic_FloatzelF, 4, 4), +}; #endif //P_FAMILY_BUIZEL #if P_FAMILY_CHERUBI @@ -2886,12 +3129,21 @@ static const struct SpriteFrameImage sPicTable_Spiritomb[] = { static const struct SpriteFrameImage sPicTable_Gible[] = { overworld_ascending_frames(gObjectEventPic_Gible, 4, 4), }; +static const struct SpriteFrameImage sPicTable_GibleF[] = { + overworld_ascending_frames(gObjectEventPic_GibleF, 4, 4), +}; static const struct SpriteFrameImage sPicTable_Gabite[] = { overworld_ascending_frames(gObjectEventPic_Gabite, 4, 4), }; +static const struct SpriteFrameImage sPicTable_GabiteF[] = { + overworld_ascending_frames(gObjectEventPic_GabiteF, 4, 4), +}; static const struct SpriteFrameImage sPicTable_Garchomp[] = { overworld_ascending_frames(gObjectEventPic_Garchomp, 4, 4), }; +static const struct SpriteFrameImage sPicTable_GarchompF[] = { + overworld_ascending_frames(gObjectEventPic_GarchompF, 4, 4), +}; #if P_MEGA_EVOLUTIONS /*static const struct SpriteFrameImage sPicTable_GarchompMega[] = { overworld_ascending_frames(gObjectEventPic_GarchompMega, 4, 4), @@ -2923,9 +3175,6 @@ static const struct SpriteFrameImage sPicTable_HippopotasF[] = { static const struct SpriteFrameImage sPicTable_Hippowdon[] = { overworld_ascending_frames(gObjectEventPic_Hippowdon, 4, 4), }; -static const struct SpriteFrameImage sPicTable_HippowdonF[] = { - overworld_ascending_frames(gObjectEventPic_HippowdonF, 4, 4), -}; #endif //P_FAMILY_HIPPOPOTAS #if P_FAMILY_SKORUPI @@ -2941,9 +3190,15 @@ static const struct SpriteFrameImage sPicTable_Drapion[] = { static const struct SpriteFrameImage sPicTable_Croagunk[] = { overworld_ascending_frames(gObjectEventPic_Croagunk, 4, 4), }; +static const struct SpriteFrameImage sPicTable_CroagunkF[] = { + overworld_ascending_frames(gObjectEventPic_CroagunkF, 4, 4), +}; static const struct SpriteFrameImage sPicTable_Toxicroak[] = { overworld_ascending_frames(gObjectEventPic_Toxicroak, 4, 4), }; +static const struct SpriteFrameImage sPicTable_ToxicroakF[] = { + overworld_ascending_frames(gObjectEventPic_ToxicroakF, 4, 4), +}; #endif //P_FAMILY_CROAGUNK #if P_FAMILY_CARNIVINE @@ -2956,18 +3211,30 @@ static const struct SpriteFrameImage sPicTable_Carnivine[] = { static const struct SpriteFrameImage sPicTable_Finneon[] = { overworld_ascending_frames(gObjectEventPic_Finneon, 4, 4), }; +static const struct SpriteFrameImage sPicTable_FinneonF[] = { + overworld_ascending_frames(gObjectEventPic_FinneonF, 4, 4), +}; static const struct SpriteFrameImage sPicTable_Lumineon[] = { overworld_ascending_frames(gObjectEventPic_Lumineon, 4, 4), }; +static const struct SpriteFrameImage sPicTable_LumineonF[] = { + overworld_ascending_frames(gObjectEventPic_LumineonF, 4, 4), +}; #endif //P_FAMILY_FINNEON #if P_FAMILY_SNOVER static const struct SpriteFrameImage sPicTable_Snover[] = { overworld_ascending_frames(gObjectEventPic_Snover, 4, 4), }; +static const struct SpriteFrameImage sPicTable_SnoverF[] = { + overworld_ascending_frames(gObjectEventPic_SnoverF, 4, 4), +}; static const struct SpriteFrameImage sPicTable_Abomasnow[] = { overworld_ascending_frames(gObjectEventPic_Abomasnow, 4, 4), }; +static const struct SpriteFrameImage sPicTable_AbomasnowF[] = { + overworld_ascending_frames(gObjectEventPic_AbomasnowF, 4, 4), +}; #if P_MEGA_EVOLUTIONS /*static const struct SpriteFrameImage sPicTable_AbomasnowMega[] = { overworld_ascending_frames(gObjectEventPic_AbomasnowMega, 4, 4), @@ -3078,9 +3345,9 @@ static const struct SpriteFrameImage sPicTable_Darkrai[] = { static const struct SpriteFrameImage sPicTable_ShayminLand[] = { overworld_ascending_frames(gObjectEventPic_ShayminLand, 4, 4), }; -/*static const struct SpriteFrameImage sPicTable_ShayminSky[] = { +static const struct SpriteFrameImage sPicTable_ShayminSky[] = { overworld_ascending_frames(gObjectEventPic_ShayminSky, 4, 4), -};*/ +}; #endif //P_FAMILY_SHAYMIN #if P_FAMILY_ARCEUS @@ -3914,9 +4181,9 @@ static const struct SpriteFrameImage sPicTable_Virizion[] = { static const struct SpriteFrameImage sPicTable_TornadusIncarnate[] = { overworld_ascending_frames(gObjectEventPic_TornadusIncarnate, 4, 4), }; -/*static const struct SpriteFrameImage sPicTable_TornadusTherian[] = { +static const struct SpriteFrameImage sPicTable_TornadusTherian[] = { overworld_ascending_frames(gObjectEventPic_TornadusTherian, 4, 4), -};*/ +}; #endif //P_FAMILY_TORNADUS #if P_FAMILY_THUNDURUS @@ -3924,9 +4191,9 @@ static const struct SpriteFrameImage sPicTable_TornadusIncarnate[] = { static const struct SpriteFrameImage sPicTable_ThundurusIncarnate[] = { overworld_ascending_frames(gObjectEventPic_ThundurusIncarnate, 4, 4), }; -/*static const struct SpriteFrameImage sPicTable_ThundurusTherian[] = { +static const struct SpriteFrameImage sPicTable_ThundurusTherian[] = { overworld_ascending_frames(gObjectEventPic_ThundurusTherian, 4, 4), -};*/ +}; #endif //P_FAMILY_THUNDURUS #if P_FAMILY_RESHIRAM @@ -3946,9 +4213,9 @@ static const struct SpriteFrameImage sPicTable_Zekrom[] = { static const struct SpriteFrameImage sPicTable_LandorusIncarnate[] = { overworld_ascending_frames(gObjectEventPic_LandorusIncarnate, 4, 4), }; -/*static const struct SpriteFrameImage sPicTable_LandorusTherian[] = { +static const struct SpriteFrameImage sPicTable_LandorusTherian[] = { overworld_ascending_frames(gObjectEventPic_LandorusTherian, 4, 4), -};*/ +}; #endif //P_FAMILY_LANDORUS #if P_FAMILY_ENAMORUS @@ -3965,12 +4232,12 @@ static const struct SpriteFrameImage sPicTable_Kyurem[] = { overworld_ascending_frames(gObjectEventPic_Kyurem, 4, 4), }; #if P_FUSION_FORMS -/*static const struct SpriteFrameImage sPicTable_KyuremWhite[] = { +static const struct SpriteFrameImage sPicTable_KyuremWhite[] = { overworld_ascending_frames(gObjectEventPic_KyuremWhite, 4, 4), }; static const struct SpriteFrameImage sPicTable_KyuremBlack[] = { overworld_ascending_frames(gObjectEventPic_KyuremBlack, 4, 4), -};*/ +}; #endif //P_FUSION_FORMS #endif //P_FAMILY_KYUREM @@ -4416,7 +4683,7 @@ static const struct SpriteFrameImage sPicTable_Trevenant[] = { static const struct SpriteFrameImage sPicTable_PumpkabooAverage[] = { overworld_ascending_frames(gObjectEventPic_PumpkabooAverage, 4, 4), }; -/*static const struct SpriteFrameImage sPicTable_PumpkabooSmall[] = { +static const struct SpriteFrameImage sPicTable_PumpkabooSmall[] = { overworld_ascending_frames(gObjectEventPic_PumpkabooSmall, 4, 4), }; static const struct SpriteFrameImage sPicTable_PumpkabooLarge[] = { @@ -4424,12 +4691,12 @@ static const struct SpriteFrameImage sPicTable_PumpkabooLarge[] = { }; static const struct SpriteFrameImage sPicTable_PumpkabooSuper[] = { overworld_ascending_frames(gObjectEventPic_PumpkabooSuper, 4, 4), -};*/ +}; static const struct SpriteFrameImage sPicTable_GourgeistAverage[] = { overworld_ascending_frames(gObjectEventPic_GourgeistAverage, 4, 4), }; -/*static const struct SpriteFrameImage sPicTable_GourgeistSmall[] = { +static const struct SpriteFrameImage sPicTable_GourgeistSmall[] = { overworld_ascending_frames(gObjectEventPic_GourgeistSmall, 4, 4), }; static const struct SpriteFrameImage sPicTable_GourgeistLarge[] = { @@ -4437,7 +4704,7 @@ static const struct SpriteFrameImage sPicTable_GourgeistLarge[] = { }; static const struct SpriteFrameImage sPicTable_GourgeistSuper[] = { overworld_ascending_frames(gObjectEventPic_GourgeistSuper, 4, 4), -};*/ +}; #endif //P_FAMILY_PUMPKABOO #if P_FAMILY_BERGMITE @@ -4484,12 +4751,12 @@ static const struct SpriteFrameImage sPicTable_Yveltal[] = { static const struct SpriteFrameImage sPicTable_Zygarde50[] = { overworld_ascending_frames(gObjectEventPic_Zygarde50, 4, 4), }; -//static const struct SpriteFrameImage sPicTable_Zygarde10[] = { -// overworld_ascending_frames(gObjectEventPic_Zygarde10, 4, 4), -//}; -//static const struct SpriteFrameImage sPicTable_ZygardeComplete[] = { -// overworld_ascending_frames(gObjectEventPic_ZygardeComplete, 4, 4), -//}; +static const struct SpriteFrameImage sPicTable_Zygarde10[] = { + overworld_ascending_frames(gObjectEventPic_Zygarde10, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_ZygardeComplete[] = { + overworld_ascending_frames(gObjectEventPic_ZygardeComplete, 4, 4), +}; #endif //P_FAMILY_ZYGARDE @@ -4607,7 +4874,7 @@ static const struct SpriteFrameImage sPicTable_Crabominable[] = { static const struct SpriteFrameImage sPicTable_OricorioBaile[] = { overworld_ascending_frames(gObjectEventPic_OricorioBaile, 4, 4), }; -/*static const struct SpriteFrameImage sPicTable_OricorioPomPom[] = { +static const struct SpriteFrameImage sPicTable_OricorioPomPom[] = { overworld_ascending_frames(gObjectEventPic_OricorioPomPom, 4, 4), }; static const struct SpriteFrameImage sPicTable_OricorioPau[] = { @@ -4615,7 +4882,7 @@ static const struct SpriteFrameImage sPicTable_OricorioPau[] = { }; static const struct SpriteFrameImage sPicTable_OricorioSensu[] = { overworld_ascending_frames(gObjectEventPic_OricorioSensu, 4, 4), -};*/ +}; #endif //P_FAMILY_ORICORIO #if P_FAMILY_CUTIEFLY @@ -4967,9 +5234,9 @@ static const struct SpriteFrameImage sPicTable_NecrozmaDawnWings[] = { static const struct SpriteFrameImage sPicTable_Magearna[] = { overworld_ascending_frames(gObjectEventPic_Magearna, 4, 4), }; -/*static const struct SpriteFrameImage sPicTable_MagearnaOriginalColor[] = { +static const struct SpriteFrameImage sPicTable_MagearnaOriginalColor[] = { overworld_ascending_frames(gObjectEventPic_MagearnaOriginalColor, 4, 4), -};*/ +}; #endif //P_FAMILY_MAGEARNA #if P_FAMILY_MARSHADOW diff --git a/src/data/pokemon/form_change_table_pointers.h b/src/data/pokemon/form_change_table_pointers.h index 4d26837b2800..ea2cdfd2a252 100644 --- a/src/data/pokemon/form_change_table_pointers.h +++ b/src/data/pokemon/form_change_table_pointers.h @@ -24,11 +24,11 @@ const struct Fusion *const gFusionTablePointers[NUM_SPECIES] = #if P_FAMILY_CALYREX [SPECIES_CALYREX] = sCalyrexFusionTable, #if P_FAMILY_SPECTRIER - [SPECIES_CALYREX_SHADOW_RIDER] = sCalyrexFusionTable, + [SPECIES_CALYREX_SHADOW] = sCalyrexFusionTable, [SPECIES_SPECTRIER] = sCalyrexFusionTable, #endif //P_FAMILY_SPECTRIER #if P_FAMILY_GLASTRIER - [SPECIES_CALYREX_ICE_RIDER] = sCalyrexFusionTable, + [SPECIES_CALYREX_ICE] = sCalyrexFusionTable, [SPECIES_GLASTRIER] = sCalyrexFusionTable, #endif //P_FAMILY_GLASTRIER #endif //P_FAMILY_CALYREX diff --git a/src/data/pokemon/form_change_tables.h b/src/data/pokemon/form_change_tables.h index 52f888a55b32..5316427b4c57 100644 --- a/src/data/pokemon/form_change_tables.h +++ b/src/data/pokemon/form_change_tables.h @@ -4,7 +4,7 @@ static const struct FormChange sVenusaurFormChangeTable[] = { {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_VENUSAUR_MEGA, ITEM_VENUSAURITE}, #endif #if P_GIGANTAMAX_FORMS - {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_VENUSAUR_GIGANTAMAX}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_VENUSAUR_GMAX}, #endif {FORM_CHANGE_TERMINATOR}, }; @@ -17,7 +17,7 @@ static const struct FormChange sCharizardFormChangeTable[] = { {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_CHARIZARD_MEGA_Y, ITEM_CHARIZARDITE_Y}, #endif #if P_GIGANTAMAX_FORMS - {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_CHARIZARD_GIGANTAMAX}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_CHARIZARD_GMAX}, #endif {FORM_CHANGE_TERMINATOR}, }; @@ -29,7 +29,7 @@ static const struct FormChange sBlastoiseFormChangeTable[] = { {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_BLASTOISE_MEGA, ITEM_BLASTOISINITE}, #endif #if P_GIGANTAMAX_FORMS - {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_BLASTOISE_GIGANTAMAX}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_BLASTOISE_GMAX}, #endif {FORM_CHANGE_TERMINATOR}, }; @@ -39,7 +39,7 @@ static const struct FormChange sBlastoiseFormChangeTable[] = { static const struct FormChange sButterfreeFormChangeTable[] = { #if P_GIGANTAMAX_FORMS - {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_BUTTERFREE_GIGANTAMAX}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_BUTTERFREE_GMAX}, #endif {FORM_CHANGE_TERMINATOR}, }; @@ -67,7 +67,7 @@ static const struct FormChange sPidgeotFormChangeTable[] = { static const struct FormChange sPikachuFormChangeTable[] = { #if P_GIGANTAMAX_FORMS - {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_PIKACHU_GIGANTAMAX}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_PIKACHU_GMAX}, #endif {FORM_CHANGE_TERMINATOR}, }; @@ -77,7 +77,7 @@ static const struct FormChange sPikachuFormChangeTable[] = static const struct FormChange sMeowthFormChangeTable[] = { #if P_GIGANTAMAX_FORMS - {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_MEOWTH_GIGANTAMAX}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_MEOWTH_GMAX}, #endif {FORM_CHANGE_TERMINATOR}, }; @@ -96,7 +96,7 @@ static const struct FormChange sAlakazamFormChangeTable[] = { static const struct FormChange sMachampFormChangeTable[] = { #if P_GIGANTAMAX_FORMS - {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_MACHAMP_GIGANTAMAX}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_MACHAMP_GMAX}, #endif {FORM_CHANGE_TERMINATOR}, }; @@ -117,7 +117,7 @@ static const struct FormChange sGengarFormChangeTable[] = { {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_GENGAR_MEGA, ITEM_GENGARITE}, #endif #if P_GIGANTAMAX_FORMS - {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_GENGAR_GIGANTAMAX}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_GENGAR_GMAX}, #endif {FORM_CHANGE_TERMINATOR}, }; @@ -138,7 +138,7 @@ static const struct FormChange sSteelixFormChangeTable[] = { static const struct FormChange sKinglerFormChangeTable[] = { #if P_GIGANTAMAX_FORMS - {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_KINGLER_GIGANTAMAX}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_KINGLER_GMAX}, #endif {FORM_CHANGE_TERMINATOR}, }; @@ -185,7 +185,7 @@ static const struct FormChange sGyaradosFormChangeTable[] = { #if P_FAMILY_LAPRAS static const struct FormChange sLaprasFormChangeTable[] = { #if P_GIGANTAMAX_FORMS - {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_LAPRAS_GIGANTAMAX}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_LAPRAS_GMAX}, #endif {FORM_CHANGE_TERMINATOR}, }; @@ -194,7 +194,7 @@ static const struct FormChange sLaprasFormChangeTable[] = { #if P_FAMILY_EEVEE static const struct FormChange sEeveeFormChangeTable[] = { #if P_GIGANTAMAX_FORMS - {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_EEVEE_GIGANTAMAX}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_EEVEE_GMAX}, #endif {FORM_CHANGE_TERMINATOR}, }; @@ -212,7 +212,7 @@ static const struct FormChange sAerodactylFormChangeTable[] = { #if P_FAMILY_SNORLAX static const struct FormChange sSnorlaxFormChangeTable[] = { #if P_GIGANTAMAX_FORMS - {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_SNORLAX_GIGANTAMAX}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_SNORLAX_GMAX}, #endif {FORM_CHANGE_TERMINATOR}, }; @@ -517,14 +517,14 @@ static const struct FormChange sDeoxysSpeedFormChangeTable[] = { #if P_FAMILY_BURMY static const struct FormChange sBurmyFormChangeTable[] = { - {FORM_CHANGE_END_BATTLE_TERRAIN, SPECIES_BURMY_PLANT_CLOAK, BATTLE_TERRAIN_GRASS}, - {FORM_CHANGE_END_BATTLE_TERRAIN, SPECIES_BURMY_PLANT_CLOAK, BATTLE_TERRAIN_LONG_GRASS}, - {FORM_CHANGE_END_BATTLE_TERRAIN, SPECIES_BURMY_PLANT_CLOAK, BATTLE_TERRAIN_POND}, - {FORM_CHANGE_END_BATTLE_TERRAIN, SPECIES_BURMY_PLANT_CLOAK, BATTLE_TERRAIN_MOUNTAIN}, - {FORM_CHANGE_END_BATTLE_TERRAIN, SPECIES_BURMY_PLANT_CLOAK, BATTLE_TERRAIN_PLAIN}, - {FORM_CHANGE_END_BATTLE_TERRAIN, SPECIES_BURMY_SANDY_CLOAK, BATTLE_TERRAIN_CAVE}, - {FORM_CHANGE_END_BATTLE_TERRAIN, SPECIES_BURMY_SANDY_CLOAK, BATTLE_TERRAIN_SAND}, - {FORM_CHANGE_END_BATTLE_TERRAIN, SPECIES_BURMY_TRASH_CLOAK, BATTLE_TERRAIN_BUILDING}, + {FORM_CHANGE_END_BATTLE_TERRAIN, SPECIES_BURMY_PLANT, BATTLE_TERRAIN_GRASS}, + {FORM_CHANGE_END_BATTLE_TERRAIN, SPECIES_BURMY_PLANT, BATTLE_TERRAIN_LONG_GRASS}, + {FORM_CHANGE_END_BATTLE_TERRAIN, SPECIES_BURMY_PLANT, BATTLE_TERRAIN_POND}, + {FORM_CHANGE_END_BATTLE_TERRAIN, SPECIES_BURMY_PLANT, BATTLE_TERRAIN_MOUNTAIN}, + {FORM_CHANGE_END_BATTLE_TERRAIN, SPECIES_BURMY_PLANT, BATTLE_TERRAIN_PLAIN}, + {FORM_CHANGE_END_BATTLE_TERRAIN, SPECIES_BURMY_SANDY, BATTLE_TERRAIN_CAVE}, + {FORM_CHANGE_END_BATTLE_TERRAIN, SPECIES_BURMY_SANDY, BATTLE_TERRAIN_SAND}, + {FORM_CHANGE_END_BATTLE_TERRAIN, SPECIES_BURMY_TRASH, BATTLE_TERRAIN_BUILDING}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_BURMY @@ -684,19 +684,19 @@ static const struct FormChange sAudinoFormChangeTable[] = { #if P_FAMILY_DARUMAKA static const struct FormChange sDarmanitanFormChangeTable[] = { - {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_DARMANITAN_STANDARD_MODE, ABILITY_ZEN_MODE, HP_HIGHER_THAN, 50}, - {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_DARMANITAN_ZEN_MODE, ABILITY_ZEN_MODE, HP_LOWER_EQ_THAN, 50}, - {FORM_CHANGE_FAINT, SPECIES_DARMANITAN_STANDARD_MODE}, - {FORM_CHANGE_END_BATTLE, SPECIES_DARMANITAN_STANDARD_MODE}, + {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_DARMANITAN_STANDARD, ABILITY_ZEN_MODE, HP_HIGHER_THAN, 50}, + {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_DARMANITAN_ZEN, ABILITY_ZEN_MODE, HP_LOWER_EQ_THAN, 50}, + {FORM_CHANGE_FAINT, SPECIES_DARMANITAN_STANDARD}, + {FORM_CHANGE_END_BATTLE, SPECIES_DARMANITAN_STANDARD}, {FORM_CHANGE_TERMINATOR}, }; #if P_GALARIAN_FORMS static const struct FormChange sDarmanitanGalarianFormChangeTable[] = { - {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_DARMANITAN_GALARIAN_STANDARD_MODE, ABILITY_ZEN_MODE, HP_HIGHER_THAN, 50}, - {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_DARMANITAN_GALARIAN_ZEN_MODE, ABILITY_ZEN_MODE, HP_LOWER_EQ_THAN, 50}, - {FORM_CHANGE_FAINT, SPECIES_DARMANITAN_GALARIAN_STANDARD_MODE}, - {FORM_CHANGE_END_BATTLE, SPECIES_DARMANITAN_GALARIAN_STANDARD_MODE}, + {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_DARMANITAN_GALAR_STANDARD, ABILITY_ZEN_MODE, HP_HIGHER_THAN, 50}, + {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_DARMANITAN_GALAR_ZEN, ABILITY_ZEN_MODE, HP_LOWER_EQ_THAN, 50}, + {FORM_CHANGE_FAINT, SPECIES_DARMANITAN_GALAR_STANDARD}, + {FORM_CHANGE_END_BATTLE, SPECIES_DARMANITAN_GALAR_STANDARD}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_GALARIAN_FORMS @@ -706,7 +706,7 @@ static const struct FormChange sDarmanitanGalarianFormChangeTable[] = { static const struct FormChange sGarbodorFormChangeTable[] = { #if P_GIGANTAMAX_FORMS - {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_GARBODOR_GIGANTAMAX}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_GARBODOR_GMAX}, #endif {FORM_CHANGE_TERMINATOR}, }; @@ -763,10 +763,10 @@ static const struct FormChange sMeloettaFormChangeTable[] = { #if P_FAMILY_GENESECT static const struct FormChange sGenesectFormChangeTable[] = { {FORM_CHANGE_ITEM_HOLD, SPECIES_GENESECT, ITEM_NONE}, - {FORM_CHANGE_ITEM_HOLD, SPECIES_GENESECT_DOUSE_DRIVE, ITEM_DOUSE_DRIVE}, - {FORM_CHANGE_ITEM_HOLD, SPECIES_GENESECT_SHOCK_DRIVE, ITEM_SHOCK_DRIVE}, - {FORM_CHANGE_ITEM_HOLD, SPECIES_GENESECT_BURN_DRIVE, ITEM_BURN_DRIVE}, - {FORM_CHANGE_ITEM_HOLD, SPECIES_GENESECT_CHILL_DRIVE, ITEM_CHILL_DRIVE}, + {FORM_CHANGE_ITEM_HOLD, SPECIES_GENESECT_DOUSE, ITEM_DOUSE_DRIVE}, + {FORM_CHANGE_ITEM_HOLD, SPECIES_GENESECT_SHOCK, ITEM_SHOCK_DRIVE}, + {FORM_CHANGE_ITEM_HOLD, SPECIES_GENESECT_BURN, ITEM_BURN_DRIVE}, + {FORM_CHANGE_ITEM_HOLD, SPECIES_GENESECT_CHILL, ITEM_CHILL_DRIVE}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_GENESECT @@ -812,14 +812,14 @@ static const struct FormChange sZygarde50AuraBreakFormChangeTable[] = { }; static const struct FormChange sZygarde10AuraBreakFormChangeTable[] = { - {FORM_CHANGE_ITEM_USE_MULTICHOICE, SPECIES_ZYGARDE_50_AURA_BREAK, ITEM_ZYGARDE_CUBE, 0}, + {FORM_CHANGE_ITEM_USE_MULTICHOICE, SPECIES_ZYGARDE_50, ITEM_ZYGARDE_CUBE, 0}, {FORM_CHANGE_ITEM_USE_MULTICHOICE, SPECIES_ZYGARDE_10_POWER_CONSTRUCT, ITEM_ZYGARDE_CUBE, 1}, {FORM_CHANGE_TERMINATOR}, }; static const struct FormChange sZygarde50PowerConstructFormChangeTable[] = { {FORM_CHANGE_ITEM_USE_MULTICHOICE, SPECIES_ZYGARDE_10_POWER_CONSTRUCT, ITEM_ZYGARDE_CUBE, 0}, - {FORM_CHANGE_ITEM_USE_MULTICHOICE, SPECIES_ZYGARDE_50_AURA_BREAK, ITEM_ZYGARDE_CUBE, 1}, + {FORM_CHANGE_ITEM_USE_MULTICHOICE, SPECIES_ZYGARDE_50, ITEM_ZYGARDE_CUBE, 1}, {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_ZYGARDE_COMPLETE, ABILITY_POWER_CONSTRUCT, HP_LOWER_EQ_THAN, 50}, {FORM_CHANGE_TERMINATOR}, }; @@ -999,7 +999,7 @@ static const struct FormChange sNecrozmaDawnWingsFormChangeTable[] = { static const struct FormChange sMelmetalFormChangeTable[] = { #if P_GIGANTAMAX_FORMS - {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_MELMETAL_GIGANTAMAX}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_MELMETAL_GMAX}, #endif {FORM_CHANGE_TERMINATOR}, }; @@ -1009,7 +1009,7 @@ static const struct FormChange sMelmetalFormChangeTable[] = static const struct FormChange sRillaboomFormChangeTable[] = { #if P_GIGANTAMAX_FORMS - {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_RILLABOOM_GIGANTAMAX}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_RILLABOOM_GMAX}, #endif {FORM_CHANGE_TERMINATOR}, }; @@ -1019,7 +1019,7 @@ static const struct FormChange sRillaboomFormChangeTable[] = static const struct FormChange sCinderaceFormChangeTable[] = { #if P_GIGANTAMAX_FORMS - {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_CINDERACE_GIGANTAMAX}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_CINDERACE_GMAX}, #endif {FORM_CHANGE_TERMINATOR}, }; @@ -1029,7 +1029,7 @@ static const struct FormChange sCinderaceFormChangeTable[] = static const struct FormChange sInteleonFormChangeTable[] = { #if P_GIGANTAMAX_FORMS - {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_INTELEON_GIGANTAMAX}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_INTELEON_GMAX}, #endif {FORM_CHANGE_TERMINATOR}, }; @@ -1039,7 +1039,7 @@ static const struct FormChange sInteleonFormChangeTable[] = static const struct FormChange sCorviknightFormChangeTable[] = { #if P_GIGANTAMAX_FORMS - {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_CORVIKNIGHT_GIGANTAMAX}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_CORVIKNIGHT_GMAX}, #endif {FORM_CHANGE_TERMINATOR}, }; @@ -1049,7 +1049,7 @@ static const struct FormChange sCorviknightFormChangeTable[] = static const struct FormChange sOrbeetleFormChangeTable[] = { #if P_GIGANTAMAX_FORMS - {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_ORBEETLE_GIGANTAMAX}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_ORBEETLE_GMAX}, #endif {FORM_CHANGE_TERMINATOR}, }; @@ -1059,7 +1059,7 @@ static const struct FormChange sOrbeetleFormChangeTable[] = static const struct FormChange sDrednawFormChangeTable[] = { #if P_GIGANTAMAX_FORMS - {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_DREDNAW_GIGANTAMAX}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_DREDNAW_GMAX}, #endif {FORM_CHANGE_TERMINATOR}, }; @@ -1069,7 +1069,7 @@ static const struct FormChange sDrednawFormChangeTable[] = static const struct FormChange sCoalossalFormChangeTable[] = { #if P_GIGANTAMAX_FORMS - {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_COALOSSAL_GIGANTAMAX}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_COALOSSAL_GMAX}, #endif {FORM_CHANGE_TERMINATOR}, }; @@ -1079,7 +1079,7 @@ static const struct FormChange sCoalossalFormChangeTable[] = static const struct FormChange sFlappleFormChangeTable[] = { #if P_GIGANTAMAX_FORMS - {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_FLAPPLE_GIGANTAMAX}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_FLAPPLE_GMAX}, #endif {FORM_CHANGE_TERMINATOR}, }; @@ -1087,7 +1087,7 @@ static const struct FormChange sFlappleFormChangeTable[] = static const struct FormChange sAppletunFormChangeTable[] = { #if P_GIGANTAMAX_FORMS - {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_APPLETUN_GIGANTAMAX}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_APPLETUN_GMAX}, #endif {FORM_CHANGE_TERMINATOR}, }; @@ -1097,7 +1097,7 @@ static const struct FormChange sAppletunFormChangeTable[] = static const struct FormChange sSandacondaFormChangeTable[] = { #if P_GIGANTAMAX_FORMS - {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_SANDACONDA_GIGANTAMAX}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_SANDACONDA_GMAX}, #endif {FORM_CHANGE_TERMINATOR}, }; @@ -1119,7 +1119,7 @@ static const struct FormChange sCramorantFormChangeTable[] = { static const struct FormChange sToxtricityAmpedFormChangeTable[] = { #if P_GIGANTAMAX_FORMS - {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_TOXTRICITY_AMPED_GIGANTAMAX}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_TOXTRICITY_AMPED_GMAX}, #endif {FORM_CHANGE_TERMINATOR}, }; @@ -1127,7 +1127,7 @@ static const struct FormChange sToxtricityAmpedFormChangeTable[] = static const struct FormChange sToxtricityLowKeyFormChangeTable[] = { #if P_GIGANTAMAX_FORMS - {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_TOXTRICITY_LOW_KEY_GIGANTAMAX}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_TOXTRICITY_LOW_KEY_GMAX}, #endif {FORM_CHANGE_TERMINATOR}, }; @@ -1137,7 +1137,7 @@ static const struct FormChange sToxtricityLowKeyFormChangeTable[] = static const struct FormChange sCentiskorchFormChangeTable[] = { #if P_GIGANTAMAX_FORMS - {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_CENTISKORCH_GIGANTAMAX}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_CENTISKORCH_GMAX}, #endif {FORM_CHANGE_TERMINATOR}, }; @@ -1147,7 +1147,7 @@ static const struct FormChange sCentiskorchFormChangeTable[] = static const struct FormChange sHattereneFormChangeTable[] = { #if P_GIGANTAMAX_FORMS - {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_HATTERENE_GIGANTAMAX}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_HATTERENE_GMAX}, #endif {FORM_CHANGE_TERMINATOR}, }; @@ -1157,7 +1157,7 @@ static const struct FormChange sHattereneFormChangeTable[] = static const struct FormChange sGrimmsnarlFormChangeTable[] = { #if P_GIGANTAMAX_FORMS - {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_GRIMMSNARL_GIGANTAMAX}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_GRIMMSNARL_GMAX}, #endif {FORM_CHANGE_TERMINATOR}, }; @@ -1167,7 +1167,7 @@ static const struct FormChange sGrimmsnarlFormChangeTable[] = static const struct FormChange sAlcremieFormChangeTable[] = { #if P_GIGANTAMAX_FORMS - {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_ALCREMIE_GIGANTAMAX}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_ALCREMIE_GMAX}, #endif {FORM_CHANGE_TERMINATOR}, }; @@ -1175,8 +1175,8 @@ static const struct FormChange sAlcremieFormChangeTable[] = #if P_FAMILY_EISCUE static const struct FormChange sEiscueFormChangeTable[] = { - {FORM_CHANGE_FAINT, SPECIES_EISCUE_ICE_FACE}, - {FORM_CHANGE_END_BATTLE, SPECIES_EISCUE_ICE_FACE}, + {FORM_CHANGE_FAINT, SPECIES_EISCUE_ICE}, + {FORM_CHANGE_END_BATTLE, SPECIES_EISCUE_ICE}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_EISCUE @@ -1195,7 +1195,7 @@ static const struct FormChange sMorpekoFormChangeTable[] = { #if P_FAMILY_CUFANT static const struct FormChange sCopperajahFormChangeTable[] = { #if P_GIGANTAMAX_FORMS - {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_COPPERAJAH_GIGANTAMAX}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_COPPERAJAH_GMAX}, #endif {FORM_CHANGE_TERMINATOR}, }; @@ -1204,7 +1204,7 @@ static const struct FormChange sCopperajahFormChangeTable[] = { #if P_FAMILY_DURALUDON static const struct FormChange sDuraludonFormChangeTable[] = { #if P_GIGANTAMAX_FORMS - {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_DURALUDON_GIGANTAMAX}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_DURALUDON_GMAX}, #endif {FORM_CHANGE_TERMINATOR}, }; @@ -1212,16 +1212,16 @@ static const struct FormChange sDuraludonFormChangeTable[] = { #if P_FAMILY_ZACIAN static const struct FormChange sZacianFormChangeTable[] = { - {FORM_CHANGE_BEGIN_BATTLE, SPECIES_ZACIAN_CROWNED_SWORD, ITEM_RUSTED_SWORD, MOVE_IRON_HEAD, MOVE_BEHEMOTH_BLADE}, - {FORM_CHANGE_END_BATTLE, SPECIES_ZACIAN_HERO_OF_MANY_BATTLES, ITEM_RUSTED_SWORD, MOVE_BEHEMOTH_BLADE, MOVE_IRON_HEAD}, + {FORM_CHANGE_BEGIN_BATTLE, SPECIES_ZACIAN_CROWNED, ITEM_RUSTED_SWORD, MOVE_IRON_HEAD, MOVE_BEHEMOTH_BLADE}, + {FORM_CHANGE_END_BATTLE, SPECIES_ZACIAN_HERO, ITEM_RUSTED_SWORD, MOVE_BEHEMOTH_BLADE, MOVE_IRON_HEAD}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_ZACIAN #if P_FAMILY_ZAMAZENTA static const struct FormChange sZamazentaFormChangeTable[] = { - {FORM_CHANGE_BEGIN_BATTLE, SPECIES_ZAMAZENTA_CROWNED_SHIELD, ITEM_RUSTED_SHIELD, MOVE_IRON_HEAD, MOVE_BEHEMOTH_BASH}, - {FORM_CHANGE_END_BATTLE, SPECIES_ZAMAZENTA_HERO_OF_MANY_BATTLES, ITEM_RUSTED_SHIELD, MOVE_BEHEMOTH_BASH, MOVE_IRON_HEAD}, + {FORM_CHANGE_BEGIN_BATTLE, SPECIES_ZAMAZENTA_CROWNED, ITEM_RUSTED_SHIELD, MOVE_IRON_HEAD, MOVE_BEHEMOTH_BASH}, + {FORM_CHANGE_END_BATTLE, SPECIES_ZAMAZENTA_HERO, ITEM_RUSTED_SHIELD, MOVE_BEHEMOTH_BASH, MOVE_IRON_HEAD}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_ZAMAZENTA @@ -1229,14 +1229,14 @@ static const struct FormChange sZamazentaFormChangeTable[] = { #if P_FAMILY_KUBFU static const struct FormChange sUrshifuSingleStrikeFormChangeTable[] = { #if P_GIGANTAMAX_FORMS - {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_URSHIFU_SINGLE_STRIKE_STYLE_GIGANTAMAX}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_URSHIFU_SINGLE_STRIKE_GMAX}, #endif {FORM_CHANGE_TERMINATOR}, }; static const struct FormChange sUrshifuRapidStrikeFormChangeTable[] = { #if P_GIGANTAMAX_FORMS - {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_URSHIFU_RAPID_STRIKE_STYLE_GIGANTAMAX}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_URSHIFU_RAPID_STRIKE_GMAX}, #endif {FORM_CHANGE_TERMINATOR}, }; @@ -1244,8 +1244,8 @@ static const struct FormChange sUrshifuRapidStrikeFormChangeTable[] = { #if P_FAMILY_CALYREX static const struct Fusion sCalyrexFusionTable[] = { - {3, ITEM_REINS_OF_UNITY, SPECIES_CALYREX, SPECIES_GLASTRIER, SPECIES_CALYREX_ICE_RIDER, MOVE_GLACIAL_LANCE, MOVE_CONFUSION}, - {3, ITEM_REINS_OF_UNITY, SPECIES_CALYREX, SPECIES_SPECTRIER, SPECIES_CALYREX_SHADOW_RIDER, MOVE_ASTRAL_BARRAGE, MOVE_CONFUSION}, + {3, ITEM_REINS_OF_UNITY, SPECIES_CALYREX, SPECIES_GLASTRIER, SPECIES_CALYREX_ICE, MOVE_GLACIAL_LANCE, MOVE_CONFUSION}, + {3, ITEM_REINS_OF_UNITY, SPECIES_CALYREX, SPECIES_SPECTRIER, SPECIES_CALYREX_SHADOW, MOVE_ASTRAL_BARRAGE, MOVE_CONFUSION}, {FUSION_TERMINATOR}, }; #endif //P_FAMILY_CALYREX @@ -1268,15 +1268,15 @@ static const struct FormChange sPalafinZeroFormChangeTable[] = #if P_FAMILY_OGERPON static const struct FormChange sOgerponFormChangeTable[] = { - {FORM_CHANGE_ITEM_HOLD, SPECIES_OGERPON_TEAL_MASK, ITEM_NONE}, - {FORM_CHANGE_ITEM_HOLD, SPECIES_OGERPON_WELLSPRING_MASK, ITEM_WELLSPRING_MASK}, - {FORM_CHANGE_ITEM_HOLD, SPECIES_OGERPON_HEARTHFLAME_MASK, ITEM_HEARTHFLAME_MASK}, - {FORM_CHANGE_ITEM_HOLD, SPECIES_OGERPON_CORNERSTONE_MASK, ITEM_CORNERSTONE_MASK}, + {FORM_CHANGE_ITEM_HOLD, SPECIES_OGERPON_TEAL, ITEM_NONE}, + {FORM_CHANGE_ITEM_HOLD, SPECIES_OGERPON_WELLSPRING, ITEM_WELLSPRING_MASK}, + {FORM_CHANGE_ITEM_HOLD, SPECIES_OGERPON_HEARTHFLAME, ITEM_HEARTHFLAME_MASK}, + {FORM_CHANGE_ITEM_HOLD, SPECIES_OGERPON_CORNERSTONE, ITEM_CORNERSTONE_MASK}, #if P_TERA_FORMS - {FORM_CHANGE_BATTLE_TERASTALLIZATION, SPECIES_OGERPON_TEAL_MASK_TERA, TYPE_GRASS}, - {FORM_CHANGE_BATTLE_TERASTALLIZATION, SPECIES_OGERPON_WELLSPRING_MASK_TERA, TYPE_WATER}, - {FORM_CHANGE_BATTLE_TERASTALLIZATION, SPECIES_OGERPON_HEARTHFLAME_MASK_TERA, TYPE_FIRE}, - {FORM_CHANGE_BATTLE_TERASTALLIZATION, SPECIES_OGERPON_CORNERSTONE_MASK_TERA, TYPE_ROCK}, + {FORM_CHANGE_BATTLE_TERASTALLIZATION, SPECIES_OGERPON_TEAL_TERA, TYPE_GRASS}, + {FORM_CHANGE_BATTLE_TERASTALLIZATION, SPECIES_OGERPON_WELLSPRING_TERA, TYPE_WATER}, + {FORM_CHANGE_BATTLE_TERASTALLIZATION, SPECIES_OGERPON_HEARTHFLAME_TERA, TYPE_FIRE}, + {FORM_CHANGE_BATTLE_TERASTALLIZATION, SPECIES_OGERPON_CORNERSTONE_TERA, TYPE_ROCK}, #endif {FORM_CHANGE_TERMINATOR}, }; diff --git a/src/data/pokemon/form_species_tables.h b/src/data/pokemon/form_species_tables.h index f099f8665fd0..1a8e1818efea 100644 --- a/src/data/pokemon/form_species_tables.h +++ b/src/data/pokemon/form_species_tables.h @@ -5,7 +5,7 @@ static const u16 sVenusaurFormSpeciesIdTable[] = { SPECIES_VENUSAUR_MEGA, #endif #if P_GIGANTAMAX_FORMS - SPECIES_VENUSAUR_GIGANTAMAX, + SPECIES_VENUSAUR_GMAX, #endif FORM_SPECIES_END, }; @@ -19,7 +19,7 @@ static const u16 sCharizardFormSpeciesIdTable[] = { SPECIES_CHARIZARD_MEGA_Y, #endif #if P_GIGANTAMAX_FORMS - SPECIES_CHARIZARD_GIGANTAMAX, + SPECIES_CHARIZARD_GMAX, #endif FORM_SPECIES_END, }; @@ -32,7 +32,7 @@ static const u16 sBlastoiseFormSpeciesIdTable[] = { SPECIES_BLASTOISE_MEGA, #endif #if P_GIGANTAMAX_FORMS - SPECIES_BLASTOISE_GIGANTAMAX, + SPECIES_BLASTOISE_GMAX, #endif FORM_SPECIES_END, }; @@ -42,7 +42,7 @@ static const u16 sBlastoiseFormSpeciesIdTable[] = { static const u16 sButterfreeFormSpeciesIdTable[] = { SPECIES_BUTTERFREE, #if P_GIGANTAMAX_FORMS - SPECIES_BUTTERFREE_GIGANTAMAX, + SPECIES_BUTTERFREE_GMAX, #endif FORM_SPECIES_END, }; @@ -72,7 +72,7 @@ static const u16 sPidgeotFormSpeciesIdTable[] = { static const u16 sRattataFormSpeciesIdTable[] = { SPECIES_RATTATA, #if P_ALOLAN_FORMS - SPECIES_RATTATA_ALOLAN, + SPECIES_RATTATA_ALOLA, #endif FORM_SPECIES_END, }; @@ -80,8 +80,8 @@ static const u16 sRattataFormSpeciesIdTable[] = { static const u16 sRaticateFormSpeciesIdTable[] = { SPECIES_RATICATE, #if P_ALOLAN_FORMS - SPECIES_RATICATE_ALOLAN, - SPECIES_RATICATE_ALOLAN_TOTEM, + SPECIES_RATICATE_ALOLA, + SPECIES_RATICATE_ALOLA_TOTEM, #endif FORM_SPECIES_END, }; @@ -103,30 +103,30 @@ static const u16 sPikachuFormSpeciesIdTable[] = { SPECIES_PIKACHU_ROCK_STAR, SPECIES_PIKACHU_BELLE, SPECIES_PIKACHU_POP_STAR, - SPECIES_PIKACHU_PH_D, + SPECIES_PIKACHU_PHD, SPECIES_PIKACHU_LIBRE, #endif #if P_CAP_PIKACHU_FORMS - SPECIES_PIKACHU_ORIGINAL_CAP, - SPECIES_PIKACHU_HOENN_CAP, - SPECIES_PIKACHU_SINNOH_CAP, - SPECIES_PIKACHU_UNOVA_CAP, - SPECIES_PIKACHU_KALOS_CAP, - SPECIES_PIKACHU_ALOLA_CAP, + SPECIES_PIKACHU_ORIGINAL, + SPECIES_PIKACHU_HOENN, + SPECIES_PIKACHU_SINNOH, + SPECIES_PIKACHU_UNOVA, + SPECIES_PIKACHU_KALOS, + SPECIES_PIKACHU_ALOLA, SPECIES_PIKACHU_PARTNER_CAP, - SPECIES_PIKACHU_WORLD_CAP, + SPECIES_PIKACHU_WORLD, #endif #if P_GIGANTAMAX_FORMS - SPECIES_PIKACHU_GIGANTAMAX, + SPECIES_PIKACHU_GMAX, #endif - SPECIES_PIKACHU_PARTNER, + SPECIES_PIKACHU_STARTER, FORM_SPECIES_END, }; static const u16 sRaichuFormSpeciesIdTable[] = { SPECIES_RAICHU, #if P_ALOLAN_FORMS - SPECIES_RAICHU_ALOLAN, + SPECIES_RAICHU_ALOLA, #endif FORM_SPECIES_END, }; @@ -136,7 +136,7 @@ static const u16 sRaichuFormSpeciesIdTable[] = { static const u16 sSandshrewFormSpeciesIdTable[] = { SPECIES_SANDSHREW, #if P_ALOLAN_FORMS - SPECIES_SANDSHREW_ALOLAN, + SPECIES_SANDSHREW_ALOLA, #endif FORM_SPECIES_END, }; @@ -144,7 +144,7 @@ static const u16 sSandshrewFormSpeciesIdTable[] = { static const u16 sSandslashFormSpeciesIdTable[] = { SPECIES_SANDSLASH, #if P_ALOLAN_FORMS - SPECIES_SANDSLASH_ALOLAN, + SPECIES_SANDSLASH_ALOLA, #endif FORM_SPECIES_END, }; @@ -154,7 +154,7 @@ static const u16 sSandslashFormSpeciesIdTable[] = { static const u16 sVulpixFormSpeciesIdTable[] = { SPECIES_VULPIX, #if P_ALOLAN_FORMS - SPECIES_VULPIX_ALOLAN, + SPECIES_VULPIX_ALOLA, #endif FORM_SPECIES_END, }; @@ -162,7 +162,7 @@ static const u16 sVulpixFormSpeciesIdTable[] = { static const u16 sNinetalesFormSpeciesIdTable[] = { SPECIES_NINETALES, #if P_ALOLAN_FORMS - SPECIES_NINETALES_ALOLAN, + SPECIES_NINETALES_ALOLA, #endif FORM_SPECIES_END, }; @@ -172,7 +172,7 @@ static const u16 sNinetalesFormSpeciesIdTable[] = { static const u16 sDiglettFormSpeciesIdTable[] = { SPECIES_DIGLETT, #if P_ALOLAN_FORMS - SPECIES_DIGLETT_ALOLAN, + SPECIES_DIGLETT_ALOLA, #endif FORM_SPECIES_END, }; @@ -180,7 +180,7 @@ static const u16 sDiglettFormSpeciesIdTable[] = { static const u16 sDugtrioFormSpeciesIdTable[] = { SPECIES_DUGTRIO, #if P_ALOLAN_FORMS - SPECIES_DUGTRIO_ALOLAN, + SPECIES_DUGTRIO_ALOLA, #endif FORM_SPECIES_END, }; @@ -190,13 +190,13 @@ static const u16 sDugtrioFormSpeciesIdTable[] = { static const u16 sMeowthFormSpeciesIdTable[] = { SPECIES_MEOWTH, #if P_ALOLAN_FORMS - SPECIES_MEOWTH_ALOLAN, + SPECIES_MEOWTH_ALOLA, #endif #if P_GALARIAN_FORMS - SPECIES_MEOWTH_GALARIAN, + SPECIES_MEOWTH_GALAR, #endif #if P_GIGANTAMAX_FORMS - SPECIES_MEOWTH_GIGANTAMAX, + SPECIES_MEOWTH_GMAX, #endif FORM_SPECIES_END, }; @@ -204,7 +204,7 @@ static const u16 sMeowthFormSpeciesIdTable[] = { static const u16 sPersianFormSpeciesIdTable[] = { SPECIES_PERSIAN, #if P_ALOLAN_FORMS - SPECIES_PERSIAN_ALOLAN, + SPECIES_PERSIAN_ALOLA, #endif FORM_SPECIES_END, }; @@ -214,7 +214,7 @@ static const u16 sPersianFormSpeciesIdTable[] = { static const u16 sGrowlitheFormSpeciesIdTable[] = { SPECIES_GROWLITHE, #if P_HISUIAN_FORMS - SPECIES_GROWLITHE_HISUIAN, + SPECIES_GROWLITHE_HISUI, #endif FORM_SPECIES_END, }; @@ -222,7 +222,7 @@ static const u16 sGrowlitheFormSpeciesIdTable[] = { static const u16 sArcanineFormSpeciesIdTable[] = { SPECIES_ARCANINE, #if P_HISUIAN_FORMS - SPECIES_ARCANINE_HISUIAN, + SPECIES_ARCANINE_HISUI, #endif FORM_SPECIES_END, }; @@ -242,7 +242,7 @@ static const u16 sAlakazamFormSpeciesIdTable[] = { static const u16 sMachampFormSpeciesIdTable[] = { SPECIES_MACHAMP, #if P_GIGANTAMAX_FORMS - SPECIES_MACHAMP_GIGANTAMAX, + SPECIES_MACHAMP_GMAX, #endif FORM_SPECIES_END, }; @@ -252,7 +252,7 @@ static const u16 sMachampFormSpeciesIdTable[] = { static const u16 sGeodudeFormSpeciesIdTable[] = { SPECIES_GEODUDE, #if P_ALOLAN_FORMS - SPECIES_GEODUDE_ALOLAN, + SPECIES_GEODUDE_ALOLA, #endif FORM_SPECIES_END, }; @@ -260,7 +260,7 @@ static const u16 sGeodudeFormSpeciesIdTable[] = { static const u16 sGravelerFormSpeciesIdTable[] = { SPECIES_GRAVELER, #if P_ALOLAN_FORMS - SPECIES_GRAVELER_ALOLAN, + SPECIES_GRAVELER_ALOLA, #endif FORM_SPECIES_END, }; @@ -268,7 +268,7 @@ static const u16 sGravelerFormSpeciesIdTable[] = { static const u16 sGolemFormSpeciesIdTable[] = { SPECIES_GOLEM, #if P_ALOLAN_FORMS - SPECIES_GOLEM_ALOLAN, + SPECIES_GOLEM_ALOLA, #endif FORM_SPECIES_END, }; @@ -278,7 +278,7 @@ static const u16 sGolemFormSpeciesIdTable[] = { static const u16 sPonytaFormSpeciesIdTable[] = { SPECIES_PONYTA, #if P_GALARIAN_FORMS - SPECIES_PONYTA_GALARIAN, + SPECIES_PONYTA_GALAR, #endif FORM_SPECIES_END, }; @@ -286,7 +286,7 @@ static const u16 sPonytaFormSpeciesIdTable[] = { static const u16 sRapidashFormSpeciesIdTable[] = { SPECIES_RAPIDASH, #if P_GALARIAN_FORMS - SPECIES_RAPIDASH_GALARIAN, + SPECIES_RAPIDASH_GALAR, #endif FORM_SPECIES_END, }; @@ -296,7 +296,7 @@ static const u16 sRapidashFormSpeciesIdTable[] = { static const u16 sSlowpokeFormSpeciesIdTable[] = { SPECIES_SLOWPOKE, #if P_GALARIAN_FORMS - SPECIES_SLOWPOKE_GALARIAN, + SPECIES_SLOWPOKE_GALAR, #endif FORM_SPECIES_END, }; @@ -307,7 +307,7 @@ static const u16 sSlowbroFormSpeciesIdTable[] = { SPECIES_SLOWBRO_MEGA, #endif #if P_GALARIAN_FORMS - SPECIES_SLOWBRO_GALARIAN, + SPECIES_SLOWBRO_GALAR, #endif FORM_SPECIES_END, }; @@ -316,7 +316,7 @@ static const u16 sSlowbroFormSpeciesIdTable[] = { static const u16 sSlowkingFormSpeciesIdTable[] = { SPECIES_SLOWKING, #if P_GALARIAN_FORMS - SPECIES_SLOWKING_GALARIAN, + SPECIES_SLOWKING_GALAR, #endif FORM_SPECIES_END, }; @@ -327,7 +327,7 @@ static const u16 sSlowkingFormSpeciesIdTable[] = { static const u16 sFarfetchdFormSpeciesIdTable[] = { SPECIES_FARFETCHD, #if P_GALARIAN_FORMS - SPECIES_FARFETCHD_GALARIAN, + SPECIES_FARFETCHD_GALAR, #endif FORM_SPECIES_END, }; @@ -337,7 +337,7 @@ static const u16 sFarfetchdFormSpeciesIdTable[] = { static const u16 sGrimerFormSpeciesIdTable[] = { SPECIES_GRIMER, #if P_ALOLAN_FORMS - SPECIES_GRIMER_ALOLAN, + SPECIES_GRIMER_ALOLA, #endif FORM_SPECIES_END, }; @@ -345,7 +345,7 @@ static const u16 sGrimerFormSpeciesIdTable[] = { static const u16 sMukFormSpeciesIdTable[] = { SPECIES_MUK, #if P_ALOLAN_FORMS - SPECIES_MUK_ALOLAN, + SPECIES_MUK_ALOLA, #endif FORM_SPECIES_END, }; @@ -358,7 +358,7 @@ static const u16 sGengarFormSpeciesIdTable[] = { SPECIES_GENGAR_MEGA, #endif #if P_GIGANTAMAX_FORMS - SPECIES_GENGAR_GIGANTAMAX, + SPECIES_GENGAR_GMAX, #endif FORM_SPECIES_END, }; @@ -380,7 +380,7 @@ static const u16 sSteelixFormSpeciesIdTable[] = { static const u16 sKinglerFormSpeciesIdTable[] = { SPECIES_KINGLER, #if P_GIGANTAMAX_FORMS - SPECIES_KINGLER_GIGANTAMAX, + SPECIES_KINGLER_GMAX, #endif FORM_SPECIES_END, }; @@ -390,7 +390,7 @@ static const u16 sKinglerFormSpeciesIdTable[] = { static const u16 sVoltorbFormSpeciesIdTable[] = { SPECIES_VOLTORB, #if P_HISUIAN_FORMS - SPECIES_VOLTORB_HISUIAN, + SPECIES_VOLTORB_HISUI, #endif FORM_SPECIES_END, }; @@ -398,7 +398,7 @@ static const u16 sVoltorbFormSpeciesIdTable[] = { static const u16 sElectrodeFormSpeciesIdTable[] = { SPECIES_ELECTRODE, #if P_HISUIAN_FORMS - SPECIES_ELECTRODE_HISUIAN, + SPECIES_ELECTRODE_HISUI, #endif FORM_SPECIES_END, }; @@ -408,7 +408,7 @@ static const u16 sElectrodeFormSpeciesIdTable[] = { static const u16 sExeggutorFormSpeciesIdTable[] = { SPECIES_EXEGGUTOR, #if P_ALOLAN_FORMS - SPECIES_EXEGGUTOR_ALOLAN, + SPECIES_EXEGGUTOR_ALOLA, #endif FORM_SPECIES_END, }; @@ -418,8 +418,8 @@ static const u16 sExeggutorFormSpeciesIdTable[] = { static const u16 sMarowakFormSpeciesIdTable[] = { SPECIES_MAROWAK, #if P_ALOLAN_FORMS - SPECIES_MAROWAK_ALOLAN, - SPECIES_MAROWAK_ALOLAN_TOTEM, + SPECIES_MAROWAK_ALOLA, + SPECIES_MAROWAK_ALOLA_TOTEM, #endif FORM_SPECIES_END, }; @@ -429,7 +429,7 @@ static const u16 sMarowakFormSpeciesIdTable[] = { static const u16 sWeezingFormSpeciesIdTable[] = { SPECIES_WEEZING, #if P_GALARIAN_FORMS - SPECIES_WEEZING_GALARIAN, + SPECIES_WEEZING_GALAR, #endif FORM_SPECIES_END, }; @@ -449,7 +449,7 @@ static const u16 sKangaskhanFormSpeciesIdTable[] = { static const u16 sMrMimeFormSpeciesIdTable[] = { SPECIES_MR_MIME, #if P_GALARIAN_FORMS - SPECIES_MR_MIME_GALARIAN, + SPECIES_MR_MIME_GALAR, #endif FORM_SPECIES_END, }; @@ -481,9 +481,9 @@ static const u16 sPinsirFormSpeciesIdTable[] = { static const u16 sTaurosFormSpeciesIdTable[] = { SPECIES_TAUROS, #if P_PALDEAN_FORMS - SPECIES_TAUROS_PALDEAN_COMBAT_BREED, - SPECIES_TAUROS_PALDEAN_BLAZE_BREED, - SPECIES_TAUROS_PALDEAN_AQUA_BREED, + SPECIES_TAUROS_PALDEA_COMBAT, + SPECIES_TAUROS_PALDEA_BLAZE, + SPECIES_TAUROS_PALDEA_AQUA, #endif FORM_SPECIES_END, }; @@ -503,7 +503,7 @@ static const u16 sGyaradosFormSpeciesIdTable[] = { static const u16 sLaprasFormSpeciesIdTable[] = { SPECIES_LAPRAS, #if P_GIGANTAMAX_FORMS - SPECIES_LAPRAS_GIGANTAMAX, + SPECIES_LAPRAS_GMAX, #endif FORM_SPECIES_END, }; @@ -513,9 +513,9 @@ static const u16 sLaprasFormSpeciesIdTable[] = { static const u16 sEeveeFormSpeciesIdTable[] = { SPECIES_EEVEE, #if P_GIGANTAMAX_FORMS - SPECIES_EEVEE_GIGANTAMAX, + SPECIES_EEVEE_GMAX, #endif - SPECIES_EEVEE_PARTNER, + SPECIES_EEVEE_STARTER, FORM_SPECIES_END, }; #endif //P_FAMILY_EEVEE @@ -534,7 +534,7 @@ static const u16 sAerodactylFormSpeciesIdTable[] = { static const u16 sSnorlaxFormSpeciesIdTable[] = { SPECIES_SNORLAX, #if P_GIGANTAMAX_FORMS - SPECIES_SNORLAX_GIGANTAMAX, + SPECIES_SNORLAX_GMAX, #endif FORM_SPECIES_END, }; @@ -544,7 +544,7 @@ static const u16 sSnorlaxFormSpeciesIdTable[] = { static const u16 sArticunoFormSpeciesIdTable[] = { SPECIES_ARTICUNO, #if P_GALARIAN_FORMS - SPECIES_ARTICUNO_GALARIAN, + SPECIES_ARTICUNO_GALAR, #endif FORM_SPECIES_END, }; @@ -554,7 +554,7 @@ static const u16 sArticunoFormSpeciesIdTable[] = { static const u16 sZapdosFormSpeciesIdTable[] = { SPECIES_ZAPDOS, #if P_GALARIAN_FORMS - SPECIES_ZAPDOS_GALARIAN, + SPECIES_ZAPDOS_GALAR, #endif FORM_SPECIES_END, }; @@ -564,7 +564,7 @@ static const u16 sZapdosFormSpeciesIdTable[] = { static const u16 sMoltresFormSpeciesIdTable[] = { SPECIES_MOLTRES, #if P_GALARIAN_FORMS - SPECIES_MOLTRES_GALARIAN, + SPECIES_MOLTRES_GALAR, #endif FORM_SPECIES_END, }; @@ -585,7 +585,7 @@ static const u16 sMewtwoFormSpeciesIdTable[] = { static const u16 sTyphlosionFormSpeciesIdTable[] = { SPECIES_TYPHLOSION, #if P_HISUIAN_FORMS - SPECIES_TYPHLOSION_HISUIAN, + SPECIES_TYPHLOSION_HISUI, #endif FORM_SPECIES_END, }; @@ -605,7 +605,7 @@ static const u16 sAmpharosFormSpeciesIdTable[] = { static const u16 sWooperFormSpeciesIdTable[] = { SPECIES_WOOPER, #if P_PALDEAN_FORMS - SPECIES_WOOPER_PALDEAN, + SPECIES_WOOPER_PALDEA, #endif FORM_SPECIES_END, }; @@ -639,8 +639,8 @@ static const u16 sUnownFormSpeciesIdTable[] = { SPECIES_UNOWN_X, SPECIES_UNOWN_Y, SPECIES_UNOWN_Z, - SPECIES_UNOWN_EMARK, - SPECIES_UNOWN_QMARK, + SPECIES_UNOWN_EXCLAMATION, + SPECIES_UNOWN_QUESTION, FORM_SPECIES_END, }; #endif //P_FAMILY_UNOWN @@ -657,7 +657,7 @@ static const u16 sDudunsparceFormSpeciesIdTable[] = { static const u16 sQwilfishFormSpeciesIdTable[] = { SPECIES_QWILFISH, #if P_HISUIAN_FORMS - SPECIES_QWILFISH_HISUIAN, + SPECIES_QWILFISH_HISUI, #endif FORM_SPECIES_END, }; @@ -677,7 +677,7 @@ static const u16 sHeracrossFormSpeciesIdTable[] = { static const u16 sSneaselFormSpeciesIdTable[] = { SPECIES_SNEASEL, #if P_HISUIAN_FORMS - SPECIES_SNEASEL_HISUIAN, + SPECIES_SNEASEL_HISUI, #endif FORM_SPECIES_END, }; @@ -695,7 +695,7 @@ static const u16 sUrsalunaFormSpeciesIdTable[] = { static const u16 sCorsolaFormSpeciesIdTable[] = { SPECIES_CORSOLA, #if P_GALARIAN_FORMS - SPECIES_CORSOLA_GALARIAN, + SPECIES_CORSOLA_GALAR, #endif FORM_SPECIES_END, }; @@ -755,7 +755,7 @@ static const u16 sSwampertFormSpeciesIdTable[] = { static const u16 sZigzagoonFormSpeciesIdTable[] = { SPECIES_ZIGZAGOON, #if P_GALARIAN_FORMS - SPECIES_ZIGZAGOON_GALARIAN, + SPECIES_ZIGZAGOON_GALAR, #endif FORM_SPECIES_END, }; @@ -763,7 +763,7 @@ static const u16 sZigzagoonFormSpeciesIdTable[] = { static const u16 sLinooneFormSpeciesIdTable[] = { SPECIES_LINOONE, #if P_GALARIAN_FORMS - SPECIES_LINOONE_GALARIAN, + SPECIES_LINOONE_GALAR, #endif FORM_SPECIES_END, }; @@ -991,23 +991,23 @@ static const u16 sDeoxysFormSpeciesIdTable[] = { #if P_FAMILY_BURMY static const u16 sBurmyFormSpeciesIdTable[] = { - SPECIES_BURMY_PLANT_CLOAK, - SPECIES_BURMY_SANDY_CLOAK, - SPECIES_BURMY_TRASH_CLOAK, + SPECIES_BURMY_PLANT, + SPECIES_BURMY_SANDY, + SPECIES_BURMY_TRASH, FORM_SPECIES_END, }; static const u16 sWormadamFormSpeciesIdTable[] = { - SPECIES_WORMADAM_PLANT_CLOAK, - SPECIES_WORMADAM_SANDY_CLOAK, - SPECIES_WORMADAM_TRASH_CLOAK, + SPECIES_WORMADAM_PLANT, + SPECIES_WORMADAM_SANDY, + SPECIES_WORMADAM_TRASH, FORM_SPECIES_END, }; static const u16 sMothimFormSpeciesIdTable[] = { - SPECIES_MOTHIM_PLANT_CLOAK, - SPECIES_MOTHIM_SANDY_CLOAK, - SPECIES_MOTHIM_TRASH_CLOAK, + SPECIES_MOTHIM_PLANT, + SPECIES_MOTHIM_SANDY, + SPECIES_MOTHIM_TRASH, FORM_SPECIES_END, }; #endif //P_FAMILY_BURMY @@ -1022,14 +1022,14 @@ static const u16 sCherrimFormSpeciesIdTable[] = { #if P_FAMILY_SHELLOS static const u16 sShellosFormSpeciesIdTable[] = { - SPECIES_SHELLOS_WEST_SEA, - SPECIES_SHELLOS_EAST_SEA, + SPECIES_SHELLOS_WEST, + SPECIES_SHELLOS_EAST, FORM_SPECIES_END, }; static const u16 sGastrodonFormSpeciesIdTable[] = { - SPECIES_GASTRODON_WEST_SEA, - SPECIES_GASTRODON_EAST_SEA, + SPECIES_GASTRODON_WEST, + SPECIES_GASTRODON_EAST, FORM_SPECIES_END, }; #endif //P_FAMILY_SHELLOS @@ -1146,7 +1146,7 @@ static const u16 sArceusFormSpeciesIdTable[] = { static const u16 sSamurottFormSpeciesIdTable[] = { SPECIES_SAMUROTT, #if P_HISUIAN_FORMS - SPECIES_SAMUROTT_HISUIAN, + SPECIES_SAMUROTT_HISUI, #endif FORM_SPECIES_END, }; @@ -1166,7 +1166,7 @@ static const u16 sAudinoFormSpeciesIdTable[] = { static const u16 sLilligantFormSpeciesIdTable[] = { SPECIES_LILLIGANT, #if P_HISUIAN_FORMS - SPECIES_LILLIGANT_HISUIAN, + SPECIES_LILLIGANT_HISUI, #endif FORM_SPECIES_END, }; @@ -1181,8 +1181,8 @@ static const u16 sBasculinFormSpeciesIdTable[] = { }; static const u16 sBasculegionFormSpeciesIdTable[] = { - SPECIES_BASCULEGION_MALE, - SPECIES_BASCULEGION_FEMALE, + SPECIES_BASCULEGION_M, + SPECIES_BASCULEGION_F, FORM_SPECIES_END, }; #endif //P_FAMILY_BASCULIN @@ -1191,17 +1191,17 @@ static const u16 sBasculegionFormSpeciesIdTable[] = { static const u16 sDarumakaFormSpeciesIdTable[] = { SPECIES_DARUMAKA, #if P_GALARIAN_FORMS - SPECIES_DARUMAKA_GALARIAN, + SPECIES_DARUMAKA_GALAR, #endif FORM_SPECIES_END, }; static const u16 sDarmanitanFormSpeciesIdTable[] = { - SPECIES_DARMANITAN_STANDARD_MODE, - SPECIES_DARMANITAN_ZEN_MODE, + SPECIES_DARMANITAN_STANDARD, + SPECIES_DARMANITAN_ZEN, #if P_GALARIAN_FORMS - SPECIES_DARMANITAN_GALARIAN_STANDARD_MODE, - SPECIES_DARMANITAN_GALARIAN_ZEN_MODE, + SPECIES_DARMANITAN_GALAR_STANDARD, + SPECIES_DARMANITAN_GALAR_ZEN, #endif FORM_SPECIES_END, }; @@ -1211,7 +1211,7 @@ static const u16 sDarmanitanFormSpeciesIdTable[] = { static const u16 sYamaskFormSpeciesIdTable[] = { SPECIES_YAMASK, #if P_GALARIAN_FORMS - SPECIES_YAMASK_GALARIAN, + SPECIES_YAMASK_GALAR, #endif FORM_SPECIES_END, }; @@ -1221,7 +1221,7 @@ static const u16 sYamaskFormSpeciesIdTable[] = { static const u16 sGarbodorFormSpeciesIdTable[] = { SPECIES_GARBODOR, #if P_GIGANTAMAX_FORMS - SPECIES_GARBODOR_GIGANTAMAX, + SPECIES_GARBODOR_GMAX, #endif FORM_SPECIES_END, }; @@ -1231,7 +1231,7 @@ static const u16 sGarbodorFormSpeciesIdTable[] = { static const u16 sZoruaFormSpeciesIdTable[] = { SPECIES_ZORUA, #if P_HISUIAN_FORMS - SPECIES_ZORUA_HISUIAN, + SPECIES_ZORUA_HISUI, #endif FORM_SPECIES_END, }; @@ -1239,7 +1239,7 @@ static const u16 sZoruaFormSpeciesIdTable[] = { static const u16 sZoroarkFormSpeciesIdTable[] = { SPECIES_ZOROARK, #if P_HISUIAN_FORMS - SPECIES_ZOROARK_HISUIAN, + SPECIES_ZOROARK_HISUI, #endif FORM_SPECIES_END, }; @@ -1267,7 +1267,7 @@ static const u16 sSawsbuckFormSpeciesIdTable[] = { static const u16 sStunfiskFormSpeciesIdTable[] = { SPECIES_STUNFISK, #if P_GALARIAN_FORMS - SPECIES_STUNFISK_GALARIAN, + SPECIES_STUNFISK_GALAR, #endif FORM_SPECIES_END, }; @@ -1277,7 +1277,7 @@ static const u16 sStunfiskFormSpeciesIdTable[] = { static const u16 sBraviaryFormSpeciesIdTable[] = { SPECIES_BRAVIARY, #if P_HISUIAN_FORMS - SPECIES_BRAVIARY_HISUIAN, + SPECIES_BRAVIARY_HISUI, #endif FORM_SPECIES_END, }; @@ -1335,10 +1335,10 @@ static const u16 sMeloettaFormSpeciesIdTable[] = { #if P_FAMILY_GENESECT static const u16 sGenesectFormSpeciesIdTable[] = { SPECIES_GENESECT, - SPECIES_GENESECT_DOUSE_DRIVE, - SPECIES_GENESECT_SHOCK_DRIVE, - SPECIES_GENESECT_BURN_DRIVE, - SPECIES_GENESECT_CHILL_DRIVE, + SPECIES_GENESECT_DOUSE, + SPECIES_GENESECT_SHOCK, + SPECIES_GENESECT_BURN, + SPECIES_GENESECT_CHILL, FORM_SPECIES_END, }; #endif //P_FAMILY_GENESECT @@ -1373,7 +1373,7 @@ static const u16 sScatterbugFormSpeciesIdTable[] = { SPECIES_SCATTERBUG_OCEAN, SPECIES_SCATTERBUG_JUNGLE, SPECIES_SCATTERBUG_FANCY, - SPECIES_SCATTERBUG_POKE_BALL, + SPECIES_SCATTERBUG_POKEBALL, FORM_SPECIES_END, }; @@ -1397,7 +1397,7 @@ static const u16 sSpewpaFormSpeciesIdTable[] = { SPECIES_SPEWPA_OCEAN, SPECIES_SPEWPA_JUNGLE, SPECIES_SPEWPA_FANCY, - SPECIES_SPEWPA_POKE_BALL, + SPECIES_SPEWPA_POKEBALL, FORM_SPECIES_END, }; @@ -1421,37 +1421,37 @@ static const u16 sVivillonFormSpeciesIdTable[] = { SPECIES_VIVILLON_OCEAN, SPECIES_VIVILLON_JUNGLE, SPECIES_VIVILLON_FANCY, - SPECIES_VIVILLON_POKE_BALL, + SPECIES_VIVILLON_POKEBALL, FORM_SPECIES_END, }; #endif //P_FAMILY_SCATTERBUG #if P_FAMILY_FLABEBE static const u16 sFlabebeFormSpeciesIdTable[] = { - SPECIES_FLABEBE_RED_FLOWER, - SPECIES_FLABEBE_YELLOW_FLOWER, - SPECIES_FLABEBE_ORANGE_FLOWER, - SPECIES_FLABEBE_BLUE_FLOWER, - SPECIES_FLABEBE_WHITE_FLOWER, + SPECIES_FLABEBE_RED, + SPECIES_FLABEBE_YELLOW, + SPECIES_FLABEBE_ORANGE, + SPECIES_FLABEBE_BLUE, + SPECIES_FLABEBE_WHITE, FORM_SPECIES_END, }; static const u16 sFloetteFormSpeciesIdTable[] = { - SPECIES_FLOETTE_RED_FLOWER, - SPECIES_FLOETTE_YELLOW_FLOWER, - SPECIES_FLOETTE_ORANGE_FLOWER, - SPECIES_FLOETTE_BLUE_FLOWER, - SPECIES_FLOETTE_WHITE_FLOWER, - SPECIES_FLOETTE_ETERNAL_FLOWER, + SPECIES_FLOETTE_RED, + SPECIES_FLOETTE_YELLOW, + SPECIES_FLOETTE_ORANGE, + SPECIES_FLOETTE_BLUE, + SPECIES_FLOETTE_WHITE, + SPECIES_FLOETTE_ETERNAL, FORM_SPECIES_END, }; static const u16 sFlorgesFormSpeciesIdTable[] = { - SPECIES_FLORGES_RED_FLOWER, - SPECIES_FLORGES_YELLOW_FLOWER, - SPECIES_FLORGES_ORANGE_FLOWER, - SPECIES_FLORGES_BLUE_FLOWER, - SPECIES_FLORGES_WHITE_FLOWER, + SPECIES_FLORGES_RED, + SPECIES_FLORGES_YELLOW, + SPECIES_FLORGES_ORANGE, + SPECIES_FLORGES_BLUE, + SPECIES_FLORGES_WHITE, FORM_SPECIES_END, }; #endif //P_FAMILY_FLABEBE @@ -1474,8 +1474,8 @@ static const u16 sFurfrouFormSpeciesIdTable[] = { #if P_FAMILY_ESPURR static const u16 sMeowsticFormSpeciesIdTable[] = { - SPECIES_MEOWSTIC_MALE, - SPECIES_MEOWSTIC_FEMALE, + SPECIES_MEOWSTIC_M, + SPECIES_MEOWSTIC_F, FORM_SPECIES_END, }; #endif //P_FAMILY_ESPURR @@ -1492,7 +1492,7 @@ static const u16 sAegislashFormSpeciesIdTable[] = { static const u16 sSliggooFormSpeciesIdTable[] = { SPECIES_SLIGGOO, #if P_HISUIAN_FORMS - SPECIES_SLIGGOO_HISUIAN, + SPECIES_SLIGGOO_HISUI, #endif FORM_SPECIES_END, }; @@ -1500,7 +1500,7 @@ static const u16 sSliggooFormSpeciesIdTable[] = { static const u16 sGoodraFormSpeciesIdTable[] = { SPECIES_GOODRA, #if P_HISUIAN_FORMS - SPECIES_GOODRA_HISUIAN, + SPECIES_GOODRA_HISUI, #endif FORM_SPECIES_END, }; @@ -1528,7 +1528,7 @@ static const u16 sGourgeistFormSpeciesIdTable[] = { static const u16 sAvaluggFormSpeciesIdTable[] = { SPECIES_AVALUGG, #if P_HISUIAN_FORMS - SPECIES_AVALUGG_HISUIAN, + SPECIES_AVALUGG_HISUI, #endif FORM_SPECIES_END, }; @@ -1544,7 +1544,7 @@ static const u16 sXerneasFormSpeciesIdTable[] = { #if P_FAMILY_ZYGARDE static const u16 sZygardeFormSpeciesIdTable[] = { - SPECIES_ZYGARDE_50_AURA_BREAK, + SPECIES_ZYGARDE_50, SPECIES_ZYGARDE_10_AURA_BREAK, SPECIES_ZYGARDE_10_POWER_CONSTRUCT, SPECIES_ZYGARDE_50_POWER_CONSTRUCT, @@ -1575,7 +1575,7 @@ static const u16 sHoopaFormSpeciesIdTable[] = { static const u16 sDecidueyeFormSpeciesIdTable[] = { SPECIES_DECIDUEYE, #if P_HISUIAN_FORMS - SPECIES_DECIDUEYE_HISUIAN, + SPECIES_DECIDUEYE_HISUI, #endif FORM_SPECIES_END, }; @@ -1719,7 +1719,7 @@ static const u16 sMimikyuFormSpeciesIdTable[] = { SPECIES_MIMIKYU_DISGUISED, SPECIES_MIMIKYU_BUSTED, SPECIES_MIMIKYU_TOTEM_DISGUISED, - SPECIES_MIMIKYU_TOTEM_BUSTED, + SPECIES_MIMIKYU_BUSTED_TOTEM, FORM_SPECIES_END, }; #endif //P_FAMILY_MIMIKYU @@ -1747,7 +1747,7 @@ static const u16 sNecrozmaFormSpeciesIdTable[] = { #if P_FAMILY_MAGEARNA static const u16 sMagearnaFormSpeciesIdTable[] = { SPECIES_MAGEARNA, - SPECIES_MAGEARNA_ORIGINAL_COLOR, + SPECIES_MAGEARNA_ORIGINAL, FORM_SPECIES_END, }; #endif //P_FAMILY_MAGEARNA @@ -1756,7 +1756,7 @@ static const u16 sMagearnaFormSpeciesIdTable[] = { static const u16 sMelmetalFormSpeciesIdTable[] = { SPECIES_MELMETAL, #if P_GIGANTAMAX_FORMS - SPECIES_MELMETAL_GIGANTAMAX, + SPECIES_MELMETAL_GMAX, #endif FORM_SPECIES_END, }; @@ -1766,7 +1766,7 @@ static const u16 sMelmetalFormSpeciesIdTable[] = { static const u16 sRillaboomFormSpeciesIdTable[] = { SPECIES_RILLABOOM, #if P_GIGANTAMAX_FORMS - SPECIES_RILLABOOM_GIGANTAMAX, + SPECIES_RILLABOOM_GMAX, #endif FORM_SPECIES_END, }; @@ -1776,7 +1776,7 @@ static const u16 sRillaboomFormSpeciesIdTable[] = { static const u16 sCinderaceFormSpeciesIdTable[] = { SPECIES_CINDERACE, #if P_GIGANTAMAX_FORMS - SPECIES_CINDERACE_GIGANTAMAX, + SPECIES_CINDERACE_GMAX, #endif FORM_SPECIES_END, }; @@ -1786,7 +1786,7 @@ static const u16 sCinderaceFormSpeciesIdTable[] = { static const u16 sInteleonFormSpeciesIdTable[] = { SPECIES_INTELEON, #if P_GIGANTAMAX_FORMS - SPECIES_INTELEON_GIGANTAMAX, + SPECIES_INTELEON_GMAX, #endif FORM_SPECIES_END, }; @@ -1796,7 +1796,7 @@ static const u16 sInteleonFormSpeciesIdTable[] = { static const u16 sCorviknightFormSpeciesIdTable[] = { SPECIES_CORVIKNIGHT, #if P_GIGANTAMAX_FORMS - SPECIES_CORVIKNIGHT_GIGANTAMAX, + SPECIES_CORVIKNIGHT_GMAX, #endif FORM_SPECIES_END, }; @@ -1806,7 +1806,7 @@ static const u16 sCorviknightFormSpeciesIdTable[] = { static const u16 sOrbeetleFormSpeciesIdTable[] = { SPECIES_ORBEETLE, #if P_GIGANTAMAX_FORMS - SPECIES_ORBEETLE_GIGANTAMAX, + SPECIES_ORBEETLE_GMAX, #endif FORM_SPECIES_END, }; @@ -1816,7 +1816,7 @@ static const u16 sOrbeetleFormSpeciesIdTable[] = { static const u16 sDrednawFormSpeciesIdTable[] = { SPECIES_DREDNAW, #if P_GIGANTAMAX_FORMS - SPECIES_DREDNAW_GIGANTAMAX, + SPECIES_DREDNAW_GMAX, #endif FORM_SPECIES_END, }; @@ -1826,7 +1826,7 @@ static const u16 sDrednawFormSpeciesIdTable[] = { static const u16 sCoalossalFormSpeciesIdTable[] = { SPECIES_COALOSSAL, #if P_GIGANTAMAX_FORMS - SPECIES_COALOSSAL_GIGANTAMAX, + SPECIES_COALOSSAL_GMAX, #endif FORM_SPECIES_END, }; @@ -1836,7 +1836,7 @@ static const u16 sCoalossalFormSpeciesIdTable[] = { static const u16 sFlappleFormSpeciesIdTable[] = { SPECIES_FLAPPLE, #if P_GIGANTAMAX_FORMS - SPECIES_FLAPPLE_GIGANTAMAX, + SPECIES_FLAPPLE_GMAX, #endif FORM_SPECIES_END, }; @@ -1844,7 +1844,7 @@ static const u16 sFlappleFormSpeciesIdTable[] = { static const u16 sAppletunFormSpeciesIdTable[] = { SPECIES_APPLETUN, #if P_GIGANTAMAX_FORMS - SPECIES_APPLETUN_GIGANTAMAX, + SPECIES_APPLETUN_GMAX, #endif FORM_SPECIES_END, }; @@ -1854,7 +1854,7 @@ static const u16 sAppletunFormSpeciesIdTable[] = { static const u16 sSandacondaFormSpeciesIdTable[] = { SPECIES_SANDACONDA, #if P_GIGANTAMAX_FORMS - SPECIES_SANDACONDA_GIGANTAMAX, + SPECIES_SANDACONDA_GMAX, #endif FORM_SPECIES_END, }; @@ -1874,10 +1874,10 @@ static const u16 sToxtricityFormSpeciesIdTable[] = { SPECIES_TOXTRICITY_AMPED, SPECIES_TOXTRICITY_LOW_KEY, #if P_GIGANTAMAX_FORMS - SPECIES_TOXTRICITY_AMPED_GIGANTAMAX, + SPECIES_TOXTRICITY_AMPED_GMAX, #endif #if P_GIGANTAMAX_FORMS - SPECIES_TOXTRICITY_LOW_KEY_GIGANTAMAX, + SPECIES_TOXTRICITY_LOW_KEY_GMAX, #endif FORM_SPECIES_END, }; @@ -1887,7 +1887,7 @@ static const u16 sToxtricityFormSpeciesIdTable[] = { static const u16 sCentiskorchFormSpeciesIdTable[] = { SPECIES_CENTISKORCH, #if P_GIGANTAMAX_FORMS - SPECIES_CENTISKORCH_GIGANTAMAX, + SPECIES_CENTISKORCH_GMAX, #endif FORM_SPECIES_END, }; @@ -1911,7 +1911,7 @@ static const u16 sPolteageistFormSpeciesIdTable[] = { static const u16 sHattereneFormSpeciesIdTable[] = { SPECIES_HATTERENE, #if P_GIGANTAMAX_FORMS - SPECIES_HATTERENE_GIGANTAMAX, + SPECIES_HATTERENE_GMAX, #endif FORM_SPECIES_END, }; @@ -1921,7 +1921,7 @@ static const u16 sHattereneFormSpeciesIdTable[] = { static const u16 sGrimmsnarlFormSpeciesIdTable[] = { SPECIES_GRIMMSNARL, #if P_GIGANTAMAX_FORMS - SPECIES_GRIMMSNARL_GIGANTAMAX, + SPECIES_GRIMMSNARL_GMAX, #endif FORM_SPECIES_END, }; @@ -1993,7 +1993,7 @@ static const u16 sAlcremieFormSpeciesIdTable[] = { SPECIES_ALCREMIE_RIBBON_CARAMEL_SWIRL, SPECIES_ALCREMIE_RIBBON_RAINBOW_SWIRL, #if P_GIGANTAMAX_FORMS - SPECIES_ALCREMIE_GIGANTAMAX, + SPECIES_ALCREMIE_GMAX, #endif FORM_SPECIES_END, }; @@ -2001,16 +2001,16 @@ static const u16 sAlcremieFormSpeciesIdTable[] = { #if P_FAMILY_EISCUE static const u16 sEiscueFormSpeciesIdTable[] = { - SPECIES_EISCUE_ICE_FACE, - SPECIES_EISCUE_NOICE_FACE, + SPECIES_EISCUE_ICE, + SPECIES_EISCUE_NOICE, FORM_SPECIES_END, }; #endif //P_FAMILY_EISCUE #if P_FAMILY_INDEEDEE static const u16 sIndeedeeFormSpeciesIdTable[] = { - SPECIES_INDEEDEE_MALE, - SPECIES_INDEEDEE_FEMALE, + SPECIES_INDEEDEE_M, + SPECIES_INDEEDEE_F, FORM_SPECIES_END, }; #endif //P_FAMILY_INDEEDEE @@ -2027,7 +2027,7 @@ static const u16 sMorpekoFormSpeciesIdTable[] = { static const u16 sCopperajahFormSpeciesIdTable[] = { SPECIES_COPPERAJAH, #if P_GIGANTAMAX_FORMS - SPECIES_COPPERAJAH_GIGANTAMAX, + SPECIES_COPPERAJAH_GMAX, #endif FORM_SPECIES_END, }; @@ -2037,7 +2037,7 @@ static const u16 sCopperajahFormSpeciesIdTable[] = { static const u16 sDuraludonFormSpeciesIdTable[] = { SPECIES_DURALUDON, #if P_GIGANTAMAX_FORMS - SPECIES_DURALUDON_GIGANTAMAX, + SPECIES_DURALUDON_GMAX, #endif FORM_SPECIES_END, }; @@ -2045,16 +2045,16 @@ static const u16 sDuraludonFormSpeciesIdTable[] = { #if P_FAMILY_ZACIAN static const u16 sZacianFormSpeciesIdTable[] = { - SPECIES_ZACIAN_HERO_OF_MANY_BATTLES, - SPECIES_ZACIAN_CROWNED_SWORD, + SPECIES_ZACIAN_HERO, + SPECIES_ZACIAN_CROWNED, FORM_SPECIES_END, }; #endif //P_FAMILY_ZACIAN #if P_FAMILY_ZAMAZENTA static const u16 sZamazentaFormSpeciesIdTable[] = { - SPECIES_ZAMAZENTA_HERO_OF_MANY_BATTLES, - SPECIES_ZAMAZENTA_CROWNED_SHIELD, + SPECIES_ZAMAZENTA_HERO, + SPECIES_ZAMAZENTA_CROWNED, FORM_SPECIES_END, }; #endif //P_FAMILY_ZAMAZENTA @@ -2069,11 +2069,11 @@ static const u16 sEternatusFormSpeciesIdTable[] = { #if P_FAMILY_KUBFU static const u16 sUrshifuFormSpeciesIdTable[] = { - SPECIES_URSHIFU_SINGLE_STRIKE_STYLE, - SPECIES_URSHIFU_RAPID_STRIKE_STYLE, + SPECIES_URSHIFU_SINGLE_STRIKE, + SPECIES_URSHIFU_RAPID_STRIKE, #if P_GIGANTAMAX_FORMS - SPECIES_URSHIFU_SINGLE_STRIKE_STYLE_GIGANTAMAX, - SPECIES_URSHIFU_RAPID_STRIKE_STYLE_GIGANTAMAX, + SPECIES_URSHIFU_SINGLE_STRIKE_GMAX, + SPECIES_URSHIFU_RAPID_STRIKE_GMAX, #endif FORM_SPECIES_END, }; @@ -2090,8 +2090,8 @@ static const u16 sZarudeFormSpeciesIdTable[] = { #if P_FAMILY_CALYREX static const u16 sCalyrexFormSpeciesIdTable[] = { SPECIES_CALYREX, - SPECIES_CALYREX_ICE_RIDER, - SPECIES_CALYREX_SHADOW_RIDER, + SPECIES_CALYREX_ICE, + SPECIES_CALYREX_SHADOW, FORM_SPECIES_END, }; #endif //P_FAMILY_CALYREX @@ -2106,26 +2106,26 @@ static const u16 sEnamorusFormSpeciesIdTable[] = { #if P_FAMILY_LECHONK static const u16 sOinkologneFormSpeciesIdTable[] = { - SPECIES_OINKOLOGNE_MALE, - SPECIES_OINKOLOGNE_FEMALE, + SPECIES_OINKOLOGNE_M, + SPECIES_OINKOLOGNE_F, FORM_SPECIES_END, }; #endif //P_FAMILY_LECHONK #if P_FAMILY_TANDEMAUS static const u16 sMausholdFormSpeciesIdTable[] = { - SPECIES_MAUSHOLD_FAMILY_OF_THREE, - SPECIES_MAUSHOLD_FAMILY_OF_FOUR, + SPECIES_MAUSHOLD_THREE, + SPECIES_MAUSHOLD_FOUR, FORM_SPECIES_END, }; #endif //P_FAMILY_TANDEMAUS #if P_FAMILY_SQUAWKABILLY static const u16 sSquawkabillyFormSpeciesIdTable[] = { - SPECIES_SQUAWKABILLY_GREEN_PLUMAGE, - SPECIES_SQUAWKABILLY_BLUE_PLUMAGE, - SPECIES_SQUAWKABILLY_YELLOW_PLUMAGE, - SPECIES_SQUAWKABILLY_WHITE_PLUMAGE, + SPECIES_SQUAWKABILLY_GREEN, + SPECIES_SQUAWKABILLY_BLUE, + SPECIES_SQUAWKABILLY_YELLOW, + SPECIES_SQUAWKABILLY_WHITE, FORM_SPECIES_END, }; #endif //P_FAMILY_SQUAWKABILLY @@ -2157,15 +2157,15 @@ static const u16 sGimmighoulFormSpeciesIdTable[] = { #if P_FAMILY_OGERPON static const u16 sOgerponFormSpeciesIdTable[] = { - SPECIES_OGERPON_TEAL_MASK, - SPECIES_OGERPON_WELLSPRING_MASK, - SPECIES_OGERPON_HEARTHFLAME_MASK, - SPECIES_OGERPON_CORNERSTONE_MASK, + SPECIES_OGERPON_TEAL, + SPECIES_OGERPON_WELLSPRING, + SPECIES_OGERPON_HEARTHFLAME, + SPECIES_OGERPON_CORNERSTONE, #if P_TERA_FORMS - SPECIES_OGERPON_TEAL_MASK_TERA, - SPECIES_OGERPON_WELLSPRING_MASK_TERA, - SPECIES_OGERPON_HEARTHFLAME_MASK_TERA, - SPECIES_OGERPON_CORNERSTONE_MASK_TERA, + SPECIES_OGERPON_TEAL_TERA, + SPECIES_OGERPON_WELLSPRING_TERA, + SPECIES_OGERPON_HEARTHFLAME_TERA, + SPECIES_OGERPON_CORNERSTONE_TERA, #endif FORM_SPECIES_END, }; diff --git a/src/data/pokemon/pokedex_orders.h b/src/data/pokemon/pokedex_orders.h index 21968dd6eac9..9cbca9ba63fa 100644 --- a/src/data/pokemon/pokedex_orders.h +++ b/src/data/pokemon/pokedex_orders.h @@ -1366,16 +1366,16 @@ const u16 gPokedexOrder_Weight[] = //NATIONAL_DEX_PIKACHU_ROCK_STAR, //NATIONAL_DEX_PIKACHU_BELLE, //NATIONAL_DEX_PIKACHU_POP_STAR, - //NATIONAL_DEX_PIKACHU_PH_D, + //NATIONAL_DEX_PIKACHU_PHD, //NATIONAL_DEX_PIKACHU_LIBRE, - //NATIONAL_DEX_PIKACHU_ORIGINAL_CAP, - //NATIONAL_DEX_PIKACHU_HOENN_CAP, - //NATIONAL_DEX_PIKACHU_SINNOH_CAP, - //NATIONAL_DEX_PIKACHU_UNOVA_CAP, - //NATIONAL_DEX_PIKACHU_KALOS_CAP, - //NATIONAL_DEX_PIKACHU_ALOLA_CAP, + //NATIONAL_DEX_PIKACHU_ORIGINAL, + //NATIONAL_DEX_PIKACHU_HOENN, + //NATIONAL_DEX_PIKACHU_SINNOH, + //NATIONAL_DEX_PIKACHU_UNOVA, + //NATIONAL_DEX_PIKACHU_KALOS, + //NATIONAL_DEX_PIKACHU_ALOLA, //NATIONAL_DEX_PIKACHU_PARTNER_CAP, - //NATIONAL_DEX_PIKACHU_WORLD_CAP, + //NATIONAL_DEX_PIKACHU_WORLD, NATIONAL_DEX_MAGNEMITE, NATIONAL_DEX_SENTRET, NATIONAL_DEX_SMOOCHUM, diff --git a/src/data/pokemon/species_info.h b/src/data/pokemon/species_info.h index b0945ed43f66..65b8c908767b 100644 --- a/src/data/pokemon/species_info.h +++ b/src/data/pokemon/species_info.h @@ -30,8 +30,12 @@ #define OVERWORLD_PAL(...) \ .overworldPalette = DEFAULT(NULL, __VA_ARGS__), \ .overworldShinyPalette = DEFAULT_2(NULL, __VA_ARGS__), +#define OVERWORLD_PAL_FEMALE(...) \ + .overworldPaletteFemale = DEFAULT(NULL, __VA_ARGS__), \ + .overworldShinyPaletteFemale = DEFAULT_2(NULL, __VA_ARGS__), #else #define OVERWORLD_PAL(...) +#define OVERWORLD_PAL_FEMALE(...) #endif //OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE #define OVERWORLD(picTable, _size, shadow, _tracks, ...) \ @@ -54,8 +58,55 @@ .affineAnims = gDummySpriteAffineAnimTable, \ }, \ OVERWORLD_PAL(__VA_ARGS__) + +#define OVERWORLD_SET_ANIM(picTable, _size, shadow, _tracks, _anims, ...) \ +.overworldData = { \ + .tileTag = TAG_NONE, \ + .paletteTag = OBJ_EVENT_PAL_TAG_DYNAMIC, \ + .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, \ + .size = (_size == SIZE_32x32 ? 512 : 2048), \ + .width = (_size == SIZE_32x32 ? 32 : 64), \ + .height = (_size == SIZE_32x32 ? 32 : 64), \ + .paletteSlot = PALSLOT_NPC_1, \ + .shadowSize = shadow, \ + .inanimate = FALSE, \ + .compressed = COMP, \ + .tracks = _tracks, \ + .oam = (_size == SIZE_32x32 ? &gObjectEventBaseOam_32x32 : &gObjectEventBaseOam_64x64), \ + .subspriteTables = (_size == SIZE_32x32 ? sOamTables_32x32 : sOamTables_64x64), \ + .anims = _anims, \ + .images = picTable, \ + .affineAnims = gDummySpriteAffineAnimTable, \ +}, \ + OVERWORLD_PAL(__VA_ARGS__) + +#define OVERWORLD_FEMALE(picTable, _size, shadow, _tracks, ...) \ +.overworldDataFemale = { \ + .tileTag = TAG_NONE, \ + .paletteTag = OBJ_EVENT_PAL_TAG_DYNAMIC, \ + .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, \ + .size = (_size == SIZE_32x32 ? 512 : 2048), \ + .width = (_size == SIZE_32x32 ? 32 : 64), \ + .height = (_size == SIZE_32x32 ? 32 : 64), \ + .paletteSlot = PALSLOT_NPC_1, \ + .shadowSize = shadow, \ + .inanimate = FALSE, \ + .compressed = COMP, \ + .tracks = _tracks, \ + .oam = (_size == SIZE_32x32 ? &gObjectEventBaseOam_32x32 : &gObjectEventBaseOam_64x64), \ + .subspriteTables = (_size == SIZE_32x32 ? sOamTables_32x32 : sOamTables_64x64), \ + .anims = sAnimTable_Following, \ + .images = picTable, \ + .affineAnims = gDummySpriteAffineAnimTable, \ +}, \ + OVERWORLD_PAL_FEMALE(__VA_ARGS__) + #else #define OVERWORLD(picTable, _size, shadow, _tracks, ...) +#define OVERWORLD_SET_ANIM(picTable, _size, shadow, _tracks, _anims, ...) +#define OVERWORLD_FEMALE(picTable, _size, shadow, _tracks, ...) +#define OVERWORLD_PAL(...) +#define OVERWORLD_PAL_FEMALE(...) #endif //OW_POKEMON_OBJECT_EVENTS // Maximum value for a female Pokémon is 254 (MON_FEMALE) which is 100% female. diff --git a/src/data/pokemon/species_info/gen_1_families.h b/src/data/pokemon/species_info/gen_1_families.h index bb5ba4a0d45d..5a518e012272 100644 --- a/src/data/pokemon/species_info/gen_1_families.h +++ b/src/data/pokemon/species_info/gen_1_families.h @@ -198,6 +198,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Venusaur, gShinyOverworldPalette_Venusaur ) + OVERWORLD_FEMALE( + sPicTable_VenusaurF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sVenusaurLevelUpLearnset, .teachableLearnset = sVenusaurTeachableLearnset, .formSpeciesIdTable = sVenusaurFormSpeciesIdTable, @@ -263,7 +269,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = #endif //P_MEGA_EVOLUTIONS #if P_GIGANTAMAX_FORMS - [SPECIES_VENUSAUR_GIGANTAMAX] = + [SPECIES_VENUSAUR_GMAX] = { .baseHP = 80, .baseAttack = 82, @@ -632,7 +638,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = #endif //P_MEGA_EVOLUTIONS #if P_GIGANTAMAX_FORMS - [SPECIES_CHARIZARD_GIGANTAMAX] = + [SPECIES_CHARIZARD_GMAX] = { .baseHP = 78, .baseAttack = 84, @@ -946,7 +952,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = #endif //P_MEGA_EVOLUTIONS #if P_GIGANTAMAX_FORMS - [SPECIES_BLASTOISE_GIGANTAMAX] = + [SPECIES_BLASTOISE_GMAX] = { .baseHP = 79, .baseAttack = 83, @@ -1205,6 +1211,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Butterfree, gShinyOverworldPalette_Butterfree ) + OVERWORLD_FEMALE( + sPicTable_ButterfreeF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sButterfreeLevelUpLearnset, .teachableLearnset = sButterfreeTeachableLearnset, .formSpeciesIdTable = sButterfreeFormSpeciesIdTable, @@ -1212,7 +1224,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = }, #if P_GIGANTAMAX_FORMS - [SPECIES_BUTTERFREE_GIGANTAMAX] = + [SPECIES_BUTTERFREE_GMAX] = { .baseHP = 60, .baseAttack = 45, @@ -1874,6 +1886,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Rattata, gShinyOverworldPalette_Rattata ) + OVERWORLD_FEMALE( + sPicTable_RattataF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sRattataLevelUpLearnset, .teachableLearnset = sRattataTeachableLearnset, .eggMoveLearnset = sRattataEggMoveLearnset, @@ -1942,13 +1960,19 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Raticate, gShinyOverworldPalette_Raticate ) + OVERWORLD_FEMALE( + sPicTable_RaticateF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sRaticateLevelUpLearnset, .teachableLearnset = sRaticateTeachableLearnset, .formSpeciesIdTable = sRaticateFormSpeciesIdTable, }, #if P_ALOLAN_FORMS - [SPECIES_RATTATA_ALOLAN] = + [SPECIES_RATTATA_ALOLA] = { .baseHP = 30, .baseAttack = 56, @@ -2011,11 +2035,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .teachableLearnset = sRattataAlolanTeachableLearnset, .eggMoveLearnset = sRattataAlolanEggMoveLearnset, .formSpeciesIdTable = sRattataFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_LEVEL_NIGHT, 20, SPECIES_RATICATE_ALOLAN}, - {EVO_NONE, 0, SPECIES_RATICATE_ALOLAN_TOTEM}), + .evolutions = EVOLUTION({EVO_LEVEL_NIGHT, 20, SPECIES_RATICATE_ALOLA}, + {EVO_NONE, 0, SPECIES_RATICATE_ALOLA_TOTEM}), }, - [SPECIES_RATICATE_ALOLAN] = + [SPECIES_RATICATE_ALOLA] = { .baseHP = 75, .baseAttack = 71, @@ -2075,7 +2099,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .formSpeciesIdTable = sRaticateFormSpeciesIdTable, }, - [SPECIES_RATICATE_ALOLAN_TOTEM] = + [SPECIES_RATICATE_ALOLA_TOTEM] = { .baseHP = 75, .baseAttack = 71, @@ -2121,6 +2145,14 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .iconPalIndex = 2, SHADOW(-4, 3, SHADOW_SIZE_L) FOOTPRINT(Raticate) + OVERWORLD( + sPicTable_RaticateAlolan, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_RaticateAlolan, + gShinyOverworldPalette_RaticateAlolan + ) .isTotem = TRUE, .isAlolanForm = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, @@ -2588,13 +2620,19 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Pikachu, gShinyOverworldPalette_Pikachu ) + OVERWORLD_FEMALE( + sPicTable_PikachuF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) FOOTPRINT(Pikachu) .levelUpLearnset = sPikachuLevelUpLearnset, .teachableLearnset = sPikachuTeachableLearnset, .formSpeciesIdTable = sPikachuFormSpeciesIdTable, .formChangeTable = sPikachuFormChangeTable, .evolutions = EVOLUTION({EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_RAICHU}, - {EVO_NONE, 0, SPECIES_RAICHU_ALOLAN}), + {EVO_NONE, 0, SPECIES_RAICHU_ALOLA}), }, #if P_COSPLAY_PIKACHU_FORMS @@ -2804,7 +2842,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .formSpeciesIdTable = sPikachuFormSpeciesIdTable, }, - [SPECIES_PIKACHU_PH_D] = + [SPECIES_PIKACHU_PHD] = { .baseHP = 35, .baseAttack = 55, @@ -2909,7 +2947,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = #endif //P_COSPLAY_PIKACHU_FORMS #if P_CAP_PIKACHU_FORMS - [SPECIES_PIKACHU_ORIGINAL_CAP] = + [SPECIES_PIKACHU_ORIGINAL] = { .baseHP = 35, .baseAttack = 55, @@ -2965,7 +3003,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .formSpeciesIdTable = sPikachuFormSpeciesIdTable, }, - [SPECIES_PIKACHU_HOENN_CAP] = + [SPECIES_PIKACHU_HOENN] = { .baseHP = 35, .baseAttack = 55, @@ -3020,7 +3058,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .formSpeciesIdTable = sPikachuFormSpeciesIdTable, }, - [SPECIES_PIKACHU_SINNOH_CAP] = + [SPECIES_PIKACHU_SINNOH] = { .baseHP = 35, .baseAttack = 55, @@ -3075,7 +3113,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .formSpeciesIdTable = sPikachuFormSpeciesIdTable, }, - [SPECIES_PIKACHU_UNOVA_CAP] = + [SPECIES_PIKACHU_UNOVA] = { .baseHP = 35, .baseAttack = 55, @@ -3130,7 +3168,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .formSpeciesIdTable = sPikachuFormSpeciesIdTable, }, - [SPECIES_PIKACHU_KALOS_CAP] = + [SPECIES_PIKACHU_KALOS] = { .baseHP = 35, .baseAttack = 55, @@ -3185,7 +3223,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .formSpeciesIdTable = sPikachuFormSpeciesIdTable, }, - [SPECIES_PIKACHU_ALOLA_CAP] = + [SPECIES_PIKACHU_ALOLA] = { .baseHP = 35, .baseAttack = 55, @@ -3296,7 +3334,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .formSpeciesIdTable = sPikachuFormSpeciesIdTable, }, - [SPECIES_PIKACHU_WORLD_CAP] = + [SPECIES_PIKACHU_WORLD] = { .baseHP = 35, .baseAttack = 55, @@ -3354,7 +3392,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = #endif //P_CAP_PIKACHU_FORMS #if P_GIGANTAMAX_FORMS - [SPECIES_PIKACHU_GIGANTAMAX] = + [SPECIES_PIKACHU_GMAX] = { .baseHP = 35, .baseAttack = 55, @@ -3412,7 +3450,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = }, #endif //P_GIGANTAMAX_FORMS - [SPECIES_PIKACHU_PARTNER] = + [SPECIES_PIKACHU_STARTER] = { .baseHP = 45, .baseAttack = 80, @@ -3467,6 +3505,14 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = #endif SHADOW(-3, 5, SHADOW_SIZE_M) FOOTPRINT(Pikachu) + OVERWORLD( + sPicTable_Pikachu, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_Pikachu, + gShinyOverworldPalette_Pikachu + ) .cannotBeTraded = TRUE, .perfectIVCount = NUM_STATS, .levelUpLearnset = sPikachuLevelUpLearnset, @@ -3545,13 +3591,19 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Raichu, gShinyOverworldPalette_Raichu ) + OVERWORLD_FEMALE( + sPicTable_RaichuF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sRaichuLevelUpLearnset, .teachableLearnset = sRaichuTeachableLearnset, .formSpeciesIdTable = sRaichuFormSpeciesIdTable, }, #if P_ALOLAN_FORMS - [SPECIES_RAICHU_ALOLAN] = + [SPECIES_RAICHU_ALOLA] = { .baseHP = 60, .baseAttack = 85, @@ -3747,7 +3799,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = }, #if P_ALOLAN_FORMS - [SPECIES_SANDSHREW_ALOLAN] = + [SPECIES_SANDSHREW_ALOLA] = { .baseHP = 50, .baseAttack = 75, @@ -3810,10 +3862,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .teachableLearnset = sSandshrewAlolanTeachableLearnset, .eggMoveLearnset = sSandshrewAlolanEggMoveLearnset, .formSpeciesIdTable = sSandshrewFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_ITEM, ITEM_ICE_STONE, SPECIES_SANDSLASH_ALOLAN}), + .evolutions = EVOLUTION({EVO_ITEM, ITEM_ICE_STONE, SPECIES_SANDSLASH_ALOLA}), }, - [SPECIES_SANDSLASH_ALOLAN] = + [SPECIES_SANDSLASH_ALOLA] = { .baseHP = 75, .baseAttack = 100, @@ -4648,7 +4700,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = }, #if P_ALOLAN_FORMS - [SPECIES_VULPIX_ALOLAN] = + [SPECIES_VULPIX_ALOLA] = { .baseHP = 38, .baseAttack = 41, @@ -4711,10 +4763,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .teachableLearnset = sVulpixAlolanTeachableLearnset, .eggMoveLearnset = sVulpixAlolanEggMoveLearnset, .formSpeciesIdTable = sVulpixFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_ITEM, ITEM_ICE_STONE, SPECIES_NINETALES_ALOLAN}), + .evolutions = EVOLUTION({EVO_ITEM, ITEM_ICE_STONE, SPECIES_NINETALES_ALOLA}), }, - [SPECIES_NINETALES_ALOLAN] = + [SPECIES_NINETALES_ALOLA] = { .baseHP = 73, .baseAttack = 67, @@ -5065,6 +5117,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Zubat, gShinyOverworldPalette_Zubat ) + OVERWORLD_FEMALE( + sPicTable_ZubatF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sZubatLevelUpLearnset, .teachableLearnset = sZubatTeachableLearnset, .eggMoveLearnset = sZubatEggMoveLearnset, @@ -5133,6 +5191,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Golbat, gShinyOverworldPalette_Golbat ) + OVERWORLD_FEMALE( + sPicTable_GolbatF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sGolbatLevelUpLearnset, .teachableLearnset = sGolbatTeachableLearnset, .evolutions = EVOLUTION({EVO_FRIENDSHIP, 0, SPECIES_CROBAT}), @@ -5336,6 +5400,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Gloom, gShinyOverworldPalette_Gloom ) + OVERWORLD_FEMALE( + sPicTable_GloomF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sGloomLevelUpLearnset, .teachableLearnset = sGloomTeachableLearnset, .evolutions = EVOLUTION({EVO_ITEM, ITEM_LEAF_STONE, SPECIES_VILEPLUME}, @@ -5412,6 +5482,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Vileplume, gShinyOverworldPalette_Vileplume ) + OVERWORLD_FEMALE( + sPicTable_VileplumeF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sVileplumeLevelUpLearnset, .teachableLearnset = sVileplumeTeachableLearnset, }, @@ -5911,7 +5987,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = }, #if P_ALOLAN_FORMS - [SPECIES_DIGLETT_ALOLAN] = + [SPECIES_DIGLETT_ALOLA] = { .baseHP = 10, .baseAttack = 55, @@ -5974,10 +6050,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .teachableLearnset = sDiglettAlolanTeachableLearnset, .eggMoveLearnset = sDiglettAlolanEggMoveLearnset, .formSpeciesIdTable = sDiglettFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_LEVEL, 26, SPECIES_DUGTRIO_ALOLAN}), + .evolutions = EVOLUTION({EVO_LEVEL, 26, SPECIES_DUGTRIO_ALOLA}), }, - [SPECIES_DUGTRIO_ALOLAN] = + [SPECIES_DUGTRIO_ALOLA] = { .baseHP = 35, .baseAttack = DUGTRIO_ATTACK, @@ -6185,7 +6261,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = }, #if P_ALOLAN_FORMS - [SPECIES_MEOWTH_ALOLAN] = + [SPECIES_MEOWTH_ALOLA] = { .baseHP = 40, .baseAttack = 35, @@ -6248,10 +6324,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .teachableLearnset = sMeowthAlolanTeachableLearnset, .eggMoveLearnset = sMeowthAlolanEggMoveLearnset, .formSpeciesIdTable = sMeowthFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_FRIENDSHIP, 0, SPECIES_PERSIAN_ALOLAN}), + .evolutions = EVOLUTION({EVO_FRIENDSHIP, 0, SPECIES_PERSIAN_ALOLA}), }, - [SPECIES_PERSIAN_ALOLAN] = + [SPECIES_PERSIAN_ALOLA] = { .baseHP = 65, .baseAttack = 60, @@ -6317,7 +6393,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = #endif //P_ALOLAN_FORMS #if P_GALARIAN_FORMS - [SPECIES_MEOWTH_GALARIAN] = + [SPECIES_MEOWTH_GALAR] = { .baseHP = 50, .baseAttack = 65, @@ -6444,7 +6520,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = #endif //P_GALARIAN_FORMS #if P_GIGANTAMAX_FORMS - [SPECIES_MEOWTH_GIGANTAMAX] = + [SPECIES_MEOWTH_GMAX] = { .baseHP = 40, .baseAttack = 45, @@ -6959,7 +7035,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = }, #if P_HISUIAN_FORMS - [SPECIES_GROWLITHE_HISUIAN] = + [SPECIES_GROWLITHE_HISUI] = { .baseHP = 60, .baseAttack = 75, @@ -7020,10 +7096,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .levelUpLearnset = sGrowlitheHisuianLevelUpLearnset, .teachableLearnset = sGrowlitheHisuianTeachableLearnset, .formSpeciesIdTable = sGrowlitheFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_ITEM, ITEM_FIRE_STONE, SPECIES_ARCANINE_HISUIAN}), + .evolutions = EVOLUTION({EVO_ITEM, ITEM_FIRE_STONE, SPECIES_ARCANINE_HISUI}), }, - [SPECIES_ARCANINE_HISUIAN] = + [SPECIES_ARCANINE_HISUI] = { .baseHP = 95, .baseAttack = 115, @@ -7362,6 +7438,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Politoed, gShinyOverworldPalette_Politoed ) + OVERWORLD_FEMALE( + sPicTable_PolitoedF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sPolitoedLevelUpLearnset, .teachableLearnset = sPolitoedTeachableLearnset, }, @@ -7502,6 +7584,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Kadabra, gShinyOverworldPalette_Kadabra ) + OVERWORLD_FEMALE( + sPicTable_KadabraF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_NONE + ) .levelUpLearnset = sKadabraLevelUpLearnset, .teachableLearnset = sKadabraTeachableLearnset, .evolutions = EVOLUTION({EVO_TRADE, 0, SPECIES_ALAKAZAM}, @@ -7580,6 +7668,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Alakazam, gShinyOverworldPalette_Alakazam ) + OVERWORLD_FEMALE( + sPicTable_AlakazamF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_NONE + ) .levelUpLearnset = sAlakazamLevelUpLearnset, .teachableLearnset = sAlakazamTeachableLearnset, .formSpeciesIdTable = sAlakazamFormSpeciesIdTable, @@ -7867,7 +7961,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = }, #if P_GIGANTAMAX_FORMS - [SPECIES_MACHAMP_GIGANTAMAX] = + [SPECIES_MACHAMP_GMAX] = { .baseHP = 90, .baseAttack = 130, @@ -8472,7 +8566,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = }, #if P_ALOLAN_FORMS - [SPECIES_GEODUDE_ALOLAN] = + [SPECIES_GEODUDE_ALOLA] = { .baseHP = 40, .baseAttack = 80, @@ -8536,10 +8630,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .teachableLearnset = sGeodudeAlolanTeachableLearnset, .eggMoveLearnset = sGeodudeAlolanEggMoveLearnset, .formSpeciesIdTable = sGeodudeFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_LEVEL, 25, SPECIES_GRAVELER_ALOLAN}), + .evolutions = EVOLUTION({EVO_LEVEL, 25, SPECIES_GRAVELER_ALOLA}), }, - [SPECIES_GRAVELER_ALOLAN] = + [SPECIES_GRAVELER_ALOLA] = { .baseHP = 55, .baseAttack = 95, @@ -8601,11 +8695,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .levelUpLearnset = sGravelerAlolanLevelUpLearnset, .teachableLearnset = sGravelerAlolanTeachableLearnset, .formSpeciesIdTable = sGravelerFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_TRADE, 0, SPECIES_GOLEM_ALOLAN}, - {EVO_ITEM, ITEM_LINKING_CORD, SPECIES_GOLEM_ALOLAN}), + .evolutions = EVOLUTION({EVO_TRADE, 0, SPECIES_GOLEM_ALOLA}, + {EVO_ITEM, ITEM_LINKING_CORD, SPECIES_GOLEM_ALOLA}), }, - [SPECIES_GOLEM_ALOLAN] = + [SPECIES_GOLEM_ALOLA] = { .baseHP = 80, .baseAttack = GOLEM_ATTACK, @@ -8800,7 +8894,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = }, #if P_GALARIAN_FORMS - [SPECIES_PONYTA_GALARIAN] = + [SPECIES_PONYTA_GALAR] = { .baseHP = 50, .baseAttack = 85, @@ -8862,10 +8956,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .teachableLearnset = sPonytaGalarianTeachableLearnset, .eggMoveLearnset = sPonytaGalarianEggMoveLearnset, .formSpeciesIdTable = sPonytaFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_LEVEL, 40, SPECIES_RAPIDASH_GALARIAN}), + .evolutions = EVOLUTION({EVO_LEVEL, 40, SPECIES_RAPIDASH_GALAR}), }, - [SPECIES_RAPIDASH_GALARIAN] = + [SPECIES_RAPIDASH_GALAR] = { .baseHP = 65, .baseAttack = 100, @@ -9187,7 +9281,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = #endif //P_MEGA_EVOLUTIONS #if P_GALARIAN_FORMS - [SPECIES_SLOWPOKE_GALARIAN] = + [SPECIES_SLOWPOKE_GALAR] = { .baseHP = 90, .baseAttack = 65, @@ -9249,11 +9343,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .teachableLearnset = sSlowpokeGalarianTeachableLearnset, .eggMoveLearnset = sSlowpokeGalarianEggMoveLearnset, .formSpeciesIdTable = sSlowpokeFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_ITEM, ITEM_GALARICA_CUFF, SPECIES_SLOWBRO_GALARIAN}, - {EVO_ITEM, ITEM_GALARICA_WREATH, SPECIES_SLOWKING_GALARIAN}), + .evolutions = EVOLUTION({EVO_ITEM, ITEM_GALARICA_CUFF, SPECIES_SLOWBRO_GALAR}, + {EVO_ITEM, ITEM_GALARICA_WREATH, SPECIES_SLOWKING_GALAR}), }, - [SPECIES_SLOWBRO_GALARIAN] = + [SPECIES_SLOWBRO_GALAR] = { .baseHP = 95, .baseAttack = 100, @@ -9303,11 +9397,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .iconPalIndex = 0, SHADOW(-5, 9, SHADOW_SIZE_L) FOOTPRINT(Slowbro) - OVERWORLD( + OVERWORLD_SET_ANIM( sPicTable_SlowbroGalarian, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following_Asym, gOverworldPalette_SlowbroGalarian, gShinyOverworldPalette_SlowbroGalarian ) @@ -9318,7 +9413,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = }, #if P_GEN_2_CROSS_EVOS - [SPECIES_SLOWKING_GALARIAN] = + [SPECIES_SLOWKING_GALAR] = { .baseHP = 95, .baseAttack = 65, @@ -9647,11 +9742,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .iconPalIndex = 1, SHADOW(-3, 5, SHADOW_SIZE_M) FOOTPRINT(Farfetchd) - OVERWORLD( + OVERWORLD_SET_ANIM( sPicTable_Farfetchd, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following_Asym, gOverworldPalette_Farfetchd, gShinyOverworldPalette_Farfetchd ) @@ -9662,7 +9758,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = }, #if P_GALARIAN_FORMS - [SPECIES_FARFETCHD_GALARIAN] = + [SPECIES_FARFETCHD_GALAR] = { .baseHP = 52, .baseAttack = FARFETCHD_ATTACK + 5, @@ -9855,6 +9951,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Doduo, gShinyOverworldPalette_Doduo ) + OVERWORLD_FEMALE( + sPicTable_DoduoF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sDoduoLevelUpLearnset, .teachableLearnset = sDoduoTeachableLearnset, .eggMoveLearnset = sDoduoEggMoveLearnset, @@ -9929,6 +10031,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Dodrio, gShinyOverworldPalette_Dodrio ) + OVERWORLD_FEMALE( + sPicTable_DodrioF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sDodrioLevelUpLearnset, .teachableLearnset = sDodrioTeachableLearnset, }, @@ -10200,7 +10308,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = }, #if P_ALOLAN_FORMS - [SPECIES_GRIMER_ALOLAN] = + [SPECIES_GRIMER_ALOLA] = { .baseHP = 80, .baseAttack = 80, @@ -10263,10 +10371,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .teachableLearnset = sGrimerAlolanTeachableLearnset, .eggMoveLearnset = sGrimerAlolanEggMoveLearnset, .formSpeciesIdTable = sGrimerFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_LEVEL, 38, SPECIES_MUK_ALOLAN}), + .evolutions = EVOLUTION({EVO_LEVEL, 38, SPECIES_MUK_ALOLA}), }, - [SPECIES_MUK_ALOLAN] = + [SPECIES_MUK_ALOLA] = { .baseHP = 105, .baseAttack = 105, @@ -10737,7 +10845,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = #endif //P_MEGA_EVOLUTIONS #if P_GIGANTAMAX_FORMS - [SPECIES_GENGAR_GIGANTAMAX] = + [SPECIES_GENGAR_GMAX] = { .baseHP = 60, .baseAttack = 65, @@ -10924,6 +11032,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Steelix, gShinyOverworldPalette_Steelix ) + OVERWORLD_FEMALE( + sPicTable_SteelixF, + SIZE_64x64, + SHADOW_SIZE_M, + TRACKS_SLITHER + ) .levelUpLearnset = sSteelixLevelUpLearnset, .teachableLearnset = sSteelixTeachableLearnset, .formSpeciesIdTable = sSteelixFormSpeciesIdTable, @@ -11126,6 +11240,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Hypno, gShinyOverworldPalette_Hypno ) + OVERWORLD_FEMALE( + sPicTable_HypnoF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sHypnoLevelUpLearnset, .teachableLearnset = sHypnoTeachableLearnset, }, @@ -11261,7 +11381,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = }, #if P_GIGANTAMAX_FORMS - [SPECIES_KINGLER_GIGANTAMAX] = + [SPECIES_KINGLER_GMAX] = { .baseHP = 55, .baseAttack = 130, @@ -11455,7 +11575,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = }, #if P_HISUIAN_FORMS - [SPECIES_VOLTORB_HISUIAN] = + [SPECIES_VOLTORB_HISUI] = { .baseHP = 40, .baseAttack = 30, @@ -11516,10 +11636,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .levelUpLearnset = sVoltorbHisuianLevelUpLearnset, .teachableLearnset = sVoltorbHisuianTeachableLearnset, .formSpeciesIdTable = sVoltorbFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_ITEM, ITEM_LEAF_STONE, SPECIES_ELECTRODE_HISUIAN}), + .evolutions = EVOLUTION({EVO_ITEM, ITEM_LEAF_STONE, SPECIES_ELECTRODE_HISUI}), }, - [SPECIES_ELECTRODE_HISUIAN] = + [SPECIES_ELECTRODE_HISUI] = { .baseHP = 60, .baseAttack = 50, @@ -11647,7 +11767,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .teachableLearnset = sExeggcuteTeachableLearnset, .eggMoveLearnset = sExeggcuteEggMoveLearnset, .evolutions = EVOLUTION({EVO_ITEM, ITEM_LEAF_STONE, SPECIES_EXEGGUTOR}, - {EVO_NONE, 0, SPECIES_EXEGGUTOR_ALOLAN}), + {EVO_NONE, 0, SPECIES_EXEGGUTOR_ALOLA}), }, #if P_UPDATED_EXP_YIELDS >= GEN_7 @@ -11723,7 +11843,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = }, #if P_ALOLAN_FORMS - [SPECIES_EXEGGUTOR_ALOLAN] = + [SPECIES_EXEGGUTOR_ALOLA] = { .baseHP = 95, .baseAttack = 105, @@ -11852,8 +11972,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .teachableLearnset = sCuboneTeachableLearnset, .eggMoveLearnset = sCuboneEggMoveLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 28, SPECIES_MAROWAK}, - {EVO_NONE, 0, SPECIES_MAROWAK_ALOLAN}, - {EVO_NONE, 0, SPECIES_MAROWAK_ALOLAN_TOTEM}), + {EVO_NONE, 0, SPECIES_MAROWAK_ALOLA}, + {EVO_NONE, 0, SPECIES_MAROWAK_ALOLA_TOTEM}), }, [SPECIES_MAROWAK] = @@ -11920,7 +12040,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = }, #if P_ALOLAN_FORMS - [SPECIES_MAROWAK_ALOLAN] = + [SPECIES_MAROWAK_ALOLA] = { .baseHP = 60, .baseAttack = 80, @@ -11980,7 +12100,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .formSpeciesIdTable = sMarowakFormSpeciesIdTable, }, - [SPECIES_MAROWAK_ALOLAN_TOTEM] = + [SPECIES_MAROWAK_ALOLA_TOTEM] = { .baseHP = 60, .baseAttack = 80, @@ -12026,6 +12146,14 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .iconPalIndex = 1, SHADOW(-2, 11, SHADOW_SIZE_M) FOOTPRINT(Marowak) + OVERWORLD( + sPicTable_MarowakAlolan, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_MarowakAlolan, + gShinyOverworldPalette_MarowakAlolan + ) .isTotem = TRUE, .isAlolanForm = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, @@ -12504,7 +12632,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .teachableLearnset = sKoffingTeachableLearnset, .eggMoveLearnset = sKoffingEggMoveLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 35, SPECIES_WEEZING}, - {EVO_NONE, 0, SPECIES_WEEZING_GALARIAN}), + {EVO_NONE, 0, SPECIES_WEEZING_GALAR}), }, [SPECIES_WEEZING] = @@ -12577,7 +12705,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = }, #if P_GALARIAN_FORMS - [SPECIES_WEEZING_GALARIAN] = + [SPECIES_WEEZING_GALAR] = { .baseHP = 65, .baseAttack = 90, @@ -12707,6 +12835,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Rhyhorn, gShinyOverworldPalette_Rhyhorn ) + OVERWORLD_FEMALE( + sPicTable_RhyhornF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sRhyhornLevelUpLearnset, .teachableLearnset = sRhyhornTeachableLearnset, .eggMoveLearnset = sRhyhornEggMoveLearnset, @@ -12774,6 +12908,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Rhydon, gShinyOverworldPalette_Rhydon ) + OVERWORLD_FEMALE( + sPicTable_RhydonF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sRhydonLevelUpLearnset, .teachableLearnset = sRhydonTeachableLearnset, .evolutions = EVOLUTION({EVO_TRADE_ITEM, ITEM_PROTECTOR, SPECIES_RHYPERIOR}, @@ -12848,6 +12988,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Rhyperior, gShinyOverworldPalette_Rhyperior ) + OVERWORLD_FEMALE( + sPicTable_RhyperiorF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sRhyperiorLevelUpLearnset, .teachableLearnset = sRhyperiorTeachableLearnset, }, @@ -13179,6 +13325,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Tangrowth, gShinyOverworldPalette_Tangrowth ) + OVERWORLD_FEMALE( + sPicTable_TangrowthF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sTangrowthLevelUpLearnset, .teachableLearnset = sTangrowthTeachableLearnset, }, @@ -13588,6 +13740,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Goldeen, gShinyOverworldPalette_Goldeen ) + OVERWORLD_FEMALE( + sPicTable_GoldeenF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_SPOT + ) .levelUpLearnset = sGoldeenLevelUpLearnset, .teachableLearnset = sGoldeenTeachableLearnset, .eggMoveLearnset = sGoldeenEggMoveLearnset, @@ -13656,6 +13814,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Seaking, gShinyOverworldPalette_Seaking ) + OVERWORLD_FEMALE( + sPicTable_SeakingF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_SPOT + ) .levelUpLearnset = sSeakingLevelUpLearnset, .teachableLearnset = sSeakingTeachableLearnset, }, @@ -13862,7 +14026,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .teachableLearnset = sMimeJrTeachableLearnset, .eggMoveLearnset = sMimeJrEggMoveLearnset, .evolutions = EVOLUTION({EVO_MOVE, MOVE_MIMIC, SPECIES_MR_MIME}, - {EVO_NONE, 0, SPECIES_MR_MIME_GALARIAN}), + {EVO_NONE, 0, SPECIES_MR_MIME_GALAR}), }, #endif //P_GEN_4_CROSS_EVOS @@ -13934,7 +14098,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = }, #if P_GALARIAN_FORMS - [SPECIES_MR_MIME_GALARIAN] = + [SPECIES_MR_MIME_GALAR] = { .baseHP = 50, .baseAttack = 65, @@ -14126,6 +14290,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Scyther, gShinyOverworldPalette_Scyther ) + OVERWORLD_FEMALE( + sPicTable_ScytherF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sScytherLevelUpLearnset, .teachableLearnset = sScytherTeachableLearnset, .eggMoveLearnset = sScytherEggMoveLearnset, @@ -14199,6 +14369,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Scizor, gShinyOverworldPalette_Scizor ) + OVERWORLD_FEMALE( + sPicTable_ScizorF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sScizorLevelUpLearnset, .teachableLearnset = sScizorTeachableLearnset, .formSpeciesIdTable = sScizorFormSpeciesIdTable, @@ -15073,7 +15249,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = }, #if P_PALDEAN_FORMS - [SPECIES_TAUROS_PALDEAN_COMBAT_BREED] = + [SPECIES_TAUROS_PALDEA_COMBAT] = { .baseHP = 75, .baseAttack = 110, @@ -15137,7 +15313,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .formSpeciesIdTable = sTaurosFormSpeciesIdTable, }, - [SPECIES_TAUROS_PALDEAN_BLAZE_BREED] = + [SPECIES_TAUROS_PALDEA_BLAZE] = { .baseHP = 75, .baseAttack = 110, @@ -15201,7 +15377,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .formSpeciesIdTable = sTaurosFormSpeciesIdTable, }, - [SPECIES_TAUROS_PALDEAN_AQUA_BREED] = + [SPECIES_TAUROS_PALDEA_AQUA] = { .baseHP = 75, .baseAttack = 110, @@ -15329,6 +15505,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Magikarp, gShinyOverworldPalette_Magikarp ) + OVERWORLD_FEMALE( + sPicTable_MagikarpF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_SPOT + ) .tmIlliterate = TRUE, .levelUpLearnset = sMagikarpLevelUpLearnset, .teachableLearnset = sMagikarpTeachableLearnset, @@ -15396,6 +15578,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Gyarados, gShinyOverworldPalette_Gyarados ) + OVERWORLD_FEMALE( + sPicTable_GyaradosF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_SLITHER + ) .levelUpLearnset = sGyaradosLevelUpLearnset, .teachableLearnset = sGyaradosTeachableLearnset, .formSpeciesIdTable = sGyaradosFormSpeciesIdTable, @@ -15530,7 +15718,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = }, #if P_GIGANTAMAX_FORMS - [SPECIES_LAPRAS_GIGANTAMAX] = + [SPECIES_LAPRAS_GMAX] = { .baseHP = 130, .baseAttack = 85, @@ -15719,6 +15907,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Eevee, gShinyOverworldPalette_Eevee ) + OVERWORLD_FEMALE( + sPicTable_EeveeF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sEeveeLevelUpLearnset, .teachableLearnset = sEeveeTeachableLearnset, .eggMoveLearnset = sEeveeEggMoveLearnset, @@ -15737,7 +15931,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = }, #if P_GIGANTAMAX_FORMS - [SPECIES_EEVEE_GIGANTAMAX] = + [SPECIES_EEVEE_GMAX] = { .baseHP = 55, .baseAttack = 55, @@ -15795,7 +15989,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = }, #endif //P_GIGANTAMAX_FORMS - [SPECIES_EEVEE_PARTNER] = + [SPECIES_EEVEE_STARTER] = { .baseHP = 65, .baseAttack = 75, @@ -15848,6 +16042,14 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = #endif SHADOW(-2, 2, SHADOW_SIZE_S) FOOTPRINT(Eevee) + OVERWORLD( + sPicTable_Eevee, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_Eevee, + gShinyOverworldPalette_Eevee + ) .cannotBeTraded = TRUE, .perfectIVCount = NUM_STATS, .levelUpLearnset = sEeveeLevelUpLearnset, @@ -17092,7 +17294,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = }, #if P_GIGANTAMAX_FORMS - [SPECIES_SNORLAX_GIGANTAMAX] = + [SPECIES_SNORLAX_GMAX] = { .baseHP = 160, .baseAttack = 110, @@ -17225,7 +17427,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = }, #if P_GALARIAN_FORMS - [SPECIES_ARTICUNO_GALARIAN] = + [SPECIES_ARTICUNO_GALAR] = { .baseHP = 90, .baseAttack = 85, @@ -17370,7 +17572,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = }, #if P_GALARIAN_FORMS - [SPECIES_ZAPDOS_GALARIAN] = + [SPECIES_ZAPDOS_GALAR] = { .baseHP = 90, .baseAttack = 125, @@ -17509,7 +17711,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = }, #if P_GALARIAN_FORMS - [SPECIES_MOLTRES_GALARIAN] = + [SPECIES_MOLTRES_GALAR] = { .baseHP = 90, .baseAttack = 85, diff --git a/src/data/pokemon/species_info/gen_2_families.h b/src/data/pokemon/species_info/gen_2_families.h index f59e8a54177f..ae5a69439a74 100644 --- a/src/data/pokemon/species_info/gen_2_families.h +++ b/src/data/pokemon/species_info/gen_2_families.h @@ -198,6 +198,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Meganium, gShinyOverworldPalette_Meganium ) + OVERWORLD_FEMALE( + sPicTable_MeganiumF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sMeganiumLevelUpLearnset, .teachableLearnset = sMeganiumTeachableLearnset, }, @@ -328,7 +334,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .levelUpLearnset = sQuilavaLevelUpLearnset, .teachableLearnset = sQuilavaTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 36, SPECIES_TYPHLOSION}, - {EVO_NONE, 0, SPECIES_TYPHLOSION_HISUIAN}), + {EVO_NONE, 0, SPECIES_TYPHLOSION_HISUI}), }, #if P_UPDATED_EXP_YIELDS >= GEN_8 @@ -403,7 +409,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = }, #if P_HISUIAN_FORMS - [SPECIES_TYPHLOSION_HISUIAN] = + [SPECIES_TYPHLOSION_HISUI] = { .baseHP = 73, .baseAttack = 84, @@ -986,6 +992,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Ledyba, gShinyOverworldPalette_Ledyba ) + OVERWORLD_FEMALE( + sPicTable_LedybaF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_BUG + ) .levelUpLearnset = sLedybaLevelUpLearnset, .teachableLearnset = sLedybaTeachableLearnset, .eggMoveLearnset = sLedybaEggMoveLearnset, @@ -1054,6 +1066,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Ledian, gShinyOverworldPalette_Ledian ) + OVERWORLD_FEMALE( + sPicTable_LedianF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sLedianLevelUpLearnset, .teachableLearnset = sLedianTeachableLearnset, }, @@ -1645,6 +1663,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Xatu, gShinyOverworldPalette_Xatu ) + OVERWORLD_FEMALE( + sPicTable_XatuF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sXatuLevelUpLearnset, .teachableLearnset = sXatuTeachableLearnset, }, @@ -2248,6 +2272,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Sudowoodo, gShinyOverworldPalette_Sudowoodo ) + OVERWORLD_FEMALE( + sPicTable_SudowoodoF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sSudowoodoLevelUpLearnset, .teachableLearnset = sSudowoodoTeachableLearnset, .eggMoveLearnset = sSudowoodoEggMoveLearnset, @@ -2527,6 +2557,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Aipom, gShinyOverworldPalette_Aipom ) + OVERWORLD_FEMALE( + sPicTable_AipomF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sAipomLevelUpLearnset, .teachableLearnset = sAipomTeachableLearnset, .eggMoveLearnset = sAipomEggMoveLearnset, @@ -2595,6 +2631,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Ambipom, gShinyOverworldPalette_Ambipom ) + OVERWORLD_FEMALE( + sPicTable_AmbipomF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sAmbipomLevelUpLearnset, .teachableLearnset = sAmbipomTeachableLearnset, }, @@ -2929,6 +2971,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Wooper, gShinyOverworldPalette_Wooper ) + OVERWORLD_FEMALE( + sPicTable_WooperF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sWooperLevelUpLearnset, .teachableLearnset = sWooperTeachableLearnset, .eggMoveLearnset = sWooperEggMoveLearnset, @@ -2997,12 +3045,18 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Quagsire, gShinyOverworldPalette_Quagsire ) + OVERWORLD_FEMALE( + sPicTable_QuagsireF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sQuagsireLevelUpLearnset, .teachableLearnset = sQuagsireTeachableLearnset, }, #if P_PALDEAN_FORMS - [SPECIES_WOOPER_PALDEAN] = + [SPECIES_WOOPER_PALDEA] = { .baseHP = 55, .baseAttack = 45, @@ -3197,6 +3251,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Murkrow, gShinyOverworldPalette_Murkrow ) + OVERWORLD_FEMALE( + sPicTable_MurkrowF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sMurkrowLevelUpLearnset, .teachableLearnset = sMurkrowTeachableLearnset, .eggMoveLearnset = sMurkrowEggMoveLearnset, @@ -3462,34 +3522,34 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .formSpeciesIdTable = sUnownFormSpeciesIdTable, \ } - [SPECIES_UNOWN] = UNOWN_MISC_INFO(A, FALSE, 24, 40, 24, 48, 8 ), - [SPECIES_UNOWN_B] = UNOWN_MISC_INFO(B, TRUE, 24, 32, 40, 48, 9 ), - [SPECIES_UNOWN_C] = UNOWN_MISC_INFO(C, TRUE, 32, 32, 48, 56, 6 ), - [SPECIES_UNOWN_D] = UNOWN_MISC_INFO(D, TRUE, 32, 32, 40, 48, 8 ), - [SPECIES_UNOWN_E] = UNOWN_MISC_INFO(E, TRUE, 32, 32, 40, 48, 10 ), - [SPECIES_UNOWN_F] = UNOWN_MISC_INFO(F, TRUE, 32, 32, 48, 48, 10 ), - [SPECIES_UNOWN_G] = UNOWN_MISC_INFO(G, TRUE, 24, 40, 40, 56, 5 ), - [SPECIES_UNOWN_H] = UNOWN_MISC_INFO(H, TRUE, 32, 32, 48, 48, 8 ), - [SPECIES_UNOWN_I] = UNOWN_MISC_INFO(I, FALSE, 24, 32, 24, 56, 7 ), - [SPECIES_UNOWN_J] = UNOWN_MISC_INFO(J, TRUE, 24, 32, 32, 48, 9 ), - [SPECIES_UNOWN_K] = UNOWN_MISC_INFO(K, TRUE, 32, 32, 40, 56, 7 ), - [SPECIES_UNOWN_L] = UNOWN_MISC_INFO(L, TRUE, 24, 32, 32, 48, 10 ), - [SPECIES_UNOWN_M] = UNOWN_MISC_INFO(M, FALSE, 32, 32, 48, 40, 13 ), - [SPECIES_UNOWN_N] = UNOWN_MISC_INFO(N, TRUE, 32, 24, 48, 40, 13 ), - [SPECIES_UNOWN_O] = UNOWN_MISC_INFO(O, FALSE, 32, 32, 48, 48, 8 ), - [SPECIES_UNOWN_P] = UNOWN_MISC_INFO(P, TRUE, 24, 32, 32, 48, 10 ), - [SPECIES_UNOWN_Q] = UNOWN_MISC_INFO(Q, TRUE, 32, 24, 40, 40, 15 ), - [SPECIES_UNOWN_R] = UNOWN_MISC_INFO(R, TRUE, 24, 32, 32, 40, 12 ), - [SPECIES_UNOWN_S] = UNOWN_MISC_INFO(S, TRUE, 32, 40, 40, 56, 4 ), - [SPECIES_UNOWN_T] = UNOWN_MISC_INFO(T, FALSE, 24, 32, 32, 40, 13 ), - [SPECIES_UNOWN_U] = UNOWN_MISC_INFO(U, FALSE, 32, 32, 48, 40, 13 ), - [SPECIES_UNOWN_V] = UNOWN_MISC_INFO(V, TRUE, 32, 32, 40, 48, 11 ), - [SPECIES_UNOWN_W] = UNOWN_MISC_INFO(W, FALSE, 32, 32, 40, 40, 13 ), - [SPECIES_UNOWN_X] = UNOWN_MISC_INFO(X, FALSE, 24, 24, 40, 40, 15 ), - [SPECIES_UNOWN_Y] = UNOWN_MISC_INFO(Y, FALSE, 24, 32, 32, 48, 10 ), - [SPECIES_UNOWN_Z] = UNOWN_MISC_INFO(Z, TRUE, 24, 32, 32, 48, 10 ), - [SPECIES_UNOWN_EMARK] = UNOWN_MISC_INFO(ExclamationMark, FALSE, 24, 40, 24, 56, 6 ), - [SPECIES_UNOWN_QMARK] = UNOWN_MISC_INFO(QuestionMark, TRUE, 24, 40, 32, 56, 6 ), + [SPECIES_UNOWN] = UNOWN_MISC_INFO(A, FALSE, 24, 40, 24, 48, 8 ), + [SPECIES_UNOWN_B] = UNOWN_MISC_INFO(B, TRUE, 24, 32, 40, 48, 9 ), + [SPECIES_UNOWN_C] = UNOWN_MISC_INFO(C, TRUE, 32, 32, 48, 56, 6 ), + [SPECIES_UNOWN_D] = UNOWN_MISC_INFO(D, TRUE, 32, 32, 40, 48, 8 ), + [SPECIES_UNOWN_E] = UNOWN_MISC_INFO(E, TRUE, 32, 32, 40, 48, 10 ), + [SPECIES_UNOWN_F] = UNOWN_MISC_INFO(F, TRUE, 32, 32, 48, 48, 10 ), + [SPECIES_UNOWN_G] = UNOWN_MISC_INFO(G, TRUE, 24, 40, 40, 56, 5 ), + [SPECIES_UNOWN_H] = UNOWN_MISC_INFO(H, TRUE, 32, 32, 48, 48, 8 ), + [SPECIES_UNOWN_I] = UNOWN_MISC_INFO(I, FALSE, 24, 32, 24, 56, 7 ), + [SPECIES_UNOWN_J] = UNOWN_MISC_INFO(J, TRUE, 24, 32, 32, 48, 9 ), + [SPECIES_UNOWN_K] = UNOWN_MISC_INFO(K, TRUE, 32, 32, 40, 56, 7 ), + [SPECIES_UNOWN_L] = UNOWN_MISC_INFO(L, TRUE, 24, 32, 32, 48, 10 ), + [SPECIES_UNOWN_M] = UNOWN_MISC_INFO(M, FALSE, 32, 32, 48, 40, 13 ), + [SPECIES_UNOWN_N] = UNOWN_MISC_INFO(N, TRUE, 32, 24, 48, 40, 13 ), + [SPECIES_UNOWN_O] = UNOWN_MISC_INFO(O, FALSE, 32, 32, 48, 48, 8 ), + [SPECIES_UNOWN_P] = UNOWN_MISC_INFO(P, TRUE, 24, 32, 32, 48, 10 ), + [SPECIES_UNOWN_Q] = UNOWN_MISC_INFO(Q, TRUE, 32, 24, 40, 40, 15 ), + [SPECIES_UNOWN_R] = UNOWN_MISC_INFO(R, TRUE, 24, 32, 32, 40, 12 ), + [SPECIES_UNOWN_S] = UNOWN_MISC_INFO(S, TRUE, 32, 40, 40, 56, 4 ), + [SPECIES_UNOWN_T] = UNOWN_MISC_INFO(T, FALSE, 24, 32, 32, 40, 13 ), + [SPECIES_UNOWN_U] = UNOWN_MISC_INFO(U, FALSE, 32, 32, 48, 40, 13 ), + [SPECIES_UNOWN_V] = UNOWN_MISC_INFO(V, TRUE, 32, 32, 40, 48, 11 ), + [SPECIES_UNOWN_W] = UNOWN_MISC_INFO(W, FALSE, 32, 32, 40, 40, 13 ), + [SPECIES_UNOWN_X] = UNOWN_MISC_INFO(X, FALSE, 24, 24, 40, 40, 15 ), + [SPECIES_UNOWN_Y] = UNOWN_MISC_INFO(Y, FALSE, 24, 32, 32, 48, 10 ), + [SPECIES_UNOWN_Z] = UNOWN_MISC_INFO(Z, TRUE, 24, 32, 32, 48, 10 ), + [SPECIES_UNOWN_EXCLAMATION] = UNOWN_MISC_INFO(ExclamationMark, FALSE, 24, 40, 24, 56, 6 ), + [SPECIES_UNOWN_QUESTION] = UNOWN_MISC_INFO(QuestionMark, TRUE, 24, 40, 32, 56, 6 ), #endif //P_FAMILY_UNOWN #if P_FAMILY_WOBBUFFET @@ -3624,6 +3684,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Wobbuffet, gShinyOverworldPalette_Wobbuffet ) + OVERWORLD_FEMALE( + sPicTable_WobbuffetF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .tmIlliterate = TRUE, .levelUpLearnset = sWobbuffetLevelUpLearnset, .teachableLearnset = sWobbuffetTeachableLearnset, @@ -3692,6 +3758,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Girafarig, gShinyOverworldPalette_Girafarig ) + OVERWORLD_FEMALE( + sPicTable_GirafarigF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sGirafarigLevelUpLearnset, .teachableLearnset = sGirafarigTeachableLearnset, .eggMoveLearnset = sGirafarigEggMoveLearnset, @@ -4150,6 +4222,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Gligar, gShinyOverworldPalette_Gligar ) + OVERWORLD_FEMALE( + sPicTable_GligarF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_NONE + ) .levelUpLearnset = sGligarLevelUpLearnset, .teachableLearnset = sGligarTeachableLearnset, .eggMoveLearnset = sGligarEggMoveLearnset, @@ -4436,7 +4514,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = }, #if P_HISUIAN_FORMS - [SPECIES_QWILFISH_HISUIAN] = + [SPECIES_QWILFISH_HISUI] = { .baseHP = 65, .baseAttack = 95, @@ -4698,6 +4776,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Heracross, gShinyOverworldPalette_Heracross ) + OVERWORLD_FEMALE( + sPicTable_HeracrossF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sHeracrossLevelUpLearnset, .teachableLearnset = sHeracrossTeachableLearnset, .eggMoveLearnset = sHeracrossEggMoveLearnset, @@ -4829,6 +4913,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Sneasel, gShinyOverworldPalette_Sneasel ) + OVERWORLD_FEMALE( + sPicTable_SneaselF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sSneaselLevelUpLearnset, .teachableLearnset = sSneaselTeachableLearnset, .eggMoveLearnset = sSneaselEggMoveLearnset, @@ -4901,13 +4991,19 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Weavile, gShinyOverworldPalette_Weavile ) + OVERWORLD_FEMALE( + sPicTable_WeavileF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sWeavileLevelUpLearnset, .teachableLearnset = sWeavileTeachableLearnset, }, #endif //P_GEN_4_CROSS_EVOS #if P_HISUIAN_FORMS - [SPECIES_SNEASEL_HISUIAN] = + [SPECIES_SNEASEL_HISUI] = { .baseHP = 55, .baseAttack = 95, @@ -4970,6 +5066,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_SneaselHisuian, gShinyOverworldPalette_SneaselHisuian ) + OVERWORLD_FEMALE( + sPicTable_SneaselHisuianF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .isHisuianForm = TRUE, .levelUpLearnset = sSneaselHisuianLevelUpLearnset, .teachableLearnset = sSneaselHisuianTeachableLearnset, @@ -5176,6 +5278,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Ursaring, gShinyOverworldPalette_Ursaring ) + OVERWORLD_FEMALE( + sPicTable_UrsaringF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sUrsaringLevelUpLearnset, .teachableLearnset = sUrsaringTeachableLearnset, .evolutions = EVOLUTION({EVO_ITEM_NIGHT, ITEM_PEAT_BLOCK, SPECIES_URSALUNA}, @@ -5567,6 +5675,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Piloswine, gShinyOverworldPalette_Piloswine ) + OVERWORLD_FEMALE( + sPicTable_PiloswineF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sPiloswineLevelUpLearnset, .teachableLearnset = sPiloswineTeachableLearnset, .evolutions = EVOLUTION({EVO_MOVE, MOVE_ANCIENT_POWER, SPECIES_MAMOSWINE}), @@ -5638,6 +5752,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Mamoswine, gShinyOverworldPalette_Mamoswine ) + OVERWORLD_FEMALE( + sPicTable_MamoswineF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sMamoswineLevelUpLearnset, .teachableLearnset = sMamoswineTeachableLearnset, }, @@ -5721,7 +5841,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = }, #if P_GALARIAN_FORMS - [SPECIES_CORSOLA_GALARIAN] = + [SPECIES_CORSOLA_GALAR] = { .baseHP = CORSOLA_HP - 5, .baseAttack = 55, @@ -5984,6 +6104,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Octillery, gShinyOverworldPalette_Octillery ) + OVERWORLD_FEMALE( + sPicTable_OctilleryF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_SLITHER + ) .levelUpLearnset = sOctilleryLevelUpLearnset, .teachableLearnset = sOctilleryTeachableLearnset, }, @@ -6379,6 +6505,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Houndoom, gShinyOverworldPalette_Houndoom ) + OVERWORLD_FEMALE( + sPicTable_HoundoomF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sHoundoomLevelUpLearnset, .teachableLearnset = sHoundoomTeachableLearnset, .formSpeciesIdTable = sHoundoomFormSpeciesIdTable, @@ -6569,6 +6701,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Donphan, gShinyOverworldPalette_Donphan ) + OVERWORLD_FEMALE( + sPicTable_DonphanF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sDonphanLevelUpLearnset, .teachableLearnset = sDonphanTeachableLearnset, }, diff --git a/src/data/pokemon/species_info/gen_3_families.h b/src/data/pokemon/species_info/gen_3_families.h index e9d566096a37..002e0d460cd6 100644 --- a/src/data/pokemon/species_info/gen_3_families.h +++ b/src/data/pokemon/species_info/gen_3_families.h @@ -317,6 +317,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Torchic, gShinyOverworldPalette_Torchic ) + OVERWORLD_FEMALE( + sPicTable_TorchicF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sTorchicLevelUpLearnset, .teachableLearnset = sTorchicTeachableLearnset, .eggMoveLearnset = sTorchicEggMoveLearnset, @@ -385,6 +391,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Combusken, gShinyOverworldPalette_Combusken ) + OVERWORLD_FEMALE( + sPicTable_CombuskenF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sCombuskenLevelUpLearnset, .teachableLearnset = sCombuskenTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 36, SPECIES_BLAZIKEN}), @@ -457,6 +469,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Blaziken, gShinyOverworldPalette_Blaziken ) + OVERWORLD_FEMALE( + sPicTable_BlazikenF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sBlazikenLevelUpLearnset, .teachableLearnset = sBlazikenTeachableLearnset, .formSpeciesIdTable = sBlazikenFormSpeciesIdTable, @@ -1064,7 +1082,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = }, #if P_GALARIAN_FORMS - [SPECIES_ZIGZAGOON_GALARIAN] = + [SPECIES_ZIGZAGOON_GALAR] = { .baseHP = 38, .baseAttack = 30, @@ -1126,10 +1144,10 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .teachableLearnset = sZigzagoonGalarianTeachableLearnset, .eggMoveLearnset = sZigzagoonGalarianEggMoveLearnset, .formSpeciesIdTable = sZigzagoonFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_LEVEL, 20, SPECIES_LINOONE_GALARIAN}), + .evolutions = EVOLUTION({EVO_LEVEL, 20, SPECIES_LINOONE_GALAR}), }, - [SPECIES_LINOONE_GALARIAN] = + [SPECIES_LINOONE_GALAR] = { .baseHP = 78, .baseAttack = 70, @@ -1463,6 +1481,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Beautifly, gShinyOverworldPalette_Beautifly ) + OVERWORLD_FEMALE( + sPicTable_BeautiflyF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_NONE + ) .levelUpLearnset = sBeautiflyLevelUpLearnset, .teachableLearnset = sBeautiflyTeachableLearnset, }, @@ -1609,6 +1633,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Dustox, gShinyOverworldPalette_Dustox ) + OVERWORLD_FEMALE( + sPicTable_DustoxF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_NONE + ) .levelUpLearnset = sDustoxLevelUpLearnset, .teachableLearnset = sDustoxTeachableLearnset, }, @@ -1810,6 +1840,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Ludicolo, gShinyOverworldPalette_Ludicolo ) + OVERWORLD_FEMALE( + sPicTable_LudicoloF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sLudicoloLevelUpLearnset, .teachableLearnset = sLudicoloTeachableLearnset, }, @@ -1942,6 +1978,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Nuzleaf, gShinyOverworldPalette_Nuzleaf ) + OVERWORLD_FEMALE( + sPicTable_NuzleafF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sNuzleafLevelUpLearnset, .teachableLearnset = sNuzleafTeachableLearnset, .evolutions = EVOLUTION({EVO_ITEM, ITEM_LEAF_STONE, SPECIES_SHIFTRY}), @@ -2019,6 +2061,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Shiftry, gShinyOverworldPalette_Shiftry ) + OVERWORLD_FEMALE( + sPicTable_ShiftryF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sShiftryLevelUpLearnset, .teachableLearnset = sShiftryTeachableLearnset, }, @@ -4538,6 +4586,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Meditite, gShinyOverworldPalette_Meditite ) + OVERWORLD_FEMALE( + sPicTable_MedititeF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sMedititeLevelUpLearnset, .teachableLearnset = sMedititeTeachableLearnset, .eggMoveLearnset = sMedititeEggMoveLearnset, @@ -4605,6 +4659,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Medicham, gShinyOverworldPalette_Medicham ) + OVERWORLD_FEMALE( + sPicTable_MedichamF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sMedichamLevelUpLearnset, .teachableLearnset = sMedichamTeachableLearnset, .formSpeciesIdTable = sMedichamFormSpeciesIdTable, @@ -5268,6 +5328,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Roselia, gShinyOverworldPalette_Roselia ) + OVERWORLD_FEMALE( + sPicTable_RoseliaF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sRoseliaLevelUpLearnset, .teachableLearnset = sRoseliaTeachableLearnset, .eggMoveLearnset = sRoseliaEggMoveLearnset, @@ -5346,6 +5412,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Roserade, gShinyOverworldPalette_Roserade ) + OVERWORLD_FEMALE( + sPicTable_RoseradeF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sRoseradeLevelUpLearnset, .teachableLearnset = sRoseradeTeachableLearnset, }, @@ -5416,6 +5488,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Gulpin, gShinyOverworldPalette_Gulpin ) + OVERWORLD_FEMALE( + sPicTable_GulpinF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_SPOT + ) .levelUpLearnset = sGulpinLevelUpLearnset, .teachableLearnset = sGulpinTeachableLearnset, .eggMoveLearnset = sGulpinEggMoveLearnset, @@ -5485,6 +5563,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Swalot, gShinyOverworldPalette_Swalot ) + OVERWORLD_FEMALE( + sPicTable_SwalotF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_SLITHER + ) .levelUpLearnset = sSwalotLevelUpLearnset, .teachableLearnset = sSwalotTeachableLearnset, }, @@ -5873,6 +5957,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Numel, gShinyOverworldPalette_Numel ) + OVERWORLD_FEMALE( + sPicTable_NumelF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sNumelLevelUpLearnset, .teachableLearnset = sNumelTeachableLearnset, .eggMoveLearnset = sNumelEggMoveLearnset, @@ -5945,6 +6035,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Camerupt, gShinyOverworldPalette_Camerupt ) + OVERWORLD_FEMALE( + sPicTable_CameruptF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sCameruptLevelUpLearnset, .teachableLearnset = sCameruptTeachableLearnset, .formSpeciesIdTable = sCameruptFormSpeciesIdTable, @@ -6612,6 +6708,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Cacturne, gShinyOverworldPalette_Cacturne ) + OVERWORLD_FEMALE( + sPicTable_CacturneF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sCacturneLevelUpLearnset, .teachableLearnset = sCacturneTeachableLearnset, }, @@ -7885,6 +7987,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Milotic, gShinyOverworldPalette_Milotic ) + OVERWORLD_FEMALE( + sPicTable_MiloticF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_SLITHER + ) .levelUpLearnset = sMiloticLevelUpLearnset, .teachableLearnset = sMiloticTeachableLearnset, }, @@ -9712,6 +9820,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Relicanth, gShinyOverworldPalette_Relicanth ) + OVERWORLD_FEMALE( + sPicTable_RelicanthF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_NONE + ) .levelUpLearnset = sRelicanthLevelUpLearnset, .teachableLearnset = sRelicanthTeachableLearnset, .eggMoveLearnset = sRelicanthEggMoveLearnset, diff --git a/src/data/pokemon/species_info/gen_4_families.h b/src/data/pokemon/species_info/gen_4_families.h index c63d6f613b20..fd7b8c0f7052 100644 --- a/src/data/pokemon/species_info/gen_4_families.h +++ b/src/data/pokemon/species_info/gen_4_families.h @@ -671,6 +671,12 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_Starly, gShinyOverworldPalette_Starly ) + OVERWORLD_FEMALE( + sPicTable_StarlyF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sStarlyLevelUpLearnset, .teachableLearnset = sStarlyTeachableLearnset, .eggMoveLearnset = sStarlyEggMoveLearnset, @@ -738,6 +744,12 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_Staravia, gShinyOverworldPalette_Staravia ) + OVERWORLD_FEMALE( + sPicTable_StaraviaF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sStaraviaLevelUpLearnset, .teachableLearnset = sStaraviaTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 34, SPECIES_STARAPTOR}), @@ -810,6 +822,12 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_Staraptor, gShinyOverworldPalette_Staraptor ) + OVERWORLD_FEMALE( + sPicTable_StaraptorF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sStaraptorLevelUpLearnset, .teachableLearnset = sStaraptorTeachableLearnset, }, @@ -877,6 +895,12 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_Bidoof, gShinyOverworldPalette_Bidoof ) + OVERWORLD_FEMALE( + sPicTable_BidoofF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sBidoofLevelUpLearnset, .teachableLearnset = sBidoofTeachableLearnset, .eggMoveLearnset = sBidoofEggMoveLearnset, @@ -942,6 +966,12 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_Bibarel, gShinyOverworldPalette_Bibarel ) + OVERWORLD_FEMALE( + sPicTable_BibarelF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sBibarelLevelUpLearnset, .teachableLearnset = sBibarelTeachableLearnset, }, @@ -1010,6 +1040,12 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_Kricketot, gShinyOverworldPalette_Kricketot ) + OVERWORLD_FEMALE( + sPicTable_KricketotF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .tmIlliterate = TRUE, .levelUpLearnset = sKricketotLevelUpLearnset, .teachableLearnset = sKricketotTeachableLearnset, @@ -1078,6 +1114,12 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_Kricketune, gShinyOverworldPalette_Kricketune ) + OVERWORLD_FEMALE( + sPicTable_KricketuneF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sKricketuneLevelUpLearnset, .teachableLearnset = sKricketuneTeachableLearnset, }, @@ -1145,6 +1187,12 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_Shinx, gShinyOverworldPalette_Shinx ) + OVERWORLD_FEMALE( + sPicTable_ShinxF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sShinxLevelUpLearnset, .teachableLearnset = sShinxTeachableLearnset, .eggMoveLearnset = sShinxEggMoveLearnset, @@ -1212,6 +1260,12 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_Luxio, gShinyOverworldPalette_Luxio ) + OVERWORLD_FEMALE( + sPicTable_LuxioF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sLuxioLevelUpLearnset, .teachableLearnset = sLuxioTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 30, SPECIES_LUXRAY}), @@ -1284,6 +1338,12 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_Luxray, gShinyOverworldPalette_Luxray ) + OVERWORLD_FEMALE( + sPicTable_LuxrayF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sLuxrayLevelUpLearnset, .teachableLearnset = sLuxrayTeachableLearnset, }, @@ -1542,7 +1602,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = #endif //P_FAMILY_SHIELDON #if P_FAMILY_BURMY - [SPECIES_BURMY_PLANT_CLOAK] = + [SPECIES_BURMY_PLANT] = { .baseHP = 40, .baseAttack = 29, @@ -1605,11 +1665,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .teachableLearnset = sBurmyTeachableLearnset, .formSpeciesIdTable = sBurmyFormSpeciesIdTable, .formChangeTable = sBurmyFormChangeTable, - .evolutions = EVOLUTION({EVO_LEVEL_FEMALE, 20, SPECIES_WORMADAM_PLANT_CLOAK}, - {EVO_LEVEL_MALE, 20, SPECIES_MOTHIM_PLANT_CLOAK}), + .evolutions = EVOLUTION({EVO_LEVEL_FEMALE, 20, SPECIES_WORMADAM_PLANT}, + {EVO_LEVEL_MALE, 20, SPECIES_MOTHIM_PLANT}), }, - [SPECIES_BURMY_SANDY_CLOAK] = + [SPECIES_BURMY_SANDY] = { .baseHP = 40, .baseAttack = 29, @@ -1672,11 +1732,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .teachableLearnset = sBurmyTeachableLearnset, .formSpeciesIdTable = sBurmyFormSpeciesIdTable, .formChangeTable = sBurmyFormChangeTable, - .evolutions = EVOLUTION({EVO_LEVEL_FEMALE, 20, SPECIES_WORMADAM_SANDY_CLOAK}, - {EVO_LEVEL_MALE, 20, SPECIES_MOTHIM_SANDY_CLOAK}), + .evolutions = EVOLUTION({EVO_LEVEL_FEMALE, 20, SPECIES_WORMADAM_SANDY}, + {EVO_LEVEL_MALE, 20, SPECIES_MOTHIM_SANDY}), }, - [SPECIES_BURMY_TRASH_CLOAK] = + [SPECIES_BURMY_TRASH] = { .baseHP = 40, .baseAttack = 29, @@ -1739,11 +1799,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .teachableLearnset = sBurmyTeachableLearnset, .formSpeciesIdTable = sBurmyFormSpeciesIdTable, .formChangeTable = sBurmyFormChangeTable, - .evolutions = EVOLUTION({EVO_LEVEL_FEMALE, 20, SPECIES_WORMADAM_TRASH_CLOAK}, - {EVO_LEVEL_MALE, 20, SPECIES_MOTHIM_TRASH_CLOAK}), + .evolutions = EVOLUTION({EVO_LEVEL_FEMALE, 20, SPECIES_WORMADAM_TRASH}, + {EVO_LEVEL_MALE, 20, SPECIES_MOTHIM_TRASH}), }, - [SPECIES_WORMADAM_PLANT_CLOAK] = + [SPECIES_WORMADAM_PLANT] = { .baseHP = 60, .baseAttack = 59, @@ -1807,7 +1867,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .formSpeciesIdTable = sWormadamFormSpeciesIdTable, }, - [SPECIES_WORMADAM_SANDY_CLOAK] = + [SPECIES_WORMADAM_SANDY] = { .baseHP = 60, .baseAttack = 79, @@ -1871,7 +1931,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .formSpeciesIdTable = sWormadamFormSpeciesIdTable, }, - [SPECIES_WORMADAM_TRASH_CLOAK] = + [SPECIES_WORMADAM_TRASH] = { .baseHP = 60, .baseAttack = 69, @@ -1997,9 +2057,9 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .formSpeciesIdTable = sMothimFormSpeciesIdTable, \ } - [SPECIES_MOTHIM_PLANT_CLOAK] = MOTHIM_SPECIES_INFO, - [SPECIES_MOTHIM_SANDY_CLOAK] = MOTHIM_SPECIES_INFO, - [SPECIES_MOTHIM_TRASH_CLOAK] = MOTHIM_SPECIES_INFO, + [SPECIES_MOTHIM_PLANT] = MOTHIM_SPECIES_INFO, + [SPECIES_MOTHIM_SANDY] = MOTHIM_SPECIES_INFO, + [SPECIES_MOTHIM_TRASH] = MOTHIM_SPECIES_INFO, #endif //P_FAMILY_BURMY #if P_FAMILY_COMBEE @@ -2064,6 +2124,12 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_Combee, gShinyOverworldPalette_Combee ) + OVERWORLD_FEMALE( + sPicTable_CombeeF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .tmIlliterate = TRUE, .levelUpLearnset = sCombeeLevelUpLearnset, .teachableLearnset = sCombeeTeachableLearnset, @@ -2195,6 +2261,12 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_Pachirisu, gShinyOverworldPalette_Pachirisu ) + OVERWORLD_FEMALE( + sPicTable_PachirisuF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sPachirisuLevelUpLearnset, .teachableLearnset = sPachirisuTeachableLearnset, .eggMoveLearnset = sPachirisuEggMoveLearnset, @@ -2261,6 +2333,12 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_Buizel, gShinyOverworldPalette_Buizel ) + OVERWORLD_FEMALE( + sPicTable_BuizelF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sBuizelLevelUpLearnset, .teachableLearnset = sBuizelTeachableLearnset, .eggMoveLearnset = sBuizelEggMoveLearnset, @@ -2326,6 +2404,12 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_Floatzel, gShinyOverworldPalette_Floatzel ) + OVERWORLD_FEMALE( + sPicTable_FloatzelF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sFloatzelLevelUpLearnset, .teachableLearnset = sFloatzelTeachableLearnset, }, @@ -2518,7 +2602,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = #endif //P_FAMILY_CHERUBI #if P_FAMILY_SHELLOS - [SPECIES_SHELLOS_WEST_SEA] = + [SPECIES_SHELLOS_WEST] = { .baseHP = 76, .baseAttack = 48, @@ -2579,10 +2663,10 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .teachableLearnset = sShellosTeachableLearnset, .eggMoveLearnset = sShellosEggMoveLearnset, .formSpeciesIdTable = sShellosFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_LEVEL, 30, SPECIES_GASTRODON_WEST_SEA}), + .evolutions = EVOLUTION({EVO_LEVEL, 30, SPECIES_GASTRODON_WEST}), }, - [SPECIES_SHELLOS_EAST_SEA] = + [SPECIES_SHELLOS_EAST] = { .baseHP = 76, .baseAttack = 48, @@ -2643,10 +2727,10 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .teachableLearnset = sShellosTeachableLearnset, .eggMoveLearnset = sShellosEggMoveLearnset, .formSpeciesIdTable = sShellosFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_LEVEL, 30, SPECIES_GASTRODON_EAST_SEA}), + .evolutions = EVOLUTION({EVO_LEVEL, 30, SPECIES_GASTRODON_EAST}), }, - [SPECIES_GASTRODON_WEST_SEA] = + [SPECIES_GASTRODON_WEST] = { .baseHP = 111, .baseAttack = 83, @@ -2708,7 +2792,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .formSpeciesIdTable = sGastrodonFormSpeciesIdTable, }, - [SPECIES_GASTRODON_EAST_SEA] = + [SPECIES_GASTRODON_EAST] = { .baseHP = 111, .baseAttack = 83, @@ -3659,6 +3743,12 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_Gible, gShinyOverworldPalette_Gible ) + OVERWORLD_FEMALE( + sPicTable_GibleF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sGibleLevelUpLearnset, .teachableLearnset = sGibleTeachableLearnset, .eggMoveLearnset = sGibleEggMoveLearnset, @@ -3726,6 +3816,12 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_Gabite, gShinyOverworldPalette_Gabite ) + OVERWORLD_FEMALE( + sPicTable_GabiteF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sGabiteLevelUpLearnset, .teachableLearnset = sGabiteTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 48, SPECIES_GARCHOMP}), @@ -3796,6 +3892,12 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_Garchomp, gShinyOverworldPalette_Garchomp ) + OVERWORLD_FEMALE( + sPicTable_GarchompF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sGarchompLevelUpLearnset, .teachableLearnset = sGarchompTeachableLearnset, .formSpeciesIdTable = sGarchompFormSpeciesIdTable, @@ -4113,6 +4215,12 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_Hippopotas, gShinyOverworldPalette_Hippopotas ) + OVERWORLD_FEMALE( + sPicTable_HippopotasF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sHippopotasLevelUpLearnset, .teachableLearnset = sHippopotasTeachableLearnset, .eggMoveLearnset = sHippopotasEggMoveLearnset, @@ -4182,6 +4290,10 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_Hippowdon, gShinyOverworldPalette_Hippowdon ) + OVERWORLD_PAL_FEMALE( + gOverworldPalette_HippowdonF, + gShinyOverworldPalette_HippowdonF + ) .levelUpLearnset = sHippowdonLevelUpLearnset, .teachableLearnset = sHippowdonTeachableLearnset, }, @@ -4378,6 +4490,12 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_Croagunk, gShinyOverworldPalette_Croagunk ) + OVERWORLD_FEMALE( + sPicTable_CroagunkF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sCroagunkLevelUpLearnset, .teachableLearnset = sCroagunkTeachableLearnset, .eggMoveLearnset = sCroagunkEggMoveLearnset, @@ -4446,6 +4564,12 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_Toxicroak, gShinyOverworldPalette_Toxicroak ) + OVERWORLD_FEMALE( + sPicTable_ToxicroakF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sToxicroakLevelUpLearnset, .teachableLearnset = sToxicroakTeachableLearnset, }, @@ -4578,6 +4702,12 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_Finneon, gShinyOverworldPalette_Finneon ) + OVERWORLD_FEMALE( + sPicTable_FinneonF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sFinneonLevelUpLearnset, .teachableLearnset = sFinneonTeachableLearnset, .eggMoveLearnset = sFinneonEggMoveLearnset, @@ -4645,6 +4775,12 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_Lumineon, gShinyOverworldPalette_Lumineon ) + OVERWORLD_FEMALE( + sPicTable_LumineonF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sLumineonLevelUpLearnset, .teachableLearnset = sLumineonTeachableLearnset, }, @@ -4713,6 +4849,12 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_Snover, gShinyOverworldPalette_Snover ) + OVERWORLD_FEMALE( + sPicTable_SnoverF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sSnoverLevelUpLearnset, .teachableLearnset = sSnoverTeachableLearnset, .eggMoveLearnset = sSnoverEggMoveLearnset, @@ -4780,6 +4922,12 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_Abomasnow, gShinyOverworldPalette_Abomasnow ) + OVERWORLD_FEMALE( + sPicTable_AbomasnowF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sAbomasnowLevelUpLearnset, .teachableLearnset = sAbomasnowTeachableLearnset, .formSpeciesIdTable = sAbomasnowFormSpeciesIdTable, @@ -6461,6 +6609,14 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .iconPalIndex = 1, SHADOW(3, 7, SHADOW_SIZE_M) FOOTPRINT(Shaymin) + OVERWORLD( + sPicTable_ShayminSky, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_ShayminSky, + gShinyOverworldPalette_ShayminSky + ) .isMythical = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, diff --git a/src/data/pokemon/species_info/gen_5_families.h b/src/data/pokemon/species_info/gen_5_families.h index 9445c57a43bd..87c1bf561ca7 100644 --- a/src/data/pokemon/species_info/gen_5_families.h +++ b/src/data/pokemon/species_info/gen_5_families.h @@ -570,7 +570,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .levelUpLearnset = sDewottLevelUpLearnset, .teachableLearnset = sDewottTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 36, SPECIES_SAMUROTT}, - {EVO_NONE, 0, SPECIES_SAMUROTT_HISUIAN}), + {EVO_NONE, 0, SPECIES_SAMUROTT_HISUI}), }, [SPECIES_SAMUROTT] = @@ -636,7 +636,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = }, #if P_HISUIAN_FORMS - [SPECIES_SAMUROTT_HISUIAN] = + [SPECIES_SAMUROTT_HISUI] = { .baseHP = 90, .baseAttack = 108, @@ -1852,6 +1852,14 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = gOverworldPalette_Unfezant, gShinyOverworldPalette_Unfezant ) + OVERWORLD_FEMALE( + sPicTable_UnfezantF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_UnfezantF, + gShinyOverworldPalette_UnfezantF + ) .levelUpLearnset = sUnfezantLevelUpLearnset, .teachableLearnset = sUnfezantTeachableLearnset, }, @@ -3698,7 +3706,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .teachableLearnset = sPetililTeachableLearnset, .eggMoveLearnset = sPetililEggMoveLearnset, .evolutions = EVOLUTION({EVO_ITEM, ITEM_SUN_STONE, SPECIES_LILLIGANT}, - {EVO_NONE, 0, SPECIES_LILLIGANT_HISUIAN}), + {EVO_NONE, 0, SPECIES_LILLIGANT_HISUI}), }, [SPECIES_LILLIGANT] = @@ -3766,7 +3774,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = }, #if P_HISUIAN_FORMS - [SPECIES_LILLIGANT_HISUIAN] = + [SPECIES_LILLIGANT_HISUI] = { .baseHP = 70, .baseAttack = 105, @@ -4028,11 +4036,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .levelUpLearnset = sBasculinWhiteStripedLevelUpLearnset, .teachableLearnset = sBasculinWhiteStripedTeachableLearnset, .formSpeciesIdTable = sBasculinFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_RECOIL_DAMAGE_MALE, 294, SPECIES_BASCULEGION_MALE}, - {EVO_RECOIL_DAMAGE_FEMALE, 294, SPECIES_BASCULEGION_FEMALE}), + .evolutions = EVOLUTION({EVO_RECOIL_DAMAGE_MALE, 294, SPECIES_BASCULEGION_M}, + {EVO_RECOIL_DAMAGE_FEMALE, 294, SPECIES_BASCULEGION_F}), }, - [SPECIES_BASCULEGION_MALE] = + [SPECIES_BASCULEGION_M] = { .baseHP = 120, .baseAttack = 112, @@ -4095,7 +4103,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .formSpeciesIdTable = sBasculegionFormSpeciesIdTable, }, - [SPECIES_BASCULEGION_FEMALE] = + [SPECIES_BASCULEGION_F] = { .baseHP = 120, .baseAttack = 92, @@ -4418,10 +4426,10 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .teachableLearnset = sDarumakaTeachableLearnset, .eggMoveLearnset = sDarumakaEggMoveLearnset, .formSpeciesIdTable = sDarumakaFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_LEVEL, 35, SPECIES_DARMANITAN_STANDARD_MODE}), + .evolutions = EVOLUTION({EVO_LEVEL, 35, SPECIES_DARMANITAN_STANDARD}), }, - [SPECIES_DARMANITAN_STANDARD_MODE] = + [SPECIES_DARMANITAN_STANDARD] = { .baseHP = 105, .baseAttack = 140, @@ -4484,7 +4492,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .formChangeTable = sDarmanitanFormChangeTable, }, - [SPECIES_DARMANITAN_ZEN_MODE] = + [SPECIES_DARMANITAN_ZEN] = { .baseHP = 105, .baseAttack = 30, @@ -4539,7 +4547,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = }, #if P_GALARIAN_FORMS - [SPECIES_DARUMAKA_GALARIAN] = + [SPECIES_DARUMAKA_GALAR] = { .baseHP = 70, .baseAttack = 90, @@ -4601,10 +4609,10 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .teachableLearnset = sDarumakaGalarianTeachableLearnset, .eggMoveLearnset = sDarumakaGalarianEggMoveLearnset, .formSpeciesIdTable = sDarumakaFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_ITEM, ITEM_ICE_STONE, SPECIES_DARMANITAN_GALARIAN_STANDARD_MODE}), + .evolutions = EVOLUTION({EVO_ITEM, ITEM_ICE_STONE, SPECIES_DARMANITAN_GALAR_STANDARD}), }, - [SPECIES_DARMANITAN_GALARIAN_STANDARD_MODE] = + [SPECIES_DARMANITAN_GALAR_STANDARD] = { .baseHP = 105, .baseAttack = 140, @@ -4668,7 +4676,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .formChangeTable = sDarmanitanGalarianFormChangeTable, }, - [SPECIES_DARMANITAN_GALARIAN_ZEN_MODE] = + [SPECIES_DARMANITAN_GALAR_ZEN] = { .baseHP = 105, .baseAttack = 160, @@ -5243,7 +5251,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = }, #if P_GALARIAN_FORMS - [SPECIES_YAMASK_GALARIAN] = + [SPECIES_YAMASK_GALAR] = { .baseHP = 38, .baseAttack = 55, @@ -5757,7 +5765,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = }, #if P_GIGANTAMAX_FORMS - [SPECIES_GARBODOR_GIGANTAMAX] = + [SPECIES_GARBODOR_GMAX] = { .baseHP = 80, .baseAttack = 95, @@ -5946,7 +5954,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = }, #if P_HISUIAN_FORMS - [SPECIES_ZORUA_HISUIAN] = + [SPECIES_ZORUA_HISUI] = { .baseHP = 35, .baseAttack = 60, @@ -6007,10 +6015,10 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .levelUpLearnset = sZoruaHisuianLevelUpLearnset, .teachableLearnset = sZoruaHisuianTeachableLearnset, .formSpeciesIdTable = sZoruaFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_LEVEL, 30, SPECIES_ZOROARK_HISUIAN}), + .evolutions = EVOLUTION({EVO_LEVEL, 30, SPECIES_ZOROARK_HISUI}), }, - [SPECIES_ZOROARK_HISUIAN] = + [SPECIES_ZOROARK_HISUI] = { .baseHP = 55, .baseAttack = 100, @@ -7818,6 +7826,14 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = gOverworldPalette_Frillish, gShinyOverworldPalette_Frillish ) + OVERWORLD_FEMALE( + sPicTable_FrillishF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_FrillishF, + gShinyOverworldPalette_FrillishF + ) .levelUpLearnset = sFrillishLevelUpLearnset, .teachableLearnset = sFrillishTeachableLearnset, .eggMoveLearnset = sFrillishEggMoveLearnset, @@ -7889,6 +7905,14 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = gOverworldPalette_Jellicent, gShinyOverworldPalette_Jellicent ) + OVERWORLD_FEMALE( + sPicTable_JellicentF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_JellicentF, + gShinyOverworldPalette_JellicentF + ) .levelUpLearnset = sJellicentLevelUpLearnset, .teachableLearnset = sJellicentTeachableLearnset, }, @@ -9509,7 +9533,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = }, #if P_GALARIAN_FORMS - [SPECIES_STUNFISK_GALARIAN] = + [SPECIES_STUNFISK_GALAR] = { .baseHP = 109, .baseAttack = 81, @@ -10211,7 +10235,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .levelUpLearnset = sRuffletLevelUpLearnset, .teachableLearnset = sRuffletTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 54, SPECIES_BRAVIARY}, - {EVO_NONE, 0, SPECIES_BRAVIARY_HISUIAN}), + {EVO_NONE, 0, SPECIES_BRAVIARY_HISUI}), }, [SPECIES_BRAVIARY] = @@ -10278,7 +10302,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = }, #if P_HISUIAN_FORMS - [SPECIES_BRAVIARY_HISUIAN] = + [SPECIES_BRAVIARY_HISUI] = { .baseHP = 110, .baseAttack = 83, @@ -11226,6 +11250,14 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .iconPalIndex = 1, SHADOW(-5, 12, SHADOW_SIZE_L) FOOTPRINT(Tornadus) + OVERWORLD( + sPicTable_TornadusTherian, + SIZE_64x64, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_TornadusTherian, + gShinyOverworldPalette_TornadusTherian + ) .isLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sTornadusLevelUpLearnset, @@ -11352,6 +11384,14 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .iconPalIndex = 0, SHADOW(5, 16, SHADOW_SIZE_M) FOOTPRINT(Thundurus) + OVERWORLD( + sPicTable_ThundurusTherian, + SIZE_64x64, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_ThundurusTherian, + gShinyOverworldPalette_ThundurusTherian + ) .isLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sThundurusLevelUpLearnset, @@ -11609,6 +11649,14 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .iconPalIndex = 0, SHADOW(1, 11, SHADOW_SIZE_L) FOOTPRINT(Landorus) + OVERWORLD( + sPicTable_LandorusTherian, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_LandorusTherian, + gShinyOverworldPalette_LandorusTherian + ) .isLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sLandorusLevelUpLearnset, @@ -11744,6 +11792,14 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .iconPalIndex = 0, SHADOW(-8, 14, SHADOW_SIZE_L) FOOTPRINT(Kyurem) + OVERWORLD( + sPicTable_KyuremWhite, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_KyuremWhite, + gShinyOverworldPalette_KyuremWhite + ) .isLegendary = TRUE, .cannotBeTraded = TRUE, .isFrontierBanned = TRUE, @@ -11809,6 +11865,14 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .iconPalIndex = 0, SHADOW(4, 14, SHADOW_SIZE_L) FOOTPRINT(Kyurem) + OVERWORLD( + sPicTable_KyuremBlack, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_KyuremBlack, + gShinyOverworldPalette_KyuremBlack + ) .isLegendary = TRUE, .cannotBeTraded = TRUE, .isFrontierBanned = TRUE, @@ -12158,10 +12222,10 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = } [SPECIES_GENESECT] = GENESECT_SPECIES_INFO(Genesect), - [SPECIES_GENESECT_DOUSE_DRIVE] = GENESECT_SPECIES_INFO(GenesectDouseDrive), - [SPECIES_GENESECT_SHOCK_DRIVE] = GENESECT_SPECIES_INFO(GenesectShockDrive), - [SPECIES_GENESECT_BURN_DRIVE] = GENESECT_SPECIES_INFO(GenesectBurnDrive), - [SPECIES_GENESECT_CHILL_DRIVE] = GENESECT_SPECIES_INFO(GenesectChillDrive), + [SPECIES_GENESECT_DOUSE] = GENESECT_SPECIES_INFO(GenesectDouseDrive), + [SPECIES_GENESECT_SHOCK] = GENESECT_SPECIES_INFO(GenesectShockDrive), + [SPECIES_GENESECT_BURN] = GENESECT_SPECIES_INFO(GenesectBurnDrive), + [SPECIES_GENESECT_CHILL] = GENESECT_SPECIES_INFO(GenesectChillDrive), #endif //P_FAMILY_GENESECT #ifdef __INTELLISENSE__ diff --git a/src/data/pokemon/species_info/gen_6_families.h b/src/data/pokemon/species_info/gen_6_families.h index 90e3d2d51eba..47df7969ca97 100644 --- a/src/data/pokemon/species_info/gen_6_families.h +++ b/src/data/pokemon/species_info/gen_6_families.h @@ -1078,7 +1078,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = [SPECIES_SCATTERBUG_OCEAN] = SCATTERBUG_SPECIES_INFO(OCEAN), [SPECIES_SCATTERBUG_JUNGLE] = SCATTERBUG_SPECIES_INFO(JUNGLE), [SPECIES_SCATTERBUG_FANCY] = SCATTERBUG_SPECIES_INFO(FANCY), - [SPECIES_SCATTERBUG_POKE_BALL] = SCATTERBUG_SPECIES_INFO(POKE_BALL), + [SPECIES_SCATTERBUG_POKEBALL] = SCATTERBUG_SPECIES_INFO(POKEBALL), #define SPEWPA_SPECIES_INFO(evolution) \ { \ @@ -1159,7 +1159,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = [SPECIES_SPEWPA_OCEAN] = SPEWPA_SPECIES_INFO(OCEAN), [SPECIES_SPEWPA_JUNGLE] = SPEWPA_SPECIES_INFO(JUNGLE), [SPECIES_SPEWPA_FANCY] = SPEWPA_SPECIES_INFO(FANCY), - [SPECIES_SPEWPA_POKE_BALL] = SPEWPA_SPECIES_INFO(POKE_BALL), + [SPECIES_SPEWPA_POKEBALL] = SPEWPA_SPECIES_INFO(POKEBALL), #define VIVILLON_MISC_INFO(form, color, iconPal) \ .baseHP = 80, \ @@ -1390,7 +1390,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "This form is from a mysterious land.\n" "It scatters toxic color scales in battle."), }, - [SPECIES_VIVILLON_POKE_BALL] = + [SPECIES_VIVILLON_POKEBALL] = { VIVILLON_MISC_INFO(PokeBall, BODY_COLOR_RED, 2), .description = COMPOUND_STRING( @@ -1528,6 +1528,12 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = gOverworldPalette_Pyroar, gShinyOverworldPalette_Pyroar ) + OVERWORLD_FEMALE( + sPicTable_PyroarF, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT + ) .levelUpLearnset = sPyroarLevelUpLearnset, .teachableLearnset = sPyroarTeachableLearnset, }, @@ -1590,9 +1596,9 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .teachableLearnset = sFlabebeTeachableLearnset, \ .eggMoveLearnset = sFlabebeEggMoveLearnset, \ .formSpeciesIdTable = sFlabebeFormSpeciesIdTable, \ - .evolutions = EVOLUTION({EVO_LEVEL, 19, SPECIES_FLOETTE_ ##FORM##_FLOWER}) + .evolutions = EVOLUTION({EVO_LEVEL, 19, SPECIES_FLOETTE_ ##FORM}) - [SPECIES_FLABEBE_RED_FLOWER] = + [SPECIES_FLABEBE_RED] = { FLABEBE_MISC_INFO(Red, RED, 1), .description = COMPOUND_STRING( @@ -1601,7 +1607,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "begins flying around in search of a\n" "flower it likes."), }, - [SPECIES_FLABEBE_YELLOW_FLOWER] = + [SPECIES_FLABEBE_YELLOW] = { FLABEBE_MISC_INFO(Yellow, YELLOW, 1), .description = COMPOUND_STRING( @@ -1610,7 +1616,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "within flowers. This Pokémon is\n" "particularly fond of yellow flowers."), }, - [SPECIES_FLABEBE_ORANGE_FLOWER] = + [SPECIES_FLABEBE_ORANGE] = { FLABEBE_MISC_INFO(Orange, ORANGE, 0), .description = COMPOUND_STRING( @@ -1619,7 +1625,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "return. This Pokémon likes orange\n" "flowers best of all."), }, - [SPECIES_FLABEBE_BLUE_FLOWER] = + [SPECIES_FLABEBE_BLUE] = { FLABEBE_MISC_INFO(Blue, BLUE, 0), .description = COMPOUND_STRING( @@ -1628,7 +1634,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "power emanating from its flower\n" "and bobs along lightly through the air."), }, - [SPECIES_FLABEBE_WHITE_FLOWER] = + [SPECIES_FLABEBE_WHITE] = { FLABEBE_MISC_INFO(White, WHITE, 1), .description = COMPOUND_STRING( @@ -1695,10 +1701,10 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .backPicYOffset = 2, \ .levelUpLearnset = sFloetteLevelUpLearnset, \ .teachableLearnset = sFloetteTeachableLearnset, \ - .evolutions = EVOLUTION({EVO_ITEM, ITEM_SHINY_STONE, SPECIES_FLORGES_ ##FORM##_FLOWER}),\ + .evolutions = EVOLUTION({EVO_ITEM, ITEM_SHINY_STONE, SPECIES_FLORGES_ ##FORM}),\ FLOETTE_MISC_INFO(form, FORM, iconPal) - [SPECIES_FLOETTE_RED_FLOWER] = + [SPECIES_FLOETTE_RED] = { FLOETTE_NORMAL_INFO(Red, RED, 1), .description = COMPOUND_STRING( @@ -1707,7 +1713,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "into flowers and draw forth their\n" "latent potential."), }, - [SPECIES_FLOETTE_YELLOW_FLOWER] = + [SPECIES_FLOETTE_YELLOW] = { FLOETTE_NORMAL_INFO(Yellow, YELLOW, 1), .description = COMPOUND_STRING( @@ -1716,7 +1722,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "This power then becomes the moves\n" "Floette uses to protect itself."), }, - [SPECIES_FLOETTE_ORANGE_FLOWER] = + [SPECIES_FLOETTE_ORANGE] = { FLOETTE_NORMAL_INFO(Orange, ORANGE, 0), .description = COMPOUND_STRING( @@ -1725,7 +1731,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "flowers, compared to flowers of other\n" "colors."), }, - [SPECIES_FLOETTE_BLUE_FLOWER] = + [SPECIES_FLOETTE_BLUE] = { FLOETTE_NORMAL_INFO(Blue, BLUE, 0), .description = COMPOUND_STRING( @@ -1734,7 +1740,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "will bring them back to its territory\n" "and care for them."), }, - [SPECIES_FLOETTE_WHITE_FLOWER] = + [SPECIES_FLOETTE_WHITE] = { FLOETTE_NORMAL_INFO(White, WHITE, 1), .description = COMPOUND_STRING( @@ -1743,7 +1749,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "without mercy. This Floette takes\n" "particularly good care of white flowers."), }, - [SPECIES_FLOETTE_ETERNAL_FLOWER] = + [SPECIES_FLOETTE_ETERNAL] = { FLOETTE_MISC_INFO(Eternal, ETERNAL, 0), .baseHP = 74, @@ -1754,7 +1760,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .baseSpDefense = 128, .expYield = 243, .eggGroups = MON_EGG_GROUPS(EGG_GROUP_NO_EGGS_DISCOVERED), - .cryId = CRY_FLOETTE_ETERNAL_FLOWER, + .cryId = CRY_FLOETTE_ETERNAL, .description = COMPOUND_STRING( "The flower it's holding can no\n" "longer be found blooming anywhere. It's\n" @@ -1826,7 +1832,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .teachableLearnset = sFlorgesTeachableLearnset, \ .formSpeciesIdTable = sFlorgesFormSpeciesIdTable - [SPECIES_FLORGES_RED_FLOWER] = + [SPECIES_FLORGES_RED] = { FLORGES_MISC_INFO(Red, 0), .description = COMPOUND_STRING( @@ -1835,7 +1841,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "draws forth the power of the red\n" "flowers around its neck."), }, - [SPECIES_FLORGES_YELLOW_FLOWER] = + [SPECIES_FLORGES_YELLOW] = { FLORGES_MISC_INFO(Yellow, 1), .description = COMPOUND_STRING( @@ -1844,7 +1850,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "ruthlessly punishes anyone who\n" "tramples on flowering plants."), }, - [SPECIES_FLORGES_ORANGE_FLOWER] = + [SPECIES_FLORGES_ORANGE] = { FLORGES_MISC_INFO(Orange, 0), .description = COMPOUND_STRING( @@ -1853,7 +1859,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "care for their castles' exquisite\n" "gardens."), }, - [SPECIES_FLORGES_BLUE_FLOWER] = + [SPECIES_FLORGES_BLUE] = { FLORGES_MISC_INFO(Blue, 0), .description = COMPOUND_STRING( @@ -1861,7 +1867,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "expensive in the past, so paintings\n" "of blue Florges are highly valuable."), }, - [SPECIES_FLORGES_WHITE_FLOWER] = + [SPECIES_FLORGES_WHITE] = { FLORGES_MISC_INFO(White, 0), .description = COMPOUND_STRING( @@ -2261,11 +2267,11 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .levelUpLearnset = sEspurrLevelUpLearnset, .teachableLearnset = sEspurrTeachableLearnset, .eggMoveLearnset = sEspurrEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL_MALE, 25, SPECIES_MEOWSTIC_MALE}, - {EVO_LEVEL_FEMALE, 25, SPECIES_MEOWSTIC_FEMALE}), + .evolutions = EVOLUTION({EVO_LEVEL_MALE, 25, SPECIES_MEOWSTIC_M}, + {EVO_LEVEL_FEMALE, 25, SPECIES_MEOWSTIC_F}), }, - [SPECIES_MEOWSTIC_MALE] = + [SPECIES_MEOWSTIC_M] = { .baseHP = 74, .baseAttack = 48, @@ -2327,7 +2333,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .formSpeciesIdTable = sMeowsticFormSpeciesIdTable, }, - [SPECIES_MEOWSTIC_FEMALE] = + [SPECIES_MEOWSTIC_F] = { .baseHP = 74, .baseAttack = 48, @@ -4051,7 +4057,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .teachableLearnset = sGoomyTeachableLearnset, .eggMoveLearnset = sGoomyEggMoveLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 40, SPECIES_SLIGGOO}, - {EVO_NONE, 0, SPECIES_SLIGGOO_HISUIAN}), + {EVO_NONE, 0, SPECIES_SLIGGOO_HISUI}), }, [SPECIES_SLIGGOO] = @@ -4182,7 +4188,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = }, #if P_HISUIAN_FORMS - [SPECIES_SLIGGOO_HISUIAN] = + [SPECIES_SLIGGOO_HISUI] = { .baseHP = 58, .baseAttack = 75, @@ -4244,11 +4250,11 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .levelUpLearnset = sSliggooHisuianLevelUpLearnset, .teachableLearnset = sSliggooHisuianTeachableLearnset, .formSpeciesIdTable = sSliggooFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_LEVEL_RAIN, 50, SPECIES_GOODRA_HISUIAN}, - {EVO_LEVEL_FOG, 50, SPECIES_GOODRA_HISUIAN}), + .evolutions = EVOLUTION({EVO_LEVEL_RAIN, 50, SPECIES_GOODRA_HISUI}, + {EVO_LEVEL_FOG, 50, SPECIES_GOODRA_HISUI}), }, - [SPECIES_GOODRA_HISUIAN] = + [SPECIES_GOODRA_HISUI] = { .baseHP = 80, .baseAttack = 100, @@ -4621,6 +4627,14 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .iconPalIndex = 2, SHADOW(-1, -1, SHADOW_SIZE_S) FOOTPRINT(Pumpkaboo) + OVERWORLD( + sPicTable_PumpkabooSmall, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_Pumpkaboo, + gShinyOverworldPalette_Pumpkaboo + ) .levelUpLearnset = sPumpkabooLevelUpLearnset, .teachableLearnset = sPumpkabooTeachableLearnset, .eggMoveLearnset = sPumpkabooEggMoveLearnset, @@ -4677,6 +4691,14 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .iconPalIndex = 2, SHADOW(0, 2, SHADOW_SIZE_S) FOOTPRINT(Pumpkaboo) + OVERWORLD( + sPicTable_PumpkabooLarge, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_Pumpkaboo, + gShinyOverworldPalette_Pumpkaboo + ) .levelUpLearnset = sPumpkabooLevelUpLearnset, .teachableLearnset = sPumpkabooTeachableLearnset, .eggMoveLearnset = sPumpkabooEggMoveLearnset, @@ -4735,6 +4757,14 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .iconPalIndex = 2, SHADOW(1, 4, SHADOW_SIZE_S) FOOTPRINT(Pumpkaboo) + OVERWORLD( + sPicTable_PumpkabooSuper, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_Pumpkaboo, + gShinyOverworldPalette_Pumpkaboo + ) .levelUpLearnset = sPumpkabooLevelUpLearnset, .teachableLearnset = sPumpkabooTeachableLearnset, .eggMoveLearnset = sPumpkabooEggMoveLearnset, @@ -4854,6 +4884,14 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .iconPalIndex = 2, SHADOW(4, 9, SHADOW_SIZE_S) FOOTPRINT(Gourgeist) + OVERWORLD( + sPicTable_GourgeistSmall, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_Gourgeist, + gShinyOverworldPalette_Gourgeist + ) .levelUpLearnset = sGourgeistLevelUpLearnset, .teachableLearnset = sGourgeistTeachableLearnset, .formSpeciesIdTable = sGourgeistFormSpeciesIdTable, @@ -4908,6 +4946,14 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .iconPalIndex = 2, SHADOW(4, 12, SHADOW_SIZE_M) FOOTPRINT(Gourgeist) + OVERWORLD( + sPicTable_GourgeistLarge, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_Gourgeist, + gShinyOverworldPalette_Gourgeist + ) .levelUpLearnset = sGourgeistLevelUpLearnset, .teachableLearnset = sGourgeistTeachableLearnset, .formSpeciesIdTable = sGourgeistFormSpeciesIdTable, @@ -4964,6 +5010,14 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .iconPalIndex = 2, SHADOW(4, 14, SHADOW_SIZE_M) FOOTPRINT(Gourgeist) + OVERWORLD( + sPicTable_GourgeistSuper, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_Gourgeist, + gShinyOverworldPalette_Gourgeist + ) .levelUpLearnset = sGourgeistLevelUpLearnset, .teachableLearnset = sGourgeistTeachableLearnset, .formSpeciesIdTable = sGourgeistFormSpeciesIdTable, @@ -5038,7 +5092,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .teachableLearnset = sBergmiteTeachableLearnset, .eggMoveLearnset = sBergmiteEggMoveLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 37, SPECIES_AVALUGG}, - {EVO_NONE, 0, SPECIES_AVALUGG_HISUIAN}), + {EVO_NONE, 0, SPECIES_AVALUGG_HISUI}), }, [SPECIES_AVALUGG] = @@ -5104,7 +5158,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = }, #if P_HISUIAN_FORMS - [SPECIES_AVALUGG_HISUIAN] = + [SPECIES_AVALUGG_HISUI] = { .baseHP = 95, .baseAttack = 127, @@ -5497,7 +5551,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = #endif //P_FAMILY_YVELTAL #if P_FAMILY_ZYGARDE - [SPECIES_ZYGARDE_50_AURA_BREAK] = + [SPECIES_ZYGARDE_50] = { .baseHP = 108, .baseAttack = 100, @@ -5667,6 +5721,14 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .iconPalIndex = 1, SHADOW(1, 11, SHADOW_SIZE_L) FOOTPRINT(Zygarde) + OVERWORLD( + sPicTable_Zygarde10, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_Zygarde10, + gShinyOverworldPalette_Zygarde10 + ) .isLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, @@ -5722,6 +5784,14 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .iconPalIndex = 1, SHADOW(1, 11, SHADOW_SIZE_L) FOOTPRINT(Zygarde) + OVERWORLD( + sPicTable_Zygarde10, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_Zygarde10, + gShinyOverworldPalette_Zygarde10 + ) .isLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, @@ -5781,6 +5851,14 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .iconPalIndex = 1, SHADOW(-3, 13, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Zygarde) + OVERWORLD( + sPicTable_ZygardeComplete, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_ZygardeComplete, + gShinyOverworldPalette_ZygardeComplete + ) .isLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, diff --git a/src/data/pokemon/species_info/gen_7_families.h b/src/data/pokemon/species_info/gen_7_families.h index b328c2a716e4..c6f0e0faf340 100644 --- a/src/data/pokemon/species_info/gen_7_families.h +++ b/src/data/pokemon/species_info/gen_7_families.h @@ -128,7 +128,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .levelUpLearnset = sDartrixLevelUpLearnset, .teachableLearnset = sDartrixTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 34, SPECIES_DECIDUEYE}, - {EVO_NONE, 0, SPECIES_DECIDUEYE_HISUIAN}), + {EVO_NONE, 0, SPECIES_DECIDUEYE_HISUI}), }, [SPECIES_DECIDUEYE] = @@ -194,7 +194,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = }, #if P_HISUIAN_FORMS - [SPECIES_DECIDUEYE_HISUIAN] = + [SPECIES_DECIDUEYE_HISUI] = { .baseHP = 88, .baseAttack = 112, @@ -1507,6 +1507,14 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .iconPalIndex = 1, SHADOW(5, 8, SHADOW_SIZE_S) FOOTPRINT(Oricorio) + OVERWORLD( + sPicTable_OricorioPomPom, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_OricorioPomPom, + gShinyOverworldPalette_OricorioPomPom + ) .levelUpLearnset = sOricorioLevelUpLearnset, .teachableLearnset = sOricorioTeachableLearnset, .eggMoveLearnset = sOricorioEggMoveLearnset, @@ -1564,6 +1572,14 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .iconPalIndex = 1, SHADOW(-3, 11, SHADOW_SIZE_S) FOOTPRINT(Oricorio) + OVERWORLD( + sPicTable_OricorioPau, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_OricorioPau, + gShinyOverworldPalette_OricorioPau + ) .levelUpLearnset = sOricorioLevelUpLearnset, .teachableLearnset = sOricorioTeachableLearnset, .eggMoveLearnset = sOricorioEggMoveLearnset, @@ -1621,6 +1637,14 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .iconPalIndex = 0, SHADOW(7, 10, SHADOW_SIZE_S) FOOTPRINT(Oricorio) + OVERWORLD( + sPicTable_OricorioSensu, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_OricorioSensu, + gShinyOverworldPalette_OricorioSensu + ) .levelUpLearnset = sOricorioLevelUpLearnset, .teachableLearnset = sOricorioTeachableLearnset, .eggMoveLearnset = sOricorioEggMoveLearnset, @@ -4704,6 +4728,14 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .iconPalIndex = 1, SHADOW(-3, 1, SHADOW_SIZE_S) FOOTPRINT(Mimikyu) + OVERWORLD( + sPicTable_MimikyuDisguised, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_MimikyuDisguised, + gShinyOverworldPalette_MimikyuDisguised + ) .isTotem = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sMimikyuLevelUpLearnset, @@ -4713,7 +4745,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .formChangeTable = sMimikyuTotemFormChangeTable, }, - [SPECIES_MIMIKYU_TOTEM_BUSTED] = + [SPECIES_MIMIKYU_BUSTED_TOTEM] = { .baseHP = 55, .baseAttack = 90, @@ -6545,7 +6577,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .teachableLearnset = sMagearnaTeachableLearnset, .formSpeciesIdTable = sMagearnaFormSpeciesIdTable, }, - [SPECIES_MAGEARNA_ORIGINAL_COLOR] = + [SPECIES_MAGEARNA_ORIGINAL] = { .baseHP = 80, .baseAttack = 95, @@ -6594,6 +6626,14 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .iconPalIndex = 0, SHADOW(-2, 14, SHADOW_SIZE_M) FOOTPRINT(Magearna) + OVERWORLD( + sPicTable_MagearnaOriginalColor, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_MagearnaOriginalColor, + gShinyOverworldPalette_MagearnaOriginalColor + ) .isMythical = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, @@ -7125,7 +7165,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = }, #if P_GIGANTAMAX_FORMS - [SPECIES_MELMETAL_GIGANTAMAX] = + [SPECIES_MELMETAL_GMAX] = { .baseHP = 135, .baseAttack = 143, diff --git a/src/data/pokemon/species_info/gen_8_families.h b/src/data/pokemon/species_info/gen_8_families.h index b40b31a25da8..07945279213d 100644 --- a/src/data/pokemon/species_info/gen_8_families.h +++ b/src/data/pokemon/species_info/gen_8_families.h @@ -191,7 +191,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = }, #if P_GIGANTAMAX_FORMS - [SPECIES_RILLABOOM_GIGANTAMAX] = + [SPECIES_RILLABOOM_GMAX] = { .baseHP = 100, .baseAttack = 125, @@ -437,7 +437,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = }, #if P_GIGANTAMAX_FORMS - [SPECIES_CINDERACE_GIGANTAMAX] = + [SPECIES_CINDERACE_GMAX] = { .baseHP = 80, .baseAttack = 116, @@ -685,7 +685,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = }, #if P_GIGANTAMAX_FORMS - [SPECIES_INTELEON_GIGANTAMAX] = + [SPECIES_INTELEON_GMAX] = { .baseHP = 70, .baseAttack = 85, @@ -1061,7 +1061,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = }, #if P_GIGANTAMAX_FORMS - [SPECIES_CORVIKNIGHT_GIGANTAMAX] = + [SPECIES_CORVIKNIGHT_GMAX] = { .baseHP = 98, .baseAttack = 87, @@ -1312,7 +1312,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = }, #if P_GIGANTAMAX_FORMS - [SPECIES_ORBEETLE_GIGANTAMAX] = + [SPECIES_ORBEETLE_GMAX] = { .baseHP = 60, .baseAttack = 45, @@ -1875,7 +1875,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = }, #if P_GIGANTAMAX_FORMS - [SPECIES_DREDNAW_GIGANTAMAX] = + [SPECIES_DREDNAW_GMAX] = { .baseHP = 90, .baseAttack = 115, @@ -2248,7 +2248,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = }, #if P_GIGANTAMAX_FORMS - [SPECIES_COALOSSAL_GIGANTAMAX] = + [SPECIES_COALOSSAL_GMAX] = { .baseHP = 110, .baseAttack = 80, @@ -2437,7 +2437,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = }, #if P_GIGANTAMAX_FORMS - [SPECIES_FLAPPLE_GIGANTAMAX] = + [SPECIES_FLAPPLE_GMAX] = { .baseHP = 70, .baseAttack = 110, @@ -2557,7 +2557,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = }, #if P_GIGANTAMAX_FORMS - [SPECIES_APPLETUN_GIGANTAMAX] = + [SPECIES_APPLETUN_GMAX] = { .baseHP = 110, .baseAttack = 85, @@ -2866,7 +2866,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = }, #if P_GIGANTAMAX_FORMS - [SPECIES_SANDACONDA_GIGANTAMAX] = + [SPECIES_SANDACONDA_GMAX] = { .baseHP = 72, .baseAttack = 107, @@ -3356,7 +3356,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = }, #if P_GIGANTAMAX_FORMS - [SPECIES_TOXTRICITY_AMPED_GIGANTAMAX] = + [SPECIES_TOXTRICITY_AMPED_GMAX] = { .baseHP = 75, .baseAttack = 98, @@ -3472,7 +3472,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = }, #if P_GIGANTAMAX_FORMS - [SPECIES_TOXTRICITY_LOW_KEY_GIGANTAMAX] = + [SPECIES_TOXTRICITY_LOW_KEY_GMAX] = { .baseHP = 75, .baseAttack = 98, @@ -3517,14 +3517,6 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .iconPalIndex = 0, SHADOW(1, 10, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Toxtricity) - OVERWORLD( - sPicTable_ToxtricityLowKey, - SIZE_32x32, - SHADOW_SIZE_M, - TRACKS_FOOT, - gOverworldPalette_ToxtricityLowKey, - gShinyOverworldPalette_ToxtricityLowKey - ) .isGigantamax = TRUE, .levelUpLearnset = sToxtricityLowKeyLevelUpLearnset, .teachableLearnset = sToxtricityLowKeyTeachableLearnset, @@ -3661,7 +3653,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = }, #if P_GIGANTAMAX_FORMS - [SPECIES_CENTISKORCH_GIGANTAMAX] = + [SPECIES_CENTISKORCH_GMAX] = { .baseHP = 100, .baseAttack = 115, @@ -4286,7 +4278,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = }, #if P_GIGANTAMAX_FORMS - [SPECIES_HATTERENE_GIGANTAMAX] = + [SPECIES_HATTERENE_GMAX] = { .baseHP = 57, .baseAttack = 90, @@ -4533,7 +4525,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = }, #if P_GIGANTAMAX_FORMS - [SPECIES_GRIMMSNARL_GIGANTAMAX] = + [SPECIES_GRIMMSNARL_GMAX] = { .baseHP = 95, .baseAttack = 120, @@ -4789,7 +4781,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = [SPECIES_ALCREMIE_RIBBON_CARAMEL_SWIRL] = ALCREMIE_REGULAR_SPECIES_INFO(Ribbon, CaramelSwirl, BODY_COLOR_BROWN), [SPECIES_ALCREMIE_RIBBON_RAINBOW_SWIRL] = ALCREMIE_REGULAR_SPECIES_INFO(Ribbon, RainbowSwirl, BODY_COLOR_YELLOW), #if P_GIGANTAMAX_FORMS - [SPECIES_ALCREMIE_GIGANTAMAX] = + [SPECIES_ALCREMIE_GMAX] = { ALCREMIE_MISC_INFO(BODY_COLOR_YELLOW), .speciesName = _("Alcremie"), @@ -5149,7 +5141,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = #endif //P_FAMILY_STONJOURNER #if P_FAMILY_EISCUE - [SPECIES_EISCUE_ICE_FACE] = + [SPECIES_EISCUE_ICE] = { .baseHP = 75, .baseAttack = 80, @@ -5169,7 +5161,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .abilities = { ABILITY_ICE_FACE, ABILITY_NONE, ABILITY_NONE }, .bodyColor = BODY_COLOR_BLUE, .speciesName = _("Eiscue"), - .cryId = CRY_EISCUE_ICE_FACE, + .cryId = CRY_EISCUE_ICE, .natDexNum = NATIONAL_DEX_EISCUE, .categoryName = _("Penguin"), .height = 14, @@ -5213,7 +5205,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .formChangeTable = sEiscueFormChangeTable, }, - [SPECIES_EISCUE_NOICE_FACE] = + [SPECIES_EISCUE_NOICE] = { .baseHP = 75, .baseAttack = 80, @@ -5271,7 +5263,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = #endif //P_FAMILY_EISCUE #if P_FAMILY_INDEEDEE - [SPECIES_INDEEDEE_MALE] = + [SPECIES_INDEEDEE_M] = { .baseHP = 60, .baseAttack = 65, @@ -5291,7 +5283,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .abilities = { ABILITY_INNER_FOCUS, ABILITY_SYNCHRONIZE, ABILITY_PSYCHIC_SURGE }, .bodyColor = BODY_COLOR_PURPLE, .speciesName = _("Indeedee"), - .cryId = CRY_INDEEDEE_MALE, + .cryId = CRY_INDEEDEE_M, .natDexNum = NATIONAL_DEX_INDEEDEE, .categoryName = _("Emotion"), .height = 9, @@ -5333,7 +5325,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .formSpeciesIdTable = sIndeedeeFormSpeciesIdTable, }, - [SPECIES_INDEEDEE_FEMALE] = + [SPECIES_INDEEDEE_F] = { .baseHP = 70, .baseAttack = 55, @@ -5353,7 +5345,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .abilities = { ABILITY_OWN_TEMPO, ABILITY_SYNCHRONIZE, ABILITY_PSYCHIC_SURGE }, .bodyColor = BODY_COLOR_PURPLE, .speciesName = _("Indeedee"), - .cryId = CRY_INDEEDEE_FEMALE, + .cryId = CRY_INDEEDEE_F, .natDexNum = NATIONAL_DEX_INDEEDEE, .categoryName = _("Emotion"), .height = 9, @@ -5648,7 +5640,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = }, #if P_GIGANTAMAX_FORMS - [SPECIES_COPPERAJAH_GIGANTAMAX] = + [SPECIES_COPPERAJAH_GMAX] = { .baseHP = 122, .baseAttack = 130, @@ -6024,7 +6016,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = }, #if P_GIGANTAMAX_FORMS - [SPECIES_DURALUDON_GIGANTAMAX] = + [SPECIES_DURALUDON_GMAX] = { .baseHP = 70, .baseAttack = 95, @@ -6337,7 +6329,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = #endif //P_FAMILY_DREEPY #if P_FAMILY_ZACIAN - [SPECIES_ZACIAN_HERO_OF_MANY_BATTLES] = + [SPECIES_ZACIAN_HERO] = { .baseHP = 92, .baseAttack = P_UPDATED_STATS >= GEN_9 ? 120 : 130, @@ -6357,7 +6349,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .abilities = { ABILITY_INTREPID_SWORD, ABILITY_NONE, ABILITY_NONE }, .bodyColor = BODY_COLOR_BLUE, .speciesName = _("Zacian"), - .cryId = CRY_ZACIAN_HERO_OF_MANY_BATTLES, + .cryId = CRY_ZACIAN_HERO, .natDexNum = NATIONAL_DEX_ZACIAN, .categoryName = _("Warrior"), .height = 28, @@ -6402,7 +6394,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .formChangeTable = sZacianFormChangeTable, }, - [SPECIES_ZACIAN_CROWNED_SWORD] = + [SPECIES_ZACIAN_CROWNED] = { .baseHP = 92, .baseAttack = P_UPDATED_STATS >= GEN_9 ? 150 : 170, @@ -6470,7 +6462,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = #endif //P_FAMILY_ZACIAN #if P_FAMILY_ZAMAZENTA - [SPECIES_ZAMAZENTA_HERO_OF_MANY_BATTLES] = + [SPECIES_ZAMAZENTA_HERO] = { .baseHP = 92, .baseAttack = P_UPDATED_STATS >= GEN_9 ? 120 : 130, @@ -6490,7 +6482,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .abilities = { ABILITY_DAUNTLESS_SHIELD, ABILITY_NONE, ABILITY_NONE }, .bodyColor = BODY_COLOR_RED, .speciesName = _("Zamazenta"), - .cryId = CRY_ZAMAZENTA_HERO_OF_MANY_BATTLES, + .cryId = CRY_ZAMAZENTA_HERO, .natDexNum = NATIONAL_DEX_ZAMAZENTA, .categoryName = _("Warrior"), .height = 29, @@ -6536,7 +6528,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .formChangeTable = sZamazentaFormChangeTable, }, - [SPECIES_ZAMAZENTA_CROWNED_SHIELD] = + [SPECIES_ZAMAZENTA_CROWNED] = { .baseHP = 92, .baseAttack = P_UPDATED_STATS >= GEN_9 ? 120 : 130, @@ -6790,13 +6782,13 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sKubfuLevelUpLearnset, .teachableLearnset = sKubfuTeachableLearnset, - .evolutions = EVOLUTION({EVO_DARK_SCROLL, 0, SPECIES_URSHIFU_SINGLE_STRIKE_STYLE}, - {EVO_ITEM, ITEM_SCROLL_OF_DARKNESS, SPECIES_URSHIFU_SINGLE_STRIKE_STYLE}, - {EVO_WATER_SCROLL, 0, SPECIES_URSHIFU_RAPID_STRIKE_STYLE}, - {EVO_ITEM, ITEM_SCROLL_OF_WATERS, SPECIES_URSHIFU_RAPID_STRIKE_STYLE}), + .evolutions = EVOLUTION({EVO_DARK_SCROLL, 0, SPECIES_URSHIFU_SINGLE_STRIKE}, + {EVO_ITEM, ITEM_SCROLL_OF_DARKNESS, SPECIES_URSHIFU_SINGLE_STRIKE}, + {EVO_WATER_SCROLL, 0, SPECIES_URSHIFU_RAPID_STRIKE}, + {EVO_ITEM, ITEM_SCROLL_OF_WATERS, SPECIES_URSHIFU_RAPID_STRIKE}), }, - [SPECIES_URSHIFU_SINGLE_STRIKE_STYLE] = + [SPECIES_URSHIFU_SINGLE_STRIKE] = { .baseHP = 100, .baseAttack = 130, @@ -6862,7 +6854,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = }, #if P_GIGANTAMAX_FORMS - [SPECIES_URSHIFU_SINGLE_STRIKE_STYLE_GIGANTAMAX] = + [SPECIES_URSHIFU_SINGLE_STRIKE_GMAX] = { .baseHP = 100, .baseAttack = 130, @@ -6920,7 +6912,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = }, #endif //P_GIGANTAMAX_FORMS - [SPECIES_URSHIFU_RAPID_STRIKE_STYLE] = + [SPECIES_URSHIFU_RAPID_STRIKE] = { .baseHP = 100, .baseAttack = 130, @@ -6986,7 +6978,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = }, #if P_GIGANTAMAX_FORMS - [SPECIES_URSHIFU_RAPID_STRIKE_STYLE_GIGANTAMAX] = + [SPECIES_URSHIFU_RAPID_STRIKE_GMAX] = { .baseHP = 100, .baseAttack = 130, @@ -7497,7 +7489,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = }, #if P_FUSION_FORMS - [SPECIES_CALYREX_ICE_RIDER] = + [SPECIES_CALYREX_ICE] = { .baseHP = 100, .baseAttack = 165, @@ -7563,7 +7555,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .formSpeciesIdTable = sCalyrexFormSpeciesIdTable, }, - [SPECIES_CALYREX_SHADOW_RIDER] = + [SPECIES_CALYREX_SHADOW] = { .baseHP = 100, .baseAttack = 85, diff --git a/src/data/pokemon/species_info/gen_9_families.h b/src/data/pokemon/species_info/gen_9_families.h index 922e57784b60..e0346d63a97e 100644 --- a/src/data/pokemon/species_info/gen_9_families.h +++ b/src/data/pokemon/species_info/gen_9_families.h @@ -628,11 +628,11 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .levelUpLearnset = sLechonkLevelUpLearnset, .teachableLearnset = sLechonkTeachableLearnset, .eggMoveLearnset = sLechonkEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL_MALE, 18, SPECIES_OINKOLOGNE_MALE}, - {EVO_LEVEL_FEMALE, 18, SPECIES_OINKOLOGNE_FEMALE}), + .evolutions = EVOLUTION({EVO_LEVEL_MALE, 18, SPECIES_OINKOLOGNE_M}, + {EVO_LEVEL_FEMALE, 18, SPECIES_OINKOLOGNE_F}), }, - [SPECIES_OINKOLOGNE_MALE] = + [SPECIES_OINKOLOGNE_M] = { .baseHP = 110, .baseAttack = 100, @@ -652,7 +652,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .abilities = { ABILITY_LINGERING_AROMA, ABILITY_GLUTTONY, ABILITY_THICK_FAT }, .bodyColor = BODY_COLOR_GRAY, .speciesName = _("Oinkologne"), - .cryId = CRY_OINKOLOGNE_MALE, + .cryId = CRY_OINKOLOGNE_M, .natDexNum = NATIONAL_DEX_OINKOLOGNE, .categoryName = _("Hog"), .height = 10, @@ -693,7 +693,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .formSpeciesIdTable = sOinkologneFormSpeciesIdTable, }, - [SPECIES_OINKOLOGNE_FEMALE] = + [SPECIES_OINKOLOGNE_F] = { .baseHP = 115, .baseAttack = 90, @@ -713,7 +713,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .abilities = { ABILITY_AROMA_VEIL, ABILITY_GLUTTONY, ABILITY_THICK_FAT }, .bodyColor = BODY_COLOR_GRAY, .speciesName = _("Oinkologne"), - .cryId = CRY_OINKOLOGNE_FEMALE, + .cryId = CRY_OINKOLOGNE_F, .natDexNum = NATIONAL_DEX_OINKOLOGNE, .categoryName = _("Hog"), .height = 10, @@ -1257,11 +1257,11 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .levelUpLearnset = sTandemausLevelUpLearnset, .teachableLearnset = sTandemausTeachableLearnset, .eggMoveLearnset = sTandemausEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL_FAMILY_OF_FOUR, 25, SPECIES_MAUSHOLD_FAMILY_OF_FOUR}, - {EVO_LEVEL_FAMILY_OF_THREE, 25, SPECIES_MAUSHOLD_FAMILY_OF_THREE}), + .evolutions = EVOLUTION({EVO_LEVEL_FAMILY_OF_FOUR, 25, SPECIES_MAUSHOLD_FOUR}, + {EVO_LEVEL_FAMILY_OF_THREE, 25, SPECIES_MAUSHOLD_THREE}), }, - [SPECIES_MAUSHOLD_FAMILY_OF_THREE] = + [SPECIES_MAUSHOLD_THREE] = { .baseHP = 74, .baseAttack = 75, @@ -1322,7 +1322,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .teachableLearnset = sMausholdTeachableLearnset, .formSpeciesIdTable = sMausholdFormSpeciesIdTable, }, - [SPECIES_MAUSHOLD_FAMILY_OF_FOUR] = + [SPECIES_MAUSHOLD_FOUR] = { .baseHP = 74, .baseAttack = 75, @@ -1700,7 +1700,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = #endif //P_FAMILY_SMOLIV #if P_FAMILY_SQUAWKABILLY - [SPECIES_SQUAWKABILLY_GREEN_PLUMAGE] = + [SPECIES_SQUAWKABILLY_GREEN] = { .baseHP = 82, .baseAttack = 96, @@ -1763,7 +1763,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .formSpeciesIdTable = sSquawkabillyFormSpeciesIdTable, }, - [SPECIES_SQUAWKABILLY_BLUE_PLUMAGE] = + [SPECIES_SQUAWKABILLY_BLUE] = { .baseHP = 82, .baseAttack = 96, @@ -1826,7 +1826,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .formSpeciesIdTable = sSquawkabillyFormSpeciesIdTable, }, - [SPECIES_SQUAWKABILLY_YELLOW_PLUMAGE] = + [SPECIES_SQUAWKABILLY_YELLOW] = { .baseHP = 82, .baseAttack = 96, @@ -1889,7 +1889,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .formSpeciesIdTable = sSquawkabillyFormSpeciesIdTable, }, - [SPECIES_SQUAWKABILLY_WHITE_PLUMAGE] = + [SPECIES_SQUAWKABILLY_WHITE] = { .baseHP = 82, .baseAttack = 96, @@ -3267,12 +3267,12 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .iconPalIndex = 1, SHADOW(6, 11, SHADOW_SIZE_M) FOOTPRINT(Scovillain) - OVERWORLD( + OVERWORLD_SET_ANIM( sPicTable_Scovillain, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, - //sAnimTable_Following_Asym, + sAnimTable_Following_Asym, gOverworldPalette_Scovillain, gShinyOverworldPalette_Scovillain ) @@ -3583,12 +3583,12 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .iconPalIndex = 1, SHADOW(-3, 1, SHADOW_SIZE_S) FOOTPRINT(Tinkatink) - OVERWORLD( + OVERWORLD_SET_ANIM( sPicTable_Tinkatink, SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, - //sAnimTable_Following_Asym, + sAnimTable_Following_Asym, gOverworldPalette_Tinkatink, gShinyOverworldPalette_Tinkatink ) @@ -3647,12 +3647,12 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .iconPalIndex = 1, SHADOW(-4, 5, SHADOW_SIZE_L) FOOTPRINT(Tinkatuff) - OVERWORLD( + OVERWORLD_SET_ANIM( sPicTable_Tinkatuff, SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, - //sAnimTable_Following_Asym, + sAnimTable_Following_Asym, gOverworldPalette_Tinkatuff, gShinyOverworldPalette_Tinkatuff ) @@ -3710,12 +3710,12 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .iconPalIndex = 1, SHADOW(-5, 15, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Tinkaton) - OVERWORLD( + OVERWORLD_SET_ANIM( sPicTable_Tinkaton, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, - //sAnimTable_Following_Asym, + sAnimTable_Following_Asym, gOverworldPalette_Tinkaton, gShinyOverworldPalette_Tinkaton ) @@ -7361,7 +7361,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = TRACKS_FOOT, gOverworldPalette_Fezandipiti, gShinyOverworldPalette_Fezandipiti - ) + ) .isLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sFezandipitiLevelUpLearnset, @@ -7433,15 +7433,15 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, \ } - [SPECIES_OGERPON_TEAL_MASK] = OGERPON_SPECIES_INFO(Teal, Mask, TYPE_GRASS, ABILITY_DEFIANT, BODY_COLOR_GREEN, 1, FALSE), - [SPECIES_OGERPON_WELLSPRING_MASK] = OGERPON_SPECIES_INFO(Wellspring, Mask, TYPE_WATER, ABILITY_WATER_ABSORB, BODY_COLOR_BLUE, 0, FALSE), - [SPECIES_OGERPON_HEARTHFLAME_MASK] = OGERPON_SPECIES_INFO(Hearthflame, Mask, TYPE_FIRE, ABILITY_MOLD_BREAKER, BODY_COLOR_RED, 0, FALSE), - [SPECIES_OGERPON_CORNERSTONE_MASK] = OGERPON_SPECIES_INFO(Cornerstone, Mask, TYPE_ROCK, ABILITY_STURDY, BODY_COLOR_GRAY, 0, FALSE), + [SPECIES_OGERPON_TEAL] = OGERPON_SPECIES_INFO(Teal, Mask, TYPE_GRASS, ABILITY_DEFIANT, BODY_COLOR_GREEN, 1, FALSE), + [SPECIES_OGERPON_WELLSPRING] = OGERPON_SPECIES_INFO(Wellspring, Mask, TYPE_WATER, ABILITY_WATER_ABSORB, BODY_COLOR_BLUE, 0, FALSE), + [SPECIES_OGERPON_HEARTHFLAME] = OGERPON_SPECIES_INFO(Hearthflame, Mask, TYPE_FIRE, ABILITY_MOLD_BREAKER, BODY_COLOR_RED, 0, FALSE), + [SPECIES_OGERPON_CORNERSTONE] = OGERPON_SPECIES_INFO(Cornerstone, Mask, TYPE_ROCK, ABILITY_STURDY, BODY_COLOR_GRAY, 0, FALSE), #if P_TERA_FORMS - [SPECIES_OGERPON_TEAL_MASK_TERA] = OGERPON_SPECIES_INFO(Teal, MaskTera, TYPE_GRASS, ABILITY_EMBODY_ASPECT_TEAL_MASK, BODY_COLOR_GREEN, 1, TRUE), - [SPECIES_OGERPON_WELLSPRING_MASK_TERA] = OGERPON_SPECIES_INFO(Wellspring, MaskTera, TYPE_WATER, ABILITY_EMBODY_ASPECT_WELLSPRING_MASK, BODY_COLOR_BLUE, 0, TRUE), - [SPECIES_OGERPON_HEARTHFLAME_MASK_TERA] = OGERPON_SPECIES_INFO(Hearthflame, MaskTera, TYPE_FIRE, ABILITY_EMBODY_ASPECT_HEARTHFLAME_MASK, BODY_COLOR_RED, 0, TRUE), - [SPECIES_OGERPON_CORNERSTONE_MASK_TERA] = OGERPON_SPECIES_INFO(Cornerstone, MaskTera, TYPE_ROCK, ABILITY_EMBODY_ASPECT_CORNERSTONE_MASK, BODY_COLOR_GRAY, 0, TRUE), + [SPECIES_OGERPON_TEAL_TERA] = OGERPON_SPECIES_INFO(Teal, MaskTera, TYPE_GRASS, ABILITY_EMBODY_ASPECT_TEAL_MASK, BODY_COLOR_GREEN, 1, TRUE), + [SPECIES_OGERPON_WELLSPRING_TERA] = OGERPON_SPECIES_INFO(Wellspring, MaskTera, TYPE_WATER, ABILITY_EMBODY_ASPECT_WELLSPRING_MASK, BODY_COLOR_BLUE, 0, TRUE), + [SPECIES_OGERPON_HEARTHFLAME_TERA] = OGERPON_SPECIES_INFO(Hearthflame, MaskTera, TYPE_FIRE, ABILITY_EMBODY_ASPECT_HEARTHFLAME_MASK, BODY_COLOR_RED, 0, TRUE), + [SPECIES_OGERPON_CORNERSTONE_TERA] = OGERPON_SPECIES_INFO(Cornerstone, MaskTera, TYPE_ROCK, ABILITY_EMBODY_ASPECT_CORNERSTONE_MASK, BODY_COLOR_GRAY, 0, TRUE), #endif //P_TERA_FORMS #endif //P_FAMILY_OGERPON diff --git a/src/daycare.c b/src/daycare.c index e13f993c3f10..780e69e44d90 100644 --- a/src/daycare.c +++ b/src/daycare.c @@ -3,7 +3,7 @@ #include "battle.h" #include "daycare.h" #include "string_util.h" -#include "level_caps.h" +#include "caps.h" #include "mail.h" #include "pokemon_storage_system.h" #include "event_data.h" @@ -996,6 +996,8 @@ static void GiveMoveIfItem(struct Pokemon *mon, struct DayCare *daycare) } } +STATIC_ASSERT(P_SCATTERBUG_LINE_FORM_BREED == SPECIES_SCATTERBUG_ICY_SNOW || (P_SCATTERBUG_LINE_FORM_BREED >= SPECIES_SCATTERBUG_POLAR && P_SCATTERBUG_LINE_FORM_BREED <= SPECIES_SCATTERBUG_POKEBALL), ScatterbugLineFormBreedMustBeAValidScatterbugForm); + static u16 DetermineEggSpeciesAndParentSlots(struct DayCare *daycare, u8 *parentSlots) { u16 i; @@ -1030,6 +1032,8 @@ static u16 DetermineEggSpeciesAndParentSlots(struct DayCare *daycare, u8 *parent eggSpecies = SPECIES_PHIONE; else if (GET_BASE_SPECIES_ID(eggSpecies) == SPECIES_ROTOM) eggSpecies = SPECIES_ROTOM; + else if (GET_BASE_SPECIES_ID(eggSpecies) == SPECIES_SCATTERBUG) + eggSpecies = P_SCATTERBUG_LINE_FORM_BREED; else if (GET_BASE_SPECIES_ID(eggSpecies) == SPECIES_FURFROU) eggSpecies = SPECIES_FURFROU; else if (eggSpecies == SPECIES_SINISTEA_ANTIQUE) diff --git a/src/ev_caps.c b/src/ev_caps.c deleted file mode 100644 index 8eb3531ca420..000000000000 --- a/src/ev_caps.c +++ /dev/null @@ -1,41 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "event_data.h" -#include "ev_caps.h" -#include "pokemon.h" - -u32 GetCurrentEVCap(void) -{ - - static const u16 sEvCapFlagMap[][2] = { - // Define EV caps for each milestone - {FLAG_BADGE01_GET, 30}, - {FLAG_BADGE02_GET, 90}, - {FLAG_BADGE03_GET, 150}, - {FLAG_BADGE04_GET, 210}, - {FLAG_BADGE05_GET, 270}, - {FLAG_BADGE06_GET, 330}, - {FLAG_BADGE07_GET, 390}, - {FLAG_BADGE08_GET, 450}, - {FLAG_IS_CHAMPION, MAX_TOTAL_EVS}, - }; - - if (B_EV_CAP_TYPE == EV_CAP_FLAG_LIST) - { - for (u32 evCap = 0; evCap < ARRAY_COUNT(sEvCapFlagMap); evCap++) - { - if (!FlagGet(sEvCapFlagMap[evCap][0])) - return sEvCapFlagMap[evCap][1]; - } - } - else if (B_EV_CAP_TYPE == EV_CAP_VARIABLE) - { - return VarGet(B_EV_CAP_VARIABLE); - } - else if (B_EV_CAP_TYPE == EV_CAP_NO_GAIN) - { - return 0; - } - - return MAX_TOTAL_EVS; -} diff --git a/src/event_object_movement.c b/src/event_object_movement.c index d82504a32f37..c2c9fdc42f7c 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -49,6 +49,7 @@ #include "constants/region_map_sections.h" #include "constants/songs.h" #include "constants/species.h" +#include "constants/metatile_behaviors.h" #include "constants/trainer_types.h" #include "constants/union_room.h" #include "constants/weather.h" @@ -111,6 +112,7 @@ static EWRAM_DATA struct LockedAnimObjectEvents *sLockedAnimObjectEvents = {0}; static void MoveCoordsInDirection(u32, s16 *, s16 *, s16, s16); static bool8 ObjectEventExecSingleMovementAction(struct ObjectEvent *, struct Sprite *); +static bool32 UpdateMonMoveInPlace(struct ObjectEvent *, struct Sprite *); static void SetMovementDelay(struct Sprite *, s16); static bool8 WaitForMovementDelay(struct Sprite *); static u8 GetCollisionInDirection(struct ObjectEvent *, u8); @@ -157,7 +159,6 @@ static void ApplyLevitateMovement(u8); static bool8 MovementType_Disguise_Callback(struct ObjectEvent *, struct Sprite *); static bool8 MovementType_Buried_Callback(struct ObjectEvent *, struct Sprite *); static void CreateReflectionEffectSprites(void); -static u8 GetObjectEventIdByLocalId(u8); static u8 GetObjectEventIdByLocalIdAndMapInternal(u8, u8, u8); static bool8 GetAvailableObjectEventId(u16, u8, u8, u8 *); static void SetObjectEventDynamicGraphicsId(struct ObjectEvent *); @@ -207,6 +208,8 @@ static void CopyObjectGraphicsInfoToSpriteTemplate_WithMovementType(u16 graphics static const struct SpriteFrameImage sPicTable_PechaBerryTree[]; +static void StartSlowRunningAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction); + const u8 gReflectionEffectPaletteMap[16] = { [PALSLOT_PLAYER] = PALSLOT_PLAYER_REFLECTION, [PALSLOT_PLAYER_REFLECTION] = PALSLOT_PLAYER_REFLECTION, @@ -744,10 +747,10 @@ static const u8 sFaceDirectionAnimNums[] = { [DIR_NORTH] = ANIM_STD_FACE_NORTH, [DIR_WEST] = ANIM_STD_FACE_WEST, [DIR_EAST] = ANIM_STD_FACE_EAST, - [DIR_SOUTHWEST] = ANIM_STD_FACE_SOUTH, - [DIR_SOUTHEAST] = ANIM_STD_FACE_SOUTH, - [DIR_NORTHWEST] = ANIM_STD_FACE_NORTH, - [DIR_NORTHEAST] = ANIM_STD_FACE_NORTH, + [DIR_SOUTHWEST] = ANIM_STD_FACE_WEST, + [DIR_SOUTHEAST] = ANIM_STD_FACE_EAST, + [DIR_NORTHWEST] = ANIM_STD_FACE_WEST, + [DIR_NORTHEAST] = ANIM_STD_FACE_EAST, }; static const u8 sMoveDirectionAnimNums[] = { [DIR_NONE] = ANIM_STD_GO_SOUTH, @@ -755,10 +758,10 @@ static const u8 sMoveDirectionAnimNums[] = { [DIR_NORTH] = ANIM_STD_GO_NORTH, [DIR_WEST] = ANIM_STD_GO_WEST, [DIR_EAST] = ANIM_STD_GO_EAST, - [DIR_SOUTHWEST] = ANIM_STD_GO_SOUTH, - [DIR_SOUTHEAST] = ANIM_STD_GO_SOUTH, - [DIR_NORTHWEST] = ANIM_STD_GO_NORTH, - [DIR_NORTHEAST] = ANIM_STD_GO_NORTH, + [DIR_SOUTHWEST] = ANIM_STD_GO_WEST, + [DIR_SOUTHEAST] = ANIM_STD_GO_EAST, + [DIR_NORTHWEST] = ANIM_STD_GO_WEST, + [DIR_NORTHEAST] = ANIM_STD_GO_EAST, }; static const u8 sMoveDirectionFastAnimNums[] = { [DIR_NONE] = ANIM_STD_GO_FAST_SOUTH, @@ -766,10 +769,10 @@ static const u8 sMoveDirectionFastAnimNums[] = { [DIR_NORTH] = ANIM_STD_GO_FAST_NORTH, [DIR_WEST] = ANIM_STD_GO_FAST_WEST, [DIR_EAST] = ANIM_STD_GO_FAST_EAST, - [DIR_SOUTHWEST] = ANIM_STD_GO_FAST_SOUTH, - [DIR_SOUTHEAST] = ANIM_STD_GO_FAST_SOUTH, - [DIR_NORTHWEST] = ANIM_STD_GO_FAST_NORTH, - [DIR_NORTHEAST] = ANIM_STD_GO_FAST_NORTH, + [DIR_SOUTHWEST] = ANIM_STD_GO_FAST_WEST, + [DIR_SOUTHEAST] = ANIM_STD_GO_FAST_EAST, + [DIR_NORTHWEST] = ANIM_STD_GO_FAST_WEST, + [DIR_NORTHEAST] = ANIM_STD_GO_FAST_EAST, }; static const u8 sMoveDirectionFasterAnimNums[] = { [DIR_NONE] = ANIM_STD_GO_FASTER_SOUTH, @@ -777,10 +780,10 @@ static const u8 sMoveDirectionFasterAnimNums[] = { [DIR_NORTH] = ANIM_STD_GO_FASTER_NORTH, [DIR_WEST] = ANIM_STD_GO_FASTER_WEST, [DIR_EAST] = ANIM_STD_GO_FASTER_EAST, - [DIR_SOUTHWEST] = ANIM_STD_GO_FASTER_SOUTH, - [DIR_SOUTHEAST] = ANIM_STD_GO_FASTER_SOUTH, - [DIR_NORTHWEST] = ANIM_STD_GO_FASTER_NORTH, - [DIR_NORTHEAST] = ANIM_STD_GO_FASTER_NORTH, + [DIR_SOUTHWEST] = ANIM_STD_GO_FASTER_WEST, + [DIR_SOUTHEAST] = ANIM_STD_GO_FASTER_EAST, + [DIR_NORTHWEST] = ANIM_STD_GO_FASTER_WEST, + [DIR_NORTHEAST] = ANIM_STD_GO_FASTER_EAST, }; static const u8 sMoveDirectionFastestAnimNums[] = { [DIR_NONE] = ANIM_STD_GO_FASTEST_SOUTH, @@ -788,10 +791,10 @@ static const u8 sMoveDirectionFastestAnimNums[] = { [DIR_NORTH] = ANIM_STD_GO_FASTEST_NORTH, [DIR_WEST] = ANIM_STD_GO_FASTEST_WEST, [DIR_EAST] = ANIM_STD_GO_FASTEST_EAST, - [DIR_SOUTHWEST] = ANIM_STD_GO_FASTEST_SOUTH, - [DIR_SOUTHEAST] = ANIM_STD_GO_FASTEST_SOUTH, - [DIR_NORTHWEST] = ANIM_STD_GO_FASTEST_NORTH, - [DIR_NORTHEAST] = ANIM_STD_GO_FASTEST_NORTH, + [DIR_SOUTHWEST] = ANIM_STD_GO_FASTEST_WEST, + [DIR_SOUTHEAST] = ANIM_STD_GO_FASTEST_EAST, + [DIR_NORTHWEST] = ANIM_STD_GO_FASTEST_WEST, + [DIR_NORTHEAST] = ANIM_STD_GO_FASTEST_EAST, }; static const u8 sJumpSpecialDirectionAnimNums[] = { // used for jumping onto surf mon [DIR_NONE] = ANIM_GET_ON_OFF_POKEMON_SOUTH, @@ -810,10 +813,10 @@ static const u8 sAcroWheelieDirectionAnimNums[] = { [DIR_NORTH] = ANIM_BUNNY_HOP_BACK_WHEEL_NORTH, [DIR_WEST] = ANIM_BUNNY_HOP_BACK_WHEEL_WEST, [DIR_EAST] = ANIM_BUNNY_HOP_BACK_WHEEL_EAST, - [DIR_SOUTHWEST] = ANIM_BUNNY_HOP_BACK_WHEEL_SOUTH, - [DIR_SOUTHEAST] = ANIM_BUNNY_HOP_BACK_WHEEL_SOUTH, - [DIR_NORTHWEST] = ANIM_BUNNY_HOP_BACK_WHEEL_NORTH, - [DIR_NORTHEAST] = ANIM_BUNNY_HOP_BACK_WHEEL_NORTH, + [DIR_SOUTHWEST] = ANIM_BUNNY_HOP_BACK_WHEEL_WEST, + [DIR_SOUTHEAST] = ANIM_BUNNY_HOP_BACK_WHEEL_EAST, + [DIR_NORTHWEST] = ANIM_BUNNY_HOP_BACK_WHEEL_WEST, + [DIR_NORTHEAST] = ANIM_BUNNY_HOP_BACK_WHEEL_EAST, }; static const u8 sAcroUnusedDirectionAnimNums[] = { [DIR_NONE] = ANIM_BUNNY_HOP_FRONT_WHEEL_SOUTH, @@ -832,10 +835,10 @@ static const u8 sAcroEndWheelieDirectionAnimNums[] = { [DIR_NORTH] = ANIM_STANDING_WHEELIE_BACK_WHEEL_NORTH, [DIR_WEST] = ANIM_STANDING_WHEELIE_BACK_WHEEL_WEST, [DIR_EAST] = ANIM_STANDING_WHEELIE_BACK_WHEEL_EAST, - [DIR_SOUTHWEST] = ANIM_STANDING_WHEELIE_BACK_WHEEL_SOUTH, - [DIR_SOUTHEAST] = ANIM_STANDING_WHEELIE_BACK_WHEEL_SOUTH, - [DIR_NORTHWEST] = ANIM_STANDING_WHEELIE_BACK_WHEEL_NORTH, - [DIR_NORTHEAST] = ANIM_STANDING_WHEELIE_BACK_WHEEL_NORTH, + [DIR_SOUTHWEST] = ANIM_STANDING_WHEELIE_BACK_WHEEL_WEST, + [DIR_SOUTHEAST] = ANIM_STANDING_WHEELIE_BACK_WHEEL_EAST, + [DIR_NORTHWEST] = ANIM_STANDING_WHEELIE_BACK_WHEEL_WEST, + [DIR_NORTHEAST] = ANIM_STANDING_WHEELIE_BACK_WHEEL_EAST, }; static const u8 sAcroUnusedActionDirectionAnimNums[] = { [DIR_NONE] = ANIM_STANDING_WHEELIE_FRONT_WHEEL_SOUTH, @@ -854,10 +857,10 @@ static const u8 sAcroWheeliePedalDirectionAnimNums[] = { [DIR_NORTH] = ANIM_MOVING_WHEELIE_NORTH, [DIR_WEST] = ANIM_MOVING_WHEELIE_WEST, [DIR_EAST] = ANIM_MOVING_WHEELIE_EAST, - [DIR_SOUTHWEST] = ANIM_MOVING_WHEELIE_SOUTH, - [DIR_SOUTHEAST] = ANIM_MOVING_WHEELIE_SOUTH, - [DIR_NORTHWEST] = ANIM_MOVING_WHEELIE_NORTH, - [DIR_NORTHEAST] = ANIM_MOVING_WHEELIE_NORTH, + [DIR_SOUTHWEST] = ANIM_MOVING_WHEELIE_WEST, + [DIR_SOUTHEAST] = ANIM_MOVING_WHEELIE_EAST, + [DIR_NORTHWEST] = ANIM_MOVING_WHEELIE_WEST, + [DIR_NORTHEAST] = ANIM_MOVING_WHEELIE_EAST, }; static const u8 sFishingDirectionAnimNums[] = { [DIR_NONE] = ANIM_TAKE_OUT_ROD_SOUTH, @@ -898,10 +901,10 @@ static const u8 sRunningDirectionAnimNums[] = { [DIR_NORTH] = ANIM_RUN_NORTH, [DIR_WEST] = ANIM_RUN_WEST, [DIR_EAST] = ANIM_RUN_EAST, - [DIR_SOUTHWEST] = ANIM_RUN_SOUTH, - [DIR_SOUTHEAST] = ANIM_RUN_SOUTH, - [DIR_NORTHWEST] = ANIM_RUN_NORTH, - [DIR_NORTHEAST] = ANIM_RUN_NORTH, + [DIR_SOUTHWEST] = ANIM_RUN_WEST, + [DIR_SOUTHEAST] = ANIM_RUN_EAST, + [DIR_NORTHWEST] = ANIM_RUN_WEST, + [DIR_NORTHEAST] = ANIM_RUN_EAST, }; const u8 gTrainerFacingDirectionMovementTypes[] = { @@ -939,64 +942,72 @@ static const struct Coords16 sDirectionToVectors[] = { {-1, 1}, { 1, 1}, {-1, -1}, - { 1, -1} + { 1, -1}, + {-2, 1}, + { 2, 1}, + {-2, -1}, + { 2, -1} }; const u8 gFaceDirectionMovementActions[] = { - MOVEMENT_ACTION_FACE_DOWN, - MOVEMENT_ACTION_FACE_DOWN, - MOVEMENT_ACTION_FACE_UP, - MOVEMENT_ACTION_FACE_LEFT, - MOVEMENT_ACTION_FACE_RIGHT, + [DIR_NONE] = MOVEMENT_ACTION_FACE_DOWN, + [DIR_SOUTH] = MOVEMENT_ACTION_FACE_DOWN, + [DIR_NORTH] = MOVEMENT_ACTION_FACE_UP, + [DIR_WEST] = MOVEMENT_ACTION_FACE_LEFT, + [DIR_EAST] = MOVEMENT_ACTION_FACE_RIGHT, + [DIR_SOUTHWEST] = MOVEMENT_ACTION_FACE_LEFT, + [DIR_SOUTHEAST] = MOVEMENT_ACTION_FACE_RIGHT, + [DIR_NORTHWEST] = MOVEMENT_ACTION_FACE_LEFT, + [DIR_NORTHEAST] = MOVEMENT_ACTION_FACE_RIGHT }; const u8 gWalkSlowMovementActions[] = { - MOVEMENT_ACTION_WALK_SLOW_DOWN, - MOVEMENT_ACTION_WALK_SLOW_DOWN, - MOVEMENT_ACTION_WALK_SLOW_UP, - MOVEMENT_ACTION_WALK_SLOW_LEFT, - MOVEMENT_ACTION_WALK_SLOW_RIGHT, + [DIR_NONE] = MOVEMENT_ACTION_WALK_SLOW_DOWN, + [DIR_SOUTH] = MOVEMENT_ACTION_WALK_SLOW_DOWN, + [DIR_NORTH] = MOVEMENT_ACTION_WALK_SLOW_UP, + [DIR_WEST] = MOVEMENT_ACTION_WALK_SLOW_LEFT, + [DIR_EAST] = MOVEMENT_ACTION_WALK_SLOW_RIGHT, }; const u8 gWalkNormalMovementActions[] = { - MOVEMENT_ACTION_WALK_NORMAL_DOWN, - MOVEMENT_ACTION_WALK_NORMAL_DOWN, - MOVEMENT_ACTION_WALK_NORMAL_UP, - MOVEMENT_ACTION_WALK_NORMAL_LEFT, - MOVEMENT_ACTION_WALK_NORMAL_RIGHT, + [DIR_NONE] = MOVEMENT_ACTION_WALK_NORMAL_DOWN, + [DIR_SOUTH] = MOVEMENT_ACTION_WALK_NORMAL_DOWN, + [DIR_NORTH] = MOVEMENT_ACTION_WALK_NORMAL_UP, + [DIR_WEST] = MOVEMENT_ACTION_WALK_NORMAL_LEFT, + [DIR_EAST] = MOVEMENT_ACTION_WALK_NORMAL_RIGHT, }; const u8 gWalkFastMovementActions[] = { - MOVEMENT_ACTION_WALK_FAST_DOWN, - MOVEMENT_ACTION_WALK_FAST_DOWN, - MOVEMENT_ACTION_WALK_FAST_UP, - MOVEMENT_ACTION_WALK_FAST_LEFT, - MOVEMENT_ACTION_WALK_FAST_RIGHT, + [DIR_NONE] = MOVEMENT_ACTION_WALK_FAST_DOWN, + [DIR_SOUTH] = MOVEMENT_ACTION_WALK_FAST_DOWN, + [DIR_NORTH] = MOVEMENT_ACTION_WALK_FAST_UP, + [DIR_WEST] = MOVEMENT_ACTION_WALK_FAST_LEFT, + [DIR_EAST] = MOVEMENT_ACTION_WALK_FAST_RIGHT, }; const u8 gRideWaterCurrentMovementActions[] = { - MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN, - MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN, - MOVEMENT_ACTION_RIDE_WATER_CURRENT_UP, - MOVEMENT_ACTION_RIDE_WATER_CURRENT_LEFT, - MOVEMENT_ACTION_RIDE_WATER_CURRENT_RIGHT, + [DIR_NONE] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN, + [DIR_SOUTH] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN, + [DIR_NORTH] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_UP, + [DIR_WEST] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_LEFT, + [DIR_EAST] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_RIGHT, }; const u8 gWalkFasterMovementActions[] = { - MOVEMENT_ACTION_WALK_FASTER_DOWN, - MOVEMENT_ACTION_WALK_FASTER_DOWN, - MOVEMENT_ACTION_WALK_FASTER_UP, - MOVEMENT_ACTION_WALK_FASTER_LEFT, - MOVEMENT_ACTION_WALK_FASTER_RIGHT, + [DIR_NONE] = MOVEMENT_ACTION_WALK_FASTER_DOWN, + [DIR_SOUTH] = MOVEMENT_ACTION_WALK_FASTER_DOWN, + [DIR_NORTH] = MOVEMENT_ACTION_WALK_FASTER_UP, + [DIR_WEST] = MOVEMENT_ACTION_WALK_FASTER_LEFT, + [DIR_EAST] = MOVEMENT_ACTION_WALK_FASTER_RIGHT, }; const u8 gSlideMovementActions[] = { - MOVEMENT_ACTION_SLIDE_DOWN, - MOVEMENT_ACTION_SLIDE_DOWN, - MOVEMENT_ACTION_SLIDE_UP, - MOVEMENT_ACTION_SLIDE_LEFT, - MOVEMENT_ACTION_SLIDE_RIGHT, + [DIR_NONE] = MOVEMENT_ACTION_SLIDE_DOWN, + [DIR_SOUTH] = MOVEMENT_ACTION_SLIDE_DOWN, + [DIR_NORTH] = MOVEMENT_ACTION_SLIDE_UP, + [DIR_WEST] = MOVEMENT_ACTION_SLIDE_LEFT, + [DIR_EAST] = MOVEMENT_ACTION_SLIDE_RIGHT, }; const u8 gPlayerRunMovementActions[] = { - MOVEMENT_ACTION_PLAYER_RUN_DOWN, - MOVEMENT_ACTION_PLAYER_RUN_DOWN, - MOVEMENT_ACTION_PLAYER_RUN_UP, - MOVEMENT_ACTION_PLAYER_RUN_LEFT, - MOVEMENT_ACTION_PLAYER_RUN_RIGHT, + [DIR_NONE] = MOVEMENT_ACTION_PLAYER_RUN_DOWN, + [DIR_SOUTH] = MOVEMENT_ACTION_PLAYER_RUN_DOWN, + [DIR_NORTH] = MOVEMENT_ACTION_PLAYER_RUN_UP, + [DIR_WEST] = MOVEMENT_ACTION_PLAYER_RUN_LEFT, + [DIR_EAST] = MOVEMENT_ACTION_PLAYER_RUN_RIGHT, }; const u8 gJump2MovementActions[] = { MOVEMENT_ACTION_JUMP_2_DOWN, @@ -1034,102 +1045,170 @@ const u8 gJumpSpecialMovementActions[] = { MOVEMENT_ACTION_JUMP_SPECIAL_RIGHT, }; const u8 gWalkInPlaceSlowMovementActions[] = { - MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN, - MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN, - MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_UP, - MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_LEFT, - MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_RIGHT, + [DIR_NONE] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN, + [DIR_SOUTH] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN, + [DIR_NORTH] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_UP, + [DIR_WEST] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_LEFT, + [DIR_EAST] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_RIGHT, + [DIR_SOUTHWEST] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_LEFT, + [DIR_NORTHWEST] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_LEFT, + [DIR_NORTHEAST] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_RIGHT, + [DIR_SOUTHEAST] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_RIGHT }; const u8 gWalkInPlaceNormalMovementActions[] = { - MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_DOWN, - MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_DOWN, - MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_UP, - MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_LEFT, - MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_RIGHT, + [DIR_NONE] = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_DOWN, + [DIR_SOUTH] = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_DOWN, + [DIR_NORTH] = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_UP, + [DIR_WEST] = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_LEFT, + [DIR_EAST] = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_RIGHT, + [DIR_SOUTHWEST] = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_LEFT, + [DIR_NORTHWEST] = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_LEFT, + [DIR_NORTHEAST] = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_RIGHT, + [DIR_SOUTHEAST] = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_RIGHT }; const u8 gWalkInPlaceFastMovementActions[] = { - MOVEMENT_ACTION_WALK_IN_PLACE_FAST_DOWN, - MOVEMENT_ACTION_WALK_IN_PLACE_FAST_DOWN, - MOVEMENT_ACTION_WALK_IN_PLACE_FAST_UP, - MOVEMENT_ACTION_WALK_IN_PLACE_FAST_LEFT, - MOVEMENT_ACTION_WALK_IN_PLACE_FAST_RIGHT, + [DIR_NONE] = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_DOWN, + [DIR_SOUTH] = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_DOWN, + [DIR_NORTH] = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_UP, + [DIR_WEST] = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_LEFT, + [DIR_EAST] = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_RIGHT, + [DIR_SOUTHWEST] = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_LEFT, + [DIR_NORTHWEST] = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_LEFT, + [DIR_NORTHEAST] = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_RIGHT, + [DIR_SOUTHEAST] = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_RIGHT }; const u8 gWalkInPlaceFasterMovementActions[] = { - MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_DOWN, - MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_DOWN, - MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_UP, - MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_LEFT, - MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_RIGHT, + [DIR_NONE] = MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_DOWN, + [DIR_SOUTH] = MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_DOWN, + [DIR_NORTH] = MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_UP, + [DIR_WEST] = MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_LEFT, + [DIR_EAST] = MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_RIGHT, + [DIR_SOUTHWEST] = MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_LEFT, + [DIR_NORTHWEST] = MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_LEFT, + [DIR_NORTHEAST] = MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_RIGHT, + [DIR_SOUTHEAST] = MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_RIGHT }; const u8 gAcroWheelieFaceDirectionMovementActions[] = { - MOVEMENT_ACTION_ACRO_WHEELIE_FACE_DOWN, - MOVEMENT_ACTION_ACRO_WHEELIE_FACE_DOWN, - MOVEMENT_ACTION_ACRO_WHEELIE_FACE_UP, - MOVEMENT_ACTION_ACRO_WHEELIE_FACE_LEFT, - MOVEMENT_ACTION_ACRO_WHEELIE_FACE_RIGHT, + [DIR_NONE] = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_DOWN, + [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_DOWN, + [DIR_NORTH] = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_UP, + [DIR_WEST] = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_LEFT, + [DIR_EAST] = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_RIGHT, + [DIR_SOUTHWEST] = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_LEFT, + [DIR_NORTHWEST] = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_LEFT, + [DIR_NORTHEAST] = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_RIGHT, + [DIR_SOUTHEAST] = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_RIGHT }; const u8 gAcroPopWheelieFaceDirectionMovementActions[] = { - MOVEMENT_ACTION_ACRO_POP_WHEELIE_DOWN, - MOVEMENT_ACTION_ACRO_POP_WHEELIE_DOWN, - MOVEMENT_ACTION_ACRO_POP_WHEELIE_UP, - MOVEMENT_ACTION_ACRO_POP_WHEELIE_LEFT, - MOVEMENT_ACTION_ACRO_POP_WHEELIE_RIGHT, + [DIR_NONE] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_DOWN, + [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_DOWN, + [DIR_NORTH] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_UP, + [DIR_WEST] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_LEFT, + [DIR_EAST] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_RIGHT, + [DIR_SOUTHWEST] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_LEFT, + [DIR_NORTHWEST] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_LEFT, + [DIR_SOUTHEAST] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_RIGHT, + [DIR_NORTHEAST] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_RIGHT, }; const u8 gAcroEndWheelieFaceDirectionMovementActions[] = { - MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_DOWN, - MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_DOWN, - MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_UP, - MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_LEFT, - MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_RIGHT, + [DIR_NONE] = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_DOWN, + [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_DOWN, + [DIR_NORTH] = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_UP, + [DIR_WEST] = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_LEFT, + [DIR_EAST] = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_RIGHT, + [DIR_SOUTHWEST] = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_LEFT, + [DIR_NORTHWEST] = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_LEFT, + [DIR_SOUTHEAST] = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_RIGHT, + [DIR_NORTHEAST] = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_RIGHT, }; const u8 gAcroWheelieHopFaceDirectionMovementActions[] = { - MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_DOWN, - MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_DOWN, - MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_UP, - MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_LEFT, - MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_RIGHT, + [DIR_NONE] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_DOWN, + [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_DOWN, + [DIR_NORTH] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_UP, + [DIR_WEST] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_LEFT, + [DIR_EAST] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_RIGHT, + [DIR_SOUTHWEST] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_LEFT, + [DIR_NORTHWEST] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_LEFT, + [DIR_SOUTHEAST] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_RIGHT, + [DIR_NORTHEAST] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_RIGHT, }; const u8 gAcroWheelieHopDirectionMovementActions[] = { - MOVEMENT_ACTION_ACRO_WHEELIE_HOP_DOWN, - MOVEMENT_ACTION_ACRO_WHEELIE_HOP_DOWN, - MOVEMENT_ACTION_ACRO_WHEELIE_HOP_UP, - MOVEMENT_ACTION_ACRO_WHEELIE_HOP_LEFT, - MOVEMENT_ACTION_ACRO_WHEELIE_HOP_RIGHT, + [DIR_NONE] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_DOWN, + [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_DOWN, + [DIR_NORTH] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_UP, + [DIR_WEST] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_LEFT, + [DIR_EAST] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_RIGHT, + [DIR_SOUTHWEST] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_LEFT, + [DIR_NORTHWEST] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_LEFT, + [DIR_SOUTHEAST] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_RIGHT, + [DIR_NORTHEAST] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_RIGHT, }; const u8 gAcroWheelieJumpDirectionMovementActions[] = { - MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_DOWN, - MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_DOWN, - MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_UP, - MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_LEFT, - MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_RIGHT, + [DIR_NONE] = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_DOWN, + [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_DOWN, + [DIR_NORTH] = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_UP, + [DIR_WEST] = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_LEFT, + [DIR_EAST] = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_RIGHT, + [DIR_SOUTHWEST] = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_LEFT, + [DIR_NORTHWEST] = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_LEFT, + [DIR_SOUTHEAST] = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_RIGHT, + [DIR_NORTHEAST] = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_RIGHT, }; const u8 gAcroWheelieInPlaceDirectionMovementActions[] = { - MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_DOWN, - MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_DOWN, - MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_UP, - MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_LEFT, - MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_RIGHT, + [DIR_NONE] = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_DOWN, + [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_DOWN, + [DIR_NORTH] = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_UP, + [DIR_WEST] = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_LEFT, + [DIR_EAST] = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_RIGHT, + [DIR_SOUTHWEST] = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_LEFT, + [DIR_NORTHWEST] = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_LEFT, + [DIR_SOUTHEAST] = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_RIGHT, + [DIR_NORTHEAST] = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_RIGHT, }; const u8 gAcroPopWheelieMoveDirectionMovementActions[] = { - MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_DOWN, - MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_DOWN, - MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_UP, - MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_LEFT, - MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_RIGHT, + [DIR_NONE] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_DOWN, + [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_DOWN, + [DIR_NORTH] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_UP, + [DIR_WEST] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_LEFT, + [DIR_EAST] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_RIGHT, + [DIR_SOUTHWEST] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_LEFT, + [DIR_NORTHWEST] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_LEFT, + [DIR_SOUTHEAST] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_RIGHT, + [DIR_NORTHEAST] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_RIGHT, }; const u8 gAcroWheelieMoveDirectionMovementActions[] = { - MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_DOWN, - MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_DOWN, - MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_UP, - MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_LEFT, - MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_RIGHT, + [DIR_NONE] = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_DOWN, + [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_DOWN, + [DIR_NORTH] = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_UP, + [DIR_WEST] = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_LEFT, + [DIR_EAST] = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_RIGHT, + [DIR_SOUTHWEST] = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_LEFT, + [DIR_NORTHWEST] = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_LEFT, + [DIR_SOUTHEAST] = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_RIGHT, + [DIR_NORTHEAST] = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_RIGHT, }; const u8 gAcroEndWheelieMoveDirectionMovementActions[] = { - MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_DOWN, - MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_DOWN, - MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_UP, - MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_LEFT, - MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_RIGHT, + [DIR_NONE] = MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_DOWN, + [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_DOWN, + [DIR_NORTH] = MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_UP, + [DIR_WEST] = MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_LEFT, + [DIR_EAST] = MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_RIGHT, + [DIR_SOUTHWEST] = MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_LEFT, + [DIR_NORTHWEST] = MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_LEFT, + [DIR_SOUTHEAST] = MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_RIGHT, + [DIR_NORTHEAST] = MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_RIGHT, +}; +// run slow +const u8 gRunSlowMovementActions[] = { + [DIR_NONE] = MOVEMENT_ACTION_RUN_DOWN_SLOW, + [DIR_SOUTH] = MOVEMENT_ACTION_RUN_DOWN_SLOW, + [DIR_NORTH] = MOVEMENT_ACTION_RUN_UP_SLOW, + [DIR_WEST] = MOVEMENT_ACTION_RUN_LEFT_SLOW, + [DIR_EAST] = MOVEMENT_ACTION_RUN_RIGHT_SLOW, + [DIR_SOUTHWEST] = MOVEMENT_ACTION_RUN_LEFT_SLOW, + [DIR_SOUTHEAST] = MOVEMENT_ACTION_RUN_RIGHT_SLOW, + [DIR_NORTHWEST] = MOVEMENT_ACTION_RUN_LEFT_SLOW, + [DIR_NORTHEAST] = MOVEMENT_ACTION_RUN_RIGHT_SLOW, }; static const u8 sOppositeDirections[] = { @@ -1298,7 +1377,7 @@ static u8 GetObjectEventIdByLocalIdAndMapInternal(u8 localId, u8 mapNum, u8 mapG return OBJECT_EVENTS_COUNT; } -static u8 GetObjectEventIdByLocalId(u8 localId) +u8 GetObjectEventIdByLocalId(u8 localId) { u8 i; for (i = 0; i < OBJECT_EVENTS_COUNT; i++) @@ -1327,7 +1406,7 @@ static u8 InitObjectEventStateFromTemplate(const struct ObjectEventTemplate *tem objectEvent->triggerGroundEffectsOnMove = TRUE; objectEvent->graphicsId = PackGraphicsId(template); SetObjectEventDynamicGraphicsId(objectEvent); - if (objectEvent->graphicsId >= OBJ_EVENT_GFX_MON_BASE) + if (IS_OW_MON_OBJ(objectEvent)) { if (template->script && template->script[0] == 0x7d) objectEvent->shiny = T1_READ_16(&template->script[2]) >> 15; @@ -1531,11 +1610,13 @@ u16 LoadSheetGraphicsInfo(const struct ObjectEventGraphicsInfo *info, u16 uuid, // Load, then free, in order to avoid displaying garbage data // before sprite's `sheetTileStart` is repointed tileStart = LoadCompressedSpriteSheetByTemplate(&template, TILE_SIZE_4BPP << sheetSpan); - if (oldTiles) { + if (oldTiles) + { FieldEffectFreeTilesIfUnused(oldTiles); // We weren't able to load the sheet; // retry (after having freed), and set sprite to invisible until done - if (tileStart <= 0) { + if (tileStart <= 0) + { if (sprite) sprite->invisible = TRUE; tileStart = LoadCompressedSpriteSheetByTemplate(&template, TILE_SIZE_4BPP << sheetSpan); @@ -1605,6 +1686,12 @@ static u8 TrySetupObjectEventSprite(const struct ObjectEventTemplate *objectEven objectEvent->graphicsId -= SPECIES_SHINY_TAG; } + if (objectEvent->graphicsId >= OBJ_EVENT_GFX_MON_BASE + SPECIES_SHINY_TAG) + { + objectEvent->shiny = TRUE; + objectEvent->graphicsId -= SPECIES_SHINY_TAG; + } + spriteId = CreateSprite(spriteTemplate, 0, 0, 0); if (spriteId == MAX_SPRITES) { @@ -1642,7 +1729,7 @@ static u16 PackGraphicsId(const struct ObjectEventTemplate *template) u32 form = 0; // set form based on template's script, // if first command is bufferspeciesname - if (graphicsId >= OBJ_EVENT_GFX_MON_BASE) + if (IS_OW_MON_OBJ(template)) { if (template->script && template->script[0] == 0x7d) { @@ -1765,16 +1852,23 @@ u8 CreateObjectGraphicsSprite(u16 graphicsId, void (*callback)(struct Sprite *), { struct SpriteTemplate *spriteTemplate; const struct SubspriteTable *subspriteTables; - const struct ObjectEventGraphicsInfo *graphicsInfo; + const struct ObjectEventGraphicsInfo *graphicsInfo = GetObjectEventGraphicsInfo(graphicsId); struct Sprite *sprite; u8 spriteId; bool32 isShiny = graphicsId >= SPECIES_SHINY_TAG + OBJ_EVENT_GFX_MON_BASE; + spriteTemplate = Alloc(sizeof(struct SpriteTemplate)); + CopyObjectGraphicsInfoToSpriteTemplate(graphicsId, callback, spriteTemplate, &subspriteTables); + if (isShiny) graphicsId -= SPECIES_SHINY_TAG; - spriteTemplate = Alloc(sizeof(struct SpriteTemplate)); - CopyObjectGraphicsInfoToSpriteTemplate(graphicsId, callback, spriteTemplate, &subspriteTables); + if (OW_GFX_COMPRESS) + { + // Checking only for compressed here so as not to mess with decorations + if (graphicsInfo->compressed) + spriteTemplate->tileTag = LoadSheetGraphicsInfo(graphicsInfo, graphicsId, NULL); + } if (spriteTemplate->paletteTag == OBJ_EVENT_PAL_TAG_DYNAMIC) { @@ -1786,13 +1880,6 @@ u8 CreateObjectGraphicsSprite(u16 graphicsId, void (*callback)(struct Sprite *), LoadObjectEventPalette(spriteTemplate->paletteTag); } - if (OW_GFX_COMPRESS) - { - graphicsInfo = GetObjectEventGraphicsInfo(graphicsId); - // Checking only for compressed here so as not to mess with decorations - if (graphicsInfo->compressed) - spriteTemplate->tileTag = LoadSheetGraphicsInfo(graphicsInfo, graphicsId, NULL); - } spriteId = CreateSprite(spriteTemplate, x, y, subpriority); Free(spriteTemplate); @@ -1892,9 +1979,17 @@ static const struct ObjectEventGraphicsInfo *SpeciesToGraphicsInfo(u16 species, graphicsInfo = &gSpeciesInfo[form ? SPECIES_UNOWN_B + form - 1 : species].overworldData; break; default: - graphicsInfo = &gSpeciesInfo[species].overworldData; + if (form == 1 && gSpeciesInfo[species].overworldDataFemale.paletteTag == OBJ_EVENT_PAL_TAG_DYNAMIC) + { + graphicsInfo = &gSpeciesInfo[species].overworldDataFemale; + } + else + { + graphicsInfo = &gSpeciesInfo[species].overworldData; + } break; } + // Try to avoid OOB or undefined access if ((graphicsInfo->tileTag == 0 && species < NUM_SPECIES) || (graphicsInfo->tileTag != TAG_NONE && species >= NUM_SPECIES)) { @@ -1910,6 +2005,7 @@ static const struct ObjectEventGraphicsInfo *SpeciesToGraphicsInfo(u16 species, static u8 LoadDynamicFollowerPalette(u16 species, u8 form, bool32 shiny) { u32 paletteNum; + bool32 female = (form == 1); // Use standalone palette, unless entry is OOB or NULL (fallback to front-sprite-based) #if OW_POKEMON_OBJECT_EVENTS == TRUE && OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE if ((shiny && gSpeciesInfo[species].overworldPalette) @@ -1921,10 +2017,21 @@ static u8 LoadDynamicFollowerPalette(u16 species, u8 form, bool32 shiny) if ((paletteNum = IndexOfSpritePaletteTag(palTag)) < 16) return paletteNum; spritePalette.tag = palTag; - if (shiny) - spritePalette.data = gSpeciesInfo[species].overworldShinyPalette; + if (female && gSpeciesInfo[species].overworldPaletteFemale != NULL) + { + if (shiny) + spritePalette.data = gSpeciesInfo[species].overworldShinyPaletteFemale; + else + spritePalette.data = gSpeciesInfo[species].overworldPaletteFemale; + } else - spritePalette.data = gSpeciesInfo[species].overworldPalette; + { + if (shiny) + spritePalette.data = gSpeciesInfo[species].overworldShinyPalette; + else + spritePalette.data = gSpeciesInfo[species].overworldPalette; + } + // Check if pal data must be decompressed if (IsLZ77Data(spritePalette.data, PLTT_SIZE_4BPP, PLTT_SIZE_4BPP)) @@ -1940,7 +2047,7 @@ static u8 LoadDynamicFollowerPalette(u16 species, u8 form, bool32 shiny) { // Note that the shiny palette tag is `species + SPECIES_SHINY_TAG`, which must be increased with more pokemon // so that palette tags do not overlap - const u32 *palette = GetMonSpritePalFromSpecies(species, shiny, FALSE); //ETODO + const u32 *palette = GetMonSpritePalFromSpecies(species, shiny, female); //ETODO // palette already loaded if ((paletteNum = IndexOfSpritePaletteTag(species)) < 16) return paletteNum; @@ -2052,6 +2159,7 @@ static bool8 GetMonInfo(struct Pokemon *mon, u16 *species, u8 *form, u8 *shiny) return FALSE; } *species = GetMonData(mon, MON_DATA_SPECIES); + *form = GetMonGender(mon) == MON_FEMALE; *shiny = IsMonShiny(mon); switch (*species) { @@ -2139,7 +2247,7 @@ void RemoveFollowingPokemon(void) } // Determine whether follower *should* be visible -static bool32 IsFollowerVisible(void) +bool32 IsFollowerVisible(void) { return !(TestPlayerAvatarFlags(FOLLOWER_INVISIBLE_FLAGS) || MetatileBehavior_IsSurfableWaterOrUnderwater(gObjectEvents[gPlayerAvatar.objectEventId].previousMetatileBehavior) @@ -2558,18 +2666,25 @@ static void SpawnObjectEventOnReturnToField(u8 objectEventId, s16 x, s16 y) CopyObjectGraphicsInfoToSpriteTemplate_WithMovementType(objectEvent->graphicsId, objectEvent->movementType, &spriteTemplate, &subspriteTables); spriteFrameImage.size = graphicsInfo->size; spriteTemplate.images = &spriteFrameImage; + if (OW_GFX_COMPRESS) spriteTemplate.tileTag = LoadSheetGraphicsInfo(graphicsInfo, objectEvent->graphicsId, NULL); - if (spriteTemplate.paletteTag != TAG_NONE && spriteTemplate.paletteTag != OBJ_EVENT_PAL_TAG_DYNAMIC) + + if (spriteTemplate.paletteTag == OBJ_EVENT_PAL_TAG_DYNAMIC) + { + u32 paletteNum = LoadDynamicFollowerPalette(OW_SPECIES(objectEvent), OW_FORM(objectEvent), objectEvent->shiny); + spriteTemplate.paletteTag = GetSpritePaletteTagByPaletteNum(paletteNum); + } + else if (spriteTemplate.paletteTag != TAG_NONE) + { LoadObjectEventPalette(spriteTemplate.paletteTag); + } i = CreateSprite(&spriteTemplate, 0, 0, 0); if (i != MAX_SPRITES) { sprite = &gSprites[i]; // Use palette from species palette table - if (spriteTemplate.paletteTag == OBJ_EVENT_PAL_TAG_DYNAMIC) - sprite->oam.paletteNum = LoadDynamicFollowerPalette(OW_SPECIES(objectEvent), OW_FORM(objectEvent), objectEvent->shiny); if (OW_GFX_COMPRESS && sprite->usingSheet) sprite->sheetSpan = GetSpanPerImage(sprite->oam.shape, sprite->oam.size); GetMapCoordsFromSpritePos(x + objectEvent->currentCoords.x, y + objectEvent->currentCoords.y, &sprite->x, &sprite->y); @@ -3445,13 +3560,20 @@ bool8 MovementType_WanderAround_Step2(struct ObjectEvent *objectEvent, struct Sp return TRUE; } -bool8 MovementType_WanderAround_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) +// common; used by all MovementType_Wander*_Step3 +bool8 MovementType_Wander_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (WaitForMovementDelay(sprite)) { + // resets a mid-movement sprite + ClearObjectEventMovement(objectEvent, sprite); sprite->sTypeFuncId = 4; return TRUE; } + else if (OW_MON_WANDER_WALK == TRUE && IS_OW_MON_OBJ(objectEvent)) + { + UpdateMonMoveInPlace(objectEvent, sprite); + } return FALSE; } @@ -3777,16 +3899,6 @@ bool8 MovementType_WanderUpAndDown_Step2(struct ObjectEvent *objectEvent, struct return TRUE; } -bool8 MovementType_WanderUpAndDown_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (WaitForMovementDelay(sprite)) - { - sprite->sTypeFuncId = 4; - return TRUE; - } - return FALSE; -} - bool8 MovementType_WanderUpAndDown_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 direction; @@ -3845,16 +3957,6 @@ bool8 MovementType_WanderLeftAndRight_Step2(struct ObjectEvent *objectEvent, str return TRUE; } -bool8 MovementType_WanderLeftAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (WaitForMovementDelay(sprite)) - { - sprite->sTypeFuncId = 4; - return TRUE; - } - return FALSE; -} - bool8 MovementType_WanderLeftAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 direction; @@ -5327,7 +5429,7 @@ bool8 MovementType_FollowPlayer_Active(struct ObjectEvent *objectEvent, struct S // Animate entering pokeball ClearObjectEventMovement(objectEvent, sprite); ObjectEventSetSingleMovement(objectEvent, sprite, MOVEMENT_ACTION_ENTER_POKEBALL); - objectEvent->singleMovementActive = 1; + objectEvent->singleMovementActive = TRUE; sprite->sTypeFuncId = 2; // movement action sets state to 0 return TRUE; } @@ -5336,17 +5438,12 @@ bool8 MovementType_FollowPlayer_Active(struct ObjectEvent *objectEvent, struct S bool8 MovementType_FollowPlayer_Moving(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - #ifdef MB_SIDEWAYS_STAIRS_RIGHT_SIDE // Copied from ObjectEventExecSingleMovementAction if (gMovementActionFuncs[objectEvent->movementActionId][sprite->sActionFuncId](objectEvent, sprite)) { objectEvent->movementActionId = MOVEMENT_ACTION_NONE; sprite->sActionFuncId = 0; - #else - if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) - { - #endif - objectEvent->singleMovementActive = 0; + objectEvent->singleMovementActive = FALSE; if (sprite->sTypeFuncId) // restore nonzero state sprite->sTypeFuncId = 1; } @@ -5359,25 +5456,35 @@ bool8 MovementType_FollowPlayer_Moving(struct ObjectEvent *objectEvent, struct S return FALSE; } -bool8 FollowablePlayerMovement_Idle(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) +// single function for updating an OW mon's walk-in-place movements +static bool32 UpdateMonMoveInPlace(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (!objectEvent->singleMovementActive) { // walk in place ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkInPlaceNormalMovementAction(objectEvent->facingDirection)); - sprite->sTypeFuncId = 1; - objectEvent->singleMovementActive = 1; + objectEvent->singleMovementActive = TRUE; return TRUE; } else if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { // finish movement action - objectEvent->singleMovementActive = 0; + objectEvent->singleMovementActive = FALSE; } else if (OW_FOLLOWERS_BOBBING == TRUE && (sprite->data[3] & 7) == 2) { sprite->y2 ^= -1; } + return FALSE; +} + +bool8 FollowablePlayerMovement_Idle(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) +{ + if (UpdateMonMoveInPlace(objectEvent, sprite)) + { + sprite->sTypeFuncId = 1; + return TRUE; + } UpdateFollowerTransformEffect(objectEvent, sprite); return FALSE; } @@ -5389,9 +5496,7 @@ bool8 FollowablePlayerMovement_Step(struct ObjectEvent *objectEvent, struct Spri s16 y; s16 targetX; s16 targetY; - #ifdef MB_SIDEWAYS_STAIRS_RIGHT_SIDE u32 playerAction = gObjectEvents[gPlayerAvatar.objectEventId].movementActionId; - #endif targetX = gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.x; targetY = gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.y; @@ -5416,7 +5521,7 @@ bool8 FollowablePlayerMovement_Step(struct ObjectEvent *objectEvent, struct Spri } MoveObjectEventToMapCoords(objectEvent, targetX, targetY); ObjectEventSetSingleMovement(objectEvent, sprite, MOVEMENT_ACTION_EXIT_POKEBALL); - objectEvent->singleMovementActive = 1; + objectEvent->singleMovementActive = TRUE; sprite->sTypeFuncId = 2; if (OW_FOLLOWERS_BOBBING == TRUE) sprite->y2 = 0; @@ -5431,12 +5536,12 @@ bool8 FollowablePlayerMovement_Step(struct ObjectEvent *objectEvent, struct Spri // Follow player direction = GetDirectionToFace(x, y, targetX, targetY); MoveCoords(direction, &x, &y); - #ifdef MB_SIDEWAYS_STAIRS_RIGHT_SIDE // https://github.com/ghoulslash/pokeemerald/tree/sideways_stairs GetCollisionAtCoords(objectEvent, x, y, direction); // Sets directionOverwrite for stairs 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 @@ -5463,7 +5568,6 @@ bool8 FollowablePlayerMovement_Step(struct ObjectEvent *objectEvent, struct Spri } } sprite->sActionFuncId = 0; - #else if (GetLedgeJumpDirection(x, y, direction) != DIR_NONE) { // InitJumpRegular will set the proper speed @@ -5485,8 +5589,7 @@ bool8 FollowablePlayerMovement_Step(struct ObjectEvent *objectEvent, struct Spri if (OW_FOLLOWERS_BOBBING == TRUE) sprite->y2 = -1; } - #endif - objectEvent->singleMovementActive = 1; + objectEvent->singleMovementActive = TRUE; sprite->sTypeFuncId = 2; return TRUE; } @@ -5660,6 +5763,13 @@ bool8 MovementType_MoveInPlace_Step1(struct ObjectEvent *objectEvent, struct Spr { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) sprite->sTypeFuncId = 0; + // similar to UpdateMonMoveInPlace + else if (OW_FOLLOWERS_BOBBING == TRUE + && IS_OW_MON_OBJ(objectEvent) + && (sprite->data[3] & 7) == 2) + { + sprite->y2 ^= 1; + } return FALSE; } @@ -5928,7 +6038,7 @@ u8 GetTrainerFacingDirectionMovementType(u8 direction) return gTrainerFacingDirectionMovementTypes[direction]; } -static u8 GetCollisionInDirection(struct ObjectEvent *objectEvent, u8 direction) +u8 GetCollisionInDirection(struct ObjectEvent *objectEvent, u8 direction) { s16 x = objectEvent->currentCoords.x; s16 y = objectEvent->currentCoords.y; @@ -5936,18 +6046,56 @@ static u8 GetCollisionInDirection(struct ObjectEvent *objectEvent, u8 direction) return GetCollisionAtCoords(objectEvent, x, y, direction); } -u8 GetCollisionAtCoords(struct ObjectEvent *objectEvent, s16 x, s16 y, u32 dir) +u8 GetSidewaysStairsCollision(struct ObjectEvent *objectEvent, u8 dir, u8 currentBehavior, u8 nextBehavior, u8 collision) { - u8 direction = dir; + if ((dir == DIR_SOUTH || dir == DIR_NORTH) && collision != COLLISION_NONE) + return collision; -#if OW_FLAG_NO_COLLISION != 0 - if (FlagGet(OW_FLAG_NO_COLLISION)) - return COLLISION_NONE; -#endif + // cant descend stairs into water + if (MetatileBehavior_IsSurfableFishableWater(nextBehavior)) + return collision; + + if (MetatileBehavior_IsSidewaysStairsLeftSide(nextBehavior)) + { + //moving ONTO left side stair + if (dir == DIR_WEST && currentBehavior != nextBehavior) + return collision; //moving onto top part of left-stair going left, so no diagonal + else + return COLLISION_SIDEWAYS_STAIRS_TO_LEFT; // move diagonally + } + else if (MetatileBehavior_IsSidewaysStairsRightSide(nextBehavior)) + { + //moving ONTO right side stair + if (dir == DIR_EAST && currentBehavior != nextBehavior) + return collision; //moving onto top part of right-stair going right, so no diagonal + else + return COLLISION_SIDEWAYS_STAIRS_TO_RIGHT; + } + else if (MetatileBehavior_IsSidewaysStairsLeftSideAny(currentBehavior)) + { + //moving OFF of any left side stair + if (dir == DIR_WEST && nextBehavior != currentBehavior) + return COLLISION_SIDEWAYS_STAIRS_TO_LEFT; //moving off of left stairs onto non-stair -> move diagonal + else + return collision; //moving off of left side stair to east -> move east + } + else if (MetatileBehavior_IsSidewaysStairsRightSideAny(currentBehavior)) + { + //moving OFF of any right side stair + if (dir == DIR_EAST && nextBehavior != currentBehavior) + return COLLISION_SIDEWAYS_STAIRS_TO_RIGHT; //moving off right stair onto non-stair -> move diagonal + else + return collision; + } + + return collision; +} +static u8 GetVanillaCollision(struct ObjectEvent *objectEvent, s16 x, s16 y, u8 direction) +{ if (IsCoordOutsideObjectEventMovementRange(objectEvent, x, y)) return COLLISION_OUTSIDE_RANGE; - else if (MapGridGetCollisionAt(x, y) || GetMapBorderIdAt(x, y) == CONNECTION_INVALID || IsMetatileDirectionallyImpassable(objectEvent, x, y, direction)) + else if (MapGridGetCollisionAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(objectEvent, x, y, direction)) return COLLISION_IMPASSABLE; else if (objectEvent->trackedByCamera && !CanCameraMoveInDirection(direction)) return COLLISION_IMPASSABLE; @@ -5955,9 +6103,94 @@ u8 GetCollisionAtCoords(struct ObjectEvent *objectEvent, s16 x, s16 y, u32 dir) return COLLISION_ELEVATION_MISMATCH; else if (DoesObjectCollideWithObjectAt(objectEvent, x, y)) return COLLISION_OBJECT_EVENT; + return COLLISION_NONE; } +static bool8 ObjectEventOnLeftSideStair(struct ObjectEvent *objectEvent, s16 x, s16 y, u8 direction) +{ + switch (direction) + { + case DIR_EAST: + MoveCoords(DIR_NORTH, &x, &y); + return DoesObjectCollideWithObjectAt(objectEvent, x, y); + case DIR_WEST: + MoveCoords(DIR_SOUTH, &x, &y); + return DoesObjectCollideWithObjectAt(objectEvent, x, y); + default: + return FALSE; //north/south taken care of in GetVanillaCollision + } +} + +static bool8 ObjectEventOnRightSideStair(struct ObjectEvent *objectEvent, s16 x, s16 y, u8 direction) +{ + switch (direction) + { + case DIR_EAST: + MoveCoords(DIR_SOUTH, &x, &y); + return DoesObjectCollideWithObjectAt(objectEvent, x, y); + case DIR_WEST: + MoveCoords(DIR_NORTH, &x, &y); + return DoesObjectCollideWithObjectAt(objectEvent, x, y); + default: + return FALSE; //north/south taken care of in GetVanillaCollision + } +} + +u8 GetCollisionAtCoords(struct ObjectEvent *objectEvent, s16 x, s16 y, u32 dir) +{ + u8 currentBehavior = MapGridGetMetatileBehaviorAt(objectEvent->currentCoords.x, objectEvent->currentCoords.y); + u8 nextBehavior = MapGridGetMetatileBehaviorAt(x, y); + u8 collision; + + #if OW_FLAG_NO_COLLISION != 0 + if (FlagGet(OW_FLAG_NO_COLLISION)) + return COLLISION_NONE; + #endif + + objectEvent->directionOverwrite = DIR_NONE; + + //sideways stairs checks + if (MetatileBehavior_IsSidewaysStairsLeftSideTop(nextBehavior) && dir == DIR_EAST) + return COLLISION_IMPASSABLE; //moving onto left-side top edge east from regular ground -> nope + else if (MetatileBehavior_IsSidewaysStairsRightSideTop(nextBehavior) && dir == DIR_WEST) + return COLLISION_IMPASSABLE; //moving onto left-side top edge east from regular ground -> nope + else if (MetatileBehavior_IsSidewaysStairsRightSideBottom(nextBehavior) && (dir == DIR_EAST || dir == DIR_SOUTH)) + return COLLISION_IMPASSABLE; //moving into right-side bottom edge from regular ground -> nah + else if (MetatileBehavior_IsSidewaysStairsLeftSideBottom(nextBehavior) && (dir == DIR_WEST || dir == DIR_SOUTH)) + return COLLISION_IMPASSABLE; //moving onto left-side bottom edge from regular ground -> nah + else if ((MetatileBehavior_IsSidewaysStairsLeftSideTop(currentBehavior) || MetatileBehavior_IsSidewaysStairsRightSideTop(currentBehavior)) + && dir == DIR_NORTH) + return COLLISION_IMPASSABLE; //trying to move north off of top-most tile onto same level doesn't work + else if (!(MetatileBehavior_IsSidewaysStairsLeftSideTop(currentBehavior) || MetatileBehavior_IsSidewaysStairsRightSideTop(currentBehavior)) + && dir == DIR_SOUTH && (MetatileBehavior_IsSidewaysStairsLeftSideTop(nextBehavior) || MetatileBehavior_IsSidewaysStairsRightSideTop(nextBehavior))) + return COLLISION_IMPASSABLE; //trying to move south onto top stair tile at same level from non-stair -> no + else if (!(MetatileBehavior_IsSidewaysStairsLeftSideBottom(currentBehavior) || MetatileBehavior_IsSidewaysStairsRightSideBottom(currentBehavior)) + && dir == DIR_NORTH && (MetatileBehavior_IsSidewaysStairsLeftSideBottom(nextBehavior) || MetatileBehavior_IsSidewaysStairsRightSideBottom(nextBehavior))) + return COLLISION_IMPASSABLE; //trying to move north onto top stair tile at same level from non-stair -> no + + // regular checks + collision = GetVanillaCollision(objectEvent, x, y, dir); + + //sideways stairs direction change checks + collision = GetSidewaysStairsCollision(objectEvent, dir, currentBehavior, nextBehavior, collision); + switch (collision) + { + case COLLISION_SIDEWAYS_STAIRS_TO_LEFT: + if (ObjectEventOnLeftSideStair(objectEvent, x, y, dir)) + return COLLISION_OBJECT_EVENT; + objectEvent->directionOverwrite = GetLeftSideStairsDirection(dir); + return COLLISION_NONE; + case COLLISION_SIDEWAYS_STAIRS_TO_RIGHT: + if (ObjectEventOnRightSideStair(objectEvent, x, y, dir)) + return COLLISION_OBJECT_EVENT; + objectEvent->directionOverwrite = GetRightSideStairsDirection(dir); + return COLLISION_NONE; + } + + return collision; +} + u8 GetCollisionFlagsAtCoords(struct ObjectEvent *objectEvent, s16 x, s16 y, u8 direction) { u8 flags = 0; @@ -6021,6 +6254,7 @@ static bool8 DoesObjectCollideWithObjectAt(struct ObjectEvent *objectEvent, s16 curObject = &gObjectEvents[i]; if (curObject->active && (curObject->movementType != MOVEMENT_TYPE_FOLLOW_PLAYER || objectEvent != &gObjectEvents[gPlayerAvatar.objectEventId]) && curObject != objectEvent) { + // check for collision if curObject is active, not the object in question, and not exempt from collisions if ((curObject->currentCoords.x == x && curObject->currentCoords.y == y) || (curObject->previousCoords.x == x && curObject->previousCoords.y == y)) { if (AreElevationsCompatible(objectEvent->currentElevation, curObject->currentElevation)) @@ -6157,11 +6391,36 @@ bool8 ObjectEventIsHeldMovementActive(struct ObjectEvent *objectEvent) return FALSE; } +static u8 TryUpdateMovementActionOnStairs(struct ObjectEvent *objectEvent, u8 movementActionId) +{ + if (objectEvent->isPlayer || objectEvent->localId == OBJ_EVENT_ID_FOLLOWER) + return movementActionId; // handled separately + + if (!ObjectMovingOnRockStairs(objectEvent, objectEvent->movementDirection)) + return movementActionId; + + switch (movementActionId) + { + case MOVEMENT_ACTION_WALK_NORMAL_DOWN: + return MOVEMENT_ACTION_WALK_SLOW_DOWN; + case MOVEMENT_ACTION_WALK_NORMAL_UP: + return MOVEMENT_ACTION_WALK_SLOW_UP; + case MOVEMENT_ACTION_WALK_NORMAL_LEFT: + return MOVEMENT_ACTION_WALK_SLOW_LEFT; + case MOVEMENT_ACTION_WALK_NORMAL_RIGHT: + return MOVEMENT_ACTION_WALK_SLOW_RIGHT; + default: + return movementActionId; + } +} + bool8 ObjectEventSetHeldMovement(struct ObjectEvent *objectEvent, u8 movementActionId) { if (ObjectEventIsMovementOverridden(objectEvent)) return TRUE; + movementActionId = TryUpdateMovementActionOnStairs(objectEvent, movementActionId); + UnfreezeObjectEvent(objectEvent); objectEvent->movementActionId = movementActionId; objectEvent->heldMovementActive = TRUE; @@ -6172,6 +6431,7 @@ bool8 ObjectEventSetHeldMovement(struct ObjectEvent *objectEvent, u8 movementAct void ObjectEventForceSetHeldMovement(struct ObjectEvent *objectEvent, u8 movementActionId) { + movementActionId = TryUpdateMovementActionOnStairs(objectEvent, movementActionId); ObjectEventClearHeldMovementIfActive(objectEvent); ObjectEventSetHeldMovement(objectEvent, movementActionId); } @@ -6211,7 +6471,7 @@ u8 ObjectEventClearHeldMovementIfFinished(struct ObjectEvent *objectEvent) u8 ObjectEventGetHeldMovementActionId(struct ObjectEvent *objectEvent) { if (objectEvent->heldMovementActive) - return objectEvent->movementActionId; + return TryUpdateMovementActionOnStairs(objectEvent, objectEvent->movementActionId); return MOVEMENT_ACTION_NONE; } @@ -6240,12 +6500,13 @@ u8 name(u32 idx)\ u8 animIds[sizeof(table)];\ direction = idx;\ memcpy(animIds, (table), sizeof(table));\ - if (direction > DIR_EAST) direction = 0;\ + if (direction > sizeof(table)) direction = 0;\ return animIds[direction];\ } dirn_to_anim(GetFaceDirectionMovementAction, gFaceDirectionMovementActions); dirn_to_anim(GetWalkSlowMovementAction, gWalkSlowMovementActions); +dirn_to_anim(GetPlayerRunSlowMovementAction, gRunSlowMovementActions); dirn_to_anim(GetWalkNormalMovementAction, gWalkNormalMovementActions); dirn_to_anim(GetWalkFastMovementAction, gWalkFastMovementActions); dirn_to_anim(GetRideWaterCurrentMovementAction, gRideWaterCurrentMovementActions); @@ -6314,12 +6575,14 @@ static u32 GetCopyDirection(u8 copyInitDir, u32 playerInitDir, u32 playerMoveDir static void ObjectEventExecHeldMovementAction(struct ObjectEvent *objectEvent, struct Sprite *sprite) { + objectEvent->movementActionId = TryUpdateMovementActionOnStairs(objectEvent, objectEvent->movementActionId); if (gMovementActionFuncs[objectEvent->movementActionId][sprite->sActionFuncId](objectEvent, sprite)) objectEvent->heldMovementFinished = TRUE; } static bool8 ObjectEventExecSingleMovementAction(struct ObjectEvent *objectEvent, struct Sprite *sprite) { + objectEvent->movementActionId = TryUpdateMovementActionOnStairs(objectEvent, objectEvent->movementActionId); if (gMovementActionFuncs[objectEvent->movementActionId][sprite->sActionFuncId](objectEvent, sprite)) { objectEvent->movementActionId = MOVEMENT_ACTION_NONE; @@ -6331,7 +6594,7 @@ static bool8 ObjectEventExecSingleMovementAction(struct ObjectEvent *objectEvent static void ObjectEventSetSingleMovement(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 animId) { - objectEvent->movementActionId = animId; + objectEvent->movementActionId = TryUpdateMovementActionOnStairs(objectEvent, animId); sprite->sActionFuncId = 0; } @@ -6547,7 +6810,10 @@ bool8 MovementAction_WalkSlowUp_Step1(struct ObjectEvent *objectEvent, struct Sp bool8 MovementAction_WalkSlowLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - InitWalkSlow(objectEvent, sprite, DIR_WEST); + if (objectEvent->directionOverwrite) + InitWalkSlow(objectEvent, sprite, objectEvent->directionOverwrite); + else + InitWalkSlow(objectEvent, sprite, DIR_WEST); return MovementAction_WalkSlowLeft_Step1(objectEvent, sprite); } @@ -6563,7 +6829,10 @@ bool8 MovementAction_WalkSlowLeft_Step1(struct ObjectEvent *objectEvent, struct bool8 MovementAction_WalkSlowRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - InitWalkSlow(objectEvent, sprite, DIR_EAST); + if (objectEvent->directionOverwrite) + InitWalkSlow(objectEvent, sprite, objectEvent->directionOverwrite); + else + InitWalkSlow(objectEvent, sprite, DIR_EAST); return MovementAction_WalkSlowRight_Step1(objectEvent, sprite); } @@ -6675,7 +6944,10 @@ bool8 MovementAction_WalkNormalUp_Step1(struct ObjectEvent *objectEvent, struct bool8 MovementAction_WalkNormalLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - InitMovementNormal(objectEvent, sprite, DIR_WEST, MOVE_SPEED_NORMAL); + if (objectEvent->directionOverwrite) + InitMovementNormal(objectEvent, sprite, objectEvent->directionOverwrite, MOVE_SPEED_NORMAL); + else + InitMovementNormal(objectEvent, sprite, DIR_WEST, MOVE_SPEED_NORMAL); return MovementAction_WalkNormalLeft_Step1(objectEvent, sprite); } @@ -6691,7 +6963,10 @@ bool8 MovementAction_WalkNormalLeft_Step1(struct ObjectEvent *objectEvent, struc bool8 MovementAction_WalkNormalRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - InitMovementNormal(objectEvent, sprite, DIR_EAST, MOVE_SPEED_NORMAL); + if (objectEvent->directionOverwrite) + InitMovementNormal(objectEvent, sprite, objectEvent->directionOverwrite, MOVE_SPEED_NORMAL); + else + InitMovementNormal(objectEvent, sprite, DIR_EAST, MOVE_SPEED_NORMAL); return MovementAction_WalkNormalRight_Step1(objectEvent, sprite); } @@ -6969,7 +7244,10 @@ bool8 MovementAction_WalkFastUp_Step1(struct ObjectEvent *objectEvent, struct Sp bool8 MovementAction_WalkFastLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - InitMovementNormal(objectEvent, sprite, DIR_WEST, MOVE_SPEED_FAST_1); + if (objectEvent->directionOverwrite) + InitMovementNormal(objectEvent, sprite, objectEvent->directionOverwrite, MOVE_SPEED_FAST_1); + else + InitMovementNormal(objectEvent, sprite, DIR_WEST, MOVE_SPEED_FAST_1); return MovementAction_WalkFastLeft_Step1(objectEvent, sprite); } @@ -6985,7 +7263,10 @@ bool8 MovementAction_WalkFastLeft_Step1(struct ObjectEvent *objectEvent, struct bool8 MovementAction_WalkFastRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - InitMovementNormal(objectEvent, sprite, DIR_EAST, MOVE_SPEED_FAST_1); + if (objectEvent->directionOverwrite) + InitMovementNormal(objectEvent, sprite, objectEvent->directionOverwrite, MOVE_SPEED_FAST_1); + else + InitMovementNormal(objectEvent, sprite, DIR_EAST, MOVE_SPEED_FAST_1); return MovementAction_WalkFastRight_Step1(objectEvent, sprite); } @@ -7319,13 +7600,19 @@ bool8 MovementAction_WalkInPlaceFasterUp_Step0(struct ObjectEvent *objectEvent, bool8 MovementAction_WalkInPlaceFasterLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - InitMoveInPlace(objectEvent, sprite, DIR_WEST, GetMoveDirectionFasterAnimNum(DIR_WEST), 4); + if (objectEvent->directionOverwrite) + InitMoveInPlace(objectEvent, sprite, objectEvent->directionOverwrite, GetMoveDirectionFasterAnimNum(DIR_WEST), 4); + else + InitMoveInPlace(objectEvent, sprite, DIR_WEST, GetMoveDirectionFasterAnimNum(DIR_WEST), 4); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } bool8 MovementAction_WalkInPlaceFasterRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - InitMoveInPlace(objectEvent, sprite, DIR_EAST, GetMoveDirectionFasterAnimNum(DIR_EAST), 4); + if (objectEvent->directionOverwrite) + InitMoveInPlace(objectEvent, sprite, objectEvent->directionOverwrite, GetMoveDirectionFasterAnimNum(DIR_EAST), 4); + else + InitMoveInPlace(objectEvent, sprite, DIR_EAST, GetMoveDirectionFasterAnimNum(DIR_EAST), 4); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } @@ -7363,7 +7650,10 @@ bool8 MovementAction_RideWaterCurrentUp_Step1(struct ObjectEvent *objectEvent, s bool8 MovementAction_RideWaterCurrentLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - InitMovementNormal(objectEvent, sprite, DIR_WEST, MOVE_SPEED_FAST_2); + if (objectEvent->directionOverwrite) + InitMovementNormal(objectEvent, sprite, objectEvent->directionOverwrite, MOVE_SPEED_FAST_2); + else + InitMovementNormal(objectEvent, sprite, DIR_WEST, MOVE_SPEED_FAST_2); return MovementAction_RideWaterCurrentLeft_Step1(objectEvent, sprite); } @@ -7379,7 +7669,10 @@ bool8 MovementAction_RideWaterCurrentLeft_Step1(struct ObjectEvent *objectEvent, bool8 MovementAction_RideWaterCurrentRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - InitMovementNormal(objectEvent, sprite, DIR_EAST, MOVE_SPEED_FAST_2); + if (objectEvent->directionOverwrite) + InitMovementNormal(objectEvent, sprite, objectEvent->directionOverwrite, MOVE_SPEED_FAST_2); + else + InitMovementNormal(objectEvent, sprite, DIR_EAST, MOVE_SPEED_FAST_2); return MovementAction_RideWaterCurrentRight_Step1(objectEvent, sprite); } @@ -7427,7 +7720,10 @@ bool8 MovementAction_WalkFasterUp_Step1(struct ObjectEvent *objectEvent, struct bool8 MovementAction_WalkFasterLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - InitMovementNormal(objectEvent, sprite, DIR_WEST, MOVE_SPEED_FASTER); + if (objectEvent->directionOverwrite) + InitMovementNormal(objectEvent, sprite, objectEvent->directionOverwrite, MOVE_SPEED_FASTER); + else + InitMovementNormal(objectEvent, sprite, DIR_WEST, MOVE_SPEED_FASTER); return MovementAction_WalkFasterLeft_Step1(objectEvent, sprite); } @@ -7443,7 +7739,10 @@ bool8 MovementAction_WalkFasterLeft_Step1(struct ObjectEvent *objectEvent, struc bool8 MovementAction_WalkFasterRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - InitMovementNormal(objectEvent, sprite, DIR_EAST, MOVE_SPEED_FASTER); + if (objectEvent->directionOverwrite) + InitMovementNormal(objectEvent, sprite, objectEvent->directionOverwrite, MOVE_SPEED_FASTER); + else + InitMovementNormal(objectEvent, sprite, DIR_EAST, MOVE_SPEED_FASTER); return MovementAction_WalkFasterRight_Step1(objectEvent, sprite); } @@ -7491,7 +7790,10 @@ bool8 MovementAction_SlideUp_Step1(struct ObjectEvent *objectEvent, struct Sprit bool8 MovementAction_SlideLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - InitMovementNormal(objectEvent, sprite, DIR_WEST, MOVE_SPEED_FASTEST); + if (objectEvent->directionOverwrite) + InitMovementNormal(objectEvent, sprite, objectEvent->directionOverwrite, MOVE_SPEED_FASTEST); + else + InitMovementNormal(objectEvent, sprite, DIR_WEST, MOVE_SPEED_FASTEST); return MovementAction_SlideLeft_Step1(objectEvent, sprite); } @@ -7507,7 +7809,10 @@ bool8 MovementAction_SlideLeft_Step1(struct ObjectEvent *objectEvent, struct Spr bool8 MovementAction_SlideRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - InitMovementNormal(objectEvent, sprite, DIR_EAST, MOVE_SPEED_FASTEST); + if (objectEvent->directionOverwrite) + InitMovementNormal(objectEvent, sprite, objectEvent->directionOverwrite, MOVE_SPEED_FASTEST); + else + InitMovementNormal(objectEvent, sprite, DIR_EAST, MOVE_SPEED_FASTEST); return MovementAction_SlideRight_Step1(objectEvent, sprite); } @@ -7555,7 +7860,10 @@ bool8 MovementAction_PlayerRunUp_Step1(struct ObjectEvent *objectEvent, struct S bool8 MovementAction_PlayerRunLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - StartRunningAnim(objectEvent, sprite, DIR_WEST); + if (objectEvent->directionOverwrite) + StartRunningAnim(objectEvent, sprite, objectEvent->directionOverwrite); + else + StartRunningAnim(objectEvent, sprite, DIR_WEST); return MovementAction_PlayerRunLeft_Step1(objectEvent, sprite); } @@ -7571,7 +7879,10 @@ bool8 MovementAction_PlayerRunLeft_Step1(struct ObjectEvent *objectEvent, struct bool8 MovementAction_PlayerRunRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - StartRunningAnim(objectEvent, sprite, DIR_EAST); + if (objectEvent->directionOverwrite) + StartRunningAnim(objectEvent, sprite, objectEvent->directionOverwrite); + else + StartRunningAnim(objectEvent, sprite, DIR_EAST); return MovementAction_PlayerRunRight_Step1(objectEvent, sprite); } @@ -8458,7 +8769,10 @@ bool8 MovementAction_AcroWheelieHopUp_Step1(struct ObjectEvent *objectEvent, str bool8 MovementAction_AcroWheelieHopLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - InitAcroWheelieJump(objectEvent, sprite, DIR_WEST, JUMP_DISTANCE_NORMAL, JUMP_TYPE_LOW); + if (objectEvent->directionOverwrite) + InitAcroWheelieJump(objectEvent, sprite, objectEvent->directionOverwrite, JUMP_DISTANCE_NORMAL, JUMP_TYPE_LOW); + else + InitAcroWheelieJump(objectEvent, sprite, DIR_WEST, JUMP_DISTANCE_NORMAL, JUMP_TYPE_LOW); return MovementAction_AcroWheelieHopLeft_Step1(objectEvent, sprite); } @@ -8475,7 +8789,10 @@ bool8 MovementAction_AcroWheelieHopLeft_Step1(struct ObjectEvent *objectEvent, s bool8 MovementAction_AcroWheelieHopRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - InitAcroWheelieJump(objectEvent, sprite, DIR_EAST, JUMP_DISTANCE_NORMAL, JUMP_TYPE_LOW); + if (objectEvent->directionOverwrite) + InitAcroWheelieJump(objectEvent, sprite, objectEvent->directionOverwrite, JUMP_DISTANCE_NORMAL, JUMP_TYPE_LOW); + else + InitAcroWheelieJump(objectEvent, sprite, DIR_EAST, JUMP_DISTANCE_NORMAL, JUMP_TYPE_LOW); return MovementAction_AcroWheelieHopRight_Step1(objectEvent, sprite); } @@ -8526,7 +8843,10 @@ bool8 MovementAction_AcroWheelieJumpUp_Step1(struct ObjectEvent *objectEvent, st bool8 MovementAction_AcroWheelieJumpLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - InitAcroWheelieJump(objectEvent, sprite, DIR_WEST, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH); + if (objectEvent->directionOverwrite) + InitAcroWheelieJump(objectEvent, sprite, objectEvent->directionOverwrite, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH); + else + InitAcroWheelieJump(objectEvent, sprite, DIR_WEST, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH); return MovementAction_AcroWheelieJumpLeft_Step1(objectEvent, sprite); } @@ -8543,7 +8863,10 @@ bool8 MovementAction_AcroWheelieJumpLeft_Step1(struct ObjectEvent *objectEvent, bool8 MovementAction_AcroWheelieJumpRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - InitAcroWheelieJump(objectEvent, sprite, DIR_EAST, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH); + if (objectEvent->directionOverwrite) + InitAcroWheelieJump(objectEvent, sprite, objectEvent->directionOverwrite, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH); + else + InitAcroWheelieJump(objectEvent, sprite, DIR_EAST, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH); return MovementAction_AcroWheelieJumpRight_Step1(objectEvent, sprite); } @@ -8572,13 +8895,19 @@ bool8 MovementAction_AcroWheelieInPlaceUp_Step0(struct ObjectEvent *objectEvent, bool8 MovementAction_AcroWheelieInPlaceLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - InitMoveInPlace(objectEvent, sprite, DIR_WEST, GetAcroWheeliePedalDirectionAnimNum(DIR_WEST), 8); + if (objectEvent->directionOverwrite) + InitMoveInPlace(objectEvent, sprite, objectEvent->directionOverwrite, GetAcroWheeliePedalDirectionAnimNum(objectEvent->directionOverwrite), 8); + else + InitMoveInPlace(objectEvent, sprite, DIR_WEST, GetAcroWheeliePedalDirectionAnimNum(DIR_WEST), 8); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } bool8 MovementAction_AcroWheelieInPlaceRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - InitMoveInPlace(objectEvent, sprite, DIR_EAST, GetAcroWheeliePedalDirectionAnimNum(DIR_EAST), 8); + if (objectEvent->directionOverwrite) + InitMoveInPlace(objectEvent, sprite, objectEvent->directionOverwrite, GetAcroWheeliePedalDirectionAnimNum(objectEvent->directionOverwrite), 8); + else + InitMoveInPlace(objectEvent, sprite, DIR_EAST, GetAcroWheeliePedalDirectionAnimNum(DIR_EAST), 8); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } @@ -8623,7 +8952,10 @@ bool8 MovementAction_AcroPopWheelieMoveUp_Step1(struct ObjectEvent *objectEvent, bool8 MovementAction_AcroPopWheelieMoveLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - InitAcroPopWheelie(objectEvent, sprite, DIR_WEST, 1); + if (objectEvent->directionOverwrite) + InitAcroPopWheelie(objectEvent, sprite, objectEvent->directionOverwrite, 1); + else + InitAcroPopWheelie(objectEvent, sprite, DIR_WEST, 1); return MovementAction_AcroPopWheelieMoveLeft_Step1(objectEvent, sprite); } @@ -8639,7 +8971,10 @@ bool8 MovementAction_AcroPopWheelieMoveLeft_Step1(struct ObjectEvent *objectEven bool8 MovementAction_AcroPopWheelieMoveRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - InitAcroPopWheelie(objectEvent, sprite, DIR_EAST, 1); + if (objectEvent->directionOverwrite) + InitAcroPopWheelie(objectEvent, sprite, objectEvent->directionOverwrite, 1); + else + InitAcroPopWheelie(objectEvent, sprite, DIR_EAST, 1); return MovementAction_AcroPopWheelieMoveRight_Step1(objectEvent, sprite); } @@ -8693,7 +9028,10 @@ bool8 MovementAction_AcroWheelieMoveUp_Step1(struct ObjectEvent *objectEvent, st bool8 MovementAction_AcroWheelieMoveLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - InitAcroWheelieMove(objectEvent, sprite, DIR_WEST, 1); + if (objectEvent->directionOverwrite) + InitAcroWheelieMove(objectEvent, sprite, objectEvent->directionOverwrite, 1); + else + InitAcroWheelieMove(objectEvent, sprite, DIR_WEST, 1); return MovementAction_AcroWheelieMoveLeft_Step1(objectEvent, sprite); } @@ -8709,7 +9047,10 @@ bool8 MovementAction_AcroWheelieMoveLeft_Step1(struct ObjectEvent *objectEvent, bool8 MovementAction_AcroWheelieMoveRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - InitAcroWheelieMove(objectEvent, sprite, DIR_EAST, 1); + if (objectEvent->directionOverwrite) + InitAcroWheelieMove(objectEvent, sprite, objectEvent->directionOverwrite, 1); + else + InitAcroWheelieMove(objectEvent, sprite, DIR_EAST, 1); return MovementAction_AcroWheelieMoveRight_Step1(objectEvent, sprite); } @@ -8764,7 +9105,10 @@ bool8 MovementAction_AcroEndWheelieMoveUp_Step1(struct ObjectEvent *objectEvent, bool8 MovementAction_AcroEndWheelieMoveLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - InitAcroEndWheelie(objectEvent, sprite, DIR_WEST, 1); + if (objectEvent->directionOverwrite) + InitAcroEndWheelie(objectEvent, sprite, objectEvent->directionOverwrite, 1); + else + InitAcroEndWheelie(objectEvent, sprite, DIR_WEST, 1); return MovementAction_AcroEndWheelieMoveLeft_Step1(objectEvent, sprite); } @@ -8780,7 +9124,10 @@ bool8 MovementAction_AcroEndWheelieMoveLeft_Step1(struct ObjectEvent *objectEven bool8 MovementAction_AcroEndWheelieMoveRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - InitAcroEndWheelie(objectEvent, sprite, DIR_EAST, 1); + if (objectEvent->directionOverwrite) + InitAcroEndWheelie(objectEvent, sprite, objectEvent->directionOverwrite, 1); + else + InitAcroEndWheelie(objectEvent, sprite, DIR_EAST, 1); return MovementAction_AcroEndWheelieMoveRight_Step1(objectEvent, sprite); } @@ -8984,6 +9331,9 @@ static void GetGroundEffectFlags_LongGrassOnBeginStep(struct ObjectEvent *objEve static void GetGroundEffectFlags_Tracks(struct ObjectEvent *objEvent, u32 *flags) { + if (objEvent->directionOverwrite) + return; + if (MetatileBehavior_IsDeepSand(objEvent->previousMetatileBehavior)) *flags |= GROUND_EFFECT_FLAG_DEEP_SAND; else if (MetatileBehavior_IsSandOrDeepSand(objEvent->previousMetatileBehavior) @@ -9484,12 +9834,13 @@ static void DoTracksGroundEffect_BikeTireTracks(struct ObjectEvent *objEvent, st if (objEvent->currentCoords.x != objEvent->previousCoords.x || objEvent->currentCoords.y != objEvent->previousCoords.y) { + u8 movementDir = (objEvent->previousMovementDirection > DIR_EAST) ? (objEvent->previousMovementDirection - DIR_EAST) : objEvent->previousMovementDirection; gFieldEffectArguments[0] = objEvent->previousCoords.x; gFieldEffectArguments[1] = objEvent->previousCoords.y; gFieldEffectArguments[2] = 149; gFieldEffectArguments[3] = 2; gFieldEffectArguments[4] = - bikeTireTracks_Transitions[objEvent->previousMovementDirection][objEvent->facingDirection - 5]; + bikeTireTracks_Transitions[movementDir][objEvent->facingDirection - 5]; FieldEffectStart(FLDEFF_BIKE_TIRE_TRACKS); } } @@ -10145,15 +10496,18 @@ static u8 DoJumpSpecialSpriteMovement(struct Sprite *sprite) static void SetMovementDelay(struct Sprite *sprite, s16 timer) { - sprite->data[3] = timer; + sprite->data[3] = timer; // kept for legacy reasons + sprite->data[7] = timer; // actual timer } static bool8 WaitForMovementDelay(struct Sprite *sprite) { - if (--sprite->data[3] == 0) + if (--sprite->data[7] == 0) + { + sprite->data[3] = 0; // reset animation timer return TRUE; - else - return FALSE; + } + return FALSE; } void SetAndStartSpriteAnim(struct Sprite *sprite, u8 animNum, u8 animCmdIndex) @@ -10634,3 +10988,50 @@ void GetDaycareGraphics(struct ScriptContext *ctx) } gSpecialVar_Result = i; } + +// running slow +static void StartSlowRunningAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) +{ + InitNpcForWalkSlow(objectEvent, sprite, direction); + SetStepAnimHandleAlternation(objectEvent, sprite, GetRunningDirectionAnimNum(objectEvent->facingDirection)); +} + +bool8 MovementActionFunc_RunSlowDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) +{ + StartSlowRunningAnim(objectEvent, sprite, DIR_SOUTH); + return MovementActionFunc_RunSlow_Step1(objectEvent, sprite); +} + +bool8 MovementActionFunc_RunSlowUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) +{ + StartSlowRunningAnim(objectEvent, sprite, DIR_NORTH); + return MovementActionFunc_RunSlow_Step1(objectEvent, sprite); +} + +bool8 MovementActionFunc_RunSlowLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) +{ + if (objectEvent->directionOverwrite) + StartSlowRunningAnim(objectEvent, sprite, objectEvent->directionOverwrite); + else + StartSlowRunningAnim(objectEvent, sprite, DIR_WEST); + return MovementActionFunc_RunSlow_Step1(objectEvent, sprite); +} + +bool8 MovementActionFunc_RunSlowRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) +{ + if (objectEvent->directionOverwrite) + StartSlowRunningAnim(objectEvent, sprite, objectEvent->directionOverwrite); + else + StartSlowRunningAnim(objectEvent, sprite, DIR_EAST); + return MovementActionFunc_RunSlow_Step1(objectEvent, sprite); +} + +bool8 MovementActionFunc_RunSlow_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) +{ + if (UpdateMovementNormal(objectEvent, sprite)) + { + sprite->sActionFuncId = 2; + return TRUE; + } + return FALSE; +} diff --git a/src/evolution_scene.c b/src/evolution_scene.c index 98879430cb37..611949490794 100644 --- a/src/evolution_scene.c +++ b/src/evolution_scene.c @@ -545,19 +545,13 @@ static void CB2_TradeEvolutionSceneUpdate(void) static void CreateShedinja(u16 preEvoSpecies, struct Pokemon *mon) { u32 data = 0; - #if P_SHEDINJA_BALL >= GEN_4 - u16 ball = ITEM_POKE_BALL; - #endif + u16 ball = ITEM_POKE_BALL; const struct Evolution *evolutions = GetSpeciesEvolutions(preEvoSpecies); if (evolutions == NULL) return; - if (evolutions[0].method == EVO_LEVEL_NINJASK && gPlayerPartyCount < PARTY_SIZE - #if P_SHEDINJA_BALL >= GEN_4 - && (CheckBagHasItem(ball, 1)) - #endif - ) + if (evolutions[0].method == EVO_LEVEL_NINJASK && gPlayerPartyCount < PARTY_SIZE && (P_SHEDINJA_BALL < GEN_4 || CheckBagHasItem(ball, 1))) { s32 i; struct Pokemon *shedinja = &gPlayerParty[gPlayerPartyCount]; @@ -567,10 +561,11 @@ static void CreateShedinja(u16 preEvoSpecies, struct Pokemon *mon) SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_NICKNAME, GetSpeciesName(evolutions[1].targetSpecies)); SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_HELD_ITEM, &data); SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_MARKINGS, &data); - #if P_SHEDINJA_BALL >= GEN_4 - SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_POKEBALL, &ball); - RemoveBagItem(ball, 1); - #endif + if (P_SHEDINJA_BALL >= GEN_4) + { + SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_POKEBALL, &ball); + RemoveBagItem(ball, 1); + } for (i = MON_DATA_COOL_RIBBON; i < MON_DATA_COOL_RIBBON + CONTEST_CATEGORIES_COUNT; i++) SetMonData(&gPlayerParty[gPlayerPartyCount], i, &data); diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index cc1f95753c76..2a20ae5a78b2 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -332,8 +332,39 @@ static const u8 *GetInteractedObjectEventScript(struct MapPosition *position, u8 { u8 objectEventId; const u8 *script; + s16 currX = gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x; + s16 currY = gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y; + u8 currBehavior = MapGridGetMetatileBehaviorAt(currX, currY); + + switch (direction) + { + case DIR_EAST: + if (MetatileBehavior_IsSidewaysStairsLeftSideAny(metatileBehavior)) + // sideways stairs left-side to your right -> check northeast + objectEventId = GetObjectEventIdByPosition(currX + 1, currY - 1, position->elevation); + else if (MetatileBehavior_IsSidewaysStairsRightSideAny(currBehavior)) + // on top of right-side stairs -> check southeast + objectEventId = GetObjectEventIdByPosition(currX + 1, currY + 1, position->elevation); + else + // check in front of player + objectEventId = GetObjectEventIdByPosition(position->x, position->y, position->elevation); + break; + case DIR_WEST: + if (MetatileBehavior_IsSidewaysStairsRightSideAny(metatileBehavior)) + // facing sideways stairs right side -> check northwest + objectEventId = GetObjectEventIdByPosition(currX - 1, currY - 1, position->elevation); + else if (MetatileBehavior_IsSidewaysStairsLeftSideAny(currBehavior)) + // on top of left-side stairs -> check southwest + objectEventId = GetObjectEventIdByPosition(currX - 1, currY + 1, position->elevation); + else + // check in front of player + objectEventId = GetObjectEventIdByPosition(position->x, position->y, position->elevation); + break; + default: + objectEventId = GetObjectEventIdByPosition(position->x, position->y, position->elevation); + break; + } - objectEventId = GetObjectEventIdByPosition(position->x, position->y, position->elevation); if (objectEventId == OBJECT_EVENTS_COUNT || gObjectEvents[objectEventId].localId == OBJ_EVENT_ID_PLAYER) { if (MetatileBehavior_IsCounter(metatileBehavior) != TRUE) @@ -752,17 +783,39 @@ static bool8 CheckStandardWildEncounter(u16 metatileBehavior) return FALSE; } +static void StorePlayerStateAndSetupWarp(struct MapPosition *position, s32 warpEventId) +{ + StoreInitialPlayerAvatarState(); + SetupWarp(&gMapHeader, warpEventId, position); +} + static bool8 TryArrowWarp(struct MapPosition *position, u16 metatileBehavior, u8 direction) { - s8 warpEventId = GetWarpEventAtMapPosition(&gMapHeader, position); + s32 warpEventId = GetWarpEventAtMapPosition(&gMapHeader, position); + u32 delay; - if (IsArrowWarpMetatileBehavior(metatileBehavior, direction) == TRUE && warpEventId != WARP_ID_NONE) + if (warpEventId == WARP_ID_NONE) + return FALSE; + + if (IsArrowWarpMetatileBehavior(metatileBehavior, direction) == TRUE) { - StoreInitialPlayerAvatarState(); - SetupWarp(&gMapHeader, warpEventId, position); + StorePlayerStateAndSetupWarp(position, warpEventId); DoWarp(); return TRUE; } + else if (IsDirectionalStairWarpMetatileBehavior(metatileBehavior, direction) == TRUE) + { + delay = 0; + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_BIKE) + { + SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT); + delay = 12; + } + + StorePlayerStateAndSetupWarp(position, warpEventId); + DoStairWarp(metatileBehavior, delay); + return TRUE; + } return FALSE; } diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c index 0b30a1d7bb47..6cb46cb378e5 100644 --- a/src/field_player_avatar.c +++ b/src/field_player_avatar.c @@ -6,6 +6,7 @@ #include "field_camera.h" #include "field_effect.h" #include "field_effect_helpers.h" +#include "field_screen_effect.h" #include "field_player_avatar.h" #include "fieldmap.h" #include "menu.h" @@ -92,6 +93,8 @@ static bool8 PlayerAnimIsMultiFrameStationaryAndStateNotTurning(void); static bool8 PlayerIsAnimActive(void); static bool8 PlayerCheckIfAnimFinishedOrInactive(void); +static void PlayerWalkSlow(u8 direction); +static void PlayerRunSlow(u8 direction); static void PlayerRun(u8); static void PlayerNotOnBikeCollide(u8); static void PlayerNotOnBikeCollideWithFarawayIslandMew(u8); @@ -456,7 +459,22 @@ static bool8 ForcedMovement_None(void) static bool8 DoForcedMovement(u8 direction, void (*moveFunc)(u8)) { struct PlayerAvatar *playerAvatar = &gPlayerAvatar; - u8 collision = CheckForPlayerAvatarCollision(direction); + u8 collision; + + // Check for sideways stairs onto ice movement. + switch (direction) + { + case DIR_NORTHWEST: + case DIR_SOUTHWEST: + direction = DIR_WEST; + break; + case DIR_NORTHEAST: + case DIR_SOUTHEAST: + direction = DIR_EAST; + break; + } + + collision = CheckForPlayerAvatarCollision(direction); playerAvatar->flags |= PLAYER_AVATAR_FLAG_FORCED_MOVE; if (collision) @@ -634,6 +652,10 @@ static void PlayerNotOnBikeMoving(u8 direction, u16 heldKeys) PlayerNotOnBikeCollideWithFarawayIslandMew(direction); return; } + else if (collision == COLLISION_STAIR_WARP) + { + PlayerFaceDirection(direction); + } else { u8 adjustedCollision = collision - COLLISION_STOP_SURFING; @@ -653,13 +675,20 @@ static void PlayerNotOnBikeMoving(u8 direction, u16 heldKeys) if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_UNDERWATER) && (heldKeys & B_BUTTON) && FlagGet(FLAG_SYS_B_DASH) && IsRunningDisallowed(gObjectEvents[gPlayerAvatar.objectEventId].currentMetatileBehavior) == 0) { - PlayerRun(direction); + if (ObjectMovingOnRockStairs(&gObjectEvents[gPlayerAvatar.objectEventId], direction)) + PlayerRunSlow(direction); + else + PlayerRun(direction); + gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_DASH; return; } else { - PlayerWalkNormal(direction); + if (ObjectMovingOnRockStairs(&gObjectEvents[gPlayerAvatar.objectEventId], direction)) + PlayerWalkSlow(direction); + else + PlayerWalkNormal(direction); } } @@ -670,6 +699,9 @@ static u8 CheckForPlayerAvatarCollision(u8 direction) x = playerObjEvent->currentCoords.x; y = playerObjEvent->currentCoords.y; + if (IsDirectionalStairWarpMetatileBehavior(MapGridGetMetatileBehaviorAt(x, y), direction)) + return COLLISION_STAIR_WARP; + MoveCoords(direction, &x, &y); return CheckForObjectEventCollision(playerObjEvent, x, y, direction, MapGridGetMetatileBehaviorAt(x, y)); } @@ -688,6 +720,7 @@ static u8 CheckForPlayerAvatarStaticCollision(u8 direction) u8 CheckForObjectEventCollision(struct ObjectEvent *objectEvent, s16 x, s16 y, u8 direction, u8 metatileBehavior) { u8 collision = GetCollisionAtCoords(objectEvent, x, y, direction); + if (collision == COLLISION_ELEVATION_MISMATCH && CanStopSurfing(x, y, direction)) return COLLISION_STOP_SURFING; @@ -705,6 +738,7 @@ u8 CheckForObjectEventCollision(struct ObjectEvent *objectEvent, s16 x, s16 y, u return COLLISION_ROTATING_GATE; CheckAcroBikeCollision(x, y, metatileBehavior, &collision); } + return collision; } @@ -967,6 +1001,17 @@ void PlayerSetAnimId(u8 movementActionId, u8 copyableMovement) } } +// slow +static void PlayerWalkSlow(u8 direction) +{ + PlayerSetAnimId(GetWalkSlowMovementAction(direction), 2); +} +static void PlayerRunSlow(u8 direction) +{ + PlayerSetAnimId(GetPlayerRunSlowMovementAction(direction), 2); +} + +// normal speed (1 speed) void PlayerWalkNormal(u8 direction) { PlayerSetAnimId(GetWalkNormalMovementAction(direction), COPY_MOVE_WALK); @@ -1628,7 +1673,7 @@ static void CreateStopSurfingTask(u8 direction) LockPlayerFieldControls(); Overworld_ClearSavedMusic(); Overworld_ChangeMusicToDefault(); - gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_SURFING; + gPlayerAvatar.flags ^= PLAYER_AVATAR_FLAG_SURFING; gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_ON_FOOT; gPlayerAvatar.preventStep = TRUE; taskId = CreateTask(Task_StopSurfingInit, 0xFF); @@ -2422,3 +2467,69 @@ static u8 TrySpinPlayerForWarp(struct ObjectEvent *object, s16 *delayTimer) *delayTimer = 0; return sSpinDirections[object->facingDirection]; } + +//sideways stairs +u8 GetRightSideStairsDirection(u8 direction) +{ + switch (direction) + { + case DIR_WEST: + return DIR_NORTHWEST; + case DIR_EAST: + return DIR_SOUTHEAST; + default: + if (direction > DIR_EAST) + direction -= DIR_EAST; + return direction; + } +} + +u8 GetLeftSideStairsDirection(u8 direction) +{ + switch (direction) + { + case DIR_WEST: + return DIR_SOUTHWEST; + case DIR_EAST: + return DIR_NORTHEAST; + default: + if (direction > DIR_EAST) + direction -= DIR_EAST; + return direction; + } +} + +bool8 ObjectMovingOnRockStairs(struct ObjectEvent *objectEvent, u8 direction) +{ + #if SLOW_MOVEMENT_ON_STAIRS == TRUE + s16 x = objectEvent->currentCoords.x; + s16 y = objectEvent->currentCoords.y; + + // TODO followers on sideways stairs + if (IsFollowerVisible() && GetFollowerObject() != NULL && (objectEvent->isPlayer || objectEvent->localId == OBJ_EVENT_ID_FOLLOWER)) + return FALSE; + + switch (direction) + { + case DIR_NORTH: + return MetatileBehavior_IsRockStairs(MapGridGetMetatileBehaviorAt(x,y)); + case DIR_SOUTH: + MoveCoords(DIR_SOUTH, &x, &y); + return MetatileBehavior_IsRockStairs(MapGridGetMetatileBehaviorAt(x,y)); + case DIR_WEST: + case DIR_EAST: + case DIR_NORTHEAST: + case DIR_NORTHWEST: + case DIR_SOUTHWEST: + case DIR_SOUTHEAST: + // directionOverwrite is only used for sideways stairs motion + if (objectEvent->directionOverwrite) + return TRUE; + default: + return FALSE; + } + #else + return FALSE; + #endif +} + diff --git a/src/field_screen_effect.c b/src/field_screen_effect.c index e39a0c6c1f78..073c92f3e09e 100644 --- a/src/field_screen_effect.c +++ b/src/field_screen_effect.c @@ -51,6 +51,14 @@ static void Task_WarpAndLoadMap(u8 taskId); static void Task_DoDoorWarp(u8 taskId); static void Task_EnableScriptAfterMusicFade(u8 taskId); +static void ExitStairsMovement(s16*, s16*, s16*, s16*, s16*); +static void GetStairsMovementDirection(u32, s16*, s16*); +static void Task_ExitStairs(u8); +static bool8 WaitStairExitMovementFinished(s16*, s16*, s16*, s16*, s16*); +static void UpdateStairsMovement(s16, s16, s16*, s16*, s16*); +static void Task_StairWarp(u8); +static void ForceStairsMovement(u32, s16*, s16*); + // data[0] is used universally by tasks in this file as a state for switches #define tState data[0] @@ -268,10 +276,14 @@ static void SetUpWarpExitTask(void) behavior = MapGridGetMetatileBehaviorAt(x, y); if (MetatileBehavior_IsDoor(behavior) == TRUE) func = Task_ExitDoor; + else if (MetatileBehavior_IsDirectionalStairWarp(behavior) == TRUE && !gExitStairsMovementDisabled) + func = Task_ExitStairs; else if (MetatileBehavior_IsNonAnimDoor(behavior) == TRUE) func = Task_ExitNonAnimDoor; else func = Task_ExitNonDoor; + + gExitStairsMovementDisabled = FALSE; CreateTask(func, 10); } @@ -1388,3 +1400,237 @@ void FieldCB_RushInjuredPokemonToCenter(void) taskId = CreateTask(Task_RushInjuredPokemonToCenter, 10); gTasks[taskId].tState = FRLG_WHITEOUT_ENTER_MSG_SCREEN; } + +static void GetStairsMovementDirection(u32 metatileBehavior, s16 *speedX, s16 *speedY) +{ + if (MetatileBehavior_IsDirectionalUpRightStairWarp(metatileBehavior)) + { + *speedX = 16; + *speedY = -10; + } + else if (MetatileBehavior_IsDirectionalUpLeftStairWarp(metatileBehavior)) + { + *speedX = -17; + *speedY = -10; + } + else if (MetatileBehavior_IsDirectionalDownRightStairWarp(metatileBehavior)) + { + *speedX = 17; + *speedY = 3; + } + else if (MetatileBehavior_IsDirectionalDownLeftStairWarp(metatileBehavior)) + { + *speedX = -17; + *speedY = 3; + } + else + { + *speedX = 0; + *speedY = 0; + } +} + +static bool8 WaitStairExitMovementFinished(s16 *speedX, s16 *speedY, s16 *offsetX, s16 *offsetY, s16 *timer) +{ + struct Sprite *sprite = &gSprites[gPlayerAvatar.spriteId]; + if (*timer != 0) + { + *offsetX += *speedX; + *offsetY += *speedY; + sprite->x2 = *offsetX >> 5; + sprite->y2 = *offsetY >> 5; + (*timer)--; + return TRUE; + } + else + { + sprite->x2 = 0; + sprite->y2 = 0; + return FALSE; + } +} + +static void ExitStairsMovement(s16 *speedX, s16 *speedY, s16 *offsetX, s16 *offsetY, s16 *timer) +{ + s16 x, y; + u32 metatileBehavior; + s32 direction; + struct Sprite *sprite; + + PlayerGetDestCoords(&x, &y); + metatileBehavior = MapGridGetMetatileBehaviorAt(x, y); + if (MetatileBehavior_IsDirectionalDownRightStairWarp(metatileBehavior) || MetatileBehavior_IsDirectionalUpRightStairWarp(metatileBehavior)) + direction = DIR_WEST; + else + direction = DIR_EAST; + + ObjectEventForceSetHeldMovement(&gObjectEvents[gPlayerAvatar.objectEventId], GetWalkInPlaceSlowMovementAction(direction)); + GetStairsMovementDirection(metatileBehavior, speedX, speedY); + *offsetX = *speedX * 16; + *offsetY = *speedY * 16; + *timer = 16; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->x2 = *offsetX >> 5; + sprite->y2 = *offsetY >> 5; + *speedX *= -1; + *speedY *= -1; +} + +#define tState data[0] +#define tSpeedX data[1] +#define tSpeedY data[2] +#define tOffsetX data[3] +#define tOffsetY data[4] +#define tTimer data[5] + +static void Task_ExitStairs(u8 taskId) +{ + s16 * data = gTasks[taskId].data; + switch (tState) + { + default: + if (WaitForWeatherFadeIn() == TRUE) + { + CameraObjectReset(); + UnlockPlayerFieldControls(); + DestroyTask(taskId); + } + break; + case 0: + Overworld_PlaySpecialMapMusic(); + WarpFadeInScreen(); + LockPlayerFieldControls(); + ExitStairsMovement(&tSpeedX, &tSpeedY, &tOffsetX, &tOffsetY, &tTimer); + tState++; + break; + case 1: + if (!WaitStairExitMovementFinished(&tSpeedX, &tSpeedY, &tOffsetX, &tOffsetY, &tTimer)) + tState++; + break; + } +} + +static void ForceStairsMovement(u32 metatileBehavior, s16 *speedX, s16 *speedY) +{ + ObjectEventForceSetHeldMovement(&gObjectEvents[gPlayerAvatar.objectEventId], GetWalkInPlaceNormalMovementAction(GetPlayerFacingDirection())); + GetStairsMovementDirection(metatileBehavior, speedX, speedY); +} +#undef tSpeedX +#undef tSpeedY +#undef tOffsetX +#undef tOffsetY +#undef tTimer + +#define tMetatileBehavior data[1] +#define tSpeedX data[2] +#define tSpeedY data[3] +#define tOffsetX data[4] +#define tOffsetY data[5] +#define tTimer data[6] +#define tDelay data[15] + +static void UpdateStairsMovement(s16 speedX, s16 speedY, s16 *offsetX, s16 *offsetY, s16 *timer) +{ + struct Sprite *playerSprite = &gSprites[gPlayerAvatar.spriteId]; + struct ObjectEvent *playerObjectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; + + if (speedY > 0 || *timer > 6) + *offsetY += speedY; + + *offsetX += speedX; + (*timer)++; + playerSprite->x2 = *offsetX >> 5; + playerSprite->y2 = *offsetY >> 5; + if (playerObjectEvent->heldMovementFinished) + ObjectEventForceSetHeldMovement(playerObjectEvent, GetWalkInPlaceNormalMovementAction(GetPlayerFacingDirection())); +} + +static void Task_StairWarp(u8 taskId) +{ + s16 * data = gTasks[taskId].data; + struct ObjectEvent *playerObjectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; + struct Sprite *playerSprite = &gSprites[gPlayerAvatar.spriteId]; + + switch (tState) + { + case 0: + LockPlayerFieldControls(); + FreezeObjectEvents(); + CameraObjectFreeze(); + tState++; + break; + case 1: + if (!ObjectEventIsMovementOverridden(playerObjectEvent) || ObjectEventClearHeldMovementIfFinished(playerObjectEvent)) + { + if (tDelay != 0) + { + tDelay--; + } + else + { + TryFadeOutOldMapMusic(); + PlayRainStoppingSoundEffect(); + playerSprite->oam.priority = 1; + ForceStairsMovement(tMetatileBehavior, &tSpeedX, &tSpeedY); + PlaySE(SE_EXIT); + tState++; + } + } + break; + case 2: + UpdateStairsMovement(tSpeedX, tSpeedY, &tOffsetX, &tOffsetY, &tTimer); + tDelay++; + if (tDelay >= 12) + { + WarpFadeOutScreen(); + tState++; + } + break; + case 3: + UpdateStairsMovement(tSpeedX, tSpeedY, &tOffsetX, &tOffsetY, &tTimer); + if (!PaletteFadeActive() && BGMusicStopped()) + tState++; + break; + default: + gFieldCallback = FieldCB_DefaultWarpExit; + WarpIntoMap(); + SetMainCallback2(CB2_LoadMap); + DestroyTask(taskId); + break; + } +} + +void DoStairWarp(u16 metatileBehavior, u16 delay) +{ + u8 taskId = CreateTask(Task_StairWarp, 10); + gTasks[taskId].tMetatileBehavior = metatileBehavior; + gTasks[taskId].tDelay = delay; + Task_StairWarp(taskId); +} + +#undef tMetatileBehavior +#undef tSpeedX +#undef tSpeedY +#undef tOffsetX +#undef tOffsetY +#undef tTimer +#undef tDelay + +bool32 IsDirectionalStairWarpMetatileBehavior(u16 metatileBehavior, u8 playerDirection) +{ + if (playerDirection == DIR_WEST) + { + if (MetatileBehavior_IsDirectionalUpLeftStairWarp(metatileBehavior)) + return TRUE; + if (MetatileBehavior_IsDirectionalDownLeftStairWarp(metatileBehavior)) + return TRUE; + } + else if (playerDirection == DIR_EAST) + { + if (MetatileBehavior_IsDirectionalUpRightStairWarp(metatileBehavior)) + return TRUE; + if (MetatileBehavior_IsDirectionalDownRightStairWarp(metatileBehavior)) + return TRUE; + } + return FALSE; +} diff --git a/src/graphics.c b/src/graphics.c index 231aec415824..5aafa8ae4591 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1263,6 +1263,9 @@ const u32 gBattleAnimSpriteGfx_XSign[] = INCBIN_U32("graphics/battle_anims/sprit const u32 gBattleAnimSpriteGfx_BluegreenOrb[] = INCBIN_U32("graphics/battle_anims/sprites/bluegreen_orb.4bpp.lz"); const u32 gBattleAnimSpritePal_BluegreenOrb[] = INCBIN_U32("graphics/battle_anims/sprites/bluegreen_orb.gbapal.lz"); +const u32 gBattleAnimSpriteGfx_PinkVioletOrb[] = INCBIN_U32("graphics/battle_anims/sprites/pinkvio_orb.4bpp.lz"); +const u32 gBattleAnimSpritePal_PinkVioletOrb[] = INCBIN_U32("graphics/battle_anims/sprites/pinkvio_orb.gbapal.lz"); + const u32 gBattleAnimSpriteGfx_PawPrint[] = INCBIN_U32("graphics/battle_anims/sprites/paw_print.4bpp.lz"); const u32 gBattleAnimSpritePal_PawPrint[] = INCBIN_U32("graphics/battle_anims/sprites/paw_print.gbapal.lz"); diff --git a/src/heal_location.c b/src/heal_location.c index 7193ea338e10..17439258850e 100644 --- a/src/heal_location.c +++ b/src/heal_location.c @@ -34,9 +34,9 @@ u32 GetHealLocationIndexByWarpData(struct WarpData *warp) u32 i; for (i = 0; i < ARRAY_COUNT(sHealLocations); i++) { - if (sHealLocations[i].group == warp->mapGroup - && sHealLocations[i].map == warp->mapNum - && sHealLocations[i].x == warp->x + if (sHealLocations[i].group == warp->mapGroup + && sHealLocations[i].map == warp->mapNum + && sHealLocations[i].x == warp->x && sHealLocations[i].y == warp->y) return i + 1; } @@ -89,7 +89,7 @@ void SetWhiteoutRespawnWarpAndHealerNPC(struct WarpData *warp) u32 healLocationId = GetHealLocationIndexByWarpData(&gSaveBlock1Ptr->lastHealLocation); u32 healNpcLocalId = GetHealNpcLocalId(healLocationId); struct HealLocation pkmCenterHealLocation; - + if (!healNpcLocalId) { *(warp) = gSaveBlock1Ptr->lastHealLocation; diff --git a/src/item_use.c b/src/item_use.c index fd74b7082b03..c04d9b99114f 100644 --- a/src/item_use.c +++ b/src/item_use.c @@ -1284,7 +1284,7 @@ void ItemUseInBattle_BagMenu(u8 taskId) else { PlaySE(SE_SELECT); - if (!(B_TRY_CATCH_TRAINER_BALL >= GEN_4 && (ItemId_GetBattleUsage(gSpecialVar_ItemId) == EFFECT_ITEM_THROW_BALL) && (gBattleTypeFlags & BATTLE_TYPE_TRAINER))) + if (!ItemId_GetImportance(gSpecialVar_ItemId) && !(B_TRY_CATCH_TRAINER_BALL >= GEN_4 && (ItemId_GetBattleUsage(gSpecialVar_ItemId) == EFFECT_ITEM_THROW_BALL) && (gBattleTypeFlags & BATTLE_TYPE_TRAINER))) RemoveUsedItem(); ScheduleBgCopyTilemapToVram(2); if (!InBattlePyramid()) @@ -1491,7 +1491,7 @@ void FieldUseFunc_VsSeeker(u8 taskId) SetUpItemUseOnFieldCallback(taskId); } else - DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[3]); + DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].tUsingRegisteredKeyItem); } void Task_ItemUse_CloseMessageBoxAndReturnToField_VsSeeker(u8 taskId) @@ -1499,4 +1499,63 @@ void Task_ItemUse_CloseMessageBoxAndReturnToField_VsSeeker(u8 taskId) Task_CloseCantUseKeyItemMessage(taskId); } +static void Task_DisplayPokeFluteMessage(u8 taskId) +{ + if (WaitFanfare(FALSE)) + { + if (gTasks[taskId].data[3] == 0) + DisplayItemMessage(taskId, FONT_NORMAL, gText_PokeFluteAwakenedMon, CloseItemMessage); + else + DisplayItemMessageOnField(taskId, gText_PokeFluteAwakenedMon, Task_CloseCantUseKeyItemMessage); + } +} + +static void Task_PlayPokeFlute(u8 taskId) +{ + PlayFanfareByFanfareNum(FANFARE_RG_POKE_FLUTE); + gTasks[taskId].func = Task_DisplayPokeFluteMessage; +} + +void ItemUseOutOfBattle_PokeFlute(u8 taskId) +{ + bool32 wokeSomeoneUp = FALSE; + u32 i; + + for (i = 0; i < CalculatePlayerPartyCount(); i++) + { + if (!ExecuteTableBasedItemEffect(&gPlayerParty[i], ITEM_AWAKENING, i, 0)) + wokeSomeoneUp = TRUE; + } + + if (wokeSomeoneUp) + { + if (gTasks[taskId].data[3] == 0) + DisplayItemMessage(taskId, FONT_NORMAL, gText_PlayedPokeFlute, Task_PlayPokeFlute); + else + DisplayItemMessageOnField(taskId, gText_PlayedPokeFlute, Task_PlayPokeFlute); + } + else + { + if (gTasks[taskId].data[3] == 0) + DisplayItemMessage(taskId, FONT_NORMAL, gText_PlayedPokeFluteCatchy, CloseItemMessage); + else + DisplayItemMessageOnField(taskId, gText_PlayedPokeFluteCatchy, Task_CloseCantUseKeyItemMessage); + } +} + +static void ItemUseOnFieldCB_TownMap(u8 taskId) +{ + LockPlayerFieldControls(); + ScriptContext_SetupScript(EventScript_RegionMap); + DestroyTask(taskId); +} + +void ItemUseOutOfBattle_TownMap(u8 taskId) +{ + sItemUseOnFieldCB = ItemUseOnFieldCB_TownMap; + gFieldCallback = FieldCB_UseItemOnField; + gBagMenu->newScreenCallback = CB2_ReturnToField; + Task_FadeAndCloseBagMenu(taskId); +} + #undef tUsingRegisteredKeyItem diff --git a/src/link.c b/src/link.c index f784a36c679a..a78e69260aab 100644 --- a/src/link.c +++ b/src/link.c @@ -2367,3 +2367,17 @@ void ResetRecvBuffer(void) } } } + +bool32 ShouldCheckForUnionRoom(void) +{ + if (OW_UNION_DISABLE_CHECK) + return FALSE; + + if (OW_FLAG_MOVE_UNION_ROOM_CHECK == 0) + return TRUE; + + if (FlagGet(OW_FLAG_MOVE_UNION_ROOM_CHECK)) + return TRUE; + + return FALSE; +} diff --git a/src/map_name_popup.c b/src/map_name_popup.c index 5cc1f3cfd5d9..500d45e866a3 100644 --- a/src/map_name_popup.c +++ b/src/map_name_popup.c @@ -625,7 +625,7 @@ static void LoadMapNamePopUpWindowBg(void) switch (popUpThemeId) { // add additional gen 5-style pop-up themes as cases here - case MAPPOPUP_THEME_BW_DEFAULT: + default: // MAPPOPUP_THEME_BW_DEFAULT if (OW_POPUP_BW_COLOR == OW_POPUP_BW_COLOR_WHITE) LoadPalette(sMapPopUpTilesPalette_BW_White, BG_PLTT_ID(14), sizeof(sMapPopUpTilesPalette_BW_White)); else diff --git a/src/metatile_behavior.c b/src/metatile_behavior.c index 8923e633da85..e432827f31ff 100644 --- a/src/metatile_behavior.c +++ b/src/metatile_behavior.c @@ -8,126 +8,131 @@ static const u8 sTileBitAttributes[NUM_METATILE_BEHAVIORS] = { - [MB_NORMAL] = TILE_FLAG_UNUSED, - [MB_TALL_GRASS] = TILE_FLAG_UNUSED | TILE_FLAG_HAS_ENCOUNTERS, - [MB_LONG_GRASS] = TILE_FLAG_UNUSED | TILE_FLAG_HAS_ENCOUNTERS, - [MB_UNUSED_05] = TILE_FLAG_HAS_ENCOUNTERS, - [MB_DEEP_SAND] = TILE_FLAG_UNUSED | TILE_FLAG_HAS_ENCOUNTERS, - [MB_SHORT_GRASS] = TILE_FLAG_UNUSED, - [MB_CAVE] = TILE_FLAG_UNUSED | TILE_FLAG_HAS_ENCOUNTERS, - [MB_LONG_GRASS_SOUTH_EDGE] = TILE_FLAG_UNUSED, - [MB_NO_RUNNING] = TILE_FLAG_UNUSED, - [MB_INDOOR_ENCOUNTER] = TILE_FLAG_UNUSED | TILE_FLAG_HAS_ENCOUNTERS, - [MB_MOUNTAIN_TOP] = TILE_FLAG_UNUSED, - [MB_BATTLE_PYRAMID_WARP] = TILE_FLAG_UNUSED, - [MB_MOSSDEEP_GYM_WARP] = TILE_FLAG_UNUSED, - [MB_MT_PYRE_HOLE] = TILE_FLAG_UNUSED, - [MB_POND_WATER] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE | TILE_FLAG_HAS_ENCOUNTERS, - [MB_INTERIOR_DEEP_WATER] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE | TILE_FLAG_HAS_ENCOUNTERS, - [MB_DEEP_WATER] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE | TILE_FLAG_HAS_ENCOUNTERS, - [MB_WATERFALL] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE, - [MB_SOOTOPOLIS_DEEP_WATER] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE, - [MB_OCEAN_WATER] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE | TILE_FLAG_HAS_ENCOUNTERS, - [MB_PUDDLE] = TILE_FLAG_UNUSED, - [MB_SHALLOW_WATER] = TILE_FLAG_UNUSED, - [MB_NO_SURFACING] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE, - [MB_STAIRS_OUTSIDE_ABANDONED_SHIP] = TILE_FLAG_UNUSED, - [MB_SHOAL_CAVE_ENTRANCE] = TILE_FLAG_UNUSED, - [MB_ICE] = TILE_FLAG_UNUSED, - [MB_SAND] = TILE_FLAG_UNUSED, - [MB_SEAWEED] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE | TILE_FLAG_HAS_ENCOUNTERS, - [MB_UNUSED_23] = TILE_FLAG_UNUSED, - [MB_ASHGRASS] = TILE_FLAG_UNUSED | TILE_FLAG_HAS_ENCOUNTERS, - [MB_FOOTPRINTS] = TILE_FLAG_UNUSED | TILE_FLAG_HAS_ENCOUNTERS, - [MB_THIN_ICE] = TILE_FLAG_UNUSED, - [MB_CRACKED_ICE] = TILE_FLAG_UNUSED, - [MB_HOT_SPRINGS] = TILE_FLAG_UNUSED, - [MB_LAVARIDGE_GYM_B1F_WARP] = TILE_FLAG_UNUSED, - [MB_SEAWEED_NO_SURFACING] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE | TILE_FLAG_HAS_ENCOUNTERS, - [MB_REFLECTION_UNDER_BRIDGE] = TILE_FLAG_UNUSED, - [MB_IMPASSABLE_EAST] = TILE_FLAG_UNUSED, - [MB_IMPASSABLE_WEST] = TILE_FLAG_UNUSED, - [MB_IMPASSABLE_NORTH] = TILE_FLAG_UNUSED, - [MB_IMPASSABLE_SOUTH] = TILE_FLAG_UNUSED, - [MB_IMPASSABLE_NORTHEAST] = TILE_FLAG_UNUSED, - [MB_IMPASSABLE_NORTHWEST] = TILE_FLAG_UNUSED, - [MB_IMPASSABLE_SOUTHEAST] = TILE_FLAG_UNUSED, - [MB_IMPASSABLE_SOUTHWEST] = TILE_FLAG_UNUSED, - [MB_JUMP_NORTHEAST] = TILE_FLAG_UNUSED, - [MB_JUMP_NORTHWEST] = TILE_FLAG_UNUSED, - [MB_JUMP_SOUTHEAST] = TILE_FLAG_UNUSED, - [MB_JUMP_SOUTHWEST] = TILE_FLAG_UNUSED, - [MB_WALK_EAST] = TILE_FLAG_UNUSED, - [MB_WALK_WEST] = TILE_FLAG_UNUSED, - [MB_WALK_NORTH] = TILE_FLAG_UNUSED, - [MB_WALK_SOUTH] = TILE_FLAG_UNUSED, - [MB_SLIDE_EAST] = TILE_FLAG_UNUSED, - [MB_SLIDE_WEST] = TILE_FLAG_UNUSED, - [MB_SLIDE_NORTH] = TILE_FLAG_UNUSED, - [MB_SLIDE_SOUTH] = TILE_FLAG_UNUSED, - [MB_TRICK_HOUSE_PUZZLE_8_FLOOR] = TILE_FLAG_UNUSED, - [MB_UNUSED_49] = TILE_FLAG_UNUSED, - [MB_UNUSED_4A] = TILE_FLAG_UNUSED, - [MB_EASTWARD_CURRENT] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE, - [MB_WESTWARD_CURRENT] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE, - [MB_NORTHWARD_CURRENT] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE, - [MB_SOUTHWARD_CURRENT] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE, - [MB_NON_ANIMATED_DOOR] = TILE_FLAG_UNUSED, - [MB_LADDER] = TILE_FLAG_UNUSED, - [MB_EAST_ARROW_WARP] = TILE_FLAG_UNUSED, - [MB_WEST_ARROW_WARP] = TILE_FLAG_UNUSED, - [MB_NORTH_ARROW_WARP] = TILE_FLAG_UNUSED, - [MB_SOUTH_ARROW_WARP] = TILE_FLAG_UNUSED, - [MB_CRACKED_FLOOR_HOLE] = TILE_FLAG_UNUSED, - [MB_AQUA_HIDEOUT_WARP] = TILE_FLAG_UNUSED, - [MB_LAVARIDGE_GYM_1F_WARP] = TILE_FLAG_UNUSED, - [MB_ANIMATED_DOOR] = TILE_FLAG_UNUSED, - [MB_UP_ESCALATOR] = TILE_FLAG_UNUSED, - [MB_DOWN_ESCALATOR] = TILE_FLAG_UNUSED, - [MB_WATER_DOOR] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE, - [MB_WATER_SOUTH_ARROW_WARP] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE, - [MB_DEEP_SOUTH_WARP] = TILE_FLAG_UNUSED, - [MB_UNUSED_6F] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE, - [MB_BRIDGE_OVER_POND_LOW] = TILE_FLAG_UNUSED, - [MB_BRIDGE_OVER_POND_MED] = TILE_FLAG_UNUSED, - [MB_BRIDGE_OVER_POND_HIGH] = TILE_FLAG_UNUSED, - [MB_PACIFIDLOG_VERTICAL_LOG_TOP] = TILE_FLAG_UNUSED, - [MB_PACIFIDLOG_VERTICAL_LOG_BOTTOM] = TILE_FLAG_UNUSED, - [MB_PACIFIDLOG_HORIZONTAL_LOG_LEFT] = TILE_FLAG_UNUSED, - [MB_PACIFIDLOG_HORIZONTAL_LOG_RIGHT] = TILE_FLAG_UNUSED, - [MB_FORTREE_BRIDGE] = TILE_FLAG_UNUSED, - [MB_BRIDGE_OVER_POND_MED_EDGE_1] = TILE_FLAG_UNUSED, - [MB_BRIDGE_OVER_POND_MED_EDGE_2] = TILE_FLAG_UNUSED, - [MB_BRIDGE_OVER_POND_HIGH_EDGE_1] = TILE_FLAG_UNUSED, - [MB_BRIDGE_OVER_POND_HIGH_EDGE_2] = TILE_FLAG_UNUSED, - [MB_UNUSED_BRIDGE] = TILE_FLAG_UNUSED, - [MB_BIKE_BRIDGE_OVER_BARRIER] = TILE_FLAG_UNUSED, - [MB_SECRET_BASE_SCENERY] = TILE_FLAG_UNUSED, - [MB_SECRET_BASE_TRAINER_SPOT] = TILE_FLAG_UNUSED, - [MB_HOLDS_SMALL_DECORATION] = TILE_FLAG_UNUSED, - [MB_SECRET_BASE_BALLOON] = TILE_FLAG_UNUSED, - [MB_SECRET_BASE_IMPASSABLE] = TILE_FLAG_UNUSED, - [MB_SECRET_BASE_GLITTER_MAT] = TILE_FLAG_UNUSED, - [MB_SECRET_BASE_JUMP_MAT] = TILE_FLAG_UNUSED, - [MB_SECRET_BASE_SPIN_MAT] = TILE_FLAG_UNUSED, - [MB_SECRET_BASE_SOUND_MAT] = TILE_FLAG_UNUSED, - [MB_SECRET_BASE_BREAKABLE_DOOR] = TILE_FLAG_UNUSED, - [MB_IMPASSABLE_SOUTH_AND_NORTH] = TILE_FLAG_UNUSED, - [MB_IMPASSABLE_WEST_AND_EAST] = TILE_FLAG_UNUSED, - [MB_SECRET_BASE_HOLE] = TILE_FLAG_UNUSED, - [MB_HOLDS_LARGE_DECORATION] = TILE_FLAG_UNUSED, - [MB_SECRET_BASE_TV_SHIELD] = TILE_FLAG_UNUSED, - [MB_PLAYER_ROOM_PC_ON] = TILE_FLAG_UNUSED, - [MB_MUDDY_SLOPE] = TILE_FLAG_UNUSED, - [MB_BUMPY_SLOPE] = TILE_FLAG_UNUSED, - [MB_CRACKED_FLOOR] = TILE_FLAG_UNUSED, - [MB_ISOLATED_VERTICAL_RAIL] = TILE_FLAG_UNUSED, - [MB_ISOLATED_HORIZONTAL_RAIL] = TILE_FLAG_UNUSED, - [MB_VERTICAL_RAIL] = TILE_FLAG_UNUSED, - [MB_HORIZONTAL_RAIL] = TILE_FLAG_UNUSED, - [MB_SIGNPOST] = TILE_FLAG_UNUSED, - [MB_POKEMON_CENTER_SIGN] = TILE_FLAG_UNUSED, - [MB_POKEMART_SIGN] = TILE_FLAG_UNUSED, + [MB_NORMAL] = TILE_FLAG_UNUSED, + [MB_TALL_GRASS] = TILE_FLAG_UNUSED | TILE_FLAG_HAS_ENCOUNTERS, + [MB_LONG_GRASS] = TILE_FLAG_UNUSED | TILE_FLAG_HAS_ENCOUNTERS, + [MB_UNUSED_05] = TILE_FLAG_HAS_ENCOUNTERS, + [MB_DEEP_SAND] = TILE_FLAG_UNUSED | TILE_FLAG_HAS_ENCOUNTERS, + [MB_SHORT_GRASS] = TILE_FLAG_UNUSED, + [MB_CAVE] = TILE_FLAG_UNUSED | TILE_FLAG_HAS_ENCOUNTERS, + [MB_LONG_GRASS_SOUTH_EDGE] = TILE_FLAG_UNUSED, + [MB_NO_RUNNING] = TILE_FLAG_UNUSED, + [MB_INDOOR_ENCOUNTER] = TILE_FLAG_UNUSED | TILE_FLAG_HAS_ENCOUNTERS, + [MB_MOUNTAIN_TOP] = TILE_FLAG_UNUSED, + [MB_BATTLE_PYRAMID_WARP] = TILE_FLAG_UNUSED, + [MB_MOSSDEEP_GYM_WARP] = TILE_FLAG_UNUSED, + [MB_MT_PYRE_HOLE] = TILE_FLAG_UNUSED, + [MB_POND_WATER] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE | TILE_FLAG_HAS_ENCOUNTERS, + [MB_INTERIOR_DEEP_WATER] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE | TILE_FLAG_HAS_ENCOUNTERS, + [MB_DEEP_WATER] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE | TILE_FLAG_HAS_ENCOUNTERS, + [MB_WATERFALL] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE, + [MB_SOOTOPOLIS_DEEP_WATER] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE, + [MB_OCEAN_WATER] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE | TILE_FLAG_HAS_ENCOUNTERS, + [MB_PUDDLE] = TILE_FLAG_UNUSED, + [MB_SHALLOW_WATER] = TILE_FLAG_UNUSED, + [MB_NO_SURFACING] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE, + [MB_STAIRS_OUTSIDE_ABANDONED_SHIP] = TILE_FLAG_UNUSED, + [MB_SHOAL_CAVE_ENTRANCE] = TILE_FLAG_UNUSED, + [MB_ICE] = TILE_FLAG_UNUSED, + [MB_SAND] = TILE_FLAG_UNUSED, + [MB_SEAWEED] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE | TILE_FLAG_HAS_ENCOUNTERS, + [MB_UNUSED_23] = TILE_FLAG_UNUSED, + [MB_ASHGRASS] = TILE_FLAG_UNUSED | TILE_FLAG_HAS_ENCOUNTERS, + [MB_FOOTPRINTS] = TILE_FLAG_UNUSED | TILE_FLAG_HAS_ENCOUNTERS, + [MB_THIN_ICE] = TILE_FLAG_UNUSED, + [MB_CRACKED_ICE] = TILE_FLAG_UNUSED, + [MB_HOT_SPRINGS] = TILE_FLAG_UNUSED, + [MB_LAVARIDGE_GYM_B1F_WARP] = TILE_FLAG_UNUSED, + [MB_SEAWEED_NO_SURFACING] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE | TILE_FLAG_HAS_ENCOUNTERS, + [MB_REFLECTION_UNDER_BRIDGE] = TILE_FLAG_UNUSED, + [MB_IMPASSABLE_EAST] = TILE_FLAG_UNUSED, + [MB_IMPASSABLE_WEST] = TILE_FLAG_UNUSED, + [MB_IMPASSABLE_NORTH] = TILE_FLAG_UNUSED, + [MB_IMPASSABLE_SOUTH] = TILE_FLAG_UNUSED, + [MB_IMPASSABLE_NORTHEAST] = TILE_FLAG_UNUSED, + [MB_IMPASSABLE_NORTHWEST] = TILE_FLAG_UNUSED, + [MB_IMPASSABLE_SOUTHEAST] = TILE_FLAG_UNUSED, + [MB_IMPASSABLE_SOUTHWEST] = TILE_FLAG_UNUSED, + [MB_JUMP_NORTHEAST] = TILE_FLAG_UNUSED, + [MB_JUMP_NORTHWEST] = TILE_FLAG_UNUSED, + [MB_JUMP_SOUTHEAST] = TILE_FLAG_UNUSED, + [MB_JUMP_SOUTHWEST] = TILE_FLAG_UNUSED, + [MB_WALK_EAST] = TILE_FLAG_UNUSED, + [MB_WALK_WEST] = TILE_FLAG_UNUSED, + [MB_WALK_NORTH] = TILE_FLAG_UNUSED, + [MB_WALK_SOUTH] = TILE_FLAG_UNUSED, + [MB_SLIDE_EAST] = TILE_FLAG_UNUSED, + [MB_SLIDE_WEST] = TILE_FLAG_UNUSED, + [MB_SLIDE_NORTH] = TILE_FLAG_UNUSED, + [MB_SLIDE_SOUTH] = TILE_FLAG_UNUSED, + [MB_TRICK_HOUSE_PUZZLE_8_FLOOR] = TILE_FLAG_UNUSED, + [MB_EASTWARD_CURRENT] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE, + [MB_WESTWARD_CURRENT] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE, + [MB_NORTHWARD_CURRENT] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE, + [MB_SOUTHWARD_CURRENT] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE, + [MB_NON_ANIMATED_DOOR] = TILE_FLAG_UNUSED, + [MB_LADDER] = TILE_FLAG_UNUSED, + [MB_EAST_ARROW_WARP] = TILE_FLAG_UNUSED, + [MB_WEST_ARROW_WARP] = TILE_FLAG_UNUSED, + [MB_NORTH_ARROW_WARP] = TILE_FLAG_UNUSED, + [MB_SOUTH_ARROW_WARP] = TILE_FLAG_UNUSED, + [MB_CRACKED_FLOOR_HOLE] = TILE_FLAG_UNUSED, + [MB_AQUA_HIDEOUT_WARP] = TILE_FLAG_UNUSED, + [MB_LAVARIDGE_GYM_1F_WARP] = TILE_FLAG_UNUSED, + [MB_ANIMATED_DOOR] = TILE_FLAG_UNUSED, + [MB_UP_ESCALATOR] = TILE_FLAG_UNUSED, + [MB_DOWN_ESCALATOR] = TILE_FLAG_UNUSED, + [MB_WATER_DOOR] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE, + [MB_WATER_SOUTH_ARROW_WARP] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE, + [MB_DEEP_SOUTH_WARP] = TILE_FLAG_UNUSED, + [MB_UNUSED_6F] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE, + [MB_BRIDGE_OVER_POND_LOW] = TILE_FLAG_UNUSED, + [MB_BRIDGE_OVER_POND_MED] = TILE_FLAG_UNUSED, + [MB_BRIDGE_OVER_POND_HIGH] = TILE_FLAG_UNUSED, + [MB_PACIFIDLOG_VERTICAL_LOG_TOP] = TILE_FLAG_UNUSED, + [MB_PACIFIDLOG_VERTICAL_LOG_BOTTOM] = TILE_FLAG_UNUSED, + [MB_PACIFIDLOG_HORIZONTAL_LOG_LEFT] = TILE_FLAG_UNUSED, + [MB_PACIFIDLOG_HORIZONTAL_LOG_RIGHT] = TILE_FLAG_UNUSED, + [MB_FORTREE_BRIDGE] = TILE_FLAG_UNUSED, + [MB_BRIDGE_OVER_POND_MED_EDGE_1] = TILE_FLAG_UNUSED, + [MB_BRIDGE_OVER_POND_MED_EDGE_2] = TILE_FLAG_UNUSED, + [MB_BRIDGE_OVER_POND_HIGH_EDGE_1] = TILE_FLAG_UNUSED, + [MB_BRIDGE_OVER_POND_HIGH_EDGE_2] = TILE_FLAG_UNUSED, + [MB_UNUSED_BRIDGE] = TILE_FLAG_UNUSED, + [MB_BIKE_BRIDGE_OVER_BARRIER] = TILE_FLAG_UNUSED, + [MB_SECRET_BASE_SCENERY] = TILE_FLAG_UNUSED, + [MB_SECRET_BASE_TRAINER_SPOT] = TILE_FLAG_UNUSED, + [MB_HOLDS_SMALL_DECORATION] = TILE_FLAG_UNUSED, + [MB_SECRET_BASE_BALLOON] = TILE_FLAG_UNUSED, + [MB_SECRET_BASE_IMPASSABLE] = TILE_FLAG_UNUSED, + [MB_SECRET_BASE_GLITTER_MAT] = TILE_FLAG_UNUSED, + [MB_SECRET_BASE_JUMP_MAT] = TILE_FLAG_UNUSED, + [MB_SECRET_BASE_SPIN_MAT] = TILE_FLAG_UNUSED, + [MB_SECRET_BASE_SOUND_MAT] = TILE_FLAG_UNUSED, + [MB_SECRET_BASE_BREAKABLE_DOOR] = TILE_FLAG_UNUSED, + [MB_IMPASSABLE_SOUTH_AND_NORTH] = TILE_FLAG_UNUSED, + [MB_IMPASSABLE_WEST_AND_EAST] = TILE_FLAG_UNUSED, + [MB_SECRET_BASE_HOLE] = TILE_FLAG_UNUSED, + [MB_HOLDS_LARGE_DECORATION] = TILE_FLAG_UNUSED, + [MB_SECRET_BASE_TV_SHIELD] = TILE_FLAG_UNUSED, + [MB_PLAYER_ROOM_PC_ON] = TILE_FLAG_UNUSED, + [MB_MUDDY_SLOPE] = TILE_FLAG_UNUSED, + [MB_BUMPY_SLOPE] = TILE_FLAG_UNUSED, + [MB_CRACKED_FLOOR] = TILE_FLAG_UNUSED, + [MB_ISOLATED_VERTICAL_RAIL] = TILE_FLAG_UNUSED, + [MB_ISOLATED_HORIZONTAL_RAIL] = TILE_FLAG_UNUSED, + [MB_VERTICAL_RAIL] = TILE_FLAG_UNUSED, + [MB_HORIZONTAL_RAIL] = TILE_FLAG_UNUSED, + [MB_SIGNPOST] = TILE_FLAG_UNUSED, + [MB_POKEMON_CENTER_SIGN] = TILE_FLAG_UNUSED, + [MB_POKEMART_SIGN] = TILE_FLAG_UNUSED, + [MB_SIDEWAYS_STAIRS_RIGHT_SIDE] = TILE_FLAG_UNUSED, + [MB_SIDEWAYS_STAIRS_LEFT_SIDE] = TILE_FLAG_UNUSED, + [MB_SIDEWAYS_STAIRS_RIGHT_SIDE_TOP] = TILE_FLAG_UNUSED, + [MB_SIDEWAYS_STAIRS_LEFT_SIDE_TOP] = TILE_FLAG_UNUSED, + [MB_SIDEWAYS_STAIRS_RIGHT_SIDE_BOTTOM] = TILE_FLAG_UNUSED, + [MB_SIDEWAYS_STAIRS_LEFT_SIDE_BOTTOM] = TILE_FLAG_UNUSED, + [MB_ROCK_STAIRS] = TILE_FLAG_UNUSED, }; bool8 MetatileBehavior_IsATile(u8 metatileBehavior) @@ -1404,17 +1409,136 @@ bool8 MetatileBehavior_IsTrainerHillTimer(u8 metatileBehavior) return FALSE; } -bool32 MetatileBehavior_IsSignpost(u32 metatileBehavior) +bool8 MetatileBehavior_IsDirectionalUpRightStairWarp(u8 metatileBehavior) +{ + if (metatileBehavior == MB_UP_RIGHT_STAIR_WARP) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsDirectionalUpLeftStairWarp(u8 metatileBehavior) +{ + if (metatileBehavior == MB_UP_LEFT_STAIR_WARP) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsDirectionalDownRightStairWarp(u8 metatileBehavior) +{ + if (metatileBehavior == MB_DOWN_RIGHT_STAIR_WARP) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsDirectionalDownLeftStairWarp(u8 metatileBehavior) +{ + if (metatileBehavior == MB_DOWN_LEFT_STAIR_WARP) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsDirectionalStairWarp(u8 metatileBehavior) +{ + if (metatileBehavior == MB_UP_RIGHT_STAIR_WARP + || metatileBehavior == MB_UP_LEFT_STAIR_WARP + || metatileBehavior == MB_DOWN_RIGHT_STAIR_WARP + || metatileBehavior == MB_DOWN_LEFT_STAIR_WARP) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSignpost(u32 metatileBehavior) { return (metatileBehavior == MB_SIGNPOST); } -bool32 MetatileBehavior_IsPokemonCenterSign(u32 metatileBehavior) +bool8 MetatileBehavior_IsPokemonCenterSign(u32 metatileBehavior) { return (metatileBehavior == MB_POKEMON_CENTER_SIGN); } -bool32 MetatileBehavior_IsPokeMartSign(u32 metatileBehavior) +bool8 MetatileBehavior_IsPokeMartSign(u32 metatileBehavior) { return (metatileBehavior == MB_POKEMART_SIGN); } + +bool8 MetatileBehavior_IsSidewaysStairsRightSide(u8 metatileBehavior) +{ + if (metatileBehavior == MB_SIDEWAYS_STAIRS_RIGHT_SIDE || metatileBehavior == MB_SIDEWAYS_STAIRS_RIGHT_SIDE_BOTTOM) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSidewaysStairsLeftSide(u8 metatileBehavior) +{ + if (metatileBehavior == MB_SIDEWAYS_STAIRS_LEFT_SIDE || metatileBehavior == MB_SIDEWAYS_STAIRS_LEFT_SIDE_BOTTOM) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSidewaysStairsRightSideTop(u8 metatileBehavior) +{ + if (metatileBehavior == MB_SIDEWAYS_STAIRS_RIGHT_SIDE_TOP) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSidewaysStairsLeftSideTop(u8 metatileBehavior) +{ + if (metatileBehavior == MB_SIDEWAYS_STAIRS_LEFT_SIDE_TOP) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSidewaysStairsRightSideBottom(u8 metatileBehavior) +{ + if (metatileBehavior == MB_SIDEWAYS_STAIRS_RIGHT_SIDE_BOTTOM) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSidewaysStairsLeftSideBottom(u8 metatileBehavior) +{ + if (metatileBehavior == MB_SIDEWAYS_STAIRS_LEFT_SIDE_BOTTOM) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSidewaysStairsRightSideAny(u8 metatileBehavior) +{ + if (metatileBehavior == MB_SIDEWAYS_STAIRS_RIGHT_SIDE + || metatileBehavior == MB_SIDEWAYS_STAIRS_RIGHT_SIDE_BOTTOM + || metatileBehavior == MB_SIDEWAYS_STAIRS_RIGHT_SIDE_TOP) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSidewaysStairsLeftSideAny(u8 metatileBehavior) +{ + if (metatileBehavior == MB_SIDEWAYS_STAIRS_LEFT_SIDE + || metatileBehavior == MB_SIDEWAYS_STAIRS_LEFT_SIDE_BOTTOM + || metatileBehavior == MB_SIDEWAYS_STAIRS_LEFT_SIDE_TOP) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsRockStairs(u8 metatileBehavior) +{ + if (metatileBehavior == MB_ROCK_STAIRS) + return TRUE; + else + return FALSE; +} diff --git a/src/overworld.c b/src/overworld.c index e104cbdcf087..7dea410395eb 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -204,6 +204,7 @@ EWRAM_DATA static struct InitialPlayerAvatarState sInitialPlayerAvatarState = {0 EWRAM_DATA static u16 sAmbientCrySpecies = 0; EWRAM_DATA static bool8 sIsAmbientCryWaterMon = FALSE; EWRAM_DATA struct LinkPlayerObjectEvent gLinkPlayerObjectEvents[4] = {0}; +EWRAM_DATA bool8 gExitStairsMovementDisabled = FALSE; static const struct WarpData sDummyWarpData = { @@ -1003,6 +1004,10 @@ static u8 GetAdjustedInitialDirection(struct InitialPlayerAvatarState *playerStr return DIR_EAST; else if (MetatileBehavior_IsEastArrowWarp(metatileBehavior) == TRUE) return DIR_WEST; + else if (MetatileBehavior_IsDirectionalUpRightStairWarp(metatileBehavior) == TRUE || MetatileBehavior_IsDirectionalDownRightStairWarp(metatileBehavior) == TRUE) + return DIR_WEST; + else if (MetatileBehavior_IsDirectionalUpLeftStairWarp(metatileBehavior) == TRUE || MetatileBehavior_IsDirectionalDownLeftStairWarp(metatileBehavior) == TRUE) + return DIR_EAST; else if ((playerStruct->transitionFlags == PLAYER_AVATAR_FLAG_UNDERWATER && transitionFlags == PLAYER_AVATAR_FLAG_SURFING) || (playerStruct->transitionFlags == PLAYER_AVATAR_FLAG_SURFING && transitionFlags == PLAYER_AVATAR_FLAG_UNDERWATER)) return playerStruct->direction; @@ -1803,6 +1808,7 @@ void CB2_ContinueSavedGame(void) PlayTimeCounter_Start(); ScriptContext_Init(); UnlockPlayerFieldControls(); + gExitStairsMovementDisabled = TRUE; InitMatchCallCounters(); if (UseContinueGameWarp() == TRUE) { @@ -1888,6 +1894,7 @@ static bool32 LoadMapInStepsLink(u8 *state) (*state)++; break; case 1: + gExitStairsMovementDisabled = FALSE; LoadMapFromWarp(TRUE); (*state)++; break; @@ -3304,7 +3311,7 @@ static void SpriteCB_LinkPlayer(struct Sprite *sprite) #define ITEM_TAG 0x2722 //same as money label bool8 GetSetItemObtained(u16 item, enum ItemObtainFlags caseId) -{ +{ #if OW_SHOW_ITEM_DESCRIPTIONS == OW_ITEM_DESCRIPTIONS_FIRST_TIME u8 index = item / 8; u8 bit = item % 8; @@ -3429,7 +3436,7 @@ void ScriptHideItemDescription(struct ScriptContext *ctx) static void ShowItemIconSprite(u16 item, bool8 firstTime, bool8 flash) { s16 x = 0, y = 0; - u8 iconSpriteId; + u8 iconSpriteId; u8 spriteId2 = MAX_SPRITES; if (flash) diff --git a/src/party_menu.c b/src/party_menu.c index 5def34b3eb0b..d737fd3df149 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -32,7 +32,7 @@ #include "item.h" #include "item_menu.h" #include "item_use.h" -#include "level_caps.h" +#include "caps.h" #include "link.h" #include "link_rfu.h" #include "mail.h" @@ -4578,7 +4578,7 @@ static bool8 NotUsingHPEVItemOnShedinja(struct Pokemon *mon, u16 item) return TRUE; } -static bool8 IsItemFlute(u16 item) +bool32 IsItemFlute(u16 item) { if (item == ITEM_BLUE_FLUTE || item == ITEM_RED_FLUTE || item == ITEM_YELLOW_FLUTE) return TRUE; diff --git a/src/pokemon.c b/src/pokemon.c index 01626df5ef30..b78c31daf927 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -19,7 +19,7 @@ #include "field_weather.h" #include "graphics.h" #include "item.h" -#include "level_caps.h" +#include "caps.h" #include "link.h" #include "main.h" #include "overworld.h" @@ -60,7 +60,6 @@ #include "constants/union_room.h" #include "constants/weather.h" #include "wild_encounter.h" -#include "ev_caps.h" #define FRIENDSHIP_EVO_THRESHOLD ((P_FRIENDSHIP_EVO_THRESHOLD >= GEN_9) ? 160 : 220) @@ -686,7 +685,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = #elif P_LVL_UP_LEARNSETS >= GEN_8 #include "data/pokemon/level_up_learnsets/gen_8.h" // Sword/Shield #elif P_LVL_UP_LEARNSETS >= GEN_7 -#include "data/pokemon/level_up_learnsets/gen_7.h" // Ultra Sun/ Ultra Moon +#include "data/pokemon/level_up_learnsets/gen_7.h" // Ultra Sun/Ultra Moon #elif P_LVL_UP_LEARNSETS >= GEN_6 #include "data/pokemon/level_up_learnsets/gen_6.h" // Omega Ruby/Alpha Sapphire #elif P_LVL_UP_LEARNSETS >= GEN_5 @@ -3879,11 +3878,11 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov // Ensure the increase does not exceed the max EV per stat (252) evCap = (itemEffect[10] & ITEM10_IS_VITAMIN) ? EV_ITEM_RAISE_LIMIT : MAX_PER_STAT_EVS; - + // Check if the per-stat limit is reached if (dataSigned >= evCap) return TRUE; // Prevents item use if the per-stat cap is already reached - + if (dataSigned + evChange > evCap) temp2 = evCap - dataSigned; else @@ -4068,11 +4067,11 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov // Ensure the increase does not exceed the max EV per stat (252) evCap = (itemEffect[10] & ITEM10_IS_VITAMIN) ? EV_ITEM_RAISE_LIMIT : MAX_PER_STAT_EVS; - + // Check if the per-stat limit is reached if (dataSigned >= evCap) return TRUE; // Prevents item use if the per-stat cap is already reached - + if (dataSigned + evChange > evCap) temp2 = evCap - dataSigned; else @@ -6679,8 +6678,8 @@ void TrySpecialOverworldEvo(void) bool32 SpeciesHasGenderDifferences(u16 species) { if (gSpeciesInfo[species].frontPicFemale != NULL - || gSpeciesInfo[species].paletteFemale != NULL || gSpeciesInfo[species].backPicFemale != NULL + || gSpeciesInfo[species].paletteFemale != NULL || gSpeciesInfo[species].shinyPaletteFemale != NULL || gSpeciesInfo[species].iconSpriteFemale != NULL) return TRUE; @@ -6935,25 +6934,6 @@ void UpdateDaysPassedSinceFormChange(u16 days) } } -static inline u32 CalculateHiddenPowerType(struct Pokemon *mon) -{ - u32 typehp; - u32 type; - u8 typeBits = ((GetMonData(mon, MON_DATA_HP_IV) & 1) << 0) - | ((GetMonData(mon, MON_DATA_ATK_IV) & 1) << 1) - | ((GetMonData(mon, MON_DATA_DEF_IV) & 1) << 2) - | ((GetMonData(mon, MON_DATA_SPEED_IV) & 1) << 3) - | ((GetMonData(mon, MON_DATA_SPATK_IV) & 1) << 4) - | ((GetMonData(mon, MON_DATA_SPDEF_IV) & 1) << 5); - - type = (15 * typeBits) / 63 + 2; - if (type >= TYPE_MYSTERY) - type++; - type |= 0xC0; - typehp = type & 0x3F; - return typehp; -} - u32 CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler) { u32 moveType = GetDynamicMoveType(mon, move, battler, NULL); diff --git a/src/pokemon_jump.c b/src/pokemon_jump.c index c2a0a4170ad9..0f21e7b28257 100755 --- a/src/pokemon_jump.c +++ b/src/pokemon_jump.c @@ -435,38 +435,38 @@ static const struct PokemonJumpMons sPokeJumpMons[] = { .species = SPECIES_WEEDLE, .jumpType = JUMP_TYPE_FAST, }, { .species = SPECIES_KAKUNA, .jumpType = JUMP_TYPE_FAST, }, { .species = SPECIES_RATTATA, .jumpType = JUMP_TYPE_FAST, }, - { .species = SPECIES_RATTATA_ALOLAN, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_RATTATA_ALOLA, .jumpType = JUMP_TYPE_FAST, }, { .species = SPECIES_RATICATE, .jumpType = JUMP_TYPE_FAST, }, - { .species = SPECIES_RATICATE_ALOLAN, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_RATICATE_ALOLA, .jumpType = JUMP_TYPE_FAST, }, { .species = SPECIES_PIKACHU, .jumpType = JUMP_TYPE_NORMAL, }, { .species = SPECIES_PIKACHU_COSPLAY, .jumpType = JUMP_TYPE_NORMAL, }, { .species = SPECIES_PIKACHU_ROCK_STAR, .jumpType = JUMP_TYPE_NORMAL, }, { .species = SPECIES_PIKACHU_BELLE, .jumpType = JUMP_TYPE_NORMAL, }, { .species = SPECIES_PIKACHU_POP_STAR, .jumpType = JUMP_TYPE_NORMAL, }, - { .species = SPECIES_PIKACHU_PH_D, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_PIKACHU_PHD, .jumpType = JUMP_TYPE_NORMAL, }, { .species = SPECIES_PIKACHU_LIBRE, .jumpType = JUMP_TYPE_NORMAL, }, - { .species = SPECIES_PIKACHU_ORIGINAL_CAP, .jumpType = JUMP_TYPE_NORMAL, }, - { .species = SPECIES_PIKACHU_HOENN_CAP, .jumpType = JUMP_TYPE_NORMAL, }, - { .species = SPECIES_PIKACHU_SINNOH_CAP, .jumpType = JUMP_TYPE_NORMAL, }, - { .species = SPECIES_PIKACHU_UNOVA_CAP, .jumpType = JUMP_TYPE_NORMAL, }, - { .species = SPECIES_PIKACHU_KALOS_CAP, .jumpType = JUMP_TYPE_NORMAL, }, - { .species = SPECIES_PIKACHU_ALOLA_CAP, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_PIKACHU_ORIGINAL, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_PIKACHU_HOENN, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_PIKACHU_SINNOH, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_PIKACHU_UNOVA, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_PIKACHU_KALOS, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_PIKACHU_ALOLA, .jumpType = JUMP_TYPE_NORMAL, }, { .species = SPECIES_PIKACHU_PARTNER_CAP, .jumpType = JUMP_TYPE_NORMAL, }, - { .species = SPECIES_PIKACHU_WORLD_CAP, .jumpType = JUMP_TYPE_NORMAL, }, - { .species = SPECIES_PIKACHU_PARTNER, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_PIKACHU_WORLD, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_PIKACHU_STARTER, .jumpType = JUMP_TYPE_NORMAL, }, { .species = SPECIES_SANDSHREW, .jumpType = JUMP_TYPE_NORMAL, }, - { .species = SPECIES_SANDSHREW_ALOLAN, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_SANDSHREW_ALOLA, .jumpType = JUMP_TYPE_SLOW, }, { .species = SPECIES_NIDORAN_F, .jumpType = JUMP_TYPE_NORMAL, }, { .species = SPECIES_NIDORAN_M, .jumpType = JUMP_TYPE_NORMAL, }, { .species = SPECIES_CLEFAIRY, .jumpType = JUMP_TYPE_NORMAL, }, { .species = SPECIES_VULPIX, .jumpType = JUMP_TYPE_NORMAL, }, - { .species = SPECIES_VULPIX_ALOLAN, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_VULPIX_ALOLA, .jumpType = JUMP_TYPE_NORMAL, }, { .species = SPECIES_JIGGLYPUFF, .jumpType = JUMP_TYPE_SLOW, }, { .species = SPECIES_ODDISH, .jumpType = JUMP_TYPE_SLOW, }, { .species = SPECIES_PARAS, .jumpType = JUMP_TYPE_FAST, }, { .species = SPECIES_MEOWTH, .jumpType = JUMP_TYPE_NORMAL, }, - { .species = SPECIES_MEOWTH_ALOLAN, .jumpType = JUMP_TYPE_NORMAL, }, - { .species = SPECIES_MEOWTH_GALARIAN, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_MEOWTH_ALOLA, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_MEOWTH_GALAR, .jumpType = JUMP_TYPE_NORMAL, }, { .species = SPECIES_PSYDUCK, .jumpType = JUMP_TYPE_SLOW, }, { .species = SPECIES_MANKEY, .jumpType = JUMP_TYPE_FAST, }, { .species = SPECIES_GROWLITHE, .jumpType = JUMP_TYPE_FAST, }, @@ -478,7 +478,7 @@ static const struct PokemonJumpMons sPokeJumpMons[] = { .species = SPECIES_CUBONE, .jumpType = JUMP_TYPE_NORMAL, }, { .species = SPECIES_DITTO, .jumpType = JUMP_TYPE_SLOW, }, { .species = SPECIES_EEVEE, .jumpType = JUMP_TYPE_NORMAL, }, - { .species = SPECIES_EEVEE_PARTNER, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_EEVEE_STARTER, .jumpType = JUMP_TYPE_NORMAL, }, { .species = SPECIES_OMANYTE, .jumpType = JUMP_TYPE_FAST, }, { .species = SPECIES_KABUTO, .jumpType = JUMP_TYPE_FAST, }, { .species = SPECIES_CHIKORITA, .jumpType = JUMP_TYPE_SLOW, }, @@ -495,7 +495,7 @@ static const struct PokemonJumpMons sPokeJumpMons[] = { .species = SPECIES_MARILL, .jumpType = JUMP_TYPE_SLOW, }, { .species = SPECIES_SUNKERN, .jumpType = JUMP_TYPE_SLOW, }, { .species = SPECIES_WOOPER, .jumpType = JUMP_TYPE_SLOW, }, - { .species = SPECIES_WOOPER_PALDEAN, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_WOOPER_PALDEA, .jumpType = JUMP_TYPE_SLOW, }, { .species = SPECIES_PINECO, .jumpType = JUMP_TYPE_SLOW, }, { .species = SPECIES_SNUBBULL, .jumpType = JUMP_TYPE_NORMAL, }, { .species = SPECIES_SHUCKLE, .jumpType = JUMP_TYPE_SLOW, }, @@ -516,9 +516,9 @@ static const struct PokemonJumpMons sPokeJumpMons[] = { .species = SPECIES_MARSHTOMP, .jumpType = JUMP_TYPE_NORMAL, }, { .species = SPECIES_POOCHYENA, .jumpType = JUMP_TYPE_FAST, }, { .species = SPECIES_ZIGZAGOON, .jumpType = JUMP_TYPE_NORMAL, }, - { .species = SPECIES_ZIGZAGOON_GALARIAN, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_ZIGZAGOON_GALAR, .jumpType = JUMP_TYPE_NORMAL, }, { .species = SPECIES_LINOONE, .jumpType = JUMP_TYPE_NORMAL, }, - { .species = SPECIES_LINOONE_GALARIAN, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_LINOONE_GALAR, .jumpType = JUMP_TYPE_NORMAL, }, { .species = SPECIES_WURMPLE, .jumpType = JUMP_TYPE_FAST, }, { .species = SPECIES_SILCOON, .jumpType = JUMP_TYPE_SLOW, }, { .species = SPECIES_CASCOON, .jumpType = JUMP_TYPE_SLOW, }, @@ -567,8 +567,8 @@ static const struct PokemonJumpMons sPokeJumpMons[] = { .species = SPECIES_CHERUBI, .jumpType = JUMP_TYPE_FAST, }, { .species = SPECIES_CHERRIM_OVERCAST, .jumpType = JUMP_TYPE_FAST, }, { .species = SPECIES_CHERRIM_SUNSHINE, .jumpType = JUMP_TYPE_FAST, }, - { .species = SPECIES_SHELLOS_WEST_SEA, .jumpType = JUMP_TYPE_SLOW, }, - { .species = SPECIES_SHELLOS_EAST_SEA, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_SHELLOS_WEST, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_SHELLOS_EAST, .jumpType = JUMP_TYPE_SLOW, }, { .species = SPECIES_BUNEARY, .jumpType = JUMP_TYPE_FAST, }, { .species = SPECIES_GLAMEOW, .jumpType = JUMP_TYPE_FAST, }, { .species = SPECIES_STUNKY, .jumpType = JUMP_TYPE_NORMAL, }, @@ -599,7 +599,7 @@ static const struct PokemonJumpMons sPokeJumpMons[] = { .species = SPECIES_PETILIL, .jumpType = JUMP_TYPE_SLOW, }, { .species = SPECIES_SANDILE, .jumpType = JUMP_TYPE_NORMAL, }, { .species = SPECIES_DARUMAKA, .jumpType = JUMP_TYPE_FAST, }, - { .species = SPECIES_DARUMAKA_GALARIAN, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_DARUMAKA_GALAR, .jumpType = JUMP_TYPE_FAST, }, { .species = SPECIES_DWEBBLE, .jumpType = JUMP_TYPE_SLOW, }, { .species = SPECIES_SCRAGGY, .jumpType = JUMP_TYPE_SLOW, }, { .species = SPECIES_ARCHEN, .jumpType = JUMP_TYPE_NORMAL, }, @@ -622,7 +622,7 @@ static const struct PokemonJumpMons sPokeJumpMons[] = { .species = SPECIES_CUBCHOO, .jumpType = JUMP_TYPE_FAST, }, { .species = SPECIES_SHELMET, .jumpType = JUMP_TYPE_SLOW, }, { .species = SPECIES_STUNFISK, .jumpType = JUMP_TYPE_SLOW, }, - { .species = SPECIES_STUNFISK_GALARIAN, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_STUNFISK_GALAR, .jumpType = JUMP_TYPE_SLOW, }, { .species = SPECIES_PAWNIARD, .jumpType = JUMP_TYPE_FAST, }, { .species = SPECIES_DURANT, .jumpType = JUMP_TYPE_FAST, }, { .species = SPECIES_CHESPIN, .jumpType = JUMP_TYPE_SLOW, }, @@ -649,7 +649,7 @@ static const struct PokemonJumpMons sPokeJumpMons[] = { .species = SPECIES_SCATTERBUG_OCEAN, .jumpType = JUMP_TYPE_FAST, }, { .species = SPECIES_SCATTERBUG_JUNGLE, .jumpType = JUMP_TYPE_FAST, }, { .species = SPECIES_SCATTERBUG_FANCY, .jumpType = JUMP_TYPE_FAST, }, - { .species = SPECIES_SCATTERBUG_POKE_BALL, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_SCATTERBUG_POKEBALL, .jumpType = JUMP_TYPE_FAST, }, { .species = SPECIES_SPEWPA_POLAR, .jumpType = JUMP_TYPE_NORMAL, }, { .species = SPECIES_SPEWPA_TUNDRA, .jumpType = JUMP_TYPE_NORMAL, }, { .species = SPECIES_SPEWPA_CONTINENTAL, .jumpType = JUMP_TYPE_NORMAL, }, @@ -668,12 +668,12 @@ static const struct PokemonJumpMons sPokeJumpMons[] = { .species = SPECIES_SPEWPA_OCEAN, .jumpType = JUMP_TYPE_NORMAL, }, { .species = SPECIES_SPEWPA_JUNGLE, .jumpType = JUMP_TYPE_NORMAL, }, { .species = SPECIES_SPEWPA_FANCY, .jumpType = JUMP_TYPE_NORMAL, }, - { .species = SPECIES_SPEWPA_POKE_BALL, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_SPEWPA_POKEBALL, .jumpType = JUMP_TYPE_NORMAL, }, { .species = SPECIES_LITLEO, .jumpType = JUMP_TYPE_FAST, }, { .species = SPECIES_PANCHAM, .jumpType = JUMP_TYPE_FAST, }, { .species = SPECIES_ESPURR, .jumpType = JUMP_TYPE_NORMAL, }, - { .species = SPECIES_MEOWSTIC_MALE, .jumpType = JUMP_TYPE_NORMAL, }, - { .species = SPECIES_MEOWSTIC_FEMALE, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_MEOWSTIC_M, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_MEOWSTIC_F, .jumpType = JUMP_TYPE_NORMAL, }, { .species = SPECIES_BINACLE, .jumpType = JUMP_TYPE_SLOW, }, { .species = SPECIES_CLAUNCHER, .jumpType = JUMP_TYPE_SLOW, }, { .species = SPECIES_HELIOPTILE, .jumpType = JUMP_TYPE_NORMAL, }, diff --git a/src/pokemon_sprite_visualizer.c b/src/pokemon_sprite_visualizer.c index fea632412905..87caf862ae96 100644 --- a/src/pokemon_sprite_visualizer.c +++ b/src/pokemon_sprite_visualizer.c @@ -1621,7 +1621,7 @@ static void UpdateShadowSizeValue(u8 taskId, bool8 increment) else { update = 1; - data->shadowSettings.overrideSize += 1; + data->shadowSettings.overrideSize += 1; } } else @@ -2001,7 +2001,10 @@ static void ReloadPokemonSprites(struct PokemonSpriteVisualizer *data) gSprites[data->iconspriteId].oam.priority = 0; //Follower Sprite - data->followerspriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_MON_BASE + species + (data->isShiny ? SPECIES_SHINY_TAG : 0), + u16 graphicsId = (OBJ_EVENT_GFX_MON_BASE + species) & OBJ_EVENT_GFX_SPECIES_MASK; + graphicsId |= data->isFemale << OBJ_EVENT_GFX_SPECIES_BITS; + graphicsId += data->isShiny ? SPECIES_SHINY_TAG : 0; + data->followerspriteId = CreateObjectGraphicsSprite(graphicsId, SpriteCB_Follower, VISUALIZER_FOLLOWER_X, VISUALIZER_FOLLOWER_Y, diff --git a/src/scrcmd.c b/src/scrcmd.c index e29949cab850..b4658f5cf062 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -1009,6 +1009,8 @@ bool8 ScrCmd_applymovement(struct ScriptContext *ctx) ClearObjectEventMovement(objEvent, &gSprites[objEvent->spriteId]); gSprites[objEvent->spriteId].animCmdIndex = 0; // Reset start frame of animation } + + gObjectEvents[GetObjectEventIdByLocalId(localId)].directionOverwrite = DIR_NONE; ScriptMovement_StartObjectMovementScript(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, movementScript); sMovingNpcId = localId; objEvent = GetFollowerObject(); @@ -1033,6 +1035,7 @@ bool8 ScrCmd_applymovementat(struct ScriptContext *ctx) u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); + gObjectEvents[GetObjectEventIdByLocalId(localId)].directionOverwrite = DIR_NONE; ScriptMovement_StartObjectMovementScript(localId, mapNum, mapGroup, movementScript); sMovingNpcId = localId; return FALSE; diff --git a/src/strings.c b/src/strings.c index 3f21f86c4785..ff1dde2cce1b 100644 --- a/src/strings.c +++ b/src/strings.c @@ -196,6 +196,9 @@ const u8 gText_TheBattle[] = _("the battle"); const u8 gText_ThePokemonList[] = _("the POKéMON LIST"); const u8 gText_TheShop[] = _("the shop"); const u8 gText_ThePC[] = _("the PC"); +const u8 gText_PlayedPokeFluteCatchy[] = _("Played the POKé FLUTE.\pNow, that's a catchy tune!{PAUSE_UNTIL_PRESS}"); +const u8 gText_PlayedPokeFlute[] = _("Played the POKé FLUTE."); +const u8 gText_PokeFluteAwakenedMon[] = _("The POKé FLUTE awakened sleeping\nPOKéMON.{PAUSE_UNTIL_PRESS}"); const u8 *const gBagMenu_ReturnToStrings[] = { diff --git a/src/union_room.c b/src/union_room.c index f4ee01d1b404..ac4c61035a2e 100644 --- a/src/union_room.c +++ b/src/union_room.c @@ -3294,6 +3294,9 @@ void InitUnionRoom(void) { struct WirelessLink_URoom *data; + if (!ShouldCheckForUnionRoom()) + return; + sUnionRoomPlayerName[0] = EOS; CreateTask(Task_InitUnionRoom, 0); sWirelessLinkMain.uRoom = sWirelessLinkMain.uRoom; // Needed to match. @@ -3377,6 +3380,9 @@ static void Task_InitUnionRoom(u8 taskId) bool16 BufferUnionRoomPlayerName(void) { + if (!ShouldCheckForUnionRoom()) + return FALSE; + if (sUnionRoomPlayerName[0] != EOS) { StringCopy(gStringVar1, sUnionRoomPlayerName); diff --git a/test/battle/ability/commander.c b/test/battle/ability/commander.c new file mode 100644 index 000000000000..e6a85b06815a --- /dev/null +++ b/test/battle/ability/commander.c @@ -0,0 +1,423 @@ +#include "global.h" +#include "test/battle.h" + +DOUBLE_BATTLE_TEST("Commander will activate once Dondozo switches in") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); } + PLAYER(SPECIES_DONDOZO); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { SWITCH(playerLeft, 2); } + } SCENE { + ABILITY_POPUP(playerRight, ABILITY_COMMANDER); + MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!"); + } +} + +DOUBLE_BATTLE_TEST("Commander increases all stats by 2 stages once it is triggered") +{ + GIVEN { + PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); } + PLAYER(SPECIES_DONDOZO); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_COMMANDER); + MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + MESSAGE("Dondozo's Attack sharply rose!"); + MESSAGE("Dondozo's Defense sharply rose!"); + MESSAGE("Dondozo's Sp. Atk sharply rose!"); + MESSAGE("Dondozo's Sp. Def sharply rose!"); + MESSAGE("Dondozo's Speed sharply rose!"); + } +} + +DOUBLE_BATTLE_TEST("Commander Tatsugiri avoids moves targetted towards it") +{ + GIVEN { + PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); } + PLAYER(SPECIES_DONDOZO); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_TACKLE, target: playerLeft); MOVE(opponentRight, MOVE_POUND, target: playerRight); } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_COMMANDER); + MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!"); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponentLeft); + MESSAGE("Foe Wobbuffet's attack missed!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, opponentRight); + } +} + +DOUBLE_BATTLE_TEST("Commander Tatsugiri will still take residual damage from a field effect while inside Dondozo") +{ + GIVEN { + PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); } + PLAYER(SPECIES_DONDOZO); + OPPONENT(SPECIES_TYRANITAR) { Ability(ABILITY_SAND_STREAM); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_COMMANDER); + MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!"); + ABILITY_POPUP(opponentLeft, ABILITY_SAND_STREAM); + MESSAGE("Dondozo is buffeted by the sandstorm!"); + MESSAGE("Tatsugiri is buffeted by the sandstorm!"); + MESSAGE("Foe Wobbuffet is buffeted by the sandstorm!"); + } +} + +DOUBLE_BATTLE_TEST("Commander Tatsugiri will still take poison damage if while inside Dondozo") +{ + GIVEN { + PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); Status1(STATUS1_POISON); } + PLAYER(SPECIES_DONDOZO); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_COMMANDER); + MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!"); + MESSAGE("Tatsugiri is hurt by poison!"); + } +} + +DOUBLE_BATTLE_TEST("Commander Tatsugiri still avoids moves even when the attacker has No Guard") +{ + GIVEN { + PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); } + PLAYER(SPECIES_DONDOZO); + OPPONENT(SPECIES_MACHAMP) { Ability(ABILITY_NO_GUARD); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_TACKLE, target: playerLeft); } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_COMMANDER); + MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!"); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponentLeft); + MESSAGE("Foe Machamp's attack missed!"); + } +} + +DOUBLE_BATTLE_TEST("Commander cannot affect a Dondozo that was previously affected by Commander until it faints and revived") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_DONDOZO); + PLAYER(SPECIES_TATSUGIRI) { HP(1); Ability(ABILITY_COMMANDER); Status1(STATUS1_POISON); } + PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerRight, MOVE_CELEBRATE); SWITCH(playerLeft, 2); SEND_OUT(playerLeft, 3); } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_COMMANDER); + MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!"); + MESSAGE("Tatsugiri is hurt by poison!"); + NONE_OF { + ABILITY_POPUP(playerLeft, ABILITY_COMMANDER); + MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!"); + } + } +} + +DOUBLE_BATTLE_TEST("Commander prevents Whirlwind from working against Dondozo or Tatsugiri while it's active") +{ + GIVEN { + PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); } + PLAYER(SPECIES_DONDOZO); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_WHIRLWIND, target: playerLeft); } + TURN { MOVE(opponentRight, MOVE_WHIRLWIND, target: playerRight); } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_COMMANDER); + MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!"); + MESSAGE("Foe Wobbuffet used Whirlwind!"); + MESSAGE("But it failed!"); + MESSAGE("Foe Wobbuffet used Whirlwind!"); + MESSAGE("But it failed!"); + } +} + +DOUBLE_BATTLE_TEST("Commander prevents Red Card from working while Commander is active") +{ + GIVEN { + PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); } + PLAYER(SPECIES_DONDOZO); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_RED_CARD); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerRight, MOVE_TACKLE, target: opponentLeft); } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_COMMANDER); + MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentLeft); + } THEN { + EXPECT(opponentLeft->item == ITEM_NONE); + EXPECT(playerRight->species == SPECIES_DONDOZO); + } + +} + +DOUBLE_BATTLE_TEST("Commander Tatsugiri is not damaged by a double target move if Dondozo faints") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_SURF].target == MOVE_TARGET_FOES_AND_ALLY); + PLAYER(SPECIES_DONDOZO) { HP(1); }; + PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_SURF); SEND_OUT(playerLeft, 2); } + } SCENE { + ABILITY_POPUP(playerRight, ABILITY_COMMANDER); + MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!"); + HP_BAR(playerLeft); + MESSAGE("Dondozo fainted!"); + NOT HP_BAR(playerRight); + HP_BAR(opponentRight); + } +} + +DOUBLE_BATTLE_TEST("Commander Tatsugiri takes no damage from multi-target damaging moves") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); } + PLAYER(SPECIES_DONDOZO); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_SURF); MOVE(opponentRight, MOVE_SURF); SWITCH(playerLeft, 2); } + } SCENE { + ABILITY_POPUP(playerRight, ABILITY_COMMANDER); + MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!"); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_SURF, opponentLeft); + HP_BAR(playerLeft); + NOT HP_BAR(playerRight); + HP_BAR(opponentRight); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_SURF, opponentRight); + HP_BAR(playerLeft); + HP_BAR(opponentLeft); + NOT HP_BAR(playerRight); + } +} + +DOUBLE_BATTLE_TEST("Commander doesn't prevent Transform from working on a Commander Tatsugiri") +{ + GIVEN { + PLAYER(SPECIES_DONDOZO); + PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentRight, MOVE_TRANSFORM, target: playerRight); } + } SCENE { + ABILITY_POPUP(playerRight, ABILITY_COMMANDER); + MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TRANSFORM, opponentRight); + } +} + +DOUBLE_BATTLE_TEST("Commander doesn't prevent Imposter from working on a Commander Tatsugiri") +{ + GIVEN { + PLAYER(SPECIES_DONDOZO); + PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_DITTO) { Ability(ABILITY_IMPOSTER); } + } WHEN { + TURN { } + TURN { SWITCH(opponentRight, 2); } + } SCENE { + ABILITY_POPUP(playerRight, ABILITY_COMMANDER); + MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!"); + ABILITY_POPUP(opponentRight, ABILITY_IMPOSTER); + MESSAGE("Foe Ditto transformed into Tatsugiri using Imposter!"); + } +} + +DOUBLE_BATTLE_TEST("Commander Tatsugiri is still affected by Perish Song while controlling Dondozo") +{ + GIVEN { + PLAYER(SPECIES_DONDOZO); + PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_PERISH_SONG); } + TURN {} + TURN {} + TURN {} + } SCENE { + ABILITY_POPUP(playerRight, ABILITY_COMMANDER); + MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PERISH_SONG, opponentLeft); + MESSAGE("All affected POKéMON will faint in three turns!"); + MESSAGE("Dondozo's PERISH count fell to 0!"); + MESSAGE("Dondozo fainted!"); + MESSAGE("Foe Wobbuffet's PERISH count fell to 0!"); + MESSAGE("Foe Wobbuffet fainted!"); + NONE_OF { + MESSAGE("Tatsugiri's PERISH count fell to 0!"); + MESSAGE("Tatsugiri fainted!"); + } + MESSAGE("Foe Wynaut's PERISH count fell to 0!"); + MESSAGE("Foe Wynaut fainted!"); + } +} + +DOUBLE_BATTLE_TEST("Commander Tatsugiri is still affected by Haze while controlling Dondozo") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); } + PLAYER(SPECIES_DONDOZO); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerRight, MOVE_SWORDS_DANCE); } + TURN { SWITCH(playerLeft, 2); MOVE(opponentRight, MOVE_HAZE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, playerRight); + ABILITY_POPUP(playerRight, ABILITY_COMMANDER); + MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_HAZE, opponentRight); + } THEN { + EXPECT_EQ(playerRight->statStages[STAT_ATK], DEFAULT_STAT_STAGE); + } +} + +DOUBLE_BATTLE_TEST("Commander Attacker is kept (Dondozo Left Slot)") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_SURF].target == MOVE_TARGET_FOES_AND_ALLY); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); } + PLAYER(SPECIES_DONDOZO); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentRight, MOVE_TACKLE, target: opponentLeft); } + TURN { SWITCH(playerLeft, 2); MOVE(opponentLeft, MOVE_SURF); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponentRight); + ABILITY_POPUP(playerRight, ABILITY_COMMANDER); + MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SURF, opponentLeft); + HP_BAR(playerLeft); + MESSAGE("Foe Wobbuffet's attack missed!"); + HP_BAR(opponentRight); + } +} + +DOUBLE_BATTLE_TEST("Commander Attacker is kept (Dondozo Right Slot)") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_SURF].target == MOVE_TARGET_FOES_AND_ALLY); + PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); } + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_DONDOZO); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentRight, MOVE_TACKLE, target: opponentLeft); } + TURN { SWITCH(playerRight, 2); MOVE(opponentLeft, MOVE_SURF); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponentRight); + ABILITY_POPUP(playerLeft, ABILITY_COMMANDER); + MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!"); + MESSAGE("Foe Wobbuffet's attack missed!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SURF, opponentLeft); + HP_BAR(playerRight); + HP_BAR(opponentRight); + } +} + +DOUBLE_BATTLE_TEST("Commander Tatsugiri does not attack if Dondozo faints the same turn it's switched in") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); } + PLAYER(SPECIES_DONDOZO) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + SWITCH(playerLeft, 2); + MOVE(opponentLeft, MOVE_TACKLE, target: playerLeft); + MOVE(opponentRight, MOVE_TACKLE, target: playerRight); + MOVE(playerRight, MOVE_CELEBRATE); + SEND_OUT(playerLeft, 0); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponentLeft); + HP_BAR(playerLeft); + MESSAGE("Dondozo fainted!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponentRight); + HP_BAR(playerRight); + NOT MESSAGE("Tatsugiri used Celebrate!"); + } +} + +DOUBLE_BATTLE_TEST("Commander Tatsugiri does not get hit by Dragon Darts when a commanded Dondozo faints") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_DRAGON_DARTS].effect == EFFECT_DRAGON_DARTS); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_DONDOZO) { HP(1); } + PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { SWITCH(playerLeft, 2); MOVE(opponentRight, MOVE_DRAGON_DARTS, target: playerRight); SEND_OUT(playerRight, 0); } + } SCENE { + MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DARTS, opponentRight); + MESSAGE("Dondozo fainted!"); + NOT HP_BAR(playerLeft); + } +} + +DOUBLE_BATTLE_TEST("Commander Tatsugiri does not get hit by Dragon Darts when commanding Dondozo") +{ + bool32 targetPlayerRight; + PARAMETRIZE { targetPlayerRight = TRUE; } + PARAMETRIZE { targetPlayerRight = FALSE; } + GIVEN { + ASSUME(gMovesInfo[MOVE_DRAGON_DARTS].effect == EFFECT_DRAGON_DARTS); + PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); } + PLAYER(SPECIES_DONDOZO); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + if (targetPlayerRight == TRUE) + TURN { MOVE(opponentRight, MOVE_DRAGON_DARTS, target: playerRight); } + else + TURN { MOVE(opponentRight, MOVE_DRAGON_DARTS, target: playerLeft); } + } SCENE { + MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DARTS, opponentRight); + HP_BAR(playerRight); + NOT HP_BAR(playerLeft); + HP_BAR(playerRight); + NOT HP_BAR(playerLeft); + } +} diff --git a/test/battle/ability/cud_chew.c b/test/battle/ability/cud_chew.c index 305969aa93ae..297635c9f393 100644 --- a/test/battle/ability/cud_chew.c +++ b/test/battle/ability/cud_chew.c @@ -7,7 +7,7 @@ SINGLE_BATTLE_TEST("Cud Chew will activate Kee Berry effect again on the next tu ASSUME(gItemsInfo[ITEM_KEE_BERRY].holdEffect == HOLD_EFFECT_KEE_BERRY); ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_TAUROS_PALDEAN_COMBAT_BREED) { Ability(ABILITY_CUD_CHEW); Item(ITEM_KEE_BERRY); } + OPPONENT(SPECIES_TAUROS_PALDEA_COMBAT) { Ability(ABILITY_CUD_CHEW); Item(ITEM_KEE_BERRY); } } WHEN { TURN { MOVE(player, MOVE_TACKLE); } TURN { MOVE(player, MOVE_CELEBRATE);} @@ -31,7 +31,7 @@ SINGLE_BATTLE_TEST("Cud Chew will activate Oran Berry effect again on the next t ASSUME(gMovesInfo[MOVE_DRAGON_RAGE].effect == EFFECT_FIXED_DAMAGE_ARG); ASSUME(gMovesInfo[MOVE_DRAGON_RAGE].argument == 40); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_TAUROS_PALDEAN_COMBAT_BREED) { MaxHP(60); HP(60); Ability(ABILITY_CUD_CHEW); Item(ITEM_ORAN_BERRY); } + OPPONENT(SPECIES_TAUROS_PALDEA_COMBAT) { MaxHP(60); HP(60); Ability(ABILITY_CUD_CHEW); Item(ITEM_ORAN_BERRY); } } WHEN { TURN { MOVE(player, MOVE_DRAGON_RAGE); } TURN { MOVE(player, MOVE_CELEBRATE);} diff --git a/test/battle/ability/dancer.c b/test/battle/ability/dancer.c index 660a719c6928..213253095842 100644 --- a/test/battle/ability/dancer.c +++ b/test/battle/ability/dancer.c @@ -145,3 +145,104 @@ SINGLE_BATTLE_TEST("Dancer-called attacks have their type updated") MESSAGE("It's super effective!"); } } + +DOUBLE_BATTLE_TEST("Dancer doesn't trigger on a snatched move") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_DRAGON_DANCE].danceMove == TRUE); + ASSUME(gMovesInfo[MOVE_SNATCH].effect == EFFECT_SNATCH); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_ORICORIO); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentRight, MOVE_SNATCH); MOVE(playerRight, MOVE_DRAGON_DANCE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SNATCH, opponentRight); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, opponentRight); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + NONE_OF { + ABILITY_POPUP(opponentLeft, ABILITY_DANCER); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + } + } +} + +DOUBLE_BATTLE_TEST("Dancer triggers on Instructed dance moves") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_DRAGON_DANCE].danceMove == TRUE); + ASSUME(gMovesInfo[MOVE_DRAGON_DANCE].instructBanned == FALSE); + ASSUME(gMovesInfo[MOVE_INSTRUCT].effect == EFFECT_INSTRUCT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_ORICORIO); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerRight, MOVE_DRAGON_DANCE); MOVE(playerLeft, MOVE_INSTRUCT, target: playerRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, playerRight); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + ABILITY_POPUP(opponentLeft, ABILITY_DANCER); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_INSTRUCT, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, playerRight); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + ABILITY_POPUP(opponentLeft, ABILITY_DANCER); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + } +} + +DOUBLE_BATTLE_TEST("Dancer-called move doesn't update move to be Instructed") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_DRAGON_DANCE].danceMove == TRUE); + ASSUME(gMovesInfo[MOVE_TACKLE].instructBanned == FALSE); + ASSUME(gMovesInfo[MOVE_INSTRUCT].effect == EFFECT_INSTRUCT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_ORICORIO); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_TACKLE, target: playerLeft); MOVE(playerRight, MOVE_DRAGON_DANCE); MOVE(opponentRight, MOVE_INSTRUCT, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, playerRight); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + ABILITY_POPUP(opponentLeft, ABILITY_DANCER); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_INSTRUCT, opponentRight); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponentLeft); + } +} + +DOUBLE_BATTLE_TEST("Dancer doesn't call a move that didn't execute due to Powder") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_FIERY_DANCE].danceMove == TRUE); + ASSUME(gMovesInfo[MOVE_FIERY_DANCE].type == TYPE_FIRE); + PLAYER(SPECIES_VOLCARONA); + PLAYER(SPECIES_ORICORIO); + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponentRight, MOVE_POWDER, target: playerLeft); MOVE(playerLeft, MOVE_FIERY_DANCE, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponentRight); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIERY_DANCE, playerLeft); + HP_BAR(opponentLeft); + ABILITY_POPUP(playerRight, ABILITY_DANCER); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIERY_DANCE, playerRight); + } + } +} diff --git a/test/battle/ability/embody_aspect.c b/test/battle/ability/embody_aspect.c index a2427875f6a0..c5c8f5d6104c 100644 --- a/test/battle/ability/embody_aspect.c +++ b/test/battle/ability/embody_aspect.c @@ -6,10 +6,10 @@ SINGLE_BATTLE_TEST("Embody Aspect raises a stat depending on the users form by o { u16 species, ability; - PARAMETRIZE { species = SPECIES_OGERPON_TEAL_MASK_TERA; ability = ABILITY_EMBODY_ASPECT_TEAL_MASK; } - PARAMETRIZE { species = SPECIES_OGERPON_HEARTHFLAME_MASK_TERA; ability = ABILITY_EMBODY_ASPECT_HEARTHFLAME_MASK; } - PARAMETRIZE { species = SPECIES_OGERPON_WELLSPRING_MASK_TERA; ability = ABILITY_EMBODY_ASPECT_WELLSPRING_MASK; } - PARAMETRIZE { species = SPECIES_OGERPON_CORNERSTONE_MASK_TERA; ability = ABILITY_EMBODY_ASPECT_CORNERSTONE_MASK; } + PARAMETRIZE { species = SPECIES_OGERPON_TEAL_TERA; ability = ABILITY_EMBODY_ASPECT_TEAL_MASK; } + PARAMETRIZE { species = SPECIES_OGERPON_HEARTHFLAME_TERA; ability = ABILITY_EMBODY_ASPECT_HEARTHFLAME_MASK; } + PARAMETRIZE { species = SPECIES_OGERPON_WELLSPRING_TERA; ability = ABILITY_EMBODY_ASPECT_WELLSPRING_MASK; } + PARAMETRIZE { species = SPECIES_OGERPON_CORNERSTONE_TERA; ability = ABILITY_EMBODY_ASPECT_CORNERSTONE_MASK; } GIVEN { PLAYER(SPECIES_WOBBUFFET); @@ -44,7 +44,7 @@ SINGLE_BATTLE_TEST("Embody Aspect activates when it's no longer effected by Neut GIVEN { PLAYER(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); } PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_OGERPON_TEAL_MASK_TERA) { Ability(ABILITY_EMBODY_ASPECT_TEAL_MASK); } + OPPONENT(SPECIES_OGERPON_TEAL_TERA) { Ability(ABILITY_EMBODY_ASPECT_TEAL_MASK); } } WHEN { TURN { SWITCH(player, 1); } } SCENE { diff --git a/test/battle/ability/galvanize.c b/test/battle/ability/galvanize.c index 7f604f3dacab..1da82e861dfb 100644 --- a/test/battle/ability/galvanize.c +++ b/test/battle/ability/galvanize.c @@ -11,7 +11,7 @@ SINGLE_BATTLE_TEST("Galvanize turns a normal type move into Electric") { GIVEN { PLAYER(SPECIES_KRABBY); - OPPONENT(SPECIES_GEODUDE_ALOLAN) { Ability(ABILITY_GALVANIZE); } + OPPONENT(SPECIES_GEODUDE_ALOLA) { Ability(ABILITY_GALVANIZE); } } WHEN { TURN { MOVE(opponent, MOVE_TACKLE); } } SCENE { @@ -33,7 +33,7 @@ SINGLE_BATTLE_TEST("Galvanize can not turn certain moves into Electric type move ASSUME(gMovesInfo[MOVE_WEATHER_BALL].effect == EFFECT_WEATHER_BALL); ASSUME(gMovesInfo[MOVE_MULTI_ATTACK].effect == EFFECT_CHANGE_TYPE_ON_ITEM); PLAYER(SPECIES_KRABBY); - OPPONENT(SPECIES_GEODUDE_ALOLAN) { Ability(ABILITY_GALVANIZE); } + OPPONENT(SPECIES_GEODUDE_ALOLA) { Ability(ABILITY_GALVANIZE); } } WHEN { TURN { MOVE(opponent, move); } } SCENE { diff --git a/test/battle/ability/grim_neigh.c b/test/battle/ability/grim_neigh.c index b4d82487d83e..1d1e50ee12e7 100644 --- a/test/battle/ability/grim_neigh.c +++ b/test/battle/ability/grim_neigh.c @@ -5,7 +5,7 @@ DOUBLE_BATTLE_TEST("Grim Neigh raises Sp. Attack by one stage after directly cau { u32 species = 0, ability = 0, abilityPopUp = 0; PARAMETRIZE { species = SPECIES_SPECTRIER; ability = ABILITY_GRIM_NEIGH; abilityPopUp = ABILITY_GRIM_NEIGH; } - PARAMETRIZE { species = SPECIES_CALYREX_SHADOW_RIDER; ability = ABILITY_AS_ONE_SHADOW_RIDER; abilityPopUp = ABILITY_GRIM_NEIGH; } + PARAMETRIZE { species = SPECIES_CALYREX_SHADOW; ability = ABILITY_AS_ONE_SHADOW_RIDER; abilityPopUp = ABILITY_GRIM_NEIGH; } GIVEN { ASSUME(gMovesInfo[MOVE_DISCHARGE].target == MOVE_TARGET_FOES_AND_ALLY); PLAYER(species) { Ability(ability); } @@ -41,7 +41,7 @@ DOUBLE_BATTLE_TEST("Grim Neigh does not trigger if Pokemon faint to indirect dam { u32 species = 0, ability = 0, abilityPopUp = 0; PARAMETRIZE { species = SPECIES_SPECTRIER; ability = ABILITY_GRIM_NEIGH; abilityPopUp = ABILITY_GRIM_NEIGH; } - PARAMETRIZE { species = SPECIES_CALYREX_SHADOW_RIDER; ability = ABILITY_AS_ONE_SHADOW_RIDER; abilityPopUp = ABILITY_GRIM_NEIGH; } + PARAMETRIZE { species = SPECIES_CALYREX_SHADOW; ability = ABILITY_AS_ONE_SHADOW_RIDER; abilityPopUp = ABILITY_GRIM_NEIGH; } GIVEN { PLAYER(species) { Ability(ability); } PLAYER(SPECIES_SNORUNT) { HP(1); Status1(STATUS1_POISON); } @@ -78,7 +78,7 @@ DOUBLE_BATTLE_TEST("Grim Neigh does not increase damage done by the same move th s16 damage[2]; u32 species = 0, ability = 0, abilityPopUp = 0; PARAMETRIZE { species = SPECIES_SPECTRIER; ability = ABILITY_GRIM_NEIGH; abilityPopUp = ABILITY_GRIM_NEIGH; } - PARAMETRIZE { species = SPECIES_CALYREX_SHADOW_RIDER; ability = ABILITY_AS_ONE_SHADOW_RIDER; abilityPopUp = ABILITY_GRIM_NEIGH; } + PARAMETRIZE { species = SPECIES_CALYREX_SHADOW; ability = ABILITY_AS_ONE_SHADOW_RIDER; abilityPopUp = ABILITY_GRIM_NEIGH; } KNOWN_FAILING; // Requires simultaneous damage implementation GIVEN { diff --git a/test/battle/ability/moxie.c b/test/battle/ability/moxie.c index 79b1fc989fa6..28fb9333fea5 100644 --- a/test/battle/ability/moxie.c +++ b/test/battle/ability/moxie.c @@ -6,7 +6,7 @@ DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh raises Attack by one stage after direct u32 species = 0, ability = 0, abilityPopUp = 0; PARAMETRIZE { species = SPECIES_SALAMENCE; ability = ABILITY_MOXIE; abilityPopUp = ABILITY_MOXIE; } PARAMETRIZE { species = SPECIES_GLASTRIER; ability = ABILITY_CHILLING_NEIGH; abilityPopUp = ABILITY_CHILLING_NEIGH; } - PARAMETRIZE { species = SPECIES_CALYREX_ICE_RIDER; ability = ABILITY_AS_ONE_ICE_RIDER; abilityPopUp = ABILITY_CHILLING_NEIGH; } + PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; abilityPopUp = ABILITY_CHILLING_NEIGH; } GIVEN { ASSUME(gMovesInfo[MOVE_EARTHQUAKE].target == MOVE_TARGET_FOES_AND_ALLY); PLAYER(species) { Ability(ability); } @@ -45,7 +45,7 @@ DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh does not trigger if Pokemon faint to in u32 species = 0, ability = 0, abilityPopUp = 0; PARAMETRIZE { species = SPECIES_SALAMENCE; ability = ABILITY_MOXIE; abilityPopUp = ABILITY_MOXIE; } PARAMETRIZE { species = SPECIES_GLASTRIER; ability = ABILITY_CHILLING_NEIGH; abilityPopUp = ABILITY_CHILLING_NEIGH; } - PARAMETRIZE { species = SPECIES_CALYREX_ICE_RIDER; ability = ABILITY_AS_ONE_ICE_RIDER; abilityPopUp = ABILITY_CHILLING_NEIGH; } + PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; abilityPopUp = ABILITY_CHILLING_NEIGH; } GIVEN { PLAYER(species) { Ability(ability); } PLAYER(SPECIES_SNORUNT) { HP(1); Status1(STATUS1_POISON); } @@ -82,7 +82,7 @@ SINGLE_BATTLE_TEST("Moxie/Chilling Neigh does not trigger when already at maximu u32 species = 0, ability = 0, abilityPopUp = 0; PARAMETRIZE { species = SPECIES_SALAMENCE; ability = ABILITY_MOXIE; abilityPopUp = ABILITY_MOXIE; } PARAMETRIZE { species = SPECIES_GLASTRIER; ability = ABILITY_CHILLING_NEIGH; abilityPopUp = ABILITY_CHILLING_NEIGH; } - PARAMETRIZE { species = SPECIES_CALYREX_ICE_RIDER; ability = ABILITY_AS_ONE_ICE_RIDER; abilityPopUp = ABILITY_CHILLING_NEIGH; } + PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; abilityPopUp = ABILITY_CHILLING_NEIGH; } GIVEN { ASSUME(gMovesInfo[MOVE_BELLY_DRUM].effect == EFFECT_BELLY_DRUM); PLAYER(species) { Ability(ability); } @@ -120,7 +120,7 @@ DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh does not increase damage done by the sa u32 species = 0, ability = 0, abilityPopUp = 0; PARAMETRIZE { species = SPECIES_SALAMENCE; ability = ABILITY_MOXIE; abilityPopUp = ABILITY_MOXIE; } PARAMETRIZE { species = SPECIES_GLASTRIER; ability = ABILITY_CHILLING_NEIGH; abilityPopUp = ABILITY_CHILLING_NEIGH; } - PARAMETRIZE { species = SPECIES_CALYREX_ICE_RIDER; ability = ABILITY_AS_ONE_ICE_RIDER; abilityPopUp = ABILITY_CHILLING_NEIGH; } + PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; abilityPopUp = ABILITY_CHILLING_NEIGH; } KNOWN_FAILING; // Requires simultaneous damage implementation GIVEN { diff --git a/test/battle/ability/mummy.c b/test/battle/ability/mummy.c index ed80a178e6f4..b6323e83ee5f 100644 --- a/test/battle/ability/mummy.c +++ b/test/battle/ability/mummy.c @@ -81,8 +81,8 @@ SINGLE_BATTLE_TEST("Mummy doesn't replace abilities that can't be suppressed") PARAMETRIZE { species = SPECIES_CRAMORANT; ability = ABILITY_GULP_MISSILE; } PARAMETRIZE { species = SPECIES_PALAFIN_ZERO; ability = ABILITY_ZERO_TO_HERO; } PARAMETRIZE { species = SPECIES_TATSUGIRI; ability = ABILITY_COMMANDER; } - PARAMETRIZE { species = SPECIES_CALYREX_SHADOW_RIDER; ability = ABILITY_AS_ONE_SHADOW_RIDER; } - PARAMETRIZE { species = SPECIES_CALYREX_ICE_RIDER; ability = ABILITY_AS_ONE_ICE_RIDER; } + PARAMETRIZE { species = SPECIES_CALYREX_SHADOW; ability = ABILITY_AS_ONE_SHADOW_RIDER; } + PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; } GIVEN { PLAYER(SPECIES_YAMASK); diff --git a/test/battle/ability/pastel_veil.c b/test/battle/ability/pastel_veil.c index ebf9d74645f0..8ea83bbf86e1 100644 --- a/test/battle/ability/pastel_veil.c +++ b/test/battle/ability/pastel_veil.c @@ -6,7 +6,7 @@ SINGLE_BATTLE_TEST("Pastel Veil prevents Poison Sting poison") GIVEN { ASSUME(MoveHasAdditionalEffect(MOVE_POISON_STING, MOVE_EFFECT_POISON) == TRUE); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_PONYTA_GALARIAN) { Ability(ABILITY_PASTEL_VEIL); } + OPPONENT(SPECIES_PONYTA_GALAR) { Ability(ABILITY_PASTEL_VEIL); } } WHEN { TURN { MOVE(player, MOVE_POISON_STING); } } SCENE { @@ -21,7 +21,7 @@ DOUBLE_BATTLE_TEST("Pastel Veil prevents Poison Sting poison on partner") ASSUME(MoveHasAdditionalEffect(MOVE_POISON_STING, MOVE_EFFECT_POISON) == TRUE); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); - OPPONENT(SPECIES_PONYTA_GALARIAN) { Ability(ABILITY_PASTEL_VEIL); } + OPPONENT(SPECIES_PONYTA_GALAR) { Ability(ABILITY_PASTEL_VEIL); } OPPONENT(SPECIES_WYNAUT); } WHEN { TURN { MOVE(playerLeft, MOVE_POISON_STING, target: opponentRight); } @@ -37,7 +37,7 @@ SINGLE_BATTLE_TEST("Pastel Veil immediately cures Mold Breaker poison") GIVEN { ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC); PLAYER(SPECIES_PINSIR) { Ability(ABILITY_MOLD_BREAKER); } - OPPONENT(SPECIES_PONYTA_GALARIAN) { Ability(ABILITY_PASTEL_VEIL); } + OPPONENT(SPECIES_PONYTA_GALAR) { Ability(ABILITY_PASTEL_VEIL); } } WHEN { TURN { MOVE(player, MOVE_TOXIC); MOVE(opponent, MOVE_TACKLE); } } SCENE { @@ -56,7 +56,7 @@ DOUBLE_BATTLE_TEST("Pastel Veil does not cure Mold Breaker poison on partner") ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC); PLAYER(SPECIES_PINSIR) { Ability(ABILITY_MOLD_BREAKER); } PLAYER(SPECIES_WYNAUT); - OPPONENT(SPECIES_PONYTA_GALARIAN) { Ability(ABILITY_PASTEL_VEIL); } + OPPONENT(SPECIES_PONYTA_GALAR) { Ability(ABILITY_PASTEL_VEIL); } OPPONENT(SPECIES_WYNAUT); } WHEN { TURN { MOVE(playerLeft, MOVE_TOXIC, target: opponentRight); } @@ -72,7 +72,7 @@ SINGLE_BATTLE_TEST("Pastel Veil prevents Toxic bad poison") GIVEN { ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_PONYTA_GALARIAN) { Ability(ABILITY_PASTEL_VEIL); } + OPPONENT(SPECIES_PONYTA_GALAR) { Ability(ABILITY_PASTEL_VEIL); } } WHEN { TURN { MOVE(player, MOVE_TOXIC); } } SCENE { @@ -89,7 +89,7 @@ DOUBLE_BATTLE_TEST("Pastel Veil prevents Toxic bad poison on partner") ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); - OPPONENT(SPECIES_PONYTA_GALARIAN) { Ability(ABILITY_PASTEL_VEIL); } + OPPONENT(SPECIES_PONYTA_GALAR) { Ability(ABILITY_PASTEL_VEIL); } OPPONENT(SPECIES_WYNAUT); } WHEN { TURN { MOVE(playerLeft, MOVE_TOXIC, target: opponentRight); } @@ -107,7 +107,7 @@ SINGLE_BATTLE_TEST("Pastel Veil prevents Toxic Spikes poison") ASSUME(gMovesInfo[MOVE_TOXIC_SPIKES].effect == EFFECT_TOXIC_SPIKES); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_PONYTA_GALARIAN) { Ability(ABILITY_PASTEL_VEIL); } + OPPONENT(SPECIES_PONYTA_GALAR) { Ability(ABILITY_PASTEL_VEIL); } } WHEN { TURN { MOVE(player, MOVE_TOXIC_SPIKES); } TURN { SWITCH(opponent, 1); } @@ -123,7 +123,7 @@ DOUBLE_BATTLE_TEST("Pastel Veil prevents Toxic Spikes poison on partner") ASSUME(gMovesInfo[MOVE_TOXIC_SPIKES].effect == EFFECT_TOXIC_SPIKES); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); - OPPONENT(SPECIES_PONYTA_GALARIAN) { Ability(ABILITY_PASTEL_VEIL); } + OPPONENT(SPECIES_PONYTA_GALAR) { Ability(ABILITY_PASTEL_VEIL); } OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WYNAUT); } WHEN { @@ -141,7 +141,7 @@ DOUBLE_BATTLE_TEST("Pastel Veil cures partner's poison on initial switch in") PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } - OPPONENT(SPECIES_PONYTA_GALARIAN) { Ability(ABILITY_PASTEL_VEIL); } + OPPONENT(SPECIES_PONYTA_GALAR) { Ability(ABILITY_PASTEL_VEIL); } } WHEN { TURN {} } SCENE { @@ -159,7 +159,7 @@ DOUBLE_BATTLE_TEST("Pastel Veil cures partner's poison on switch in") PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } OPPONENT(SPECIES_WYNAUT); - OPPONENT(SPECIES_PONYTA_GALARIAN) { Ability(ABILITY_PASTEL_VEIL); } + OPPONENT(SPECIES_PONYTA_GALAR) { Ability(ABILITY_PASTEL_VEIL); } } WHEN { TURN { SWITCH(opponentRight, 2); } } SCENE { diff --git a/test/battle/ability/protosynthesis.c b/test/battle/ability/protosynthesis.c index 58f10b366f73..2be9f81d284d 100644 --- a/test/battle/ability/protosynthesis.c +++ b/test/battle/ability/protosynthesis.c @@ -100,6 +100,125 @@ SINGLE_BATTLE_TEST("Protosynthesis activates on switch-in") } } -TO_DO_BATTLE_TEST("Protosynthesis activates in sun before Booster Energy"); -TO_DO_BATTLE_TEST("Protosynthesis activates even if the Pokémon is holding an Utility Umbrella"); -TO_DO_BATTLE_TEST("Protosynthesis doesn't activate if Cloud Nine/Air Lock is on the field"); +SINGLE_BATTLE_TEST("Protosynthesis boosts Attack 1st in case of a stat tie") +{ + GIVEN { + PLAYER(SPECIES_GREAT_TUSK) { Ability(ABILITY_PROTOSYNTHESIS); Attack(5); Defense(5); SpAttack(5); SpDefense(5); Speed(5); } + OPPONENT(SPECIES_GROUDON) { Ability(ABILITY_DROUGHT); Speed(5); } + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_DROUGHT); + ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); + MESSAGE("Great Tusk's Attack was heightened!"); + } +} + +SINGLE_BATTLE_TEST("Protosynthesis boosts Defense 2nd in case of a stat tie") +{ + GIVEN { + PLAYER(SPECIES_GREAT_TUSK) { Ability(ABILITY_PROTOSYNTHESIS); Attack(4); Defense(5); SpAttack(5); SpDefense(5); Speed(5); } + OPPONENT(SPECIES_GROUDON) { Ability(ABILITY_DROUGHT); Speed(5); } + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_DROUGHT); + ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); + MESSAGE("Great Tusk's Defense was heightened!"); + } +} + +SINGLE_BATTLE_TEST("Protosynthesis boosts Special Attack 3rd in case of a stat tie") +{ + GIVEN { + PLAYER(SPECIES_GREAT_TUSK) { Ability(ABILITY_PROTOSYNTHESIS); Attack(4); Defense(4); SpAttack(5); SpDefense(5); Speed(5); } + OPPONENT(SPECIES_GROUDON) { Ability(ABILITY_DROUGHT); Speed(5); } + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_DROUGHT); + ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); + MESSAGE("Great Tusk's Sp. Atk was heightened!"); + } +} + +SINGLE_BATTLE_TEST("Protosynthesis boosts Special Defense 4th in case of a stat tie") +{ + GIVEN { + PLAYER(SPECIES_GREAT_TUSK) { Ability(ABILITY_PROTOSYNTHESIS); Attack(4); Defense(4); SpAttack(4); SpDefense(5); Speed(5); } + OPPONENT(SPECIES_GROUDON) { Ability(ABILITY_DROUGHT); Speed(5); } + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_DROUGHT); + ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); + MESSAGE("Great Tusk's Sp. Def was heightened!"); + } +} + +SINGLE_BATTLE_TEST("Protosynthesis activates in Sun before Booster Energy") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_GREAT_TUSK) { Ability(ABILITY_PROTOSYNTHESIS); Item(ITEM_BOOSTER_ENERGY); } + OPPONENT(SPECIES_NINETALES) { Ability(ABILITY_DROUGHT); } + } WHEN { + TURN { SWITCH(player, 1); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_DROUGHT); + ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); + } THEN { + EXPECT_EQ(player->item, ITEM_BOOSTER_ENERGY); + } +} + +SINGLE_BATTLE_TEST("Protosynthesis doesn't activate for a transformed battler") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_GREAT_TUSK) { Ability(ABILITY_PROTOSYNTHESIS); Item(ITEM_BOOSTER_ENERGY); } + OPPONENT(SPECIES_NINETALES) { Ability(ABILITY_DROUGHT); Item(ITEM_BOOSTER_ENERGY); } + } WHEN { + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_TRANSFORM); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_DROUGHT); + ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TRANSFORM, opponent); + NOT ABILITY_POPUP(opponent, ABILITY_PROTOSYNTHESIS); + } THEN { + EXPECT_EQ(player->item, ITEM_BOOSTER_ENERGY); + EXPECT_EQ(opponent->item, ITEM_BOOSTER_ENERGY); + EXPECT_EQ(opponent->ability, ABILITY_PROTOSYNTHESIS); + } +} + +SINGLE_BATTLE_TEST("Protosynthesis activates even if the Pokémon is holding an Utility Umbrella") +{ + GIVEN { + PLAYER(SPECIES_GREAT_TUSK) { Ability(ABILITY_PROTOSYNTHESIS); Item(ITEM_UTILITY_UMBRELLA); } + OPPONENT(SPECIES_NINETALES) { Ability(ABILITY_DROUGHT); } + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_DROUGHT); + ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); + } +} + +SINGLE_BATTLE_TEST("Protosynthesis doesn't activate if Cloud Nine/Air Lock is on the field") +{ + u32 species, ability; + PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } + PARAMETRIZE { species = SPECIES_GOLDUCK; ability = ABILITY_CLOUD_NINE; } + + GIVEN { + PLAYER(SPECIES_GREAT_TUSK) { Ability(ABILITY_PROTOSYNTHESIS); } + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(opponent, MOVE_SUNNY_DAY); } + } SCENE { + ABILITY_POPUP(opponent, ability); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNNY_DAY, opponent); + NOT ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); + } +} diff --git a/test/battle/ability/quark_drive.c b/test/battle/ability/quark_drive.c index 4e81b012ae83..928ee45eb581 100644 --- a/test/battle/ability/quark_drive.c +++ b/test/battle/ability/quark_drive.c @@ -100,3 +100,109 @@ SINGLE_BATTLE_TEST("Quark Drive activates on switch-in") MESSAGE("Iron Moth's Sp. Atk was heightened!"); } } + +SINGLE_BATTLE_TEST("Quark Drive activates on Electric Terrain even if not grounded") +{ + GIVEN { + ASSUME(gSpeciesInfo[SPECIES_IRON_JUGULIS].types[0] == TYPE_FLYING || gSpeciesInfo[SPECIES_IRON_JUGULIS].types[1] == TYPE_FLYING); + PLAYER(SPECIES_IRON_JUGULIS) { Ability(ABILITY_QUARK_DRIVE); } + OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); }; + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_ELECTRIC_SURGE); + ABILITY_POPUP(player, ABILITY_QUARK_DRIVE); + } +} + +SINGLE_BATTLE_TEST("Quark Drive boosts Attack 1st in case of a stat tie") +{ + GIVEN { + PLAYER(SPECIES_IRON_TREADS) { Ability(ABILITY_QUARK_DRIVE); Attack(5); Defense(5); SpAttack(5); SpDefense(5); Speed(5); } + OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); Speed(5); } + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_ELECTRIC_SURGE); + ABILITY_POPUP(player, ABILITY_QUARK_DRIVE); + MESSAGE("Iron Treads's Attack was heightened!"); + } +} + +SINGLE_BATTLE_TEST("Quark Drive boosts Defense 2nd in case of a stat tie") +{ + GIVEN { + PLAYER(SPECIES_IRON_TREADS) { Ability(ABILITY_QUARK_DRIVE); Attack(4); Defense(5); SpAttack(5); SpDefense(5); Speed(5); } + OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); Speed(5); } + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_ELECTRIC_SURGE); + ABILITY_POPUP(player, ABILITY_QUARK_DRIVE); + MESSAGE("Iron Treads's Defense was heightened!"); + } +} + +SINGLE_BATTLE_TEST("Quark Drive boosts Special Attack 3rd in case of a stat tie") +{ + GIVEN { + PLAYER(SPECIES_IRON_TREADS) { Ability(ABILITY_QUARK_DRIVE); Attack(4); Defense(4); SpAttack(5); SpDefense(5); Speed(5); } + OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); Speed(5); } + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_ELECTRIC_SURGE); + ABILITY_POPUP(player, ABILITY_QUARK_DRIVE); + MESSAGE("Iron Treads's Sp. Atk was heightened!"); + } +} + +SINGLE_BATTLE_TEST("Quark Drive boosts Special Defense 4th in case of a stat tie") +{ + GIVEN { + PLAYER(SPECIES_IRON_TREADS) { Ability(ABILITY_QUARK_DRIVE); Attack(4); Defense(4); SpAttack(4); SpDefense(5); Speed(5); } + OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); Speed(5); } + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_ELECTRIC_SURGE); + ABILITY_POPUP(player, ABILITY_QUARK_DRIVE); + MESSAGE("Iron Treads's Sp. Def was heightened!"); + } +} + +SINGLE_BATTLE_TEST("Quark Drive activates in Electric Terrain before Booster Energy") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_IRON_TREADS) { Ability(ABILITY_QUARK_DRIVE); Item(ITEM_BOOSTER_ENERGY); } + OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); } + } WHEN { + TURN { SWITCH(player, 1); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_ELECTRIC_SURGE); + ABILITY_POPUP(player, ABILITY_QUARK_DRIVE); + } THEN { + EXPECT_EQ(player->item, ITEM_BOOSTER_ENERGY); + } +} + +SINGLE_BATTLE_TEST("Quark Drive doesn't activate for a transformed battler") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_IRON_TREADS) { Ability(ABILITY_QUARK_DRIVE); Item(ITEM_BOOSTER_ENERGY); } + OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); Item(ITEM_BOOSTER_ENERGY); } + } WHEN { + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_TRANSFORM); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_ELECTRIC_SURGE); + ABILITY_POPUP(player, ABILITY_QUARK_DRIVE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TRANSFORM, opponent); + NOT ABILITY_POPUP(opponent, ABILITY_QUARK_DRIVE); + } THEN { + EXPECT_EQ(player->item, ITEM_BOOSTER_ENERGY); + EXPECT_EQ(opponent->item, ITEM_BOOSTER_ENERGY); + EXPECT_EQ(opponent->ability, ABILITY_QUARK_DRIVE); + } +} diff --git a/test/battle/ability/quick_draw.c b/test/battle/ability/quick_draw.c index cdf237475b52..9c5afb6193f6 100644 --- a/test/battle/ability/quick_draw.c +++ b/test/battle/ability/quick_draw.c @@ -5,7 +5,7 @@ SINGLE_BATTLE_TEST("Quick Draw has a 30% chance of going first") { PASSES_RANDOMLY(3, 10, RNG_QUICK_DRAW); GIVEN { - PLAYER(SPECIES_SLOWBRO_GALARIAN) { Ability(ABILITY_QUICK_DRAW); Speed(1); } + PLAYER(SPECIES_SLOWBRO_GALAR) { Ability(ABILITY_QUICK_DRAW); Speed(1); } OPPONENT(SPECIES_WOBBUFFET) { Speed(100); } } WHEN { TURN { MOVE(player, MOVE_TACKLE); } @@ -20,7 +20,7 @@ SINGLE_BATTLE_TEST("Quick Draw does not activate 70% of the time") { PASSES_RANDOMLY(7, 10, RNG_QUICK_DRAW); GIVEN { - PLAYER(SPECIES_SLOWBRO_GALARIAN) { Ability(ABILITY_QUICK_DRAW); Speed(1); } + PLAYER(SPECIES_SLOWBRO_GALAR) { Ability(ABILITY_QUICK_DRAW); Speed(1); } OPPONENT(SPECIES_WOBBUFFET) { Speed(100); } } WHEN { TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_TACKLE); } diff --git a/test/battle/ability/storm_drain.c b/test/battle/ability/storm_drain.c index 38d4a9be7595..01f97de6fc30 100644 --- a/test/battle/ability/storm_drain.c +++ b/test/battle/ability/storm_drain.c @@ -6,7 +6,7 @@ SINGLE_BATTLE_TEST("Storm Drain absorbs Water-type moves and increases the Sp. A GIVEN { ASSUME(gMovesInfo[MOVE_WATER_GUN].type == TYPE_WATER); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_GASTRODON_EAST_SEA) { Ability(ABILITY_STORM_DRAIN); } + OPPONENT(SPECIES_GASTRODON_EAST) { Ability(ABILITY_STORM_DRAIN); } } WHEN { TURN { MOVE(player, MOVE_WATER_GUN); MOVE(opponent, MOVE_CELEBRATE); } } SCENE { @@ -37,7 +37,7 @@ DOUBLE_BATTLE_TEST("Storm Drain forces single-target Water-type moves to target ASSUME(gMovesInfo[MOVE_WATER_GUN].type == TYPE_WATER); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_GASTRODON_EAST_SEA) { Ability(ABILITY_STORM_DRAIN); } + OPPONENT(SPECIES_GASTRODON_EAST) { Ability(ABILITY_STORM_DRAIN); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { diff --git a/test/battle/ability/switch_in_abilities.c b/test/battle/ability/switch_in_abilities.c index 79cf2b2dc966..c8a8c54dd3d9 100644 --- a/test/battle/ability/switch_in_abilities.c +++ b/test/battle/ability/switch_in_abilities.c @@ -101,8 +101,8 @@ DOUBLE_BATTLE_TEST("Switch-in abilities trigger in Speed Order after post-KO swi PLAYER(SPECIES_GYARADOS) { Speed(spdPlayer2); Ability(ABILITY_INTIMIDATE); } OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(1); } OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(1); } - OPPONENT(SPECIES_WEEZING_GALARIAN) { Speed(spdOpponent1); Ability(ABILITY_MISTY_SURGE); } - OPPONENT(SPECIES_VULPIX_ALOLAN) { Speed(spdOpponent2); Ability(ABILITY_SNOW_WARNING); } + OPPONENT(SPECIES_WEEZING_GALAR) { Speed(spdOpponent1); Ability(ABILITY_MISTY_SURGE); } + OPPONENT(SPECIES_VULPIX_ALOLA) { Speed(spdOpponent2); Ability(ABILITY_SNOW_WARNING); } } WHEN { TURN { MOVE(playerLeft, MOVE_EXPLOSION); SEND_OUT(playerLeft, 2); SEND_OUT(opponentLeft, 2); SEND_OUT(playerRight, 3); SEND_OUT(opponentRight, 3); } TURN { ; } diff --git a/test/battle/ability/tangling_hair.c b/test/battle/ability/tangling_hair.c index 0dbc0264cecc..508678a03762 100644 --- a/test/battle/ability/tangling_hair.c +++ b/test/battle/ability/tangling_hair.c @@ -50,10 +50,10 @@ SINGLE_BATTLE_TEST("Tangling Hair does not cause Rocky Helmet miss activation") } } -SINGLE_BATTLE_TEST("Tangling Hair Speed stat drop triggers defiant") +SINGLE_BATTLE_TEST("Tangling Hair Speed stat drop triggers defiant and keeps original attacker/target") { GIVEN { - PLAYER(SPECIES_DUGTRIO) { Ability(ABILITY_TANGLING_HAIR); } + PLAYER(SPECIES_DUGTRIO) { Ability(ABILITY_TANGLING_HAIR); Item(ITEM_ROCKY_HELMET); } OPPONENT(SPECIES_PAWNIARD) { Ability(ABILITY_DEFIANT); } } WHEN { TURN { MOVE(opponent, MOVE_TACKLE); } @@ -64,5 +64,7 @@ SINGLE_BATTLE_TEST("Tangling Hair Speed stat drop triggers defiant") MESSAGE("Foe Pawniard's Speed fell!"); ABILITY_POPUP(opponent, ABILITY_DEFIANT); MESSAGE("Foe Pawniard's Attack sharply rose!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Foe Pawniard was hurt by Dugtrio's Rocky Helmet!"); } } diff --git a/test/battle/ability/trace.c b/test/battle/ability/trace.c index acc49bcf1398..3042f8e22bf9 100644 --- a/test/battle/ability/trace.c +++ b/test/battle/ability/trace.c @@ -80,6 +80,21 @@ SINGLE_BATTLE_TEST("Trace will copy an opponent's ability whenever it has the ch } } + +SINGLE_BATTLE_TEST("Trace copies opponent's Intimidate and triggers it immediately") +{ + GIVEN { + PLAYER(SPECIES_RALTS) { Ability(ABILITY_TRACE); } + OPPONENT(SPECIES_MASQUERAIN) { Ability(ABILITY_INTIMIDATE); } + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(player, ABILITY_TRACE); + ABILITY_POPUP(player, ABILITY_INTIMIDATE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + } +} + DOUBLE_BATTLE_TEST("Trace respects the turn order") { GIVEN { diff --git a/test/battle/ability/volt_absorb.c b/test/battle/ability/volt_absorb.c index b438e794f0bd..93498bd1c711 100644 --- a/test/battle/ability/volt_absorb.c +++ b/test/battle/ability/volt_absorb.c @@ -51,7 +51,7 @@ SINGLE_BATTLE_TEST("Volt Absorb is only triggered once on multi strike moves") ASSUME(gMovesInfo[MOVE_FURY_SWIPES].type == TYPE_NORMAL); ASSUME(gMovesInfo[MOVE_FURY_SWIPES].effect == EFFECT_MULTI_HIT); PLAYER(SPECIES_JOLTEON) { Ability(ABILITY_VOLT_ABSORB); HP(1); MaxHP(100); } - OPPONENT(SPECIES_GRAVELER_ALOLAN) { Ability(ABILITY_GALVANIZE); } + OPPONENT(SPECIES_GRAVELER_ALOLA) { Ability(ABILITY_GALVANIZE); } } WHEN { TURN { MOVE(opponent, MOVE_FURY_SWIPES); } } SCENE { @@ -69,7 +69,7 @@ DOUBLE_BATTLE_TEST("Volt Absorb does not stop Electric Typed Explosion from dama ASSUME(gMovesInfo[MOVE_EXPLOSION].type == TYPE_NORMAL); PLAYER(SPECIES_JOLTEON) { Ability(ABILITY_VOLT_ABSORB); HP(1); MaxHP(100); } PLAYER(SPECIES_ABRA); - OPPONENT(SPECIES_GRAVELER_ALOLAN) { Ability(ABILITY_GALVANIZE); } + OPPONENT(SPECIES_GRAVELER_ALOLA) { Ability(ABILITY_GALVANIZE); } OPPONENT(SPECIES_WYNAUT); } WHEN { TURN { MOVE(opponentLeft, MOVE_EXPLOSION); } diff --git a/test/battle/ability/zen_mode.c b/test/battle/ability/zen_mode.c index 2734f7a9ec6a..728921a484bd 100644 --- a/test/battle/ability/zen_mode.c +++ b/test/battle/ability/zen_mode.c @@ -4,8 +4,8 @@ SINGLE_BATTLE_TEST("Zen Mode switches Darmanitan's form when HP is half or less at the end of the turn") { u16 standardSpecies, zenSpecies; - PARAMETRIZE { standardSpecies = SPECIES_DARMANITAN_STANDARD_MODE; zenSpecies = SPECIES_DARMANITAN_ZEN_MODE; } - PARAMETRIZE { standardSpecies = SPECIES_DARMANITAN_GALARIAN_STANDARD_MODE; zenSpecies = SPECIES_DARMANITAN_GALARIAN_ZEN_MODE; } + PARAMETRIZE { standardSpecies = SPECIES_DARMANITAN_STANDARD; zenSpecies = SPECIES_DARMANITAN_ZEN; } + PARAMETRIZE { standardSpecies = SPECIES_DARMANITAN_GALAR_STANDARD; zenSpecies = SPECIES_DARMANITAN_GALAR_ZEN; } GIVEN { ASSUME(gSpeciesInfo[standardSpecies].baseHP == 105); @@ -33,8 +33,8 @@ SINGLE_BATTLE_TEST("Zen Mode switches Darmanitan's form when HP is half or less SINGLE_BATTLE_TEST("Zen Mode switches Darmanitan's form when HP is half or less before the first turn") { u16 standardSpecies, zenSpecies; - PARAMETRIZE { standardSpecies = SPECIES_DARMANITAN_STANDARD_MODE; zenSpecies = SPECIES_DARMANITAN_ZEN_MODE; } - PARAMETRIZE { standardSpecies = SPECIES_DARMANITAN_GALARIAN_STANDARD_MODE; zenSpecies = SPECIES_DARMANITAN_GALARIAN_ZEN_MODE; } + PARAMETRIZE { standardSpecies = SPECIES_DARMANITAN_STANDARD; zenSpecies = SPECIES_DARMANITAN_ZEN; } + PARAMETRIZE { standardSpecies = SPECIES_DARMANITAN_GALAR_STANDARD; zenSpecies = SPECIES_DARMANITAN_GALAR_ZEN; } GIVEN { ASSUME(gSpeciesInfo[standardSpecies].baseHP == 105); @@ -61,8 +61,8 @@ SINGLE_BATTLE_TEST("Zen Mode switches Darmanitan's form when HP is half or less SINGLE_BATTLE_TEST("Zen Mode switches Darmanitan's form when HP is healed above half") { u16 standardSpecies, zenSpecies; - PARAMETRIZE { standardSpecies = SPECIES_DARMANITAN_STANDARD_MODE; zenSpecies = SPECIES_DARMANITAN_ZEN_MODE; } - PARAMETRIZE { standardSpecies = SPECIES_DARMANITAN_GALARIAN_STANDARD_MODE; zenSpecies = SPECIES_DARMANITAN_GALARIAN_ZEN_MODE; } + PARAMETRIZE { standardSpecies = SPECIES_DARMANITAN_STANDARD; zenSpecies = SPECIES_DARMANITAN_ZEN; } + PARAMETRIZE { standardSpecies = SPECIES_DARMANITAN_GALAR_STANDARD; zenSpecies = SPECIES_DARMANITAN_GALAR_ZEN; } GIVEN { ASSUME(gSpeciesInfo[standardSpecies].baseHP == 105); diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index b3927509f026..a70163af18ae 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -88,7 +88,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Number of hits to KO calculati PLAYER(SPECIES_VENUSAUR) { Level(30); Moves(MOVE_TACKLE); } // Opponent party courtesy of Skolgrahd, who triggered the bug in the first place OPPONENT(SPECIES_PIKACHU) { Level(100); Moves(MOVE_ZIPPY_ZAP, MOVE_EXTREME_SPEED, MOVE_IRON_TAIL, MOVE_KNOCK_OFF); } - OPPONENT(SPECIES_NINETALES_ALOLAN) { Level(100); Moves(MOVE_AURORA_VEIL, MOVE_BLIZZARD, MOVE_MOONBLAST, MOVE_DISABLE); } + OPPONENT(SPECIES_NINETALES_ALOLA) { Level(100); Moves(MOVE_AURORA_VEIL, MOVE_BLIZZARD, MOVE_MOONBLAST, MOVE_DISABLE); } OPPONENT(SPECIES_WEAVILE) { Level(100); Moves(MOVE_NIGHT_SLASH, MOVE_TRIPLE_AXEL, MOVE_ICE_SHARD, MOVE_FAKE_OUT); } OPPONENT(SPECIES_DITTO) { Level(100); Moves(MOVE_TRANSFORM); } OPPONENT(SPECIES_TYPHLOSION) { Level(100); Moves(MOVE_ERUPTION, MOVE_HEAT_WAVE, MOVE_FOCUS_BLAST, MOVE_EXTRASENSORY); } @@ -122,9 +122,9 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Avoid infinite loop if damage GIVEN { ASSUME(gItemsInfo[ITEM_LEFTOVERS].holdEffect == HOLD_EFFECT_LEFTOVERS); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_MON_CHOICES); - PLAYER(SPECIES_MEOWTH_GALARIAN) { Level(100); Moves(MOVE_GROWL, MOVE_FAKE_OUT, MOVE_HONE_CLAWS); } + PLAYER(SPECIES_MEOWTH_GALAR) { Level(100); Moves(MOVE_GROWL, MOVE_FAKE_OUT, MOVE_HONE_CLAWS); } // Scenario courtesy of Duke, who triggered the bug in the first place - OPPONENT(SPECIES_MEOWTH_GALARIAN) { Level(5); Moves(MOVE_GROWL, MOVE_FAKE_OUT, MOVE_HONE_CLAWS); } + OPPONENT(SPECIES_MEOWTH_GALAR) { Level(5); Moves(MOVE_GROWL, MOVE_FAKE_OUT, MOVE_HONE_CLAWS); } OPPONENT(SPECIES_GEODUDE) { Level(5); Moves(MOVE_DOUBLE_EDGE); } OPPONENT(SPECIES_GEODUDE) { Level(5); Moves(MOVE_DOUBLE_EDGE); } OPPONENT(SPECIES_NOSEPASS) { Level(5); Moves(MOVE_DOUBLE_EDGE); } @@ -215,23 +215,97 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Mid-battle switches prioritize { GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES); - PLAYER(SPECIES_SWELLOW) { Level(30); Moves(MOVE_WING_ATTACK, MOVE_BOOMBURST); Speed(5); } + PLAYER(SPECIES_SWELLOW) { Level(30); Moves(MOVE_WING_ATTACK, MOVE_BOOMBURST); Speed(5); SpAttack(50); } OPPONENT(SPECIES_PONYTA) { Level(1); Moves(MOVE_NONE); Speed(4); } // Forces switchout - OPPONENT(SPECIES_ARON) { Level(30); Moves(MOVE_HEADBUTT); Speed(4); SpDefense(41); } // Mid battle, AI sends out Aron - OPPONENT(SPECIES_ELECTRODE) { Level(30); Moves(MOVE_CHARGE_BEAM); Speed(6); } + OPPONENT(SPECIES_ARON) { Level(30); Moves(MOVE_IRON_HEAD); Speed(4); SpDefense(50); } // Mid battle, AI sends out Aron + OPPONENT(SPECIES_ELECTRODE) { Level(30); Ability(ABILITY_STATIC); Moves(MOVE_CHARGE_BEAM); Speed(6); SpDefense(53);} } WHEN { TURN { MOVE(player, MOVE_WING_ATTACK); EXPECT_SWITCH(opponent, 1); } } } +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Mid-battle switches prioritize offensive options after slow U-Turn") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_FALSE_SWIPE].effect == EFFECT_FALSE_SWIPE); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES); + PLAYER(SPECIES_SWELLOW) { Level(30); Moves(MOVE_FALSE_SWIPE, MOVE_BOOMBURST); Speed(5); SpAttack(50); } + OPPONENT(SPECIES_PONYTA) { Level(1); Moves(MOVE_U_TURN); Speed(4); } // Forces switchout + OPPONENT(SPECIES_ARON) { Level(30); Moves(MOVE_IRON_HEAD); Speed(4); SpDefense(50); } + OPPONENT(SPECIES_ELECTRODE) { Level(30); Ability(ABILITY_STATIC); Moves(MOVE_CHARGE_BEAM); Speed(6); SpDefense(53); } + } WHEN { + TURN { MOVE(player, MOVE_FALSE_SWIPE); EXPECT_SEND_OUT(opponent, 2); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Mid-battle switches prioritize offensive options after Eject Button") +{ + GIVEN { + ASSUME(gItemsInfo[ITEM_EJECT_BUTTON].holdEffect == HOLD_EFFECT_EJECT_BUTTON); + ASSUME(gMovesInfo[MOVE_FALSE_SWIPE].effect == EFFECT_FALSE_SWIPE); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES); + PLAYER(SPECIES_SWELLOW) { Level(30); Moves(MOVE_FALSE_SWIPE, MOVE_BOOMBURST); Speed(5); SpAttack(50); } + OPPONENT(SPECIES_PONYTA) { Level(1); Item(ITEM_EJECT_BUTTON); Moves(MOVE_TACKLE); Speed(4); } // Forces switchout + OPPONENT(SPECIES_ARON) { Level(30); Moves(MOVE_IRON_HEAD); Speed(4); SpDefense(50); } + OPPONENT(SPECIES_ELECTRODE) { Level(30); Ability(ABILITY_STATIC); Moves(MOVE_CHARGE_BEAM); Speed(6); SpDefense(53); } + } WHEN { + TURN { MOVE(player, MOVE_FALSE_SWIPE); EXPECT_SEND_OUT(opponent, 2); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Mid-battle switches prioritize offensive options after Eject Pack") +{ + GIVEN { + ASSUME(gItemsInfo[ITEM_EJECT_PACK].holdEffect == HOLD_EFFECT_EJECT_PACK); + ASSUME(gMovesInfo[MOVE_GROWL].effect == EFFECT_ATTACK_DOWN); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES); + PLAYER(SPECIES_SWELLOW) { Level(30); Moves(MOVE_GROWL, MOVE_BOOMBURST); Speed(5); SpAttack(50); } + OPPONENT(SPECIES_PONYTA) { Level(1); Item(ITEM_EJECT_PACK); Moves(MOVE_TACKLE); Speed(4); } // Forces switchout + OPPONENT(SPECIES_ARON) { Level(30); Moves(MOVE_IRON_HEAD); Speed(4); SpDefense(50); } + OPPONENT(SPECIES_ELECTRODE) { Level(30); Ability(ABILITY_STATIC); Moves(MOVE_CHARGE_BEAM); Speed(6); SpDefense(53); } + } WHEN { + TURN { MOVE(player, MOVE_GROWL); EXPECT_SEND_OUT(opponent, 2); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Mid-battle switches prioritize defensive options after Eject Pack if mon outspeeds") +{ + GIVEN { + ASSUME(gItemsInfo[ITEM_EJECT_PACK].holdEffect == HOLD_EFFECT_EJECT_PACK); + ASSUME(MoveHasAdditionalEffectSelf(MOVE_OVERHEAT, MOVE_EFFECT_SP_ATK_MINUS_2) == TRUE); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES); + PLAYER(SPECIES_SWELLOW) { Level(30); Moves(MOVE_WING_ATTACK, MOVE_BOOMBURST); Speed(5); SpAttack(50); } + OPPONENT(SPECIES_PONYTA) { Level(1); Item(ITEM_EJECT_PACK); Moves(MOVE_OVERHEAT); Speed(6); } // Forces switchout + OPPONENT(SPECIES_ARON) { Level(30); Moves(MOVE_IRON_HEAD); Speed(4); SpDefense(50); } + OPPONENT(SPECIES_ELECTRODE) { Level(30); Ability(ABILITY_STATIC); Moves(MOVE_CHARGE_BEAM); Speed(6); SpDefense(53); } + } WHEN { + TURN { MOVE(player, MOVE_WING_ATTACK); EXPECT_SEND_OUT(opponent, 1); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Mid-battle switches prioritize offensive options after Eject Pack if mon outspeeds but was Intimidate'd") +{ + GIVEN { + ASSUME(gItemsInfo[ITEM_EJECT_PACK].holdEffect == HOLD_EFFECT_EJECT_PACK); + ASSUME(MoveHasAdditionalEffectSelf(MOVE_OVERHEAT, MOVE_EFFECT_SP_ATK_MINUS_2) == TRUE); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES); + PLAYER(SPECIES_STARAPTOR) { Level(30); Ability(ABILITY_INTIMIDATE); Moves(MOVE_WING_ATTACK, MOVE_BOOMBURST); Speed(5); SpAttack(50); } + OPPONENT(SPECIES_PONYTA) { Level(1); Item(ITEM_EJECT_PACK); Moves(MOVE_OVERHEAT); Speed(6); } // Forces switchout + OPPONENT(SPECIES_ARON) { Level(30); Moves(MOVE_IRON_HEAD); Speed(4); SpDefense(50); } + OPPONENT(SPECIES_ELECTRODE) { Level(30); Ability(ABILITY_STATIC); Moves(MOVE_CHARGE_BEAM); Speed(6); SpDefense(53); } + } WHEN { + TURN { MOVE(player, MOVE_WING_ATTACK); EXPECT_SWITCH(opponent, 2); } + } +} + AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Post-KO switches prioritize offensive options") { GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES); PLAYER(SPECIES_SWELLOW) { Level(30); Moves(MOVE_WING_ATTACK, MOVE_BOOMBURST); Speed(5); } OPPONENT(SPECIES_PONYTA) { Level(1); Moves(MOVE_TACKLE); Speed(4); } - OPPONENT(SPECIES_ARON) { Level(30); Moves(MOVE_HEADBUTT); Speed(4); } // Mid battle, AI sends out Aron - OPPONENT(SPECIES_ELECTRODE) { Level(30); Moves(MOVE_CHARGE_BEAM); Speed(6); } + OPPONENT(SPECIES_ARON) { Level(30); Moves(MOVE_IRON_HEAD); Speed(4); } // Mid battle, AI sends out Aron + OPPONENT(SPECIES_ELECTRODE) { Level(30); Ability(ABILITY_STATIC); Moves(MOVE_CHARGE_BEAM); Speed(6); } } WHEN { TURN { MOVE(player, MOVE_WING_ATTACK); EXPECT_SEND_OUT(opponent, 2); } } @@ -360,7 +434,7 @@ AI_SINGLE_BATTLE_TEST("AI won't use trapping behaviour if player only has 1 mon AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if mon would be OKHO'd and they have a good switchin 50% of the time") { - PASSES_RANDOMLY(50, 100, RNG_AI_HASBADODDS); + PASSES_RANDOMLY(50, 100, RNG_AI_SWITCH_HASBADODDS); GIVEN { ASSUME(gSpeciesInfo[SPECIES_RHYDON].types[0] == TYPE_GROUND); ASSUME(gSpeciesInfo[SPECIES_PELIPPER].types[0] == TYPE_WATER); @@ -375,3 +449,102 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if mon would TURN { MOVE(player, MOVE_THUNDERBOLT) ; EXPECT_SWITCH(opponent, 1); } } } + +AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch out if it can't deal damage to a mon with Wonder Guard 66% of the time") +{ + PASSES_RANDOMLY(66, 100, RNG_AI_SWITCH_WONDER_GUARD); + GIVEN { + ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].types[0] == TYPE_BUG); + ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].types[1] == TYPE_GHOST); + ASSUME(gMovesInfo[MOVE_TACKLE].type == TYPE_NORMAL); + ASSUME(gMovesInfo[MOVE_SHADOW_BALL].type == TYPE_GHOST); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_SHEDINJA) { Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_SHADOW_BALL); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE) ; EXPECT_SWITCH(opponent, 1); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it can't deal damage to a mon with Wonder Guard 100% of the time") +{ + PASSES_RANDOMLY(100, 100, RNG_AI_SWITCH_WONDER_GUARD); + GIVEN { + ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].types[0] == TYPE_BUG); + ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].types[1] == TYPE_GHOST); + ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].abilities[0] == ABILITY_WONDER_GUARD); + ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].abilities[1] == ABILITY_NONE); + ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].abilities[2] == ABILITY_NONE); + ASSUME(gMovesInfo[MOVE_TACKLE].type == TYPE_NORMAL); + ASSUME(gMovesInfo[MOVE_SHADOW_BALL].type == TYPE_GHOST); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); + PLAYER(SPECIES_SHEDINJA) { Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_SHADOW_BALL); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE) ; EXPECT_SWITCH(opponent, 1); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has been Toxic'd for at least two turns 50% of the time with more than 1/3 HP remaining") +{ + PASSES_RANDOMLY(50, 100, RNG_AI_SWITCH_BADLY_POISONED); + GIVEN { + ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); + PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE, MOVE_CELEBRATE, MOVE_TOXIC); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); } + } WHEN { + TURN { MOVE(player, MOVE_TOXIC); EXPECT_MOVE(opponent, MOVE_TACKLE); } + TURN { MOVE(player, MOVE_TACKLE); EXPECT_MOVE(opponent, MOVE_TACKLE); } + TURN { MOVE(player, MOVE_TACKLE); EXPECT_SWITCH(opponent, 1); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has been Curse'd 50% of the time") +{ + PASSES_RANDOMLY(50, 100, RNG_AI_SWITCH_CURSED); + GIVEN { + ASSUME(gMovesInfo[MOVE_CURSE].effect == EFFECT_CURSE); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); + PLAYER(SPECIES_DUSCLOPS) { Moves(MOVE_FIRE_PUNCH, MOVE_CURSE); } + PLAYER(SPECIES_MILOTIC) { Moves(MOVE_WATER_GUN); } + OPPONENT(SPECIES_DUSCLOPS) { Moves(MOVE_SHADOW_BALL); } + OPPONENT(SPECIES_DUSCLOPS) { Moves(MOVE_SHADOW_BALL); } + } WHEN { + TURN { MOVE(player, MOVE_CURSE) ; EXPECT_MOVE(opponent, MOVE_SHADOW_BALL); } + TURN { MOVE(player, MOVE_FIRE_PUNCH); EXPECT_SWITCH(opponent, 1); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has been Nightmare'd 33% of the time") +{ + PASSES_RANDOMLY(33, 100, RNG_AI_SWITCH_NIGHTMARE); + GIVEN { + ASSUME(gMovesInfo[MOVE_NIGHTMARE].effect == EFFECT_NIGHTMARE); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); + PLAYER(SPECIES_GENGAR) { Moves(MOVE_NIGHTMARE); } + OPPONENT(SPECIES_DUSCLOPS) { Moves(MOVE_SHADOW_BALL); Status1(STATUS1_SLEEP); } + OPPONENT(SPECIES_DUSCLOPS) { Moves(MOVE_SHADOW_BALL); } + } WHEN { + TURN { MOVE(player, MOVE_NIGHTMARE) ; EXPECT_MOVE(opponent, MOVE_SHADOW_BALL); } + TURN { MOVE(player, MOVE_NIGHTMARE) ; EXPECT_SWITCH(opponent, 1); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has been Leech Seed'd 25% of the time") +{ + PASSES_RANDOMLY(25, 100, RNG_AI_SWITCH_SEEDED); + GIVEN { + ASSUME(gMovesInfo[MOVE_LEECH_SEED].effect == EFFECT_LEECH_SEED); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); + PLAYER(SPECIES_WHIMSICOTT) { Moves(MOVE_LEECH_SEED); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); } + } WHEN { + TURN { MOVE(player, MOVE_LEECH_SEED) ; EXPECT_MOVE(opponent, MOVE_TACKLE); } + TURN { MOVE(player, MOVE_LEECH_SEED); EXPECT_SWITCH(opponent, 1); } + } +} diff --git a/test/battle/crit_chance.c b/test/battle/crit_chance.c index d4c8e2b1a007..2f057cc99b53 100644 --- a/test/battle/crit_chance.c +++ b/test/battle/crit_chance.c @@ -215,7 +215,7 @@ SINGLE_BATTLE_TEST("Crit Chance: Signature items Leek and Lucky Punch increase t PASSES_RANDOMLY(1, 2, RNG_CRITICAL_HIT); PARAMETRIZE { species = SPECIES_FARFETCHD; item = ITEM_LEEK; } - PARAMETRIZE { species = SPECIES_FARFETCHD_GALARIAN; item = ITEM_LEEK; } + PARAMETRIZE { species = SPECIES_FARFETCHD_GALAR; item = ITEM_LEEK; } PARAMETRIZE { species = SPECIES_SIRFETCHD; item = ITEM_LEEK; } PARAMETRIZE { species = SPECIES_CHANSEY; item = ITEM_LUCKY_PUNCH; } diff --git a/test/battle/form_change/begin_battle.c b/test/battle/form_change/begin_battle.c index f240b5ca0762..bee9c4fe6b24 100644 --- a/test/battle/form_change/begin_battle.c +++ b/test/battle/form_change/begin_battle.c @@ -19,27 +19,27 @@ SINGLE_BATTLE_TEST("Zacian changes into its Crowned Form when holding the Rusted PARAMETRIZE { item = ITEM_NONE; } PARAMETRIZE { item = ITEM_RUSTED_SWORD; } GIVEN { - PLAYER(SPECIES_ZACIAN_HERO_OF_MANY_BATTLES) { Item(item); } + PLAYER(SPECIES_ZACIAN_HERO) { Item(item); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_CELEBRATE); } } THEN { if (item == ITEM_NONE) - EXPECT_EQ(player->species, SPECIES_ZACIAN_HERO_OF_MANY_BATTLES); + EXPECT_EQ(player->species, SPECIES_ZACIAN_HERO); else - EXPECT_EQ(player->species, SPECIES_ZACIAN_CROWNED_SWORD); + EXPECT_EQ(player->species, SPECIES_ZACIAN_CROWNED); } } SINGLE_BATTLE_TEST("Zacian's Iron Head becomes Behemoth Blade upon form change") { GIVEN { - PLAYER(SPECIES_ZACIAN_HERO_OF_MANY_BATTLES) { Item(ITEM_RUSTED_SWORD); Moves(MOVE_IRON_HEAD, MOVE_CELEBRATE); } + PLAYER(SPECIES_ZACIAN_HERO) { Item(ITEM_RUSTED_SWORD); Moves(MOVE_IRON_HEAD, MOVE_CELEBRATE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_CELEBRATE); } } THEN { - ASSUME(player->species == SPECIES_ZACIAN_CROWNED_SWORD); // Assumes form change worked. + ASSUME(player->species == SPECIES_ZACIAN_CROWNED); // Assumes form change worked. EXPECT_EQ(player->moves[0], MOVE_BEHEMOTH_BLADE); } } @@ -50,27 +50,27 @@ SINGLE_BATTLE_TEST("Zamazenta changes into its Crowned Form when holding the Rus PARAMETRIZE { item = ITEM_NONE; } PARAMETRIZE { item = ITEM_RUSTED_SHIELD; } GIVEN { - PLAYER(SPECIES_ZAMAZENTA_HERO_OF_MANY_BATTLES) { Item(item); } + PLAYER(SPECIES_ZAMAZENTA_HERO) { Item(item); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_CELEBRATE); } } THEN { if (item == ITEM_NONE) - EXPECT_EQ(player->species, SPECIES_ZAMAZENTA_HERO_OF_MANY_BATTLES); + EXPECT_EQ(player->species, SPECIES_ZAMAZENTA_HERO); else - EXPECT_EQ(player->species, SPECIES_ZAMAZENTA_CROWNED_SHIELD); + EXPECT_EQ(player->species, SPECIES_ZAMAZENTA_CROWNED); } } SINGLE_BATTLE_TEST("Zamazenta's Iron Head becomes Behemoth Bash upon form change") { GIVEN { - PLAYER(SPECIES_ZAMAZENTA_HERO_OF_MANY_BATTLES) { Item(ITEM_RUSTED_SHIELD); Moves(MOVE_IRON_HEAD, MOVE_CELEBRATE); } + PLAYER(SPECIES_ZAMAZENTA_HERO) { Item(ITEM_RUSTED_SHIELD); Moves(MOVE_IRON_HEAD, MOVE_CELEBRATE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_CELEBRATE); } } THEN { - ASSUME(player->species == SPECIES_ZAMAZENTA_CROWNED_SHIELD); // Assumes form change worked. + ASSUME(player->species == SPECIES_ZAMAZENTA_CROWNED); // Assumes form change worked. EXPECT_EQ(player->moves[0], MOVE_BEHEMOTH_BASH); } } diff --git a/test/battle/form_change/primal_reversion.c b/test/battle/form_change/primal_reversion.c index 2f2f406827db..df19a1d0d6af 100644 --- a/test/battle/form_change/primal_reversion.c +++ b/test/battle/form_change/primal_reversion.c @@ -234,3 +234,101 @@ SINGLE_BATTLE_TEST("Primal reversion happens immediately if it was brought in by EXPECT_EQ(player->species, SPECIES_GROUDON_PRIMAL); } } + + +DOUBLE_BATTLE_TEST("Primal reversion triggers for multiple battlers if multiple fainted the previous turn") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_EARTHQUAKE].target == MOVE_TARGET_FOES_AND_ALLY); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_CATERPIE) { HP(1); } + PLAYER(SPECIES_RESHIRAM); + OPPONENT(SPECIES_CATERPIE) { HP(1); } + OPPONENT(SPECIES_CATERPIE) { HP(1); } + OPPONENT(SPECIES_KYOGRE) { Item(ITEM_BLUE_ORB); } + OPPONENT(SPECIES_GROUDON) { Item(ITEM_RED_ORB); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_EARTHQUAKE); + SEND_OUT(opponentRight, 3); + SEND_OUT(opponentLeft, 2); + SEND_OUT(playerRight, 2); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EARTHQUAKE, playerLeft); + ABILITY_POPUP(opponentLeft, ABILITY_PRIMORDIAL_SEA); + ABILITY_POPUP(opponentRight, ABILITY_DESOLATE_LAND); + } +} + +DOUBLE_BATTLE_TEST("Primal reversion triggers for all battlers if multiple fainted the previous turn") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION); + ASSUME(gMovesInfo[MOVE_EXPLOSION].target == MOVE_TARGET_FOES_AND_ALLY); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_CATERPIE) { HP(1); } + PLAYER(SPECIES_KYOGRE) { Item(ITEM_BLUE_ORB); } + PLAYER(SPECIES_GROUDON) { Item(ITEM_RED_ORB); } + OPPONENT(SPECIES_CATERPIE) { HP(1); } + OPPONENT(SPECIES_CATERPIE) { HP(1); } + OPPONENT(SPECIES_KYOGRE) { Item(ITEM_BLUE_ORB); } + OPPONENT(SPECIES_GROUDON) { Item(ITEM_RED_ORB); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_EXPLOSION); + SEND_OUT(opponentRight, 3); + SEND_OUT(opponentLeft, 2); + SEND_OUT(playerRight, 3); + SEND_OUT(playerLeft, 2); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EXPLOSION, playerLeft); + ABILITY_POPUP(playerLeft, ABILITY_PRIMORDIAL_SEA); + ABILITY_POPUP(playerRight, ABILITY_DESOLATE_LAND); + ABILITY_POPUP(opponentLeft, ABILITY_PRIMORDIAL_SEA); + ABILITY_POPUP(opponentRight, ABILITY_DESOLATE_LAND); + } +} + +DOUBLE_BATTLE_TEST("Primal reversion and other switch-in effects trigger for all battlers if multiple fainted the previous turn") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION); + ASSUME(gMovesInfo[MOVE_EXPLOSION].target == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(gMovesInfo[MOVE_STICKY_WEB].effect == EFFECT_STICKY_WEB); + ASSUME(gMovesInfo[MOVE_SPIKES].effect == EFFECT_SPIKES); + ASSUME(gMovesInfo[MOVE_TOXIC_SPIKES].effect == EFFECT_TOXIC_SPIKES); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_CATERPIE) { HP(1); } + PLAYER(SPECIES_SCRAFTY) { Ability(ABILITY_INTIMIDATE); } + PLAYER(SPECIES_RESHIRAM); + OPPONENT(SPECIES_CATERPIE) { HP(1); } + OPPONENT(SPECIES_CATERPIE) { HP(1); } + OPPONENT(SPECIES_KYOGRE) { Item(ITEM_BLUE_ORB); } + OPPONENT(SPECIES_GROUDON) { Item(ITEM_RED_ORB); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_STICKY_WEB); + MOVE(opponentLeft, MOVE_SPIKES); + MOVE(playerRight, MOVE_TOXIC_SPIKES); } + TURN { MOVE(playerLeft, MOVE_EXPLOSION); + SEND_OUT(opponentRight, 3); + SEND_OUT(opponentLeft, 2); + SEND_OUT(playerRight, 3); + SEND_OUT(playerLeft, 2); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STICKY_WEB, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPIKES, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC_SPIKES, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_EXPLOSION, playerLeft); + ABILITY_POPUP(playerLeft, ABILITY_INTIMIDATE); + ABILITY_POPUP(playerRight, ABILITY_TURBOBLAZE); + ABILITY_POPUP(opponentLeft, ABILITY_PRIMORDIAL_SEA); + ABILITY_POPUP(opponentRight, ABILITY_DESOLATE_LAND); + } THEN { + EXPECT_NE(playerLeft->hp, playerLeft->maxHP); + EXPECT_NE(playerRight->hp, playerRight->maxHP); + EXPECT_EQ(opponentLeft->status1, STATUS1_POISON); + EXPECT_EQ(opponentRight->status1, STATUS1_POISON); + EXPECT_EQ(opponentLeft->statStages[STAT_ATK], DEFAULT_STAT_STAGE - 1); + EXPECT_EQ(opponentRight->statStages[STAT_ATK], DEFAULT_STAT_STAGE - 1); + EXPECT_EQ(opponentLeft->statStages[STAT_SPEED], DEFAULT_STAT_STAGE - 1); + EXPECT_EQ(opponentRight->statStages[STAT_SPEED], DEFAULT_STAT_STAGE - 1); + } +} diff --git a/test/battle/gimmick/dynamax.c b/test/battle/gimmick/dynamax.c index f9865f7b6c52..036706190d81 100644 --- a/test/battle/gimmick/dynamax.c +++ b/test/battle/gimmick/dynamax.c @@ -457,7 +457,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Pokemon with Gigantamax forms change upon Dynamaxi u32 species; bool32 gigantamaxFactor; PARAMETRIZE { gigantamaxFactor = FALSE; species = SPECIES_VENUSAUR; } - PARAMETRIZE { gigantamaxFactor = TRUE; species = SPECIES_VENUSAUR_GIGANTAMAX; } + PARAMETRIZE { gigantamaxFactor = TRUE; species = SPECIES_VENUSAUR_GMAX; } GIVEN { PLAYER(SPECIES_VENUSAUR) { GigantamaxFactor(gigantamaxFactor); } OPPONENT(SPECIES_WOBBUFFET); @@ -1505,7 +1505,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Moves don't bypass absorbing abilities") PARAMETRIZE { move = MOVE_WATER_GUN; ability = ABILITY_DRY_SKIN; species = SPECIES_PARASECT; } PARAMETRIZE { move = MOVE_MUD_BOMB; ability = ABILITY_EARTH_EATER; species = SPECIES_ORTHWORM; } PARAMETRIZE { move = MOVE_VINE_WHIP; ability = ABILITY_SAP_SIPPER; species = SPECIES_MILTANK; } - + GIVEN { ASSUME(gMovesInfo[MOVE_WATER_GUN].type == TYPE_WATER); ASSUME(gMovesInfo[MOVE_SPARK].type == TYPE_ELECTRIC); diff --git a/test/battle/gimmick/terastal.c b/test/battle/gimmick/terastal.c index 1b50bc4bcc3c..200d646bfb7e 100644 --- a/test/battle/gimmick/terastal.c +++ b/test/battle/gimmick/terastal.c @@ -509,6 +509,7 @@ SINGLE_BATTLE_TEST("(TERA) Revelation Dance uses a Stellar-type Pokemon's base t } } +#if B_UPDATED_CONVERSION_2 < GEN_5 SINGLE_BATTLE_TEST("(TERA) Conversion2 fails if last hit by a Stellar-type move") { GIVEN { @@ -526,6 +527,7 @@ SINGLE_BATTLE_TEST("(TERA) Conversion2 fails if last hit by a Stellar-type move" MESSAGE("But it failed!"); } } +#endif SINGLE_BATTLE_TEST("(TERA) Roost does not remove Flying-type ground immunity when Terastallized into the Stellar type") { @@ -790,10 +792,10 @@ SINGLE_BATTLE_TEST("(TERA) Transformed pokemon can't Terastalize") SINGLE_BATTLE_TEST("(TERA) Pokemon with Tera forms change upon Terastallizing") { u32 species, targetSpecies; - PARAMETRIZE { species = SPECIES_OGERPON_TEAL_MASK; targetSpecies = SPECIES_OGERPON_TEAL_MASK_TERA; } - PARAMETRIZE { species = SPECIES_OGERPON_WELLSPRING_MASK; targetSpecies = SPECIES_OGERPON_WELLSPRING_MASK_TERA; } - PARAMETRIZE { species = SPECIES_OGERPON_HEARTHFLAME_MASK; targetSpecies = SPECIES_OGERPON_HEARTHFLAME_MASK_TERA; } - PARAMETRIZE { species = SPECIES_OGERPON_CORNERSTONE_MASK; targetSpecies = SPECIES_OGERPON_CORNERSTONE_MASK_TERA; } + PARAMETRIZE { species = SPECIES_OGERPON_TEAL; targetSpecies = SPECIES_OGERPON_TEAL_TERA; } + PARAMETRIZE { species = SPECIES_OGERPON_WELLSPRING; targetSpecies = SPECIES_OGERPON_WELLSPRING_TERA; } + PARAMETRIZE { species = SPECIES_OGERPON_HEARTHFLAME; targetSpecies = SPECIES_OGERPON_HEARTHFLAME_TERA; } + PARAMETRIZE { species = SPECIES_OGERPON_CORNERSTONE; targetSpecies = SPECIES_OGERPON_CORNERSTONE_TERA; } PARAMETRIZE { species = SPECIES_TERAPAGOS_TERASTAL; targetSpecies = SPECIES_TERAPAGOS_STELLAR; } GIVEN { PLAYER(species); diff --git a/test/battle/gimmick/zmove.c b/test/battle/gimmick/zmove.c index 51c65161061d..4e6fc26caeef 100644 --- a/test/battle/gimmick/zmove.c +++ b/test/battle/gimmick/zmove.c @@ -397,6 +397,60 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z-Sleep Talk turns Weather Ball into Breakneck Blit } } +SINGLE_BATTLE_TEST("(Z-MOVE) Powder blocks Fire type Z-Moves and deals 25% of maximum HP to the user") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_EMBER].type == TYPE_FIRE); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_FIRIUM_Z); } + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponent, MOVE_POWDER); MOVE(player, MOVE_EMBER, gimmick: GIMMICK_Z_MOVE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ZMOVE_ACTIVATE, player); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_INFERNO_OVERDRIVE, player); + } THEN { + EXPECT_MUL_EQ(player->maxHP, UQ_4_12(0.75), player->hp); + } +} + +DOUBLE_BATTLE_TEST("(Z-MOVE) Powder blocks Fire type Z-Moves (from Z-Mirror Move)") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_EMBER].type == TYPE_FIRE); + ASSUME(gMovesInfo[MOVE_MIRROR_MOVE].type == TYPE_FLYING); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_FLYINIUM_Z); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponentRight, MOVE_POWDER, target: playerLeft); MOVE(opponentLeft, MOVE_EMBER, target: playerLeft); MOVE(playerLeft, MOVE_MIRROR_MOVE, gimmick: GIMMICK_Z_MOVE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ZMOVE_ACTIVATE, playerLeft); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_INFERNO_OVERDRIVE, playerLeft); + } +} + +SINGLE_BATTLE_TEST("(Z-MOVE) Powder blocks Fire type Z-Moves but not boosts granted") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_WILL_O_WISP].type == TYPE_FIRE); + ASSUME(gMovesInfo[MOVE_WILL_O_WISP].zMove.effect == Z_EFFECT_ATK_UP_1); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_FIRIUM_Z); } + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponent, MOVE_POWDER); MOVE(player, MOVE_WILL_O_WISP, gimmick: GIMMICK_Z_MOVE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ZMOVE_ACTIVATE, player); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_WILL_O_WISP, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); + } +} + // Miscellaneous Interactions DOUBLE_BATTLE_TEST("(Z-MOVE) Instruct fails if the target last used a Z-Move") { diff --git a/test/battle/hold_effect/eject_button.c b/test/battle/hold_effect/eject_button.c index da358c2aa949..f53a270d8275 100644 --- a/test/battle/hold_effect/eject_button.c +++ b/test/battle/hold_effect/eject_button.c @@ -208,3 +208,27 @@ SINGLE_BATTLE_TEST("Eject Button is not triggered after High Jump Kick crash dam } } } + +DOUBLE_BATTLE_TEST("Eject Button activation will not trigger an attack from the incoming mon") +{ + GIVEN { + PLAYER(SPECIES_TATSUGIRI) { Speed(10); Ability(ABILITY_COMMANDER); } + PLAYER(SPECIES_WOBBUFFET) { Speed(100); Item(ITEM_EJECT_BUTTON); } + PLAYER(SPECIES_DONDOZO) { Speed(20); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(50); Item(ITEM_EJECT_PACK); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(10); } + OPPONENT(SPECIES_WYNAUT) { Speed(1); } + } WHEN { + TURN { MOVE(opponentRight, MOVE_MAKE_IT_RAIN); SEND_OUT(playerRight, 2); SEND_OUT(opponentRight, 2); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MAKE_IT_RAIN, opponentRight); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerRight); + MESSAGE("Wobbuffet is switched out with the Eject Button!"); + ABILITY_POPUP(playerLeft, ABILITY_COMMANDER); + MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!"); + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentLeft); + MESSAGE("Wobbuffet is switched out with the Eject Pack!"); + } + } +} diff --git a/test/battle/hold_effect/micle_berry.c b/test/battle/hold_effect/micle_berry.c index 2bc44c8069b0..87f67426096f 100644 --- a/test/battle/hold_effect/micle_berry.c +++ b/test/battle/hold_effect/micle_berry.c @@ -64,3 +64,36 @@ SINGLE_BATTLE_TEST("Micle Berry raises the holder's accuracy by 1.2") ANIMATION(ANIM_TYPE_MOVE, MOVE_SUBMISSION, player); } } + +SINGLE_BATTLE_TEST("Micle Berry increases the accuracy of the next used move across turns") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_ROCK_SLIDE].accuracy == 90); + PASSES_RANDOMLY(100, 100, RNG_ACCURACY); + PLAYER(SPECIES_WOBBUFFET) { MaxHP(100); HP(26); Item(ITEM_MICLE_BERRY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_TACKLE); } + TURN { MOVE(player, MOVE_ROCK_SLIDE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, player); + } +} + +SINGLE_BATTLE_TEST("Micle Berry increases the accuracy of the next used move the same turn the berry was triggered") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_ROCK_SLIDE].accuracy == 90); + PASSES_RANDOMLY(100, 100, RNG_ACCURACY); + PLAYER(SPECIES_WOBBUFFET) { MaxHP(100); HP(26); Item(ITEM_MICLE_BERRY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_TACKLE); MOVE(player, MOVE_ROCK_SLIDE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, player); + } +} diff --git a/test/battle/hold_effect/ogerpon_mask.c b/test/battle/hold_effect/ogerpon_mask.c new file mode 100644 index 000000000000..209b854d6639 --- /dev/null +++ b/test/battle/hold_effect/ogerpon_mask.c @@ -0,0 +1,36 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gItemsInfo[ITEM_CORNERSTONE_MASK].holdEffect == HOLD_EFFECT_OGERPON_MASK); + ASSUME(gItemsInfo[ITEM_WELLSPRING_MASK].holdEffect == HOLD_EFFECT_OGERPON_MASK); + ASSUME(gItemsInfo[ITEM_HEARTHFLAME_MASK].holdEffect == HOLD_EFFECT_OGERPON_MASK); + ASSUME(gItemsInfo[ITEM_CORNERSTONE_MASK].holdEffectParam == 20); + ASSUME(gItemsInfo[ITEM_WELLSPRING_MASK].holdEffectParam == 20); + ASSUME(gItemsInfo[ITEM_HEARTHFLAME_MASK].holdEffectParam == 20); +} + +SINGLE_BATTLE_TEST("Ogerpon Masks increase the base power of moves by 20%", s16 damage) +{ + u32 species; + u32 item; + PARAMETRIZE { species = SPECIES_OGERPON_TEAL; item = ITEM_NONE; } + PARAMETRIZE { species = SPECIES_OGERPON_WELLSPRING; item = ITEM_CORNERSTONE_MASK; } + PARAMETRIZE { species = SPECIES_OGERPON_HEARTHFLAME; item = ITEM_WELLSPRING_MASK; } + PARAMETRIZE { species = SPECIES_OGERPON_CORNERSTONE; item = ITEM_HEARTHFLAME_MASK; } + + GIVEN { + ASSUME(gMovesInfo[MOVE_TACKLE].power > 0); + PLAYER(species) { Item(item); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); } + } SCENE { + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.2), results[1].damage); + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.2), results[2].damage); + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.2), results[3].damage); + } +} diff --git a/test/battle/hold_effect/protective_pads.c b/test/battle/hold_effect/protective_pads.c index 914118d2d8b8..22032112f492 100644 --- a/test/battle/hold_effect/protective_pads.c +++ b/test/battle/hold_effect/protective_pads.c @@ -46,7 +46,7 @@ SINGLE_BATTLE_TEST("Protective Pads doesn't reduce tough claws damage", s16 dama SINGLE_BATTLE_TEST("Protective Pads doesn't invalid unseen fist") { GIVEN { - PLAYER(SPECIES_URSHIFU_RAPID_STRIKE_STYLE) { Ability(ABILITY_UNSEEN_FIST); Item(ITEM_PROTECTIVE_PADS); } + PLAYER(SPECIES_URSHIFU_RAPID_STRIKE) { Ability(ABILITY_UNSEEN_FIST); Item(ITEM_PROTECTIVE_PADS); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_PROTECT); MOVE(player, MOVE_TACKLE); } diff --git a/test/battle/hold_effect/restore_hp.c b/test/battle/hold_effect/restore_hp.c index 09daecc860d9..c19433751c5e 100644 --- a/test/battle/hold_effect/restore_hp.c +++ b/test/battle/hold_effect/restore_hp.c @@ -27,3 +27,39 @@ DOUBLE_BATTLE_TEST("Restore HP Item effects do not miss timing") MESSAGE("The opposing Foe Wobbuffet was hurt by the sea of fire!"); } } + +DOUBLE_BATTLE_TEST("Restore HP Item effects do not miss timing after a recoil move") +{ + u16 item; + + PARAMETRIZE { item = ITEM_BERRY_JUICE; } + PARAMETRIZE { item = ITEM_ORAN_BERRY; } + PARAMETRIZE { item = ITEM_SITRUS_BERRY; } + + GIVEN { + ASSUME(gMovesInfo[MOVE_TAKE_DOWN].recoil == 25); + ASSUME(gItemsInfo[ITEM_ORAN_BERRY].holdEffect == HOLD_EFFECT_RESTORE_HP); + ASSUME(gItemsInfo[ITEM_BERRY_JUICE].holdEffect == HOLD_EFFECT_RESTORE_HP); + ASSUME(gItemsInfo[ITEM_SITRUS_BERRY].holdEffect == HOLD_EFFECT_RESTORE_PCT_HP); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT) { MaxHP(100); HP(51); Item(item); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + MOVE(opponentLeft, MOVE_TAKE_DOWN, target: playerLeft); + MOVE(opponentRight, MOVE_CELEBRATE); + MOVE(playerLeft, MOVE_CELEBRATE); + MOVE(playerRight, MOVE_CELEBRATE); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TAKE_DOWN, opponentLeft); + HP_BAR(playerLeft); + HP_BAR(opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentLeft); + HP_BAR(opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); + } +} diff --git a/test/battle/hold_effect/restore_stats.c b/test/battle/hold_effect/restore_stats.c index fb455f47c67b..2958cdacae97 100644 --- a/test/battle/hold_effect/restore_stats.c +++ b/test/battle/hold_effect/restore_stats.c @@ -99,8 +99,8 @@ SINGLE_BATTLE_TEST("White Herb restores stats after all hits of a multi hit move u16 species; u16 ability; - PARAMETRIZE { species = SPECIES_SLIGGOO_HISUIAN; ability = ABILITY_GOOEY; } - PARAMETRIZE { species = SPECIES_DUGTRIO_ALOLAN; ability = ABILITY_TANGLING_HAIR; } + PARAMETRIZE { species = SPECIES_SLIGGOO_HISUI; ability = ABILITY_GOOEY; } + PARAMETRIZE { species = SPECIES_DUGTRIO_ALOLA; ability = ABILITY_TANGLING_HAIR; } GIVEN { ASSUME(gMovesInfo[MOVE_DUAL_WINGBEAT].strikeCount == 2); diff --git a/test/battle/item_effect/cure_status.c b/test/battle/item_effect/cure_status.c index 6c7cc2e64dea..7f5601ab3c93 100644 --- a/test/battle/item_effect/cure_status.c +++ b/test/battle/item_effect/cure_status.c @@ -94,11 +94,14 @@ SINGLE_BATTLE_TEST("Burn Heal heals a battler from being burned") } } -SINGLE_BATTLE_TEST("Ice Heal heals a battler from being frozen") +SINGLE_BATTLE_TEST("Ice Heal heals a battler from being frozen or frostbite") { + u16 status; + PARAMETRIZE { status = STATUS1_FREEZE; } + PARAMETRIZE { status = STATUS1_FROSTBITE; } GIVEN { ASSUME(gItemsInfo[ITEM_ICE_HEAL].battleUsage == EFFECT_ITEM_CURE_STATUS); - PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_FREEZE); } + PLAYER(SPECIES_WOBBUFFET) { Status1(status); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { USE_ITEM(player, ITEM_ICE_HEAL, partyIndex: 0); } @@ -112,12 +115,13 @@ SINGLE_BATTLE_TEST("Ice Heal heals a battler from being frozen") SINGLE_BATTLE_TEST("Full Heal heals a battler from any primary status") { u16 status; + PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_BURN; } PARAMETRIZE { status = STATUS1_FREEZE; } PARAMETRIZE { status = STATUS1_PARALYSIS; } - PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_TOXIC_POISON; } - PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_FROSTBITE; } GIVEN { ASSUME(gItemsInfo[ITEM_FULL_HEAL].battleUsage == EFFECT_ITEM_CURE_STATUS); PLAYER(SPECIES_WOBBUFFET) { Status1(status); } @@ -134,12 +138,13 @@ SINGLE_BATTLE_TEST("Full Heal heals a battler from any primary status") SINGLE_BATTLE_TEST("Heal Powder heals a battler from any primary status") { u16 status; + PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_BURN; } PARAMETRIZE { status = STATUS1_FREEZE; } PARAMETRIZE { status = STATUS1_PARALYSIS; } - PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_TOXIC_POISON; } - PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_FROSTBITE; } GIVEN { ASSUME(gItemsInfo[ITEM_HEAL_POWDER].battleUsage == EFFECT_ITEM_CURE_STATUS); PLAYER(SPECIES_WOBBUFFET) { Status1(status); } @@ -156,12 +161,13 @@ SINGLE_BATTLE_TEST("Heal Powder heals a battler from any primary status") SINGLE_BATTLE_TEST("Pewter Crunchies heals a battler from any primary status") { u16 status; + PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_BURN; } PARAMETRIZE { status = STATUS1_FREEZE; } PARAMETRIZE { status = STATUS1_PARALYSIS; } - PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_TOXIC_POISON; } - PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_FROSTBITE; } GIVEN { ASSUME(gItemsInfo[ITEM_PEWTER_CRUNCHIES].battleUsage == EFFECT_ITEM_CURE_STATUS); PLAYER(SPECIES_WOBBUFFET) { Status1(status); } @@ -178,12 +184,13 @@ SINGLE_BATTLE_TEST("Pewter Crunchies heals a battler from any primary status") SINGLE_BATTLE_TEST("Lava Cookies heals a battler from any primary status") { u16 status; + PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_BURN; } PARAMETRIZE { status = STATUS1_FREEZE; } PARAMETRIZE { status = STATUS1_PARALYSIS; } - PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_TOXIC_POISON; } - PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_FROSTBITE; } GIVEN { ASSUME(gItemsInfo[ITEM_LAVA_COOKIE].battleUsage == EFFECT_ITEM_CURE_STATUS); PLAYER(SPECIES_WOBBUFFET) { Status1(status); } @@ -200,12 +207,13 @@ SINGLE_BATTLE_TEST("Lava Cookies heals a battler from any primary status") SINGLE_BATTLE_TEST("Rage Candy Bar heals a battler from any primary status") { u16 status; + PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_BURN; } PARAMETRIZE { status = STATUS1_FREEZE; } PARAMETRIZE { status = STATUS1_PARALYSIS; } - PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_TOXIC_POISON; } - PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_FROSTBITE; } GIVEN { ASSUME(gItemsInfo[ITEM_RAGE_CANDY_BAR].battleUsage == EFFECT_ITEM_CURE_STATUS); PLAYER(SPECIES_WOBBUFFET) { Status1(status); } @@ -222,12 +230,13 @@ SINGLE_BATTLE_TEST("Rage Candy Bar heals a battler from any primary status") SINGLE_BATTLE_TEST("Old Gateu heals a battler from any primary status") { u16 status; + PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_BURN; } PARAMETRIZE { status = STATUS1_FREEZE; } PARAMETRIZE { status = STATUS1_PARALYSIS; } - PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_TOXIC_POISON; } - PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_FROSTBITE; } GIVEN { ASSUME(gItemsInfo[ITEM_OLD_GATEAU].battleUsage == EFFECT_ITEM_CURE_STATUS); PLAYER(SPECIES_WOBBUFFET) { Status1(status); } @@ -244,12 +253,13 @@ SINGLE_BATTLE_TEST("Old Gateu heals a battler from any primary status") SINGLE_BATTLE_TEST("Casteliacone heals a battler from any primary status") { u16 status; + PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_BURN; } PARAMETRIZE { status = STATUS1_FREEZE; } PARAMETRIZE { status = STATUS1_PARALYSIS; } - PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_TOXIC_POISON; } - PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_FROSTBITE; } GIVEN { ASSUME(gItemsInfo[ITEM_CASTELIACONE].battleUsage == EFFECT_ITEM_CURE_STATUS); PLAYER(SPECIES_WOBBUFFET) { Status1(status); } @@ -266,12 +276,13 @@ SINGLE_BATTLE_TEST("Casteliacone heals a battler from any primary status") SINGLE_BATTLE_TEST("Lumiose Galette heals a battler from any primary status") { u16 status; + PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_BURN; } PARAMETRIZE { status = STATUS1_FREEZE; } PARAMETRIZE { status = STATUS1_PARALYSIS; } - PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_TOXIC_POISON; } - PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_FROSTBITE; } GIVEN { ASSUME(gItemsInfo[ITEM_LUMIOSE_GALETTE].battleUsage == EFFECT_ITEM_CURE_STATUS); PLAYER(SPECIES_WOBBUFFET) { Status1(status); } @@ -288,12 +299,13 @@ SINGLE_BATTLE_TEST("Lumiose Galette heals a battler from any primary status") SINGLE_BATTLE_TEST("Shalour Sable heals a battler from any primary status") { u16 status; + PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_BURN; } PARAMETRIZE { status = STATUS1_FREEZE; } PARAMETRIZE { status = STATUS1_PARALYSIS; } - PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_TOXIC_POISON; } - PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_FROSTBITE; } GIVEN { ASSUME(gItemsInfo[ITEM_SHALOUR_SABLE].battleUsage == EFFECT_ITEM_CURE_STATUS); PLAYER(SPECIES_WOBBUFFET) { Status1(status); } @@ -310,12 +322,13 @@ SINGLE_BATTLE_TEST("Shalour Sable heals a battler from any primary status") SINGLE_BATTLE_TEST("Big Malasada heals a battler from any primary status") { u16 status; + PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_BURN; } PARAMETRIZE { status = STATUS1_FREEZE; } PARAMETRIZE { status = STATUS1_PARALYSIS; } - PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_TOXIC_POISON; } - PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_FROSTBITE; } GIVEN { ASSUME(gItemsInfo[ITEM_BIG_MALASADA].battleUsage == EFFECT_ITEM_CURE_STATUS); PLAYER(SPECIES_WOBBUFFET) { Status1(status); } @@ -329,6 +342,29 @@ SINGLE_BATTLE_TEST("Big Malasada heals a battler from any primary status") } } +SINGLE_BATTLE_TEST("Jubilife Muffin heals a battler from any primary status") +{ + u16 status; + PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_POISON; } + PARAMETRIZE { status = STATUS1_BURN; } + PARAMETRIZE { status = STATUS1_FREEZE; } + PARAMETRIZE { status = STATUS1_PARALYSIS; } + PARAMETRIZE { status = STATUS1_TOXIC_POISON; } + PARAMETRIZE { status = STATUS1_FROSTBITE; } + GIVEN { + ASSUME(gItemsInfo[ITEM_JUBILIFE_MUFFIN].battleUsage == EFFECT_ITEM_CURE_STATUS); + PLAYER(SPECIES_WOBBUFFET) { Status1(status); } + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { USE_ITEM(player, ITEM_JUBILIFE_MUFFIN, partyIndex: 0); } + } SCENE { + MESSAGE("Wobbuffet had its status healed!"); + } THEN { + EXPECT_EQ(player->status1, STATUS1_NONE); + } +} + SINGLE_BATTLE_TEST("Full Heal, Heal Powder and Local Specialties heal a battler from being confused") { u16 item; @@ -342,6 +378,7 @@ SINGLE_BATTLE_TEST("Full Heal, Heal Powder and Local Specialties heal a battler PARAMETRIZE { item = ITEM_LUMIOSE_GALETTE; } PARAMETRIZE { item = ITEM_SHALOUR_SABLE; } PARAMETRIZE { item = ITEM_BIG_MALASADA; } + PARAMETRIZE { item = ITEM_JUBILIFE_MUFFIN; } GIVEN { ASSUME(gItemsInfo[item].battleUsage == EFFECT_ITEM_CURE_STATUS); PLAYER(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/after_you.c b/test/battle/move_effect/after_you.c index fa6e47e0e29a..32ea44efb15a 100644 --- a/test/battle/move_effect/after_you.c +++ b/test/battle/move_effect/after_you.c @@ -52,5 +52,82 @@ DOUBLE_BATTLE_TEST("After You does nothing if the target has already moved") } } -TO_DO_BATTLE_TEST("After You doesn't fail if the turner remains the same after After You (Gen8+)"); -TO_DO_BATTLE_TEST("After You ignores the effects of Quash"); +DOUBLE_BATTLE_TEST("After You calculates correct turn order if only one pokemon is left on the opposing side") +{ + GIVEN { + PLAYER(SPECIES_GRENINJA) { Speed(120); } + PLAYER(SPECIES_REGIROCK) { Speed(10); } + OPPONENT(SPECIES_PIDGEOT) { Speed(100); } + OPPONENT(SPECIES_DRAGONITE) { Speed(60); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_AFTER_YOU, target: playerRight); + MOVE(playerRight, MOVE_STONE_EDGE, target: opponentLeft); + MOVE(opponentRight, MOVE_CELEBRATE); + } + TURN { + MOVE(playerLeft, MOVE_AFTER_YOU, target: playerRight); + MOVE(playerRight, MOVE_STONE_EDGE, target: opponentRight); + MOVE(opponentRight, MOVE_CELEBRATE); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_AFTER_YOU, playerLeft); + MESSAGE("Regirock took the kind offer!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_STONE_EDGE, playerRight); + HP_BAR(opponentLeft); + MESSAGE("Foe Pidgeot fainted!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_AFTER_YOU, playerLeft); + MESSAGE("Regirock took the kind offer!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_STONE_EDGE, playerRight); + HP_BAR(opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); + } +} + +DOUBLE_BATTLE_TEST("After You doesn't fail if the turn order remains the same after After You (Gen8+)") +{ + GIVEN { + ASSUME(B_AFTER_YOU_TURN_ORDER >= GEN_8); + PLAYER(SPECIES_WOBBUFFET) { Speed(4); } + PLAYER(SPECIES_WYNAUT) { Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } + OPPONENT(SPECIES_WYNAUT) { Speed(3); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_CELEBRATE); + MOVE(playerRight, MOVE_CELEBRATE); + MOVE(opponentLeft, MOVE_CELEBRATE); + MOVE(opponentRight, MOVE_AFTER_YOU, target: opponentLeft); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_AFTER_YOU, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); + } +} + +DOUBLE_BATTLE_TEST("After You ignores the effects of Quash") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_QUASH].effect == EFFECT_QUASH); + PLAYER(SPECIES_WOBBUFFET) { Speed(4); } + PLAYER(SPECIES_WYNAUT) { Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } + OPPONENT(SPECIES_WYNAUT) { Speed(3); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_QUASH, target: opponentLeft); + MOVE(playerRight, MOVE_CELEBRATE); + MOVE(opponentLeft, MOVE_CELEBRATE); + MOVE(opponentRight, MOVE_AFTER_YOU, target: opponentLeft); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_QUASH, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_AFTER_YOU, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); + } +} diff --git a/test/battle/move_effect/chilly_reception.c b/test/battle/move_effect/chilly_reception.c index 8b64a30f2810..7e821abe3d7e 100644 --- a/test/battle/move_effect/chilly_reception.c +++ b/test/battle/move_effect/chilly_reception.c @@ -9,8 +9,8 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Chilly Reception sets up snow and switches the user out") { GIVEN { - PLAYER(SPECIES_SLOWKING_GALARIAN); - PLAYER(SPECIES_SLOWPOKE_GALARIAN); + PLAYER(SPECIES_SLOWKING_GALAR); + PLAYER(SPECIES_SLOWPOKE_GALAR); OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_CHILLY_RECEPTION); SEND_OUT(player, 1); } @@ -27,8 +27,8 @@ SINGLE_BATTLE_TEST("Chilly Reception sets up snow and switches the user out") SINGLE_BATTLE_TEST("Chilly Reception switches the user out, even if the weather does not change") { GIVEN { - PLAYER(SPECIES_SLOWKING_GALARIAN); - PLAYER(SPECIES_SLOWPOKE_GALARIAN); + PLAYER(SPECIES_SLOWKING_GALAR); + PLAYER(SPECIES_SLOWPOKE_GALAR); OPPONENT(SPECIES_KYOGRE) { Item(ITEM_BLUE_ORB); } } WHEN { TURN { MOVE(player, MOVE_CHILLY_RECEPTION); SEND_OUT(player, 1); } @@ -45,7 +45,7 @@ SINGLE_BATTLE_TEST("Chilly Reception switches the user out, even if the weather SINGLE_BATTLE_TEST("Chilly Reception does not switch the user out if no replacements") { GIVEN { - PLAYER(SPECIES_SLOWKING_GALARIAN); + PLAYER(SPECIES_SLOWKING_GALAR); OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_CHILLY_RECEPTION); } @@ -60,8 +60,8 @@ SINGLE_BATTLE_TEST("Chilly Reception does not switch the user out if no replacem SINGLE_BATTLE_TEST("Chilly Reception does not switch the user out if replacements fainted") { GIVEN { - PLAYER(SPECIES_SLOWKING_GALARIAN); - PLAYER(SPECIES_SLOWPOKE_GALARIAN) { HP(0); } + PLAYER(SPECIES_SLOWKING_GALAR); + PLAYER(SPECIES_SLOWPOKE_GALAR) { HP(0); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_CHILLY_RECEPTION); } @@ -76,7 +76,7 @@ SINGLE_BATTLE_TEST("Chilly Reception does not switch the user out if replacement SINGLE_BATTLE_TEST("Chilly Reception changes the weather, even if the user cannot switch out") { GIVEN { - PLAYER(SPECIES_SLOWKING_GALARIAN); + PLAYER(SPECIES_SLOWKING_GALAR); OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_CHILLY_RECEPTION); } diff --git a/test/battle/move_effect/conversion_2.c b/test/battle/move_effect/conversion_2.c index 2e81212ef1be..6c2d4d7f5430 100644 --- a/test/battle/move_effect/conversion_2.c +++ b/test/battle/move_effect/conversion_2.c @@ -1,14 +1,207 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Conversion 2 randomly changes the type of the user to a type that resists the last move that hit the user (Gen 3-4)"); -TO_DO_BATTLE_TEST("Conversion 2 randomly changes the type of the user to a type that resists the last move used by the target (Gen 5+)"); -TO_DO_BATTLE_TEST("Conversion 2's type change considers the type of moves called by other moves"); -TO_DO_BATTLE_TEST("Conversion 2's type change considers dynamic type moves"); // Eg. Weather Ball -TO_DO_BATTLE_TEST("Conversion 2's type change considers move types changed by Normalize and Electrify"); -TO_DO_BATTLE_TEST("Conversion 2's type change considers move types changed by Normalize"); -TO_DO_BATTLE_TEST("Conversion 2's type change considers Struggle to be Normal type (Gen 3-4)"); -TO_DO_BATTLE_TEST("Conversion 2 fails if the move used is of typeless damage (Gen 5+)"); -TO_DO_BATTLE_TEST("Conversion 2's type change considers status moves (Gen 5+)"); TO_DO_BATTLE_TEST("Conversion 2's type change considers Inverse Battles"); -TO_DO_BATTLE_TEST("Conversion 2 fails if the move used is Stellar Type"); + +#if B_UPDATED_CONVERSION_2 < GEN_5 +SINGLE_BATTLE_TEST("Conversion 2 randomly changes the type of the user to a type that resists the last move that hit the user (Gen 3-4)") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_OMINOUS_WIND); MOVE(opponent, MOVE_CONVERSION_2); } + } SCENE { + // turn 1 + MESSAGE("Wobbuffet used Ominous Wind!"); + // turn 1 + ONE_OF { + MESSAGE("Foe Wobbuffet transformed into the Normal type!"); + MESSAGE("Foe Wobbuffet transformed into the Dark type!"); + } + } +} + +SINGLE_BATTLE_TEST("Conversion 2's type change considers Struggle to be Normal type (Gen 3-4)") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_STRUGGLE); } + TURN { MOVE(player, MOVE_CONVERSION_2); } + } SCENE { + // turn 1 + MESSAGE("Foe Wobbuffet used Struggle!"); + // turn 2 + ONE_OF { + MESSAGE("Wobbuffet transformed into the Steel type!"); + MESSAGE("Wobbuffet transformed into the Rock type!"); + MESSAGE("Wobbuffet transformed into the Ghost type!"); + } + } +} +#endif + +#if B_UPDATED_CONVERSION_2 >= GEN_5 +SINGLE_BATTLE_TEST("Conversion 2 randomly changes the type of the user to a type that resists the last used target's move (Gen 5+)") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_OMINOUS_WIND); MOVE(opponent, MOVE_CONVERSION_2); } + } SCENE { + // turn 1 + MESSAGE("Wobbuffet used Ominous Wind!"); + // turn 1 + ONE_OF { + MESSAGE("Foe Wobbuffet transformed into the Normal type!"); + MESSAGE("Foe Wobbuffet transformed into the Dark type!"); + } + } +} + +SINGLE_BATTLE_TEST("Conversion 2's type change considers status moves (Gen 5+)") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_CURSE); } + TURN { MOVE(player, MOVE_CONVERSION_2); } + } SCENE { + // turn 1 + MESSAGE("Foe Wobbuffet used Curse!"); + // turn 2 + ONE_OF { + MESSAGE("Wobbuffet transformed into the Normal type!"); + MESSAGE("Wobbuffet transformed into the Dark type!"); + } + } +} + +SINGLE_BATTLE_TEST("Conversion 2's type change considers the type of moves called by other moves") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_OMINOUS_WIND); MOVE(opponent, MOVE_MIRROR_MOVE); } + TURN { MOVE(player, MOVE_CONVERSION_2); } + } SCENE { + // turn 1 + MESSAGE("Foe Wobbuffet used Mirror Move!"); + // turn 2 + ONE_OF { + MESSAGE("Wobbuffet transformed into the Normal type!"); + MESSAGE("Wobbuffet transformed into the Dark type!"); + } + } +} + +SINGLE_BATTLE_TEST("Conversion 2's type change considers dynamic type moves") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_HAIL); MOVE(opponent, MOVE_WEATHER_BALL); } + TURN { MOVE(player, MOVE_CONVERSION_2); } + } SCENE { + // turn 1 + MESSAGE("Foe Wobbuffet used Weather Ball!"); + // turn 2 + ONE_OF { + MESSAGE("Wobbuffet transformed into the Steel type!"); + MESSAGE("Wobbuffet transformed into the Fire type!"); + MESSAGE("Wobbuffet transformed into the Water type!"); + MESSAGE("Wobbuffet transformed into the Ice type!"); + } + } +} + +SINGLE_BATTLE_TEST("Conversion 2's type change considers move types changed by Normalize and Electrify") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_NORMALIZE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_ELECTRIFY); MOVE(opponent, MOVE_POUND); } + TURN { MOVE(player, MOVE_CONVERSION_2); } + TURN { MOVE(player, MOVE_WATER_GUN); MOVE(opponent, MOVE_CONVERSION_2); } + } SCENE { + // turn 1 + MESSAGE("Wobbuffet used Electrify!"); + MESSAGE("Foe Wobbuffet used Pound!"); + // turn 2 + ONE_OF { + MESSAGE("Wobbuffet transformed into the Ground type!"); + MESSAGE("Wobbuffet transformed into the Dragon type!"); + MESSAGE("Wobbuffet transformed into the Grass type!"); + MESSAGE("Wobbuffet transformed into the Electric type!"); + } + // turn 3 + MESSAGE("Wobbuffet used Water Gun!"); + ONE_OF { + MESSAGE("Foe Wobbuffet transformed into the Steel type!"); + MESSAGE("Foe Wobbuffet transformed into the Rock type!"); + MESSAGE("Foe Wobbuffet transformed into the Ghost type!"); + } + } +} + +SINGLE_BATTLE_TEST("Conversion 2's type change fails targeting Struggle (Gen 5+)") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_STRUGGLE); } + TURN { MOVE(player, MOVE_CONVERSION_2); } + } SCENE { + // turn 1 + MESSAGE("Foe Wobbuffet used Struggle!"); + // turn 2 + MESSAGE("Wobbuffet used Conversion 2!"); + MESSAGE("But it failed!"); + } +} + +SINGLE_BATTLE_TEST("Conversion 2 fails if the move used is of typeless damage (Gen 5+)") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_ENTEI); + } WHEN { + TURN { MOVE(opponent, MOVE_BURN_UP); } + TURN { MOVE(opponent, MOVE_REVELATION_DANCE); } + TURN { MOVE(player, MOVE_CONVERSION_2); } + } SCENE { + // turn 1 + MESSAGE("Foe Entei used Burn Up!"); + // turn 2 + MESSAGE("Foe Entei used Revelation Dance!"); + // turn 3 + MESSAGE("Wobbuffet used Conversion 2!"); + MESSAGE("But it failed!"); + } +} +#endif + +SINGLE_BATTLE_TEST("Conversion 2 fails if the targeted move is Stellar Type") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_STELLAR); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_TERA_BLAST, gimmick: GIMMICK_TERA); MOVE(opponent, MOVE_CONVERSION_2); } + } SCENE { + // turn 1 + MESSAGE("Wobbuffet used Tera Blast!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TERA_BLAST, player); + // turn 1 + MESSAGE("Foe Wobbuffet used Conversion 2!"); + MESSAGE("But it failed!"); + } +} diff --git a/test/battle/move_effect/destiny_bond.c b/test/battle/move_effect/destiny_bond.c new file mode 100644 index 000000000000..baba378f6b1e --- /dev/null +++ b/test/battle/move_effect/destiny_bond.c @@ -0,0 +1,17 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Destiny Bond faints the opposing mon if it fainted from the attack") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_DESTINY_BOND); MOVE(opponent, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DESTINY_BOND, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + MESSAGE("Wobbuffet took Foe Wobbuffet with it!"); + MESSAGE("Foe Wobbuffet fainted!"); + } +} diff --git a/test/battle/move_effect/dragon_darts.c b/test/battle/move_effect/dragon_darts.c index 8190f0f4bd5f..08913d601103 100644 --- a/test/battle/move_effect/dragon_darts.c +++ b/test/battle/move_effect/dragon_darts.c @@ -94,6 +94,83 @@ DOUBLE_BATTLE_TEST("Dragon Darts strikes the left ally twice if the target is a } } +DOUBLE_BATTLE_TEST("Dragon Darts strikes left ally twice if electrified and right ally has Volt Absorb") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_ELECTRIFY].effect == EFFECT_ELECTRIFY); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_LANTURN) { Ability(ABILITY_VOLT_ABSORB); }; + } WHEN { + TURN { MOVE(opponentRight, MOVE_ELECTRIFY, target: playerLeft); MOVE(playerLeft, MOVE_DRAGON_DARTS, target: opponentRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DARTS, playerLeft); + HP_BAR(opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DARTS, playerLeft); + HP_BAR(opponentLeft); + MESSAGE("Hit 2 time(s)!"); + } +} + +DOUBLE_BATTLE_TEST("Dragon Darts strikes right ally twice if electrified and left ally has Volt Absorb") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_ELECTRIFY].effect == EFFECT_ELECTRIFY); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_LANTURN) { Ability(ABILITY_VOLT_ABSORB); }; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentRight, MOVE_ELECTRIFY, target: playerLeft); MOVE(playerLeft, MOVE_DRAGON_DARTS, target: opponentRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DARTS, playerLeft); + HP_BAR(opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DARTS, playerLeft); + HP_BAR(opponentRight); + MESSAGE("Hit 2 time(s)!"); + } +} + +DOUBLE_BATTLE_TEST("Dragon Darts strikes left ally twice if electrified and right ally has Motor Drive") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_ELECTRIFY].effect == EFFECT_ELECTRIFY); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_ELECTIVIRE) { Ability(ABILITY_MOTOR_DRIVE); }; + } WHEN { + TURN { MOVE(opponentRight, MOVE_ELECTRIFY, target: playerLeft); MOVE(playerLeft, MOVE_DRAGON_DARTS, target: opponentRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DARTS, playerLeft); + HP_BAR(opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DARTS, playerLeft); + HP_BAR(opponentLeft); + MESSAGE("Hit 2 time(s)!"); + } +} + +DOUBLE_BATTLE_TEST("Dragon Darts strikes right ally twice if electrified and left ally has Motor Drive") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_ELECTRIFY].effect == EFFECT_ELECTRIFY); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_ELECTIVIRE) { Ability(ABILITY_MOTOR_DRIVE); }; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentRight, MOVE_ELECTRIFY, target: playerLeft); MOVE(playerLeft, MOVE_DRAGON_DARTS, target: opponentRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DARTS, playerLeft); + HP_BAR(opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DARTS, playerLeft); + HP_BAR(opponentRight); + MESSAGE("Hit 2 time(s)!"); + } +} + + DOUBLE_BATTLE_TEST("Dragon Darts strikes the ally twice if the target is in a semi-invulnerable turn") { GIVEN { diff --git a/test/battle/move_effect/explosion.c b/test/battle/move_effect/explosion.c index a45a465ba2a1..a0825aac62aa 100644 --- a/test/battle/move_effect/explosion.c +++ b/test/battle/move_effect/explosion.c @@ -127,7 +127,7 @@ SINGLE_BATTLE_TEST("Explosion does not trigger Destiny Bond") DOUBLE_BATTLE_TEST("Explosion boosted by Galvanize is correctly blocked by Volt Absorb") { GIVEN { - PLAYER(SPECIES_GEODUDE_ALOLAN) { Ability(ABILITY_GALVANIZE); } + PLAYER(SPECIES_GEODUDE_ALOLA) { Ability(ABILITY_GALVANIZE); } PLAYER(SPECIES_WYNAUT) { HP(1); } OPPONENT(SPECIES_LANTURN) { Ability(ABILITY_VOLT_ABSORB); } OPPONENT(SPECIES_WOBBUFFET) { HP(1); } diff --git a/test/battle/move_effect/gastro_acid.c b/test/battle/move_effect/gastro_acid.c index e4f1aa535475..b3ce3787948d 100644 --- a/test/battle/move_effect/gastro_acid.c +++ b/test/battle/move_effect/gastro_acid.c @@ -26,8 +26,8 @@ SINGLE_BATTLE_TEST("Gastro Acid fails if target has a banned ability") // Needs confirmation since those abilities can be suppressed by Neutralizing Gas // PARAMETRIZE { species = SPECIES_IRON_MOTH; ability = ABILITY_QUARK_DRIVE; } // PARAMETRIZE { species = SPECIES_WALKING_WAKE; ability = ABILITY_PROTOSYNTHESIS; } - PARAMETRIZE { species = SPECIES_CALYREX_SHADOW_RIDER; ability = ABILITY_AS_ONE_SHADOW_RIDER; } - PARAMETRIZE { species = SPECIES_CALYREX_ICE_RIDER; ability = ABILITY_AS_ONE_ICE_RIDER; } + PARAMETRIZE { species = SPECIES_CALYREX_SHADOW; ability = ABILITY_AS_ONE_SHADOW_RIDER; } + PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; } GIVEN { PLAYER(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/ivy_cudgel.c b/test/battle/move_effect/ivy_cudgel.c index 1693c439c04f..095f4d8eff11 100644 --- a/test/battle/move_effect/ivy_cudgel.c +++ b/test/battle/move_effect/ivy_cudgel.c @@ -12,10 +12,10 @@ SINGLE_BATTLE_TEST("Ivy Cudgel changes the move type depending on the form of Og u16 ogerpon; u16 item; - PARAMETRIZE { species = SPECIES_BLASTOISE; ogerpon = SPECIES_OGERPON_TEAL_MASK; item = ITEM_NONE; } - PARAMETRIZE { species = SPECIES_CHARIZARD; ogerpon = SPECIES_OGERPON_CORNERSTONE_MASK; item = ITEM_CORNERSTONE_MASK; } - PARAMETRIZE { species = SPECIES_CHARIZARD; ogerpon = SPECIES_OGERPON_WELLSPRING_MASK; item = ITEM_WELLSPRING_MASK; } - PARAMETRIZE { species = SPECIES_VENUSAUR; ogerpon = SPECIES_OGERPON_HEARTHFLAME_MASK; item = ITEM_HEARTHFLAME_MASK; } + PARAMETRIZE { species = SPECIES_BLASTOISE; ogerpon = SPECIES_OGERPON_TEAL; item = ITEM_NONE; } + PARAMETRIZE { species = SPECIES_CHARIZARD; ogerpon = SPECIES_OGERPON_CORNERSTONE; item = ITEM_CORNERSTONE_MASK; } + PARAMETRIZE { species = SPECIES_CHARIZARD; ogerpon = SPECIES_OGERPON_WELLSPRING; item = ITEM_WELLSPRING_MASK; } + PARAMETRIZE { species = SPECIES_VENUSAUR; ogerpon = SPECIES_OGERPON_HEARTHFLAME; item = ITEM_HEARTHFLAME_MASK; } GIVEN { PLAYER(ogerpon) { Item(item); } diff --git a/test/battle/move_effect/multi_hit.c b/test/battle/move_effect/multi_hit.c index df9cfea8070c..052226d1c86e 100644 --- a/test/battle/move_effect/multi_hit.c +++ b/test/battle/move_effect/multi_hit.c @@ -160,6 +160,46 @@ SINGLE_BATTLE_TEST("Scale Shot decreases defense and increases speed after final } } +SINGLE_BATTLE_TEST("Scale Shot is immune to Fairy types and will end the move correctly") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_SCALE_SHOT].effect == EFFECT_MULTI_HIT); + ASSUME(gMovesInfo[MOVE_SCALE_SHOT].type == TYPE_DRAGON); + ASSUME(gSpeciesInfo[SPECIES_CLEFAIRY].types[0] == TYPE_FAIRY || gSpeciesInfo[SPECIES_CLEFAIRY].types[1] == TYPE_FAIRY); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_CLEFAIRY) { HP(1); } + } WHEN { + TURN { MOVE(player, MOVE_SCALE_SHOT); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SCALE_SHOT, player); + MESSAGE("It doesn't affect Foe Clefairy…"); + } +} + +DOUBLE_BATTLE_TEST("Scale Shot does not corrupt the next turn move used") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_SCALE_SHOT].effect == EFFECT_MULTI_HIT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerRight, MOVE_SCALE_SHOT, target: opponentRight); SWITCH(playerLeft, 2); SEND_OUT(opponentRight, 2); } + TURN { MOVE(playerRight, MOVE_BULLDOZE); MOVE(playerLeft, MOVE_CELEBRATE); MOVE(opponentRight, MOVE_CELEBRATE); MOVE(opponentLeft, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCALE_SHOT, playerRight); + HP_BAR(opponentRight); + MESSAGE("Hit 1 time(s)!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLDOZE, playerRight); + HP_BAR(playerLeft); + HP_BAR(opponentLeft); + HP_BAR(opponentRight); + } +} + SINGLE_BATTLE_TEST("Endure does not prevent multiple hits and stat changes occur at the end of the turn") { GIVEN { @@ -231,3 +271,28 @@ SINGLE_BATTLE_TEST("Scale Shot decreases defense and increases speed after killi MESSAGE("Bagon's Speed rose!"); } } + +SINGLE_BATTLE_TEST("Multi Hit moves will not disrupt Destiny Bond flag") +{ + u32 hp; + PARAMETRIZE { hp = 11; } + PARAMETRIZE { hp = 55; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(55); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_DESTINY_BOND); MOVE(opponent, MOVE_BULLET_SEED); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DESTINY_BOND, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, opponent); + if (hp == 55) + { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, opponent); + } + MESSAGE("Wobbuffet took Foe Wobbuffet with it!"); + MESSAGE("Foe Wobbuffet fainted!"); + } +} diff --git a/test/battle/move_effect/pledge.c b/test/battle/move_effect/pledge.c index d2cc16aa47da..bd68b1e73349 100644 --- a/test/battle/move_effect/pledge.c +++ b/test/battle/move_effect/pledge.c @@ -331,6 +331,51 @@ DOUBLE_BATTLE_TEST("Damage calculation: Combined pledge move") } } +DOUBLE_BATTLE_TEST("Pledge move combo interactions with Powder are correct") +{ + // Fire Pledge as the first move or Fire Pledge combo should fail + u32 moveLeft, moveRight, speedLeft, speedRight; + PARAMETRIZE { moveLeft = MOVE_FIRE_PLEDGE; moveRight = MOVE_WATER_PLEDGE; speedLeft = 4; speedRight = 3; } // FAIL 1 + PARAMETRIZE { moveLeft = MOVE_FIRE_PLEDGE; moveRight = MOVE_WATER_PLEDGE; speedLeft = 3; speedRight = 4; } + PARAMETRIZE { moveLeft = MOVE_WATER_PLEDGE; moveRight = MOVE_FIRE_PLEDGE; speedLeft = 4; speedRight = 3; } + PARAMETRIZE { moveLeft = MOVE_WATER_PLEDGE; moveRight = MOVE_FIRE_PLEDGE; speedLeft = 3; speedRight = 4; } + PARAMETRIZE { moveLeft = MOVE_FIRE_PLEDGE; moveRight = MOVE_GRASS_PLEDGE; speedLeft = 4; speedRight = 3; } // FAIL 1 + PARAMETRIZE { moveLeft = MOVE_FIRE_PLEDGE; moveRight = MOVE_GRASS_PLEDGE; speedLeft = 3; speedRight = 4; } // FAIL 2 + PARAMETRIZE { moveLeft = MOVE_GRASS_PLEDGE; moveRight = MOVE_FIRE_PLEDGE; speedLeft = 4; speedRight = 3; } + PARAMETRIZE { moveLeft = MOVE_GRASS_PLEDGE; moveRight = MOVE_FIRE_PLEDGE; speedLeft = 3; speedRight = 4; } // FAIL 2 + GIVEN { + ASSUME(gMovesInfo[MOVE_FIRE_PLEDGE].type == TYPE_FIRE); + PLAYER(SPECIES_WOBBUFFET) { Speed(speedLeft); } + PLAYER(SPECIES_WYNAUT) { Speed(speedRight); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(8); } + OPPONENT(SPECIES_VIVILLON) { Speed(5); } + } WHEN { + TURN { MOVE(opponentRight, MOVE_POWDER, target: playerLeft); MOVE(playerLeft, moveLeft, target: opponentLeft); MOVE(playerRight, moveRight, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponentRight); + if (speedLeft > speedRight && moveLeft == MOVE_FIRE_PLEDGE) { // FAIL 1 + NOT ANIMATION(ANIM_TYPE_MOVE, moveLeft, playerLeft); + HP_BAR(playerLeft); + ANIMATION(ANIM_TYPE_MOVE, moveRight, playerRight); + } + else if (speedLeft > speedRight) { + NOT HP_BAR(playerLeft); + if (moveLeft == MOVE_GRASS_PLEDGE) + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIRE_PLEDGE, playerRight); + else + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_PLEDGE, playerRight); + } + else if (moveLeft == MOVE_WATER_PLEDGE || moveRight == MOVE_WATER_PLEDGE) { + NOT HP_BAR(playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_PLEDGE, playerLeft); + } + else { // FAIL 2 + HP_BAR(playerLeft); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_FIRE_PLEDGE, playerLeft); + } + } +} + DOUBLE_BATTLE_TEST("Pledge move combo fails if ally fails to act - Sleep Right") { u32 speedPLeft, speedPRight, speedOLeft, speedORight; @@ -778,7 +823,7 @@ DOUBLE_BATTLE_TEST("Pledge move combo doesn't trigger on opponent's Pledge move OPPONENT(SPECIES_WYNAUT) { Speed(5); Status1(STATUS1_SLEEP_TURN(2)); } } WHEN { TURN { MOVE(opponentLeft, MOVE_FIRE_PLEDGE, target: playerLeft); - MOVE(opponentRight, MOVE_GRASS_PLEDGE, target: playerLeft); + MOVE(opponentRight, MOVE_GRASS_PLEDGE, target: playerLeft); MOVE(playerLeft, MOVE_GRASS_PLEDGE, target: opponentRight); } } SCENE { NONE_OF { diff --git a/test/battle/move_effect/powder.c b/test/battle/move_effect/powder.c new file mode 100644 index 000000000000..dbd1570e6c2d --- /dev/null +++ b/test/battle/move_effect/powder.c @@ -0,0 +1,295 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gMovesInfo[MOVE_POWDER].effect == EFFECT_POWDER); + ASSUME(gMovesInfo[MOVE_POWDER].powderMove == TRUE); + ASSUME(gMovesInfo[MOVE_EMBER].type == TYPE_FIRE); +} + + +SINGLE_BATTLE_TEST("Powder blocks the target's Fire type moves and deals 25% of maximum HP to target") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponent, MOVE_POWDER); MOVE(player, MOVE_EMBER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponent); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, player); + HP_BAR(opponent); + } + } THEN { + EXPECT_MUL_EQ(player->maxHP, UQ_4_12(0.75), player->hp); + } +} + +SINGLE_BATTLE_TEST("Powder blocks the target's Fire type moves and consumes PP") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_EMBER); } + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponent, MOVE_POWDER); MOVE(player, MOVE_EMBER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponent); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, player); + HP_BAR(opponent); + } + } THEN { + EXPECT_EQ(player->pp[0], gMovesInfo[MOVE_EMBER].pp - 1); + } +} + +SINGLE_BATTLE_TEST("Powder only blocks the target's Fire type moves on the same turn") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponent, MOVE_POWDER); } + TURN { MOVE(player, MOVE_EMBER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, player); + HP_BAR(opponent); + } THEN { + EXPECT_EQ(player->maxHP, player->hp); + } +} + +SINGLE_BATTLE_TEST("Powder doesn't damage target if it has Magic Guard") +{ + GIVEN { + PLAYER(SPECIES_ALAKAZAM) { Ability(ABILITY_MAGIC_GUARD); } + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponent, MOVE_POWDER); MOVE(player, MOVE_EMBER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponent); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, player); + HP_BAR(opponent); + } + } THEN { + EXPECT_EQ(player->maxHP, player->hp); + } +} + +SINGLE_BATTLE_TEST("Powder doesn't damage target under heavy rain") +{ + GIVEN { + ASSUME(B_POWDER_RAIN >= GEN_7); + PLAYER(SPECIES_KYOGRE_PRIMAL) { Ability(ABILITY_PRIMORDIAL_SEA); } + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponent, MOVE_POWDER); MOVE(player, MOVE_EMBER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponent); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, player); + HP_BAR(opponent); + } + } THEN { + EXPECT_EQ(player->maxHP, player->hp); + } +} + +DOUBLE_BATTLE_TEST("Powder blocks the target's Fire type moves even if it doesn't target Powder user") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponentRight, MOVE_POWDER, target: playerLeft); MOVE(playerLeft, MOVE_EMBER, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponentRight); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, playerLeft); + HP_BAR(opponentLeft); + } + } +} + +DOUBLE_BATTLE_TEST("Powder fails if target is already affected by Powder") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_VIVILLON); + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponentRight, MOVE_POWDER, target: playerLeft); MOVE(opponentLeft, MOVE_POWDER, target: playerLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponentRight); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponentLeft); + } +} + +SINGLE_BATTLE_TEST("Powder fails if the target is Grass type") +{ + GIVEN { + ASSUME(gSpeciesInfo[SPECIES_VENUSAUR].types[0] == TYPE_GRASS || gSpeciesInfo[SPECIES_VENUSAUR].types[1] == TYPE_GRASS); + PLAYER(SPECIES_VENUSAUR); + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponent, MOVE_POWDER); MOVE(player, MOVE_EMBER); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, player); + HP_BAR(opponent); + } +} + +SINGLE_BATTLE_TEST("Powder fails if the target has Overcoat") +{ + GIVEN { + PLAYER(SPECIES_FORRETRESS) { Ability(ABILITY_OVERCOAT); } + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponent, MOVE_POWDER); MOVE(player, MOVE_EMBER); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, player); + HP_BAR(opponent); + } +} + +DOUBLE_BATTLE_TEST("Powder still blocks the target's Fire type moves even if it was given Grass type") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_FORESTS_CURSE].effect == EFFECT_THIRD_TYPE); + ASSUME(gMovesInfo[MOVE_FORESTS_CURSE].argument == TYPE_GRASS); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_TREVENANT); + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponentRight, MOVE_POWDER, target: playerLeft); MOVE(opponentLeft, MOVE_FORESTS_CURSE, target: playerLeft); MOVE(playerLeft, MOVE_EMBER, target: opponentRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FORESTS_CURSE, opponentLeft); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, playerLeft); + HP_BAR(opponentLeft); + } + } +} + +DOUBLE_BATTLE_TEST("Powder still blocks the target's Fire type moves even if it was given Overcoat") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_DOODLE].effect == EFFECT_DOODLE); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_FORRETRESS) { Ability(ABILITY_OVERCOAT); } + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponentRight, MOVE_POWDER, target: playerLeft); MOVE(playerRight, MOVE_DOODLE, target: opponentLeft); MOVE(playerLeft, MOVE_EMBER, target: opponentRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DOODLE, playerRight); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, playerLeft); + HP_BAR(opponentLeft); + } + } THEN { + EXPECT_EQ(playerLeft->ability, ABILITY_OVERCOAT); + } +} + +SINGLE_BATTLE_TEST("Powder prevents Protean from changing its user to Fire type") +{ + GIVEN { + PLAYER(SPECIES_GRENINJA) { Ability(ABILITY_PROTEAN); } + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponent, MOVE_POWDER); MOVE(player, MOVE_EMBER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponent); + NONE_OF { + ABILITY_POPUP(player, ABILITY_PROTEAN); + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, player); + HP_BAR(opponent); + } + } +} + +SINGLE_BATTLE_TEST("Powder doesn't prevent a Fire move from thawing its user out") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_FLAME_WHEEL].thawsUser); + ASSUME(gMovesInfo[MOVE_FLAME_WHEEL].type == TYPE_FIRE); + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_FREEZE); } + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponent, MOVE_POWDER); MOVE(player, MOVE_FLAME_WHEEL); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponent); + MESSAGE("Wobbuffet was defrosted by Flame Wheel!"); + STATUS_ICON(player, none: TRUE); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLAME_WHEEL, player); + HP_BAR(opponent); + } + } +} + +SINGLE_BATTLE_TEST("Powder doesn't consume Berry from Fire type Natural Gift but prevents using the move") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_NATURAL_GIFT].effect == EFFECT_NATURAL_GIFT); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_CHERI_BERRY); } + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponent, MOVE_POWDER); MOVE(player, MOVE_NATURAL_GIFT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponent); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_NATURAL_GIFT, player); + HP_BAR(opponent); + } + } THEN { + EXPECT_EQ(player->item, ITEM_CHERI_BERRY); + } +} + +DOUBLE_BATTLE_TEST("Powder damages a target using Shell Trap even if it wasn't hit by a Physical move") +{ + u32 move; + PARAMETRIZE { move = MOVE_TACKLE; } + PARAMETRIZE { move = MOVE_EMBER; } + PARAMETRIZE { move = MOVE_TICKLE;} + GIVEN { + ASSUME(gMovesInfo[MOVE_SHELL_TRAP].effect == EFFECT_SHELL_TRAP); + ASSUME(gMovesInfo[MOVE_SHELL_TRAP].type == TYPE_FIRE); + ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(gMovesInfo[MOVE_EMBER].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(gMovesInfo[MOVE_TICKLE].category == DAMAGE_CATEGORY_STATUS); + ASSUME(gMovesInfo[MOVE_TICKLE].effect == EFFECT_TICKLE); + PLAYER(SPECIES_TURTONATOR); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(playerLeft, MOVE_SHELL_TRAP); MOVE(opponentRight, MOVE_POWDER, target: playerLeft); MOVE(opponentLeft, move, target: playerLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_SHELL_TRAP_SETUP, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, move, opponentLeft); + if (move != MOVE_TICKLE) + HP_BAR(playerLeft); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHELL_TRAP, playerLeft); + HP_BAR(opponentLeft); + HP_BAR(opponentRight); + } + HP_BAR(playerLeft); + } +} diff --git a/test/battle/move_effect/protect.c b/test/battle/move_effect/protect.c index aca5ef859db7..60b55ebb7528 100644 --- a/test/battle/move_effect/protect.c +++ b/test/battle/move_effect/protect.c @@ -547,3 +547,22 @@ DOUBLE_BATTLE_TEST("Crafty Shield does not protect against moves that target all MESSAGE("Foe Sunflora's Defense rose!"); } } + +SINGLE_BATTLE_TEST("Spiky Shield does not damage users on Counter or Mirror Coat") +{ + u32 move; + PARAMETRIZE { move = MOVE_MIRROR_COAT; } + PARAMETRIZE { move = MOVE_COUNTER; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SPIKY_SHIELD); MOVE(opponent, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPIKY_SHIELD, player); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + HP_BAR(opponent); + } + } +} diff --git a/test/battle/move_effect/quash.c b/test/battle/move_effect/quash.c index fd2bd9d877a4..5500fcb33e5c 100644 --- a/test/battle/move_effect/quash.c +++ b/test/battle/move_effect/quash.c @@ -32,14 +32,102 @@ DOUBLE_BATTLE_TEST("Quash is not affected by dynamic speed") PLAYER(SPECIES_WOBBUFFET) { Speed(30); } OPPONENT(SPECIES_TORCHIC) { Speed(50); } OPPONENT(SPECIES_TREECKO) { Speed(40); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_QUASH, target: opponentLeft); + MOVE(opponentRight, MOVE_TAILWIND); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_QUASH, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TAILWIND, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentLeft); + } +} + +DOUBLE_BATTLE_TEST("Quash calculates correct turn order if only one pokemon is left on the opposing side") +{ + GIVEN { + PLAYER(SPECIES_GRENINJA) { Speed(120); } + PLAYER(SPECIES_REGIROCK) { Speed(100); } + OPPONENT(SPECIES_PIDGEOT) { Speed(10); } + OPPONENT(SPECIES_DRAGONITE) { Speed(60); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_QUASH, target: playerRight); + MOVE(playerRight, MOVE_STONE_EDGE, target: opponentLeft); + MOVE(opponentRight, MOVE_CELEBRATE); + } + TURN { + MOVE(playerLeft, MOVE_QUASH, target: playerRight); + MOVE(playerRight, MOVE_STONE_EDGE, target: opponentRight); + MOVE(opponentRight, MOVE_CELEBRATE); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_QUASH, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_STONE_EDGE, playerRight); + HP_BAR(opponentLeft); + MESSAGE("Foe Pidgeot fainted!"); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_QUASH, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_STONE_EDGE, playerRight); + HP_BAR(opponentRight); + } +} + +DOUBLE_BATTLE_TEST("Quash-affected targets move from fastest to slowest (Gen 8+) or from first affected battler to last (Gen 7-)") +{ + u32 speedLeft, speedRight; + + PARAMETRIZE { speedLeft = 60; speedRight = 50; } + PARAMETRIZE { speedLeft = 50; speedRight = 60; } + GIVEN { + PLAYER(SPECIES_VOLBEAT) { Speed(10); Ability(ABILITY_PRANKSTER); } + PLAYER(SPECIES_WOBBUFFET) { Speed(70); } + OPPONENT(SPECIES_TORCHIC) { Speed(speedLeft); } + OPPONENT(SPECIES_TREECKO) { Speed(speedRight); } } WHEN { TURN { MOVE(playerLeft, MOVE_QUASH, target: opponentRight); + MOVE(playerRight, MOVE_QUASH, target: opponentLeft); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_QUASH, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_QUASH, playerRight); + if (B_QUASH_TURN_ORDER < GEN_8) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentLeft); + } + else if (speedLeft > speedRight) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); + } + else { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentLeft); + } + } +} + +DOUBLE_BATTLE_TEST("Quash-affected mon that acted early via After You is not affected by dynamic speed") +{ + GIVEN { + ASSUME(B_RECALC_TURN_AFTER_ACTIONS >= GEN_8); + ASSUME(gMovesInfo[MOVE_TAILWIND].effect == EFFECT_TAILWIND); + ASSUME(gMovesInfo[MOVE_AFTER_YOU].effect == EFFECT_AFTER_YOU); + PLAYER(SPECIES_VOLBEAT) { Speed(20); Ability(ABILITY_PRANKSTER); } + PLAYER(SPECIES_WOBBUFFET) { Speed(30); } + OPPONENT(SPECIES_TORCHIC) { Speed(10); } + OPPONENT(SPECIES_TREECKO) { Speed(40); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_QUASH, target: opponentLeft); + MOVE(opponentRight, MOVE_AFTER_YOU, target: opponentLeft); MOVE(opponentLeft, MOVE_TAILWIND); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_QUASH, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_AFTER_YOU, opponentRight); ANIMATION(ANIM_TYPE_MOVE, MOVE_TAILWIND, opponentLeft); - ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); - ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); // this is the relevant part, testing if quash affected battler becomes last to move causing playerRight to not move } } diff --git a/test/battle/move_effect/raging_bull.c b/test/battle/move_effect/raging_bull.c index 23b138ca4154..7e72ca82738a 100644 --- a/test/battle/move_effect/raging_bull.c +++ b/test/battle/move_effect/raging_bull.c @@ -143,9 +143,9 @@ SINGLE_BATTLE_TEST("Move Raging Bull changes it's type depending on the Tauros F u16 speciesPlayer; u16 speciesOpponent; - PARAMETRIZE { speciesPlayer = SPECIES_TAUROS_PALDEAN_COMBAT_BREED; speciesOpponent = SPECIES_CHARIZARD; } - PARAMETRIZE { speciesPlayer = SPECIES_TAUROS_PALDEAN_BLAZE_BREED; speciesOpponent = SPECIES_BLASTOISE; } - PARAMETRIZE { speciesPlayer = SPECIES_TAUROS_PALDEAN_AQUA_BREED; speciesOpponent = SPECIES_VENUSAUR; } + PARAMETRIZE { speciesPlayer = SPECIES_TAUROS_PALDEA_COMBAT; speciesOpponent = SPECIES_CHARIZARD; } + PARAMETRIZE { speciesPlayer = SPECIES_TAUROS_PALDEA_BLAZE; speciesOpponent = SPECIES_BLASTOISE; } + PARAMETRIZE { speciesPlayer = SPECIES_TAUROS_PALDEA_AQUA; speciesOpponent = SPECIES_VENUSAUR; } GIVEN { PLAYER(speciesPlayer); diff --git a/test/battle/move_effect/role_play.c b/test/battle/move_effect/role_play.c index 46452ec3ffd0..cf82632fd811 100644 --- a/test/battle/move_effect/role_play.c +++ b/test/battle/move_effect/role_play.c @@ -19,7 +19,7 @@ SINGLE_BATTLE_TEST("Role Play fails if target has a banned ability") PARAMETRIZE { species = SPECIES_DARMANITAN; ability = ABILITY_ZEN_MODE; } PARAMETRIZE { species = SPECIES_DITTO; ability = ABILITY_IMPOSTER; } PARAMETRIZE { species = SPECIES_AEGISLASH; ability = ABILITY_STANCE_CHANGE; } - PARAMETRIZE { species = SPECIES_MUK_ALOLAN; ability = ABILITY_POWER_OF_ALCHEMY; } + PARAMETRIZE { species = SPECIES_MUK_ALOLA; ability = ABILITY_POWER_OF_ALCHEMY; } PARAMETRIZE { species = SPECIES_PASSIMIAN; ability = ABILITY_RECEIVER; } PARAMETRIZE { species = SPECIES_WISHIWASHI; ability = ABILITY_SCHOOLING; } PARAMETRIZE { species = SPECIES_KOMALA; ability = ABILITY_COMATOSE; } diff --git a/test/battle/move_effect/shed_tail.c b/test/battle/move_effect/shed_tail.c index d69993b88b82..3b2417f7c723 100644 --- a/test/battle/move_effect/shed_tail.c +++ b/test/battle/move_effect/shed_tail.c @@ -88,6 +88,7 @@ SINGLE_BATTLE_TEST("Shed Tail's HP cost doesn't trigger effects that trigger on AI_SINGLE_BATTLE_TEST("AI will use Shed Tail to pivot to another mon while in damage stalemate with player") { + KNOWN_FAILING; // missing AI code GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET) { Speed(100); Ability(ABILITY_RUN_AWAY); Moves(MOVE_TACKLE, MOVE_CELEBRATE); } diff --git a/test/battle/move_effect/shell_trap.c b/test/battle/move_effect/shell_trap.c index cd63be237689..40febf040e40 100644 --- a/test/battle/move_effect/shell_trap.c +++ b/test/battle/move_effect/shell_trap.c @@ -166,3 +166,35 @@ DOUBLE_BATTLE_TEST("Shell Trap activates immediately after being hit on turn 3 a HP_BAR(opponentRight); } } + +DOUBLE_BATTLE_TEST("Shell Trap targets correctly if one of the opponents has fainted") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_SHELL_TRAP].target == MOVE_TARGET_BOTH); + PLAYER(SPECIES_GRENINJA) { Speed(60); } + PLAYER(SPECIES_TURTONATOR) { Speed(10); } + OPPONENT(SPECIES_BLASTOISE) { Speed(120); } + OPPONENT(SPECIES_SCIZOR) { Speed(100); } + } WHEN { + TURN { + MOVE(opponentLeft, MOVE_TACKLE, target: playerRight); + MOVE(playerRight, MOVE_SHELL_TRAP); + } + TURN { + MOVE(opponentLeft, MOVE_TACKLE, target: playerRight); + MOVE(playerRight, MOVE_SHELL_TRAP); + } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_SHELL_TRAP_SETUP, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHELL_TRAP, playerRight); + MESSAGE("Foe Scizor fainted!"); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerLeft); + + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_SHELL_TRAP_SETUP, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHELL_TRAP, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerLeft); + } +} diff --git a/test/battle/move_effect/wake_up_slap.c b/test/battle/move_effect/wake_up_slap.c index 2c9dd7ed2441..20b22ca660ff 100644 --- a/test/battle/move_effect/wake_up_slap.c +++ b/test/battle/move_effect/wake_up_slap.c @@ -35,7 +35,7 @@ SINGLE_BATTLE_TEST("Wake-Up Slap does not cure paralyzed pokemons behind substit } } -SINGLE_BATTLE_TEST("Wake-Up Slap get incread power vs. sleeping targets") +SINGLE_BATTLE_TEST("Wake-Up Slap gets increased power against sleeping targets") { u32 status1; PARAMETRIZE { status1 = STATUS1_SLEEP; } diff --git a/test/battle/move_effect_secondary/freeze.c b/test/battle/move_effect_secondary/freeze.c index 1539c8a25b76..45005cf5d7da 100644 --- a/test/battle/move_effect_secondary/freeze.c +++ b/test/battle/move_effect_secondary/freeze.c @@ -90,11 +90,11 @@ SINGLE_BATTLE_TEST("Freezing Glare shouldn't freeze Psychic-types") #endif { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_ARTICUNO_GALARIAN].types[0] == TYPE_PSYCHIC); + ASSUME(gSpeciesInfo[SPECIES_ARTICUNO_GALAR].types[0] == TYPE_PSYCHIC); ASSUME(MoveHasAdditionalEffect(MOVE_FREEZING_GLARE, MOVE_EFFECT_FREEZE_OR_FROSTBITE) == TRUE); ASSUME(gMovesInfo[MOVE_FREEZING_GLARE].type == TYPE_PSYCHIC); - PLAYER(SPECIES_ARTICUNO_GALARIAN); - OPPONENT(SPECIES_ARTICUNO_GALARIAN); + PLAYER(SPECIES_ARTICUNO_GALAR); + OPPONENT(SPECIES_ARTICUNO_GALAR); } WHEN { TURN { MOVE(player, MOVE_FREEZING_GLARE); } } SCENE { diff --git a/test/battle/move_effect_secondary/order_up.c b/test/battle/move_effect_secondary/order_up.c new file mode 100644 index 000000000000..ea1980062c00 --- /dev/null +++ b/test/battle/move_effect_secondary/order_up.c @@ -0,0 +1,172 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gMovesInfo[MOVE_ORDER_UP].additionalEffects[0].moveEffect == MOVE_EFFECT_ORDER_UP); +} + +DOUBLE_BATTLE_TEST("Order Up increases a stat based on Tatsugiri's form") +{ + u32 species = 0; + PARAMETRIZE { species = SPECIES_TATSUGIRI_CURLY; } + PARAMETRIZE { species = SPECIES_TATSUGIRI_DROOPY; } + PARAMETRIZE { species = SPECIES_TATSUGIRI_STRETCHY; } + + GIVEN { + PLAYER(species) { Ability(ABILITY_COMMANDER); } + PLAYER(SPECIES_DONDOZO); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_VOLBEAT) { Ability(ABILITY_PRANKSTER); }; + } WHEN { + TURN { MOVE(opponentRight, MOVE_HAZE); MOVE(playerRight, MOVE_ORDER_UP, target: opponentLeft); } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_COMMANDER); + MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_HAZE, opponentRight); // Remove previous stat boosts + ANIMATION(ANIM_TYPE_MOVE, MOVE_ORDER_UP, playerRight); + switch (species) + { + case SPECIES_TATSUGIRI_CURLY: + MESSAGE("Dondozo's Attack rose!"); + break; + case SPECIES_TATSUGIRI_DROOPY: + MESSAGE("Dondozo's Defense rose!"); + break; + case SPECIES_TATSUGIRI_STRETCHY: + MESSAGE("Dondozo's Speed rose!"); + break; + } + } THEN { + switch (species) + { + case SPECIES_TATSUGIRI_CURLY: + EXPECT_EQ(playerRight->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); + break; + case SPECIES_TATSUGIRI_DROOPY: + EXPECT_EQ(playerRight->statStages[STAT_DEF], DEFAULT_STAT_STAGE + 1); + break; + case SPECIES_TATSUGIRI_STRETCHY: + EXPECT_EQ(playerRight->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 1); + break; + } + } +} + +DOUBLE_BATTLE_TEST("Order Up increases a stat based on Tatsugiri's form even if Tatsugiri fainted inside Dondozo") +{ + u32 species = 0; + PARAMETRIZE { species = SPECIES_TATSUGIRI_CURLY; } + PARAMETRIZE { species = SPECIES_TATSUGIRI_DROOPY; } + PARAMETRIZE { species = SPECIES_TATSUGIRI_STRETCHY; } + + GIVEN { + PLAYER(species) { HP(1); Status1(STATUS1_POISON); Ability(ABILITY_COMMANDER); } + PLAYER(SPECIES_DONDOZO); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_VOLBEAT) { Ability(ABILITY_PRANKSTER); }; + } WHEN { + TURN { } + TURN { MOVE(opponentRight, MOVE_HAZE); MOVE(playerRight, MOVE_ORDER_UP, target: opponentLeft); } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_COMMANDER); + MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + MESSAGE("Tatsugiri is hurt by poison!"); + MESSAGE("Tatsugiri fainted!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_HAZE, opponentRight); // Remove previous stat boosts + ANIMATION(ANIM_TYPE_MOVE, MOVE_ORDER_UP, playerRight); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + switch (species) + { + case SPECIES_TATSUGIRI_CURLY: + MESSAGE("Dondozo's Attack rose!"); + break; + case SPECIES_TATSUGIRI_DROOPY: + MESSAGE("Dondozo's Defense rose!"); + break; + case SPECIES_TATSUGIRI_STRETCHY: + MESSAGE("Dondozo's Speed rose!"); + break; + } + } THEN { + switch (species) + { + case SPECIES_TATSUGIRI_CURLY: + EXPECT_EQ(playerRight->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); + break; + case SPECIES_TATSUGIRI_DROOPY: + EXPECT_EQ(playerRight->statStages[STAT_DEF], DEFAULT_STAT_STAGE + 1); + break; + case SPECIES_TATSUGIRI_STRETCHY: + EXPECT_EQ(playerRight->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 1); + break; + } + } +} + +DOUBLE_BATTLE_TEST("Order up does not boosts any stats if Dondozo is not affected by Commander") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_DONDOZO); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerRight, MOVE_ORDER_UP, target: opponentLeft); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + } +} + +DOUBLE_BATTLE_TEST("Order Up is boosted by Sheer Force without removing the stat boosting effect") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_ENTRAINMENT].effect == EFFECT_ENTRAINMENT); + PLAYER(SPECIES_DONDOZO) { Speed(10); } + PLAYER(SPECIES_TATSUGIRI_CURLY) { Speed(9); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(8); } + OPPONENT(SPECIES_TAUROS) { Speed(21); Ability(ABILITY_SHEER_FORCE); } + } WHEN { + TURN { MOVE(opponentRight, MOVE_ENTRAINMENT, target: playerLeft); MOVE(playerLeft, MOVE_ORDER_UP, target: opponentLeft); } + } SCENE { + MESSAGE("Foe Tauros used Entrainment!"); + MESSAGE("Dondozo acquired Sheer Force!"); + MESSAGE("Dondozo used Order Up!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + } +} +DOUBLE_BATTLE_TEST("Order Up is always boosted by Sheer Force", s16 damage) +{ + u32 move; + u32 ability; + PARAMETRIZE(move = MOVE_CELEBRATE, ability = ABILITY_STORM_DRAIN); + PARAMETRIZE(move = MOVE_ENTRAINMENT, ability = ABILITY_STORM_DRAIN); + PARAMETRIZE(move = MOVE_ENTRAINMENT, ability = ABILITY_COMMANDER); + + GIVEN { + ASSUME(gMovesInfo[MOVE_HAZE].effect == EFFECT_HAZE); + ASSUME(gMovesInfo[MOVE_ENTRAINMENT].effect == EFFECT_ENTRAINMENT); + PLAYER(SPECIES_DONDOZO) { Speed(10); } + PLAYER(SPECIES_TATSUGIRI_CURLY) { Speed(9); Ability(ability); } + OPPONENT(SPECIES_TAUROS) { Speed(21); Ability(ABILITY_SHEER_FORCE); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(22); } + } WHEN { + TURN { MOVE(opponentRight, MOVE_HAZE); + MOVE(opponentLeft, move, target: playerLeft); + MOVE(playerLeft, MOVE_ORDER_UP, target: opponentRight); } + } SCENE { + MESSAGE("Foe Wobbuffet used Haze!"); + if (move == MOVE_ENTRAINMENT) + { + MESSAGE("Foe Tauros used Entrainment!"); + MESSAGE("Dondozo acquired Sheer Force!"); + } + MESSAGE("Dondozo used Order Up!"); + HP_BAR(opponentRight, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, UQ_4_12(1.3), results[1].damage); + EXPECT_MUL_EQ(results[0].damage, UQ_4_12(1.3), results[2].damage); + } +} diff --git a/test/battle/terrain/electric.c b/test/battle/terrain/electric.c index c39bfbbb71da..bb72efdcb7d5 100644 --- a/test/battle/terrain/electric.c +++ b/test/battle/terrain/electric.c @@ -25,7 +25,7 @@ SINGLE_BATTLE_TEST("Electric Terrain activates Electric Seed and Mimicry") ASSUME(gItemsInfo[ITEM_ELECTRIC_SEED].holdEffect == HOLD_EFFECT_SEEDS); ASSUME(gItemsInfo[ITEM_ELECTRIC_SEED].holdEffectParam == HOLD_EFFECT_PARAM_ELECTRIC_TERRAIN); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_ELECTRIC_SEED); } - OPPONENT(SPECIES_STUNFISK_GALARIAN) { Ability(ABILITY_MIMICRY); } + OPPONENT(SPECIES_STUNFISK_GALAR) { Ability(ABILITY_MIMICRY); } } WHEN { TURN { MOVE(player, MOVE_ELECTRIC_TERRAIN); } } SCENE { diff --git a/test/battle/terrain/grassy.c b/test/battle/terrain/grassy.c index 5840f0310cdd..5508255afd34 100644 --- a/test/battle/terrain/grassy.c +++ b/test/battle/terrain/grassy.c @@ -21,7 +21,7 @@ SINGLE_BATTLE_TEST("Grassy Terrain activates Grassy Seed and Mimicry") ASSUME(gItemsInfo[ITEM_GRASSY_SEED].holdEffect == HOLD_EFFECT_SEEDS); ASSUME(gItemsInfo[ITEM_GRASSY_SEED].holdEffectParam == HOLD_EFFECT_PARAM_GRASSY_TERRAIN); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_GRASSY_SEED); } - OPPONENT(SPECIES_STUNFISK_GALARIAN) { Ability(ABILITY_MIMICRY); } + OPPONENT(SPECIES_STUNFISK_GALAR) { Ability(ABILITY_MIMICRY); } } WHEN { TURN { MOVE(player, MOVE_GRASSY_TERRAIN); } } SCENE { diff --git a/test/battle/terrain/misty.c b/test/battle/terrain/misty.c index fbf04fcba968..d6fde8fb7d55 100644 --- a/test/battle/terrain/misty.c +++ b/test/battle/terrain/misty.c @@ -25,7 +25,7 @@ SINGLE_BATTLE_TEST("Misty Terrain activates Misty Seed and Mimicry") ASSUME(gItemsInfo[ITEM_MISTY_SEED].holdEffect == HOLD_EFFECT_SEEDS); ASSUME(gItemsInfo[ITEM_MISTY_SEED].holdEffectParam == HOLD_EFFECT_PARAM_MISTY_TERRAIN); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_MISTY_SEED); } - OPPONENT(SPECIES_STUNFISK_GALARIAN) { Ability(ABILITY_MIMICRY); } + OPPONENT(SPECIES_STUNFISK_GALAR) { Ability(ABILITY_MIMICRY); } } WHEN { TURN { MOVE(player, MOVE_MISTY_TERRAIN); } } SCENE { diff --git a/test/battle/terrain/psychic.c b/test/battle/terrain/psychic.c index 44a89598d22c..9a015a2c89e8 100644 --- a/test/battle/terrain/psychic.c +++ b/test/battle/terrain/psychic.c @@ -24,7 +24,7 @@ SINGLE_BATTLE_TEST("Psychic Terrain activates Psychic Seed and Mimicry") ASSUME(gItemsInfo[ITEM_PSYCHIC_SEED].holdEffect == HOLD_EFFECT_SEEDS); ASSUME(gItemsInfo[ITEM_PSYCHIC_SEED].holdEffectParam == HOLD_EFFECT_PARAM_PSYCHIC_TERRAIN); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_PSYCHIC_SEED); } - OPPONENT(SPECIES_STUNFISK_GALARIAN) { Ability(ABILITY_MIMICRY); } + OPPONENT(SPECIES_STUNFISK_GALAR) { Ability(ABILITY_MIMICRY); } } WHEN { TURN { MOVE(player, MOVE_PSYCHIC_TERRAIN); } } SCENE { diff --git a/test/test_runner_battle.c b/test/test_runner_battle.c index 9a1ad8d7082b..92f041b9f606 100644 --- a/test/test_runner_battle.c +++ b/test/test_runner_battle.c @@ -559,19 +559,19 @@ void TestRunner_Battle_RecordAbilityPopUp(u32 battlerId, u32 ability) s32 match; struct QueuedEvent *event; - if (DATA.queuedEvent == DATA.queuedEventsCount) + if (DATA.trial.queuedEvent == DATA.queuedEventsCount) return; - event = &DATA.queuedEvents[DATA.queuedEvent]; + event = &DATA.queuedEvents[DATA.trial.queuedEvent]; switch (event->groupType) { case QUEUE_GROUP_NONE: case QUEUE_GROUP_ONE_OF: - if (TryAbilityPopUp(DATA.queuedEvent, event->groupSize, battlerId, ability) != -1) - DATA.queuedEvent += event->groupSize; + if (TryAbilityPopUp(DATA.trial.queuedEvent, event->groupSize, battlerId, ability) != -1) + DATA.trial.queuedEvent += event->groupSize; break; case QUEUE_GROUP_NONE_OF: - queuedEvent = DATA.queuedEvent; + queuedEvent = DATA.trial.queuedEvent; do { if ((match = TryAbilityPopUp(queuedEvent, event->groupSize, battlerId, ability)) != -1) @@ -590,7 +590,7 @@ void TestRunner_Battle_RecordAbilityPopUp(u32 battlerId, u32 ability) continue; if (TryAbilityPopUp(queuedEvent, event->groupSize, battlerId, ability) != -1) - DATA.queuedEvent = queuedEvent + event->groupSize; + DATA.trial.queuedEvent = queuedEvent + event->groupSize; } while (FALSE); break; } @@ -622,19 +622,19 @@ void TestRunner_Battle_RecordAnimation(u32 animType, u32 animId) s32 match; struct QueuedEvent *event; - if (DATA.queuedEvent == DATA.queuedEventsCount) + if (DATA.trial.queuedEvent == DATA.queuedEventsCount) return; - event = &DATA.queuedEvents[DATA.queuedEvent]; + event = &DATA.queuedEvents[DATA.trial.queuedEvent]; switch (event->groupType) { case QUEUE_GROUP_NONE: case QUEUE_GROUP_ONE_OF: - if (TryAnimation(DATA.queuedEvent, event->groupSize, animType, animId) != -1) - DATA.queuedEvent += event->groupSize; + if (TryAnimation(DATA.trial.queuedEvent, event->groupSize, animType, animId) != -1) + DATA.trial.queuedEvent += event->groupSize; break; case QUEUE_GROUP_NONE_OF: - queuedEvent = DATA.queuedEvent; + queuedEvent = DATA.trial.queuedEvent; do { if ((match = TryAnimation(queuedEvent, event->groupSize, animType, animId)) != -1) @@ -653,7 +653,7 @@ void TestRunner_Battle_RecordAnimation(u32 animType, u32 animId) continue; if (TryAnimation(queuedEvent, event->groupSize, animType, animId) != -1) - DATA.queuedEvent = queuedEvent + event->groupSize; + DATA.trial.queuedEvent = queuedEvent + event->groupSize; } while (FALSE); break; } @@ -712,19 +712,19 @@ void TestRunner_Battle_RecordHP(u32 battlerId, u32 oldHP, u32 newHP) s32 match; struct QueuedEvent *event; - if (DATA.queuedEvent == DATA.queuedEventsCount) + if (DATA.trial.queuedEvent == DATA.queuedEventsCount) return; - event = &DATA.queuedEvents[DATA.queuedEvent]; + event = &DATA.queuedEvents[DATA.trial.queuedEvent]; switch (event->groupType) { case QUEUE_GROUP_NONE: case QUEUE_GROUP_ONE_OF: - if (TryHP(DATA.queuedEvent, event->groupSize, battlerId, oldHP, newHP) != -1) - DATA.queuedEvent += event->groupSize; + if (TryHP(DATA.trial.queuedEvent, event->groupSize, battlerId, oldHP, newHP) != -1) + DATA.trial.queuedEvent += event->groupSize; break; case QUEUE_GROUP_NONE_OF: - queuedEvent = DATA.queuedEvent; + queuedEvent = DATA.trial.queuedEvent; do { if ((match = TryHP(queuedEvent, event->groupSize, battlerId, oldHP, newHP)) != -1) @@ -743,7 +743,7 @@ void TestRunner_Battle_RecordHP(u32 battlerId, u32 oldHP, u32 newHP) continue; if (TryHP(queuedEvent, event->groupSize, battlerId, oldHP, newHP) != -1) - DATA.queuedEvent = queuedEvent + event->groupSize; + DATA.trial.queuedEvent = queuedEvent + event->groupSize; } while (FALSE); break; } @@ -774,7 +774,7 @@ static u32 CountAiExpectMoves(struct ExpectedAIAction *expectedAction, u32 battl void TestRunner_Battle_CheckChosenMove(u32 battlerId, u32 moveId, u32 target) { const char *filename = gTestRunnerState.test->filename; - u32 id = DATA.aiActionsPlayed[battlerId]; + u32 id = DATA.trial.aiActionsPlayed[battlerId]; struct ExpectedAIAction *expectedAction = &DATA.expectedAiActions[battlerId][id]; if (!expectedAction->actionSet) @@ -837,13 +837,13 @@ void TestRunner_Battle_CheckChosenMove(u32 battlerId, u32 moveId, u32 target) } // Turn passed, clear logs from the turn ClearAiLog(battlerId); - DATA.aiActionsPlayed[battlerId]++; + DATA.trial.aiActionsPlayed[battlerId]++; } void TestRunner_Battle_CheckSwitch(u32 battlerId, u32 partyIndex) { const char *filename = gTestRunnerState.test->filename; - u32 id = DATA.aiActionsPlayed[battlerId]; + u32 id = DATA.trial.aiActionsPlayed[battlerId]; struct ExpectedAIAction *expectedAction = &DATA.expectedAiActions[battlerId][id]; if (!expectedAction->actionSet) @@ -857,7 +857,7 @@ void TestRunner_Battle_CheckSwitch(u32 battlerId, u32 partyIndex) if (expectedAction->target != partyIndex) Test_ExitWithResult(TEST_RESULT_FAIL, SourceLine(0), ":L%s:%d: Expected partyIndex %d, got %d", filename, expectedAction->sourceLine, expectedAction->target, partyIndex); } - DATA.aiActionsPlayed[battlerId]++; + DATA.trial.aiActionsPlayed[battlerId]++; } void TestRunner_Battle_InvalidNoHPMon(u32 battlerId, u32 partyIndex) @@ -1021,7 +1021,7 @@ void TestRunner_Battle_CheckAiMoveScores(u32 battlerId) } // We need to make sure that the expected move has the best score. We have to rule out a situation where the expected move is used, but it has the same number of points as some other moves. - aiAction = &DATA.expectedAiActions[battlerId][DATA.aiActionsPlayed[battlerId]]; + aiAction = &DATA.expectedAiActions[battlerId][DATA.trial.aiActionsPlayed[battlerId]]; if (aiAction->actionSet && !aiAction->pass) { s32 target = aiAction->target; @@ -1094,19 +1094,19 @@ void TestRunner_Battle_RecordExp(u32 battlerId, u32 oldExp, u32 newExp) s32 match; struct QueuedEvent *event; - if (DATA.queuedEvent == DATA.queuedEventsCount) + if (DATA.trial.queuedEvent == DATA.queuedEventsCount) return; - event = &DATA.queuedEvents[DATA.queuedEvent]; + event = &DATA.queuedEvents[DATA.trial.queuedEvent]; switch (event->groupType) { case QUEUE_GROUP_NONE: case QUEUE_GROUP_ONE_OF: - if (TryExp(DATA.queuedEvent, event->groupSize, battlerId, oldExp, newExp) != -1) - DATA.queuedEvent += event->groupSize; + if (TryExp(DATA.trial.queuedEvent, event->groupSize, battlerId, oldExp, newExp) != -1) + DATA.trial.queuedEvent += event->groupSize; break; case QUEUE_GROUP_NONE_OF: - queuedEvent = DATA.queuedEvent; + queuedEvent = DATA.trial.queuedEvent; do { if ((match = TryExp(queuedEvent, event->groupSize, battlerId, oldExp, newExp)) != -1) @@ -1125,7 +1125,7 @@ void TestRunner_Battle_RecordExp(u32 battlerId, u32 oldExp, u32 newExp) continue; if (TryExp(queuedEvent, event->groupSize, battlerId, oldExp, newExp) != -1) - DATA.queuedEvent = queuedEvent + event->groupSize; + DATA.trial.queuedEvent = queuedEvent + event->groupSize; } while (FALSE); break; } @@ -1183,19 +1183,19 @@ void TestRunner_Battle_RecordMessage(const u8 *string) s32 match; struct QueuedEvent *event; - if (DATA.queuedEvent == DATA.queuedEventsCount) + if (DATA.trial.queuedEvent == DATA.queuedEventsCount) return; - event = &DATA.queuedEvents[DATA.queuedEvent]; + event = &DATA.queuedEvents[DATA.trial.queuedEvent]; switch (event->groupType) { case QUEUE_GROUP_NONE: case QUEUE_GROUP_ONE_OF: - if (TryMessage(DATA.queuedEvent, event->groupSize, string) != -1) - DATA.queuedEvent += event->groupSize; + if (TryMessage(DATA.trial.queuedEvent, event->groupSize, string) != -1) + DATA.trial.queuedEvent += event->groupSize; break; case QUEUE_GROUP_NONE_OF: - queuedEvent = DATA.queuedEvent; + queuedEvent = DATA.trial.queuedEvent; do { if ((match = TryMessage(queuedEvent, event->groupSize, string)) != -1) @@ -1214,7 +1214,7 @@ void TestRunner_Battle_RecordMessage(const u8 *string) continue; if (TryMessage(queuedEvent, event->groupSize, string) != -1) - DATA.queuedEvent = queuedEvent + event->groupSize; + DATA.trial.queuedEvent = queuedEvent + event->groupSize; } while (FALSE); break; } @@ -1248,19 +1248,19 @@ void TestRunner_Battle_RecordStatus1(u32 battlerId, u32 status1) s32 match; struct QueuedEvent *event; - if (DATA.queuedEvent == DATA.queuedEventsCount) + if (DATA.trial.queuedEvent == DATA.queuedEventsCount) return; - event = &DATA.queuedEvents[DATA.queuedEvent]; + event = &DATA.queuedEvents[DATA.trial.queuedEvent]; switch (event->groupType) { case QUEUE_GROUP_NONE: case QUEUE_GROUP_ONE_OF: - if (TryStatus(DATA.queuedEvent, event->groupSize, battlerId, status1) != -1) - DATA.queuedEvent += event->groupSize; + if (TryStatus(DATA.trial.queuedEvent, event->groupSize, battlerId, status1) != -1) + DATA.trial.queuedEvent += event->groupSize; break; case QUEUE_GROUP_NONE_OF: - queuedEvent = DATA.queuedEvent; + queuedEvent = DATA.trial.queuedEvent; do { if ((match = TryStatus(queuedEvent, event->groupSize, battlerId, status1)) != -1) @@ -1279,7 +1279,7 @@ void TestRunner_Battle_RecordStatus1(u32 battlerId, u32 status1) continue; if (TryStatus(queuedEvent, event->groupSize, battlerId, status1) != -1) - DATA.queuedEvent = queuedEvent + event->groupSize; + DATA.trial.queuedEvent = queuedEvent + event->groupSize; } while (FALSE); break; } @@ -1299,22 +1299,22 @@ void TestRunner_Battle_AfterLastTurn(void) { const struct BattleTest *test = GetBattleTest(); - if (DATA.turns - 1 != DATA.lastActionTurn) + if (DATA.turns - 1 != DATA.trial.lastActionTurn) { const char *filename = gTestRunnerState.test->filename; - Test_ExitWithResult(TEST_RESULT_FAIL, SourceLine(0), ":L%s:%d: %d TURNs specified, but %d ran", filename, SourceLine(0), DATA.turns, DATA.lastActionTurn + 1); + Test_ExitWithResult(TEST_RESULT_FAIL, SourceLine(0), ":L%s:%d: %d TURNs specified, but %d ran", filename, SourceLine(0), DATA.turns, DATA.trial.lastActionTurn + 1); } - while (DATA.queuedEvent < DATA.queuedEventsCount - && DATA.queuedEvents[DATA.queuedEvent].groupType == QUEUE_GROUP_NONE_OF) + while (DATA.trial.queuedEvent < DATA.queuedEventsCount + && DATA.queuedEvents[DATA.trial.queuedEvent].groupType == QUEUE_GROUP_NONE_OF) { - DATA.queuedEvent += DATA.queuedEvents[DATA.queuedEvent].groupSize; + DATA.trial.queuedEvent += DATA.queuedEvents[DATA.trial.queuedEvent].groupSize; } - if (DATA.queuedEvent != DATA.queuedEventsCount) + if (DATA.trial.queuedEvent != DATA.queuedEventsCount) { const char *filename = gTestRunnerState.test->filename; - u32 line = SourceLine(DATA.queuedEvents[DATA.queuedEvent].sourceLineOffset); - const char *macro = sEventTypeMacros[DATA.queuedEvents[DATA.queuedEvent].type]; + u32 line = SourceLine(DATA.queuedEvents[DATA.trial.queuedEvent].sourceLineOffset); + const char *macro = sEventTypeMacros[DATA.queuedEvents[DATA.trial.queuedEvent].type]; Test_ExitWithResult(TEST_RESULT_FAIL, line, ":L%s:%d: Unmatched %s", filename, line, macro); } @@ -1383,8 +1383,7 @@ static void CB2_BattleTest_NextTrial(void) PrintTestName(); gTestRunnerState.result = TEST_RESULT_PASS; DATA.recordedBattle.rngSeed = MakeRngValue(STATE->runTrial); - DATA.queuedEvent = 0; - DATA.lastActionTurn = 0; + memset(&DATA.trial, 0, sizeof(DATA.trial)); SetVariablesForRecordedBattle(&DATA.recordedBattle); SetMainCallback2(CB2_InitBattle); } @@ -1880,7 +1879,7 @@ void TestRunner_Battle_CheckBattleRecordActionType(u32 battlerId, u32 recordInde if (DATA.battleRecordTypes[battlerId][recordIndex] != RECORDED_BYTE) { - DATA.lastActionTurn = gBattleResults.battleTurnCounter; + DATA.trial.lastActionTurn = gBattleResults.battleTurnCounter; if (actionType != DATA.battleRecordTypes[battlerId][recordIndex]) { @@ -1914,7 +1913,7 @@ void TestRunner_Battle_CheckBattleRecordActionType(u32 battlerId, u32 recordInde } else { - if (DATA.lastActionTurn == gBattleResults.battleTurnCounter) + if (DATA.trial.lastActionTurn == gBattleResults.battleTurnCounter) { const char *filename = gTestRunnerState.test->filename; Test_ExitWithResult(TEST_RESULT_FAIL, SourceLine(0), ":L%s:%d: TURN %d incomplete", filename, SourceLine(0), gBattleResults.battleTurnCounter + 1); diff --git a/tools/mgba-rom-test-hydra/main.c b/tools/mgba-rom-test-hydra/main.c index d9d8417e180d..2c49b1dde8dd 100644 --- a/tools/mgba-rom-test-hydra/main.c +++ b/tools/mgba-rom-test-hydra/main.c @@ -65,8 +65,8 @@ struct Runner char failed_TestFilenameLine[MAX_SUMMARY_TESTS_TO_LIST][MAX_TEST_LIST_BUFFER_LENGTH]; char knownFailingPassed_TestNames[MAX_SUMMARY_TESTS_TO_LIST][MAX_TEST_LIST_BUFFER_LENGTH]; char knownFailingPassed_FilenameLine[MAX_SUMMARY_TESTS_TO_LIST][MAX_TEST_LIST_BUFFER_LENGTH]; - char assumeFailed_TestNames[MAX_SUMMARY_TESTS_TO_LIST * MAX_PROCESSES][MAX_TEST_LIST_BUFFER_LENGTH]; - char assumeFailed_FilenameLine[MAX_SUMMARY_TESTS_TO_LIST * MAX_PROCESSES][MAX_TEST_LIST_BUFFER_LENGTH]; + char assumeFailed_TestNames[MAX_SUMMARY_TESTS_TO_LIST][MAX_TEST_LIST_BUFFER_LENGTH]; + char assumeFailed_FilenameLine[MAX_SUMMARY_TESTS_TO_LIST][MAX_TEST_LIST_BUFFER_LENGTH]; }; static unsigned nrunners = 0;