diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 866831c46246..e8b85d2a6502 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1456,6 +1456,49 @@ .4byte \jumpInstr .endm + @ Used to active a different Max Move effects. + .macro setmaxmoveeffect + callnative BS_SetMaxMoveEffect + .endm + + .macro setsteelsurge, failInstr:req + callnative BS_SetSteelsurge + .4byte \failInstr + .endm + + .macro damagenontypes + callnative BS_DamageNonTypes + .endm + + .macro trysetstatus1, ptr:req + callnative BS_TrySetStatus1 + .4byte \ptr + .endm + + .macro trysetstatus2, ptr:req + callnative BS_TrySetStatus2 + .4byte \ptr + .endm + + .macro tryhealsixthhealth, ptr:req + callnative BS_HealOneSixth + .4byte \ptr + .endm + + .macro tryrecycleberry, ptr:req + callnative BS_TryRecycleBerry + .4byte \ptr + .endm + + .macro updatedynamax + callnative BS_UpdateDynamax + .endm + + .macro jumpiftargetdynamaxed, ptr:req + callnative BS_JumpIfDynamaxed + .4byte \ptr + .endm + @ various command changed to more readable macros .macro cancelmultiturnmoves battler:req various \battler, VARIOUS_CANCEL_MULTI_TURN_MOVES diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index e533173e1122..b2cd95ca27c6 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -780,7 +780,7 @@ gBattleAnims_Moves:: .4byte Move_GLACIAL_LANCE .4byte Move_ASTRAL_BARRAGE .4byte Move_EERIE_SPELL -@@@@LA MOVES +@@@@ LA MOVES .4byte Move_DIRE_CLAW .4byte Move_PSYSHIELD_BASH .4byte Move_POWER_SHIFT @@ -896,6 +896,60 @@ gBattleAnims_Moves:: .4byte Move_MENACING_MOONRAZE_MAELSTROM .4byte Move_LIGHT_THAT_BURNS_THE_SKY .4byte Move_SOUL_STEALING_7_STAR_STRIKE +@@@@ MAX MOVES + .4byte Move_MAX_GUARD + .4byte Move_MAX_STRIKE + .4byte Move_MAX_KNUCKLE + .4byte Move_MAX_AIRSTREAM + .4byte Move_MAX_OOZE + .4byte Move_MAX_QUAKE + .4byte Move_MAX_ROCKFALL + .4byte Move_MAX_FLUTTERBY + .4byte Move_MAX_PHANTASM + .4byte Move_MAX_STEELSPIKE + .4byte Move_MAX_FLARE + .4byte Move_MAX_GEYSER + .4byte Move_MAX_OVERGROWTH + .4byte Move_MAX_LIGHTNING + .4byte Move_MAX_MINDSTORM + .4byte Move_MAX_HAILSTORM + .4byte Move_MAX_WYRMWIND + .4byte Move_MAX_DARKNESS + .4byte Move_MAX_STARFALL +@@@@ G-MAX MOVES + .4byte Move_G_MAX_VINE_LASH + .4byte Move_G_MAX_WILDFIRE + .4byte Move_G_MAX_CANNONADE + .4byte Move_G_MAX_BEFUDDLE + .4byte Move_G_MAX_VOLT_CRASH + .4byte Move_G_MAX_GOLD_RUSH + .4byte Move_G_MAX_CHI_STRIKE + .4byte Move_G_MAX_TERROR + .4byte Move_G_MAX_FOAM_BURST + .4byte Move_G_MAX_RESONANCE + .4byte Move_G_MAX_CUDDLE + .4byte Move_G_MAX_REPLENISH + .4byte Move_G_MAX_MALODOR + .4byte Move_G_MAX_MELTDOWN + .4byte Move_G_MAX_DRUM_SOLO + .4byte Move_G_MAX_FIREBALL + .4byte Move_G_MAX_HYDROSNIPE + .4byte Move_G_MAX_WIND_RAGE + .4byte Move_G_MAX_GRAVITAS + .4byte Move_G_MAX_STONESURGE + .4byte Move_G_MAX_VOLCALITH + .4byte Move_G_MAX_TARTNESS + .4byte Move_G_MAX_SWEETNESS + .4byte Move_G_MAX_SANDBLAST + .4byte Move_G_MAX_STUN_SHOCK + .4byte Move_G_MAX_CENTIFERNO + .4byte Move_G_MAX_SMITE + .4byte Move_G_MAX_SNOOZE + .4byte Move_G_MAX_FINALE + .4byte Move_G_MAX_STEELSURGE + .4byte Move_G_MAX_DEPLETION + .4byte Move_G_MAX_ONE_BLOW + .4byte Move_G_MAX_RAPID_FLOW @@@ Last Move - cannot be reached .4byte Move_COUNT @@ -953,6 +1007,8 @@ gBattleAnims_General:: .4byte General_Snow @ B_ANIM_SNOW_CONTINUES .4byte General_UltraBurst @ B_ANIM_ULTRA_BURST .4byte General_SaltCureDamage @ B_ANIM_SALT_CURE_DAMAGE + .4byte General_DynamaxGrowth @ B_ANIM_DYNAMAX_GROWTH + .4byte General_SetWeather @ B_ANIM_MAX_SET_WEATHER .align 2 gBattleAnims_Special:: @@ -32868,3 +32924,182 @@ SoulStealingSevenStarStrikeExplosion: createsprite gSoulStealExplosionSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x10, ANIM_TARGET, 0x1 delay 0x6 return + +@@@@@@@@@@ MAX MOVES @@@@@@@@@@ +General_SetWeather:: + createvisualtask AnimTask_GetWeatherToSet, 2 + jumpreteq 1, General_Sun + jumpreteq 2, General_Rain + jumpreteq 3, General_Sandstorm + jumpreteq 4, General_Hail + end + +Move_MAX_GUARD: + createvisualtask AnimTask_DynamaxGrowth, 0x5, 0x1, 0x1 + waitforvisualfinish + goto Move_PROTECT + end + +Move_MAX_STRIKE: +Move_G_MAX_REPLENISH: + createvisualtask AnimTask_DynamaxGrowth, 0x5, 0x1, 0x1 + waitforvisualfinish + goto Move_GIGA_IMPACT + end + +Move_MAX_AIRSTREAM: +Move_G_MAX_WIND_RAGE: + createvisualtask AnimTask_DynamaxGrowth, 0x5, 0x1, 0x1 + waitforvisualfinish + goto Move_AEROBLAST + end + +Move_MAX_OOZE: +Move_G_MAX_MALODOR: + createvisualtask AnimTask_DynamaxGrowth, 0x5, 0x1, 0x1 + waitforvisualfinish + goto Move_GUNK_SHOT + end + +Move_G_MAX_WILDFIRE: +Move_G_MAX_FIREBALL: +Move_G_MAX_CENTIFERNO: +Move_MAX_FLARE: + createvisualtask AnimTask_DynamaxGrowth, 0x5, 0x1, 0x1 + waitforvisualfinish + goto Move_BLAST_BURN + end + +Move_G_MAX_CANNONADE: +Move_G_MAX_HYDROSNIPE: +Move_G_MAX_FOAM_BURST: +Move_MAX_GEYSER: + createvisualtask AnimTask_DynamaxGrowth, 0x5, 0x1, 0x1 + waitforvisualfinish + goto Move_HYDRO_CANNON + end + +Move_G_MAX_VINE_LASH: +Move_G_MAX_DRUM_SOLO: +Move_G_MAX_TARTNESS: +Move_G_MAX_SWEETNESS: +Move_MAX_OVERGROWTH: + createvisualtask AnimTask_DynamaxGrowth, 0x5, 0x1, 0x1 + waitforvisualfinish + goto Move_FRENZY_PLANT + end + +Move_MAX_LIGHTNING: +Move_G_MAX_STUN_SHOCK: + createvisualtask AnimTask_DynamaxGrowth, 0x5, 0x1, 0x1 + waitforvisualfinish + goto Move_ZAP_CANNON + end + +Move_G_MAX_CHI_STRIKE: +Move_G_MAX_ONE_BLOW: +Move_G_MAX_RAPID_FLOW: +Move_MAX_KNUCKLE: + createvisualtask AnimTask_DynamaxGrowth, 0x5, 0x1, 0x1 + waitforvisualfinish + goto Move_CLOSE_COMBAT + end + +Move_G_MAX_RESONANCE: +Move_MAX_HAILSTORM: + createvisualtask AnimTask_DynamaxGrowth, 0x5, 0x1, 0x1 + waitforvisualfinish + goto Move_SHEER_COLD + end + +Move_G_MAX_SANDBLAST: +Move_MAX_QUAKE: + createvisualtask AnimTask_DynamaxGrowth, 0x5, 0x1, 0x1 + waitforvisualfinish + goto Move_FISSURE + end + +Move_G_MAX_BEFUDDLE: +Move_MAX_FLUTTERBY: + createvisualtask AnimTask_DynamaxGrowth, 0x5, 0x1, 0x1 + waitforvisualfinish + goto Move_BUG_BUZZ + end + +Move_G_MAX_STEELSURGE: +Move_G_MAX_MELTDOWN: +Move_MAX_STEELSPIKE: + createvisualtask AnimTask_DynamaxGrowth, 0x5, 0x1, 0x1 + waitforvisualfinish + goto Move_HEAVY_SLAM + end + +Move_G_MAX_TERROR: +Move_MAX_PHANTASM: + createvisualtask AnimTask_DynamaxGrowth, 0x5, 0x1, 0x1 + waitforvisualfinish + goto Move_PHANTOM_FORCE + end + +Move_G_MAX_GRAVITAS: +Move_MAX_MINDSTORM: + createvisualtask AnimTask_DynamaxGrowth, 0x5, 0x1, 0x1 + waitforvisualfinish + goto Move_PSYCHO_BOOST + end + +Move_G_MAX_SMITE: +Move_G_MAX_FINALE: +Move_MAX_STARFALL: + createvisualtask AnimTask_DynamaxGrowth, 0x5, 0x1, 0x1 + waitforvisualfinish + goto Move_MOONBLAST + end + +Move_G_MAX_STONESURGE: +Move_G_MAX_VOLCALITH: +Move_MAX_ROCKFALL: + createvisualtask AnimTask_DynamaxGrowth, 0x5, 0x1, 0x1 + waitforvisualfinish + goto Move_ROCK_WRECKER + end + +Move_G_MAX_DEPLETION: +Move_MAX_WYRMWIND: + createvisualtask AnimTask_DynamaxGrowth, 0x5, 0x1, 0x1 + waitforvisualfinish + goto Move_SPACIAL_REND + end + +Move_G_MAX_SNOOZE: +Move_MAX_DARKNESS: + createvisualtask AnimTask_DynamaxGrowth, 0x5, 0x1, 0x1 + waitforvisualfinish + goto Move_DARK_PULSE + end + +Move_G_MAX_CUDDLE: + createvisualtask AnimTask_DynamaxGrowth, 0x5, 0x1, 0x1 + waitforvisualfinish + goto Move_COVET + end + +Move_G_MAX_VOLT_CRASH: + createvisualtask AnimTask_DynamaxGrowth, 0x5, 0x1, 0x1 + waitforvisualfinish + goto Move_VOLT_TACKLE + end + +Move_G_MAX_GOLD_RUSH: + createvisualtask AnimTask_DynamaxGrowth, 0x5, 0x1, 0x1 + waitforvisualfinish + goto Move_PAY_DAY + end + +@@@ DYNAMAX AND MAX RAIDS +General_DynamaxGrowth:: @ PORTED FROM CFRU + createvisualtask SoundTask_PlayCryWithEcho, 2, ANIM_ATTACKER, 2 + delay 8 + createvisualtask AnimTask_DynamaxGrowth, 0x5, 0x1, 0x0 + waitforvisualfinish + end diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index cc8203570566..5a0bb8ffb634 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -416,7 +416,7 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectVictoryDance @ EFFECT_VICTORY_DANCE .4byte BattleScript_EffectTeatime @ EFFECT_TEATIME .4byte BattleScript_EffectAttackUpUserAlly @ EFFECT_ATTACK_UP_USER_ALLY - .4byte BattleScript_EffectShellTrap @ EFFECT_SHELL_TRAP + .4byte BattleScript_EffectShellTrap @ EFFECT_SHELL_TRAP .4byte BattleScript_EffectHit @ EFFECT_PSYBLADE .4byte BattleScript_EffectHit @ EFFECT_HYDRO_STEAM .4byte BattleScript_EffectHitSetEntryHazard @ EFFECT_HIT_SET_ENTRY_HAZARD @@ -437,10 +437,10 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectMortalSpin @ EFFECT_MORTAL_SPIN .4byte BattleScript_EffectHit @ EFFECT_GIGATON_HAMMER .4byte BattleScript_EffectSaltCure @ EFFECT_SALT_CURE - .4byte BattleScript_EffectMatchaGotcha @ EFFECT_MATCHA_GOTCHA .4byte BattleScript_EffectSyrupBomb @ EFFECT_SYRUP_BOMB .4byte BattleScript_EffectHit @ EFFECT_IVY_CUDGEL + .4byte BattleScript_EffectMaxMove @ EFFECT_MAX_MOVE BattleScript_EffectSyrupBomb:: setmoveeffect MOVE_EFFECT_SYRUP_BOMB @@ -2138,10 +2138,14 @@ BattleScript_EffectHitSwitchTarget: moveendall jumpifability BS_TARGET, ABILITY_SUCTION_CUPS, BattleScript_AbilityPreventsPhasingOut jumpifstatus3 BS_TARGET, STATUS3_ROOTED, BattleScript_PrintMonIsRooted + jumpiftargetdynamaxed BattleScript_HitSwitchTargetDynamaxed tryhitswitchtarget BattleScript_MoveEnd forcerandomswitch BattleScript_HitSwitchTargetForceRandomSwitchFailed goto BattleScript_MoveEnd +BattleScript_HitSwitchTargetDynamaxed: + printstring STRINGID_MOVEBLOCKEDBYDYNAMAX + waitmessage B_WAIT_TIME_LONG BattleScript_HitSwitchTargetForceRandomSwitchFailed: hitswitchtargetfailed setbyte sSWITCH_CASE, B_SWITCH_NORMAL @@ -3037,6 +3041,7 @@ BattleScript_EffectGravity: setgravity BattleScript_ButItFailed attackanimation waitanimation +BattleScript_EffectGravitySuccess:: printstring STRINGID_GRAVITYINTENSIFIED waitmessage B_WAIT_TIME_LONG selectfirstvalidtarget @@ -3727,11 +3732,17 @@ BattleScript_EffectRoar:: jumpifability BS_TARGET, ABILITY_GUARD_DOG, BattleScript_ButItFailed jumpifability BS_TARGET, ABILITY_SUCTION_CUPS, BattleScript_AbilityPreventsPhasingOut jumpifstatus3 BS_TARGET, STATUS3_ROOTED, BattleScript_PrintMonIsRooted + jumpiftargetdynamaxed BattleScript_RoarBlockedByDynamax accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE jumpifbattletype BATTLE_TYPE_ARENA, BattleScript_ButItFailed forcerandomswitch BattleScript_ButItFailed +BattleScript_RoarBlockedByDynamax: + printstring STRINGID_MOVEBLOCKEDBYDYNAMAX + waitmessage B_WAIT_TIME_LONG + goto BattleScript_MoveEnd + BattleScript_EffectMultiHit:: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE @@ -4174,6 +4185,7 @@ BattleScript_EffectReflect:: BattleScript_PrintReflectLightScreenSafeguardString:: attackanimation waitanimation +BattleScript_EffectAuroraVeilSuccess:: printfromtable gReflectLightScreenSafeguardStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -5926,6 +5938,7 @@ BattleScript_EffectYawn:: setyawn BattleScript_ButItFailed attackanimation waitanimation + BattleScript_EffectYawnSuccess:: printstring STRINGID_PKMNWASMADEDROWSY waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -6620,6 +6633,7 @@ BattleScript_PursuitSwitchDmgLoop:: BattleScript_DoSwitchOut:: decrementmultihit BattleScript_PursuitSwitchDmgLoop switchoutabilities BS_ATTACKER + updatedynamax waitstate returnatktoball waitstate @@ -7367,6 +7381,11 @@ BattleScript_StealthRockFree:: printstring STRINGID_PKMNBLEWAWAYSTEALTHROCK waitmessage B_WAIT_TIME_LONG return + +BattleScript_SteelsurgeFree:: + printstring STRINGID_PKMNBLEWAWAYSHARPSTEEL + waitmessage B_WAIT_TIME_LONG + return BattleScript_SpikesDefog:: printstring STRINGID_SPIKESDISAPPEAREDFROMTEAM @@ -7388,6 +7407,11 @@ BattleScript_StealthRockDefog:: waitmessage B_WAIT_TIME_LONG return +BattleScript_SteelsurgeDefog:: + printstring STRINGID_SHARPSTEELDISAPPEAREDFROMTEAM + waitmessage B_WAIT_TIME_LONG + return + BattleScript_MonTookFutureAttack:: printstring STRINGID_PKMNTOOKATTACK waitmessage B_WAIT_TIME_LONG @@ -10202,6 +10226,7 @@ BattleScript_RedCardActivates:: swapattackerwithtarget jumpifstatus3 BS_EFFECT_BATTLER, STATUS3_ROOTED, BattleScript_RedCardIngrain jumpifability BS_EFFECT_BATTLER, ABILITY_SUCTION_CUPS, BattleScript_RedCardSuctionCups + jumpiftargetdynamaxed BattleScript_RedCardDynamaxed removeitem BS_SCRIPTING setbyte sSWITCH_CASE, B_SWITCH_RED_CARD forcerandomswitch BattleScript_RedCardEnd @@ -10220,6 +10245,12 @@ BattleScript_RedCardSuctionCups: removeitem BS_SCRIPTING swapattackerwithtarget return +BattleScript_RedCardDynamaxed: + printstring STRINGID_MOVEBLOCKEDBYDYNAMAX + waitmessage B_WAIT_TIME_LONG + removeitem BS_SCRIPTING + swapattackerwithtarget + return BattleScript_EjectButtonActivates:: makevisible BS_ATTACKER @@ -10358,6 +10389,294 @@ BattleScript_TargetAbilityStatRaiseRet_End: copybyte gBattlerAttacker, sSAVED_BATTLER return +@@@ MAX MOVES @@@ +BattleScript_EffectMaxMove:: + attackcanceler + accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON + attackstring + ppreduce + critcalc + damagecalc + adjustdamage + attackanimation + waitanimation + effectivenesssound + hitanimation BS_TARGET + waitstate + healthbarupdate BS_TARGET + datahpupdate BS_TARGET + critmessage + waitmessage B_WAIT_TIME_LONG + resultmessage + waitmessage B_WAIT_TIME_LONG + tryfaintmon BS_TARGET + setmaxmoveeffect + moveendall + end + +BattleScript_EffectRaiseStatAllies:: + savetarget + copybyte gBattlerTarget, gBattlerAttacker +BattleScript_RaiseSideStatsLoop: + jumpifabsent BS_TARGET, BattleScript_RaiseSideStatsIncrement + statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_RaiseSideStatsIncrement + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_RaiseSideStatsIncrement + setgraphicalstatchangevalues + playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + printfromtable gStatUpStringIds + waitmessage B_WAIT_TIME_LONG +BattleScript_RaiseSideStatsIncrement: + setbyte sSTAT_ANIM_PLAYED, FALSE + jumpifbytenotequal gBattlerTarget, gBattlerAttacker, BattleScript_RaiseSideStatsEnd + setallytonexttarget BattleScript_RaiseSideStatsLoop +BattleScript_RaiseSideStatsEnd: + restoretarget + goto BattleScript_MoveEnd + +BattleScript_EffectLowerStatFoes:: + savetarget + copybyte sBATTLER, gBattlerTarget +BattleScript_LowerSideStatsLoop: + jumpifabsent BS_TARGET, BattleScript_LowerSideStatsIncrement + statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_LowerSideStatsIncrement + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_LowerSideStatsIncrement + setgraphicalstatchangevalues + playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + printfromtable gStatDownStringIds + waitmessage B_WAIT_TIME_LONG +BattleScript_LowerSideStatsIncrement: + setbyte sSTAT_ANIM_PLAYED, FALSE + jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_LowerSideStatsEnd + setallytonexttarget BattleScript_LowerSideStatsLoop +BattleScript_LowerSideStatsEnd: + restoretarget + goto BattleScript_MoveEnd + +BattleScript_EffectSetWeather:: + playanimation 0, B_ANIM_MAX_SET_WEATHER + printfromtable gMoveWeatherChangeStringIds + waitmessage B_WAIT_TIME_LONG + call BattleScript_ActivateWeatherAbilities + goto BattleScript_MoveEnd + +BattleScript_EffectSetTerrain:: + printfromtable gTerrainStringIds + waitmessage B_WAIT_TIME_LONG + playanimation BS_ATTACKER, B_ANIM_RESTORE_BG + call BattleScript_ActivateTerrainEffects + goto BattleScript_MoveEnd + +BattleScript_DamageNonTypesStarts:: + printfromtable gDamageNonTypesStartStringIds + waitmessage B_WAIT_TIME_LONG + goto BattleScript_MoveEnd + +BattleScript_DamageNonTypesContinues:: + setbyte gBattleCommunication, 0 +BattleScript_DamageNonTypesLoop:: + copyarraywithindex gBattlerAttacker, gBattlerByTurnOrder, gBattleCommunication, 1 + damagenontypes + jumpifword CMP_EQUAL, gBattleMoveDamage, 0, BattleScript_DamageNonTypesLoopIncrement + printfromtable gDamageNonTypesDmgStringIds + waitmessage B_WAIT_TIME_LONG + effectivenesssound + hitanimation BS_ATTACKER + orword gHitMarker, HITMARKER_SKIP_DMG_TRACK | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE | HITMARKER_GRUDGE + healthbarupdate BS_ATTACKER + datahpupdate BS_ATTACKER + tryfaintmon BS_ATTACKER + checkteamslost BattleScript_DamageNonTypesLoopIncrement +BattleScript_DamageNonTypesLoopIncrement:: + jumpifbyte CMP_NOT_EQUAL, gBattleOutcome, 0, BattleScript_DamageNonTypesContinuesEnd + addbyte gBattleCommunication, 1 + jumpifbytenotequal gBattleCommunication, gBattlersCount, BattleScript_DamageNonTypesLoop +BattleScript_DamageNonTypesContinuesEnd:: + bicword gHitMarker, HITMARKER_SKIP_DMG_TRACK | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE | HITMARKER_GRUDGE + end2 + +BattleScript_EffectTryReducePP:: + tryspiteppreduce BattleScript_MoveEnd + printstring STRINGID_PKMNREDUCEDPP + waitmessage B_WAIT_TIME_LONG + goto BattleScript_MoveEnd + +BattleScript_EffectStatus1Foes:: + savetarget + copybyte sBATTLER, gBattlerTarget +BattleScript_Status1FoesLoop: + jumpifabsent BS_TARGET, BattleScript_Status1FoesIncrement + trysetstatus1 BattleScript_Status1FoesIncrement + statusanimation BS_TARGET + updatestatusicon BS_TARGET + printfromtable gStatusConditionsStringIds + waitmessage B_WAIT_TIME_LONG + updatestatusicon BS_EFFECT_BATTLER + waitstate +BattleScript_Status1FoesIncrement: + jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_Status1FoesEnd + setallytonexttarget BattleScript_Status1FoesLoop +BattleScript_Status1FoesEnd: + restoretarget + goto BattleScript_MoveEnd + +BattleScript_EffectStatus2Foes:: + savetarget + copybyte sBATTLER, gBattlerTarget +BattleScript_Status2FoesLoop: + jumpifabsent BS_TARGET, BattleScript_Status2FoesIncrement + trysetstatus2 BattleScript_Status2FoesIncrement + jumpifbyte CMP_EQUAL, gBattleCommunication, 1, BattleScript_DoConfuseAnim + jumpifbyte CMP_EQUAL, gBattleCommunication, 2, BattleScript_DoInfatuationAnim +BattleScript_Status2FoesPrintMessage: + printfromtable gStatus2StringIds + waitmessage B_WAIT_TIME_LONG +BattleScript_Status2FoesIncrement: + jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_Status2FoesEnd + setallytonexttarget BattleScript_Status2FoesLoop +BattleScript_Status2FoesEnd: + restoretarget + jumpifbyte CMP_EQUAL, gBattleCommunication + 1, 1, BattleScript_PrintCoinsScattered @ Gold Rush + goto BattleScript_MoveEnd + +BattleScript_DoConfuseAnim: + status2animation BS_EFFECT_BATTLER, STATUS2_CONFUSION + goto BattleScript_Status2FoesPrintMessage + +BattleScript_DoInfatuationAnim: + status2animation BS_EFFECT_BATTLER, STATUS2_INFATUATION + goto BattleScript_Status2FoesPrintMessage + +BattleScript_PrintCoinsScattered: + printstring STRINGID_COINSSCATTERED + goto BattleScript_MoveEnd + +BattleScript_TormentEnds:: + printstring STRINGID_TORMENTEDNOMORE + waitmessage B_WAIT_TIME_LONG + end2 + +BattleScript_EffectRaiseCritAlliesAnim:: + savetarget + copybyte gBattlerTarget, gBattlerAttacker +BattleScript_RaiseCritAlliesLoop: + jumpifabsent BS_TARGET, BattleScript_RaiseCritAlliesIncrement + setstatchanger STAT_ATK, 0, FALSE @ for animation + setgraphicalstatchangevalues + playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + swapattackerwithtarget + printstring STRINGID_PKMNGETTINGPUMPED + waitmessage B_WAIT_TIME_LONG + swapattackerwithtarget +BattleScript_RaiseCritAlliesIncrement: + setbyte sSTAT_ANIM_PLAYED, FALSE + jumpifbytenotequal gBattlerTarget, gBattlerAttacker, BattleScript_RaiseCritAlliesEnd + setallytonexttarget BattleScript_RaiseCritAlliesLoop +BattleScript_RaiseCritAlliesEnd: + restoretarget + goto BattleScript_MoveEnd + +BattleScript_EffectHealOneSixthAllies:: + jumpifteamhealthy BS_ATTACKER, BattleScript_MoveEnd + savetarget + copybyte gBattlerTarget, gBattlerAttacker +BattleScript_HealOneSixthAlliesLoop: + jumpifabsent BS_TARGET, BattleScript_HealOneSixthAlliesIncrement + tryhealsixthhealth BattleScript_HealOneSixthAlliesIncrement + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE + healthbarupdate BS_TARGET + datahpupdate BS_TARGET + printstring STRINGID_PKMNREGAINEDHEALTH + waitmessage B_WAIT_TIME_LONG +BattleScript_HealOneSixthAlliesIncrement: + jumpifbytenotequal gBattlerTarget, gBattlerAttacker, BattleScript_HealOneSixthAlliesEnd + setallytonexttarget BattleScript_HealOneSixthAlliesLoop +BattleScript_HealOneSixthAlliesEnd: + restoretarget + goto BattleScript_MoveEnd + +BattleScript_EffectCureStatusAllies:: + jumpifteamhealthy BS_ATTACKER, BattleScript_MoveEnd + savetarget + copybyte gBattlerTarget, gBattlerAttacker +BattleScript_CureStatusAlliesLoop: + jumpifabsent BS_TARGET, BattleScript_CureStatusAlliesIncrement + jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_CureStatusActivate +BattleScript_CureStatusAlliesIncrement: + jumpifbytenotequal gBattlerTarget, gBattlerAttacker, BattleScript_CureStatusAlliesEnd + setallytonexttarget BattleScript_CureStatusAlliesLoop +BattleScript_CureStatusAlliesEnd: + restoretarget + goto BattleScript_MoveEnd + +BattleScript_CureStatusActivate: + curestatus BS_TARGET + updatestatusicon BS_TARGET + swapattackerwithtarget + printstring STRINGID_PKMNSTATUSNORMAL + waitmessage B_WAIT_TIME_LONG + swapattackerwithtarget + goto BattleScript_CureStatusAlliesIncrement + +BattleScript_EffectRecycleBerriesAllies:: + savetarget + copybyte gBattlerTarget, gBattlerAttacker +BattleScript_RecycleBerriesAlliesLoop: + jumpifabsent BS_TARGET, BattleScript_RecycleBerriesAlliesIncrement + tryrecycleberry BattleScript_RecycleBerriesAlliesIncrement + swapattackerwithtarget + printstring STRINGID_XFOUNDONEY + waitmessage B_WAIT_TIME_LONG + swapattackerwithtarget +BattleScript_RecycleBerriesAlliesIncrement: + jumpifbytenotequal gBattlerTarget, gBattlerAttacker, BattleScript_RecycleBerriesAlliesEnd + setallytonexttarget BattleScript_RecycleBerriesAlliesLoop +BattleScript_RecycleBerriesAlliesEnd: + restoretarget + goto BattleScript_MoveEnd + +BattleScript_EffectStonesurge:: + setstealthrock BattleScript_MoveEnd + printfromtable gDmgHazardsStringIds + waitmessage B_WAIT_TIME_LONG + goto BattleScript_MoveEnd + +BattleScript_EffectSteelsurge:: + setsteelsurge BattleScript_MoveEnd + printfromtable gDmgHazardsStringIds + waitmessage B_WAIT_TIME_LONG + goto BattleScript_MoveEnd + +@@@ END MAX MOVES @@@ + +BattleScript_DynamaxBegins:: + printstring STRINGID_EMPTYSTRING3 + returnatktoball + pause B_WAIT_TIME_SHORT + returntoball BS_SCRIPTING + switchinanim BS_SCRIPTING, TRUE + updatedynamax + playanimation BS_SCRIPTING, B_ANIM_DYNAMAX_GROWTH + waitanimation + end3 + +BattleScript_DynamaxEnds:: + printstring STRINGID_EMPTYSTRING3 + updatedynamax + playanimation BS_SCRIPTING, B_ANIM_FORM_CHANGE + waitanimation + end2 + +BattleScript_MoveBlockedByDynamax:: + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + pause B_WAIT_TIME_SHORT + ppreduce + jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_STRING_PRINTED, BattleScript_MoveEnd + printstring STRINGID_MOVEBLOCKEDBYDYNAMAX + waitmessage B_WAIT_TIME_LONG + orword gHitMarker, HITMARKER_STRING_PRINTED + goto BattleScript_MoveEnd + BattleScript_PokemonCantUseTheMove:: attackstring ppreduce diff --git a/graphics/battle_interface/dynamax_indicator.png b/graphics/battle_interface/dynamax_indicator.png new file mode 100644 index 000000000000..ebfbe86da62b Binary files /dev/null and b/graphics/battle_interface/dynamax_indicator.png differ diff --git a/graphics/battle_interface/dynamax_trigger.png b/graphics/battle_interface/dynamax_trigger.png new file mode 100644 index 000000000000..18f3a84cff77 Binary files /dev/null and b/graphics/battle_interface/dynamax_trigger.png differ diff --git a/graphics/battle_interface/misc_indicator.pal b/graphics/battle_interface/misc_indicator.pal new file mode 100644 index 000000000000..112841820094 --- /dev/null +++ b/graphics/battle_interface/misc_indicator.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 0 +224 74 106 +236 234 108 +154 45 48 +244 162 132 +32 127 216 +16 75 156 +184 224 240 +136 184 224 +213 207 207 +246 246 246 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/alcremie/gigantamax/back.png b/graphics/pokemon/alcremie/gigantamax/back.png new file mode 100644 index 000000000000..8c3a12e19efa Binary files /dev/null and b/graphics/pokemon/alcremie/gigantamax/back.png differ diff --git a/graphics/pokemon/alcremie/gigantamax/front.png b/graphics/pokemon/alcremie/gigantamax/front.png new file mode 100644 index 000000000000..30d6ee4e8f24 Binary files /dev/null and b/graphics/pokemon/alcremie/gigantamax/front.png differ diff --git a/graphics/pokemon/alcremie/gigantamax/icon.png b/graphics/pokemon/alcremie/gigantamax/icon.png new file mode 100644 index 000000000000..10ba520d1c0a Binary files /dev/null and b/graphics/pokemon/alcremie/gigantamax/icon.png differ diff --git a/graphics/pokemon/alcremie/gigantamax/normal.pal b/graphics/pokemon/alcremie/gigantamax/normal.pal new file mode 100644 index 000000000000..dcc78ed9237c --- /dev/null +++ b/graphics/pokemon/alcremie/gigantamax/normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +147 116 87 +16 16 16 +214 191 164 +253 241 208 +217 194 40 +254 255 112 +185 119 190 +164 153 183 +240 189 195 +254 109 38 +232 254 23 +86 225 210 +247 86 144 +28 151 140 +226 122 129 diff --git a/graphics/pokemon/alcremie/gigantamax/shiny.pal b/graphics/pokemon/alcremie/gigantamax/shiny.pal new file mode 100644 index 000000000000..092c301bad6d --- /dev/null +++ b/graphics/pokemon/alcremie/gigantamax/shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +108 127 125 +16 16 16 +184 203 202 +240 253 255 +35 36 35 +66 69 66 +185 119 190 +91 69 73 +139 113 119 +254 109 38 +232 254 23 +187 157 165 +247 86 144 +28 151 140 +75 79 75 diff --git a/graphics/pokemon/appletun/gigantamax/back.png b/graphics/pokemon/appletun/gigantamax/back.png new file mode 100644 index 000000000000..610d98112b74 Binary files /dev/null and b/graphics/pokemon/appletun/gigantamax/back.png differ diff --git a/graphics/pokemon/appletun/gigantamax/front.png b/graphics/pokemon/appletun/gigantamax/front.png new file mode 100644 index 000000000000..65c716e9e8e0 Binary files /dev/null and b/graphics/pokemon/appletun/gigantamax/front.png differ diff --git a/graphics/pokemon/appletun/gigantamax/icon.png b/graphics/pokemon/appletun/gigantamax/icon.png new file mode 100644 index 000000000000..b7ecabd4695c Binary files /dev/null and b/graphics/pokemon/appletun/gigantamax/icon.png differ diff --git a/graphics/pokemon/appletun/gigantamax/normal.pal b/graphics/pokemon/appletun/gigantamax/normal.pal new file mode 100644 index 000000000000..2d5dabef1ea8 --- /dev/null +++ b/graphics/pokemon/appletun/gigantamax/normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +16 16 16 +166 49 57 +119 38 40 +198 138 72 +141 66 41 +233 197 88 +66 118 56 +210 57 77 +179 172 98 +249 249 249 +44 72 40 +218 208 139 +57 164 61 +213 68 86 +15 15 15 diff --git a/graphics/pokemon/appletun/gigantamax/shiny.pal b/graphics/pokemon/appletun/gigantamax/shiny.pal new file mode 100644 index 000000000000..4514eb418d5f --- /dev/null +++ b/graphics/pokemon/appletun/gigantamax/shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +16 16 16 +55 143 41 +35 91 27 +198 138 72 +141 66 41 +233 197 88 +66 118 56 +75 183 48 +179 172 98 +249 249 249 +44 72 40 +218 208 139 +57 164 61 +213 68 86 +15 15 15 diff --git a/graphics/pokemon/blastoise/gigantamax/back.png b/graphics/pokemon/blastoise/gigantamax/back.png new file mode 100644 index 000000000000..cd9d607f5545 Binary files /dev/null and b/graphics/pokemon/blastoise/gigantamax/back.png differ diff --git a/graphics/pokemon/blastoise/gigantamax/front.png b/graphics/pokemon/blastoise/gigantamax/front.png new file mode 100644 index 000000000000..c4608e67ddb7 Binary files /dev/null and b/graphics/pokemon/blastoise/gigantamax/front.png differ diff --git a/graphics/pokemon/blastoise/gigantamax/icon.png b/graphics/pokemon/blastoise/gigantamax/icon.png new file mode 100644 index 000000000000..9761dfbe53cf Binary files /dev/null and b/graphics/pokemon/blastoise/gigantamax/icon.png differ diff --git a/graphics/pokemon/blastoise/gigantamax/normal.pal b/graphics/pokemon/blastoise/gigantamax/normal.pal new file mode 100644 index 000000000000..2b7f1254f594 --- /dev/null +++ b/graphics/pokemon/blastoise/gigantamax/normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +8 58 99 +16 16 16 +90 140 206 +33 99 173 +205 205 213 +74 74 74 +53 46 39 +199 84 53 +148 148 148 +253 253 253 +108 232 214 +73 65 54 +95 86 71 +148 173 230 +206 206 214 diff --git a/graphics/pokemon/blastoise/gigantamax/shiny.pal b/graphics/pokemon/blastoise/gigantamax/shiny.pal new file mode 100644 index 000000000000..f7906a9da861 --- /dev/null +++ b/graphics/pokemon/blastoise/gigantamax/shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +115 82 148 +16 16 16 +213 180 246 +164 123 189 +205 205 213 +74 74 74 +66 53 42 +199 84 53 +148 148 148 +253 253 253 +108 232 214 +92 75 62 +140 126 83 +238 222 255 +206 206 214 diff --git a/graphics/pokemon/butterfree/gigantamax/back.png b/graphics/pokemon/butterfree/gigantamax/back.png new file mode 100644 index 000000000000..a9bce5aaf1ad Binary files /dev/null and b/graphics/pokemon/butterfree/gigantamax/back.png differ diff --git a/graphics/pokemon/butterfree/gigantamax/front.png b/graphics/pokemon/butterfree/gigantamax/front.png new file mode 100644 index 000000000000..0fc4c4c70f7b Binary files /dev/null and b/graphics/pokemon/butterfree/gigantamax/front.png differ diff --git a/graphics/pokemon/butterfree/gigantamax/icon.png b/graphics/pokemon/butterfree/gigantamax/icon.png new file mode 100644 index 000000000000..9b18cd6e8d5f Binary files /dev/null and b/graphics/pokemon/butterfree/gigantamax/icon.png differ diff --git a/graphics/pokemon/butterfree/gigantamax/normal.pal b/graphics/pokemon/butterfree/gigantamax/normal.pal new file mode 100644 index 000000000000..17ad51006fd3 --- /dev/null +++ b/graphics/pokemon/butterfree/gigantamax/normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 194 14 +134 122 150 +100 87 122 +70 52 92 +106 189 205 +82 123 197 +179 242 219 +238 238 255 +189 189 230 +140 206 188 +146 233 150 +39 167 119 +255 156 180 +230 98 131 +222 49 49 +16 16 16 diff --git a/graphics/pokemon/butterfree/gigantamax/shiny.pal b/graphics/pokemon/butterfree/gigantamax/shiny.pal new file mode 100644 index 000000000000..3d3e6ed267d7 --- /dev/null +++ b/graphics/pokemon/butterfree/gigantamax/shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 194 14 +131 131 189 +115 98 172 +90 74 115 +246 139 131 +222 82 98 +179 242 219 +238 238 255 +189 189 230 +140 206 188 +146 233 150 +39 167 119 +156 255 156 +115 238 115 +32 213 24 +16 16 16 diff --git a/graphics/pokemon/centiskorch/gigantamax/back.png b/graphics/pokemon/centiskorch/gigantamax/back.png new file mode 100644 index 000000000000..2279b3a0659f Binary files /dev/null and b/graphics/pokemon/centiskorch/gigantamax/back.png differ diff --git a/graphics/pokemon/centiskorch/gigantamax/front.png b/graphics/pokemon/centiskorch/gigantamax/front.png new file mode 100644 index 000000000000..a35501c2bbb6 Binary files /dev/null and b/graphics/pokemon/centiskorch/gigantamax/front.png differ diff --git a/graphics/pokemon/centiskorch/gigantamax/icon.png b/graphics/pokemon/centiskorch/gigantamax/icon.png new file mode 100644 index 000000000000..811a3c4991fc Binary files /dev/null and b/graphics/pokemon/centiskorch/gigantamax/icon.png differ diff --git a/graphics/pokemon/centiskorch/gigantamax/normal.pal b/graphics/pokemon/centiskorch/gigantamax/normal.pal new file mode 100644 index 000000000000..5ce935aa187e --- /dev/null +++ b/graphics/pokemon/centiskorch/gigantamax/normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +215 44 0 +255 155 27 +64 30 33 +255 247 0 +16 16 16 +85 19 7 +115 66 57 +82 40 41 +205 45 26 +255 90 66 +255 213 0 +156 27 15 +251 251 251 +148 21 40 +15 15 15 diff --git a/graphics/pokemon/centiskorch/gigantamax/shiny.pal b/graphics/pokemon/centiskorch/gigantamax/shiny.pal new file mode 100644 index 000000000000..26404703abd6 --- /dev/null +++ b/graphics/pokemon/centiskorch/gigantamax/shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +215 44 0 +255 155 27 +6 31 51 +255 247 0 +16 16 16 +85 19 7 +43 94 109 +20 54 73 +205 45 26 +255 90 66 +255 213 0 +156 27 15 +251 251 251 +148 21 40 +15 15 15 diff --git a/graphics/pokemon/charizard/gigantamax/back.png b/graphics/pokemon/charizard/gigantamax/back.png new file mode 100644 index 000000000000..508e18c5497e Binary files /dev/null and b/graphics/pokemon/charizard/gigantamax/back.png differ diff --git a/graphics/pokemon/charizard/gigantamax/front.png b/graphics/pokemon/charizard/gigantamax/front.png new file mode 100644 index 000000000000..c1f43003ac86 Binary files /dev/null and b/graphics/pokemon/charizard/gigantamax/front.png differ diff --git a/graphics/pokemon/charizard/gigantamax/icon.png b/graphics/pokemon/charizard/gigantamax/icon.png new file mode 100644 index 000000000000..68461c5032f5 Binary files /dev/null and b/graphics/pokemon/charizard/gigantamax/icon.png differ diff --git a/graphics/pokemon/charizard/gigantamax/normal.pal b/graphics/pokemon/charizard/gigantamax/normal.pal new file mode 100644 index 000000000000..533e9772e003 --- /dev/null +++ b/graphics/pokemon/charizard/gigantamax/normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +255 66 0 +255 214 16 +247 165 16 +255 232 119 +16 16 16 +132 49 25 +239 132 41 +206 82 66 +252 252 252 +214 41 44 +239 181 90 +213 207 174 +162 54 43 +14 14 14 +15 15 15 diff --git a/graphics/pokemon/charizard/gigantamax/shiny.pal b/graphics/pokemon/charizard/gigantamax/shiny.pal new file mode 100644 index 000000000000..bae527ee2e16 --- /dev/null +++ b/graphics/pokemon/charizard/gigantamax/shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +255 66 0 +255 214 16 +247 165 16 +255 232 119 +16 16 16 +49 57 65 +131 123 148 +90 90 106 +252 252 252 +214 41 44 +169 163 183 +213 207 174 +66 66 82 +14 14 14 +15 15 15 diff --git a/graphics/pokemon/cinderace/gigantamax/back.png b/graphics/pokemon/cinderace/gigantamax/back.png new file mode 100644 index 000000000000..b9e6b813de2c Binary files /dev/null and b/graphics/pokemon/cinderace/gigantamax/back.png differ diff --git a/graphics/pokemon/cinderace/gigantamax/front.png b/graphics/pokemon/cinderace/gigantamax/front.png new file mode 100644 index 000000000000..e3739d90620c Binary files /dev/null and b/graphics/pokemon/cinderace/gigantamax/front.png differ diff --git a/graphics/pokemon/cinderace/gigantamax/icon.png b/graphics/pokemon/cinderace/gigantamax/icon.png new file mode 100644 index 000000000000..3d1f1e423751 Binary files /dev/null and b/graphics/pokemon/cinderace/gigantamax/icon.png differ diff --git a/graphics/pokemon/cinderace/gigantamax/normal.pal b/graphics/pokemon/cinderace/gigantamax/normal.pal new file mode 100644 index 000000000000..a1782790ab1c --- /dev/null +++ b/graphics/pokemon/cinderace/gigantamax/normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +125 118 121 +16 16 16 +190 182 183 +115 26 13 +175 39 20 +254 226 90 +235 93 36 +254 238 160 +237 151 35 +244 201 28 +104 85 25 +7 33 69 +0 65 148 +248 248 248 +252 252 252 diff --git a/graphics/pokemon/cinderace/gigantamax/shiny.pal b/graphics/pokemon/cinderace/gigantamax/shiny.pal new file mode 100644 index 000000000000..e4454df01197 --- /dev/null +++ b/graphics/pokemon/cinderace/gigantamax/shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +80 77 73 +16 16 16 +136 133 128 +118 50 8 +180 75 12 +254 226 90 +228 119 19 +254 238 160 +237 151 35 +244 201 28 +104 85 25 +132 120 120 +252 252 252 +179 186 175 +254 254 254 diff --git a/graphics/pokemon/coalossal/gigantamax/back.png b/graphics/pokemon/coalossal/gigantamax/back.png new file mode 100644 index 000000000000..907768dc8192 Binary files /dev/null and b/graphics/pokemon/coalossal/gigantamax/back.png differ diff --git a/graphics/pokemon/coalossal/gigantamax/front.png b/graphics/pokemon/coalossal/gigantamax/front.png new file mode 100644 index 000000000000..efd49d97e45e Binary files /dev/null and b/graphics/pokemon/coalossal/gigantamax/front.png differ diff --git a/graphics/pokemon/coalossal/gigantamax/icon.png b/graphics/pokemon/coalossal/gigantamax/icon.png new file mode 100644 index 000000000000..82a769dd9521 Binary files /dev/null and b/graphics/pokemon/coalossal/gigantamax/icon.png differ diff --git a/graphics/pokemon/coalossal/gigantamax/normal.pal b/graphics/pokemon/coalossal/gigantamax/normal.pal new file mode 100644 index 000000000000..7c8a54041ac6 --- /dev/null +++ b/graphics/pokemon/coalossal/gigantamax/normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +31 20 24 +47 36 39 +16 16 16 +55 51 55 +37 35 37 +88 71 74 +69 50 51 +66 64 60 +84 81 76 +103 99 92 +120 55 59 +89 40 43 +243 120 67 +236 225 13 +234 70 73 diff --git a/graphics/pokemon/coalossal/gigantamax/shiny.pal b/graphics/pokemon/coalossal/gigantamax/shiny.pal new file mode 100644 index 000000000000..ef46ff2c3f4b --- /dev/null +++ b/graphics/pokemon/coalossal/gigantamax/shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +31 20 24 +47 36 39 +16 16 16 +50 58 63 +34 36 38 +88 71 74 +69 50 51 +71 82 88 +88 112 124 +103 132 140 +120 55 59 +89 40 43 +243 120 67 +236 225 13 +234 70 73 diff --git a/graphics/pokemon/copperajah/gigantamax/back.png b/graphics/pokemon/copperajah/gigantamax/back.png new file mode 100644 index 000000000000..b42d0d32d1ab Binary files /dev/null and b/graphics/pokemon/copperajah/gigantamax/back.png differ diff --git a/graphics/pokemon/copperajah/gigantamax/front.png b/graphics/pokemon/copperajah/gigantamax/front.png new file mode 100644 index 000000000000..9ba3497ae02f Binary files /dev/null and b/graphics/pokemon/copperajah/gigantamax/front.png differ diff --git a/graphics/pokemon/copperajah/gigantamax/icon.png b/graphics/pokemon/copperajah/gigantamax/icon.png new file mode 100644 index 000000000000..1da37e2463e4 Binary files /dev/null and b/graphics/pokemon/copperajah/gigantamax/icon.png differ diff --git a/graphics/pokemon/copperajah/gigantamax/normal.pal b/graphics/pokemon/copperajah/gigantamax/normal.pal new file mode 100644 index 000000000000..0a7db2218527 --- /dev/null +++ b/graphics/pokemon/copperajah/gigantamax/normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +135 67 44 +16 16 16 +192 106 49 +34 66 54 +23 47 38 +95 101 89 +238 230 233 +159 147 149 +57 110 99 +34 83 72 +242 143 58 +24 88 79 +53 193 167 +242 91 0 +26 140 120 diff --git a/graphics/pokemon/copperajah/gigantamax/shiny.pal b/graphics/pokemon/copperajah/gigantamax/shiny.pal new file mode 100644 index 000000000000..f80600011cf4 --- /dev/null +++ b/graphics/pokemon/copperajah/gigantamax/shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +141 100 46 +16 16 16 +198 155 50 +37 63 44 +25 45 30 +95 101 89 +238 230 233 +159 147 149 +62 105 80 +39 78 55 +243 202 62 +52 90 85 +100 166 154 +242 91 0 +65 127 116 diff --git a/graphics/pokemon/corviknight/gigantamax/back.png b/graphics/pokemon/corviknight/gigantamax/back.png new file mode 100644 index 000000000000..99ba005f372b Binary files /dev/null and b/graphics/pokemon/corviknight/gigantamax/back.png differ diff --git a/graphics/pokemon/corviknight/gigantamax/front.png b/graphics/pokemon/corviknight/gigantamax/front.png new file mode 100644 index 000000000000..63c05fb7ab1e Binary files /dev/null and b/graphics/pokemon/corviknight/gigantamax/front.png differ diff --git a/graphics/pokemon/corviknight/gigantamax/icon.png b/graphics/pokemon/corviknight/gigantamax/icon.png new file mode 100644 index 000000000000..8104a49ba6ec Binary files /dev/null and b/graphics/pokemon/corviknight/gigantamax/icon.png differ diff --git a/graphics/pokemon/corviknight/gigantamax/normal.pal b/graphics/pokemon/corviknight/gigantamax/normal.pal new file mode 100644 index 000000000000..1edbbecf9320 --- /dev/null +++ b/graphics/pokemon/corviknight/gigantamax/normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +37 29 78 +16 16 16 +67 68 117 +122 24 95 +215 0 67 +48 51 96 +24 23 61 +62 61 109 +77 84 136 +44 43 88 +100 108 168 +78 65 80 +46 38 47 +255 118 160 +152 27 117 diff --git a/graphics/pokemon/corviknight/gigantamax/shiny.pal b/graphics/pokemon/corviknight/gigantamax/shiny.pal new file mode 100644 index 000000000000..94086e3215d6 --- /dev/null +++ b/graphics/pokemon/corviknight/gigantamax/shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +53 53 53 +16 16 16 +131 131 131 +139 121 31 +238 214 0 +77 77 77 +21 21 23 +65 64 68 +144 144 144 +41 41 44 +188 188 188 +35 34 34 +8 8 8 +255 247 153 +179 166 107 diff --git a/graphics/pokemon/drednaw/gigantamax/back.png b/graphics/pokemon/drednaw/gigantamax/back.png new file mode 100644 index 000000000000..f5e79c0a3899 Binary files /dev/null and b/graphics/pokemon/drednaw/gigantamax/back.png differ diff --git a/graphics/pokemon/drednaw/gigantamax/front.png b/graphics/pokemon/drednaw/gigantamax/front.png new file mode 100644 index 000000000000..a86a9474cba4 Binary files /dev/null and b/graphics/pokemon/drednaw/gigantamax/front.png differ diff --git a/graphics/pokemon/drednaw/gigantamax/icon.png b/graphics/pokemon/drednaw/gigantamax/icon.png new file mode 100644 index 000000000000..2e8fdf76585b Binary files /dev/null and b/graphics/pokemon/drednaw/gigantamax/icon.png differ diff --git a/graphics/pokemon/drednaw/gigantamax/normal.pal b/graphics/pokemon/drednaw/gigantamax/normal.pal new file mode 100644 index 000000000000..8e0dc8ff0e46 --- /dev/null +++ b/graphics/pokemon/drednaw/gigantamax/normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +16 16 16 +62 115 115 +100 38 32 +168 83 26 +252 252 252 +101 208 188 +77 164 155 +152 67 52 +246 190 19 +183 236 230 +214 132 20 +186 90 58 +250 230 184 +230 196 125 +202 152 96 diff --git a/graphics/pokemon/drednaw/gigantamax/shiny.pal b/graphics/pokemon/drednaw/gigantamax/shiny.pal new file mode 100644 index 000000000000..2fa38120774b --- /dev/null +++ b/graphics/pokemon/drednaw/gigantamax/shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +16 16 16 +31 60 40 +43 34 34 +162 51 32 +252 252 252 +70 113 84 +49 87 61 +77 63 60 +236 132 29 +122 160 135 +206 85 28 +99 83 77 +255 178 119 +242 200 113 +185 132 73 diff --git a/graphics/pokemon/duraludon/gigantamax/back.png b/graphics/pokemon/duraludon/gigantamax/back.png new file mode 100644 index 000000000000..ed052cc0bb87 Binary files /dev/null and b/graphics/pokemon/duraludon/gigantamax/back.png differ diff --git a/graphics/pokemon/duraludon/gigantamax/front.png b/graphics/pokemon/duraludon/gigantamax/front.png new file mode 100644 index 000000000000..7fd2b21986a6 Binary files /dev/null and b/graphics/pokemon/duraludon/gigantamax/front.png differ diff --git a/graphics/pokemon/duraludon/gigantamax/icon.png b/graphics/pokemon/duraludon/gigantamax/icon.png new file mode 100644 index 000000000000..74118eb778e6 Binary files /dev/null and b/graphics/pokemon/duraludon/gigantamax/icon.png differ diff --git a/graphics/pokemon/duraludon/gigantamax/normal.pal b/graphics/pokemon/duraludon/gigantamax/normal.pal new file mode 100644 index 000000000000..eb23403c9802 --- /dev/null +++ b/graphics/pokemon/duraludon/gigantamax/normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +16 16 16 +40 39 45 +168 147 168 +131 112 128 +112 112 134 +57 58 65 +228 229 241 +78 79 95 +56 173 186 +196 186 197 +254 254 254 +46 105 118 +56 139 156 +79 203 217 +255 222 89 diff --git a/graphics/pokemon/duraludon/gigantamax/shiny.pal b/graphics/pokemon/duraludon/gigantamax/shiny.pal new file mode 100644 index 000000000000..856918e1aaef --- /dev/null +++ b/graphics/pokemon/duraludon/gigantamax/shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +16 16 16 +37 42 57 +143 165 151 +109 128 119 +94 116 158 +54 65 77 +232 237 220 +66 85 116 +219 89 40 +181 193 184 +254 254 254 +139 55 24 +183 73 31 +226 122 84 +255 164 48 diff --git a/graphics/pokemon/eevee/gigantamax/back.png b/graphics/pokemon/eevee/gigantamax/back.png new file mode 100644 index 000000000000..1e104f833bd5 Binary files /dev/null and b/graphics/pokemon/eevee/gigantamax/back.png differ diff --git a/graphics/pokemon/eevee/gigantamax/front.png b/graphics/pokemon/eevee/gigantamax/front.png new file mode 100644 index 000000000000..315b69a2f388 Binary files /dev/null and b/graphics/pokemon/eevee/gigantamax/front.png differ diff --git a/graphics/pokemon/eevee/gigantamax/icon.png b/graphics/pokemon/eevee/gigantamax/icon.png new file mode 100644 index 000000000000..7b4698a0c26f Binary files /dev/null and b/graphics/pokemon/eevee/gigantamax/icon.png differ diff --git a/graphics/pokemon/eevee/gigantamax/normal.pal b/graphics/pokemon/eevee/gigantamax/normal.pal new file mode 100644 index 000000000000..5a1b6a1c9f96 --- /dev/null +++ b/graphics/pokemon/eevee/gigantamax/normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +82 49 32 +16 16 16 +115 74 74 +189 156 123 +164 98 74 +230 197 148 +255 230 172 +213 156 74 +253 253 253 +230 189 123 +11 11 11 +12 12 12 +13 13 13 +14 14 14 +15 15 15 diff --git a/graphics/pokemon/eevee/gigantamax/shiny.pal b/graphics/pokemon/eevee/gigantamax/shiny.pal new file mode 100644 index 000000000000..b55402332144 --- /dev/null +++ b/graphics/pokemon/eevee/gigantamax/shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +90 82 74 +16 16 16 +131 115 115 +189 197 255 +172 164 156 +213 222 255 +222 230 255 +213 213 197 +253 253 253 +246 246 238 +11 11 11 +12 12 12 +13 13 13 +14 14 14 +15 15 15 diff --git a/graphics/pokemon/flapple/gigantamax/back.png b/graphics/pokemon/flapple/gigantamax/back.png new file mode 100644 index 000000000000..610d98112b74 Binary files /dev/null and b/graphics/pokemon/flapple/gigantamax/back.png differ diff --git a/graphics/pokemon/flapple/gigantamax/front.png b/graphics/pokemon/flapple/gigantamax/front.png new file mode 100644 index 000000000000..65c716e9e8e0 Binary files /dev/null and b/graphics/pokemon/flapple/gigantamax/front.png differ diff --git a/graphics/pokemon/flapple/gigantamax/icon.png b/graphics/pokemon/flapple/gigantamax/icon.png new file mode 100644 index 000000000000..b7ecabd4695c Binary files /dev/null and b/graphics/pokemon/flapple/gigantamax/icon.png differ diff --git a/graphics/pokemon/flapple/gigantamax/normal.pal b/graphics/pokemon/flapple/gigantamax/normal.pal new file mode 100644 index 000000000000..2d5dabef1ea8 --- /dev/null +++ b/graphics/pokemon/flapple/gigantamax/normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +16 16 16 +166 49 57 +119 38 40 +198 138 72 +141 66 41 +233 197 88 +66 118 56 +210 57 77 +179 172 98 +249 249 249 +44 72 40 +218 208 139 +57 164 61 +213 68 86 +15 15 15 diff --git a/graphics/pokemon/flapple/gigantamax/shiny.pal b/graphics/pokemon/flapple/gigantamax/shiny.pal new file mode 100644 index 000000000000..4514eb418d5f --- /dev/null +++ b/graphics/pokemon/flapple/gigantamax/shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +16 16 16 +55 143 41 +35 91 27 +198 138 72 +141 66 41 +233 197 88 +66 118 56 +75 183 48 +179 172 98 +249 249 249 +44 72 40 +218 208 139 +57 164 61 +213 68 86 +15 15 15 diff --git a/graphics/pokemon/garbodor/gigantamax/back.png b/graphics/pokemon/garbodor/gigantamax/back.png new file mode 100644 index 000000000000..645dae3c0124 Binary files /dev/null and b/graphics/pokemon/garbodor/gigantamax/back.png differ diff --git a/graphics/pokemon/garbodor/gigantamax/front.png b/graphics/pokemon/garbodor/gigantamax/front.png new file mode 100644 index 000000000000..9856f2876364 Binary files /dev/null and b/graphics/pokemon/garbodor/gigantamax/front.png differ diff --git a/graphics/pokemon/garbodor/gigantamax/icon.png b/graphics/pokemon/garbodor/gigantamax/icon.png new file mode 100644 index 000000000000..f929b577cee8 Binary files /dev/null and b/graphics/pokemon/garbodor/gigantamax/icon.png differ diff --git a/graphics/pokemon/garbodor/gigantamax/normal.pal b/graphics/pokemon/garbodor/gigantamax/normal.pal new file mode 100644 index 000000000000..5d365044cf7a --- /dev/null +++ b/graphics/pokemon/garbodor/gigantamax/normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +16 16 16 +123 106 90 +189 189 189 +90 74 65 +164 139 115 +24 57 41 +0 172 213 +107 220 39 +41 106 74 +253 253 253 +254 188 164 +235 73 78 +230 218 0 +184 41 45 +239 143 255 diff --git a/graphics/pokemon/garbodor/gigantamax/shiny.pal b/graphics/pokemon/garbodor/gigantamax/shiny.pal new file mode 100644 index 000000000000..a70820775d42 --- /dev/null +++ b/graphics/pokemon/garbodor/gigantamax/shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +16 16 16 +106 106 98 +189 189 189 +82 74 74 +148 139 131 +16 65 74 +82 238 106 +255 189 90 +41 164 164 +253 253 253 +255 134 134 +255 133 35 +178 86 230 +184 41 45 +75 86 255 diff --git a/graphics/pokemon/gengar/gigantamax/back.png b/graphics/pokemon/gengar/gigantamax/back.png new file mode 100644 index 000000000000..67f5bc6070d2 Binary files /dev/null and b/graphics/pokemon/gengar/gigantamax/back.png differ diff --git a/graphics/pokemon/gengar/gigantamax/front.png b/graphics/pokemon/gengar/gigantamax/front.png new file mode 100644 index 000000000000..bbcd1756a4ed Binary files /dev/null and b/graphics/pokemon/gengar/gigantamax/front.png differ diff --git a/graphics/pokemon/gengar/gigantamax/icon.png b/graphics/pokemon/gengar/gigantamax/icon.png new file mode 100644 index 000000000000..31b59d5370e1 Binary files /dev/null and b/graphics/pokemon/gengar/gigantamax/icon.png differ diff --git a/graphics/pokemon/gengar/gigantamax/normal.pal b/graphics/pokemon/gengar/gigantamax/normal.pal new file mode 100644 index 000000000000..963348184cac --- /dev/null +++ b/graphics/pokemon/gengar/gigantamax/normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +74 41 74 +16 16 16 +90 74 156 +148 115 180 +123 98 164 +150 62 128 +116 58 91 +204 30 91 +146 6 52 +180 139 189 +186 50 90 +255 246 255 +255 131 55 +255 255 0 +189 172 189 diff --git a/graphics/pokemon/gengar/gigantamax/shiny.pal b/graphics/pokemon/gengar/gigantamax/shiny.pal new file mode 100644 index 000000000000..b69ff9799298 --- /dev/null +++ b/graphics/pokemon/gengar/gigantamax/shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +99 75 99 +16 16 16 +168 157 196 +252 244 252 +209 188 214 +221 144 195 +183 142 184 +204 30 91 +146 6 52 +254 254 254 +84 84 84 +255 246 255 +95 95 95 +140 140 140 +189 172 189 diff --git a/graphics/pokemon/grimmsnarl/gigantamax/back.png b/graphics/pokemon/grimmsnarl/gigantamax/back.png new file mode 100644 index 000000000000..834e97f85380 Binary files /dev/null and b/graphics/pokemon/grimmsnarl/gigantamax/back.png differ diff --git a/graphics/pokemon/grimmsnarl/gigantamax/front.png b/graphics/pokemon/grimmsnarl/gigantamax/front.png new file mode 100644 index 000000000000..a49760571750 Binary files /dev/null and b/graphics/pokemon/grimmsnarl/gigantamax/front.png differ diff --git a/graphics/pokemon/grimmsnarl/gigantamax/icon.png b/graphics/pokemon/grimmsnarl/gigantamax/icon.png new file mode 100644 index 000000000000..23bc5fd0dc26 Binary files /dev/null and b/graphics/pokemon/grimmsnarl/gigantamax/icon.png differ diff --git a/graphics/pokemon/grimmsnarl/gigantamax/normal.pal b/graphics/pokemon/grimmsnarl/gigantamax/normal.pal new file mode 100644 index 000000000000..806034cb629c --- /dev/null +++ b/graphics/pokemon/grimmsnarl/gigantamax/normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +16 16 16 +38 19 63 +67 53 104 +93 70 148 +53 41 84 +53 106 60 +71 190 98 +253 11 66 +64 149 85 +248 116 160 +201 201 201 +253 253 253 +233 55 97 +247 92 144 +15 15 15 diff --git a/graphics/pokemon/grimmsnarl/gigantamax/shiny.pal b/graphics/pokemon/grimmsnarl/gigantamax/shiny.pal new file mode 100644 index 000000000000..5d5b1b75a454 --- /dev/null +++ b/graphics/pokemon/grimmsnarl/gigantamax/shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +16 16 16 +94 89 96 +163 157 165 +221 215 223 +138 133 140 +107 46 103 +199 52 175 +253 11 66 +152 53 133 +248 116 160 +201 201 201 +253 253 253 +66 86 172 +85 134 201 +15 15 15 diff --git a/graphics/pokemon/hatterene/gigantamax/back.png b/graphics/pokemon/hatterene/gigantamax/back.png new file mode 100644 index 000000000000..68da7572c363 Binary files /dev/null and b/graphics/pokemon/hatterene/gigantamax/back.png differ diff --git a/graphics/pokemon/hatterene/gigantamax/front.png b/graphics/pokemon/hatterene/gigantamax/front.png new file mode 100644 index 000000000000..6c9e2c546d06 Binary files /dev/null and b/graphics/pokemon/hatterene/gigantamax/front.png differ diff --git a/graphics/pokemon/hatterene/gigantamax/icon.png b/graphics/pokemon/hatterene/gigantamax/icon.png new file mode 100644 index 000000000000..cc0ca7f2dc89 Binary files /dev/null and b/graphics/pokemon/hatterene/gigantamax/icon.png differ diff --git a/graphics/pokemon/hatterene/gigantamax/normal.pal b/graphics/pokemon/hatterene/gigantamax/normal.pal new file mode 100644 index 000000000000..26aac7facbc2 --- /dev/null +++ b/graphics/pokemon/hatterene/gigantamax/normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +16 16 16 +114 122 177 +200 233 255 +172 191 223 +148 143 194 +245 186 194 +228 137 160 +229 228 239 +193 89 116 +254 254 254 +180 162 183 +133 109 139 +217 206 219 +249 213 218 +15 15 15 diff --git a/graphics/pokemon/hatterene/gigantamax/shiny.pal b/graphics/pokemon/hatterene/gigantamax/shiny.pal new file mode 100644 index 000000000000..9682f1ec4368 --- /dev/null +++ b/graphics/pokemon/hatterene/gigantamax/shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +16 16 16 +101 75 95 +234 213 208 +192 166 187 +144 116 138 +252 153 172 +217 94 115 +225 193 207 +144 53 68 +254 254 254 +177 134 149 +137 90 110 +217 206 219 +245 186 194 +15 15 15 diff --git a/graphics/pokemon/inteleon/gigantamax/back.png b/graphics/pokemon/inteleon/gigantamax/back.png new file mode 100644 index 000000000000..81be3b2c258f Binary files /dev/null and b/graphics/pokemon/inteleon/gigantamax/back.png differ diff --git a/graphics/pokemon/inteleon/gigantamax/front.png b/graphics/pokemon/inteleon/gigantamax/front.png new file mode 100644 index 000000000000..6f55e4e29e35 Binary files /dev/null and b/graphics/pokemon/inteleon/gigantamax/front.png differ diff --git a/graphics/pokemon/inteleon/gigantamax/icon.png b/graphics/pokemon/inteleon/gigantamax/icon.png new file mode 100644 index 000000000000..a27bf3f1c8d1 Binary files /dev/null and b/graphics/pokemon/inteleon/gigantamax/icon.png differ diff --git a/graphics/pokemon/inteleon/gigantamax/normal.pal b/graphics/pokemon/inteleon/gigantamax/normal.pal new file mode 100644 index 000000000000..122b9807353a --- /dev/null +++ b/graphics/pokemon/inteleon/gigantamax/normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +0 62 106 +156 210 226 +16 16 16 +84 155 195 +176 250 255 +253 253 253 +92 218 218 +1 89 154 +28 123 193 +49 48 47 +233 205 95 +100 101 101 +74 74 77 +242 248 137 +238 62 92 diff --git a/graphics/pokemon/inteleon/gigantamax/shiny.pal b/graphics/pokemon/inteleon/gigantamax/shiny.pal new file mode 100644 index 000000000000..f11248377068 --- /dev/null +++ b/graphics/pokemon/inteleon/gigantamax/shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +0 68 114 +16 122 192 +16 16 16 +0 96 164 +176 250 255 +253 253 253 +92 218 218 +14 166 168 +6 204 207 +152 157 172 +233 95 146 +247 251 252 +196 204 212 +248 137 182 +238 62 92 diff --git a/graphics/pokemon/kingler/gigantamax/back.png b/graphics/pokemon/kingler/gigantamax/back.png new file mode 100644 index 000000000000..d1a624ac479b Binary files /dev/null and b/graphics/pokemon/kingler/gigantamax/back.png differ diff --git a/graphics/pokemon/kingler/gigantamax/front.png b/graphics/pokemon/kingler/gigantamax/front.png new file mode 100644 index 000000000000..075fc470c55e Binary files /dev/null and b/graphics/pokemon/kingler/gigantamax/front.png differ diff --git a/graphics/pokemon/kingler/gigantamax/icon.png b/graphics/pokemon/kingler/gigantamax/icon.png new file mode 100644 index 000000000000..0399c37ab423 Binary files /dev/null and b/graphics/pokemon/kingler/gigantamax/icon.png differ diff --git a/graphics/pokemon/kingler/gigantamax/normal.pal b/graphics/pokemon/kingler/gigantamax/normal.pal new file mode 100644 index 000000000000..e3bbad02271c --- /dev/null +++ b/graphics/pokemon/kingler/gigantamax/normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +115 82 16 +16 16 16 +131 41 8 +255 246 222 +164 106 65 +180 90 74 +222 172 156 +246 197 139 +255 139 82 +253 253 253 +189 189 230 +125 129 147 +163 153 170 +14 14 14 +15 15 15 diff --git a/graphics/pokemon/kingler/gigantamax/shiny.pal b/graphics/pokemon/kingler/gigantamax/shiny.pal new file mode 100644 index 000000000000..2dcc9678fa72 --- /dev/null +++ b/graphics/pokemon/kingler/gigantamax/shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +106 98 8 +16 16 16 +74 90 0 +230 246 197 +148 139 57 +106 115 49 +205 213 115 +180 197 115 +139 156 74 +253 253 253 +189 189 230 +125 129 147 +163 153 170 +14 14 14 +15 15 15 diff --git a/graphics/pokemon/lapras/gigantamax/back.png b/graphics/pokemon/lapras/gigantamax/back.png new file mode 100644 index 000000000000..ee056d3a543d Binary files /dev/null and b/graphics/pokemon/lapras/gigantamax/back.png differ diff --git a/graphics/pokemon/lapras/gigantamax/front.png b/graphics/pokemon/lapras/gigantamax/front.png new file mode 100644 index 000000000000..aff7e7d5f2de Binary files /dev/null and b/graphics/pokemon/lapras/gigantamax/front.png differ diff --git a/graphics/pokemon/lapras/gigantamax/icon.png b/graphics/pokemon/lapras/gigantamax/icon.png new file mode 100644 index 000000000000..367418a17c9d Binary files /dev/null and b/graphics/pokemon/lapras/gigantamax/icon.png differ diff --git a/graphics/pokemon/lapras/gigantamax/normal.pal b/graphics/pokemon/lapras/gigantamax/normal.pal new file mode 100644 index 000000000000..044e141f670c --- /dev/null +++ b/graphics/pokemon/lapras/gigantamax/normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +115 197 246 +81 255 251 +128 117 115 +16 16 16 +57 123 164 +24 65 82 +65 164 230 +139 164 148 +222 197 131 +246 222 172 +82 82 106 +164 148 148 +213 205 197 +246 238 230 +90 74 65 diff --git a/graphics/pokemon/lapras/gigantamax/shiny.pal b/graphics/pokemon/lapras/gigantamax/shiny.pal new file mode 100644 index 000000000000..f0290fa5c1e3 --- /dev/null +++ b/graphics/pokemon/lapras/gigantamax/shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +205 172 255 +81 255 251 +128 117 115 +16 16 16 +106 49 156 +41 0 98 +172 131 246 +139 90 197 +246 189 148 +255 213 189 +82 82 106 +164 148 148 +213 205 197 +246 238 230 +15 15 15 diff --git a/graphics/pokemon/machamp/gigantamax/back.png b/graphics/pokemon/machamp/gigantamax/back.png new file mode 100644 index 000000000000..aea4de046fdc Binary files /dev/null and b/graphics/pokemon/machamp/gigantamax/back.png differ diff --git a/graphics/pokemon/machamp/gigantamax/front.png b/graphics/pokemon/machamp/gigantamax/front.png new file mode 100644 index 000000000000..feff2a8346d4 Binary files /dev/null and b/graphics/pokemon/machamp/gigantamax/front.png differ diff --git a/graphics/pokemon/machamp/gigantamax/icon.png b/graphics/pokemon/machamp/gigantamax/icon.png new file mode 100644 index 000000000000..f0150630a694 Binary files /dev/null and b/graphics/pokemon/machamp/gigantamax/icon.png differ diff --git a/graphics/pokemon/machamp/gigantamax/normal.pal b/graphics/pokemon/machamp/gigantamax/normal.pal new file mode 100644 index 000000000000..8ad34672ca75 --- /dev/null +++ b/graphics/pokemon/machamp/gigantamax/normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +126 84 5 +16 16 16 +227 141 3 +241 187 0 +252 234 0 +125 136 162 +74 74 98 +147 179 198 +43 43 57 +205 197 98 +131 115 41 +246 238 156 +13 13 13 +14 14 14 +15 15 15 diff --git a/graphics/pokemon/machamp/gigantamax/shiny.pal b/graphics/pokemon/machamp/gigantamax/shiny.pal new file mode 100644 index 000000000000..67e67b00c922 --- /dev/null +++ b/graphics/pokemon/machamp/gigantamax/shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +126 84 5 +16 16 16 +227 141 3 +241 187 0 +252 234 0 +106 139 41 +74 106 16 +148 189 74 +25 45 0 +205 197 98 +131 115 41 +246 238 156 +13 13 13 +14 14 14 +15 15 15 diff --git a/graphics/pokemon/melmetal/gigantamax/back.png b/graphics/pokemon/melmetal/gigantamax/back.png new file mode 100644 index 000000000000..d1cbe4b98e9b Binary files /dev/null and b/graphics/pokemon/melmetal/gigantamax/back.png differ diff --git a/graphics/pokemon/melmetal/gigantamax/front.png b/graphics/pokemon/melmetal/gigantamax/front.png new file mode 100644 index 000000000000..a48b1912c8a3 Binary files /dev/null and b/graphics/pokemon/melmetal/gigantamax/front.png differ diff --git a/graphics/pokemon/melmetal/gigantamax/icon.png b/graphics/pokemon/melmetal/gigantamax/icon.png new file mode 100644 index 000000000000..a84cae6c8f42 Binary files /dev/null and b/graphics/pokemon/melmetal/gigantamax/icon.png differ diff --git a/graphics/pokemon/melmetal/gigantamax/normal.pal b/graphics/pokemon/melmetal/gigantamax/normal.pal new file mode 100644 index 000000000000..c6309ab24ee1 --- /dev/null +++ b/graphics/pokemon/melmetal/gigantamax/normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +138 141 126 +220 220 218 +177 181 166 +16 16 16 +249 249 249 +103 103 95 +61 53 52 +89 84 78 +232 232 232 +194 41 46 +134 66 36 +177 97 44 +224 135 37 +255 191 79 +228 109 139 diff --git a/graphics/pokemon/melmetal/gigantamax/shiny.pal b/graphics/pokemon/melmetal/gigantamax/shiny.pal new file mode 100644 index 000000000000..40cd79108f6a --- /dev/null +++ b/graphics/pokemon/melmetal/gigantamax/shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +138 141 126 +220 220 218 +177 181 166 +16 16 16 +249 249 249 +103 103 95 +61 53 52 +89 84 78 +232 232 232 +0 93 220 +134 66 36 +177 79 45 +222 108 40 +254 166 80 +228 109 139 diff --git a/graphics/pokemon/meowth/gigantamax/back.png b/graphics/pokemon/meowth/gigantamax/back.png new file mode 100644 index 000000000000..16298c644a7a Binary files /dev/null and b/graphics/pokemon/meowth/gigantamax/back.png differ diff --git a/graphics/pokemon/meowth/gigantamax/front.png b/graphics/pokemon/meowth/gigantamax/front.png new file mode 100644 index 000000000000..3f7cf49d2189 Binary files /dev/null and b/graphics/pokemon/meowth/gigantamax/front.png differ diff --git a/graphics/pokemon/meowth/gigantamax/icon.png b/graphics/pokemon/meowth/gigantamax/icon.png new file mode 100644 index 000000000000..039f90a4adf5 Binary files /dev/null and b/graphics/pokemon/meowth/gigantamax/icon.png differ diff --git a/graphics/pokemon/meowth/gigantamax/normal.pal b/graphics/pokemon/meowth/gigantamax/normal.pal new file mode 100644 index 000000000000..f8c1e79f7aab --- /dev/null +++ b/graphics/pokemon/meowth/gigantamax/normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +156 106 0 +255 230 131 +16 16 16 +222 189 57 +255 255 180 +255 115 82 +148 90 0 +213 90 57 +205 164 0 +252 252 252 +255 213 0 +244 255 43 +148 65 0 +197 123 8 +238 156 49 diff --git a/graphics/pokemon/meowth/gigantamax/shiny.pal b/graphics/pokemon/meowth/gigantamax/shiny.pal new file mode 100644 index 000000000000..00cf14054902 --- /dev/null +++ b/graphics/pokemon/meowth/gigantamax/shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +156 65 0 +255 205 131 +16 16 16 +222 156 57 +255 238 180 +213 82 106 +172 41 57 +148 65 0 +205 164 0 +252 252 252 +255 213 0 +244 255 43 +172 41 57 +213 82 106 +246 123 139 diff --git a/graphics/pokemon/orbeetle/gigantamax/back.png b/graphics/pokemon/orbeetle/gigantamax/back.png new file mode 100644 index 000000000000..e984f9cef986 Binary files /dev/null and b/graphics/pokemon/orbeetle/gigantamax/back.png differ diff --git a/graphics/pokemon/orbeetle/gigantamax/front.png b/graphics/pokemon/orbeetle/gigantamax/front.png new file mode 100644 index 000000000000..f59aff21abf9 Binary files /dev/null and b/graphics/pokemon/orbeetle/gigantamax/front.png differ diff --git a/graphics/pokemon/orbeetle/gigantamax/icon.png b/graphics/pokemon/orbeetle/gigantamax/icon.png new file mode 100644 index 000000000000..4e486f2637d8 Binary files /dev/null and b/graphics/pokemon/orbeetle/gigantamax/icon.png differ diff --git a/graphics/pokemon/orbeetle/gigantamax/normal.pal b/graphics/pokemon/orbeetle/gigantamax/normal.pal new file mode 100644 index 000000000000..af34ce0fac45 --- /dev/null +++ b/graphics/pokemon/orbeetle/gigantamax/normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +16 16 16 +120 23 40 +189 20 43 +253 38 54 +164 86 0 +191 167 49 +16 189 220 +62 32 45 +78 58 61 +207 255 255 +87 251 231 +246 230 115 +172 156 173 +249 255 255 +214 213 211 diff --git a/graphics/pokemon/orbeetle/gigantamax/shiny.pal b/graphics/pokemon/orbeetle/gigantamax/shiny.pal new file mode 100644 index 000000000000..349aac2b6ae2 --- /dev/null +++ b/graphics/pokemon/orbeetle/gigantamax/shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +16 16 16 +50 41 102 +101 78 199 +146 115 230 +133 49 73 +199 83 105 +16 189 220 +62 32 45 +78 58 61 +207 255 255 +87 251 231 +234 134 149 +47 62 166 +249 255 255 +85 104 240 diff --git a/graphics/pokemon/pikachu/gigantamax/back.png b/graphics/pokemon/pikachu/gigantamax/back.png new file mode 100644 index 000000000000..fefeab9c2218 Binary files /dev/null and b/graphics/pokemon/pikachu/gigantamax/back.png differ diff --git a/graphics/pokemon/pikachu/gigantamax/front.png b/graphics/pokemon/pikachu/gigantamax/front.png new file mode 100644 index 000000000000..75f0c2beda7f Binary files /dev/null and b/graphics/pokemon/pikachu/gigantamax/front.png differ diff --git a/graphics/pokemon/pikachu/gigantamax/icon.png b/graphics/pokemon/pikachu/gigantamax/icon.png new file mode 100644 index 000000000000..440004b8e975 Binary files /dev/null and b/graphics/pokemon/pikachu/gigantamax/icon.png differ diff --git a/graphics/pokemon/pikachu/gigantamax/normal.pal b/graphics/pokemon/pikachu/gigantamax/normal.pal new file mode 100644 index 000000000000..1bfa354f7868 --- /dev/null +++ b/graphics/pokemon/pikachu/gigantamax/normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +248 252 75 +255 246 164 +254 254 254 +16 16 16 +41 41 41 +65 65 74 +246 189 32 +98 49 8 +156 82 0 +246 230 82 +230 90 65 +197 32 24 +222 148 0 +115 115 131 +15 15 15 diff --git a/graphics/pokemon/pikachu/gigantamax/shiny.pal b/graphics/pokemon/pikachu/gigantamax/shiny.pal new file mode 100644 index 000000000000..377e03cd671d --- /dev/null +++ b/graphics/pokemon/pikachu/gigantamax/shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +248 252 75 +255 230 131 +254 254 254 +16 16 16 +41 41 41 +65 65 74 +255 164 0 +115 16 0 +180 49 0 +255 197 49 +230 98 65 +197 41 24 +230 131 0 +115 115 131 +15 15 15 diff --git a/graphics/pokemon/rillaboom/gigantamax/back.png b/graphics/pokemon/rillaboom/gigantamax/back.png new file mode 100644 index 000000000000..d15e4e4c3ad8 Binary files /dev/null and b/graphics/pokemon/rillaboom/gigantamax/back.png differ diff --git a/graphics/pokemon/rillaboom/gigantamax/front.png b/graphics/pokemon/rillaboom/gigantamax/front.png new file mode 100644 index 000000000000..922860400d28 Binary files /dev/null and b/graphics/pokemon/rillaboom/gigantamax/front.png differ diff --git a/graphics/pokemon/rillaboom/gigantamax/icon.png b/graphics/pokemon/rillaboom/gigantamax/icon.png new file mode 100644 index 000000000000..d149814fffb4 Binary files /dev/null and b/graphics/pokemon/rillaboom/gigantamax/icon.png differ diff --git a/graphics/pokemon/rillaboom/gigantamax/normal.pal b/graphics/pokemon/rillaboom/gigantamax/normal.pal new file mode 100644 index 000000000000..6f782183ae01 --- /dev/null +++ b/graphics/pokemon/rillaboom/gigantamax/normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +104 68 64 +1 47 25 +16 16 16 +182 127 76 +0 132 69 +0 89 47 +147 108 66 +50 29 35 +246 226 161 +181 154 125 +66 43 47 +133 117 80 +252 252 252 +250 113 61 +180 66 56 diff --git a/graphics/pokemon/rillaboom/gigantamax/shiny.pal b/graphics/pokemon/rillaboom/gigantamax/shiny.pal new file mode 100644 index 000000000000..bec70743b20d --- /dev/null +++ b/graphics/pokemon/rillaboom/gigantamax/shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +95 43 53 +54 68 6 +16 16 16 +182 127 76 +140 180 0 +89 117 4 +147 108 66 +46 19 34 +246 226 161 +158 144 129 +60 30 43 +101 94 77 +252 252 252 +250 113 61 +180 66 56 diff --git a/graphics/pokemon/sandaconda/gigantamax/back.png b/graphics/pokemon/sandaconda/gigantamax/back.png new file mode 100644 index 000000000000..d1cf5184bcc3 Binary files /dev/null and b/graphics/pokemon/sandaconda/gigantamax/back.png differ diff --git a/graphics/pokemon/sandaconda/gigantamax/front.png b/graphics/pokemon/sandaconda/gigantamax/front.png new file mode 100644 index 000000000000..33e3451fa5b6 Binary files /dev/null and b/graphics/pokemon/sandaconda/gigantamax/front.png differ diff --git a/graphics/pokemon/sandaconda/gigantamax/icon.png b/graphics/pokemon/sandaconda/gigantamax/icon.png new file mode 100644 index 000000000000..4b19d9570a9c Binary files /dev/null and b/graphics/pokemon/sandaconda/gigantamax/icon.png differ diff --git a/graphics/pokemon/sandaconda/gigantamax/normal.pal b/graphics/pokemon/sandaconda/gigantamax/normal.pal new file mode 100644 index 000000000000..f06c69586653 --- /dev/null +++ b/graphics/pokemon/sandaconda/gigantamax/normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +167 114 78 +105 97 69 +16 16 16 +245 243 211 +180 163 109 +189 154 106 +217 202 179 +79 59 35 +126 85 67 +175 120 86 +187 32 15 +233 63 109 +13 13 13 +14 14 14 +15 15 15 diff --git a/graphics/pokemon/sandaconda/gigantamax/shiny.pal b/graphics/pokemon/sandaconda/gigantamax/shiny.pal new file mode 100644 index 000000000000..3c847bf83ef0 --- /dev/null +++ b/graphics/pokemon/sandaconda/gigantamax/shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +167 114 78 +94 98 76 +16 16 16 +231 238 218 +159 165 124 +189 154 106 +217 202 179 +59 59 55 +110 87 83 +150 119 111 +187 32 15 +233 63 109 +13 13 13 +14 14 14 +15 15 15 diff --git a/graphics/pokemon/snorlax/gigantamax/back.png b/graphics/pokemon/snorlax/gigantamax/back.png new file mode 100644 index 000000000000..c90fff95cc4c Binary files /dev/null and b/graphics/pokemon/snorlax/gigantamax/back.png differ diff --git a/graphics/pokemon/snorlax/gigantamax/front.png b/graphics/pokemon/snorlax/gigantamax/front.png new file mode 100644 index 000000000000..ef39f86990cc Binary files /dev/null and b/graphics/pokemon/snorlax/gigantamax/front.png differ diff --git a/graphics/pokemon/snorlax/gigantamax/icon.png b/graphics/pokemon/snorlax/gigantamax/icon.png new file mode 100644 index 000000000000..e804e9196382 Binary files /dev/null and b/graphics/pokemon/snorlax/gigantamax/icon.png differ diff --git a/graphics/pokemon/snorlax/gigantamax/normal.pal b/graphics/pokemon/snorlax/gigantamax/normal.pal new file mode 100644 index 000000000000..4441577debe9 --- /dev/null +++ b/graphics/pokemon/snorlax/gigantamax/normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +16 16 16 +246 230 189 +160 160 160 +230 197 172 +16 57 65 +84 121 43 +98 65 32 +164 115 82 +222 86 86 +252 139 159 +187 227 91 +137 180 50 +49 87 63 +49 90 123 +6 159 95 diff --git a/graphics/pokemon/snorlax/gigantamax/shiny.pal b/graphics/pokemon/snorlax/gigantamax/shiny.pal new file mode 100644 index 000000000000..d29a9cda8baf --- /dev/null +++ b/graphics/pokemon/snorlax/gigantamax/shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +16 16 16 +247 230 173 +160 160 160 +230 206 156 +8 49 123 +51 92 40 +99 74 25 +165 123 74 +215 69 47 +251 82 90 +187 227 91 +81 136 50 +141 93 10 +33 74 165 +221 146 16 diff --git a/graphics/pokemon/toxtricity/gigantamax/back.png b/graphics/pokemon/toxtricity/gigantamax/back.png new file mode 100644 index 000000000000..3e83fa04f3f6 Binary files /dev/null and b/graphics/pokemon/toxtricity/gigantamax/back.png differ diff --git a/graphics/pokemon/toxtricity/gigantamax/front.png b/graphics/pokemon/toxtricity/gigantamax/front.png new file mode 100644 index 000000000000..7fac75a68344 Binary files /dev/null and b/graphics/pokemon/toxtricity/gigantamax/front.png differ diff --git a/graphics/pokemon/toxtricity/gigantamax/icon.png b/graphics/pokemon/toxtricity/gigantamax/icon.png new file mode 100644 index 000000000000..3e7e680f7c5e Binary files /dev/null and b/graphics/pokemon/toxtricity/gigantamax/icon.png differ diff --git a/graphics/pokemon/toxtricity/gigantamax/normal.pal b/graphics/pokemon/toxtricity/gigantamax/normal.pal new file mode 100644 index 000000000000..eceb597ad40b --- /dev/null +++ b/graphics/pokemon/toxtricity/gigantamax/normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +75 45 94 +16 16 16 +141 79 174 +224 97 180 +215 143 0 +115 155 217 +240 200 16 +248 230 150 +106 66 119 +150 222 243 +202 74 170 +254 180 228 +240 142 197 +231 114 199 +124 70 31 diff --git a/graphics/pokemon/toxtricity/gigantamax/shiny.pal b/graphics/pokemon/toxtricity/gigantamax/shiny.pal new file mode 100644 index 000000000000..372ab9a7b2c1 --- /dev/null +++ b/graphics/pokemon/toxtricity/gigantamax/shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +94 45 64 +16 16 16 +174 79 111 +224 97 180 +215 143 0 +115 155 217 +240 200 16 +248 230 150 +119 66 77 +150 222 243 +183 73 202 +238 180 254 +240 142 197 +218 114 231 +124 70 31 diff --git a/graphics/pokemon/urshifu/rapid_strike_style_gigantamax/back.png b/graphics/pokemon/urshifu/rapid_strike_style_gigantamax/back.png new file mode 100644 index 000000000000..3369e6c170ce Binary files /dev/null and b/graphics/pokemon/urshifu/rapid_strike_style_gigantamax/back.png differ diff --git a/graphics/pokemon/urshifu/rapid_strike_style_gigantamax/front.png b/graphics/pokemon/urshifu/rapid_strike_style_gigantamax/front.png new file mode 100644 index 000000000000..a00a644f0854 Binary files /dev/null and b/graphics/pokemon/urshifu/rapid_strike_style_gigantamax/front.png differ diff --git a/graphics/pokemon/urshifu/rapid_strike_style_gigantamax/icon.png b/graphics/pokemon/urshifu/rapid_strike_style_gigantamax/icon.png new file mode 100644 index 000000000000..04be58cc4299 Binary files /dev/null and b/graphics/pokemon/urshifu/rapid_strike_style_gigantamax/icon.png differ diff --git a/graphics/pokemon/urshifu/rapid_strike_style_gigantamax/normal.pal b/graphics/pokemon/urshifu/rapid_strike_style_gigantamax/normal.pal new file mode 100644 index 000000000000..de95b4d5b449 --- /dev/null +++ b/graphics/pokemon/urshifu/rapid_strike_style_gigantamax/normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +107 101 116 +16 16 16 +181 181 181 +43 51 125 +145 145 145 +245 245 245 +16 13 79 +48 63 241 +40 45 38 +158 98 37 +255 250 96 +213 169 38 +134 160 253 +96 95 77 +15 15 15 diff --git a/graphics/pokemon/urshifu/rapid_strike_style_gigantamax/shiny.pal b/graphics/pokemon/urshifu/rapid_strike_style_gigantamax/shiny.pal new file mode 100644 index 000000000000..739e8a8aeb79 --- /dev/null +++ b/graphics/pokemon/urshifu/rapid_strike_style_gigantamax/shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +107 101 116 +16 16 16 +181 181 181 +43 51 125 +145 145 145 +245 245 245 +16 13 79 +48 63 241 +40 45 38 +139 34 47 +255 151 54 +185 88 38 +134 160 253 +96 95 77 +15 15 15 diff --git a/graphics/pokemon/urshifu/single_strike_style_gigantamax/back.png b/graphics/pokemon/urshifu/single_strike_style_gigantamax/back.png new file mode 100644 index 000000000000..74b71795bb93 Binary files /dev/null and b/graphics/pokemon/urshifu/single_strike_style_gigantamax/back.png differ diff --git a/graphics/pokemon/urshifu/single_strike_style_gigantamax/front.png b/graphics/pokemon/urshifu/single_strike_style_gigantamax/front.png new file mode 100644 index 000000000000..9f144d32be05 Binary files /dev/null and b/graphics/pokemon/urshifu/single_strike_style_gigantamax/front.png differ diff --git a/graphics/pokemon/urshifu/single_strike_style_gigantamax/icon.png b/graphics/pokemon/urshifu/single_strike_style_gigantamax/icon.png new file mode 100644 index 000000000000..bfeab0ee3b4f Binary files /dev/null and b/graphics/pokemon/urshifu/single_strike_style_gigantamax/icon.png differ diff --git a/graphics/pokemon/urshifu/single_strike_style_gigantamax/normal.pal b/graphics/pokemon/urshifu/single_strike_style_gigantamax/normal.pal new file mode 100644 index 000000000000..4cba02f8cd85 --- /dev/null +++ b/graphics/pokemon/urshifu/single_strike_style_gigantamax/normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +40 45 38 +16 16 16 +66 71 58 +107 101 116 +181 181 181 +96 95 77 +87 15 15 +146 39 24 +231 20 10 +145 145 145 +158 98 37 +245 245 245 +255 250 96 +213 169 38 +254 125 112 diff --git a/graphics/pokemon/urshifu/single_strike_style_gigantamax/shiny.pal b/graphics/pokemon/urshifu/single_strike_style_gigantamax/shiny.pal new file mode 100644 index 000000000000..13f43d8b233d --- /dev/null +++ b/graphics/pokemon/urshifu/single_strike_style_gigantamax/shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +153 211 165 +40 45 38 +16 16 16 +66 71 58 +107 101 116 +181 181 181 +96 95 77 +87 15 15 +146 39 24 +231 20 10 +145 145 145 +139 34 47 +245 245 245 +255 151 54 +185 88 38 +254 125 112 diff --git a/graphics/pokemon/venusaur/gigantamax/back.png b/graphics/pokemon/venusaur/gigantamax/back.png new file mode 100644 index 000000000000..be482895b850 Binary files /dev/null and b/graphics/pokemon/venusaur/gigantamax/back.png differ diff --git a/graphics/pokemon/venusaur/gigantamax/front.png b/graphics/pokemon/venusaur/gigantamax/front.png new file mode 100644 index 000000000000..b7dde75ba897 Binary files /dev/null and b/graphics/pokemon/venusaur/gigantamax/front.png differ diff --git a/graphics/pokemon/venusaur/gigantamax/icon.png b/graphics/pokemon/venusaur/gigantamax/icon.png new file mode 100644 index 000000000000..523e64799948 Binary files /dev/null and b/graphics/pokemon/venusaur/gigantamax/icon.png differ diff --git a/graphics/pokemon/venusaur/gigantamax/normal.pal b/graphics/pokemon/venusaur/gigantamax/normal.pal new file mode 100644 index 000000000000..74ffe32fbdae --- /dev/null +++ b/graphics/pokemon/venusaur/gigantamax/normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +128 0 128 +131 49 0 +16 16 16 +16 82 65 +223 91 95 +0 141 125 +0 107 93 +252 252 252 +32 180 156 +16 123 106 +246 148 153 +90 213 197 +255 201 201 +131 222 123 +255 238 82 +199 155 38 diff --git a/graphics/pokemon/venusaur/gigantamax/shiny.pal b/graphics/pokemon/venusaur/gigantamax/shiny.pal new file mode 100644 index 000000000000..cd6c71bec76f --- /dev/null +++ b/graphics/pokemon/venusaur/gigantamax/shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +128 0 128 +131 49 0 +16 16 16 +57 90 32 +229 171 27 +0 141 125 +0 107 93 +252 252 252 +164 213 74 +123 156 41 +255 228 17 +205 238 82 +255 255 222 +131 222 123 +255 238 82 +199 155 38 diff --git a/include/battle.h b/include/battle.h index 96112a63d538..90a392e15cd1 100644 --- a/include/battle.h +++ b/include/battle.h @@ -14,6 +14,7 @@ #include "battle_bg.h" #include "pokeball.h" #include "battle_debug.h" +#include "battle_dynamax.h" // Used to exclude moves learned temporarily by Transform or Mimic #define MOVE_IS_PERMANENT(battler, moveSlot) \ @@ -94,6 +95,7 @@ struct DisableStruct u8 laserFocusTimer; u8 throatChopTimer; u8 wrapTurns; + u8 tormentTimer:4; // used for G-Max Meltdown u8 usedMoves:4; u8 noRetreat:1; u8 tarShot:1; @@ -104,6 +106,7 @@ struct DisableStruct u8 stickyWebDone:1; u8 stealthRockDone:1; u8 syrupBombTimer; + u8 steelSurgeDone:1; }; struct ProtectStruct @@ -148,6 +151,7 @@ struct ProtectStruct u16 beakBlastCharge:1; u16 quash:1; u16 shellTrap:1; + u16 maxGuarded:1; u16 silkTrapped:1; u16 eatMirrorHerb:1; u16 activateOpportunist:2; // 2 - to copy stats. 1 - stats copied (do not repeat). 0 - no stats to copy @@ -223,11 +227,14 @@ struct SideTimer u8 tailwindBattlerId; u8 luckyChantTimer; u8 luckyChantBattlerId; + u8 steelsurgeAmount; // Timers below this point are not swapped by Court Change u8 followmeTimer; u8 followmeTarget:3; u8 followmePowder:1; // Rage powder, does not affect grass type pokemon. u8 retaliateTimer; + u8 damageNonTypesTimer; + u8 damageNonTypesType; }; struct FieldTimer @@ -534,6 +541,23 @@ struct ZMoveData u8 splits[MAX_BATTLERS_COUNT]; }; +struct DynamaxData +{ + bool8 playerSelect; + u8 triggerSpriteId; + u8 indicatorSpriteId[MAX_BATTLERS_COUNT]; + u8 toDynamax; // flags using gBitTable + bool8 alreadyDynamaxed[NUM_BATTLE_SIDES]; + bool8 dynamaxed[MAX_BATTLERS_COUNT]; + u8 dynamaxTurns[MAX_BATTLERS_COUNT]; + u8 usingMaxMove[MAX_BATTLERS_COUNT]; + u8 activeSplit; + u8 splits[MAX_BATTLERS_COUNT]; + u16 baseMove[MAX_BATTLERS_COUNT]; // base move of Max Move + u16 lastUsedBaseMove; + u16 levelUpHP; +}; + struct LostItem { u16 originalItem:15; @@ -640,6 +664,7 @@ struct BattleStruct struct MegaEvolutionData mega; struct UltraBurstData burst; struct ZMoveData zmove; + struct DynamaxData dynamax; const u8 *trainerSlideMsg; bool8 trainerSlideLowHpMsgDone; u8 introState; @@ -680,6 +705,7 @@ struct BattleStruct u8 battleBondTransformed[NUM_BATTLE_SIDES]; // Bitfield for each party. u8 storedHealingWish:4; // Each battler as a bit. u8 storedLunarDance:4; // Each battler as a bit. + u8 bonusCritStages[MAX_BATTLERS_COUNT]; // G-Max Chi Strike boosts crit stages of allies. uq4_12_t supremeOverlordModifier[MAX_BATTLERS_COUNT]; u8 itemPartyIndex[MAX_BATTLERS_COUNT]; u8 itemMoveIndex[MAX_BATTLERS_COUNT]; diff --git a/include/battle_controllers.h b/include/battle_controllers.h index 199b6c920737..ea7e63525fed 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -98,8 +98,9 @@ enum { // Special return values in gBattleBufferB from Battle Controller functions. #define RET_VALUE_LEVELED_UP 11 -#define RET_MEGA_EVOLUTION 0x80 -#define RET_ULTRA_BURST 0x70 +#define RET_MEGA_EVOLUTION (1 << 7) +#define RET_ULTRA_BURST (1 << 6) +#define RET_DYNAMAX (1 << 5) struct UnusedControllerStruct { diff --git a/include/battle_dynamax.h b/include/battle_dynamax.h new file mode 100644 index 000000000000..fe619e295312 --- /dev/null +++ b/include/battle_dynamax.h @@ -0,0 +1,102 @@ +#ifndef GUARD_BATTLE_DYNAMAX_H +#define GUARD_BATTLE_DYNAMAX_H + +#define DYNAMAX_TURNS_COUNT 3 + +enum MaxMoveEffect +{ + MAX_EFFECT_NONE, + MAX_EFFECT_RAISE_TEAM_ATTACK, + MAX_EFFECT_RAISE_TEAM_DEFENSE, + MAX_EFFECT_RAISE_TEAM_SPEED, + MAX_EFFECT_RAISE_TEAM_SP_ATK, + MAX_EFFECT_RAISE_TEAM_SP_DEF, + MAX_EFFECT_LOWER_ATTACK, + MAX_EFFECT_LOWER_DEFENSE, + MAX_EFFECT_LOWER_SPEED, + MAX_EFFECT_LOWER_SP_ATK, + MAX_EFFECT_LOWER_SP_DEF, + MAX_EFFECT_SUN, + MAX_EFFECT_RAIN, + MAX_EFFECT_SANDSTORM, + MAX_EFFECT_HAIL, + MAX_EFFECT_MISTY_TERRAIN, + MAX_EFFECT_GRASSY_TERRAIN, + MAX_EFFECT_ELECTRIC_TERRAIN, + MAX_EFFECT_PSYCHIC_TERRAIN, + MAX_EFFECT_VINE_LASH, + MAX_EFFECT_WILDFIRE, + MAX_EFFECT_CANNONADE, + MAX_EFFECT_EFFECT_SPORE_FOES, + MAX_EFFECT_PARALYZE_FOES, + MAX_EFFECT_CONFUSE_FOES_PAY_DAY, + MAX_EFFECT_CRIT_PLUS, + MAX_EFFECT_MEAN_LOOK, + MAX_EFFECT_AURORA_VEIL, + MAX_EFFECT_INFATUATE_FOES, + MAX_EFFECT_RECYCLE_BERRIES, + MAX_EFFECT_POISON_FOES, + MAX_EFFECT_STEALTH_ROCK, + MAX_EFFECT_DEFOG, + MAX_EFFECT_POISON_PARALYZE_FOES, + MAX_EFFECT_HEAL_TEAM, + MAX_EFFECT_SPITE, + MAX_EFFECT_GRAVITY, + MAX_EFFECT_VOLCALITH, + MAX_EFFECT_SANDBLAST_FOES, + MAX_EFFECT_YAWN_FOE, + MAX_EFFECT_LOWER_EVASIVENESS_FOES, + MAX_EFFECT_AROMATHERAPY, + MAX_EFFECT_CONFUSE_FOES, + MAX_EFFECT_STEELSURGE, + MAX_EFFECT_TORMENT_FOES, + MAX_EFFECT_LOWER_SPEED_2_FOES, + MAX_EFFECT_FIRE_SPIN_FOES, + MAX_EFFECT_FIXED_POWER, + MAX_EFFECT_BYPASS_PROTECT, +}; + +bool32 IsDynamaxed(u16 battlerId); +bool32 CanDynamax(u16 battlerId); +bool32 IsGigantamaxed(u16 battlerId); +void ApplyDynamaxHPMultiplier(u32 battler, struct Pokemon* mon); +void PrepareBattlerForDynamax(u16 battlerId); +u16 GetNonDynamaxHP(u16 battlerId); +u16 GetNonDynamaxMaxHP(u32 battlerId); +void UndoDynamax(u16 battlerId); +bool32 IsMoveBlockedByMaxGuard(u16 move); +bool32 IsMoveBlockedByDynamax(u16 move); + +bool32 ShouldUseMaxMove(u16 battlerId, u16 baseMove); +u16 GetMaxMove(u16 battlerId, u16 baseMove); +u8 GetMaxMovePower(u16 move); +bool32 IsMaxMove(u16 move); +const u8 *GetMaxMoveName(u16 move); +void ChooseDamageNonTypesString(u8 type); + +void BS_UpdateDynamax(void); +void BS_SetMaxMoveEffect(void); +void BS_SetSteelsurge(void); +void BS_TrySetStatus1(void); +void BS_TrySetStatus2(void); +void BS_DamageNonTypes(void); +void BS_HealOneSixth(void); +void BS_TryRecycleBerry(void); +void BS_JumpIfDynamaxed(void); + +void ChangeDynamaxTriggerSprite(u8 spriteId, u8 animId); +void CreateDynamaxTriggerSprite(u8, bool8); +void HideDynamaxTriggerSprite(void); +bool32 IsDynamaxTriggerSpriteActive(void); +void DestroyDynamaxTriggerSprite(void); + +void DynamaxIndicator_LoadSpriteGfx(void); +bool32 DynamaxIndicator_ShouldBeInvisible(u32 battlerId); +u8 DynamaxIndicator_GetSpriteId(u32 healthboxSpriteId); +void DynamaxIndicator_SetVisibilities(u32 healthboxId, bool32 invisible); +void DynamaxIndicator_UpdateOamPriority(u32 healthboxId, u32 oamPriority); +void DynamaxIndicator_UpdateLevel(u32 healthboxId, u32 level); +void DynamaxIndicator_CreateSprite(u32 battlerId, u32 healthboxSpriteId); +void DynamaxIndicator_DestroySprite(u32 healthboxSpriteId); + +#endif diff --git a/include/battle_interface.h b/include/battle_interface.h index 2c8747db02be..af8f0dc117a3 100644 --- a/include/battle_interface.h +++ b/include/battle_interface.h @@ -54,12 +54,15 @@ enum #define TAG_OMEGA_INDICATOR_TILE 0xD77A #define TAG_ZMOVE_TRIGGER_TILE 0xD77B #define TAG_BURST_TRIGGER_TILE 0xD77C +#define TAG_DYNAMAX_TRIGGER_TILE 0xD77D +#define TAG_DYNAMAX_INDICATOR_TILE 0xD77E #define TAG_MEGA_TRIGGER_PAL 0xD777 #define TAG_MEGA_INDICATOR_PAL 0xD778 -#define TAG_ALPHA_OMEGA_INDICATOR_PAL 0xD779 // Alpha and Omega indicators use the same palette as each of them only uses 4 different colors. +#define TAG_MISC_INDICATOR_PAL 0xD779 // Alpha, Omega, and Dynamax indicators use the same palette as each of them only uses 4 different colors. #define TAG_ZMOVE_TRIGGER_PAL 0xD77B #define TAG_BURST_TRIGGER_PAL 0xD77C +#define TAG_DYNAMAX_TRIGGER_PAL 0xD77D enum { @@ -86,6 +89,7 @@ void SetHealthboxSpriteVisible(u8 healthboxSpriteId); void DummyBattleInterfaceFunc(u8 healthboxSpriteId, bool8 isDoubleBattleBankOnly); void UpdateOamPriorityInAllHealthboxes(u8 priority, bool32 hideHpBoxes); void InitBattlerHealthboxCoords(u8 battler); +void GetBattlerHealthboxCoords(u8 battler, s16 *x, s16 *y); void UpdateHpTextInHealthbox(u32 healthboxSpriteId, u32 maxOrCurrent, s16 currHp, s16 maxHp); void SwapHpBarsWithHpText(void); void ChangeMegaTriggerSprite(u8 spriteId, u8 animId); diff --git a/include/battle_scripts.h b/include/battle_scripts.h index c2a73d01fdd9..3cfc9ace1606 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -468,6 +468,7 @@ extern const u8 BattleScript_DampPreventsAftermath[]; extern const u8 BattleScript_HealingWishActivates[]; extern const u8 BattleScript_LunarDanceActivates[]; extern const u8 BattleScript_ShellTrapSetUp[]; +extern const u8 BattleScript_StealthRockActivates[]; extern const u8 BattleScript_CouldntFullyProtect[]; extern const u8 BattleScript_MoveEffectStockpileWoreOff[]; extern const u8 BattleScript_StealthRockActivates[]; @@ -490,4 +491,33 @@ extern const u8 BattleScript_StatUpZMove[]; extern const u8 BattleScript_HealReplacementZMove[]; extern const u8 BattleScript_EffectExtremeEvoboost[]; +// max moves +extern const u8 BattleScript_EffectRaiseStatAllies[]; +extern const u8 BattleScript_EffectLowerStatFoes[]; +extern const u8 BattleScript_EffectSetWeather[]; +extern const u8 BattleScript_EffectSetTerrain[]; +extern const u8 BattleScript_EffectStonesurge[]; +extern const u8 BattleScript_EffectSteelsurge[]; +extern const u8 BattleScript_SteelsurgeFree[]; +extern const u8 BattleScript_SteelsurgeDefog[]; +extern const u8 BattleScript_DamageNonTypesStarts[]; +extern const u8 BattleScript_DamageNonTypesContinues[]; +extern const u8 BattleScript_DefogTryHazards[]; +extern const u8 BattleScript_EffectAuroraVeilSuccess[]; +extern const u8 BattleScript_EffectGravitySuccess[]; +extern const u8 BattleScript_EffectYawnSuccess[]; +extern const u8 BattleScript_EffectTryReducePP[]; +extern const u8 BattleScript_EffectStatus1Foes[]; +extern const u8 BattleScript_EffectStatus2Foes[]; +extern const u8 BattleScript_TormentEnds[]; +extern const u8 BattleScript_EffectRaiseCritAlliesAnim[]; +extern const u8 BattleScript_EffectHealOneSixthAllies[]; +extern const u8 BattleScript_EffectCureStatusAllies[]; +extern const u8 BattleScript_EffectRecycleBerriesAllies[]; + +// dynamax and max raids +extern const u8 BattleScript_DynamaxBegins[]; +extern const u8 BattleScript_DynamaxEnds[]; +extern const u8 BattleScript_MoveBlockedByDynamax[]; + #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/config/battle.h b/include/config/battle.h index a6756d1dd019..ca995e32711d 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -161,6 +161,7 @@ #define B_FLAG_NO_BAG_USE 0 // If this flag is set, the ability to use the bag in battle is disabled. #define B_FLAG_NO_CATCHING 0 // If this flag is set, the ability to catch wild Pokémon is disabled. #define B_FLAG_AI_VS_AI_BATTLE 0 // If this flag is set, the player's mons will be controlled by the ai next battles. +#define B_FLAG_DYNAMAX_BATTLE 0 // If this flag is set, the ability to Dynamax in battle is enabled for all trainers. // Var Settings // To use the following features in scripting, replace the 0s with the var ID you're assigning it to. diff --git a/include/constants/battle.h b/include/constants/battle.h index a96f13164a13..05c0d1b0377f 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -57,9 +57,9 @@ #define BATTLE_TYPE_WALLY_TUTORIAL (1 << 9) // Used in pokefirered as BATTLE_TYPE_OLD_MAN_TUTORIAL. #define BATTLE_TYPE_ROAMER (1 << 10) #define BATTLE_TYPE_EREADER_TRAINER (1 << 11) -#define BATTLE_TYPE_KYOGRE_GROUDON (1 << 12) +#define BATTLE_TYPE_RAID (1 << 12) #define BATTLE_TYPE_LEGENDARY (1 << 13) -#define BATTLE_TYPE_REGI (1 << 14) +#define BATTLE_TYPE_14 (1 << 14) #define BATTLE_TYPE_TWO_OPPONENTS (1 << 15) // Used in pokefirered as BATTLE_TYPE_GHOST. #define BATTLE_TYPE_DOME (1 << 16) // Used in pokefirered as BATTLE_TYPE_POKEDUDE. #define BATTLE_TYPE_PALACE (1 << 17) // Used in pokefirered as BATTLE_TYPE_WILD_SCRIPTED. @@ -73,17 +73,16 @@ #define BATTLE_TYPE_RECORDED_LINK (1 << 25) #define BATTLE_TYPE_TRAINER_HILL (1 << 26) #define BATTLE_TYPE_SECRET_BASE (1 << 27) -#define BATTLE_TYPE_GROUDON (1 << 28) -#define BATTLE_TYPE_KYOGRE (1 << 29) -#define BATTLE_TYPE_RAYQUAZA (1 << 30) +#define BATTLE_TYPE_28 (1 << 28) +#define BATTLE_TYPE_29 (1 << 29) +#define BATTLE_TYPE_30 (1 << 30) #define BATTLE_TYPE_RECORDED_IS_MASTER (1 << 31) #define BATTLE_TYPE_FRONTIER (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_DOME | BATTLE_TYPE_PALACE | BATTLE_TYPE_ARENA | BATTLE_TYPE_FACTORY | BATTLE_TYPE_PIKE | BATTLE_TYPE_PYRAMID) #define BATTLE_TYPE_FRONTIER_NO_PYRAMID (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_DOME | BATTLE_TYPE_PALACE | BATTLE_TYPE_ARENA | BATTLE_TYPE_FACTORY | BATTLE_TYPE_PIKE) #define BATTLE_TYPE_RECORDED_INVALID ((BATTLE_TYPE_LINK | BATTLE_TYPE_SAFARI | BATTLE_TYPE_FIRST_BATTLE \ | BATTLE_TYPE_WALLY_TUTORIAL | BATTLE_TYPE_ROAMER | BATTLE_TYPE_EREADER_TRAINER \ - | BATTLE_TYPE_KYOGRE_GROUDON | BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_REGI \ - | BATTLE_TYPE_RECORDED | BATTLE_TYPE_TRAINER_HILL | BATTLE_TYPE_SECRET_BASE \ - | BATTLE_TYPE_GROUDON | BATTLE_TYPE_KYOGRE | BATTLE_TYPE_RAYQUAZA)) + | BATTLE_TYPE_LEGENDARY \ + | BATTLE_TYPE_RECORDED | BATTLE_TYPE_TRAINER_HILL | BATTLE_TYPE_SECRET_BASE)) #define WILD_DOUBLE_BATTLE ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER)))) #define RECORDED_WILD_BATTLE ((gBattleTypeFlags & BATTLE_TYPE_RECORDED) && !(gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_FRONTIER))) @@ -237,8 +236,10 @@ #define SIDE_STATUS_WIDE_GUARD (1 << 19) #define SIDE_STATUS_CRAFTY_SHIELD (1 << 20) #define SIDE_STATUS_MAT_BLOCK (1 << 21) +#define SIDE_STATUS_STEELSURGE (1 << 22) +#define SIDE_STATUS_DAMAGE_NON_TYPES (1 << 23) -#define SIDE_STATUS_HAZARDS_ANY (SIDE_STATUS_SPIKES | SIDE_STATUS_STICKY_WEB | SIDE_STATUS_TOXIC_SPIKES | SIDE_STATUS_STEALTH_ROCK) +#define SIDE_STATUS_HAZARDS_ANY (SIDE_STATUS_SPIKES | SIDE_STATUS_STICKY_WEB | SIDE_STATUS_TOXIC_SPIKES | SIDE_STATUS_STEALTH_ROCK | SIDE_STATUS_STEELSURGE) #define SIDE_STATUS_SCREEN_ANY (SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL) // Field affecting statuses. @@ -502,4 +503,7 @@ #define HANDLE_TYPE_PRIMAL_REVERSION 1 #define HANDLE_TYPE_ULTRA_BURST 2 +// Constants for Torment +#define PERMANENT_TORMENT 0xF + #endif // GUARD_CONSTANTS_BATTLE_H diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index 9876652b6563..ddbac9b1ead4 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -550,6 +550,8 @@ #define B_ANIM_SNOW_CONTINUES 36 #define B_ANIM_ULTRA_BURST 37 #define B_ANIM_SALT_CURE_DAMAGE 38 +#define B_ANIM_DYNAMAX_GROWTH 39 +#define B_ANIM_MAX_SET_WEATHER 40 // special animations table (gBattleAnims_Special) #define B_ANIM_LVL_UP 0 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index d5b8db61839e..421a19104348 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -417,7 +417,8 @@ #define EFFECT_MATCHA_GOTCHA 411 #define EFFECT_SYRUP_BOMB 412 #define EFFECT_IVY_CUDGEL 413 +#define EFFECT_MAX_MOVE 414 -#define NUM_BATTLE_MOVE_EFFECTS 414 +#define NUM_BATTLE_MOVE_EFFECTS 415 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 54b7a4437cc1..1f5539dc6239 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -672,8 +672,21 @@ #define STRINGID_TARGETISHURTBYSALTCURE 670 #define STRINGID_OPPORTUNISTCOPIED 671 #define STRINGID_TARGETCOVEREDINSTICKYCANDYSYRUP 672 - -#define BATTLESTRINGS_COUNT 673 +#define STRINGID_SHARPSTEELFLOATS 673 +#define STRINGID_SHARPSTEELDMG 674 +#define STRINGID_PKMNBLEWAWAYSHARPSTEEL 675 +#define STRINGID_SHARPSTEELDISAPPEAREDFROMTEAM 676 +#define STRINGID_TEAMTRAPPEDWITHVINES 677 +#define STRINGID_PKMNHURTBYVINES 678 +#define STRINGID_TEAMCAUGHTINVORTEX 679 +#define STRINGID_PKMNHURTBYVORTEX 680 +#define STRINGID_TEAMSURROUNDEDBYFIRE 681 +#define STRINGID_PKMNBURNINGUP 682 +#define STRINGID_TEAMSURROUNDEDBYROCKS 683 +#define STRINGID_PKMNHURTBYROCKSTHROWN 684 +#define STRINGID_MOVEBLOCKEDBYDYNAMAX 685 + +#define BATTLESTRINGS_COUNT 686 // This is the string id that gBattleStringsTable starts with. // String ids before this (e.g. STRINGID_INTROMSG) are not in the table, @@ -976,7 +989,21 @@ // gDmgHazardsStringIds #define B_MSG_PKMNHURTBYSPIKES 0 #define B_MSG_STEALTHROCKDMG 1 -#define B_MSG_POINTEDSTONESFLOAT 2 -#define B_MSG_SPIKESSCATTERED 3 +#define B_MSG_SHARPSTEELDMG 2 +#define B_MSG_POINTEDSTONESFLOAT 3 +#define B_MSG_SPIKESSCATTERED 4 +#define B_MSG_SHARPSTEELFLOATS 5 + +// gDamageNonTypesStartStringIds +#define B_MSG_TRAPPED_WITH_VINES 0 +#define B_MSG_CAUGHT_IN_VORTEX 1 +#define B_MSG_SURROUNDED_BY_FIRE 2 +#define B_MSG_SURROUNDED_BY_ROCKS 3 + +// gDamageNonTypesDmgStringIds +#define B_MSG_HURT_BY_VINES 0 +#define B_MSG_HURT_BY_VORTEX 1 +#define B_MSG_BURNING_UP 2 +#define B_MSG_HURT_BY_ROCKS_THROWN 3 #endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H diff --git a/include/constants/form_change_types.h b/include/constants/form_change_types.h index db96b065742d..11ef28f3f240 100644 --- a/include/constants/form_change_types.h +++ b/include/constants/form_change_types.h @@ -101,4 +101,8 @@ // param1: item to hold. #define FORM_CHANGE_BATTLE_ULTRA_BURST 16 +// Form change that activates when the mon Dynamaxes (TODO: with Gigantamax factor). +// - No parameters +#define FORM_CHANGE_BATTLE_GIGANTAMAX 17 + #endif // GUARD_CONSTANTS_FORM_CHANGE_TYPES_H diff --git a/include/constants/moves.h b/include/constants/moves.h index b3a881b77f73..e87441b50542 100644 --- a/include/constants/moves.h +++ b/include/constants/moves.h @@ -888,6 +888,7 @@ #define MOVE_DEVASTATING_DRAKE (MOVES_COUNT + 15) #define MOVE_BLACK_HOLE_ECLIPSE (MOVES_COUNT + 16) #define MOVE_TWINKLE_TACKLE (MOVES_COUNT + 17) + // Signature Z Moves #define MOVE_CATASTROPIKA (MOVES_COUNT + 18) #define MOVE_10000000_VOLT_THUNDERBOLT (MOVES_COUNT + 19) @@ -912,6 +913,66 @@ #define MOVES_COUNT_Z (LAST_Z_MOVE + 1) +//Max Moves +#define MOVE_MAX_GUARD (FIRST_MAX_MOVE + 0) +#define MOVE_MAX_STRIKE (FIRST_MAX_MOVE + 1) +#define MOVE_MAX_KNUCKLE (FIRST_MAX_MOVE + 2) +#define MOVE_MAX_AIRSTREAM (FIRST_MAX_MOVE + 3) +#define MOVE_MAX_OOZE (FIRST_MAX_MOVE + 4) +#define MOVE_MAX_QUAKE (FIRST_MAX_MOVE + 5) +#define MOVE_MAX_ROCKFALL (FIRST_MAX_MOVE + 6) +#define MOVE_MAX_FLUTTERBY (FIRST_MAX_MOVE + 7) +#define MOVE_MAX_PHANTASM (FIRST_MAX_MOVE + 8) +#define MOVE_MAX_STEELSPIKE (FIRST_MAX_MOVE + 9) +#define MOVE_MAX_FLARE (FIRST_MAX_MOVE + 10) +#define MOVE_MAX_GEYSER (FIRST_MAX_MOVE + 11) +#define MOVE_MAX_OVERGROWTH (FIRST_MAX_MOVE + 12) +#define MOVE_MAX_LIGHTNING (FIRST_MAX_MOVE + 13) +#define MOVE_MAX_MINDSTORM (FIRST_MAX_MOVE + 14) +#define MOVE_MAX_HAILSTORM (FIRST_MAX_MOVE + 15) +#define MOVE_MAX_WYRMWIND (FIRST_MAX_MOVE + 16) +#define MOVE_MAX_DARKNESS (FIRST_MAX_MOVE + 17) +#define MOVE_MAX_STARFALL (FIRST_MAX_MOVE + 18) +// Gigantamax Moves +#define MOVE_G_MAX_VINE_LASH (FIRST_MAX_MOVE + 19) +#define MOVE_G_MAX_WILDFIRE (FIRST_MAX_MOVE + 20) +#define MOVE_G_MAX_CANNONADE (FIRST_MAX_MOVE + 21) +#define MOVE_G_MAX_BEFUDDLE (FIRST_MAX_MOVE + 22) +#define MOVE_G_MAX_VOLT_CRASH (FIRST_MAX_MOVE + 23) +#define MOVE_G_MAX_GOLD_RUSH (FIRST_MAX_MOVE + 24) +#define MOVE_G_MAX_CHI_STRIKE (FIRST_MAX_MOVE + 25) +#define MOVE_G_MAX_TERROR (FIRST_MAX_MOVE + 26) +#define MOVE_G_MAX_FOAM_BURST (FIRST_MAX_MOVE + 27) +#define MOVE_G_MAX_RESONANCE (FIRST_MAX_MOVE + 28) +#define MOVE_G_MAX_CUDDLE (FIRST_MAX_MOVE + 29) +#define MOVE_G_MAX_REPLENISH (FIRST_MAX_MOVE + 30) +#define MOVE_G_MAX_MALODOR (FIRST_MAX_MOVE + 31) +#define MOVE_G_MAX_MELTDOWN (FIRST_MAX_MOVE + 32) +#define MOVE_G_MAX_DRUM_SOLO (FIRST_MAX_MOVE + 33) +#define MOVE_G_MAX_FIREBALL (FIRST_MAX_MOVE + 34) +#define MOVE_G_MAX_HYDROSNIPE (FIRST_MAX_MOVE + 35) +#define MOVE_G_MAX_WIND_RAGE (FIRST_MAX_MOVE + 36) +#define MOVE_G_MAX_GRAVITAS (FIRST_MAX_MOVE + 37) +#define MOVE_G_MAX_STONESURGE (FIRST_MAX_MOVE + 38) +#define MOVE_G_MAX_VOLCALITH (FIRST_MAX_MOVE + 39) +#define MOVE_G_MAX_TARTNESS (FIRST_MAX_MOVE + 40) +#define MOVE_G_MAX_SWEETNESS (FIRST_MAX_MOVE + 41) +#define MOVE_G_MAX_SANDBLAST (FIRST_MAX_MOVE + 42) +#define MOVE_G_MAX_STUN_SHOCK (FIRST_MAX_MOVE + 43) +#define MOVE_G_MAX_CENTIFERNO (FIRST_MAX_MOVE + 44) +#define MOVE_G_MAX_SMITE (FIRST_MAX_MOVE + 45) +#define MOVE_G_MAX_SNOOZE (FIRST_MAX_MOVE + 46) +#define MOVE_G_MAX_FINALE (FIRST_MAX_MOVE + 47) +#define MOVE_G_MAX_STEELSURGE (FIRST_MAX_MOVE + 48) +#define MOVE_G_MAX_DEPLETION (FIRST_MAX_MOVE + 49) +#define MOVE_G_MAX_ONE_BLOW (FIRST_MAX_MOVE + 50) +#define MOVE_G_MAX_RAPID_FLOW (FIRST_MAX_MOVE + 51) + +#define FIRST_MAX_MOVE MOVES_COUNT_Z +#define LAST_MAX_MOVE MOVE_G_MAX_RAPID_FLOW + +#define MOVES_COUNT_DYNAMAX (LAST_MAX_MOVE + 1) + // Used for checks for moves affected by Disable, Mimic, etc. #define MOVE_UNAVAILABLE 0xFFFF diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 6ff50807af91..49272691c664 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -285,7 +285,7 @@ #define EVO_ITEM_HOLD 41 // Pokémon levels up, holds specified item #define EVO_LEVEL_FOG 42 // Pokémon reaches the specified level during fog in the overworld -#define EVOS_PER_MON 10 +#define EVOS_PER_MON 11 // Evolution 'modes,' for GetEvolutionTargetSpecies #define EVO_MODE_NORMAL 0 diff --git a/include/constants/species.h b/include/constants/species.h index ae36497e7157..2b41b32ea923 100644 --- a/include/constants/species.h +++ b/include/constants/species.h @@ -1371,8 +1371,43 @@ // Basculegion #define SPECIES_BASCULEGION_FEMALE FORMS_START + 329 +// Gigantamax Forms +#define SPECIES_VENUSAUR_GIGANTAMAX FORMS_START + 330 +#define SPECIES_BLASTOISE_GIGANTAMAX FORMS_START + 331 +#define SPECIES_CHARIZARD_GIGANTAMAX FORMS_START + 332 +#define SPECIES_BUTTERFREE_GIGANTAMAX FORMS_START + 333 +#define SPECIES_PIKACHU_GIGANTAMAX FORMS_START + 334 +#define SPECIES_MEOWTH_GIGANTAMAX FORMS_START + 335 +#define SPECIES_MACHAMP_GIGANTAMAX FORMS_START + 336 +#define SPECIES_GENGAR_GIGANTAMAX FORMS_START + 337 +#define SPECIES_KINGLER_GIGANTAMAX FORMS_START + 338 +#define SPECIES_LAPRAS_GIGANTAMAX FORMS_START + 339 +#define SPECIES_EEVEE_GIGANTAMAX FORMS_START + 340 +#define SPECIES_SNORLAX_GIGANTAMAX FORMS_START + 341 +#define SPECIES_GARBODOR_GIGANTAMAX FORMS_START + 342 +#define SPECIES_MELMETAL_GIGANTAMAX FORMS_START + 343 +#define SPECIES_RILLABOOM_GIGANTAMAX FORMS_START + 344 +#define SPECIES_CINDERACE_GIGANTAMAX FORMS_START + 345 +#define SPECIES_INTELEON_GIGANTAMAX FORMS_START + 346 +#define SPECIES_CORVIKNIGHT_GIGANTAMAX FORMS_START + 347 +#define SPECIES_ORBEETLE_GIGANTAMAX FORMS_START + 348 +#define SPECIES_DREDNAW_GIGANTAMAX FORMS_START + 349 +#define SPECIES_COALOSSAL_GIGANTAMAX FORMS_START + 350 +#define SPECIES_FLAPPLE_GIGANTAMAX FORMS_START + 351 +#define SPECIES_APPLETUN_GIGANTAMAX FORMS_START + 352 +#define SPECIES_SANDACONDA_GIGANTAMAX FORMS_START + 353 +#define SPECIES_TOXTRICITY_GIGANTAMAX FORMS_START + 354 +#define SPECIES_CENTISKORCH_GIGANTAMAX FORMS_START + 355 +#define SPECIES_HATTERENE_GIGANTAMAX FORMS_START + 356 +#define SPECIES_GRIMMSNARL_GIGANTAMAX FORMS_START + 357 +#define SPECIES_ALCREMIE_GIGANTAMAX FORMS_START + 358 +#define SPECIES_COPPERAJAH_GIGANTAMAX FORMS_START + 359 +#define SPECIES_DURALUDON_GIGANTAMAX FORMS_START + 360 +#define SPECIES_URSHIFU_GIGANTAMAX FORMS_START + 361 +#define SPECIES_URSHIFU_RAPID_STRIKE_STYLE_GIGANTAMAX FORMS_START + 362 + #define FORMS_START SPECIES_ENAMORUS -#define SPECIES_EGG SPECIES_BASCULEGION_FEMALE + 1 +#define SPECIES_EGG SPECIES_URSHIFU_RAPID_STRIKE_STYLE_GIGANTAMAX + 1 #define NUM_SPECIES SPECIES_EGG diff --git a/include/data.h b/include/data.h index d2248820eaef..842332911423 100644 --- a/include/data.h +++ b/include/data.h @@ -117,7 +117,8 @@ extern const struct CompressedSpriteSheet gMonFrontPicTableFemale[]; extern const struct Trainer gTrainers[]; extern const u8 gTrainerClassNames[][13]; extern const u8 gSpeciesNames[NUM_SPECIES][POKEMON_NAME_LENGTH + 1]; -extern const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1]; +extern const u8 gMoveNames[MOVES_COUNT_DYNAMAX][MOVE_NAME_LENGTH + 1]; extern const u8 *const gZMoveNames[]; +extern const u8 *const gMaxMoveNames[]; #endif // GUARD_DATA_H diff --git a/include/graphics.h b/include/graphics.h index 0cf0f356dd43..7a44592d26be 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -2643,6 +2643,39 @@ extern const u32 gMonBackPic_CalyrexIceRider[]; extern const u32 gMonBackPic_CalyrexShadowRider[]; extern const u32 gMonBackPic_EnamorusTherian[]; extern const u32 gMonBackPic_BasculegionFemale[]; +extern const u32 gMonBackPic_VenusaurGigantamax[]; +extern const u32 gMonBackPic_CharizardGigantamax[]; +extern const u32 gMonBackPic_BlastoiseGigantamax[]; +extern const u32 gMonBackPic_ButterfreeGigantamax[]; +extern const u32 gMonBackPic_PikachuGigantamax[]; +extern const u32 gMonBackPic_MeowthGigantamax[]; +extern const u32 gMonBackPic_MachampGigantamax[]; +extern const u32 gMonBackPic_GengarGigantamax[]; +extern const u32 gMonBackPic_KinglerGigantamax[]; +extern const u32 gMonBackPic_LaprasGigantamax[]; +extern const u32 gMonBackPic_EeveeGigantamax[]; +extern const u32 gMonBackPic_SnorlaxGigantamax[]; +extern const u32 gMonBackPic_GarbodorGigantamax[]; +extern const u32 gMonBackPic_MelmetalGigantamax[]; +extern const u32 gMonBackPic_RillaboomGigantamax[]; +extern const u32 gMonBackPic_CinderaceGigantamax[]; +extern const u32 gMonBackPic_InteleonGigantamax[]; +extern const u32 gMonBackPic_CorviknightGigantamax[]; +extern const u32 gMonBackPic_OrbeetleGigantamax[]; +extern const u32 gMonBackPic_DrednawGigantamax[]; +extern const u32 gMonBackPic_CoalossalGigantamax[]; +extern const u32 gMonBackPic_FlappleGigantamax[]; +extern const u32 gMonBackPic_AppletunGigantamax[]; +extern const u32 gMonBackPic_SandacondaGigantamax[]; +extern const u32 gMonBackPic_ToxtricityGigantamax[]; +extern const u32 gMonBackPic_CentiskorchGigantamax[]; +extern const u32 gMonBackPic_HattereneGigantamax[]; +extern const u32 gMonBackPic_GrimmsnarlGigantamax[]; +extern const u32 gMonBackPic_AlcremieGigantamax[]; +extern const u32 gMonBackPic_CopperajahGigantamax[]; +extern const u32 gMonBackPic_DuraludonGigantamax[]; +extern const u32 gMonBackPic_UrshifuGigantamax[]; +extern const u32 gMonBackPic_UrshifuRapidStrikeGigantamax[]; #endif extern const u32 gMonPalette_CircledQuestionMark[]; @@ -3875,6 +3908,39 @@ extern const u32 gMonPalette_CalyrexIceRider[]; extern const u32 gMonPalette_CalyrexShadowRider[]; extern const u32 gMonPalette_EnamorusTherian[]; extern const u32 gMonPalette_BasculegionFemale[]; +extern const u32 gMonPalette_VenusaurGigantamax[]; +extern const u32 gMonPalette_CharizardGigantamax[]; +extern const u32 gMonPalette_BlastoiseGigantamax[]; +extern const u32 gMonPalette_ButterfreeGigantamax[]; +extern const u32 gMonPalette_PikachuGigantamax[]; +extern const u32 gMonPalette_MeowthGigantamax[]; +extern const u32 gMonPalette_MachampGigantamax[]; +extern const u32 gMonPalette_GengarGigantamax[]; +extern const u32 gMonPalette_KinglerGigantamax[]; +extern const u32 gMonPalette_LaprasGigantamax[]; +extern const u32 gMonPalette_EeveeGigantamax[]; +extern const u32 gMonPalette_SnorlaxGigantamax[]; +extern const u32 gMonPalette_GarbodorGigantamax[]; +extern const u32 gMonPalette_MelmetalGigantamax[]; +extern const u32 gMonPalette_RillaboomGigantamax[]; +extern const u32 gMonPalette_CinderaceGigantamax[]; +extern const u32 gMonPalette_InteleonGigantamax[]; +extern const u32 gMonPalette_CorviknightGigantamax[]; +extern const u32 gMonPalette_OrbeetleGigantamax[]; +extern const u32 gMonPalette_DrednawGigantamax[]; +extern const u32 gMonPalette_CoalossalGigantamax[]; +extern const u32 gMonPalette_FlappleGigantamax[]; +extern const u32 gMonPalette_AppletunGigantamax[]; +extern const u32 gMonPalette_SandacondaGigantamax[]; +extern const u32 gMonPalette_ToxtricityGigantamax[]; +extern const u32 gMonPalette_CentiskorchGigantamax[]; +extern const u32 gMonPalette_HattereneGigantamax[]; +extern const u32 gMonPalette_GrimmsnarlGigantamax[]; +extern const u32 gMonPalette_AlcremieGigantamax[]; +extern const u32 gMonPalette_CopperajahGigantamax[]; +extern const u32 gMonPalette_DuraludonGigantamax[]; +extern const u32 gMonPalette_UrshifuGigantamax[]; +extern const u32 gMonPalette_UrshifuRapidStrikeGigantamax[]; #endif extern const u32 gMonPalette_Egg[]; @@ -5102,6 +5168,39 @@ extern const u32 gMonShinyPalette_CalyrexIceRider[]; extern const u32 gMonShinyPalette_CalyrexShadowRider[]; extern const u32 gMonShinyPalette_EnamorusTherian[]; extern const u32 gMonShinyPalette_BasculegionFemale[]; +extern const u32 gMonShinyPalette_VenusaurGigantamax[]; +extern const u32 gMonShinyPalette_CharizardGigantamax[]; +extern const u32 gMonShinyPalette_BlastoiseGigantamax[]; +extern const u32 gMonShinyPalette_ButterfreeGigantamax[]; +extern const u32 gMonShinyPalette_PikachuGigantamax[]; +extern const u32 gMonShinyPalette_MeowthGigantamax[]; +extern const u32 gMonShinyPalette_MachampGigantamax[]; +extern const u32 gMonShinyPalette_GengarGigantamax[]; +extern const u32 gMonShinyPalette_KinglerGigantamax[]; +extern const u32 gMonShinyPalette_LaprasGigantamax[]; +extern const u32 gMonShinyPalette_EeveeGigantamax[]; +extern const u32 gMonShinyPalette_SnorlaxGigantamax[]; +extern const u32 gMonShinyPalette_GarbodorGigantamax[]; +extern const u32 gMonShinyPalette_MelmetalGigantamax[]; +extern const u32 gMonShinyPalette_RillaboomGigantamax[]; +extern const u32 gMonShinyPalette_CinderaceGigantamax[]; +extern const u32 gMonShinyPalette_InteleonGigantamax[]; +extern const u32 gMonShinyPalette_CorviknightGigantamax[]; +extern const u32 gMonShinyPalette_OrbeetleGigantamax[]; +extern const u32 gMonShinyPalette_DrednawGigantamax[]; +extern const u32 gMonShinyPalette_CoalossalGigantamax[]; +extern const u32 gMonShinyPalette_FlappleGigantamax[]; +extern const u32 gMonShinyPalette_AppletunGigantamax[]; +extern const u32 gMonShinyPalette_SandacondaGigantamax[]; +extern const u32 gMonShinyPalette_ToxtricityGigantamax[]; +extern const u32 gMonShinyPalette_CentiskorchGigantamax[]; +extern const u32 gMonShinyPalette_HattereneGigantamax[]; +extern const u32 gMonShinyPalette_GrimmsnarlGigantamax[]; +extern const u32 gMonShinyPalette_AlcremieGigantamax[]; +extern const u32 gMonShinyPalette_CopperajahGigantamax[]; +extern const u32 gMonShinyPalette_DuraludonGigantamax[]; +extern const u32 gMonShinyPalette_UrshifuGigantamax[]; +extern const u32 gMonShinyPalette_UrshifuRapidStrikeGigantamax[]; #endif extern const u8 gMonIcon_QuestionMark[]; @@ -6323,6 +6422,39 @@ extern const u8 gMonIcon_CalyrexIceRider[]; extern const u8 gMonIcon_CalyrexShadowRider[]; extern const u8 gMonIcon_EnamorusTherian[]; extern const u8 gMonIcon_BasculegionFemale[]; +extern const u8 gMonIcon_VenusaurGigantamax[]; +extern const u8 gMonIcon_CharizardGigantamax[]; +extern const u8 gMonIcon_BlastoiseGigantamax[]; +extern const u8 gMonIcon_ButterfreeGigantamax[]; +extern const u8 gMonIcon_PikachuGigantamax[]; +extern const u8 gMonIcon_MeowthGigantamax[]; +extern const u8 gMonIcon_MachampGigantamax[]; +extern const u8 gMonIcon_GengarGigantamax[]; +extern const u8 gMonIcon_KinglerGigantamax[]; +extern const u8 gMonIcon_LaprasGigantamax[]; +extern const u8 gMonIcon_EeveeGigantamax[]; +extern const u8 gMonIcon_SnorlaxGigantamax[]; +extern const u8 gMonIcon_GarbodorGigantamax[]; +extern const u8 gMonIcon_MelmetalGigantamax[]; +extern const u8 gMonIcon_RillaboomGigantamax[]; +extern const u8 gMonIcon_CinderaceGigantamax[]; +extern const u8 gMonIcon_InteleonGigantamax[]; +extern const u8 gMonIcon_CorviknightGigantamax[]; +extern const u8 gMonIcon_OrbeetleGigantamax[]; +extern const u8 gMonIcon_DrednawGigantamax[]; +extern const u8 gMonIcon_CoalossalGigantamax[]; +extern const u8 gMonIcon_FlappleGigantamax[]; +extern const u8 gMonIcon_AppletunGigantamax[]; +extern const u8 gMonIcon_SandacondaGigantamax[]; +extern const u8 gMonIcon_ToxtricityGigantamax[]; +extern const u8 gMonIcon_CentiskorchGigantamax[]; +extern const u8 gMonIcon_HattereneGigantamax[]; +extern const u8 gMonIcon_GrimmsnarlGigantamax[]; +extern const u8 gMonIcon_AlcremieGigantamax[]; +extern const u8 gMonIcon_CopperajahGigantamax[]; +extern const u8 gMonIcon_DuraludonGigantamax[]; +extern const u8 gMonIcon_UrshifuGigantamax[]; +extern const u8 gMonIcon_UrshifuRapidStrikeGigantamax[]; #endif extern const u8 gMonIcon_Egg[]; @@ -7241,6 +7373,39 @@ extern const u8 gMonFootprint_Calyrex[]; //extern const u8 gMonFootprint_Sneasler[]; //extern const u8 gMonFootprint_Overqwil[]; //extern const u8 gMonFootprint_Enamorus[]; +extern const u32 gMonFrontPic_VenusaurGigantamax[]; +extern const u32 gMonFrontPic_CharizardGigantamax[]; +extern const u32 gMonFrontPic_BlastoiseGigantamax[]; +extern const u32 gMonFrontPic_ButterfreeGigantamax[]; +extern const u32 gMonFrontPic_PikachuGigantamax[]; +extern const u32 gMonFrontPic_MeowthGigantamax[]; +extern const u32 gMonFrontPic_MachampGigantamax[]; +extern const u32 gMonFrontPic_GengarGigantamax[]; +extern const u32 gMonFrontPic_KinglerGigantamax[]; +extern const u32 gMonFrontPic_LaprasGigantamax[]; +extern const u32 gMonFrontPic_EeveeGigantamax[]; +extern const u32 gMonFrontPic_SnorlaxGigantamax[]; +extern const u32 gMonFrontPic_GarbodorGigantamax[]; +extern const u32 gMonFrontPic_MelmetalGigantamax[]; +extern const u32 gMonFrontPic_RillaboomGigantamax[]; +extern const u32 gMonFrontPic_CinderaceGigantamax[]; +extern const u32 gMonFrontPic_InteleonGigantamax[]; +extern const u32 gMonFrontPic_CorviknightGigantamax[]; +extern const u32 gMonFrontPic_OrbeetleGigantamax[]; +extern const u32 gMonFrontPic_DrednawGigantamax[]; +extern const u32 gMonFrontPic_CoalossalGigantamax[]; +extern const u32 gMonFrontPic_FlappleGigantamax[]; +extern const u32 gMonFrontPic_AppletunGigantamax[]; +extern const u32 gMonFrontPic_SandacondaGigantamax[]; +extern const u32 gMonFrontPic_ToxtricityGigantamax[]; +extern const u32 gMonFrontPic_CentiskorchGigantamax[]; +extern const u32 gMonFrontPic_HattereneGigantamax[]; +extern const u32 gMonFrontPic_GrimmsnarlGigantamax[]; +extern const u32 gMonFrontPic_AlcremieGigantamax[]; +extern const u32 gMonFrontPic_CopperajahGigantamax[]; +extern const u32 gMonFrontPic_DuraludonGigantamax[]; +extern const u32 gMonFrontPic_UrshifuGigantamax[]; +extern const u32 gMonFrontPic_UrshifuRapidStrikeGigantamax[]; #endif // trainer sprites diff --git a/include/pokemon.h b/include/pokemon.h index 526103e58a3a..a81f112e23d0 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -333,6 +333,7 @@ struct SpeciesInfo /*0x24*/ /* 0x1F */ u8 bodyColor : 7; u8 noFlip : 1; /* 0x20 */ u16 flags; + /* 0x22 */ u8 gigantamax:1; }; struct BattleMove diff --git a/include/random.h b/include/random.h index af3d7c75e5fc..8d801ebe742b 100644 --- a/include/random.h +++ b/include/random.h @@ -76,6 +76,10 @@ enum RandomTag RNG_FLAME_BODY, RNG_FORCE_RANDOM_SWITCH, RNG_FROZEN, + RNG_G_MAX_STUN_SHOCK, + RNG_G_MAX_BEFUDDLE, + RNG_G_MAX_REPLENISH, + RNG_G_MAX_SNOOZE, RNG_HITS, RNG_HOLD_EFFECT_FLINCH, RNG_INFATUATION, diff --git a/include/test/battle.h b/include/test/battle.h index f0808c6d09f1..616c81964a0f 100644 --- a/include/test/battle.h +++ b/include/test/battle.h @@ -931,6 +931,8 @@ struct MoveContext u16 ultraBurst:1; u16 explicitUltraBurst:1; // TODO: u8 zMove:1; + u16 dynamax:1; + u16 explicitDynamax:1; u16 allowed:1; u16 explicitAllowed:1; u16 notExpected:1; // Has effect only with EXPECT_MOVE diff --git a/sound/cry_tables.inc b/sound/cry_tables.inc index dc15e0f0477f..85cc9b9b2978 100644 --- a/sound/cry_tables.inc +++ b/sound/cry_tables.inc @@ -2123,6 +2123,70 @@ gCryTable:: @ Basculegion cry Cry_Unown .endif +@ Gigantamax Forms + cry Cry_Venusaur + cry Cry_Charizard + cry Cry_Blastoise + cry Cry_Butterfree + cry Cry_Pikachu + cry Cry_Meowth + cry Cry_Machamp + cry Cry_Gengar + cry Cry_Kingler + cry Cry_Lapras + cry Cry_Eevee + cry Cry_Snorlax +.if P_GEN_5_POKEMON == TRUE + cry Cry_Garbodor +.else + cry Cry_Unown +.endif +.if P_GEN_7_POKEMON == TRUE + cry Cry_Melmetal +.else + cry Cry_Unown +.endif +.if P_GEN_8_POKEMON == TRUE + cry Cry_Rillaboom + cry Cry_Cinderace + cry Cry_Inteleon + cry Cry_Corviknight + cry Cry_Orbeetle + cry Cry_Drednaw + cry Cry_Coalossal + cry Cry_Flapple + cry Cry_Appletun + cry Cry_Sandaconda + cry Cry_Toxtricity + cry Cry_Centiskorch + cry Cry_Hatterene + cry Cry_Grimmsnarl + cry Cry_Alcremie + cry Cry_Copperajah + cry Cry_Duraludon + cry Cry_Urshifu + cry Cry_Urshifu +.else + cry Cry_Unown + cry Cry_Unown + cry Cry_Unown + cry Cry_Unown + cry Cry_Unown + cry Cry_Unown + cry Cry_Unown + cry Cry_Unown + cry Cry_Unown + cry Cry_Unown + cry Cry_Unown + cry Cry_Unown + cry Cry_Unown + cry Cry_Unown + cry Cry_Unown + cry Cry_Unown + cry Cry_Unown + cry Cry_Unown + cry Cry_Unown +.endif .align 2 gCryTable_Reverse:: @@ -4194,4 +4258,68 @@ gCryTable_Reverse:: cry_reverse Cry_Unown cry_reverse Cry_Unown cry_reverse Cry_Unown +.endif + @ Gigantamax Forms + cry_reverse Cry_Venusaur + cry_reverse Cry_Charizard + cry_reverse Cry_Blastoise + cry_reverse Cry_Butterfree + cry_reverse Cry_Pikachu + cry_reverse Cry_Meowth + cry_reverse Cry_Machamp + cry_reverse Cry_Gengar + cry_reverse Cry_Kingler + cry_reverse Cry_Lapras + cry_reverse Cry_Eevee + cry_reverse Cry_Snorlax +.if P_GEN_5_POKEMON == TRUE + cry_reverse Cry_Garbodor +.else + cry_reverse Cry_Unown +.endif +.if P_GEN_7_POKEMON == TRUE + cry_reverse Cry_Melmetal +.else + cry_reverse Cry_Unown +.endif +.if P_GEN_8_POKEMON == TRUE + cry_reverse Cry_Rillaboom + cry_reverse Cry_Cinderace + cry_reverse Cry_Inteleon + cry_reverse Cry_Corviknight + cry_reverse Cry_Orbeetle + cry_reverse Cry_Drednaw + cry_reverse Cry_Coalossal + cry_reverse Cry_Flapple + cry_reverse Cry_Appletun + cry_reverse Cry_Sandaconda + cry_reverse Cry_Toxtricity + cry_reverse Cry_Centiskorch + cry_reverse Cry_Hatterene + cry_reverse Cry_Grimmsnarl + cry_reverse Cry_Alcremie + cry_reverse Cry_Copperajah + cry_reverse Cry_Duraludon + cry_reverse Cry_Urshifu + cry_reverse Cry_Urshifu +.else + cry_reverse Cry_Unown + cry_reverse Cry_Unown + cry_reverse Cry_Unown + cry_reverse Cry_Unown + cry_reverse Cry_Unown + cry_reverse Cry_Unown + cry_reverse Cry_Unown + cry_reverse Cry_Unown + cry_reverse Cry_Unown + cry_reverse Cry_Unown + cry_reverse Cry_Unown + cry_reverse Cry_Unown + cry_reverse Cry_Unown + cry_reverse Cry_Unown + cry_reverse Cry_Unown + cry_reverse Cry_Unown + cry_reverse Cry_Unown + cry_reverse Cry_Unown + cry_reverse Cry_Unown .endif diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 6ed887cb6916..b31f66ec1ef5 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -3223,6 +3223,10 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score // We only check for moves that have a 20% chance or more for their secondary effect to happen because moves with a smaller chance are rather worthless. We don't want the AI to use those. bool32 sereneGraceBoost = (aiData->abilities[battlerAtk] == ABILITY_SERENE_GRACE && (gBattleMoves[move].secondaryEffectChance >= 20 && gBattleMoves[move].secondaryEffectChance < 100)); + // The AI should understand that while Dynamaxed, status moves function like Protect. + if (IsDynamaxed(battlerAtk) && gBattleMoves[move].split == SPLIT_STATUS) + moveEffect = EFFECT_PROTECT; + // Targeting partner, check benefits of doing that instead if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) return score; diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 64936e0b9855..8f74dcd36240 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -2397,7 +2397,7 @@ static u32 GetLeechSeedDamage(u32 battlerId) if ((gStatuses3[battlerId] & STATUS3_LEECHSEED) && gBattleMons[gStatuses3[battlerId] & STATUS3_LEECHSEED_BATTLER].hp != 0) { - damage = gBattleMons[battlerId].maxHP / 8; + damage = GetNonDynamaxMaxHP(battlerId) / 8; if (damage == 0) damage = 1; } @@ -2409,7 +2409,7 @@ static u32 GetNightmareDamage(u32 battlerId) u32 damage = 0; if ((gBattleMons[battlerId].status2 & STATUS2_NIGHTMARE) && gBattleMons[battlerId].status1 & STATUS1_SLEEP) { - damage = gBattleMons[battlerId].maxHP / 4; + damage = GetNonDynamaxMaxHP(battlerId) / 4; if (damage == 0) damage = 1; } @@ -2421,7 +2421,7 @@ static u32 GetCurseDamage(u32 battlerId) u32 damage = 0; if (gBattleMons[battlerId].status2 & STATUS2_CURSED) { - damage = gBattleMons[battlerId].maxHP / 4; + damage = GetNonDynamaxMaxHP(battlerId) / 4; if (damage == 0) damage = 1; } @@ -2436,9 +2436,9 @@ static u32 GetTrapDamage(u32 battlerId) if (gBattleMons[battlerId].status2 & STATUS2_WRAPPED) { if (holdEffect == HOLD_EFFECT_BINDING_BAND) - damage = gBattleMons[battlerId].maxHP / (B_BINDING_DAMAGE >= GEN_6 ? 6 : 8); + damage = GetNonDynamaxMaxHP(battlerId) / (B_BINDING_DAMAGE >= GEN_6 ? 6 : 8); else - damage = gBattleMons[battlerId].maxHP / (B_BINDING_DAMAGE >= GEN_6 ? 8 : 16); + damage = GetNonDynamaxMaxHP(battlerId) / (B_BINDING_DAMAGE >= GEN_6 ? 8 : 16); if (damage == 0) damage = 1; @@ -2509,7 +2509,7 @@ static u32 GetWeatherDamage(u32 battlerId) && !(gStatuses3[battlerId] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) && holdEffect != HOLD_EFFECT_SAFETY_GOGGLES) { - damage = gBattleMons[battlerId].maxHP / 16; + damage = GetNonDynamaxMaxHP(battlerId) / 16; if (damage == 0) damage = 1; } @@ -2520,7 +2520,7 @@ static u32 GetWeatherDamage(u32 battlerId) && !(gStatuses3[battlerId] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) && holdEffect != HOLD_EFFECT_SAFETY_GOGGLES) { - damage = gBattleMons[battlerId].maxHP / 16; + damage = GetNonDynamaxMaxHP(battlerId) / 16; if (damage == 0) damage = 1; } diff --git a/src/battle_anim_new.c b/src/battle_anim_new.c index 49607a15656f..f150afb79979 100644 --- a/src/battle_anim_new.c +++ b/src/battle_anim_new.c @@ -8281,7 +8281,7 @@ void AnimTask_ShellSmashShrinkAttacker(u8 taskId) task->func = AnimTask_DynamaxGrowthStep; } -static void AnimTask_DynamaxGrowthStep(u8 taskId) +static void AnimTask_DynamaxGrowthStep(u8 taskId) // from CFRU { struct Task* task = &gTasks[taskId]; if (!RunAffineAnimFromTaskData(task)) @@ -8634,7 +8634,6 @@ void AnimTask_AffectionHangedOn(u8 taskId) DestroyAnimVisualTask(taskId); } - //Launches the stat ball for Power Shift //arg 0: X starting offset //arg 1: Y starting offset @@ -9099,3 +9098,53 @@ static void SpriteCB_TripleArrowKick(struct Sprite* sprite) InitAnimArcTranslation(sprite); sprite->callback = SpriteCB_PowerShiftBallStep; //Arc until complete } + +// DYNAMAX +static const union AffineAnimCmd sDynamaxGrowthAffineAnimCmds[] = // from CFRU +{ + AFFINEANIMCMD_FRAME(-2, -2, 0, 64), //Double in size over 1 second + AFFINEANIMCMD_FRAME(0, 0, 0, 64), //Pause for 1 seconds + AFFINEANIMCMD_FRAME(16, 16, 0, 8), //Shrink back down in 1/8 of a second + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sDynamaxGrowthAttackAnimationAffineAnimCmds[] = +{ + AFFINEANIMCMD_FRAME(-4, -4, 0, 32), //Double in size quicker + AFFINEANIMCMD_FRAME(0, 0, 0, 32), //Pause for less + AFFINEANIMCMD_FRAME(16, 16, 0, 8), + AFFINEANIMCMD_END, +}; + +//Arg 0: Animation for attack +void AnimTask_DynamaxGrowth(u8 taskId) // from CFRU +{ + struct Task* task = &gTasks[taskId]; + u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); + + if (gBattleAnimArgs[0] == 0) + PrepareAffineAnimInTaskData(task, spriteId, sDynamaxGrowthAffineAnimCmds); + else + PrepareAffineAnimInTaskData(task, spriteId, sDynamaxGrowthAttackAnimationAffineAnimCmds); + task->func = AnimTask_DynamaxGrowthStep; +} + +void AnimTask_GetWeatherToSet(u8 taskId) +{ + switch (gBattleMoves[gCurrentMove].argument) + { + case MAX_EFFECT_SUN: + gBattleAnimArgs[ARG_RET_ID] = 1; + break; + case MAX_EFFECT_RAIN: + gBattleAnimArgs[ARG_RET_ID] = 2; + break; + case MAX_EFFECT_SANDSTORM: + gBattleAnimArgs[ARG_RET_ID] = 3; + break; + case MAX_EFFECT_HAIL: + gBattleAnimArgs[ARG_RET_ID] = 4; + break; + } + DestroyAnimVisualTask(taskId); +} diff --git a/src/battle_bg.c b/src/battle_bg.c index 61cf11a0a54b..1da5d5c65e80 100644 --- a/src/battle_bg.c +++ b/src/battle_bg.c @@ -758,23 +758,26 @@ void DrawMainBattleBackground(void) LZDecompressVram(gBattleTerrainTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); LoadCompressedPalette(gBattleTerrainPalette_Frontier, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); } - else if (gBattleTypeFlags & BATTLE_TYPE_GROUDON) + else if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY) { - LZDecompressVram(gBattleTerrainTiles_Cave, (void *)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleTerrainTilemap_Cave, (void *)(BG_SCREEN_ADDR(26))); - LoadCompressedPalette(gBattleTerrainPalette_Groudon, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - } - else if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE) - { - LZDecompressVram(gBattleTerrainTiles_Water, (void *)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleTerrainTilemap_Water, (void *)(BG_SCREEN_ADDR(26))); - LoadCompressedPalette(gBattleTerrainPalette_Kyogre, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - } - else if (gBattleTypeFlags & BATTLE_TYPE_RAYQUAZA) - { - LZDecompressVram(gBattleTerrainTiles_Rayquaza, (void *)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleTerrainTilemap_Rayquaza, (void *)(BG_SCREEN_ADDR(26))); - LoadCompressedPalette(gBattleTerrainPalette_Rayquaza, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); + switch (GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL)) + { + case SPECIES_GROUDON: + LZDecompressVram(gBattleTerrainTiles_Cave, (void*)(BG_CHAR_ADDR(2))); + LZDecompressVram(gBattleTerrainTilemap_Cave, (void*)(BG_SCREEN_ADDR(26))); + LoadCompressedPalette(gBattleTerrainPalette_Groudon, 0x20, 0x60); + break; + case SPECIES_KYOGRE: + LZDecompressVram(gBattleTerrainTiles_Water, (void*)(BG_CHAR_ADDR(2))); + LZDecompressVram(gBattleTerrainTilemap_Water, (void*)(BG_SCREEN_ADDR(26))); + LoadCompressedPalette(gBattleTerrainPalette_Kyogre, 0x20, 0x60); + break; + case SPECIES_RAYQUAZA: + LZDecompressVram(gBattleTerrainTiles_Rayquaza, (void*)(BG_CHAR_ADDR(2))); + LZDecompressVram(gBattleTerrainTilemap_Rayquaza, (void*)(BG_SCREEN_ADDR(26))); + LoadCompressedPalette(gBattleTerrainPalette_Rayquaza, 0x20, 0x60); + break; + } } else { @@ -1155,20 +1158,23 @@ void DrawBattleEntryBackground(void) CopyBgTilemapBufferToVram(2); } } - else if (gBattleTypeFlags & BATTLE_TYPE_GROUDON) - { - LZDecompressVram(gBattleTerrainAnimTiles_Cave, (void *)(BG_CHAR_ADDR(1))); - LZDecompressVram(gBattleTerrainAnimTilemap_Cave, (void *)(BG_SCREEN_ADDR(28))); - } - else if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE) + else if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY) { - LZDecompressVram(gBattleTerrainAnimTiles_Underwater, (void *)(BG_CHAR_ADDR(1))); - LZDecompressVram(gBattleTerrainAnimTilemap_Underwater, (void *)(BG_SCREEN_ADDR(28))); - } - else if (gBattleTypeFlags & BATTLE_TYPE_RAYQUAZA) - { - LZDecompressVram(gBattleTerrainAnimTiles_Rayquaza, (void *)(BG_CHAR_ADDR(1))); - LZDecompressVram(gBattleTerrainAnimTilemap_Rayquaza, (void *)(BG_SCREEN_ADDR(28))); + switch (GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL)) + { + case SPECIES_GROUDON: + LZDecompressVram(gBattleTerrainAnimTiles_Cave, (void*)(BG_CHAR_ADDR(1))); + LZDecompressVram(gBattleTerrainAnimTilemap_Cave, (void*)(BG_SCREEN_ADDR(28))); + break; + case SPECIES_KYOGRE: + LZDecompressVram(gBattleTerrainAnimTiles_Underwater, (void*)(BG_CHAR_ADDR(1))); + LZDecompressVram(gBattleTerrainAnimTilemap_Underwater, (void*)(BG_SCREEN_ADDR(28))); + break; + case SPECIES_RAYQUAZA: + LZDecompressVram(gBattleTerrainAnimTiles_Rayquaza, (void*)(BG_CHAR_ADDR(1))); + LZDecompressVram(gBattleTerrainAnimTilemap_Rayquaza, (void*)(BG_SCREEN_ADDR(28))); + break; + } } else { @@ -1223,9 +1229,17 @@ bool8 LoadChosenBattleElement(u8 caseId) { LZDecompressVram(gBattleTerrainTiles_Building, (void *)(BG_CHAR_ADDR(2))); } - else if (gBattleTypeFlags & BATTLE_TYPE_GROUDON) + else if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY) { - LZDecompressVram(gBattleTerrainTiles_Cave, (void *)(BG_CHAR_ADDR(2))); + switch (GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL)) + { + case SPECIES_GROUDON: + LZDecompressVram(gBattleTerrainTiles_Cave, (void*)(BG_CHAR_ADDR(2))); + break; + case SPECIES_KYOGRE: + LZDecompressVram(gBattleTerrainTilemap_Water, (void*)(BG_SCREEN_ADDR(2))); + break; + } } else { @@ -1282,10 +1296,10 @@ bool8 LoadChosenBattleElement(u8 caseId) { LZDecompressVram(gBattleTerrainTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); } - else if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) + else if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY) { - if (gGameVersion == VERSION_RUBY) - LZDecompressVram(gBattleTerrainTilemap_Cave, (void *)(BG_SCREEN_ADDR(26))); + if (GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL) == SPECIES_GROUDON) + LZDecompressVram(gBattleTerrainTilemap_Cave, (void*)(BG_SCREEN_ADDR(26))); else LZDecompressVram(gBattleTerrainTilemap_Water, (void *)(BG_SCREEN_ADDR(26))); } @@ -1344,10 +1358,10 @@ bool8 LoadChosenBattleElement(u8 caseId) { LoadCompressedPalette(gBattleTerrainPalette_Frontier, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); } - else if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) + else if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY) { - if (gGameVersion == VERSION_RUBY) - LoadCompressedPalette(gBattleTerrainPalette_Groudon, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); + if (GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL) == SPECIES_GROUDON) + LoadCompressedPalette(gBattleTerrainPalette_Groudon, 0x20, 0x60); else LoadCompressedPalette(gBattleTerrainPalette_Kyogre, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); } diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index 56f7a0c0838c..703d66105b68 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -560,10 +560,15 @@ static void OpponentHandleChooseMove(u32 battler) } if (ShouldUseZMove(battler, gBattlerTarget, chosenMove)) QueueZMove(battler, chosenMove); - if (CanMegaEvolve(battler)) // If opponent can mega evolve, do it. + // If opponent can Mega Evolve, do it. + if (CanMegaEvolve(battler)) BtlController_EmitTwoReturnValues(battler, BUFFER_B, 10, (chosenMoveId) | (RET_MEGA_EVOLUTION) | (gBattlerTarget << 8)); + // If opponent can Ultra Burst, do it. else if (CanUltraBurst(battler)) BtlController_EmitTwoReturnValues(battler, BUFFER_B, 10, (chosenMoveId) | (RET_ULTRA_BURST) | (gBattlerTarget << 8)); + // If opponent can Dynamax and is on final Pokemon, do it. + else if (CanDynamax(battler) && CountAIAliveNonEggMonsExcept(gBattlerPartyIndexes[battler]) == 0) + BtlController_EmitTwoReturnValues(battler, BUFFER_B, 10, (chosenMoveId) | (RET_DYNAMAX) | (gBattlerTarget << 8)); else BtlController_EmitTwoReturnValues(battler, BUFFER_B, 10, (chosenMoveId) | (gBattlerTarget << 8)); } diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 07c8cbbf14aa..feabb2863a20 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -439,6 +439,8 @@ static void HandleInputChooseTarget(u32 battler) BtlController_EmitTwoReturnValues(battler, BUFFER_B, 10, gMoveSelectionCursor[battler] | RET_MEGA_EVOLUTION | (gMultiUsePlayerCursor << 8)); else if (gBattleStruct->burst.playerSelect) BtlController_EmitTwoReturnValues(battler, BUFFER_B, 10, gMoveSelectionCursor[battler] | RET_ULTRA_BURST | (gMultiUsePlayerCursor << 8)); + else if (gBattleStruct->dynamax.playerSelect) + BtlController_EmitTwoReturnValues(battler, BUFFER_B, 10, gMoveSelectionCursor[battler] | RET_DYNAMAX | (gMultiUsePlayerCursor << 8)); else BtlController_EmitTwoReturnValues(battler, BUFFER_B, 10, gMoveSelectionCursor[battler] | (gMultiUsePlayerCursor << 8)); EndBounceEffect(gMultiUsePlayerCursor, BOUNCE_HEALTHBOX); @@ -599,6 +601,8 @@ static void HandleInputShowEntireFieldTargets(u32 battler) BtlController_EmitTwoReturnValues(battler, BUFFER_B, 10, gMoveSelectionCursor[battler] | RET_MEGA_EVOLUTION | (gMultiUsePlayerCursor << 8)); else if (gBattleStruct->burst.playerSelect) BtlController_EmitTwoReturnValues(battler, BUFFER_B, 10, gMoveSelectionCursor[battler] | RET_ULTRA_BURST | (gMultiUsePlayerCursor << 8)); + else if (gBattleStruct->dynamax.playerSelect) + BtlController_EmitTwoReturnValues(battler, BUFFER_B, 10, gMoveSelectionCursor[battler] | RET_DYNAMAX | (gMultiUsePlayerCursor << 8)); else BtlController_EmitTwoReturnValues(battler, BUFFER_B, 10, gMoveSelectionCursor[battler] | (gMultiUsePlayerCursor << 8)); HideTriggerSprites(); @@ -629,6 +633,8 @@ static void HandleInputShowTargets(u32 battler) BtlController_EmitTwoReturnValues(battler, BUFFER_B, 10, gMoveSelectionCursor[battler] | RET_MEGA_EVOLUTION | (gMultiUsePlayerCursor << 8)); else if (gBattleStruct->burst.playerSelect) BtlController_EmitTwoReturnValues(battler, BUFFER_B, 10, gMoveSelectionCursor[battler] | RET_ULTRA_BURST | (gMultiUsePlayerCursor << 8)); + else if (gBattleStruct->dynamax.playerSelect) + BtlController_EmitTwoReturnValues(battler, BUFFER_B, 10, gMoveSelectionCursor[battler] | RET_DYNAMAX | (gMultiUsePlayerCursor << 8)); else BtlController_EmitTwoReturnValues(battler, BUFFER_B, 10, gMoveSelectionCursor[battler] | (gMultiUsePlayerCursor << 8)); HideTriggerSprites(); @@ -690,6 +696,13 @@ static void HandleInputChooseMove(u32 battler) moveTarget = MOVE_TARGET_SELECTED; //damaging z moves always have selected target } + // Status moves turn into Max Guard when Dynamaxed, targets user. + if ((IsDynamaxed(battler) || gBattleStruct->dynamax.playerSelect) + && gBattleMoves[moveInfo->moves[gMoveSelectionCursor[battler]]].split == SPLIT_STATUS) + { + moveTarget = MOVE_TARGET_USER; + } + if (moveTarget & MOVE_TARGET_USER) gMultiUsePlayerCursor = battler; else @@ -747,6 +760,8 @@ static void HandleInputChooseMove(u32 battler) BtlController_EmitTwoReturnValues(battler, BUFFER_B, 10, gMoveSelectionCursor[battler] | RET_MEGA_EVOLUTION | (gMultiUsePlayerCursor << 8)); else if (gBattleStruct->burst.playerSelect) BtlController_EmitTwoReturnValues(battler, BUFFER_B, 10, gMoveSelectionCursor[battler] | RET_ULTRA_BURST | (gMultiUsePlayerCursor << 8)); + else if (gBattleStruct->dynamax.playerSelect) + BtlController_EmitTwoReturnValues(battler, BUFFER_B, 10, gMoveSelectionCursor[battler] | RET_DYNAMAX | (gMultiUsePlayerCursor << 8)); else BtlController_EmitTwoReturnValues(battler, BUFFER_B, 10, gMoveSelectionCursor[battler] | (gMultiUsePlayerCursor << 8)); HideTriggerSprites(); @@ -784,6 +799,7 @@ static void HandleInputChooseMove(u32 battler) { gBattleStruct->mega.playerSelect = FALSE; gBattleStruct->burst.playerSelect = FALSE; + gBattleStruct->dynamax.playerSelect = FALSE; gBattleStruct->zmove.viable = FALSE; BtlController_EmitTwoReturnValues(battler, BUFFER_B, 10, 0xFFFF); HideTriggerSprites(); @@ -884,6 +900,14 @@ static void HandleInputChooseMove(u32 battler) else ReloadMoveNames(battler); } + else if (CanDynamax(battler)) + { + gBattleStruct->dynamax.playerSelect ^= 1; + MoveSelectionDisplayMoveNames(battler); + MoveSelectionCreateCursorAt(gMoveSelectionCursor[battler], 0); + ChangeDynamaxTriggerSprite(gBattleStruct->dynamax.triggerSpriteId, gBattleStruct->dynamax.playerSelect); + PlaySE(SE_SELECT); + } } } @@ -891,6 +915,7 @@ static void ReloadMoveNames(u32 battler) { gBattleStruct->mega.playerSelect = FALSE; gBattleStruct->burst.playerSelect = FALSE; + gBattleStruct->dynamax.playerSelect = FALSE; gBattleStruct->zmove.viewing = FALSE; MoveSelectionDestroyCursorAt(battler); MoveSelectionDisplayMoveNames(battler); @@ -1415,7 +1440,18 @@ static void Task_GiveExpToMon(u8 taskId) if (currExp + gainedExp >= nextLvlExp) { SetMonData(mon, MON_DATA_EXP, &nextLvlExp); + gBattleStruct->dynamax.levelUpHP = GetMonData(mon, MON_DATA_HP) \ + + UQ_4_12_TO_INT((gBattleScripting.levelUpHP * UQ_4_12(1.5)) + UQ_4_12_ROUND); CalculateMonStats(mon); + + // Reapply Dynamax HP multiplier after stats are recalculated. + if (IsDynamaxed(battler) && monId == gBattlerPartyIndexes[battler]) + { + ApplyDynamaxHPMultiplier(battler, mon); + gBattleMons[battler].hp = gBattleStruct->dynamax.levelUpHP; + SetMonData(mon, MON_DATA_HP, &gBattleMons[battler].hp); + } + gainedExp -= nextLvlExp - currExp; BtlController_EmitTwoReturnValues(battler, BUFFER_B, RET_VALUE_LEVELED_UP, gainedExp); @@ -1488,7 +1524,18 @@ static void Task_GiveExpWithExpBar(u8 taskId) if (currExp + gainedExp >= expOnNextLvl) { SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &expOnNextLvl); + gBattleStruct->dynamax.levelUpHP = GetMonData(&gPlayerParty[monId], MON_DATA_HP) \ + + UQ_4_12_TO_INT((gBattleScripting.levelUpHP * UQ_4_12(1.5)) + UQ_4_12_ROUND); CalculateMonStats(&gPlayerParty[monId]); + + // Reapply Dynamax HP multiplier after stats are recalculated. + if (IsDynamaxed(battler) && monId == gBattlerPartyIndexes[battler]) + { + ApplyDynamaxHPMultiplier(battler, &gPlayerParty[monId]); + gBattleMons[battler].hp = gBattleStruct->dynamax.levelUpHP; + SetMonData(&gPlayerParty[monId], MON_DATA_HP, &gBattleMons[battler].hp); + } + gainedExp -= expOnNextLvl - currExp; BtlController_EmitTwoReturnValues(battler, BUFFER_B, RET_VALUE_LEVELED_UP, gainedExp); gTasks[taskId].func = Task_LaunchLvlUpAnim; @@ -1635,7 +1682,11 @@ static void MoveSelectionDisplayMoveNames(u32 battler) for (i = 0; i < MAX_MON_MOVES; i++) { MoveSelectionDestroyCursorAt(i); - StringCopy(gDisplayedStringBattle, gMoveNames[moveInfo->moves[i]]); + if ((gBattleStruct->dynamax.playerSelect && CanDynamax(battler)) + || IsDynamaxed(battler)) + StringCopy(gDisplayedStringBattle, gMoveNames[GetMaxMove(battler, moveInfo->moves[i])]); + else + StringCopy(gDisplayedStringBattle, gMoveNames[moveInfo->moves[i]]); // Prints on windows B_WIN_MOVE_NAME_1, B_WIN_MOVE_NAME_2, B_WIN_MOVE_NAME_3, B_WIN_MOVE_NAME_4 BattlePutTextOnWindow(gDisplayedStringBattle, i + B_WIN_MOVE_NAME_1); if (moveInfo->moves[i] != MOVE_NONE) @@ -1979,6 +2030,7 @@ static void PlayerHandleChooseMove(u32 battler) InitMoveSelectionsVarsAndStrings(battler); gBattleStruct->mega.playerSelect = FALSE; gBattleStruct->burst.playerSelect = FALSE; + gBattleStruct->dynamax.playerSelect = FALSE; if (!IsMegaTriggerSpriteActive()) gBattleStruct->mega.triggerSpriteId = 0xFF; if (CanMegaEvolve(battler)) @@ -1987,6 +2039,10 @@ static void PlayerHandleChooseMove(u32 battler) gBattleStruct->burst.triggerSpriteId = 0xFF; if (CanUltraBurst(battler)) CreateBurstTriggerSprite(battler, 0); + if (!IsDynamaxTriggerSpriteActive()) + gBattleStruct->dynamax.triggerSpriteId = 0xFF; + if (CanDynamax(battler)) + CreateDynamaxTriggerSprite(battler, 0); if (!IsZMoveTriggerSpriteActive()) gBattleStruct->zmove.triggerSpriteId = 0xFF; diff --git a/src/battle_debug.c b/src/battle_debug.c index 648efe5f38c7..cf7c9c423578 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -153,6 +153,7 @@ enum LIST_SIDE_STEALTH_ROCK, LIST_SIDE_TOXIC_SPIKES, LIST_SIDE_STICKY_WEB, + LIST_SIDE_STEELSURGE, }; enum @@ -228,6 +229,7 @@ static const u8 sText_PP[] = _("PP"); static const u8 sText_StealthRock[] = _("Stealth Rock"); static const u8 sText_ToxicSpikes[] = _("Toxic Spikes"); static const u8 sText_StickyWeb[] = _("Sticky Web"); +static const u8 sText_Steelsurge[] = _("Steelsurge"); static const u8 sText_AI[] = _("AI"); static const u8 sText_NoBadMoves[] = _("No Bad Moves"); static const u8 sText_Viability[] = _("Viability"); @@ -455,6 +457,7 @@ static const struct ListMenuItem sSideStatusListItems[] = {sText_StealthRock, LIST_SIDE_STEALTH_ROCK}, {sText_ToxicSpikes, LIST_SIDE_TOXIC_SPIKES}, {sText_StickyWeb, LIST_SIDE_STICKY_WEB}, + {sText_Steelsurge, LIST_SIDE_STEELSURGE}, }; static const struct ListMenuItem sSecondaryListItems[] = @@ -1736,6 +1739,15 @@ static u8 *GetSideStatusValue(struct BattleDebugMenu *data, bool32 changeStatus, *(u32 *)(data->modifyArrows.modifiedValPtr) &= ~SIDE_STATUS_STICKY_WEB; } return &sideTimer->stickyWebAmount; + case LIST_SIDE_STEELSURGE: + if (changeStatus) + { + if (statusTrue) + *(u32 *)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_STEELSURGE; + else + *(u32 *)(data->modifyArrows.modifiedValPtr) &= ~SIDE_STATUS_STEELSURGE; + } + return &sideTimer->steelsurgeAmount; default: return NULL; } diff --git a/src/battle_dynamax.c b/src/battle_dynamax.c new file mode 100644 index 000000000000..942605b2c2e7 --- /dev/null +++ b/src/battle_dynamax.c @@ -0,0 +1,1438 @@ +#include "global.h" +#include "battle.h" +#include "battle_anim.h" +#include "battle_controllers.h" +#include "battle_interface.h" +#include "battle_scripts.h" +#include "battle_script_commands.h" +#include "data.h" +#include "event_data.h" +#include "graphics.h" +#include "item.h" +#include "pokemon.h" +#include "random.h" +#include "sprite.h" +#include "string_util.h" +#include "util.h" +#include "constants/abilities.h" +#include "constants/battle_move_effects.h" +#include "constants/battle_string_ids.h" +#include "constants/flags.h" +#include "constants/hold_effects.h" +#include "constants/items.h" +#include "constants/moves.h" + +static u8 GetMaxPowerTier(u16 move); + +// Constant Data +static const u16 sMaxMoveTable[NUMBER_OF_MON_TYPES] = +{ + [TYPE_NORMAL] = MOVE_MAX_STRIKE, + [TYPE_FIGHTING] = MOVE_MAX_KNUCKLE, + [TYPE_FLYING] = MOVE_MAX_AIRSTREAM, + [TYPE_POISON] = MOVE_MAX_OOZE, + [TYPE_GROUND] = MOVE_MAX_QUAKE, + [TYPE_ROCK] = MOVE_MAX_ROCKFALL, + [TYPE_BUG] = MOVE_MAX_FLUTTERBY, + [TYPE_GHOST] = MOVE_MAX_PHANTASM, + [TYPE_STEEL] = MOVE_MAX_STEELSPIKE, + [TYPE_FIRE] = MOVE_MAX_FLARE, + [TYPE_WATER] = MOVE_MAX_GEYSER, + [TYPE_GRASS] = MOVE_MAX_OVERGROWTH, + [TYPE_ELECTRIC] = MOVE_MAX_LIGHTNING, + [TYPE_PSYCHIC] = MOVE_MAX_MINDSTORM, + [TYPE_ICE] = MOVE_MAX_HAILSTORM, + [TYPE_DRAGON] = MOVE_MAX_WYRMWIND, + [TYPE_DARK] = MOVE_MAX_DARKNESS, + [TYPE_FAIRY] = MOVE_MAX_STARFALL, +}; + +struct GMaxMove +{ + u16 species; + u8 moveType; + u16 gmaxMove; +}; + +static const struct GMaxMove sGMaxMoveTable[] = +{ + {SPECIES_VENUSAUR_GIGANTAMAX, TYPE_GRASS, MOVE_G_MAX_VINE_LASH}, + {SPECIES_BLASTOISE_GIGANTAMAX, TYPE_WATER, MOVE_G_MAX_CANNONADE}, + {SPECIES_CHARIZARD_GIGANTAMAX, TYPE_FIRE, MOVE_G_MAX_WILDFIRE}, + {SPECIES_BUTTERFREE_GIGANTAMAX, TYPE_BUG, MOVE_G_MAX_BEFUDDLE}, + {SPECIES_PIKACHU_GIGANTAMAX, TYPE_ELECTRIC, MOVE_G_MAX_VOLT_CRASH}, + {SPECIES_MEOWTH_GIGANTAMAX, TYPE_NORMAL, MOVE_G_MAX_GOLD_RUSH}, + {SPECIES_MACHAMP_GIGANTAMAX, TYPE_FIGHTING, MOVE_G_MAX_CHI_STRIKE}, + {SPECIES_GENGAR_GIGANTAMAX, TYPE_GHOST, MOVE_G_MAX_TERROR}, + {SPECIES_KINGLER_GIGANTAMAX, TYPE_WATER, MOVE_G_MAX_FOAM_BURST}, + {SPECIES_LAPRAS_GIGANTAMAX, TYPE_ICE, MOVE_G_MAX_RESONANCE}, + {SPECIES_EEVEE_GIGANTAMAX, TYPE_NORMAL, MOVE_G_MAX_CUDDLE}, + {SPECIES_SNORLAX_GIGANTAMAX, TYPE_NORMAL, MOVE_G_MAX_REPLENISH}, + {SPECIES_GARBODOR_GIGANTAMAX, TYPE_POISON, MOVE_G_MAX_MALODOR}, + {SPECIES_MELMETAL_GIGANTAMAX, TYPE_STEEL, MOVE_G_MAX_MELTDOWN}, + {SPECIES_RILLABOOM_GIGANTAMAX, TYPE_GRASS, MOVE_G_MAX_DRUM_SOLO}, + {SPECIES_CINDERACE_GIGANTAMAX, TYPE_FIRE, MOVE_G_MAX_FIREBALL}, + {SPECIES_INTELEON_GIGANTAMAX, TYPE_WATER, MOVE_G_MAX_HYDROSNIPE}, + {SPECIES_CORVIKNIGHT_GIGANTAMAX, TYPE_FLYING, MOVE_G_MAX_WIND_RAGE}, + {SPECIES_ORBEETLE_GIGANTAMAX, TYPE_PSYCHIC, MOVE_G_MAX_GRAVITAS}, + {SPECIES_DREDNAW_GIGANTAMAX, TYPE_WATER, MOVE_G_MAX_STONESURGE}, + {SPECIES_COALOSSAL_GIGANTAMAX, TYPE_ROCK, MOVE_G_MAX_VOLCALITH}, + {SPECIES_FLAPPLE_GIGANTAMAX, TYPE_GRASS, MOVE_G_MAX_TARTNESS}, + {SPECIES_APPLETUN_GIGANTAMAX, TYPE_GRASS, MOVE_G_MAX_SWEETNESS}, + {SPECIES_SANDACONDA_GIGANTAMAX, TYPE_GROUND, MOVE_G_MAX_SANDBLAST}, + {SPECIES_TOXTRICITY_GIGANTAMAX, TYPE_ELECTRIC, MOVE_G_MAX_STUN_SHOCK}, + {SPECIES_CENTISKORCH_GIGANTAMAX, TYPE_FIRE, MOVE_G_MAX_CENTIFERNO}, + {SPECIES_HATTERENE_GIGANTAMAX, TYPE_FAIRY, MOVE_G_MAX_SMITE}, + {SPECIES_GRIMMSNARL_GIGANTAMAX, TYPE_DARK, MOVE_G_MAX_SNOOZE}, + {SPECIES_ALCREMIE_GIGANTAMAX, TYPE_FAIRY, MOVE_G_MAX_FINALE}, + {SPECIES_COPPERAJAH_GIGANTAMAX, TYPE_STEEL, MOVE_G_MAX_STEELSURGE}, + {SPECIES_DURALUDON_GIGANTAMAX, TYPE_DRAGON, MOVE_G_MAX_DEPLETION}, + {SPECIES_URSHIFU_GIGANTAMAX, TYPE_DARK, MOVE_G_MAX_ONE_BLOW}, + {SPECIES_URSHIFU_RAPID_STRIKE_STYLE_GIGANTAMAX, TYPE_WATER, MOVE_G_MAX_RAPID_FLOW}, +}; + +// forward declarations +static void SpriteCb_DynamaxTrigger(struct Sprite *); +static void SpriteCb_DynamaxIndicator(struct Sprite *); + +// Returns whether a battler is Dynamaxed. +bool32 IsDynamaxed(u16 battlerId) +{ + if (gBattleStruct->dynamax.dynamaxed[battlerId] + /*|| IsRaidBoss(battlerId)*/) + return TRUE; + return FALSE; +} + +// Returns whether a battler can Dynamax. +bool32 CanDynamax(u16 battlerId) +{ + u16 species = gBattleMons[battlerId].species; + u16 holdEffect = ItemId_GetHoldEffect(gBattleMons[battlerId].item); + + // Check if Dynamax battle flag is set. This needs to be defined in include/config/battle.h + #if B_FLAG_DYNAMAX_BATTLE != 0 + if (!FlagGet(B_FLAG_DYNAMAX_BATTLE)) + #endif + return FALSE; + + + // Check if Player has a Dynamax Band. + if ((GetBattlerPosition(battlerId) == B_POSITION_PLAYER_LEFT || (!(gBattleTypeFlags & BATTLE_TYPE_MULTI) && GetBattlerPosition(battlerId) == B_POSITION_PLAYER_RIGHT)) + && !CheckBagHasItem(ITEM_DYNAMAX_BAND, 1)) + return FALSE; + + // Check if species isn't allowed to Dynamax. + if (GET_BASE_SPECIES_ID(species) == SPECIES_ZACIAN + || GET_BASE_SPECIES_ID(species) == SPECIES_ZAMAZENTA + || GET_BASE_SPECIES_ID(species) == SPECIES_ETERNATUS) + return FALSE; + + // Cannot Dynamax if you can Mega Evolve or use a Z-Move + if (holdEffect == HOLD_EFFECT_MEGA_STONE || holdEffect == HOLD_EFFECT_Z_CRYSTAL) + return FALSE; + + // Cannot Dynamax if your side has already or will Dynamax. + if (gBattleStruct->dynamax.alreadyDynamaxed[GetBattlerSide(battlerId)] + || gBattleStruct->dynamax.dynamaxed[BATTLE_PARTNER(battlerId)] + || gBattleStruct->dynamax.toDynamax & gBitTable[BATTLE_PARTNER(battlerId)]) + return FALSE; + + // TODO: Cannot Dynamax in a Max Raid if you don't have Dynamax Energy. + // if (gBattleTypeFlags & BATTLE_TYPE_RAID && gBattleStruct->raid.dynamaxEnergy != battlerId) + // return FALSE; + + // No checks failed, all set! + return TRUE; +} + +// Returns whether a battler is transformed into a Gigantamax form. +bool32 IsGigantamaxed(u16 battlerId) +{ + // TODO: Incorporate Gigantamax factor. + if ((gSpeciesInfo[gBattleMons[battlerId].species].gigantamax)) + return TRUE; + return FALSE; +} + +// Applies the HP Multiplier for Dynamaxed Pokemon and Raid Bosses. +void ApplyDynamaxHPMultiplier(u32 battler, struct Pokemon* mon) +{ + if (GetMonData(mon, MON_DATA_SPECIES) == SPECIES_SHEDINJA) + return; + else + { + u16 mult = UQ_4_12(1.5); // placeholder + u16 hp = UQ_4_12_TO_INT((GetMonData(mon, MON_DATA_HP) * mult) + UQ_4_12_ROUND); + u16 maxHP = UQ_4_12_TO_INT((GetMonData(mon, MON_DATA_MAX_HP) * mult) + UQ_4_12_ROUND); + SetMonData(mon, MON_DATA_HP, &hp); + SetMonData(mon, MON_DATA_MAX_HP, &maxHP); + } +} + +// Returns the non-Dynamax HP of a Pokemon. +u16 GetNonDynamaxHP(u16 battlerId) +{ + if (!IsDynamaxed(battlerId) || gBattleMons[battlerId].species == SPECIES_SHEDINJA) + return gBattleMons[battlerId].hp; + else + { + u16 mult = UQ_4_12(1.0/1.5); // placeholder + u16 hp = UQ_4_12_TO_INT((gBattleMons[battlerId].hp * mult) + UQ_4_12_ROUND); + return hp; + } +} + +// Returns the non-Dynamax Max HP of a Pokemon. +u16 GetNonDynamaxMaxHP(u32 battlerId) +{ + if (!IsDynamaxed(battlerId) || gBattleMons[battlerId].species == SPECIES_SHEDINJA) + return gBattleMons[battlerId].maxHP; + else + { + u16 mult = UQ_4_12(1.0/1.5); // placeholder + u16 maxHP = UQ_4_12_TO_INT((gBattleMons[battlerId].maxHP * mult) + UQ_4_12_ROUND); + return maxHP; + } +} + +// Sets flags used for Dynamaxing and checks Gigantamax forms. +void PrepareBattlerForDynamax(u16 battlerId) +{ + u8 side = GetBattlerSide(battlerId); + + gBattleStruct->dynamax.alreadyDynamaxed[side] = TRUE; + gBattleStruct->dynamax.dynamaxed[battlerId] = TRUE; + gBattleStruct->dynamax.dynamaxTurns[battlerId] = DYNAMAX_TURNS_COUNT; + + // Substitute is removed upon Dynamaxing. + gBattleMons[battlerId].status2 &= ~STATUS2_SUBSTITUTE; + ClearBehindSubstituteBit(battlerId); + + // Choiced Moves are reset upon Dynamaxing. + gBattleStruct->choicedMove[battlerId] = MOVE_NONE; + + // Try Gigantamax form change. + if (!(gBattleMons[battlerId].status2 & STATUS2_TRANSFORMED)) // Ditto cannot Gigantamax. + TryBattleFormChange(battlerId, FORM_CHANGE_BATTLE_GIGANTAMAX); +} + +// Unsets the flags used for Dynamaxing and reverts max HP if needed. +void UndoDynamax(u16 battlerId) +{ + u8 side = GetBattlerSide(battlerId); + u8 monId = gBattlerPartyIndexes[battlerId]; + + // Revert HP if battler is still Dynamaxed. + if (IsDynamaxed(battlerId)) + { + struct Pokemon *mon = (side == B_SIDE_PLAYER) ? &gPlayerParty[monId] : &gEnemyParty[monId]; + u16 mult = UQ_4_12(1.0/1.5); // placeholder + gBattleMons[battlerId].hp = UQ_4_12_TO_INT((GetMonData(mon, MON_DATA_HP) * mult + 1) + UQ_4_12_ROUND); // round up + SetMonData(mon, MON_DATA_HP, &gBattleMons[battlerId].hp); + } + + // Makes sure there are no Dynamax flags set, including on switch / faint. + gBattleStruct->dynamax.dynamaxed[battlerId] = FALSE; + gBattleStruct->dynamax.dynamaxTurns[battlerId] = 0; + + // Undo form change if needed. + if (IsGigantamaxed(battlerId)) + TryBattleFormChange(battlerId, FORM_CHANGE_END_BATTLE); +} + +// Certain moves are blocked by Max Guard that normally ignore protection. +bool32 IsMoveBlockedByMaxGuard(u16 move) +{ + switch (move) + { + case MOVE_BLOCK: + case MOVE_FLOWER_SHIELD: + case MOVE_GEAR_UP: + case MOVE_MAGNETIC_FLUX: + case MOVE_PHANTOM_FORCE: + case MOVE_PSYCH_UP: + case MOVE_SHADOW_FORCE: + case MOVE_TEATIME: + case MOVE_TRANSFORM: + return TRUE; + } + return FALSE; +} + +// Weight-based moves (and some other moves in Raids) are blocked by Dynamax. +bool32 IsMoveBlockedByDynamax(u16 move) +{ + // TODO: Certain moves are banned in raids. + switch (gBattleMoves[move].effect) + { + case EFFECT_HEAT_CRASH: + case EFFECT_LOW_KICK: + return TRUE; + } + return FALSE; +} + +// Returns whether a move should be converted into a Max Move. +bool32 ShouldUseMaxMove(u16 battlerId, u16 baseMove) +{ + // TODO: Raid bosses do not always use Max Moves. + // if (IsRaidBoss(battlerId)) + // return !IsRaidBossUsingRegularMove(battlerId, baseMove); + return IsDynamaxed(battlerId) || gBattleStruct->dynamax.toDynamax & gBitTable[battlerId]; +} + +static u16 GetTypeBasedMaxMove(u16 battlerId, u16 type) +{ + // Gigantamax check + u32 i; + u16 species = gBattleMons[battlerId].species; + u16 targetSpecies = SPECIES_NONE; + + if (!gSpeciesInfo[species].gigantamax) + targetSpecies = GetBattleFormChangeTargetSpecies(battlerId, FORM_CHANGE_BATTLE_GIGANTAMAX); + + if (targetSpecies != SPECIES_NONE) + species = targetSpecies; + + if (gSpeciesInfo[species].gigantamax) + { + for (i = 0; i < ARRAY_COUNT(sGMaxMoveTable); i++) + { + if (sGMaxMoveTable[i].species == species && sGMaxMoveTable[i].moveType == type) + return sGMaxMoveTable[i].gmaxMove; + } + } + + // Regular Max Move + if (sMaxMoveTable[type] == MOVE_NONE) // failsafe + return sMaxMoveTable[0]; + return sMaxMoveTable[type]; +} + +// Returns the appropriate Max Move or G-Max Move for a battler to use. +u16 GetMaxMove(u16 battlerId, u16 baseMove) +{ + u16 move = baseMove; + if (baseMove == MOVE_NONE) // for move display + { + return MOVE_NONE; + } + else if (baseMove == MOVE_STRUGGLE) + { + return MOVE_STRUGGLE; + } + else if (gBattleMoves[baseMove].split == SPLIT_STATUS) + { + move = MOVE_MAX_GUARD; + } + else if (gBattleStruct->dynamicMoveType) + { + move = GetTypeBasedMaxMove(battlerId, gBattleStruct->dynamicMoveType & DYNAMIC_TYPE_MASK); + gBattleStruct->dynamax.splits[battlerId] = gBattleMoves[baseMove].split; + } + else + { + move = GetTypeBasedMaxMove(battlerId, gBattleMoves[baseMove].type); + gBattleStruct->dynamax.splits[battlerId] = gBattleMoves[baseMove].split; + } + + return move; +} + +// First value is for Fighting, Poison and Multi-Attack. The second is for everything else. +enum +{ + MAX_POWER_TIER_1, // 70 or 90 damage + MAX_POWER_TIER_2, // 75 or 100 damage + MAX_POWER_TIER_3, // 80 or 110 damage + MAX_POWER_TIER_4, // 85 or 120 damage + MAX_POWER_TIER_5, // 90 or 130 damage + MAX_POWER_TIER_6, // 95 or 140 damage + MAX_POWER_TIER_7, // 100 or 130 damage + MAX_POWER_TIER_8, // 100 or 150 damage +}; + +// Gets the base power of a Max Move. +u8 GetMaxMovePower(u16 move) +{ + u8 tier; + // G-Max Drum Solo, G-Max Hydrosnipe, and G-Max Fireball always have 160 base power. + if (gBattleMoves[GetMaxMove(gBattlerAttacker, move)].argument == MAX_EFFECT_FIXED_POWER) + return 160; + + // Exceptions to all other rules below: + switch (move) + { + case MOVE_TRIPLE_KICK: return 80; + case MOVE_GEAR_GRIND: return 100; + case MOVE_DUAL_WINGBEAT: return 100; + case MOVE_TRIPLE_AXEL: return 140; + } + + tier = GetMaxPowerTier(move); + if (gBattleMoves[move].type == TYPE_FIGHTING + || gBattleMoves[move].type == TYPE_POISON + || move == MOVE_MULTI_ATTACK) + { + switch (tier) + { + default: + case MAX_POWER_TIER_1: return 70; + case MAX_POWER_TIER_2: return 75; + case MAX_POWER_TIER_3: return 80; + case MAX_POWER_TIER_4: return 85; + case MAX_POWER_TIER_5: return 90; + case MAX_POWER_TIER_6: return 95; + case MAX_POWER_TIER_7: return 100; + case MAX_POWER_TIER_8: return 100; + } + } + else + { + switch (tier) + { + default: + case MAX_POWER_TIER_1: return 90; + case MAX_POWER_TIER_2: return 100; + case MAX_POWER_TIER_3: return 110; + case MAX_POWER_TIER_4: return 120; + case MAX_POWER_TIER_5: return 130; + case MAX_POWER_TIER_6: return 140; + case MAX_POWER_TIER_7: return 130; + case MAX_POWER_TIER_8: return 150; + } + } +} + +static u8 GetMaxPowerTier(u16 move) +{ + if (gBattleMoves[move].strikeCount >= 2 && gBattleMoves[move].strikeCount <= 5) + { + switch(gBattleMoves[move].power) + { + case 0 ... 25: return MAX_POWER_TIER_2; + case 26 ... 30: return MAX_POWER_TIER_3; + case 31 ... 35: return MAX_POWER_TIER_4; + case 36 ... 50: return MAX_POWER_TIER_5; + default: + case 51 ... 60: return MAX_POWER_TIER_6; + } + } + + switch (gBattleMoves[move].effect) + { + case EFFECT_BIDE: + case EFFECT_SUPER_FANG: + case EFFECT_LEVEL_DAMAGE: + case EFFECT_PSYWAVE: + case EFFECT_COUNTER: + case EFFECT_PRESENT: + case EFFECT_BEAT_UP: + case EFFECT_WEATHER_BALL: + case EFFECT_FLING: + case EFFECT_ELECTRO_BALL: + case EFFECT_METAL_BURST: + case EFFECT_TERRAIN_PULSE: + case EFFECT_PUNISHMENT: + case EFFECT_TRUMP_CARD: + case EFFECT_SONICBOOM: + case EFFECT_SPIT_UP: + case EFFECT_NATURAL_GIFT: + case EFFECT_MIRROR_COAT: + case EFFECT_DRAGON_RAGE: + case EFFECT_FINAL_GAMBIT: + //case EFFECT_DRAGON_DARTS: + return MAX_POWER_TIER_2; + case EFFECT_OHKO: + case EFFECT_RETURN: + case EFFECT_FRUSTRATION: + case EFFECT_HEAT_CRASH: + case EFFECT_STORED_POWER: + case EFFECT_GYRO_BALL: + return MAX_POWER_TIER_5; + case EFFECT_MAGNITUDE: + case EFFECT_WRING_OUT: + return MAX_POWER_TIER_6; + case EFFECT_FLAIL: + case EFFECT_LOW_KICK: + return MAX_POWER_TIER_7; + case EFFECT_MULTI_HIT: + switch(gBattleMoves[move].power) + { + case 0 ... 15: return MAX_POWER_TIER_1; + case 16 ... 18: return MAX_POWER_TIER_2; + case 19 ... 20: return MAX_POWER_TIER_4; + default: + case 21 ... 25: return MAX_POWER_TIER_5; + } + } + + switch (gBattleMoves[move].power) + { + case 0 ... 40: return MAX_POWER_TIER_1; + case 45 ... 50: return MAX_POWER_TIER_2; + case 55 ... 60: return MAX_POWER_TIER_3; + case 65 ... 70: return MAX_POWER_TIER_4; + case 75 ... 100: return MAX_POWER_TIER_5; + case 110 ... 140: return MAX_POWER_TIER_6; + default: + case 150 ... 250: return MAX_POWER_TIER_8; + } +} + +// Returns whether a move is a Max Move or not. +bool32 IsMaxMove(u16 move) +{ + return move >= FIRST_MAX_MOVE && move <= LAST_MAX_MOVE; +} + +// Returns the full name of a Max Move for the move usage text. +const u8 *GetMaxMoveName(u16 move) +{ + if (IsMaxMove(move)) + return gMaxMoveNames[move - FIRST_MAX_MOVE]; + else + return gMaxMoveNames[0]; // Failsafe +} + +// Assigns the multistring to use for the "Damage Non- Types" G-Max effect. +void ChooseDamageNonTypesString(u8 type) +{ + switch (type) + { + case TYPE_GRASS: + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TRAPPED_WITH_VINES; + break; + case TYPE_WATER: + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CAUGHT_IN_VORTEX; + break; + case TYPE_FIRE: + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SURROUNDED_BY_FIRE; + break; + case TYPE_ROCK: + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SURROUNDED_BY_ROCKS; + break; + } +} + +// Returns the status effect that should be applied by a G-Max Move. +static u32 GetMaxMoveStatusEffect(u16 move) +{ + u8 maxEffect = gBattleMoves[move].argument; + switch (maxEffect) + { + // Status 1 + case MAX_EFFECT_PARALYZE_FOES: + return STATUS1_PARALYSIS; + case MAX_EFFECT_POISON_FOES: + return STATUS1_POISON; + case MAX_EFFECT_POISON_PARALYZE_FOES: + { + static const u8 sStunShockEffects[] = {STATUS1_PARALYSIS, STATUS1_POISON}; + return RandomElement(RNG_G_MAX_STUN_SHOCK, sStunShockEffects); + } + case MAX_EFFECT_EFFECT_SPORE_FOES: + { + static const u8 sBefuddleEffects[] = {STATUS1_PARALYSIS, STATUS1_POISON, STATUS1_SLEEP}; + return RandomElement(RNG_G_MAX_BEFUDDLE, sBefuddleEffects); + } + // Status 2 + case MAX_EFFECT_CONFUSE_FOES: + case MAX_EFFECT_CONFUSE_FOES_PAY_DAY: + return STATUS2_CONFUSION; + case MAX_EFFECT_INFATUATE_FOES: + return STATUS2_INFATUATION; + case MAX_EFFECT_MEAN_LOOK: + return STATUS2_ESCAPE_PREVENTION; + case MAX_EFFECT_TORMENT_FOES: + return STATUS2_TORMENT; + default: + return STATUS1_NONE; + } +} + +// CALLNATIVE FUNCTIONS +#define CMD_ARGS(...) const struct __attribute__((packed)) { u8 opcode; MEMBERS(__VA_ARGS__) const u8 nextInstr[0]; } *const cmd = (const void *)gBattlescriptCurrInstr +#define NATIVE_ARGS(...) CMD_ARGS(void (*func)(void), ##__VA_ARGS__) + +#define MEMBERS(...) VARARG_8(MEMBERS_, __VA_ARGS__) +#define MEMBERS_0() +#define MEMBERS_1(a) a; +#define MEMBERS_2(a, b) a; b; +#define MEMBERS_3(a, b, c) a; b; c; +#define MEMBERS_4(a, b, c, d) a; b; c; d; +#define MEMBERS_5(a, b, c, d, e) a; b; c; d; e; +#define MEMBERS_6(a, b, c, d, e, f) a; b; c; d; e; f; +#define MEMBERS_7(a, b, c, d, e, f, g) a; b; c; d; e; f; g; +#define MEMBERS_8(a, b, c, d, e, f, g, h) a; b; c; d; e; f; g; h; + +// Updates Dynamax HP multipliers and healthboxes. +void BS_UpdateDynamax(void) +{ + NATIVE_ARGS(); + u16 battler = gBattleScripting.battler; + struct Pokemon *mon = &GetSideParty(GetBattlerSide(battler))[gBattlerPartyIndexes[battler]]; + + if (!IsGigantamaxed(battler)) // RecalcBattlerStats will get called on form change. + RecalcBattlerStats(battler, mon); + + UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], mon, HEALTHBOX_ALL); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +// Activates the secondary effect of a Max Move. +void BS_SetMaxMoveEffect(void) +{ + NATIVE_ARGS(); + u16 effect = 0; + u8 maxEffect = gBattleMoves[gCurrentMove].argument; + + // Don't continue if the move didn't land. + if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + { + gBattlescriptCurrInstr = cmd->nextInstr; + return; + } + + switch (maxEffect) + { + case MAX_EFFECT_RAISE_TEAM_ATTACK: + case MAX_EFFECT_RAISE_TEAM_DEFENSE: + case MAX_EFFECT_RAISE_TEAM_SPEED: + case MAX_EFFECT_RAISE_TEAM_SP_ATK: + case MAX_EFFECT_RAISE_TEAM_SP_DEF: + if (!NoAliveMonsForEitherParty()) + { + // Max Effects are ordered by stat ID. + SET_STATCHANGER(gBattleMoves[gCurrentMove].argument, 1, FALSE); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; + effect++; + } + break; + case MAX_EFFECT_LOWER_ATTACK: + case MAX_EFFECT_LOWER_DEFENSE: + case MAX_EFFECT_LOWER_SPEED: + case MAX_EFFECT_LOWER_SP_ATK: + case MAX_EFFECT_LOWER_SP_DEF: + case MAX_EFFECT_LOWER_SPEED_2_FOES: + case MAX_EFFECT_LOWER_EVASIVENESS_FOES: + if (!NoAliveMonsForEitherParty()) + { + u8 statId = 0; + u8 stage = 1; + switch (maxEffect) + { + case MAX_EFFECT_LOWER_SPEED_2_FOES: + statId = STAT_SPEED; + stage = 2; + break; + case MAX_EFFECT_LOWER_EVASIVENESS_FOES: + statId = STAT_EVASION; + break; + default: + // Max Effects are ordered by stat ID. + statId = gBattleMoves[gCurrentMove].argument - MAX_EFFECT_LOWER_ATTACK + 1; + break; + } + SET_STATCHANGER(statId, stage, TRUE); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectLowerStatFoes; + effect++; + } + break; + case MAX_EFFECT_SUN: + case MAX_EFFECT_RAIN: + case MAX_EFFECT_SANDSTORM: + case MAX_EFFECT_HAIL: + { + u8 weather, msg; + switch (maxEffect) + { + case MAX_EFFECT_SUN: + weather = ENUM_WEATHER_SUN; + msg = B_MSG_STARTED_SUNLIGHT; + break; + case MAX_EFFECT_RAIN: + weather = ENUM_WEATHER_RAIN; + msg = B_MSG_STARTED_RAIN; + break; + case MAX_EFFECT_SANDSTORM: + weather = ENUM_WEATHER_SANDSTORM; + msg = B_MSG_STARTED_SANDSTORM; + break; + case MAX_EFFECT_HAIL: + weather = ENUM_WEATHER_HAIL; + msg = B_MSG_STARTED_HAIL; + break; + } + if (TryChangeBattleWeather(gBattlerAttacker, weather, FALSE)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = msg; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectSetWeather; + effect++; + } + break; + } + case MAX_EFFECT_MISTY_TERRAIN: + case MAX_EFFECT_GRASSY_TERRAIN: + case MAX_EFFECT_ELECTRIC_TERRAIN: + case MAX_EFFECT_PSYCHIC_TERRAIN: + { + u32 statusFlag = 0; + switch (gBattleMoves[gCurrentMove].argument) + { + case MAX_EFFECT_MISTY_TERRAIN: + statusFlag = STATUS_FIELD_MISTY_TERRAIN; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_MISTY; + break; + case MAX_EFFECT_GRASSY_TERRAIN: + statusFlag = STATUS_FIELD_GRASSY_TERRAIN; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_GRASSY; + break; + case MAX_EFFECT_ELECTRIC_TERRAIN: + statusFlag = STATUS_FIELD_ELECTRIC_TERRAIN; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_ELECTRIC; + break; + case MAX_EFFECT_PSYCHIC_TERRAIN: + statusFlag = STATUS_FIELD_PSYCHIC_TERRAIN; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_PSYCHIC; + break; + } + if (!(gFieldStatuses & statusFlag) && statusFlag != 0) + { + gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY; + gFieldStatuses |= statusFlag; + if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_TERRAIN_EXTENDER) + gFieldTimers.terrainTimer = 8; + else + gFieldTimers.terrainTimer = 5; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectSetTerrain; + effect++; + } + break; + } + case MAX_EFFECT_VINE_LASH: + case MAX_EFFECT_CANNONADE: + case MAX_EFFECT_WILDFIRE: + case MAX_EFFECT_VOLCALITH: + { + u8 side = GetBattlerSide(gBattlerTarget); + if (!(gSideStatuses[side] & SIDE_STATUS_DAMAGE_NON_TYPES)) + { + gSideStatuses[side] |= SIDE_STATUS_DAMAGE_NON_TYPES; + gSideTimers[side].damageNonTypesTimer = 5; // damage is dealt for 4 turns, ends on 5th + gSideTimers[side].damageNonTypesType = gBattleMoves[gCurrentMove].type; + BattleScriptPush(gBattlescriptCurrInstr + 1); + ChooseDamageNonTypesString(gBattleMoves[gCurrentMove].type); + gBattlescriptCurrInstr = BattleScript_DamageNonTypesStarts; + effect++; + } + break; + } + case MAX_EFFECT_STEALTH_ROCK: + if (!(gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_STEALTH_ROCK)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_POINTEDSTONESFLOAT; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectStonesurge; + effect++; + } + break; + case MAX_EFFECT_STEELSURGE: + if (!(gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_STEELSURGE)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SHARPSTEELFLOATS; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectSteelsurge; + effect++; + } + break; + case MAX_EFFECT_DEFOG: + if (gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_SCREEN_ANY + || gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_HAZARDS_ANY + || gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_HAZARDS_ANY + || gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_DefogTryHazards; + effect++; + } + break; + case MAX_EFFECT_AURORA_VEIL: + if (!(gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_AURORA_VEIL)) + { + gSideStatuses[GetBattlerSide(gBattlerAttacker)] |= SIDE_STATUS_AURORA_VEIL; + if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LIGHT_CLAY) + gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = 8; + else + gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = 5; + gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilBattlerId = gBattlerAttacker; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_SAFEGUARD; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectAuroraVeilSuccess; + effect++; + } + break; + case MAX_EFFECT_GRAVITY: + if (!(gFieldStatuses & STATUS_FIELD_GRAVITY)) + { + gFieldStatuses |= STATUS_FIELD_GRAVITY; + gFieldTimers.gravityTimer = 5; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectGravitySuccess; + effect++; + } + break; + case MAX_EFFECT_SANDBLAST_FOES: + case MAX_EFFECT_FIRE_SPIN_FOES: + { + // Affects both opponents, but doesn't print strings so we can handle it here. + u8 battler; + for (battler = 0; battler < MAX_BATTLERS_COUNT; ++battler) + { + if (GetBattlerSide(battler) != GetBattlerSide(gBattlerTarget)) + continue; + if (!(gBattleMons[battler].status2 & STATUS2_WRAPPED)) + { + gBattleMons[battler].status2 |= STATUS2_WRAPPED; + if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_GRIP_CLAW) + #if B_BINDING_TURNS >= GEN_5 + gDisableStructs[battler].wrapTurns = 7; + else + gDisableStructs[battler].wrapTurns = (Random() % 2) + 4; + #else + gDisableStructs[battler].wrapTurns = 5; + else + gDisableStructs[battler].wrapTurns = (Random() % 4) + 2; + #endif + // The Wrap effect does not expire when the user switches, so here's some cheese. + gBattleStruct->wrappedBy[battler] = gBattlerTarget; + if (maxEffect == MAX_EFFECT_SANDBLAST_FOES) + gBattleStruct->wrappedMove[battler] = MOVE_SAND_TOMB; + else + gBattleStruct->wrappedMove[battler] = MOVE_FIRE_SPIN; + } + } + break; + } + case MAX_EFFECT_YAWN_FOE: + { + static const u8 sSnoozeEffects[] = {TRUE, FALSE}; + if (!(gStatuses3[gBattlerTarget] & STATUS3_YAWN) + && CanSleep(gBattlerTarget) + && RandomElement(RNG_G_MAX_SNOOZE, sSnoozeEffects)) // 50% chance of success + { + gStatuses3[gBattlerTarget] |= STATUS3_YAWN_TURN(2); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectYawnSuccess; + effect++; + } + break; + } + case MAX_EFFECT_SPITE: + if (gLastMoves[gBattlerTarget] != MOVE_NONE + && gLastMoves[gBattlerTarget] != MOVE_UNAVAILABLE) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectTryReducePP; + effect++; + } + break; + case MAX_EFFECT_PARALYZE_FOES: + case MAX_EFFECT_POISON_FOES: + case MAX_EFFECT_POISON_PARALYZE_FOES: + case MAX_EFFECT_EFFECT_SPORE_FOES: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectStatus1Foes; + effect++; + break; + case MAX_EFFECT_CONFUSE_FOES_PAY_DAY: + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + { + u16 payday = gPaydayMoney; + gPaydayMoney += (gBattleMons[gBattlerAttacker].level * 100); + if (payday > gPaydayMoney) + gPaydayMoney = 0xFFFF; + gBattleCommunication[CURSOR_POSITION] = 1; // add "Coins scattered." message + } + // fall through + case MAX_EFFECT_CONFUSE_FOES: + case MAX_EFFECT_INFATUATE_FOES: + case MAX_EFFECT_TORMENT_FOES: + case MAX_EFFECT_MEAN_LOOK: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectStatus2Foes; + effect++; + break; + case MAX_EFFECT_CRIT_PLUS: + gBattleStruct->bonusCritStages[gBattlerAttacker]++; + gBattleStruct->bonusCritStages[BATTLE_PARTNER(gBattlerAttacker)]++; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectRaiseCritAlliesAnim; + effect++; + break; + case MAX_EFFECT_HEAL_TEAM: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectHealOneSixthAllies; + effect++; + break; + case MAX_EFFECT_AROMATHERAPY: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectCureStatusAllies; + effect++; + break; + case MAX_EFFECT_RECYCLE_BERRIES: + { + static const u8 sReplenishEffects[] = {TRUE, FALSE}; + if (RandomElement(RNG_G_MAX_REPLENISH, sReplenishEffects)) // 50% chance of success + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectRecycleBerriesAllies; + effect++; + } + break; + } + } + + if (!effect) + gBattlescriptCurrInstr = cmd->nextInstr; +} + +// Sets up sharp steel on the target's side. +void BS_SetSteelsurge(void) +{ + NATIVE_ARGS(const u8 *failInstr); + u8 targetSide = GetBattlerSide(gBattlerTarget); + if (gSideStatuses[targetSide] & SIDE_STATUS_STEELSURGE) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else + { + gSideStatuses[targetSide] |= SIDE_STATUS_STEELSURGE; + gSideTimers[targetSide].steelsurgeAmount = 1; + gBattlescriptCurrInstr = cmd->nextInstr; + } +} + +// Applies the status1 effect associated with a given G-Max Move. +// Could be expanded to function for any move. +void BS_TrySetStatus1(void) +{ + NATIVE_ARGS(const u8 *failInstr); + u8 effect = 0; + u32 status1 = GetMaxMoveStatusEffect(gCurrentMove); + switch (status1) + { + case STATUS1_POISON: + if (CanBePoisoned(gBattlerAttacker, gBattlerTarget)) + { + gBattleMons[gBattlerTarget].status1 |= STATUS1_POISON; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + effect++; + } + break; + case STATUS1_PARALYSIS: + if (CanBeParalyzed(gBattlerTarget)) + { + gBattleMons[gBattlerTarget].status1 |= STATUS1_PARALYSIS; + gBattleCommunication[MULTISTRING_CHOOSER] = 3; + effect++; + } + break; + case STATUS1_SLEEP: + if (CanSleep(gBattlerTarget)) + { + #if B_SLEEP_TURNS >= GEN_5 + gBattleMons[gBattlerTarget].status1 |= STATUS1_SLEEP_TURN((Random() % 3) + 2); + #else + gBattleMons[gBattlerTarget].status1 |= STATUS1_SLEEP_TURN((Random() % 4) + 3); + #endif + gBattleCommunication[MULTISTRING_CHOOSER] = 4; + effect++; + } + break; + } + if (effect) + { + gEffectBattler = gBattlerTarget; + BtlController_EmitSetMonData(gBattlerTarget, BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); + MarkBattlerForControllerExec(gBattlerTarget); + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattlescriptCurrInstr = cmd->failInstr; + } +} + +// Applies the status2 effect associated with a given G-Max Move. +void BS_TrySetStatus2(void) +{ + NATIVE_ARGS(const u8 *failInstr); + u8 effect = 0; + u32 status2 = GetMaxMoveStatusEffect(gCurrentMove); + switch (status2) + { + case STATUS2_CONFUSION: + if (CanBeConfused(gBattlerTarget)) + { + gBattleMons[gBattlerTarget].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTIUSE_STATE] = 1; + effect++; + } + break; + case STATUS2_INFATUATION: + { + u8 atkGender = GetGenderFromSpeciesAndPersonality(gBattleMons[gBattlerAttacker].species, gBattleMons[gBattlerAttacker].personality); + u8 defGender = GetGenderFromSpeciesAndPersonality(gBattleMons[gBattlerTarget].species, gBattleMons[gBattlerTarget].personality); + if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_INFATUATION) + && gBattleMons[gBattlerTarget].ability != ABILITY_OBLIVIOUS + && !IsAbilityOnSide(gBattlerTarget, ABILITY_AROMA_VEIL) + && atkGender != defGender + && atkGender != MON_GENDERLESS + && defGender != MON_GENDERLESS) + { + gBattleMons[gBattlerTarget].status2 |= STATUS2_INFATUATED_WITH(gBattlerAttacker); + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTIUSE_STATE] = 2; + effect++; + } + break; + } + case STATUS2_ESCAPE_PREVENTION: + if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_ESCAPE_PREVENTION)) + { + gBattleMons[gBattlerTarget].status2 |= STATUS2_ESCAPE_PREVENTION; + gDisableStructs[gBattlerTarget].battlerPreventingEscape = gBattlerAttacker; + gBattleCommunication[MULTISTRING_CHOOSER] = 2; + effect++; + } + break; + case STATUS2_TORMENT: + if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_TORMENT) + && !IsAbilityOnSide(gBattlerTarget, ABILITY_AROMA_VEIL)) + { + gBattleMons[gBattlerTarget].status2 |= STATUS2_TORMENT; + gDisableStructs[gBattlerTarget].tormentTimer = 3; // 3 turns excluding current turn + gBattleCommunication[MULTISTRING_CHOOSER] = 3; + effect++; + } + break; + } + if (effect) + { + gEffectBattler = gBattlerTarget; + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattlescriptCurrInstr = cmd->failInstr; + } +} + +// Applies the endturn damage effect associated with the "Damage Non-" G-Max moves. +void BS_DamageNonTypes(void) +{ + NATIVE_ARGS(); + u8 side = GetBattlerSide(gBattlerAttacker); + gBattleMoveDamage = 0; + if (gSideTimers[side].damageNonTypesTimer + && !IS_BATTLER_OF_TYPE(gBattlerAttacker, gSideTimers[side].damageNonTypesType) + && IsBattlerAlive(gBattlerAttacker) + && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) + { + gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 6; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + } + gBattlescriptCurrInstr = cmd->nextInstr; +} + +// Heals one-sixth of the target's HP, including for Dynamaxed targets. +void BS_HealOneSixth(void) +{ + NATIVE_ARGS(const u8* failInstr); + gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 6; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + gBattleMoveDamage *= -1; + + if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP) + gBattlescriptCurrInstr = cmd->failInstr; // fail + else + gBattlescriptCurrInstr = cmd->nextInstr; // can heal +} + +// Recycles the target's item if it is specifically holding a berry. +void BS_TryRecycleBerry(void) +{ + NATIVE_ARGS(const u8 *failInstr); + u16* usedHeldItem = &gBattleStruct->usedHeldItems[gBattlerPartyIndexes[gBattlerTarget]][GetBattlerSide(gBattlerTarget)]; + if (gBattleMons[gBattlerTarget].item == ITEM_NONE + && gBattleStruct->changedItems[gBattlerTarget] == ITEM_NONE // Will not inherit an item + && ItemId_GetPocket(*usedHeldItem) == POCKET_BERRIES) + { + gLastUsedItem = *usedHeldItem; + *usedHeldItem = ITEM_NONE; + gBattleMons[gBattlerTarget].item = gLastUsedItem; + + BtlController_EmitSetMonData(gBattlerTarget, BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].item), &gBattleMons[gBattlerTarget].item); + MarkBattlerForControllerExec(gBattlerTarget); + + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattlescriptCurrInstr = cmd->failInstr; + } +} + +// Goes to the jump instruction if the target is Dynamaxed. +void BS_JumpIfDynamaxed(void) +{ + NATIVE_ARGS(const u8 *jumpInstr); + if (IsDynamaxed(gBattlerTarget)) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; +} + +// DYNAMAX TRIGGER: +static const u8 ALIGNED(4) sDynamaxTriggerGfx[] = INCBIN_U8("graphics/battle_interface/dynamax_trigger.4bpp"); +static const u16 sDynamaxTriggerPal[] = INCBIN_U16("graphics/battle_interface/dynamax_trigger.gbapal"); + +static const struct SpriteSheet sSpriteSheet_DynamaxTrigger = +{ + sDynamaxTriggerGfx, sizeof(sDynamaxTriggerGfx), TAG_DYNAMAX_TRIGGER_TILE +}; +static const struct SpritePalette sSpritePalette_DynamaxTrigger = +{ + sDynamaxTriggerPal, TAG_DYNAMAX_TRIGGER_PAL +}; + +static const struct OamData sOamData_DynamaxTrigger = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = ST_OAM_SQUARE, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd sSpriteAnim_DynamaxTriggerOff[] = +{ + ANIMCMD_FRAME(0, 0), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_DynamaxTriggerOn[] = +{ + ANIMCMD_FRAME(16, 0), + ANIMCMD_END +}; + +static const union AnimCmd *const sSpriteAnimTable_DynamaxTrigger[] = +{ + sSpriteAnim_DynamaxTriggerOff, + sSpriteAnim_DynamaxTriggerOn, +}; + +static const struct SpriteTemplate sSpriteTemplate_DynamaxTrigger = +{ + .tileTag = TAG_DYNAMAX_TRIGGER_TILE, + .paletteTag = TAG_DYNAMAX_TRIGGER_PAL, + .oam = &sOamData_DynamaxTrigger, + .anims = sSpriteAnimTable_DynamaxTrigger, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCb_DynamaxTrigger +}; + +// Dynamax Evolution Trigger icon functions. +void ChangeDynamaxTriggerSprite(u8 spriteId, u8 animId) +{ + StartSpriteAnim(&gSprites[spriteId], animId); +} + +#define SINGLES_DYNAMAX_TRIGGER_POS_X_OPTIMAL (30) +#define SINGLES_DYNAMAX_TRIGGER_POS_X_PRIORITY (31) +#define SINGLES_DYNAMAX_TRIGGER_POS_X_SLIDE (15) +#define SINGLES_DYNAMAX_TRIGGER_POS_Y_DIFF (-11) + +#define DOUBLES_DYNAMAX_TRIGGER_POS_X_OPTIMAL (30) +#define DOUBLES_DYNAMAX_TRIGGER_POS_X_PRIORITY (31) +#define DOUBLES_DYNAMAX_TRIGGER_POS_X_SLIDE (15) +#define DOUBLES_DYNAMAX_TRIGGER_POS_Y_DIFF (-4) + +#define tBattler data[0] +#define tHide data[1] + +void CreateDynamaxTriggerSprite(u8 battlerId, u8 palId) +{ + LoadSpritePalette(&sSpritePalette_DynamaxTrigger); + if (GetSpriteTileStartByTag(TAG_DYNAMAX_TRIGGER_TILE) == 0xFFFF) + LoadSpriteSheet(&sSpriteSheet_DynamaxTrigger); + if (gBattleStruct->dynamax.triggerSpriteId == 0xFF) + { + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + gBattleStruct->dynamax.triggerSpriteId = CreateSprite(&sSpriteTemplate_DynamaxTrigger, + gSprites[gHealthboxSpriteIds[battlerId]].x - DOUBLES_DYNAMAX_TRIGGER_POS_X_SLIDE, + gSprites[gHealthboxSpriteIds[battlerId]].y - DOUBLES_DYNAMAX_TRIGGER_POS_Y_DIFF, 0); + else + gBattleStruct->dynamax.triggerSpriteId = CreateSprite(&sSpriteTemplate_DynamaxTrigger, + gSprites[gHealthboxSpriteIds[battlerId]].x - SINGLES_DYNAMAX_TRIGGER_POS_X_SLIDE, + gSprites[gHealthboxSpriteIds[battlerId]].y - SINGLES_DYNAMAX_TRIGGER_POS_Y_DIFF, 0); + } + gSprites[gBattleStruct->dynamax.triggerSpriteId].tBattler = battlerId; + gSprites[gBattleStruct->dynamax.triggerSpriteId].tHide = FALSE; + + ChangeDynamaxTriggerSprite(gBattleStruct->dynamax.triggerSpriteId, palId); +} + +static void SpriteCb_DynamaxTrigger(struct Sprite *sprite) +{ + s32 xSlide, xPriority, xOptimal; + s32 yDiff; + + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + { + xSlide = DOUBLES_DYNAMAX_TRIGGER_POS_X_SLIDE; + xPriority = DOUBLES_DYNAMAX_TRIGGER_POS_X_PRIORITY; + xOptimal = DOUBLES_DYNAMAX_TRIGGER_POS_X_OPTIMAL; + yDiff = DOUBLES_DYNAMAX_TRIGGER_POS_Y_DIFF; + } + else + { + xSlide = SINGLES_DYNAMAX_TRIGGER_POS_X_SLIDE; + xPriority = SINGLES_DYNAMAX_TRIGGER_POS_X_PRIORITY; + xOptimal = SINGLES_DYNAMAX_TRIGGER_POS_X_OPTIMAL; + yDiff = SINGLES_DYNAMAX_TRIGGER_POS_Y_DIFF; + } + + if (sprite->tHide) + { + if (sprite->x != gSprites[gHealthboxSpriteIds[sprite->tBattler]].x - xSlide) + sprite->x++; + + if (sprite->x >= gSprites[gHealthboxSpriteIds[sprite->tBattler]].x - xPriority) + sprite->oam.priority = 2; + else + sprite->oam.priority = 1; + + sprite->y = gSprites[gHealthboxSpriteIds[sprite->tBattler]].y - yDiff; + sprite->y2 = gSprites[gHealthboxSpriteIds[sprite->tBattler]].y2 - yDiff; + if (sprite->x == gSprites[gHealthboxSpriteIds[sprite->tBattler]].x - xSlide) + DestroyDynamaxTriggerSprite(); + } + else + { + if (sprite->x != gSprites[gHealthboxSpriteIds[sprite->tBattler]].x - xOptimal) + sprite->x--; + + if (sprite->x >= gSprites[gHealthboxSpriteIds[sprite->tBattler]].x - xPriority) + sprite->oam.priority = 2; + else + sprite->oam.priority = 1; + + sprite->y = gSprites[gHealthboxSpriteIds[sprite->tBattler]].y - yDiff; + sprite->y2 = gSprites[gHealthboxSpriteIds[sprite->tBattler]].y2 - yDiff; + } +} + +bool32 IsDynamaxTriggerSpriteActive(void) +{ + if (GetSpriteTileStartByTag(TAG_DYNAMAX_TRIGGER_TILE) == 0xFFFF) + return FALSE; + else if (IndexOfSpritePaletteTag(TAG_DYNAMAX_TRIGGER_PAL) != 0xFF) + return TRUE; + else + return FALSE; +} + +void HideDynamaxTriggerSprite(void) +{ + if (gBattleStruct->dynamax.triggerSpriteId >= MAX_SPRITES) + return; + ChangeDynamaxTriggerSprite(gBattleStruct->dynamax.triggerSpriteId, 0); + gSprites[gBattleStruct->dynamax.triggerSpriteId].tHide = TRUE; +} + +void DestroyDynamaxTriggerSprite(void) +{ + FreeSpritePaletteByTag(TAG_DYNAMAX_TRIGGER_PAL); + FreeSpriteTilesByTag(TAG_DYNAMAX_TRIGGER_TILE); + if (gBattleStruct->dynamax.triggerSpriteId != 0xFF) + DestroySprite(&gSprites[gBattleStruct->dynamax.triggerSpriteId]); + gBattleStruct->dynamax.triggerSpriteId = 0xFF; +} + +#undef tBattler +#undef tHide + + +// DYNAMAX INDICATOR: +static const u8 ALIGNED(4) sDynamaxIndicatorGfx[] = INCBIN_U8("graphics/battle_interface/dynamax_indicator.4bpp"); +static const u16 sDynamaxIndicatorPal[] = INCBIN_U16("graphics/battle_interface/misc_indicator.gbapal"); + +static const struct SpriteSheet sSpriteSheet_DynamaxIndicator = +{ + sDynamaxIndicatorGfx, sizeof(sDynamaxIndicatorGfx), TAG_DYNAMAX_INDICATOR_TILE +}; +static const struct SpritePalette sSpritePalette_DynamaxIndicator = +{ + sDynamaxIndicatorPal, TAG_MISC_INDICATOR_PAL +}; + +static const struct SpriteSheet sDynamaxIndicator_SpriteSheet[] = +{ + {sDynamaxIndicatorGfx, sizeof(sDynamaxIndicatorGfx), TAG_DYNAMAX_INDICATOR_TILE} +}; + +static const struct SpritePalette sDynamaxIndicator_SpritePalette[] = +{ + {sDynamaxIndicatorPal, TAG_MISC_INDICATOR_PAL} +}; + +static const struct OamData sOamData_DynamaxIndicator = +{ + .shape = SPRITE_SHAPE(16x16), + .size = SPRITE_SIZE(16x16), + .priority = 1, +}; + +static const struct SpriteTemplate sSpriteTemplate_DynamaxIndicator = +{ + .tileTag = TAG_DYNAMAX_INDICATOR_TILE, + .paletteTag = TAG_MISC_INDICATOR_PAL, + .oam = &sOamData_DynamaxIndicator, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCb_DynamaxIndicator, +}; + +static const s8 sIndicatorPositions[][2] = +{ + [B_POSITION_PLAYER_LEFT] = {52, -9}, + [B_POSITION_OPPONENT_LEFT] = {44, -9}, + [B_POSITION_PLAYER_RIGHT] = {52, -9}, + [B_POSITION_OPPONENT_RIGHT] = {44, -9}, +}; + +// for sprite data fields +#define tBattler data[0] +#define tType data[1] // Indicator type: dynamax +#define tPosX data[2] +#define tLevelXDelta data[3] // X position depends whether level has 3, 2 or 1 digit + +// data fields for healthboxMain +// oam.affineParam holds healthboxRight spriteId +#define hMain_DynamaxIndicatorId data[3] +#define hMain_HealthBarSpriteId data[5] +#define hMain_Battler data[6] +#define hMain_Data7 data[7] + +// data fields for healthboxRight +#define hOther_HealthBoxSpriteId data[5] + +// data fields for healthbar +#define hBar_HealthBoxSpriteId data[5] + +void DynamaxIndicator_LoadSpriteGfx(void) +{ + LoadSpriteSheet(sDynamaxIndicator_SpriteSheet); + LoadSpritePalette(sDynamaxIndicator_SpritePalette); +} + +bool32 DynamaxIndicator_ShouldBeInvisible(u32 battlerId) +{ + return !IsDynamaxed(battlerId); +} + +u8 DynamaxIndicator_GetSpriteId(u32 healthboxSpriteId) +{ + return gBattleStruct->dynamax.indicatorSpriteId[gSprites[healthboxSpriteId].hMain_Battler]; +} + +void DynamaxIndicator_SetVisibilities(u32 healthboxId, bool32 invisible) +{ + u8 spriteId = DynamaxIndicator_GetSpriteId(healthboxId); + u32 battlerId = gSprites[healthboxId].hMain_Battler; + + if (invisible == TRUE) + gSprites[spriteId].invisible = TRUE; + else // Try visible. + gSprites[spriteId].invisible = DynamaxIndicator_ShouldBeInvisible(battlerId); +} + +void DynamaxIndicator_UpdateOamPriority(u32 healthboxId, u32 oamPriority) +{ + u8 spriteId = DynamaxIndicator_GetSpriteId(healthboxId); + gSprites[spriteId].oam.priority = oamPriority; +} + +void DynamaxIndicator_UpdateLevel(u32 healthboxId, u32 level) +{ + s16 xDelta = 0; + u8 spriteId = DynamaxIndicator_GetSpriteId(healthboxId); + + if (level >= 100) + xDelta -= 4; + else if (level < 10) + xDelta += 5; + + gSprites[spriteId].tLevelXDelta = xDelta; +} + +void DynamaxIndicator_CreateSprite(u32 battlerId, u32 healthboxSpriteId) +{ + u32 position; + u8 spriteId; + s16 xHealthbox = 0, y = 0; + s32 x = 0; + + position = GetBattlerPosition(battlerId); + GetBattlerHealthboxCoords(battlerId, &xHealthbox, &y); + + x = sIndicatorPositions[position][0]; + y += sIndicatorPositions[position][1]; + + spriteId = gBattleStruct->dynamax.indicatorSpriteId[battlerId] = CreateSpriteAtEnd(&sSpriteTemplate_DynamaxIndicator, 0, y, 0); + gSprites[spriteId].tBattler = battlerId; + gSprites[spriteId].tPosX = x; + gSprites[spriteId].invisible = TRUE; +} + +void DynamaxIndicator_DestroySprite(u32 healthboxSpriteId) +{ + u8 spriteId = DynamaxIndicator_GetSpriteId(healthboxSpriteId); + DestroySprite(&gSprites[spriteId]); +} + +static void SpriteCb_DynamaxIndicator(struct Sprite *sprite) +{ + u32 battlerId = sprite->tBattler; + + sprite->x = gSprites[gHealthboxSpriteIds[battlerId]].x + sprite->tPosX + sprite->tLevelXDelta; + sprite->x2 = gSprites[gHealthboxSpriteIds[battlerId]].x2; + sprite->y2 = gSprites[gHealthboxSpriteIds[battlerId]].y2; +} + +#undef tBattler +#undef tType +#undef tPosX +#undef tLevelXDelta diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index d71fa5e5bf2f..d66d2592c45b 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -634,6 +634,13 @@ void BattleLoadMonSpriteGfx(struct Pokemon *mon, u32 battler) BlendPalette(paletteOffset, 16, 6, RGB_WHITE); CpuCopy32(&gPlttBufferFaded[paletteOffset], &gPlttBufferUnfaded[paletteOffset], PLTT_SIZEOF(16)); } + + // dynamax tint + if (IsDynamaxed(battler)) + { + BlendPalette(paletteOffset, 16, 4, RGB(31, 0, 12)); + CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, 32); + } } void BattleGfxSfxDummy2(u16 species) @@ -701,6 +708,7 @@ bool8 BattleLoadAllHealthBoxesGfx(u8 state) LoadSpritePalette(&sSpritePalettes_HealthBoxHealthBar[0]); LoadSpritePalette(&sSpritePalettes_HealthBoxHealthBar[1]); MegaIndicator_LoadSpritesGfx(); + DynamaxIndicator_LoadSpriteGfx(); } else if (!IsDoubleBattle()) { diff --git a/src/battle_interface.c b/src/battle_interface.c index 6c2b8168dca8..139bcc16032e 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -854,6 +854,9 @@ u8 CreateBattlerHealthboxSprites(u8 battlerId) // Create mega indicator sprite. MegaIndicator_CreateSprite(battlerId, healthboxLeftSpriteId); + // Create dynamax indicator sprites. + DynamaxIndicator_CreateSprite(battlerId, healthboxLeftSpriteId); + gBattleStruct->ballSpriteIds[0] = MAX_SPRITES; gBattleStruct->ballSpriteIds[1] = MAX_SPRITES; @@ -937,6 +940,7 @@ void SetHealthboxSpriteInvisible(u8 healthboxSpriteId) gSprites[gSprites[healthboxSpriteId].hMain_HealthBarSpriteId].invisible = TRUE; gSprites[gSprites[healthboxSpriteId].oam.affineParam].invisible = TRUE; MegaIndicator_SetVisibilities(healthboxSpriteId, TRUE); + DynamaxIndicator_SetVisibilities(healthboxSpriteId, TRUE); } void SetHealthboxSpriteVisible(u8 healthboxSpriteId) @@ -945,6 +949,7 @@ void SetHealthboxSpriteVisible(u8 healthboxSpriteId) gSprites[gSprites[healthboxSpriteId].hMain_HealthBarSpriteId].invisible = FALSE; gSprites[gSprites[healthboxSpriteId].oam.affineParam].invisible = FALSE; MegaIndicator_SetVisibilities(healthboxSpriteId, FALSE); + DynamaxIndicator_SetVisibilities(healthboxSpriteId, FALSE); } static void UpdateSpritePos(u8 spriteId, s16 x, s16 y) @@ -971,6 +976,7 @@ static void TryToggleHealboxVisibility(u32 priority, u32 healthboxLeftSpriteId, gSprites[healthboxRightSpriteId].invisible = invisible; gSprites[healthbarSpriteId].invisible = invisible; MegaIndicator_SetVisibilities(healthboxLeftSpriteId, invisible); + DynamaxIndicator_SetVisibilities(healthboxLeftSpriteId, invisible); } void UpdateOamPriorityInAllHealthboxes(u8 priority, bool32 hideHPBoxes) @@ -988,6 +994,7 @@ void UpdateOamPriorityInAllHealthboxes(u8 priority, bool32 hideHPBoxes) gSprites[healthbarSpriteId].oam.priority = priority; MegaIndicator_UpdateOamPriority(healthboxLeftSpriteId, priority); + DynamaxIndicator_UpdateOamPriority(healthboxLeftSpriteId, priority); if (B_HIDE_HEALTHBOX_IN_ANIMS == TRUE && hideHPBoxes && IsBattlerAlive(i)) TryToggleHealboxVisibility(priority, healthboxLeftSpriteId, healthboxRightSpriteId, healthbarSpriteId); @@ -1042,13 +1049,15 @@ static void UpdateLvlInHealthbox(u8 healthboxSpriteId, u8 lvl) u8 *objVram; u8 battler = gSprites[healthboxSpriteId].hMain_Battler; - // Don't print Lv char if mon is mega evolved or primal reverted. - if (IsBattlerMegaEvolved(battler) || IsBattlerPrimalReverted(battler)) + // Don't print Lv char if mon is mega evolved or primal reverted or Dynamaxed. + if (IsBattlerMegaEvolved(battler) || IsBattlerPrimalReverted(battler) || IsDynamaxed(battler)) { objVram = ConvertIntToDecimalStringN(text, lvl, STR_CONV_MODE_LEFT_ALIGN, 3); xPos = 5 * (3 - (objVram - (text + 2))) - 1; MegaIndicator_UpdateLevel(healthboxSpriteId, lvl); MegaIndicator_SetVisibilities(healthboxSpriteId, FALSE); + DynamaxIndicator_UpdateLevel(healthboxSpriteId, lvl); + DynamaxIndicator_SetVisibilities(healthboxSpriteId, FALSE); } else { @@ -1471,6 +1480,7 @@ void HideTriggerSprites(void) HideMegaTriggerSprite(); HideBurstTriggerSprite(); HideZMoveTriggerSprite(); + HideDynamaxTriggerSprite(); } void DestroyMegaTriggerSprite(void) @@ -1620,7 +1630,7 @@ static const u8 ALIGNED(4) sMegaIndicatorGfx[] = INCBIN_U8("graphics/battle_inte static const u16 sMegaIndicatorPal[] = INCBIN_U16("graphics/battle_interface/mega_indicator.gbapal"); static const u8 ALIGNED(4) sAlphaIndicatorGfx[] = INCBIN_U8("graphics/battle_interface/alpha_indicator.4bpp"); static const u8 ALIGNED(4) sOmegaIndicatorGfx[] = INCBIN_U8("graphics/battle_interface/omega_indicator.4bpp"); -static const u16 sAlphaOmegaIndicatorPal[] = INCBIN_U16("graphics/battle_interface/alpha_indicator.gbapal"); +static const u16 sAlphaOmegaIndicatorPal[] = INCBIN_U16("graphics/battle_interface/misc_indicator.gbapal"); static const struct SpriteSheet sMegaIndicator_SpriteSheets[] = { @@ -1632,8 +1642,8 @@ static const struct SpriteSheet sMegaIndicator_SpriteSheets[] = static const struct SpritePalette sMegaIndicator_SpritePalettes[] = { [INDICATOR_MEGA] = {sMegaIndicatorPal, TAG_MEGA_INDICATOR_PAL}, - [INDICATOR_ALPHA] = {sAlphaOmegaIndicatorPal, TAG_ALPHA_OMEGA_INDICATOR_PAL}, - [INDICATOR_OMEGA] = {sAlphaOmegaIndicatorPal, TAG_ALPHA_OMEGA_INDICATOR_PAL}, + [INDICATOR_ALPHA] = {sAlphaOmegaIndicatorPal, TAG_MISC_INDICATOR_PAL}, + [INDICATOR_OMEGA] = {sAlphaOmegaIndicatorPal, TAG_MISC_INDICATOR_PAL}, [INDICATOR_COUNT] = {0} }; @@ -1658,8 +1668,8 @@ static const struct SpriteTemplate sSpriteTemplate_MegaIndicator = static const u16 sMegaIndicatorTags[][2] = { [INDICATOR_MEGA] = {TAG_MEGA_INDICATOR_TILE, TAG_MEGA_INDICATOR_PAL}, - [INDICATOR_ALPHA] = {TAG_ALPHA_INDICATOR_TILE, TAG_ALPHA_OMEGA_INDICATOR_PAL}, - [INDICATOR_OMEGA] = {TAG_OMEGA_INDICATOR_TILE, TAG_ALPHA_OMEGA_INDICATOR_PAL}, + [INDICATOR_ALPHA] = {TAG_ALPHA_INDICATOR_TILE, TAG_MISC_INDICATOR_PAL}, + [INDICATOR_OMEGA] = {TAG_OMEGA_INDICATOR_TILE, TAG_MISC_INDICATOR_PAL}, }; static const s8 sIndicatorPositions[][2] = diff --git a/src/battle_intro.c b/src/battle_intro.c index ac88f570dbae..90ff736f003e 100644 --- a/src/battle_intro.c +++ b/src/battle_intro.c @@ -116,7 +116,7 @@ void HandleIntroSlide(u8 terrain) { taskId = CreateTask(BattleIntroSlide3, 0); } - else if ((gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) && gGameVersion != VERSION_RUBY) + else if (GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL) == SPECIES_KYOGRE) { terrain = BATTLE_TERRAIN_UNDERWATER; taskId = CreateTask(BattleIntroSlide2, 0); diff --git a/src/battle_main.c b/src/battle_main.c index 18de8e3b1f06..7a70771af922 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3201,6 +3201,12 @@ void SwitchInClearSetData(u32 battler) gSpecialStatuses[battler].physicalDmg = 0; gSpecialStatuses[battler].specialDmg = 0; + // Reset G-Max Chi Strike boosts. + gBattleStruct->bonusCritStages[battler] = 0; + + // Reset Dynamax flags. + UndoDynamax(battler); + gBattleStruct->overwrittenAbilities[battler] = ABILITY_NONE; // Clear selected party ID so Revival Blessing doesn't get confused. @@ -4247,6 +4253,8 @@ static void HandleTurnActionSelectionState(void) gBattleStruct->mega.toEvolve &= ~(gBitTable[BATTLE_PARTNER(GetBattlerPosition(battler))]); gBattleStruct->burst.toBurst &= ~(gBitTable[BATTLE_PARTNER(GetBattlerPosition(battler))]); + gBattleStruct->dynamax.toDynamax &= ~(gBitTable[battler]); + gBattleStruct->dynamax.usingMaxMove[battler] = FALSE; gBattleStruct->zmove.toBeUsed[BATTLE_PARTNER(GetBattlerPosition(battler))] = MOVE_NONE; BtlController_EmitEndBounceEffect(battler, BUFFER_A); MarkBattlerForControllerExec(battler); @@ -4334,13 +4342,25 @@ static void HandleTurnActionSelectionState(void) RecordedBattle_SetBattlerAction(battler, gBattleResources->bufferB[battler][3]); } - gBattleStruct->chosenMovePositions[battler] = gBattleResources->bufferB[battler][2] & ~(RET_MEGA_EVOLUTION | RET_ULTRA_BURST); + // Get the chosen move position (and thus the chosen move) and target from the returned buffer. + gBattleStruct->chosenMovePositions[battler] = gBattleResources->bufferB[battler][2] & ~(RET_MEGA_EVOLUTION | RET_ULTRA_BURST | RET_DYNAMAX); gChosenMoveByBattler[battler] = gBattleMons[battler].moves[gBattleStruct->chosenMovePositions[battler]]; gBattleStruct->moveTarget[battler] = gBattleResources->bufferB[battler][3]; + + // Check to see if any gimmicks need to be prepared. if (gBattleResources->bufferB[battler][2] & RET_MEGA_EVOLUTION) gBattleStruct->mega.toEvolve |= gBitTable[battler]; else if (gBattleResources->bufferB[battler][2] & RET_ULTRA_BURST) gBattleStruct->burst.toBurst |= gBitTable[battler]; + else if (gBattleResources->bufferB[battler][2] & RET_DYNAMAX) + gBattleStruct->dynamax.toDynamax |= gBitTable[battler]; + + // Max Move check + if (ShouldUseMaxMove(battler, gChosenMoveByBattler[battler])) + { + gBattleStruct->dynamax.baseMove[battler] = gBattleMons[battler].moves[gBattleStruct->chosenMovePositions[battler]]; + gBattleStruct->dynamax.usingMaxMove[battler] = TRUE; + } gBattleCommunication[battler]++; if (gTestRunnerEnabled) @@ -4615,7 +4635,7 @@ u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, u32 holdEffect) speed /= 2; else if (holdEffect == HOLD_EFFECT_IRON_BALL) speed /= 2; - else if (holdEffect == HOLD_EFFECT_CHOICE_SCARF) + else if (holdEffect == HOLD_EFFECT_CHOICE_SCARF && !IsDynamaxed(battler)) speed = (speed * 150) / 100; else if (holdEffect == HOLD_EFFECT_QUICK_POWDER && gBattleMons[battler].species == SPECIES_DITTO && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED)) speed *= 2; @@ -4659,6 +4679,11 @@ s8 GetMovePriority(u32 battler, u16 move) u16 ability = GetBattlerAbility(battler); priority = gBattleMoves[move].priority; + + // Max Guard check + if (gBattleStruct->dynamax.usingMaxMove[battler] && gBattleMoves[move].split == SPLIT_STATUS) + return gBattleMoves[MOVE_MAX_GUARD].priority; + if (ability == ABILITY_GALE_WINGS && (B_GALE_WINGS < GEN_7 || BATTLER_MAX_HP(battler)) && gBattleMoves[move].type == TYPE_FLYING) @@ -4970,21 +4995,33 @@ static void PopulateArrayWithBattlers(u8 *battlers) battlers[i] = i; } -static bool32 TryDoMegaEvosBeforeMoves(void) +static bool32 TryDoGimmicksBeforeMoves(void) { - if (!(gHitMarker & HITMARKER_RUN) && (gBattleStruct->mega.toEvolve || gBattleStruct->burst.toBurst)) + if (!(gHitMarker & HITMARKER_RUN) + && (gBattleStruct->mega.toEvolve || gBattleStruct->burst.toBurst || gBattleStruct->dynamax.toDynamax)) { u32 i, battler; - u8 megaOrder[MAX_BATTLERS_COUNT]; + u8 order[MAX_BATTLERS_COUNT]; - PopulateArrayWithBattlers(megaOrder); - SortBattlersBySpeed(megaOrder, FALSE); + PopulateArrayWithBattlers(order); + SortBattlersBySpeed(order, FALSE); for (i = 0; i < gBattlersCount; i++) { - if (gBattleStruct->mega.toEvolve & gBitTable[megaOrder[i]] - && !(gProtectStructs[megaOrder[i]].noValidMoves)) + // Dynamax Check + if (gBattleStruct->dynamax.toDynamax & gBitTable[order[i]]) + { + gBattlerAttacker = order[i]; + gBattleScripting.battler = gBattlerAttacker; + gBattleStruct->dynamax.toDynamax &= ~(gBitTable[gBattlerAttacker]); + PrepareBattlerForDynamax(gBattlerAttacker); + BattleScriptExecute(BattleScript_DynamaxBegins); + return TRUE; + } + // Mega Evo Check + if (gBattleStruct->mega.toEvolve & gBitTable[order[i]] + && !(gProtectStructs[order[i]].noValidMoves)) { - gBattlerAttacker = megaOrder[i]; + gBattlerAttacker = order[i]; gBattleStruct->mega.toEvolve &= ~(gBitTable[gBattlerAttacker]); gLastUsedItem = gBattleMons[gBattlerAttacker].item; if (GetBattleFormChangeTargetSpecies(gBattlerAttacker, FORM_CHANGE_BATTLE_MEGA_EVOLUTION_MOVE) != SPECIES_NONE) @@ -4993,11 +5030,11 @@ static bool32 TryDoMegaEvosBeforeMoves(void) BattleScriptExecute(BattleScript_MegaEvolution); return TRUE; } - - if (gBattleStruct->burst.toBurst & gBitTable[megaOrder[i]] - && !(gProtectStructs[megaOrder[i]].noValidMoves)) + // Ultra Burst Check + if (gBattleStruct->burst.toBurst & gBitTable[order[i]] + && !(gProtectStructs[order[i]].noValidMoves)) { - battler = gBattlerAttacker = megaOrder[i]; + battler = gBattlerAttacker = order[i]; gBattleStruct->burst.toBurst &= ~(gBitTable[battler]); gLastUsedItem = gBattleMons[battler].item; BattleScriptExecute(BattleScript_UltraBurst); @@ -5143,7 +5180,7 @@ static void RunTurnActionsFunctions(void) // Mega Evolve / Focus Punch-like moves after switching, items, running, but before using a move. if (gCurrentActionFuncId == B_ACTION_USE_MOVE && !gBattleStruct->effectsBeforeUsingMoveDone) { - if (TryDoMegaEvosBeforeMoves()) + if (TryDoGimmicksBeforeMoves()) return; else if (TryDoMoveEffectsBeforeMoves()) return; @@ -5359,6 +5396,14 @@ static void HandleEndTurn_FinishBattle(void) FadeOutMapMusic(5); if (B_TRAINERS_KNOCK_OFF_ITEMS == TRUE || B_RESTORE_HELD_BATTLE_ITEMS == TRUE) TryRestoreHeldItems(); + + // Undo Dynamax HP multiplier before recalculating stats. + for (i = 0; i < gBattlersCount; ++i) + { + if (IsDynamaxed(i)) + UndoDynamax(i); + } + for (i = 0; i < PARTY_SIZE; i++) { bool8 changedForm = FALSE; @@ -5644,7 +5689,8 @@ void SetTypeBeforeUsingMove(u32 move, u32 battlerAtk) ) { gBattleStruct->dynamicMoveType = ateType | F_DYNAMIC_TYPE_2; - gBattleStruct->ateBoost[battlerAtk] = 1; + if (!IsDynamaxed(battlerAtk)) + gBattleStruct->ateBoost[battlerAtk] = 1; } else if (gBattleMoves[move].type != TYPE_NORMAL && gBattleMoves[move].effect != EFFECT_HIDDEN_POWER @@ -5652,7 +5698,8 @@ void SetTypeBeforeUsingMove(u32 move, u32 battlerAtk) && attackerAbility == ABILITY_NORMALIZE) { gBattleStruct->dynamicMoveType = TYPE_NORMAL | F_DYNAMIC_TYPE_2; - gBattleStruct->ateBoost[battlerAtk] = 1; + if (!IsDynamaxed(battlerAtk)) + gBattleStruct->ateBoost[battlerAtk] = 1; } else if (gBattleMoves[move].soundMove && attackerAbility == ABILITY_LIQUID_VOICE) { diff --git a/src/battle_message.c b/src/battle_message.c index 6999932ef356..116a42d6bc7c 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -792,8 +792,21 @@ static const u8 sText_AbilityWeakenedSurroundingMonsStat[] = _("{B_ATK_NAME_WITH static const u8 sText_AttackerGainedStrengthFromTheFallen[] = _("{B_ATK_NAME_WITH_PREFIX} gained strength\nfrom the fallen!"); static const u8 sText_PrepareShellTrap[] = _("{B_ATK_NAME_WITH_PREFIX} set a shell trap!"); static const u8 sText_ShellTrapDidntWork[] = _("{B_ATK_NAME_WITH_PREFIX}'s shell trap didn't work!"); +static const u8 sText_SharpSteelFloats[] = _("Sharp-pointed steel floats\naround {B_DEF_TEAM2} team!"); +static const u8 sText_SharpSteelDmg[] = _("Sharp steel bit into {B_DEF_NAME_WITH_PREFIX}!"); +static const u8 sText_PkmnBlewAwaySharpSteel[] = _("{B_ATK_NAME_WITH_PREFIX} blew away\nsharp steel!"); +static const u8 sText_SharpSteelDisappearedFromTeam[] = _("The sharp steel disappeared from\nthe ground around {B_ATK_TEAM2} team!"); +static const u8 sText_TeamTrappedWithVines[] = _("{B_DEF_TEAM1} team got trapped\nwith vines!"); +static const u8 sText_PkmnHurtByVines[] = _("{B_ATK_NAME_WITH_PREFIX} is hurt by\nG-Max Vine Lash's ferocious beating!"); +static const u8 sText_TeamCaughtInVortex[] = _("{B_DEF_TEAM1} team got caught\nin a vortex of water!"); +static const u8 sText_PkmnHurtByVortex[] = _("{B_ATK_NAME_WITH_PREFIX} is hurt by\nG-Max Cannonade's vortex!"); +static const u8 sText_TeamSurroundedByFire[] = _("{B_DEF_TEAM1} team was surrounded\nby flames!"); +static const u8 sText_PkmnBurningUp[] = _("{B_ATK_NAME_WITH_PREFIX} is burning up\nwithin G-Max Wildfire's flames!"); +static const u8 sText_TeamSurroundedByRocks[] = _("{B_DEF_TEAM1} team was surrounded\nby rocks!"); +static const u8 sText_PkmnHurtByRocksThrown[] = _("{B_ATK_NAME_WITH_PREFIX} is hurt by\nrocks thrown out by G-Max Volcalith!"); static const u8 sText_CouldntFullyProtect[] = _("{B_DEF_NAME_WITH_PREFIX} couldn't fully protect\nitself and got hurt!"); static const u8 sText_StockpiledEffectWoreOff[] = _("{B_ATK_NAME_WITH_PREFIX}'s stockpiled\neffect wore off!"); +static const u8 sText_MoveBlockedByDynamax[] = _("The move was blocked by\nthe power of Dynamax!"); static const u8 sText_PkmnRevivedReadyToFight[] = _("{B_BUFF1} was revived and\nis ready to fight again!"); static const u8 sText_ItemRestoredSpeciesHealth[] = _("{B_BUFF1} had its\nHP restored!"); static const u8 sText_ItemCuredSpeciesStatus[] = _("{B_BUFF1} had\nits status healed!"); @@ -812,6 +825,7 @@ static const u8 sText_TargetCoveredInStickyCandySyrup[] = _("{B_DEF_NAME_WITH_PR const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_MOVEBLOCKEDBYDYNAMAX - BATTLESTRINGS_TABLE_START] = sText_MoveBlockedByDynamax, [STRINGID_OPPORTUNISTCOPIED - BATTLESTRINGS_TABLE_START] = sText_OpportunistCopied, [STRINGID_TARGETISHURTBYSALTCURE - BATTLESTRINGS_TABLE_START] = sText_TargetIsHurtBySaltCure, [STRINGID_TARGETISBEINGSALTCURED - BATTLESTRINGS_TABLE_START] = sText_TargetIsBeingSaltCured, @@ -825,6 +839,17 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_PKMNREVIVEDREADYTOFIGHT - BATTLESTRINGS_TABLE_START] = sText_PkmnRevivedReadyToFight, [STRINGID_STOCKPILEDEFFECTWOREOFF - BATTLESTRINGS_TABLE_START] = sText_StockpiledEffectWoreOff, [STRINGID_COULDNTFULLYPROTECT - BATTLESTRINGS_TABLE_START] = sText_CouldntFullyProtect, + [STRINGID_PKMNHURTBYROCKSTHROWN - BATTLESTRINGS_TABLE_START] = sText_PkmnHurtByRocksThrown, + [STRINGID_TEAMSURROUNDEDBYROCKS - BATTLESTRINGS_TABLE_START] = sText_TeamSurroundedByRocks, + [STRINGID_PKMNBURNINGUP - BATTLESTRINGS_TABLE_START] = sText_PkmnBurningUp, + [STRINGID_TEAMSURROUNDEDBYFIRE - BATTLESTRINGS_TABLE_START] = sText_TeamSurroundedByFire, + [STRINGID_PKMNHURTBYVORTEX - BATTLESTRINGS_TABLE_START] = sText_PkmnHurtByVortex, + [STRINGID_TEAMCAUGHTINVORTEX - BATTLESTRINGS_TABLE_START] = sText_TeamCaughtInVortex, + [STRINGID_PKMNHURTBYVINES - BATTLESTRINGS_TABLE_START] = sText_PkmnHurtByVines, + [STRINGID_TEAMTRAPPEDWITHVINES - BATTLESTRINGS_TABLE_START] = sText_TeamTrappedWithVines, + [STRINGID_PKMNBLEWAWAYSHARPSTEEL - BATTLESTRINGS_TABLE_START] = sText_PkmnBlewAwaySharpSteel, + [STRINGID_SHARPSTEELDMG - BATTLESTRINGS_TABLE_START] = sText_SharpSteelDmg, + [STRINGID_SHARPSTEELFLOATS - BATTLESTRINGS_TABLE_START] = sText_SharpSteelFloats, [STRINGID_ATTACKERGAINEDSTRENGTHFROMTHEFALLEN - BATTLESTRINGS_TABLE_START] = sText_AttackerGainedStrengthFromTheFallen, [STRINGID_ABILITYWEAKENEDFSURROUNDINGMONSSTAT - BATTLESTRINGS_TABLE_START] = sText_AbilityWeakenedSurroundingMonsStat, [STRINGID_ELECTRICTERRAINACTIVATEDABILITY - BATTLESTRINGS_TABLE_START] = sText_ElectricTerrainActivatedAbility, @@ -1419,6 +1444,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_TOXICSPIKESDISAPPEAREDFROMTEAM - BATTLESTRINGS_TABLE_START] = sText_ToxicSpikesDisappearedFromTeam, [STRINGID_STEALTHROCKDISAPPEAREDFROMTEAM - BATTLESTRINGS_TABLE_START] = sText_StealthRockDisappearedFromTeam, [STRINGID_STICKYWEBDISAPPEAREDFROMTEAM - BATTLESTRINGS_TABLE_START] = sText_StickyWebDisappearedFromTeam, + [STRINGID_SHARPSTEELDISAPPEAREDFROMTEAM - BATTLESTRINGS_TABLE_START] = sText_SharpSteelDisappearedFromTeam, [STRINGID_IONDELUGEON - BATTLESTRINGS_TABLE_START] = sText_IonDelugeOn, [STRINGID_TOPSYTURVYSWITCHEDSTATS - BATTLESTRINGS_TABLE_START] = sText_TopsyTurvySwitchedStats, [STRINGID_TERRAINBECOMESMISTY - BATTLESTRINGS_TABLE_START] = sText_TerrainBecomesMisty, @@ -1534,8 +1560,10 @@ const u16 gDmgHazardsStringIds[] = { [B_MSG_PKMNHURTBYSPIKES] = STRINGID_PKMNHURTBYSPIKES, [B_MSG_STEALTHROCKDMG] = STRINGID_STEALTHROCKDMG, + [B_MSG_SHARPSTEELDMG] = STRINGID_SHARPSTEELDMG, [B_MSG_POINTEDSTONESFLOAT] = STRINGID_POINTEDSTONESFLOAT, - [B_MSG_SPIKESSCATTERED] = STRINGID_SPIKESSCATTERED + [B_MSG_SPIKESSCATTERED] = STRINGID_SPIKESSCATTERED, + [B_MSG_SHARPSTEELFLOATS] = STRINGID_SHARPSTEELFLOATS, }; const u16 gSwitchInAbilityStringIds[] = @@ -1957,6 +1985,27 @@ const u16 gStatusConditionsStringIds[] = STRINGID_PKMNWASPOISONED, STRINGID_PKMNBADLYPOISONED, STRINGID_PKMNWASBURNED, STRINGID_PKMNWASPARALYZED, STRINGID_PKMNFELLASLEEP, STRINGID_PKMNGOTFROSTBITE }; +const u16 gStatus2StringIds[] = +{ + STRINGID_PKMNWASCONFUSED, STRINGID_PKMNFELLINLOVE, STRINGID_TARGETCANTESCAPENOW, STRINGID_PKMNSUBJECTEDTOTORMENT +}; + +const u16 gDamageNonTypesStartStringIds[] = +{ + [B_MSG_TRAPPED_WITH_VINES] = STRINGID_TEAMTRAPPEDWITHVINES, + [B_MSG_CAUGHT_IN_VORTEX] = STRINGID_TEAMCAUGHTINVORTEX, + [B_MSG_SURROUNDED_BY_FIRE] = STRINGID_TEAMSURROUNDEDBYFIRE, + [B_MSG_SURROUNDED_BY_ROCKS] = STRINGID_TEAMSURROUNDEDBYROCKS, +}; + +const u16 gDamageNonTypesDmgStringIds[] = +{ + [B_MSG_HURT_BY_VINES] = STRINGID_PKMNHURTBYVINES, + [B_MSG_HURT_BY_VORTEX] = STRINGID_PKMNHURTBYVORTEX, + [B_MSG_BURNING_UP] = STRINGID_PKMNBURNINGUP, + [B_MSG_HURT_BY_ROCKS_THROWN] = STRINGID_PKMNHURTBYROCKSTHROWN, +}; + const u8 gText_PkmnIsEvolving[] = _("What?\n{STR_VAR_1} is evolving!"); const u8 gText_CongratsPkmnEvolved[] = _("Congratulations! Your {STR_VAR_1}\nevolved into {STR_VAR_2}!{WAIT_SE}\p"); const u8 gText_PkmnStoppedEvolving[] = _("Huh? {STR_VAR_1}\nstopped evolving!\p"); @@ -2851,6 +2900,8 @@ void BufferStringBattle(u16 stringID, u32 battler) case STRINGID_USEDMOVE: // pokemon used a move msg if (gBattleStruct->zmove.active && gBattleStruct->zmove.activeSplit != SPLIT_STATUS) StringCopy(gBattleTextBuff3, GetZMoveName(gBattleMsgDataPtr->currentMove)); + else if (IsMaxMove(gBattleMsgDataPtr->currentMove)) + StringCopy(gBattleTextBuff3, GetMaxMoveName(gBattleMsgDataPtr->currentMove)); else if (gBattleMsgDataPtr->currentMove >= MOVES_COUNT) StringCopy(gBattleTextBuff3, sATypeMove_Table[*(&gBattleStruct->stringMoveType)]); else diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d9f1e04ff996..e3c2dd29a12b 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1264,6 +1264,14 @@ static void Cmd_attackcanceler(void) u16 attackerAbility = GetBattlerAbility(gBattlerAttacker); GET_MOVE_TYPE(gCurrentMove, moveType); + // Weight-based moves are blocked by Dynamax. + if (IsDynamaxed(gBattlerTarget) && IsMoveBlockedByDynamax(gCurrentMove)) + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_MoveBlockedByDynamax; + return; + } + if (gBattleOutcome != 0) { gCurrentActionFuncId = B_ACTION_FINISHED; @@ -1406,7 +1414,8 @@ static void Cmd_attackcanceler(void) } // Z-moves and Max Moves bypass protection, but deal reduced damage (factored in AccumulateOtherModifiers) - if (gBattleStruct->zmove.active && IS_BATTLER_PROTECTED(gBattlerTarget)) + if ((gBattleStruct->zmove.active || IsMaxMove(gCurrentMove)) + && IS_BATTLER_PROTECTED(gBattlerTarget)) { BattleScriptPush(cmd->nextInstr); gBattlescriptCurrInstr = BattleScript_CouldntFullyProtect; @@ -1745,7 +1754,7 @@ static void Cmd_accuracycheck(void) gBattlescriptCurrInstr = cmd->nextInstr; else if (gStatuses3[gBattlerTarget] & (STATUS3_SEMI_INVULNERABLE)) gBattlescriptCurrInstr = cmd->failInstr; - else if (!JumpIfMoveAffectedByProtect(0)) + else if (!JumpIfMoveAffectedByProtect(gCurrentMove)) gBattlescriptCurrInstr = cmd->nextInstr; } else if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_2ND_HIT @@ -1909,7 +1918,8 @@ s32 CalcCritChanceStageArgs(u32 battlerAtk, u32 battlerDef, u32 move, bool32 rec + 2 * (holdEffectAtk == HOLD_EFFECT_LUCKY_PUNCH && gBattleMons[battlerAtk].species == SPECIES_CHANSEY) + 2 * BENEFITS_FROM_LEEK(battlerAtk, holdEffectAtk) + 2 * (B_AFFECTION_MECHANICS == TRUE && GetBattlerFriendshipScore(battlerAtk) >= FRIENDSHIP_200_TO_254) - + (abilityAtk == ABILITY_SUPER_LUCK); + + (abilityAtk == ABILITY_SUPER_LUCK) + + gBattleStruct->bonusCritStages[gBattlerAttacker]; // Record ability only if move had at least +3 chance to get a crit if (critChance >= 3 && recordAbility && (abilityDef == ABILITY_BATTLE_ARMOR || abilityDef == ABILITY_SHELL_ARMOR)) @@ -3084,26 +3094,20 @@ void SetMoveEffect(bool32 primary, u32 certain) } break; case MOVE_EFFECT_FLINCH: - if (battlerAbility == ABILITY_INNER_FOCUS) + if (battlerAbility == ABILITY_INNER_FOCUS + && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) { - if (primary == TRUE || certain == MOVE_EFFECT_CERTAIN) - { - gLastUsedAbility = ABILITY_INNER_FOCUS; - gBattlerAbility = gEffectBattler; - RecordAbilityBattle(gEffectBattler, ABILITY_INNER_FOCUS); - gBattlescriptCurrInstr = BattleScript_FlinchPrevention; - } - else - { - gBattlescriptCurrInstr++; - } + gLastUsedAbility = ABILITY_INNER_FOCUS; + gBattlerAbility = gEffectBattler; + RecordAbilityBattle(gEffectBattler, ABILITY_INNER_FOCUS); + gBattlescriptCurrInstr = BattleScript_FlinchPrevention; } - else + else if (GetBattlerTurnOrderNum(gEffectBattler) > gCurrentTurnActionNumber + && !IsDynamaxed(gEffectBattler)) { - if (GetBattlerTurnOrderNum(gEffectBattler) > gCurrentTurnActionNumber) - gBattleMons[gEffectBattler].status2 |= sStatusFlagsForMoveEffects[gBattleScripting.moveEffect]; - gBattlescriptCurrInstr++; + gBattleMons[gEffectBattler].status2 |= sStatusFlagsForMoveEffects[gBattleScripting.moveEffect]; } + gBattlescriptCurrInstr++; break; case MOVE_EFFECT_UPROAR: if (!(gBattleMons[gEffectBattler].status2 & STATUS2_UPROAR)) @@ -3777,7 +3781,8 @@ static void Cmd_tryfaintmon(void) gBattleResults.lastOpponentSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES, NULL); gSideTimers[B_SIDE_OPPONENT].retaliateTimer = 2; } - if ((gHitMarker & HITMARKER_DESTINYBOND) && gBattleMons[gBattlerAttacker].hp != 0) + if ((gHitMarker & HITMARKER_DESTINYBOND) && gBattleMons[gBattlerAttacker].hp != 0 + && !IsDynamaxed(gBattlerAttacker)) { gHitMarker &= ~HITMARKER_DESTINYBOND; BattleScriptPush(gBattlescriptCurrInstr); @@ -5223,7 +5228,7 @@ static void Cmd_moveend(void) if (gProtectStructs[gBattlerTarget].spikyShielded && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) { gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; - gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 8; + gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 8; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_SPIKY_SHIELD); @@ -5621,6 +5626,8 @@ static void Cmd_moveend(void) { gLastPrintedMoves[gBattlerAttacker] = gChosenMove; gLastUsedMove = gCurrentMove; + if (IsMaxMove(gCurrentMove)) + gBattleStruct->dynamax.lastUsedBaseMove = gBattleStruct->dynamax.baseMove[gBattlerAttacker]; } } if (!(gAbsentBattlerFlags & gBitTable[gBattlerAttacker]) @@ -6830,7 +6837,7 @@ static void Cmd_switchineffects(void) && IsBattlerGrounded(battler)) { u8 spikesDmg = (5 - gSideTimers[GetBattlerSide(battler)].spikesAmount) * 2; - gBattleMoveDamage = gBattleMons[battler].maxHP / (spikesDmg); + gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / (spikesDmg); if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; @@ -6894,6 +6901,17 @@ static void Cmd_switchineffects(void) BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_StickyWebOnSwitchIn; } + else if (!(gDisableStructs[battler].steelSurgeDone) + && (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_STEELSURGE) + && IsBattlerAffectedByHazards(battler, FALSE) + && GetBattlerAbility(battler) != ABILITY_MAGIC_GUARD) + { + gDisableStructs[battler].steelSurgeDone = TRUE; + gBattleMoveDamage = GetStealthHazardDamage(gBattleMoves[MOVE_G_MAX_STEELSURGE].type, battler); + + if (gBattleMoveDamage != 0) + SetDmgHazardsBattlescript(battler, B_MSG_SHARPSTEELDMG); + } else if (gBattleMons[battler].hp != gBattleMons[battler].maxHP && gBattleStruct->zmove.healReplacement) { gBattleStruct->zmove.healReplacement = FALSE; @@ -6933,6 +6951,7 @@ static void Cmd_switchineffects(void) gDisableStructs[battler].spikesDone = FALSE; gDisableStructs[battler].toxicSpikesDone = FALSE; gDisableStructs[battler].stealthRockDone = FALSE; + gDisableStructs[battler].steelSurgeDone = FALSE; for (i = 0; i < gBattlersCount; i++) { @@ -7572,7 +7591,7 @@ static bool32 TryCheekPouch(u32 battler, u32 itemId) && gBattleStruct->ateBerry[GetBattlerSide(battler)] & gBitTable[gBattlerPartyIndexes[battler]] && !BATTLER_MAX_HP(battler)) { - gBattleMoveDamage = gBattleMons[battler].maxHP / 3; + gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 3; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattleMoveDamage *= -1; @@ -8171,6 +8190,7 @@ static bool32 TryDefogClear(u32 battlerAtk, bool32 clear) DEFOG_CLEAR(SIDE_STATUS_STEALTH_ROCK, stealthRockAmount, BattleScript_StealthRockDefog, 0); DEFOG_CLEAR(SIDE_STATUS_TOXIC_SPIKES, toxicSpikesAmount, BattleScript_ToxicSpikesDefog, 0); DEFOG_CLEAR(SIDE_STATUS_STICKY_WEB, stickyWebAmount, BattleScript_StickyWebDefog, 0); + DEFOG_CLEAR(SIDE_STATUS_STEELSURGE, steelsurgeAmount, BattleScript_SteelsurgeDefog, 0); if (B_DEFOG_CLEARS_TERRAIN >= GEN_8 && (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY)) { RemoveAllTerrains(); @@ -8332,7 +8352,6 @@ static void CourtChangeSwapSideStatuses(void) u32 temp; // TODO: add Pledge-related effects - // TODO: add Gigantamax-related effects // Swap timers and statuses COURTCHANGE_SWAP(SIDE_STATUS_REFLECT, reflectTimer, temp) @@ -8347,6 +8366,8 @@ static void CourtChangeSwapSideStatuses(void) COURTCHANGE_SWAP(SIDE_STATUS_STEALTH_ROCK, stealthRockAmount, temp); COURTCHANGE_SWAP(SIDE_STATUS_TOXIC_SPIKES, toxicSpikesAmount, temp); COURTCHANGE_SWAP(SIDE_STATUS_STICKY_WEB, stickyWebAmount, temp); + COURTCHANGE_SWAP(SIDE_STATUS_STEELSURGE, steelsurgeAmount, temp); + COURTCHANGE_SWAP(SIDE_STATUS_DAMAGE_NON_TYPES, damageNonTypesTimer, temp); // Change battler IDs of swapped effects. Needed for the correct string when they expire // E.g. "Foe's Reflect wore off!" @@ -8361,6 +8382,9 @@ static void CourtChangeSwapSideStatuses(void) // Track which side originally set the Sticky Web SWAP(sideTimerPlayer->stickyWebBattlerSide, sideTimerOpp->stickyWebBattlerSide, temp); + + // Swap what type set the Gigantamax damage over time effect + SWAP(sideTimerPlayer->damageNonTypesType, sideTimerOpp->damageNonTypesType, temp); } static void HandleScriptMegaPrimalBurst(u32 caseId, u32 battler, u32 type) @@ -8675,7 +8699,7 @@ static void Cmd_various(void) } else { - gBattleMoveDamage = gBattleMons[battler].maxHP / 16; + gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 16; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattleMoveDamage *= -1; @@ -9280,7 +9304,8 @@ static void Cmd_various(void) } else { - if (gBattleMons[gBattlerTarget].ability == gBattleMons[gBattlerAttacker].ability) + if (gBattleMons[gBattlerTarget].ability == gBattleMons[gBattlerAttacker].ability + || IsDynamaxed(gBattlerTarget)) { gBattlescriptCurrInstr = cmd->failInstr; } @@ -9308,9 +9333,9 @@ static void Cmd_various(void) else { if (GetBattlerAbility(gBattlerAttacker) == ABILITY_MEGA_LAUNCHER && gBattleMoves[gCurrentMove].pulseMove) - gBattleMoveDamage = -(gBattleMons[battler].maxHP * 75 / 100); + gBattleMoveDamage = -(GetNonDynamaxMaxHP(battler) * 75 / 100); else - gBattleMoveDamage = -(gBattleMons[battler].maxHP / 2); + gBattleMoveDamage = -(GetNonDynamaxMaxHP(battler) / 2); if (gBattleMoveDamage == 0) gBattleMoveDamage = -1; @@ -9550,7 +9575,10 @@ static void Cmd_various(void) } else { - gCalledMove = gLastUsedMove; + if (IsMaxMove(gLastUsedMove)) + gCalledMove = gBattleStruct->dynamax.lastUsedBaseMove; + else + gCalledMove = gLastUsedMove; gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; gBattlerTarget = GetMoveTarget(gCalledMove, NO_TARGET_OVERRIDE); gBattlescriptCurrInstr = cmd->nextInstr; @@ -9561,7 +9589,7 @@ static void Cmd_various(void) { VARIOUS_ARGS(const u8 *failInstr); u16 move = gLastMoves[gBattlerTarget]; - if (move == MOVE_UNAVAILABLE || gBattleMoves[move].instructBanned) + if (move == MOVE_UNAVAILABLE || gBattleMoves[move].instructBanned || IsDynamaxed(gBattlerTarget)) { gBattlescriptCurrInstr = cmd->failInstr; } @@ -10013,7 +10041,7 @@ static void Cmd_various(void) case VARIOUS_TRY_HEAL_QUARTER_HP: { VARIOUS_ARGS(const u8 *failInstr); - gBattleMoveDamage = gBattleMons[battler].maxHP / 4; + gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 4; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattleMoveDamage *= -1; @@ -10343,7 +10371,7 @@ static void Cmd_various(void) VARIOUS_ARGS(const u8 *failInstr); bool8 atLeastOneStatBoosted = FALSE; - u16 hpFraction = max(1, gBattleMons[gBattlerAttacker].maxHP / 3); + u16 hpFraction = max(1, GetNonDynamaxMaxHP(gBattlerAttacker) / 3); for (i = 1; i < NUM_STATS; i++) { @@ -10765,12 +10793,17 @@ static void Cmd_setprotectlike(void) else if (gCurrentMove == MOVE_OBSTRUCT) { gProtectStructs[gBattlerAttacker].obstructed = TRUE; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PROTECTED_ITSELF; + } + else if (gCurrentMove == MOVE_MAX_GUARD) + { + gProtectStructs[gBattlerAttacker].maxGuarded = TRUE; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PROTECTED_ITSELF; } else if (gCurrentMove == MOVE_SILK_TRAP) { gProtectStructs[gBattlerAttacker].silkTrapped = TRUE; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PROTECTED_ITSELF; } gDisableStructs[gBattlerAttacker].protectUses++; @@ -10885,7 +10918,7 @@ static void Cmd_tryhealhalfhealth(void) if (cmd->battler == BS_ATTACKER) gBattlerTarget = gBattlerAttacker; - gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 2; + gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerTarget) / 2; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattleMoveDamage *= -1; @@ -11020,12 +11053,12 @@ static void Cmd_manipulatedamage(void) case DMG_RECOIL_FROM_MISS: if (B_RECOIL_IF_MISS_DMG >= GEN_5) { - gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 2; + gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; } else if (B_RECOIL_IF_MISS_DMG == GEN_4) { if ((gBattleMons[gBattlerTarget].maxHP / 2) < gBattleMoveDamage) - gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 2; + gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerTarget) / 2; } else { @@ -11038,24 +11071,24 @@ static void Cmd_manipulatedamage(void) gBattleMoveDamage *= 2; break; case DMG_1_8_TARGET_HP: - gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 8; + gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerTarget) / 8; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; break; case DMG_FULL_ATTACKER_HP: - gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP; + gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker); break; case DMG_CURR_ATTACKER_HP: - gBattleMoveDamage = gBattleMons[gBattlerAttacker].hp; + gBattleMoveDamage = GetNonDynamaxHP(gBattlerAttacker); break; case DMG_BIG_ROOT: gBattleMoveDamage = GetDrainedBigRootHp(gBattlerAttacker, gBattleMoveDamage); break; case DMG_1_2_ATTACKER_HP: - gBattleMoveDamage = (gBattleMons[gBattlerAttacker].maxHP + 1) / 2; // Half of Max HP Rounded UP + gBattleMoveDamage = (GetNonDynamaxMaxHP(gBattlerAttacker) + 1) / 2; // Half of Max HP Rounded UP break; case DMG_RECOIL_FROM_IMMUNE: - gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 2; + gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerTarget) / 2; break; } @@ -11237,7 +11270,7 @@ static void Cmd_stockpiletohpheal(void) } else { - gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / (1 << (3 - gDisableStructs[gBattlerAttacker].stockpileCounter)); + gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / (1 << (3 - gDisableStructs[gBattlerAttacker].stockpileCounter)); if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; @@ -12057,6 +12090,15 @@ static void Cmd_tryKO(void) u32 holdEffect = GetBattlerHoldEffect(gBattlerTarget, TRUE); u16 targetAbility = GetBattlerAbility(gBattlerTarget); + // Dynamaxed Pokemon cannot be hit by OHKO moves. + if (IsDynamaxed(gBattlerTarget)) + { + gMoveResultFlags |= MOVE_RESULT_MISSED; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_KO_UNAFFECTED; + gBattlescriptCurrInstr = cmd->failInstr; + return; + } + gPotentialItemEffectBattler = gBattlerTarget; if (holdEffect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < GetBattlerHoldEffectParam(gBattlerTarget)) @@ -12138,7 +12180,7 @@ static void Cmd_damagetohalftargethp(void) { CMD_ARGS(); - gBattleMoveDamage = gBattleMons[gBattlerTarget].hp / 2; + gBattleMoveDamage = GetNonDynamaxHP(gBattlerTarget) / 2; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; @@ -12182,7 +12224,7 @@ static void Cmd_weatherdamage(void) && !(gStatuses3[gBattlerAttacker] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_SAFETY_GOGGLES) { - gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 16; + gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 16; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; } @@ -12195,7 +12237,7 @@ static void Cmd_weatherdamage(void) && !(gStatuses3[gBattlerAttacker] & STATUS3_HEAL_BLOCK)) { gBattlerAbility = gBattlerAttacker; - gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 16; + gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 16; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattleMoveDamage *= -1; @@ -12207,7 +12249,7 @@ static void Cmd_weatherdamage(void) && !(gStatuses3[gBattlerAttacker] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_SAFETY_GOGGLES) { - gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 16; + gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 16; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; } @@ -12385,8 +12427,8 @@ static void Cmd_setsubstitute(void) { CMD_ARGS(); - u32 hp = gBattleMons[gBattlerAttacker].maxHP / 4; - if (gBattleMons[gBattlerAttacker].maxHP / 4 == 0) + u32 hp = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; + if (GetNonDynamaxMaxHP(gBattlerAttacker) / 4 == 0) hp = 1; if (gBattleMons[gBattlerAttacker].hp <= hp) @@ -12396,7 +12438,7 @@ static void Cmd_setsubstitute(void) } else { - gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 4; // one bit value will only work for pokemon which max hp can go to 1020(which is more than possible in games) + gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; // one bit value will only work for pokemon which max hp can go to 1020(which is more than possible in games) if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; @@ -12593,10 +12635,21 @@ static void Cmd_trysetencore(void) s32 i; - for (i = 0; i < MAX_MON_MOVES; i++) + if (IsMaxMove(gLastMoves[gBattlerTarget]) && !IsDynamaxed(gBattlerTarget)) { - if (gBattleMons[gBattlerTarget].moves[i] == gLastMoves[gBattlerTarget]) - break; + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (gBattleMons[gBattlerTarget].moves[i] == gBattleStruct->dynamax.baseMove[gBattlerTarget]) + break; + } + } + else + { + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (gBattleMons[gBattlerTarget].moves[i] == gLastMoves[gBattlerTarget]) + break; + } } if (gLastMoves[gBattlerTarget] == MOVE_NONE @@ -12629,8 +12682,8 @@ static void Cmd_painsplitdmgcalc(void) if (!(DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove))) { - s32 hpDiff = (gBattleMons[gBattlerAttacker].hp + gBattleMons[gBattlerTarget].hp) / 2; - s32 painSplitHp = gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - hpDiff; + s32 hpDiff = (gBattleMons[gBattlerAttacker].hp + GetNonDynamaxHP(gBattlerTarget)) / 2; + s32 painSplitHp = gBattleMoveDamage = GetNonDynamaxHP(gBattlerTarget) - hpDiff; u8 *storeLoc = (void *)(&gBattleScripting.painSplitHp); storeLoc[0] = (painSplitHp); @@ -12873,15 +12926,30 @@ static void Cmd_tryspiteppreduce(void) { s32 i; - for (i = 0; i < MAX_MON_MOVES; i++) + // Get move slot to reduce PP. + if (IsMaxMove(gLastMoves[gBattlerTarget])) { - if (gLastMoves[gBattlerTarget] == gBattleMons[gBattlerTarget].moves[i]) - break; + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (gBattleStruct->dynamax.baseMove[gBattlerTarget] == gBattleMons[gBattlerTarget].moves[i]) + break; + } + } + else + { + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (gLastMoves[gBattlerTarget] == gBattleMons[gBattlerTarget].moves[i]) + break; + } } if (i != MAX_MON_MOVES && gBattleMons[gBattlerTarget].pp[i] > (B_CAN_SPITE_FAIL >= GEN_4 ? 0 : 1)) { s32 ppToDeduct = B_PP_REDUCED_BY_SPITE >= GEN_4 ? 4 : (Random() & 3) + 2; + // G-Max Depletion only deducts 2 PP. + if (IsMaxMove(gCurrentMove) && gBattleMoves[gCurrentMove].argument == MAX_EFFECT_SPITE) + ppToDeduct = 2; if (gBattleMons[gBattlerTarget].pp[i] < ppToDeduct) ppToDeduct = gBattleMons[gBattlerTarget].pp[i]; @@ -13025,7 +13093,7 @@ static void Cmd_cursetarget(void) else { gBattleMons[gBattlerTarget].status2 |= STATUS2_CURSED; - gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 2; + gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; @@ -13191,7 +13259,7 @@ static void Cmd_presentdamagecalculation(void) } else { - gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 4; + gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerTarget) / 4; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattleMoveDamage *= -1; @@ -13357,9 +13425,9 @@ static void Cmd_maxattackhalvehp(void) { CMD_ARGS(const u8 *failInstr); - u32 halfHp = gBattleMons[gBattlerAttacker].maxHP / 2; + u32 halfHp = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; - if (!(gBattleMons[gBattlerAttacker].maxHP / 2)) + if (!(GetNonDynamaxMaxHP(gBattlerAttacker) / 2)) halfHp = 1; // Belly Drum fails if the user's current HP is less than half its maximum, or if the user's Attack is already at +6 (even if the user has Contrary). @@ -13367,7 +13435,7 @@ static void Cmd_maxattackhalvehp(void) && gBattleMons[gBattlerAttacker].hp > halfHp) { gBattleMons[gBattlerAttacker].statStages[STAT_ATK] = MAX_STAT_STAGE; - gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 2; + gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; @@ -13444,6 +13512,13 @@ static void Cmd_rapidspinfree(void) BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_StealthRockFree; } + else if (gSideStatuses[atkSide] & SIDE_STATUS_STEELSURGE) + { + gSideStatuses[atkSide] &= ~SIDE_STATUS_STEELSURGE; + gSideTimers[atkSide].steelsurgeAmount = 0; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_SteelsurgeFree; + } else { gBattlescriptCurrInstr = cmd->nextInstr; @@ -13468,18 +13543,18 @@ static void Cmd_recoverbasedonsunlight(void) if (gCurrentMove == MOVE_SHORE_UP) { if (WEATHER_HAS_EFFECT && gBattleWeather & B_WEATHER_SANDSTORM) - gBattleMoveDamage = 20 * gBattleMons[gBattlerAttacker].maxHP / 30; + gBattleMoveDamage = 20 * GetNonDynamaxMaxHP(gBattlerAttacker) / 30; else - gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 2; + gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; } else { if (!(gBattleWeather & B_WEATHER_ANY) || !WEATHER_HAS_EFFECT || GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_UTILITY_UMBRELLA) - gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 2; + gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; else if (gBattleWeather & B_WEATHER_SUN) - gBattleMoveDamage = 20 * gBattleMons[gBattlerAttacker].maxHP / 30; + gBattleMoveDamage = 20 * GetNonDynamaxMaxHP(gBattlerAttacker) / 30; else // not sunny weather - gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 4; + gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; } if (gBattleMoveDamage == 0) @@ -13765,13 +13840,15 @@ static void Cmd_settorment(void) { CMD_ARGS(const u8 *failInstr); - if (gBattleMons[gBattlerTarget].status2 & STATUS2_TORMENT) + if (gBattleMons[gBattlerTarget].status2 & STATUS2_TORMENT + || IsDynamaxed(gBattlerTarget)) { gBattlescriptCurrInstr = cmd->failInstr; } else { gBattleMons[gBattlerTarget].status2 |= STATUS2_TORMENT; + gDisableStructs[gBattlerTarget].tormentTimer = PERMANENT_TORMENT; // permanent gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -14004,7 +14081,7 @@ static void Cmd_trywish(void) } else { - gBattleMoveDamage = max(1, gBattleMons[gBattlerTarget].maxHP / 2); + gBattleMoveDamage = max(1, GetNonDynamaxMaxHP(gBattlerAttacker) / 2); } gBattleMoveDamage *= -1; @@ -14084,13 +14161,13 @@ static void Cmd_setdamagetohealthdifference(void) { CMD_ARGS(const u8 *failInstr); - if (gBattleMons[gBattlerTarget].hp <= gBattleMons[gBattlerAttacker].hp) + if (GetNonDynamaxHP(gBattlerTarget) <= gBattleMons[gBattlerAttacker].hp) { gBattlescriptCurrInstr = cmd->failInstr; } else { - gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - gBattleMons[gBattlerAttacker].hp; + gBattleMoveDamage = GetNonDynamaxHP(gBattlerTarget) - gBattleMons[gBattlerAttacker].hp; gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -14151,7 +14228,7 @@ static void Cmd_tryswapabilities(void) } else { - if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT || IsDynamaxed(gBattlerTarget)) { gBattlescriptCurrInstr = cmd->failInstr; } @@ -14361,7 +14438,7 @@ static void Cmd_switchoutabilities(void) MarkBattlerForControllerExec(battler); break; case ABILITY_REGENERATOR: - gBattleMoveDamage = gBattleMons[battler].maxHP / 3; + gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 3; gBattleMoveDamage += gBattleMons[battler].hp; if (gBattleMoveDamage > gBattleMons[battler].maxHP) gBattleMoveDamage = gBattleMons[battler].maxHP; diff --git a/src/battle_setup.c b/src/battle_setup.c index 88c239e1814d..1c598c8f8291 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -590,15 +590,12 @@ void BattleSetup_StartLegendaryBattle(void) { default: case SPECIES_GROUDON: - gBattleTypeFlags |= BATTLE_TYPE_GROUDON; CreateBattleStartTask(B_TRANSITION_GROUDON, MUS_VS_KYOGRE_GROUDON); break; case SPECIES_KYOGRE: - gBattleTypeFlags |= BATTLE_TYPE_KYOGRE; CreateBattleStartTask(B_TRANSITION_KYOGRE, MUS_VS_KYOGRE_GROUDON); break; case SPECIES_RAYQUAZA: - gBattleTypeFlags |= BATTLE_TYPE_RAYQUAZA; CreateBattleStartTask(B_TRANSITION_RAYQUAZA, MUS_VS_RAYQUAZA); break; case SPECIES_DEOXYS: @@ -623,7 +620,7 @@ void StartGroudonKyogreBattle(void) { LockPlayerFieldControls(); gMain.savedCallback = CB2_EndScriptedWildBattle; - gBattleTypeFlags = BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_KYOGRE_GROUDON; + gBattleTypeFlags = BATTLE_TYPE_LEGENDARY; if (gGameVersion == VERSION_RUBY) CreateBattleStartTask(B_TRANSITION_ANGLED_WIPES, MUS_VS_KYOGRE_GROUDON); // GROUDON @@ -643,7 +640,7 @@ void StartRegiBattle(void) LockPlayerFieldControls(); gMain.savedCallback = CB2_EndScriptedWildBattle; - gBattleTypeFlags = BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_REGI; + gBattleTypeFlags = BATTLE_TYPE_LEGENDARY; species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES); switch (species) diff --git a/src/battle_util.c b/src/battle_util.c index fa1193728527..9bf844677c8a 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -336,6 +336,13 @@ void HandleAction_UseMove(void) SetTypeBeforeUsingMove(gChosenMove, gBattlerAttacker); GET_MOVE_TYPE(gChosenMove, moveType); + // check max move used + if (gBattleStruct->dynamax.usingMaxMove[gBattlerAttacker]) + { + gCurrentMove = gChosenMove = GetMaxMove(gBattlerAttacker, gCurrentMove); + gBattleStruct->dynamax.activeSplit = gBattleStruct->dynamax.splits[gBattlerAttacker]; + } + // choose target side = BATTLE_OPPOSITE(GetBattlerSide(gBattlerAttacker)); if (IsAffectedByFollowMe(gBattlerAttacker, side, gCurrentMove) @@ -849,6 +856,7 @@ void HandleAction_ActionFinished(void) gBattleCommunication[4] = 0; gBattleScripting.multihitMoveEffect = 0; gBattleResources->battleScriptsStack->size = 0; + gBattleStruct->dynamax.usingMaxMove[gBattlerAttacker] = 0; if (B_RECALC_TURN_AFTER_ACTIONS >= GEN_8 && !afterYouActive) { @@ -1597,15 +1605,18 @@ static bool32 IsBelchPreventingMove(u32 battler, u32 move) return !(gBattleStruct->ateBerry[battler & BIT_SIDE] & gBitTable[gBattlerPartyIndexes[battler]]); } +// Dynamax bypasses all selection prevention except Taunt and Assault Vest. +#define DYNAMAX_BYPASS_CHECK !gBattleStruct->dynamax.playerSelect && !IsDynamaxed(gBattlerAttacker) + u32 TrySetCantSelectMoveBattleScript(u32 battler) { u32 limitations = 0; - u8 moveId = gBattleResources->bufferB[battler][2] & ~(RET_MEGA_EVOLUTION | RET_ULTRA_BURST); + u8 moveId = gBattleResources->bufferB[battler][2] & ~(RET_MEGA_EVOLUTION | RET_ULTRA_BURST | RET_DYNAMAX); u32 move = gBattleMons[battler].moves[moveId]; u32 holdEffect = GetBattlerHoldEffect(battler, TRUE); u16 *choicedMove = &gBattleStruct->choicedMove[battler]; - if (gBattleStruct->zmove.toBeUsed[gBattlerAttacker] == MOVE_NONE && gDisableStructs[battler].disabledMove == move && move != MOVE_NONE) + if (DYNAMAX_BYPASS_CHECK && gBattleStruct->zmove.toBeUsed[gBattlerAttacker] == MOVE_NONE && gDisableStructs[battler].disabledMove == move && move != MOVE_NONE) { gBattleScripting.battler = battler; gCurrentMove = move; @@ -1621,7 +1632,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) } } - if (gBattleStruct->zmove.toBeUsed[gBattlerAttacker] == MOVE_NONE && move == gLastMoves[battler] && move != MOVE_STRUGGLE && (gBattleMons[battler].status2 & STATUS2_TORMENT)) + if (DYNAMAX_BYPASS_CHECK && gBattleStruct->zmove.toBeUsed[gBattlerAttacker] == MOVE_NONE && move == gLastMoves[battler] && move != MOVE_STRUGGLE && (gBattleMons[battler].status2 & STATUS2_TORMENT)) { CancelMultiTurnMoves(battler); if (gBattleTypeFlags & BATTLE_TYPE_PALACE) @@ -1638,7 +1649,10 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) if (gBattleStruct->zmove.toBeUsed[gBattlerAttacker] == MOVE_NONE && gDisableStructs[battler].tauntTimer != 0 && IS_MOVE_STATUS(move)) { - gCurrentMove = move; + if (IsDynamaxed(gBattlerAttacker)) + gCurrentMove = MOVE_MAX_GUARD; + else + gCurrentMove = move; if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { gPalaceSelectionBattleScripts[battler] = BattleScript_SelectingNotAllowedMoveTauntInPalace; @@ -1651,7 +1665,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) } } - if (gBattleStruct->zmove.toBeUsed[gBattlerAttacker] == MOVE_NONE && gDisableStructs[battler].throatChopTimer != 0 && gBattleMoves[move].soundMove) + if (DYNAMAX_BYPASS_CHECK && gBattleStruct->zmove.toBeUsed[gBattlerAttacker] == MOVE_NONE && gDisableStructs[battler].throatChopTimer != 0 && gBattleMoves[move].soundMove) { gCurrentMove = move; if (gBattleTypeFlags & BATTLE_TYPE_PALACE) @@ -1666,7 +1680,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) } } - if (gBattleStruct->zmove.toBeUsed[gBattlerAttacker] == MOVE_NONE && GetImprisonedMovesCount(battler, move)) + if (DYNAMAX_BYPASS_CHECK && gBattleStruct->zmove.toBeUsed[gBattlerAttacker] == MOVE_NONE && GetImprisonedMovesCount(battler, move)) { gCurrentMove = move; if (gBattleTypeFlags & BATTLE_TYPE_PALACE) @@ -1681,7 +1695,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) } } - if (gBattleStruct->zmove.toBeUsed[gBattlerAttacker] == MOVE_NONE && IsGravityPreventingMove(move)) + if (DYNAMAX_BYPASS_CHECK && gBattleStruct->zmove.toBeUsed[gBattlerAttacker] == MOVE_NONE && IsGravityPreventingMove(move)) { gCurrentMove = move; if (gBattleTypeFlags & BATTLE_TYPE_PALACE) @@ -1696,7 +1710,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) } } - if (gBattleStruct->zmove.toBeUsed[gBattlerAttacker] == MOVE_NONE && IsHealBlockPreventingMove(battler, move)) + if (DYNAMAX_BYPASS_CHECK && gBattleStruct->zmove.toBeUsed[gBattlerAttacker] == MOVE_NONE && IsHealBlockPreventingMove(battler, move)) { gCurrentMove = move; if (gBattleTypeFlags & BATTLE_TYPE_PALACE) @@ -1711,7 +1725,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) } } - if (gBattleStruct->zmove.toBeUsed[gBattlerAttacker] == MOVE_NONE && IsBelchPreventingMove(battler, move)) + if (DYNAMAX_BYPASS_CHECK && gBattleStruct->zmove.toBeUsed[gBattlerAttacker] == MOVE_NONE && IsBelchPreventingMove(battler, move)) { gCurrentMove = move; if (gBattleTypeFlags & BATTLE_TYPE_PALACE) @@ -1726,7 +1740,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) } } - if (move == MOVE_STUFF_CHEEKS && ItemId_GetPocket(gBattleMons[battler].item) != POCKET_BERRIES) + if (DYNAMAX_BYPASS_CHECK && move == MOVE_STUFF_CHEEKS && ItemId_GetPocket(gBattleMons[battler].item) != POCKET_BERRIES) { gCurrentMove = move; if (gBattleTypeFlags & BATTLE_TYPE_PALACE) @@ -1758,7 +1772,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) } gPotentialItemEffectBattler = battler; - if (HOLD_EFFECT_CHOICE(holdEffect) && *choicedMove != MOVE_NONE && *choicedMove != MOVE_UNAVAILABLE && *choicedMove != move) + if (DYNAMAX_BYPASS_CHECK && HOLD_EFFECT_CHOICE(holdEffect) && *choicedMove != MOVE_NONE && *choicedMove != MOVE_UNAVAILABLE && *choicedMove != move) { gCurrentMove = *choicedMove; gLastUsedItem = gBattleMons[battler].item; @@ -1775,7 +1789,10 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) } else if (holdEffect == HOLD_EFFECT_ASSAULT_VEST && IS_MOVE_STATUS(move) && move != MOVE_ME_FIRST) { - gCurrentMove = move; + if (IsDynamaxed(gBattlerAttacker)) + gCurrentMove = MOVE_MAX_GUARD; + else + gCurrentMove = move; gLastUsedItem = gBattleMons[battler].item; if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { @@ -1788,7 +1805,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) limitations++; } } - if ((GetBattlerAbility(battler) == ABILITY_GORILLA_TACTICS) && *choicedMove != MOVE_NONE + if (DYNAMAX_BYPASS_CHECK && (GetBattlerAbility(battler) == ABILITY_GORILLA_TACTICS) && *choicedMove != MOVE_NONE && *choicedMove != MOVE_UNAVAILABLE && *choicedMove != move) { gCurrentMove = *choicedMove; @@ -1987,6 +2004,7 @@ enum ENDTURN_SUN, ENDTURN_HAIL, ENDTURN_SNOW, + ENDTURN_DAMAGE_NON_TYPES, ENDTURN_GRAVITY, ENDTURN_WATER_SPORT, ENDTURN_MUD_SPORT, @@ -2366,6 +2384,34 @@ u8 DoFieldEndTurnEffects(void) } gBattleStruct->turnCountersTracker++; break; + case ENDTURN_DAMAGE_NON_TYPES: + while (gBattleStruct->turnSideTracker < 2) + { + side = gBattleStruct->turnSideTracker; + if (gSideStatuses[side] & SIDE_STATUS_DAMAGE_NON_TYPES) + { + if (--gSideTimers[side].damageNonTypesTimer == 0) + { + // There is no in-game message when this side status ends. + gSideStatuses[side] &= ~SIDE_STATUS_DAMAGE_NON_TYPES; + effect++; + } + else + { + ChooseDamageNonTypesString(gSideTimers[side].damageNonTypesType); + BattleScriptExecute(BattleScript_DamageNonTypesContinues); + } + } + gBattleStruct->turnSideTracker++; + if (effect != 0) + break; + } + if (!effect) + { + gBattleStruct->turnCountersTracker++; + gBattleStruct->turnSideTracker = 0; + } + break; case ENDTURN_TRICK_ROOM: if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && --gFieldTimers.trickRoomTimer == 0) { @@ -2528,8 +2574,10 @@ enum ENDTURN_SLOW_START, ENDTURN_PLASMA_FISTS, ENDTURN_CUD_CHEW, + ENDTURN_TORMENT, // supposedly this goes after Taunt, before Encore, but Encore is first right now? ENDTURN_SALT_CURE, ENDTURN_SYRUP_BOMB, + ENDTURN_DYNAMAX, ENDTURN_BATTLER_COUNT }; @@ -2576,7 +2624,7 @@ u8 DoBattlerEndTurnEffects(void) && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK) && gBattleMons[battler].hp != 0) { - gBattleMoveDamage = GetDrainedBigRootHp(battler, gBattleMons[battler].maxHP / 16); + gBattleMoveDamage = GetDrainedBigRootHp(battler, GetNonDynamaxMaxHP(battler) / 16); BattleScriptExecute(BattleScript_IngrainTurnHeal); effect++; } @@ -2588,7 +2636,7 @@ u8 DoBattlerEndTurnEffects(void) && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK) && gBattleMons[battler].hp != 0) { - gBattleMoveDamage = GetDrainedBigRootHp(battler, gBattleMons[battler].maxHP / 16); + gBattleMoveDamage = GetDrainedBigRootHp(battler, GetNonDynamaxMaxHP(battler) / 16); BattleScriptExecute(BattleScript_AquaRingHeal); effect++; } @@ -2622,7 +2670,7 @@ u8 DoBattlerEndTurnEffects(void) MAGIC_GUARD_CHECK; gBattlerTarget = gStatuses3[battler] & STATUS3_LEECHSEED_BATTLER; // Notice gBattlerTarget is actually the HP receiver. - gBattleMoveDamage = gBattleMons[battler].maxHP / 8; + gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 8; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattleScripting.animArg1 = gBattlerTarget; @@ -2642,7 +2690,7 @@ u8 DoBattlerEndTurnEffects(void) { if (!BATTLER_MAX_HP(battler) && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK)) { - gBattleMoveDamage = gBattleMons[battler].maxHP / 8; + gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 8; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattleMoveDamage *= -1; @@ -2652,7 +2700,7 @@ u8 DoBattlerEndTurnEffects(void) } else { - gBattleMoveDamage = gBattleMons[battler].maxHP / 8; + gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 8; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; BattleScriptExecute(BattleScript_PoisonTurnDmg); @@ -2671,7 +2719,7 @@ u8 DoBattlerEndTurnEffects(void) { if (!BATTLER_MAX_HP(battler) && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK)) { - gBattleMoveDamage = gBattleMons[battler].maxHP / 8; + gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 8; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattleMoveDamage *= -1; @@ -2681,7 +2729,7 @@ u8 DoBattlerEndTurnEffects(void) } else { - gBattleMoveDamage = gBattleMons[battler].maxHP / 16; + gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 16; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; if ((gBattleMons[battler].status1 & STATUS1_TOXIC_COUNTER) != STATUS1_TOXIC_TURN(15)) // not 16 turns @@ -2698,7 +2746,7 @@ u8 DoBattlerEndTurnEffects(void) && gBattleMons[battler].hp != 0) { MAGIC_GUARD_CHECK; - gBattleMoveDamage = gBattleMons[battler].maxHP / (B_BURN_DAMAGE >= GEN_7 ? 16 : 8); + gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / (B_BURN_DAMAGE >= GEN_7 ? 16 : 8); if (ability == ABILITY_HEATPROOF) { if (gBattleMoveDamage > (gBattleMoveDamage / 2) + 1) // Record ability if the burn takes less damage than it normally would. @@ -2717,7 +2765,7 @@ u8 DoBattlerEndTurnEffects(void) && gBattleMons[battler].hp != 0) { MAGIC_GUARD_CHECK; - gBattleMoveDamage = gBattleMons[battler].maxHP / (B_BURN_DAMAGE >= GEN_7 ? 16 : 8); + gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / (B_BURN_DAMAGE >= GEN_7 ? 16 : 8); if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; BattleScriptExecute(BattleScript_FrostbiteTurnDmg); @@ -2734,7 +2782,7 @@ u8 DoBattlerEndTurnEffects(void) // persist even after the affected Pokemon has been awakened by Shed Skin. if (gBattleMons[battler].status1 & STATUS1_SLEEP) { - gBattleMoveDamage = gBattleMons[battler].maxHP / 4; + gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 4; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; BattleScriptExecute(BattleScript_NightmareTurnDmg); @@ -2752,7 +2800,7 @@ u8 DoBattlerEndTurnEffects(void) && gBattleMons[battler].hp != 0) { MAGIC_GUARD_CHECK; - gBattleMoveDamage = gBattleMons[battler].maxHP / 4; + gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 4; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; BattleScriptExecute(BattleScript_CurseTurnDmg); @@ -2772,9 +2820,9 @@ u8 DoBattlerEndTurnEffects(void) PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleStruct->wrappedMove[battler]); gBattlescriptCurrInstr = BattleScript_WrapTurnDmg; if (GetBattlerHoldEffect(gBattleStruct->wrappedBy[battler], TRUE) == HOLD_EFFECT_BINDING_BAND) - gBattleMoveDamage = gBattleMons[battler].maxHP / (B_BINDING_DAMAGE >= GEN_6 ? 6 : 8); + gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / (B_BINDING_DAMAGE >= GEN_6 ? 6 : 8); else - gBattleMoveDamage = gBattleMons[battler].maxHP / (B_BINDING_DAMAGE >= GEN_6 ? 8 : 16); + gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / (B_BINDING_DAMAGE >= GEN_6 ? 8 : 16); if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; @@ -3112,6 +3160,27 @@ u8 DoBattlerEndTurnEffects(void) } gBattleStruct->turnEffectsTracker++; break; + case ENDTURN_TORMENT: + if (gDisableStructs[battler].tormentTimer != PERMANENT_TORMENT + && --gDisableStructs[battler].tormentTimer == 0) + { + gBattleMons[battler].status2 &= ~STATUS2_TORMENT; + BattleScriptExecute(BattleScript_TormentEnds); + effect++; + } + gBattleStruct->turnEffectsTracker++; + break; + case ENDTURN_DYNAMAX: + if (IsDynamaxed(battler) + && --gBattleStruct->dynamax.dynamaxTurns[battler] == 0) + { + gBattleScripting.battler = battler; + UndoDynamax(battler); + BattleScriptExecute(BattleScript_DynamaxEnds); + effect++; + } + gBattleStruct->turnEffectsTracker++; + break; case ENDTURN_BATTLER_COUNT: // done gBattleStruct->turnEffectsTracker = 0; gBattleStruct->turnEffectsBattlerId++; @@ -3681,7 +3750,7 @@ u8 AtkCanceller_UnableToUseMove(u32 moveType) if (moveType == TYPE_FIRE) { gProtectStructs[gBattlerAttacker].powderSelfDmg = TRUE; - gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 4; + gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; gBattlescriptCurrInstr = BattleScript_MoveUsedPowder; effect = 1; } @@ -4763,7 +4832,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK)) { BattleScriptPushCursorAndCallback(BattleScript_RainDishActivates); - gBattleMoveDamage = gBattleMons[battler].maxHP / (gLastUsedAbility == ABILITY_RAIN_DISH ? 16 : 8); + gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / (gLastUsedAbility == ABILITY_RAIN_DISH ? 16 : 8); if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattleMoveDamage *= -1; @@ -4861,7 +4930,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (IsBattlerWeatherAffected(battler, B_WEATHER_SUN)) { BattleScriptPushCursorAndCallback(BattleScript_SolarPowerActivates); - gBattleMoveDamage = gBattleMons[battler].maxHP / 8; + gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 8; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; effect++; @@ -5064,7 +5133,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 else gBattlescriptCurrInstr = BattleScript_MoveHPDrain_PPLoss; - gBattleMoveDamage = gBattleMons[battler].maxHP / 4; + gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 4; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattleMoveDamage *= -1; @@ -5212,6 +5281,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && IsBattlerAlive(gBattlerAttacker) && !IsAbilityOnSide(gBattlerAttacker, ABILITY_AROMA_VEIL) && gBattleMons[gBattlerAttacker].pp[gChosenMovePos] != 0 + && !IsDynamaxed(gBattlerAttacker) // TODO: Max Moves don't make contact, useless? && (Random() % 3) == 0) { gDisableStructs[gBattlerAttacker].disabledMove = gChosenMove; @@ -5262,7 +5332,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && IsBattlerAlive(gBattlerAttacker) && TARGET_TURN_DAMAGED - && IsMoveMakingContact(move, gBattlerAttacker)) + && IsMoveMakingContact(move, gBattlerAttacker) + && !IsDynamaxed(gBattlerTarget)) { switch (gBattleMons[gBattlerAttacker].ability) { @@ -5351,7 +5422,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && TARGET_TURN_DAMAGED && IsMoveMakingContact(move, gBattlerAttacker)) { - gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / (B_ROUGH_SKIN_DMG >= GEN_4 ? 8 : 16); + gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / (B_ROUGH_SKIN_DMG >= GEN_4 ? 8 : 16); if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); @@ -5375,7 +5446,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } else { - gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 4; + gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; BattleScriptPushCursor(); @@ -5579,7 +5650,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gBattleMons[gBattlerTarget].species = SPECIES_CRAMORANT; if (GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) { - gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 4; + gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; } @@ -5592,7 +5663,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gBattleMons[gBattlerTarget].species = SPECIES_CRAMORANT; if (GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) { - gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 4; + gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; } @@ -6415,7 +6486,7 @@ static u8 HealConfuseBerry(u32 battler, u32 itemId, u32 flavorId, bool32 end2) { PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, flavorId); - gBattleMoveDamage = gBattleMons[battler].maxHP / GetBattlerItemHoldEffectParam(battler, itemId); + gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / GetBattlerItemHoldEffectParam(battler, itemId); if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattleMoveDamage *= -1; @@ -6672,7 +6743,7 @@ static u8 ItemHealHp(u32 battler, u32 itemId, bool32 end2, bool32 percentHeal) && HasEnoughHpToEatBerry(battler, 2, itemId)) { if (percentHeal) - gBattleMoveDamage = (gBattleMons[battler].maxHP * GetBattlerItemHoldEffectParam(battler, itemId) / 100) * -1; + gBattleMoveDamage = (GetNonDynamaxMaxHP(battler) * GetBattlerItemHoldEffectParam(battler, itemId) / 100) * -1; else gBattleMoveDamage = GetBattlerItemHoldEffectParam(battler, itemId) * -1; @@ -7352,7 +7423,7 @@ u8 ItemBattleEffects(u8 caseID, u32 battler, bool32 moveTurn) } else if (GetBattlerAbility(battler) != ABILITY_MAGIC_GUARD && !moveTurn) { - gBattleMoveDamage = gBattleMons[battler].maxHP / 8; + gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 8; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; BattleScriptExecute(BattleScript_ItemHurtEnd2); @@ -7366,7 +7437,7 @@ u8 ItemBattleEffects(u8 caseID, u32 battler, bool32 moveTurn) if (gBattleMons[battler].hp < gBattleMons[battler].maxHP && !moveTurn && (B_HEAL_BLOCKING < GEN_5 || !(gStatuses3[battler] & STATUS3_HEAL_BLOCK))) { - gBattleMoveDamage = gBattleMons[battler].maxHP / 16; + gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 16; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattleMoveDamage *= -1; @@ -7674,7 +7745,7 @@ u8 ItemBattleEffects(u8 caseID, u32 battler, bool32 moveTurn) && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD && gSpecialStatuses[gBattlerAttacker].damagedMons) { - gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 10; + gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 10; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; effect = ITEM_HP_CHANGE; @@ -7720,7 +7791,7 @@ u8 ItemBattleEffects(u8 caseID, u32 battler, bool32 moveTurn) && IsBattlerAlive(gBattlerAttacker) && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) { - gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 6; + gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 6; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; effect = ITEM_HP_CHANGE; @@ -7794,7 +7865,7 @@ u8 ItemBattleEffects(u8 caseID, u32 battler, bool32 moveTurn) && IS_MOVE_PHYSICAL(gCurrentMove) && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) { - gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 8; + gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 8; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; if (GetBattlerAbility(battler) == ABILITY_RIPEN) @@ -7814,7 +7885,7 @@ u8 ItemBattleEffects(u8 caseID, u32 battler, bool32 moveTurn) && IS_MOVE_SPECIAL(gCurrentMove) && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) { - gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 8; + gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 8; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; if (GetBattlerAbility(battler) == ABILITY_RIPEN) @@ -7879,7 +7950,7 @@ u8 ItemBattleEffects(u8 caseID, u32 battler, bool32 moveTurn) case HOLD_EFFECT_STICKY_BARB: // Not an orb per se, but similar effect, and needs to NOT activate with pickpocket if (battlerAbility != ABILITY_MAGIC_GUARD) { - gBattleMoveDamage = gBattleMons[battler].maxHP / 8; + gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 8; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; BattleScriptExecute(BattleScript_ItemHurtEnd2); @@ -8224,21 +8295,24 @@ bool32 IsBattlerProtected(u32 battler, u32 move) return FALSE; } - if (move == MOVE_TEATIME) - { + // Z-Moves and Max Moves bypass protection (except Max Guard). + if ((IsMaxMove(move) || gBattleStruct->zmove.active) + && (!gProtectStructs[battler].maxGuarded + || gBattleMoves[move].argument == MAX_EFFECT_BYPASS_PROTECT)) return FALSE; - } + + // Max Guard is silly about the moves it blocks, including Teatime. + if (gProtectStructs[battler].maxGuarded && IsMoveBlockedByMaxGuard(move)) + return TRUE; - // Z-Moves and Max Moves bypass protection - if (gBattleStruct->zmove.active) - { + if (move == MOVE_TEATIME) return FALSE; - } // Protective Pads doesn't stop Unseen Fist from bypassing Protect effects, so IsMoveMakingContact() isn't used here. // This means extra logic is needed to handle Shell Side Arm. if (GetBattlerAbility(gBattlerAttacker) == ABILITY_UNSEEN_FIST - && (gBattleMoves[move].makesContact || (gBattleMoves[move].effect == EFFECT_SHELL_SIDE_ARM && gBattleStruct->swapDamageCategory))) + && (gBattleMoves[move].makesContact || (gBattleMoves[move].effect == EFFECT_SHELL_SIDE_ARM && gBattleStruct->swapDamageCategory)) + && !gProtectStructs[battler].maxGuarded) // Max Guard cannot be bypassed by Unseen Fist return FALSE; else if (gBattleMoves[move].ignoresProtect) return FALSE; @@ -8257,6 +8331,8 @@ bool32 IsBattlerProtected(u32 battler, u32 move) return TRUE; else if (gProtectStructs[battler].kingsShielded && gBattleMoves[move].power != 0) return TRUE; + else if (gProtectStructs[battler].maxGuarded) + return TRUE; else if (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_QUICK_GUARD && GetChosenMovePriority(gBattlerAttacker) > 0) return TRUE; @@ -8704,10 +8780,8 @@ static inline u32 CalcMoveBasePower(u32 move, u32 battlerAtk, u32 battlerDef, u3 basePower = uq4_12_multiply(basePower, UQ_4_12(1.5)); break; case EFFECT_DYNAMAX_DOUBLE_DMG: - #ifdef B_DYNAMAX if (IsDynamaxed(battlerDef)) basePower *= 2; - #endif break; case EFFECT_HIDDEN_POWER: { @@ -8749,6 +8823,9 @@ static inline u32 CalcMoveBasePower(u32 move, u32 battlerAtk, u32 battlerDef, u3 if (IsBattlerTerrainAffected(battlerAtk, STATUS_FIELD_ELECTRIC_TERRAIN)) basePower = uq4_12_multiply(basePower, UQ_4_12(1.5)); break; + case EFFECT_MAX_MOVE: + basePower = GetMaxMovePower(gBattleMons[battlerAtk].moves[gBattleStruct->chosenMovePositions[battlerAtk]]); + break; } // Move-specific base power changes @@ -9304,11 +9381,11 @@ static inline u32 CalcAttackStat(u32 move, u32 battlerAtk, u32 battlerDef, u32 m modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); break; case HOLD_EFFECT_CHOICE_BAND: - if (IS_MOVE_PHYSICAL(move)) + if (IS_MOVE_PHYSICAL(move) && !IsDynamaxed(battlerAtk)) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); break; case HOLD_EFFECT_CHOICE_SPECS: - if (IS_MOVE_SPECIAL(move)) + if (IS_MOVE_SPECIAL(move) && !IsDynamaxed(battlerAtk)) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); break; } @@ -9554,9 +9631,9 @@ static inline uq4_12_t GetCriticalModifier(bool32 isCrit) return UQ_4_12(1.0); } -static inline uq4_12_t GetZMoveAgainstProtectionModifier(u32 battlerDef) +static inline uq4_12_t GetZMaxMoveAgainstProtectionModifier(u32 battlerDef, u32 move) { - if (gBattleStruct->zmove.active && IS_BATTLER_PROTECTED(battlerDef)) + if ((gBattleStruct->zmove.active || IsMaxMove(move)) && IS_BATTLER_PROTECTED(battlerDef)) return UQ_4_12(0.25); return UQ_4_12(1.0); } @@ -9799,7 +9876,7 @@ static inline s32 DoMoveDamageCalcVars(u32 move, u32 battlerAtk, u32 battlerDef, DAMAGE_APPLY_MODIFIER(GetSameTypeAttackBonusModifier(battlerAtk, moveType, move, abilityAtk)); DAMAGE_APPLY_MODIFIER(typeEffectivenessModifier); DAMAGE_APPLY_MODIFIER(GetBurnOrFrostBiteModifier(battlerAtk, move, abilityAtk)); - DAMAGE_APPLY_MODIFIER(GetZMoveAgainstProtectionModifier(battlerDef)); + DAMAGE_APPLY_MODIFIER(GetZMaxMoveAgainstProtectionModifier(battlerDef, move)); DAMAGE_APPLY_MODIFIER(GetOtherModifiers(move, moveType, battlerAtk, battlerDef, isCrit, typeEffectivenessModifier, updateFlags, abilityAtk, abilityDef, holdEffectAtk, holdEffectDef)); if (dmg == 0) @@ -10332,6 +10409,10 @@ u16 GetBattleFormChangeTargetSpecies(u32 battler, u16 method) } } break; + case FORM_CHANGE_BATTLE_GIGANTAMAX: + // TODO: check Gigantamax factor + targetSpecies = formChanges[i].targetSpecies; + break; case FORM_CHANGE_BATTLE_WEATHER: // Check if there is a required ability and if the battler's ability does not match it // or is suppressed. If so, revert to the no weather form. @@ -10376,6 +10457,9 @@ bool32 CanBattlerFormChange(u32 battler, u16 method) return TRUE; else if (IsBattlerPrimalReverted(battler) && (method == FORM_CHANGE_END_BATTLE)) return TRUE; + // Gigantamaxed Pokemon should revert upon fainting, switching, or ending the battle. + else if (IsGigantamaxed(battler) && (method == FORM_CHANGE_FAINT || method == FORM_CHANGE_BATTLE_SWITCH || method == FORM_CHANGE_END_BATTLE)) + return TRUE; return DoesSpeciesHaveFormChangeMethod(gBattleMons[battler].species, method); } @@ -10394,7 +10478,7 @@ bool32 TryBattleFormChange(u32 battler, u16 method) targetSpecies = GetFormChangeTargetSpecies(&party[monId], method, 0); if (targetSpecies != SPECIES_NONE) { - // Saves the original species on the first form change for the player. + // Saves the original species on the first form change. if (gBattleStruct->changedSpecies[side][monId] == SPECIES_NONE) gBattleStruct->changedSpecies[side][monId] = gBattleMons[battler].species; @@ -10416,6 +10500,10 @@ bool32 TryBattleFormChange(u32 battler, u16 method) else if (IsBattlerPrimalReverted(battler) && (method == FORM_CHANGE_END_BATTLE)) restoreSpecies = TRUE; + // Gigantamax Pokemon have their forms reverted after fainting, switching, or ending the battle. + else if (IsGigantamaxed(battler) && (method == FORM_CHANGE_FAINT || method == FORM_CHANGE_BATTLE_SWITCH || method == FORM_CHANGE_END_BATTLE)) + restoreSpecies = TRUE; + if (restoreSpecies) { // Reverts the original species @@ -10559,6 +10647,8 @@ u8 GetBattleMoveSplit(u32 moveId) { if (gBattleStruct != NULL && gBattleStruct->zmove.active && !IS_MOVE_STATUS(moveId)) return gBattleStruct->zmove.activeSplit; + if (gBattleStruct != NULL && IsMaxMove(moveId)) // TODO: Might be buggy depending on when this is called. + return gBattleStruct->dynamax.activeSplit; if (gBattleStruct != NULL && gBattleStruct->swapDamageCategory) // Photon Geyser, Shell Side Arm, Light That Burns the Sky return SPLIT_PHYSICAL; if (B_PHYSICAL_SPECIAL_SPLIT >= GEN_4) @@ -11015,6 +11105,9 @@ bool32 CanTargetBattler(u32 battlerAtk, u32 battlerDef, u16 move) && GetBattlerSide(battlerAtk) == GetBattlerSide(battlerDef) && gStatuses3[battlerAtk] & STATUS3_HEAL_BLOCK) return FALSE; // Pokémon affected by Heal Block cannot target allies with Pollen Puff + if ((IsDynamaxed(battlerAtk) || gBattleStruct->dynamax.playerSelect) + && GetBattlerSide(battlerAtk) == GetBattlerSide(battlerDef)) + return FALSE; return TRUE; } @@ -11051,6 +11144,8 @@ void CopyMonAbilityAndTypesToBattleMon(u32 battler, struct Pokemon *mon) void RecalcBattlerStats(u32 battler, struct Pokemon *mon) { CalculateMonStats(mon); + if (IsDynamaxed(battler) && gChosenActionByBattler[battler] != B_ACTION_SWITCH) + ApplyDynamaxHPMultiplier(battler, mon); CopyMonLevelAndBaseStatsToBattleMon(battler, mon); CopyMonAbilityAndTypesToBattleMon(battler, mon); } diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index bdc46d23272e..896d4a530afc 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -1,4 +1,4 @@ -const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = +const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = { [MOVE_NONE] = { @@ -14331,4 +14331,737 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = .split = SPLIT_PHYSICAL, .zMoveEffect = 0, }, + + [MOVE_MAX_GUARD] = + { + .effect = EFFECT_PROTECT, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 4, + .split = SPLIT_STATUS, + .protectionMove = TRUE, + }, + + [MOVE_MAX_FLARE] = + { + .effect = EFFECT_MAX_MOVE, + .power = 1, + .type = TYPE_FIRE, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_SUN, + }, + + [MOVE_MAX_FLUTTERBY] = + { + .effect = EFFECT_MAX_MOVE, + .power = 1, + .type = TYPE_BUG, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_LOWER_SP_ATK, + }, + + [MOVE_MAX_LIGHTNING] = + { + .effect = EFFECT_MAX_MOVE, + .power = 1, + .type = TYPE_ELECTRIC, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_ELECTRIC_TERRAIN, + }, + + [MOVE_MAX_STRIKE] = + { + .effect = EFFECT_MAX_MOVE, + .power = 1, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_LOWER_SPEED, + }, + + [MOVE_MAX_KNUCKLE] = + { + .effect = EFFECT_MAX_MOVE, + .power = 1, + .type = TYPE_FIGHTING, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_RAISE_TEAM_ATTACK, + }, + + [MOVE_MAX_PHANTASM] = + { + .effect = EFFECT_MAX_MOVE, + .power = 1, + .type = TYPE_GHOST, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_LOWER_DEFENSE, + }, + + [MOVE_MAX_HAILSTORM] = + { + .effect = EFFECT_MAX_MOVE, + .power = 1, + .type = TYPE_ICE, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_HAIL, + }, + + [MOVE_MAX_OOZE] = + { + .effect = EFFECT_MAX_MOVE, + .power = 1, + .type = TYPE_POISON, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_RAISE_TEAM_SP_ATK, + }, + + [MOVE_MAX_GEYSER] = + { + .effect = EFFECT_MAX_MOVE, + .power = 1, + .type = TYPE_WATER, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_RAIN, + }, + + [MOVE_MAX_AIRSTREAM] = + { + .effect = EFFECT_MAX_MOVE, + .power = 1, + .type = TYPE_FLYING, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_RAISE_TEAM_SPEED, + }, + + [MOVE_MAX_STARFALL] = + { + .effect = EFFECT_MAX_MOVE, + .power = 1, + .type = TYPE_FAIRY, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_MISTY_TERRAIN, + }, + + [MOVE_MAX_WYRMWIND] = + { + .effect = EFFECT_MAX_MOVE, + .power = 1, + .type = TYPE_DRAGON, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_LOWER_ATTACK, + }, + + [MOVE_MAX_MINDSTORM] = + { + .effect = EFFECT_MAX_MOVE, + .power = 1, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_PSYCHIC_TERRAIN, + }, + + [MOVE_MAX_ROCKFALL] = + { + .effect = EFFECT_MAX_MOVE, + .power = 1, + .type = TYPE_ROCK, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_SANDSTORM, + }, + + [MOVE_MAX_QUAKE] = + { + .effect = EFFECT_MAX_MOVE, + .power = 1, + .type = TYPE_GROUND, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_RAISE_TEAM_SP_DEF, + }, + + [MOVE_MAX_DARKNESS] = + { + .effect = EFFECT_MAX_MOVE, + .power = 1, + .type = TYPE_DARK, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_LOWER_SP_DEF, + }, + + [MOVE_MAX_OVERGROWTH] = + { + .effect = EFFECT_MAX_MOVE, + .power = 10, + .type = TYPE_GRASS, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_GRASSY_TERRAIN, + }, + + [MOVE_MAX_STEELSPIKE] = + { + .effect = EFFECT_MAX_MOVE, + .power = 10, + .type = TYPE_STEEL, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_RAISE_TEAM_DEFENSE, + }, + + [MOVE_G_MAX_VINE_LASH] = + { //ANIM TODO + .effect = EFFECT_MAX_MOVE, + .power = 10, + .type = TYPE_GRASS, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_VINE_LASH, + }, + + [MOVE_G_MAX_WILDFIRE] = + { + .effect = EFFECT_MAX_MOVE, + .power = 10, + .type = TYPE_FIRE, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_WILDFIRE, + }, + + [MOVE_G_MAX_CANNONADE] = + { //ANIM TODO + .effect = EFFECT_MAX_MOVE, + .power = 10, + .type = TYPE_WATER, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_CANNONADE, + }, + + [MOVE_G_MAX_BEFUDDLE] = + { + .effect = EFFECT_MAX_MOVE, + .power = 10, + .type = TYPE_BUG, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_EFFECT_SPORE_FOES, + }, + + [MOVE_G_MAX_VOLT_CRASH] = + { + .effect = EFFECT_MAX_MOVE, + .power = 10, + .type = TYPE_ELECTRIC, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_PARALYZE_FOES, + }, + + [MOVE_G_MAX_GOLD_RUSH] = + { + .effect = EFFECT_MAX_MOVE, + .power = 10, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_CONFUSE_FOES_PAY_DAY, + }, + + [MOVE_G_MAX_CHI_STRIKE] = + { + .effect = EFFECT_MAX_MOVE, + .power = 10, + .type = TYPE_FIGHTING, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_CRIT_PLUS, + }, + + [MOVE_G_MAX_TERROR] = + { + .effect = EFFECT_MAX_MOVE, + .power = 10, + .type = TYPE_GHOST, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_MEAN_LOOK, + }, + + [MOVE_G_MAX_FOAM_BURST] = + { + .effect = EFFECT_MAX_MOVE, + .power = 10, + .type = TYPE_WATER, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_LOWER_SPEED_2_FOES, + }, + + [MOVE_G_MAX_RESONANCE] = + { + .effect = EFFECT_MAX_MOVE, + .power = 10, + .type = TYPE_ICE, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_AURORA_VEIL, + }, + + [MOVE_G_MAX_CUDDLE] = + { + .effect = EFFECT_MAX_MOVE, + .power = 10, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_INFATUATE_FOES, + }, + + [MOVE_G_MAX_REPLENISH] = + { + .effect = EFFECT_MAX_MOVE, + .power = 10, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_RECYCLE_BERRIES, + }, + + [MOVE_G_MAX_MALODOR] = + { + .effect = EFFECT_MAX_MOVE, + .power = 10, + .type = TYPE_POISON, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_POISON_FOES, + }, + + [MOVE_G_MAX_MELTDOWN] = + { + .effect = EFFECT_MAX_MOVE, + .power = 10, + .type = TYPE_STEEL, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_TORMENT_FOES, + }, + + [MOVE_G_MAX_DRUM_SOLO] = + { //ANIM TODO + .effect = EFFECT_MAX_MOVE, + .power = 10, + .type = TYPE_GRASS, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_FIXED_POWER, //EFFECT TODO + .ignoresTargetAbility = TRUE, + }, + + [MOVE_G_MAX_FIREBALL] = + { //ANIM TODO + .effect = EFFECT_MAX_MOVE, + .power = 10, + .type = TYPE_FIRE, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_FIXED_POWER, //EFFECT TODO + .ignoresTargetAbility = TRUE, + }, + + [MOVE_G_MAX_HYDROSNIPE] = + { //ANIM TODO + .effect = EFFECT_MAX_MOVE, + .power = 10, + .type = TYPE_WATER, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_FIXED_POWER, //EFFECT TODO + .ignoresTargetAbility = TRUE, + }, + + [MOVE_G_MAX_WIND_RAGE] = + { + .effect = EFFECT_MAX_MOVE, + .power = 10, + .type = TYPE_FLYING, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_DEFOG, + }, + + [MOVE_G_MAX_GRAVITAS] = + { + .effect = EFFECT_MAX_MOVE, + .power = 10, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_GRAVITY, + }, + + [MOVE_G_MAX_STONESURGE] = + { + .effect = EFFECT_MAX_MOVE, + .power = 10, + .type = TYPE_WATER, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_STEALTH_ROCK, + }, + + [MOVE_G_MAX_VOLCALITH] = + { + .effect = EFFECT_MAX_MOVE, + .power = 10, + .type = TYPE_ROCK, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_VOLCALITH, + }, + + [MOVE_G_MAX_TARTNESS] = + { + .effect = EFFECT_MAX_MOVE, + .power = 10, + .type = TYPE_GRASS, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_LOWER_EVASIVENESS_FOES, + }, + + [MOVE_G_MAX_SWEETNESS] = + { + .effect = EFFECT_MAX_MOVE, + .power = 10, + .type = TYPE_GRASS, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_AROMATHERAPY, + }, + + [MOVE_G_MAX_SANDBLAST] = + { + .effect = EFFECT_MAX_MOVE, + .power = 10, + .type = TYPE_GROUND, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_SANDBLAST_FOES, + }, + + [MOVE_G_MAX_STUN_SHOCK] = + { + .effect = EFFECT_MAX_MOVE, + .power = 10, + .type = TYPE_ELECTRIC, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_POISON_PARALYZE_FOES, + }, + + [MOVE_G_MAX_CENTIFERNO] = + { + .effect = EFFECT_MAX_MOVE, + .power = 10, + .type = TYPE_FIRE, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_FIRE_SPIN_FOES, + }, + + [MOVE_G_MAX_SMITE] = + { + .effect = EFFECT_MAX_MOVE, + .power = 10, + .type = TYPE_FAIRY, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_CONFUSE_FOES, + }, + + + [MOVE_G_MAX_SNOOZE] = + { + .effect = EFFECT_MAX_MOVE, + .power = 10, + .type = TYPE_DARK, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_YAWN_FOE, + }, + + [MOVE_G_MAX_FINALE] = + { + .effect = EFFECT_MAX_MOVE, + .power = 10, + .type = TYPE_FAIRY, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_HEAL_TEAM, + }, + + [MOVE_G_MAX_STEELSURGE] = + { + .effect = EFFECT_MAX_MOVE, + .power = 10, + .type = TYPE_STEEL, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_STEELSURGE, + }, + + [MOVE_G_MAX_DEPLETION] = + { + .effect = EFFECT_MAX_MOVE, + .power = 10, + .type = TYPE_DRAGON, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_SPITE, + }, + + [MOVE_G_MAX_ONE_BLOW] = + { + .effect = EFFECT_MAX_MOVE, + .power = 10, + .type = TYPE_DARK, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_BYPASS_PROTECT, //EFFECT TODO + }, + + [MOVE_G_MAX_RAPID_FLOW] = + { //ANIM TODO + .effect = EFFECT_MAX_MOVE, + .power = 10, + .type = TYPE_WATER, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .split = SPLIT_PHYSICAL, + .argument = MAX_EFFECT_BYPASS_PROTECT, //EFFECT TODO + }, + }; diff --git a/src/data/graphics/pokemon.h b/src/data/graphics/pokemon.h index 9ff1c5656d46..3574e0244623 100644 --- a/src/data/graphics/pokemon.h +++ b/src/data/graphics/pokemon.h @@ -1289,6 +1289,39 @@ const u32 gMonFrontPic_CalyrexIceRider[] = INCBIN_U32("graphics/pokemon/calyrex/ const u32 gMonFrontPic_CalyrexShadowRider[] = INCBIN_U32("graphics/pokemon/calyrex/shadow_rider/front.4bpp.lz"); const u32 gMonFrontPic_EnamorusTherian[] = INCBIN_U32("graphics/pokemon/enamorus/therian/front.4bpp.lz"); const u32 gMonFrontPic_BasculegionFemale[] = INCBIN_U32("graphics/pokemon/basculegion/female/front.4bpp.lz"); +const u32 gMonFrontPic_VenusaurGigantamax[] = INCBIN_U32("graphics/pokemon/venusaur/gigantamax/front.4bpp.lz"); +const u32 gMonFrontPic_CharizardGigantamax[] = INCBIN_U32("graphics/pokemon/charizard/gigantamax/front.4bpp.lz"); +const u32 gMonFrontPic_BlastoiseGigantamax[] = INCBIN_U32("graphics/pokemon/blastoise/gigantamax/front.4bpp.lz"); +const u32 gMonFrontPic_ButterfreeGigantamax[] = INCBIN_U32("graphics/pokemon/butterfree/gigantamax/front.4bpp.lz"); +const u32 gMonFrontPic_PikachuGigantamax[] = INCBIN_U32("graphics/pokemon/pikachu/gigantamax/front.4bpp.lz"); +const u32 gMonFrontPic_MeowthGigantamax[] = INCBIN_U32("graphics/pokemon/meowth/gigantamax/front.4bpp.lz"); +const u32 gMonFrontPic_MachampGigantamax[] = INCBIN_U32("graphics/pokemon/machamp/gigantamax/front.4bpp.lz"); +const u32 gMonFrontPic_GengarGigantamax[] = INCBIN_U32("graphics/pokemon/gengar/gigantamax/front.4bpp.lz"); +const u32 gMonFrontPic_KinglerGigantamax[] = INCBIN_U32("graphics/pokemon/kingler/gigantamax/front.4bpp.lz"); +const u32 gMonFrontPic_LaprasGigantamax[] = INCBIN_U32("graphics/pokemon/lapras/gigantamax/front.4bpp.lz"); +const u32 gMonFrontPic_EeveeGigantamax[] = INCBIN_U32("graphics/pokemon/eevee/gigantamax/front.4bpp.lz"); +const u32 gMonFrontPic_SnorlaxGigantamax[] = INCBIN_U32("graphics/pokemon/snorlax/gigantamax/front.4bpp.lz"); +const u32 gMonFrontPic_GarbodorGigantamax[] = INCBIN_U32("graphics/pokemon/garbodor/gigantamax/front.4bpp.lz"); +const u32 gMonFrontPic_MelmetalGigantamax[] = INCBIN_U32("graphics/pokemon/melmetal/gigantamax/front.4bpp.lz"); +const u32 gMonFrontPic_RillaboomGigantamax[] = INCBIN_U32("graphics/pokemon/rillaboom/gigantamax/front.4bpp.lz"); +const u32 gMonFrontPic_CinderaceGigantamax[] = INCBIN_U32("graphics/pokemon/cinderace/gigantamax/front.4bpp.lz"); +const u32 gMonFrontPic_InteleonGigantamax[] = INCBIN_U32("graphics/pokemon/inteleon/gigantamax/front.4bpp.lz"); +const u32 gMonFrontPic_CorviknightGigantamax[] = INCBIN_U32("graphics/pokemon/corviknight/gigantamax/front.4bpp.lz"); +const u32 gMonFrontPic_OrbeetleGigantamax[] = INCBIN_U32("graphics/pokemon/orbeetle/gigantamax/front.4bpp.lz"); +const u32 gMonFrontPic_DrednawGigantamax[] = INCBIN_U32("graphics/pokemon/drednaw/gigantamax/front.4bpp.lz"); +const u32 gMonFrontPic_CoalossalGigantamax[] = INCBIN_U32("graphics/pokemon/coalossal/gigantamax/front.4bpp.lz"); +const u32 gMonFrontPic_FlappleGigantamax[] = INCBIN_U32("graphics/pokemon/flapple/gigantamax/front.4bpp.lz"); +const u32 gMonFrontPic_AppletunGigantamax[] = INCBIN_U32("graphics/pokemon/appletun/gigantamax/front.4bpp.lz"); +const u32 gMonFrontPic_SandacondaGigantamax[] = INCBIN_U32("graphics/pokemon/sandaconda/gigantamax/front.4bpp.lz"); +const u32 gMonFrontPic_ToxtricityGigantamax[] = INCBIN_U32("graphics/pokemon/toxtricity/gigantamax/front.4bpp.lz"); +const u32 gMonFrontPic_CentiskorchGigantamax[] = INCBIN_U32("graphics/pokemon/centiskorch/gigantamax/front.4bpp.lz"); +const u32 gMonFrontPic_HattereneGigantamax[] = INCBIN_U32("graphics/pokemon/hatterene/gigantamax/front.4bpp.lz"); +const u32 gMonFrontPic_GrimmsnarlGigantamax[] = INCBIN_U32("graphics/pokemon/grimmsnarl/gigantamax/front.4bpp.lz"); +const u32 gMonFrontPic_AlcremieGigantamax[] = INCBIN_U32("graphics/pokemon/alcremie/gigantamax/front.4bpp.lz"); +const u32 gMonFrontPic_CopperajahGigantamax[] = INCBIN_U32("graphics/pokemon/copperajah/gigantamax/front.4bpp.lz"); +const u32 gMonFrontPic_DuraludonGigantamax[] = INCBIN_U32("graphics/pokemon/duraludon/gigantamax/front.4bpp.lz"); +const u32 gMonFrontPic_UrshifuGigantamax[] = INCBIN_U32("graphics/pokemon/urshifu/single_strike_style_gigantamax/front.4bpp.lz"); +const u32 gMonFrontPic_UrshifuRapidStrikeGigantamax[] = INCBIN_U32("graphics/pokemon/urshifu/rapid_strike_style_gigantamax/front.4bpp.lz"); #endif const u32 gMonFrontPic_Egg[] = INCBIN_U32("graphics/pokemon/egg/anim_front.4bpp.lz"); @@ -2574,6 +2607,39 @@ const u32 gMonBackPic_CalyrexIceRider[] = INCBIN_U32("graphics/pokemon/calyrex/i const u32 gMonBackPic_CalyrexShadowRider[] = INCBIN_U32("graphics/pokemon/calyrex/shadow_rider/back.4bpp.lz"); const u32 gMonBackPic_EnamorusTherian[] = INCBIN_U32("graphics/pokemon/enamorus/therian/back.4bpp.lz"); const u32 gMonBackPic_BasculegionFemale[] = INCBIN_U32("graphics/pokemon/basculegion/female/back.4bpp.lz"); +const u32 gMonBackPic_VenusaurGigantamax[] = INCBIN_U32("graphics/pokemon/venusaur/gigantamax/back.4bpp.lz"); +const u32 gMonBackPic_CharizardGigantamax[] = INCBIN_U32("graphics/pokemon/charizard/gigantamax/back.4bpp.lz"); +const u32 gMonBackPic_BlastoiseGigantamax[] = INCBIN_U32("graphics/pokemon/blastoise/gigantamax/back.4bpp.lz"); +const u32 gMonBackPic_ButterfreeGigantamax[] = INCBIN_U32("graphics/pokemon/butterfree/gigantamax/back.4bpp.lz"); +const u32 gMonBackPic_PikachuGigantamax[] = INCBIN_U32("graphics/pokemon/pikachu/gigantamax/back.4bpp.lz"); +const u32 gMonBackPic_MeowthGigantamax[] = INCBIN_U32("graphics/pokemon/meowth/gigantamax/back.4bpp.lz"); +const u32 gMonBackPic_MachampGigantamax[] = INCBIN_U32("graphics/pokemon/machamp/gigantamax/back.4bpp.lz"); +const u32 gMonBackPic_GengarGigantamax[] = INCBIN_U32("graphics/pokemon/gengar/gigantamax/back.4bpp.lz"); +const u32 gMonBackPic_KinglerGigantamax[] = INCBIN_U32("graphics/pokemon/kingler/gigantamax/back.4bpp.lz"); +const u32 gMonBackPic_LaprasGigantamax[] = INCBIN_U32("graphics/pokemon/lapras/gigantamax/back.4bpp.lz"); +const u32 gMonBackPic_EeveeGigantamax[] = INCBIN_U32("graphics/pokemon/eevee/gigantamax/back.4bpp.lz"); +const u32 gMonBackPic_SnorlaxGigantamax[] = INCBIN_U32("graphics/pokemon/snorlax/gigantamax/back.4bpp.lz"); +const u32 gMonBackPic_GarbodorGigantamax[] = INCBIN_U32("graphics/pokemon/garbodor/gigantamax/back.4bpp.lz"); +const u32 gMonBackPic_MelmetalGigantamax[] = INCBIN_U32("graphics/pokemon/melmetal/gigantamax/back.4bpp.lz"); +const u32 gMonBackPic_RillaboomGigantamax[] = INCBIN_U32("graphics/pokemon/rillaboom/gigantamax/back.4bpp.lz"); +const u32 gMonBackPic_CinderaceGigantamax[] = INCBIN_U32("graphics/pokemon/cinderace/gigantamax/back.4bpp.lz"); +const u32 gMonBackPic_InteleonGigantamax[] = INCBIN_U32("graphics/pokemon/inteleon/gigantamax/back.4bpp.lz"); +const u32 gMonBackPic_CorviknightGigantamax[] = INCBIN_U32("graphics/pokemon/corviknight/gigantamax/back.4bpp.lz"); +const u32 gMonBackPic_OrbeetleGigantamax[] = INCBIN_U32("graphics/pokemon/orbeetle/gigantamax/back.4bpp.lz"); +const u32 gMonBackPic_DrednawGigantamax[] = INCBIN_U32("graphics/pokemon/drednaw/gigantamax/back.4bpp.lz"); +const u32 gMonBackPic_CoalossalGigantamax[] = INCBIN_U32("graphics/pokemon/coalossal/gigantamax/back.4bpp.lz"); +const u32 gMonBackPic_FlappleGigantamax[] = INCBIN_U32("graphics/pokemon/flapple/gigantamax/back.4bpp.lz"); +const u32 gMonBackPic_AppletunGigantamax[] = INCBIN_U32("graphics/pokemon/appletun/gigantamax/back.4bpp.lz"); +const u32 gMonBackPic_SandacondaGigantamax[] = INCBIN_U32("graphics/pokemon/sandaconda/gigantamax/back.4bpp.lz"); +const u32 gMonBackPic_ToxtricityGigantamax[] = INCBIN_U32("graphics/pokemon/toxtricity/gigantamax/back.4bpp.lz"); +const u32 gMonBackPic_CentiskorchGigantamax[] = INCBIN_U32("graphics/pokemon/centiskorch/gigantamax/back.4bpp.lz"); +const u32 gMonBackPic_HattereneGigantamax[] = INCBIN_U32("graphics/pokemon/hatterene/gigantamax/back.4bpp.lz"); +const u32 gMonBackPic_GrimmsnarlGigantamax[] = INCBIN_U32("graphics/pokemon/grimmsnarl/gigantamax/back.4bpp.lz"); +const u32 gMonBackPic_AlcremieGigantamax[] = INCBIN_U32("graphics/pokemon/alcremie/gigantamax/back.4bpp.lz"); +const u32 gMonBackPic_CopperajahGigantamax[] = INCBIN_U32("graphics/pokemon/copperajah/gigantamax/back.4bpp.lz"); +const u32 gMonBackPic_DuraludonGigantamax[] = INCBIN_U32("graphics/pokemon/duraludon/gigantamax/back.4bpp.lz"); +const u32 gMonBackPic_UrshifuGigantamax[] = INCBIN_U32("graphics/pokemon/urshifu/single_strike_style_gigantamax/back.4bpp.lz"); +const u32 gMonBackPic_UrshifuRapidStrikeGigantamax[] = INCBIN_U32("graphics/pokemon/urshifu/rapid_strike_style_gigantamax/back.4bpp.lz"); #endif const u32 gMonPalette_CircledQuestionMark[] = INCBIN_U32("graphics/pokemon/question_mark/circled/normal.gbapal.lz"); @@ -3806,6 +3872,39 @@ const u32 gMonPalette_CalyrexIceRider[] = INCBIN_U32("graphics/pokemon/calyrex/i const u32 gMonPalette_CalyrexShadowRider[] = INCBIN_U32("graphics/pokemon/calyrex/shadow_rider/normal.gbapal.lz"); const u32 gMonPalette_EnamorusTherian[] = INCBIN_U32("graphics/pokemon/enamorus/therian/normal.gbapal.lz"); const u32 gMonPalette_BasculegionFemale[] = INCBIN_U32("graphics/pokemon/basculegion/female/normal.gbapal.lz"); +const u32 gMonPalette_VenusaurGigantamax[] = INCBIN_U32("graphics/pokemon/venusaur/gigantamax/normal.gbapal.lz"); +const u32 gMonPalette_CharizardGigantamax[] = INCBIN_U32("graphics/pokemon/charizard/gigantamax/normal.gbapal.lz"); +const u32 gMonPalette_BlastoiseGigantamax[] = INCBIN_U32("graphics/pokemon/blastoise/gigantamax/normal.gbapal.lz"); +const u32 gMonPalette_ButterfreeGigantamax[] = INCBIN_U32("graphics/pokemon/butterfree/gigantamax/normal.gbapal.lz"); +const u32 gMonPalette_PikachuGigantamax[] = INCBIN_U32("graphics/pokemon/pikachu/gigantamax/normal.gbapal.lz"); +const u32 gMonPalette_MeowthGigantamax[] = INCBIN_U32("graphics/pokemon/meowth/gigantamax/normal.gbapal.lz"); +const u32 gMonPalette_MachampGigantamax[] = INCBIN_U32("graphics/pokemon/machamp/gigantamax/normal.gbapal.lz"); +const u32 gMonPalette_GengarGigantamax[] = INCBIN_U32("graphics/pokemon/gengar/gigantamax/normal.gbapal.lz"); +const u32 gMonPalette_KinglerGigantamax[] = INCBIN_U32("graphics/pokemon/kingler/gigantamax/normal.gbapal.lz"); +const u32 gMonPalette_LaprasGigantamax[] = INCBIN_U32("graphics/pokemon/lapras/gigantamax/normal.gbapal.lz"); +const u32 gMonPalette_EeveeGigantamax[] = INCBIN_U32("graphics/pokemon/eevee/gigantamax/normal.gbapal.lz"); +const u32 gMonPalette_SnorlaxGigantamax[] = INCBIN_U32("graphics/pokemon/snorlax/gigantamax/normal.gbapal.lz"); +const u32 gMonPalette_GarbodorGigantamax[] = INCBIN_U32("graphics/pokemon/garbodor/gigantamax/normal.gbapal.lz"); +const u32 gMonPalette_MelmetalGigantamax[] = INCBIN_U32("graphics/pokemon/melmetal/gigantamax/normal.gbapal.lz"); +const u32 gMonPalette_RillaboomGigantamax[] = INCBIN_U32("graphics/pokemon/rillaboom/gigantamax/normal.gbapal.lz"); +const u32 gMonPalette_CinderaceGigantamax[] = INCBIN_U32("graphics/pokemon/cinderace/gigantamax/normal.gbapal.lz"); +const u32 gMonPalette_InteleonGigantamax[] = INCBIN_U32("graphics/pokemon/inteleon/gigantamax/normal.gbapal.lz"); +const u32 gMonPalette_CorviknightGigantamax[] = INCBIN_U32("graphics/pokemon/corviknight/gigantamax/normal.gbapal.lz"); +const u32 gMonPalette_OrbeetleGigantamax[] = INCBIN_U32("graphics/pokemon/orbeetle/gigantamax/normal.gbapal.lz"); +const u32 gMonPalette_DrednawGigantamax[] = INCBIN_U32("graphics/pokemon/drednaw/gigantamax/normal.gbapal.lz"); +const u32 gMonPalette_CoalossalGigantamax[] = INCBIN_U32("graphics/pokemon/coalossal/gigantamax/normal.gbapal.lz"); +const u32 gMonPalette_FlappleGigantamax[] = INCBIN_U32("graphics/pokemon/flapple/gigantamax/normal.gbapal.lz"); +const u32 gMonPalette_AppletunGigantamax[] = INCBIN_U32("graphics/pokemon/appletun/gigantamax/normal.gbapal.lz"); +const u32 gMonPalette_SandacondaGigantamax[] = INCBIN_U32("graphics/pokemon/sandaconda/gigantamax/normal.gbapal.lz"); +const u32 gMonPalette_ToxtricityGigantamax[] = INCBIN_U32("graphics/pokemon/toxtricity/gigantamax/normal.gbapal.lz"); +const u32 gMonPalette_CentiskorchGigantamax[] = INCBIN_U32("graphics/pokemon/centiskorch/gigantamax/normal.gbapal.lz"); +const u32 gMonPalette_HattereneGigantamax[] = INCBIN_U32("graphics/pokemon/hatterene/gigantamax/normal.gbapal.lz"); +const u32 gMonPalette_GrimmsnarlGigantamax[] = INCBIN_U32("graphics/pokemon/grimmsnarl/gigantamax/normal.gbapal.lz"); +const u32 gMonPalette_AlcremieGigantamax[] = INCBIN_U32("graphics/pokemon/alcremie/gigantamax/normal.gbapal.lz"); +const u32 gMonPalette_CopperajahGigantamax[] = INCBIN_U32("graphics/pokemon/copperajah/gigantamax/normal.gbapal.lz"); +const u32 gMonPalette_DuraludonGigantamax[] = INCBIN_U32("graphics/pokemon/duraludon/gigantamax/normal.gbapal.lz"); +const u32 gMonPalette_UrshifuGigantamax[] = INCBIN_U32("graphics/pokemon/urshifu/single_strike_style_gigantamax/normal.gbapal.lz"); +const u32 gMonPalette_UrshifuRapidStrikeGigantamax[] = INCBIN_U32("graphics/pokemon/urshifu/rapid_strike_style_gigantamax/normal.gbapal.lz"); #endif const u32 gMonPalette_Egg[] = INCBIN_U32("graphics/pokemon/egg/normal.gbapal.lz"); @@ -5033,6 +5132,39 @@ const u32 gMonShinyPalette_CalyrexIceRider[] = INCBIN_U32("graphics/pokemon/caly const u32 gMonShinyPalette_CalyrexShadowRider[] = INCBIN_U32("graphics/pokemon/calyrex/shadow_rider/shiny.gbapal.lz"); const u32 gMonShinyPalette_EnamorusTherian[] = INCBIN_U32("graphics/pokemon/enamorus/therian/shiny.gbapal.lz"); const u32 gMonShinyPalette_BasculegionFemale[] = INCBIN_U32("graphics/pokemon/basculegion/female/shiny.gbapal.lz"); +const u32 gMonShinyPalette_VenusaurGigantamax[] = INCBIN_U32("graphics/pokemon/venusaur/gigantamax/shiny.gbapal.lz"); +const u32 gMonShinyPalette_CharizardGigantamax[] = INCBIN_U32("graphics/pokemon/charizard/gigantamax/shiny.gbapal.lz"); +const u32 gMonShinyPalette_BlastoiseGigantamax[] = INCBIN_U32("graphics/pokemon/blastoise/gigantamax/shiny.gbapal.lz"); +const u32 gMonShinyPalette_ButterfreeGigantamax[] = INCBIN_U32("graphics/pokemon/butterfree/gigantamax/shiny.gbapal.lz"); +const u32 gMonShinyPalette_PikachuGigantamax[] = INCBIN_U32("graphics/pokemon/pikachu/gigantamax/shiny.gbapal.lz"); +const u32 gMonShinyPalette_MeowthGigantamax[] = INCBIN_U32("graphics/pokemon/meowth/gigantamax/shiny.gbapal.lz"); +const u32 gMonShinyPalette_MachampGigantamax[] = INCBIN_U32("graphics/pokemon/machamp/gigantamax/shiny.gbapal.lz"); +const u32 gMonShinyPalette_GengarGigantamax[] = INCBIN_U32("graphics/pokemon/gengar/gigantamax/shiny.gbapal.lz"); +const u32 gMonShinyPalette_KinglerGigantamax[] = INCBIN_U32("graphics/pokemon/kingler/gigantamax/shiny.gbapal.lz"); +const u32 gMonShinyPalette_LaprasGigantamax[] = INCBIN_U32("graphics/pokemon/lapras/gigantamax/shiny.gbapal.lz"); +const u32 gMonShinyPalette_EeveeGigantamax[] = INCBIN_U32("graphics/pokemon/eevee/gigantamax/shiny.gbapal.lz"); +const u32 gMonShinyPalette_SnorlaxGigantamax[] = INCBIN_U32("graphics/pokemon/snorlax/gigantamax/shiny.gbapal.lz"); +const u32 gMonShinyPalette_GarbodorGigantamax[] = INCBIN_U32("graphics/pokemon/garbodor/gigantamax/shiny.gbapal.lz"); +const u32 gMonShinyPalette_MelmetalGigantamax[] = INCBIN_U32("graphics/pokemon/melmetal/gigantamax/shiny.gbapal.lz"); +const u32 gMonShinyPalette_RillaboomGigantamax[] = INCBIN_U32("graphics/pokemon/rillaboom/gigantamax/shiny.gbapal.lz"); +const u32 gMonShinyPalette_CinderaceGigantamax[] = INCBIN_U32("graphics/pokemon/cinderace/gigantamax/shiny.gbapal.lz"); +const u32 gMonShinyPalette_InteleonGigantamax[] = INCBIN_U32("graphics/pokemon/inteleon/gigantamax/shiny.gbapal.lz"); +const u32 gMonShinyPalette_CorviknightGigantamax[] = INCBIN_U32("graphics/pokemon/corviknight/gigantamax/shiny.gbapal.lz"); +const u32 gMonShinyPalette_OrbeetleGigantamax[] = INCBIN_U32("graphics/pokemon/orbeetle/gigantamax/shiny.gbapal.lz"); +const u32 gMonShinyPalette_DrednawGigantamax[] = INCBIN_U32("graphics/pokemon/drednaw/gigantamax/shiny.gbapal.lz"); +const u32 gMonShinyPalette_CoalossalGigantamax[] = INCBIN_U32("graphics/pokemon/coalossal/gigantamax/shiny.gbapal.lz"); +const u32 gMonShinyPalette_FlappleGigantamax[] = INCBIN_U32("graphics/pokemon/flapple/gigantamax/shiny.gbapal.lz"); +const u32 gMonShinyPalette_AppletunGigantamax[] = INCBIN_U32("graphics/pokemon/appletun/gigantamax/shiny.gbapal.lz"); +const u32 gMonShinyPalette_SandacondaGigantamax[] = INCBIN_U32("graphics/pokemon/sandaconda/gigantamax/shiny.gbapal.lz"); +const u32 gMonShinyPalette_ToxtricityGigantamax[] = INCBIN_U32("graphics/pokemon/toxtricity/gigantamax/shiny.gbapal.lz"); +const u32 gMonShinyPalette_CentiskorchGigantamax[] = INCBIN_U32("graphics/pokemon/centiskorch/gigantamax/shiny.gbapal.lz"); +const u32 gMonShinyPalette_HattereneGigantamax[] = INCBIN_U32("graphics/pokemon/hatterene/gigantamax/shiny.gbapal.lz"); +const u32 gMonShinyPalette_GrimmsnarlGigantamax[] = INCBIN_U32("graphics/pokemon/grimmsnarl/gigantamax/shiny.gbapal.lz"); +const u32 gMonShinyPalette_AlcremieGigantamax[] = INCBIN_U32("graphics/pokemon/alcremie/gigantamax/shiny.gbapal.lz"); +const u32 gMonShinyPalette_CopperajahGigantamax[] = INCBIN_U32("graphics/pokemon/copperajah/gigantamax/shiny.gbapal.lz"); +const u32 gMonShinyPalette_DuraludonGigantamax[] = INCBIN_U32("graphics/pokemon/duraludon/gigantamax/shiny.gbapal.lz"); +const u32 gMonShinyPalette_UrshifuGigantamax[] = INCBIN_U32("graphics/pokemon/urshifu/single_strike_style_gigantamax/shiny.gbapal.lz"); +const u32 gMonShinyPalette_UrshifuRapidStrikeGigantamax[] = INCBIN_U32("graphics/pokemon/urshifu/rapid_strike_style_gigantamax/shiny.gbapal.lz"); #endif const u8 gMonIcon_QuestionMark[] = INCBIN_U8("graphics/pokemon/question_mark/icon.4bpp"); @@ -6254,6 +6386,39 @@ const u8 gMonIcon_CalyrexIceRider[] = INCBIN_U8("graphics/pokemon/calyrex/ice_ri const u8 gMonIcon_CalyrexShadowRider[] = INCBIN_U8("graphics/pokemon/calyrex/shadow_rider/icon.4bpp"); const u8 gMonIcon_EnamorusTherian[] = INCBIN_U8("graphics/pokemon/enamorus/therian/icon.4bpp"); const u8 gMonIcon_BasculegionFemale[] = INCBIN_U8("graphics/pokemon/basculegion/female/icon.4bpp"); +const u8 gMonIcon_VenusaurGigantamax[] = INCBIN_U8("graphics/pokemon/venusaur/gigantamax/icon.4bpp"); +const u8 gMonIcon_CharizardGigantamax[] = INCBIN_U8("graphics/pokemon/charizard/gigantamax/icon.4bpp"); +const u8 gMonIcon_BlastoiseGigantamax[] = INCBIN_U8("graphics/pokemon/blastoise/gigantamax/icon.4bpp"); +const u8 gMonIcon_ButterfreeGigantamax[] = INCBIN_U8("graphics/pokemon/butterfree/gigantamax/icon.4bpp"); +const u8 gMonIcon_PikachuGigantamax[] = INCBIN_U8("graphics/pokemon/pikachu/gigantamax/icon.4bpp"); +const u8 gMonIcon_MeowthGigantamax[] = INCBIN_U8("graphics/pokemon/meowth/gigantamax/icon.4bpp"); +const u8 gMonIcon_MachampGigantamax[] = INCBIN_U8("graphics/pokemon/machamp/gigantamax/icon.4bpp"); +const u8 gMonIcon_GengarGigantamax[] = INCBIN_U8("graphics/pokemon/gengar/gigantamax/icon.4bpp"); +const u8 gMonIcon_KinglerGigantamax[] = INCBIN_U8("graphics/pokemon/kingler/gigantamax/icon.4bpp"); +const u8 gMonIcon_LaprasGigantamax[] = INCBIN_U8("graphics/pokemon/lapras/gigantamax/icon.4bpp"); +const u8 gMonIcon_EeveeGigantamax[] = INCBIN_U8("graphics/pokemon/eevee/gigantamax/icon.4bpp"); +const u8 gMonIcon_SnorlaxGigantamax[] = INCBIN_U8("graphics/pokemon/snorlax/gigantamax/icon.4bpp"); +const u8 gMonIcon_GarbodorGigantamax[] = INCBIN_U8("graphics/pokemon/garbodor/gigantamax/icon.4bpp"); +const u8 gMonIcon_MelmetalGigantamax[] = INCBIN_U8("graphics/pokemon/melmetal/gigantamax/icon.4bpp"); +const u8 gMonIcon_RillaboomGigantamax[] = INCBIN_U8("graphics/pokemon/rillaboom/gigantamax/icon.4bpp"); +const u8 gMonIcon_CinderaceGigantamax[] = INCBIN_U8("graphics/pokemon/cinderace/gigantamax/icon.4bpp"); +const u8 gMonIcon_InteleonGigantamax[] = INCBIN_U8("graphics/pokemon/inteleon/gigantamax/icon.4bpp"); +const u8 gMonIcon_CorviknightGigantamax[] = INCBIN_U8("graphics/pokemon/corviknight/gigantamax/icon.4bpp"); +const u8 gMonIcon_OrbeetleGigantamax[] = INCBIN_U8("graphics/pokemon/orbeetle/gigantamax/icon.4bpp"); +const u8 gMonIcon_DrednawGigantamax[] = INCBIN_U8("graphics/pokemon/drednaw/gigantamax/icon.4bpp"); +const u8 gMonIcon_CoalossalGigantamax[] = INCBIN_U8("graphics/pokemon/coalossal/gigantamax/icon.4bpp"); +const u8 gMonIcon_FlappleGigantamax[] = INCBIN_U8("graphics/pokemon/flapple/gigantamax/icon.4bpp"); +const u8 gMonIcon_AppletunGigantamax[] = INCBIN_U8("graphics/pokemon/appletun/gigantamax/icon.4bpp"); +const u8 gMonIcon_SandacondaGigantamax[] = INCBIN_U8("graphics/pokemon/sandaconda/gigantamax/icon.4bpp"); +const u8 gMonIcon_ToxtricityGigantamax[] = INCBIN_U8("graphics/pokemon/toxtricity/gigantamax/icon.4bpp"); +const u8 gMonIcon_CentiskorchGigantamax[] = INCBIN_U8("graphics/pokemon/centiskorch/gigantamax/icon.4bpp"); +const u8 gMonIcon_HattereneGigantamax[] = INCBIN_U8("graphics/pokemon/hatterene/gigantamax/icon.4bpp"); +const u8 gMonIcon_GrimmsnarlGigantamax[] = INCBIN_U8("graphics/pokemon/grimmsnarl/gigantamax/icon.4bpp"); +const u8 gMonIcon_AlcremieGigantamax[] = INCBIN_U8("graphics/pokemon/alcremie/gigantamax/icon.4bpp"); +const u8 gMonIcon_CopperajahGigantamax[] = INCBIN_U8("graphics/pokemon/copperajah/gigantamax/icon.4bpp"); +const u8 gMonIcon_DuraludonGigantamax[] = INCBIN_U8("graphics/pokemon/duraludon/gigantamax/icon.4bpp"); +const u8 gMonIcon_UrshifuGigantamax[] = INCBIN_U8("graphics/pokemon/urshifu/single_strike_style_gigantamax/icon.4bpp"); +const u8 gMonIcon_UrshifuRapidStrikeGigantamax[] = INCBIN_U8("graphics/pokemon/urshifu/rapid_strike_style_gigantamax/icon.4bpp"); #endif const u8 gMonIcon_Egg[] = INCBIN_U8("graphics/pokemon/egg/icon.4bpp"); diff --git a/src/data/pokemon/form_change_table_pointers.h b/src/data/pokemon/form_change_table_pointers.h index 9f75ee3e2714..b9d3bc0d9193 100644 --- a/src/data/pokemon/form_change_table_pointers.h +++ b/src/data/pokemon/form_change_table_pointers.h @@ -2,29 +2,49 @@ const struct FormChange *const gFormChangeTablePointers[NUM_SPECIES] = { [SPECIES_VENUSAUR] = sVenusaurFormChangeTable, [SPECIES_VENUSAUR_MEGA] = sVenusaurFormChangeTable, + [SPECIES_VENUSAUR_GIGANTAMAX] = sVenusaurFormChangeTable, [SPECIES_CHARIZARD] = sCharizardFormChangeTable, [SPECIES_CHARIZARD_MEGA_X] = sCharizardFormChangeTable, [SPECIES_CHARIZARD_MEGA_Y] = sCharizardFormChangeTable, + [SPECIES_CHARIZARD_GIGANTAMAX] = sCharizardFormChangeTable, [SPECIES_BLASTOISE] = sBlastoiseFormChangeTable, [SPECIES_BLASTOISE_MEGA] = sBlastoiseFormChangeTable, + [SPECIES_BLASTOISE_GIGANTAMAX] = sBlastoiseFormChangeTable, + [SPECIES_BUTTERFREE] = sButterfreeFormChangeTable, + [SPECIES_BUTTERFREE_GIGANTAMAX] = sButterfreeFormChangeTable, [SPECIES_BEEDRILL] = sBeedrillFormChangeTable, [SPECIES_BEEDRILL_MEGA] = sBeedrillFormChangeTable, [SPECIES_PIDGEOT] = sPidgeotFormChangeTable, [SPECIES_PIDGEOT_MEGA] = sPidgeotFormChangeTable, + [SPECIES_PIKACHU] = sPikachuFormChangeTable, + [SPECIES_PIKACHU_GIGANTAMAX] = sPikachuFormChangeTable, + [SPECIES_MEOWTH] = sMeowthFormChangeTable, + [SPECIES_MEOWTH_GIGANTAMAX] = sMeowthFormChangeTable, [SPECIES_ALAKAZAM] = sAlakazamFormChangeTable, [SPECIES_ALAKAZAM_MEGA] = sAlakazamFormChangeTable, + [SPECIES_MACHAMP] = sMachampFormChangeTable, + [SPECIES_MACHAMP_GIGANTAMAX] = sMachampFormChangeTable, [SPECIES_SLOWBRO] = sSlowbroFormChangeTable, [SPECIES_SLOWBRO_MEGA] = sSlowbroFormChangeTable, [SPECIES_GENGAR] = sGengarFormChangeTable, [SPECIES_GENGAR_MEGA] = sGengarFormChangeTable, + [SPECIES_GENGAR_GIGANTAMAX] = sGengarFormChangeTable, + [SPECIES_KINGLER] = sKinglerFormChangeTable, + [SPECIES_KINGLER_GIGANTAMAX] = sKinglerFormChangeTable, [SPECIES_KANGASKHAN] = sKangaskhanFormChangeTable, [SPECIES_KANGASKHAN_MEGA] = sKangaskhanFormChangeTable, [SPECIES_PINSIR] = sPinsirFormChangeTable, [SPECIES_PINSIR_MEGA] = sPinsirFormChangeTable, [SPECIES_GYARADOS] = sGyaradosFormChangeTable, [SPECIES_GYARADOS_MEGA] = sGyaradosFormChangeTable, + [SPECIES_LAPRAS] = sLaprasFormChangeTable, + [SPECIES_LAPRAS_GIGANTAMAX] = sLaprasFormChangeTable, + [SPECIES_EEVEE] = sEeveeFormChangeTable, + [SPECIES_EEVEE_GIGANTAMAX] = sEeveeFormChangeTable, [SPECIES_AERODACTYL] = sAerodactylFormChangeTable, [SPECIES_AERODACTYL_MEGA] = sAerodactylFormChangeTable, + [SPECIES_SNORLAX] = sSnorlaxFormChangeTable, + [SPECIES_SNORLAX_GIGANTAMAX] = sSnorlaxFormChangeTable, [SPECIES_MEWTWO] = sMewtwoFormChangeTable, [SPECIES_MEWTWO_MEGA_X] = sMewtwoFormChangeTable, [SPECIES_MEWTWO_MEGA_Y] = sMewtwoFormChangeTable, @@ -138,6 +158,8 @@ const struct FormChange *const gFormChangeTablePointers[NUM_SPECIES] = [SPECIES_DARMANITAN_ZEN_MODE] = sDarmanitanFormChangeTable, [SPECIES_DARMANITAN_GALARIAN] = sDarmanitanGalarianFormChangeTable, [SPECIES_DARMANITAN_ZEN_MODE_GALARIAN] = sDarmanitanGalarianFormChangeTable, + [SPECIES_GARBODOR] = sGarbodorFormChangeTable, + [SPECIES_GARBODOR_GIGANTAMAX] = sGarbodorFormChangeTable, [SPECIES_TORNADUS] = sTornadusFormChangeTable, [SPECIES_TORNADUS_THERIAN] = sTornadusFormChangeTable, [SPECIES_THUNDURUS] = sThundurusFormChangeTable, @@ -212,19 +234,59 @@ const struct FormChange *const gFormChangeTablePointers[NUM_SPECIES] = [SPECIES_MINIOR_CORE_YELLOW] = sMiniorYellowFormChangeTable, [SPECIES_NECROZMA_DUSK_MANE] = sNecrozmaDuskManeFormChangeTable, [SPECIES_NECROZMA_DAWN_WINGS] = sNecrozmaDawnWingsFormChangeTable, + [SPECIES_MELMETAL] = sMelmetalFormChangeTable, + [SPECIES_MELMETAL_GIGANTAMAX] = sMelmetalFormChangeTable, #endif #if P_GEN_8_POKEMON == TRUE + [SPECIES_RILLABOOM] = sRillaboomFormChangeTable, + [SPECIES_RILLABOOM_GIGANTAMAX] = sRillaboomFormChangeTable, + [SPECIES_CINDERACE] = sCinderaceFormChangeTable, + [SPECIES_CINDERACE_GIGANTAMAX] = sCinderaceFormChangeTable, + [SPECIES_INTELEON] = sInteleonFormChangeTable, + [SPECIES_INTELEON_GIGANTAMAX] = sInteleonFormChangeTable, + [SPECIES_CORVIKNIGHT] = sCorviknightFormChangeTable, + [SPECIES_CORVIKNIGHT_GIGANTAMAX] = sCorviknightFormChangeTable, + [SPECIES_ORBEETLE] = sOrbeetleFormChangeTable, + [SPECIES_ORBEETLE_GIGANTAMAX] = sOrbeetleFormChangeTable, + [SPECIES_DREDNAW] = sDrednawFormChangeTable, + [SPECIES_DREDNAW_GIGANTAMAX] = sDrednawFormChangeTable, + [SPECIES_COALOSSAL] = sCoalossalFormChangeTable, + [SPECIES_COALOSSAL_GIGANTAMAX] = sCoalossalFormChangeTable, + [SPECIES_FLAPPLE] = sFlappleFormChangeTable, + [SPECIES_FLAPPLE_GIGANTAMAX] = sFlappleFormChangeTable, + [SPECIES_APPLETUN] = sAppletunFormChangeTable, + [SPECIES_APPLETUN_GIGANTAMAX] = sAppletunFormChangeTable, + [SPECIES_SANDACONDA] = sSandacondaFormChangeTable, + [SPECIES_SANDACONDA_GIGANTAMAX] = sSandacondaFormChangeTable, [SPECIES_CRAMORANT] = sCramorantFormChangeTable, [SPECIES_CRAMORANT_GULPING] = sCramorantFormChangeTable, [SPECIES_CRAMORANT_GORGING] = sCramorantFormChangeTable, + [SPECIES_TOXTRICITY] = sToxtricityFormChangeTable, + [SPECIES_TOXTRICITY_GIGANTAMAX] = sToxtricityFormChangeTable, + [SPECIES_CENTISKORCH] = sCentiskorchFormChangeTable, + [SPECIES_CENTISKORCH_GIGANTAMAX] = sCentiskorchFormChangeTable, + [SPECIES_HATTERENE] = sHattereneFormChangeTable, + [SPECIES_HATTERENE_GIGANTAMAX] = sHattereneFormChangeTable, + [SPECIES_GRIMMSNARL] = sGrimmsnarlFormChangeTable, + [SPECIES_GRIMMSNARL_GIGANTAMAX] = sGrimmsnarlFormChangeTable, + [SPECIES_ALCREMIE] = sAlcremieFormChangeTable, + [SPECIES_ALCREMIE_GIGANTAMAX] = sAlcremieFormChangeTable, [SPECIES_EISCUE] = sEiscueFormChangeTable, [SPECIES_EISCUE_NOICE_FACE] = sEiscueFormChangeTable, [SPECIES_MORPEKO] = sMorpekoFormChangeTable, [SPECIES_MORPEKO_HANGRY] = sMorpekoFormChangeTable, + [SPECIES_COPPERAJAH] = sCopperajahFormChangeTable, + [SPECIES_COPPERAJAH_GIGANTAMAX] = sCopperajahFormChangeTable, + [SPECIES_DURALUDON] = sDuraludonFormChangeTable, + [SPECIES_DURALUDON_GIGANTAMAX] = sDuraludonFormChangeTable, [SPECIES_ZACIAN] = sZacianFormChangeTable, [SPECIES_ZACIAN_CROWNED_SWORD] = sZacianFormChangeTable, [SPECIES_ZAMAZENTA] = sZamazentaFormChangeTable, [SPECIES_ZAMAZENTA_CROWNED_SHIELD] = sZamazentaFormChangeTable, + [SPECIES_URSHIFU] = sUrshifuFormChangeTable, + [SPECIES_URSHIFU_GIGANTAMAX] = sUrshifuFormChangeTable, + [SPECIES_URSHIFU_RAPID_STRIKE_STYLE] = sUrshifuRapidStrikeFormChangeTable, + [SPECIES_URSHIFU_RAPID_STRIKE_STYLE_GIGANTAMAX] = sUrshifuRapidStrikeFormChangeTable, [SPECIES_ENAMORUS] = sEnamorusFormChangeTable, [SPECIES_ENAMORUS_THERIAN] = sEnamorusFormChangeTable, #endif diff --git a/src/data/pokemon/form_change_tables.h b/src/data/pokemon/form_change_tables.h index 2db4d8a1d3b1..62963d95f6e8 100644 --- a/src/data/pokemon/form_change_tables.h +++ b/src/data/pokemon/form_change_tables.h @@ -1,16 +1,19 @@ static const struct FormChange sVenusaurFormChangeTable[] = { {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_VENUSAUR_MEGA, ITEM_VENUSAURITE}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_VENUSAUR_GIGANTAMAX}, {FORM_CHANGE_TERMINATOR}, }; static const struct FormChange sCharizardFormChangeTable[] = { {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_CHARIZARD_MEGA_X, ITEM_CHARIZARDITE_X}, {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_CHARIZARD_MEGA_Y, ITEM_CHARIZARDITE_Y}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_CHARIZARD_GIGANTAMAX}, {FORM_CHANGE_TERMINATOR}, }; static const struct FormChange sBlastoiseFormChangeTable[] = { {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_BLASTOISE_MEGA, ITEM_BLASTOISINITE}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_BLASTOISE_GIGANTAMAX}, {FORM_CHANGE_TERMINATOR}, }; @@ -36,6 +39,7 @@ static const struct FormChange sSlowbroFormChangeTable[] = { static const struct FormChange sGengarFormChangeTable[] = { {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_GENGAR_MEGA, ITEM_GENGARITE}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_GENGAR_GIGANTAMAX}, {FORM_CHANGE_TERMINATOR}, }; @@ -600,6 +604,50 @@ static const struct FormChange sEnamorusFormChangeTable[] = { {FORM_CHANGE_ITEM_USE, SPECIES_ENAMORUS_THERIAN, ITEM_REVEAL_GLASS}, {FORM_CHANGE_TERMINATOR}, }; + +#endif + +// Gigantamax Forms +#define GIGANTAMAX_FORM(species) \ + { \ + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_##species##_GIGANTAMAX},\ + {FORM_CHANGE_TERMINATOR}, \ + }; + +static const struct FormChange sButterfreeFormChangeTable[] = GIGANTAMAX_FORM(BUTTERFREE) +static const struct FormChange sPikachuFormChangeTable[] = GIGANTAMAX_FORM(PIKACHU) +static const struct FormChange sMeowthFormChangeTable[] = GIGANTAMAX_FORM(MEOWTH) +static const struct FormChange sMachampFormChangeTable[] = GIGANTAMAX_FORM(MACHAMP) +static const struct FormChange sKinglerFormChangeTable[] = GIGANTAMAX_FORM(KINGLER) +static const struct FormChange sLaprasFormChangeTable[] = GIGANTAMAX_FORM(LAPRAS) +static const struct FormChange sEeveeFormChangeTable[] = GIGANTAMAX_FORM(EEVEE) +static const struct FormChange sSnorlaxFormChangeTable[] = GIGANTAMAX_FORM(SNORLAX) +#if P_GEN_5_POKEMON == TRUE +static const struct FormChange sGarbodorFormChangeTable[] = GIGANTAMAX_FORM(GARBODOR) +#endif +#if P_GEN_7_POKEMON == TRUE +static const struct FormChange sMelmetalFormChangeTable[] = GIGANTAMAX_FORM(MELMETAL) +#endif +#if P_GEN_8_POKEMON == TRUE +static const struct FormChange sRillaboomFormChangeTable[] = GIGANTAMAX_FORM(RILLABOOM) +static const struct FormChange sCinderaceFormChangeTable[] = GIGANTAMAX_FORM(CINDERACE) +static const struct FormChange sInteleonFormChangeTable[] = GIGANTAMAX_FORM(INTELEON) +static const struct FormChange sCorviknightFormChangeTable[] = GIGANTAMAX_FORM(CORVIKNIGHT) +static const struct FormChange sOrbeetleFormChangeTable[] = GIGANTAMAX_FORM(ORBEETLE) +static const struct FormChange sDrednawFormChangeTable[] = GIGANTAMAX_FORM(DREDNAW) +static const struct FormChange sCoalossalFormChangeTable[] = GIGANTAMAX_FORM(COALOSSAL) +static const struct FormChange sFlappleFormChangeTable[] = GIGANTAMAX_FORM(FLAPPLE) +static const struct FormChange sAppletunFormChangeTable[] = GIGANTAMAX_FORM(APPLETUN) +static const struct FormChange sSandacondaFormChangeTable[] = GIGANTAMAX_FORM(SANDACONDA) +static const struct FormChange sToxtricityFormChangeTable[] = GIGANTAMAX_FORM(TOXTRICITY) +static const struct FormChange sCentiskorchFormChangeTable[] = GIGANTAMAX_FORM(CENTISKORCH) +static const struct FormChange sHattereneFormChangeTable[] = GIGANTAMAX_FORM(HATTERENE) +static const struct FormChange sGrimmsnarlFormChangeTable[] = GIGANTAMAX_FORM(GRIMMSNARL) +static const struct FormChange sAlcremieFormChangeTable[] = GIGANTAMAX_FORM(ALCREMIE) +static const struct FormChange sCopperajahFormChangeTable[] = GIGANTAMAX_FORM(COPPERAJAH) +static const struct FormChange sDuraludonFormChangeTable[] = GIGANTAMAX_FORM(DURALUDON) +static const struct FormChange sUrshifuFormChangeTable[] = GIGANTAMAX_FORM(URSHIFU) +static const struct FormChange sUrshifuRapidStrikeFormChangeTable[] = GIGANTAMAX_FORM(URSHIFU_RAPID_STRIKE_STYLE) #endif #undef WHEN_LEARNED diff --git a/src/data/pokemon/form_species_table_pointers.h b/src/data/pokemon/form_species_table_pointers.h index cc66c12ed835..b27fc1ae0e08 100644 --- a/src/data/pokemon/form_species_table_pointers.h +++ b/src/data/pokemon/form_species_table_pointers.h @@ -593,5 +593,39 @@ const u16 *const gFormSpeciesIdTables[NUM_SPECIES] = [SPECIES_ENAMORUS_THERIAN] = sEnamorusFormSpeciesIdTable, // Basculegion [SPECIES_BASCULEGION_FEMALE] = sBasculegionFormSpeciesIdTable, + // Gigantamax Forms + [SPECIES_VENUSAUR_GIGANTAMAX] = sVenusaurFormSpeciesIdTable, + [SPECIES_CHARIZARD_GIGANTAMAX] = sCharizardFormSpeciesIdTable, + [SPECIES_BLASTOISE_GIGANTAMAX] = sBlastoiseFormSpeciesIdTable, + [SPECIES_BUTTERFREE_GIGANTAMAX] = sButterfreeFormSpeciesIdTable, + [SPECIES_PIKACHU_GIGANTAMAX] = sPikachuFormSpeciesIdTable, + [SPECIES_MEOWTH_GIGANTAMAX] = sMeowthFormSpeciesIdTable, + [SPECIES_MACHAMP_GIGANTAMAX] = sMachampFormSpeciesIdTable, + [SPECIES_GENGAR_GIGANTAMAX] = sGengarFormSpeciesIdTable, + [SPECIES_KINGLER_GIGANTAMAX] = sKinglerFormSpeciesIdTable, + [SPECIES_LAPRAS_GIGANTAMAX] = sLaprasFormSpeciesIdTable, + [SPECIES_EEVEE_GIGANTAMAX] = sEeveeFormSpeciesIdTable, + [SPECIES_SNORLAX_GIGANTAMAX] = sSnorlaxFormSpeciesIdTable, + [SPECIES_GARBODOR_GIGANTAMAX] = sGarbodorFormSpeciesIdTable, + [SPECIES_MELMETAL_GIGANTAMAX] = sMelmetalFormSpeciesIdTable, + [SPECIES_RILLABOOM_GIGANTAMAX] = sRillaboomFormSpeciesIdTable, + [SPECIES_CINDERACE_GIGANTAMAX] = sCinderaceFormSpeciesIdTable, + [SPECIES_INTELEON_GIGANTAMAX] = sInteleonFormSpeciesIdTable, + [SPECIES_CORVIKNIGHT_GIGANTAMAX] = sCorviknightFormSpeciesIdTable, + [SPECIES_ORBEETLE_GIGANTAMAX] = sOrbeetleFormSpeciesIdTable, + [SPECIES_DREDNAW_GIGANTAMAX] = sDrednawFormSpeciesIdTable, + [SPECIES_COALOSSAL_GIGANTAMAX] = sCoalossalFormSpeciesIdTable, + [SPECIES_FLAPPLE_GIGANTAMAX] = sFlappleFormSpeciesIdTable, + [SPECIES_APPLETUN_GIGANTAMAX] = sAppletunFormSpeciesIdTable, + [SPECIES_SANDACONDA_GIGANTAMAX] = sSandacondaFormSpeciesIdTable, + [SPECIES_TOXTRICITY_GIGANTAMAX] = sToxtricityFormSpeciesIdTable, + [SPECIES_CENTISKORCH_GIGANTAMAX] = sCentiskorchFormSpeciesIdTable, + [SPECIES_HATTERENE_GIGANTAMAX] = sHattereneFormSpeciesIdTable, + [SPECIES_GRIMMSNARL_GIGANTAMAX] = sGrimmsnarlFormSpeciesIdTable, + [SPECIES_ALCREMIE_GIGANTAMAX] = sAlcremieFormSpeciesIdTable, + [SPECIES_COPPERAJAH_GIGANTAMAX] = sCopperajahFormSpeciesIdTable, + [SPECIES_DURALUDON_GIGANTAMAX] = sDuraludonFormSpeciesIdTable, + [SPECIES_URSHIFU_GIGANTAMAX] = sUrshifuFormSpeciesIdTable, + [SPECIES_URSHIFU_RAPID_STRIKE_STYLE_GIGANTAMAX] = sUrshifuFormSpeciesIdTable, #endif }; diff --git a/src/data/pokemon/form_species_tables.h b/src/data/pokemon/form_species_tables.h index 2f4e9088e0e4..9e468b666148 100644 --- a/src/data/pokemon/form_species_tables.h +++ b/src/data/pokemon/form_species_tables.h @@ -1,6 +1,7 @@ static const u16 sVenusaurFormSpeciesIdTable[] = { SPECIES_VENUSAUR, SPECIES_VENUSAUR_MEGA, + SPECIES_VENUSAUR_GIGANTAMAX, FORM_SPECIES_END, }; @@ -8,12 +9,20 @@ static const u16 sCharizardFormSpeciesIdTable[] = { SPECIES_CHARIZARD, SPECIES_CHARIZARD_MEGA_X, SPECIES_CHARIZARD_MEGA_Y, + SPECIES_CHARIZARD_GIGANTAMAX, FORM_SPECIES_END, }; static const u16 sBlastoiseFormSpeciesIdTable[] = { SPECIES_BLASTOISE, SPECIES_BLASTOISE_MEGA, + SPECIES_BLASTOISE_GIGANTAMAX, + FORM_SPECIES_END, +}; + +static const u16 sButterfreeFormSpeciesIdTable[] = { + SPECIES_BUTTERFREE, + SPECIES_BUTTERFREE_GIGANTAMAX, FORM_SPECIES_END, }; @@ -57,6 +66,7 @@ static const u16 sPikachuFormSpeciesIdTable[] = { SPECIES_PIKACHU_ALOLA_CAP, SPECIES_PIKACHU_PARTNER_CAP, SPECIES_PIKACHU_WORLD_CAP, + SPECIES_PIKACHU_GIGANTAMAX, FORM_SPECIES_END, }; @@ -106,6 +116,7 @@ static const u16 sMeowthFormSpeciesIdTable[] = { SPECIES_MEOWTH, SPECIES_MEOWTH_ALOLAN, SPECIES_MEOWTH_GALARIAN, + SPECIES_MEOWTH_GIGANTAMAX, FORM_SPECIES_END, }; @@ -133,6 +144,12 @@ static const u16 sArcanineFormSpeciesIdTable[] = { FORM_SPECIES_END, }; +static const u16 sMachampFormSpeciesIdTable[] = { + SPECIES_MACHAMP, + SPECIES_MACHAMP_GIGANTAMAX, + FORM_SPECIES_END, +}; + static const u16 sGeodudeFormSpeciesIdTable[] = { SPECIES_GEODUDE, SPECIES_GEODUDE_ALOLAN, @@ -194,9 +211,16 @@ static const u16 sMukFormSpeciesIdTable[] = { FORM_SPECIES_END, }; +static const u16 sKinglerFormSpeciesIdTable[] = { + SPECIES_KINGLER, + SPECIES_KINGLER_GIGANTAMAX, + FORM_SPECIES_END, +}; + static const u16 sGengarFormSpeciesIdTable[] = { SPECIES_GENGAR, SPECIES_GENGAR_MEGA, + SPECIES_GENGAR_GIGANTAMAX, FORM_SPECIES_END, }; @@ -254,12 +278,30 @@ static const u16 sGyaradosFormSpeciesIdTable[] = { FORM_SPECIES_END, }; +static const u16 sLaprasFormSpeciesIdTable[] = { + SPECIES_LAPRAS, + SPECIES_LAPRAS_GIGANTAMAX, + FORM_SPECIES_END, +}; + +static const u16 sEeveeFormSpeciesIdTable[] = { + SPECIES_EEVEE, + SPECIES_EEVEE_GIGANTAMAX, + FORM_SPECIES_END, +}; + static const u16 sAerodactylFormSpeciesIdTable[] = { SPECIES_AERODACTYL, SPECIES_AERODACTYL_MEGA, FORM_SPECIES_END, }; +static const u16 sSnorlaxFormSpeciesIdTable[] = { + SPECIES_SNORLAX, + SPECIES_SNORLAX_GIGANTAMAX, + FORM_SPECIES_END, +}; + static const u16 sArticunoFormSpeciesIdTable[] = { SPECIES_ARTICUNO, SPECIES_ARTICUNO_GALARIAN, @@ -727,6 +769,12 @@ static const u16 sZoroarkFormSpeciesIdTable[] = { FORM_SPECIES_END, }; +static const u16 sGarbodorFormSpeciesIdTable[] = { + SPECIES_GARBODOR, + SPECIES_GARBODOR_GIGANTAMAX, + FORM_SPECIES_END, +}; + static const u16 sDeerlingFormSpeciesIdTable[] = { SPECIES_DEERLING, SPECIES_DEERLING_SUMMER, @@ -1046,6 +1094,73 @@ static const u16 sMagearnaFormSpeciesIdTable[] = { #endif #if P_GEN_8_POKEMON == TRUE +static const u16 sMelmetalFormSpeciesIdTable[] = { + SPECIES_MELMETAL, + SPECIES_MELMETAL_GIGANTAMAX, + FORM_SPECIES_END, +}; + +static const u16 sRillaboomFormSpeciesIdTable[] = { + SPECIES_RILLABOOM, + SPECIES_RILLABOOM_GIGANTAMAX, + FORM_SPECIES_END, +}; + +static const u16 sCinderaceFormSpeciesIdTable[] = { + SPECIES_CINDERACE, + SPECIES_CINDERACE_GIGANTAMAX, + FORM_SPECIES_END, +}; + +static const u16 sInteleonFormSpeciesIdTable[] = { + SPECIES_INTELEON, + SPECIES_INTELEON_GIGANTAMAX, + FORM_SPECIES_END, +}; + +static const u16 sCorviknightFormSpeciesIdTable[] = { + SPECIES_CORVIKNIGHT, + SPECIES_CORVIKNIGHT_GIGANTAMAX, + FORM_SPECIES_END, +}; + +static const u16 sOrbeetleFormSpeciesIdTable[] = { + SPECIES_ORBEETLE, + SPECIES_ORBEETLE_GIGANTAMAX, + FORM_SPECIES_END, +}; + +static const u16 sDrednawFormSpeciesIdTable[] = { + SPECIES_DREDNAW, + SPECIES_DREDNAW_GIGANTAMAX, + FORM_SPECIES_END, +}; + +static const u16 sCoalossalFormSpeciesIdTable[] = { + SPECIES_COALOSSAL, + SPECIES_COALOSSAL_GIGANTAMAX, + FORM_SPECIES_END, +}; + +static const u16 sFlappleFormSpeciesIdTable[] = { + SPECIES_FLAPPLE, + SPECIES_FLAPPLE_GIGANTAMAX, + FORM_SPECIES_END, +}; + +static const u16 sAppletunFormSpeciesIdTable[] = { + SPECIES_APPLETUN, + SPECIES_APPLETUN_GIGANTAMAX, + FORM_SPECIES_END, +}; + + +static const u16 sSandacondaFormSpeciesIdTable[] = { + SPECIES_SANDACONDA, + SPECIES_SANDACONDA_GIGANTAMAX, + FORM_SPECIES_END, +}; + static const u16 sCramorantFormSpeciesIdTable[] = { SPECIES_CRAMORANT, SPECIES_CRAMORANT_GULPING, @@ -1056,6 +1171,19 @@ static const u16 sCramorantFormSpeciesIdTable[] = { static const u16 sToxtricityFormSpeciesIdTable[] = { SPECIES_TOXTRICITY, SPECIES_TOXTRICITY_LOW_KEY, + SPECIES_TOXTRICITY_GIGANTAMAX, + FORM_SPECIES_END, +}; + +static const u16 sCentiskorchFormSpeciesIdTable[] = { + SPECIES_CENTISKORCH, + SPECIES_CENTISKORCH_GIGANTAMAX, + FORM_SPECIES_END, +}; + +static const u16 sHattereneFormSpeciesIdTable[] = { + SPECIES_HATTERENE, + SPECIES_HATTERENE_GIGANTAMAX, FORM_SPECIES_END, }; @@ -1071,6 +1199,12 @@ static const u16 sPolteageistFormSpeciesIdTable[] = { FORM_SPECIES_END, }; +static const u16 sGrimmsnarlFormSpeciesIdTable[] = { + SPECIES_GRIMMSNARL, + SPECIES_GRIMMSNARL_GIGANTAMAX, + FORM_SPECIES_END, +}; + static const u16 sAlcremieFormSpeciesIdTable[] = { SPECIES_ALCREMIE, SPECIES_ALCREMIE_RUBY_CREAM, @@ -1102,6 +1236,18 @@ static const u16 sMorpekoFormSpeciesIdTable[] = { FORM_SPECIES_END, }; +static const u16 sCopperajahFormSpeciesIdTable[] = { + SPECIES_COPPERAJAH, + SPECIES_COPPERAJAH_GIGANTAMAX, + FORM_SPECIES_END, +}; + +static const u16 sDuraludonFormSpeciesIdTable[] = { + SPECIES_DURALUDON, + SPECIES_DURALUDON_GIGANTAMAX, + FORM_SPECIES_END, +}; + static const u16 sZacianFormSpeciesIdTable[] = { SPECIES_ZACIAN, SPECIES_ZACIAN_CROWNED_SWORD, @@ -1123,6 +1269,8 @@ static const u16 sEternatusFormSpeciesIdTable[] = { static const u16 sUrshifuFormSpeciesIdTable[] = { SPECIES_URSHIFU, SPECIES_URSHIFU_RAPID_STRIKE_STYLE, + SPECIES_URSHIFU_GIGANTAMAX, + SPECIES_URSHIFU_RAPID_STRIKE_STYLE_GIGANTAMAX, FORM_SPECIES_END, }; diff --git a/src/data/pokemon/level_up_learnset_pointers.h b/src/data/pokemon/level_up_learnset_pointers.h index 19b4e42e44f9..a99c39aa960a 100644 --- a/src/data/pokemon/level_up_learnset_pointers.h +++ b/src/data/pokemon/level_up_learnset_pointers.h @@ -1334,6 +1334,41 @@ const struct LevelUpMove *const gLevelUpLearnsets[NUM_SPECIES] = [SPECIES_CALYREX_SHADOW_RIDER] = sCalyrexShadowRiderLevelUpLearnset, // Enamorus [SPECIES_ENAMORUS_THERIAN] = sEnamorusLevelUpLearnset, + // Basculegion [SPECIES_BASCULEGION_FEMALE] = sBasculegionLevelUpLearnset, + // Gigantamax Forms + [SPECIES_VENUSAUR_GIGANTAMAX] = sVenusaurLevelUpLearnset, + [SPECIES_CHARIZARD_GIGANTAMAX] = sCharizardLevelUpLearnset, + [SPECIES_BLASTOISE_GIGANTAMAX] = sBlastoiseLevelUpLearnset, + [SPECIES_BUTTERFREE_GIGANTAMAX] = sButterfreeLevelUpLearnset, + [SPECIES_PIKACHU_GIGANTAMAX] = sPikachuLevelUpLearnset, + [SPECIES_MEOWTH_GIGANTAMAX] = sMeowthLevelUpLearnset, + [SPECIES_MACHAMP_GIGANTAMAX] = sMachampLevelUpLearnset, + [SPECIES_GENGAR_GIGANTAMAX] = sGengarLevelUpLearnset, + [SPECIES_KINGLER_GIGANTAMAX] = sKinglerLevelUpLearnset, + [SPECIES_LAPRAS_GIGANTAMAX] = sLaprasLevelUpLearnset, + [SPECIES_EEVEE_GIGANTAMAX] = sEeveeLevelUpLearnset, + [SPECIES_SNORLAX_GIGANTAMAX] = sSnorlaxLevelUpLearnset, + [SPECIES_GARBODOR_GIGANTAMAX] = sGarbodorLevelUpLearnset, + [SPECIES_MELMETAL_GIGANTAMAX] = sMelmetalLevelUpLearnset, + [SPECIES_RILLABOOM_GIGANTAMAX] = sRillaboomLevelUpLearnset, + [SPECIES_CINDERACE_GIGANTAMAX] = sCinderaceLevelUpLearnset, + [SPECIES_INTELEON_GIGANTAMAX] = sInteleonLevelUpLearnset, + [SPECIES_CORVIKNIGHT_GIGANTAMAX] = sCorviknightLevelUpLearnset, + [SPECIES_ORBEETLE_GIGANTAMAX] = sOrbeetleLevelUpLearnset, + [SPECIES_DREDNAW_GIGANTAMAX] = sDrednawLevelUpLearnset, + [SPECIES_COALOSSAL_GIGANTAMAX] = sCoalossalLevelUpLearnset, + [SPECIES_FLAPPLE_GIGANTAMAX] = sFlappleLevelUpLearnset, + [SPECIES_APPLETUN_GIGANTAMAX] = sAppletunLevelUpLearnset, + [SPECIES_SANDACONDA_GIGANTAMAX] = sSandacondaLevelUpLearnset, + [SPECIES_TOXTRICITY_GIGANTAMAX] = sToxtricityLevelUpLearnset, + [SPECIES_CENTISKORCH_GIGANTAMAX] = sCentiskorchLevelUpLearnset, + [SPECIES_HATTERENE_GIGANTAMAX] = sHattereneLevelUpLearnset, + [SPECIES_GRIMMSNARL_GIGANTAMAX] = sGrimmsnarlLevelUpLearnset, + [SPECIES_ALCREMIE_GIGANTAMAX] = sAlcremieLevelUpLearnset, + [SPECIES_COPPERAJAH_GIGANTAMAX] = sCopperajahLevelUpLearnset, + [SPECIES_DURALUDON_GIGANTAMAX] = sDuraludonLevelUpLearnset, + [SPECIES_URSHIFU_GIGANTAMAX] = sUrshifuLevelUpLearnset, + [SPECIES_URSHIFU_RAPID_STRIKE_STYLE_GIGANTAMAX] = sUrshifuRapidStrikeStyleLevelUpLearnset, #endif }; diff --git a/src/data/pokemon/species_info.h b/src/data/pokemon/species_info.h index 52b5fac92c82..d3acfd3fc5db 100644 --- a/src/data/pokemon/species_info.h +++ b/src/data/pokemon/species_info.h @@ -6,6 +6,14 @@ #define FLIP 0 #define NO_FLIP 1 +#if P_UPDATED_STATS >= GEN_6 + #define BUTTERFREE_SP_ATK\ + .baseSpAttack = 90, +#else + #define BUTTERFREE_SP_ATK\ + .baseSpAttack = 80, +#endif + #if P_UPDATED_STATS >= GEN_6 #define PIKACHU_BASE_DEFENSES\ .baseDefense = 40, \ @@ -16,8 +24,98 @@ .baseSpDefense = 40 #endif -#define PIKACHU_SPECIES_INFO(gender, flip) \ - { \ +#if P_UPDATED_ABILITIES >= GEN_7 + #define GENGAR_ABILITIES\ + .abilities = {ABILITY_CURSED_BODY, ABILITY_NONE}, +#else + #define GENGAR_ABILITIES\ + .abilities = {ABILITY_LEVITATE, ABILITY_NONE}, +#endif + +#define VENUSAUR_MISC_INFO \ + .baseHP = 80, \ + .baseAttack = 82, \ + .baseDefense = 83, \ + .baseSpeed = 80, \ + .baseSpAttack = 100, \ + .baseSpDefense = 100, \ + .types = {TYPE_GRASS, TYPE_POISON}, \ + .catchRate = 45, \ + .expYield = 236, \ + .evYield_SpAttack = 2, \ + .evYield_SpDefense = 1, \ + .genderRatio = PERCENT_FEMALE(12.5), \ + .eggCycles = 20, \ + .friendship = STANDARD_FRIENDSHIP, \ + .growthRate = GROWTH_MEDIUM_SLOW, \ + .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_GRASS}, \ + .abilities = {ABILITY_OVERGROW, ABILITY_NONE, ABILITY_CHLOROPHYLL}, \ + .bodyColor = BODY_COLOR_GREEN, \ + .noFlip = FALSE + +#define CHARIZARD_MISC_INFO \ + .baseHP = 78, \ + .baseAttack = 84, \ + .baseDefense = 78, \ + .baseSpeed = 100, \ + .baseSpAttack = 109, \ + .baseSpDefense = 85, \ + .types = {TYPE_FIRE, TYPE_FLYING}, \ + .catchRate = 45, \ + .expYield = 240, \ + .evYield_SpAttack = 3, \ + .genderRatio = PERCENT_FEMALE(12.5), \ + .eggCycles = 20, \ + .friendship = STANDARD_FRIENDSHIP, \ + .growthRate = GROWTH_MEDIUM_SLOW, \ + .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_DRAGON}, \ + .abilities = {ABILITY_BLAZE, ABILITY_NONE, ABILITY_SOLAR_POWER},\ + .bodyColor = BODY_COLOR_RED, \ + .noFlip = FALSE + +#define BLASTOISE_MISC_INFO \ + .baseHP = 79, \ + .baseAttack = 83, \ + .baseDefense = 100, \ + .baseSpeed = 78, \ + .baseSpAttack = 85, \ + .baseSpDefense = 105, \ + .types = {TYPE_WATER, TYPE_WATER}, \ + .catchRate = 45, \ + .expYield = 239, \ + .evYield_SpDefense = 3, \ + .genderRatio = PERCENT_FEMALE(12.5), \ + .eggCycles = 20, \ + .friendship = STANDARD_FRIENDSHIP, \ + .growthRate = GROWTH_MEDIUM_SLOW, \ + .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_WATER_1}, \ + .abilities = {ABILITY_TORRENT, ABILITY_NONE, ABILITY_RAIN_DISH},\ + .bodyColor = BODY_COLOR_BLUE, \ + .noFlip = FALSE + +#define BUTTERFREE_MISC_INFO \ + .baseHP = 60, \ + .baseAttack = 45, \ + .baseDefense = 50, \ + .baseSpeed = 70, \ + .baseSpDefense = 80, \ + BUTTERFREE_SP_ATK \ + .types = {TYPE_BUG, TYPE_FLYING}, \ + .catchRate = 45, \ + .expYield = 178, \ + .evYield_SpAttack = 2, \ + .evYield_SpDefense = 1, \ + .itemRare = ITEM_SILVER_POWDER, \ + .genderRatio = PERCENT_FEMALE(50), \ + .eggCycles = 15, \ + .friendship = STANDARD_FRIENDSHIP, \ + .growthRate = GROWTH_MEDIUM_FAST, \ + .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG}, \ + .abilities = {ABILITY_COMPOUND_EYES, ABILITY_NONE, ABILITY_TINTED_LENS},\ + .bodyColor = BODY_COLOR_WHITE, \ + .noFlip = FALSE + +#define PIKACHU_MISC_INFO(gender, flip) \ .baseHP = 35, \ .baseAttack = 55, \ .baseSpeed = 90, \ @@ -35,11 +133,156 @@ .eggGroups = { EGG_GROUP_FIELD, EGG_GROUP_FAIRY}, \ .abilities = {ABILITY_STATIC, ABILITY_NONE, ABILITY_LIGHTNING_ROD},\ .bodyColor = BODY_COLOR_YELLOW, \ - .noFlip = flip, \ - } + .noFlip = flip -#define COSPLAY_PIKACHU_SPECIES_INFO(flip) PIKACHU_SPECIES_INFO(MON_FEMALE, flip) -#define CAP_PIKACHU_SPECIES_INFO(flip) PIKACHU_SPECIES_INFO(MON_MALE, flip) +#define MEOWTH_MISC_INFO \ + .baseHP = 40, \ + .baseAttack = 45, \ + .baseDefense = 35, \ + .baseSpeed = 90, \ + .baseSpAttack = 40, \ + .baseSpDefense = 40, \ + .types = {TYPE_NORMAL, TYPE_NORMAL}, \ + .catchRate = 255, \ + .expYield = 58, \ + .evYield_Speed = 1, \ + .itemRare = ITEM_QUICK_CLAW, \ + .genderRatio = PERCENT_FEMALE(50), \ + .eggCycles = 20, \ + .friendship = STANDARD_FRIENDSHIP, \ + .growthRate = GROWTH_MEDIUM_FAST, \ + .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, \ + .abilities = {ABILITY_PICKUP, ABILITY_TECHNICIAN, ABILITY_UNNERVE}, \ + .bodyColor = BODY_COLOR_YELLOW, \ + .noFlip = FALSE + +#define MACHAMP_MISC_INFO \ + .baseHP = 90, \ + .baseAttack = 130, \ + .baseDefense = 80, \ + .baseSpeed = 55, \ + .baseSpAttack = 65, \ + .baseSpDefense = 85, \ + .types = {TYPE_FIGHTING, TYPE_FIGHTING}, \ + .catchRate = 45, \ + .expYield = 227, \ + .evYield_Attack = 3, \ + .itemRare = ITEM_FOCUS_BAND, \ + .genderRatio = PERCENT_FEMALE(25), \ + .eggCycles = 20, \ + .friendship = STANDARD_FRIENDSHIP, \ + .growthRate = GROWTH_MEDIUM_SLOW, \ + .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE}, \ + .abilities = {ABILITY_GUTS, ABILITY_NO_GUARD, ABILITY_STEADFAST}, \ + .bodyColor = BODY_COLOR_GRAY, \ + .noFlip = FALSE + +#define GENGAR_MISC_INFO \ + .baseHP = 60, \ + .baseAttack = 65, \ + .baseDefense = 60, \ + .baseSpeed = 110, \ + .baseSpAttack = 130, \ + .baseSpDefense = 75, \ + .types = {TYPE_GHOST, TYPE_POISON}, \ + .catchRate = 45, \ + .expYield = 225, \ + .evYield_SpAttack = 3, \ + .genderRatio = PERCENT_FEMALE(50), \ + .eggCycles = 20, \ + .friendship = STANDARD_FRIENDSHIP, \ + .growthRate = GROWTH_MEDIUM_SLOW, \ + .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS},\ + GENGAR_ABILITIES \ + .bodyColor = BODY_COLOR_PURPLE, \ + .noFlip = FALSE + +#define KINGLER_MISC_INFO \ + .baseHP = 55, \ + .baseAttack = 130, \ + .baseDefense = 115, \ + .baseSpeed = 75, \ + .baseSpAttack = 50, \ + .baseSpDefense = 50, \ + .types = {TYPE_WATER, TYPE_WATER}, \ + .catchRate = 60, \ + .expYield = 166, \ + .evYield_Attack = 2, \ + .genderRatio = PERCENT_FEMALE(50), \ + .eggCycles = 20, \ + .friendship = STANDARD_FRIENDSHIP, \ + .growthRate = GROWTH_MEDIUM_FAST, \ + .eggGroups = {EGG_GROUP_WATER_3, EGG_GROUP_WATER_3}, \ + .abilities = {ABILITY_HYPER_CUTTER, ABILITY_SHELL_ARMOR, ABILITY_SHEER_FORCE}, \ + .bodyColor = BODY_COLOR_RED, \ + .noFlip = TRUE + +#define LAPRAS_MISC_INFO \ + .baseHP = 130, \ + .baseAttack = 85, \ + .baseDefense = 80, \ + .baseSpeed = 60, \ + .baseSpAttack = 85, \ + .baseSpDefense = 95, \ + .types = {TYPE_WATER, TYPE_ICE}, \ + .catchRate = 45, \ + .expYield = 187, \ + .evYield_HP = 2, \ + .itemCommon = ITEM_MYSTIC_WATER, \ + .itemRare = ITEM_MYSTIC_WATER, \ + .genderRatio = PERCENT_FEMALE(50), \ + .eggCycles = 40, \ + .friendship = STANDARD_FRIENDSHIP, \ + .growthRate = GROWTH_SLOW, \ + .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_WATER_1}, \ + .abilities = {ABILITY_WATER_ABSORB, ABILITY_SHELL_ARMOR, ABILITY_HYDRATION},\ + .bodyColor = BODY_COLOR_BLUE, \ + .noFlip = FALSE + +#define EEVEE_MISC_INFO \ + .baseHP = 55, \ + .baseAttack = 55, \ + .baseDefense = 50, \ + .baseSpeed = 55, \ + .baseSpAttack = 45, \ + .baseSpDefense = 65, \ + .types = {TYPE_NORMAL, TYPE_NORMAL}, \ + .catchRate = 45, \ + .expYield = 65, \ + .evYield_SpDefense = 1, \ + .genderRatio = PERCENT_FEMALE(12.5), \ + .eggCycles = 35, \ + .friendship = STANDARD_FRIENDSHIP, \ + .growthRate = GROWTH_MEDIUM_FAST, \ + .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, \ + .abilities = {ABILITY_RUN_AWAY, ABILITY_ADAPTABILITY, ABILITY_ANTICIPATION},\ + .bodyColor = BODY_COLOR_BROWN, \ + .noFlip = FALSE + +#define SNORLAX_MISC_INFO \ + .baseHP = 160, \ + .baseAttack = 110, \ + .baseDefense = 65, \ + .baseSpeed = 30, \ + .baseSpAttack = 65, \ + .baseSpDefense = 110, \ + .types = {TYPE_NORMAL, TYPE_NORMAL}, \ + .catchRate = 25, \ + .expYield = 189, \ + .evYield_HP = 2, \ + .itemCommon = ITEM_LEFTOVERS, \ + .itemRare = ITEM_LEFTOVERS, \ + .genderRatio = PERCENT_FEMALE(12.5), \ + .eggCycles = 40, \ + .friendship = STANDARD_FRIENDSHIP, \ + .growthRate = GROWTH_SLOW, \ + .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_MONSTER}, \ + .abilities = {ABILITY_IMMUNITY, ABILITY_THICK_FAT, ABILITY_GLUTTONY}, \ + .bodyColor = BODY_COLOR_BLACK, \ + .noFlip = FALSE + +#define COSPLAY_PIKACHU_SPECIES_INFO(flip) { PIKACHU_MISC_INFO(MON_FEMALE, flip) } +#define CAP_PIKACHU_SPECIES_INFO(flip) { PIKACHU_MISC_INFO(MON_MALE, flip) } #define PICHU_SPECIES_INFO(flip) \ { \ @@ -245,7 +488,29 @@ .flags = SPECIES_FLAG_MYTHICAL, \ } -#define DEERLING_SPECIES_INFO(color) \ +#define GARBODOR_MISC_INFO \ + .baseHP = 80, \ + .baseAttack = 95, \ + .baseDefense = 82, \ + .baseSpeed = 75, \ + .baseSpAttack = 60, \ + .baseSpDefense = 82, \ + .types = {TYPE_POISON, TYPE_POISON}, \ + .catchRate = 60, \ + .expYield = 166, \ + .evYield_Attack = 2, \ + .itemCommon = ITEM_SILK_SCARF, \ + .itemRare = ITEM_BLACK_SLUDGE, \ + .genderRatio = PERCENT_FEMALE(50), \ + .eggCycles = 20, \ + .friendship = STANDARD_FRIENDSHIP, \ + .growthRate = GROWTH_MEDIUM_FAST, \ + .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL}, \ + .abilities = {ABILITY_STENCH, ABILITY_WEAK_ARMOR, ABILITY_AFTERMATH}, \ + .bodyColor = BODY_COLOR_GREEN, \ + .noFlip = TRUE + +#define DEERLING_SPECIES_INFO(color) \ { \ .baseHP = 60, \ .baseAttack = 60, \ @@ -682,7 +947,229 @@ .flags = SPECIES_FLAG_MYTHICAL, \ } -#define CRAMORANT_SPECIES_INFO \ +#define MELMETAL_MISC_INFO \ + .baseHP = 135, \ + .baseAttack = 143, \ + .baseDefense = 143, \ + .baseSpeed = 34, \ + .baseSpAttack = 80, \ + .baseSpDefense = 65, \ + .types = {TYPE_STEEL, TYPE_STEEL}, \ + .catchRate = 3, \ + .expYield = 270, \ + .evYield_Attack = 3, \ + .genderRatio = MON_GENDERLESS, \ + .eggCycles = 120, \ + .friendship = 0, \ + .growthRate = GROWTH_SLOW, \ + .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, \ + .abilities = {ABILITY_IRON_FIST, ABILITY_NONE}, \ + .bodyColor = BODY_COLOR_GRAY, \ + .noFlip = FALSE, \ + .flags = SPECIES_FLAG_MYTHICAL + +#define RILLABOOM_MISC_INFO \ + .baseHP = 100, \ + .baseAttack = 125, \ + .baseDefense = 90, \ + .baseSpeed = 85, \ + .baseSpAttack = 60, \ + .baseSpDefense = 70, \ + .types = {TYPE_GRASS, TYPE_GRASS}, \ + .catchRate = 45, \ + .expYield = 265, \ + .evYield_Attack = 3, \ + .genderRatio = PERCENT_FEMALE(12.5), \ + .eggCycles = 20, \ + .friendship = STANDARD_FRIENDSHIP, \ + .growthRate = GROWTH_MEDIUM_SLOW, \ + .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_GRASS}, \ + .abilities = {ABILITY_OVERGROW, ABILITY_NONE, ABILITY_GRASSY_SURGE},\ + .bodyColor = BODY_COLOR_GREEN, \ + .noFlip = FALSE + +#define CINDERACE_MISC_INFO \ + .baseHP = 80, \ + .baseAttack = 116, \ + .baseDefense = 75, \ + .baseSpeed = 119, \ + .baseSpAttack = 65, \ + .baseSpDefense = 75, \ + .types = {TYPE_FIRE, TYPE_FIRE}, \ + .catchRate = 45, \ + .expYield = 265, \ + .evYield_Speed = 3, \ + .genderRatio = PERCENT_FEMALE(12.5), \ + .eggCycles = 20, \ + .friendship = STANDARD_FRIENDSHIP, \ + .growthRate = GROWTH_MEDIUM_SLOW, \ + .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_HUMAN_LIKE}, \ + .abilities = {ABILITY_BLAZE, ABILITY_NONE, ABILITY_LIBERO}, \ + .bodyColor = BODY_COLOR_WHITE, \ + .noFlip = FALSE + +#define INTELEON_MISC_INFO \ + .baseHP = 70, \ + .baseAttack = 85, \ + .baseDefense = 65, \ + .baseSpeed = 120, \ + .baseSpAttack = 125, \ + .baseSpDefense = 65, \ + .types = {TYPE_WATER, TYPE_WATER}, \ + .catchRate = 45, \ + .expYield = 265, \ + .evYield_Speed = 3, \ + .genderRatio = PERCENT_FEMALE(12.5), \ + .eggCycles = 20, \ + .friendship = STANDARD_FRIENDSHIP, \ + .growthRate = GROWTH_MEDIUM_SLOW, \ + .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_FIELD}, \ + .abilities = {ABILITY_TORRENT, ABILITY_NONE, ABILITY_SNIPER}, \ + .bodyColor = BODY_COLOR_BLUE, \ + .noFlip = FALSE + +#define CORVIKNIGHT_MISC_INFO \ + .baseHP = 98, \ + .baseAttack = 87, \ + .baseDefense = 105, \ + .baseSpeed = 67, \ + .baseSpAttack = 53, \ + .baseSpDefense = 85, \ + .types = {TYPE_FLYING, TYPE_STEEL}, \ + .catchRate = 45, \ + .expYield = 248, \ + .evYield_Defense = 3, \ + .genderRatio = PERCENT_FEMALE(50), \ + .eggCycles = 15, \ + .friendship = STANDARD_FRIENDSHIP, \ + .growthRate = GROWTH_MEDIUM_SLOW, \ + .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING}, \ + .abilities = {ABILITY_PRESSURE, ABILITY_UNNERVE, ABILITY_MIRROR_ARMOR}, \ + .bodyColor = BODY_COLOR_PURPLE, \ + .noFlip = FALSE + +#define ORBEETLE_MISC_INFO \ + .baseHP = 60, \ + .baseAttack = 45, \ + .baseDefense = 110, \ + .baseSpeed = 90, \ + .baseSpAttack = 80, \ + .baseSpDefense = 120, \ + .types = {TYPE_BUG, TYPE_PSYCHIC}, \ + .catchRate = 45, \ + .expYield = 253, \ + .evYield_SpDefense = 3, \ + .itemRare = ITEM_PSYCHIC_SEED, \ + .genderRatio = PERCENT_FEMALE(50), \ + .eggCycles = 15, \ + .friendship = STANDARD_FRIENDSHIP, \ + .growthRate = GROWTH_MEDIUM_FAST, \ + .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG}, \ + .abilities = {ABILITY_SWARM, ABILITY_FRISK, ABILITY_TELEPATHY}, \ + .bodyColor = BODY_COLOR_RED, \ + .noFlip = FALSE + +#define DREDNAW_MISC_INFO \ + .baseHP = 90, \ + .baseAttack = 115, \ + .baseDefense = 90, \ + .baseSpeed = 74, \ + .baseSpAttack = 48, \ + .baseSpDefense = 68, \ + .types = {TYPE_WATER, TYPE_ROCK}, \ + .catchRate = 75, \ + .expYield = 170, \ + .evYield_Attack = 2, \ + .genderRatio = PERCENT_FEMALE(50), \ + .eggCycles = 20, \ + .friendship = STANDARD_FRIENDSHIP, \ + .growthRate = GROWTH_MEDIUM_FAST, \ + .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_WATER_1}, \ + .abilities = {ABILITY_STRONG_JAW, ABILITY_SHELL_ARMOR, ABILITY_SWIFT_SWIM}, \ + .bodyColor = BODY_COLOR_GREEN, \ + .noFlip = FALSE + +#define COALOSSAL_MISC_INFO \ + .baseHP = 110, \ + .baseAttack = 80, \ + .baseDefense = 120, \ + .baseSpeed = 30, \ + .baseSpAttack = 80, \ + .baseSpDefense = 90, \ + .types = {TYPE_ROCK, TYPE_FIRE}, \ + .catchRate = 45, \ + .expYield = 255, \ + .evYield_Defense = 3, \ + .genderRatio = PERCENT_FEMALE(50), \ + .eggCycles = 15, \ + .friendship = STANDARD_FRIENDSHIP, \ + .growthRate = GROWTH_MEDIUM_SLOW, \ + .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL}, \ + .abilities = {ABILITY_STEAM_ENGINE, ABILITY_FLAME_BODY, ABILITY_FLASH_FIRE},\ + .bodyColor = BODY_COLOR_BLACK, \ + .noFlip = FALSE + +#define FLAPPLE_MISC_INFO \ + .baseHP = 70, \ + .baseAttack = 110, \ + .baseDefense = 80, \ + .baseSpeed = 70, \ + .baseSpAttack = 95, \ + .baseSpDefense = 60, \ + .types = {TYPE_GRASS, TYPE_DRAGON}, \ + .catchRate = 45, \ + .expYield = 170, \ + .evYield_Attack = 2, \ + .genderRatio = PERCENT_FEMALE(50), \ + .eggCycles = 20, \ + .friendship = STANDARD_FRIENDSHIP, \ + .growthRate = GROWTH_ERRATIC, \ + .eggGroups = {EGG_GROUP_GRASS, EGG_GROUP_DRAGON}, \ + .abilities = {ABILITY_RIPEN, ABILITY_GLUTTONY, ABILITY_HUSTLE}, \ + .bodyColor = BODY_COLOR_GREEN, \ + .noFlip = FALSE + +#define APPLETUN_MISC_INFO \ + .baseHP = 110, \ + .baseAttack = 85, \ + .baseDefense = 80, \ + .baseSpeed = 30, \ + .baseSpAttack = 100, \ + .baseSpDefense = 80, \ + .types = {TYPE_GRASS, TYPE_DRAGON}, \ + .catchRate = 45, \ + .expYield = 170, \ + .evYield_HP = 2, \ + .genderRatio = PERCENT_FEMALE(50), \ + .eggCycles = 20, \ + .friendship = STANDARD_FRIENDSHIP, \ + .growthRate = GROWTH_ERRATIC, \ + .eggGroups = {EGG_GROUP_GRASS, EGG_GROUP_DRAGON}, \ + .abilities = {ABILITY_RIPEN, ABILITY_GLUTTONY, ABILITY_THICK_FAT}, \ + .bodyColor = BODY_COLOR_GREEN, \ + .noFlip = FALSE + +#define SANDACONDA_MISC_INFO \ + .baseHP = 72, \ + .baseAttack = 107, \ + .baseDefense = 125, \ + .baseSpeed = 71, \ + .baseSpAttack = 65, \ + .baseSpDefense = 70, \ + .types = {TYPE_GROUND, TYPE_GROUND}, \ + .catchRate = 120, \ + .expYield = 179, \ + .evYield_Defense = 2, \ + .genderRatio = PERCENT_FEMALE(50), \ + .eggCycles = 20, \ + .friendship = STANDARD_FRIENDSHIP, \ + .growthRate = GROWTH_MEDIUM_FAST, \ + .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_DRAGON}, \ + .abilities = {ABILITY_SAND_SPIT, ABILITY_SHED_SKIN, ABILITY_SAND_VEIL}, \ + .bodyColor = BODY_COLOR_GREEN, \ + .noFlip = FALSE + +#define CRAMORANT_SPECIES_INFO \ { \ .baseHP = 70, \ .baseAttack = 85, \ @@ -704,29 +1191,47 @@ .noFlip = FALSE, \ } -#define TOXTRICITY_SPECIES_INFO(ability2) \ - { \ - .baseHP = 75, \ - .baseAttack = 98, \ - .baseDefense = 70, \ - .baseSpeed = 75, \ - .baseSpAttack = 114, \ - .baseSpDefense = 70, \ - .types = { TYPE_ELECTRIC, TYPE_POISON}, \ - .catchRate = 45, \ - .expYield = 176, \ - .evYield_SpAttack = 2, \ - .genderRatio = PERCENT_FEMALE(50), \ - .eggCycles = 25, \ - .friendship = STANDARD_FRIENDSHIP, \ - .growthRate = GROWTH_MEDIUM_SLOW, \ - .eggGroups = { EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE}, \ - .abilities = {ABILITY_PUNK_ROCK, ability2, ABILITY_TECHNICIAN},\ - .bodyColor = BODY_COLOR_PURPLE, \ - .noFlip = FALSE, \ - } +#define TOXTRICITY_MISC_INFO(ability2) \ + .baseHP = 75, \ + .baseAttack = 98, \ + .baseDefense = 70, \ + .baseSpeed = 75, \ + .baseSpAttack = 114, \ + .baseSpDefense = 70, \ + .types = { TYPE_ELECTRIC, TYPE_POISON}, \ + .catchRate = 45, \ + .expYield = 176, \ + .evYield_SpAttack = 2, \ + .genderRatio = PERCENT_FEMALE(50), \ + .eggCycles = 25, \ + .friendship = STANDARD_FRIENDSHIP, \ + .growthRate = GROWTH_MEDIUM_SLOW, \ + .eggGroups = { EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE}, \ + .abilities = {ABILITY_PUNK_ROCK, ability2, ABILITY_TECHNICIAN}, \ + .bodyColor = BODY_COLOR_PURPLE, \ + .noFlip = FALSE + +#define CENTISKORCH_MISC_INFO \ + .baseHP = 100, \ + .baseAttack = 115, \ + .baseDefense = 65, \ + .baseSpeed = 65, \ + .baseSpAttack = 90, \ + .baseSpDefense = 90, \ + .types = {TYPE_FIRE, TYPE_BUG}, \ + .catchRate = 75, \ + .expYield = 184, \ + .evYield_Attack = 2, \ + .genderRatio = PERCENT_FEMALE(50), \ + .eggCycles = 20, \ + .friendship = STANDARD_FRIENDSHIP, \ + .growthRate = GROWTH_MEDIUM_FAST, \ + .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG}, \ + .abilities = {ABILITY_FLASH_FIRE, ABILITY_WHITE_SMOKE, ABILITY_FLAME_BODY}, \ + .bodyColor = BODY_COLOR_RED, \ + .noFlip = FALSE -#define SINISTEA_SPECIES_INFO \ +#define SINISTEA_SPECIES_INFO \ { \ .baseHP = 40, \ .baseAttack = 45, \ @@ -770,8 +1275,47 @@ .noFlip = FALSE, \ } -#define ALCREMIE_SPECIES_INFO(color) \ - { \ +#define HATTERENE_MISC_INFO \ + .baseHP = 57, \ + .baseAttack = 90, \ + .baseDefense = 95, \ + .baseSpeed = 29, \ + .baseSpAttack = 136, \ + .baseSpDefense = 103, \ + .types = {TYPE_PSYCHIC, TYPE_FAIRY}, \ + .catchRate = 45, \ + .expYield = 255, \ + .evYield_SpAttack = 3, \ + .genderRatio = MON_FEMALE, \ + .eggCycles = 20, \ + .friendship = STANDARD_FRIENDSHIP, \ + .growthRate = GROWTH_SLOW, \ + .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_FAIRY}, \ + .abilities = {ABILITY_HEALER, ABILITY_ANTICIPATION, ABILITY_MAGIC_BOUNCE}, \ + .bodyColor = BODY_COLOR_PINK, \ + .noFlip = FALSE + +#define GRIMMSNARL_MISC_INFO \ + .baseHP = 95, \ + .baseAttack = 120, \ + .baseDefense = 65, \ + .baseSpeed = 60, \ + .baseSpAttack = 95, \ + .baseSpDefense = 75, \ + .types = {TYPE_DARK, TYPE_FAIRY}, \ + .catchRate = 45, \ + .expYield = 255, \ + .evYield_Attack = 3, \ + .genderRatio = MON_MALE, \ + .eggCycles = 20, \ + .friendship = STANDARD_FRIENDSHIP, \ + .growthRate = GROWTH_MEDIUM_FAST, \ + .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_HUMAN_LIKE}, \ + .abilities = {ABILITY_PRANKSTER, ABILITY_FRISK, ABILITY_PICKPOCKET},\ + .bodyColor = BODY_COLOR_PURPLE, \ + .noFlip = FALSE + +#define ALCREMIE_MISC_INFO(color) \ .baseHP = 65, \ .baseAttack = 60, \ .baseDefense = 75, \ @@ -784,13 +1328,12 @@ .evYield_SpDefense = 2, \ .genderRatio = MON_FEMALE, \ .eggCycles = 20, \ - .friendship = STANDARD_FRIENDSHIP, \ + .friendship = STANDARD_FRIENDSHIP, \ .growthRate = GROWTH_MEDIUM_FAST, \ - .eggGroups = { EGG_GROUP_FAIRY, EGG_GROUP_AMORPHOUS}, \ + .eggGroups = { EGG_GROUP_FAIRY, EGG_GROUP_AMORPHOUS}, \ .abilities = {ABILITY_SWEET_VEIL, ABILITY_NONE, ABILITY_AROMA_VEIL},\ .bodyColor = color, \ - .noFlip = FALSE, \ - } + .noFlip = FALSE #define MORPEKO_SPECIES_INFO \ { \ @@ -808,13 +1351,96 @@ .eggCycles = 10, \ .friendship = STANDARD_FRIENDSHIP, \ .growthRate = GROWTH_MEDIUM_FAST, \ - .eggGroups = { EGG_GROUP_FIELD, EGG_GROUP_FAIRY}, \ + .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FAIRY}, \ .abilities = {ABILITY_HUNGER_SWITCH, ABILITY_NONE},\ .bodyColor = BODY_COLOR_YELLOW, \ .noFlip = FALSE, \ } -#define ZARUDE_SPECIES_INFO \ +#define COPPERAJAH_MISC_INFO \ + .baseHP = 122, \ + .baseAttack = 130, \ + .baseDefense = 69, \ + .baseSpeed = 30, \ + .baseSpAttack = 80, \ + .baseSpDefense = 69, \ + .types = {TYPE_STEEL, TYPE_STEEL}, \ + .catchRate = 90, \ + .expYield = 175, \ + .evYield_Attack = 2, \ + .itemRare = ITEM_LAGGING_TAIL, \ + .genderRatio = PERCENT_FEMALE(50), \ + .eggCycles = 25, \ + .friendship = STANDARD_FRIENDSHIP, \ + .growthRate = GROWTH_MEDIUM_FAST, \ + .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_MINERAL}, \ + .abilities = {ABILITY_SHEER_FORCE, ABILITY_NONE, ABILITY_HEAVY_METAL}, \ + .bodyColor = BODY_COLOR_GREEN, \ + .noFlip = FALSE + +#define DURALUDON_MISC_INFO \ + .baseHP = 70, \ + .baseAttack = 95, \ + .baseDefense = 115, \ + .baseSpeed = 85, \ + .baseSpAttack = 120, \ + .baseSpDefense = 50, \ + .types = {TYPE_STEEL, TYPE_DRAGON}, \ + .catchRate = 45, \ + .expYield = 187, \ + .evYield_SpAttack = 2, \ + .genderRatio = PERCENT_FEMALE(50), \ + .eggCycles = 30, \ + .friendship = STANDARD_FRIENDSHIP, \ + .growthRate = GROWTH_MEDIUM_FAST, \ + .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_DRAGON}, \ + .abilities = {ABILITY_LIGHT_METAL, ABILITY_HEAVY_METAL, ABILITY_STALWART}, \ + .bodyColor = BODY_COLOR_WHITE, \ + .noFlip = FALSE + +#define URSHIFU_MISC_INFO \ + .baseHP = 100, \ + .baseAttack = 130, \ + .baseDefense = 100, \ + .baseSpeed = 97, \ + .baseSpAttack = 63, \ + .baseSpDefense = 60, \ + .types = {TYPE_FIGHTING, TYPE_DARK}, \ + .catchRate = 3, \ + .expYield = 275, \ + .evYield_Attack = 3, \ + .genderRatio = PERCENT_FEMALE(12.5), \ + .eggCycles = 120, \ + .friendship = STANDARD_FRIENDSHIP, \ + .growthRate = GROWTH_SLOW, \ + .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, \ + .abilities = {ABILITY_UNSEEN_FIST, ABILITY_NONE}, \ + .bodyColor = BODY_COLOR_GRAY, \ + .noFlip = FALSE, \ + .flags = SPECIES_FLAG_LEGENDARY + +#define URSHIFU_RAPID_STRIKE_STYLE_MISC_INFO \ + .baseHP = 100, \ + .baseAttack = 130, \ + .baseDefense = 100, \ + .baseSpeed = 97, \ + .baseSpAttack = 63, \ + .baseSpDefense = 60, \ + .types = {TYPE_FIGHTING, TYPE_WATER}, \ + .catchRate = 3, \ + .expYield = 275, \ + .evYield_Attack = 3, \ + .genderRatio = PERCENT_FEMALE(12.5), \ + .eggCycles = 120, \ + .friendship = STANDARD_FRIENDSHIP, \ + .growthRate = GROWTH_SLOW, \ + .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, \ + .abilities = {ABILITY_UNSEEN_FIST, ABILITY_NONE}, \ + .bodyColor = BODY_COLOR_GRAY, \ + .noFlip = FALSE, \ + .flags = SPECIES_FLAG_LEGENDARY + +#define ZARUDE_SPECIES_INFO \ { \ .baseHP = 105, \ .baseAttack = 120, \ @@ -886,28 +1512,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .noFlip = FALSE, }, - [SPECIES_VENUSAUR] = - { - .baseHP = 80, - .baseAttack = 82, - .baseDefense = 83, - .baseSpeed = 80, - .baseSpAttack = 100, - .baseSpDefense = 100, - .types = { TYPE_GRASS, TYPE_POISON }, - .catchRate = 45, - .expYield = 236, - .evYield_SpAttack = 2, - .evYield_SpDefense = 1, - .genderRatio = PERCENT_FEMALE(12.5), - .eggCycles = 20, - .friendship = STANDARD_FRIENDSHIP, - .growthRate = GROWTH_MEDIUM_SLOW, - .eggGroups = { EGG_GROUP_MONSTER, EGG_GROUP_GRASS}, - .abilities = {ABILITY_OVERGROW, ABILITY_NONE, ABILITY_CHLOROPHYLL}, - .bodyColor = BODY_COLOR_GREEN, - .noFlip = FALSE, - }, + [SPECIES_VENUSAUR] = { VENUSAUR_MISC_INFO, }, [SPECIES_CHARMANDER] = { @@ -956,24 +1561,7 @@ const struct SpeciesInfo gSpeciesInfo[] = [SPECIES_CHARIZARD] = { - .baseHP = 78, - .baseAttack = 84, - .baseDefense = 78, - .baseSpeed = 100, - .baseSpAttack = 109, - .baseSpDefense = 85, - .types = { TYPE_FIRE, TYPE_FLYING }, - .catchRate = 45, - .expYield = 240, - .evYield_SpAttack = 3, - .genderRatio = PERCENT_FEMALE(12.5), - .eggCycles = 20, - .friendship = STANDARD_FRIENDSHIP, - .growthRate = GROWTH_MEDIUM_SLOW, - .eggGroups = { EGG_GROUP_MONSTER, EGG_GROUP_DRAGON}, - .abilities = {ABILITY_BLAZE, ABILITY_NONE, ABILITY_SOLAR_POWER}, - .bodyColor = BODY_COLOR_RED, - .noFlip = FALSE, + CHARIZARD_MISC_INFO, }, [SPECIES_SQUIRTLE] = @@ -1023,24 +1611,7 @@ const struct SpeciesInfo gSpeciesInfo[] = [SPECIES_BLASTOISE] = { - .baseHP = 79, - .baseAttack = 83, - .baseDefense = 100, - .baseSpeed = 78, - .baseSpAttack = 85, - .baseSpDefense = 105, - .types = { TYPE_WATER, TYPE_WATER }, - .catchRate = 45, - .expYield = 239, - .evYield_SpDefense = 3, - .genderRatio = PERCENT_FEMALE(12.5), - .eggCycles = 20, - .friendship = STANDARD_FRIENDSHIP, - .growthRate = GROWTH_MEDIUM_SLOW, - .eggGroups = { EGG_GROUP_MONSTER, EGG_GROUP_WATER_1}, - .abilities = {ABILITY_TORRENT, ABILITY_NONE, ABILITY_RAIN_DISH}, - .bodyColor = BODY_COLOR_BLUE, - .noFlip = FALSE, + BLASTOISE_MISC_INFO, }, [SPECIES_CATERPIE] = @@ -1087,33 +1658,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .noFlip = FALSE, }, - [SPECIES_BUTTERFREE] = - { - .baseHP = 60, - .baseAttack = 45, - .baseDefense = 50, - .baseSpeed = 70, - .baseSpDefense = 80, - #if P_UPDATED_STATS >= GEN_6 - .baseSpAttack = 90, - #else - .baseSpAttack = 80, - #endif - .types = { TYPE_BUG, TYPE_FLYING}, - .catchRate = 45, - .expYield = 178, - .evYield_SpAttack = 2, - .evYield_SpDefense = 1, - .itemRare = ITEM_SILVER_POWDER, - .genderRatio = PERCENT_FEMALE(50), - .eggCycles = 15, - .friendship = STANDARD_FRIENDSHIP, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroups = { EGG_GROUP_BUG, EGG_GROUP_BUG}, - .abilities = {ABILITY_COMPOUND_EYES, ABILITY_NONE, ABILITY_TINTED_LENS}, - .bodyColor = BODY_COLOR_WHITE, - .noFlip = FALSE, - }, + [SPECIES_BUTTERFREE] = { BUTTERFREE_MISC_INFO, }, [SPECIES_WEEDLE] = { @@ -1395,7 +1940,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .noFlip = FALSE, }, - [SPECIES_PIKACHU] = PIKACHU_SPECIES_INFO(PERCENT_FEMALE(50), FLIP), + [SPECIES_PIKACHU] = { PIKACHU_MISC_INFO(PERCENT_FEMALE(50), FLIP) }, [SPECIES_RAICHU] = { @@ -2036,25 +2581,7 @@ const struct SpeciesInfo gSpeciesInfo[] = [SPECIES_MEOWTH] = { - .baseHP = 40, - .baseAttack = 45, - .baseDefense = 35, - .baseSpeed = 90, - .baseSpAttack = 40, - .baseSpDefense = 40, - .types = { TYPE_NORMAL, TYPE_NORMAL }, - .catchRate = 255, - .expYield = 58, - .evYield_Speed = 1, - .itemRare = ITEM_QUICK_CLAW, - .genderRatio = PERCENT_FEMALE(50), - .eggCycles = 20, - .friendship = STANDARD_FRIENDSHIP, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroups = { EGG_GROUP_FIELD, EGG_GROUP_FIELD}, - .abilities = {ABILITY_PICKUP, ABILITY_TECHNICIAN, ABILITY_UNNERVE}, - .bodyColor = BODY_COLOR_YELLOW, - .noFlip = FALSE, + MEOWTH_MISC_INFO }, [SPECIES_PERSIAN] = @@ -2405,25 +2932,7 @@ const struct SpeciesInfo gSpeciesInfo[] = [SPECIES_MACHAMP] = { - .baseHP = 90, - .baseAttack = 130, - .baseDefense = 80, - .baseSpeed = 55, - .baseSpAttack = 65, - .baseSpDefense = 85, - .types = { TYPE_FIGHTING, TYPE_FIGHTING }, - .catchRate = 45, - .expYield = 227, - .evYield_Attack = 3, - .itemRare = ITEM_FOCUS_BAND, - .genderRatio = PERCENT_FEMALE(25), - .eggCycles = 20, - .friendship = STANDARD_FRIENDSHIP, - .growthRate = GROWTH_MEDIUM_SLOW, - .eggGroups = { EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE}, - .abilities = {ABILITY_GUTS, ABILITY_NO_GUARD, ABILITY_STEADFAST}, - .bodyColor = BODY_COLOR_GRAY, - .noFlip = FALSE, + MACHAMP_MISC_INFO }, [SPECIES_BELLSPROUT] = @@ -3013,28 +3522,7 @@ const struct SpeciesInfo gSpeciesInfo[] = [SPECIES_GENGAR] = { - .baseHP = 60, - .baseAttack = 65, - .baseDefense = 60, - .baseSpeed = 110, - .baseSpAttack = 130, - .baseSpDefense = 75, - .types = { TYPE_GHOST, TYPE_POISON }, - .catchRate = 45, - .expYield = 225, - .evYield_SpAttack = 3, - .genderRatio = PERCENT_FEMALE(50), - .eggCycles = 20, - .friendship = STANDARD_FRIENDSHIP, - .growthRate = GROWTH_MEDIUM_SLOW, - .eggGroups = { EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS}, - #if P_UPDATED_ABILITIES >= GEN_7 - .abilities = {ABILITY_CURSED_BODY, ABILITY_NONE}, - #else - .abilities = {ABILITY_LEVITATE, ABILITY_NONE}, - #endif - .bodyColor = BODY_COLOR_PURPLE, - .noFlip = FALSE, + GENGAR_MISC_INFO }, [SPECIES_ONIX] = @@ -3127,24 +3615,7 @@ const struct SpeciesInfo gSpeciesInfo[] = [SPECIES_KINGLER] = { - .baseHP = 55, - .baseAttack = 130, - .baseDefense = 115, - .baseSpeed = 75, - .baseSpAttack = 50, - .baseSpDefense = 50, - .types = { TYPE_WATER, TYPE_WATER }, - .catchRate = 60, - .expYield = 166, - .evYield_Attack = 2, - .genderRatio = PERCENT_FEMALE(50), - .eggCycles = 20, - .friendship = STANDARD_FRIENDSHIP, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroups = { EGG_GROUP_WATER_3, EGG_GROUP_WATER_3}, - .abilities = {ABILITY_HYPER_CUTTER, ABILITY_SHELL_ARMOR, ABILITY_SHEER_FORCE}, - .bodyColor = BODY_COLOR_RED, - .noFlip = TRUE, + KINGLER_MISC_INFO, }, [SPECIES_VOLTORB] = @@ -3870,26 +4341,7 @@ const struct SpeciesInfo gSpeciesInfo[] = [SPECIES_LAPRAS] = { - .baseHP = 130, - .baseAttack = 85, - .baseDefense = 80, - .baseSpeed = 60, - .baseSpAttack = 85, - .baseSpDefense = 95, - .types = { TYPE_WATER, TYPE_ICE }, - .catchRate = 45, - .expYield = 187, - .evYield_HP = 2, - .itemCommon = ITEM_MYSTIC_WATER, - .itemRare = ITEM_MYSTIC_WATER, - .genderRatio = PERCENT_FEMALE(50), - .eggCycles = 40, - .friendship = STANDARD_FRIENDSHIP, - .growthRate = GROWTH_SLOW, - .eggGroups = { EGG_GROUP_MONSTER, EGG_GROUP_WATER_1}, - .abilities = {ABILITY_WATER_ABSORB, ABILITY_SHELL_ARMOR, ABILITY_HYDRATION}, - .bodyColor = BODY_COLOR_BLUE, - .noFlip = FALSE, + LAPRAS_MISC_INFO, }, [SPECIES_DITTO] = @@ -3918,24 +4370,7 @@ const struct SpeciesInfo gSpeciesInfo[] = [SPECIES_EEVEE] = { - .baseHP = 55, - .baseAttack = 55, - .baseDefense = 50, - .baseSpeed = 55, - .baseSpAttack = 45, - .baseSpDefense = 65, - .types = { TYPE_NORMAL, TYPE_NORMAL }, - .catchRate = 45, - .expYield = 65, - .evYield_SpDefense = 1, - .genderRatio = PERCENT_FEMALE(12.5), - .eggCycles = 35, - .friendship = STANDARD_FRIENDSHIP, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroups = { EGG_GROUP_FIELD, EGG_GROUP_FIELD}, - .abilities = {ABILITY_RUN_AWAY, ABILITY_ADAPTABILITY, ABILITY_ANTICIPATION}, - .bodyColor = BODY_COLOR_BROWN, - .noFlip = FALSE, + EEVEE_MISC_INFO, }, [SPECIES_VAPOREON] = @@ -4138,26 +4573,7 @@ const struct SpeciesInfo gSpeciesInfo[] = [SPECIES_SNORLAX] = { - .baseHP = 160, - .baseAttack = 110, - .baseDefense = 65, - .baseSpeed = 30, - .baseSpAttack = 65, - .baseSpDefense = 110, - .types = { TYPE_NORMAL, TYPE_NORMAL }, - .catchRate = 25, - .expYield = 189, - .evYield_HP = 2, - .itemCommon = ITEM_LEFTOVERS, - .itemRare = ITEM_LEFTOVERS, - .genderRatio = PERCENT_FEMALE(12.5), - .eggCycles = 40, - .friendship = STANDARD_FRIENDSHIP, - .growthRate = GROWTH_SLOW, - .eggGroups = { EGG_GROUP_MONSTER, EGG_GROUP_MONSTER}, - .abilities = {ABILITY_IMMUNITY, ABILITY_THICK_FAT, ABILITY_GLUTTONY}, - .bodyColor = BODY_COLOR_BLACK, - .noFlip = FALSE, + SNORLAX_MISC_INFO, }, [SPECIES_ARTICUNO] = @@ -13918,26 +14334,7 @@ const struct SpeciesInfo gSpeciesInfo[] = [SPECIES_GARBODOR] = { - .baseHP = 80, - .baseAttack = 95, - .baseDefense = 82, - .baseSpeed = 75, - .baseSpAttack = 60, - .baseSpDefense = 82, - .types = { TYPE_POISON, TYPE_POISON}, - .catchRate = 60, - .expYield = 166, - .evYield_Attack = 2, - .itemCommon = ITEM_SILK_SCARF, - .itemRare = ITEM_BLACK_SLUDGE, - .genderRatio = PERCENT_FEMALE(50), - .eggCycles = 20, - .friendship = STANDARD_FRIENDSHIP, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroups = { EGG_GROUP_MINERAL, EGG_GROUP_MINERAL}, - .abilities = {ABILITY_STENCH, ABILITY_WEAK_ARMOR, ABILITY_AFTERMATH}, - .bodyColor = BODY_COLOR_GREEN, - .noFlip = TRUE, + GARBODOR_MISC_INFO, }, [SPECIES_ZORUA] = @@ -19021,25 +19418,7 @@ const struct SpeciesInfo gSpeciesInfo[] = [SPECIES_MELMETAL] = { - .baseHP = 135, - .baseAttack = 143, - .baseDefense = 143, - .baseSpeed = 34, - .baseSpAttack = 80, - .baseSpDefense = 65, - .types = { TYPE_STEEL, TYPE_STEEL}, - .catchRate = 3, - .expYield = 270, - .evYield_Attack = 3, - .genderRatio = MON_GENDERLESS, - .eggCycles = 120, - .friendship = 0, - .growthRate = GROWTH_SLOW, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, - .abilities = {ABILITY_IRON_FIST, ABILITY_NONE}, - .bodyColor = BODY_COLOR_GRAY, - .noFlip = FALSE, - .flags = SPECIES_FLAG_MYTHICAL, + MELMETAL_MISC_INFO, }, #endif @@ -19088,26 +19467,9 @@ const struct SpeciesInfo gSpeciesInfo[] = .noFlip = FALSE, }, - [SPECIES_RILLABOOM] = + [SPECIES_RILLABOOM] = { - .baseHP = 100, - .baseAttack = 125, - .baseDefense = 90, - .baseSpeed = 85, - .baseSpAttack = 60, - .baseSpDefense = 70, - .types = { TYPE_GRASS, TYPE_GRASS}, - .catchRate = 45, - .expYield = 265, - .evYield_Attack = 3, - .genderRatio = PERCENT_FEMALE(12.5), - .eggCycles = 20, - .friendship = STANDARD_FRIENDSHIP, - .growthRate = GROWTH_MEDIUM_SLOW, - .eggGroups = { EGG_GROUP_FIELD, EGG_GROUP_GRASS}, - .abilities = {ABILITY_OVERGROW, ABILITY_NONE, ABILITY_GRASSY_SURGE}, - .bodyColor = BODY_COLOR_GREEN, - .noFlip = FALSE, + RILLABOOM_MISC_INFO, }, [SPECIES_SCORBUNNY] = @@ -19156,24 +19518,7 @@ const struct SpeciesInfo gSpeciesInfo[] = [SPECIES_CINDERACE] = { - .baseHP = 80, - .baseAttack = 116, - .baseDefense = 75, - .baseSpeed = 119, - .baseSpAttack = 65, - .baseSpDefense = 75, - .types = { TYPE_FIRE, TYPE_FIRE}, - .catchRate = 45, - .expYield = 265, - .evYield_Speed = 3, - .genderRatio = PERCENT_FEMALE(12.5), - .eggCycles = 20, - .friendship = STANDARD_FRIENDSHIP, - .growthRate = GROWTH_MEDIUM_SLOW, - .eggGroups = { EGG_GROUP_FIELD, EGG_GROUP_HUMAN_LIKE}, - .abilities = {ABILITY_BLAZE, ABILITY_NONE, ABILITY_LIBERO}, - .bodyColor = BODY_COLOR_WHITE, - .noFlip = FALSE, + CINDERACE_MISC_INFO, }, [SPECIES_SOBBLE] = @@ -19223,24 +19568,7 @@ const struct SpeciesInfo gSpeciesInfo[] = [SPECIES_INTELEON] = { - .baseHP = 70, - .baseAttack = 85, - .baseDefense = 65, - .baseSpeed = 120, - .baseSpAttack = 125, - .baseSpDefense = 65, - .types = { TYPE_WATER, TYPE_WATER}, - .catchRate = 45, - .expYield = 265, - .evYield_Speed = 3, - .genderRatio = PERCENT_FEMALE(12.5), - .eggCycles = 20, - .friendship = STANDARD_FRIENDSHIP, - .growthRate = GROWTH_MEDIUM_SLOW, - .eggGroups = { EGG_GROUP_WATER_1, EGG_GROUP_FIELD}, - .abilities = {ABILITY_TORRENT, ABILITY_NONE, ABILITY_SNIPER}, - .bodyColor = BODY_COLOR_BLUE, - .noFlip = FALSE, + INTELEON_MISC_INFO, }, [SPECIES_SKWOVET] = @@ -19335,24 +19663,7 @@ const struct SpeciesInfo gSpeciesInfo[] = [SPECIES_CORVIKNIGHT] = { - .baseHP = 98, - .baseAttack = 87, - .baseDefense = 105, - .baseSpeed = 67, - .baseSpAttack = 53, - .baseSpDefense = 85, - .types = { TYPE_FLYING, TYPE_STEEL}, - .catchRate = 45, - .expYield = 248, - .evYield_Defense = 3, - .genderRatio = PERCENT_FEMALE(50), - .eggCycles = 15, - .friendship = STANDARD_FRIENDSHIP, - .growthRate = GROWTH_MEDIUM_SLOW, - .eggGroups = { EGG_GROUP_FLYING, EGG_GROUP_FLYING}, - .abilities = {ABILITY_PRESSURE, ABILITY_UNNERVE, ABILITY_MIRROR_ARMOR}, - .bodyColor = BODY_COLOR_PURPLE, - .noFlip = FALSE, + CORVIKNIGHT_MISC_INFO, }, [SPECIES_BLIPBUG] = @@ -19402,25 +19713,7 @@ const struct SpeciesInfo gSpeciesInfo[] = [SPECIES_ORBEETLE] = { - .baseHP = 60, - .baseAttack = 45, - .baseDefense = 110, - .baseSpeed = 90, - .baseSpAttack = 80, - .baseSpDefense = 120, - .types = { TYPE_BUG, TYPE_PSYCHIC}, - .catchRate = 45, - .expYield = 253, - .evYield_SpDefense = 3, - .itemRare = ITEM_PSYCHIC_SEED, - .genderRatio = PERCENT_FEMALE(50), - .eggCycles = 15, - .friendship = STANDARD_FRIENDSHIP, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroups = { EGG_GROUP_BUG, EGG_GROUP_BUG}, - .abilities = {ABILITY_SWARM, ABILITY_FRISK, ABILITY_TELEPATHY}, - .bodyColor = BODY_COLOR_RED, - .noFlip = FALSE, + ORBEETLE_MISC_INFO, }, [SPECIES_NICKIT] = @@ -19579,24 +19872,7 @@ const struct SpeciesInfo gSpeciesInfo[] = [SPECIES_DREDNAW] = { - .baseHP = 90, - .baseAttack = 115, - .baseDefense = 90, - .baseSpeed = 74, - .baseSpAttack = 48, - .baseSpDefense = 68, - .types = { TYPE_WATER, TYPE_ROCK}, - .catchRate = 75, - .expYield = 170, - .evYield_Attack = 2, - .genderRatio = PERCENT_FEMALE(50), - .eggCycles = 20, - .friendship = STANDARD_FRIENDSHIP, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroups = { EGG_GROUP_MONSTER, EGG_GROUP_WATER_1}, - .abilities = {ABILITY_STRONG_JAW, ABILITY_SHELL_ARMOR, ABILITY_SWIFT_SWIM}, - .bodyColor = BODY_COLOR_GREEN, - .noFlip = FALSE, + DREDNAW_MISC_INFO, }, [SPECIES_YAMPER] = @@ -19671,34 +19947,12 @@ const struct SpeciesInfo gSpeciesInfo[] = .baseAttack = 60, .baseDefense = 90, .baseSpeed = 50, - .baseSpAttack = 60, - .baseSpDefense = 70, - .types = { TYPE_ROCK, TYPE_FIRE}, - .catchRate = 120, - .expYield = 144, - .evYield_Defense = 2, - .genderRatio = PERCENT_FEMALE(50), - .eggCycles = 15, - .friendship = STANDARD_FRIENDSHIP, - .growthRate = GROWTH_MEDIUM_SLOW, - .eggGroups = { EGG_GROUP_MINERAL, EGG_GROUP_MINERAL}, - .abilities = {ABILITY_STEAM_ENGINE, ABILITY_FLAME_BODY, ABILITY_FLASH_FIRE}, - .bodyColor = BODY_COLOR_BLACK, - .noFlip = FALSE, - }, - - [SPECIES_COALOSSAL] = - { - .baseHP = 110, - .baseAttack = 80, - .baseDefense = 120, - .baseSpeed = 30, - .baseSpAttack = 80, - .baseSpDefense = 90, + .baseSpAttack = 60, + .baseSpDefense = 70, .types = { TYPE_ROCK, TYPE_FIRE}, - .catchRate = 45, - .expYield = 255, - .evYield_Defense = 3, + .catchRate = 120, + .expYield = 144, + .evYield_Defense = 2, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = STANDARD_FRIENDSHIP, @@ -19709,6 +19963,11 @@ const struct SpeciesInfo gSpeciesInfo[] = .noFlip = FALSE, }, + [SPECIES_COALOSSAL] = + { + COALOSSAL_MISC_INFO, + }, + [SPECIES_APPLIN] = { .baseHP = 40, @@ -19733,46 +19992,12 @@ const struct SpeciesInfo gSpeciesInfo[] = [SPECIES_FLAPPLE] = { - .baseHP = 70, - .baseAttack = 110, - .baseDefense = 80, - .baseSpeed = 70, - .baseSpAttack = 95, - .baseSpDefense = 60, - .types = { TYPE_GRASS, TYPE_DRAGON}, - .catchRate = 45, - .expYield = 170, - .evYield_Attack = 2, - .genderRatio = PERCENT_FEMALE(50), - .eggCycles = 20, - .friendship = STANDARD_FRIENDSHIP, - .growthRate = GROWTH_ERRATIC, - .eggGroups = { EGG_GROUP_GRASS, EGG_GROUP_DRAGON}, - .abilities = {ABILITY_RIPEN, ABILITY_GLUTTONY, ABILITY_HUSTLE}, - .bodyColor = BODY_COLOR_GREEN, - .noFlip = FALSE, + FLAPPLE_MISC_INFO, }, [SPECIES_APPLETUN] = { - .baseHP = 110, - .baseAttack = 85, - .baseDefense = 80, - .baseSpeed = 30, - .baseSpAttack = 100, - .baseSpDefense = 80, - .types = { TYPE_GRASS, TYPE_DRAGON}, - .catchRate = 45, - .expYield = 170, - .evYield_HP = 2, - .genderRatio = PERCENT_FEMALE(50), - .eggCycles = 20, - .friendship = STANDARD_FRIENDSHIP, - .growthRate = GROWTH_ERRATIC, - .eggGroups = { EGG_GROUP_GRASS, EGG_GROUP_DRAGON}, - .abilities = {ABILITY_RIPEN, ABILITY_GLUTTONY, ABILITY_THICK_FAT}, - .bodyColor = BODY_COLOR_GREEN, - .noFlip = FALSE, + APPLETUN_MISC_INFO, }, [SPECIES_SILICOBRA] = @@ -19799,24 +20024,7 @@ const struct SpeciesInfo gSpeciesInfo[] = [SPECIES_SANDACONDA] = { - .baseHP = 72, - .baseAttack = 107, - .baseDefense = 125, - .baseSpeed = 71, - .baseSpAttack = 65, - .baseSpDefense = 70, - .types = { TYPE_GROUND, TYPE_GROUND}, - .catchRate = 120, - .expYield = 179, - .evYield_Defense = 2, - .genderRatio = PERCENT_FEMALE(50), - .eggCycles = 20, - .friendship = STANDARD_FRIENDSHIP, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroups = { EGG_GROUP_FIELD, EGG_GROUP_DRAGON}, - .abilities = {ABILITY_SAND_SPIT, ABILITY_SHED_SKIN, ABILITY_SAND_VEIL}, - .bodyColor = BODY_COLOR_GREEN, - .noFlip = FALSE, + SANDACONDA_MISC_INFO, }, [SPECIES_CRAMORANT] = CRAMORANT_SPECIES_INFO, @@ -19887,7 +20095,10 @@ const struct SpeciesInfo gSpeciesInfo[] = .noFlip = FALSE, }, - [SPECIES_TOXTRICITY] = TOXTRICITY_SPECIES_INFO(ABILITY_PLUS), + [SPECIES_TOXTRICITY] = + { + TOXTRICITY_MISC_INFO(ABILITY_PLUS), + }, [SPECIES_SIZZLIPEDE] = { @@ -19913,24 +20124,7 @@ const struct SpeciesInfo gSpeciesInfo[] = [SPECIES_CENTISKORCH] = { - .baseHP = 100, - .baseAttack = 115, - .baseDefense = 65, - .baseSpeed = 65, - .baseSpAttack = 90, - .baseSpDefense = 90, - .types = { TYPE_FIRE, TYPE_BUG}, - .catchRate = 75, - .expYield = 184, - .evYield_Attack = 2, - .genderRatio = PERCENT_FEMALE(50), - .eggCycles = 20, - .friendship = STANDARD_FRIENDSHIP, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroups = { EGG_GROUP_BUG, EGG_GROUP_BUG}, - .abilities = {ABILITY_FLASH_FIRE, ABILITY_WHITE_SMOKE, ABILITY_FLAME_BODY}, - .bodyColor = BODY_COLOR_RED, - .noFlip = FALSE, + CENTISKORCH_MISC_INFO, }, [SPECIES_CLOBBOPUS] = @@ -20027,24 +20221,7 @@ const struct SpeciesInfo gSpeciesInfo[] = [SPECIES_HATTERENE] = { - .baseHP = 57, - .baseAttack = 90, - .baseDefense = 95, - .baseSpeed = 29, - .baseSpAttack = 136, - .baseSpDefense = 103, - .types = { TYPE_PSYCHIC, TYPE_FAIRY}, - .catchRate = 45, - .expYield = 255, - .evYield_SpAttack = 3, - .genderRatio = MON_FEMALE, - .eggCycles = 20, - .friendship = STANDARD_FRIENDSHIP, - .growthRate = GROWTH_SLOW, - .eggGroups = { EGG_GROUP_FAIRY, EGG_GROUP_FAIRY}, - .abilities = {ABILITY_HEALER, ABILITY_ANTICIPATION, ABILITY_MAGIC_BOUNCE}, - .bodyColor = BODY_COLOR_PINK, - .noFlip = FALSE, + HATTERENE_MISC_INFO, }, [SPECIES_IMPIDIMP] = @@ -20093,24 +20270,7 @@ const struct SpeciesInfo gSpeciesInfo[] = [SPECIES_GRIMMSNARL] = { - .baseHP = 95, - .baseAttack = 120, - .baseDefense = 65, - .baseSpeed = 60, - .baseSpAttack = 95, - .baseSpDefense = 75, - .types = { TYPE_DARK, TYPE_FAIRY}, - .catchRate = 45, - .expYield = 255, - .evYield_Attack = 3, - .genderRatio = MON_MALE, - .eggCycles = 20, - .friendship = STANDARD_FRIENDSHIP, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroups = { EGG_GROUP_FAIRY, EGG_GROUP_HUMAN_LIKE}, - .abilities = {ABILITY_PRANKSTER, ABILITY_FRISK, ABILITY_PICKPOCKET}, - .bodyColor = BODY_COLOR_PURPLE, - .noFlip = FALSE, + GRIMMSNARL_MISC_INFO, }, [SPECIES_OBSTAGOON] = @@ -20268,7 +20428,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .noFlip = FALSE, }, - [SPECIES_ALCREMIE] = ALCREMIE_SPECIES_INFO(BODY_COLOR_WHITE), + [SPECIES_ALCREMIE] = { ALCREMIE_MISC_INFO(BODY_COLOR_WHITE) }, [SPECIES_FALINKS] = { @@ -20453,25 +20613,7 @@ const struct SpeciesInfo gSpeciesInfo[] = [SPECIES_COPPERAJAH] = { - .baseHP = 122, - .baseAttack = 130, - .baseDefense = 69, - .baseSpeed = 30, - .baseSpAttack = 80, - .baseSpDefense = 69, - .types = { TYPE_STEEL, TYPE_STEEL}, - .catchRate = 90, - .expYield = 175, - .evYield_Attack = 2, - .itemRare = ITEM_LAGGING_TAIL, - .genderRatio = PERCENT_FEMALE(50), - .eggCycles = 25, - .friendship = STANDARD_FRIENDSHIP, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroups = { EGG_GROUP_FIELD, EGG_GROUP_MINERAL}, - .abilities = {ABILITY_SHEER_FORCE, ABILITY_NONE, ABILITY_HEAVY_METAL}, - .bodyColor = BODY_COLOR_GREEN, - .noFlip = FALSE, + COPPERAJAH_MISC_INFO, }, [SPECIES_DRACOZOLT] = @@ -20564,24 +20706,7 @@ const struct SpeciesInfo gSpeciesInfo[] = [SPECIES_DURALUDON] = { - .baseHP = 70, - .baseAttack = 95, - .baseDefense = 115, - .baseSpeed = 85, - .baseSpAttack = 120, - .baseSpDefense = 50, - .types = { TYPE_STEEL, TYPE_DRAGON}, - .catchRate = 45, - .expYield = 187, - .evYield_SpAttack = 2, - .genderRatio = PERCENT_FEMALE(50), - .eggCycles = 30, - .friendship = STANDARD_FRIENDSHIP, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroups = { EGG_GROUP_MINERAL, EGG_GROUP_DRAGON}, - .abilities = {ABILITY_LIGHT_METAL, ABILITY_HEAVY_METAL, ABILITY_STALWART}, - .bodyColor = BODY_COLOR_WHITE, - .noFlip = FALSE, + DURALUDON_MISC_INFO, }, [SPECIES_DREEPY] = @@ -20742,28 +20867,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .flags = SPECIES_FLAG_LEGENDARY, }, - [SPECIES_URSHIFU] = - { - .baseHP = 100, - .baseAttack = 130, - .baseDefense = 100, - .baseSpeed = 97, - .baseSpAttack = 63, - .baseSpDefense = 60, - .types = { TYPE_FIGHTING, TYPE_DARK}, - .catchRate = 3, - .expYield = 275, - .evYield_Attack = 3, - .genderRatio = PERCENT_FEMALE(12.5), - .eggCycles = 120, - .friendship = STANDARD_FRIENDSHIP, - .growthRate = GROWTH_SLOW, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, - .abilities = {ABILITY_UNSEEN_FIST, ABILITY_NONE}, - .bodyColor = BODY_COLOR_GRAY, - .noFlip = FALSE, - .flags = SPECIES_FLAG_LEGENDARY, - }, + [SPECIES_URSHIFU] = { URSHIFU_MISC_INFO, }, [SPECIES_ZARUDE] = ZARUDE_SPECIES_INFO, @@ -24522,20 +24626,23 @@ const struct SpeciesInfo gSpeciesInfo[] = [SPECIES_CRAMORANT_GULPING] = CRAMORANT_SPECIES_INFO, [SPECIES_CRAMORANT_GORGING] = CRAMORANT_SPECIES_INFO, - [SPECIES_TOXTRICITY_LOW_KEY] = TOXTRICITY_SPECIES_INFO(ABILITY_MINUS), + [SPECIES_TOXTRICITY_LOW_KEY] = + { + TOXTRICITY_MISC_INFO(ABILITY_MINUS), + }, [SPECIES_SINISTEA_ANTIQUE] = SINISTEA_SPECIES_INFO, [SPECIES_POLTEAGEIST_ANTIQUE] = POLTEAGEIST_SPECIES_INFO, - [SPECIES_ALCREMIE_RUBY_CREAM] = ALCREMIE_SPECIES_INFO(BODY_COLOR_PINK), - [SPECIES_ALCREMIE_MATCHA_CREAM] = ALCREMIE_SPECIES_INFO(BODY_COLOR_GREEN), - [SPECIES_ALCREMIE_MINT_CREAM] = ALCREMIE_SPECIES_INFO(BODY_COLOR_BLUE), - [SPECIES_ALCREMIE_LEMON_CREAM] = ALCREMIE_SPECIES_INFO(BODY_COLOR_YELLOW), - [SPECIES_ALCREMIE_SALTED_CREAM] = ALCREMIE_SPECIES_INFO(BODY_COLOR_WHITE), - [SPECIES_ALCREMIE_RUBY_SWIRL] = ALCREMIE_SPECIES_INFO(BODY_COLOR_YELLOW), - [SPECIES_ALCREMIE_CARAMEL_SWIRL] = ALCREMIE_SPECIES_INFO(BODY_COLOR_BROWN), - [SPECIES_ALCREMIE_RAINBOW_SWIRL] = ALCREMIE_SPECIES_INFO(BODY_COLOR_YELLOW), + [SPECIES_ALCREMIE_RUBY_CREAM] = { ALCREMIE_MISC_INFO(BODY_COLOR_PINK) }, + [SPECIES_ALCREMIE_MATCHA_CREAM] = { ALCREMIE_MISC_INFO(BODY_COLOR_GREEN) }, + [SPECIES_ALCREMIE_MINT_CREAM] = { ALCREMIE_MISC_INFO(BODY_COLOR_BLUE) }, + [SPECIES_ALCREMIE_LEMON_CREAM] = { ALCREMIE_MISC_INFO(BODY_COLOR_YELLOW) }, + [SPECIES_ALCREMIE_SALTED_CREAM] = { ALCREMIE_MISC_INFO(BODY_COLOR_WHITE) }, + [SPECIES_ALCREMIE_RUBY_SWIRL] = { ALCREMIE_MISC_INFO(BODY_COLOR_YELLOW) }, + [SPECIES_ALCREMIE_CARAMEL_SWIRL] = { ALCREMIE_MISC_INFO(BODY_COLOR_BROWN) }, + [SPECIES_ALCREMIE_RAINBOW_SWIRL] = { ALCREMIE_MISC_INFO(BODY_COLOR_YELLOW) }, [SPECIES_EISCUE_NOICE_FACE] = { @@ -24654,25 +24761,7 @@ const struct SpeciesInfo gSpeciesInfo[] = [SPECIES_URSHIFU_RAPID_STRIKE_STYLE] = { - .baseHP = 100, - .baseAttack = 130, - .baseDefense = 100, - .baseSpeed = 97, - .baseSpAttack = 63, - .baseSpDefense = 60, - .types = { TYPE_FIGHTING, TYPE_WATER}, - .catchRate = 3, - .expYield = 275, - .evYield_Attack = 3, - .genderRatio = PERCENT_FEMALE(12.5), - .eggCycles = 120, - .friendship = STANDARD_FRIENDSHIP, - .growthRate = GROWTH_SLOW, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, - .abilities = {ABILITY_UNSEEN_FIST, ABILITY_NONE}, - .bodyColor = BODY_COLOR_GRAY, - .noFlip = FALSE, - .flags = SPECIES_FLAG_LEGENDARY, + URSHIFU_RAPID_STRIKE_STYLE_MISC_INFO, }, [SPECIES_ZARUDE_DADA] = ZARUDE_SPECIES_INFO, @@ -24745,5 +24834,173 @@ const struct SpeciesInfo gSpeciesInfo[] = .noFlip = FALSE, .flags = SPECIES_FLAG_LEGENDARY, }, + + // Gigantamax Forms + [SPECIES_VENUSAUR_GIGANTAMAX] = + { + VENUSAUR_MISC_INFO, + .gigantamax = TRUE, + }, + [SPECIES_CHARIZARD_GIGANTAMAX] = + { + CHARIZARD_MISC_INFO, + .gigantamax = TRUE, + }, + [SPECIES_BLASTOISE_GIGANTAMAX] = + { + BLASTOISE_MISC_INFO, + .gigantamax = TRUE, + }, + [SPECIES_BUTTERFREE_GIGANTAMAX] = + { + BUTTERFREE_MISC_INFO, + .gigantamax = TRUE, + }, + [SPECIES_PIKACHU_GIGANTAMAX] = + { + PIKACHU_MISC_INFO(PERCENT_FEMALE(50), FLIP), + .gigantamax = TRUE, + }, + [SPECIES_MEOWTH_GIGANTAMAX] = + { + MEOWTH_MISC_INFO, + .gigantamax = TRUE, + }, + [SPECIES_MACHAMP_GIGANTAMAX] = + { + MACHAMP_MISC_INFO, + .gigantamax = TRUE, + }, + [SPECIES_GENGAR_GIGANTAMAX] = + { + GENGAR_MISC_INFO, + .gigantamax = TRUE, + }, + [SPECIES_KINGLER_GIGANTAMAX] = + { + KINGLER_MISC_INFO, + .gigantamax = TRUE, + }, + [SPECIES_LAPRAS_GIGANTAMAX] = + { + LAPRAS_MISC_INFO, + .gigantamax = TRUE, + }, + [SPECIES_EEVEE_GIGANTAMAX] = + { + EEVEE_MISC_INFO, + .gigantamax = TRUE, + }, + [SPECIES_SNORLAX_GIGANTAMAX] = + { + SNORLAX_MISC_INFO, + .gigantamax = TRUE, + }, + [SPECIES_GARBODOR_GIGANTAMAX] = + { + GARBODOR_MISC_INFO, + .gigantamax = TRUE, + }, + [SPECIES_MELMETAL_GIGANTAMAX] = + { + MELMETAL_MISC_INFO, + .gigantamax = TRUE, + }, + [SPECIES_RILLABOOM_GIGANTAMAX] = + { + RILLABOOM_MISC_INFO, + .gigantamax = TRUE, + }, + [SPECIES_CINDERACE_GIGANTAMAX] = + { + CINDERACE_MISC_INFO, + .gigantamax = TRUE, + }, + [SPECIES_INTELEON_GIGANTAMAX] = + { + INTELEON_MISC_INFO, + .gigantamax = TRUE, + }, + [SPECIES_CORVIKNIGHT_GIGANTAMAX] = + { + CORVIKNIGHT_MISC_INFO, + .gigantamax = TRUE, + }, + [SPECIES_ORBEETLE_GIGANTAMAX] = + { + ORBEETLE_MISC_INFO, + .gigantamax = TRUE, + }, + [SPECIES_DREDNAW_GIGANTAMAX] = + { + DREDNAW_MISC_INFO, + .gigantamax = TRUE, + }, + [SPECIES_COALOSSAL_GIGANTAMAX] = + { + COALOSSAL_MISC_INFO, + .gigantamax = TRUE, + }, + [SPECIES_FLAPPLE_GIGANTAMAX] = + { + FLAPPLE_MISC_INFO, + .gigantamax = TRUE, + }, + [SPECIES_APPLETUN_GIGANTAMAX] = + { + APPLETUN_MISC_INFO, + .gigantamax = TRUE, + }, + [SPECIES_SANDACONDA_GIGANTAMAX] = + { + SANDACONDA_MISC_INFO, + .gigantamax = TRUE, + }, + [SPECIES_TOXTRICITY_GIGANTAMAX] = + { + TOXTRICITY_MISC_INFO(ABILITY_PLUS), + .gigantamax = TRUE, + }, + [SPECIES_CENTISKORCH_GIGANTAMAX] = + { + CENTISKORCH_MISC_INFO, + .gigantamax = TRUE, + }, + [SPECIES_HATTERENE_GIGANTAMAX] = + { + HATTERENE_MISC_INFO, + .gigantamax = TRUE, + }, + [SPECIES_GRIMMSNARL_GIGANTAMAX] = + { + GRIMMSNARL_MISC_INFO, + .gigantamax = TRUE, + }, + [SPECIES_ALCREMIE_GIGANTAMAX] = + { + ALCREMIE_MISC_INFO(BODY_COLOR_PINK), + .gigantamax = TRUE, + }, + [SPECIES_COPPERAJAH_GIGANTAMAX] = + { + COPPERAJAH_MISC_INFO, + .gigantamax = TRUE, + }, + [SPECIES_DURALUDON_GIGANTAMAX] = + { + DURALUDON_MISC_INFO, + .gigantamax = TRUE, + }, + [SPECIES_URSHIFU_GIGANTAMAX] = + { + URSHIFU_MISC_INFO, + .gigantamax = TRUE, + }, + [SPECIES_URSHIFU_RAPID_STRIKE_STYLE_GIGANTAMAX] = + { + URSHIFU_RAPID_STRIKE_STYLE_MISC_INFO, + .gigantamax = TRUE, + }, + #endif }; diff --git a/src/data/pokemon/teachable_learnset_pointers.h b/src/data/pokemon/teachable_learnset_pointers.h index f8faf62d8ffa..b4505e921998 100644 --- a/src/data/pokemon/teachable_learnset_pointers.h +++ b/src/data/pokemon/teachable_learnset_pointers.h @@ -1334,6 +1334,41 @@ const u16 *const gTeachableLearnsets[NUM_SPECIES] = [SPECIES_CALYREX_SHADOW_RIDER] = sCalyrexShadowRiderTeachableLearnset, // Enamorus [SPECIES_ENAMORUS_THERIAN] = sEnamorusTeachableLearnset, + // Basculegion [SPECIES_BASCULEGION_FEMALE] = sBasculegionTeachableLearnset, + // Gigantamax Forms + [SPECIES_VENUSAUR_GIGANTAMAX] = sVenusaurTeachableLearnset, + [SPECIES_CHARIZARD_GIGANTAMAX] = sCharizardTeachableLearnset, + [SPECIES_BLASTOISE_GIGANTAMAX] = sBlastoiseTeachableLearnset, + [SPECIES_BUTTERFREE_GIGANTAMAX] = sButterfreeTeachableLearnset, + [SPECIES_PIKACHU_GIGANTAMAX] = sPikachuTeachableLearnset, + [SPECIES_MEOWTH_GIGANTAMAX] = sMeowthTeachableLearnset, + [SPECIES_MACHAMP_GIGANTAMAX] = sMachampTeachableLearnset, + [SPECIES_GENGAR_GIGANTAMAX] = sGengarTeachableLearnset, + [SPECIES_KINGLER_GIGANTAMAX] = sKinglerTeachableLearnset, + [SPECIES_LAPRAS_GIGANTAMAX] = sLaprasTeachableLearnset, + [SPECIES_EEVEE_GIGANTAMAX] = sEeveeTeachableLearnset, + [SPECIES_SNORLAX_GIGANTAMAX] = sSnorlaxTeachableLearnset, + [SPECIES_GARBODOR_GIGANTAMAX] = sGarbodorTeachableLearnset, + [SPECIES_MELMETAL_GIGANTAMAX] = sMelmetalTeachableLearnset, + [SPECIES_RILLABOOM_GIGANTAMAX] = sRillaboomTeachableLearnset, + [SPECIES_CINDERACE_GIGANTAMAX] = sCinderaceTeachableLearnset, + [SPECIES_INTELEON_GIGANTAMAX] = sInteleonTeachableLearnset, + [SPECIES_CORVIKNIGHT_GIGANTAMAX] = sCorviknightTeachableLearnset, + [SPECIES_ORBEETLE_GIGANTAMAX] = sOrbeetleTeachableLearnset, + [SPECIES_DREDNAW_GIGANTAMAX] = sDrednawTeachableLearnset, + [SPECIES_COALOSSAL_GIGANTAMAX] = sCoalossalTeachableLearnset, + [SPECIES_FLAPPLE_GIGANTAMAX] = sFlappleTeachableLearnset, + [SPECIES_APPLETUN_GIGANTAMAX] = sAppletunTeachableLearnset, + [SPECIES_SANDACONDA_GIGANTAMAX] = sSandacondaTeachableLearnset, + [SPECIES_TOXTRICITY_GIGANTAMAX] = sToxtricityTeachableLearnset, + [SPECIES_CENTISKORCH_GIGANTAMAX] = sCentiskorchTeachableLearnset, + [SPECIES_HATTERENE_GIGANTAMAX] = sHattereneTeachableLearnset, + [SPECIES_GRIMMSNARL_GIGANTAMAX] = sGrimmsnarlTeachableLearnset, + [SPECIES_ALCREMIE_GIGANTAMAX] = sAlcremieTeachableLearnset, + [SPECIES_COPPERAJAH_GIGANTAMAX] = sCopperajahTeachableLearnset, + [SPECIES_DURALUDON_GIGANTAMAX] = sDuraludonTeachableLearnset, + [SPECIES_URSHIFU_GIGANTAMAX] = sUrshifuTeachableLearnset, + [SPECIES_URSHIFU_RAPID_STRIKE_STYLE_GIGANTAMAX] = sUrshifuRapidStrikeStyleTeachableLearnset, #endif }; diff --git a/src/data/pokemon_graphics/back_pic_coordinates.h b/src/data/pokemon_graphics/back_pic_coordinates.h index d967a50fcabb..6cbaa6c493ec 100644 --- a/src/data/pokemon_graphics/back_pic_coordinates.h +++ b/src/data/pokemon_graphics/back_pic_coordinates.h @@ -1358,6 +1358,40 @@ const struct MonCoords gMonBackPicCoords[NUM_SPECIES + 1] = [SPECIES_ENAMORUS_THERIAN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2 }, // Basculegion [SPECIES_BASCULEGION_FEMALE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + // Gigantamax Forms + [SPECIES_VENUSAUR_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 11 }, + [SPECIES_CHARIZARD_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1 }, + [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 = 0 }, + [SPECIES_MEOWTH_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 5 }, + [SPECIES_MACHAMP_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3 }, + [SPECIES_GENGAR_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6 }, + [SPECIES_KINGLER_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 5 }, + [SPECIES_LAPRAS_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1 }, + [SPECIES_EEVEE_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 7 }, + [SPECIES_SNORLAX_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 5 }, + [SPECIES_GARBODOR_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2 }, + [SPECIES_MELMETAL_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 14 }, + [SPECIES_RILLABOOM_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 4 }, + [SPECIES_CINDERACE_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 4 }, + [SPECIES_INTELEON_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 4 }, + [SPECIES_CORVIKNIGHT_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3 }, + [SPECIES_ORBEETLE_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6 }, + [SPECIES_DREDNAW_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 12 }, + [SPECIES_COALOSSAL_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 8 }, + [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 = 5 }, + [SPECIES_TOXTRICITY_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_CENTISKORCH_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1 }, + [SPECIES_HATTERENE_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3 }, + [SPECIES_GRIMMSNARL_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 10 }, + [SPECIES_ALCREMIE_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 8 }, + [SPECIES_COPPERAJAH_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 7 }, + [SPECIES_DURALUDON_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + [SPECIES_URSHIFU_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 4 }, + [SPECIES_URSHIFU_RAPID_STRIKE_STYLE_GIGANTAMAX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 4 }, #endif [SPECIES_EGG] = { .size = MON_COORDS_SIZE(24, 24), .y_offset = 20 }, }; diff --git a/src/data/pokemon_graphics/back_pic_table.h b/src/data/pokemon_graphics/back_pic_table.h index a232abb567ea..06316431cc4c 100644 --- a/src/data/pokemon_graphics/back_pic_table.h +++ b/src/data/pokemon_graphics/back_pic_table.h @@ -1334,6 +1334,41 @@ const struct CompressedSpriteSheet gMonBackPicTable[NUM_SPECIES + 1] = SPECIES_SPRITE(ENAMORUS_THERIAN, gMonBackPic_EnamorusTherian), SPECIES_SPRITE(BASCULEGION_FEMALE, gMonBackPic_BasculegionFemale), + + // Gigantamax Forms + SPECIES_SPRITE(VENUSAUR_GIGANTAMAX, gMonBackPic_VenusaurGigantamax), + SPECIES_SPRITE(CHARIZARD_GIGANTAMAX, gMonBackPic_CharizardGigantamax), + SPECIES_SPRITE(BLASTOISE_GIGANTAMAX, gMonBackPic_BlastoiseGigantamax), + SPECIES_SPRITE(BUTTERFREE_GIGANTAMAX, gMonBackPic_ButterfreeGigantamax), + SPECIES_SPRITE(PIKACHU_GIGANTAMAX, gMonBackPic_PikachuGigantamax), + SPECIES_SPRITE(MEOWTH_GIGANTAMAX, gMonBackPic_MeowthGigantamax), + SPECIES_SPRITE(MACHAMP_GIGANTAMAX, gMonBackPic_MachampGigantamax), + SPECIES_SPRITE(GENGAR_GIGANTAMAX, gMonBackPic_GengarGigantamax), + SPECIES_SPRITE(KINGLER_GIGANTAMAX, gMonBackPic_KinglerGigantamax), + SPECIES_SPRITE(LAPRAS_GIGANTAMAX, gMonBackPic_LaprasGigantamax), + SPECIES_SPRITE(EEVEE_GIGANTAMAX, gMonBackPic_EeveeGigantamax), + SPECIES_SPRITE(SNORLAX_GIGANTAMAX, gMonBackPic_SnorlaxGigantamax), + SPECIES_SPRITE(GARBODOR_GIGANTAMAX, gMonBackPic_GarbodorGigantamax), + SPECIES_SPRITE(MELMETAL_GIGANTAMAX, gMonBackPic_MelmetalGigantamax), + SPECIES_SPRITE(RILLABOOM_GIGANTAMAX, gMonBackPic_RillaboomGigantamax), + SPECIES_SPRITE(CINDERACE_GIGANTAMAX, gMonBackPic_CinderaceGigantamax), + SPECIES_SPRITE(INTELEON_GIGANTAMAX, gMonBackPic_InteleonGigantamax), + SPECIES_SPRITE(CORVIKNIGHT_GIGANTAMAX, gMonBackPic_CorviknightGigantamax), + SPECIES_SPRITE(ORBEETLE_GIGANTAMAX, gMonBackPic_OrbeetleGigantamax), + SPECIES_SPRITE(DREDNAW_GIGANTAMAX, gMonBackPic_DrednawGigantamax), + SPECIES_SPRITE(COALOSSAL_GIGANTAMAX, gMonBackPic_CoalossalGigantamax), + SPECIES_SPRITE(FLAPPLE_GIGANTAMAX, gMonBackPic_FlappleGigantamax), + SPECIES_SPRITE(APPLETUN_GIGANTAMAX, gMonBackPic_AppletunGigantamax), + SPECIES_SPRITE(SANDACONDA_GIGANTAMAX, gMonBackPic_SandacondaGigantamax), + SPECIES_SPRITE(TOXTRICITY_GIGANTAMAX, gMonBackPic_ToxtricityGigantamax), + SPECIES_SPRITE(CENTISKORCH_GIGANTAMAX, gMonBackPic_CentiskorchGigantamax), + SPECIES_SPRITE(HATTERENE_GIGANTAMAX, gMonBackPic_HattereneGigantamax), + SPECIES_SPRITE(GRIMMSNARL_GIGANTAMAX, gMonBackPic_GrimmsnarlGigantamax), + SPECIES_SPRITE(ALCREMIE_GIGANTAMAX, gMonBackPic_AlcremieGigantamax), + SPECIES_SPRITE(COPPERAJAH_GIGANTAMAX, gMonBackPic_CopperajahGigantamax), + SPECIES_SPRITE(DURALUDON_GIGANTAMAX, gMonBackPic_DuraludonGigantamax), + SPECIES_SPRITE(URSHIFU_GIGANTAMAX, gMonBackPic_UrshifuGigantamax), + SPECIES_SPRITE(URSHIFU_RAPID_STRIKE_STYLE_GIGANTAMAX, gMonBackPic_UrshifuRapidStrikeGigantamax), #endif SPECIES_SPRITE(EGG, gMonFrontPic_Egg), }; diff --git a/src/data/pokemon_graphics/enemy_mon_elevation.h b/src/data/pokemon_graphics/enemy_mon_elevation.h index 007c6a90a77c..436e7e1dd7df 100644 --- a/src/data/pokemon_graphics/enemy_mon_elevation.h +++ b/src/data/pokemon_graphics/enemy_mon_elevation.h @@ -268,4 +268,5 @@ const u8 gEnemyMonElevation[NUM_SPECIES + 1] = [SPECIES_SINISTEA_ANTIQUE] = 10, [SPECIES_POLTEAGEIST_ANTIQUE] = 12, [SPECIES_ETERNATUS_ETERNAMAX] = 13, + [SPECIES_BUTTERFREE_GIGANTAMAX] = 10, }; diff --git a/src/data/pokemon_graphics/front_pic_anims.h b/src/data/pokemon_graphics/front_pic_anims.h index 27e38d022173..e820b21f8560 100644 --- a/src/data/pokemon_graphics/front_pic_anims.h +++ b/src/data/pokemon_graphics/front_pic_anims.h @@ -8191,15 +8191,7 @@ static const union AnimCmd sAnim_Dedenne_1[] = static const union AnimCmd sAnim_Carbink_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(0, 1), ANIMCMD_END, }; @@ -10162,6 +10154,208 @@ static const union AnimCmd sAnim_DecidueyeHisuian_1[] = }; #endif +static const union AnimCmd sAnim_VENUSAUR_GIGANTAMAX_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd sAnim_CHARIZARD_GIGANTAMAX_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd sAnim_BLASTOISE_GIGANTAMAX_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd sAnim_BUTTERFREE_GIGANTAMAX_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd sAnim_PIKACHU_GIGANTAMAX_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd sAnim_MEOWTH_GIGANTAMAX_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd sAnim_MACHAMP_GIGANTAMAX_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd sAnim_GENGAR_GIGANTAMAX_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd sAnim_KINGLER_GIGANTAMAX_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd sAnim_LAPRAS_GIGANTAMAX_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd sAnim_EEVEE_GIGANTAMAX_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd sAnim_SNORLAX_GIGANTAMAX_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +#if P_GEN_5_POKEMON == TRUE +static const union AnimCmd sAnim_GARBODOR_GIGANTAMAX_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; +#endif +#if P_GEN_7_POKEMON == TRUE +static const union AnimCmd sAnim_MELMETAL_GIGANTAMAX_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; +#endif +#if P_GEN_8_POKEMON == TRUE +static const union AnimCmd sAnim_RILLABOOM_GIGANTAMAX_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd sAnim_CINDERACE_GIGANTAMAX_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd sAnim_INTELEON_GIGANTAMAX_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd sAnim_CORVIKNIGHT_GIGANTAMAX_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd sAnim_ORBEETLE_GIGANTAMAX_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd sAnim_DREDNAW_GIGANTAMAX_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd sAnim_COALOSSAL_GIGANTAMAX_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd sAnim_FLAPPLE_GIGANTAMAX_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd sAnim_APPLETUN_GIGANTAMAX_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd sAnim_SANDACONDA_GIGANTAMAX_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd sAnim_TOXTRICITY_GIGANTAMAX_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd sAnim_CENTISKORCH_GIGANTAMAX_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd sAnim_HATTERENE_GIGANTAMAX_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd sAnim_GRIMMSNARL_GIGANTAMAX_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd sAnim_ALCREMIE_GIGANTAMAX_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd sAnim_COPPERAJAH_GIGANTAMAX_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd sAnim_DURALUDON_GIGANTAMAX_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd sAnim_URSHIFU_GIGANTAMAX_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd sAnim_URSHIFU_RAPID_STRIKE_STYLE_GIGANTAMAX_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; +#endif + static const union AnimCmd sAnim_PikachuCosplay_1[] = { ANIMCMD_FRAME(0, 1), @@ -10501,6 +10695,7 @@ static const union AnimCmd sAnim_LycanrocDusk_1[] = ANIMCMD_END, }; #endif + #if P_GEN_8_POKEMON == TRUE static const union AnimCmd sAnim_EnamorusTherian_1[] = { @@ -11653,6 +11848,46 @@ SINGLE_ANIMATION(LycanrocDusk); #if P_GEN_8_POKEMON == TRUE SINGLE_ANIMATION(EnamorusTherian); #endif +// Gigantamax Forms +SINGLE_ANIMATION(VENUSAUR_GIGANTAMAX); +SINGLE_ANIMATION(CHARIZARD_GIGANTAMAX); +SINGLE_ANIMATION(BLASTOISE_GIGANTAMAX); +SINGLE_ANIMATION(BUTTERFREE_GIGANTAMAX); +SINGLE_ANIMATION(PIKACHU_GIGANTAMAX); +SINGLE_ANIMATION(MEOWTH_GIGANTAMAX); +SINGLE_ANIMATION(MACHAMP_GIGANTAMAX); +SINGLE_ANIMATION(GENGAR_GIGANTAMAX); +SINGLE_ANIMATION(KINGLER_GIGANTAMAX); +SINGLE_ANIMATION(LAPRAS_GIGANTAMAX); +SINGLE_ANIMATION(EEVEE_GIGANTAMAX); +SINGLE_ANIMATION(SNORLAX_GIGANTAMAX); +#if P_GEN_5_POKEMON == TRUE +SINGLE_ANIMATION(GARBODOR_GIGANTAMAX); +#endif +#if P_GEN_7_POKEMON == TRUE +SINGLE_ANIMATION(MELMETAL_GIGANTAMAX); +#endif +#if P_GEN_8_POKEMON == TRUE +SINGLE_ANIMATION(RILLABOOM_GIGANTAMAX); +SINGLE_ANIMATION(CINDERACE_GIGANTAMAX); +SINGLE_ANIMATION(INTELEON_GIGANTAMAX); +SINGLE_ANIMATION(CORVIKNIGHT_GIGANTAMAX); +SINGLE_ANIMATION(ORBEETLE_GIGANTAMAX); +SINGLE_ANIMATION(DREDNAW_GIGANTAMAX); +SINGLE_ANIMATION(COALOSSAL_GIGANTAMAX); +SINGLE_ANIMATION(FLAPPLE_GIGANTAMAX); +SINGLE_ANIMATION(APPLETUN_GIGANTAMAX); +SINGLE_ANIMATION(SANDACONDA_GIGANTAMAX); +SINGLE_ANIMATION(TOXTRICITY_GIGANTAMAX); +SINGLE_ANIMATION(CENTISKORCH_GIGANTAMAX); +SINGLE_ANIMATION(HATTERENE_GIGANTAMAX); +SINGLE_ANIMATION(GRIMMSNARL_GIGANTAMAX); +SINGLE_ANIMATION(ALCREMIE_GIGANTAMAX); +SINGLE_ANIMATION(COPPERAJAH_GIGANTAMAX); +SINGLE_ANIMATION(DURALUDON_GIGANTAMAX); +SINGLE_ANIMATION(URSHIFU_GIGANTAMAX); +SINGLE_ANIMATION(URSHIFU_RAPID_STRIKE_STYLE_GIGANTAMAX); +#endif const union AnimCmd *const *const gMonFrontAnimsPtrTable[NUM_SPECIES + 1] = { // Gen 1 @@ -12931,6 +13166,45 @@ const union AnimCmd *const *const gMonFrontAnimsPtrTable[NUM_SPECIES + 1] = [SPECIES_CALYREX_SHADOW_RIDER] = sAnims_Calyrex, [SPECIES_ENAMORUS_THERIAN] = sAnims_EnamorusTherian, [SPECIES_BASCULEGION_FEMALE] = sAnims_Basculegion, +#endif + [SPECIES_VENUSAUR_GIGANTAMAX] = sAnims_VENUSAUR_GIGANTAMAX, + [SPECIES_CHARIZARD_GIGANTAMAX] = sAnims_CHARIZARD_GIGANTAMAX, + [SPECIES_BLASTOISE_GIGANTAMAX] = sAnims_BLASTOISE_GIGANTAMAX, + [SPECIES_BUTTERFREE_GIGANTAMAX] = sAnims_BUTTERFREE_GIGANTAMAX, + [SPECIES_PIKACHU_GIGANTAMAX] = sAnims_PIKACHU_GIGANTAMAX, + [SPECIES_MEOWTH_GIGANTAMAX] = sAnims_MEOWTH_GIGANTAMAX, + [SPECIES_MACHAMP_GIGANTAMAX] = sAnims_MACHAMP_GIGANTAMAX, + [SPECIES_GENGAR_GIGANTAMAX] = sAnims_GENGAR_GIGANTAMAX, + [SPECIES_KINGLER_GIGANTAMAX] = sAnims_KINGLER_GIGANTAMAX, + [SPECIES_LAPRAS_GIGANTAMAX] = sAnims_LAPRAS_GIGANTAMAX, + [SPECIES_EEVEE_GIGANTAMAX] = sAnims_EEVEE_GIGANTAMAX, + [SPECIES_SNORLAX_GIGANTAMAX] = sAnims_SNORLAX_GIGANTAMAX, +#if P_GEN_5_POKEMON == TRUE + [SPECIES_GARBODOR_GIGANTAMAX] = sAnims_GARBODOR_GIGANTAMAX, +#endif +#if P_GEN_7_POKEMON == TRUE + [SPECIES_MELMETAL_GIGANTAMAX] = sAnims_MELMETAL_GIGANTAMAX, +#endif +#if P_GEN_8_POKEMON == TRUE + [SPECIES_RILLABOOM_GIGANTAMAX] = sAnims_RILLABOOM_GIGANTAMAX, + [SPECIES_CINDERACE_GIGANTAMAX] = sAnims_CINDERACE_GIGANTAMAX, + [SPECIES_INTELEON_GIGANTAMAX] = sAnims_INTELEON_GIGANTAMAX, + [SPECIES_CORVIKNIGHT_GIGANTAMAX] = sAnims_CORVIKNIGHT_GIGANTAMAX, + [SPECIES_ORBEETLE_GIGANTAMAX] = sAnims_ORBEETLE_GIGANTAMAX, + [SPECIES_DREDNAW_GIGANTAMAX] = sAnims_DREDNAW_GIGANTAMAX, + [SPECIES_COALOSSAL_GIGANTAMAX] = sAnims_COALOSSAL_GIGANTAMAX, + [SPECIES_FLAPPLE_GIGANTAMAX] = sAnims_FLAPPLE_GIGANTAMAX, + [SPECIES_APPLETUN_GIGANTAMAX] = sAnims_APPLETUN_GIGANTAMAX, + [SPECIES_SANDACONDA_GIGANTAMAX] = sAnims_SANDACONDA_GIGANTAMAX, + [SPECIES_TOXTRICITY_GIGANTAMAX] = sAnims_TOXTRICITY_GIGANTAMAX, + [SPECIES_CENTISKORCH_GIGANTAMAX] = sAnims_CENTISKORCH_GIGANTAMAX, + [SPECIES_HATTERENE_GIGANTAMAX] = sAnims_HATTERENE_GIGANTAMAX, + [SPECIES_GRIMMSNARL_GIGANTAMAX] = sAnims_GRIMMSNARL_GIGANTAMAX, + [SPECIES_ALCREMIE_GIGANTAMAX] = sAnims_ALCREMIE_GIGANTAMAX, + [SPECIES_COPPERAJAH_GIGANTAMAX] = sAnims_COPPERAJAH_GIGANTAMAX, + [SPECIES_DURALUDON_GIGANTAMAX] = sAnims_DURALUDON_GIGANTAMAX, + [SPECIES_URSHIFU_GIGANTAMAX] = sAnims_URSHIFU_GIGANTAMAX, + [SPECIES_URSHIFU_RAPID_STRIKE_STYLE_GIGANTAMAX] = sAnims_URSHIFU_RAPID_STRIKE_STYLE_GIGANTAMAX, #endif [SPECIES_EGG] = sAnims_Egg, }; diff --git a/src/data/pokemon_graphics/front_pic_coordinates.h b/src/data/pokemon_graphics/front_pic_coordinates.h index 897ce63308dc..50e3a541a852 100644 --- a/src/data/pokemon_graphics/front_pic_coordinates.h +++ b/src/data/pokemon_graphics/front_pic_coordinates.h @@ -1336,9 +1336,44 @@ const struct MonCoords gMonFrontPicCoords[NUM_SPECIES + 1] = // Calyrex [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 }, // Basculegion [SPECIES_BASCULEGION_FEMALE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, + // 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_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_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/data/pokemon_graphics/front_pic_table.h b/src/data/pokemon_graphics/front_pic_table.h index 27fefa95075e..33a6afb5db0f 100644 --- a/src/data/pokemon_graphics/front_pic_table.h +++ b/src/data/pokemon_graphics/front_pic_table.h @@ -1333,6 +1333,41 @@ const struct CompressedSpriteSheet gMonFrontPicTable[NUM_SPECIES + 1] = SPECIES_SPRITE(ENAMORUS_THERIAN, gMonFrontPic_EnamorusTherian), SPECIES_SPRITE(BASCULEGION_FEMALE, gMonFrontPic_BasculegionFemale), + + // Gigantamax Forms + SPECIES_SPRITE(VENUSAUR_GIGANTAMAX, gMonFrontPic_VenusaurGigantamax), + SPECIES_SPRITE(CHARIZARD_GIGANTAMAX, gMonFrontPic_CharizardGigantamax), + SPECIES_SPRITE(BLASTOISE_GIGANTAMAX, gMonFrontPic_BlastoiseGigantamax), + SPECIES_SPRITE(BUTTERFREE_GIGANTAMAX, gMonFrontPic_ButterfreeGigantamax), + SPECIES_SPRITE(PIKACHU_GIGANTAMAX, gMonFrontPic_PikachuGigantamax), + SPECIES_SPRITE(MEOWTH_GIGANTAMAX, gMonFrontPic_MeowthGigantamax), + SPECIES_SPRITE(MACHAMP_GIGANTAMAX, gMonFrontPic_MachampGigantamax), + SPECIES_SPRITE(GENGAR_GIGANTAMAX, gMonFrontPic_GengarGigantamax), + SPECIES_SPRITE(KINGLER_GIGANTAMAX, gMonFrontPic_KinglerGigantamax), + SPECIES_SPRITE(LAPRAS_GIGANTAMAX, gMonFrontPic_LaprasGigantamax), + SPECIES_SPRITE(EEVEE_GIGANTAMAX, gMonFrontPic_EeveeGigantamax), + SPECIES_SPRITE(SNORLAX_GIGANTAMAX, gMonFrontPic_SnorlaxGigantamax), + SPECIES_SPRITE(GARBODOR_GIGANTAMAX, gMonFrontPic_GarbodorGigantamax), + SPECIES_SPRITE(MELMETAL_GIGANTAMAX, gMonFrontPic_MelmetalGigantamax), + SPECIES_SPRITE(RILLABOOM_GIGANTAMAX, gMonFrontPic_RillaboomGigantamax), + SPECIES_SPRITE(CINDERACE_GIGANTAMAX, gMonFrontPic_CinderaceGigantamax), + SPECIES_SPRITE(INTELEON_GIGANTAMAX, gMonFrontPic_InteleonGigantamax), + SPECIES_SPRITE(CORVIKNIGHT_GIGANTAMAX, gMonFrontPic_CorviknightGigantamax), + SPECIES_SPRITE(ORBEETLE_GIGANTAMAX, gMonFrontPic_OrbeetleGigantamax), + SPECIES_SPRITE(DREDNAW_GIGANTAMAX, gMonFrontPic_DrednawGigantamax), + SPECIES_SPRITE(COALOSSAL_GIGANTAMAX, gMonFrontPic_CoalossalGigantamax), + SPECIES_SPRITE(FLAPPLE_GIGANTAMAX, gMonFrontPic_FlappleGigantamax), + SPECIES_SPRITE(APPLETUN_GIGANTAMAX, gMonFrontPic_AppletunGigantamax), + SPECIES_SPRITE(SANDACONDA_GIGANTAMAX, gMonFrontPic_SandacondaGigantamax), + SPECIES_SPRITE(TOXTRICITY_GIGANTAMAX, gMonFrontPic_ToxtricityGigantamax), + SPECIES_SPRITE(CENTISKORCH_GIGANTAMAX, gMonFrontPic_CentiskorchGigantamax), + SPECIES_SPRITE(HATTERENE_GIGANTAMAX, gMonFrontPic_HattereneGigantamax), + SPECIES_SPRITE(GRIMMSNARL_GIGANTAMAX, gMonFrontPic_GrimmsnarlGigantamax), + SPECIES_SPRITE(ALCREMIE_GIGANTAMAX, gMonFrontPic_AlcremieGigantamax), + SPECIES_SPRITE(COPPERAJAH_GIGANTAMAX, gMonFrontPic_CopperajahGigantamax), + SPECIES_SPRITE(DURALUDON_GIGANTAMAX, gMonFrontPic_DuraludonGigantamax), + SPECIES_SPRITE(URSHIFU_GIGANTAMAX, gMonFrontPic_UrshifuGigantamax), + SPECIES_SPRITE(URSHIFU_RAPID_STRIKE_STYLE_GIGANTAMAX, gMonFrontPic_UrshifuRapidStrikeGigantamax), #endif SPECIES_SPRITE(EGG, gMonFrontPic_Egg), }; diff --git a/src/data/pokemon_graphics/palette_table.h b/src/data/pokemon_graphics/palette_table.h index 1fa65f3b3352..caf4578a6845 100644 --- a/src/data/pokemon_graphics/palette_table.h +++ b/src/data/pokemon_graphics/palette_table.h @@ -1330,8 +1330,44 @@ const struct CompressedSpritePalette gMonPaletteTable[NUM_SPECIES + 1] = SPECIES_PAL(CALYREX_ICE_RIDER, gMonPalette_CalyrexIceRider), SPECIES_PAL(CALYREX_SHADOW_RIDER, gMonPalette_CalyrexShadowRider), + SPECIES_PAL(ENAMORUS_THERIAN, gMonPalette_EnamorusTherian), SPECIES_PAL(BASCULEGION_FEMALE, gMonPalette_BasculegionFemale), + + // Gigantamax Forms + SPECIES_PAL(VENUSAUR_GIGANTAMAX, gMonPalette_VenusaurGigantamax), + SPECIES_PAL(CHARIZARD_GIGANTAMAX, gMonPalette_CharizardGigantamax), + SPECIES_PAL(BLASTOISE_GIGANTAMAX, gMonPalette_BlastoiseGigantamax), + SPECIES_PAL(BUTTERFREE_GIGANTAMAX, gMonPalette_ButterfreeGigantamax), + SPECIES_PAL(PIKACHU_GIGANTAMAX, gMonPalette_PikachuGigantamax), + SPECIES_PAL(MEOWTH_GIGANTAMAX, gMonPalette_MeowthGigantamax), + SPECIES_PAL(MACHAMP_GIGANTAMAX, gMonPalette_MachampGigantamax), + SPECIES_PAL(GENGAR_GIGANTAMAX, gMonPalette_GengarGigantamax), + SPECIES_PAL(KINGLER_GIGANTAMAX, gMonPalette_KinglerGigantamax), + SPECIES_PAL(LAPRAS_GIGANTAMAX, gMonPalette_LaprasGigantamax), + SPECIES_PAL(EEVEE_GIGANTAMAX, gMonPalette_EeveeGigantamax), + SPECIES_PAL(SNORLAX_GIGANTAMAX, gMonPalette_SnorlaxGigantamax), + SPECIES_PAL(GARBODOR_GIGANTAMAX, gMonPalette_GarbodorGigantamax), + SPECIES_PAL(MELMETAL_GIGANTAMAX, gMonPalette_MelmetalGigantamax), + SPECIES_PAL(RILLABOOM_GIGANTAMAX, gMonPalette_RillaboomGigantamax), + SPECIES_PAL(CINDERACE_GIGANTAMAX, gMonPalette_CinderaceGigantamax), + SPECIES_PAL(INTELEON_GIGANTAMAX, gMonPalette_InteleonGigantamax), + SPECIES_PAL(CORVIKNIGHT_GIGANTAMAX, gMonPalette_CorviknightGigantamax), + SPECIES_PAL(ORBEETLE_GIGANTAMAX, gMonPalette_OrbeetleGigantamax), + SPECIES_PAL(DREDNAW_GIGANTAMAX, gMonPalette_DrednawGigantamax), + SPECIES_PAL(COALOSSAL_GIGANTAMAX, gMonPalette_CoalossalGigantamax), + SPECIES_PAL(FLAPPLE_GIGANTAMAX, gMonPalette_FlappleGigantamax), + SPECIES_PAL(APPLETUN_GIGANTAMAX, gMonPalette_AppletunGigantamax), + SPECIES_PAL(SANDACONDA_GIGANTAMAX, gMonPalette_SandacondaGigantamax), + SPECIES_PAL(TOXTRICITY_GIGANTAMAX, gMonPalette_ToxtricityGigantamax), + SPECIES_PAL(CENTISKORCH_GIGANTAMAX, gMonPalette_CentiskorchGigantamax), + SPECIES_PAL(HATTERENE_GIGANTAMAX, gMonPalette_HattereneGigantamax), + SPECIES_PAL(GRIMMSNARL_GIGANTAMAX, gMonPalette_GrimmsnarlGigantamax), + SPECIES_PAL(ALCREMIE_GIGANTAMAX, gMonPalette_AlcremieGigantamax), + SPECIES_PAL(COPPERAJAH_GIGANTAMAX, gMonPalette_CopperajahGigantamax), + SPECIES_PAL(DURALUDON_GIGANTAMAX, gMonPalette_DuraludonGigantamax), + SPECIES_PAL(URSHIFU_GIGANTAMAX, gMonPalette_UrshifuGigantamax), + SPECIES_PAL(URSHIFU_RAPID_STRIKE_STYLE_GIGANTAMAX, gMonPalette_UrshifuRapidStrikeGigantamax), #endif SPECIES_PAL(EGG, gMonPalette_Egg), }; diff --git a/src/data/pokemon_graphics/shiny_palette_table.h b/src/data/pokemon_graphics/shiny_palette_table.h index b674617b67e2..13e19d4ca3fa 100644 --- a/src/data/pokemon_graphics/shiny_palette_table.h +++ b/src/data/pokemon_graphics/shiny_palette_table.h @@ -1329,8 +1329,44 @@ const struct CompressedSpritePalette gMonShinyPaletteTable[NUM_SPECIES + 1] = SPECIES_SHINY_PAL(CALYREX_ICE_RIDER, gMonShinyPalette_CalyrexIceRider), SPECIES_SHINY_PAL(CALYREX_SHADOW_RIDER, gMonShinyPalette_CalyrexShadowRider), - SPECIES_SHINY_PAL(BASCULEGION_FEMALE, gMonShinyPalette_BasculegionFemale), SPECIES_SHINY_PAL(ENAMORUS_THERIAN, gMonShinyPalette_EnamorusTherian), + + SPECIES_SHINY_PAL(BASCULEGION_FEMALE, gMonShinyPalette_BasculegionFemale), + + // Gigantamax Forms + SPECIES_SHINY_PAL(VENUSAUR_GIGANTAMAX, gMonShinyPalette_VenusaurGigantamax), + SPECIES_SHINY_PAL(CHARIZARD_GIGANTAMAX, gMonShinyPalette_CharizardGigantamax), + SPECIES_SHINY_PAL(BLASTOISE_GIGANTAMAX, gMonShinyPalette_BlastoiseGigantamax), + SPECIES_SHINY_PAL(BUTTERFREE_GIGANTAMAX, gMonShinyPalette_ButterfreeGigantamax), + SPECIES_SHINY_PAL(PIKACHU_GIGANTAMAX, gMonShinyPalette_PikachuGigantamax), + SPECIES_SHINY_PAL(MEOWTH_GIGANTAMAX, gMonShinyPalette_MeowthGigantamax), + SPECIES_SHINY_PAL(MACHAMP_GIGANTAMAX, gMonShinyPalette_MachampGigantamax), + SPECIES_SHINY_PAL(GENGAR_GIGANTAMAX, gMonShinyPalette_GengarGigantamax), + SPECIES_SHINY_PAL(KINGLER_GIGANTAMAX, gMonShinyPalette_KinglerGigantamax), + SPECIES_SHINY_PAL(LAPRAS_GIGANTAMAX, gMonShinyPalette_LaprasGigantamax), + SPECIES_SHINY_PAL(EEVEE_GIGANTAMAX, gMonShinyPalette_EeveeGigantamax), + SPECIES_SHINY_PAL(SNORLAX_GIGANTAMAX, gMonShinyPalette_SnorlaxGigantamax), + SPECIES_SHINY_PAL(GARBODOR_GIGANTAMAX, gMonShinyPalette_GarbodorGigantamax), + SPECIES_SHINY_PAL(MELMETAL_GIGANTAMAX, gMonShinyPalette_MelmetalGigantamax), + SPECIES_SHINY_PAL(RILLABOOM_GIGANTAMAX, gMonShinyPalette_RillaboomGigantamax), + SPECIES_SHINY_PAL(CINDERACE_GIGANTAMAX, gMonShinyPalette_CinderaceGigantamax), + SPECIES_SHINY_PAL(INTELEON_GIGANTAMAX, gMonShinyPalette_InteleonGigantamax), + SPECIES_SHINY_PAL(CORVIKNIGHT_GIGANTAMAX, gMonShinyPalette_CorviknightGigantamax), + SPECIES_SHINY_PAL(ORBEETLE_GIGANTAMAX, gMonShinyPalette_OrbeetleGigantamax), + SPECIES_SHINY_PAL(DREDNAW_GIGANTAMAX, gMonShinyPalette_DrednawGigantamax), + SPECIES_SHINY_PAL(COALOSSAL_GIGANTAMAX, gMonShinyPalette_CoalossalGigantamax), + SPECIES_SHINY_PAL(FLAPPLE_GIGANTAMAX, gMonShinyPalette_FlappleGigantamax), + SPECIES_SHINY_PAL(APPLETUN_GIGANTAMAX, gMonShinyPalette_AppletunGigantamax), + SPECIES_SHINY_PAL(SANDACONDA_GIGANTAMAX, gMonShinyPalette_SandacondaGigantamax), + SPECIES_SHINY_PAL(TOXTRICITY_GIGANTAMAX, gMonShinyPalette_ToxtricityGigantamax), + SPECIES_SHINY_PAL(CENTISKORCH_GIGANTAMAX, gMonShinyPalette_CentiskorchGigantamax), + SPECIES_SHINY_PAL(HATTERENE_GIGANTAMAX, gMonShinyPalette_HattereneGigantamax), + SPECIES_SHINY_PAL(GRIMMSNARL_GIGANTAMAX, gMonShinyPalette_GrimmsnarlGigantamax), + SPECIES_SHINY_PAL(ALCREMIE_GIGANTAMAX, gMonShinyPalette_AlcremieGigantamax), + SPECIES_SHINY_PAL(COPPERAJAH_GIGANTAMAX, gMonShinyPalette_CopperajahGigantamax), + SPECIES_SHINY_PAL(DURALUDON_GIGANTAMAX, gMonShinyPalette_DuraludonGigantamax), + SPECIES_SHINY_PAL(URSHIFU_GIGANTAMAX, gMonShinyPalette_UrshifuGigantamax), + SPECIES_SHINY_PAL(URSHIFU_RAPID_STRIKE_STYLE_GIGANTAMAX, gMonShinyPalette_UrshifuRapidStrikeGigantamax), #endif SPECIES_SHINY_PAL(EGG, gMonPalette_Egg), }; diff --git a/src/data/text/move_names.h b/src/data/text/move_names.h index 8ec4520e9407..39fd8129b273 100644 --- a/src/data/text/move_names.h +++ b/src/data/text/move_names.h @@ -1,6 +1,6 @@ #if B_EXPANDED_MOVE_NAMES == TRUE // 16 letters -const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = +const u8 gMoveNames[MOVES_COUNT_DYNAMAX][MOVE_NAME_LENGTH + 1] = { [MOVE_NONE] = _("-"), [MOVE_POUND] = _("Pound"), @@ -835,10 +835,64 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = [MOVE_MATCHA_GOTCHA] = _("Matcha Gotcha"), [MOVE_SYRUP_BOMB] = _("Syrup Bomb"), [MOVE_IVY_CUDGEL] = _("Ivy Cudgel"), + // Max Moves + [MOVE_MAX_GUARD] = _("Max Guard"), + [MOVE_MAX_STRIKE] = _("Max Strike"), + [MOVE_MAX_KNUCKLE] = _("Max Knuckle"), + [MOVE_MAX_AIRSTREAM] = _("Max Airstream"), + [MOVE_MAX_OOZE] = _("Max Ooze"), + [MOVE_MAX_QUAKE] = _("Max Quake"), + [MOVE_MAX_ROCKFALL] = _("Max Rockfall"), + [MOVE_MAX_FLUTTERBY] = _("Max Flutterby"), + [MOVE_MAX_PHANTASM] = _("Max Phantasm"), + [MOVE_MAX_STEELSPIKE] = _("Max Steelspike"), + [MOVE_MAX_FLARE] = _("Max Flare"), + [MOVE_MAX_GEYSER] = _("Max Geyser"), + [MOVE_MAX_OVERGROWTH] = _("Max Overgrowth"), + [MOVE_MAX_LIGHTNING] = _("Max Lightning"), + [MOVE_MAX_HAILSTORM] = _("Max Hailstorm"), + [MOVE_MAX_MINDSTORM] = _("Max Mindstorm"), + [MOVE_MAX_WYRMWIND] = _("Max Wyrmwind"), + [MOVE_MAX_DARKNESS] = _("Max Darkness"), + [MOVE_MAX_STARFALL] = _("Max Starfall"), + // Gigantamax Moves + [MOVE_G_MAX_VINE_LASH] = _("Gmax Vine Lash"), + [MOVE_G_MAX_WILDFIRE] = _("Gmax Wildfire"), + [MOVE_G_MAX_CANNONADE] = _("Gmax Cannonade"), + [MOVE_G_MAX_BEFUDDLE] = _("Gmax Befuddle"), + [MOVE_G_MAX_VOLT_CRASH] = _("Gmax Volt Crash"), + [MOVE_G_MAX_GOLD_RUSH] = _("Gmax Gold Rush"), + [MOVE_G_MAX_CHI_STRIKE] = _("Gmax Chi Strike"), + [MOVE_G_MAX_TERROR] = _("Gmax Terror"), + [MOVE_G_MAX_FOAM_BURST] = _("Gmax Foam Burst"), + [MOVE_G_MAX_RESONANCE] = _("Gmax Resonance"), + [MOVE_G_MAX_CUDDLE] = _("Gmax Cuddle"), + [MOVE_G_MAX_REPLENISH] = _("Gmax Replenish"), + [MOVE_G_MAX_MALODOR] = _("Gmax Malodor"), + [MOVE_G_MAX_MELTDOWN] = _("Gmax Meltdown"), + [MOVE_G_MAX_DRUM_SOLO] = _("Gmax Drum Solo"), + [MOVE_G_MAX_FIREBALL] = _("Gmax Fireball"), + [MOVE_G_MAX_HYDROSNIPE] = _("Gmax Hydrosnipe"), + [MOVE_G_MAX_WIND_RAGE] = _("Gmax Wind Rage"), + [MOVE_G_MAX_GRAVITAS] = _("Gmax Gravitas"), + [MOVE_G_MAX_STONESURGE] = _("Gmax Stonesurge"), + [MOVE_G_MAX_VOLCALITH] = _("Gmax Volcalith"), + [MOVE_G_MAX_TARTNESS] = _("Gmax Tartness"), + [MOVE_G_MAX_SWEETNESS] = _("Gmax Sweetness"), + [MOVE_G_MAX_SANDBLAST] = _("Gmax Sandblast"), + [MOVE_G_MAX_STUN_SHOCK] = _("Gmax Stun Shock"), + [MOVE_G_MAX_CENTIFERNO] = _("Gmax Centiferno"), + [MOVE_G_MAX_SMITE] = _("Gmax Smite"), + [MOVE_G_MAX_SNOOZE] = _("Gmax Snooze"), + [MOVE_G_MAX_FINALE] = _("Gmax Finale"), + [MOVE_G_MAX_STEELSURGE] = _("Gmax Steelsurge"), + [MOVE_G_MAX_DEPLETION] = _("Gmax Depletion"), + [MOVE_G_MAX_ONE_BLOW] = _("Gmax One Blow"), + [MOVE_G_MAX_RAPID_FLOW] = _("Gmax Rapid Flow"), }; #else // 12 letters -const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = +const u8 gMoveNames[MOVES_COUNT_DYNAMAX][MOVE_NAME_LENGTH + 1] = { [MOVE_NONE] = _("-"), [MOVE_POUND] = _("Pound"), @@ -1673,6 +1727,60 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = [MOVE_MATCHA_GOTCHA] = _("MatchaGotcha"), [MOVE_SYRUP_BOMB] = _("Syrup Bomb"), [MOVE_IVY_CUDGEL] = _("Ivy Cudgel"), + // Max Moves + [MOVE_MAX_GUARD] = _("M-Guard"), + [MOVE_MAX_STRIKE] = _("M-Strike"), + [MOVE_MAX_KNUCKLE] = _("M-Knuckle"), + [MOVE_MAX_AIRSTREAM] = _("M-Airstream"), + [MOVE_MAX_OOZE] = _("M-Ooze"), + [MOVE_MAX_QUAKE] = _("M-Quake"), + [MOVE_MAX_ROCKFALL] = _("M-Rockfall"), + [MOVE_MAX_FLUTTERBY] = _("M-Flutterby"), + [MOVE_MAX_PHANTASM] = _("M-Phantasm"), + [MOVE_MAX_STEELSPIKE] = _("M-Steelspike"), + [MOVE_MAX_FLARE] = _("M-Flare"), + [MOVE_MAX_GEYSER] = _("M-Geyser"), + [MOVE_MAX_OVERGROWTH] = _("M-Overgrowth"), + [MOVE_MAX_LIGHTNING] = _("M-Lightning"), + [MOVE_MAX_HAILSTORM] = _("M-Hailstorm"), + [MOVE_MAX_MINDSTORM] = _("M-Mindstorm"), + [MOVE_MAX_WYRMWIND] = _("M-Wyrmwind"), + [MOVE_MAX_DARKNESS] = _("M-Darkness"), + [MOVE_MAX_STARFALL] = _("M-Starfall"), +// Gigantamax Moves + [MOVE_G_MAX_VINE_LASH] = _("G-Vine Lash"), + [MOVE_G_MAX_WILDFIRE] = _("G-Wildfire"), + [MOVE_G_MAX_CANNONADE] = _("G-Cannonade"), + [MOVE_G_MAX_BEFUDDLE] = _("G-Befuddle"), + [MOVE_G_MAX_VOLT_CRASH] = _("G-VoltCrash"), + [MOVE_G_MAX_GOLD_RUSH] = _("G-Gold Rush"), + [MOVE_G_MAX_CHI_STRIKE] = _("G-ChiStrike"), + [MOVE_G_MAX_TERROR] = _("G-Terror"), + [MOVE_G_MAX_FOAM_BURST] = _("G-FoamBurst"), + [MOVE_G_MAX_RESONANCE] = _("G-Resonance"), + [MOVE_G_MAX_CUDDLE] = _("G-Cuddle"), + [MOVE_G_MAX_REPLENISH] = _("G-Replenish"), + [MOVE_G_MAX_MALODOR] = _("G-Malodor"), + [MOVE_G_MAX_MELTDOWN] = _("G-Meltdown"), + [MOVE_G_MAX_DRUM_SOLO] = _("G-Drum Solo"), + [MOVE_G_MAX_FIREBALL] = _("G-Fireball"), + [MOVE_G_MAX_HYDROSNIPE] = _("G-Hydrsnipe"), + [MOVE_G_MAX_WIND_RAGE] = _("G-Wind Rage"), + [MOVE_G_MAX_GRAVITAS] = _("G-Gravitas"), + [MOVE_G_MAX_STONESURGE] = _("G-Stonesrge"), + [MOVE_G_MAX_VOLCALITH] = _("G-Volcalith"), + [MOVE_G_MAX_TARTNESS] = _("G-Tartness"), + [MOVE_G_MAX_SWEETNESS] = _("G-Sweetness"), + [MOVE_G_MAX_SANDBLAST] = _("G-Sandblast"), + [MOVE_G_MAX_STUN_SHOCK] = _("G-StunShock"), + [MOVE_G_MAX_CENTIFERNO] = _("G-Centiferno"), + [MOVE_G_MAX_SMITE] = _("G-Smite"), + [MOVE_G_MAX_SNOOZE] = _("G-Snooze"), + [MOVE_G_MAX_FINALE] = _("G-Finale"), + [MOVE_G_MAX_STEELSURGE] = _("G-Steelsrge"), + [MOVE_G_MAX_DEPLETION] = _("G-Depletion"), + [MOVE_G_MAX_ONE_BLOW] = _("G-One Blow"), + [MOVE_G_MAX_RAPID_FLOW] = _("G-Rapid Flow"), }; #endif @@ -1750,3 +1858,114 @@ const u8 *const gZMoveNames[] = [MOVE_LIGHT_THAT_BURNS_THE_SKY - FIRST_Z_MOVE] = sText_Light_That_Burns_The_Sky, [MOVE_SOUL_STEALING_7_STAR_STRIKE - FIRST_Z_MOVE] = sText_Soul_Stealing_7_Star_Strike, }; + +// Max Moves +static const u8 sText_Max_Guard[] = _("Max Guard"); +static const u8 sText_Max_Strike[] = _("Max Strike"); +static const u8 sText_Max_Knuckle[] = _("Max Knuckle"); +static const u8 sText_Max_Airstream[] = _("Max Airstream"); +static const u8 sText_Max_Ooze[] = _("Max Ooze"); +static const u8 sText_Max_Quake[] = _("Max Quake"); +static const u8 sText_Max_Rockfall[] = _("Max Rockfall"); +static const u8 sText_Max_Flutterby[] = _("Max Flutterby"); +static const u8 sText_Max_Phantasm[] = _("Max Phantasm"); +static const u8 sText_Max_Steelspike[] = _("Max Steelspike"); +static const u8 sText_Max_Flare[] = _("Max Flare"); +static const u8 sText_Max_Geyser[] = _("Max Geyser"); +static const u8 sText_Max_Overgrowth[] = _("Max Overgrowth"); +static const u8 sText_Max_Lightning[] = _("Max Lightning"); +static const u8 sText_Max_Hailstorm[] = _("Max Hailstorm"); +static const u8 sText_Max_Mindstorm[] = _("Max Mindstorm"); +static const u8 sText_Max_Wyrmwind[] = _("Max Wyrmwind"); +static const u8 sText_Max_Darkness[] = _("Max Darkness"); +static const u8 sText_Max_Starfall[] = _("Max Starfall"); +static const u8 sText_G_Max_Vine_Lash[] = _("G-Max Vine Lash"); +static const u8 sText_G_Max_Wildfire[] = _("G-Max Wildfire"); +static const u8 sText_G_Max_Cannonade[] = _("G-Max Cannonade"); +static const u8 sText_G_Max_Befuddle[] = _("G-Max Befuddle"); +static const u8 sText_G_Max_Volt_Crash[] = _("G-Max Volt Crash"); +static const u8 sText_G_Max_Gold_Rush[] = _("G-Max Gold Rush"); +static const u8 sText_G_Max_Chi_Strike[] = _("G-Max Chi Strike"); +static const u8 sText_G_Max_Terror[] = _("G-Max Terror"); +static const u8 sText_G_Max_Foam_Burst[] = _("G-Max Foam Burst"); +static const u8 sText_G_Max_Resonance[] = _("G-Max Resonance"); +static const u8 sText_G_Max_Cuddle[] = _("G-Max Cuddle"); +static const u8 sText_G_Max_Replenish[] = _("G-Max Replenish"); +static const u8 sText_G_Max_Malodor[] = _("G-Max Malodor"); +static const u8 sText_G_Max_Meltdown[] = _("G-Max Meltdown"); +static const u8 sText_G_Max_Drum_Solo[] = _("G-Max Drum Solo"); +static const u8 sText_G_Max_Fireball[] = _("G-Max Fireball"); +static const u8 sText_G_Max_Hydrosnipe[] = _("G-Max Hydrosnipe"); +static const u8 sText_G_Max_Wind_Rage[] = _("G-Max Wind Rage"); +static const u8 sText_G_Max_Gravitas[] = _("G-Max Gravitas"); +static const u8 sText_G_Max_Stonesurge[] = _("G-Max Stonesurge"); +static const u8 sText_G_Max_Volcalith[] = _("G-Max Volcalith"); +static const u8 sText_G_Max_Tartness[] = _("G-Max Tartness"); +static const u8 sText_G_Max_Sweetness[] = _("G-Max Sweetness"); +static const u8 sText_G_Max_Sandblast[] = _("G-Max Sandblast"); +static const u8 sText_G_Max_Stun_Shock[] = _("G-Max Stun Shock"); +static const u8 sText_G_Max_Centiferno[] = _("G-Max Centiferno"); +static const u8 sText_G_Max_Smite[] = _("G-Max Smite"); +static const u8 sText_G_Max_Snooze[] = _("G-Max Snooze"); +static const u8 sText_G_Max_Finale[] = _("G-Max Finale"); +static const u8 sText_G_Max_Steelsurge[] = _("G-Max Steelsurge"); +static const u8 sText_G_Max_Depletion[] = _("G-Max Depletion"); +static const u8 sText_G_Max_One_Blow[] = _("G-Max One Blow"); +static const u8 sText_G_Max_Rapid_Flow[] = _("G-Max Rapid Flow"); + +const u8 *const gMaxMoveNames[] = +{ + [MOVE_MAX_GUARD - FIRST_MAX_MOVE] = sText_Max_Guard, + [MOVE_MAX_STRIKE - FIRST_MAX_MOVE] = sText_Max_Strike, + [MOVE_MAX_KNUCKLE - FIRST_MAX_MOVE] = sText_Max_Knuckle, + [MOVE_MAX_AIRSTREAM - FIRST_MAX_MOVE] = sText_Max_Airstream, + [MOVE_MAX_OOZE - FIRST_MAX_MOVE] = sText_Max_Ooze, + [MOVE_MAX_QUAKE - FIRST_MAX_MOVE] = sText_Max_Quake, + [MOVE_MAX_ROCKFALL - FIRST_MAX_MOVE] = sText_Max_Rockfall, + [MOVE_MAX_FLUTTERBY - FIRST_MAX_MOVE] = sText_Max_Flutterby, + [MOVE_MAX_PHANTASM - FIRST_MAX_MOVE] = sText_Max_Phantasm, + [MOVE_MAX_STEELSPIKE - FIRST_MAX_MOVE] = sText_Max_Steelspike, + [MOVE_MAX_FLARE - FIRST_MAX_MOVE] = sText_Max_Flare, + [MOVE_MAX_GEYSER - FIRST_MAX_MOVE] = sText_Max_Geyser, + [MOVE_MAX_OVERGROWTH - FIRST_MAX_MOVE] = sText_Max_Overgrowth, + [MOVE_MAX_LIGHTNING - FIRST_MAX_MOVE] = sText_Max_Lightning, + [MOVE_MAX_HAILSTORM - FIRST_MAX_MOVE] = sText_Max_Hailstorm, + [MOVE_MAX_MINDSTORM - FIRST_MAX_MOVE] = sText_Max_Mindstorm, + [MOVE_MAX_WYRMWIND - FIRST_MAX_MOVE] = sText_Max_Wyrmwind, + [MOVE_MAX_DARKNESS - FIRST_MAX_MOVE] = sText_Max_Darkness, + [MOVE_MAX_STARFALL - FIRST_MAX_MOVE] = sText_Max_Starfall, + [MOVE_G_MAX_VINE_LASH - FIRST_MAX_MOVE] = sText_G_Max_Vine_Lash, + [MOVE_G_MAX_WILDFIRE - FIRST_MAX_MOVE] = sText_G_Max_Wildfire, + [MOVE_G_MAX_CANNONADE - FIRST_MAX_MOVE] = sText_G_Max_Cannonade, + [MOVE_G_MAX_BEFUDDLE - FIRST_MAX_MOVE] = sText_G_Max_Befuddle, + [MOVE_G_MAX_VOLT_CRASH - FIRST_MAX_MOVE] = sText_G_Max_Volt_Crash, + [MOVE_G_MAX_GOLD_RUSH - FIRST_MAX_MOVE] = sText_G_Max_Gold_Rush, + [MOVE_G_MAX_CHI_STRIKE - FIRST_MAX_MOVE] = sText_G_Max_Chi_Strike, + [MOVE_G_MAX_TERROR - FIRST_MAX_MOVE] = sText_G_Max_Terror, + [MOVE_G_MAX_FOAM_BURST - FIRST_MAX_MOVE] = sText_G_Max_Foam_Burst, + [MOVE_G_MAX_RESONANCE - FIRST_MAX_MOVE] = sText_G_Max_Resonance, + [MOVE_G_MAX_CUDDLE - FIRST_MAX_MOVE] = sText_G_Max_Cuddle, + [MOVE_G_MAX_REPLENISH - FIRST_MAX_MOVE] = sText_G_Max_Replenish, + [MOVE_G_MAX_MALODOR - FIRST_MAX_MOVE] = sText_G_Max_Malodor, + [MOVE_G_MAX_MELTDOWN - FIRST_MAX_MOVE] = sText_G_Max_Meltdown, + [MOVE_G_MAX_DRUM_SOLO - FIRST_MAX_MOVE] = sText_G_Max_Drum_Solo, + [MOVE_G_MAX_FIREBALL - FIRST_MAX_MOVE] = sText_G_Max_Fireball, + [MOVE_G_MAX_HYDROSNIPE - FIRST_MAX_MOVE] = sText_G_Max_Hydrosnipe, + [MOVE_G_MAX_WIND_RAGE - FIRST_MAX_MOVE] = sText_G_Max_Wind_Rage, + [MOVE_G_MAX_GRAVITAS - FIRST_MAX_MOVE] = sText_G_Max_Gravitas, + [MOVE_G_MAX_STONESURGE - FIRST_MAX_MOVE] = sText_G_Max_Stonesurge, + [MOVE_G_MAX_VOLCALITH - FIRST_MAX_MOVE] = sText_G_Max_Volcalith, + [MOVE_G_MAX_TARTNESS - FIRST_MAX_MOVE] = sText_G_Max_Tartness, + [MOVE_G_MAX_SWEETNESS - FIRST_MAX_MOVE] = sText_G_Max_Sweetness, + [MOVE_G_MAX_SANDBLAST - FIRST_MAX_MOVE] = sText_G_Max_Sandblast, + [MOVE_G_MAX_STUN_SHOCK - FIRST_MAX_MOVE] = sText_G_Max_Stun_Shock, + [MOVE_G_MAX_CENTIFERNO - FIRST_MAX_MOVE] = sText_G_Max_Centiferno, + [MOVE_G_MAX_SMITE - FIRST_MAX_MOVE] = sText_G_Max_Smite, + [MOVE_G_MAX_SNOOZE - FIRST_MAX_MOVE] = sText_G_Max_Snooze, + [MOVE_G_MAX_FINALE - FIRST_MAX_MOVE] = sText_G_Max_Finale, + [MOVE_G_MAX_STEELSURGE - FIRST_MAX_MOVE] = sText_G_Max_Steelsurge, + [MOVE_G_MAX_DEPLETION - FIRST_MAX_MOVE] = sText_G_Max_Depletion, + [MOVE_G_MAX_ONE_BLOW - FIRST_MAX_MOVE] = sText_G_Max_One_Blow, + [MOVE_G_MAX_RAPID_FLOW - FIRST_MAX_MOVE] = sText_G_Max_Rapid_Flow, +}; + \ No newline at end of file diff --git a/src/data/text/species_names.h b/src/data/text/species_names.h index e9aee3a06ce2..8b366ac17c9e 100644 --- a/src/data/text/species_names.h +++ b/src/data/text/species_names.h @@ -1336,6 +1336,41 @@ const u8 gSpeciesNames[NUM_SPECIES][POKEMON_NAME_LENGTH + 1] = { // Calyrex [SPECIES_CALYREX_ICE_RIDER] = _("Calyrex"), [SPECIES_CALYREX_SHADOW_RIDER] = _("Calyrex"), + // Basculegion [SPECIES_BASCULEGION_FEMALE] = _("Bsculegion"), + // Gigantamax Forms + [SPECIES_VENUSAUR_GIGANTAMAX] = _("Venusaur"), + [SPECIES_CHARIZARD_GIGANTAMAX] = _("Charizard"), + [SPECIES_BLASTOISE_GIGANTAMAX] = _("Blastoise"), + [SPECIES_BUTTERFREE_GIGANTAMAX] = _("Butterfree"), + [SPECIES_PIKACHU_GIGANTAMAX] = _("Pikachu"), + [SPECIES_MEOWTH_GIGANTAMAX] = _("Meowth"), + [SPECIES_MACHAMP_GIGANTAMAX] = _("Machamp"), + [SPECIES_GENGAR_GIGANTAMAX] = _("Gengar"), + [SPECIES_KINGLER_GIGANTAMAX] = _("Kingler"), + [SPECIES_LAPRAS_GIGANTAMAX] = _("Lapras"), + [SPECIES_EEVEE_GIGANTAMAX] = _("Eevee"), + [SPECIES_SNORLAX_GIGANTAMAX] = _("Snorlax"), + [SPECIES_GARBODOR_GIGANTAMAX] = _("Garbodor"), + [SPECIES_MELMETAL_GIGANTAMAX] = _("Melmetal"), + [SPECIES_RILLABOOM_GIGANTAMAX] = _("Rillaboom"), + [SPECIES_CINDERACE_GIGANTAMAX] = _("Cinderace"), + [SPECIES_INTELEON_GIGANTAMAX] = _("Inteleon"), + [SPECIES_CORVIKNIGHT_GIGANTAMAX] = _("Corviknigh"), + [SPECIES_ORBEETLE_GIGANTAMAX] = _("Orbeetle"), + [SPECIES_DREDNAW_GIGANTAMAX] = _("Drednaw"), + [SPECIES_COALOSSAL_GIGANTAMAX] = _("Coalossal"), + [SPECIES_FLAPPLE_GIGANTAMAX] = _("Flapple"), + [SPECIES_APPLETUN_GIGANTAMAX] = _("Appletun"), + [SPECIES_SANDACONDA_GIGANTAMAX] = _("Sandaconda"), + [SPECIES_TOXTRICITY_GIGANTAMAX] = _("Toxtricity"), + [SPECIES_CENTISKORCH_GIGANTAMAX] = _("Centiskorc"), + [SPECIES_HATTERENE_GIGANTAMAX] = _("Hatterene"), + [SPECIES_GRIMMSNARL_GIGANTAMAX] = _("Grimmsnarl"), + [SPECIES_ALCREMIE_GIGANTAMAX] = _("Alcremie"), + [SPECIES_COPPERAJAH_GIGANTAMAX] = _("Copperajah"), + [SPECIES_DURALUDON_GIGANTAMAX] = _("Duraludon"), + [SPECIES_URSHIFU_GIGANTAMAX] = _("Urshifu"), + [SPECIES_URSHIFU_RAPID_STRIKE_STYLE_GIGANTAMAX] = _("Urshifu"), #endif }; diff --git a/src/pokemon.c b/src/pokemon.c index 9a8ad991e4a2..c932979d4f7d 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -1681,7 +1681,42 @@ static const u16 sSpeciesToNationalPokedexNum[NUM_SPECIES - 1] = [SPECIES_CALYREX_ICE_RIDER - 1] = NATIONAL_DEX_CALYREX, [SPECIES_CALYREX_SHADOW_RIDER - 1] = NATIONAL_DEX_CALYREX, [SPECIES_ENAMORUS_THERIAN - 1] = NATIONAL_DEX_ENAMORUS, + // Basculegion [SPECIES_BASCULEGION_FEMALE - 1] = NATIONAL_DEX_BASCULEGION, + // Gigantamax Forms + [SPECIES_VENUSAUR_GIGANTAMAX - 1] = NATIONAL_DEX_VENUSAUR, + [SPECIES_CHARIZARD_GIGANTAMAX - 1] = NATIONAL_DEX_CHARIZARD, + [SPECIES_BLASTOISE_GIGANTAMAX - 1] = NATIONAL_DEX_BLASTOISE, + [SPECIES_BUTTERFREE_GIGANTAMAX - 1] = NATIONAL_DEX_BUTTERFREE, + [SPECIES_PIKACHU_GIGANTAMAX - 1] = NATIONAL_DEX_PIKACHU, + [SPECIES_MEOWTH_GIGANTAMAX - 1] = NATIONAL_DEX_MEOWTH, + [SPECIES_MACHAMP_GIGANTAMAX - 1] = NATIONAL_DEX_MACHAMP, + [SPECIES_GENGAR_GIGANTAMAX - 1] = NATIONAL_DEX_GENGAR, + [SPECIES_KINGLER_GIGANTAMAX - 1] = NATIONAL_DEX_KINGLER, + [SPECIES_LAPRAS_GIGANTAMAX - 1] = NATIONAL_DEX_LAPRAS, + [SPECIES_EEVEE_GIGANTAMAX - 1] = NATIONAL_DEX_EEVEE, + [SPECIES_SNORLAX_GIGANTAMAX - 1] = NATIONAL_DEX_SNORLAX, + [SPECIES_GARBODOR_GIGANTAMAX - 1] = NATIONAL_DEX_GARBODOR, + [SPECIES_MELMETAL_GIGANTAMAX - 1] = NATIONAL_DEX_MELMETAL, + [SPECIES_RILLABOOM_GIGANTAMAX - 1] = NATIONAL_DEX_RILLABOOM, + [SPECIES_CINDERACE_GIGANTAMAX - 1] = NATIONAL_DEX_CINDERACE, + [SPECIES_INTELEON_GIGANTAMAX - 1] = NATIONAL_DEX_INTELEON, + [SPECIES_CORVIKNIGHT_GIGANTAMAX - 1] = NATIONAL_DEX_CORVIKNIGHT, + [SPECIES_ORBEETLE_GIGANTAMAX - 1] = NATIONAL_DEX_ORBEETLE, + [SPECIES_DREDNAW_GIGANTAMAX - 1] = NATIONAL_DEX_DREDNAW, + [SPECIES_COALOSSAL_GIGANTAMAX - 1] = NATIONAL_DEX_COALOSSAL, + [SPECIES_FLAPPLE_GIGANTAMAX - 1] = NATIONAL_DEX_FLAPPLE, + [SPECIES_APPLETUN_GIGANTAMAX - 1] = NATIONAL_DEX_APPLETUN, + [SPECIES_SANDACONDA_GIGANTAMAX - 1] = NATIONAL_DEX_SANDACONDA, + [SPECIES_TOXTRICITY_GIGANTAMAX - 1] = NATIONAL_DEX_TOXTRICITY, + [SPECIES_CENTISKORCH_GIGANTAMAX - 1] = NATIONAL_DEX_CENTISKORCH, + [SPECIES_HATTERENE_GIGANTAMAX - 1] = NATIONAL_DEX_HATTERENE, + [SPECIES_GRIMMSNARL_GIGANTAMAX - 1] = NATIONAL_DEX_GRIMMSNARL, + [SPECIES_ALCREMIE_GIGANTAMAX - 1] = NATIONAL_DEX_ALCREMIE, + [SPECIES_COPPERAJAH_GIGANTAMAX - 1] = NATIONAL_DEX_COPPERAJAH, + [SPECIES_DURALUDON_GIGANTAMAX - 1] = NATIONAL_DEX_DURALUDON, + [SPECIES_URSHIFU_GIGANTAMAX - 1] = NATIONAL_DEX_URSHIFU, + [SPECIES_URSHIFU_RAPID_STRIKE_STYLE_GIGANTAMAX - 1] = NATIONAL_DEX_URSHIFU, #endif }; @@ -7744,10 +7779,26 @@ bool32 IsSpeciesInHoennDex(u16 species) u16 GetBattleBGM(void) { - if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) - return MUS_VS_KYOGRE_GROUDON; - else if (gBattleTypeFlags & BATTLE_TYPE_REGI) - return MUS_VS_REGI; + if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY) + { + switch (GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL)) + { + case SPECIES_RAYQUAZA: + return MUS_VS_RAYQUAZA; + case SPECIES_KYOGRE: + case SPECIES_GROUDON: + return MUS_VS_KYOGRE_GROUDON; + case SPECIES_REGIROCK: + case SPECIES_REGICE: + case SPECIES_REGISTEEL: + case SPECIES_REGIGIGAS: + case SPECIES_REGIELEKI: + case SPECIES_REGIDRAGO: + return MUS_VS_REGI; + default: + return MUS_RG_VS_LEGEND; + } + } else if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK)) return MUS_VS_TRAINER; else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) diff --git a/src/pokemon_icon.c b/src/pokemon_icon.c index a6e4101d3872..529ea615437b 100644 --- a/src/pokemon_icon.c +++ b/src/pokemon_icon.c @@ -1294,6 +1294,40 @@ const u8 *const gMonIconTable[NUM_SPECIES + 1] = [SPECIES_CALYREX_SHADOW_RIDER] = gMonIcon_CalyrexShadowRider, [SPECIES_ENAMORUS_THERIAN] = gMonIcon_EnamorusTherian, [SPECIES_BASCULEGION_FEMALE] = gMonIcon_BasculegionFemale, + // Gigantamax Forms + [SPECIES_VENUSAUR_GIGANTAMAX] = gMonIcon_VenusaurGigantamax, + [SPECIES_CHARIZARD_GIGANTAMAX] = gMonIcon_CharizardGigantamax, + [SPECIES_BLASTOISE_GIGANTAMAX] = gMonIcon_BlastoiseGigantamax, + [SPECIES_BUTTERFREE_GIGANTAMAX] = gMonIcon_ButterfreeGigantamax, + [SPECIES_PIKACHU_GIGANTAMAX] = gMonIcon_PikachuGigantamax, + [SPECIES_MEOWTH_GIGANTAMAX] = gMonIcon_MeowthGigantamax, + [SPECIES_MACHAMP_GIGANTAMAX] = gMonIcon_MachampGigantamax, + [SPECIES_GENGAR_GIGANTAMAX] = gMonIcon_GengarGigantamax, + [SPECIES_KINGLER_GIGANTAMAX] = gMonIcon_KinglerGigantamax, + [SPECIES_LAPRAS_GIGANTAMAX] = gMonIcon_LaprasGigantamax, + [SPECIES_EEVEE_GIGANTAMAX] = gMonIcon_EeveeGigantamax, + [SPECIES_SNORLAX_GIGANTAMAX] = gMonIcon_SnorlaxGigantamax, + [SPECIES_GARBODOR_GIGANTAMAX] = gMonIcon_GarbodorGigantamax, + [SPECIES_MELMETAL_GIGANTAMAX] = gMonIcon_MelmetalGigantamax, + [SPECIES_RILLABOOM_GIGANTAMAX] = gMonIcon_RillaboomGigantamax, + [SPECIES_CINDERACE_GIGANTAMAX] = gMonIcon_CinderaceGigantamax, + [SPECIES_INTELEON_GIGANTAMAX] = gMonIcon_InteleonGigantamax, + [SPECIES_CORVIKNIGHT_GIGANTAMAX] = gMonIcon_CorviknightGigantamax, + [SPECIES_ORBEETLE_GIGANTAMAX] = gMonIcon_OrbeetleGigantamax, + [SPECIES_DREDNAW_GIGANTAMAX] = gMonIcon_DrednawGigantamax, + [SPECIES_COALOSSAL_GIGANTAMAX] = gMonIcon_CoalossalGigantamax, + [SPECIES_FLAPPLE_GIGANTAMAX] = gMonIcon_FlappleGigantamax, + [SPECIES_APPLETUN_GIGANTAMAX] = gMonIcon_AppletunGigantamax, + [SPECIES_SANDACONDA_GIGANTAMAX] = gMonIcon_SandacondaGigantamax, + [SPECIES_TOXTRICITY_GIGANTAMAX] = gMonIcon_ToxtricityGigantamax, + [SPECIES_CENTISKORCH_GIGANTAMAX] = gMonIcon_CentiskorchGigantamax, + [SPECIES_HATTERENE_GIGANTAMAX] = gMonIcon_HattereneGigantamax, + [SPECIES_GRIMMSNARL_GIGANTAMAX] = gMonIcon_GrimmsnarlGigantamax, + [SPECIES_ALCREMIE_GIGANTAMAX] = gMonIcon_AlcremieGigantamax, + [SPECIES_COPPERAJAH_GIGANTAMAX] = gMonIcon_CopperajahGigantamax, + [SPECIES_DURALUDON_GIGANTAMAX] = gMonIcon_DuraludonGigantamax, + [SPECIES_URSHIFU_GIGANTAMAX] = gMonIcon_UrshifuGigantamax, + [SPECIES_URSHIFU_RAPID_STRIKE_STYLE_GIGANTAMAX] = gMonIcon_UrshifuRapidStrikeGigantamax, #endif [SPECIES_EGG] = gMonIcon_Egg, }; @@ -2528,6 +2562,39 @@ const u8 gMonIconPaletteIndices[] = [SPECIES_CALYREX_SHADOW_RIDER] = 0, [SPECIES_ENAMORUS_THERIAN] = 1, [SPECIES_BASCULEGION_FEMALE] = 0, + [SPECIES_VENUSAUR_GIGANTAMAX] = 0, + [SPECIES_CHARIZARD_GIGANTAMAX] = 0, + [SPECIES_BLASTOISE_GIGANTAMAX] = 0, + [SPECIES_BUTTERFREE_GIGANTAMAX] = 0, + [SPECIES_PIKACHU_GIGANTAMAX] = 2, + [SPECIES_MEOWTH_GIGANTAMAX] = 1, + [SPECIES_MACHAMP_GIGANTAMAX] = 0, + [SPECIES_GENGAR_GIGANTAMAX] = 2, + [SPECIES_KINGLER_GIGANTAMAX] = 0, + [SPECIES_LAPRAS_GIGANTAMAX] = 2, + [SPECIES_EEVEE_GIGANTAMAX] = 2, + [SPECIES_SNORLAX_GIGANTAMAX] = 3, + [SPECIES_GARBODOR_GIGANTAMAX] = 0, + [SPECIES_MELMETAL_GIGANTAMAX] = 0, + [SPECIES_RILLABOOM_GIGANTAMAX] = 1, + [SPECIES_CINDERACE_GIGANTAMAX] = 0, + [SPECIES_INTELEON_GIGANTAMAX] = 0, + [SPECIES_CORVIKNIGHT_GIGANTAMAX] = 0, + [SPECIES_ORBEETLE_GIGANTAMAX] = 0, + [SPECIES_DREDNAW_GIGANTAMAX] = 0, + [SPECIES_COALOSSAL_GIGANTAMAX] = 0, + [SPECIES_FLAPPLE_GIGANTAMAX] = 1, + [SPECIES_APPLETUN_GIGANTAMAX] = 1, + [SPECIES_SANDACONDA_GIGANTAMAX] = 1, + [SPECIES_TOXTRICITY_GIGANTAMAX] = 0, + [SPECIES_CENTISKORCH_GIGANTAMAX] = 0, + [SPECIES_HATTERENE_GIGANTAMAX] = 0, + [SPECIES_GRIMMSNARL_GIGANTAMAX] = 0, + [SPECIES_ALCREMIE_GIGANTAMAX] = 1, + [SPECIES_COPPERAJAH_GIGANTAMAX] = 0, + [SPECIES_DURALUDON_GIGANTAMAX] = 0, + [SPECIES_URSHIFU_GIGANTAMAX] = 0, + [SPECIES_URSHIFU_RAPID_STRIKE_STYLE_GIGANTAMAX] = 0, #endif [SPECIES_EGG] = 1, }; diff --git a/test/dynamax.c b/test/dynamax.c new file mode 100644 index 000000000000..27a689153e71 --- /dev/null +++ b/test/dynamax.c @@ -0,0 +1,1461 @@ +#include "global.h" +#include "test/battle.h" + +// ============= DYNAMAX AND MAX MOVE INTERACTIONS =================== +SINGLE_BATTLE_TEST("(DYNAMAX) Dynamax increases HP and max HP by 1.5x", u16 hp) +{ + bool32 dynamax; + PARAMETRIZE { dynamax = FALSE; } + PARAMETRIZE { dynamax = TRUE; } + GIVEN { // TODO: Dynamax level + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_TACKLE, dynamax: dynamax); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + if (dynamax) { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_DYNAMAX_GROWTH, player); + MESSAGE("Wobbuffet used Max Strike!"); + } + MESSAGE("Foe Wobbuffet used Celebrate!"); + } THEN { + results[i].hp = player->hp; + } FINALLY { + EXPECT_MUL_EQ(results[0].hp, Q_4_12(1.5), results[1].hp); + } +} + +SINGLE_BATTLE_TEST("(DYNAMAX) Dynamax expires after three turns", u16 hp) +{ + bool32 dynamax; + PARAMETRIZE { dynamax = FALSE; } + PARAMETRIZE { dynamax = TRUE; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_TACKLE, dynamax: dynamax); } // 1st max move + TURN { MOVE(player, MOVE_TACKLE); } // 2nd max move + TURN { MOVE(player, MOVE_TACKLE); } // 3rd max move + } SCENE { + int i; + for (i = 0; i < DYNAMAX_TURNS_COUNT; ++i) { + if (dynamax) + MESSAGE("Wobbuffet used Max Strike!"); + else + MESSAGE("Wobbuffet used Tackle!"); + MESSAGE("Foe Wobbuffet used Celebrate!"); + } + if (dynamax) // Expect to have visual reversion at the end. + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player); + } THEN { + results[i].hp = player->hp; + } FINALLY { + EXPECT_EQ(results[0].hp, results[1].hp); + } +} + +SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon cannot be flinched") +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_FAKE_OUT].effect == EFFECT_FAKE_OUT); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_FAKE_OUT); MOVE(player, MOVE_TACKLE, dynamax: TRUE); } + } SCENE { + MESSAGE("Foe Wobbuffet used Fake Out!"); + NONE_OF { MESSAGE("Wobbuffet flinched!"); } + MESSAGE("Wobbuffet used Max Strike!"); + } +} + +SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon cannot be hit by weight-based moves") +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_HEAVY_SLAM].effect == EFFECT_HEAT_CRASH); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); MOVE(opponent, MOVE_HEAVY_SLAM); } + } SCENE { + MESSAGE("Wobbuffet used Max Strike!"); + MESSAGE("Foe Wobbuffet used Heavy Slam!"); + MESSAGE("The move was blocked by the power of Dynamax!"); + NONE_OF { HP_BAR(player); } + } +} + +SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon cannot be hit by OHKO moves") +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_FISSURE].effect == EFFECT_OHKO); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_MACHAMP) { Ability(ABILITY_NO_GUARD); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); MOVE(opponent, MOVE_FISSURE); } + } SCENE { + MESSAGE("Wobbuffet used Max Strike!"); + MESSAGE("Foe Machamp used Fissure!"); + MESSAGE("Wobbuffet is unaffected!"); + NONE_OF { HP_BAR(player); } + } +} + +// can't be used at all in Raid, see "Documenting Dynamax" +SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are not affected by Destiny Bond") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(50); }; + OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(100); } + } WHEN { + TURN { MOVE(opponent, MOVE_DESTINY_BOND); MOVE(player, MOVE_TACKLE, dynamax: TRUE); } + } SCENE { + MESSAGE("Foe Wobbuffet used Destiny Bond!"); + MESSAGE("Wobbuffet used Max Strike!"); + MESSAGE("Foe Wobbuffet fainted!"); + NONE_OF { HP_BAR(player); } + } +} + +SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are affected by Grudge") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(50); }; + OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(100); } + } WHEN { + TURN { MOVE(opponent, MOVE_GRUDGE); MOVE(player, MOVE_TACKLE, dynamax: TRUE); } + } SCENE { + MESSAGE("Foe Wobbuffet used Grudge!"); + MESSAGE("Wobbuffet used Max Strike!"); + MESSAGE("Wobbuffet's Tackle lost all its PP due to the GRUDGE!"); + MESSAGE("Foe Wobbuffet fainted!"); + } +} + +SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are not affected by phazing moves, but still take damage") +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_DRAGON_TAIL].effect == EFFECT_HIT_SWITCH_TARGET); + ASSUME(gBattleMoves[MOVE_WHIRLWIND].effect == EFFECT_ROAR); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_DRAGON_TAIL); MOVE(player, MOVE_TACKLE, dynamax: TRUE); } + TURN { MOVE(opponent, MOVE_WHIRLWIND); MOVE(player, MOVE_TACKLE); } + } SCENE { + MESSAGE("Wobbuffet used Max Strike!"); + MESSAGE("Foe Wobbuffet used Dragon Tail!"); + HP_BAR(player); + MESSAGE("The move was blocked by the power of Dynamax!"); + MESSAGE("Wobbuffet used Max Strike!"); + MESSAGE("Foe Wobbuffet used Whirlwind!"); + MESSAGE("The move was blocked by the power of Dynamax!"); + } +} + +SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are not affected by Red Card") +{ + GIVEN { + ASSUME(gItems[ITEM_RED_CARD].holdEffect == HOLD_EFFECT_RED_CARD); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_RED_CARD); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + MESSAGE("Wobbuffet used Max Strike!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + MESSAGE("Foe Wobbuffet held up its Red Card against Wobbuffet!"); + MESSAGE("The move was blocked by the power of Dynamax!"); + } THEN { + EXPECT_EQ(opponent->item, ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon can be switched out by Eject Button") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_EJECT_BUTTON); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); MOVE(opponent, MOVE_TACKLE); SEND_OUT(player, 1); } + } SCENE { + MESSAGE("Wobbuffet used Max Strike!"); + MESSAGE("Foe Wobbuffet used Tackle!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Wobbuffet is switched out with the Eject Button!"); + } THEN { + EXPECT_EQ(opponent->item, ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon cannot have their ability swapped to another Pokemon's") +{ + GIVEN { + ASSUME(P_GEN_8_POKEMON == TRUE); + PLAYER(SPECIES_MILTANK) { Ability(ABILITY_SCRAPPY); } + OPPONENT(SPECIES_RUNERIGUS) { Ability(ABILITY_WANDERING_SPIRIT); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); MOVE(opponent, MOVE_SKILL_SWAP); } + } SCENE { + MESSAGE("Miltank used Max Strike!"); + MESSAGE("Foe Runerigus used Skill Swap!"); + MESSAGE("But it failed!"); + } THEN { + EXPECT_EQ(player->ability, ABILITY_SCRAPPY); + } +} + +SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon can have their ability changed or suppressed") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_SHADOW_TAG); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); MOVE(opponent, MOVE_SIMPLE_BEAM); } + } SCENE { + MESSAGE("Wobbuffet used Max Strike!"); + MESSAGE("Foe Wobbuffet used Simple Beam!"); + MESSAGE("Wobbuffet acquired Simple!"); + } THEN { + EXPECT_EQ(player->ability, ABILITY_SIMPLE); + } +} + +SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are immune to Encore") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); MOVE(opponent, MOVE_ENCORE); } + TURN { MOVE(player, MOVE_EMBER); } + } SCENE { + MESSAGE("Wobbuffet used Max Strike!"); + MESSAGE("Foe Wobbuffet used Encore!"); + MESSAGE("But it failed!"); + MESSAGE("Wobbuffet used Max Flare!"); + } +} + +SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon can be encored immediately after reverting") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(50); }; // yes, this speed is necessary + OPPONENT(SPECIES_WOBBUFFET) { Speed(100); }; + } WHEN { + TURN { MOVE(player, MOVE_ARM_THRUST, dynamax: TRUE); } + TURN { MOVE(player, MOVE_ARM_THRUST); } + TURN { MOVE(player, MOVE_ARM_THRUST); } + TURN { MOVE(opponent, MOVE_ENCORE); MOVE(player, MOVE_TACKLE); } + } SCENE { + MESSAGE("Wobbuffet used Max Knuckle!"); + MESSAGE("Wobbuffet used Max Knuckle!"); + MESSAGE("Wobbuffet used Max Knuckle!"); + MESSAGE("Foe Wobbuffet used Encore!"); + MESSAGE("Wobbuffet used Arm Thrust!"); + } +} + +// Max Moves don't make contact, so Cursed Body doesn't need to be tested, but it is coded for. +SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon's Max Moves cannot be disabled") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); MOVE(opponent, MOVE_DISABLE); } + } SCENE { + MESSAGE("Wobbuffet used Max Strike!"); + MESSAGE("Foe Wobbuffet used Disable!"); + MESSAGE("But it failed!"); + } +} + +SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon can have base moves disabled on their first turn") +{ + GIVEN { + ASSUME(B_DISABLE_TURNS >= GEN_5); + PLAYER(SPECIES_WOBBUFFET) { Speed(50); }; + OPPONENT(SPECIES_WOBBUFFET) { Speed(100); }; + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_TACKLE); } + TURN { MOVE(opponent, MOVE_DISABLE); MOVE(player, MOVE_TACKLE, dynamax: TRUE); } + TURN {} + TURN {} + TURN { MOVE(player, MOVE_TACKLE, allowed: FALSE); MOVE(player, MOVE_CELEBRATE); } + } SCENE { + MESSAGE("Foe Wobbuffet used Celebrate!"); + MESSAGE("Wobbuffet used Tackle!"); + MESSAGE("Foe Wobbuffet used Disable!"); + MESSAGE("Wobbuffet's Tackle was disabled!"); + MESSAGE("Wobbuffet used Max Strike!"); + } +} + +SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are immune to Torment") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); MOVE(opponent, MOVE_TORMENT); } + } SCENE { + MESSAGE("Wobbuffet used Max Strike!"); + MESSAGE("Foe Wobbuffet used Torment!"); + MESSAGE("But it failed!"); + } +} + +// This is true for all item-removing moves. +SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are not immune to Knock Off") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_POTION); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); MOVE(opponent, MOVE_KNOCK_OFF); } + } SCENE { + MESSAGE("Wobbuffet used Max Strike!"); + MESSAGE("Foe Wobbuffet used Knock Off!"); + MESSAGE("Foe Wobbuffet knocked off Wobbuffet's Potion!"); + } THEN { + EXPECT_EQ(player->item, ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon lose their substitutes") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SUBSTITUTE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); MOVE(opponent, MOVE_TACKLE); } + } SCENE { + MESSAGE("Wobbuffet used Substitute!"); + MESSAGE("Wobbuffet made a SUBSTITUTE!"); + MESSAGE("Wobbuffet used Max Strike!"); + MESSAGE("Foe Wobbuffet used Tackle!"); + HP_BAR(player); + } +} + +DOUBLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon can have their base moves copied by Copycat") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerLeft, MOVE_TRICK_ROOM, dynamax: TRUE, target: opponentLeft); MOVE(playerRight, MOVE_COPYCAT, target: opponentLeft); } + } SCENE { + MESSAGE("Wobbuffet used Max Guard!"); + MESSAGE("Wynaut used Trick Room!"); + } +} + +SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon take double damage from Dynamax Cannon", s16 damage) +{ + bool32 dynamaxed; + PARAMETRIZE { dynamaxed = FALSE; } + PARAMETRIZE { dynamaxed = TRUE; } + GIVEN { + ASSUME(gBattleMoves[MOVE_DYNAMAX_CANNON].effect == EFFECT_DYNAMAX_DOUBLE_DMG); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_TACKLE, dynamax: dynamaxed); MOVE(opponent, MOVE_DYNAMAX_CANNON); } + } SCENE { + HP_BAR(player, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, UQ_4_12(2.0), results[1].damage); + } +} + +SINGLE_BATTLE_TEST("(DYNAMAX) Max Moves deal 1/4 damage through protect", s16 damage) +{ + bool32 protected; + PARAMETRIZE { protected = TRUE; } + PARAMETRIZE { protected = FALSE; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + if (protected) + TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); MOVE(opponent, MOVE_PROTECT); } + else + TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); } + } SCENE { + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(4), results[1].damage); + } +} + +SINGLE_BATTLE_TEST("(DYNAMAX) Max Moves don't bypass Max Guard") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); MOVE(opponent, MOVE_PROTECT, dynamax: TRUE); } + } SCENE { + NONE_OF { HP_BAR(opponent); } + } +} + +DOUBLE_BATTLE_TEST("(DYNAMAX) Feint bypasses Max Guard but doesn't break it") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerLeft, MOVE_PROTECT, dynamax: TRUE); + MOVE(opponentLeft, MOVE_FEINT, target: playerLeft); + MOVE(opponentRight, MOVE_TACKLE, target: playerLeft); + } + } SCENE { + MESSAGE("Wobbuffet used Max Guard!"); + MESSAGE("Foe Wobbuffet used Feint!"); + HP_BAR(playerLeft); + MESSAGE("Foe Wynaut used Tackle!"); + NONE_OF { HP_BAR(playerLeft); } + } +} + +DOUBLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are immune to Instruct") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerLeft, MOVE_TACKLE, dynamax: TRUE, target: opponentLeft); + MOVE(playerRight, MOVE_INSTRUCT, target: playerLeft); + } + } SCENE { + MESSAGE("Wobbuffet used Max Strike!"); + MESSAGE("Wynaut used Instruct!"); + MESSAGE("But it failed!"); + } +} + +// TODO: Gigantamax factor +SINGLE_BATTLE_TEST("(DYNAMAX) Pokemon with Gigantamax forms change upon Dynamaxing") +{ + GIVEN { + PLAYER(SPECIES_VENUSAUR); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); } + } THEN { + EXPECT_EQ(player->species, SPECIES_VENUSAUR_GIGANTAMAX); + } +} + +SINGLE_BATTLE_TEST("(DYNAMAX) Pokemon with Gigantamax forms revert upon switching") +{ + GIVEN { + PLAYER(SPECIES_VENUSAUR); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); } + TURN { SWITCH(player, 1); } + TURN { SWITCH(player, 0); } + } THEN { + EXPECT_EQ(player->species, SPECIES_VENUSAUR); + } +} + +SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are not affected by Choice items", s16 damage) +{ + u16 item; + PARAMETRIZE { item = ITEM_CHOICE_BAND; } + PARAMETRIZE { item = ITEM_NONE; } + GIVEN { + ASSUME(gItems[ITEM_CHOICE_BAND].holdEffect == HOLD_EFFECT_CHOICE_BAND); + PLAYER(SPECIES_WOBBUFFET) { Item(item); }; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); } + TURN { MOVE(player, MOVE_ARM_THRUST, dynamax: TRUE); } + } SCENE { + MESSAGE("Wobbuffet used Max Strike!"); + HP_BAR(opponent, captureDamage: &results[i].damage); + MESSAGE("Wobbuffet used Max Knuckle!"); + } FINALLY { + EXPECT_EQ(results[0].damage, results[1].damage); + } +} + +SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon cannot use Max Guard while holding Assault Vest") +{ + GIVEN { + ASSUME(gItems[ITEM_ASSAULT_VEST].holdEffect == HOLD_EFFECT_ASSAULT_VEST); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_ASSAULT_VEST); }; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); } + TURN { MOVE(player, MOVE_PROTECT, allowed: FALSE); MOVE(player, MOVE_TACKLE); } + } SCENE { + MESSAGE("Wobbuffet used Max Strike!"); + MESSAGE("Wobbuffet used Max Strike!"); + } +} + +// Almost anything that calculates gBattleMoveDamage based on HP has been changed to non-Dynamax HP. +// This includes Leftovers, Life Orb, Heal Pulse, Rocky Helmet, Sandstorm, etc. etc. +// There are some redundant cases (i.e Substitute) that can never be used by a Dynamaxed pokemon. +// Anything that is conditional based off max HP still uses gBattleMons[battler].maxHP. +// Below are some tests, but very far from all encompassing: + +SINGLE_BATTLE_TEST("(DYNAMAX) Endeavor uses a Pokemon's non-Dynamax HP", s16 damage) +{ + bool32 dynamax; + PARAMETRIZE { dynamax = TRUE; } + PARAMETRIZE { dynamax = FALSE; } + GIVEN { + ASSUME(gBattleMoves[MOVE_ENDEAVOR].effect == EFFECT_ENDEAVOR); + PLAYER(SPECIES_WOBBUFFET) { Speed(50); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(100); } + } WHEN { + TURN { MOVE(opponent, MOVE_ENDEAVOR); MOVE(player, MOVE_TACKLE, dynamax: dynamax); } + } SCENE { + MESSAGE("Foe Wobbuffet used Endeavor!"); + HP_BAR(player, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_EQ(results[0].damage, results[1].damage); + } +} + +SINGLE_BATTLE_TEST("(DYNAMAX) Super Fang uses a Pokemon's non-Dynamax HP", s16 damage) +{ + bool32 dynamax; + PARAMETRIZE { dynamax = TRUE; } + PARAMETRIZE { dynamax = FALSE; } + GIVEN { + ASSUME(gBattleMoves[MOVE_SUPER_FANG].effect == EFFECT_SUPER_FANG); + PLAYER(SPECIES_WOBBUFFET) { Speed(50); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(100); } + } WHEN { + TURN { MOVE(opponent, MOVE_SUPER_FANG); MOVE(player, MOVE_TACKLE, dynamax: dynamax); } + } SCENE { + MESSAGE("Foe Wobbuffet used Super Fang!"); + HP_BAR(player, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_EQ(results[0].damage, results[1].damage); + } +} + +SINGLE_BATTLE_TEST("(DYNAMAX) Pain Split uses a Pokemon's non-Dynamax HP", s16 damage) +{ + bool32 dynamax; + PARAMETRIZE { dynamax = TRUE; } + PARAMETRIZE { dynamax = FALSE; } + GIVEN { + ASSUME(gBattleMoves[MOVE_PAIN_SPLIT].effect == EFFECT_PAIN_SPLIT); + PLAYER(SPECIES_WOBBUFFET) { Speed(50); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(100); } + } WHEN { + TURN { MOVE(opponent, MOVE_PAIN_SPLIT); MOVE(player, MOVE_TACKLE, dynamax: dynamax); } + } SCENE { + MESSAGE("Foe Wobbuffet used Pain Split!"); + HP_BAR(player, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_EQ(results[0].damage, results[1].damage); + } +} + +SINGLE_BATTLE_TEST("(DYNAMAX) Sitrus Berries heal based on a Pokemon's non-Dynamax HP", s16 damage) +{ + bool32 dynamax; + PARAMETRIZE { dynamax = TRUE; } + PARAMETRIZE { dynamax = FALSE; } + GIVEN { + ASSUME(I_SITRUS_BERRY_HEAL >= GEN_4); + ASSUME(gItems[ITEM_SITRUS_BERRY].holdEffect == HOLD_EFFECT_RESTORE_PCT_HP); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SITRUS_BERRY); } + } WHEN { + TURN { MOVE(opponent, MOVE_FLING); MOVE(player, MOVE_TACKLE, dynamax: dynamax); } + } SCENE { + MESSAGE("Wobbuffet's Sitrus Berry restored health!"); + HP_BAR(player, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_EQ(results[0].damage, results[1].damage); + } +} + +SINGLE_BATTLE_TEST("(DYNAMAX) Heal Pulse heals based on a Pokemon's non-Dynamax HP", s16 damage) +{ + bool32 dynamax; + PARAMETRIZE { dynamax = TRUE; } + PARAMETRIZE { dynamax = FALSE; } + GIVEN { + ASSUME(gBattleMoves[MOVE_HEAL_PULSE].effect == EFFECT_HEAL_PULSE); + PLAYER(SPECIES_WOBBUFFET) { HP(1); Speed(50); } + OPPONENT(SPECIES_WOBBUFFET) { MaxHP(100); Speed(100); } + } WHEN { + TURN { MOVE(opponent, MOVE_HEAL_PULSE); MOVE(player, MOVE_TACKLE, dynamax: dynamax); } + } SCENE { + MESSAGE("Foe Wobbuffet used Heal Pulse!"); + HP_BAR(player, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_EQ(results[0].damage, results[1].damage); + } +} + +// ============= MAX MOVE EFFECTS ========================================== +SINGLE_BATTLE_TEST("(DYNAMAX) Max Strike lowers single opponent's speed") +{ + GIVEN { + // Fails?: ASSUME(GetMaxMove(B_POSITION_PLAYER_LEFT, MOVE_TACKLE) == MOVE_MAX_STRIKE); + ASSUME(gBattleMoves[MOVE_MAX_STRIKE].argument == MAX_EFFECT_LOWER_SPEED); + OPPONENT(SPECIES_WOBBUFFET) { Speed(100); } + PLAYER(SPECIES_WOBBUFFET) { Speed(80); } + } WHEN { + TURN { MOVE(opponent, MOVE_TACKLE); MOVE(player, MOVE_TACKLE, dynamax: TRUE); } + TURN { MOVE(player, MOVE_TACKLE); MOVE(opponent, MOVE_TACKLE); } + } SCENE { + // turn 1 + MESSAGE("Foe Wobbuffet used Tackle!"); + MESSAGE("Wobbuffet used Max Strike!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("Foe Wobbuffet's Speed fell!"); + // turn 2 + MESSAGE("Wobbuffet used Max Strike!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("Foe Wobbuffet's Speed fell!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + } +} + +// This test should apply to all stat-lowering Max Moves, including G-Max Foam Burst and G-Max Tartness. +DOUBLE_BATTLE_TEST("(DYNAMAX) Max Strike lowers both opponents' speed") +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_MAX_STRIKE].argument == MAX_EFFECT_LOWER_SPEED); + PLAYER(SPECIES_WOBBUFFET) { Speed(80); } + PLAYER(SPECIES_WOBBUFFET) { Speed(79); } + OPPONENT(SPECIES_WOBBUFFET) {Speed(100); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(99); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_TACKLE, target: opponentLeft, dynamax: TRUE); \ + MOVE(opponentLeft, MOVE_TACKLE, target: playerLeft); \ + MOVE(opponentRight, MOVE_TACKLE, target: playerLeft); } + TURN { MOVE(playerLeft, MOVE_TACKLE, target: opponentLeft); \ + MOVE(opponentLeft, MOVE_TACKLE, target: playerLeft); \ + MOVE(opponentRight, MOVE_TACKLE, target: playerLeft); } + } SCENE { + // turn 1 + MESSAGE("Foe Wobbuffet used Tackle!"); + MESSAGE("Foe Wobbuffet used Tackle!"); + MESSAGE("Wobbuffet used Max Strike!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + MESSAGE("Foe Wobbuffet's Speed fell!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + MESSAGE("Foe Wobbuffet's Speed fell!"); + // turn 2 + MESSAGE("Wobbuffet used Max Strike!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + MESSAGE("Foe Wobbuffet's Speed fell!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + MESSAGE("Foe Wobbuffet's Speed fell!"); + MESSAGE("Foe Wobbuffet used Tackle!"); + MESSAGE("Foe Wobbuffet used Tackle!"); + } +} + +// This test should apply to all stat-boosting Max Moves, too. +DOUBLE_BATTLE_TEST("(DYNAMAX) Max Knuckle raises both allies' attack") +{ + s16 damage[4]; + GIVEN { + ASSUME(gBattleMoves[MOVE_MAX_KNUCKLE].argument == MAX_EFFECT_RAISE_TEAM_ATTACK); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerLeft, MOVE_CLOSE_COMBAT, target: opponentLeft, dynamax: TRUE); \ + MOVE(playerRight, MOVE_TACKLE, target: opponentRight); } + TURN { MOVE(playerLeft, MOVE_CLOSE_COMBAT, target: opponentLeft); \ + MOVE(playerRight, MOVE_TACKLE, target: opponentRight); } + } SCENE { + // turn 1 + MESSAGE("Wobbuffet used Max Knuckle!"); + HP_BAR(opponentLeft, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + MESSAGE("Wobbuffet's Attack rose!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + MESSAGE("Wynaut's Attack rose!"); + MESSAGE("Wynaut used Tackle!"); + HP_BAR(opponentRight, captureDamage: &damage[1]); + MESSAGE("Foe Wobbuffet used Celebrate!"); + MESSAGE("Foe Wynaut used Celebrate!"); + // turn 2 + MESSAGE("Wobbuffet used Max Knuckle!"); + HP_BAR(opponentLeft, captureDamage: &damage[2]); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + MESSAGE("Wobbuffet's Attack rose!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + MESSAGE("Wynaut's Attack rose!"); + MESSAGE("Wynaut used Tackle!"); + HP_BAR(opponentRight, captureDamage: &damage[3]); + } THEN { + EXPECT_GT(damage[2], damage[0]); + EXPECT_GT(damage[3], damage[1]); + } +} + +SINGLE_BATTLE_TEST("(DYNAMAX) Max Flare sets up sunlight") +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_MAX_FLARE].argument == MAX_EFFECT_SUN); + OPPONENT(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_EMBER, dynamax: TRUE); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + MESSAGE("Wobbuffet used Max Flare!"); + MESSAGE("The sunlight got bright!"); + MESSAGE("Foe Wobbuffet used Celebrate!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_SUN_CONTINUES); + } +} + +SINGLE_BATTLE_TEST("(DYNAMAX) Max Geyser sets up heavy rain") +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_MAX_GEYSER].argument == MAX_EFFECT_RAIN); + OPPONENT(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_WATER_GUN, dynamax: TRUE); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + MESSAGE("Wobbuffet used Max Geyser!"); + MESSAGE("It started to rain!"); + MESSAGE("Foe Wobbuffet used Celebrate!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_RAIN_CONTINUES); + } +} + +SINGLE_BATTLE_TEST("(DYNAMAX) Max Hailstorm sets up hail") +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_MAX_HAILSTORM].argument == MAX_EFFECT_HAIL); + OPPONENT(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_POWDER_SNOW, dynamax: TRUE); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + MESSAGE("Wobbuffet used Max Hailstorm!"); + MESSAGE("It started to hail!"); + MESSAGE("Foe Wobbuffet used Celebrate!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HAIL_CONTINUES); + } +} + +SINGLE_BATTLE_TEST("(DYNAMAX) Max Rockfall sets up a sandstorm") +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_MAX_ROCKFALL].argument == MAX_EFFECT_SANDSTORM); + OPPONENT(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_ROCK_THROW, dynamax: TRUE); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + MESSAGE("Wobbuffet used Max Rockfall!"); + MESSAGE("A sandstorm brewed!"); + MESSAGE("Foe Wobbuffet used Celebrate!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_SANDSTORM_CONTINUES); + } +} + +SINGLE_BATTLE_TEST("(DYNAMAX) Max Overgrowth sets up Grassy Terrain") +{ + s32 maxHP = 490; // Because of recalculated stats upon Dynamaxing + GIVEN { + ASSUME(gBattleMoves[MOVE_MAX_OVERGROWTH].argument == MAX_EFFECT_GRASSY_TERRAIN); + ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseHP == 190); + OPPONENT(SPECIES_WOBBUFFET) { MaxHP(maxHP); HP(maxHP / 2); }; + PLAYER(SPECIES_WOBBUFFET) { MaxHP(maxHP); HP(maxHP / 2); }; + } WHEN { + TURN { MOVE(player, MOVE_VINE_WHIP, dynamax: TRUE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_VINE_WHIP); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + MESSAGE("Wobbuffet used Max Overgrowth!"); + MESSAGE("Grass grew to cover the battlefield!"); + MESSAGE("Wobbuffet is healed by the grassy terrain!"); + HP_BAR(player, damage: -maxHP/16); + MESSAGE("Foe Wobbuffet is healed by the grassy terrain!"); + HP_BAR(opponent, damage: -maxHP/16); + } +} + +SINGLE_BATTLE_TEST("(DYNAMAX) Max Mindstorm sets up Psychic Terrain") +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_MAX_MINDSTORM].argument == MAX_EFFECT_PSYCHIC_TERRAIN); + OPPONENT(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_EXTREME_SPEED); MOVE(player, MOVE_PSYCHIC, dynamax: TRUE); } + TURN { MOVE(opponent, MOVE_EXTREME_SPEED); MOVE(player, MOVE_PSYCHIC); } + } SCENE { + MESSAGE("Foe Wobbuffet used ExtremeSpeed!"); + MESSAGE("Wobbuffet used Max Mindstorm!"); + MESSAGE("Foe Wobbuffet cannot use ExtremeSpeed!"); + MESSAGE("Wobbuffet used Max Mindstorm!"); + } +} + +SINGLE_BATTLE_TEST("(DYNAMAX) Max Lightning sets up Electric Terrain") +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_MAX_LIGHTNING].argument == MAX_EFFECT_ELECTRIC_TERRAIN); + OPPONENT(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_THUNDERBOLT, dynamax: TRUE); MOVE(opponent, MOVE_SPORE); } + } SCENE { + MESSAGE("Wobbuffet used Max Lightning!"); + MESSAGE("Foe Wobbuffet used Spore!"); + MESSAGE("Wobbuffet surrounds itself with electrified terrain!"); + } +} + +SINGLE_BATTLE_TEST("(DYNAMAX) Max Starfall sets up Misty Terrain") +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_MAX_STARFALL].argument == MAX_EFFECT_MISTY_TERRAIN); + OPPONENT(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_MOONBLAST, dynamax: TRUE); MOVE(opponent, MOVE_TOXIC); } + } SCENE { + MESSAGE("Wobbuffet used Max Starfall!"); + MESSAGE("Foe Wobbuffet used Toxic!"); + MESSAGE("Wobbuffet surrounds itself with a protective mist!"); + } +} + +SINGLE_BATTLE_TEST("(DYNAMAX) G-Max Stonesurge sets up Stealth Rocks") +{ + GIVEN { + ASSUME(P_GEN_8_POKEMON == TRUE); + ASSUME(gBattleMoves[MOVE_G_MAX_STONESURGE].argument == MAX_EFFECT_STEALTH_ROCK); + PLAYER(SPECIES_DREDNAW); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_LIQUIDATION, dynamax: TRUE); } + TURN { SWITCH(opponent, 1); } + } SCENE { + // turn 1 + MESSAGE("Drednaw used G-Max Stonesurge!"); + MESSAGE("Pointed stones float in the air around the opposing team!"); + // turn 2 + MESSAGE("Pointed stones dug into Foe Wobbuffet!"); + } +} + +// The test below also tests that sharp steel does type-based damage and can be Defogged away. +SINGLE_BATTLE_TEST("(DYNAMAX) G-Max Steelsurge sets up sharp steel") +{ + GIVEN { + ASSUME(P_GEN_8_POKEMON == TRUE); + ASSUME(gBattleMoves[MOVE_G_MAX_STEELSURGE].argument == MAX_EFFECT_STEELSURGE); + PLAYER(SPECIES_COPPERAJAH); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_HATTERENE); + } WHEN { + TURN { MOVE(player, MOVE_IRON_HEAD, dynamax: TRUE); } + TURN { SWITCH(opponent, 1); } + TURN { } // wait out Dynamax + TURN { MOVE(opponent, MOVE_DEFOG); } + } SCENE { + // turn 1 + MESSAGE("Copperajah used G-Max Steelsurge!"); + MESSAGE("Sharp-pointed steel floats around the opposing team!"); + // turn 2 + MESSAGE("2 sent out Hatterene!"); + MESSAGE("Sharp steel bit into Foe Hatterene!"); + // turn 4 + MESSAGE("Foe Hatterene used Defog!"); + MESSAGE("The sharp steel disappeared from the ground around the opposing team!"); + } THEN { + EXPECT_MUL_EQ(opponent->maxHP, Q_4_12(0.75), opponent->hp); + } +} + +// The test below should apply to G-Max Fireball and G-Max Drum Solo, too. +SINGLE_BATTLE_TEST("(DYNAMAX) G-Max Hydrosnipe has fixed power and ignores abilities", s16 damage) +{ + u16 move; + PARAMETRIZE { move = MOVE_WATER_GUN; } + PARAMETRIZE { move = MOVE_HYDRO_CANNON; } + GIVEN { + ASSUME(P_GEN_8_POKEMON == TRUE); + ASSUME(gBattleMoves[MOVE_G_MAX_HYDROSNIPE].argument == MAX_EFFECT_FIXED_POWER); + PLAYER(SPECIES_INTELEON); + OPPONENT(SPECIES_ARCTOVISH) { Ability(ABILITY_WATER_ABSORB); } + } WHEN { + TURN { MOVE(player, move, dynamax: TRUE); } + } SCENE { + MESSAGE("Inteleon used G-Max Hydrosnipe!"); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_EQ(results[0].damage, results[1].damage); + } +} + +DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Volt Crash paralyzes both opponents") +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_G_MAX_VOLT_CRASH].argument == MAX_EFFECT_PARALYZE_FOES); + PLAYER(SPECIES_PIKACHU); + PLAYER(SPECIES_PICHU); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerLeft, MOVE_THUNDERBOLT, target: opponentLeft, dynamax: TRUE); } + } SCENE { + MESSAGE("Pikachu used G-Max Volt Crash!"); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PRZ, opponentLeft); + STATUS_ICON(opponentLeft, paralysis: TRUE); + MESSAGE("Foe Wobbuffet is paralyzed! It may be unable to move!"); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PRZ, opponentRight); + STATUS_ICON(opponentRight, paralysis: TRUE); + MESSAGE("Foe Wynaut is paralyzed! It may be unable to move!"); + } +} + +// G-Max Stun Shock can apply different statuses to each opponent, but this isn't +// compatible with the test RNG set-up. +DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Stun Shock paralyzes or poisons both opponents") +{ + u8 statusAnim; + u32 rng; + PARAMETRIZE { statusAnim = B_ANIM_STATUS_PRZ; rng = STATUS1_PARALYSIS; } + PARAMETRIZE { statusAnim = B_ANIM_STATUS_PSN; rng = STATUS1_POISON; } + GIVEN { + ASSUME(P_GEN_8_POKEMON == TRUE); + ASSUME(gBattleMoves[MOVE_G_MAX_STUN_SHOCK].argument == MAX_EFFECT_POISON_PARALYZE_FOES); + PLAYER(SPECIES_TOXTRICITY); + PLAYER(SPECIES_TOXEL); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerLeft, MOVE_THUNDERBOLT, target: opponentLeft, dynamax: TRUE, \ + WITH_RNG(RNG_G_MAX_STUN_SHOCK, rng)); } + } SCENE { + MESSAGE("Toxtricity used G-Max Stun Shock!"); + // opponent left + ANIMATION(ANIM_TYPE_STATUS, statusAnim, opponentLeft); + if (statusAnim == B_ANIM_STATUS_PSN) { + STATUS_ICON(opponentLeft, poison: TRUE); + MESSAGE("Foe Wobbuffet was poisoned!"); + } + else { + STATUS_ICON(opponentLeft, paralysis: TRUE); + MESSAGE("Foe Wobbuffet is paralyzed! It may be unable to move!"); + } + // opponent right + ANIMATION(ANIM_TYPE_STATUS, statusAnim, opponentRight); + if (statusAnim == B_ANIM_STATUS_PSN) { + STATUS_ICON(opponentRight, poison: TRUE); + MESSAGE("Foe Wynaut was poisoned!"); + } + else { + STATUS_ICON(opponentRight, paralysis: TRUE); + MESSAGE("Foe Wynaut is paralyzed! It may be unable to move!"); + } + } +} + +// This test extends to G-Max Befuddle, too. +DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Stun Shock chooses statuses before considering immunities") +{ + GIVEN { + ASSUME(P_GEN_8_POKEMON == TRUE); + ASSUME(gBattleMoves[MOVE_G_MAX_STUN_SHOCK].argument == MAX_EFFECT_POISON_PARALYZE_FOES); + PLAYER(SPECIES_TOXTRICITY); + PLAYER(SPECIES_TOXEL); + OPPONENT(SPECIES_GARBODOR); + OPPONENT(SPECIES_TRUBBISH); + } WHEN { + TURN { MOVE(playerLeft, MOVE_NUZZLE, target: opponentLeft, dynamax: TRUE, \ + WITH_RNG(RNG_G_MAX_STUN_SHOCK, STATUS1_POISON)); } + } SCENE { + MESSAGE("Toxtricity used G-Max Stun Shock!"); + NONE_OF { + // opponent left + STATUS_ICON(opponentLeft, poison: TRUE); + MESSAGE("Foe Garbodor was poisoned!"); + STATUS_ICON(opponentLeft, paralysis: TRUE); + MESSAGE("Foe Garbodor is paralyzed! It may be unable to move!"); + // opponent right + STATUS_ICON(opponentRight, poison: TRUE); + MESSAGE("Foe Trubbish was poisoned!"); + STATUS_ICON(opponentRight, paralysis: TRUE); + MESSAGE("Foe Trubbish is paralyzed! It may be unable to move!"); + } + } +} + +DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Befuddle paralyzes, poisons, or sleeps both opponents") +{ + u8 statusAnim; + u32 rng; + PARAMETRIZE { statusAnim = B_ANIM_STATUS_PRZ; rng = STATUS1_PARALYSIS; } + PARAMETRIZE { statusAnim = B_ANIM_STATUS_PSN; rng = STATUS1_POISON; } + PARAMETRIZE { statusAnim = B_ANIM_STATUS_SLP; rng = STATUS1_SLEEP; } + GIVEN { + ASSUME(gBattleMoves[MOVE_G_MAX_BEFUDDLE].argument == MAX_EFFECT_EFFECT_SPORE_FOES); + PLAYER(SPECIES_BUTTERFREE); + PLAYER(SPECIES_CATERPIE); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_BUG_BITE, target: opponentLeft, dynamax: TRUE, + WITH_RNG(RNG_G_MAX_BEFUDDLE, rng)); } + } SCENE { + MESSAGE("Butterfree used G-Max Befuddle!"); + // opponent left + ANIMATION(ANIM_TYPE_STATUS, statusAnim, opponentLeft); + if (statusAnim == B_ANIM_STATUS_PSN) { + STATUS_ICON(opponentLeft, poison: TRUE); + MESSAGE("Foe Wobbuffet was poisoned!"); + } + else if (statusAnim == B_ANIM_STATUS_PRZ) { + STATUS_ICON(opponentLeft, paralysis: TRUE); + MESSAGE("Foe Wobbuffet is paralyzed! It may be unable to move!"); + } + else { + STATUS_ICON(opponentLeft, sleep: TRUE); + MESSAGE("Foe Wobbuffet fell asleep!"); + } + // opponent right + ANIMATION(ANIM_TYPE_STATUS, statusAnim, opponentRight); + if (statusAnim == B_ANIM_STATUS_PSN) { + STATUS_ICON(opponentRight, poison: TRUE); + MESSAGE("Foe Wobbuffet was poisoned!"); + } + else if (statusAnim == B_ANIM_STATUS_PRZ) { + STATUS_ICON(opponentRight, paralysis: TRUE); + MESSAGE("Foe Wobbuffet is paralyzed! It may be unable to move!"); + } + else { + STATUS_ICON(opponentRight, sleep: TRUE); + MESSAGE("Foe Wobbuffet fell asleep!"); + } + } +} + +DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Gold Rush confuses both opponents and generates money") +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_G_MAX_GOLD_RUSH].argument == MAX_EFFECT_CONFUSE_FOES_PAY_DAY); + PLAYER(SPECIES_MEOWTH); + PLAYER(SPECIES_PERSIAN); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_TACKLE, target: opponentLeft, dynamax: TRUE); } + } SCENE { + MESSAGE("Meowth used G-Max Gold Rush!"); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_CONFUSION, opponentLeft); + MESSAGE("Foe Wobbuffet became confused!"); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_CONFUSION, opponentRight); + MESSAGE("Foe Wobbuffet became confused!"); + MESSAGE("Coins scattered everywhere!"); + } +} + +DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Smite confuses both opponents") +{ + GIVEN { + ASSUME(P_GEN_8_POKEMON == TRUE); + ASSUME(gBattleMoves[MOVE_G_MAX_SMITE].argument == MAX_EFFECT_CONFUSE_FOES); + PLAYER(SPECIES_HATTERENE); + PLAYER(SPECIES_HATENNA); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_MOONBLAST, target: opponentLeft, dynamax: TRUE); } + } SCENE { + MESSAGE("Hatterene used G-Max Smite!"); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_CONFUSION, opponentLeft); + MESSAGE("Foe Wobbuffet became confused!"); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_CONFUSION, opponentRight); + MESSAGE("Foe Wobbuffet became confused!"); + } +} + +DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Cuddle infatuates both opponents, if possible") +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_G_MAX_CUDDLE].argument == MAX_EFFECT_INFATUATE_FOES); + PLAYER(SPECIES_EEVEE) { Gender(MON_MALE); } + PLAYER(SPECIES_EEVEE); + OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); } + OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_TACKLE, target: opponentLeft, dynamax: TRUE); } + } SCENE { + MESSAGE("Eevee used G-Max Cuddle!"); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_INFATUATION, opponentLeft); + MESSAGE("Foe Wobbuffet fell in love!"); + NONE_OF { + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_INFATUATION, opponentRight); + MESSAGE("Foe Wobbuffet fell in love!"); + } + } +} + +DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Terror traps both opponents") +{ + GIVEN { + ASSUME(gBattleMoves[MOVE_G_MAX_TERROR].argument == MAX_EFFECT_MEAN_LOOK); + PLAYER(SPECIES_GENGAR); + PLAYER(SPECIES_GASTLY); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_LICK, target: opponentLeft, dynamax: TRUE); } + } SCENE { + MESSAGE("Gengar used G-Max Terror!"); + MESSAGE("Foe Wobbuffet can't escape now!"); + MESSAGE("Foe Wobbuffet can't escape now!"); + } THEN { // Can't find good way to test trapping + EXPECT(opponentLeft->status2 & STATUS2_ESCAPE_PREVENTION); + } +} + +DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Meltdown torments both opponents for 3 turns") +{ + GIVEN { + ASSUME(P_GEN_7_POKEMON == TRUE); + ASSUME(gBattleMoves[MOVE_G_MAX_MELTDOWN].argument == MAX_EFFECT_TORMENT_FOES); + PLAYER(SPECIES_MELMETAL); + PLAYER(SPECIES_MELTAN); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, MOVE_CELEBRATE); } + OPPONENT(SPECIES_WYNAUT) { Moves(MOVE_SPLASH, MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_IRON_HEAD, target: opponentLeft, dynamax: TRUE); \ + MOVE(opponentLeft, MOVE_SPLASH); MOVE(opponentRight, MOVE_SPLASH); } + TURN { MOVE(playerLeft, MOVE_CELEBRATE, target: opponentLeft); \ + MOVE(opponentLeft, MOVE_SPLASH, allowed: FALSE); \ + MOVE(opponentLeft, MOVE_CELEBRATE); \ + MOVE(opponentRight, MOVE_SPLASH, allowed: FALSE); \ + MOVE(opponentRight, MOVE_CELEBRATE); } + TURN { MOVE(playerLeft, MOVE_CELEBRATE, target: opponentLeft); \ + MOVE(opponentLeft, MOVE_SPLASH); \ + MOVE(opponentRight, MOVE_SPLASH); } + } SCENE { + // turn 1 + MESSAGE("Melmetal used G-Max Meltdown!"); + MESSAGE("Foe Wobbuffet was subjected to torment!"); + MESSAGE("Foe Wynaut was subjected to torment!"); + MESSAGE("Foe Wobbuffet used Splash!"); + MESSAGE("Foe Wynaut used Splash!"); + // turn 2 + MESSAGE("Foe Wobbuffet used Celebrate!"); + MESSAGE("Foe Wynaut used Celebrate!"); + // end of turn 3 + MESSAGE("Foe Wobbuffet is tormented no more!"); + MESSAGE("Foe Wynaut is tormented no more!"); + } +} + +// This test applies to G-Max Cannonade, G-Max Vine Lash, and G-Max Volcalith, too. +DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Wildfire sets a field effect that damages non-Fire types") +{ + s16 damage; + GIVEN { + ASSUME(gBattleMoves[MOVE_G_MAX_WILDFIRE].argument == MAX_EFFECT_WILDFIRE); + PLAYER(SPECIES_CHARIZARD); + PLAYER(SPECIES_CHARMANDER); + OPPONENT(SPECIES_WOBBUFFET) { HP(600); MaxHP(600); } + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_ARCANINE); + } WHEN { + TURN { MOVE(playerLeft, MOVE_EMBER, target: opponentLeft, dynamax: TRUE); } + TURN { } + TURN { SWITCH(opponentLeft, 2); } + TURN { } + TURN { } + } SCENE { + // turn 1 + MESSAGE("Charizard used G-Max Wildfire!"); + MESSAGE("The opposing team was surrounded by flames!"); + MESSAGE("Foe Wobbuffet is burning up within G-Max Wildfire's flames!"); + HP_BAR(opponentLeft, captureDamage: &damage); + MESSAGE("Foe Wynaut is burning up within G-Max Wildfire's flames!"); + HP_BAR(opponentRight); + // turn 2 + MESSAGE("Foe Wobbuffet is burning up within G-Max Wildfire's flames!"); + HP_BAR(opponentLeft); + MESSAGE("Foe Wynaut is burning up within G-Max Wildfire's flames!"); + HP_BAR(opponentRight); + // turn 3 + NONE_OF { MESSAGE("Foe Arcanine is burning up within G-Max Wildfire's flames!"); } + MESSAGE("Foe Wynaut is burning up within G-Max Wildfire's flames!"); + HP_BAR(opponentRight); + // turn 4 + MESSAGE("Foe Wynaut is burning up within G-Max Wildfire's flames!"); + HP_BAR(opponentRight); + // turn 5 + NONE_OF { + HP_BAR(opponentRight); + MESSAGE("Foe Wynaut is burning up within G-Max Wildfire's flames!"); + } + } THEN { + EXPECT_EQ(damage, 100); + } +} + +DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Replenish recycles allies' berries 50\% of the time") +{ + PASSES_RANDOMLY(1, 2, RNG_G_MAX_REPLENISH); + GIVEN { + ASSUME(gBattleMoves[MOVE_G_MAX_REPLENISH].argument == MAX_EFFECT_RECYCLE_BERRIES); + PLAYER(SPECIES_SNORLAX) { Item(ITEM_APICOT_BERRY); } + PLAYER(SPECIES_MUNCHLAX) { Item(ITEM_APICOT_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_APICOT_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_APICOT_BERRY); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_STUFF_CHEEKS); \ + MOVE(playerRight, MOVE_STUFF_CHEEKS); \ + MOVE(opponentLeft, MOVE_STUFF_CHEEKS); \ + MOVE(opponentRight, MOVE_STUFF_CHEEKS); } + TURN { MOVE(playerLeft, MOVE_TACKLE, target: opponentLeft, dynamax: TRUE); } + } SCENE { + // turn 1 + MESSAGE("Using Apicot Berry, the Sp. Def of Snorlax rose!"); + MESSAGE("Using Apicot Berry, the Sp. Def of Munchlax rose!"); + MESSAGE("Using Apicot Berry, the Sp. Def of Foe Wobbuffet rose!"); + MESSAGE("Using Apicot Berry, the Sp. Def of Foe Wobbuffet rose!"); + // turn 2 + MESSAGE("Snorlax used G-Max Replenish!"); + MESSAGE("Snorlax found one Apicot Berry!"); + MESSAGE("Munchlax found one Apicot Berry!"); + } +} + +DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Snooze makes only the target drowsy") +{ + PASSES_RANDOMLY(1, 2, RNG_G_MAX_SNOOZE); + GIVEN { + ASSUME(P_GEN_8_POKEMON == TRUE); + ASSUME(gBattleMoves[MOVE_G_MAX_SNOOZE].argument == MAX_EFFECT_YAWN_FOE); + PLAYER(SPECIES_GRIMMSNARL); + PLAYER(SPECIES_IMPIDIMP); + OPPONENT(SPECIES_BLISSEY); + OPPONENT(SPECIES_CHANSEY); + } WHEN { + TURN { MOVE(playerLeft, MOVE_DARK_PULSE, target: opponentLeft, dynamax: TRUE); } + TURN { } + } SCENE { + // turn 1 + MESSAGE("Grimmsnarl used G-Max Snooze!"); + MESSAGE("Grimmsnarl made Foe Blissey drowsy!"); + // turn 2 + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponentLeft); + MESSAGE("Foe Blissey fell asleep!"); + STATUS_ICON(opponentLeft, sleep: TRUE); + } +} + +DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Finale heals allies by 1/6 of their health") +{ + s16 damage1, damage2; + GIVEN { + ASSUME(P_GEN_8_POKEMON == TRUE); + ASSUME(gBattleMoves[MOVE_G_MAX_FINALE].argument == MAX_EFFECT_HEAL_TEAM); + PLAYER(SPECIES_ALCREMIE) { HP(1); } + PLAYER(SPECIES_MILCERY) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_MOONBLAST, target: opponentLeft, dynamax: TRUE); } + } SCENE { + MESSAGE("Alcremie used G-Max Finale!"); + HP_BAR(playerLeft, captureDamage: &damage1); + HP_BAR(playerRight, captureDamage: &damage2); + } THEN { + EXPECT_MUL_EQ(playerLeft->hp - 1, Q_4_12(6), playerLeft->maxHP); // heals based on Dynamax HP + EXPECT_MUL_EQ(playerRight->hp - 1, Q_4_12(6), playerRight->maxHP); + } +} + +DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Sweetness cures allies' status conditions") +{ + GIVEN { + ASSUME(P_GEN_8_POKEMON == TRUE); + ASSUME(gBattleMoves[MOVE_G_MAX_SWEETNESS].argument == MAX_EFFECT_AROMATHERAPY); + PLAYER(SPECIES_APPLETUN) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_APPLIN) { Status1(STATUS1_POISON); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_VINE_WHIP, target: opponentLeft, dynamax: TRUE); } + } SCENE { + MESSAGE("Appletun used G-Max Sweetness!"); + STATUS_ICON(playerLeft, none: TRUE); + MESSAGE("Appletun's status returned to normal!"); + STATUS_ICON(playerRight, none: TRUE); + MESSAGE("Applin's status returned to normal!"); + } +} + +// This test applies to G-Max Sandblast, too. +DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Centiferno traps both opponents in Fire Spin") +{ + GIVEN { + ASSUME(P_GEN_8_POKEMON == TRUE); + ASSUME(gBattleMoves[MOVE_G_MAX_CENTIFERNO].argument == MAX_EFFECT_FIRE_SPIN_FOES); + PLAYER(SPECIES_CENTISKORCH); + PLAYER(SPECIES_SIZZLIPEDE); + PLAYER(SPECIES_SIZZLIPEDE); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerLeft, MOVE_FLAME_CHARGE, target: opponentLeft, dynamax: TRUE); } + TURN { SWITCH(playerLeft, 2); } + } SCENE { + // turn 1 + MESSAGE("Centiskorc used G-Max Centiferno!"); + MESSAGE("Foe Wobbuffet is hurt by Fire Spin!"); + HP_BAR(opponentLeft); + MESSAGE("Foe Wynaut is hurt by Fire Spin!"); + HP_BAR(opponentRight); + // turn 2 - Fire Spin continues even after Centiskorch switches out + MESSAGE("Foe Wobbuffet is hurt by Fire Spin!"); + HP_BAR(opponentLeft); + MESSAGE("Foe Wynaut is hurt by Fire Spin!"); + HP_BAR(opponentRight); + } +} + +DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Chi Strike boosts allies' crit chance") +{ + u32 j; + GIVEN { + ASSUME(B_CRIT_CHANCE >= GEN_6); + ASSUME(gBattleMoves[MOVE_G_MAX_CHI_STRIKE].argument == MAX_EFFECT_CRIT_PLUS); + PLAYER(SPECIES_MACHAMP); + PLAYER(SPECIES_MACHOP); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_FORCE_PALM, target: opponentLeft, dynamax: TRUE); } + TURN { MOVE(playerLeft, MOVE_FORCE_PALM, target: opponentLeft); } + TURN { MOVE(playerLeft, MOVE_FORCE_PALM, target: opponentLeft); \ + MOVE(playerRight, MOVE_FOCUS_ENERGY); } + TURN { MOVE(playerRight, MOVE_TACKLE, target: opponentLeft); } + } SCENE { + // turn 1 - 3 + for (j = 0; j < 3; ++j) { + MESSAGE("Machamp used G-Max Chi Strike!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + MESSAGE("Machamp is getting pumped!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + MESSAGE("Machop is getting pumped!"); + } + // turn 4 + MESSAGE("Machop used Tackle!"); // Machop is at +5 crit stages + MESSAGE("A critical hit!"); + } +} + +DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Depletion takes away 2 PP from the target's last move") +{ + GIVEN { + ASSUME(P_GEN_8_POKEMON == TRUE); + ASSUME(gBattleMoves[MOVE_G_MAX_DEPLETION].argument == MAX_EFFECT_SPITE); + PLAYER(SPECIES_DURALUDON); + PLAYER(SPECIES_WYNAUT); + // Dynamax behaves weird with test turn order because stats are recalculated. + OPPONENT(SPECIES_SABLEYE) { Ability(ABILITY_PRANKSTER); } + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerLeft, MOVE_DRAGON_CLAW, target: opponentLeft, dynamax: TRUE); } + } SCENE { + MESSAGE("Foe Sableye used Celebrate!"); + MESSAGE("Duraludon used G-Max Depletion!"); + MESSAGE("Reduced Foe Sableye's Celebrate by 2!"); + } +} + +// This test applies to G-Max Rapid Flow, too. +DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max One Blow bypasses Max Guard for full damage", s16 damage) +{ + bool32 protect; + PARAMETRIZE { protect = TRUE; } + PARAMETRIZE { protect = FALSE; } + GIVEN { + ASSUME(P_GEN_8_POKEMON == TRUE); + ASSUME(gBattleMoves[MOVE_G_MAX_ONE_BLOW].argument == MAX_EFFECT_BYPASS_PROTECT); + PLAYER(SPECIES_URSHIFU); + PLAYER(SPECIES_KUBFU); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + if (protect) + TURN { MOVE(playerLeft, MOVE_WICKED_BLOW, target: opponentLeft, dynamax: TRUE); \ + MOVE(opponentLeft, MOVE_PROTECT, dynamax: TRUE); } + else + TURN { MOVE(playerLeft, MOVE_WICKED_BLOW, target: opponentLeft, dynamax: TRUE); \ + MOVE(opponentLeft, MOVE_PSYCHIC, target: playerLeft, dynamax: TRUE); } + } SCENE { + if (protect) + MESSAGE("Foe Wobbuffet used Max Guard!"); + MESSAGE("Urshifu used G-Max One Blow!"); + HP_BAR(opponentLeft, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_EQ(results[0].damage, results[1].damage); + } +} + +// Bug Testing +DOUBLE_BATTLE_TEST("(DYNAMAX) Max Flare doesn't softlock the game when fainting player partner") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET) { HP(1); }; + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_PROTECT, dynamax: TRUE); + MOVE(opponentLeft, MOVE_V_CREATE, target: playerRight, dynamax: TRUE); + SEND_OUT(playerRight, 2); } + TURN { } + } +} + +SINGLE_BATTLE_TEST("(DYNAMAX) Max Moves don't execute effects on fainted battlers") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { HP(1); }; + } WHEN { + TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_DYNAMAX_GROWTH, player); + MESSAGE("Wobbuffet used Max Strike!"); + MESSAGE("Foe Wobbuffet fainted!"); + NOT MESSAGE("Foe Wobbuffet's Speed fell!"); + } +} diff --git a/test/test_runner_battle.c b/test/test_runner_battle.c index 8482ff243cf2..fc100ff8a10a 100644 --- a/test/test_runner_battle.c +++ b/test/test_runner_battle.c @@ -1979,6 +1979,9 @@ void MoveGetIdAndSlot(s32 battlerId, struct MoveContext *ctx, u32 *moveId, u32 * if (ctx->explicitUltraBurst && ctx->ultraBurst) *moveSlot |= RET_ULTRA_BURST; + + if (ctx->explicitDynamax && ctx->dynamax) + *moveSlot |= RET_DYNAMAX; } void Move(u32 sourceLine, struct BattlePokemon *battler, struct MoveContext ctx)