diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 52b97fa7cf..c5e336a3af 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -178,11 +178,11 @@ .byte \case .4byte \ptr .endm - + .macro jumpiftype battler:req, type:req, ptr:req jumpbasedontype \battler, \type, 1, \ptr .endm - + .macro jumpifnottype battler:req, type:req, ptr:req jumpbasedontype \battler, \type, 0, \ptr .endm @@ -409,33 +409,33 @@ .byte \param0 .byte \param1 .endm - + @ Help macros for 5 uses of moveend command - + @ All cases .macro moveendall setbyte sMOVEEND_STATE, 0 moveend 0, 0 .endm - + @ Chosen case .macro moveendcase case:req setbyte sMOVEEND_STATE, \case moveend 1, 0 .endm - + @ All cases from (inclusive) .macro moveendfrom from:req setbyte sMOVEEND_STATE, \from moveend 0, 0 .endm - + @ All cases from 0 to (not inclusive) .macro moveendto to:req setbyte sMOVEEND_STATE, 0 moveend 2, \to .endm - + @ Cases from (inclusive) to (not inclusive) .macro moveendfromto from:req, to:req setbyte sMOVEEND_STATE, \from @@ -1262,407 +1262,407 @@ .byte 0xf8 .byte \param0 .endm - + .macro settelekinesis ptr:req .byte 0xf9 .4byte \ptr .endm - + .macro swapstatstages stat:req .byte 0xfa .byte \stat .endm - + .macro averagestats stat:req .byte 0xfb .byte \stat .endm - + .macro jumpifoppositegenders ptr:req .byte 0xfc .4byte \ptr .endm - + .macro trygetbaddreamstarget ptr:req .byte 0xfd .4byte \ptr .endm - + .macro tryworryseed ptr:req .byte 0xfe .4byte \ptr .endm - + .macro metalburstdamagecalculator ptr:req .byte 0xff .4byte \ptr .endm - + @ various command changed to more readable macros .macro cancelmultiturnmoves battler:req various \battler, VARIOUS_CANCEL_MULTI_TURN_MOVES .endm - + .macro setmagiccoattarget battler:req various \battler, VARIOUS_SET_MAGIC_COAT_TARGET .endm - + .macro getifcantrunfrombattle battler:req various \battler, VARIOUS_IS_RUNNING_IMPOSSIBLE .endm - + .macro getmovetarget battler:req various \battler, VARIOUS_GET_MOVE_TARGET .endm - + .macro getbattlerfainted battler:req various \battler, VARIOUS_GET_BATTLER_FAINTED .endm - + .macro resetintimidatetracebits battler:req various \battler, VARIOUS_RESET_INTIMIDATE_TRACE_BITS .endm - + .macro updatechoicemoveonlvlup battler:req various \battler, VARIOUS_UPDATE_CHOICE_MOVE_ON_LVL_UP .endm - + .macro various7 battler:req various \battler, 7 .endm - + .macro palaceflavortext battler:req various \battler, VARIOUS_PALACE_FLAVOR_TEXT .endm - + .macro arenajudgmentwindow various BS_ATTACKER, VARIOUS_ARENA_JUDGMENT_WINDOW .endm - + .macro arenaopponentmonlost various BS_ATTACKER, VARIOUS_ARENA_OPPONENT_MON_LOST .endm - + .macro arenaplayermonlost various BS_ATTACKER, VARIOUS_ARENA_PLAYER_MON_LOST .endm - + .macro arenabothmonlost various BS_ATTACKER, VARIOUS_ARENA_BOTH_MONS_LOST .endm - + .macro forfeityesnobox battler:req various \battler, VARIOUS_EMIT_YESNOBOX .endm - + .macro various14 battler:req various \battler, 14 .endm - + .macro various15 battler:req various \battler, 15 .endm - + .macro arenajudmengtstring id:req various \id, VARIOUS_ARENA_JUDGMENT_STRING .endm - + .macro arenawaitmessage id:req various \id, VARIOUS_ARENA_WAIT_STRING .endm - + .macro waitcry battler:req various \battler, VARIOUS_WAIT_CRY .endm - + .macro returnopponentmon1toball battler:req various \battler, VARIOUS_RETURN_OPPONENT_MON1 .endm - + .macro returnopponentmon2toball battler:req various \battler, VARIOUS_RETURN_OPPONENT_MON2 .endm - + .macro volumedown various BS_ATTACKER, VARIOUS_VOLUME_DOWN .endm - + .macro volumeup various BS_ATTACKER, VARIOUS_VOLUME_UP .endm - + .macro setalreadystatusedmoveattempt battler:req various \battler, 23 .endm - + .macro various24 battler:req various \battler, 24 .endm - + .macro setoutcomeonteleport battler:req various \battler, VARIOUS_SET_TELEPORT_OUTCOME .endm - + .macro playtrainerdefeatbgm battler:req various \battler, VARIOUS_PLAY_TRAINER_DEFEATED_MUSIC .endm - + .macro stattextbuffer battler:req various \battler, VARIOUS_STAT_TEXT_BUFFER .endm - + .macro switchinabilities battler:req 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 - + .macro clearstatus battler:req various \battler, VARIOUS_CLEAR_STATUS .endm - + .macro restorepp battler:req various \battler, VARIOUS_RESTORE_PP .endm - + .macro tryactivatemoxie battler:req various \battler, VARIOUS_TRY_ACTIVATE_MOXIE .endm - + .macro tryactivatebeastboost battler:req various \battler, VARIOUS_TRY_ACTIVATE_BEAST_BOOST .endm - + .macro tryactivatereceiver battler:req various \battler, VARIOUS_TRY_ACTIVATE_RECEIVER .endm - + .macro tryactivatesoulheart various BS_ATTACKER, VARIOUS_TRY_ACTIVATE_SOULHEART .endm - + .macro tryactivatefellstinger battler:req various \battler, VARIOUS_TRY_ACTIVATE_FELL_STINGER .endm - + .macro playmoveanimation battler:req, move:req various \battler, VARIOUS_PLAY_MOVE_ANIMATION .2byte \move .endm - + .macro setluckychant battler:req, ptr:req various \battler VARIOUS_SET_LUCKY_CHANT .4byte \ptr .endm - + .macro suckerpunchcheck ptr:req various BS_ATTACKER, VARIOUS_SUCKER_PUNCH_CHECK .4byte \ptr .endm - + .macro setabilitysimple battler:req, ptr:req various \battler VARIOUS_SET_SIMPLE_BEAM .4byte \ptr .endm - + .macro tryentrainment ptr:req various BS_ATTACKER, VARIOUS_TRY_ENTRAINMENT .4byte \ptr .endm - + .macro setlastusedability battler:req various \battler, VARIOUS_SET_LAST_USED_ABILITY .endm - + .macro tryhealpulse battler:req, ptr:req various \battler, VARIOUS_TRY_HEAL_PULSE .4byte \ptr .endm - + .macro tryquash ptr:req various BS_ATTACKER, VARIOUS_TRY_QUASH .4byte \ptr .endm - + .macro tryafteryou ptr:req various BS_ATTACKER, VARIOUS_AFTER_YOU .4byte \ptr .endm - + .macro trybestow ptr:req various BS_ATTACKER, VARIOUS_BESTOW .4byte \ptr .endm - + .macro invertstatstages battler:req various \battler, VARIOUS_INVERT_STAT_STAGES .endm - + .macro setterrain ptr:req various BS_ATTACKER, VARIOUS_SET_TERRAIN .4byte \ptr .endm - + .macro trymefirst ptr:req various BS_ATTACKER, VARIOUS_TRY_ME_FIRST .4byte \ptr .endm - + .macro jumpifbattleend ptr:req various BS_ATTACKER, VARIOUS_JUMP_IF_BATTLE_END .4byte \ptr .endm - + .macro tryelectrify ptr:req various BS_ATTACKER, VARIOUS_TRY_ELECTRIFY .4byte \ptr .endm - + .macro tryreflecttype ptr:req various BS_ATTACKER, VARIOUS_TRY_REFLECT_TYPE .4byte \ptr .endm - + .macro trysoak ptr:req various BS_ATTACKER, VARIOUS_TRY_SOAK .4byte \ptr .endm - + .macro handlemegaevo battler:req, case:req various \battler, VARIOUS_HANDLE_MEGA_EVO .byte \case .endm - + .macro handleformchange battler:req, case:req various \battler, VARIOUS_HANDLE_FORM_CHANGE .byte \case .endm - + .macro jumpifcantuselastresort battler:req, ptr:req various \battler, VARIOUS_TRY_LAST_RESORT .4byte \ptr .endm - + .macro argumentstatuseffect various BS_ATTACKER, VARIOUS_ARGUMENT_STATUS_EFFECT .endm - + .macro tryhitswitchtarget ptr:req various BS_ATTACKER, VARIOUS_TRY_HIT_SWITCH_TARGET .4byte \ptr .endm - + .macro tryautotomize battler:req, ptr:req various \battler, VARIOUS_TRY_AUTOTOMIZE .4byte \ptr .endm - + .macro jumpifcantusesynchronoise ptr:req various BS_ATTACKER, VARIOUS_TRY_SYNCHRONOISE .4byte \ptr .endm - + .macro trycopycat ptr:req various BS_ATTACKER, VARIOUS_TRY_COPYCAT .4byte \ptr .endm - + .macro showabilitypopup battler:req various \battler, VARIOUS_ABILITY_POPUP .endm - + .macro defogclear battler:req, clear:req, ptr:req various \battler, VARIOUS_DEFOG .byte \clear .4byte \ptr .endm - + .macro jumpiftargetally ptr:req various BS_ATTACKER, VARIOUS_JUMP_IF_TARGET_ALLY .4byte \ptr .endm - + .macro trypsychoshift ptr:req various BS_ATTACKER, VARIOUS_PSYCHO_SHIFT .4byte \ptr .endm - + .macro curestatus battler:req various \battler, VARIOUS_CURE_STATUS .endm - + .macro powertrick battler:req various \battler, VARIOUS_POWER_TRICK .endm - + .macro argumenttomoveeffect various BS_ATTACKER, VARIOUS_ARGUMENT_TO_MOVE_EFFECT .endm - + .macro jumpifnotgrounded battler:req, ptr:req various \battler, VARIOUS_JUMP_IF_NOT_GROUNDED .4byte \ptr .endm - + .macro handletrainerslidemsg battler:req, field:req various \battler, VARIOUS_HANDLE_TRAINER_SLIDE_MSG .byte \field .endm - + .macro trytrainerslidefirstdownmsg battler:req various \battler, VARIOUS_TRY_TRAINER_SLIDE_MSG_FIRST_OFF .endm - + .macro trytrainerslidelastonmsg battler:req various \battler, VARIOUS_TRY_TRAINER_SLIDE_MSG_LAST_ON .endm - + .macro setauroraveil battler:req various \battler, VARIOUS_SET_AURORA_VEIL .endm - + .macro trysetthirdtype battler:req, ptr:req various \battler, VARIOUS_TRY_THIRD_TYPE .4byte \ptr .endm - + .macro tryaccupressure battler:req, ptr:req various \battler, VARIOUS_ACUPRESSURE .4byte \ptr .endm - + .macro setpowder battler:req various \battler, VARIOUS_SET_POWDER .endm - + .macro spectralthiefprintstats various BS_ATTACKER, VARIOUS_SPECTRAL_THIEF .endm - + .macro bringdownairbornebattler battler:req various \battler, VARIOUS_GRAVITY_ON_AIRBORNE_MONS .endm - + .macro checkgrassyterrainheal battler:req, ptr:req various \battler, VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS .4byte \ptr .endm - + .macro jumpifnotberry battler:req, ptr:req various \battler, VARIOUS_JUMP_IF_NOT_BERRY .4byte \ptr .endm - + .macro jumpifroarfails ptr:req various BS_ATTACKER, VARIOUS_JUMP_IF_ROAR_FAILS .4byte \ptr @@ -1672,43 +1672,43 @@ various BS_ATTACKER, VARIOUS_TRY_INSTRUCT .4byte \ptr .endm - + .macro settracedability battler:req various \battler, VARIOUS_TRACE_ABILITY .endm - + .macro updatenick battler:req various \battler, VARIOUS_UPDATE_NICK .endm - + .macro tryillusionoff battler:req various \battler, VARIOUS_TRY_ILLUSION_OFF .endm - + .macro spriteignore0hp val:req various BS_ATTACKER, VARIOUS_SET_SPRITEIGNORE0HP .byte \val .endm - + .macro getstatvalue battler:req, statId:req various \battler, VARIOUS_GET_STAT_VALUE .byte \statId .endm - + .macro jumpiffullhp battler:req, ptr:req various \battler, VARIOUS_JUMP_IF_FULL_HP .4byte \ptr .endm - + .macro losetype battler:req, type:req various \battler, VARIOUS_LOSE_TYPE .byte \type .endm - + .macro tryfriskmsg battler:req various \battler, VARIOUS_TRY_FRISK .endm - + .macro jumpifshieldsdown battler:req, ptr:req various \battler, VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED .4byte \ptr @@ -1725,32 +1725,32 @@ .byte \target .4byte \ptr .endm - + .macro trysetfairylock ptr:req various BS_ATTACKER, VARIOUS_TRY_FAIRY_LOCK .4byte \ptr .endm - + .macro jumpifnoally battler:req, ptr:req various \battler, VARIOUS_JUMP_IF_NO_ALLY .4byte \ptr .endm - + .macro jumpifnoholdeffect battler:req, holdEffet:req, ptr:req various \battler, VARIOUS_JUMP_IF_NO_HOLD_EFFECT .byte \holdEffet .4byte \ptr .endm - + .macro infatuatewithbattler battler1:req, battler2:req various \battler1, VARIOUS_INFATUATE_WITH_BATTLER .byte \battler2 .endm - + .macro setlastuseditem battler:req various \battler, VARIOUS_SET_LAST_USED_ITEM .endm - + .macro jumpifabsent battler:req, ptr:req various \battler, VARIOUS_JUMP_IF_ABSENT .4byte \ptr @@ -1764,61 +1764,65 @@ various BS_ATTACKER, VARIOUS_TOTEM_BOOST .4byte \ptr .endm - + + .macro tryactivategrimneigh, battler:req + various \battler, VARIOUS_TRY_ACTIVATE_GRIM_NEIGH + .endm + .macro setzeffect various BS_ATTACKER, VARIOUS_SET_Z_EFFECT .endm - + @ helpful macros .macro setstatchanger stat:req, stages:req, down:req setbyte sSTATCHANGER \stat | \stages << 3 | \down << 7 .endm - + .macro setmoveeffect effect:req sethword sMOVE_EFFECT \effect sethword sSAVED_MOVE_EFFECT \effect .endm - + .macro chosenstatus1animation battler:req, status:req chosenstatusanimation \battler, 0x0, \status .endm - + .macro chosenstatus2animation battler:req, status:req chosenstatusanimation \battler, 0x1, \status .endm - + .macro sethword dst:req, value:req setbyte \dst, (\value) & 0xFF setbyte \dst + 1, ((\value) >> 8) & 0xFF .endm - + .macro setword dst:req, value:req setbyte \dst, (\value) & 0xFF setbyte \dst + 1, ((\value) >> 8) & 0xFF setbyte \dst + 2, ((\value) >> 16) & 0xFF setbyte \dst + 3, ((\value) >> 24) & 0xFF .endm - + .macro copybyte dst:req, src:req copyarray \dst, \src, 0x1 .endm - + .macro copyhword dst:req, src:req copyarray \dst, \src, 0x2 .endm - + .macro copyword dst:req, src:req copyarray \dst, \src, 0x4 .endm - + .macro jumpifbytenotequal byte1:req, byte2:req, jumpptr:req jumpifarraynotequal \byte1, \byte2, 0x1, \jumpptr .endm - + .macro jumpifbyteequal byte1:req, byte2:req, jumpptr:req jumpifarrayequal \byte1, \byte2, 0x1, \jumpptr .endm - + .macro jumpifmove move:req, jumpptr:req jumpifhalfword CMP_EQUAL, gCurrentMove, \move, \jumpptr .endm @@ -1834,39 +1838,39 @@ .macro jumpifstatus3 battler, status:req, jumpptr:req jumpifstatus3condition \battler, \status, 0x0, \jumpptr .endm - + .macro jumpifnostatus3 battler:req, status:req, jumpptr:req jumpifstatus3condition \battler, \status, 0x1, \jumpptr .endm - + .macro jumpifmovehadnoeffect jumpptr:req jumpifbyte CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_NO_EFFECT, \jumpptr .endm - + .macro jumpifbattletype flags:req, jumpptr:req jumpifword CMP_COMMON_BITS, gBattleTypeFlags, \flags, \jumpptr .endm - + .macro jumpifnotbattletype flags:req, jumpptr:req jumpifword CMP_NO_COMMON_BITS, gBattleTypeFlags, \flags, \jumpptr .endm - + .macro dmg_1_8_targethp manipulatedamage DMG_1_8_TARGET_HP .endm - + .macro dmgtomaxattackerhp manipulatedamage DMG_FULL_ATTACKER_HP .endm - + .macro dmgtocurrattackerhp manipulatedamage DMG_CURR_ATTACKER_HP .endm - + .macro dmg_1_2_attackerhp manipulatedamage DMG_1_2_ATTACKER_HP .endm - + .macro jumpifflowerveil jumpptr:req jumpifnottype BS_TARGET, TYPE_GRASS, 1f jumpifability BS_TARGET_SIDE, ABILITY_FLOWER_VEIL, \jumpptr @@ -1887,7 +1891,7 @@ jumpifability BS_TARGET, ABILITY_LEAF_GUARD, \jumpptr 1: .endm - + .macro jumpifsafeguard jumpptr:req jumpifability BS_ATTACKER, ABILITY_INFILTRATOR, 1f jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, \jumpptr diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 5e736c42ba..ee27ccdf9e 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -854,10 +854,6 @@ gBattleAnims_General:: .4byte General_IngrainHeal @ B_ANIM_INGRAIN_HEAL .4byte General_WishHeal @ B_ANIM_WISH_HEAL .4byte General_MegaEvolution @ B_ANIM_MEGA_EVOLUTION - .4byte General_TerrainMisty @ B_ANIM_TERRAIN_MISTY - .4byte General_TerrainGrassy @ B_ANIM_TERRAIN_GRASSY - .4byte General_TerrainElectric @ B_ANIM_TERRAIN_ELECTRIC - .4byte General_TerrainPsychic @ B_ANIM_TERRAIN_PSYCHIC .4byte General_IllusionOff @ B_ANIM_ILLUSION_OFF .4byte General_FormChange @ B_ANIM_FORM_CHANGE .4byte General_SlideOffScreen @ B_ANIM_SLIDE_OFFSCREEN @@ -8516,8 +8512,6 @@ Move_GRASSY_TERRAIN:: delay 4 createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_BG, 3, 4, 0, RGB(31, 24, 31) waitforvisualfinish - restorebg - waitbgfadein end Move_MISTY_TERRAIN:: @@ -8556,8 +8550,6 @@ Move_MISTY_TERRAIN:: delay 4 createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_BG, 3, 7, 0, RGB(31, 24, 31) waitforvisualfinish - restorebg - waitbgfadein end Move_ELECTRIFY:: @@ -9441,8 +9433,6 @@ Move_ELECTRIC_TERRAIN:: delay 2 createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_BG, 3, 4, 0, RGB(28, 28, 0) waitforvisualfinish - restorebg - waitbgfadein end Move_DAZZLING_GLEAM:: @@ -11098,8 +11088,6 @@ Move_PSYCHIC_TERRAIN:: delay 4 createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_BG, 3, 4, 0, RGB(27, 0, 13) waitforvisualfinish - restorebg - waitbgfadein end Move_LUNGE:: @@ -24422,18 +24410,6 @@ MegaEvolutionParticles: delay 3 return -General_TerrainMisty: - end - -General_TerrainGrassy: - end - -General_TerrainElectric: - end - -General_TerrainPsychic: - end - General_RestoreBg: restorebg waitbgfadein diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 7fd3ddce90..e8eda2bc1e 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1522,6 +1522,7 @@ BattleScript_EffectPsychicTerrain: waitanimation printfromtable gTerrainStringIds waitmessage 0x40 + playanimation BS_SCRIPTING, B_ANIM_RESTORE_BG, NULL goto BattleScript_MoveEnd BattleScript_EffectTopsyTurvy: @@ -4967,8 +4968,9 @@ BattleScript_FaintTarget:: tryactivatefellstinger BS_ATTACKER tryactivatesoulheart tryactivatereceiver BS_TARGET - tryactivatemoxie BS_ATTACKER + tryactivatemoxie BS_ATTACKER @ and chilling neigh, as one ice rider tryactivatebeastboost BS_ATTACKER + tryactivategrimneigh BS_ATTACKER @ and as one shadow rider trytrainerslidefirstdownmsg BS_TARGET return @@ -5405,6 +5407,12 @@ BattleScript_OverworldWeatherStarts:: playanimation2 BS_ATTACKER, sB_ANIM_ARG1, NULL end3 +BattleScript_OverworldTerrain:: + printfromtable gTerrainStringIds + waitmessage 0x40 + playanimation BS_SCRIPTING, B_ANIM_RESTORE_BG, NULL + end3 + BattleScript_SideStatusWoreOff:: printstring STRINGID_PKMNSXWOREOFF waitmessage 0x40 @@ -6629,6 +6637,7 @@ BattleScript_AbilityPopUp: showabilitypopup BS_ABILITY_BATTLER recordability BS_ABILITY_BATTLER pause 40 + sethword sABILITY_OVERWRITE, 0 return BattleScript_SpeedBoostActivates:: @@ -6889,32 +6898,32 @@ BattleScript_ElectricSurgeActivates:: pause 0x20 call BattleScript_AbilityPopUp printstring STRINGID_TERRAINBECOMESELECTRIC - waitstate - playanimation BS_SCRIPTING, B_ANIM_TERRAIN_ELECTRIC, NULL + waitmessage 0x40 + playanimation BS_SCRIPTING, B_ANIM_RESTORE_BG, NULL end3 BattleScript_MistySurgeActivates:: pause 0x20 call BattleScript_AbilityPopUp printstring STRINGID_TERRAINBECOMESMISTY - waitstate - playanimation BS_SCRIPTING, B_ANIM_TERRAIN_MISTY, NULL + waitmessage 0x40 + playanimation BS_SCRIPTING, B_ANIM_RESTORE_BG, NULL end3 BattleScript_GrassySurgeActivates:: pause 0x20 call BattleScript_AbilityPopUp printstring STRINGID_TERRAINBECOMESGRASSY - waitstate - playanimation BS_SCRIPTING, B_ANIM_TERRAIN_GRASSY, NULL + waitmessage 0x40 + playanimation BS_SCRIPTING, B_ANIM_RESTORE_BG, NULL end3 BattleScript_PsychicSurgeActivates:: pause 0x20 call BattleScript_AbilityPopUp printstring STRINGID_TERRAINBECOMESPSYCHIC - waitstate - playanimation BS_SCRIPTING, B_ANIM_TERRAIN_PSYCHIC, NULL + waitmessage 0x40 + playanimation BS_SCRIPTING, B_ANIM_RESTORE_BG, NULL end3 BattleScript_BadDreamsActivates:: @@ -7102,7 +7111,9 @@ BattleScript_GrassyTerrainLoopIncrement:: jumpifbytenotequal gBattleCommunication, gBattlersCount, BattleScript_GrassyTerrainLoop BattleScript_GrassyTerrainLoopEnd:: bicword gHitMarker, HITMARKER_x20 | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + jumpifword CMP_COMMON_BITS, gFieldStatuses, STATUS_FIELD_TERRAIN_PERMANENT, BattleScript_GrassyTerrainHealEnd jumpifbyte CMP_EQUAL, gFieldTimers + 5, 0x0, BattleScript_GrassyTerrainEnds +BattleScript_GrassyTerrainHealEnd: end2 BattleScript_AbilityNoSpecificStatLoss:: @@ -7220,6 +7231,16 @@ BattleScript_WeakArmorSpeedAnim: BattleScript_WeakArmorActivatesEnd: return +BattleScript_RaiseStatOnFaintingTarget:: + copybyte gBattlerAbility, gBattlerAttacker + call BattleScript_AbilityPopUp + setgraphicalstatchangevalues + playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + waitanimation + printstring STRINGID_LASTABILITYRAISEDSTAT + waitmessage 0x40 + return + BattleScript_AttackerAbilityStatRaise:: copybyte gBattlerAbility, gBattlerAttacker call BattleScript_AbilityPopUp @@ -7249,6 +7270,18 @@ BattleScript_SwitchInAbilityMsg:: printfromtable gSwitchInAbilityStringIds waitmessage 0x40 end3 + +BattleScript_ActivateAsOne:: + call BattleScript_AbilityPopUp + printfromtable gSwitchInAbilityStringIds + waitmessage 0x40 + @ show unnerve + sethword sABILITY_OVERWRITE, ABILITY_UNNERVE + setbyte cMULTISTRING_CHOOSER, MULTI_SWITCHIN_UNNERVE + call BattleScript_AbilityPopUp + printfromtable gSwitchInAbilityStringIds + waitmessage 0x40 + end3 BattleScript_FriskMsgWithPopup:: copybyte gBattlerAbility, gBattlerAttacker diff --git a/data/battle_scripts_2.s b/data/battle_scripts_2.s index 88c81928db..236c9f4446 100644 --- a/data/battle_scripts_2.s +++ b/data/battle_scripts_2.s @@ -213,7 +213,7 @@ BattleScript_ActionWallyThrow: printstring STRINGID_YOUTHROWABALLNOWRIGHT waitmessage 0x40 end2 - + BattleScript_TrainerSlideMsgRet:: handletrainerslidemsg BS_SCRIPTING, 0 trainerslidein 1 @@ -223,7 +223,7 @@ BattleScript_TrainerSlideMsgRet:: handletrainerslidemsg BS_SCRIPTING, 2 waitstate return - + BattleScript_TrainerSlideMsgEnd2:: call BattleScript_TrainerSlideMsgRet end2 diff --git a/data/event_scripts.s b/data/event_scripts.s index 8039be6876..f22377aa27 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -2,6 +2,7 @@ #include "constants/apprentice.h" #include "constants/battle.h" #include "constants/battle_arena.h" +#include "constants/battle_config.h" #include "constants/battle_dome.h" #include "constants/battle_factory.h" #include "constants/battle_frontier.h" diff --git a/include/battle.h b/include/battle.h index 10cf1e5a0b..0970f36fc4 100644 --- a/include/battle.h +++ b/include/battle.h @@ -522,6 +522,7 @@ struct BattleStruct u8 wishPerishSongState; u8 wishPerishSongBattlerId; bool8 overworldWeatherDone; + bool8 terrainDone; u8 atkCancellerTracker; struct BattleTvMovePoints tvMovePoints; struct BattleTv tv; @@ -633,6 +634,7 @@ struct BattleScripting u16 multihitMoveEffect; u8 illusionNickHack; // To properly display nick in STRINGID_ENEMYABOUTTOSWITCHPKMN. bool8 fixedPopup; // force ability popup to stick until manually called back + u16 abilityPopupOverwrite; }; // rom_80A5C6C diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index 454b6ab345..ff35570088 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -26,6 +26,7 @@ u32 IsFlowerVeilProtected(u32 battler); u32 IsLeafGuardProtected(u32 battler); bool32 IsShieldsDownProtected(u32 battler); u32 IsAbilityStatusProtected(u32 battler); +bool32 TryResetBattlerStatChanges(u8 battler); extern void (* const gBattleScriptingCommandsTable[])(void); extern const u8 gBattlePalaceNatureToMoveGroupLikelihood[NUM_NATURES][4]; diff --git a/include/battle_scripts.h b/include/battle_scripts.h index fb7f8e4f4d..4d274d2128 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -48,6 +48,7 @@ extern const u8 BattleScript_SandStormHailEnds[]; extern const u8 BattleScript_SunlightContinues[]; extern const u8 BattleScript_SunlightFaded[]; extern const u8 BattleScript_OverworldWeatherStarts[]; +extern const u8 BattleScript_OverworldTerrain[]; extern const u8 BattleScript_SideStatusWoreOff[]; extern const u8 BattleScript_SafeguardProtected[]; extern const u8 BattleScript_SafeguardEnds[]; @@ -357,6 +358,9 @@ extern const u8 BattleScript_CottonDownActivates[]; extern const u8 BattleScript_BallFetch[]; extern const u8 BattleScript_SandSpitActivates[]; extern const u8 BattleScript_PerishBodyActivates[]; +extern const u8 BattleScript_ActivateAsOne[]; +extern const u8 BattleScript_RaiseStatOnFaintingTarget[]; + // zmoves extern const u8 BattleScript_ZMoveActivateDamaging[]; extern const u8 BattleScript_ZMoveActivateStatus[]; @@ -366,5 +370,4 @@ extern const u8 BattleScript_StatUpZMove[]; extern const u8 BattleScript_HealReplacementZMove[]; extern const u8 BattleScript_EffectExtremeEvoboost[]; - #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/battle_util.h b/include/battle_util.h index 6a7fe71c20..5d8cb0cc5e 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -23,6 +23,7 @@ #define ABILITYEFFECT_TRACE1 0xC #define ABILITYEFFECT_TRACE2 0xD #define ABILITYEFFECT_MOVE_END_OTHER 0xE +#define ABILITYEFFECT_SWITCH_IN_TERRAIN 0xFE #define ABILITYEFFECT_SWITCH_IN_WEATHER 0xFF #define ITEMEFFECT_ON_SWITCH_IN 0x0 diff --git a/include/constants/battle.h b/include/constants/battle.h index cb65d37c8a..cbb7e0cf92 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -221,18 +221,19 @@ #define SIDE_STATUS_MAT_BLOCK (1 << 21) // Field affecting statuses. -#define STATUS_FIELD_MAGIC_ROOM 0x1 -#define STATUS_FIELD_TRICK_ROOM 0x2 -#define STATUS_FIELD_WONDER_ROOM 0x4 -#define STATUS_FIELD_MUDSPORT 0x8 -#define STATUS_FIELD_WATERSPORT 0x10 -#define STATUS_FIELD_GRAVITY 0x20 -#define STATUS_FIELD_GRASSY_TERRAIN 0x40 -#define STATUS_FIELD_MISTY_TERRAIN 0x80 -#define STATUS_FIELD_ELECTRIC_TERRAIN 0x100 -#define STATUS_FIELD_PSYCHIC_TERRAIN 0x200 -#define STATUS_FIELD_ION_DELUGE 0x400 -#define STATUS_FIELD_FAIRY_LOCK 0x800 +#define STATUS_FIELD_MAGIC_ROOM (1 << 0) +#define STATUS_FIELD_TRICK_ROOM (1 << 1) +#define STATUS_FIELD_WONDER_ROOM (1 << 2) +#define STATUS_FIELD_MUDSPORT (1 << 3) +#define STATUS_FIELD_WATERSPORT (1 << 4) +#define STATUS_FIELD_GRAVITY (1 << 5) +#define STATUS_FIELD_GRASSY_TERRAIN (1 << 6) +#define STATUS_FIELD_MISTY_TERRAIN (1 << 7) +#define STATUS_FIELD_ELECTRIC_TERRAIN (1 << 8) +#define STATUS_FIELD_PSYCHIC_TERRAIN (1 << 9) +#define STATUS_FIELD_ION_DELUGE (1 << 10) +#define STATUS_FIELD_FAIRY_LOCK (1 << 11) +#define STATUS_FIELD_TERRAIN_PERMANENT (1 << 12) // Overworld thunderstorm generates electric terrain #define STATUS_TERRAIN_ANY (STATUS_FIELD_GRASSY_TERRAIN | STATUS_FIELD_MISTY_TERRAIN | STATUS_FIELD_ELECTRIC_TERRAIN | STATUS_FIELD_PSYCHIC_TERRAIN) diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index 3036df9a08..c59bd7d789 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -518,16 +518,12 @@ #define B_ANIM_INGRAIN_HEAL 21 #define B_ANIM_WISH_HEAL 22 #define B_ANIM_MEGA_EVOLUTION 23 -#define B_ANIM_TERRAIN_MISTY 24 -#define B_ANIM_TERRAIN_GRASSY 25 -#define B_ANIM_TERRAIN_ELECTRIC 26 -#define B_ANIM_TERRAIN_PSYCHIC 27 -#define B_ANIM_ILLUSION_OFF 28 -#define B_ANIM_FORM_CHANGE 29 -#define B_ANIM_SLIDE_OFFSCREEN 30 // for Emergency Exit -#define B_ANIM_RESTORE_BG 31 // for Terrain Endings -#define B_ANIM_TOTEM_FLARE 32 // Totem boosts aura flare -#define B_ANIM_ZMOVE_ACTIVATE 33 // Using Z Moves +#define B_ANIM_ILLUSION_OFF 24 +#define B_ANIM_FORM_CHANGE 25 +#define B_ANIM_SLIDE_OFFSCREEN 26 // for Emergency Exit +#define B_ANIM_RESTORE_BG 27 // for Terrain Endings +#define B_ANIM_TOTEM_FLARE 28 // Totem boosts aura flare +#define B_ANIM_ZMOVE_ACTIVATE 29 // Using Z Moves // special animations table (gBattleAnims_Special) #define B_ANIM_LVL_UP 0 diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 8979ad2f27..32a00fd6d8 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -147,6 +147,7 @@ #define B_PP_REDUCED_BY_SPITE GEN_6 // In Gen4+, Spite reduces the foe's last move's PP by 4, instead of 2 to 5. #define B_CAN_SPITE_FAIL GEN_6 // In Gen4+, Spite can no longer fail if the foe's last move only has 1 remaining PP. #define B_CRASH_IF_TARGET_IMMUNE GEN_6 // In Gen4+, The user of Jump Kick or Hi Jump Kick will "keep going and crash" if it attacks a target that is immune to the move. +#define B_TAILWIND_TIMER GEN_5 // In Gen5+, Tailwind lasts 4 turns instead of 3. // Ability settings #define B_ABILITY_WEATHER GEN_6 // In Gen6+, ability-induced weather lasts 5 turns. Before, it lasted until the battle ended or until it was changed by a move. @@ -169,6 +170,11 @@ #define B_FLAG_INVERSE_BATTLE 0 // If this flag is set, the battle's type effectiveness are inversed. For example, fire is super effective against water. #define B_FLAG_FORCE_DOUBLE_WILD 0 // If this flag is set, all land and surfing wild battles will be double battles. +// Var Settings +// To use the following features in scripting, replace the 0s with the var ID you're assigning it to. +// Eg: Replace with VAR_UNUSED_0x40F7 so you can use VAR_TERRAIN for that feature. +#define VAR_TERRAIN 0 // If this var has a value, assigning a STATUS_FIELD_xx_TERRAIN to it before battle causes the battle to start with that terrain active + // Interface settings #define B_ABILITY_POP_UP TRUE // In Gen5+, the Pokémon abilities are displayed in a pop-up, when they activate in battle. #define B_FAST_INTRO TRUE // If set to TRUE, battle intro texts print at the same time as animation of a Pokémon, as opposing to waiting for the animation to end. @@ -185,6 +191,7 @@ #define B_PARALYZE_ELECTRIC GEN_6 // In Gen6+, Electric-type Pokémon can't be paralyzed. #define B_POWDER_GRASS GEN_6 // In Gen6+, Grass-type Pokémon are immune to powder and spore moves. #define B_STEEL_RESISTANCES GEN_6 // In Gen6+, Steel-type Pokémon are no longer resistant to Dark and Ghost moves. +#define B_THUNDERSTORM_TERRAIN TRUE // If TRUE, overworld Thunderstorm generates Rain and Electric Terrain as in Gen 8. // Animation Settings #define B_NEW_SWORD_PARTICLE FALSE // If set to TRUE, it updates Swords Dance's particle. diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index e882766ff4..c5432b157f 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -36,6 +36,7 @@ #define sMULTIHIT_EFFECT gBattleScripting + 0x30 #define sILLUSION_NICK_HACK gBattleScripting + 0x32 #define sFIXED_ABILITY_POPUP gBattleScripting + 0x33 +#define sABILITY_OVERWRITE gBattleScripting + 0x34 #define cMULTISTRING_CHOOSER gBattleCommunication + 5 @@ -168,7 +169,8 @@ #define VARIOUS_JUMP_IF_ABSENT 101 #define VARIOUS_DESTROY_ABILITY_POPUP 102 #define VARIOUS_TOTEM_BOOST 103 -#define VARIOUS_SET_Z_EFFECT 104 +#define VARIOUS_TRY_ACTIVATE_GRIM_NEIGH 104 +#define VARIOUS_SET_Z_EFFECT 105 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index fbbfcae9de..78644f466e 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -470,7 +470,7 @@ #define STRINGID_FRISKACTIVATES 466 #define STRINGID_UNNERVEENTERS 467 #define STRINGID_HARVESTBERRY 468 -#define STRINGID_MOXIEATKRISE 469 +#define STRINGID_LASTABILITYRAISEDSTAT 469 #define STRINGID_MAGICBOUNCEACTIVATES 470 #define STRINGID_PROTEANTYPECHANGE 471 #define STRINGID_SYMBIOSISITEMPASS 472 @@ -564,17 +564,19 @@ #define STRINGID_PKMNSWILLPERISHIN3TURNS 560 #define STRINGID_ABILITYRAISEDSTATDRASTICALLY 561 #define STRINGID_AURAFLAREDTOLIFE 562 -#define STRINGID_ZPOWERSURROUNDS 563 -#define STRINGID_ZMOVEUNLEASHED 564 -#define STRINGID_ZMOVERESETSSTATS 565 -#define STRINGID_ZMOVEALLSTATSUP 566 -#define STRINGID_ZMOVEZBOOSTCRIT 567 -#define STRINGID_ZMOVERESTOREHP 568 -#define STRINGID_ZMOVESTATUP 569 -#define STRINGID_ZMOVEHPTRAP 570 -#define STRINGID_TERRAINREMOVED 571 +#define STRINGID_ASONEENTERS 563 +#define STRINGID_CURIOUSMEDICINEENTERS 564 +#define STRINGID_ZPOWERSURROUNDS 565 +#define STRINGID_ZMOVEUNLEASHED 566 +#define STRINGID_ZMOVERESETSSTATS 567 +#define STRINGID_ZMOVEALLSTATSUP 568 +#define STRINGID_ZMOVEZBOOSTCRIT 569 +#define STRINGID_ZMOVERESTOREHP 570 +#define STRINGID_ZMOVESTATUP 571 +#define STRINGID_ZMOVEHPTRAP 572 +#define STRINGID_TERRAINREMOVED 573 -#define BATTLESTRINGS_COUNT 572 +#define BATTLESTRINGS_COUNT 574 //// multichoice message IDs // switch in ability message @@ -591,6 +593,9 @@ #define MULTI_SWITCHIN_AURABREAK 10 #define MULTI_SWITCHIN_COMATOSE 11 #define MULTI_SWITCHIN_SCREENCLEANER 12 +#define MULTI_SWITCHIN_ASONE 13 +#define MULTI_SWITCHIN_CURIOUS_MEDICINE 14 + // z effects #define MULTISTRING_Z_RESET_STATS 0 #define MULTISTRING_Z_ALL_STATS_UP 1 diff --git a/src/battle_interface.c b/src/battle_interface.c index dd70371ef7..c79bbc1081 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -966,10 +966,7 @@ static void TryToggleHealboxVisibility(u8 priority, u8 healthboxLeftSpriteId, u8 case B_ANIM_WISH_HEAL: //new case B_ANIM_MEGA_EVOLUTION: - case B_ANIM_TERRAIN_MISTY: - case B_ANIM_TERRAIN_GRASSY: - case B_ANIM_TERRAIN_ELECTRIC: - case B_ANIM_TERRAIN_PSYCHIC: + case B_ANIM_RESTORE_BG: break; } return; //all other special anims dont hide @@ -3024,6 +3021,9 @@ void CreateAbilityPopUp(u8 battlerId, u32 ability, bool32 isDoubleBattle) if (!B_ABILITY_POP_UP) return; + + if (gBattleScripting.abilityPopupOverwrite != 0) + ability = gBattleScripting.abilityPopupOverwrite; if (!gBattleStruct->activeAbilityPopUps) { diff --git a/src/battle_main.c b/src/battle_main.c index 0029f300dc..d64ce4acfe 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3490,6 +3490,12 @@ static void TryDoEventsBeforeFirstTurn(void) return; } + if (!gBattleStruct->terrainDone && AbilityBattleEffects(0, 0, 0, ABILITYEFFECT_SWITCH_IN_TERRAIN, 0) != 0) + { + gBattleStruct->terrainDone = TRUE; + return; + } + // Totem boosts for (i = 0; i < gBattlersCount; i++) { @@ -4268,7 +4274,7 @@ u32 GetBattlerTotalSpeedStat(u8 battlerId) } // item effects - if (GetBattlerHoldEffect(battlerId, FALSE) == HOLD_EFFECT_MACHO_BRACE || GetBattlerHoldEffect(battlerId, FALSE) == HOLD_EFFECT_POWER_ITEM) + if (holdEffect == HOLD_EFFECT_MACHO_BRACE || holdEffect == HOLD_EFFECT_POWER_ITEM) speed /= 2; else if (holdEffect == HOLD_EFFECT_IRON_BALL) speed /= 2; diff --git a/src/battle_message.c b/src/battle_message.c index d9fd994a67..ae7ec77217 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -601,7 +601,7 @@ static const u8 sText_SnowWarningHail[] = _("It started to hail!"); static const u8 sText_FriskActivates[] = _("{B_ATK_NAME_WITH_PREFIX} frisked {B_DEF_NAME_WITH_PREFIX} and\nfound its {B_LAST_ITEM}!"); static const u8 sText_UnnerveEnters[] = _("The opposing team is too nervous\nto eat Berries!"); static const u8 sText_HarvestBerry[] = _("{B_ATK_NAME_WITH_PREFIX} harvested\nits {B_LAST_ITEM}!"); -static const u8 sText_MoxieAtkRise[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} raised its Attack!"); +static const u8 sText_LastAbilityRaisedBuff1[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_LAST_ABILITY}\nraised its {B_BUFF1}!"); static const u8 sText_MagicBounceActivates[] = _("The {B_DEF_NAME_WITH_PREFIX} bounced the\n{B_ATK_NAME_WITH_PREFIX} back!"); static const u8 sText_ProteanTypeChange[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} transformed\nit into the {B_BUFF1} type!"); static const u8 sText_SymbiosisItemPass[] = _("{B_ATK_NAME_WITH_PREFIX} passed its {B_LAST_ITEM}\nto {B_SCR_ACTIVE_NAME_WITH_PREFIX} through {B_ATK_ABILITY}!"); @@ -691,6 +691,8 @@ static const u8 sText_BattlerAbilityRaisedStat[] = _("{B_SCR_ACTIVE_NAME_WITH_PR 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_CuriousMedicineEnters[] = _("{B_EFF_NAME_WITH_PREFIX}'s\nstat changes were reset!"); static const u8 sText_ZPowerSurrounds[] = _("{B_ATK_NAME_WITH_PREFIX} surrounds\nitself with its Z-Power!"); static const u8 sText_ZPowerUnleashed[] = _("{B_ATK_NAME_WITH_PREFIX} unleashes\nits full-force Z-Move!"); static const u8 sText_ZMoveResetsStats[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} returned its\ndecreased stats to normal using\lits Z-Power!"); @@ -711,6 +713,8 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_ZMOVERESTOREHP - 12] = sText_ZMoveRestoreHp, [STRINGID_ZMOVESTATUP - 12] = sText_ZMoveStatUp, [STRINGID_ZMOVEHPTRAP - 12] = sText_ZMoveHpSwitchInTrap, + [STRINGID_CURIOUSMEDICINEENTERS - 12] = sText_CuriousMedicineEnters, + [STRINGID_ASONEENTERS - 12] = sText_AsOneEnters, [STRINGID_ABILITYRAISEDSTATDRASTICALLY - 12] = sText_AbilityRaisedStatDrastically, [STRINGID_PKMNSWILLPERISHIN3TURNS - 12] = sText_PkmnsWillPerishIn3Turns, [STRINGID_ASANDSTORMKICKEDUP - 12] = sText_ASandstormKickedUp, @@ -1202,7 +1206,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_FRISKACTIVATES - 12] = sText_FriskActivates, [STRINGID_UNNERVEENTERS - 12] = sText_UnnerveEnters, [STRINGID_HARVESTBERRY - 12] = sText_HarvestBerry, - [STRINGID_MOXIEATKRISE - 12] = sText_MoxieAtkRise, + [STRINGID_LASTABILITYRAISEDSTAT - 12] = sText_LastAbilityRaisedBuff1, [STRINGID_MAGICBOUNCEACTIVATES - 12] = sText_MagicBounceActivates, [STRINGID_PROTEANTYPECHANGE - 12] = sText_ProteanTypeChange, [STRINGID_SYMBIOSISITEMPASS - 12] = sText_SymbiosisItemPass, @@ -1316,6 +1320,8 @@ const u16 gSwitchInAbilityStringIds[] = [MULTI_SWITCHIN_AURABREAK] = STRINGID_AURABREAKENTERS, [MULTI_SWITCHIN_COMATOSE] = STRINGID_COMATOSEENTERS, [MULTI_SWITCHIN_SCREENCLEANER] = STRINGID_SCREENCLEANERENTERS, + [MULTI_SWITCHIN_ASONE] = STRINGID_ASONEENTERS, + [MULTI_SWITCHIN_CURIOUS_MEDICINE] = STRINGID_CURIOUSMEDICINEENTERS, }; const u16 gMissStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index c0c78d35e4..dd0cf3686f 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4410,6 +4410,15 @@ static void Cmd_playanimation(void) gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); argumentPtr = T2_READ_PTR(gBattlescriptCurrInstr + 3); + + #if B_TERRAIN_BG_CHANGE == FALSE + if (gBattlescriptCurrInstr[2] == B_ANIM_RESTORE_BG) + { + // workaround for .if not working + gBattlescriptCurrInstr += 7; + return; + } + #endif if (gBattlescriptCurrInstr[2] == B_ANIM_STATS_CHANGE || gBattlescriptCurrInstr[2] == B_ANIM_SNATCH_MOVE @@ -7570,17 +7579,40 @@ static void Cmd_various(void) BtlController_EmitSetMonData(0, REQUEST_PP_DATA_BATTLE, 0, 5, data); MarkBattlerForControllerExec(gActiveBattler); break; - case VARIOUS_TRY_ACTIVATE_MOXIE: - if (GetBattlerAbility(gActiveBattler) == ABILITY_MOXIE - && HasAttackerFaintedTarget() - && !NoAliveMonsForEitherParty() - && gBattleMons[gBattlerAttacker].statStages[STAT_ATK] != 12) + case VARIOUS_TRY_ACTIVATE_MOXIE: // and chilling neigh + as one ice rider + if ((GetBattlerAbility(gActiveBattler) == ABILITY_MOXIE + || GetBattlerAbility(gActiveBattler) == ABILITY_CHILLING_NEIGH + || GetBattlerAbility(gActiveBattler) == ABILITY_AS_ONE_ICE_RIDER) + && HasAttackerFaintedTarget() + && !NoAliveMonsForEitherParty() + && gBattleMons[gBattlerAttacker].statStages[STAT_ATK] != 12) { gBattleMons[gBattlerAttacker].statStages[STAT_ATK]++; SET_STATCHANGER(STAT_ATK, 1, FALSE); PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK); BattleScriptPush(gBattlescriptCurrInstr + 3); - gBattlescriptCurrInstr = BattleScript_AttackerAbilityStatRaise; + gLastUsedAbility = GetBattlerAbility(gActiveBattler); + if (GetBattlerAbility(gActiveBattler) == ABILITY_AS_ONE_ICE_RIDER) + gBattleScripting.abilityPopupOverwrite = gLastUsedAbility = ABILITY_CHILLING_NEIGH; + gBattlescriptCurrInstr = BattleScript_RaiseStatOnFaintingTarget; + return; + } + break; + case VARIOUS_TRY_ACTIVATE_GRIM_NEIGH: // and as one shadow rider + if ((GetBattlerAbility(gActiveBattler) == ABILITY_GRIM_NEIGH + || GetBattlerAbility(gActiveBattler) == ABILITY_AS_ONE_SHADOW_RIDER) + && HasAttackerFaintedTarget() + && !NoAliveMonsForEitherParty() + && gBattleMons[gBattlerAttacker].statStages[STAT_SPATK] != 12) + { + gBattleMons[gBattlerAttacker].statStages[STAT_SPATK]++; + SET_STATCHANGER(STAT_SPATK, 1, FALSE); + PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPATK); + BattleScriptPush(gBattlescriptCurrInstr + 3); + gLastUsedAbility = GetBattlerAbility(gActiveBattler); + if (GetBattlerAbility(gActiveBattler) == ABILITY_AS_ONE_SHADOW_RIDER) + gBattleScripting.abilityPopupOverwrite = gLastUsedAbility = ABILITY_GRIM_NEIGH; + gBattlescriptCurrInstr = BattleScript_RaiseStatOnFaintingTarget; return; } break; @@ -9138,17 +9170,30 @@ static void Cmd_statbuffchange(void) gBattlescriptCurrInstr = jumpPtr; } +bool32 TryResetBattlerStatChanges(u8 battler) +{ + u32 j; + bool32 ret = FALSE; + + gDisableStructs[battler].stockpileDef = 0; + gDisableStructs[battler].stockpileSpDef = 0; + for (j = 0; j < NUM_BATTLE_STATS; j++) + { + if (gBattleMons[battler].statStages[j] != DEFAULT_STAT_STAGE) + ret = TRUE; // returns TRUE if any stat was reset + + gBattleMons[battler].statStages[j] = DEFAULT_STAT_STAGE; + } + + return ret; +} + static void Cmd_normalisebuffs(void) // haze { s32 i, j; for (i = 0; i < gBattlersCount; i++) - { - gDisableStructs[i].stockpileDef = 0; - gDisableStructs[i].stockpileSpDef = 0; - for (j = 0; j < NUM_BATTLE_STATS; j++) - gBattleMons[i].statStages[j] = DEFAULT_STAT_STAGE; - } + TryResetBattlerStatChanges(i); gBattlescriptCurrInstr++; } @@ -10259,7 +10304,7 @@ static void Cmd_settailwind(void) { gSideStatuses[side] |= SIDE_STATUS_TAILWIND; gSideTimers[side].tailwindBattlerId = gBattlerAttacker; - gSideTimers[side].tailwindTimer = 3; + gSideTimers[side].tailwindTimer = (B_TAILWIND_TIMER >= GEN_5) ? 4 : 3; gBattlescriptCurrInstr += 5; } else diff --git a/src/battle_util.c b/src/battle_util.c index a6a25d8e8c..9d9ee1a2d9 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -53,6 +53,9 @@ match the ROM; this is also why sSoundMovesTable's declaration is in the middle functions instead of at the top of the file with the other declarations. */ +static bool32 TryRemoveScreens(u8 battler); +static bool32 IsUnnerveAbilityOnOpposingSide(u8 battlerId); + extern const u8 *const gBattleScriptsForMoveEffects[]; extern const u8 *const gBattlescriptsForBallThrow[]; extern const u8 *const gBattlescriptsForRunningByItem[]; @@ -2006,16 +2009,18 @@ u8 DoFieldEndTurnEffects(void) gBattleStruct->turnCountersTracker++; break; case ENDTURN_ELECTRIC_TERRAIN: - if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN && --gFieldTimers.electricTerrainTimer == 0) + if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN + && ((!gFieldStatuses & STATUS_FIELD_TERRAIN_PERMANENT) && --gFieldTimers.electricTerrainTimer == 0)) { - gFieldStatuses &= ~(STATUS_FIELD_ELECTRIC_TERRAIN); + gFieldStatuses &= ~(STATUS_FIELD_ELECTRIC_TERRAIN | STATUS_FIELD_TERRAIN_PERMANENT); BattleScriptExecute(BattleScript_ElectricTerrainEnds); effect++; } gBattleStruct->turnCountersTracker++; break; case ENDTURN_MISTY_TERRAIN: - if (gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN && --gFieldTimers.mistyTerrainTimer == 0) + if (gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN + && ((!gFieldStatuses & STATUS_FIELD_TERRAIN_PERMANENT) && --gFieldTimers.mistyTerrainTimer == 0)) { gFieldStatuses &= ~(STATUS_FIELD_MISTY_TERRAIN); BattleScriptExecute(BattleScript_MistyTerrainEnds); @@ -2026,15 +2031,18 @@ u8 DoFieldEndTurnEffects(void) case ENDTURN_GRASSY_TERRAIN: if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN) { - if (gFieldTimers.grassyTerrainTimer == 0 || --gFieldTimers.grassyTerrainTimer == 0) + if (!(gFieldStatuses & STATUS_FIELD_TERRAIN_PERMANENT) + && (gFieldTimers.grassyTerrainTimer == 0 || --gFieldTimers.grassyTerrainTimer == 0)) gFieldStatuses &= ~(STATUS_FIELD_GRASSY_TERRAIN); + BattleScriptExecute(BattleScript_GrassyTerrainHeals); effect++; } gBattleStruct->turnCountersTracker++; break; case ENDTURN_PSYCHIC_TERRAIN: - if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN && --gFieldTimers.psychicTerrainTimer == 0) + if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN + && ((!gFieldStatuses & STATUS_FIELD_TERRAIN_PERMANENT) && --gFieldTimers.psychicTerrainTimer == 0)) { gFieldStatuses &= ~(STATUS_FIELD_PSYCHIC_TERRAIN); BattleScriptExecute(BattleScript_PsychicTerrainEnds); @@ -3670,6 +3678,41 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move gBattleScripting.battler = battler; switch (gLastUsedAbility) { + case ABILITYEFFECT_SWITCH_IN_TERRAIN: + if (VarGet(VAR_TERRAIN) & STATUS_TERRAIN_ANY) + { + u16 terrainFlags = VarGet(VAR_TERRAIN) & STATUS_TERRAIN_ANY; // only works for status flag (1 << 15) + gFieldStatuses = terrainFlags | STATUS_FIELD_TERRAIN_PERMANENT; // terrain is permanent + switch (VarGet(VAR_TERRAIN) & STATUS_TERRAIN_ANY) + { + case STATUS_FIELD_ELECTRIC_TERRAIN: + gBattleCommunication[MULTISTRING_CHOOSER] = 2; + break; + case STATUS_FIELD_MISTY_TERRAIN: + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + break; + case STATUS_FIELD_GRASSY_TERRAIN: + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + break; + case STATUS_FIELD_PSYCHIC_TERRAIN: + gBattleCommunication[MULTISTRING_CHOOSER] = 3; + break; + } + + BattleScriptPushCursorAndCallback(BattleScript_OverworldTerrain); + effect++; + } + #if B_THUNDERSTORM_TERRAIN == TRUE + else if (GetCurrentWeather() == WEATHER_RAIN_THUNDERSTORM && !(gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN)) + { + // overworld weather started rain, so just do electric terrain anim + gFieldStatuses = (STATUS_FIELD_ELECTRIC_TERRAIN | STATUS_FIELD_TERRAIN_PERMANENT); + gBattleCommunication[MULTISTRING_CHOOSER] = 2; + BattleScriptPushCursorAndCallback(BattleScript_OverworldTerrain); + effect++; + } + #endif + break; case ABILITYEFFECT_SWITCH_IN_WEATHER: if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED)) { @@ -3767,6 +3810,28 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move effect++; } break; + case ABILITY_AS_ONE_ICE_RIDER: + case ABILITY_AS_ONE_SHADOW_RIDER: + if (!gSpecialStatuses[battler].switchInAbilityDone) + { + gBattleCommunication[MULTISTRING_CHOOSER] = MULTI_SWITCHIN_ASONE; + gSpecialStatuses[battler].switchInAbilityDone = 1; + BattleScriptPushCursorAndCallback(BattleScript_ActivateAsOne); + effect++; + } + break; + case ABILITY_CURIOUS_MEDICINE: + if (!gSpecialStatuses[battler].switchInAbilityDone && IsDoubleBattle() + && IsBattlerAlive(BATTLE_PARTNER(battler)) && TryResetBattlerStatChanges(BATTLE_PARTNER(battler))) + { + u32 i; + gEffectBattler = BATTLE_PARTNER(battler); + gBattleCommunication[MULTISTRING_CHOOSER] = MULTI_SWITCHIN_CURIOUS_MEDICINE; + gSpecialStatuses[battler].switchInAbilityDone = 1; + BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); + effect++; + } + break; case ABILITY_ANTICIPATION: if (!gSpecialStatuses[battler].switchInAbilityDone) { @@ -3898,7 +3963,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move } break; case ABILITY_SCREEN_CLEANER: - if (!gSpecialStatuses[battler].switchInAbilityDone) + if (!gSpecialStatuses[battler].switchInAbilityDone && TryRemoveScreens(battler)) { gBattleCommunication[MULTISTRING_CHOOSER] = MULTI_SWITCHIN_SCREENCLEANER; gSpecialStatuses[battler].switchInAbilityDone = 1; @@ -5145,7 +5210,7 @@ static bool32 HasEnoughHpToEatBerry(u32 battlerId, u32 hpFraction, u32 itemId) if (gBattleMons[battlerId].hp == 0) return FALSE; // Unnerve prevents consumption of opponents' berries. - if (isBerry && IsAbilityOnOpposingSide(battlerId, ABILITY_UNNERVE)) + if (isBerry && IsUnnerveAbilityOnOpposingSide(battlerId)) return FALSE; if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / hpFraction) return TRUE; @@ -5259,7 +5324,7 @@ static u8 ItemHealHp(u32 battlerId, u32 itemId, bool32 end2, bool32 percentHeal) static bool32 UnnerveOn(u32 battlerId, u32 itemId) { - if (ItemId_GetPocket(itemId) == POCKET_BERRIES && IsAbilityOnOpposingSide(battlerId, ABILITY_UNNERVE)) + if (ItemId_GetPocket(itemId) == POCKET_BERRIES && IsUnnerveAbilityOnOpposingSide(battlerId)) return TRUE; return FALSE; } @@ -6851,6 +6916,18 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe if (gBattleMoves[move].flags & FLAG_SOUND) MulModifier(&modifier, UQ_4_12(1.3)); break; + case ABILITY_STEELY_SPIRIT: + if (moveType == TYPE_STEEL) + MulModifier(&modifier, UQ_4_12(1.5)); + break; + case ABILITY_TRANSISTOR: + if (moveType == TYPE_ELECTRIC) + MulModifier(&modifier, UQ_4_12(1.5)); + break; + case ABILITY_DRAGONS_MAW: + if (moveType == TYPE_DRAGON) + MulModifier(&modifier, UQ_4_12(1.5)); + break; } // field abilities @@ -6875,6 +6952,10 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe case ABILITY_POWER_SPOT: MulModifier(&modifier, UQ_4_12(1.3)); break; + case ABILITY_STEELY_SPIRIT: + if (moveType == TYPE_STEEL) + MulModifier(&modifier, UQ_4_12(1.5)); + break; } } @@ -8018,6 +8099,44 @@ u8 GetBattleMoveSplit(u32 moveId) return SPLIT_SPECIAL; } +static bool32 TryRemoveScreens(u8 battler) +{ + bool32 removed = FALSE; + u8 battlerSide = GetBattlerSide(battler); + u8 enemySide = GetBattlerSide(BATTLE_OPPOSITE(battler)); + + // try to remove from battler's side + if (gSideStatuses[battlerSide] & (SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL)) + { + gSideStatuses[battlerSide] &= ~(SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL); + gSideTimers[battlerSide].reflectTimer = 0; + gSideTimers[battlerSide].lightscreenTimer = 0; + gSideTimers[battlerSide].auroraVeilTimer = 0; + removed = TRUE; + } + + // try to remove from battler opponent's side + if (gSideStatuses[enemySide] & (SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL)) + { + gSideStatuses[enemySide] &= ~(SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL); + gSideTimers[enemySide].reflectTimer = 0; + gSideTimers[enemySide].lightscreenTimer = 0; + gSideTimers[enemySide].auroraVeilTimer = 0; + removed = TRUE; + } + + return removed; +} + +static bool32 IsUnnerveAbilityOnOpposingSide(u8 battlerId) +{ + if (IsAbilityOnOpposingSide(battlerId, ABILITY_UNNERVE) + || IsAbilityOnOpposingSide(battlerId, ABILITY_AS_ONE_ICE_RIDER) + || IsAbilityOnOpposingSide(battlerId, ABILITY_AS_ONE_SHADOW_RIDER)) + return TRUE; + return FALSE; +} + //photon geyser & light that burns the sky u8 GetSplitBasedOnStats(u8 battlerId) { @@ -8035,3 +8154,4 @@ u8 GetSplitBasedOnStats(u8 battlerId) else return SPLIT_PHYSICAL; } + diff --git a/src/battle_util2.c b/src/battle_util2.c index 55f710a77c..a1ff8dd07e 100644 --- a/src/battle_util2.c +++ b/src/battle_util2.c @@ -45,7 +45,7 @@ void FreeBattleResources(void) { if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_HILL) FreeTrainerHillBattleStruct(); - + gFieldStatuses = 0; if (gBattleResources != NULL) { diff --git a/src/overworld.c b/src/overworld.c index cbfc708983..e135b491da 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -402,6 +402,9 @@ static void Overworld_ResetStateAfterWhiteOut(void) FlagClear(FLAG_SYS_SAFARI_MODE); FlagClear(FLAG_SYS_USE_STRENGTH); FlagClear(FLAG_SYS_USE_FLASH); + #if VAR_TERRAIN != 0 + VarSet(VAR_TERRAIN, 0); + #endif // If you were defeated by Kyogre/Groudon and the step counter has // maxed out, end the abnormal weather. if (VarGet(VAR_SHOULD_END_ABNORMAL_WEATHER) == 1)