diff --git a/README.md b/README.md index 0cb95f3810..60a1a82c7a 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,14 @@ -# pokeemerald Expansion +# pokeemerald-expansion -## What is the pokeemerald Expansion? +## What is pokeemerald-expansion? -The pokeemerald Expansion is a decomp hack base project based off pret's [pokeemerald](https://github.com/pret/pokeemerald) decompilation project. It's recommended that any new projects that plan on using it, to clone this repository instead of pret's vanilla repository, as we regurlarly incorporate pret's documentation changes. This is ***NOT*** a standalone romhack, and as such, most features will be unavailable and/or unbalanced if played as is. +pokeemerald-expansion is a decomp hack base project based off pret's [pokeemerald](https://github.com/pret/pokeemerald) decompilation project. It's recommended that any new projects that plan on using it, to clone this repository instead of pret's vanilla repository, as we regurlarly incorporate pret's documentation changes. This is ***NOT*** a standalone romhack, and as such, most features will be unavailable and/or unbalanced if played as is. + +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 v1.6.2 https://github.com/rh-hideout/pokeemerald-expansion/ +``` ## What features are included? - ***IMPORTANT*❗❗ Read through these to learn what features you can toggle**: @@ -136,14 +142,14 @@ There are some mechanics, moves and abilities that are missing and being develop ### [Documentation on features can be found here](https://github.com/rh-hideout/pokeemerald-expansion/wiki) -## If I already have a project based on regular pokeemerald, can I use the pokeemerald Expansion +## If I already have a project based on regular pokeemerald, can I use pokeemerald-expansion? Yes! Keep in mind that we keep up with pret's documentation of pokeemerald, which means that if your project a bit old, you might get merge conflicts that you need to solve manually. - 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 master`. -With this, you'll get the latest version of the Expansion, plus a couple of bugfixes that haven't been released into the next patch version :) +With this, you'll get the latest version of pokeemerald-expansion, plus a couple of bugfixes that haven't been released into the next patch version :) -## **How do I update my version of the pokeemerald Expansion?** +## **How do I update my version of pokeemerald-expansion?** - 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.6.2`. @@ -162,7 +168,7 @@ The project was originally started by DizzyEgg alongside other contributors. The project has now gotten larger and DizzyEgg is now maintaining the project as part of the ROM Hacking Hideout community. Some members of this community are taking on larger roles to help maintain the project. -## What is ROM Hacking Hideout? +## What is the ROM Hacking Hideout? A Discord-based ROM hacking community that has many members who hack using the disassembly and decompilation projects for Pokémon. Quite a few contributors to the original feature branches by DizzyEgg were members of ROM Hacking Hideout. You can call it RHH for short! diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index c449c9421e..f6d5dc8fee 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1541,6 +1541,11 @@ callnative BS_TryTrainerSlideDynamaxMsg .endm + .macro tryhealpulse failInstr:req + callnative BS_TryHealPulse + .4byte \failInstr + .endm + @ various command changed to more readable macros .macro cancelmultiturnmoves battler:req various \battler, VARIOUS_CANCEL_MULTI_TURN_MOVES @@ -1732,11 +1737,6 @@ various \battler, VARIOUS_SET_LAST_USED_ABILITY .endm - .macro tryhealpulse battler:req, failInstr:req - various \battler, VARIOUS_TRY_HEAL_PULSE - .4byte \failInstr - .endm - .macro tryquash failInstr:req various BS_ATTACKER, VARIOUS_TRY_QUASH .4byte \failInstr diff --git a/asm/macros/movement.inc b/asm/macros/movement.inc index a43dc07ac5..b0bb1f35ee 100644 --- a/asm/macros/movement.inc +++ b/asm/macros/movement.inc @@ -162,5 +162,7 @@ create_movement_action figure_8, MOVEMENT_ACTION_FIGURE_8 create_movement_action fly_up, MOVEMENT_ACTION_FLY_UP create_movement_action fly_down, MOVEMENT_ACTION_FLY_DOWN + create_movement_action emote_double_exclamation_mark, MOVEMENT_ACTION_EMOTE_DOUBLE_EXCL_MARK + create_movement_action emote_x, MOVEMENT_ACTION_EMOTE_X create_movement_action step_end, MOVEMENT_ACTION_STEP_END diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 3a1cd720c3..d13cb5f219 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -16835,6 +16835,77 @@ SyrupBombSpeedDropYellow: waitforvisualfinish end +Move_CHILLY_RECEPTION:: + loadspritegfx ANIM_TAG_CONFETTI + loadspritegfx ANIM_TAG_PINK_CLOUD + loadspritegfx ANIM_TAG_ICE_CRYSTALS + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 16, 96, ANIM_ATTACKER, 1 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 1, 0, 13, RGB_BLACK + delay 60 + waitforvisualfinish + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 1, 13, 0, RGB_BLACK + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 7 + waitforvisualfinish + createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, DOUBLE_CRY_ROAR + setalpha 12, 4 + monbg ANIM_ATTACKER + playsewithpan SE_BALL_OPEN, SOUND_PAN_TARGET + createsprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_ATTACKER, 122, 3, -14, 18, 24 + createsprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_ATTACKER, 121, 3, 14, 6, 24 + createsprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_ATTACKER, 120, 3, -12, 12, 24 + createsprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_ATTACKER, 119, 3, 14, 18, 24 + createsprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_ATTACKER, 118, 3, 0, 0, 24 + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + waitforvisualfinish + clearmonbg ANIM_ATTACKER + delay 10 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 1, 0, 3, RGB_WHITE + playsewithpan SE_M_GUST, SOUND_PAN_ATTACKER + call ChillyReceptionSnowballs + call ChillyReceptionSnowballs + call ChillyReceptionSnowballs + call ChillyReceptionSnowballs + playsewithpan SE_M_GUST2, SOUND_PAN_TARGET + waitforvisualfinish + waitsound + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 1, 3, 0, RGB_WHITE + end +ChillyReceptionSnowballs: + createsprite gPowderSnowSnowballSpriteTemplate, ANIM_ATTACKER, 40, 200, -150, 24, 0, 56, 4, 4, 0 + delay 3 + createsprite gPowderSnowSnowballSpriteTemplate, ANIM_ATTACKER, 40, 200, -100, 24, -10, 56, 4, 4, 0 + delay 3 + createsprite gPowderSnowSnowballSpriteTemplate, ANIM_ATTACKER, 40, 200, -100, 24, 10, 56, -4, 3, 0 + delay 3 + createsprite gPowderSnowSnowballSpriteTemplate, ANIM_ATTACKER, 40, 200, -200, 24, -20, 56, -4, 5, 0 + delay 3 + createsprite gPowderSnowSnowballSpriteTemplate, ANIM_ATTACKER, 40, 200, -150, 24, 15, 56, 4, 4, 0 + delay 3 + createsprite gPowderSnowSnowballSpriteTemplate, ANIM_ATTACKER, 40, 200, -200, 24, -20, 56, 4, 4, 0 + delay 3 + createsprite gPowderSnowSnowballSpriteTemplate, ANIM_ATTACKER, 40, 200, -200, 24, 20, 56, 4, 4, 0 + delay 3 + return + Move_TERA_BLAST:: Move_AXE_KICK:: Move_LAST_RESPECTS:: @@ -16862,7 +16933,6 @@ Move_RUINATION:: Move_COLLISION_COURSE:: Move_ELECTRO_DRIFT:: Move_SHED_TAIL:: -Move_CHILLY_RECEPTION:: Move_TIDY_UP:: Move_POUNCE:: Move_TRAILBLAZE:: diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 355c7ad53e..bed903cab2 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -436,6 +436,7 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectHit @ EFFECT_POPULATION_BOMB .4byte BattleScript_EffectMortalSpin @ EFFECT_MORTAL_SPIN .4byte BattleScript_EffectSaltCure @ EFFECT_SALT_CURE + .4byte BattleScript_EffectChillyReception @ EFFECT_CHILLY_RECEPTION .4byte BattleScript_EffectMatchaGotcha @ EFFECT_MATCHA_GOTCHA .4byte BattleScript_EffectSyrupBomb @ EFFECT_SYRUP_BOMB .4byte BattleScript_EffectHit @ EFFECT_IVY_CUDGEL @@ -471,6 +472,71 @@ BattleScript_SyrupBombTurnDmgEnd: BattleScript_EffectMatchaGotcha:: setmoveeffect MOVE_EFFECT_BURN goto BattleScript_EffectAbsorb + end + +BattleScript_EffectChillyReception:: + printstring STRINGID_PKMNTELLCHILLINGRECEPTIONJOKE + waitmessage B_WAIT_TIME_LONG + attackcanceler + ppreduce + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_SUN_PRIMAL, BattleScript_EffectChillyReceptionBlockedByPrimalSun + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_RAIN_PRIMAL, BattleScript_EffectChillyReceptionBlockedByPrimalRain + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_STRONG_WINDS, BattleScript_EffectChillyReceptionBlockedByStrongWinds + call BattleScript_EffectChillyReceptionPlayAnimation + setsnow + call BattleScript_MoveWeatherChangeRet + goto BattleScript_MoveSwitch +BattleScript_EffectChillyReceptionPlayAnimation: + attackstring + attackanimation + waitanimation + return +BattleScript_EffectChillyReceptionBlockedByPrimalSun: + call BattleScript_EffectChillyReceptionTrySwitchWeatherFailed + call BattleScript_ExtremelyHarshSunlightWasNotLessenedRet + goto BattleScript_MoveSwitch +BattleScript_EffectChillyReceptionBlockedByPrimalRain: + call BattleScript_EffectChillyReceptionTrySwitchWeatherFailed + call BattleScript_NoReliefFromHeavyRainRet + goto BattleScript_MoveSwitch +BattleScript_EffectChillyReceptionBlockedByStrongWinds: + call BattleScript_EffectChillyReceptionTrySwitchWeatherFailed + call BattleScript_MysteriousAirCurrentBlowsOnRet + goto BattleScript_MoveSwitch +BattleScript_EffectChillyReceptionTrySwitchWeatherFailed: + jumpifbattletype BATTLE_TYPE_ARENA, BattleScript_FailedFromAtkString + jumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_FailedFromAtkString + call BattleScript_EffectChillyReceptionPlayAnimation + return + +BattleScript_CheckPrimalWeather: + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_SUN_PRIMAL, BattleScript_ExtremelyHarshSunlightWasNotLessened + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_RAIN_PRIMAL, BattleScript_NoReliefFromHeavyRain + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_STRONG_WINDS, BattleScript_MysteriousAirCurrentBlowsOn + return + +BattleScript_MoveSwitch: + jumpifbattletype BATTLE_TYPE_ARENA, BattleScript_MoveSwitchEnd + jumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_MoveSwitchEnd + printstring STRINGID_PKMNWENTBACK + waitmessage B_WAIT_TIME_SHORT + openpartyscreen BS_ATTACKER, BattleScript_MoveSwitchEnd + switchoutabilities BS_ATTACKER + waitstate + switchhandleorder BS_ATTACKER, 2 + returntoball BS_ATTACKER + getswitchedmondata BS_ATTACKER + switchindataupdate BS_ATTACKER + hpthresholds BS_ATTACKER + trytoclearprimalweather + printstring STRINGID_EMPTYSTRING3 + waitmessage 1 + printstring STRINGID_SWITCHINMON + switchinanim BS_ATTACKER, TRUE + waitstate + switchineffects BS_ATTACKER +BattleScript_MoveSwitchEnd: + end BattleScript_EffectPledge:: attackcanceler @@ -661,14 +727,14 @@ BattleScript_EffectRevivalBlessing:: waitanimation printstring STRINGID_PKMNREVIVEDREADYTOFIGHT waitmessage B_WAIT_TIME_LONG - jumpifbyte CMP_EQUAL, gBattleCommunication, TRUE, BattleScript_EffectRevivalBlessingSendOut + jumpifbyte CMP_EQUAL, gBattleCommunication, TRUE, BattleScript_EffectRevivalBlessingSendOut goto BattleScript_MoveEnd BattleScript_EffectRevivalBlessingSendOut: - switchinanim BS_SCRIPTING, FALSE + switchinanim BS_SCRIPTING, FALSE waitstate switchineffects BS_SCRIPTING - goto BattleScript_MoveEnd + goto BattleScript_MoveEnd BattleScript_StealthRockActivates:: setstealthrock BattleScript_MoveEnd @@ -749,10 +815,10 @@ BattleScript_TeatimeLoop: jumpifabsorbaffected BS_TARGET, BattleScript_Teatimesorb jumpifmotoraffected BS_TARGET, BattleScript_Teatimemotor jumpifteainvulnerable BS_TARGET, BattleScript_Teatimevul @ in semi-invulnerable state OR held item is not a Berry - orword gHitMarker, HITMARKER_NO_ANIMATIONS | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_DISGUISE + orword gHitMarker, HITMARKER_DISABLE_ANIMATION | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_DISGUISE setbyte sBERRY_OVERRIDE, TRUE @ override the requirements for eating berries consumeberry BS_TARGET, TRUE @ consume the berry, then restore the item from changedItems - bicword gHitMarker, HITMARKER_NO_ANIMATIONS | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_DISGUISE + bicword gHitMarker, HITMARKER_DISABLE_ANIMATION | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_DISGUISE setbyte sBERRY_OVERRIDE, FALSE removeitem BS_TARGET moveendto MOVEEND_NEXT_TARGET @@ -1052,9 +1118,9 @@ BattleScript_EffectFlingConsumeBerry: savebattleritem BS_TARGET battleritemtolastuseditem BS_TARGET setbyte sBERRY_OVERRIDE, 1 @ override the requirements for eating berries - orword gHitMarker, HITMARKER_NO_ANIMATIONS + orword gHitMarker, HITMARKER_DISABLE_ANIMATION consumeberry BS_TARGET, TRUE - bicword gHitMarker, HITMARKER_NO_ANIMATIONS + bicword gHitMarker, HITMARKER_DISABLE_ANIMATION setbyte sBERRY_OVERRIDE, 0 restorebattleritem BS_TARGET BattleScript_FlingEnd: @@ -1327,9 +1393,9 @@ BattleScript_EffectStuffCheeks:: waitanimation BattleScript_StuffCheeksEatBerry: setbyte sBERRY_OVERRIDE, 1 - orword gHitMarker, HITMARKER_NO_ANIMATIONS + orword gHitMarker, HITMARKER_DISABLE_ANIMATION consumeberry BS_ATTACKER, TRUE - bicword gHitMarker, HITMARKER_NO_ANIMATIONS + bicword gHitMarker, HITMARKER_DISABLE_ANIMATION setbyte sBERRY_OVERRIDE, 0 removeitem BS_ATTACKER setstatchanger STAT_DEF, 2, FALSE @@ -1593,11 +1659,11 @@ BattleScript_MoveEffectIncinerate:: BattleScript_MoveEffectBugBite:: printstring STRINGID_BUGBITE waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_NO_ANIMATIONS + orword gHitMarker, HITMARKER_DISABLE_ANIMATION setbyte sBERRY_OVERRIDE, 1 @ override the requirements for eating berries savetarget consumeberry BS_ATTACKER, FALSE - bicword gHitMarker, HITMARKER_NO_ANIMATIONS + bicword gHitMarker, HITMARKER_DISABLE_ANIMATION setbyte sBERRY_OVERRIDE, 0 trysymbiosis restoretarget @@ -1696,22 +1762,7 @@ BattleScript_EffectPartingShotTrySpAtk: waitmessage B_WAIT_TIME_LONG BattleScript_EffectPartingShotSwitch: moveendall - jumpifbattletype BATTLE_TYPE_ARENA, BattleScript_PartingShotEnd - jumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_PartingShotEnd - openpartyscreen BS_ATTACKER, BattleScript_PartingShotEnd - switchoutabilities BS_ATTACKER - waitstate - switchhandleorder BS_ATTACKER, 2 - returntoball BS_ATTACKER - getswitchedmondata BS_ATTACKER - switchindataupdate BS_ATTACKER - hpthresholds BS_ATTACKER - trytoclearprimalweather - flushtextbox - printstring STRINGID_SWITCHINMON - switchinanim BS_ATTACKER, TRUE - waitstate - switchineffects BS_ATTACKER + goto BattleScript_MoveSwitch BattleScript_PartingShotEnd: end @@ -2712,7 +2763,7 @@ BattleScript_EffectHealPulse: jumpifstatus3 BS_TARGET, STATUS3_HEAL_BLOCK, BattleScript_MoveUsedHealBlockPrevents accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON jumpifsubstituteblocks BattleScript_ButItFailed - tryhealpulse BS_TARGET, BattleScript_AlreadyAtFullHp + tryhealpulse BattleScript_AlreadyAtFullHp attackanimation waitanimation healthbarupdate BS_TARGET @@ -3173,23 +3224,8 @@ BattleScript_EffectHitEscape: moveendfrom MOVEEND_TARGET_VISIBLE jumpifbattleend BattleScript_HitEscapeEnd jumpifbyte CMP_NOT_EQUAL gBattleOutcome 0, BattleScript_HitEscapeEnd - jumpifbattletype BATTLE_TYPE_ARENA, BattleScript_HitEscapeEnd - jumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_HitEscapeEnd jumpifemergencyexited BS_TARGET, BattleScript_HitEscapeEnd - openpartyscreen BS_ATTACKER, BattleScript_HitEscapeEnd - switchoutabilities BS_ATTACKER - waitstate - switchhandleorder BS_ATTACKER, 2 - returntoball BS_ATTACKER - getswitchedmondata BS_ATTACKER - switchindataupdate BS_ATTACKER - hpthresholds BS_ATTACKER - trytoclearprimalweather - flushtextbox - printstring STRINGID_SWITCHINMON - switchinanim BS_ATTACKER, TRUE - waitstate - switchineffects BS_ATTACKER + goto BattleScript_MoveSwitch BattleScript_HitEscapeEnd: end @@ -4971,9 +5007,7 @@ BattleScript_EffectSandstorm:: attackcanceler attackstring ppreduce - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_SUN_PRIMAL, BattleScript_ExtremelyHarshSunlightWasNotLessened - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_RAIN_PRIMAL, BattleScript_NoReliefFromHeavyRain - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_STRONG_WINDS, BattleScript_MysteriousAirCurrentBlowsOn + call BattleScript_CheckPrimalWeather setsandstorm goto BattleScript_MoveWeatherChange @@ -5162,25 +5196,25 @@ BattleScript_EffectRainDance:: attackcanceler attackstring ppreduce - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_SUN_PRIMAL, BattleScript_ExtremelyHarshSunlightWasNotLessened - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_RAIN_PRIMAL, BattleScript_NoReliefFromHeavyRain - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_STRONG_WINDS, BattleScript_MysteriousAirCurrentBlowsOn + call BattleScript_CheckPrimalWeather setrain BattleScript_MoveWeatherChange:: attackanimation waitanimation + call BattleScript_MoveWeatherChangeRet + goto BattleScript_MoveEnd + +BattleScript_MoveWeatherChangeRet:: printfromtable gMoveWeatherChangeStringIds waitmessage B_WAIT_TIME_LONG call BattleScript_ActivateWeatherAbilities - goto BattleScript_MoveEnd + return BattleScript_EffectSunnyDay:: attackcanceler attackstring ppreduce - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_SUN_PRIMAL, BattleScript_ExtremelyHarshSunlightWasNotLessened - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_RAIN_PRIMAL, BattleScript_NoReliefFromHeavyRain - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_STRONG_WINDS, BattleScript_MysteriousAirCurrentBlowsOn + call BattleScript_CheckPrimalWeather setsunny goto BattleScript_MoveWeatherChange @@ -5644,9 +5678,7 @@ BattleScript_EffectHail:: attackcanceler attackstring ppreduce - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_SUN_PRIMAL, BattleScript_ExtremelyHarshSunlightWasNotLessened - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_RAIN_PRIMAL, BattleScript_NoReliefFromHeavyRain - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_STRONG_WINDS, BattleScript_MysteriousAirCurrentBlowsOn + call BattleScript_CheckPrimalWeather sethail goto BattleScript_MoveWeatherChange @@ -10771,9 +10803,7 @@ BattleScript_BerserkGeneRet_End: BattleScript_EffectSnow:: attackcanceler attackstring - ppreduce - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_SUN_PRIMAL, BattleScript_ExtremelyHarshSunlightWasNotLessened - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_RAIN_PRIMAL, BattleScript_NoReliefFromHeavyRain - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_STRONG_WINDS, BattleScript_MysteriousAirCurrentBlowsOn + ppreduce + call BattleScript_CheckPrimalWeather setsnow goto BattleScript_MoveWeatherChange diff --git a/data/event_scripts.s b/data/event_scripts.s index a376866181..7ce6f60485 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -1005,6 +1005,13 @@ Common_EventScript_LegendaryFlewAway:: release end +EventScript_VsSeekerChargingDone:: + special VsSeekerFreezeObjectsAfterChargeComplete + waitstate + special VsSeekerResetObjectMovementAfterChargeComplete + releaseall + end + .include "data/scripts/pc_transfer.inc" .include "data/scripts/questionnaire.inc" .include "data/scripts/abnormal_weather.inc" diff --git a/data/field_effect_scripts.s b/data/field_effect_scripts.s index 49fcf798b6..43f4222596 100644 --- a/data/field_effect_scripts.s +++ b/data/field_effect_scripts.s @@ -1,3 +1,4 @@ +#include "config/item.h" .include "asm/macros.inc" .include "constants/constants.inc" @@ -72,6 +73,9 @@ gFieldEffectScriptPointers:: .4byte gFieldEffectScript_RayquazaSpotlight @ FLDEFF_RAYQUAZA_SPOTLIGHT .4byte gFieldEffectScript_DestroyDeoxysRock @ FLDEFF_DESTROY_DEOXYS_ROCK .4byte gFieldEffectScript_MoveDeoxysRock @ FLDEFF_MOVE_DEOXYS_ROCK + .4byte gFldEffScript_UseVsSeeker @ FLDEFF_USE_VS_SEEKER + .4byte gFldEffScript_XIcon @ FLDEFF_X_ICON + .4byte gFldEffScript_DoubleExclMarkIcon @ FLDEFF_DOUBLE_EXCL_MARK_ICON gFieldEffectScript_ExclamationMarkIcon1:: field_eff_callnative FldEff_ExclamationMarkIcon @@ -343,3 +347,15 @@ gFieldEffectScript_DestroyDeoxysRock:: gFieldEffectScript_MoveDeoxysRock:: field_eff_callnative FldEff_MoveDeoxysRock field_eff_end + +gFldEffScript_UseVsSeeker:: + field_eff_callnative FldEff_UseVsSeeker + field_eff_end + +gFldEffScript_XIcon:: + field_eff_callnative FldEff_XIcon + field_eff_end + +gFldEffScript_DoubleExclMarkIcon:: + field_eff_callnative FldEff_DoubleExclMarkIcon + field_eff_end diff --git a/data/scripts/debug.inc b/data/scripts/debug.inc index 231f156ea7..4c74fc1cbd 100644 --- a/data/scripts/debug.inc +++ b/data/scripts/debug.inc @@ -95,19 +95,6 @@ Debug_BoxFilledMessage:: Debug_BoxFilledMessage_Text: .string "Storage boxes filled!$" -Debug_FlagsAndVarNotSetBattleConfigMessage:: - lockall - message Debug_FlagsAndVarNotSetBattleConfigMessage_Text - waitmessage - waitbuttonpress - releaseall - end - -Debug_FlagsAndVarNotSetBattleConfigMessage_Text: - .string "Feature unavailable! Please define a\n" - .string "usable flag and a usable var in:\l" - .string "'include/config/battle.h'!$" - Debug_EventScript_Script_1:: end @@ -247,3 +234,17 @@ DebugText_BerryWeedsDisabled: .string "Unable to force weeds onto berry trees.$" .endif + +Debug_FlagsAndVarNotSetBattleConfigMessage:: + lockall + message Debug_FlagsAndVarNotSetBattleConfigMessage_Text + waitmessage + waitbuttonpress + releaseall + end + +Debug_FlagsAndVarNotSetBattleConfigMessage_Text: + .string "Feature unavailable! Please define a\n" + .string "usable flag and a usable var in:\l" + .string "'include/config/battle.h'!$" + diff --git a/data/specials.inc b/data/specials.inc index 5b01a13d01..717970767c 100644 --- a/data/specials.inc +++ b/data/specials.inc @@ -540,6 +540,8 @@ gSpecials:: def_special GetSprayId def_special GetLastUsedSprayType def_special TrySkyBattle + def_special VsSeekerResetObjectMovementAfterChargeComplete + def_special VsSeekerFreezeObjectsAfterChargeComplete def_special PlayerHasMulch def_special Bag_ChooseMulch def_special ObjectEventInteractionApplyMulch diff --git a/data/text/trainers.inc b/data/text/trainers.inc index c3e85ef504..ac3747f805 100644 --- a/data/text/trainers.inc +++ b/data/text/trainers.inc @@ -4779,3 +4779,18 @@ Route134_Text_HudsonPostBattle: .string "Our boat drifted out to sea.\p" .string "My buddy's a timid fellow, so I'm\n" .string "worried about him.$" + +VSSeeker_Text_BatteryNotChargedNeedXSteps:: + .string "The battery isn't charged enough.\p" + .string "No. of steps required to fully\n" + .string "charge the battery: {STR_VAR_1}{PAUSE_UNTIL_PRESS}$" + +VSSeeker_Text_NoTrainersWithinRange:: + .string "There are no Trainers within range\n" + .string "who can battle…\p" + .string "The VS Seeker was turned off.{PAUSE_UNTIL_PRESS}$" + +VSSeeker_Text_TrainersNotReady:: + .string "The other Trainers don't appear\n" + .string "to be ready for battle.\p" + .string "Let's wait till later.{PAUSE_UNTIL_PRESS}$" diff --git a/graphics/field_effects/pics/emote_x.png b/graphics/field_effects/pics/emote_x.png new file mode 100644 index 0000000000..6d0206e1d4 Binary files /dev/null and b/graphics/field_effects/pics/emote_x.png differ diff --git a/graphics/field_effects/pics/emotion_double_exclamation.png b/graphics/field_effects/pics/emotion_double_exclamation.png new file mode 100644 index 0000000000..1494acef86 Binary files /dev/null and b/graphics/field_effects/pics/emotion_double_exclamation.png differ diff --git a/graphics/pokemon/chansey/anim_front.png b/graphics/pokemon/chansey/anim_front.png index 2e4e2f573f..f2eec2ca77 100644 Binary files a/graphics/pokemon/chansey/anim_front.png and b/graphics/pokemon/chansey/anim_front.png differ diff --git a/graphics/pokemon/chansey/back.png b/graphics/pokemon/chansey/back.png index 87e70c9a2f..79fbeaa59e 100644 Binary files a/graphics/pokemon/chansey/back.png and b/graphics/pokemon/chansey/back.png differ diff --git a/graphics/pokemon/chansey/normal.pal b/graphics/pokemon/chansey/normal.pal index 698af3b616..0e50f85c24 100644 --- a/graphics/pokemon/chansey/normal.pal +++ b/graphics/pokemon/chansey/normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -230 123 131 -139 65 65 -255 230 230 -255 213 222 -139 65 65 -238 123 123 -246 164 156 -248 248 248 -16 16 16 -139 65 65 -246 164 180 +255 255 255 +230 222 189 172 164 115 115 106 74 -230 222 189 -0 0 0 +238 123 123 +225 96 96 +16 16 16 +139 65 65 +246 164 156 +238 123 123 +255 230 230 +255 213 222 +246 164 180 +230 123 131 +139 65 65 diff --git a/graphics/pokemon/chansey/shiny.pal b/graphics/pokemon/chansey/shiny.pal index 219c13d1d0..a919547a79 100644 --- a/graphics/pokemon/chansey/shiny.pal +++ b/graphics/pokemon/chansey/shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -152 208 160 -192 160 88 -112 88 56 -248 240 224 -248 232 200 -80 112 56 -128 176 64 -152 216 72 -248 248 248 +152 160 208 +255 255 255 +230 222 189 +172 164 115 +115 106 74 +141 215 40 +106 164 32 16 16 16 -80 112 56 -232 200 144 -168 160 112 -112 104 72 -224 216 184 -0 0 0 +88 128 64 +148 222 49 +106 164 32 +255 246 230 +255 238 205 +238 205 148 +213 172 90 +139 106 65 diff --git a/graphics/pokemon/cloyster/anim_front.png b/graphics/pokemon/cloyster/anim_front.png index bce084388f..6e1ed03508 100644 Binary files a/graphics/pokemon/cloyster/anim_front.png and b/graphics/pokemon/cloyster/anim_front.png differ diff --git a/graphics/pokemon/cloyster/back.png b/graphics/pokemon/cloyster/back.png index 8c038d83c8..965be563b1 100644 Binary files a/graphics/pokemon/cloyster/back.png and b/graphics/pokemon/cloyster/back.png differ diff --git a/graphics/pokemon/cloyster/normal.pal b/graphics/pokemon/cloyster/normal.pal index 725b268096..d9d8ed4ce8 100644 --- a/graphics/pokemon/cloyster/normal.pal +++ b/graphics/pokemon/cloyster/normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -123 82 131 213 189 238 172 123 189 +148 98 180 +123 82 131 74 32 82 -16 16 16 -197 197 197 -65 65 65 -248 248 248 -148 148 148 -98 98 98 -82 41 90 +164 123 189 131 90 164 106 65 131 -164 123 189 -120 96 176 +82 41 90 +197 197 197 +148 148 148 +98 98 98 +65 65 65 +16 16 16 +255 255 255 diff --git a/graphics/pokemon/cloyster/shiny.pal b/graphics/pokemon/cloyster/shiny.pal index da28a9df86..ad5c2b8f6a 100644 --- a/graphics/pokemon/cloyster/shiny.pal +++ b/graphics/pokemon/cloyster/shiny.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -48 96 152 -152 200 248 -104 152 208 -16 64 112 +139 197 255 +90 156 230 +98 123 213 +41 98 172 +0 57 131 +164 123 189 +131 90 164 +106 65 131 +82 41 90 +197 197 197 +148 148 148 +98 98 98 +65 65 65 16 16 16 -192 192 192 -64 64 64 -248 248 248 -144 144 144 -96 96 96 -80 40 88 -128 88 160 -104 64 128 -128 88 160 -96 120 208 +255 255 255 diff --git a/graphics/pokemon/cubone/anim_front.png b/graphics/pokemon/cubone/anim_front.png index e0f600c88c..d00e0c921b 100644 Binary files a/graphics/pokemon/cubone/anim_front.png and b/graphics/pokemon/cubone/anim_front.png differ diff --git a/graphics/pokemon/cubone/back.png b/graphics/pokemon/cubone/back.png index 0d867ae9de..cfebc2947d 100644 Binary files a/graphics/pokemon/cubone/back.png and b/graphics/pokemon/cubone/back.png differ diff --git a/graphics/pokemon/cubone/normal.pal b/graphics/pokemon/cubone/normal.pal index 8613b94a22..68797e7115 100644 --- a/graphics/pokemon/cubone/normal.pal +++ b/graphics/pokemon/cubone/normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -139 131 106 -248 248 248 -41 41 41 -197 197 213 -82 82 57 -148 106 90 +222 189 106 197 156 74 +148 106 90 82 57 16 -200 168 136 -240 208 176 -224 224 232 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +255 255 255 +230 230 238 +197 197 213 +139 131 106 +82 82 57 +255 222 180 +246 213 180 +205 172 139 +255 0 255 +255 0 255 +16 16 16 diff --git a/graphics/pokemon/cubone/shiny.pal b/graphics/pokemon/cubone/shiny.pal index 710bbdf527..dfc82f90bd 100644 --- a/graphics/pokemon/cubone/shiny.pal +++ b/graphics/pokemon/cubone/shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -152 208 160 -128 128 112 -248 248 248 -16 16 16 -200 184 184 -72 80 72 -80 104 48 -112 144 80 -32 56 8 -184 160 136 -224 208 176 -224 216 216 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +152 160 208 +156 172 106 +106 139 74 +74 98 49 +32 65 0 +255 255 255 +230 222 222 +205 189 189 +131 131 115 +74 82 74 +238 222 180 +230 213 180 +189 164 139 +255 0 255 +255 0 255 +41 41 41 diff --git a/graphics/pokemon/dewgong/anim_front.png b/graphics/pokemon/dewgong/anim_front.png index a1594dbd33..c2f3d4f775 100644 Binary files a/graphics/pokemon/dewgong/anim_front.png and b/graphics/pokemon/dewgong/anim_front.png differ diff --git a/graphics/pokemon/dewgong/back.png b/graphics/pokemon/dewgong/back.png index bcb7242e35..8b58e9fce0 100644 Binary files a/graphics/pokemon/dewgong/back.png and b/graphics/pokemon/dewgong/back.png differ diff --git a/graphics/pokemon/dewgong/normal.pal b/graphics/pokemon/dewgong/normal.pal index 15ddd52bd5..4165788517 100644 --- a/graphics/pokemon/dewgong/normal.pal +++ b/graphics/pokemon/dewgong/normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 153 210 164 +230 230 246 +213 205 238 +156 164 189 106 123 164 65 82 98 -156 164 189 -230 230 246 -16 16 16 -213 205 238 -255 255 255 +213 41 32 +156 0 0 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +213 205 205 131 123 123 -112 40 40 -232 128 120 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +16 16 16 +255 255 255 diff --git a/graphics/pokemon/dewgong/shiny.pal b/graphics/pokemon/dewgong/shiny.pal index bc86361bc5..bc6d7e3458 100644 --- a/graphics/pokemon/dewgong/shiny.pal +++ b/graphics/pokemon/dewgong/shiny.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 153 210 164 +246 246 230 +213 213 197 +180 180 164 148 148 115 98 98 74 -180 180 164 -246 246 230 -16 16 16 -213 213 197 -255 255 255 +213 41 32 +156 0 0 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +213 205 205 131 123 123 -163 32 32 -219 83 78 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +16 16 16 +255 255 255 diff --git a/graphics/pokemon/dodrio/anim_front.png b/graphics/pokemon/dodrio/anim_front.png index 5c970bf8e0..78906eb7e2 100644 Binary files a/graphics/pokemon/dodrio/anim_front.png and b/graphics/pokemon/dodrio/anim_front.png differ diff --git a/graphics/pokemon/dodrio/anim_frontf.png b/graphics/pokemon/dodrio/anim_frontf.png index c69ab602c0..04c02d0c0b 100644 Binary files a/graphics/pokemon/dodrio/anim_frontf.png and b/graphics/pokemon/dodrio/anim_frontf.png differ diff --git a/graphics/pokemon/dodrio/back.png b/graphics/pokemon/dodrio/back.png index a160615324..89e974f61c 100644 Binary files a/graphics/pokemon/dodrio/back.png and b/graphics/pokemon/dodrio/back.png differ diff --git a/graphics/pokemon/dodrio/backf.png b/graphics/pokemon/dodrio/backf.png index ad1f5bcf51..89fd4aa370 100644 Binary files a/graphics/pokemon/dodrio/backf.png and b/graphics/pokemon/dodrio/backf.png differ diff --git a/graphics/pokemon/dodrio/normal.pal b/graphics/pokemon/dodrio/normal.pal index 1569ba019d..d05aac145a 100644 --- a/graphics/pokemon/dodrio/normal.pal +++ b/graphics/pokemon/dodrio/normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -65 65 65 -16 16 16 -131 131 131 +238 197 115 +205 156 82 164 123 90 90 65 32 -205 156 82 -248 248 248 -98 90 65 238 222 172 180 164 123 -180 65 65 -246 131 164 -180 65 65 -246 131 164 +98 90 65 255 213 230 +246 131 164 +180 65 65 +213 205 205 +131 131 131 +65 65 65 +0 0 0 +255 255 255 diff --git a/graphics/pokemon/dodrio/shiny.pal b/graphics/pokemon/dodrio/shiny.pal index f6278a269b..28e67a6f71 100644 --- a/graphics/pokemon/dodrio/shiny.pal +++ b/graphics/pokemon/dodrio/shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -152 208 160 -64 64 64 -16 16 16 -128 128 128 -112 136 24 -64 88 16 -160 184 48 -248 248 248 -152 104 24 -248 240 136 -216 160 64 -176 80 80 -240 128 160 -176 80 80 -240 128 160 -248 200 224 +152 160 208 +197 222 90 +164 189 49 +115 139 16 +74 106 0 +255 246 139 +222 164 57 +164 106 0 +255 213 230 +246 131 164 +180 65 65 +213 205 205 +131 131 131 +65 65 65 +0 0 0 +255 255 255 diff --git a/graphics/pokemon/doduo/anim_front.png b/graphics/pokemon/doduo/anim_front.png index bda88f3de1..cfaffadcd7 100644 Binary files a/graphics/pokemon/doduo/anim_front.png and b/graphics/pokemon/doduo/anim_front.png differ diff --git a/graphics/pokemon/doduo/anim_frontf.png b/graphics/pokemon/doduo/anim_frontf.png index 51d0d982e9..490a771ada 100644 Binary files a/graphics/pokemon/doduo/anim_frontf.png and b/graphics/pokemon/doduo/anim_frontf.png differ diff --git a/graphics/pokemon/doduo/back.png b/graphics/pokemon/doduo/back.png index dc2b09bc9e..6bac7e57ef 100644 Binary files a/graphics/pokemon/doduo/back.png and b/graphics/pokemon/doduo/back.png differ diff --git a/graphics/pokemon/doduo/backf.png b/graphics/pokemon/doduo/backf.png index 3e0ad49e50..0a208d6300 100644 Binary files a/graphics/pokemon/doduo/backf.png and b/graphics/pokemon/doduo/backf.png differ diff --git a/graphics/pokemon/doduo/normal.pal b/graphics/pokemon/doduo/normal.pal index 594e033255..86151f0ed8 100644 --- a/graphics/pokemon/doduo/normal.pal +++ b/graphics/pokemon/doduo/normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -80 56 24 -144 104 88 -184 136 80 -216 168 112 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +222 172 115 +189 139 82 +148 106 90 +82 57 24 +238 222 172 +222 189 139 +164 131 74 +98 82 16 +98 98 98 16 16 16 -248 248 248 -96 80 16 -96 96 96 -160 128 72 -232 216 168 -216 184 136 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +255 255 255 diff --git a/graphics/pokemon/doduo/shiny.pal b/graphics/pokemon/doduo/shiny.pal index 40d0d1146b..4b19c908e2 100644 --- a/graphics/pokemon/doduo/shiny.pal +++ b/graphics/pokemon/doduo/shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -152 208 160 -80 96 16 -112 144 32 -168 192 64 -192 224 96 +152 160 208 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +197 230 98 +172 197 65 +115 148 32 +90 115 0 +238 230 172 +222 205 139 +164 156 74 +98 98 16 +98 98 98 16 16 16 -248 248 248 -96 96 16 -96 96 96 -160 152 72 -232 224 168 -216 200 136 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +255 255 255 diff --git a/graphics/pokemon/drowzee/anim_front.png b/graphics/pokemon/drowzee/anim_front.png index 3bab742240..6c4f25288b 100644 Binary files a/graphics/pokemon/drowzee/anim_front.png and b/graphics/pokemon/drowzee/anim_front.png differ diff --git a/graphics/pokemon/drowzee/back.png b/graphics/pokemon/drowzee/back.png index 3489ea9c35..91ced85866 100644 Binary files a/graphics/pokemon/drowzee/back.png and b/graphics/pokemon/drowzee/back.png differ diff --git a/graphics/pokemon/drowzee/normal.pal b/graphics/pokemon/drowzee/normal.pal index 0ea8f35c4c..3293e401fd 100644 --- a/graphics/pokemon/drowzee/normal.pal +++ b/graphics/pokemon/drowzee/normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -168 136 0 -112 88 0 -240 232 0 -80 56 32 -208 168 72 -248 232 112 0 0 0 -104 80 64 -248 248 248 -136 32 56 -232 56 56 -136 112 88 -176 152 120 -104 80 64 +82 57 32 +106 82 65 +139 115 90 +180 156 123 +115 90 0 +172 139 0 +197 164 32 +213 172 74 +246 238 0 +255 238 115 +255 255 255 +139 32 57 +238 57 57 0 0 0 diff --git a/graphics/pokemon/drowzee/shiny.pal b/graphics/pokemon/drowzee/shiny.pal index 5c3e3c9d9d..5615fd6c31 100644 --- a/graphics/pokemon/drowzee/shiny.pal +++ b/graphics/pokemon/drowzee/shiny.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -136 96 104 -104 64 72 -224 176 192 -96 32 48 -184 144 152 -248 216 232 -16 16 16 -120 72 88 -248 248 248 -136 40 64 -232 80 80 -176 88 104 -200 120 136 -144 56 80 +0 0 0 +115 16 32 +148 41 74 +180 82 98 +205 106 123 +115 74 82 +139 98 106 +164 123 131 +189 148 156 +230 180 197 +238 205 222 +255 255 255 +139 32 57 +238 57 57 0 0 0 diff --git a/graphics/pokemon/electrode/anim_front.png b/graphics/pokemon/electrode/anim_front.png index bf91ac0eb8..739501732b 100644 Binary files a/graphics/pokemon/electrode/anim_front.png and b/graphics/pokemon/electrode/anim_front.png differ diff --git a/graphics/pokemon/electrode/back.png b/graphics/pokemon/electrode/back.png index 86d20c029e..90cd9957c8 100644 Binary files a/graphics/pokemon/electrode/back.png and b/graphics/pokemon/electrode/back.png differ diff --git a/graphics/pokemon/electrode/normal.pal b/graphics/pokemon/electrode/normal.pal index 293f41bffb..3710a6a0b7 100644 --- a/graphics/pokemon/electrode/normal.pal +++ b/graphics/pokemon/electrode/normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -90 82 82 -164 156 156 +255 255 255 238 238 238 -248 248 248 205 205 222 -16 16 16 -213 49 65 -255 82 32 +164 156 156 +90 82 82 +255 0 255 +240 160 136 +208 128 144 +255 172 156 255 131 90 -131 16 16 +255 82 32 238 65 49 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +213 49 65 +131 16 16 +16 16 16 diff --git a/graphics/pokemon/electrode/shiny.pal b/graphics/pokemon/electrode/shiny.pal index cdfc50be22..4ad72a8909 100644 --- a/graphics/pokemon/electrode/shiny.pal +++ b/graphics/pokemon/electrode/shiny.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -88 80 80 -160 152 152 -232 232 232 -248 248 248 -200 200 216 -16 16 16 -56 72 208 -32 112 248 +255 255 255 +238 238 238 +205 205 222 +164 156 156 +90 82 82 +255 0 255 144 168 232 -24 48 112 -48 96 232 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +128 136 216 +156 205 255 +90 164 255 +32 115 255 +49 98 238 +57 74 213 +16 49 131 +16 16 16 diff --git a/graphics/pokemon/exeggcute/anim_front.png b/graphics/pokemon/exeggcute/anim_front.png index 429248b6eb..890f981467 100644 Binary files a/graphics/pokemon/exeggcute/anim_front.png and b/graphics/pokemon/exeggcute/anim_front.png differ diff --git a/graphics/pokemon/exeggcute/back.png b/graphics/pokemon/exeggcute/back.png index 8ae6d8f214..fa0204c49b 100644 Binary files a/graphics/pokemon/exeggcute/back.png and b/graphics/pokemon/exeggcute/back.png differ diff --git a/graphics/pokemon/exeggcute/normal.pal b/graphics/pokemon/exeggcute/normal.pal index 5b12b18d4d..632ee1137d 100644 --- a/graphics/pokemon/exeggcute/normal.pal +++ b/graphics/pokemon/exeggcute/normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -197 115 148 -139 32 32 -255 213 222 -16 16 16 +255 255 255 +222 222 222 255 238 139 205 139 8 -248 248 248 +16 16 16 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +255 0 255 255 238 238 -222 222 222 -224 176 184 -232 192 192 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +255 213 222 +230 180 189 +197 115 148 +139 32 32 diff --git a/graphics/pokemon/exeggcute/shiny.pal b/graphics/pokemon/exeggcute/shiny.pal index 967472bdca..e59673d22c 100644 --- a/graphics/pokemon/exeggcute/shiny.pal +++ b/graphics/pokemon/exeggcute/shiny.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -224 168 40 -136 96 24 -248 232 88 +255 255 255 +222 222 222 +255 205 74 +230 156 0 16 16 16 -248 200 72 -224 152 0 -248 248 248 -248 248 160 -216 216 216 -208 80 64 -240 208 64 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +255 255 189 +255 238 16 +246 205 16 +238 172 0 +180 123 0 diff --git a/graphics/pokemon/exeggutor/anim_front.png b/graphics/pokemon/exeggutor/anim_front.png index a7fa012b17..8d32dffb8d 100644 Binary files a/graphics/pokemon/exeggutor/anim_front.png and b/graphics/pokemon/exeggutor/anim_front.png differ diff --git a/graphics/pokemon/exeggutor/back.png b/graphics/pokemon/exeggutor/back.png index 8bf0106564..ea1c3fa38f 100644 Binary files a/graphics/pokemon/exeggutor/back.png and b/graphics/pokemon/exeggutor/back.png differ diff --git a/graphics/pokemon/exeggutor/normal.pal b/graphics/pokemon/exeggutor/normal.pal index 7430557a4c..64a0df017a 100644 --- a/graphics/pokemon/exeggutor/normal.pal +++ b/graphics/pokemon/exeggutor/normal.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -0 176 232 -82 98 41 -16 16 16 -115 172 49 +152 160 208 +255 255 205 +255 246 139 +230 172 90 +164 106 32 +123 82 16 +180 156 74 +139 115 65 +82 65 16 189 255 115 156 213 74 -82 65 16 -230 172 90 -255 246 139 -248 248 168 -248 248 248 -123 82 16 -164 106 32 -139 115 65 -230 172 90 -180 156 74 +115 172 49 +82 98 41 +255 255 255 +98 98 98 +16 16 16 diff --git a/graphics/pokemon/exeggutor/shiny.pal b/graphics/pokemon/exeggutor/shiny.pal index 2490dbbb59..81c3a61fea 100644 --- a/graphics/pokemon/exeggutor/shiny.pal +++ b/graphics/pokemon/exeggutor/shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -0 176 232 -136 56 24 +152 208 160 +255 238 164 +255 222 106 +230 172 90 +164 106 32 +115 65 16 +238 230 74 +205 172 0 +148 115 0 +255 189 106 +230 131 74 +197 98 57 +156 57 16 +255 255 255 +98 98 98 16 16 16 -192 104 64 -232 184 120 -224 144 96 -120 96 24 -224 168 88 -248 224 136 -248 232 160 -248 248 248 -160 104 32 -160 104 32 -200 176 40 -224 168 88 -240 232 96 diff --git a/graphics/pokemon/farfetchd/anim_front.png b/graphics/pokemon/farfetchd/anim_front.png index ac702abdd4..527e64c536 100644 Binary files a/graphics/pokemon/farfetchd/anim_front.png and b/graphics/pokemon/farfetchd/anim_front.png differ diff --git a/graphics/pokemon/farfetchd/back.png b/graphics/pokemon/farfetchd/back.png index 50978b424c..1f87dd2fcb 100644 Binary files a/graphics/pokemon/farfetchd/back.png and b/graphics/pokemon/farfetchd/back.png differ diff --git a/graphics/pokemon/farfetchd/normal.pal b/graphics/pokemon/farfetchd/normal.pal index 8e8af67119..786c6d0244 100644 --- a/graphics/pokemon/farfetchd/normal.pal +++ b/graphics/pokemon/farfetchd/normal.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -152 208 160 -132 107 33 -90 58 0 -181 148 82 +152 160 208 +255 255 255 +213 213 213 +230 230 164 +197 205 131 +255 222 106 +246 180 65 +189 115 24 +205 255 139 +65 222 65 +0 156 32 +216 184 112 +180 148 82 +131 106 32 +90 57 0 16 16 16 -0 156 33 -230 230 165 -66 222 66 -197 206 132 -214 214 214 -230 197 123 -248 248 248 -206 255 140 -255 222 107 -247 181 66 -189 115 25 diff --git a/graphics/pokemon/farfetchd/shiny.pal b/graphics/pokemon/farfetchd/shiny.pal index 631533ca3c..874a87bda2 100644 --- a/graphics/pokemon/farfetchd/shiny.pal +++ b/graphics/pokemon/farfetchd/shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -152 208 160 +152 160 208 +255 255 255 +213 213 213 +238 230 164 +197 197 123 +255 213 115 +255 180 74 +197 115 32 +230 255 148 +172 230 74 +112 152 32 +216 184 112 +230 136 120 200 104 88 104 56 48 -224 136 120 16 16 16 -128 168 32 -240 232 176 -168 224 72 -192 192 120 -208 208 208 -216 184 112 -248 248 248 -224 248 144 -248 208 112 -248 176 72 -192 120 48 diff --git a/graphics/pokemon/gastly/anim_front.png b/graphics/pokemon/gastly/anim_front.png index 6bb1447c32..e16ebb069e 100644 Binary files a/graphics/pokemon/gastly/anim_front.png and b/graphics/pokemon/gastly/anim_front.png differ diff --git a/graphics/pokemon/gastly/back.png b/graphics/pokemon/gastly/back.png index 07971e3c49..1d869be915 100644 Binary files a/graphics/pokemon/gastly/back.png and b/graphics/pokemon/gastly/back.png differ diff --git a/graphics/pokemon/gastly/normal.pal b/graphics/pokemon/gastly/normal.pal index 7541f17517..16672b45dc 100644 --- a/graphics/pokemon/gastly/normal.pal +++ b/graphics/pokemon/gastly/normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 +255 255 255 +222 222 222 +222 82 57 +180 41 16 +255 0 255 +189 148 180 +139 98 131 +115 74 106 +57 41 57 213 172 205 189 148 180 139 98 131 -57 41 57 +255 0 255 +255 0 255 16 16 16 -115 74 106 -139 98 131 -112 72 104 -255 255 255 -180 41 16 -222 82 57 -208 168 192 -216 216 216 -180 41 16 -222 82 57 diff --git a/graphics/pokemon/gastly/shiny.pal b/graphics/pokemon/gastly/shiny.pal index 5984138176..c586f2bf98 100644 --- a/graphics/pokemon/gastly/shiny.pal +++ b/graphics/pokemon/gastly/shiny.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -160 224 248 -120 192 232 -88 152 208 -96 24 120 +255 255 255 +222 222 222 +222 82 57 +180 41 16 +255 0 255 +205 164 255 +172 123 205 +123 74 156 +98 24 123 +164 230 255 +123 197 238 +90 156 213 +255 0 255 +255 0 255 16 16 16 -120 72 152 -168 120 200 -112 72 104 -248 248 248 -176 40 16 -216 80 56 -216 80 56 -216 216 216 -176 40 16 -216 80 56 diff --git a/graphics/pokemon/gengar/anim_front.png b/graphics/pokemon/gengar/anim_front.png index 4b1e614ab3..140fa8d81c 100644 Binary files a/graphics/pokemon/gengar/anim_front.png and b/graphics/pokemon/gengar/anim_front.png differ diff --git a/graphics/pokemon/gengar/back.png b/graphics/pokemon/gengar/back.png index de0fa6599e..04b627f9ac 100644 Binary files a/graphics/pokemon/gengar/back.png and b/graphics/pokemon/gengar/back.png differ diff --git a/graphics/pokemon/gengar/normal.pal b/graphics/pokemon/gengar/normal.pal index 16892bb23c..1eb1965ad6 100644 --- a/graphics/pokemon/gengar/normal.pal +++ b/graphics/pokemon/gengar/normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -90 74 156 -180 139 189 -16 16 16 -148 115 180 -74 41 74 -123 98 164 -255 90 90 -255 148 148 -189 172 189 255 246 255 -106 98 123 222 213 222 -168 16 16 -72 40 72 -0 0 0 +106 98 123 +255 194 194 +255 144 144 +248 88 88 +189 172 189 +255 0 255 +255 0 255 +120 96 160 +176 136 184 +144 112 180 +90 74 152 +74 41 74 +16 16 16 diff --git a/graphics/pokemon/gengar/shiny.pal b/graphics/pokemon/gengar/shiny.pal index 175c4681e3..8721d43483 100644 --- a/graphics/pokemon/gengar/shiny.pal +++ b/graphics/pokemon/gengar/shiny.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -88 88 120 -144 144 176 -16 16 16 -120 120 152 -56 56 96 +255 255 255 +222 222 222 +106 98 123 +255 205 205 +238 144 144 +184 106 106 +189 172 189 +255 0 255 +255 0 255 104 104 136 -184 104 104 -232 144 144 -184 168 184 -248 240 248 -104 96 120 -216 208 216 -136 56 56 -72 40 72 -0 0 0 +148 148 180 +123 123 156 +90 90 123 +57 57 98 +16 16 16 diff --git a/graphics/pokemon/grimer/anim_front.png b/graphics/pokemon/grimer/anim_front.png index a2363840e7..312a64aa5a 100644 Binary files a/graphics/pokemon/grimer/anim_front.png and b/graphics/pokemon/grimer/anim_front.png differ diff --git a/graphics/pokemon/grimer/back.png b/graphics/pokemon/grimer/back.png index 280c733fc5..030242885e 100644 Binary files a/graphics/pokemon/grimer/back.png and b/graphics/pokemon/grimer/back.png differ diff --git a/graphics/pokemon/grimer/normal.pal b/graphics/pokemon/grimer/normal.pal index b7c371b486..5d2c17fd75 100644 --- a/graphics/pokemon/grimer/normal.pal +++ b/graphics/pokemon/grimer/normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -156 106 156 -222 172 222 -98 57 123 -238 222 238 -180 139 180 -16 16 16 -123 74 131 -248 248 248 +255 255 255 +213 213 222 +172 180 189 131 139 156 65 74 90 -172 180 189 -208 208 216 -0 0 0 -0 0 0 -0 0 0 +238 222 238 +222 172 222 +180 139 180 +156 106 156 +123 74 131 +98 57 123 +255 0 255 +255 0 255 +255 0 255 +16 16 16 diff --git a/graphics/pokemon/grimer/shiny.pal b/graphics/pokemon/grimer/shiny.pal index 96ae46dcbe..c5fa29f3f9 100644 --- a/graphics/pokemon/grimer/shiny.pal +++ b/graphics/pokemon/grimer/shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -152 208 160 -128 176 96 -184 224 144 -72 120 40 -200 240 160 -152 200 128 +152 160 208 +255 255 255 +213 213 222 +172 180 189 +131 139 156 +65 74 90 +205 246 164 +189 230 148 +156 205 131 +131 180 98 +98 148 65 +74 123 41 +255 0 255 +255 0 255 +255 0 255 16 16 16 -96 144 64 -248 248 248 -128 136 152 -64 72 88 -168 176 184 -208 208 216 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/pokemon/haunter/anim_front.png b/graphics/pokemon/haunter/anim_front.png index 03156dfa4c..63415497c9 100644 Binary files a/graphics/pokemon/haunter/anim_front.png and b/graphics/pokemon/haunter/anim_front.png differ diff --git a/graphics/pokemon/haunter/back.png b/graphics/pokemon/haunter/back.png index dccfa74425..babc9f43c5 100644 Binary files a/graphics/pokemon/haunter/back.png and b/graphics/pokemon/haunter/back.png differ diff --git a/graphics/pokemon/haunter/normal.pal b/graphics/pokemon/haunter/normal.pal index 79ac421466..8458b3532d 100644 --- a/graphics/pokemon/haunter/normal.pal +++ b/graphics/pokemon/haunter/normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -128 88 136 -192 152 200 -80 64 96 +213 164 222 +197 156 205 +172 131 197 +131 90 139 +82 65 98 +255 0 255 +255 0 255 +255 0 255 +222 90 164 +180 24 98 +106 0 0 +213 213 213 +115 115 115 16 16 16 -168 128 192 -248 248 248 -112 112 112 -176 24 96 -216 88 160 -208 208 208 -104 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +255 255 255 diff --git a/graphics/pokemon/haunter/shiny.pal b/graphics/pokemon/haunter/shiny.pal index 8c2ce31bcf..b935601171 100644 --- a/graphics/pokemon/haunter/shiny.pal +++ b/graphics/pokemon/haunter/shiny.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -128 88 112 -192 136 208 -80 64 104 +213 164 230 +197 139 213 +172 106 213 +131 90 115 +82 65 106 +255 0 255 +255 0 255 +255 0 255 +90 148 255 +41 98 213 +8 49 164 +213 213 213 +115 115 115 16 16 16 -168 104 208 -248 248 248 -112 112 112 -40 96 208 -88 144 248 -208 208 208 -8 48 160 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +255 255 255 diff --git a/graphics/pokemon/hitmonchan/anim_front.png b/graphics/pokemon/hitmonchan/anim_front.png index ee3725e0ee..d615ae6a72 100644 Binary files a/graphics/pokemon/hitmonchan/anim_front.png and b/graphics/pokemon/hitmonchan/anim_front.png differ diff --git a/graphics/pokemon/hitmonchan/back.png b/graphics/pokemon/hitmonchan/back.png index 8f5bd8ded7..e30cbba5fd 100644 Binary files a/graphics/pokemon/hitmonchan/back.png and b/graphics/pokemon/hitmonchan/back.png differ diff --git a/graphics/pokemon/hitmonchan/normal.pal b/graphics/pokemon/hitmonchan/normal.pal index 2124609315..aee2892bf1 100644 --- a/graphics/pokemon/hitmonchan/normal.pal +++ b/graphics/pokemon/hitmonchan/normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -90 65 16 -205 180 123 -16 16 16 -164 139 115 -238 213 156 255 246 255 -98 74 115 +222 205 222 +197 180 197 +164 156 164 98 74 115 189 49 74 255 148 90 230 98 74 +189 49 74 139 32 0 -164 156 164 -197 180 197 -232 128 120 +238 213 156 +205 180 123 +164 139 115 +90 65 16 +16 16 16 diff --git a/graphics/pokemon/hitmonchan/shiny.pal b/graphics/pokemon/hitmonchan/shiny.pal index 87ff42e4b6..6a2f264915 100644 --- a/graphics/pokemon/hitmonchan/shiny.pal +++ b/graphics/pokemon/hitmonchan/shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -152 208 160 -88 96 24 -192 208 96 +208 152 160 +246 246 255 +213 205 222 +189 180 197 +156 156 164 +90 74 115 +189 49 74 +65 180 255 +24 131 213 +0 90 180 +0 49 148 +230 246 139 +197 213 98 +148 164 65 +106 123 8 16 16 16 -144 160 64 -224 240 136 -248 240 248 -88 72 112 -96 96 168 -32 104 176 -120 184 224 -80 152 200 -16 48 112 -144 144 152 -184 176 192 -204 77 77 diff --git a/graphics/pokemon/hitmonlee/anim_front.png b/graphics/pokemon/hitmonlee/anim_front.png index 305a858f83..0062524a88 100644 Binary files a/graphics/pokemon/hitmonlee/anim_front.png and b/graphics/pokemon/hitmonlee/anim_front.png differ diff --git a/graphics/pokemon/hitmonlee/back.png b/graphics/pokemon/hitmonlee/back.png index 303f139f59..10a59d797e 100644 Binary files a/graphics/pokemon/hitmonlee/back.png and b/graphics/pokemon/hitmonlee/back.png differ diff --git a/graphics/pokemon/hitmonlee/normal.pal b/graphics/pokemon/hitmonlee/normal.pal index ef9db09638..5543d83814 100644 --- a/graphics/pokemon/hitmonlee/normal.pal +++ b/graphics/pokemon/hitmonlee/normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -131 90 57 -164 123 115 -205 164 131 -98 57 24 238 197 164 +205 164 131 +164 123 115 +131 90 57 +98 57 24 +255 255 255 +213 205 205 115 98 98 -41 41 41 -248 248 248 -208 200 200 -90 74 41 -189 180 106 238 230 180 189 180 106 -240 224 168 -0 0 0 +90 74 41 +238 255 148 +197 205 115 +115 123 32 +41 41 41 diff --git a/graphics/pokemon/hitmonlee/shiny.pal b/graphics/pokemon/hitmonlee/shiny.pal index f50482897d..e3aa7e63a6 100644 --- a/graphics/pokemon/hitmonlee/shiny.pal +++ b/graphics/pokemon/hitmonlee/shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -152 208 160 -64 88 0 -96 120 16 -152 168 56 -32 56 8 -184 200 88 -112 96 96 -16 16 16 -248 248 248 -208 200 200 -88 56 40 -184 160 104 -232 216 176 -184 160 104 -232 216 176 -0 0 0 +152 160 208 +189 205 74 +148 172 41 +98 123 8 +65 90 0 +41 65 0 +255 255 255 +213 205 205 +115 98 98 +238 222 180 +189 164 106 +90 57 41 +230 255 148 +189 205 115 +106 123 32 +41 41 41 diff --git a/graphics/pokemon/hitmontop/anim_front.png b/graphics/pokemon/hitmontop/anim_front.png index 65ef049e10..b664f90c39 100644 Binary files a/graphics/pokemon/hitmontop/anim_front.png and b/graphics/pokemon/hitmontop/anim_front.png differ diff --git a/graphics/pokemon/hitmontop/back.png b/graphics/pokemon/hitmontop/back.png index ca3daf80bc..bf440a3bb2 100644 Binary files a/graphics/pokemon/hitmontop/back.png and b/graphics/pokemon/hitmontop/back.png differ diff --git a/graphics/pokemon/hitmontop/normal.pal b/graphics/pokemon/hitmontop/normal.pal index c8cb22d510..c600d5c24d 100644 --- a/graphics/pokemon/hitmontop/normal.pal +++ b/graphics/pokemon/hitmontop/normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -144 144 152 -96 96 104 -248 248 248 -200 200 200 -72 112 192 -96 152 216 -136 184 232 -80 88 144 -128 88 40 +255 255 255 +255 222 156 +222 189 131 +180 139 90 +131 90 41 +139 189 238 +98 156 222 +74 115 197 +82 90 148 +197 74 49 +123 32 24 +205 205 205 +148 148 156 +98 98 106 16 16 16 -216 184 128 -176 136 88 -248 216 152 -0 0 0 -0 0 0 diff --git a/graphics/pokemon/hitmontop/shiny.pal b/graphics/pokemon/hitmontop/shiny.pal index 2928758f4e..8e26aff7f2 100644 --- a/graphics/pokemon/hitmontop/shiny.pal +++ b/graphics/pokemon/hitmontop/shiny.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -144 144 152 -96 96 104 -248 248 248 -200 200 200 -144 72 160 -208 120 200 -240 152 216 -112 48 96 -112 104 80 +255 255 255 +238 238 230 +213 213 197 +172 164 156 +115 106 82 +246 156 222 +213 123 205 +164 82 180 +139 49 123 +197 74 49 +123 32 24 +205 205 205 +148 148 156 +98 98 106 16 16 16 -208 208 192 -168 160 152 -232 232 224 -144 144 152 -0 0 0 diff --git a/graphics/pokemon/hypno/anim_front.png b/graphics/pokemon/hypno/anim_front.png index d96bd7613d..73a791256a 100644 Binary files a/graphics/pokemon/hypno/anim_front.png and b/graphics/pokemon/hypno/anim_front.png differ diff --git a/graphics/pokemon/hypno/anim_frontf.png b/graphics/pokemon/hypno/anim_frontf.png index 692bb8933b..05e99f7645 100644 Binary files a/graphics/pokemon/hypno/anim_frontf.png and b/graphics/pokemon/hypno/anim_frontf.png differ diff --git a/graphics/pokemon/hypno/back.png b/graphics/pokemon/hypno/back.png index 8a7987d1ea..118eba568e 100644 Binary files a/graphics/pokemon/hypno/back.png and b/graphics/pokemon/hypno/back.png differ diff --git a/graphics/pokemon/hypno/backf.png b/graphics/pokemon/hypno/backf.png index a92c0b9917..746fdcb5da 100644 Binary files a/graphics/pokemon/hypno/backf.png and b/graphics/pokemon/hypno/backf.png differ diff --git a/graphics/pokemon/hypno/normal.pal b/graphics/pokemon/hypno/normal.pal index be159251d4..1a211d4f6d 100644 --- a/graphics/pokemon/hypno/normal.pal +++ b/graphics/pokemon/hypno/normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -136 96 48 -104 80 0 -240 216 0 0 0 0 -176 144 32 -88 64 40 -248 232 112 -216 184 64 -128 144 160 -80 88 104 -248 248 248 -152 168 184 -200 216 232 -160 128 88 +106 82 0 +180 148 32 +222 189 65 +246 222 0 +255 238 115 +90 65 41 +139 98 49 +164 131 90 +82 90 106 +131 148 164 +156 172 189 +205 222 238 +255 255 255 0 0 0 diff --git a/graphics/pokemon/hypno/shiny.pal b/graphics/pokemon/hypno/shiny.pal index ffcdb1df7a..b325ea1da4 100644 --- a/graphics/pokemon/hypno/shiny.pal +++ b/graphics/pokemon/hypno/shiny.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -136 96 48 -136 48 80 -232 144 176 -16 16 16 -168 80 112 -88 64 40 -248 176 208 -200 112 168 -160 144 128 -104 88 80 -248 248 248 -184 168 152 -232 216 200 0 0 0 +139 49 82 +172 82 115 +205 106 164 +238 148 180 +255 172 205 +90 65 41 +128 64 40 +136 72 48 +106 90 82 +164 148 131 +189 172 156 +238 222 205 +255 255 255 0 0 0 diff --git a/graphics/pokemon/jellicent/anim_front.png b/graphics/pokemon/jellicent/anim_front.png index 4e08f51dd7..894a95327b 100644 Binary files a/graphics/pokemon/jellicent/anim_front.png and b/graphics/pokemon/jellicent/anim_front.png differ diff --git a/graphics/pokemon/jellicent/anim_frontf.png b/graphics/pokemon/jellicent/anim_frontf.png index d94a329aa6..9ac8ad0320 100644 Binary files a/graphics/pokemon/jellicent/anim_frontf.png and b/graphics/pokemon/jellicent/anim_frontf.png differ diff --git a/graphics/pokemon/kingler/anim_front.png b/graphics/pokemon/kingler/anim_front.png index d60fedc190..fff0a1cb4e 100644 Binary files a/graphics/pokemon/kingler/anim_front.png and b/graphics/pokemon/kingler/anim_front.png differ diff --git a/graphics/pokemon/kingler/back.png b/graphics/pokemon/kingler/back.png index 94feeee730..65b5d137e5 100644 Binary files a/graphics/pokemon/kingler/back.png and b/graphics/pokemon/kingler/back.png differ diff --git a/graphics/pokemon/kingler/normal.pal b/graphics/pokemon/kingler/normal.pal index d05177eee1..78dcded55c 100644 --- a/graphics/pokemon/kingler/normal.pal +++ b/graphics/pokemon/kingler/normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -131 41 8 +246 197 139 255 139 82 180 90 74 -16 16 16 -246 197 139 -74 49 32 -222 172 156 -115 82 16 -90 65 49 +131 41 8 255 246 222 +222 172 156 164 106 65 -255 255 255 +115 82 16 +255 16 255 +90 65 49 +74 49 32 +255 16 255 189 189 230 -0 0 0 -0 0 0 +16 16 16 +255 255 255 diff --git a/graphics/pokemon/kingler/shiny.pal b/graphics/pokemon/kingler/shiny.pal index 5c9922a8e8..628e75ebf2 100644 --- a/graphics/pokemon/kingler/shiny.pal +++ b/graphics/pokemon/kingler/shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -152 208 160 -64 80 0 -136 152 72 -104 112 48 +152 160 208 +180 197 115 +139 156 74 +106 115 49 +74 90 0 +230 246 197 +205 213 115 +148 139 57 +106 98 8 +255 16 255 +90 65 49 +74 49 32 +255 16 255 +222 222 246 16 16 16 -176 192 112 -56 40 24 -200 208 112 -104 96 8 -88 64 56 -224 240 192 -144 136 56 -248 248 248 -184 184 224 -0 0 0 -0 0 0 +255 255 255 diff --git a/graphics/pokemon/koffing/anim_front.png b/graphics/pokemon/koffing/anim_front.png index 891ee864d6..2b70b2cf53 100644 Binary files a/graphics/pokemon/koffing/anim_front.png and b/graphics/pokemon/koffing/anim_front.png differ diff --git a/graphics/pokemon/koffing/back.png b/graphics/pokemon/koffing/back.png index 53938fdeb2..e97a5ba3e6 100644 Binary files a/graphics/pokemon/koffing/back.png and b/graphics/pokemon/koffing/back.png differ diff --git a/graphics/pokemon/koffing/normal.pal b/graphics/pokemon/koffing/normal.pal index 3bc7ed3d86..255edac9cc 100644 --- a/graphics/pokemon/koffing/normal.pal +++ b/graphics/pokemon/koffing/normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -238 213 106 +255 255 255 +222 222 222 +246 238 205 +205 205 172 +238 115 139 +180 90 123 +255 0 255 246 238 148 +238 213 106 197 180 41 -115 90 156 205 189 238 172 148 205 +115 90 156 74 41 90 16 16 16 -248 248 248 -216 216 216 -180 90 123 -238 115 139 -205 205 172 -246 238 205 -0 0 0 diff --git a/graphics/pokemon/koffing/shiny.pal b/graphics/pokemon/koffing/shiny.pal index 169eb24a04..672d7d4acd 100644 --- a/graphics/pokemon/koffing/shiny.pal +++ b/graphics/pokemon/koffing/shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -152 208 160 -176 128 176 -208 168 208 -136 88 136 -96 128 128 -176 224 232 +160 208 152 +255 255 255 +222 222 222 +246 238 148 +213 205 106 +255 98 74 +213 57 32 +255 0 255 +222 156 213 +180 123 180 +139 74 139 +180 230 238 136 176 184 +96 128 128 56 80 88 16 16 16 -248 248 248 -216 216 216 -192 80 64 -248 128 112 -208 200 104 -240 232 144 -0 0 0 diff --git a/graphics/pokemon/krabby/anim_front.png b/graphics/pokemon/krabby/anim_front.png index 69d4f372d1..afd1ef7216 100644 Binary files a/graphics/pokemon/krabby/anim_front.png and b/graphics/pokemon/krabby/anim_front.png differ diff --git a/graphics/pokemon/krabby/back.png b/graphics/pokemon/krabby/back.png index ef6d9fee57..5cfafa395f 100644 Binary files a/graphics/pokemon/krabby/back.png and b/graphics/pokemon/krabby/back.png differ diff --git a/graphics/pokemon/krabby/normal.pal b/graphics/pokemon/krabby/normal.pal index 04c1672e79..d8bf9fd9a0 100644 --- a/graphics/pokemon/krabby/normal.pal +++ b/graphics/pokemon/krabby/normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -222 57 57 -255 115 49 +255 255 255 +222 222 222 +255 0 255 +255 230 197 +205 172 139 +172 131 74 +115 82 16 +90 65 32 +255 0 255 +255 0 255 255 164 98 +255 115 49 +222 57 57 156 41 8 16 16 16 -90 65 32 -205 172 139 -115 82 16 -172 131 74 -255 230 197 -248 248 248 -222 222 222 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/pokemon/krabby/shiny.pal b/graphics/pokemon/krabby/shiny.pal index 7128e1de0f..07ac355421 100644 --- a/graphics/pokemon/krabby/shiny.pal +++ b/graphics/pokemon/krabby/shiny.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -176 152 40 -216 200 40 -248 232 112 -120 96 24 +255 255 255 +222 222 222 +255 0 255 +255 246 222 +230 205 164 +189 156 106 +131 115 65 +106 98 74 +255 0 255 +255 0 255 +255 230 32 +222 197 0 +180 156 41 +148 115 0 16 16 16 -88 64 48 -224 200 160 -128 112 64 -184 152 104 -248 240 216 -248 248 248 -216 216 216 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/pokemon/lickitung/anim_front.png b/graphics/pokemon/lickitung/anim_front.png index 1a6c1aa9cf..c8b1a27945 100644 Binary files a/graphics/pokemon/lickitung/anim_front.png and b/graphics/pokemon/lickitung/anim_front.png differ diff --git a/graphics/pokemon/lickitung/back.png b/graphics/pokemon/lickitung/back.png index ab93fb8842..b3406dc822 100644 Binary files a/graphics/pokemon/lickitung/back.png and b/graphics/pokemon/lickitung/back.png differ diff --git a/graphics/pokemon/lickitung/normal.pal b/graphics/pokemon/lickitung/normal.pal index 520baee770..2b8242a67f 100644 --- a/graphics/pokemon/lickitung/normal.pal +++ b/graphics/pokemon/lickitung/normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -176 64 80 -120 24 16 -232 112 136 -248 152 168 -248 248 248 -248 200 208 -200 192 200 -224 208 112 +255 255 255 +197 197 197 +255 255 180 +230 213 115 +131 123 32 +255 209 241 +255 189 222 +213 139 172 +156 74 98 +255 205 213 +255 156 172 +238 115 139 +180 65 82 +123 24 16 16 16 16 -152 72 96 -208 136 168 -248 184 216 -248 248 176 -128 120 32 -0 0 0 diff --git a/graphics/pokemon/lickitung/shiny.pal b/graphics/pokemon/lickitung/shiny.pal index 29ccdfb690..9af533e830 100644 --- a/graphics/pokemon/lickitung/shiny.pal +++ b/graphics/pokemon/lickitung/shiny.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -144 136 32 -96 96 16 -192 184 40 -232 232 88 -248 248 248 -248 248 168 -200 192 200 -232 216 112 +255 255 255 +222 213 222 +255 255 164 +230 213 115 +131 123 32 +255 172 164 +255 131 123 +222 98 98 +139 57 57 +255 255 156 +238 238 90 +197 189 41 +164 156 8 +123 115 0 16 16 16 -136 56 56 -208 88 88 -248 136 128 -248 248 176 -128 120 32 -0 0 0 diff --git a/graphics/pokemon/magnemite/anim_front.png b/graphics/pokemon/magnemite/anim_front.png index d240d64bca..5b60a52772 100644 Binary files a/graphics/pokemon/magnemite/anim_front.png and b/graphics/pokemon/magnemite/anim_front.png differ diff --git a/graphics/pokemon/magnemite/back.png b/graphics/pokemon/magnemite/back.png index e1b35043bb..0ddc6b9b86 100644 Binary files a/graphics/pokemon/magnemite/back.png and b/graphics/pokemon/magnemite/back.png differ diff --git a/graphics/pokemon/magnemite/normal.pal b/graphics/pokemon/magnemite/normal.pal index 50084032ff..ec9d62291b 100644 --- a/graphics/pokemon/magnemite/normal.pal +++ b/graphics/pokemon/magnemite/normal.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -152 208 160 -139 139 139 -222 255 230 +152 160 208 +255 255 255 213 213 213 +180 180 180 +139 139 139 82 74 74 -16 16 16 57 49 49 255 139 74 238 24 0 -139 180 164 -180 213 189 -90 131 98 82 205 246 41 131 172 -168 168 168 -255 255 255 +222 255 230 +180 213 189 +139 180 164 +90 131 98 +16 16 16 diff --git a/graphics/pokemon/magnemite/shiny.pal b/graphics/pokemon/magnemite/shiny.pal index 906f25a0a2..644ce56eee 100644 --- a/graphics/pokemon/magnemite/shiny.pal +++ b/graphics/pokemon/magnemite/shiny.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -136 136 136 -248 248 248 -208 208 208 -80 72 72 +255 255 255 +213 213 213 +180 180 180 +139 139 139 +82 74 74 +57 49 49 +88 88 88 +32 32 32 +88 88 88 +32 32 32 +255 255 205 +230 222 172 +197 180 148 +148 139 82 16 16 16 -56 48 48 -176 176 176 -80 72 72 -192 176 144 -224 216 168 -144 136 80 -176 176 176 -80 72 72 -176 176 176 -248 248 200 diff --git a/graphics/pokemon/magneton/anim_front.png b/graphics/pokemon/magneton/anim_front.png index 72a8aa907e..e9a57fcf72 100644 Binary files a/graphics/pokemon/magneton/anim_front.png and b/graphics/pokemon/magneton/anim_front.png differ diff --git a/graphics/pokemon/magneton/back.png b/graphics/pokemon/magneton/back.png index 7a45ee78dd..038cd4b1eb 100644 Binary files a/graphics/pokemon/magneton/back.png and b/graphics/pokemon/magneton/back.png differ diff --git a/graphics/pokemon/magneton/normal.pal b/graphics/pokemon/magneton/normal.pal index 55f2f9d992..35aff4d063 100644 --- a/graphics/pokemon/magneton/normal.pal +++ b/graphics/pokemon/magneton/normal.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -152 208 160 +152 160 208 +255 255 255 +213 213 213 +180 180 180 +139 139 139 82 74 74 57 49 49 255 139 74 -16 16 16 238 24 0 -139 139 139 82 205 246 -213 213 213 41 131 172 -208 208 208 -74 98 74 +213 246 222 180 213 189 131 156 156 -248 248 248 -168 168 168 +74 98 74 +16 16 16 diff --git a/graphics/pokemon/magneton/shiny.pal b/graphics/pokemon/magneton/shiny.pal index 36ca0b6263..644ce56eee 100644 --- a/graphics/pokemon/magneton/shiny.pal +++ b/graphics/pokemon/magneton/shiny.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -80 72 72 -56 48 48 -136 136 136 +255 255 255 +213 213 213 +180 180 180 +139 139 139 +82 74 74 +57 49 49 +88 88 88 +32 32 32 +88 88 88 +32 32 32 +255 255 205 +230 222 172 +197 180 148 +148 139 82 16 16 16 -56 48 48 -136 136 136 -136 136 136 -248 248 248 -56 48 48 -208 208 208 -128 120 64 -224 216 168 -192 176 144 -248 248 248 -176 176 176 diff --git a/graphics/pokemon/marowak/anim_front.png b/graphics/pokemon/marowak/anim_front.png index 696a9633a9..bbfaad3734 100644 Binary files a/graphics/pokemon/marowak/anim_front.png and b/graphics/pokemon/marowak/anim_front.png differ diff --git a/graphics/pokemon/marowak/back.png b/graphics/pokemon/marowak/back.png index 76acb2c823..82a9c2da99 100644 Binary files a/graphics/pokemon/marowak/back.png and b/graphics/pokemon/marowak/back.png differ diff --git a/graphics/pokemon/marowak/normal.pal b/graphics/pokemon/marowak/normal.pal index 6aa7063f20..a82b6c9a83 100644 --- a/graphics/pokemon/marowak/normal.pal +++ b/graphics/pokemon/marowak/normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -139 139 106 -248 248 248 -16 16 16 +255 255 255 +230 230 230 197 197 205 +139 139 106 82 74 57 -224 224 232 -90 65 16 -197 156 74 +16 16 16 148 106 82 -224 176 120 -176 144 136 -120 88 80 +197 156 74 +246 197 148 230 148 82 189 115 57 -246 197 148 +222 189 106 +197 156 74 +148 106 82 +90 65 16 diff --git a/graphics/pokemon/marowak/shiny.pal b/graphics/pokemon/marowak/shiny.pal index b074efb1b5..7c45006bb1 100644 --- a/graphics/pokemon/marowak/shiny.pal +++ b/graphics/pokemon/marowak/shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -152 208 160 -120 136 112 -248 248 248 +152 160 208 +255 255 255 +230 222 222 +197 189 189 +123 139 115 +65 74 74 16 16 16 -192 184 184 -64 72 72 -224 216 216 -64 96 24 -160 200 72 -104 152 72 -192 232 112 -160 200 72 -104 152 72 -216 168 104 -168 128 64 -232 208 144 +132 94 72 +189 148 66 +238 213 148 +222 164 82 +180 131 57 +197 238 115 +156 197 74 +106 156 65 +57 106 0 diff --git a/graphics/pokemon/muk/anim_front.png b/graphics/pokemon/muk/anim_front.png index 0f9c23f51b..dad71c460e 100644 Binary files a/graphics/pokemon/muk/anim_front.png and b/graphics/pokemon/muk/anim_front.png differ diff --git a/graphics/pokemon/muk/back.png b/graphics/pokemon/muk/back.png index 1a197e4695..d0fc344d68 100644 Binary files a/graphics/pokemon/muk/back.png and b/graphics/pokemon/muk/back.png differ diff --git a/graphics/pokemon/muk/normal.pal b/graphics/pokemon/muk/normal.pal index f35af64a4e..3737ca4aa4 100644 --- a/graphics/pokemon/muk/normal.pal +++ b/graphics/pokemon/muk/normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -123 74 131 +255 255 255 +213 213 222 +172 180 189 +131 139 156 +65 74 90 +238 222 238 230 189 238 197 164 205 164 123 172 +123 74 131 90 49 115 +144 96 152 +255 0 255 +255 0 255 16 16 16 -248 248 248 -172 180 189 -65 74 90 -131 139 156 -224 208 232 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/pokemon/muk/shiny.pal b/graphics/pokemon/muk/shiny.pal index 082d96af73..7a972bc544 100644 --- a/graphics/pokemon/muk/shiny.pal +++ b/graphics/pokemon/muk/shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -152 208 160 -88 136 56 -176 216 136 -144 192 120 -120 168 88 -64 112 32 +152 160 208 +255 255 255 +213 213 222 +172 180 189 +131 139 156 +65 74 90 +197 230 156 +180 222 139 +148 197 123 +123 172 90 +90 139 57 +65 115 32 +104 152 72 +255 0 255 +255 0 255 16 16 16 -248 248 248 -168 176 184 -64 72 88 -128 136 152 -208 232 176 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/pokemon/nidoking/anim_front.png b/graphics/pokemon/nidoking/anim_front.png index a085144749..22ab26b320 100644 Binary files a/graphics/pokemon/nidoking/anim_front.png and b/graphics/pokemon/nidoking/anim_front.png differ diff --git a/graphics/pokemon/nidoking/back.png b/graphics/pokemon/nidoking/back.png index 6291e963e1..08c067f7f0 100644 Binary files a/graphics/pokemon/nidoking/back.png and b/graphics/pokemon/nidoking/back.png differ diff --git a/graphics/pokemon/onix/anim_front.png b/graphics/pokemon/onix/anim_front.png index 6aab94e97f..933b71d66b 100644 Binary files a/graphics/pokemon/onix/anim_front.png and b/graphics/pokemon/onix/anim_front.png differ diff --git a/graphics/pokemon/onix/back.png b/graphics/pokemon/onix/back.png index 4a9e34afd3..c199fa228d 100644 Binary files a/graphics/pokemon/onix/back.png and b/graphics/pokemon/onix/back.png differ diff --git a/graphics/pokemon/onix/normal.pal b/graphics/pokemon/onix/normal.pal index 3391776633..c57e5be585 100644 --- a/graphics/pokemon/onix/normal.pal +++ b/graphics/pokemon/onix/normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -82 74 74 -131 123 123 +255 255 255 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +40 32 32 246 238 238 -189 180 180 -16 16 16 222 213 213 -248 248 248 -248 248 248 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +189 180 180 +131 123 123 +82 74 74 +16 16 16 diff --git a/graphics/pokemon/onix/shiny.pal b/graphics/pokemon/onix/shiny.pal index 8cad51aca7..bc6d63ea51 100644 --- a/graphics/pokemon/onix/shiny.pal +++ b/graphics/pokemon/onix/shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -152 208 160 -88 96 24 -128 136 56 -232 232 136 -160 168 80 +152 160 208 +255 255 255 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +40 32 32 +238 246 131 +205 213 98 +172 180 82 +131 148 57 +106 115 24 16 16 16 -200 200 112 -248 248 248 -240 232 232 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/pokemon/rhydon/anim_front.png b/graphics/pokemon/rhydon/anim_front.png index 758a245b58..e3af357623 100644 Binary files a/graphics/pokemon/rhydon/anim_front.png and b/graphics/pokemon/rhydon/anim_front.png differ diff --git a/graphics/pokemon/rhydon/anim_frontf.png b/graphics/pokemon/rhydon/anim_frontf.png index 31fdb1e04f..b0e58b0e1d 100644 Binary files a/graphics/pokemon/rhydon/anim_frontf.png and b/graphics/pokemon/rhydon/anim_frontf.png differ diff --git a/graphics/pokemon/rhydon/back.png b/graphics/pokemon/rhydon/back.png index 8d810fca79..394072ea20 100644 Binary files a/graphics/pokemon/rhydon/back.png and b/graphics/pokemon/rhydon/back.png differ diff --git a/graphics/pokemon/rhydon/backf.png b/graphics/pokemon/rhydon/backf.png index 4e40dc7798..7c7a065538 100644 Binary files a/graphics/pokemon/rhydon/backf.png and b/graphics/pokemon/rhydon/backf.png differ diff --git a/graphics/pokemon/rhydon/normal.pal b/graphics/pokemon/rhydon/normal.pal index 2658775bce..94daed457b 100644 --- a/graphics/pokemon/rhydon/normal.pal +++ b/graphics/pokemon/rhydon/normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -139 139 148 -82 82 90 -197 197 189 -16 16 16 -230 230 222 -248 248 248 -224 224 216 -115 90 49 -255 238 197 +255 255 255 +255 255 197 +230 213 172 180 164 115 +115 90 49 +230 82 57 164 49 16 -230 82 57 -160 48 16 -230 82 57 115 32 16 +255 0 255 +255 0 255 +222 230 230 +181 189 205 +123 131 147 +65 74 90 +16 16 16 diff --git a/graphics/pokemon/rhydon/shiny.pal b/graphics/pokemon/rhydon/shiny.pal index 4f48df440c..6ff4a62c6b 100644 --- a/graphics/pokemon/rhydon/shiny.pal +++ b/graphics/pokemon/rhydon/shiny.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -152 144 112 -96 88 64 -216 200 168 +255 255 255 +255 238 197 +230 213 172 +180 164 115 +115 90 49 +230 82 57 +164 49 16 +115 32 16 +255 0 255 +255 0 255 +255 246 213 +222 213 180 +164 156 123 +115 106 74 16 16 16 -248 240 208 -248 248 248 -224 224 216 -112 88 48 -224 208 168 -176 160 112 -160 72 48 -224 120 96 -160 72 48 -224 120 96 -112 32 16 diff --git a/graphics/pokemon/rhyhorn/anim_front.png b/graphics/pokemon/rhyhorn/anim_front.png index 589b7c2f98..94bbb6e3e4 100644 Binary files a/graphics/pokemon/rhyhorn/anim_front.png and b/graphics/pokemon/rhyhorn/anim_front.png differ diff --git a/graphics/pokemon/rhyhorn/anim_frontf.png b/graphics/pokemon/rhyhorn/anim_frontf.png index c086ed4d96..a85f23ff9e 100644 Binary files a/graphics/pokemon/rhyhorn/anim_frontf.png and b/graphics/pokemon/rhyhorn/anim_frontf.png differ diff --git a/graphics/pokemon/rhyhorn/back.png b/graphics/pokemon/rhyhorn/back.png index dfa96100e0..d32c204aa6 100644 Binary files a/graphics/pokemon/rhyhorn/back.png and b/graphics/pokemon/rhyhorn/back.png differ diff --git a/graphics/pokemon/rhyhorn/backf.png b/graphics/pokemon/rhyhorn/backf.png index c5a253b3be..c58b014f86 100644 Binary files a/graphics/pokemon/rhyhorn/backf.png and b/graphics/pokemon/rhyhorn/backf.png differ diff --git a/graphics/pokemon/rhyhorn/normal.pal b/graphics/pokemon/rhyhorn/normal.pal index 19493646a0..01b9d75955 100644 --- a/graphics/pokemon/rhyhorn/normal.pal +++ b/graphics/pokemon/rhyhorn/normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 +222 230 230 +164 189 197 139 148 156 98 98 131 -222 230 230 57 57 82 -248 248 248 -164 189 197 -16 16 16 172 57 41 -88 8 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +90 8 0 +112 112 144 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +16 16 16 +255 255 255 diff --git a/graphics/pokemon/rhyhorn/shiny.pal b/graphics/pokemon/rhyhorn/shiny.pal index e207060d75..8fb03a0257 100644 --- a/graphics/pokemon/rhyhorn/shiny.pal +++ b/graphics/pokemon/rhyhorn/shiny.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -160 96 72 -120 48 32 -240 192 160 -56 24 8 -248 248 248 -200 144 112 +246 197 164 +205 148 115 +164 98 74 +123 49 32 +74 24 0 +172 57 41 +90 8 0 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +255 0 255 16 16 16 -168 56 40 -88 8 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +255 255 255 diff --git a/graphics/pokemon/seel/anim_front.png b/graphics/pokemon/seel/anim_front.png index 9626b88941..5e1923a644 100644 Binary files a/graphics/pokemon/seel/anim_front.png and b/graphics/pokemon/seel/anim_front.png differ diff --git a/graphics/pokemon/seel/back.png b/graphics/pokemon/seel/back.png index 0521176e36..2c7f8706a3 100644 Binary files a/graphics/pokemon/seel/back.png and b/graphics/pokemon/seel/back.png differ diff --git a/graphics/pokemon/seel/normal.pal b/graphics/pokemon/seel/normal.pal index 2868415702..d4b4a1c4f0 100644 --- a/graphics/pokemon/seel/normal.pal +++ b/graphics/pokemon/seel/normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -65 82 131 -148 156 180 230 230 246 213 205 238 -16 16 16 -248 248 248 -41 172 164 -106 90 16 -180 148 65 +148 156 180 +65 82 131 246 230 189 -136 48 32 -208 112 88 -248 168 168 -200 176 128 -0 0 0 +222 197 115 +180 148 65 +106 90 16 +255 172 172 +213 115 90 +139 49 32 +255 0 255 +41 172 164 +16 16 16 +255 255 255 diff --git a/graphics/pokemon/seel/shiny.pal b/graphics/pokemon/seel/shiny.pal index 43d60b7753..5b3f96c960 100644 --- a/graphics/pokemon/seel/shiny.pal +++ b/graphics/pokemon/seel/shiny.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -128 120 112 -176 168 160 -232 232 224 -208 208 200 +238 238 230 +213 213 205 +180 172 164 +131 123 115 +246 230 189 +213 189 106 +180 148 65 +106 90 16 +255 172 172 +213 115 90 +139 49 32 +255 0 255 +163 145 128 16 16 16 -248 248 248 -248 0 248 -104 88 16 -176 144 64 -240 224 184 -136 48 32 -208 112 88 -248 168 168 -216 192 112 -0 0 0 +255 255 255 diff --git a/graphics/pokemon/shellder/anim_front.png b/graphics/pokemon/shellder/anim_front.png index ec58b85d15..110cc99bb8 100644 Binary files a/graphics/pokemon/shellder/anim_front.png and b/graphics/pokemon/shellder/anim_front.png differ diff --git a/graphics/pokemon/shellder/back.png b/graphics/pokemon/shellder/back.png index 6a402e9ea1..072f553407 100644 Binary files a/graphics/pokemon/shellder/back.png and b/graphics/pokemon/shellder/back.png differ diff --git a/graphics/pokemon/shellder/normal.pal b/graphics/pokemon/shellder/normal.pal index 462bd5ee49..519374444d 100644 --- a/graphics/pokemon/shellder/normal.pal +++ b/graphics/pokemon/shellder/normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -112 88 136 -216 216 240 -152 136 192 -192 184 232 +222 222 246 +197 189 238 +156 139 197 +115 90 139 +74 57 98 +238 172 180 +197 98 106 +123 16 49 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +131 131 148 16 16 16 -72 56 96 -128 128 144 -248 248 248 -120 16 48 -192 96 104 -232 168 176 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +255 255 255 diff --git a/graphics/pokemon/shellder/shiny.pal b/graphics/pokemon/shellder/shiny.pal index 4ec99543dd..a653db1e00 100644 --- a/graphics/pokemon/shellder/shiny.pal +++ b/graphics/pokemon/shellder/shiny.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -176 96 32 -248 216 112 -208 128 40 -248 176 48 +255 205 41 +255 164 0 +222 123 0 +197 90 0 +164 49 0 +255 123 65 +205 74 32 +123 32 16 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +106 106 106 16 16 16 -120 48 24 -128 128 144 -248 248 248 -120 32 16 -200 72 32 -248 120 64 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +255 255 255 diff --git a/graphics/pokemon/tangela/anim_front.png b/graphics/pokemon/tangela/anim_front.png index a42e81c244..b9b542e28f 100644 Binary files a/graphics/pokemon/tangela/anim_front.png and b/graphics/pokemon/tangela/anim_front.png differ diff --git a/graphics/pokemon/tangela/back.png b/graphics/pokemon/tangela/back.png index 0cec14c7da..7a491bd9fd 100644 Binary files a/graphics/pokemon/tangela/back.png and b/graphics/pokemon/tangela/back.png differ diff --git a/graphics/pokemon/tangela/normal.pal b/graphics/pokemon/tangela/normal.pal index 03893711c1..fff4b5b407 100644 --- a/graphics/pokemon/tangela/normal.pal +++ b/graphics/pokemon/tangela/normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -65 123 148 148 213 246 90 164 205 +65 123 148 32 65 82 -16 16 16 -82 82 82 -180 180 180 -248 248 248 -115 41 41 -172 41 65 255 131 131 222 74 106 -0 0 0 -0 0 0 -0 0 0 +172 41 65 +115 41 41 +255 0 255 +255 0 255 +255 0 255 +180 180 180 +82 82 82 +16 16 16 +255 255 255 diff --git a/graphics/pokemon/tangela/shiny.pal b/graphics/pokemon/tangela/shiny.pal index 66c10f1fc9..fa3d79d32a 100644 --- a/graphics/pokemon/tangela/shiny.pal +++ b/graphics/pokemon/tangela/shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -152 208 160 -72 144 72 -136 240 88 -104 192 40 -40 80 40 +152 160 208 +136 255 88 +88 200 8 +32 164 32 +16 88 16 +255 148 131 +222 90 106 +172 40 65 +115 41 41 +255 0 255 +255 0 255 +255 0 255 +180 180 180 +82 82 82 16 16 16 -80 80 80 -176 176 176 -248 248 248 -112 40 40 -168 64 80 -248 144 144 -216 80 112 -0 0 0 -0 0 0 -0 0 0 +255 255 255 diff --git a/graphics/pokemon/voltorb/anim_front.png b/graphics/pokemon/voltorb/anim_front.png index 28c443a3a3..166824d054 100644 Binary files a/graphics/pokemon/voltorb/anim_front.png and b/graphics/pokemon/voltorb/anim_front.png differ diff --git a/graphics/pokemon/voltorb/back.png b/graphics/pokemon/voltorb/back.png index 6010acc3b7..cf0cf334ea 100644 Binary files a/graphics/pokemon/voltorb/back.png and b/graphics/pokemon/voltorb/back.png differ diff --git a/graphics/pokemon/voltorb/normal.pal b/graphics/pokemon/voltorb/normal.pal index 79af1efd7f..981ab31a35 100644 --- a/graphics/pokemon/voltorb/normal.pal +++ b/graphics/pokemon/voltorb/normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -16 16 16 -131 16 16 -213 49 65 -255 82 32 -238 65 49 -255 131 90 -255 172 156 -213 49 65 +255 255 255 222 213 213 180 172 189 -248 248 248 -88 80 80 -136 128 128 -0 0 0 -0 0 0 +139 131 131 +90 82 82 +255 0 255 +255 0 255 +255 0 255 +255 172 156 +255 131 90 +255 82 32 +238 65 49 +213 49 65 +131 16 16 +16 16 16 diff --git a/graphics/pokemon/voltorb/shiny.pal b/graphics/pokemon/voltorb/shiny.pal index 6b46ff5d7e..06e1879254 100644 --- a/graphics/pokemon/voltorb/shiny.pal +++ b/graphics/pokemon/voltorb/shiny.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 +255 255 255 +222 213 213 +180 172 189 +139 131 131 +90 82 82 +255 0 255 +255 0 255 +255 0 255 +156 172 255 +90 131 255 +0 82 255 +49 65 238 +41 24 189 +0 0 115 16 16 16 -32 32 112 -56 40 184 -48 112 248 -72 88 232 -112 144 248 -168 184 248 -56 40 184 -216 208 208 -176 168 184 -248 248 248 -88 80 80 -136 128 128 -0 0 0 -0 0 0 diff --git a/graphics/pokemon/weezing/anim_front.png b/graphics/pokemon/weezing/anim_front.png index 3bc2cb26f6..bda98b3f4b 100644 Binary files a/graphics/pokemon/weezing/anim_front.png and b/graphics/pokemon/weezing/anim_front.png differ diff --git a/graphics/pokemon/weezing/back.png b/graphics/pokemon/weezing/back.png index 92fd4020bb..0a5876baf1 100644 Binary files a/graphics/pokemon/weezing/back.png and b/graphics/pokemon/weezing/back.png differ diff --git a/graphics/pokemon/weezing/normal.pal b/graphics/pokemon/weezing/normal.pal index 715cd4c89a..ded0142be1 100644 --- a/graphics/pokemon/weezing/normal.pal +++ b/graphics/pokemon/weezing/normal.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -0 176 232 -197 213 139 -246 238 148 -197 180 41 -131 90 139 -189 139 205 -98 49 123 -164 106 180 -213 164 222 -16 16 16 +152 200 208 255 255 255 189 189 189 172 164 82 -172 164 82 -156 82 98 +213 213 180 213 115 131 +156 82 98 +246 238 148 +197 213 139 +197 180 41 +213 164 222 +189 139 205 +164 106 180 +131 90 139 +98 49 123 +16 16 16 diff --git a/graphics/pokemon/weezing/shiny.pal b/graphics/pokemon/weezing/shiny.pal index 11a7a0793d..16175411c0 100644 --- a/graphics/pokemon/weezing/shiny.pal +++ b/graphics/pokemon/weezing/shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -0 176 232 -176 128 176 -208 168 208 -136 88 136 -56 104 104 -128 176 168 -24 64 64 -88 136 128 -168 216 200 +160 208 152 +255 255 255 +222 222 222 +172 156 16 +213 205 106 +222 98 32 +164 32 0 +222 156 213 +180 123 180 +139 74 139 +156 213 197 +123 180 172 +82 139 131 +49 106 106 +16 74 74 16 16 16 -248 248 248 -184 184 184 -208 200 112 -160 144 48 -160 64 48 -216 120 72 diff --git a/include/battle_setup.h b/include/battle_setup.h index 96aeb4b761..a2009eea41 100644 --- a/include/battle_setup.h +++ b/include/battle_setup.h @@ -70,5 +70,8 @@ u16 CountBattledRematchTeams(u16 trainerId); void DoStandardWildBattle_Debug(void); void BattleSetup_StartTrainerBattle_Debug(void); +s32 TrainerIdToRematchTableId(const struct RematchTrainer *table, u16 trainerId); +s32 FirstBattleTrainerIdToRematchTableId(const struct RematchTrainer *table, u16 trainerId); +u16 GetRematchTrainerIdFromTable(const struct RematchTrainer *table, u16 firstBattleTrainerId); #endif // GUARD_BATTLE_SETUP_H diff --git a/include/config.h b/include/config.h index 49559e78e8..8a6e990a5d 100644 --- a/include/config.h +++ b/include/config.h @@ -64,13 +64,15 @@ #define ITEM_EXPANSION // Generation constants used in configs to define behavior -#define GEN_3 0 -#define GEN_4 1 -#define GEN_5 2 -#define GEN_6 3 -#define GEN_7 4 -#define GEN_8 5 -#define GEN_9 6 +#define GEN_1 0 +#define GEN_2 1 +#define GEN_3 2 +#define GEN_4 3 +#define GEN_5 4 +#define GEN_6 5 +#define GEN_7 6 +#define GEN_8 7 +#define GEN_9 8 #define GEN_LATEST GEN_9 // General settings diff --git a/include/config/battle.h b/include/config/battle.h index 622054ab28..503ce9328e 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -219,6 +219,7 @@ #define B_OBEDIENCE_MECHANICS GEN_LATEST // In PLA+ (here Gen8+), obedience restrictions also apply to non-outsider Pokémon, albeit based on their level met rather than actual level #define B_USE_FROSTBITE FALSE // In PLA, Frostbite replaces Freeze. Enabling this flag does the same here. Moves can still be cherry-picked to either Freeze or Frostbite. Freeze-Dry, Secret Power & Tri Attack depend on this config. #define B_OVERWORLD_SNOW GEN_LATEST // In Gen9+, overworld Snow will summon snow instead of hail. +#define B_TOXIC_REVERSAL GEN_LATEST // In Gen5+, bad poison will change to regular poison at the end of battles. // Animation Settings #define B_NEW_SWORD_PARTICLE TRUE // If set to TRUE, it updates Swords Dance's particle. diff --git a/include/config/item.h b/include/config/item.h index 55de3fdb60..868afae1a7 100644 --- a/include/config/item.h +++ b/include/config/item.h @@ -29,4 +29,7 @@ #define VAR_LAST_REPEL_LURE_USED 0 // If this var has been assigned, last Repel/Lure used will be saved and the player will get prompted with the vanilla repel YES/NO option, unless I_REPEL_LURE_MENU is set to TRUE. #define I_REPEL_LURE_MENU TRUE // If TRUE, the player is able to choose which Repel/Lure to use once the previous one runs out. Cursor position is saved by VAR_LAST_REPEL_LURE_USED if not 0. +// Vs. Seeker +#define I_VS_SEEKER_CHARGING 0 // If this flag is assigned, the Vs Seeker will functionlity will be enabled. When the player has the Vs. Seeker, Match Call rematch functions will stop working. + #endif // GUARD_CONFIG_ITEM_H diff --git a/include/config/pokemon.h b/include/config/pokemon.h index 900c66bb40..b7496c8687 100644 --- a/include/config/pokemon.h +++ b/include/config/pokemon.h @@ -25,7 +25,7 @@ // 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. #define P_KADABRA_EVERSTONE GEN_LATEST // Since Gen 4, Kadabra can evolve even when holding an Everstone. -#define P_SHUCKLE_BERRY_JUICE TRUE // In Gen 2, Shuckle had a 1/16 chance of converting Berry that it's holding into Berry Juice. Setting this to TRUE will allow to do this with an Oran Berry, which is the spiritual succesor of the Berry item. +#define P_SHUCKLE_BERRY_JUICE GEN_LATEST // In Gen 2, Shuckle had a 1/16 chance of converting Berry that it's holding into Berry Juice. Enabling this will allow Shuckle to do this with an Oran Berry, which is the spiritual succesor of the Berry item. // Other settings #define P_CUSTOM_GENDER_DIFF_ICONS TRUE // If TRUE, will give more Pokémon custom icons for their female forms, i.e. Hippopotas and Hippowdon diff --git a/include/constants/battle.h b/include/constants/battle.h index ecc823ee8b..ddbb8b2eea 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -193,7 +193,7 @@ #define HITMARKER_WAKE_UP_CLEAR (1 << 4) // Cleared when waking up. Never set or checked. #define HITMARKER_SKIP_DMG_TRACK (1 << 5) #define HITMARKER_DESTINYBOND (1 << 6) -#define HITMARKER_NO_ANIMATIONS (1 << 7) +#define HITMARKER_NO_ANIMATIONS (1 << 7) // set from battleSceneOff. Never changed during battle #define HITMARKER_IGNORE_SUBSTITUTE (1 << 8) #define HITMARKER_NO_ATTACKSTRING (1 << 9) #define HITMARKER_ATTACKSTRING_PRINTED (1 << 10) @@ -203,6 +203,7 @@ #define HITMARKER_SYNCHRONISE_EFFECT (1 << 14) #define HITMARKER_RUN (1 << 15) #define HITMARKER_IGNORE_DISGUISE (1 << 16) +#define HITMARKER_DISABLE_ANIMATION (1 << 17) // disable animations during battle scripts, e.g. for Bug Bite // 3 free spots because of change in handling of UNDERGROUND/UNDERWATER/ON AIR #define HITMARKER_UNABLE_TO_USE_MOVE (1 << 19) #define HITMARKER_PASSIVE_DAMAGE (1 << 20) @@ -391,8 +392,9 @@ #define MOVE_EFFECT_SPIKES 76 #define MOVE_EFFECT_TRIPLE_ARROWS 77 #define MOVE_EFFECT_SYRUP_BOMB 78 +#define MOVE_EFFECT_FLORAL_HEALING 79 -#define NUM_MOVE_EFFECTS 79 +#define NUM_MOVE_EFFECTS 80 #define MOVE_EFFECT_AFFECTS_USER 0x4000 #define MOVE_EFFECT_CERTAIN 0x8000 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 1fb300347e..19118ca4e9 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -413,13 +413,14 @@ #define EFFECT_POPULATION_BOMB 407 #define EFFECT_MORTAL_SPIN 408 #define EFFECT_SALT_CURE 409 -#define EFFECT_MATCHA_GOTCHA 410 -#define EFFECT_SYRUP_BOMB 411 -#define EFFECT_IVY_CUDGEL 412 -#define EFFECT_MAX_MOVE 413 -#define EFFECT_GLAIVE_RUSH 414 -#define EFFECT_RAGING_BULL 415 +#define EFFECT_CHILLY_RECEPTION 410 +#define EFFECT_MATCHA_GOTCHA 411 +#define EFFECT_SYRUP_BOMB 412 +#define EFFECT_IVY_CUDGEL 413 +#define EFFECT_MAX_MOVE 414 +#define EFFECT_GLAIVE_RUSH 415 +#define EFFECT_RAGING_BULL 416 -#define NUM_BATTLE_MOVE_EFFECTS 416 +#define NUM_BATTLE_MOVE_EFFECTS 417 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index b98396fe57..5474e3b242 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -131,120 +131,118 @@ #define VARIOUS_SET_SIMPLE_BEAM 39 #define VARIOUS_TRY_ENTRAINMENT 40 #define VARIOUS_SET_LAST_USED_ABILITY 41 -#define VARIOUS_TRY_HEAL_PULSE 42 -#define VARIOUS_TRY_QUASH 43 -#define VARIOUS_INVERT_STAT_STAGES 44 -#define VARIOUS_TRY_ME_FIRST 45 -#define VARIOUS_JUMP_IF_BATTLE_END 46 -#define VARIOUS_TRY_ELECTRIFY 47 -#define VARIOUS_TRY_REFLECT_TYPE 48 -#define VARIOUS_TRY_SOAK 49 -#define VARIOUS_HANDLE_MEGA_EVO 50 -#define VARIOUS_TRY_LAST_RESORT 51 -#define VARIOUS_ARGUMENT_STATUS_EFFECT 52 -#define VARIOUS_TRY_HIT_SWITCH_TARGET 53 -#define VARIOUS_TRY_AUTOTOMIZE 54 -#define VARIOUS_TRY_COPYCAT 55 -#define VARIOUS_ABILITY_POPUP 56 -#define VARIOUS_DEFOG 57 -#define VARIOUS_JUMP_IF_TARGET_ALLY 58 -#define VARIOUS_TRY_SYNCHRONOISE 59 -#define VARIOUS_PSYCHO_SHIFT 60 -#define VARIOUS_CURE_STATUS 61 -#define VARIOUS_POWER_TRICK 62 -#define VARIOUS_AFTER_YOU 63 -#define VARIOUS_BESTOW 64 -#define VARIOUS_ARGUMENT_TO_MOVE_EFFECT 65 -#define VARIOUS_JUMP_IF_NOT_GROUNDED 66 -#define VARIOUS_HANDLE_TRAINER_SLIDE_MSG 67 -#define VARIOUS_TRY_TRAINER_SLIDE_MSG_FIRST_OFF 68 -#define VARIOUS_TRY_TRAINER_SLIDE_MSG_LAST_ON 69 -#define VARIOUS_SET_AURORA_VEIL 70 -#define VARIOUS_TRY_THIRD_TYPE 71 -#define VARIOUS_ACUPRESSURE 72 -#define VARIOUS_SET_POWDER 73 -#define VARIOUS_SPECTRAL_THIEF 74 -#define VARIOUS_GRAVITY_ON_AIRBORNE_MONS 75 -#define VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS 76 -#define VARIOUS_JUMP_IF_ROAR_FAILS 77 -#define VARIOUS_TRY_INSTRUCT 78 -#define VARIOUS_JUMP_IF_NOT_BERRY 79 -#define VARIOUS_TRACE_ABILITY 80 -#define VARIOUS_UPDATE_NICK 81 -#define VARIOUS_TRY_ILLUSION_OFF 82 -#define VARIOUS_SET_SPRITEIGNORE0HP 83 -#define VARIOUS_HANDLE_FORM_CHANGE 84 -#define VARIOUS_GET_STAT_VALUE 85 -#define VARIOUS_JUMP_IF_FULL_HP 86 -#define VARIOUS_LOSE_TYPE 87 -#define VARIOUS_TRY_ACTIVATE_SOULHEART 88 -#define VARIOUS_TRY_ACTIVATE_RECEIVER 89 -#define VARIOUS_TRY_ACTIVATE_BEAST_BOOST 90 -#define VARIOUS_TRY_FRISK 91 -#define VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED 92 -#define VARIOUS_TRY_FAIRY_LOCK 93 -#define VARIOUS_JUMP_IF_NO_ALLY 94 -#define VARIOUS_POISON_TYPE_IMMUNITY 95 -#define VARIOUS_JUMP_IF_NO_HOLD_EFFECT 96 -#define VARIOUS_INFATUATE_WITH_BATTLER 97 -#define VARIOUS_SET_LAST_USED_ITEM 98 -#define VARIOUS_PARALYZE_TYPE_IMMUNITY 99 -#define VARIOUS_JUMP_IF_ABSENT 100 -#define VARIOUS_DESTROY_ABILITY_POPUP 101 -#define VARIOUS_TOTEM_BOOST 102 -#define VARIOUS_TRY_ACTIVATE_GRIM_NEIGH 103 -#define VARIOUS_MOVEEND_ITEM_EFFECTS 104 -#define VARIOUS_TERRAIN_SEED 105 -#define VARIOUS_MAKE_INVISIBLE 106 -#define VARIOUS_ROOM_SERVICE 107 - -#define VARIOUS_EERIE_SPELL_PP_REDUCE 108 -#define VARIOUS_JUMP_IF_TEAM_HEALTHY 109 -#define VARIOUS_TRY_HEAL_QUARTER_HP 110 -#define VARIOUS_REMOVE_TERRAIN 111 -#define VARIOUS_JUMP_IF_PRANKSTER_BLOCKED 112 -#define VARIOUS_TRY_TO_CLEAR_PRIMAL_WEATHER 113 -#define VARIOUS_GET_ROTOTILLER_TARGETS 114 -#define VARIOUS_JUMP_IF_NOT_ROTOTILLER_AFFECTED 115 -#define VARIOUS_TRY_ACTIVATE_BATTLE_BOND 116 -#define VARIOUS_CONSUME_BERRY 117 -#define VARIOUS_JUMP_IF_CANT_REVERT_TO_PRIMAL 118 -#define VARIOUS_JUMP_IF_SPECIES 119 -#define VARIOUS_UPDATE_ABILITY_POPUP 120 -#define VARIOUS_JUMP_IF_WEATHER_AFFECTED 121 -#define VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED 122 -#define VARIOUS_SET_ATTACKER_STICKY_WEB_USER 123 -#define VARIOUS_PHOTON_GEYSER_CHECK 124 -#define VARIOUS_SHELL_SIDE_ARM_CHECK 125 -#define VARIOUS_TRY_NO_RETREAT 126 -#define VARIOUS_TRY_TAR_SHOT 127 -#define VARIOUS_CAN_TAR_SHOT_WORK 128 -#define VARIOUS_CHECK_POLTERGEIST 129 -#define VARIOUS_CUT_1_3_HP_RAISE_STATS 130 -#define VARIOUS_TRY_END_NEUTRALIZING_GAS 131 -#define VARIOUS_JUMP_IF_UNDER_200 132 -#define VARIOUS_SET_SKY_DROP 133 -#define VARIOUS_CLEAR_SKY_DROP 134 -#define VARIOUS_SKY_DROP_YAWN 135 -#define VARIOUS_JUMP_IF_HOLD_EFFECT 136 -#define VARIOUS_CURE_CERTAIN_STATUSES 137 -#define VARIOUS_TRY_RESET_NEGATIVE_STAT_STAGES 138 -#define VARIOUS_JUMP_IF_LAST_USED_ITEM_BERRY 139 -#define VARIOUS_JUMP_IF_LAST_USED_ITEM_HOLD_EFFECT 140 -#define VARIOUS_SAVE_BATTLER_ITEM 141 -#define VARIOUS_RESTORE_BATTLER_ITEM 142 -#define VARIOUS_BATTLER_ITEM_TO_LAST_USED_ITEM 143 -#define VARIOUS_SET_BEAK_BLAST 144 -#define VARIOUS_SWAP_SIDE_STATUSES 145 -#define VARIOUS_SWAP_STATS 146 -#define VARIOUS_TEATIME_INVUL 147 -#define VARIOUS_TEATIME_TARGETS 148 -#define VARIOUS_TRY_WIND_RIDER_POWER 149 -#define VARIOUS_ACTIVATE_WEATHER_CHANGE_ABILITIES 150 -#define VARIOUS_ACTIVATE_TERRAIN_CHANGE_ABILITIES 151 -#define VARIOUS_STORE_HEALING_WISH 152 -#define VARIOUS_HIT_SWITCH_TARGET_FAILED 153 -#define VARIOUS_TRY_REVIVAL_BLESSING 154 +#define VARIOUS_TRY_QUASH 42 +#define VARIOUS_INVERT_STAT_STAGES 43 +#define VARIOUS_TRY_ME_FIRST 44 +#define VARIOUS_JUMP_IF_BATTLE_END 45 +#define VARIOUS_TRY_ELECTRIFY 46 +#define VARIOUS_TRY_REFLECT_TYPE 47 +#define VARIOUS_TRY_SOAK 48 +#define VARIOUS_HANDLE_MEGA_EVO 49 +#define VARIOUS_TRY_LAST_RESORT 50 +#define VARIOUS_ARGUMENT_STATUS_EFFECT 51 +#define VARIOUS_TRY_HIT_SWITCH_TARGET 52 +#define VARIOUS_TRY_AUTOTOMIZE 53 +#define VARIOUS_TRY_COPYCAT 54 +#define VARIOUS_ABILITY_POPUP 55 +#define VARIOUS_DEFOG 56 +#define VARIOUS_JUMP_IF_TARGET_ALLY 57 +#define VARIOUS_TRY_SYNCHRONOISE 58 +#define VARIOUS_PSYCHO_SHIFT 59 +#define VARIOUS_CURE_STATUS 60 +#define VARIOUS_POWER_TRICK 61 +#define VARIOUS_AFTER_YOU 62 +#define VARIOUS_BESTOW 63 +#define VARIOUS_ARGUMENT_TO_MOVE_EFFECT 64 +#define VARIOUS_JUMP_IF_NOT_GROUNDED 65 +#define VARIOUS_HANDLE_TRAINER_SLIDE_MSG 66 +#define VARIOUS_TRY_TRAINER_SLIDE_MSG_FIRST_OFF 67 +#define VARIOUS_TRY_TRAINER_SLIDE_MSG_LAST_ON 68 +#define VARIOUS_SET_AURORA_VEIL 69 +#define VARIOUS_TRY_THIRD_TYPE 70 +#define VARIOUS_ACUPRESSURE 71 +#define VARIOUS_SET_POWDER 72 +#define VARIOUS_SPECTRAL_THIEF 73 +#define VARIOUS_GRAVITY_ON_AIRBORNE_MONS 74 +#define VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS 75 +#define VARIOUS_JUMP_IF_ROAR_FAILS 76 +#define VARIOUS_TRY_INSTRUCT 77 +#define VARIOUS_JUMP_IF_NOT_BERRY 78 +#define VARIOUS_TRACE_ABILITY 79 +#define VARIOUS_UPDATE_NICK 80 +#define VARIOUS_TRY_ILLUSION_OFF 81 +#define VARIOUS_SET_SPRITEIGNORE0HP 82 +#define VARIOUS_HANDLE_FORM_CHANGE 83 +#define VARIOUS_GET_STAT_VALUE 84 +#define VARIOUS_JUMP_IF_FULL_HP 85 +#define VARIOUS_LOSE_TYPE 86 +#define VARIOUS_TRY_ACTIVATE_SOULHEART 87 +#define VARIOUS_TRY_ACTIVATE_RECEIVER 88 +#define VARIOUS_TRY_ACTIVATE_BEAST_BOOST 89 +#define VARIOUS_TRY_FRISK 90 +#define VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED 91 +#define VARIOUS_TRY_FAIRY_LOCK 92 +#define VARIOUS_JUMP_IF_NO_ALLY 93 +#define VARIOUS_POISON_TYPE_IMMUNITY 94 +#define VARIOUS_JUMP_IF_NO_HOLD_EFFECT 95 +#define VARIOUS_INFATUATE_WITH_BATTLER 96 +#define VARIOUS_SET_LAST_USED_ITEM 97 +#define VARIOUS_PARALYZE_TYPE_IMMUNITY 98 +#define VARIOUS_JUMP_IF_ABSENT 99 +#define VARIOUS_DESTROY_ABILITY_POPUP 100 +#define VARIOUS_TOTEM_BOOST 101 +#define VARIOUS_TRY_ACTIVATE_GRIM_NEIGH 102 +#define VARIOUS_MOVEEND_ITEM_EFFECTS 103 +#define VARIOUS_TERRAIN_SEED 104 +#define VARIOUS_MAKE_INVISIBLE 105 +#define VARIOUS_ROOM_SERVICE 106 +#define VARIOUS_EERIE_SPELL_PP_REDUCE 107 +#define VARIOUS_JUMP_IF_TEAM_HEALTHY 108 +#define VARIOUS_TRY_HEAL_QUARTER_HP 109 +#define VARIOUS_REMOVE_TERRAIN 110 +#define VARIOUS_JUMP_IF_PRANKSTER_BLOCKED 111 +#define VARIOUS_TRY_TO_CLEAR_PRIMAL_WEATHER 112 +#define VARIOUS_GET_ROTOTILLER_TARGETS 113 +#define VARIOUS_JUMP_IF_NOT_ROTOTILLER_AFFECTED 114 +#define VARIOUS_TRY_ACTIVATE_BATTLE_BOND 115 +#define VARIOUS_CONSUME_BERRY 116 +#define VARIOUS_JUMP_IF_CANT_REVERT_TO_PRIMAL 117 +#define VARIOUS_JUMP_IF_SPECIES 118 +#define VARIOUS_UPDATE_ABILITY_POPUP 119 +#define VARIOUS_JUMP_IF_WEATHER_AFFECTED 120 +#define VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED 121 +#define VARIOUS_SET_ATTACKER_STICKY_WEB_USER 122 +#define VARIOUS_PHOTON_GEYSER_CHECK 123 +#define VARIOUS_SHELL_SIDE_ARM_CHECK 124 +#define VARIOUS_TRY_NO_RETREAT 125 +#define VARIOUS_TRY_TAR_SHOT 126 +#define VARIOUS_CAN_TAR_SHOT_WORK 127 +#define VARIOUS_CHECK_POLTERGEIST 128 +#define VARIOUS_CUT_1_3_HP_RAISE_STATS 129 +#define VARIOUS_TRY_END_NEUTRALIZING_GAS 130 +#define VARIOUS_JUMP_IF_UNDER_200 131 +#define VARIOUS_SET_SKY_DROP 132 +#define VARIOUS_CLEAR_SKY_DROP 133 +#define VARIOUS_SKY_DROP_YAWN 134 +#define VARIOUS_JUMP_IF_HOLD_EFFECT 135 +#define VARIOUS_CURE_CERTAIN_STATUSES 136 +#define VARIOUS_TRY_RESET_NEGATIVE_STAT_STAGES 137 +#define VARIOUS_JUMP_IF_LAST_USED_ITEM_BERRY 138 +#define VARIOUS_JUMP_IF_LAST_USED_ITEM_HOLD_EFFECT 139 +#define VARIOUS_SAVE_BATTLER_ITEM 140 +#define VARIOUS_RESTORE_BATTLER_ITEM 141 +#define VARIOUS_BATTLER_ITEM_TO_LAST_USED_ITEM 142 +#define VARIOUS_SET_BEAK_BLAST 143 +#define VARIOUS_SWAP_SIDE_STATUSES 144 +#define VARIOUS_SWAP_STATS 145 +#define VARIOUS_TEATIME_INVUL 146 +#define VARIOUS_TEATIME_TARGETS 147 +#define VARIOUS_TRY_WIND_RIDER_POWER 148 +#define VARIOUS_ACTIVATE_WEATHER_CHANGE_ABILITIES 149 +#define VARIOUS_ACTIVATE_TERRAIN_CHANGE_ABILITIES 150 +#define VARIOUS_STORE_HEALING_WISH 151 +#define VARIOUS_HIT_SWITCH_TARGET_FAILED 152 +#define VARIOUS_TRY_REVIVAL_BLESSING 153 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 354b3d20b5..6263f87a38 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -695,8 +695,9 @@ #define STRINGID_THESEAOFFIREDISAPPEARED 693 #define STRINGID_SWAMPENVELOPEDSIDE 694 #define STRINGID_THESWAMPDISAPPEARED 695 +#define STRINGID_PKMNTELLCHILLINGRECEPTIONJOKE 696 -#define BATTLESTRINGS_COUNT 696 +#define BATTLESTRINGS_COUNT 697 // 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/event_object_movement.h b/include/constants/event_object_movement.h index af5af53403..cd971efddf 100755 --- a/include/constants/event_object_movement.h +++ b/include/constants/event_object_movement.h @@ -242,6 +242,8 @@ #define MOVEMENT_ACTION_FIGURE_8 0x9B #define MOVEMENT_ACTION_FLY_UP 0x9C #define MOVEMENT_ACTION_FLY_DOWN 0x9D +#define MOVEMENT_ACTION_EMOTE_X 0x9E +#define MOVEMENT_ACTION_EMOTE_DOUBLE_EXCL_MARK 0x9F #define MOVEMENT_ACTION_STEP_END 0xFE #define MOVEMENT_ACTION_NONE 0xFF @@ -300,6 +302,7 @@ #define ANIM_GET_ON_OFF_POKEMON_EAST (ANIM_STD_COUNT + 3) #define ANIM_NURSE_BOW (ANIM_STD_COUNT + 0) +#define ANIM_RAISE_HAND (ANIM_STD_COUNT + 0) #define ANIM_FIELD_MOVE 0 diff --git a/include/constants/field_effects.h b/include/constants/field_effects.h index a620409479..f8efeb9b81 100644 --- a/include/constants/field_effects.h +++ b/include/constants/field_effects.h @@ -68,6 +68,9 @@ #define FLDEFF_RAYQUAZA_SPOTLIGHT 64 #define FLDEFF_DESTROY_DEOXYS_ROCK 65 #define FLDEFF_MOVE_DEOXYS_ROCK 66 +#define FLDEFF_USE_VS_SEEKER 67 +#define FLDEFF_X_ICON 68 +#define FLDEFF_DOUBLE_EXCL_MARK_ICON 69 #define FLDEFFOBJ_SHADOW_S 0 #define FLDEFFOBJ_SHADOW_M 1 diff --git a/include/event_object_movement.h b/include/event_object_movement.h index 01269cdb5e..b48522ebc8 100644 --- a/include/event_object_movement.h +++ b/include/event_object_movement.h @@ -440,4 +440,7 @@ bool32 IsVirtualObjectInvisible(u8 virtualObjId); void SetVirtualObjectSpriteAnim(u8 virtualObjId, u8 animNum); bool32 IsVirtualObjectAnimating(u8 virtualObjId); +bool8 MovementAction_EmoteX_Step0(struct ObjectEvent *, struct Sprite *); +bool8 MovementAction_EmoteDoubleExclamationMark_Step0(struct ObjectEvent *, struct Sprite *); + #endif //GUARD_EVENT_OBJECT_MOVEMENT_H diff --git a/include/event_scripts.h b/include/event_scripts.h index 4e0a88f82a..00b06165cf 100644 --- a/include/event_scripts.h +++ b/include/event_scripts.h @@ -612,4 +612,9 @@ extern const u8 EventScript_TradeCenter_Chair0[]; extern const u8 EventScript_ConfirmLeaveCableClubRoom[]; extern const u8 EventScript_TerminateLink[]; +extern const u8 VSSeeker_Text_BatteryNotChargedNeedXSteps[]; +extern const u8 VSSeeker_Text_NoTrainersWithinRange[]; +extern const u8 VSSeeker_Text_TrainersNotReady[]; +extern const u8 EventScript_VsSeekerChargingDone[]; + #endif // GUARD_EVENT_SCRIPTS_H diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h index 7461929c3a..b5bf29ca88 100644 --- a/include/global.fieldmap.h +++ b/include/global.fieldmap.h @@ -254,6 +254,7 @@ enum { PLAYER_AVATAR_STATE_FIELD_MOVE, PLAYER_AVATAR_STATE_FISHING, PLAYER_AVATAR_STATE_WATERING, + PLAYER_AVATAR_STATE_VSSEEKER, }; #define PLAYER_AVATAR_FLAG_ON_FOOT (1 << 0) diff --git a/include/item_use.h b/include/item_use.h index 22833f299d..e9a2bad349 100644 --- a/include/item_use.h +++ b/include/item_use.h @@ -41,6 +41,8 @@ void ItemUseInBattle_PartyMenuChooseMove(u8 taskId); void Task_UseDigEscapeRopeOnField(u8 taskId); u8 CanUseDigOrEscapeRopeOnCurMap(void); u8 CheckIfItemIsTMHMOrEvolutionStone(u16 itemId); +void FieldUseFunc_VsSeeker(u8 taskId); +void Task_ItemUse_CloseMessageBoxAndReturnToField_VsSeeker(u8 taskId); void DisplayDadsAdviceCannotUseItemMessage(u8 taskId, bool8 isUsingRegisteredKeyItemOnField); enum { diff --git a/include/random.h b/include/random.h index 8d801ebe74..d4dd359b38 100644 --- a/include/random.h +++ b/include/random.h @@ -97,6 +97,7 @@ enum RandomTag RNG_TRIPLE_ARROWS_DEFENSE_DOWN, RNG_TRIPLE_ARROWS_FLINCH, RNG_QUICK_DRAW, + RNG_TRACE, }; #define RandomWeighted(tag, ...) \ diff --git a/include/trainer_see.h b/include/trainer_see.h index ab808c720c..5518a91761 100644 --- a/include/trainer_see.h +++ b/include/trainer_see.h @@ -26,5 +26,7 @@ u8 FldEff_HeartIcon(void); u8 GetCurrentApproachingTrainerObjectEventId(void); u8 GetChosenApproachingTrainerObjectEventId(u8 arrayId); void PlayerFaceTrainerAfterBattle(void); +u8 FldEff_DoubleExclMarkIcon(void); +u8 FldEff_XIcon(void); #endif // GUARD_TRAINER_SEE_H diff --git a/include/vs_seeker.h b/include/vs_seeker.h new file mode 100644 index 0000000000..723e73bf37 --- /dev/null +++ b/include/vs_seeker.h @@ -0,0 +1,14 @@ +#ifndef GUARD_VS_SEEKER_H +#define GUARD_VS_SEEKER_H + +#include "global.h" + +void Task_InitVsSeekerAndCheckForTrainersOnScreen(u8 taskId); +bool8 UpdateVsSeekerStepCounter(void); +void MapResetTrainerRematches(u16 mapGroup, u16 mapNum); +void ClearRematchMovementByTrainerId(void); +u16 GetRematchTrainerIdVSSeeker(u16 trainerId); + +#define VSSEEKER_RECHARGE_STEPS 100 + +#endif //GUARD_VS_SEEKER_H diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 4a35e824c0..f4ea291767 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -28,6 +28,7 @@ static bool8 ShouldUseItem(u32 battler); static bool32 AiExpectsToFaintPlayer(u32 battler); static bool32 AI_ShouldHeal(u32 battler, u32 healAmount); static bool32 AI_OpponentCanFaintAiWithMod(u32 battler, u32 healAmount); +static u32 GetSwitchinHazardsDamage(u32 battler, struct BattlePokemon *battleMon); static void InitializeSwitchinCandidate(struct Pokemon *mon) { @@ -774,6 +775,153 @@ static bool8 FindMonWithFlagsAndSuperEffective(u32 battler, u16 flags, u8 modulo return FALSE; } +static bool32 CanMonSurviveHazardSwitchin(u32 battler) +{ + u32 battlerIn1, battlerIn2; + u32 hazardDamage = 0, battlerHp = gBattleMons[battler].hp; + u32 ability = GetBattlerAbility(battler), aiMove; + s32 firstId, lastId, i, j; + struct Pokemon *party; + + if (ability == ABILITY_REGENERATOR) + battlerHp = (battlerHp * 133) / 100; // Account for Regenerator healing + + hazardDamage = GetSwitchinHazardsDamage(battler, &gBattleMons[battler]); + + // Battler will faint to hazards, check to see if another mon can clear them + if (hazardDamage > battlerHp) + { + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + { + battlerIn1 = battler; + if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))]) + battlerIn2 = battler; + else + battlerIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))); + } + else + { + battlerIn1 = battler; + battlerIn2 = battler; + } + + GetAIPartyIndexes(battler, &firstId, &lastId); + party = GetBattlerParty(battler); + + for (i = firstId; i < lastId; i++) + { + if (!IsValidForBattle(&party[i])) + continue; + if (i == gBattlerPartyIndexes[battlerIn1]) + continue; + if (i == gBattlerPartyIndexes[battlerIn2]) + continue; + if (i == *(gBattleStruct->monToSwitchIntoId + battlerIn1)) + continue; + if (i == *(gBattleStruct->monToSwitchIntoId + battlerIn2)) + continue; + if (IsAceMon(battler, i)) + continue; + + for (j = 0; j < MAX_MON_MOVES; j++) + { + aiMove = GetMonData(&party[i], MON_DATA_MOVE1 + j, NULL); + if (aiMove == MOVE_RAPID_SPIN || aiMove == MOVE_DEFOG || aiMove == MOVE_MORTAL_SPIN || aiMove == MOVE_TIDY_UP) + { + // Have a mon that can clear the hazards, so switching out is okay + return TRUE; + } + } + } + // Faints to hazards and party can't clear them, don't switch out + return FALSE; + } + return TRUE; +} + +static bool32 ShouldSwitchIfEncored(u32 battler) +{ + // Only use this if AI_FLAG_SMART_SWITCHING is set for the trainer + if (!(AI_THINKING_STRUCT->aiFlags & AI_FLAG_SMART_SWITCHING)) + return FALSE; + + // If not Encored or if no good switchin, don't switch + if (gDisableStructs[battler].encoredMove == MOVE_NONE || AI_DATA->mostSuitableMonId == PARTY_SIZE) + return FALSE; + + // Otherwise 50% chance to switch out + if (Random() & 1) + { + *(gBattleStruct->AI_monToSwitchIntoId + battler) = PARTY_SIZE; + BtlController_EmitTwoReturnValues(battler, 1, B_ACTION_SWITCH, 0); + return TRUE; + } + + return FALSE; +} + +// AI should switch if it's become setup fodder and has something better to switch to +static bool8 AreAttackingStatsLowered(u32 battler) +{ + s8 attackingStage = gBattleMons[battler].statStages[STAT_ATK]; + s8 spAttackingStage = gBattleMons[battler].statStages[STAT_SPATK]; + + // Only use this if AI_FLAG_SMART_SWITCHING is set for the trainer + if (!(AI_THINKING_STRUCT->aiFlags & AI_FLAG_SMART_SWITCHING)) + return FALSE; + + // Physical attacker + if (gBattleMons[battler].attack > gBattleMons[battler].spAttack) + { + // Don't switch if attack isn't below -1 + if (attackingStage > DEFAULT_STAT_STAGE - 2) + return FALSE; + // 50% chance if attack at -2 and have a good candidate mon + else if (attackingStage == DEFAULT_STAT_STAGE - 2) + { + if (AI_DATA->mostSuitableMonId != PARTY_SIZE && (Random() & 1)) + { + *(gBattleStruct->AI_monToSwitchIntoId + battler) = PARTY_SIZE; + BtlController_EmitTwoReturnValues(battler, 1, B_ACTION_SWITCH, 0); + return TRUE; + } + } + // If at -3 or worse, switch out regardless + else if (attackingStage < DEFAULT_STAT_STAGE - 2) + { + *(gBattleStruct->AI_monToSwitchIntoId + battler) = PARTY_SIZE; + BtlController_EmitTwoReturnValues(battler, 1, B_ACTION_SWITCH, 0); + return TRUE; + } + } + + // Special attacker + else + { + // Don't switch if attack isn't below -1 + if (spAttackingStage > DEFAULT_STAT_STAGE - 2) + return FALSE; + // 50% chance if attack at -2 and have a good candidate mon + else if (spAttackingStage == DEFAULT_STAT_STAGE - 2) + { + if (AI_DATA->mostSuitableMonId != PARTY_SIZE && (Random() & 1)) + { + *(gBattleStruct->AI_monToSwitchIntoId + battler) = PARTY_SIZE; + BtlController_EmitTwoReturnValues(battler, 1, B_ACTION_SWITCH, 0); + return TRUE; + } + } + // If at -3 or worse, switch out regardless + else if (spAttackingStage < DEFAULT_STAT_STAGE - 2) + { + *(gBattleStruct->AI_monToSwitchIntoId + battler) = PARTY_SIZE; + BtlController_EmitTwoReturnValues(battler, 1, B_ACTION_SWITCH, 0); + return TRUE; + } + } + return FALSE; +} + bool32 ShouldSwitch(u32 battler) { u8 battlerIn1, battlerIn2; @@ -857,12 +1005,18 @@ bool32 ShouldSwitch(u32 battler) return TRUE; //These Functions can prompt switch to generic pary members + if ((AI_THINKING_STRUCT->aiFlags & AI_FLAG_SMART_SWITCHING) && (CanMonSurviveHazardSwitchin(battler) == FALSE)) + return FALSE; if (ShouldSwitchIfAllBadMoves(battler)) return TRUE; if (ShouldSwitchIfAbilityBenefit(battler)) return TRUE; if (HasBadOdds(battler)) return TRUE; + if (ShouldSwitchIfEncored(battler)) + return TRUE; + if (AreAttackingStatsLowered(battler)) + return TRUE; //Removing switch capabilites under specific conditions //These Functions prevent the "FindMonWithFlagsAndSuperEffective" from getting out of hand. @@ -1108,7 +1262,7 @@ static u32 GetSwitchinHazardsDamage(u32 battler, struct BattlePokemon *battleMon { // Stealth Rock if ((hazardFlags & SIDE_STATUS_STEALTH_ROCK) && heldItemEffect != HOLD_EFFECT_HEAVY_DUTY_BOOTS) - hazardDamage += GetStealthHazardDamageByTypesAndHP(gBattleMoves[MOVE_STEALTH_ROCK].type, defType1, defType2, battleMon->hp); + hazardDamage += GetStealthHazardDamageByTypesAndHP(gBattleMoves[MOVE_STEALTH_ROCK].type, defType1, defType2, battleMon->maxHP); // Spikes if ((hazardFlags & SIDE_STATUS_SPIKES) && IsMonGrounded(heldItemEffect, ability, defType1, defType2)) { diff --git a/src/battle_message.c b/src/battle_message.c index fa2df70688..d8dbceab24 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -822,6 +822,7 @@ 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_OpportunistCopied[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} copied its\nopponent's stat changes!"); 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_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!"); @@ -845,6 +846,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_PKMNTELLCHILLINGRECEPTIONJOKE - BATTLESTRINGS_TABLE_START] = sText_PkmnTellChillingReceptionJoke, [STRINGID_MOVEBLOCKEDBYDYNAMAX - BATTLESTRINGS_TABLE_START] = sText_MoveBlockedByDynamax, [STRINGID_OPPORTUNISTCOPIED - BATTLESTRINGS_TABLE_START] = sText_OpportunistCopied, [STRINGID_TARGETISHURTBYSALTCURE - BATTLESTRINGS_TABLE_START] = sText_TargetIsHurtBySaltCure, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 9fd43a3d1e..141271db63 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2159,7 +2159,7 @@ static void Cmd_attackanimation(void) if (gBattleControllerExecFlags) return; - if ((gHitMarker & HITMARKER_NO_ANIMATIONS) + if ((gHitMarker & (HITMARKER_NO_ANIMATIONS | HITMARKER_DISABLE_ANIMATION)) && gCurrentMove != MOVE_TRANSFORM && gCurrentMove != MOVE_SUBSTITUTE // In a wild double battle gotta use the teleport animation if two wild pokemon are alive. @@ -4920,7 +4920,7 @@ static void PlayAnimation(u32 battler, u8 animId, const u16 *argPtr, const u8 *n MarkBattlerForControllerExec(battler); gBattlescriptCurrInstr = nextInstr; } - else if (gHitMarker & HITMARKER_NO_ANIMATIONS && animId != B_ANIM_RESTORE_BG) + else if (gHitMarker & (HITMARKER_NO_ANIMATIONS | HITMARKER_DISABLE_ANIMATION) && animId != B_ANIM_RESTORE_BG) { BattleScriptPush(nextInstr); gBattlescriptCurrInstr = BattleScript_Pausex20; @@ -5502,7 +5502,7 @@ static void Cmd_moveend(void) break; case MOVEEND_ATTACKER_INVISIBLE: // make attacker sprite invisible if (gStatuses3[gBattlerAttacker] & (STATUS3_SEMI_INVULNERABLE) - && gHitMarker & HITMARKER_NO_ANIMATIONS) + && gHitMarker & (HITMARKER_NO_ANIMATIONS | HITMARKER_DISABLE_ANIMATION)) { BtlController_EmitSpriteInvisibility(gBattlerAttacker, BUFFER_A, TRUE); MarkBattlerForControllerExec(gBattlerAttacker); @@ -7446,7 +7446,7 @@ static void Cmd_statusanimation(void) u32 battler = GetBattlerForBattleScript(cmd->battler); if (!(gStatuses3[battler] & STATUS3_SEMI_INVULNERABLE) && gDisableStructs[battler].substituteHP == 0 - && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) + && !(gHitMarker & (HITMARKER_NO_ANIMATIONS | HITMARKER_DISABLE_ANIMATION))) { BtlController_EmitStatusAnimation(battler, BUFFER_A, FALSE, gBattleMons[battler].status1); MarkBattlerForControllerExec(battler); @@ -7465,7 +7465,7 @@ static void Cmd_status2animation(void) u32 status2ToAnim = cmd->status2; if (!(gStatuses3[battler] & STATUS3_SEMI_INVULNERABLE) && gDisableStructs[battler].substituteHP == 0 - && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) + && !(gHitMarker & (HITMARKER_NO_ANIMATIONS | HITMARKER_DISABLE_ANIMATION))) { BtlController_EmitStatusAnimation(battler, BUFFER_A, TRUE, gBattleMons[battler].status2 & status2ToAnim); MarkBattlerForControllerExec(battler); @@ -7484,7 +7484,7 @@ static void Cmd_chosenstatusanimation(void) u32 wantedStatus = cmd->status; if (!(gStatuses3[battler] & STATUS3_SEMI_INVULNERABLE) && gDisableStructs[battler].substituteHP == 0 - && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) + && !(gHitMarker & (HITMARKER_NO_ANIMATIONS | HITMARKER_DISABLE_ANIMATION))) { BtlController_EmitStatusAnimation(battler, BUFFER_A, cmd->isStatus2, wantedStatus); MarkBattlerForControllerExec(battler); @@ -9309,26 +9309,6 @@ static void Cmd_various(void) gLastUsedAbility = gBattleMons[battler].ability; break; } - case VARIOUS_TRY_HEAL_PULSE: - { - VARIOUS_ARGS(const u8 *failInstr); - if (BATTLER_MAX_HP(battler)) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - if (GetBattlerAbility(gBattlerAttacker) == ABILITY_MEGA_LAUNCHER && gBattleMoves[gCurrentMove].pulseMove) - gBattleMoveDamage = -(GetNonDynamaxMaxHP(battler) * 75 / 100); - else - gBattleMoveDamage = -(GetNonDynamaxMaxHP(battler) / 2); - - if (gBattleMoveDamage == 0) - gBattleMoveDamage = -1; - gBattlescriptCurrInstr = cmd->nextInstr; - } - return; - } case VARIOUS_TRY_QUASH: { VARIOUS_ARGS(const u8 *failInstr); @@ -14499,7 +14479,7 @@ static void Cmd_pickup(void) SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &heldItem); } } - #if P_SHUCKLE_BERRY_JUICE == TRUE + #if P_SHUCKLE_BERRY_JUICE == GEN_2 else if (species == SPECIES_SHUCKLE && heldItem == ITEM_ORAN_BERRY && (Random() % 16) == 0) @@ -16431,3 +16411,26 @@ void BS_TryTrainerSlideDynamaxMsg(void) else gBattlescriptCurrInstr = cmd->nextInstr; } + +void BS_TryHealPulse(void) +{ + NATIVE_ARGS(const u8 *failInstr); + + if (BATTLER_MAX_HP(gBattlerTarget)) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else + { + if (GetBattlerAbility(gBattlerAttacker) == ABILITY_MEGA_LAUNCHER && gBattleMoves[gCurrentMove].pulseMove) + gBattleMoveDamage = -(GetNonDynamaxMaxHP(gBattlerTarget) * 75 / 100); + else if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && gBattleMoves[gCurrentMove].argument == MOVE_EFFECT_FLORAL_HEALING) + gBattleMoveDamage = -(GetNonDynamaxMaxHP(gBattlerTarget) * 2 / 3); + else + gBattleMoveDamage = -(GetNonDynamaxMaxHP(gBattlerTarget) / 2); + + if (gBattleMoveDamage == 0) + gBattleMoveDamage = -1; + gBattlescriptCurrInstr = cmd->nextInstr; + } +} diff --git a/src/battle_setup.c b/src/battle_setup.c index 72a41aca9c..750191d74f 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -38,6 +38,8 @@ #include "mirage_tower.h" #include "field_screen_effect.h" #include "data.h" +#include "vs_seeker.h" +#include "item.h" #include "constants/battle_frontier.h" #include "constants/battle_setup.h" #include "constants/game_stat.h" @@ -675,6 +677,19 @@ void StartRegiBattle(void) TryUpdateGymLeaderRematchFromWild(); } +static void DowngradeBadPoison(void) +{ + u8 i; + u32 status = STATUS1_POISON; + if (B_TOXIC_REVERSAL < GEN_5) + return; + for(i = 0; i < PARTY_SIZE; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_HAS_SPECIES) && GetMonData(&gPlayerParty[i], MON_DATA_STATUS) == STATUS1_TOXIC_POISON) + SetMonData(&gPlayerParty[i], MON_DATA_STATUS, &status); + } +} + static void CB2_EndWildBattle(void) { CpuFill16(0, (void *)(BG_PLTT), BG_PLTT_SIZE); @@ -687,6 +702,7 @@ static void CB2_EndWildBattle(void) else { SetMainCallback2(CB2_ReturnToField); + DowngradeBadPoison(); gFieldCallback = FieldCB_ReturnToFieldNoScriptCheckMusic; } } @@ -705,6 +721,7 @@ static void CB2_EndScriptedWildBattle(void) } else { + DowngradeBadPoison(); SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); } } @@ -995,6 +1012,7 @@ static void CB2_StartFirstBattle(void) static void CB2_EndFirstBattle(void) { Overworld_ClearSavedMusic(); + DowngradeBadPoison(); SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); } @@ -1412,6 +1430,7 @@ static void CB2_EndTrainerBattle(void) if (gTrainerBattleOpponent_A == TRAINER_SECRET_BASE) { + DowngradeBadPoison(); SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); } else if (IsPlayerDefeated(gBattleOutcome) == TRUE) @@ -1424,6 +1443,7 @@ static void CB2_EndTrainerBattle(void) else { SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); + DowngradeBadPoison(); if (!InBattlePyramid() && !InTrainerHillChallenge()) { RegisterTrainerInMatchCall(); @@ -1436,6 +1456,7 @@ static void CB2_EndRematchBattle(void) { if (gTrainerBattleOpponent_A == TRAINER_SECRET_BASE) { + DowngradeBadPoison(); SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); } else if (IsPlayerDefeated(gBattleOutcome) == TRUE) @@ -1448,6 +1469,7 @@ static void CB2_EndRematchBattle(void) RegisterTrainerInMatchCall(); SetBattledTrainersFlags(); HandleRematchVarsOnBattleEnd(); + DowngradeBadPoison(); } } @@ -1627,7 +1649,7 @@ static const u8 *GetTrainerCantBattleSpeech(void) return ReturnEmptyStringIfNull(sTrainerCannotBattleSpeech); } -static s32 FirstBattleTrainerIdToRematchTableId(const struct RematchTrainer *table, u16 trainerId) +s32 FirstBattleTrainerIdToRematchTableId(const struct RematchTrainer *table, u16 trainerId) { s32 i; @@ -1640,7 +1662,7 @@ static s32 FirstBattleTrainerIdToRematchTableId(const struct RematchTrainer *tab return -1; } -static s32 TrainerIdToRematchTableId(const struct RematchTrainer *table, u16 trainerId) +s32 TrainerIdToRematchTableId(const struct RematchTrainer *table, u16 trainerId) { s32 i, j; @@ -1686,30 +1708,42 @@ static void SetRematchIdForTrainer(const struct RematchTrainer *table, u32 table gSaveBlock1Ptr->trainerRematches[tableId] = i; } +static bool32 DoesCurrentMapMatchRematchTrainerMap(s32 i, const struct RematchTrainer *table, u16 mapGroup, u16 mapNum) +{ + return table[i].mapGroup == mapGroup && table[i].mapNum == mapNum; +} + +bool32 TrainerIsMatchCallRegistered(s32 i) +{ + return FlagGet(FLAG_MATCH_CALL_REGISTERED + i); +} + static bool32 UpdateRandomTrainerRematches(const struct RematchTrainer *table, u16 mapGroup, u16 mapNum) { s32 i; - bool32 ret = FALSE; + + if (CheckBagHasItem(ITEM_VS_SEEKER, 1) && I_VS_SEEKER_CHARGING != 0) + return FALSE; for (i = 0; i <= REMATCH_SPECIAL_TRAINER_START; i++) { - if (table[i].mapGroup == mapGroup && table[i].mapNum == mapNum && !IsRematchForbidden(i)) + if (DoesCurrentMapMatchRematchTrainerMap(i,table,mapGroup,mapNum) && !IsRematchForbidden(i)) + continue; + + if (gSaveBlock1Ptr->trainerRematches[i] != 0) { - if (gSaveBlock1Ptr->trainerRematches[i] != 0) - { - // Trainer already wants a rematch. Don't bother updating it. - ret = TRUE; - } - else if (FlagGet(FLAG_MATCH_CALL_REGISTERED + i) - && (Random() % 100) <= 30) // 31% chance of getting a rematch. - { - SetRematchIdForTrainer(table, i); - ret = TRUE; - } + // Trainer already wants a rematch. Don't bother updating it. + return TRUE; + } + else if (TrainerIsMatchCallRegistered(i) && ((Random() % 100) <= 30)) + // 31% chance of getting a rematch. + { + SetRematchIdForTrainer(table, i); + return TRUE; } } - return ret; + return FALSE; } void UpdateRematchIfDefeated(s32 rematchTableId) @@ -1772,7 +1806,7 @@ static bool8 IsTrainerReadyForRematch_(const struct RematchTrainer *table, u16 t return TRUE; } -static u16 GetRematchTrainerIdFromTable(const struct RematchTrainer *table, u16 firstBattleTrainerId) +u16 GetRematchTrainerIdFromTable(const struct RematchTrainer *table, u16 firstBattleTrainerId) { const struct RematchTrainer *trainerEntry; s32 i; @@ -1877,7 +1911,9 @@ static bool32 HasAtLeastFiveBadges(void) void IncrementRematchStepCounter(void) { - if (HasAtLeastFiveBadges()) + if (HasAtLeastFiveBadges() + && (I_VS_SEEKER_CHARGING != 0) + && (!CheckBagHasItem(ITEM_VS_SEEKER, 1))) { if (gSaveBlock1Ptr->trainerRematchStepCounter >= STEP_COUNTER_MAX) gSaveBlock1Ptr->trainerRematchStepCounter = STEP_COUNTER_MAX; @@ -1912,7 +1948,10 @@ bool32 IsRematchTrainerIn(u16 mapGroup, u16 mapNum) static u16 GetRematchTrainerId(u16 trainerId) { - return GetRematchTrainerIdFromTable(gRematchTable, trainerId); + if (FlagGet(I_VS_SEEKER_CHARGING) && (I_VS_SEEKER_CHARGING != 0)) + return GetRematchTrainerIdVSSeeker(trainerId); + else + return GetRematchTrainerIdFromTable(gRematchTable, trainerId); } u16 GetLastBeatenRematchTrainerId(u16 trainerId) @@ -1935,6 +1974,9 @@ bool8 IsTrainerReadyForRematch(void) static void HandleRematchVarsOnBattleEnd(void) { + if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) && (I_VS_SEEKER_CHARGING != 0)) + ClearRematchMovementByTrainerId(); + ClearTrainerWantRematchState(gRematchTable, gTrainerBattleOpponent_A); SetBattledTrainersFlags(); } diff --git a/src/battle_util.c b/src/battle_util.c index 475b38c78b..f33898f2a0 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -6017,7 +6017,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 { if (!sAbilitiesNotTraced[gBattleMons[target1].ability] && gBattleMons[target1].hp != 0 && !sAbilitiesNotTraced[gBattleMons[target2].ability] && gBattleMons[target2].hp != 0) - chosenTarget = GetBattlerAtPosition(((Random() & 1) * 2) | side), effect++; + chosenTarget = GetBattlerAtPosition((RandomPercentage(RNG_TRACE, 50) * 2) | side), effect++; else if (!sAbilitiesNotTraced[gBattleMons[target1].ability] && gBattleMons[target1].hp != 0) chosenTarget = target1, effect++; else if (!sAbilitiesNotTraced[gBattleMons[target2].ability] && gBattleMons[target2].hp != 0) @@ -6031,15 +6031,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (effect != 0) { - if (caseID == ABILITYEFFECT_TRACE1) - { - BattleScriptPushCursorAndCallback(BattleScript_TraceActivatesEnd3); - } - else - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TraceActivates; - } + BattleScriptPushCursorAndCallback(BattleScript_TraceActivatesEnd3); gBattleResources->flags->flags[i] &= ~RESOURCE_FLAG_TRACED; gBattleStruct->tracedAbility[i] = gLastUsedAbility = gBattleMons[chosenTarget].ability; RecordAbilityBattle(chosenTarget, gLastUsedAbility); // Record the opposing battler has this ability diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index a5ef4960a7..078f32f5ac 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -10985,6 +10985,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .priority = 0, .split = SPLIT_STATUS, .zMoveEffect = Z_EFFECT_RESET_STATS, + .argument = MOVE_EFFECT_FLORAL_HEALING, .mirrorMoveBanned = TRUE, .healBlockBanned = TRUE, .magicCoatAffected = TRUE, @@ -14003,7 +14004,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_CHILLY_RECEPTION] = { - .effect = EFFECT_PLACEHOLDER, // EFFECT_CHILLY_RECEPTION + .effect = EFFECT_CHILLY_RECEPTION, .power = 0, .type = TYPE_ICE, .accuracy = 0, diff --git a/src/data/items.h b/src/data/items.h index 62fd6a6484..37a82eee47 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -8731,7 +8731,11 @@ const struct Item gItems[] = .importance = 1, .pocket = POCKET_KEY_ITEMS, .type = ITEM_USE_FIELD, +#if I_VS_SEEKER_CHARGING != 0 + .fieldUseFunc = FieldUseFunc_VsSeeker, +#else .fieldUseFunc = ItemUseOutOfBattle_CannotUse, +#endif }, [ITEM_TM_CASE] = diff --git a/src/data/object_events/movement_action_func_tables.h b/src/data/object_events/movement_action_func_tables.h index 2e1b6b3b31..e16cae74fc 100755 --- a/src/data/object_events/movement_action_func_tables.h +++ b/src/data/object_events/movement_action_func_tables.h @@ -420,6 +420,8 @@ u8 (*const gMovementActionFuncs_StopLevitateAtTop[])(struct ObjectEvent *, struc u8 (*const gMovementActionFuncs_Figure8[])(struct ObjectEvent *, struct Sprite *); 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 *const gMovementActionFuncs[])(struct ObjectEvent *, struct Sprite *) = { [MOVEMENT_ACTION_FACE_DOWN] = gMovementActionFuncs_FaceDown, @@ -580,6 +582,8 @@ u8 (*const *const gMovementActionFuncs[])(struct ObjectEvent *, struct Sprite *) [MOVEMENT_ACTION_FIGURE_8] = gMovementActionFuncs_Figure8, [MOVEMENT_ACTION_FLY_UP] = gMovementActionFuncs_FlyUp, [MOVEMENT_ACTION_FLY_DOWN] = gMovementActionFuncs_FlyDown, + [MOVEMENT_ACTION_EMOTE_X] = gMovementActionFuncs_EmoteX, + [MOVEMENT_ACTION_EMOTE_DOUBLE_EXCL_MARK] = gMovementActionFuncs_EmoteDoubleExclMark, }; u8 (*const gMovementActionFuncs_FaceDown[])(struct ObjectEvent *, struct Sprite *) = { @@ -1519,3 +1523,13 @@ u8 (*const gMovementActionFuncs_StopLevitateAtTop[])(struct ObjectEvent *, struc MovementAction_StopLevitateAtTop_Step0, MovementAction_Finish, }; + +u8 (*const gMovementActionFuncs_EmoteX[])(struct ObjectEvent *, struct Sprite *) = { + MovementAction_EmoteX_Step0, + MovementAction_Finish, +}; + +u8 (*const gMovementActionFuncs_EmoteDoubleExclMark[])(struct ObjectEvent *, struct Sprite *) = { + MovementAction_EmoteDoubleExclamationMark_Step0, + MovementAction_Finish, +}; diff --git a/src/data/pokemon_graphics/back_pic_coordinates.h b/src/data/pokemon_graphics/back_pic_coordinates.h index a7d03e09e1..4aa4273535 100644 --- a/src/data/pokemon_graphics/back_pic_coordinates.h +++ b/src/data/pokemon_graphics/back_pic_coordinates.h @@ -1243,7 +1243,7 @@ const struct MonCoords gMonBackPicCoords[NUM_SPECIES + 1] = [SPECIES_VOLTORB_HISUIAN] = { .size = MON_COORDS_SIZE(48, 32), .y_offset = 10 }, [SPECIES_ELECTRODE_HISUIAN] = { .size = MON_COORDS_SIZE(64, 40), .y_offset = 7 }, [SPECIES_TYPHLOSION_HISUIAN] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 2 }, - [SPECIES_QWILFISH_HISUIAN] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 6 }, + [SPECIES_QWILFISH_HISUIAN] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 8 }, [SPECIES_SNEASEL_HISUIAN] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 3 }, #if P_GEN_5_POKEMON == TRUE [SPECIES_SAMUROTT_HISUIAN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 8 }, @@ -1253,7 +1253,7 @@ const struct MonCoords gMonBackPicCoords[NUM_SPECIES + 1] = [SPECIES_BRAVIARY_HISUIAN] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 7 }, #endif #if P_GEN_6_POKEMON == TRUE - [SPECIES_SLIGGOO_HISUIAN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_SLIGGOO_HISUIAN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1 }, [SPECIES_GOODRA_HISUIAN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, [SPECIES_AVALUGG_HISUIAN] = { .size = MON_COORDS_SIZE(64, 32), .y_offset = 16 }, #endif diff --git a/src/data/pokemon_graphics/enemy_mon_elevation.h b/src/data/pokemon_graphics/enemy_mon_elevation.h index 004e1be917..4ef339a9a0 100644 --- a/src/data/pokemon_graphics/enemy_mon_elevation.h +++ b/src/data/pokemon_graphics/enemy_mon_elevation.h @@ -2,7 +2,7 @@ // is during battle. Species that float or fly have nonzero values. const u8 gEnemyMonElevation[NUM_SPECIES + 1] = { - [SPECIES_BUTTERFREE] = 10, + [SPECIES_BUTTERFREE] = 12, [SPECIES_BEEDRILL] = 9, [SPECIES_PIDGEOT] = 5, [SPECIES_FEAROW] = 6, @@ -12,10 +12,10 @@ const u8 gEnemyMonElevation[NUM_SPECIES + 1] = [SPECIES_GEODUDE] = 10, [SPECIES_MAGNEMITE] = 17, [SPECIES_MAGNETON] = 9, - [SPECIES_GASTLY] = 10, - [SPECIES_HAUNTER] = 11, + [SPECIES_GASTLY] = 13, + [SPECIES_HAUNTER] = 14, [SPECIES_KOFFING] = 14, - [SPECIES_WEEZING] = 6, + [SPECIES_WEEZING] = 3, [SPECIES_AERODACTYL] = 9, [SPECIES_ZAPDOS] = 8, [SPECIES_MEW] = 11, @@ -41,16 +41,15 @@ const u8 gEnemyMonElevation[NUM_SPECIES + 1] = [SPECIES_WINGULL] = 15, [SPECIES_PELIPPER] = 8, [SPECIES_MASQUERAIN] = 10, - [SPECIES_BALTOY] = 5, + [SPECIES_BALTOY] = 8, [SPECIES_CLAYDOL] = 10, [SPECIES_FLYGON] = 7, [SPECIES_GLALIE] = 12, [SPECIES_LUNATONE] = 13, [SPECIES_SOLROCK] = 4, - [SPECIES_ALTARIA] = 8, + [SPECIES_BARBOACH] = 7, [SPECIES_DUSKULL] = 13, [SPECIES_SHUPPET] = 14, - [SPECIES_BANETTE] = 8, [SPECIES_CASTFORM_NORMAL] = 16, [SPECIES_BELDUM] = 8, [SPECIES_RAYQUAZA] = 6, @@ -59,44 +58,58 @@ const u8 gEnemyMonElevation[NUM_SPECIES + 1] = [SPECIES_JIRACHI] = 14, [SPECIES_CHIMECHO] = 16, // Gen 4 + [SPECIES_BURMY] = 10, + [SPECIES_WORMADAM] = 8, [SPECIES_MOTHIM] = 10, - [SPECIES_COMBEE] = 8, + [SPECIES_COMBEE] = 15, [SPECIES_VESPIQUEN] = 4, [SPECIES_DRIFLOON] = 5, [SPECIES_DRIFBLIM] = 7, [SPECIES_MISMAGIUS] = 3, - [SPECIES_CHINGLING] = 5, - [SPECIES_BRONZONG] = 4, + [SPECIES_BRONZOR] = 9, + [SPECIES_BRONZONG] = 7, + [SPECIES_CARNIVINE] = 8, [SPECIES_MAGNEZONE] = 4, [SPECIES_TOGEKISS] = 14, [SPECIES_YANMEGA] = 6, [SPECIES_GLISCOR] = 9, [SPECIES_PORYGON_Z] = 12, [SPECIES_PROBOPASS] = 6, + [SPECIES_DUSKNOIR] = 6, + [SPECIES_FROSLASS] = 7, [SPECIES_ROTOM] = 10, [SPECIES_UXIE] = 6, [SPECIES_MESPRIT] = 6, [SPECIES_AZELF] = 6, [SPECIES_CRESSELIA] = 3, + [SPECIES_PHIONE] = 8, + [SPECIES_MANAPHY] = 10, [SPECIES_DARKRAI] = 4, // Gen 5 [SPECIES_MUNNA] = 7, [SPECIES_MUSHARNA] = 5, [SPECIES_WOOBAT] = 19, - [SPECIES_SWOOBAT] = 12, + [SPECIES_SWOOBAT] = 10, [SPECIES_PETILIL] = 7, + [SPECIES_BASCULIN] = 6, [SPECIES_SIGILYPH] = 7, [SPECIES_YAMASK] = 10, - [SPECIES_ARCHEOPS] = 8, + [SPECIES_ARCHEOPS] = 11, [SPECIES_SOLOSIS] = 14, [SPECIES_DUOSION] = 7, [SPECIES_REUNICLUS] = 8, [SPECIES_EMOLGA] = 19, + [SPECIES_FERROTHORN] = 10, + [SPECIES_KLINK] = 12, + [SPECIES_KLANG] = 8, + [SPECIES_KLINKLANG] = 4, [SPECIES_TYNAMO] = 16, [SPECIES_EELEKTRIK] = 8, [SPECIES_EELEKTROSS] = 8, + [SPECIES_LAMPENT] = 6, + [SPECIES_CHANDELURE] = 6, [SPECIES_CRYOGONAL] = 3, - [SPECIES_BRAVIARY] = 8, + [SPECIES_BRAVIARY] = 6, [SPECIES_HYDREIGON] = 3, [SPECIES_VOLCARONA] = 6, [SPECIES_TORNADUS_INCARNATE] = 7, @@ -124,6 +137,7 @@ const u8 gEnemyMonElevation[NUM_SPECIES + 1] = [SPECIES_VIKAVOLT] = 8, [SPECIES_CUTIEFLY] = 10, [SPECIES_RIBOMBEE] = 6, + [SPECIES_WISHIWASHI_SOLO] = 12, [SPECIES_COMFEY] = 8, [SPECIES_MINIOR_METEOR_RED] = 17, [SPECIES_DHELMISE] = 2, @@ -154,6 +168,8 @@ const u8 gEnemyMonElevation[NUM_SPECIES + 1] = [SPECIES_ETERNATUS] = 4, [SPECIES_REGIELEKI] = 8, [SPECIES_REGIDRAGO] = 5, + [SPECIES_BASCULEGION] = 5, + [SPECIES_ENAMORUS] = 7, // Megas [SPECIES_BEEDRILL_MEGA] = 5, [SPECIES_PIDGEOT_MEGA] = 8, @@ -178,8 +194,7 @@ const u8 gEnemyMonElevation[NUM_SPECIES + 1] = [SPECIES_ARTICUNO_GALARIAN] = 10, [SPECIES_YAMASK_GALARIAN] = 4, // Hisuian Forms - [SPECIES_VOLTORB_HISUIAN] = 1, - [SPECIES_ELECTRODE_HISUIAN] = 4, + [SPECIES_QWILFISH_HISUIAN] = 9, [SPECIES_BRAVIARY_HISUIAN] = 3, // Other Forms [SPECIES_UNOWN_B] = 8, @@ -212,12 +227,18 @@ const u8 gEnemyMonElevation[NUM_SPECIES + 1] = [SPECIES_CASTFORM_SUNNY] = 5, [SPECIES_CASTFORM_RAINY] = 5, [SPECIES_CASTFORM_SNOWY] = 5, + [SPECIES_BURMY_SANDY_CLOAK] = 10, + [SPECIES_BURMY_TRASH_CLOAK] = 10, + [SPECIES_WORMADAM_SANDY_CLOAK] = 8, + [SPECIES_WORMADAM_TRASH_CLOAK] = 8, [SPECIES_ROTOM_HEAT] = 6, [SPECIES_ROTOM_WASH] = 6, [SPECIES_ROTOM_FROST] = 6, [SPECIES_ROTOM_FAN] = 6, [SPECIES_ROTOM_MOW] = 6, [SPECIES_GIRATINA_ORIGIN] = 7, + [SPECIES_BASCULIN_BLUE_STRIPED] = 6, + [SPECIES_BASCULIN_WHITE_STRIPED] = 6, [SPECIES_THUNDURUS_THERIAN] = 7, [SPECIES_MELOETTA_PIROUETTE] = 5, [SPECIES_VIVILLON_POLAR] = 9, @@ -268,20 +289,23 @@ const u8 gEnemyMonElevation[NUM_SPECIES + 1] = [SPECIES_SINISTEA_ANTIQUE] = 10, [SPECIES_POLTEAGEIST_ANTIQUE] = 12, [SPECIES_ETERNATUS_ETERNAMAX] = 13, + [SPECIES_BASCULEGION_FEMALE] = 5, #if P_GEN_9_POKEMON == TRUE [SPECIES_TADBULB] = 12, - [SPECIES_BRAMBLIN] = 1, - [SPECIES_BRAMBLEGHAST] = 1, - [SPECIES_BOMBIRDIER] = 11, - [SPECIES_GLIMMET] = 1, - [SPECIES_GLIMMORA] = 10, - [SPECIES_VELUZA] = 1, + [SPECIES_BOMBIRDIER] = 8, + [SPECIES_GLIMMET] = 11, + [SPECIES_GLIMMORA] = 8, + [SPECIES_VELUZA] = 5, [SPECIES_DONDOZO] = 1, [SPECIES_FLUTTER_MANE] = 5, [SPECIES_IRON_JUGULIS] = 7, - [SPECIES_IRON_MOTH] = 4, - [SPECIES_CHI_YU] = 2, - [SPECIES_ROARING_MOON] = 20, + [SPECIES_IRON_MOTH] = 8, + [SPECIES_CHI_YU] = 9, + [SPECIES_ROARING_MOON] = 6, + [SPECIES_POLTCHAGEIST_COUNTERFEIT] = 10, + [SPECIES_POLTCHAGEIST_ARTISAN] = 10, + [SPECIES_SINISTCHA_UNREMARKABLE] = 10, + [SPECIES_SINISTCHA_MASTERPIECE] = 10, #endif - [SPECIES_BUTTERFREE_GIGANTAMAX] = 10, + [SPECIES_BUTTERFREE_GIGANTAMAX] = 7, }; diff --git a/src/data/pokemon_graphics/front_pic_anims.h b/src/data/pokemon_graphics/front_pic_anims.h index f82bcc5e26..ba03f71bbb 100644 --- a/src/data/pokemon_graphics/front_pic_anims.h +++ b/src/data/pokemon_graphics/front_pic_anims.h @@ -195,8 +195,6 @@ static const union AnimCmd sAnim_Pidgeot_1[] = { ANIMCMD_FRAME(1, 20), ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; @@ -995,16 +993,16 @@ static const union AnimCmd sAnim_Dodrio_1[] = ANIMCMD_FRAME(1, 12), ANIMCMD_FRAME(0, 12), ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 12), ANIMCMD_FRAME(0, 8), ANIMCMD_END, }; static const union AnimCmd sAnim_Seel_1[] = { - ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(1, 30), ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; @@ -1065,30 +1063,22 @@ static const union AnimCmd sAnim_Shellder_1[] = static const union AnimCmd sAnim_Cloyster_1[] = { - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 25), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 32), + ANIMCMD_FRAME(0, 14), + ANIMCMD_FRAME(1, 18), + ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_Gastly_1[] = { - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(1, 30), ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 18), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; @@ -1113,7 +1103,6 @@ static const union AnimCmd sAnim_Gengar_1[] = static const union AnimCmd sAnim_Onix_1[] = { ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(1, 30), ANIMCMD_FRAME(0, 30), ANIMCMD_END, }; @@ -1143,26 +1132,19 @@ static const union AnimCmd sAnim_Hypno_1[] = static const union AnimCmd sAnim_Krabby_1[] = { - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16), ANIMCMD_FRAME(0, 8), ANIMCMD_END, }; static const union AnimCmd sAnim_Kingler_1[] = { - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 25), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(0, 14), ANIMCMD_END, }; @@ -1178,11 +1160,10 @@ static const union AnimCmd sAnim_Voltorb_1[] = static const union AnimCmd sAnim_Electrode_1[] = { - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(0, 14), + ANIMCMD_FRAME(1, 34), + ANIMCMD_FRAME(1, 34), + ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; @@ -1209,12 +1190,12 @@ static const union AnimCmd sAnim_Exeggutor_1[] = static const union AnimCmd sAnim_Cubone_1[] = { - ANIMCMD_FRAME(1, 14), - ANIMCMD_FRAME(0, 14), - ANIMCMD_FRAME(1, 14), - ANIMCMD_FRAME(0, 14), - ANIMCMD_FRAME(1, 14), - ANIMCMD_FRAME(0, 14), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 6), + ANIMCMD_LOOP(1), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 32), + ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; @@ -1231,28 +1212,31 @@ static const union AnimCmd sAnim_Marowak_1[] = static const union AnimCmd sAnim_Hitmonlee_1[] = { - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 18), + ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_Hitmonchan_1[] = { - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(0, 17), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), ANIMCMD_END, }; static const union AnimCmd sAnim_Lickitung_1[] = { - ANIMCMD_FRAME(0, 28), - ANIMCMD_FRAME(1, 32), + ANIMCMD_FRAME(1, 16), ANIMCMD_FRAME(0, 15), ANIMCMD_END, }; @@ -1316,11 +1300,8 @@ static const union AnimCmd sAnim_Rhyhorn_2[] = static const union AnimCmd sAnim_Rhydon_1[] = { - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 48), - ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 15), ANIMCMD_END, }; @@ -1343,16 +1324,9 @@ static const union AnimCmd sAnim_Chansey_1[] = static const union AnimCmd sAnim_Tangela_1[] = { - ANIMCMD_FRAME(1, 9), - ANIMCMD_FRAME(0, 9), - ANIMCMD_FRAME(1, 9), - ANIMCMD_FRAME(0, 9), - ANIMCMD_FRAME(1, 9), - ANIMCMD_FRAME(0, 9), - ANIMCMD_FRAME(1, 9), - ANIMCMD_FRAME(0, 9), - ANIMCMD_FRAME(1, 9), - ANIMCMD_FRAME(0, 9), + ANIMCMD_FRAME(0, 40), + ANIMCMD_FRAME(1, 24), + ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; @@ -2707,17 +2681,11 @@ static const union AnimCmd sAnim_Tyrogue_1[] = static const union AnimCmd sAnim_Hitmontop_1[] = { - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 26), + ANIMCMD_FRAME(0, 14), + ANIMCMD_FRAME(1, 32), + ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; diff --git a/src/data/pokemon_graphics/front_pic_coordinates.h b/src/data/pokemon_graphics/front_pic_coordinates.h index 9daab74fe8..80506717c7 100644 --- a/src/data/pokemon_graphics/front_pic_coordinates.h +++ b/src/data/pokemon_graphics/front_pic_coordinates.h @@ -38,7 +38,7 @@ const struct MonCoords gMonFrontPicCoords[NUM_SPECIES + 1] = [SPECIES_NIDOQUEEN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2 }, [SPECIES_NIDORAN_M] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 12 }, [SPECIES_NIDORINO] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 8 }, - [SPECIES_NIDOKING] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2 }, + [SPECIES_NIDOKING] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3 }, [SPECIES_CLEFAIRY] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 12 }, [SPECIES_CLEFABLE] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 6 }, [SPECIES_VULPIX] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 11 }, @@ -104,19 +104,19 @@ const struct MonCoords gMonFrontPicCoords[NUM_SPECIES + 1] = [SPECIES_HYPNO] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3 }, [SPECIES_KRABBY] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 14 }, [SPECIES_KINGLER] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 8 }, - [SPECIES_VOLTORB] = { .size = MON_COORDS_SIZE(32, 40), .y_offset = 11 }, - [SPECIES_ELECTRODE] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8 }, + [SPECIES_VOLTORB] = { .size = MON_COORDS_SIZE(32, 40), .y_offset = 15 }, + [SPECIES_ELECTRODE] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 11 }, [SPECIES_EXEGGCUTE] = { .size = MON_COORDS_SIZE(56, 40), .y_offset = 12 }, [SPECIES_EXEGGUTOR] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, [SPECIES_CUBONE] = { .size = MON_COORDS_SIZE(56, 40), .y_offset = 13 }, [SPECIES_MAROWAK] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 8 }, - [SPECIES_HITMONLEE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3 }, - [SPECIES_HITMONCHAN] = { .size = MON_COORDS_SIZE(48, 64), .y_offset = 3 }, + [SPECIES_HITMONLEE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 5 }, + [SPECIES_HITMONCHAN] = { .size = MON_COORDS_SIZE(48, 64), .y_offset = 4 }, [SPECIES_LICKITUNG] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 7 }, [SPECIES_KOFFING] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 10 }, [SPECIES_WEEZING] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, [SPECIES_RHYHORN] = { .size = MON_COORDS_SIZE(56, 40), .y_offset = 12 }, - [SPECIES_RHYDON] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 4 }, + [SPECIES_RHYDON] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 3 }, [SPECIES_CHANSEY] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 9 }, [SPECIES_TANGELA] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 12 }, [SPECIES_KANGASKHAN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1 }, @@ -202,7 +202,7 @@ const struct MonCoords gMonFrontPicCoords[NUM_SPECIES + 1] = [SPECIES_SUNFLORA] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 8 }, [SPECIES_YANMA] = { .size = MON_COORDS_SIZE(64, 40), .y_offset = 14 }, [SPECIES_WOOPER] = { .size = MON_COORDS_SIZE(40, 32), .y_offset = 16 }, - [SPECIES_WOOPER_PALDEAN] = { .size = MON_COORDS_SIZE(40, 32), .y_offset = 12 }, + [SPECIES_WOOPER_PALDEAN] = { .size = MON_COORDS_SIZE(40, 32), .y_offset = 16 }, [SPECIES_QUAGSIRE] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 5 }, [SPECIES_ESPEON] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 9 }, [SPECIES_UMBREON] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 9 }, @@ -255,7 +255,7 @@ const struct MonCoords gMonFrontPicCoords[NUM_SPECIES + 1] = [SPECIES_ENTEI] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2 }, [SPECIES_SUICUNE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3 }, [SPECIES_LARVITAR] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 10 }, - [SPECIES_PUPITAR] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 9 }, + [SPECIES_PUPITAR] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 11 }, [SPECIES_TYRANITAR] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, [SPECIES_LUGIA] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, [SPECIES_HO_OH] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, @@ -291,7 +291,7 @@ const struct MonCoords gMonFrontPicCoords[NUM_SPECIES + 1] = [SPECIES_SWELLOW] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 5 }, [SPECIES_SHROOMISH] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 14 }, [SPECIES_BRELOOM] = { .size = MON_COORDS_SIZE(48, 64), .y_offset = 3 }, - [SPECIES_SPINDA] = { .size = MON_COORDS_SIZE(48, 64), .y_offset = 1 }, + [SPECIES_SPINDA] = { .size = MON_COORDS_SIZE(48, 64), .y_offset = 8 }, [SPECIES_WINGULL] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 11 }, [SPECIES_PELIPPER] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2 }, [SPECIES_SURSKIT] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8 }, @@ -301,14 +301,14 @@ const struct MonCoords gMonFrontPicCoords[NUM_SPECIES + 1] = [SPECIES_SKITTY] = { .size = MON_COORDS_SIZE(56, 40), .y_offset = 12 }, [SPECIES_DELCATTY] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 4 }, [SPECIES_KECLEON] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 5 }, - [SPECIES_BALTOY] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 11 }, + [SPECIES_BALTOY] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 14 }, [SPECIES_CLAYDOL] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 3 }, [SPECIES_NOSEPASS] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 10 }, [SPECIES_TORKOAL] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3 }, [SPECIES_SABLEYE] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 10 }, - [SPECIES_BARBOACH] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 11 }, + [SPECIES_BARBOACH] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 15 }, [SPECIES_WHISCASH] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 9 }, - [SPECIES_LUVDISC] = { .size = MON_COORDS_SIZE(32, 40), .y_offset = 11 }, + [SPECIES_LUVDISC] = { .size = MON_COORDS_SIZE(32, 40), .y_offset = 14 }, [SPECIES_CORPHISH] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 8 }, [SPECIES_CRAWDAUNT] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 4 }, [SPECIES_FEEBAS] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 10 }, @@ -341,7 +341,7 @@ const struct MonCoords gMonFrontPicCoords[NUM_SPECIES + 1] = [SPECIES_MAWILE] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 8 }, [SPECIES_MEDITITE] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 10 }, [SPECIES_MEDICHAM] = { .size = MON_COORDS_SIZE(40, 64), .y_offset = 0 }, - [SPECIES_SWABLU] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 12 }, + [SPECIES_SWABLU] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 14 }, [SPECIES_ALTARIA] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1 }, [SPECIES_WYNAUT] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 12 }, [SPECIES_DUSKULL] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 12 }, @@ -364,7 +364,7 @@ const struct MonCoords gMonFrontPicCoords[NUM_SPECIES + 1] = [SPECIES_BANETTE] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 7 }, [SPECIES_SEVIPER] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 6 }, [SPECIES_ZANGOOSE] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 5 }, - [SPECIES_RELICANTH] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 10 }, + [SPECIES_RELICANTH] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 8 }, [SPECIES_ARON] = { .size = MON_COORDS_SIZE(32, 40), .y_offset = 14 }, [SPECIES_LAIRON] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 8 }, [SPECIES_AGGRON] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, @@ -442,7 +442,7 @@ const struct MonCoords gMonFrontPicCoords[NUM_SPECIES + 1] = [SPECIES_HONCHKROW] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 6 }, [SPECIES_GLAMEOW] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 8 }, [SPECIES_PURUGLY] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 5 }, - [SPECIES_CHINGLING] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 12 }, + [SPECIES_CHINGLING] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 15 }, [SPECIES_STUNKY] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 13 }, [SPECIES_SKUNTANK] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 7 }, [SPECIES_BRONZOR] = { .size = MON_COORDS_SIZE(32, 40), .y_offset = 14 }, @@ -486,7 +486,7 @@ const struct MonCoords gMonFrontPicCoords[NUM_SPECIES + 1] = [SPECIES_PORYGON_Z] = { .size = MON_COORDS_SIZE(40, 56), .y_offset = 6 }, [SPECIES_GALLADE] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 1 }, [SPECIES_PROBOPASS] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 4 }, - [SPECIES_DUSKNOIR] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2 }, + [SPECIES_DUSKNOIR] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 4 }, [SPECIES_FROSLASS] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8 }, [SPECIES_ROTOM] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 11 }, [SPECIES_UXIE] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 6 }, @@ -498,8 +498,8 @@ const struct MonCoords gMonFrontPicCoords[NUM_SPECIES + 1] = [SPECIES_REGIGIGAS] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 4 }, [SPECIES_GIRATINA_ALTERED] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, [SPECIES_CRESSELIA] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2 }, - [SPECIES_PHIONE] = { .size = MON_COORDS_SIZE(56, 40), .y_offset = 8 }, - [SPECIES_MANAPHY] = { .size = MON_COORDS_SIZE(64, 40), .y_offset = 10 }, + [SPECIES_PHIONE] = { .size = MON_COORDS_SIZE(56, 40), .y_offset = 12 }, + [SPECIES_MANAPHY] = { .size = MON_COORDS_SIZE(64, 40), .y_offset = 13 }, [SPECIES_DARKRAI] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3 }, [SPECIES_SHAYMIN_LAND] = { .size = MON_COORDS_SIZE(40, 32), .y_offset = 16 }, [SPECIES_ARCEUS_NORMAL] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, @@ -528,7 +528,7 @@ const struct MonCoords gMonFrontPicCoords[NUM_SPECIES + 1] = [SPECIES_SIMISEAR] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 6 }, [SPECIES_PANPOUR] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 10 }, [SPECIES_SIMIPOUR] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 6 }, - [SPECIES_MUNNA] = { .size = MON_COORDS_SIZE(32, 32), .y_offset = 14 }, + [SPECIES_MUNNA] = { .size = MON_COORDS_SIZE(32, 32), .y_offset = 16 }, [SPECIES_MUSHARNA] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6 }, [SPECIES_PIDOVE] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 12 }, [SPECIES_TRANQUILL] = { .size = MON_COORDS_SIZE(40, 56), .y_offset = 7 }, @@ -543,7 +543,7 @@ const struct MonCoords gMonFrontPicCoords[NUM_SPECIES + 1] = [SPECIES_DRILBUR] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 10 }, [SPECIES_EXCADRILL] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 5 }, [SPECIES_AUDINO] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 8 }, - [SPECIES_TIMBURR] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 13 }, + [SPECIES_TIMBURR] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 12 }, [SPECIES_GURDURR] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, [SPECIES_CONKELDURR] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 6 }, [SPECIES_TYMPOLE] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 14 }, @@ -604,7 +604,7 @@ const struct MonCoords gMonFrontPicCoords[NUM_SPECIES + 1] = [SPECIES_FOONGUS] = { .size = MON_COORDS_SIZE(32, 32), .y_offset = 16 }, [SPECIES_AMOONGUSS] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 8 }, [SPECIES_FRILLISH] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 5 }, - [SPECIES_JELLICENT] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 4 }, + [SPECIES_JELLICENT] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3 }, [SPECIES_ALOMOMOLA] = { .size = MON_COORDS_SIZE(32, 64), .y_offset = 0 }, [SPECIES_JOLTIK] = { .size = MON_COORDS_SIZE(32, 32), .y_offset = 17 }, [SPECIES_GALVANTULA] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 10 }, @@ -650,7 +650,7 @@ const struct MonCoords gMonFrontPicCoords[NUM_SPECIES + 1] = [SPECIES_LARVESTA] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 13 }, [SPECIES_VOLCARONA] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 4 }, [SPECIES_COBALION] = { .size = MON_COORDS_SIZE(48, 64), .y_offset = 0 }, - [SPECIES_TERRAKION] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 6 }, + [SPECIES_TERRAKION] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 5 }, [SPECIES_VIRIZION] = { .size = MON_COORDS_SIZE(48, 64), .y_offset = 2 }, [SPECIES_TORNADUS_INCARNATE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1 }, [SPECIES_THUNDURUS_INCARNATE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1 }, @@ -663,7 +663,7 @@ const struct MonCoords gMonFrontPicCoords[NUM_SPECIES + 1] = [SPECIES_GENESECT] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 0 }, #endif #if P_GEN_6_POKEMON == TRUE - [SPECIES_CHESPIN] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 5 }, + [SPECIES_CHESPIN] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 11 }, [SPECIES_QUILLADIN] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 10 }, [SPECIES_CHESNAUGHT] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 4 }, [SPECIES_FENNEKIN] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 10 }, @@ -674,7 +674,7 @@ const struct MonCoords gMonFrontPicCoords[NUM_SPECIES + 1] = [SPECIES_GRENINJA] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 7 }, [SPECIES_BUNNELBY] = { .size = MON_COORDS_SIZE(48, 64), .y_offset = 5 }, [SPECIES_DIGGERSBY] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 4 }, - [SPECIES_FLETCHLING] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 12 }, + [SPECIES_FLETCHLING] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 13 }, [SPECIES_FLETCHINDER] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 8 }, [SPECIES_TALONFLAME] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1 }, [SPECIES_SCATTERBUG] = { .size = MON_COORDS_SIZE(32, 48), .y_offset = 13 }, @@ -711,7 +711,7 @@ const struct MonCoords gMonFrontPicCoords[NUM_SPECIES + 1] = [SPECIES_HELIOLISK] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 4 }, [SPECIES_TYRUNT] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 11 }, [SPECIES_TYRANTRUM] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_AMAURA] = { .size = MON_COORDS_SIZE(32, 56), .y_offset = 0 }, + [SPECIES_AMAURA] = { .size = MON_COORDS_SIZE(32, 56), .y_offset = 5 }, [SPECIES_AURORUS] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, [SPECIES_SYLVEON] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 4 }, [SPECIES_HAWLUCHA] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 8 }, @@ -753,15 +753,15 @@ const struct MonCoords gMonFrontPicCoords[NUM_SPECIES + 1] = [SPECIES_GUMSHOOS] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 5 }, [SPECIES_GRUBBIN] = { .size = MON_COORDS_SIZE(48, 32), .y_offset = 17 }, [SPECIES_CHARJABUG] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 14 }, - [SPECIES_VIKAVOLT] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 6 }, + [SPECIES_VIKAVOLT] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 3 }, [SPECIES_CRABRAWLER] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 7 }, [SPECIES_CRABOMINABLE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, [SPECIES_ORICORIO_BAILE] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 2 }, [SPECIES_CUTIEFLY] = { .size = MON_COORDS_SIZE(33, 35), .y_offset = 16 }, [SPECIES_RIBOMBEE] = { .size = MON_COORDS_SIZE(32, 47), .y_offset = 5 }, [SPECIES_ROCKRUFF] = { .size = MON_COORDS_SIZE(37, 39), .y_offset = 11 }, - [SPECIES_LYCANROC_MIDDAY] = { .size = MON_COORDS_SIZE(57, 53), .y_offset = 6 }, - [SPECIES_WISHIWASHI_SOLO] = { .size = MON_COORDS_SIZE(40, 24), .y_offset = 15 }, + [SPECIES_LYCANROC_MIDDAY] = { .size = MON_COORDS_SIZE(57, 53), .y_offset = 5 }, + [SPECIES_WISHIWASHI_SOLO] = { .size = MON_COORDS_SIZE(40, 24), .y_offset = 20 }, [SPECIES_MAREANIE] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 14 }, [SPECIES_TOXAPEX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2 }, [SPECIES_MUDBRAY] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 7 }, @@ -792,12 +792,12 @@ const struct MonCoords gMonFrontPicCoords[NUM_SPECIES + 1] = [SPECIES_MINIOR_METEOR_RED] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 14 }, [SPECIES_KOMALA] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 12 }, [SPECIES_TURTONATOR] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_TOGEDEMARU] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 5 }, + [SPECIES_TOGEDEMARU] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 9 }, [SPECIES_MIMIKYU_DISGUISED] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 12 }, [SPECIES_BRUXISH] = { .size = MON_COORDS_SIZE(56, 40), .y_offset = 15 }, [SPECIES_DRAMPA] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, [SPECIES_DHELMISE] = { .size = MON_COORDS_SIZE(48, 64), .y_offset = 1 }, - [SPECIES_JANGMO_O] = { .size = MON_COORDS_SIZE(36, 43), .y_offset = 5 }, + [SPECIES_JANGMO_O] = { .size = MON_COORDS_SIZE(36, 43), .y_offset = 9 }, [SPECIES_HAKAMO_O] = { .size = MON_COORDS_SIZE(53, 61), .y_offset = 1 }, [SPECIES_KOMMO_O] = { .size = MON_COORDS_SIZE(63, 63), .y_offset = 0 }, [SPECIES_TAPU_KOKO] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1 }, @@ -863,7 +863,7 @@ const struct MonCoords gMonFrontPicCoords[NUM_SPECIES + 1] = [SPECIES_SILICOBRA] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 12 }, [SPECIES_SANDACONDA] = { .size = MON_COORDS_SIZE(64, 40), .y_offset = 12 }, [SPECIES_CRAMORANT] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_ARROKUDA] = { .size = MON_COORDS_SIZE(56, 32), .y_offset = 13 }, + [SPECIES_ARROKUDA] = { .size = MON_COORDS_SIZE(56, 32), .y_offset = 17 }, [SPECIES_BARRASKEWDA] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 8 }, [SPECIES_TOXEL] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 11 }, [SPECIES_TOXTRICITY_AMPED] = { .size = MON_COORDS_SIZE(48, 64), .y_offset = 1 }, @@ -979,123 +979,123 @@ const struct MonCoords gMonFrontPicCoords[NUM_SPECIES + 1] = [SPECIES_SPECTRIER] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, [SPECIES_CALYREX] = { .size = MON_COORDS_SIZE(48, 64), .y_offset = 2 }, [SPECIES_WYRDEER] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_KLEAVOR] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2 }, - [SPECIES_URSALUNA] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 4 }, - [SPECIES_BASCULEGION_MALE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_SNEASLER] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_OVERQWIL] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_ENAMORUS_INCARNATE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_KLEAVOR] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_URSALUNA] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 2 }, + [SPECIES_BASCULEGION_MALE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6 }, + [SPECIES_SNEASLER] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1 }, + [SPECIES_OVERQWIL] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2 }, + [SPECIES_ENAMORUS_INCARNATE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1 }, #endif #if P_GEN_9_POKEMON == TRUE - [SPECIES_SPRIGATITO] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 8 }, - [SPECIES_FLORAGATO] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_SPRIGATITO] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 11 }, + [SPECIES_FLORAGATO] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3 }, [SPECIES_MEOWSCARADA] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, [SPECIES_FUECOCO] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 8 }, [SPECIES_CROCALOR] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 7 }, [SPECIES_SKELEDIRGE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 7 }, - [SPECIES_QUAXLY] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 7 }, - [SPECIES_QUAXWELL] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_QUAXLY] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 9 }, + [SPECIES_QUAXWELL] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1 }, [SPECIES_QUAQUAVAL] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_LECHONK] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 10 }, + [SPECIES_LECHONK] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 12 }, [SPECIES_OINKOLOGNE_MALE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6 }, [SPECIES_OINKOLOGNE_FEMALE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6 }, - [SPECIES_TAROUNTULA] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 11 }, + [SPECIES_TAROUNTULA] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 10 }, [SPECIES_SPIDOPS] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 5 }, - [SPECIES_NYMBLE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 5 }, - [SPECIES_LOKIX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_PAWMI] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 7 }, - [SPECIES_PAWMO] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2 }, - [SPECIES_PAWMOT] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_TANDEMAUS] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 11 }, - [SPECIES_MAUSHOLD_FAMILY_OF_THREE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 10 }, - [SPECIES_MAUSHOLD_FAMILY_OF_FOUR] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 10 }, - [SPECIES_FIDOUGH] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 13 }, + [SPECIES_NYMBLE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 8 }, + [SPECIES_LOKIX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3 }, + [SPECIES_PAWMI] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 10 }, + [SPECIES_PAWMO] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 4 }, + [SPECIES_PAWMOT] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2 }, + [SPECIES_TANDEMAUS] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 15 }, + [SPECIES_MAUSHOLD_FAMILY_OF_THREE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 15 }, + [SPECIES_MAUSHOLD_FAMILY_OF_FOUR] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 15 }, + [SPECIES_FIDOUGH] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 13 }, [SPECIES_DACHSBUN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6 }, - [SPECIES_SMOLIV] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 13 }, - [SPECIES_DOLLIV] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3 }, + [SPECIES_SMOLIV] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 16 }, + [SPECIES_DOLLIV] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6 }, [SPECIES_ARBOLIVA] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_SQUAWKABILLY_GREEN_PLUMAGE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_SQUAWKABILLY_BLUE_PLUMAGE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_SQUAWKABILLY_YELLOW_PLUMAGE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_SQUAWKABILLY_WHITE_PLUMAGE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_NACLI] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 8 }, + [SPECIES_SQUAWKABILLY_GREEN_PLUMAGE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 4 }, + [SPECIES_SQUAWKABILLY_BLUE_PLUMAGE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 4 }, + [SPECIES_SQUAWKABILLY_YELLOW_PLUMAGE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 4 }, + [SPECIES_SQUAWKABILLY_WHITE_PLUMAGE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 4 }, + [SPECIES_NACLI] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 9 }, [SPECIES_NACLSTACK] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2 }, - [SPECIES_GARGANACL] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_CHARCADET] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2 }, + [SPECIES_GARGANACL] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1 }, + [SPECIES_CHARCADET] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 5 }, [SPECIES_ARMAROUGE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, [SPECIES_CERULEDGE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_TADBULB] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_TADBULB] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 11 }, [SPECIES_BELLIBOLT] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 7 }, - [SPECIES_WATTREL] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 11 }, - [SPECIES_KILOWATTREL] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 5 }, - [SPECIES_MASCHIFF] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6 }, - [SPECIES_MABOSSTIFF] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_SHROODLE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 15 }, + [SPECIES_WATTREL] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 13 }, + [SPECIES_KILOWATTREL] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6 }, + [SPECIES_MASCHIFF] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 8 }, + [SPECIES_MABOSSTIFF] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1 }, + [SPECIES_SHROODLE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 17 }, [SPECIES_GRAFAIAI] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 9 }, - [SPECIES_BRAMBLIN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 13 }, + [SPECIES_BRAMBLIN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 13 }, [SPECIES_BRAMBLEGHAST] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 7 }, - [SPECIES_TOEDSCOOL] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_TOEDSCRUEL] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_KLAWF] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 14 }, - [SPECIES_CAPSAKID] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 10 }, + [SPECIES_TOEDSCOOL] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3 }, + [SPECIES_TOEDSCRUEL] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2 }, + [SPECIES_KLAWF] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 14 }, + [SPECIES_CAPSAKID] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 13 }, [SPECIES_SCOVILLAIN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3 }, - [SPECIES_RELLOR] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 10 }, - [SPECIES_RABSCA] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_FLITTLE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 12 }, + [SPECIES_RELLOR] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 11 }, + [SPECIES_RABSCA] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1 }, + [SPECIES_FLITTLE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 12 }, [SPECIES_ESPATHRA] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_TINKATINK] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_TINKATUFF] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_TINKATON] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_WIGLETT] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 17 }, - [SPECIES_WUGTRIO] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_BOMBIRDIER] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_FINIZEN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 4 }, - [SPECIES_PALAFIN_ZERO] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 4 }, - [SPECIES_PALAFIN_HERO] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 4 }, - [SPECIES_VAROOM] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 13 }, + [SPECIES_TINKATINK] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 10 }, + [SPECIES_TINKATUFF] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 4 }, + [SPECIES_TINKATON] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1 }, + [SPECIES_WIGLETT] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 19 }, + [SPECIES_WUGTRIO] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2 }, + [SPECIES_BOMBIRDIER] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1 }, + [SPECIES_FINIZEN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 7 }, + [SPECIES_PALAFIN_ZERO] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 7 }, + [SPECIES_PALAFIN_HERO] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_VAROOM] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 14 }, [SPECIES_REVAVROOM] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 8 }, - [SPECIES_CYCLIZAR] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_ORTHWORM] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_GLIMMET] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_GLIMMORA] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_GREAVARD] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 4 }, - [SPECIES_HOUNDSTONE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_FLAMIGO] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_CETODDLE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 14 }, + [SPECIES_CYCLIZAR] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1 }, + [SPECIES_ORTHWORM] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3 }, + [SPECIES_GLIMMET] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 16 }, + [SPECIES_GLIMMORA] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2 }, + [SPECIES_GREAVARD] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6 }, + [SPECIES_HOUNDSTONE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1 }, + [SPECIES_FLAMIGO] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2 }, + [SPECIES_CETODDLE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 14 }, [SPECIES_CETITAN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3 }, - [SPECIES_VELUZA] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_DONDOZO] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_TATSUGIRI_CURLY] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 12 }, - [SPECIES_TATSUGIRI_DROOPY] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 12 }, - [SPECIES_TATSUGIRI_STRETCHY] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 12 }, + [SPECIES_VELUZA] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 11 }, + [SPECIES_DONDOZO] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 4 }, + [SPECIES_TATSUGIRI_CURLY] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 14 }, + [SPECIES_TATSUGIRI_DROOPY] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 14 }, + [SPECIES_TATSUGIRI_STRETCHY] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 14 }, [SPECIES_ANNIHILAPE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, [SPECIES_CLODSIRE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 8 }, [SPECIES_FARIGIRAF] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, [SPECIES_DUDUNSPARCE_TWO_SEGMENT] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 10 }, [SPECIES_DUDUNSPARCE_THREE_SEGMENT] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 10 }, [SPECIES_KINGAMBIT] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_GREAT_TUSK] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 4 }, + [SPECIES_GREAT_TUSK] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 5 }, [SPECIES_SCREAM_TAIL] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 7 }, [SPECIES_BRUTE_BONNET] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 5 }, - [SPECIES_FLUTTER_MANE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_FLUTTER_MANE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 5 }, [SPECIES_SLITHER_WING] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_SANDY_SHOCKS] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_IRON_TREADS] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_IRON_BUNDLE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2 }, + [SPECIES_SANDY_SHOCKS] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1 }, + [SPECIES_IRON_TREADS] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1 }, + [SPECIES_IRON_BUNDLE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 4 }, [SPECIES_IRON_HANDS] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3 }, - [SPECIES_IRON_JUGULIS] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_IRON_MOTH] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_IRON_JUGULIS] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2 }, + [SPECIES_IRON_MOTH] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 7 }, [SPECIES_IRON_THORNS] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_FRIGIBAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 5 }, - [SPECIES_ARCTIBAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3 }, - [SPECIES_BAXCALIBUR] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_GIMMIGHOUL_CHEST] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3 }, - [SPECIES_GIMMIGHOUL_ROAMING] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 7 }, + [SPECIES_FRIGIBAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 7 }, + [SPECIES_ARCTIBAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 5 }, + [SPECIES_BAXCALIBUR] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1 }, + [SPECIES_GIMMIGHOUL_CHEST] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2 }, + [SPECIES_GIMMIGHOUL_ROAMING] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 11 }, [SPECIES_GHOLDENGO] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, [SPECIES_WO_CHIEN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_CHIEN_PAO] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_TING_LU] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_CHI_YU] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_CHIEN_PAO] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2 }, + [SPECIES_TING_LU] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2 }, + [SPECIES_CHI_YU] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 10 }, [SPECIES_ROARING_MOON] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, [SPECIES_IRON_VALIANT] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, [SPECIES_KORAIDON] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, @@ -1103,21 +1103,21 @@ const struct MonCoords gMonFrontPicCoords[NUM_SPECIES + 1] = [SPECIES_WALKING_WAKE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, [SPECIES_IRON_LEAVES] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, [SPECIES_DIPPLIN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_POLTCHAGEIST_COUNTERFEIT] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_POLTCHAGEIST_ARTISAN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_SINISTCHA_UNREMARKABLE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_SINISTCHA_MASTERPIECE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_OKIDOGI] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_MUNKIDORI] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_FEZANDIPITI] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_OGERPON_TEAL_MASK] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_OGERPON_WELLSPRING_MASK] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_OGERPON_HEARTHFLAME_MASK] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_OGERPON_CORNERSTONE_MASK] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_OGERPON_TEAL_MASK_TERA] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_OGERPON_WELLSPRING_MASK_TERA] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_OGERPON_HEARTHFLAME_MASK_TERA] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_OGERPON_CORNERSTONE_MASK_TERA] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_POLTCHAGEIST_COUNTERFEIT] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 7 }, + [SPECIES_POLTCHAGEIST_ARTISAN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 7 }, + [SPECIES_SINISTCHA_UNREMARKABLE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 10 }, + [SPECIES_SINISTCHA_MASTERPIECE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 10 }, + [SPECIES_OKIDOGI] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1 }, + [SPECIES_MUNKIDORI] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 5 }, + [SPECIES_FEZANDIPITI] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2 }, + [SPECIES_OGERPON_TEAL_MASK] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_OGERPON_WELLSPRING_MASK] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_OGERPON_HEARTHFLAME_MASK] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_OGERPON_CORNERSTONE_MASK] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_OGERPON_TEAL_MASK_TERA] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_OGERPON_WELLSPRING_MASK_TERA] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_OGERPON_HEARTHFLAME_MASK_TERA] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_OGERPON_CORNERSTONE_MASK_TERA] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, #endif // Megas [SPECIES_VENUSAUR_MEGA] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3 }, @@ -1194,7 +1194,7 @@ const struct MonCoords gMonFrontPicCoords[NUM_SPECIES + 1] = [SPECIES_GOLEM_ALOLAN] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 1 }, [SPECIES_GRIMER_ALOLAN] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 11 }, [SPECIES_MUK_ALOLAN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3 }, - [SPECIES_EXEGGUTOR_ALOLAN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_EXEGGUTOR_ALOLAN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1 }, [SPECIES_MAROWAK_ALOLAN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2 }, // Galarian Forms [SPECIES_MEOWTH_GALARIAN] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 9 }, @@ -1219,24 +1219,24 @@ const struct MonCoords gMonFrontPicCoords[NUM_SPECIES + 1] = [SPECIES_STUNFISK_GALARIAN] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 14 }, #endif // Hisuian Forms - [SPECIES_GROWLITHE_HISUIAN] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 6 }, - [SPECIES_ARCANINE_HISUIAN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2 }, - [SPECIES_VOLTORB_HISUIAN] = { .size = MON_COORDS_SIZE(32, 32), .y_offset = 0 }, - [SPECIES_ELECTRODE_HISUIAN] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 0 }, + [SPECIES_GROWLITHE_HISUIAN] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 11 }, + [SPECIES_ARCANINE_HISUIAN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_VOLTORB_HISUIAN] = { .size = MON_COORDS_SIZE(32, 32), .y_offset = 17 }, + [SPECIES_ELECTRODE_HISUIAN] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 9 }, [SPECIES_TYPHLOSION_HISUIAN] = { .size = MON_COORDS_SIZE(48, 64), .y_offset = 0 }, - [SPECIES_QWILFISH_HISUIAN] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 8 }, - [SPECIES_SNEASEL_HISUIAN] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 7 }, + [SPECIES_QWILFISH_HISUIAN] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 16 }, + [SPECIES_SNEASEL_HISUIAN] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 8 }, #if P_GEN_5_POKEMON == TRUE [SPECIES_SAMUROTT_HISUIAN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_LILLIGANT_HISUIAN] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 1 }, - [SPECIES_ZORUA_HISUIAN] = { .size = MON_COORDS_SIZE(48, 64), .y_offset = 2 }, - [SPECIES_ZOROARK_HISUIAN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1 }, + [SPECIES_LILLIGANT_HISUIAN] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 0 }, + [SPECIES_ZORUA_HISUIAN] = { .size = MON_COORDS_SIZE(48, 64), .y_offset = 1 }, + [SPECIES_ZOROARK_HISUIAN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, [SPECIES_BRAVIARY_HISUIAN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, #endif #if P_GEN_6_POKEMON == TRUE - [SPECIES_SLIGGOO_HISUIAN] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 6 }, - [SPECIES_GOODRA_HISUIAN] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 0 }, - [SPECIES_AVALUGG_HISUIAN] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 5 }, + [SPECIES_SLIGGOO_HISUIAN] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 7 }, + [SPECIES_GOODRA_HISUIAN] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 2 }, + [SPECIES_AVALUGG_HISUIAN] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 6 }, #endif #if P_GEN_7_POKEMON == TRUE [SPECIES_DECIDUEYE_HISUIAN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, @@ -1259,7 +1259,7 @@ const struct MonCoords gMonFrontPicCoords[NUM_SPECIES + 1] = [SPECIES_PIKACHU_PARTNER_CAP] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 9 }, [SPECIES_PIKACHU_WORLD_CAP] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 9 }, // Pichu - [SPECIES_PICHU_SPIKY_EARED] = { .size = MON_COORDS_SIZE(32, 40), .y_offset = 14 }, + [SPECIES_PICHU_SPIKY_EARED] = { .size = MON_COORDS_SIZE(32, 40), .y_offset = 13 }, // Unown [SPECIES_UNOWN_B] = { .size = MON_COORDS_SIZE(24, 32), .y_offset = 16 }, [SPECIES_UNOWN_C] = { .size = MON_COORDS_SIZE(32, 32), .y_offset = 16 }, @@ -1314,7 +1314,7 @@ const struct MonCoords gMonFrontPicCoords[NUM_SPECIES + 1] = [SPECIES_ROTOM_WASH] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 7 }, [SPECIES_ROTOM_FROST] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 4 }, [SPECIES_ROTOM_FAN] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 8 }, - [SPECIES_ROTOM_MOW] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 12 }, + [SPECIES_ROTOM_MOW] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 3 }, // Origin Forme [SPECIES_DIALGA_ORIGIN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, [SPECIES_PALKIA_ORIGIN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, @@ -1343,7 +1343,7 @@ const struct MonCoords gMonFrontPicCoords[NUM_SPECIES + 1] = #if P_GEN_5_POKEMON == TRUE // Basculin [SPECIES_BASCULIN_BLUE_STRIPED] = { .size = MON_COORDS_SIZE(56, 40), .y_offset = 16 }, - [SPECIES_BASCULIN_WHITE_STRIPED] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 10 }, + [SPECIES_BASCULIN_WHITE_STRIPED] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 12 }, // Darmanitan [SPECIES_DARMANITAN_ZEN_MODE] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 14 }, [SPECIES_DARMANITAN_GALARIAN_ZEN_MODE] = { .size = MON_COORDS_SIZE(48, 64), .y_offset = 2 }, @@ -1453,7 +1453,7 @@ const struct MonCoords gMonFrontPicCoords[NUM_SPECIES + 1] = [SPECIES_ROCKRUFF_OWN_TEMPO] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 11 }, // Lycanroc [SPECIES_LYCANROC_MIDNIGHT] = { .size = MON_COORDS_SIZE(56, 61), .y_offset = 0 }, - [SPECIES_LYCANROC_DUSK] = { .size = MON_COORDS_SIZE(57, 58), .y_offset = 6 }, + [SPECIES_LYCANROC_DUSK] = { .size = MON_COORDS_SIZE(57, 58), .y_offset = 5 }, // Wishiwashi [SPECIES_WISHIWASHI_SCHOOL] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 4 }, // Silvally @@ -1481,13 +1481,13 @@ const struct MonCoords gMonFrontPicCoords[NUM_SPECIES + 1] = [SPECIES_MINIOR_METEOR_BLUE] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 14 }, [SPECIES_MINIOR_METEOR_INDIGO] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 14 }, [SPECIES_MINIOR_METEOR_VIOLET] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 14 }, - [SPECIES_MINIOR_CORE_RED] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 14 }, - [SPECIES_MINIOR_CORE_ORANGE] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 14 }, - [SPECIES_MINIOR_CORE_YELLOW] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 14 }, - [SPECIES_MINIOR_CORE_GREEN] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 14 }, - [SPECIES_MINIOR_CORE_BLUE] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 14 }, - [SPECIES_MINIOR_CORE_INDIGO] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 14 }, - [SPECIES_MINIOR_CORE_VIOLET] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 14 }, + [SPECIES_MINIOR_CORE_RED] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 16 }, + [SPECIES_MINIOR_CORE_ORANGE] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 16 }, + [SPECIES_MINIOR_CORE_YELLOW] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 16 }, + [SPECIES_MINIOR_CORE_GREEN] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 16 }, + [SPECIES_MINIOR_CORE_BLUE] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 16 }, + [SPECIES_MINIOR_CORE_INDIGO] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 16 }, + [SPECIES_MINIOR_CORE_VIOLET] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 16 }, // Mimikyu [SPECIES_MIMIKYU_BUSTED] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 12 }, // Necrozma @@ -1528,44 +1528,44 @@ const struct MonCoords gMonFrontPicCoords[NUM_SPECIES + 1] = [SPECIES_CALYREX_ICE_RIDER] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, [SPECIES_CALYREX_SHADOW_RIDER] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, // Enamorus - [SPECIES_ENAMORUS_THERIAN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_ENAMORUS_THERIAN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3 }, // Basculegion - [SPECIES_BASCULEGION_FEMALE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_BASCULEGION_FEMALE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 9 }, // Gigantamax Forms - [SPECIES_VENUSAUR_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 5 }, - [SPECIES_CHARIZARD_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_BLASTOISE_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 4 }, - [SPECIES_BUTTERFREE_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 10 }, - [SPECIES_PIKACHU_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1 }, - [SPECIES_MEOWTH_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3 }, - [SPECIES_MACHAMP_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_GENGAR_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 8 }, - [SPECIES_KINGLER_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_LAPRAS_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_EEVEE_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6 }, - [SPECIES_SNORLAX_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_GARBODOR_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_MELMETAL_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_RILLABOOM_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_CINDERACE_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_INTELEON_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_CORVIKNIGHT_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3 }, - [SPECIES_ORBEETLE_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_DREDNAW_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_COALOSSAL_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_FLAPPLE_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2 }, - [SPECIES_APPLETUN_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2 }, - [SPECIES_SANDACONDA_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_TOXTRICITY_AMPED_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_TOXTRICITY_LOW_KEY_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_CENTISKORCH_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 5 }, - [SPECIES_HATTERENE_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_GRIMMSNARL_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_ALCREMIE_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_COPPERAJAH_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_DURALUDON_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_URSHIFU_SINGLE_STRIKE_STYLE_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, - [SPECIES_URSHIFU_RAPID_STRIKE_STYLE_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_VENUSAUR_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 5 }, + [SPECIES_CHARIZARD_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_BLASTOISE_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 5 }, + [SPECIES_BUTTERFREE_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3 }, + [SPECIES_PIKACHU_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2 }, + [SPECIES_MEOWTH_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3 }, + [SPECIES_MACHAMP_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_GENGAR_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 7 }, + [SPECIES_KINGLER_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_LAPRAS_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_EEVEE_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 8 }, + [SPECIES_SNORLAX_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_GARBODOR_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2 }, + [SPECIES_MELMETAL_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1 }, + [SPECIES_RILLABOOM_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_CINDERACE_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_INTELEON_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_CORVIKNIGHT_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2 }, + [SPECIES_ORBEETLE_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2 }, + [SPECIES_DREDNAW_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_COALOSSAL_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_FLAPPLE_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3 }, + [SPECIES_APPLETUN_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3 }, + [SPECIES_SANDACONDA_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1 }, + [SPECIES_TOXTRICITY_AMPED_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_TOXTRICITY_LOW_KEY_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_CENTISKORCH_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 5 }, + [SPECIES_HATTERENE_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_GRIMMSNARL_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1 }, + [SPECIES_ALCREMIE_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2 }, + [SPECIES_COPPERAJAH_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2 }, + [SPECIES_DURALUDON_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_URSHIFU_SINGLE_STRIKE_STYLE_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_URSHIFU_RAPID_STRIKE_STYLE_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, #endif // Egg [SPECIES_EGG] = { .size = MON_COORDS_SIZE(24, 24), .y_offset = 20 }, diff --git a/src/event_object_movement.c b/src/event_object_movement.c index cdd72d668c..6cd6955031 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -8965,3 +8965,19 @@ u8 MovementAction_Fly_Finish(struct ObjectEvent *objectEvent, struct Sprite *spr { return TRUE; } + +bool8 MovementAction_EmoteX_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) +{ + ObjectEventGetLocalIdAndMap(objectEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); + FieldEffectStart(FLDEFF_X_ICON); + sprite->sActionFuncId = 1; + return TRUE; +} + +bool8 MovementAction_EmoteDoubleExclamationMark_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) +{ + ObjectEventGetLocalIdAndMap(objectEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); + FieldEffectStart(FLDEFF_DOUBLE_EXCL_MARK_ICON); + sprite->sActionFuncId = 1; + return TRUE; +} diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index 6a5422046e..d5c252415d 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -28,6 +28,7 @@ #include "start_menu.h" #include "trainer_see.h" #include "trainer_hill.h" +#include "vs_seeker.h" #include "wild_encounter.h" #include "constants/event_bg.h" #include "constants/event_objects.h" @@ -615,6 +616,11 @@ static bool8 TryStartStepCountScript(u16 metatileBehavior) ScriptContext_SetupScript(MossdeepCity_SpaceCenter_2F_EventScript_RivalRayquazaCall); return TRUE; } + if (UpdateVsSeekerStepCounter()) + { + ScriptContext_SetupScript(EventScript_VsSeekerChargingDone); + return TRUE; + } } if (SafariZoneTakeStep() == TRUE) diff --git a/src/field_effect.c b/src/field_effect.c index cfb5021550..2d2aa174ff 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -31,6 +31,7 @@ #include "constants/metatile_behaviors.h" #include "constants/rgb.h" #include "constants/songs.h" +#include "constants/map_types.h" #define subsprite_table(ptr) {.subsprites = ptr, .subspriteCount = (sizeof ptr) / (sizeof(struct Subsprite))} @@ -231,6 +232,12 @@ static void SpriteCB_DeoxysRockFragment(struct Sprite *sprite); static void Task_MoveDeoxysRock(u8 taskId); +static void Task_FldEffUseVsSeeker(u8 taskId); +static void UseVsSeeker_StopPlayerMovement(struct Task *task); +static void UseVsSeeker_DoPlayerAnimation(struct Task *task); +static void UseVsSeeker_ResetPlayerGraphics(struct Task *task); +static void UseVsSeeker_CleanUpFieldEffect(struct Task *task); + // Static RAM declarations static u8 sActiveList[32]; @@ -3911,3 +3918,68 @@ static void Task_MoveDeoxysRock(u8 taskId) #undef tVelocityY #undef tMoveSteps #undef tObjEventId + +static void (*const sUseVsSeekerEffectFuncs[])(struct Task *task) = { + UseVsSeeker_StopPlayerMovement, + UseVsSeeker_DoPlayerAnimation, + UseVsSeeker_ResetPlayerGraphics, + UseVsSeeker_CleanUpFieldEffect +}; + +u32 FldEff_UseVsSeeker(void) +{ + CreateTask(Task_FldEffUseVsSeeker, 0xFF); + return 0; +} + +static void Task_FldEffUseVsSeeker(u8 taskId) +{ + sUseVsSeekerEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +static void UseVsSeeker_StopPlayerMovement(struct Task *task) +{ + LockPlayerFieldControls(); + FreezeObjectEvents(); + gPlayerAvatar.preventStep = TRUE; + task->data[0]++; +} + +static void UseVsSeeker_DoPlayerAnimation(struct Task *task) +{ + struct ObjectEvent * playerObj = &gObjectEvents[gPlayerAvatar.objectEventId]; + if ((ObjectEventIsMovementOverridden(playerObj) && (!(ObjectEventClearHeldMovementIfFinished(playerObj))))) + return; + + if (gMapHeader.mapType != MAP_TYPE_UNDERWATER) + { + SetPlayerAvatarFieldMove(); + ObjectEventSetHeldMovement(playerObj, MOVEMENT_ACTION_START_ANIM_IN_DIRECTION); + } + task->data[0]++; +} + +static void UseVsSeeker_ResetPlayerGraphics(struct Task *task) { + struct ObjectEvent* playerObj = &gObjectEvents[gPlayerAvatar.objectEventId]; + + if (!ObjectEventClearHeldMovementIfFinished(playerObj)) + return; + + if (gMapHeader.mapType != MAP_TYPE_UNDERWATER) + { + ObjectEventSetGraphicsId(&gObjectEvents[gPlayerAvatar.objectEventId], GetPlayerAvatarGraphicsIdByCurrentState()); + ObjectEventForceSetHeldMovement(playerObj, GetFaceDirectionMovementAction(playerObj->facingDirection)); + } + task->data[0]++; +} + +static void UseVsSeeker_CleanUpFieldEffect(struct Task *task) +{ + struct ObjectEvent * playerObj = &gObjectEvents[gPlayerAvatar.objectEventId]; + if (!ObjectEventClearHeldMovementIfFinished(playerObj)) + return; + + gPlayerAvatar.preventStep = FALSE; + FieldEffectActiveListRemove(FLDEFF_USE_VS_SEEKER); + DestroyTask(FindTaskIdByFunc(Task_FldEffUseVsSeeker)); +} diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c index 0f087799e3..99cab7fd77 100644 --- a/src/field_player_avatar.c +++ b/src/field_player_avatar.c @@ -241,7 +241,8 @@ static const u8 sRivalAvatarGfxIds[][2] = [PLAYER_AVATAR_STATE_UNDERWATER] = {OBJ_EVENT_GFX_BRENDAN_UNDERWATER, OBJ_EVENT_GFX_MAY_UNDERWATER}, [PLAYER_AVATAR_STATE_FIELD_MOVE] = {OBJ_EVENT_GFX_RIVAL_BRENDAN_FIELD_MOVE, OBJ_EVENT_GFX_RIVAL_MAY_FIELD_MOVE}, [PLAYER_AVATAR_STATE_FISHING] = {OBJ_EVENT_GFX_BRENDAN_FISHING, OBJ_EVENT_GFX_MAY_FISHING}, - [PLAYER_AVATAR_STATE_WATERING] = {OBJ_EVENT_GFX_BRENDAN_WATERING, OBJ_EVENT_GFX_MAY_WATERING} + [PLAYER_AVATAR_STATE_WATERING] = {OBJ_EVENT_GFX_BRENDAN_WATERING, OBJ_EVENT_GFX_MAY_WATERING}, + [PLAYER_AVATAR_STATE_VSSEEKER] = {OBJ_EVENT_GFX_RIVAL_BRENDAN_FIELD_MOVE, OBJ_EVENT_GFX_RIVAL_MAY_FIELD_MOVE}, }; static const u8 sPlayerAvatarGfxIds[][2] = @@ -254,6 +255,7 @@ static const u8 sPlayerAvatarGfxIds[][2] = [PLAYER_AVATAR_STATE_FIELD_MOVE] = {OBJ_EVENT_GFX_BRENDAN_FIELD_MOVE, OBJ_EVENT_GFX_MAY_FIELD_MOVE}, [PLAYER_AVATAR_STATE_FISHING] = {OBJ_EVENT_GFX_BRENDAN_FISHING, OBJ_EVENT_GFX_MAY_FISHING}, [PLAYER_AVATAR_STATE_WATERING] = {OBJ_EVENT_GFX_BRENDAN_WATERING, OBJ_EVENT_GFX_MAY_WATERING}, + [PLAYER_AVATAR_STATE_VSSEEKER] = {OBJ_EVENT_GFX_BRENDAN_FIELD_MOVE, OBJ_EVENT_GFX_MAY_FIELD_MOVE}, }; static const u8 sFRLGAvatarGfxIds[GENDER_COUNT] = diff --git a/src/item_use.c b/src/item_use.c index 25b5b988fb..5024314f31 100644 --- a/src/item_use.c +++ b/src/item_use.c @@ -38,11 +38,13 @@ #include "string_util.h" #include "task.h" #include "text.h" +#include "vs_seeker.h" #include "constants/event_bg.h" #include "constants/event_objects.h" #include "constants/item_effects.h" #include "constants/items.h" #include "constants/songs.h" +#include "constants/map_types.h" static void SetUpItemUseCallback(u8); static void FieldCB_UseItemOnField(void); @@ -75,6 +77,7 @@ static void Task_CloseCantUseKeyItemMessage(u8); static void SetDistanceOfClosestHiddenItem(u8, s16, s16); static void CB2_OpenPokeblockFromBag(void); static void ItemUseOnFieldCB_Honey(u8 taskId); +static bool32 IsValidLocationForVsSeeker(void); static bool32 CannotUseBagBattleItem(u16 itemId); // EWRAM variables @@ -1315,7 +1318,7 @@ void ItemUseOutOfBattle_FormChange_ConsumedOnUse(u8 taskId) } void ItemUseOutOfBattle_RotomCatalog(u8 taskId) -{ +{ if (!gTasks[taskId].tUsingRegisteredKeyItem) { gItemUseCB = ItemUseCB_RotomCatalog; @@ -1330,7 +1333,7 @@ void ItemUseOutOfBattle_RotomCatalog(u8 taskId) } void ItemUseOutOfBattle_ZygardeCube(u8 taskId) -{ +{ if (!gTasks[taskId].tUsingRegisteredKeyItem) { gItemUseCB = ItemUseCB_ZygardeCube; @@ -1379,4 +1382,68 @@ void ItemUseOutOfBattle_CannotUse(u8 taskId) DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].tUsingRegisteredKeyItem); } +static bool32 IsValidLocationForVsSeeker(void) +{ + u16 mapGroup = gSaveBlock1Ptr->location.mapGroup; + u16 mapNum = gSaveBlock1Ptr->location.mapNum; + u16 mapType = gMapHeader.mapType; + + typedef struct { + u16 mapGroup; + u16 mapNum; + } Location; + + u32 i; + Location validIndoorLocations[] = + { + { MAP_GROUP(MT_PYRE_SUMMIT), MAP_NUM(MT_PYRE_SUMMIT) }, + { MAP_GROUP(SAFARI_ZONE_NORTH), MAP_NUM(SAFARI_ZONE_NORTH) }, + { MAP_GROUP(SAFARI_ZONE_NORTHEAST), MAP_NUM(SAFARI_ZONE_NORTHEAST) }, + { MAP_GROUP(SAFARI_ZONE_NORTHWEST), MAP_NUM(SAFARI_ZONE_NORTHWEST) }, + { MAP_GROUP(SAFARI_ZONE_SOUTH), MAP_NUM(SAFARI_ZONE_SOUTH) }, + { MAP_GROUP(SAFARI_ZONE_SOUTHEAST), MAP_NUM(SAFARI_ZONE_SOUTHEAST) }, + { MAP_GROUP(SAFARI_ZONE_SOUTHWEST), MAP_NUM(SAFARI_ZONE_SOUTHWEST) }, + { MAP_GROUP(SKY_PILLAR_TOP), MAP_NUM(SKY_PILLAR_TOP) }, + { MAP_GROUP(SOUTHERN_ISLAND_EXTERIOR), MAP_NUM(SOUTHERN_ISLAND_EXTERIOR) }, + { MAP_GROUP(SOUTHERN_ISLAND_INTERIOR), MAP_NUM(SOUTHERN_ISLAND_INTERIOR) }, + { MAP_GROUP(RUSTBORO_CITY_GYM), MAP_NUM(RUSTBORO_CITY_GYM) }, + { MAP_GROUP(DEWFORD_TOWN_GYM), MAP_NUM(DEWFORD_TOWN_GYM) }, + { MAP_GROUP(MAUVILLE_CITY_GYM), MAP_NUM(MAUVILLE_CITY_GYM) }, + { MAP_GROUP(LAVARIDGE_TOWN_GYM_1F), MAP_NUM(LAVARIDGE_TOWN_GYM_1F) }, + { MAP_GROUP(LAVARIDGE_TOWN_GYM_B1F), MAP_NUM(LAVARIDGE_TOWN_GYM_B1F) }, + { MAP_GROUP(PETALBURG_CITY_GYM), MAP_NUM(PETALBURG_CITY_GYM) }, + { MAP_GROUP(FORTREE_CITY_GYM), MAP_NUM(FORTREE_CITY_GYM) }, + { MAP_GROUP(MOSSDEEP_CITY_GYM), MAP_NUM(MOSSDEEP_CITY_GYM) }, + { MAP_GROUP(SOOTOPOLIS_CITY_GYM_1F), MAP_NUM(SOOTOPOLIS_CITY_GYM_1F) }, + { MAP_GROUP(SOOTOPOLIS_CITY_GYM_B1F), MAP_NUM(SOOTOPOLIS_CITY_GYM_B1F) }, + }; + + if (IsMapTypeOutdoors(mapType)) + return TRUE; + + for (i = 0; i < ARRAY_COUNT(validIndoorLocations); i++) + { + if (mapNum == validIndoorLocations[i].mapNum && mapGroup == validIndoorLocations[i].mapGroup) + return TRUE; + } + + return FALSE; +} + +void FieldUseFunc_VsSeeker(u8 taskId) +{ + if (IsValidLocationForVsSeeker()) + { + sItemUseOnFieldCB = Task_InitVsSeekerAndCheckForTrainersOnScreen; + SetUpItemUseOnFieldCallback(taskId); + } + else + DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[3]); +} + +void Task_ItemUse_CloseMessageBoxAndReturnToField_VsSeeker(u8 taskId) +{ + Task_CloseCantUseKeyItemMessage(taskId); +} + #undef tUsingRegisteredKeyItem diff --git a/src/overworld.c b/src/overworld.c index bf2bcf5ace..09e242b217 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -58,6 +58,7 @@ #include "tv.h" #include "scanline_effect.h" #include "wild_encounter.h" +#include "vs_seeker.h" #include "frontier_util.h" #include "constants/abilities.h" #include "constants/layouts.h" @@ -818,6 +819,10 @@ void LoadMapFromCameraTransition(u8 mapGroup, u8 mapNum) ResetCyclingRoadChallengeData(); RestartWildEncounterImmunitySteps(); TryUpdateRandomTrainerRematches(mapGroup, mapNum); + +if (I_VS_SEEKER_CHARGING != 0) + MapResetTrainerRematches(mapGroup, mapNum); + DoTimeBasedEvents(); SetSavedWeatherFromCurrMapHeader(); ChooseAmbientCrySpecies(); @@ -868,6 +873,10 @@ static void LoadMapFromWarp(bool32 a1) ResetCyclingRoadChallengeData(); RestartWildEncounterImmunitySteps(); TryUpdateRandomTrainerRematches(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum); + +if (I_VS_SEEKER_CHARGING != 0) + MapResetTrainerRematches(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum); + if (a1 != TRUE) DoTimeBasedEvents(); SetSavedWeatherFromCurrMapHeader(); diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index 294d42b26e..18ea0824e1 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -5276,14 +5276,30 @@ static bool8 CalculateMoves(void) { sStatsMovesTMHM_ID[numTMHMMoves] = (ITEM_TM01 + j); numTMHMMoves++; + + sStatsMoves[movesTotal] = move; + movesTotal++; break; } } - if (j >= NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES) - numTutorMoves++; + } - sStatsMoves[movesTotal] = move; - movesTotal++; + for (i = 0; gTeachableLearnsets[species][i] != MOVE_UNAVAILABLE; i++) + { + move = gTeachableLearnsets[species][i]; + for (j = 0; j < NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES; j++) + { + if (ItemIdToBattleMoveId(ITEM_TM01 + j) == move) + break; + } + + if (j >= NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES) + { + numTutorMoves++; + + sStatsMoves[movesTotal] = move; + movesTotal++; + } } sPokedexView->numEggMoves = numEggMoves; diff --git a/src/pokemon.c b/src/pokemon.c index a9c22ae8e7..d4585d8e90 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -2207,13 +2207,13 @@ const u8 sMonFrontAnimIdsTable[NUM_SPECIES - 1] = [SPECIES_BLASTOISE - 1] = ANIM_V_SHAKE_TWICE, [SPECIES_CATERPIE - 1] = ANIM_SWING_CONCAVE, [SPECIES_METAPOD - 1] = ANIM_SWING_CONCAVE, - [SPECIES_BUTTERFREE - 1] = ANIM_H_SLIDE_WOBBLE, + [SPECIES_BUTTERFREE - 1] = ANIM_V_SLIDE_WOBBLE, [SPECIES_WEEDLE - 1] = ANIM_H_SLIDE_SLOW, [SPECIES_KAKUNA - 1] = ANIM_GLOW_ORANGE, [SPECIES_BEEDRILL - 1] = ANIM_ZIGZAG_SLOW, [SPECIES_PIDGEY - 1] = ANIM_V_STRETCH, [SPECIES_PIDGEOTTO - 1] = ANIM_V_STRETCH, - [SPECIES_PIDGEOT - 1] = ANIM_FRONT_FLIP, + [SPECIES_PIDGEOT - 1] = ANIM_GROW_VIBRATE, [SPECIES_RATTATA - 1] = ANIM_H_JUMPS, [SPECIES_RATICATE - 1] = ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL, [SPECIES_SPEAROW - 1] = ANIM_V_JUMPS_SMALL, @@ -2268,7 +2268,7 @@ const u8 sMonFrontAnimIdsTable[NUM_SPECIES - 1] = [SPECIES_WEEPINBELL - 1] = ANIM_SWING_CONVEX, [SPECIES_VICTREEBEL - 1] = ANIM_H_JUMPS_V_STRETCH, [SPECIES_TENTACOOL - 1] = ANIM_V_SQUISH_AND_BOUNCE, - [SPECIES_TENTACRUEL - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_TENTACRUEL - 1] = ANIM_V_SLIDE_WOBBLE, [SPECIES_GEODUDE - 1] = ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL, [SPECIES_GRAVELER - 1] = ANIM_V_SHAKE, [SPECIES_GOLEM - 1] = ANIM_ROTATE_UP_SLAM_DOWN, @@ -2281,35 +2281,35 @@ const u8 sMonFrontAnimIdsTable[NUM_SPECIES - 1] = [SPECIES_FARFETCHD - 1] = ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL, [SPECIES_DODUO - 1] = ANIM_H_SHAKE_SLOW, [SPECIES_DODRIO - 1] = ANIM_V_STRETCH, - [SPECIES_SEEL - 1] = ANIM_H_STRETCH, + [SPECIES_SEEL - 1] = ANIM_H_SLIDE_SLOW, [SPECIES_DEWGONG - 1] = ANIM_V_SQUISH_AND_BOUNCE_SLOW, [SPECIES_GRIMER - 1] = ANIM_H_SLIDE_SLOW, - [SPECIES_MUK - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_MUK - 1] = ANIM_DEEP_V_SQUISH_AND_BOUNCE, [SPECIES_SHELLDER - 1] = ANIM_TWIST, - [SPECIES_CLOYSTER - 1] = ANIM_H_SLIDE_WOBBLE, - [SPECIES_GASTLY - 1] = ANIM_CIRCLE_C_CLOCKWISE_SLOW, + [SPECIES_CLOYSTER - 1] = ANIM_V_SHAKE_TWICE, + [SPECIES_GASTLY - 1] = ANIM_SHRINK_GROW, [SPECIES_HAUNTER - 1] = ANIM_FLICKER_INCREASING, [SPECIES_GENGAR - 1] = ANIM_GROW_IN_STAGES, [SPECIES_ONIX - 1] = ANIM_H_SHAKE, [SPECIES_DROWZEE - 1] = ANIM_V_STRETCH, - [SPECIES_HYPNO - 1] = ANIM_H_SLIDE_SLOW, - [SPECIES_KRABBY - 1] = ANIM_H_SLIDE, - [SPECIES_KINGLER - 1] = ANIM_H_SLIDE_SLOW, - [SPECIES_VOLTORB - 1] = ANIM_V_SQUISH_AND_BOUNCE, - [SPECIES_ELECTRODE - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_HYPNO - 1] = ANIM_GROW_VIBRATE, + [SPECIES_KRABBY - 1] = ANIM_H_SLIDE_SLOW, + [SPECIES_KINGLER - 1] = ANIM_V_SHAKE_TWICE, + [SPECIES_VOLTORB - 1] = ANIM_SWING_CONCAVE, + [SPECIES_ELECTRODE - 1] = ANIM_SHRINK_GROW_VIBRATE_SLOW, [SPECIES_EXEGGCUTE - 1] = ANIM_H_SLIDE_SLOW, [SPECIES_EXEGGUTOR - 1] = ANIM_H_JUMPS_V_STRETCH, - [SPECIES_CUBONE - 1] = ANIM_V_JUMPS_SMALL, + [SPECIES_CUBONE - 1] = ANIM_V_SQUISH_AND_BOUNCE, [SPECIES_MAROWAK - 1] = ANIM_BOUNCE_ROTATE_TO_SIDES, - [SPECIES_HITMONLEE - 1] = ANIM_H_STRETCH, + [SPECIES_HITMONLEE - 1] = ANIM_H_JUMPS_V_STRETCH, [SPECIES_HITMONCHAN - 1] = ANIM_GROW_VIBRATE, - [SPECIES_LICKITUNG - 1] = ANIM_V_SQUISH_AND_BOUNCE_SLOW, + [SPECIES_LICKITUNG - 1] = ANIM_V_STRETCH, [SPECIES_KOFFING - 1] = ANIM_V_SLIDE_WOBBLE_SMALL, [SPECIES_WEEZING - 1] = ANIM_V_SLIDE, [SPECIES_RHYHORN - 1] = ANIM_V_SHAKE, - [SPECIES_RHYDON - 1] = ANIM_H_SHAKE, + [SPECIES_RHYDON - 1] = ANIM_V_STRETCH, [SPECIES_CHANSEY - 1] = ANIM_V_SQUISH_AND_BOUNCE, - [SPECIES_TANGELA - 1] = ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL, + [SPECIES_TANGELA - 1] = ANIM_H_JUMPS_V_STRETCH, [SPECIES_KANGASKHAN - 1] = ANIM_V_STRETCH, [SPECIES_HORSEA - 1] = ANIM_V_JUMPS_SMALL, [SPECIES_SEADRA - 1] = ANIM_V_SLIDE, @@ -2435,7 +2435,7 @@ const u8 sMonFrontAnimIdsTable[NUM_SPECIES - 1] = [SPECIES_STANTLER - 1] = ANIM_V_SQUISH_AND_BOUNCE, [SPECIES_SMEARGLE - 1] = ANIM_H_JUMPS_V_STRETCH, [SPECIES_TYROGUE - 1] = ANIM_BACK_AND_LUNGE, - [SPECIES_HITMONTOP - 1] = ANIM_H_VIBRATE, + [SPECIES_HITMONTOP - 1] = ANIM_SWING_CONCAVE, [SPECIES_SMOOCHUM - 1] = ANIM_GROW_VIBRATE, [SPECIES_ELEKID - 1] = ANIM_FLASH_YELLOW, [SPECIES_MAGBY - 1] = ANIM_V_SQUISH_AND_BOUNCE, @@ -3653,7 +3653,8 @@ static const u8 sMonAnimationDelayTable[NUM_SPECIES - 1] = [SPECIES_HAUNTER - 1] = 23, [SPECIES_DROWZEE - 1] = 48, [SPECIES_HYPNO - 1] = 40, - [SPECIES_HITMONCHAN - 1] = 25, + [SPECIES_KINGLER - 1] = 4, + [SPECIES_CUBONE - 1] = 30, [SPECIES_SCYTHER - 1] = 10, [SPECIES_TAUROS - 1] = 10, [SPECIES_TYPHLOSION - 1] = 20, diff --git a/src/trainer_see.c b/src/trainer_see.c index 718afb19d1..ee10747cdf 100644 --- a/src/trainer_see.c +++ b/src/trainer_see.c @@ -62,6 +62,8 @@ EWRAM_DATA u8 gApproachingTrainerId = 0; static const u8 sEmotion_ExclamationMarkGfx[] = INCBIN_U8("graphics/field_effects/pics/emotion_exclamation.4bpp"); static const u8 sEmotion_QuestionMarkGfx[] = INCBIN_U8("graphics/field_effects/pics/emotion_question.4bpp"); static const u8 sEmotion_HeartGfx[] = INCBIN_U8("graphics/field_effects/pics/emotion_heart.4bpp"); +static const u8 sEmotion_DoubleExclamationMarkGfx[] = INCBIN_U8("graphics/field_effects/pics/emotion_double_exclamation.4bpp"); +static const u8 sEmotion_XGfx[] = INCBIN_U8("graphics/field_effects/pics/emote_x.4bpp"); static u8 (*const sDirectionalApproachDistanceFuncs[])(struct ObjectEvent *trainerObj, s16 range, s16 x, s16 y) = { @@ -136,6 +138,14 @@ static const struct SpriteFrameImage sSpriteImageTable_ExclamationQuestionMark[] { .data = sEmotion_QuestionMarkGfx, .size = sizeof(sEmotion_QuestionMarkGfx) + }, + { + .data = sEmotion_DoubleExclamationMarkGfx, + .size = sizeof(sEmotion_DoubleExclamationMarkGfx) + }, + { + .data = sEmotion_XGfx, + .size = sizeof(sEmotion_XGfx) } }; @@ -159,10 +169,25 @@ static const union AnimCmd sSpriteAnim_Icons2[] = ANIMCMD_END }; + +static const union AnimCmd sSpriteAnim_Icons3[] = +{ + ANIMCMD_FRAME(2, 60), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_Icons4[] = +{ + ANIMCMD_FRAME(3, 60), + ANIMCMD_END +}; + static const union AnimCmd *const sSpriteAnimTable_Icons[] = { sSpriteAnim_Icons1, - sSpriteAnim_Icons2 + sSpriteAnim_Icons2, + sSpriteAnim_Icons3, + sSpriteAnim_Icons4 }; static const struct SpriteTemplate sSpriteTemplate_ExclamationQuestionMark = @@ -731,6 +756,27 @@ u8 FldEff_HeartIcon(void) return 0; } + +u8 FldEff_DoubleExclMarkIcon(void) +{ + u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_ExclamationQuestionMark, 0, 0, 0x53); + + if (spriteId != MAX_SPRITES) + SetIconSpriteData(&gSprites[spriteId], FLDEFF_EXCLAMATION_MARK_ICON, 2); + + return 0; +} + +u8 FldEff_XIcon(void) +{ + u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_ExclamationQuestionMark, 0, 0, 0x53); + + if (spriteId != MAX_SPRITES) + SetIconSpriteData(&gSprites[spriteId], FLDEFF_EXCLAMATION_MARK_ICON, 3); + + return 0; +} + static void SetIconSpriteData(struct Sprite *sprite, u16 fldEffId, u8 spriteAnimNum) { sprite->oam.priority = 1; diff --git a/src/vs_seeker.c b/src/vs_seeker.c new file mode 100644 index 0000000000..0b58b9bac3 --- /dev/null +++ b/src/vs_seeker.c @@ -0,0 +1,793 @@ +#include "global.h" +#include "task.h" +#include "event_object_movement.h" +#include "item_use.h" +#include "event_scripts.h" +#include "event_data.h" +#include "script.h" +#include "event_object_lock.h" +#include "field_specials.h" +#include "item.h" +#include "item_menu.h" +#include "field_effect.h" +#include "script_movement.h" +#include "battle.h" +#include "battle_setup.h" +#include "random.h" +#include "field_player_avatar.h" +#include "vs_seeker.h" +#include "menu.h" +#include "string_util.h" +#include "tv.h" +#include "malloc.h" +#include "field_screen_effect.h" +#include "gym_leader_rematch.h" +#include "sound.h" +#include "constants/event_object_movement.h" +#include "constants/event_objects.h" +#include "constants/items.h" +#include "constants/maps.h" +#include "constants/songs.h" +#include "constants/trainer_types.h" +#include "constants/field_effects.h" + +enum +{ + VSSEEKER_NOT_CHARGED, + VSSEEKER_NO_ONE_IN_RANGE, + VSSEEKER_CAN_USE, +}; + +typedef enum +{ + VSSEEKER_SINGLE_RESP_RAND, + VSSEEKER_SINGLE_RESP_NO, + VSSEEKER_SINGLE_RESP_YES +} VsSeekerSingleRespCode; + +typedef enum +{ + VSSEEKER_RESPONSE_NO_RESPONSE, + VSSEEKER_RESPONSE_UNFOUGHT_TRAINERS, + VSSEEKER_RESPONSE_FOUND_REMATCHES +} VsSeekerResponseCode; + +struct VsSeekerTrainerInfo +{ + const u8 *script; + u16 trainerIdx; + u8 localId; + u8 objectEventId; + s16 xCoord; + s16 yCoord; + u8 graphicsId; +}; + +struct VsSeekerStruct +{ + struct VsSeekerTrainerInfo trainerInfo[OBJECT_EVENTS_COUNT]; + u16 trainerIdxArray[OBJECT_EVENTS_COUNT]; + u8 runningBehaviourEtcArray[OBJECT_EVENTS_COUNT]; + u8 numRematchableTrainers; + u8 trainerHasNotYetBeenFought:1; + u8 trainerDoesNotWantRematch:1; + u8 trainerWantsRematch:1; + u8 responseCode:5; +}; + +// static declarations +static EWRAM_DATA struct VsSeekerStruct *sVsSeeker = NULL; + +static void VsSeekerResetInBagStepCounter(void); +static void VsSeekerResetChargingStepCounter(void); +static void Task_ResetObjectsRematchWantedState(u8 taskId); +static void ResetMovementOfRematchableTrainers(void); +static void Task_VsSeekerFrameCountdown(u8 taskId); +static void Task_VsSeeker_PlaySoundAndGetResponseCode(u8 taskId); +static void GatherNearbyTrainerInfo(void); +static void Task_VsSeeker_ShowResponseToPlayer(u8 taskId); +static bool8 CanUseVsSeeker(void); +static u8 GetVsSeekerResponseInArea(void); +static u8 GetResponseMovementTypeFromTrainerGraphicsId(u8 graphicsId); +static u16 GetTrainerFlagFromScript(const u8 * script); +static void ClearAllTrainerRematchStates(void); +static bool8 IsTrainerVisibleOnScreen(struct VsSeekerTrainerInfo * trainerInfo); +static u32 GetRematchableTrainerLocalId(void); +static void StartTrainerObjectMovementScript(struct VsSeekerTrainerInfo * trainerInfo, const u8 * script); +static u8 GetCurVsSeekerResponse(s32 vsSeekerIdx, u16 trainerIdx); +static void StartAllRespondantIdleMovements(void); +static bool8 ObjectEventIdIsSane(u8 objectEventId); +static u8 GetRandomFaceDirectionMovementType(); + +static const u8 sMovementScript_Wait48[] = { + MOVEMENT_ACTION_DELAY_16, + MOVEMENT_ACTION_DELAY_16, + MOVEMENT_ACTION_DELAY_16, + MOVEMENT_ACTION_STEP_END +}; + +static const u8 sMovementScript_TrainerUnfought[] = { + MOVEMENT_ACTION_EMOTE_EXCLAMATION_MARK, + MOVEMENT_ACTION_STEP_END +}; + +static const u8 sMovementScript_TrainerNoRematch[] = { + MOVEMENT_ACTION_EMOTE_X, + MOVEMENT_ACTION_STEP_END +}; + +static const u8 sMovementScript_TrainerRematch[] = { + MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_DOWN, + MOVEMENT_ACTION_EMOTE_DOUBLE_EXCL_MARK, + MOVEMENT_ACTION_STEP_END +}; + +static const u8 sFaceDirectionMovementTypeByFacingDirection[] = { + MOVEMENT_TYPE_FACE_DOWN, + MOVEMENT_TYPE_FACE_DOWN, + MOVEMENT_TYPE_FACE_UP, + MOVEMENT_TYPE_FACE_LEFT, + MOVEMENT_TYPE_FACE_RIGHT +}; + +void VsSeekerFreezeObjectsAfterChargeComplete(void) +{ + CreateTask(Task_ResetObjectsRematchWantedState, 80); +} + +#define tIsPlayerFrozen data[0] +#define tAreObjectsFrozen data[1] + +static void Task_ResetObjectsRematchWantedState(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + u32 i; + + if ((!task->tIsPlayerFrozen) && IsPlayerStandingStill()) + { + PlayerFreeze(); + task->tIsPlayerFrozen = TRUE; + } + + if (!task->tAreObjectsFrozen) + { + for (i = 0; i < OBJECT_EVENTS_COUNT; i++) + { + if (!ObjectEventIdIsSane(i)) + continue; + + if (gObjectEvents[i].singleMovementActive) + return; + + FreezeObjectEvent(&gObjectEvents[i]); + } + } + + task->tAreObjectsFrozen = TRUE; + if (task->tIsPlayerFrozen) + { + DestroyTask(taskId); + StopPlayerAvatar(); + ScriptContext_Enable(); + } +} +#undef tIsPlayerFrozen +#undef tAreObjectsFrozen + +u16 VsSeekerConvertLocalIdToTableId(u16 localId) +{ + u32 localIdIndex = 0; + u32 trainerId = 0; + + for (localIdIndex = 0; localIdIndex < OBJECT_EVENTS_COUNT ; localIdIndex++) + { + if (sVsSeeker->trainerInfo[localIdIndex].localId == localId) + { + trainerId = sVsSeeker->trainerInfo[localIdIndex].trainerIdx; + return TrainerIdToRematchTableId(gRematchTable,trainerId); + } + } + return -1; +} + +void VsSeekerResetObjectMovementAfterChargeComplete(void) +{ + struct ObjectEventTemplate * templates = gSaveBlock1Ptr->objectEventTemplates; + u32 i; + u32 movementType; + u8 objEventId; + struct ObjectEvent * objectEvent; + + for (i = 0; i < gMapHeader.events->objectEventCount; i++) + { + if (templates[i].trainerType != TRAINER_TYPE_NORMAL + && templates[i].trainerType != TRAINER_TYPE_BURIED) + continue; + + if (templates[i].movementType != MOVEMENT_TYPE_ROTATE_CLOCKWISE) + continue; + + movementType = GetRandomFaceDirectionMovementType(); + TryGetObjectEventIdByLocalIdAndMap(templates[i].localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objEventId); + objectEvent = &gObjectEvents[objEventId]; + + if (!ObjectEventIdIsSane(objEventId)) + continue; + + SetTrainerMovementType(objectEvent, movementType); + templates[i].movementType = movementType; + } +} + +bool8 UpdateVsSeekerStepCounter(void) +{ + u8 x = 0; + + if (!I_VS_SEEKER_CHARGING) return FALSE; + + if (CheckBagHasItem(ITEM_VS_SEEKER, 1)) + { + if ((gSaveBlock1Ptr->trainerRematchStepCounter & 0xFF) < VSSEEKER_RECHARGE_STEPS) + gSaveBlock1Ptr->trainerRematchStepCounter++; + } + + if (FlagGet(I_VS_SEEKER_CHARGING)) + { + if (((gSaveBlock1Ptr->trainerRematchStepCounter >> 8) & 0xFF) < VSSEEKER_RECHARGE_STEPS) + { + x = (((gSaveBlock1Ptr->trainerRematchStepCounter >> 8) & 0xFF) + 1); + gSaveBlock1Ptr->trainerRematchStepCounter = (gSaveBlock1Ptr->trainerRematchStepCounter & 0xFF) | (x << 8); + } + if (((gSaveBlock1Ptr->trainerRematchStepCounter >> 8) & 0xFF) == VSSEEKER_RECHARGE_STEPS) + { + FlagClear(I_VS_SEEKER_CHARGING); + VsSeekerResetChargingStepCounter(); + ClearAllTrainerRematchStates(); + return TRUE; + } + } + + return FALSE; +} + +void MapResetTrainerRematches(u16 mapGroup, u16 mapNum) +{ + if (!I_VS_SEEKER_CHARGING) return; + + FlagClear(I_VS_SEEKER_CHARGING); + VsSeekerResetChargingStepCounter(); + ClearAllTrainerRematchStates(); + ResetMovementOfRematchableTrainers(); +} + +static void ResetMovementOfRematchableTrainers(void) +{ + u32 i; + u8 movementType = 0; + + for (i = 0; i < OBJECT_EVENTS_COUNT; i++) + { + struct ObjectEvent * objectEvent = &gObjectEvents[i]; + if (objectEvent->movementType != MOVEMENT_TYPE_ROTATE_CLOCKWISE) + continue; + + movementType = GetRandomFaceDirectionMovementType(); + + if (!objectEvent->active || gSprites[objectEvent->spriteId].data[0] != i) + continue; + + gSprites[objectEvent->spriteId].x2 = 0; + gSprites[objectEvent->spriteId].y2 = 0; + SetTrainerMovementType(objectEvent, movementType); + } +} + +static void VsSeekerResetInBagStepCounter(void) +{ + gSaveBlock1Ptr->trainerRematchStepCounter &= 0xFF00; +} + +static void VsSeekerResetChargingStepCounter(void) +{ + gSaveBlock1Ptr->trainerRematchStepCounter &= 0x00FF; +} + +void Task_InitVsSeekerAndCheckForTrainersOnScreen(u8 taskId) +{ + u32 i; + u32 respval; + + if (!I_VS_SEEKER_CHARGING) return; + + for (i = 0; i < 16; i++) + gTasks[taskId].data[i] = 0; + + sVsSeeker = AllocZeroed(sizeof(struct VsSeekerStruct)); + GatherNearbyTrainerInfo(); + respval = CanUseVsSeeker(); + if (respval == VSSEEKER_NOT_CHARGED) + { + Free(sVsSeeker); + DisplayItemMessageOnField(taskId, VSSeeker_Text_BatteryNotChargedNeedXSteps, Task_ItemUse_CloseMessageBoxAndReturnToField_VsSeeker); + } + else if (respval == VSSEEKER_NO_ONE_IN_RANGE) + { + Free(sVsSeeker); + DisplayItemMessageOnField(taskId, VSSeeker_Text_NoTrainersWithinRange, Task_ItemUse_CloseMessageBoxAndReturnToField_VsSeeker); + } + else if (respval == VSSEEKER_CAN_USE) + { + FieldEffectStart(FLDEFF_USE_VS_SEEKER); + gTasks[taskId].func = Task_VsSeekerFrameCountdown; + gTasks[taskId].data[0] = 15; + } +} + +static void Task_VsSeekerFrameCountdown(u8 taskId) +{ + if (--gTasks[taskId].data[0] == 0) + { + gTasks[taskId].func = Task_VsSeeker_PlaySoundAndGetResponseCode; + gTasks[taskId].data[1] = 16; + } +} + +static void Task_VsSeeker_PlaySoundAndGetResponseCode(u8 taskId) +{ + s16 * data = gTasks[taskId].data; + + if (data[2] != 2 && --data[1] == 0) + { + PlaySE(SE_CONTEST_MONS_TURN); + data[1] = 11; + data[2]++; + } + + if (!FieldEffectActiveListContains(FLDEFF_USE_VS_SEEKER)) + { + data[1] = 0; + data[2] = 0; + VsSeekerResetInBagStepCounter(); + sVsSeeker->responseCode = GetVsSeekerResponseInArea(); + ScriptMovement_StartObjectMovementScript(0xFF, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, sMovementScript_Wait48); + gTasks[taskId].func = Task_VsSeeker_ShowResponseToPlayer; + } +} + +static void GatherNearbyTrainerInfo(void) +{ + struct ObjectEventTemplate *templates = gSaveBlock1Ptr->objectEventTemplates; + u8 objectEventId = 0; + u8 vsSeekerObjectIdx = 0; + s32 objectEventIdx; + + for (objectEventIdx = 0; objectEventIdx < gMapHeader.events->objectEventCount; objectEventIdx++) + { + if (templates[objectEventIdx].trainerType != TRAINER_TYPE_NORMAL && templates[objectEventIdx].trainerType != TRAINER_TYPE_BURIED) + continue; + + sVsSeeker->trainerInfo[vsSeekerObjectIdx].script = templates[objectEventIdx].script; + sVsSeeker->trainerInfo[vsSeekerObjectIdx].trainerIdx = GetTrainerFlagFromScript(templates[objectEventIdx].script); + sVsSeeker->trainerInfo[vsSeekerObjectIdx].localId = templates[objectEventIdx].localId; + TryGetObjectEventIdByLocalIdAndMap(templates[objectEventIdx].localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objectEventId); + sVsSeeker->trainerInfo[vsSeekerObjectIdx].objectEventId = objectEventId; + sVsSeeker->trainerInfo[vsSeekerObjectIdx].xCoord = gObjectEvents[objectEventId].currentCoords.x - 7; + sVsSeeker->trainerInfo[vsSeekerObjectIdx].yCoord = gObjectEvents[objectEventId].currentCoords.y - 7; + sVsSeeker->trainerInfo[vsSeekerObjectIdx].graphicsId = templates[objectEventIdx].graphicsId; + vsSeekerObjectIdx++; + } + sVsSeeker->trainerInfo[vsSeekerObjectIdx].localId = 0xFF; +} + +static void Task_VsSeeker_ShowResponseToPlayer(u8 taskId) +{ + if (!ScriptMovement_IsObjectMovementFinished(0xFF, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup)) + return; + + if (sVsSeeker->responseCode == VSSEEKER_RESPONSE_NO_RESPONSE) + { + DisplayItemMessageOnField(taskId, VSSeeker_Text_TrainersNotReady, Task_ItemUse_CloseMessageBoxAndReturnToField_VsSeeker); + } + else + { + if (sVsSeeker->responseCode == VSSEEKER_RESPONSE_FOUND_REMATCHES) + StartAllRespondantIdleMovements(); + + ClearDialogWindowAndFrame(0, TRUE); + ScriptUnfreezeObjectEvents(); + UnlockPlayerFieldControls(); + DestroyTask(taskId); + } + Free(sVsSeeker); +} + +static u8 CanUseVsSeeker(void) +{ + u8 vsSeekerChargeSteps = gSaveBlock1Ptr->trainerRematchStepCounter; + + if ((vsSeekerChargeSteps == VSSEEKER_RECHARGE_STEPS) && (GetRematchableTrainerLocalId() == 0xFF)) + return VSSEEKER_NO_ONE_IN_RANGE; + + if (vsSeekerChargeSteps == VSSEEKER_RECHARGE_STEPS) + return VSSEEKER_CAN_USE; + + ConvertIntToDecimalStringN(gStringVar1, (VSSEEKER_RECHARGE_STEPS - vsSeekerChargeSteps), STR_CONV_MODE_LEFT_ALIGN, 3); + return VSSEEKER_NOT_CHARGED; +} + +static u8 GetVsSeekerResponseInArea(void) +{ + u16 trainerIdx = 0; + u8 response = 0, rematchTrainerIdx; + s32 vsSeekerIdx = 0, randomValue = 0; + + while (sVsSeeker->trainerInfo[vsSeekerIdx].localId != 0xFF) + { + if (!IsTrainerVisibleOnScreen(&sVsSeeker->trainerInfo[vsSeekerIdx])) + { + vsSeekerIdx++; + continue; + } + + trainerIdx = sVsSeeker->trainerInfo[vsSeekerIdx].trainerIdx; + if (!HasTrainerBeenFought(trainerIdx)) + { + StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerUnfought); + sVsSeeker->trainerHasNotYetBeenFought = 1; + vsSeekerIdx++; + continue; + } + + rematchTrainerIdx = GetRematchTrainerIdFromTable(gRematchTable, trainerIdx); + if (rematchTrainerIdx == 0) + { + StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerNoRematch); + sVsSeeker->trainerDoesNotWantRematch = 1; + } + else + { + randomValue = Random() % 100; // Even if it's overwritten below, it progresses the RNG. + response = GetCurVsSeekerResponse(vsSeekerIdx, trainerIdx); + + if (response == VSSEEKER_SINGLE_RESP_YES) + { + randomValue = 100; // Definitely yes + } + else if (response == VSSEEKER_SINGLE_RESP_NO) + { + randomValue = 0; // Definitely no + } + else if (randomValue < 30) + { + StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerNoRematch); + sVsSeeker->trainerDoesNotWantRematch = 1; + } + else + { + gSaveBlock1Ptr->trainerRematches[VsSeekerConvertLocalIdToTableId(sVsSeeker->trainerInfo[vsSeekerIdx].localId)] = rematchTrainerIdx; + ShiftStillObjectEventCoords(&gObjectEvents[sVsSeeker->trainerInfo[vsSeekerIdx].objectEventId]); + StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerRematch); + sVsSeeker->trainerIdxArray[sVsSeeker->numRematchableTrainers] = trainerIdx; + sVsSeeker->runningBehaviourEtcArray[sVsSeeker->numRematchableTrainers] = GetResponseMovementTypeFromTrainerGraphicsId(sVsSeeker->trainerInfo[vsSeekerIdx].graphicsId); + sVsSeeker->numRematchableTrainers++; + sVsSeeker->trainerWantsRematch = 1; + } + } + vsSeekerIdx++; + } + + if (sVsSeeker->trainerWantsRematch) + { + PlaySE(SE_PIN); + FlagSet(I_VS_SEEKER_CHARGING); + VsSeekerResetChargingStepCounter(); + return VSSEEKER_RESPONSE_FOUND_REMATCHES; + } + + if (sVsSeeker->trainerHasNotYetBeenFought) + return VSSEEKER_RESPONSE_UNFOUGHT_TRAINERS; + + return VSSEEKER_RESPONSE_NO_RESPONSE; +} + +void ClearRematchMovementByTrainerId(void) +{ + s32 i; + u8 objEventId = 0; + struct ObjectEventTemplate *objectEventTemplates = gSaveBlock1Ptr->objectEventTemplates; + struct ObjectEvent *objectEvent; + + int vsSeekerDataIdx = TrainerIdToRematchTableId(gRematchTable, gTrainerBattleOpponent_A); + + if (!I_VS_SEEKER_CHARGING) return; + + if (vsSeekerDataIdx == -1) + return; + + for (i = 0; i < gMapHeader.events->objectEventCount; i++) + { + if ((objectEventTemplates[i].trainerType != TRAINER_TYPE_NORMAL + && objectEventTemplates[i].trainerType != TRAINER_TYPE_BURIED) + || vsSeekerDataIdx != TrainerIdToRematchTableId(gRematchTable, GetTrainerFlagFromScript(objectEventTemplates[i].script))) + continue; + + TryGetObjectEventIdByLocalIdAndMap(objectEventTemplates[i].localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objEventId); + objectEvent = &gObjectEvents[objEventId]; + GetRandomFaceDirectionMovementType(&objectEventTemplates[i]); + TryOverrideTemplateCoordsForObjectEvent(objectEvent, sFaceDirectionMovementTypeByFacingDirection[objectEvent->facingDirection]); + + if (gSelectedObjectEvent == objEventId) + objectEvent->movementType = sFaceDirectionMovementTypeByFacingDirection[objectEvent->facingDirection]; + else + objectEvent->movementType = MOVEMENT_TYPE_FACE_DOWN; + } +} + +static u32 GetGameProgressFlags() +{ + const u32 gameProgressFlags[] = { + FLAG_VISITED_LAVARIDGE_TOWN, + FLAG_VISITED_FORTREE_CITY, + FLAG_SYS_GAME_CLEAR, + FLAG_DEFEATED_METEOR_FALLS_STEVEN + }; + u32 i = 0, numGameProgressFlags = 0; + u32 maxGameProgressFlags = ARRAY_COUNT(gameProgressFlags); + + for (i = 0; i < maxGameProgressFlags; i++) + { + if (FlagGet(gameProgressFlags[i])) + numGameProgressFlags++; + } + + return numGameProgressFlags; +} + +u16 GetRematchTrainerIdVSSeeker(u16 trainerId) +{ + u32 tableId = FirstBattleTrainerIdToRematchTableId(gRematchTable, trainerId); + u32 rematchTrainerIdx = GetGameProgressFlags(); + + if (!I_VS_SEEKER_CHARGING) return 0; + + while (!HasTrainerBeenFought(gRematchTable[tableId].trainerIds[rematchTrainerIdx-1])) + { + if (rematchTrainerIdx== 0) + break; + + rematchTrainerIdx--; + } + + return gRematchTable[tableId].trainerIds[rematchTrainerIdx]; +} + +static bool8 ObjectEventIdIsSane(u8 objectEventId) +{ + struct ObjectEvent *objectEvent = &gObjectEvents[objectEventId]; + + if (objectEvent->active && gMapHeader.events->objectEventCount >= objectEvent->localId && gSprites[objectEvent->spriteId].data[0] == objectEventId) + return TRUE; + return FALSE; +} + +static u8 GetRandomFaceDirectionMovementType() +{ + u16 randomFacingDirection = Random() % 4; + + switch (randomFacingDirection) + { + case 0: + return MOVEMENT_TYPE_FACE_UP; + case 1: + return MOVEMENT_TYPE_FACE_DOWN; + case 2: + return MOVEMENT_TYPE_FACE_LEFT; + case 3: + return MOVEMENT_TYPE_FACE_RIGHT; + default: + return MOVEMENT_TYPE_FACE_DOWN; + } +} + +static bool32 IsRegularLandTrainer(u8 graphicsId) +{ + u32 i; + u16 regularTrainersOnLand[] = + { + OBJ_EVENT_GFX_AQUA_MEMBER_F, + OBJ_EVENT_GFX_AQUA_MEMBER_M, + OBJ_EVENT_GFX_BEAUTY, + OBJ_EVENT_GFX_BLACK_BELT, + OBJ_EVENT_GFX_BOY_1, + OBJ_EVENT_GFX_BOY_2, + OBJ_EVENT_GFX_BOY_3, + OBJ_EVENT_GFX_BUG_CATCHER, + OBJ_EVENT_GFX_CAMPER, + OBJ_EVENT_GFX_CYCLING_TRIATHLETE_F, + OBJ_EVENT_GFX_CYCLING_TRIATHLETE_M, + OBJ_EVENT_GFX_EXPERT_F, + OBJ_EVENT_GFX_EXPERT_M, + OBJ_EVENT_GFX_FAT_MAN, + OBJ_EVENT_GFX_FISHERMAN, + OBJ_EVENT_GFX_GENTLEMAN, + OBJ_EVENT_GFX_GIRL_1, + OBJ_EVENT_GFX_GIRL_2, + OBJ_EVENT_GFX_GIRL_3, + OBJ_EVENT_GFX_HEX_MANIAC, + OBJ_EVENT_GFX_HIKER, + OBJ_EVENT_GFX_LASS, + OBJ_EVENT_GFX_LITTLE_BOY, + OBJ_EVENT_GFX_LITTLE_GIRL, + OBJ_EVENT_GFX_MAGMA_MEMBER_F, + OBJ_EVENT_GFX_MAGMA_MEMBER_M, + OBJ_EVENT_GFX_MAN_3, + OBJ_EVENT_GFX_MAN_4, + OBJ_EVENT_GFX_MAN_5, + OBJ_EVENT_GFX_MANIAC, + OBJ_EVENT_GFX_NINJA_BOY, + OBJ_EVENT_GFX_PICNICKER, + OBJ_EVENT_GFX_POKEFAN_F, + OBJ_EVENT_GFX_POKEFAN_M, + OBJ_EVENT_GFX_PSYCHIC_M, + OBJ_EVENT_GFX_RICH_BOY, + OBJ_EVENT_GFX_RUNNING_TRIATHLETE_F, + OBJ_EVENT_GFX_RUNNING_TRIATHLETE_M, + OBJ_EVENT_GFX_SAILOR, + OBJ_EVENT_GFX_SCHOOL_KID_M, + OBJ_EVENT_GFX_TUBER_F, + OBJ_EVENT_GFX_TUBER_M, + OBJ_EVENT_GFX_TWIN, + OBJ_EVENT_GFX_WOMAN_1, + OBJ_EVENT_GFX_WOMAN_2, + OBJ_EVENT_GFX_WOMAN_4, + OBJ_EVENT_GFX_WOMAN_5, + OBJ_EVENT_GFX_YOUNGSTER + }; + + for (i = 0; i < ARRAY_COUNT(regularTrainersOnLand); i++) + { + if (graphicsId == regularTrainersOnLand[i]) + return TRUE; + } + return FALSE; +} + +static bool32 IsRegularWaterTrainer(u8 graphicsId) +{ + u32 i; + u16 regularTrainersInWater[] = + { + OBJ_EVENT_GFX_SWIMMER_F, + OBJ_EVENT_GFX_SWIMMER_M, + OBJ_EVENT_GFX_TUBER_M_SWIMMING + }; + + for (i = 0; i < ARRAY_COUNT(regularTrainersInWater); i++) + { + if (graphicsId == regularTrainersInWater[i]) + return TRUE; + } + return FALSE; +} + +static u8 GetResponseMovementTypeFromTrainerGraphicsId(u8 graphicsId) +{ + if (IsRegularLandTrainer(graphicsId) || IsRegularWaterTrainer(graphicsId)) + return MOVEMENT_TYPE_ROTATE_CLOCKWISE; + + return MOVEMENT_TYPE_FACE_DOWN; +} + +static u16 GetTrainerFlagFromScript(const u8 *script) + /* + * The trainer flag is a little-endian short located +2 from + * the script pointer, assuming the trainerbattle command is + * first in the script. Because scripts are unaligned, and + * because the ARM processor requires shorts to be 16-bit + * aligned, this function needs to perform explicit bitwise + * operations to get the correct flag. + * + * 5c XX YY ZZ ... + * -- -- + */ +{ + u16 trainerFlag; + + script += 2; + trainerFlag = script[0]; + trainerFlag |= script[1] << 8; + return trainerFlag; +} + +static void ClearAllTrainerRematchStates(void) +{ + u32 i; + + if (!CheckBagHasItem(ITEM_VS_SEEKER, 1)) + return; + + for (i = 0; i < ARRAY_COUNT(gSaveBlock1Ptr->trainerRematches); i++) + gSaveBlock1Ptr->trainerRematches[i] = 0; +} + +static bool8 IsTrainerVisibleOnScreen(struct VsSeekerTrainerInfo * trainerInfo) +{ + s16 x; + s16 y; + + PlayerGetDestCoords(&x, &y); + x -= 7; + y -= 7; + + if ( x - 7 <= trainerInfo->xCoord + && x + 7 >= trainerInfo->xCoord + && y - 5 <= trainerInfo->yCoord + && y + 5 >= trainerInfo->yCoord + && ObjectEventIdIsSane(trainerInfo->objectEventId) == 1) + return TRUE; + return FALSE; +} + +static u32 GetRematchableTrainerLocalId(void) +{ + u32 i; + + for (i = 0; sVsSeeker->trainerInfo[i].localId != 0xFF; i++) + { + if (IsTrainerVisibleOnScreen(&sVsSeeker->trainerInfo[i]) == 1) + { + if (HasTrainerBeenFought(sVsSeeker->trainerInfo[i].trainerIdx) != 1 || GetRematchTrainerIdFromTable(gRematchTable, sVsSeeker->trainerInfo[i].trainerIdx)) + return sVsSeeker->trainerInfo[i].localId; + } + } + + return 0xFF; +} + +static void StartTrainerObjectMovementScript(struct VsSeekerTrainerInfo * trainerInfo, const u8 * script) +{ + UnfreezeObjectEvent(&gObjectEvents[trainerInfo->objectEventId]); + ScriptMovement_StartObjectMovementScript(trainerInfo->localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, script); +} + +static u8 GetCurVsSeekerResponse(s32 vsSeekerIdx, u16 trainerIdx) +{ + s32 i; + s32 j; + + for (i = 0; i < vsSeekerIdx; i++) + { + if (IsTrainerVisibleOnScreen(&sVsSeeker->trainerInfo[i]) != 1 || sVsSeeker->trainerInfo[i].trainerIdx != trainerIdx) + continue; + + for (j = 0; j < sVsSeeker->numRematchableTrainers; j++) + { + if (sVsSeeker->trainerIdxArray[j] == sVsSeeker->trainerInfo[i].trainerIdx) + return VSSEEKER_SINGLE_RESP_YES; + } + return VSSEEKER_SINGLE_RESP_NO; + } + return VSSEEKER_SINGLE_RESP_RAND; +} + +static void StartAllRespondantIdleMovements(void) +{ + s32 i; + s32 j; + + for (i = 0; i < sVsSeeker->numRematchableTrainers; i++) + { + for (j = 0; sVsSeeker->trainerInfo[j].localId != 0xFF; j++) + { + if (sVsSeeker->trainerInfo[j].trainerIdx == sVsSeeker->trainerIdxArray[i]) + { + struct ObjectEvent *objectEvent = &gObjectEvents[sVsSeeker->trainerInfo[j].objectEventId]; + + if (ObjectEventIdIsSane(sVsSeeker->trainerInfo[j].objectEventId) == 1) + SetTrainerMovementType(objectEvent, sVsSeeker->runningBehaviourEtcArray[i]); + TryOverrideTemplateCoordsForObjectEvent(objectEvent, sVsSeeker->runningBehaviourEtcArray[i]); + gSaveBlock1Ptr->trainerRematches[VsSeekerConvertLocalIdToTableId(sVsSeeker->trainerInfo[j].localId)] = GetRematchTrainerIdFromTable(gRematchTable, sVsSeeker->trainerInfo[j].trainerIdx); + } + } + } +} diff --git a/test/battle/ability/trace.c b/test/battle/ability/trace.c new file mode 100644 index 0000000000..0e4448424b --- /dev/null +++ b/test/battle/ability/trace.c @@ -0,0 +1,82 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Trace copies opponents ability") +{ + GIVEN { + PLAYER(SPECIES_RALTS) { Ability(ABILITY_TRACE); } + OPPONENT(SPECIES_TORCHIC) { Ability(ABILITY_BLAZE); } + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(player, ABILITY_TRACE); + MESSAGE("Ralts TRACED Foe Torchic's Blaze!"); + } +} + +SINGLE_BATTLE_TEST("Trace copies opponents ability on switch-in") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) + PLAYER(SPECIES_RALTS) { Ability(ABILITY_TRACE); } + OPPONENT(SPECIES_TORCHIC) { Ability(ABILITY_BLAZE); } + } WHEN { + TURN { SWITCH(player, 1); } + } SCENE { + ABILITY_POPUP(player, ABILITY_TRACE); + MESSAGE("Ralts TRACED Foe Torchic's Blaze!"); + } +} + +SINGLE_BATTLE_TEST("Trace copies opponents ability on switch-in even if opponent switched in at the same time") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) + PLAYER(SPECIES_RALTS) { Ability(ABILITY_TRACE); } + OPPONENT(SPECIES_TREECKO) { HP(1); } + OPPONENT(SPECIES_TORCHIC) { Ability(ABILITY_BLAZE); } + } WHEN { + TURN { MOVE(player, MOVE_MISTY_EXPLOSION); SEND_OUT(opponent, 1); SEND_OUT(player, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MISTY_EXPLOSION); + ABILITY_POPUP(player, ABILITY_TRACE); + MESSAGE("Ralts TRACED Foe Torchic's Blaze!"); + } +} + +DOUBLE_BATTLE_TEST("Trace copies opponents ability randomly") +{ + u16 ability1, ability2; + + PARAMETRIZE { ability1 = ABILITY_SPEED_BOOST; ability2 = ABILITY_BLAZE;} + PARAMETRIZE { ability1 = ABILITY_BLAZE; ability2 = ABILITY_SPEED_BOOST; } + + PASSES_RANDOMLY(1, 2, RNG_TRACE); + GIVEN { + PLAYER(SPECIES_RALTS) { Ability(ABILITY_TRACE); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_TORCHIC) { Ability(ability1); } + OPPONENT(SPECIES_TORCHIC) { Ability(ability2); } + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_TRACE); + MESSAGE("Ralts TRACED Foe Torchic's Blaze!"); + } +} + +SINGLE_BATTLE_TEST("Trace will copy an opponent's ability whenever it has the chance but only once") +{ + GIVEN { + ASSUME(P_GEN_4_POKEMON == TRUE); + PLAYER(SPECIES_RALTS) { Ability(ABILITY_TRACE); } + OPPONENT(SPECIES_CHERRIM) { Ability(ABILITY_FLOWER_GIFT); } + OPPONENT(SPECIES_TORCHIC) { Ability(ABILITY_BLAZE); } + } WHEN { + TURN { SWITCH(opponent, 1); } + } SCENE { + // TURN 2 + ABILITY_POPUP(player, ABILITY_TRACE); + MESSAGE("Ralts TRACED Foe Torchic's Blaze!"); + } +} diff --git a/test/battle/ai.c b/test/battle/ai.c index 42fa32760f..d8f382961a 100644 --- a/test/battle/ai.c +++ b/test/battle/ai.c @@ -608,3 +608,42 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Post-KO switches prioritize of TURN { MOVE(player, MOVE_WING_ATTACK) ; EXPECT_SEND_OUT(opponent, 2); } } } + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI switches out after sufficient stat drops") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); + PLAYER(SPECIES_HITMONTOP) { Level(30); Moves(MOVE_CHARM, MOVE_TACKLE); Ability(ABILITY_INTIMIDATE); Speed(5); } + OPPONENT(SPECIES_GRIMER) { Level(30); Moves(MOVE_TACKLE); Speed(4); } + OPPONENT(SPECIES_PONYTA) { Level(30); Moves(MOVE_HEADBUTT); Speed(4); } + } WHEN { + TURN { MOVE(player, MOVE_CHARM) ;} + TURN { MOVE(player, MOVE_TACKLE) ; EXPECT_SWITCH(opponent, 1); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will not switch out if Pokemon would faint to hazards unless party member can clear them") +{ + u32 move1; + + PARAMETRIZE{move1 = MOVE_TACKLE; } + PARAMETRIZE{move1 = MOVE_RAPID_SPIN; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); + PLAYER(SPECIES_HITMONTOP) { Level(30); Moves(MOVE_CHARM, MOVE_TACKLE, MOVE_STEALTH_ROCK, MOVE_EARTHQUAKE); Ability(ABILITY_INTIMIDATE); Speed(5); } + OPPONENT(SPECIES_GRIMER) { Level(30); Moves(MOVE_TACKLE); Item(ITEM_FOCUS_SASH); Speed(4); } + OPPONENT(SPECIES_PONYTA) { Level(30); Moves(MOVE_HEADBUTT, move1); Speed(4); } + } WHEN { + TURN { MOVE(player, MOVE_STEALTH_ROCK) ;} + TURN { MOVE(player, MOVE_EARTHQUAKE) ;} + TURN { MOVE(player, MOVE_CHARM) ;} + TURN { // If the AI has a mon that can remove hazards, don't prevent them switching out + MOVE(player, MOVE_CHARM); + if (move1 == MOVE_RAPID_SPIN) + EXPECT_SWITCH(opponent, 1); + else if (move1 == MOVE_TACKLE) + EXPECT_MOVE(opponent, MOVE_TACKLE); + } + } +} diff --git a/test/battle/hold_effect/white_herb.c b/test/battle/hold_effect/white_herb.c index a34bb6a347..734091552b 100644 --- a/test/battle/hold_effect/white_herb.c +++ b/test/battle/hold_effect/white_herb.c @@ -68,3 +68,179 @@ DOUBLE_BATTLE_TEST("White Herb restores stats after Attack was lowered by Intimi EXPECT(opponentRight->statStages[STAT_DEF] = DEFAULT_STAT_STAGE); } } + +SINGLE_BATTLE_TEST("White Herb restores stats after Attack was lowered by Intimidate while switching in") +{ + KNOWN_FAILING; + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_WHITE_HERB); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_ARBOK) { Ability(ABILITY_INTIMIDATE); } + } WHEN { + TURN { SWITCH(opponent, 1); MOVE(player, MOVE_CLOSE_COMBAT); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_INTIMIDATE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Wobbuffet's White Herb restored its status!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CLOSE_COMBAT, player); + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Wobbuffet's White Herb restored its status!"); + } + } THEN { + EXPECT(player->item == ITEM_NONE); + EXPECT(player->statStages[STAT_DEF] = DEFAULT_STAT_STAGE - 1); + EXPECT(player->statStages[STAT_SPDEF] = DEFAULT_STAT_STAGE - 1); + } +} + + +SINGLE_BATTLE_TEST("White Herb restores stats after all hits of a multi hit move happened") +{ + u16 species; + u16 ability; + + PARAMETRIZE { species = SPECIES_SLIGGOO_HISUIAN; ability = ABILITY_GOOEY; } + PARAMETRIZE { species = SPECIES_DUGTRIO_ALOLAN; ability = ABILITY_TANGLING_HAIR; } + + KNOWN_FAILING; + GIVEN { + ASSUME(gBattleMoves[MOVE_DUAL_WINGBEAT].strikeCount == 2); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_WHITE_HERB); } + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(player, MOVE_DUAL_WINGBEAT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DUAL_WINGBEAT, player); + ABILITY_POPUP(opponent, ability); + MESSAGE("Wobbuffet's Speed fell!"); + ABILITY_POPUP(opponent, ability); + MESSAGE("Wobbuffet's Speed fell!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Wobbuffet's White Herb restored its status!"); + } THEN { + EXPECT(player->item == ITEM_NONE); + EXPECT(player->statStages[STAT_SPEED] = DEFAULT_STAT_STAGE); + } +} + +SINGLE_BATTLE_TEST("White Herb wont have time to activate if it is knocked off or stolen by Thief") +{ + u16 move; + + PARAMETRIZE { move = MOVE_THIEF; } + PARAMETRIZE { move = MOVE_KNOCK_OFF; } + + KNOWN_FAILING; // Knock off fails, Thief is fine + GIVEN { + ASSUME(gBattleMoves[MOVE_THIEF].effect == EFFECT_THIEF); + ASSUME(gBattleMoves[MOVE_KNOCK_OFF].effect == EFFECT_KNOCK_OFF); + PLAYER(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); Item(ITEM_WHITE_HERB); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + if (move == MOVE_THIEF) + MESSAGE("Foe Wobbuffet stole Slugma's White Herb!"); + else + MESSAGE("Foe Wobbuffet knocked off Slugma's White Herb!"); + ABILITY_POPUP(player, ABILITY_WEAK_ARMOR); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Slugma's Weak Armor lowered its Defense!"); + MESSAGE("Slugma's Weak Armor raised its Speed!"); + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Wobbuffet's White Herb restored its status!"); + } + } THEN { + EXPECT(player->statStages[STAT_DEF] = DEFAULT_STAT_STAGE - 1); + EXPECT(player->statStages[STAT_SPEED] = DEFAULT_STAT_STAGE + 1); + } +} + +SINGLE_BATTLE_TEST("White Herb wont have time to activate if Magician steals it") +{ + KNOWN_FAILING; // White Herb is activated + GIVEN { + ASSUME(P_GEN_6_POKEMON == TRUE); + PLAYER(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); Item(ITEM_WHITE_HERB); } + OPPONENT(SPECIES_FENNEKIN) { Ability(ABILITY_MAGICIAN); } + } WHEN { + TURN { MOVE(opponent, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + ABILITY_POPUP(opponent, ABILITY_MAGICIAN); + ABILITY_POPUP(player, ABILITY_WEAK_ARMOR); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Slugma's Weak Armor lowered its Defense!"); + MESSAGE("Slugma's Weak Armor raised its Speed!"); + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Wobbuffet's White Herb restored its status!"); + } + } THEN { + EXPECT(player->statStages[STAT_DEF] = DEFAULT_STAT_STAGE - 1); + EXPECT(player->statStages[STAT_SPEED] = DEFAULT_STAT_STAGE + 1); + } +} + +SINGLE_BATTLE_TEST("White Herb wont have time to activate if Pickpocket steals it") +{ + KNOWN_FAILING; // White Herb is activated + GIVEN { + ASSUME(gBattleMoves[MOVE_LEAF_STORM].effect == EFFECT_OVERHEAT); + PLAYER(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); Item(ITEM_WHITE_HERB); } + OPPONENT(SPECIES_SNEASEL) { Ability(ABILITY_PICKPOCKET); } + } WHEN { + TURN { MOVE(player, MOVE_LEAF_STORM); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_LEAF_STORM, player); + ABILITY_POPUP(player, ABILITY_PICKPOCKET); + ABILITY_POPUP(player, ABILITY_WEAK_ARMOR); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Slugma's Weak Armor lowered its Defense!"); + MESSAGE("Slugma's Weak Armor raised its Speed!"); + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Wobbuffet's White Herb restored its status!"); + } + } THEN { + EXPECT(player->statStages[STAT_DEF] = DEFAULT_STAT_STAGE - 1); + EXPECT(player->statStages[STAT_SPEED] = DEFAULT_STAT_STAGE + 1); + } +} + +SINGLE_BATTLE_TEST("White Herb restores stats after Defiant or Competitive were triggered") +{ + u16 species; + u16 ability; + + PARAMETRIZE { species = SPECIES_IGGLYBUFF; ability = ABILITY_COMPETITIVE; } + PARAMETRIZE { species = SPECIES_MANKEY; ability = ABILITY_DEFIANT; } + + KNOWN_FAILING; + GIVEN { + PLAYER(species) { Ability(ability); Item(ITEM_WHITE_HERB); } + OPPONENT(SPECIES_ARBOK) { Ability(ABILITY_INTIMIDATE); } + } WHEN { + TURN { ; } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_INTIMIDATE); + ABILITY_POPUP(player, ability); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Wobbuffet's White Herb restored its status!"); + } THEN { + EXPECT(player->item == ITEM_NONE); + if (species == SPECIES_IGGLYBUFF) + { + EXPECT(player->statStages[STAT_ATK] = DEFAULT_STAT_STAGE); + EXPECT(player->statStages[STAT_SPATK] = DEFAULT_STAT_STAGE + 2); + } + else + EXPECT(player->statStages[STAT_ATK] = DEFAULT_STAT_STAGE + 3); + } +} diff --git a/test/battle/move_effect/chilly_reception.c b/test/battle/move_effect/chilly_reception.c new file mode 100644 index 0000000000..6f731f4b6f --- /dev/null +++ b/test/battle/move_effect/chilly_reception.c @@ -0,0 +1,90 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gBattleMoves[MOVE_CHILLY_RECEPTION].effect == EFFECT_CHILLY_RECEPTION); +} + +SINGLE_BATTLE_TEST("Chilly Reception sets up snow and switches the user out") +{ + GIVEN { + PLAYER(SPECIES_SLOWKING_GALARIAN); + PLAYER(SPECIES_SLOWPOKE_GALARIAN); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CHILLY_RECEPTION); SEND_OUT(player, 1); } + } SCENE { + MESSAGE("Slowking is preparing to tell a chillingly bad joke!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CHILLY_RECEPTION, player); + MESSAGE("It started to snow!"); + MESSAGE("Slowking went back to 1"); + MESSAGE("Go! Slowpoke!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_SNOW_CONTINUES); + } +} + +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); + OPPONENT(SPECIES_KYOGRE) { Item(ITEM_BLUE_ORB); } + } WHEN { + TURN { MOVE(player, MOVE_CHILLY_RECEPTION); SEND_OUT(player, 1); } + } SCENE { + MESSAGE("Slowking is preparing to tell a chillingly bad joke!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CHILLY_RECEPTION, player); + MESSAGE("There is no relief from this heavy rain!"); + MESSAGE("Slowking went back to 1"); + MESSAGE("Go! Slowpoke!"); + MESSAGE("Rain continues to fall."); + } +} + +SINGLE_BATTLE_TEST("Chilly Reception does not switch the user out if no replacements") +{ + GIVEN { + PLAYER(SPECIES_SLOWKING_GALARIAN); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CHILLY_RECEPTION); } + } SCENE { + MESSAGE("Slowking is preparing to tell a chillingly bad joke!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CHILLY_RECEPTION, player); + MESSAGE("It started to snow!"); + NOT MESSAGE("Slowking went back to 1"); + } +} + +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); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CHILLY_RECEPTION); } + } SCENE { + MESSAGE("Slowking is preparing to tell a chillingly bad joke!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CHILLY_RECEPTION, player); + MESSAGE("It started to snow!"); + NOT MESSAGE("Slowking went back to 1"); + } +} + +SINGLE_BATTLE_TEST("Chilly Reception changes the weather, even if the user cannot switch out") +{ + GIVEN { + PLAYER(SPECIES_SLOWKING_GALARIAN); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CHILLY_RECEPTION); } + } SCENE { + MESSAGE("Slowking is preparing to tell a chillingly bad joke!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CHILLY_RECEPTION, player); + MESSAGE("It started to snow!"); + NOT MESSAGE("Slowking went back to 1"); + } +} + diff --git a/test/battle/move_effect/heal_pulse.c b/test/battle/move_effect/heal_pulse.c new file mode 100644 index 0000000000..ecd1cfe294 --- /dev/null +++ b/test/battle/move_effect/heal_pulse.c @@ -0,0 +1,102 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gBattleMoves[MOVE_HEAL_PULSE].effect == EFFECT_HEAL_PULSE); +} + +SINGLE_BATTLE_TEST("Heal Pulse heals the target by 1/2 of it's maxHP") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { MaxHP(100); HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_HEAL_PULSE); } + } SCENE { + s32 maxHP = GetMonData(&PLAYER_PARTY[0], MON_DATA_MAX_HP); + ANIMATION(ANIM_TYPE_MOVE, MOVE_HEAL_PULSE, opponent); + HP_BAR(player, damage: -maxHP / 2); + } +} + +DOUBLE_BATTLE_TEST("Heal Pulse can heal partner") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { MaxHP(100); HP(1); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerRight, MOVE_HEAL_PULSE, target: playerLeft); } + } SCENE { + s32 maxHP = GetMonData(&PLAYER_PARTY[0], MON_DATA_MAX_HP); + ANIMATION(ANIM_TYPE_MOVE, MOVE_HEAL_PULSE, playerRight); + HP_BAR(playerLeft, damage: -maxHP / 2); + } +} + +SINGLE_BATTLE_TEST("Heal Pulse is boosted by Mega Launcher") +{ + GIVEN { + ASSUME(P_GEN_6_POKEMON == TRUE); + PLAYER(SPECIES_WOBBUFFET) { MaxHP(100); HP(1); } + OPPONENT(SPECIES_CLAWITZER); + } WHEN { + TURN { MOVE(opponent, MOVE_HEAL_PULSE); } + } SCENE { + s32 maxHP = GetMonData(&PLAYER_PARTY[0], MON_DATA_MAX_HP); + ANIMATION(ANIM_TYPE_MOVE, MOVE_HEAL_PULSE, opponent); + HP_BAR(player, damage: -maxHP * 75 / 100); + } +} + +SINGLE_BATTLE_TEST("Heal Pulse ignores accurace checks") +{ + GIVEN { + PASSES_RANDOMLY(100, 100, RNG_ACCURACY); + PLAYER(SPECIES_WOBBUFFET) { MaxHP(100); HP(1); Item(ITEM_BRIGHT_POWDER); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_HEAL_PULSE); } + } SCENE { + s32 maxHP = GetMonData(&PLAYER_PARTY[0], MON_DATA_MAX_HP); + ANIMATION(ANIM_TYPE_MOVE, MOVE_HEAL_PULSE, opponent); + HP_BAR(player, damage: -maxHP / 2); + } +} + +SINGLE_BATTLE_TEST("Heal Pulse is blocked by Substitute") +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_SUBSTITUTE].effect == EFFECT_SUBSTITUTE); + PLAYER(SPECIES_WOBBUFFET) { MaxHP(100); HP(50); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SUBSTITUTE); MOVE(opponent, MOVE_HEAL_PULSE); } + } SCENE { + s32 maxHP = GetMonData(&PLAYER_PARTY[0], MON_DATA_MAX_HP); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUBSTITUTE, player); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_HEAL_PULSE, opponent); + HP_BAR(player, damage: -maxHP / 2); + } + } +} + +SINGLE_BATTLE_TEST("Floral Healing heals the target by 2/3rd of it's maxHP if Grassy Terrain is on the field") +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_FLORAL_HEALING].argument == MOVE_EFFECT_FLORAL_HEALING); + ASSUME(gBattleMoves[MOVE_GRASSY_TERRAIN].effect == EFFECT_GRASSY_TERRAIN); + PLAYER(SPECIES_WOBBUFFET) { MaxHP(100); HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_GRASSY_TERRAIN); MOVE(opponent, MOVE_FLORAL_HEALING); } + } SCENE { + s32 maxHP = GetMonData(&PLAYER_PARTY[0], MON_DATA_MAX_HP); + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRASSY_TERRAIN, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLORAL_HEALING, opponent); + HP_BAR(player, damage: -maxHP * 2 / 3); + } +}