diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 0906e0b5c..68eaf9fbc 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -710,8 +710,9 @@ .byte 0x7c .endm - .macro setrain + .macro setfieldweather weather:req .byte 0x7d + .byte \weather .endm .macro setreflect @@ -1351,6 +1352,22 @@ .endm @ callnative macros + .macro savetarget + callnative BS_SaveTarget + .endm + + .macro restoretarget + callnative BS_RestoreTarget + .endm + + .macro saveattacker + callnative BS_SaveAttacker + .endm + + .macro restoreattacker + callnative BS_RestoreAttacker + .endm + .macro metalburstdamagecalculator failInstr:req callnative BS_CalcMetalBurstDmg .4byte \failInstr @@ -1411,10 +1428,6 @@ callnative BS_TryRevertWeatherForm .endm - .macro setsnow - callnative BS_SetSnow - .endm - .macro applysaltcure battler:req callnative BS_ApplySaltCure .byte \battler @@ -1628,6 +1641,10 @@ callnative BS_TryUpdateRecoilTracker .endm + .macro tryupdateleaderscresttracker + callnative BS_TryUpdateLeadersCrestTracker + .endm + .macro trytidyup clear:req, jumpInstr:req callnative BS_TryTidyUp .byte \clear @@ -1637,7 +1654,7 @@ .macro trygulpmissile callnative BS_TryGulpMissile .endm - + .macro tryactivategulpmissile callnative BS_TryActivateGulpMissile .endm @@ -1647,6 +1664,14 @@ .4byte \failInstr .endm + .macro removeweather + callnative BS_RemoveWeather + .endm + + .macro applyterastallization + callnative BS_ApplyTerastallization + .endm + @ various command changed to more readable macros .macro cancelmultiturnmoves battler:req various \battler, VARIOUS_CANCEL_MULTI_TURN_MOVES @@ -1769,14 +1794,6 @@ various \battler, VARIOUS_SWITCHIN_ABILITIES .endm - .macro savetarget - various BS_TARGET, VARIOUS_SAVE_TARGET - .endm - - .macro restoretarget - various BS_TARGET, VARIOUS_RESTORE_TARGET - .endm - .macro instanthpdrop battler:req various \battler, VARIOUS_INSTANT_HP_DROP .endm @@ -2211,10 +2228,6 @@ .4byte \failInstr .endm - .macro shellsidearmcheck - various BS_ATTACKER, VARIOUS_SHELL_SIDE_ARM_CHECK - .endm - .macro jumpifteanoberry jumpInstr:req various BS_ATTACKER, VARIOUS_TEATIME_TARGETS .4byte \jumpInstr @@ -2282,11 +2295,6 @@ various \battler, VARIOUS_ACTIVATE_TERRAIN_CHANGE_ABILITIES .endm - .macro jumpifleafguardprotected battler:req, jumpInstr:req - various \battler, VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED - .4byte \jumpInstr - .endm - @ various remaining from pokefirered .macro getbattlersforrecall various BS_ATTACKER, VARIOUS_GET_BATTLERS_FOR_RECALL @@ -2399,10 +2407,6 @@ manipulatedamage DMG_CURR_ATTACKER_HP .endm - .macro dmg_1_2_attackerhp - manipulatedamage DMG_1_2_ATTACKER_HP - .endm - .macro jumpifflowerveil jumpInstr:req jumpifnottype BS_TARGET, TYPE_GRASS, 1f jumpifability BS_TARGET_SIDE, ABILITY_FLOWER_VEIL, \jumpInstr @@ -2433,6 +2437,11 @@ goto \jumpInstr .endm + .macro jumpifleafguardprotected battler:req, jumpInstr:req + various \battler, VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED + .4byte \jumpInstr + .endm + .macro jumpifsafeguard jumpInstr:req jumpifability BS_ATTACKER, ABILITY_INFILTRATOR, 1f jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, \jumpInstr diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 5c7472207..cf7b46d72 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -141,6 +141,54 @@ BattleScript_SilphScopeUnveiled:: @ pokeemerald +BattleScript_Terastallization:: + @ TODO: no string prints in S/V, but right now this helps with clarity + printstring STRINGID_PKMNSTORINGENERGY + playanimation BS_ATTACKER, B_ANIM_TERA_CHARGE + waitanimation + applyterastallization + playanimation BS_ATTACKER, B_ANIM_TERA_ACTIVATE + waitanimation + printstring STRINGID_PKMNTERASTALLIZEDINTO + waitmessage B_WAIT_TIME_LONG + end3 + +BattleScript_TeraFormChange:: + @ TODO: no string prints in S/V, but right now this helps with clarity + printstring STRINGID_PKMNSTORINGENERGY + handleformchange BS_ATTACKER, 0 + handleformchange BS_ATTACKER, 1 + playanimation BS_ATTACKER, B_ANIM_TERA_CHARGE + waitanimation + applyterastallization + playanimation BS_ATTACKER, B_ANIM_TERA_ACTIVATE + waitanimation + handleformchange BS_ATTACKER, 2 + printstring STRINGID_PKMNTERASTALLIZEDINTO + waitmessage B_WAIT_TIME_LONG + switchinabilities BS_ATTACKER + end3 + +BattleScript_LowerAtkSpAtk:: + jumpifstat BS_EFFECT_BATTLER, CMP_GREATER_THAN, STAT_ATK, MIN_STAT_STAGE, BattleScript_LowerAtkSpAtkDoAnim + jumpifstat BS_EFFECT_BATTLER, CMP_EQUAL, STAT_SPATK, MIN_STAT_STAGE, BattleScript_LowerAtkSpAtkEnd +BattleScript_LowerAtkSpAtkDoAnim:: + setbyte sSTAT_ANIM_PLAYED, FALSE + playstatchangeanimation BS_EFFECT_BATTLER, BIT_ATK | BIT_SPATK, STAT_CHANGE_NEGATIVE + setstatchanger STAT_ATK, 1, TRUE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_LowerAtkSpAtkTrySpAtk + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_LowerAtkSpAtkTrySpAtk + printfromtable gStatDownStringIds + waitmessage B_WAIT_TIME_LONG +BattleScript_LowerAtkSpAtkTrySpAtk:: + setstatchanger STAT_SPATK, 1, TRUE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_LowerAtkSpAtkEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_LowerAtkSpAtkEnd + printfromtable gStatDownStringIds + waitmessage B_WAIT_TIME_LONG +BattleScript_LowerAtkSpAtkEnd: + return + BattleScript_EffectSpicyExtract:: attackcanceler jumpifsubstituteblocks BattleScript_ButItFailed @@ -317,7 +365,7 @@ BattleScript_EffectChillyReception:: jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_RAIN_PRIMAL, BattleScript_EffectChillyReceptionBlockedByPrimalRain jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_STRONG_WINDS, BattleScript_EffectChillyReceptionBlockedByStrongWinds call BattleScript_EffectChillyReceptionPlayAnimation - setsnow + setfieldweather ENUM_WEATHER_SNOW call BattleScript_MoveWeatherChangeRet goto BattleScript_MoveSwitch BattleScript_EffectChillyReceptionPlayAnimation: @@ -703,12 +751,6 @@ BattleScript_EffectShellTrap:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_SteelBeamSelfDamage:: - dmg_1_2_attackerhp - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER - return - BattleScript_EffectCourtChange:: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE @@ -880,10 +922,6 @@ BattleScript_FlingMissed: ppreduce goto BattleScript_MoveMissedPause -BattleScript_EffectShellSideArm:: - shellsidearmcheck - goto BattleScript_EffectHit - BattleScript_EffectPhotonGeyser:: setphotongeysercategory goto BattleScript_EffectHit @@ -1816,6 +1854,8 @@ BattleScript_EffectCopycat:: trycopycat BattleScript_CopycatFail attackanimation waitanimation + setbyte sB_ANIM_TURN, 0 + setbyte sB_ANIM_TARGETS_HIT, 0 jumptocalledmove TRUE BattleScript_CopycatFail: ppreduce @@ -1893,6 +1933,7 @@ BattleScript_EffectHitSwitchTarget:: tryfaintmon BS_TARGET jumpiffainted BS_TARGET, TRUE, BattleScript_MoveEnd jumpifability BS_TARGET, ABILITY_SUCTION_CUPS, BattleScript_AbilityPreventsPhasingOut + jumpifability BS_TARGET, ABILITY_GUARD_DOG, BattleScript_MoveEnd jumpifstatus3 BS_TARGET, STATUS3_ROOTED, BattleScript_PrintMonIsRooted jumpiftargetdynamaxed BattleScript_HitSwitchTargetDynamaxed tryhitswitchtarget BattleScript_MoveEnd @@ -2839,12 +2880,11 @@ BattleScript_EffectHealBlock:: BattleScript_EffectHitEscape:: call BattleScript_EffectHit_Ret jumpifmovehadnoeffect BattleScript_MoveEnd - jumpifability BS_TARGET, ABILITY_GUARD_DOG, BattleScript_MoveEnd tryfaintmon BS_TARGET moveendto MOVEEND_ATTACKER_VISIBLE moveendfrom MOVEEND_TARGET_VISIBLE jumpifbattleend BattleScript_HitEscapeEnd - jumpifbyte CMP_NOT_EQUAL gBattleOutcome 0, BattleScript_HitEscapeEnd + jumpifbyte CMP_NOT_EQUAL, gBattleOutcome, 0, BattleScript_HitEscapeEnd jumpifemergencyexited BS_TARGET, BattleScript_HitEscapeEnd goto BattleScript_MoveSwitch BattleScript_HitEscapeEnd: @@ -3120,13 +3160,6 @@ BattleScript_MaxHp50Recoil:: tryfaintmon BS_ATTACKER return -BattleScript_PreserveMissedBitDoMoveAnim: - bichalfword gMoveResultFlags, MOVE_RESULT_MISSED - attackanimation - waitanimation - orhalfword gMoveResultFlags, MOVE_RESULT_MISSED - return - BattleScript_EffectDreamEater:: attackcanceler jumpifsubstituteblocks BattleScript_DreamEaterNoEffect @@ -3266,6 +3299,7 @@ BattleScript_EffectStatDown: BattleScript_StatDownFromAttackString: attackstring ppreduce +BattleScript_EffectStatDownFromStatBuffChange: statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_StatDownEnd jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_StatDownDoAnim jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_StatDownEnd @@ -3276,6 +3310,7 @@ BattleScript_StatDownDoAnim:: waitanimation setgraphicalstatchangevalues playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + bicword gHitMarker, HITMARKER_DISABLE_ANIMATION BattleScript_StatDownPrintString:: printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG @@ -3308,7 +3343,8 @@ BattleScript_MirrorArmorReflectStickyWeb: call BattleScript_AbilityPopUp setattackertostickywebuser jumpifbyteequal gBattlerAttacker, gBattlerTarget, BattleScript_StickyWebOnSwitchInEnd @ Sticky web user not on field -> no stat loss - goto BattleScript_MirrorArmorReflectStatLoss + call BattleScript_MirrorArmorReflectStatLoss + goto BattleScript_StickyWebOnSwitchInEnd BattleScript_StatDown:: playanimation BS_EFFECT_BATTLER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 @@ -4389,7 +4425,7 @@ BattleScript_EffectSandstorm:: attackstring ppreduce call BattleScript_CheckPrimalWeather - setsandstorm + setfieldweather ENUM_WEATHER_SANDSTORM goto BattleScript_MoveWeatherChange BattleScript_EffectRollout:: @@ -4554,7 +4590,7 @@ BattleScript_EffectRainDance:: attackstring ppreduce call BattleScript_CheckPrimalWeather - setrain + setfieldweather ENUM_WEATHER_RAIN BattleScript_MoveWeatherChange:: attackanimation waitanimation @@ -4572,7 +4608,7 @@ BattleScript_EffectSunnyDay:: attackstring ppreduce call BattleScript_CheckPrimalWeather - setsunny + setfieldweather ENUM_WEATHER_SUN goto BattleScript_MoveWeatherChange BattleScript_ExtremelyHarshSunlightWasNotLessened: @@ -4930,7 +4966,7 @@ BattleScript_EffectHail:: attackstring ppreduce call BattleScript_CheckPrimalWeather - sethail + setfieldweather ENUM_WEATHER_HAIL goto BattleScript_MoveWeatherChange BattleScript_EffectTorment:: @@ -5553,6 +5589,7 @@ BattleScript_FaintAttacker:: BattleScript_FaintTarget:: tryillusionoff BS_TARGET tryactivategulpmissile + tryupdateleaderscresttracker playfaintcry BS_TARGET pause B_WAIT_TIME_LONG dofaintanimation BS_TARGET @@ -5715,7 +5752,7 @@ BattleScript_PrintFullBox:: BattleScript_ActionSwitch:: hpthresholds2 BS_ATTACKER - copybyte sSAVED_BATTLER, gBattlerAttacker + saveattacker printstring STRINGID_RETURNMON jumpifbattletype BATTLE_TYPE_DOUBLE, BattleScript_PursuitSwitchDmgSetMultihit setmultihit 1 @@ -5733,7 +5770,7 @@ BattleScript_DoSwitchOut:: switchoutabilities BS_ATTACKER updatedynamax waitstate - copybyte gBattlerAttacker, sSAVED_BATTLER + restoreattacker returnatktoball waitstate drawpartystatussummary BS_ATTACKER @@ -5881,6 +5918,23 @@ BattleScript_SunlightFaded:: call BattleScript_ActivateWeatherAbilities end2 +BattleScript_FogContinues:: + printstring STRINGID_FOGISDEEP + waitmessage B_WAIT_TIME_LONG + playanimation BS_ATTACKER, B_ANIM_FOG_CONTINUES + call BattleScript_ActivateWeatherAbilities + end2 + +BattleScript_FogEnded_Ret:: + printstring STRINGID_FOGLIFTED + waitmessage B_WAIT_TIME_LONG + call BattleScript_ActivateWeatherAbilities + return + +BattleScript_FogEnded:: + call BattleScript_FogEnded_Ret + end2 + BattleScript_OverworldStatusStarts:: printfromtable gStartingStatusStringIds waitmessage B_WAIT_TIME_LONG @@ -6261,6 +6315,7 @@ BattleScript_ToxicSpikesPoisoned:: BattleScript_StickyWebOnSwitchIn:: savetarget + saveattacker copybyte gBattlerTarget, sBATTLER setbyte sSTICKY_WEB_STAT_DROP, 1 printstring STRINGID_STICKYWEBSWITCHIN @@ -6279,6 +6334,7 @@ BattleScript_StickyWebOnSwitchInPrintStatMsg: waitmessage B_WAIT_TIME_LONG BattleScript_StickyWebOnSwitchInEnd: restoretarget + restoreattacker return BattleScript_PerishSongTakesLife:: @@ -6326,7 +6382,7 @@ BattleScript_GulpMissileNoSecondEffectGorging: BattleScript_GulpMissileGulping:: call BattleScript_AbilityPopUp - playanimation BS_ATTACKER, B_ANIM_GULP_MISSILE + playanimation BS_ATTACKER, B_ANIM_GULP_MISSILE waitanimation orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE effectivenesssound @@ -6727,7 +6783,7 @@ BattleScript_TurnHeal: end2 BattleScript_AquaRingHeal:: - playanimation BS_ATTACKER, B_ANIM_AQUA_RING_HEAL + playanimation BS_ATTACKER, B_ANIM_AQUA_RING_HEAL printstring STRINGID_AQUARINGHEAL goto BattleScript_TurnHeal @@ -6872,17 +6928,6 @@ BattleScript_OneHitKOMsg:: waitmessage B_WAIT_TIME_LONG return -BattleScript_SAtkDown2:: - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_SPATK, STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_NEGATIVE | STAT_CHANGE_BY_TWO - setstatchanger STAT_SPATK, 2, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | STAT_CHANGE_ALLOW_PTR, BattleScript_SAtkDown2End - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_SAtkDown2End - printfromtable gStatDownStringIds - waitmessage B_WAIT_TIME_LONG -BattleScript_SAtkDown2End:: - return - BattleScript_MoveEffectClearSmog:: printstring STRINGID_RESETSTARGETSSTATLEVELS waitmessage B_WAIT_TIME_LONG @@ -6979,6 +7024,29 @@ BattleScript_AttackerFormChangeEnd3NoPopup:: call BattleScript_AttackerFormChangeNoPopup end3 +BattleScript_AttackerFormChangeWithString:: + pause 5 + copybyte gBattlerAbility, gBattlerAttacker + call BattleScript_AbilityPopUp + flushtextbox +BattleScript_AttackerFormChangeWithStringNoPopup:: + handleformchange BS_ATTACKER, 0 + handleformchange BS_ATTACKER, 1 + playanimation BS_ATTACKER, B_ANIM_FORM_CHANGE + waitanimation + handleformchange BS_ATTACKER, 2 + printstring STRINGID_PKMNTRANSFORMED + waitmessage B_WAIT_TIME_LONG + return + +BattleScript_AttackerFormChangeWithStringEnd3:: + call BattleScript_AttackerFormChangeWithString + end3 + +BattleScript_AttackerFormChangeWithStringEnd3NoPopup:: + call BattleScript_AttackerFormChangeWithStringNoPopup + end3 + BattleScript_AttackerFormChangeMoveEffect:: waitmessage 1 handleformchange BS_ATTACKER, 0 @@ -7731,7 +7799,7 @@ BattleScript_TryIntimidateHoldEffectsRet: return BattleScript_IntimidateActivates:: - copybyte sSAVED_BATTLER, gBattlerTarget + savetarget .if B_ABILITY_POP_UP == TRUE showabilitypopup BS_ATTACKER pause B_WAIT_TIME_LONG @@ -7769,7 +7837,7 @@ BattleScript_IntimidateLoopIncrement: BattleScript_IntimidateEnd: copybyte sBATTLER, gBattlerAttacker destroyabilitypopup - copybyte gBattlerTarget, sSAVED_BATTLER + restoretarget pause B_WAIT_TIME_MED end3 @@ -7802,7 +7870,7 @@ BattleScript_IntimidateInReverse: goto BattleScript_IntimidateLoopIncrement BattleScript_SupersweetSyrupActivates:: - copybyte sSAVED_BATTLER, gBattlerTarget + savetarget .if B_ABILITY_POP_UP == TRUE showabilitypopup BS_ATTACKER pause B_WAIT_TIME_LONG @@ -7835,7 +7903,7 @@ BattleScript_SupersweetSyrupLoopIncrement: BattleScript_SupersweetSyrupEnd: copybyte sBATTLER, gBattlerAttacker destroyabilitypopup - copybyte gBattlerTarget, sSAVED_BATTLER + restoretarget pause B_WAIT_TIME_MED end3 @@ -8147,7 +8215,6 @@ BattleScript_FlashFireBoost:: call BattleScript_AbilityPopUp printfromtable gFlashFireStringIds waitmessage B_WAIT_TIME_LONG - tryfaintmon BS_ATTACKER goto BattleScript_MoveEnd BattleScript_AbilityPreventsPhasingOut:: @@ -8287,6 +8354,13 @@ BattleScript_ProteanActivates:: waitmessage B_WAIT_TIME_LONG return +BattleScript_TeraShellDistortingTypeMatchups:: + pause B_WAIT_TIME_SHORTEST + call BattleScript_AbilityPopUp + printstring STRINGID_PKMNMADESHELLGLEAM + waitmessage B_WAIT_TIME_LONG + return + BattleScript_CursedBodyActivates:: call BattleScript_AbilityPopUp printstring STRINGID_CUSEDBODYDISABLED @@ -8353,7 +8427,7 @@ BattleScript_ScriptingAbilityStatRaise:: call BattleScript_AbilityPopUp copybyte sSAVED_DMG, gBattlerAttacker copybyte gBattlerAttacker, sBATTLER - statbuffchange STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, NULL + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, NULL setgraphicalstatchangevalues playanimation BS_SCRIPTING, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 waitanimation @@ -8471,7 +8545,10 @@ BattleScript_FriskMsg:: return BattleScript_FriskActivates:: - tryfriskmsg BS_ATTACKER + saveattacker + copybyte gBattlerAttacker, sBATTLER + tryfriskmsg BS_SCRIPTING + restoreattacker end3 BattleScript_ImposterActivates:: @@ -8624,6 +8701,11 @@ BattleScript_IgnoresAndUsesRandomMove:: BattleScript_MoveUsedLoafingAround:: jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_LOAFING, BattleScript_MoveUsedLoafingAroundMsg + @ Skip ahead if not the Battle Palace message + jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_INCAPABLE_OF_POWER, BattleScript_MoveUsedLoafingAroundMsg + setbyte gBattleCommunication, 0 + palacetryescapestatus BS_ATTACKER + setbyte cMULTISTRING_CHOOSER, B_MSG_INCAPABLE_OF_POWER BattleScript_MoveUsedLoafingAroundMsg:: printfromtable gInobedientStringIds waitmessage B_WAIT_TIME_LONG @@ -9074,6 +9156,25 @@ BattleScript_AnnounceAirLockCloudNine:: call BattleScript_ActivateWeatherAbilities end3 +BattleScript_ActivateTeraformZero:: + call BattleScript_AbilityPopUp + waitmessage B_WAIT_TIME_LONG + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_ANY, BattleScript_ActivateTeraformZero_RemoveWeather + jumpifhalfword CMP_COMMON_BITS, gFieldStatuses, STATUS_FIELD_TERRAIN_ANY, BattleScript_ActivateTeraformZero_RemoveTerrain + goto BattleScript_ActivateTeraformZero_End +BattleScript_ActivateTeraformZero_RemoveWeather: + removeweather + printfromtable gWeatherEndsStringIds + waitmessage B_WAIT_TIME_LONG + jumpifhalfword CMP_NO_COMMON_BITS, gFieldStatuses, STATUS_FIELD_TERRAIN_ANY, BattleScript_ActivateTeraformZero_End +BattleScript_ActivateTeraformZero_RemoveTerrain: + removeterrain + playanimation BS_ATTACKER, B_ANIM_RESTORE_BG + printfromtable gTerrainStringIds + waitmessage B_WAIT_TIME_LONG +BattleScript_ActivateTeraformZero_End: + end3 + BattleScript_QuickClawActivation:: flushtextbox playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT @@ -9327,19 +9428,19 @@ BattleScript_RedCardIngrain: printstring STRINGID_PKMNANCHOREDITSELF waitmessage B_WAIT_TIME_LONG removeitem BS_SCRIPTING - swapattackerwithtarget + restoretarget return BattleScript_RedCardSuctionCups: printstring STRINGID_PKMNANCHORSITSELFWITH waitmessage B_WAIT_TIME_LONG removeitem BS_SCRIPTING - swapattackerwithtarget + restoretarget return BattleScript_RedCardDynamaxed: printstring STRINGID_MOVEBLOCKEDBYDYNAMAX waitmessage B_WAIT_TIME_LONG removeitem BS_SCRIPTING - swapattackerwithtarget + restoretarget return BattleScript_EjectButtonActivates:: @@ -9804,10 +9905,20 @@ BattleScript_BerserkGeneRet_End: removeitem BS_SCRIPTING end3 +BattleScript_BoosterEnergyEnd2:: + playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT, sB_ANIM_ARG1 + call BattleScript_AbilityPopUp + printstring STRINGID_BOOSTERENERGYACTIVATES + waitmessage B_WAIT_TIME_MED + printstring STRINGID_STATWASHEIGHTENED + waitmessage B_WAIT_TIME_MED + removeitem BS_SCRIPTING + end2 + BattleScript_EffectSnow:: attackcanceler attackstring ppreduce call BattleScript_CheckPrimalWeather - setsnow + setfieldweather ENUM_WEATHER_SNOW goto BattleScript_MoveWeatherChange diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 1d8407719..7f47727ef 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -1330,8 +1330,14 @@ #define STRINGID_TRAINER1MON1COMEBACK 731 #define STRINGID_TRAINER1MON2COMEBACK 732 #define STRINGID_TRAINER1MON1AND2COMEBACK 733 +#define STRINGID_PKMNTERASTALLIZEDINTO 734 +#define STRINGID_BOOSTERENERGYACTIVATES 735 +#define STRINGID_FOGCREPTUP 736 +#define STRINGID_FOGISDEEP 737 +#define STRINGID_FOGLIFTED 738 +#define STRINGID_PKMNMADESHELLGLEAM 739 -#define BATTLESTRINGS_COUNT 734 +#define BATTLESTRINGS_COUNT 740 // This is the string id that gBattleStringsTable starts with. // String ids before this (e.g. STRINGID_INTROMSG) are not in the table, @@ -1393,6 +1399,17 @@ #define B_MSG_STARTED_SUNLIGHT 4 #define B_MSG_STARTED_HAIL 5 #define B_MSG_STARTED_SNOW 6 +#define B_MSG_STARTED_FOG 7 + +// gWeatherEndsStringIds +#define B_MSG_WEATHER_END_RAIN 0 +#define B_MSG_WEATHER_END_SANDSTORM 1 +#define B_MSG_WEATHER_END_SUN 2 +#define B_MSG_WEATHER_END_HAIL 3 +#define B_MSG_WEATHER_END_STRONG_WINDS 4 +#define B_MSG_WEATHER_END_SNOW 5 +#define B_MSG_WEATHER_END_FOG 6 +#define B_MSG_WEATHER_END_COUNT 7 // gRainContinuesStringIds #define B_MSG_RAIN_CONTINUES 0 @@ -1498,7 +1515,10 @@ #define B_MSG_WONT_OBEY 1 #define B_MSG_TURNED_AWAY 2 #define B_MSG_PRETEND_NOT_NOTICE 3 -#define NUM_LOAF_STRINGS 4 // For randomly selecting a disobey string +#define B_MSG_INCAPABLE_OF_POWER 4 +// For randomly selecting a disobey string +// Skips the one used for Battle Palace +#define NUM_LOAF_STRINGS 4 // gSafariGetNearStringIds #define B_MSG_CREPT_CLOSER 0 diff --git a/src/battle_message.c b/src/battle_message.c index b7b6179b1..874acc449 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -353,6 +353,9 @@ static const u8 sText_HailStopped[] = _("The hail stopped."); static const u8 sText_StartedSnow[] = _("It started to snow!"); static const u8 sText_SnowContinues[] = _("Snow continues to fall."); static const u8 sText_SnowStopped[] = _("The snow stopped."); +static const u8 sText_FogCreptUp[] = _("Fog crept up as thick as soup!"); +static const u8 sText_FogIsDeep[] = _("The fog is deep…"); +static const u8 sText_FogLifted[] = _("The fog lifted."); static const u8 sText_FailedToSpitUp[] = _("But it failed to spit up\na thing!"); static const u8 sText_FailedToSwallow[] = _("But it failed to swallow\na thing!"); static const u8 sText_WindBecameHeatWave[] = _("The wind turned into a\nHEAT WAVE!"); @@ -668,6 +671,7 @@ static const u8 sText_ASandstormKickedUp[] = _("A sandstorm kicked up!"); static const u8 sText_PkmnsWillPerishIn3Turns[] = _("Both Pokémon will perish\nin three turns!"); static const u8 sText_AbilityRaisedStatDrastically[] = _("{B_DEF_ABILITY} raised {B_DEF_NAME_WITH_PREFIX}'s\n{B_BUFF1} drastically!"); static const u8 sText_AsOneEnters[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} has two Abilities!"); +static const u8 sText_PkmnMadeShellGleam[] = _("{B_DEF_NAME_WITH_PREFIX} made its shell gleam!\nIt's distorting type matchups!"); static const u8 sText_CuriousMedicineEnters[] = _("{B_EFF_NAME_WITH_PREFIX}'s\nstat changes were reset!"); static const u8 sText_CanActFaster[] = _("{B_ATK_NAME_WITH_PREFIX} can act faster,\nthanks to {B_BUFF1}!"); static const u8 sText_MicleBerryActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} boosted the accuracy of its\nnext move using {B_LAST_ITEM}!"); @@ -738,6 +742,7 @@ static const u8 sText_AttackerSwitchedStatWithTarget[] = _("{B_ATK_NAME_WITH_PRE static const u8 sText_BeingHitChargedPkmnWithPower[] = _("Being hit by {B_CURRENT_MOVE}\ncharged {B_DEF_NAME_WITH_PREFIX} with power!"); static const u8 sText_SunlightActivatedAbility[] = _("The harsh sunlight activated\n{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ABILITY}!"); static const u8 sText_StatWasHeightened[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_BUFF1} was heightened!"); +static const u8 sText_BoosterEnergyActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} used its Booster Energy\nto activate {B_SCR_ACTIVE_ABILITY}!"); static const u8 sText_ElectricTerrainActivatedAbility[] = _("The Electric Terrain activated\n{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ABILITY}!"); static const u8 sText_AbilityWeakenedSurroundingMonsStat[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\nweakened the {B_BUFF1} of\lall surrounding Pokémon!\p"); static const u8 sText_AttackerGainedStrengthFromTheFallen[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} gained strength\nfrom the fallen!"); @@ -962,6 +967,7 @@ const u8 gText_Unused_5F[] = _("5F"); const u8 gText_Unused_6F[] = _("6F"); const u8 gText_Unused_7F[] = _("7F"); const u8 gText_Unused_8F[] = _("8F"); +static const u8 sText_PkmnTerastallizedInto[] = _("{B_ATK_NAME_WITH_PREFIX} terastallized\ninto the {B_BUFF1} type!"); const u8 gText_TODO[] = _("TODO"); @@ -987,6 +993,7 @@ const u8 *const gPokeblockWasTooXStringTable[] = { }; const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT - BATTLESTRINGS_TABLE_START] = { + [STRINGID_PKMNTERASTALLIZEDINTO - BATTLESTRINGS_TABLE_START] = sText_PkmnTerastallizedInto, [STRINGID_TIDYINGUPCOMPLETE - BATTLESTRINGS_TABLE_START] = sText_TidyingUpComplete, [STRINGID_SUPERSWEETAROMAWAFTS - BATTLESTRINGS_TABLE_START] = sText_SupersweetAromaWafts, [STRINGID_SHEDITSTAIL - BATTLESTRINGS_TABLE_START] = sText_ShedItsTail, @@ -1032,6 +1039,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT - BATTLESTRINGS_TABLE_ST [STRINGID_ABILITYWEAKENEDSURROUNDINGMONSSTAT - BATTLESTRINGS_TABLE_START] = sText_AbilityWeakenedSurroundingMonsStat, [STRINGID_ELECTRICTERRAINACTIVATEDABILITY - BATTLESTRINGS_TABLE_START] = sText_ElectricTerrainActivatedAbility, [STRINGID_STATWASHEIGHTENED - BATTLESTRINGS_TABLE_START] = sText_StatWasHeightened, + [STRINGID_BOOSTERENERGYACTIVATES - BATTLESTRINGS_TABLE_START] = sText_BoosterEnergyActivates, [STRINGID_SUNLIGHTACTIVATEDABILITY - BATTLESTRINGS_TABLE_START] = sText_SunlightActivatedAbility, [STRINGID_BEINGHITCHARGEDPKMNWITHPOWER - BATTLESTRINGS_TABLE_START] = sText_BeingHitChargedPkmnWithPower, [STRINGID_ATTACKERSWITCHEDSTATWITHTARGET - BATTLESTRINGS_TABLE_START] = sText_AttackerSwitchedStatWithTarget, @@ -1097,6 +1105,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT - BATTLESTRINGS_TABLE_ST [STRINGID_CANACTFASTERTHANKSTO - BATTLESTRINGS_TABLE_START] = sText_CanActFaster, [STRINGID_CURIOUSMEDICINEENTERS - BATTLESTRINGS_TABLE_START] = sText_CuriousMedicineEnters, [STRINGID_ASONEENTERS - BATTLESTRINGS_TABLE_START] = sText_AsOneEnters, + [STRINGID_PKMNMADESHELLGLEAM - BATTLESTRINGS_TABLE_START] = sText_PkmnMadeShellGleam, [STRINGID_ABILITYRAISEDSTATDRASTICALLY - BATTLESTRINGS_TABLE_START] = sText_AbilityRaisedStatDrastically, [STRINGID_PKMNSWILLPERISHIN3TURNS - BATTLESTRINGS_TABLE_START] = sText_PkmnsWillPerishIn3Turns, [STRINGID_ASANDSTORMKICKEDUP - BATTLESTRINGS_TABLE_START] = sText_ASandstormKickedUp, @@ -1368,6 +1377,9 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT - BATTLESTRINGS_TABLE_ST [STRINGID_STARTEDSNOW - BATTLESTRINGS_TABLE_START] = sText_StartedSnow, [STRINGID_SNOWCONTINUES -BATTLESTRINGS_TABLE_START] = sText_SnowContinues, [STRINGID_SNOWSTOPPED - BATTLESTRINGS_TABLE_START] = sText_SnowStopped, + [STRINGID_FOGCREPTUP - BATTLESTRINGS_TABLE_START] = sText_FogCreptUp, + [STRINGID_FOGISDEEP - BATTLESTRINGS_TABLE_START] = sText_FogIsDeep, + [STRINGID_FOGLIFTED - BATTLESTRINGS_TABLE_START] = sText_FogLifted, [STRINGID_FAILEDTOSPITUP - BATTLESTRINGS_TABLE_START] = sText_FailedToSpitUp, [STRINGID_FAILEDTOSWALLOW - BATTLESTRINGS_TABLE_START] = sText_FailedToSwallow, [STRINGID_WINDBECAMEHEATWAVE - BATTLESTRINGS_TABLE_START] = sText_WindBecameHeatWave, @@ -1835,6 +1847,18 @@ const u16 gMoveWeatherChangeStringIds[] = [B_MSG_STARTED_SUNLIGHT] = STRINGID_SUNLIGHTGOTBRIGHT, [B_MSG_STARTED_HAIL] = STRINGID_STARTEDHAIL, [B_MSG_STARTED_SNOW] = STRINGID_STARTEDSNOW, + [B_MSG_STARTED_FOG] = STRINGID_FOGCREPTUP, // Unused, can use for custom moves that set fog +}; + +const u16 gWeatherEndsStringIds[B_MSG_WEATHER_END_COUNT] = +{ + [B_MSG_WEATHER_END_RAIN] = STRINGID_RAINSTOPPED, + [B_MSG_WEATHER_END_SANDSTORM] = STRINGID_SANDSTORMSUBSIDED, + [B_MSG_WEATHER_END_SUN] = STRINGID_SUNLIGHTFADED, + [B_MSG_WEATHER_END_HAIL] = STRINGID_HAILSTOPPED, + [B_MSG_WEATHER_END_STRONG_WINDS] = STRINGID_STRONGWINDSDISSIPATED, + [B_MSG_WEATHER_END_SNOW] = STRINGID_SNOWSTOPPED, + [B_MSG_WEATHER_END_FOG] = STRINGID_FOGLIFTED, }; const u16 gSandStormHailSnowContinuesStringIds[] = @@ -2099,12 +2123,12 @@ const u16 gWeatherStartsStringIds[] = [WEATHER_SUNNY_CLOUDS] = STRINGID_ITISRAINING, [WEATHER_SUNNY] = STRINGID_ITISRAINING, [WEATHER_RAIN] = STRINGID_ITISRAINING, - [WEATHER_SNOW] = STRINGID_ITISRAINING, + [WEATHER_SNOW] = (B_OVERWORLD_SNOW >= GEN_9 ? STRINGID_STARTEDSNOW : STRINGID_STARTEDHAIL), [WEATHER_RAIN_THUNDERSTORM] = STRINGID_ITISRAINING, - [WEATHER_FOG_HORIZONTAL] = STRINGID_ITISRAINING, + [WEATHER_FOG_HORIZONTAL] = STRINGID_FOGISDEEP, [WEATHER_VOLCANIC_ASH] = STRINGID_ITISRAINING, [WEATHER_SANDSTORM] = STRINGID_SANDSTORMISRAGING, - [WEATHER_FOG_DIAGONAL] = STRINGID_ITISRAINING, + [WEATHER_FOG_DIAGONAL] = STRINGID_FOGISDEEP, [WEATHER_UNDERWATER] = STRINGID_ITISRAINING, [WEATHER_SHADE] = STRINGID_ITISRAINING, [WEATHER_DROUGHT] = STRINGID_SUNLIGHTSTRONG, @@ -2124,7 +2148,8 @@ const u16 gInobedientStringIds[] = [B_MSG_LOAFING] = STRINGID_PKMNLOAFING, [B_MSG_WONT_OBEY] = STRINGID_PKMNWONTOBEY, [B_MSG_TURNED_AWAY] = STRINGID_PKMNTURNEDAWAY, - [B_MSG_PRETEND_NOT_NOTICE] = STRINGID_PKMNPRETENDNOTNOTICE + [B_MSG_PRETEND_NOT_NOTICE] = STRINGID_PKMNPRETENDNOTNOTICE, + [B_MSG_INCAPABLE_OF_POWER] = STRINGID_PKMNINCAPABLEOFPOWER }; const u16 gSafariReactionStringIds[NUM_SAFARI_REACTIONS] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index e02ed9fd4..83a80d046 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -340,6 +340,8 @@ static bool8 IsFinalStrikeEffect(u16 move); static void TryUpdateRoundTurnOrder(void); static void BestowItem(u32 battlerAtk, u32 battlerDef); static void ApplyExperienceMultipliers(s32 *expAmount, u8 expGetterMonId, u8 faintedBattler); +static void RemoveAllWeather(void); +static void RemoveAllTerrains(void); static bool8 CanBurnHitThaw(u16 move); static bool32 ChangeOrderTargetAfterAttacker(void); static void TryUpdateEvolutionTracker(u32 evolutionMethod, u32 upAmount, u16 usedMove); @@ -473,7 +475,7 @@ static void Cmd_setatkhptozero(void); static void Cmd_jumpifnexttargetvalid(void); static void Cmd_tryhealhalfhealth(void); static void Cmd_trymirrormove(void); -static void Cmd_setrain(void); +static void Cmd_setfieldweather(void); static void Cmd_setreflect(void); static void Cmd_setseeded(void); static void Cmd_manipulatedamage(void); @@ -732,7 +734,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = Cmd_jumpifnexttargetvalid, //0x7A // done Cmd_tryhealhalfhealth, //0x7B // done Cmd_trymirrormove, //0x7C // done - Cmd_setrain, //0x7D // done + Cmd_setfieldweather, //0x7D // done Cmd_setreflect, //0x7E // done Cmd_setseeded, //0x7F // done Cmd_manipulatedamage, //0x80 // done @@ -8466,6 +8468,30 @@ bool32 CanUseLastResort(u8 battler) return (knownMovesCount >= 2 && usedMovesCount >= knownMovesCount - 1); } +static void RemoveAllWeather(void) +{ + gWishFutureKnock.weatherDuration = 0; + + if (gBattleWeather & B_WEATHER_RAIN) + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEATHER_END_RAIN; + else if(gBattleWeather & B_WEATHER_SANDSTORM) + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEATHER_END_SANDSTORM; + else if(gBattleWeather & B_WEATHER_SUN) + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEATHER_END_SUN; + else if(gBattleWeather & B_WEATHER_HAIL) + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEATHER_END_HAIL; + else if(gBattleWeather & B_WEATHER_STRONG_WINDS) + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEATHER_END_STRONG_WINDS; + else if(gBattleWeather & B_WEATHER_SNOW) + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEATHER_END_SNOW; + else if(gBattleWeather & B_WEATHER_FOG) + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEATHER_END_FOG; + else + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEATHER_END_COUNT; // failsafe + + gBattleWeather = 0; // remove the weather +} + static void RemoveAllTerrains(void) { gFieldTimers.terrainTimer = 0; @@ -11072,19 +11098,39 @@ static void Cmd_trymirrormove(void) } } -static void Cmd_setrain(void) +static void Cmd_setfieldweather(void) { - CMD_ARGS(); + CMD_ARGS(u8 weather); - if (!TryChangeBattleWeather(gBattlerAttacker, ENUM_WEATHER_RAIN, FALSE)) + u8 weather = cmd->weather; + + if (!TryChangeBattleWeather(gBattlerAttacker, weather, FALSE)) { gMoveResultFlags |= MOVE_RESULT_MISSED; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEATHER_FAILED; + gBattlescriptCurrInstr = cmd->nextInstr; + return; } - else + + switch (weather) { + case ENUM_WEATHER_RAIN: gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_RAIN; + break; + case ENUM_WEATHER_SUN: + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_SUNLIGHT; + break; + case ENUM_WEATHER_SANDSTORM: + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_SANDSTORM; + break; + case ENUM_WEATHER_HAIL: + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_HAIL; + break; + case ENUM_WEATHER_SNOW: + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_SNOW; + break; } + gBattlescriptCurrInstr = cmd->nextInstr; } @@ -16916,6 +16962,13 @@ void BS_TryUpdateRecoilTracker(void) gBattlescriptCurrInstr = cmd->nextInstr; } +void BS_TryUpdateLeadersCrestTracker(void) +{ + NATIVE_ARGS(); + TryUpdateEvolutionTracker(EVO_DEFEAT_WITH_ITEM, 1, MOVE_NONE); + gBattlescriptCurrInstr = cmd->nextInstr; +} + void BS_TryTidyUp(void) { NATIVE_ARGS(u8 clear, const u8 *jumpInstr); @@ -17016,3 +17069,18 @@ void BS_TryQuash(void) gBattlescriptCurrInstr = cmd->nextInstr; } +void BS_RemoveWeather(void) +{ + NATIVE_ARGS(); + RemoveAllWeather(); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_ApplyTerastallization(void) +{ + NATIVE_ARGS(); + // TODO: Tera + // ApplyBattlerVisualsForTeraAnim(gBattlerAttacker); + gBattlescriptCurrInstr = cmd->nextInstr; +} +