From 7f53f533bb5181f8ede8c2716e0d561655febb38 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Fri, 29 Jul 2022 09:42:03 -0400 Subject: [PATCH] Synced src/battle_script_commands.c --- asm/macros/battle_script.inc | 14 +- charmap.txt | 4 +- data/battle_ai_scripts.s | 4 +- data/battle_anim_scripts.s | 64 +- data/battle_scripts_1.s | 34 +- ...{unk_battlebox.png => level_up_banner.png} | Bin graphics_file_rules.mk | 2 +- include/battle.h | 61 +- include/battle_anim.h | 4 +- include/battle_script_commands.h | 24 +- include/battle_scripts.h | 2 +- include/battle_string_ids.h | 208 +- include/battle_util.h | 44 +- include/constants/battle.h | 213 +- include/constants/battle_anim.h | 6 +- include/constants/battle_move_effects.h | 2 +- include/constants/battle_script_commands.h | 62 +- include/constants/items.h | 2 +- include/constants/pokemon.h | 51 +- include/graphics.h | 2 +- include/strings.h | 2 +- include/text.h | 7 +- include/window.h | 13 +- src/battle_ai_script_commands.c | 2 +- src/battle_anim.c | 6 +- src/battle_anim_effects_1.c | 66 +- src/battle_controller_oak_old_man.c | 2 +- src/battle_controllers.c | 2 +- src/battle_main.c | 28 +- src/battle_message.c | 41 +- src/battle_records.c | 2 +- src/battle_script_commands.c | 3152 ++++++++++------- src/battle_util.c | 18 +- src/berry_crush.c | 12 +- src/cable_club.c | 6 +- src/clear_save_data_screen.c | 2 +- src/credits.c | 2 +- src/data/battle_moves.h | 2 +- src/data/pokemon/tmhm_learnsets.h | 248 +- src/daycare.c | 4 +- src/dodrio_berry_picking.c | 2 +- src/dodrio_berry_picking_2.c | 4 +- src/easy_chat_3.c | 8 +- src/evolution_scene.c | 2 +- src/fame_checker.c | 4 +- src/field_screen_effect.c | 2 +- src/field_specials.c | 4 +- src/fldeff_flash.c | 2 +- src/graphics.c | 2 +- src/hall_of_fame.c | 14 +- src/help_system_util.c | 2 +- src/intro.c | 2 +- src/learn_move.c | 4 +- src/link.c | 6 +- src/link_rfu_2.c | 2 +- src/link_rfu_3.c | 2 +- src/mail.c | 4 +- src/main_menu.c | 6 +- src/map_name_popup.c | 2 +- src/map_preview_screen.c | 2 +- src/menu.c | 22 +- src/mevent_show_card.c | 2 +- src/mevent_show_news.c | 4 +- src/mystery_gift_menu.c | 2 +- src/naming_screen.c | 4 +- src/new_menu_helpers.c | 10 +- src/oak_speech.c | 18 +- src/option_menu.c | 6 +- src/pokemon.c | 10 +- src/pokemon_jump.c | 2 +- src/pokemon_special_anim_scene.c | 6 +- src/pokemon_storage_system_2.c | 4 +- src/pokemon_storage_system_5.c | 2 +- src/pokemon_storage_system_7.c | 2 +- src/quest_log.c | 2 +- src/region_map.c | 18 +- src/slot_machine.c | 6 +- src/start_menu.c | 2 +- src/strings.c | 82 +- src/text.c | 10 +- src/trade.c | 10 +- src/trade_scene.c | 10 +- src/trainer_card.c | 4 +- src/trainer_tower.c | 4 +- src/union_room_battle.c | 2 +- src/union_room_chat.c | 14 +- src/union_room_chat_display.c | 32 +- src/window.c | 2 +- src/window_8bpp.c | 2 +- src/wireless_communication_status_screen.c | 2 +- 90 files changed, 2734 insertions(+), 2058 deletions(-) rename graphics/battle_interface/{unk_battlebox.png => level_up_banner.png} (100%) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 1648883c9..678324275 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1259,8 +1259,8 @@ various \battler, VARIOUS_GET_MOVE_TARGET .endm - .macro various4 battler:req - various \battler, 4 + .macro getbattlerfainted battler:req + various \battler, VARIOUS_GET_BATTLER_FAINTED .endm .macro resetintimidatetracebits battler:req @@ -1271,8 +1271,8 @@ various \battler, VARIOUS_UPDATE_CHOICE_MOVE_ON_LVL_UP .endm - .macro various7 battler:req - various \battler, 7 + .macro resetplayerfainted battler:req + various \battler, VARIOUS_RESET_PLAYER_FAINTED .endm .macro various8 battler:req @@ -1288,11 +1288,11 @@ .endm .macro checkpokeflute battler:req - various \battler, 11 + various \battler, VARIOUS_CHECK_POKEFLUTE .endm .macro waitfanfare battler:req - various \battler, 12 + various \battler, VARIOUS_WAIT_FANFARE .endm @ helpful macros @@ -1301,7 +1301,7 @@ .endm .macro setmoveeffect effect:req - setbyte cEFFECT_CHOOSER \effect + setbyte cEFFECT_CHOOSER, \effect .endm .macro chosenstatus1animation battler:req, status:req diff --git a/charmap.txt b/charmap.txt index febef44e9..020580921 100644 --- a/charmap.txt +++ b/charmap.txt @@ -427,7 +427,7 @@ HIGHLIGHT = FC 02 @ same as fc 01 SHADOW = FC 03 @ same as fc 01 COLOR_HIGHLIGHT_SHADOW = FC 04 @ takes 3 bytes PALETTE = FC 05 @ used in credits -SIZE = FC 06 @ note that anything other than "SMALL" is invalid +SIZE = FC 06 @ note that anything other than "FONT_SMALL" is invalid RESET_SIZE = FC 07 PAUSE = FC 08 @ manually print the wait byte after this, havent mapped them PAUSE_UNTIL_PRESS = FC 09 @@ -449,7 +449,7 @@ RESUME_MUSIC = FC 18 @ font sizes -SMALL = FC 06 00 +FONT_SMALL = FC 06 00 BIG = FC 06 04 @ colors diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 7dcc2f7ed..85d043d41 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -737,7 +737,7 @@ AI_CheckViability:: if_effect EFFECT_PSYCH_UP, AI_CV_PsychUp if_effect EFFECT_MIRROR_COAT, AI_CV_MirrorCoat if_effect EFFECT_SKULL_BASH, AI_CV_ChargeUpMove - if_effect EFFECT_SOLARBEAM, AI_CV_ChargeUpMove + if_effect EFFECT_SOLAR_BEAM, AI_CV_ChargeUpMove if_effect EFFECT_SEMI_INVULNERABLE, AI_CV_SemiInvulnerable if_effect EFFECT_SOFTBOILED, AI_CV_Heal if_effect EFFECT_FAKE_OUT, AI_CV_FakeOut @@ -3097,7 +3097,7 @@ AI_HPAware_DiscouragedEffectsWhenLowHP:: .byte EFFECT_BELLY_DRUM .byte EFFECT_PSYCH_UP .byte EFFECT_MIRROR_COAT - .byte EFFECT_SOLARBEAM + .byte EFFECT_SOLAR_BEAM .byte EFFECT_ERUPTION .byte EFFECT_TICKLE .byte EFFECT_COSMIC_POWER diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index c9afc9b02..4acb190f7 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -5591,46 +5591,46 @@ SolarBeamAbsorbEffect:: return SolarBeamUnleash:: - call SetSolarbeamBg + call SetSolarBeamBg panse_1B SE_M_SOLAR_BEAM, 192, 63, 2, 0 - createvisualtask AnimTask_CreateSmallSolarbeamOrbs, 5, - createsprite gSolarbeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 0 + createvisualtask AnimTask_CreateSmallSolarBeamOrbs, 5, + createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 0 delay 4 - createsprite gSolarbeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 1 + createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 1 delay 4 createvisualtask AnimTask_BlendSelected, 10, 4, 1, 0, 10, RGB(25, 31, 0) - createsprite gSolarbeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 2 + createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 2 delay 4 createvisualtask AnimTask_ShakeMon2, 5, 1, 2, 0, 65, 1 - createsprite gSolarbeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 3 + createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 3 delay 4 - createsprite gSolarbeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 4 + createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 4 delay 4 - createsprite gSolarbeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 5 + createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 5 delay 4 - createsprite gSolarbeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 6 + createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 6 delay 4 call SolarBeamUnleash1 call SolarBeamUnleash1 waitforvisualfinish createvisualtask AnimTask_BlendSelected, 10, 4, 1, 10, 0, RGB(25, 31, 0) - call UnsetSolarbeamBg + call UnsetSolarBeamBg goto SolarBeamEnd SolarBeamUnleash1:: - createsprite gSolarbeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 0 + createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 0 delay 4 - createsprite gSolarbeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 1 + createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 1 delay 4 - createsprite gSolarbeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 2 + createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 2 delay 4 - createsprite gSolarbeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 3 + createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 3 delay 4 - createsprite gSolarbeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 4 + createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 4 delay 4 - createsprite gSolarbeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 5 + createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 5 delay 4 - createsprite gSolarbeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 6 + createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 6 delay 4 return @@ -10407,29 +10407,29 @@ UnsetSkyBg:: waitbgfadein return -SetSolarbeamBg:: +SetSolarBeamBg:: createvisualtask AnimTask_IsContest, 2, - jumpargeq 7, 1, SetSolarbeamBgContest + jumpargeq 7, 1, SetSolarBeamBgContest createvisualtask AnimTask_IsTargetPlayerSide, 2, - jumpargeq 7, 0, SetSolarbeamBgOpponent - goto SetSolarbeamBgPlayer -SetSolarbeamBgContinue:: + jumpargeq 7, 0, SetSolarBeamBgOpponent + goto SetSolarBeamBgPlayer +SetSolarBeamBgContinue:: waitbgfadein return -SetSolarbeamBgContest:: - fadetobg BG_SOLARBEAM_CONTESTS - goto SetSolarbeamBgContinue +SetSolarBeamBgContest:: + fadetobg BG_SOLAR_BEAM_CONTESTS + goto SetSolarBeamBgContinue -SetSolarbeamBgPlayer:: - fadetobg BG_SOLARBEAM_PLAYER - goto SetSolarbeamBgContinue +SetSolarBeamBgPlayer:: + fadetobg BG_SOLAR_BEAM_PLAYER + goto SetSolarBeamBgContinue -SetSolarbeamBgOpponent:: - fadetobg BG_SOLARBEAM_OPPONENT - goto SetSolarbeamBgContinue +SetSolarBeamBgOpponent:: + fadetobg BG_SOLAR_BEAM_OPPONENT + goto SetSolarBeamBgContinue -UnsetSolarbeamBg:: +UnsetSolarBeamBg:: restorebg waitbgfadein return diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 9a9d30349..cec621275 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -171,7 +171,7 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectFutureSight .4byte BattleScript_EffectGust .4byte BattleScript_EffectFlinchMinimizeHit - .4byte BattleScript_EffectSolarbeam + .4byte BattleScript_EffectSolarBeam .4byte BattleScript_EffectThunder .4byte BattleScript_EffectTeleport .4byte BattleScript_EffectBeatUp @@ -1703,7 +1703,7 @@ BattleScript_EffectBatonPass:: attackcanceler attackstring ppreduce - jumpifcantswitch BS_ATTACKER | ATK4F_DONT_CHECK_STATUSES, BattleScript_ButItFailed + jumpifcantswitch BS_ATTACKER | SWITCH_IGNORE_ESCAPE_PREVENTION, BattleScript_ButItFailed attackanimation waitanimation openpartyscreen BS_ATTACKER, BattleScript_ButItFailed @@ -1908,18 +1908,18 @@ BattleScript_EffectFlinchMinimizeHit:: setbyte sDMG_MULTIPLIER, 2 goto BattleScript_FlinchEffect -BattleScript_EffectSolarbeam:: - jumpifabilitypresent ABILITY_CLOUD_NINE, BattleScript_SolarbeamDecideTurn - jumpifabilitypresent ABILITY_AIR_LOCK, BattleScript_SolarbeamDecideTurn - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, 96, BattleScript_SolarbeamOnFirstTurn -BattleScript_SolarbeamDecideTurn:: +BattleScript_EffectSolarBeam:: + jumpifabilitypresent ABILITY_CLOUD_NINE, BattleScript_SolarBeamDecideTurn + jumpifabilitypresent ABILITY_AIR_LOCK, BattleScript_SolarBeamDecideTurn + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, 96, BattleScript_SolarBeamOnFirstTurn +BattleScript_SolarBeamDecideTurn:: jumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_TwoTurnMovesSecondTurn jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_NO_ATTACKSTRING, BattleScript_TwoTurnMovesSecondTurn setbyte sTWOTURN_STRINGID, 1 call BattleScriptFirstChargingTurn goto BattleScript_MoveEnd -BattleScript_SolarbeamOnFirstTurn:: +BattleScript_SolarBeamOnFirstTurn:: orword gHitMarker, HITMARKER_CHARGING setmoveeffect MOVE_EFFECT_CHARGING | MOVE_EFFECT_AFFECTS_USER seteffectprimary @@ -2862,7 +2862,7 @@ BattleScript_FaintedMonTryChooseAnother:: yesnobox jumpifbyte CMP_EQUAL, gBattleCommunication + 1, 1, BattleScript_FaintedMonChooseAnother setatktoplayer0 - openpartyscreen BS_ATTACKER | OPEN_PARTY_ALLOW_CANCEL, BattleScript_FaintedMonChooseAnother + openpartyscreen BS_ATTACKER | PARTY_SCREEN_OPTIONAL, BattleScript_FaintedMonChooseAnother switchhandleorder BS_ATTACKER, 2 jumpifbyte CMP_EQUAL, gBattleCommunication, 6, BattleScript_FaintedMonChooseAnother atknameinbuff1 @@ -2892,7 +2892,7 @@ BattleScript_FaintedMonChooseAnother:: hidepartystatussummary BS_FAINTED switchinanim BS_FAINTED, 0 waitstate - various7 BS_ATTACKER + resetplayerfainted BS_ATTACKER switchineffects BS_FAINTED jumpifbattletype BATTLE_TYPE_DOUBLE, BattleScript_FaintedMonEnd cancelallactions @@ -2900,10 +2900,10 @@ BattleScript_FaintedMonEnd:: end2 BattleScript_LinkBattleHandleFaint:: - openpartyscreen BS_UNKNOWN_5, BattleScript_LinkBattleHandleFaintStart + openpartyscreen BS_FAINTED_LINK_MULTIPLE_1, BattleScript_LinkBattleHandleFaintStart BattleScript_LinkBattleHandleFaintStart:: switchhandleorder BS_FAINTED, 0 - openpartyscreen BS_UNKNOWN_6, BattleScript_LinkBattleFaintedMonEnd + openpartyscreen BS_FAINTED_LINK_MULTIPLE_2, BattleScript_LinkBattleFaintedMonEnd switchhandleorder BS_FAINTED, 0 BattleScript_LinkBattleFaintedMonLoop:: switchhandleorder BS_FAINTED, 2 @@ -3112,7 +3112,7 @@ BattleScript_PursuitDmgOnSwitchOut:: waitmessage 0x40 tryfaintmon BS_TARGET, 0, NULL moveendfromto 3, 6 - various4 BS_TARGET + getbattlerfainted BS_TARGET jumpifbyte CMP_EQUAL, gBattleCommunication, 0, BattleScript_PursuitSwitchRivalSkip setbyte sGIVEEXP_STATE, 0 getexp BS_TARGET @@ -3182,7 +3182,7 @@ BattleScript_DamagingWeatherLoop:: jumpifword CMP_EQUAL, gBattleMoveDamage, NULL, BattleScript_DamagingWeatherContinuesEnd printfromtable gSandstormHailDmgStringIds waitmessage 0x40 - orword gHitMarker, HITMARKER_x20 | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE | HITMARKER_GRUDGE + orword gHitMarker, HITMARKER_SKIP_DMG_TRACK | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE | HITMARKER_GRUDGE effectivenesssound hitanimation BS_ATTACKER healthbarupdate BS_ATTACKER @@ -3194,7 +3194,7 @@ BattleScript_DamagingWeatherContinuesEnd:: addbyte gBattleCommunication, 1 jumpifbytenotequal gBattleCommunication, gBattlersCount, BattleScript_DamagingWeatherLoop BattleScript_WeatherDamageEndedBattle:: - bicword gHitMarker, HITMARKER_x20 | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE | HITMARKER_GRUDGE + bicword gHitMarker, HITMARKER_SKIP_DMG_TRACK | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE | HITMARKER_GRUDGE end2 BattleScript_SandStormHailEnds:: @@ -3678,7 +3678,7 @@ BattleScript_MoveUsedIsAsleep:: goto BattleScript_MoveEnd BattleScript_MoveUsedWokeUp:: - bicword gHitMarker, HITMARKER_x10 + bicword gHitMarker, HITMARKER_WAKE_UP_CLEAR printfromtable gWokeUpStringIds waitmessage 0x40 updatestatusicon BS_ATTACKER @@ -4355,7 +4355,7 @@ BattleScript_SelectingNotAllowedMoveChoiceItem:: printselectionstring STRINGID_ITEMALLOWSONLYYMOVE endselectionscript -BattleScript_HangedOnMsg:: +BattleScript_FocusBandActivates:: playanimation BS_TARGET, B_ANIM_HANGED_ON, NULL printstring STRINGID_PKMNHUNGONWITHX waitmessage 0x40 diff --git a/graphics/battle_interface/unk_battlebox.png b/graphics/battle_interface/level_up_banner.png similarity index 100% rename from graphics/battle_interface/unk_battlebox.png rename to graphics/battle_interface/level_up_banner.png diff --git a/graphics_file_rules.mk b/graphics_file_rules.mk index 8e5cd789f..7ac567281 100644 --- a/graphics_file_rules.mk +++ b/graphics_file_rules.mk @@ -153,7 +153,7 @@ $(UNUSEDGFXDIR)/color_frames.4bpp: %.4bpp: %.png $(BATINTGFXDIR)/unused_window2bar.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 5 -$(BATINTGFXDIR)/unk_battlebox.4bpp: %.4bpp: %.png +$(BATINTGFXDIR)/level_up_banner.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 36 $(BATINTGFXDIR)/window.gbapal: $(BATINTGFXDIR)/window1.gbapal $(BATINTGFXDIR)/window2.gbapal diff --git a/include/battle.h b/include/battle.h index 32bb401b3..7d513f934 100644 --- a/include/battle.h +++ b/include/battle.h @@ -4,6 +4,7 @@ #include #include "global.h" #include "constants/battle.h" +#include "constants/battle_script_commands.h" #include "battle_util.h" #include "battle_script_commands.h" #include "battle_main.h" @@ -23,18 +24,25 @@ #define GET_BATTLER_SIDE(battler)((GetBattlerPosition(battler) & BIT_SIDE)) #define GET_BATTLER_SIDE2(battler)((GET_BATTLER_POSITION(battler) & BIT_SIDE)) +// Used to exclude moves learned temporarily by Transform or Mimic +#define MOVE_IS_PERMANENT(battler, moveSlot) \ + (!(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) \ + && !(gDisableStructs[battler].mimickedMoves & gBitTable[moveSlot])) + #define TRAINER_OPPONENT_3FE 0x3FE #define TRAINER_OPPONENT_C00 0xC00 #define TRAINER_LINK_OPPONENT 0x800 #define SECRET_BASE_OPPONENT 0x400 +// Battle Actions +// These determine what each battler will do in a turn #define B_ACTION_USE_MOVE 0 #define B_ACTION_USE_ITEM 1 #define B_ACTION_SWITCH 2 #define B_ACTION_RUN 3 #define B_ACTION_SAFARI_WATCH_CAREFULLY 4 #define B_ACTION_SAFARI_BALL 5 -#define B_ACTION_SAFARI_BAIT 6 +#define B_ACTION_SAFARI_BAIT 6 #define B_ACTION_SAFARI_GO_NEAR 7 #define B_ACTION_SAFARI_RUN 8 #define B_ACTION_OLDMAN_THROW 9 @@ -47,26 +55,17 @@ #define MAX_TRAINER_ITEMS 4 -// array entries for battle communication -#define MULTIUSE_STATE 0x0 -#define CURSOR_POSITION 0x1 -#define TASK_ID 0x1 // task Id and cursor position share the same field -#define SPRITES_INIT_STATE1 0x1 // shares the Id as well -#define SPRITES_INIT_STATE2 0x2 -#define MOVE_EFFECT_BYTE 0x3 -#define ACTIONS_CONFIRMED_COUNT 0x4 -#define MULTISTRING_CHOOSER 0x5 -#define MSG_DISPLAY 0x7 -#define BATTLE_COMMUNICATION_ENTRIES_COUNT 0x8 +#define MOVE_TARGET_SELECTED 0 +#define MOVE_TARGET_DEPENDS (1 << 0) +#define MOVE_TARGET_USER_OR_SELECTED (1 << 1) +#define MOVE_TARGET_RANDOM (1 << 2) +#define MOVE_TARGET_BOTH (1 << 3) +#define MOVE_TARGET_USER (1 << 4) +#define MOVE_TARGET_FOES_AND_ALLY (1 << 5) +#define MOVE_TARGET_OPPONENTS_FIELD (1 << 6) -#define MOVE_TARGET_SELECTED 0x0 -#define MOVE_TARGET_DEPENDS 0x1 -#define MOVE_TARGET_USER_OR_SELECTED 0x2 -#define MOVE_TARGET_RANDOM 0x4 -#define MOVE_TARGET_BOTH 0x8 -#define MOVE_TARGET_USER 0x10 -#define MOVE_TARGET_FOES_AND_ALLY 0x20 -#define MOVE_TARGET_OPPONENTS_FIELD 0x40 +// For the second argument of GetMoveTarget, when no target override is needed +#define NO_TARGET_OVERRIDE 0 struct TrainerMonNoItemDefaultMoves { @@ -159,7 +158,7 @@ struct DisableStruct /*0x16*/ u8 isFirstTurn; /*0x17*/ u8 unk17; /*0x18*/ u8 truantCounter : 1; - /*0x18*/ u8 truantSwitchInHack : 1; // unused? + /*0x18*/ u8 truantSwitchInHack : 1; // Unused here, but used in pokeemerald /*0x18*/ u8 unk18_a_2 : 2; /*0x18*/ u8 mimickedMoves : 4; /*0x19*/ u8 rechargeTimer; @@ -455,17 +454,23 @@ struct BattleStruct extern struct BattleStruct *gBattleStruct; -#define GET_MOVE_TYPE(move, typeArg) \ -{ \ - if (gBattleStruct->dynamicMoveType) \ - typeArg = gBattleStruct->dynamicMoveType & 0x3F; \ - else \ - typeArg = gBattleMoves[move].type; \ +#define F_DYNAMIC_TYPE_1 (1 << 6) +#define F_DYNAMIC_TYPE_2 (1 << 7) +#define DYNAMIC_TYPE_MASK (F_DYNAMIC_TYPE_1 - 1) + +#define GET_MOVE_TYPE(move, typeArg) \ +{ \ + if (gBattleStruct->dynamicMoveType) \ + typeArg = gBattleStruct->dynamicMoveType & DYNAMIC_TYPE_MASK; \ + else \ + typeArg = gBattleMoves[move].type; \ } #define IS_TYPE_PHYSICAL(moveType)(moveType < TYPE_MYSTERY) #define IS_TYPE_SPECIAL(moveType)(moveType > TYPE_MYSTERY) + #define TARGET_TURN_DAMAGED ((gSpecialStatuses[gBattlerTarget].physicalDmg != 0 || gSpecialStatuses[gBattlerTarget].specialDmg != 0)) + #define IS_BATTLER_OF_TYPE(battlerId, type)((gBattleMons[battlerId].type1 == type || gBattleMons[battlerId].type2 == type)) #define SET_BATTLER_TYPE(battlerId, type) \ { \ @@ -504,7 +509,7 @@ struct BattleScripting u8 battleStyle; u8 drawlvlupboxState; u8 learnMoveState; - u8 field_20; + u8 pursuitDoublesAttacker; u8 reshowMainState; u8 reshowHelperState; u8 field_23; diff --git a/include/battle_anim.h b/include/battle_anim.h index 55a7b7f77..1919ba7d0 100644 --- a/include/battle_anim.h +++ b/include/battle_anim.h @@ -165,8 +165,8 @@ extern const union AnimCmd *const gMusicNotesAnimTable[]; extern const struct SpriteTemplate gThoughtBubbleSpriteTemplate; void AnimMovePowderParticle(struct Sprite *); void AnimPowerAbsorptionOrb(struct Sprite *); -void AnimSolarbeamBigOrb(struct Sprite *); -void AnimSolarbeamSmallOrb(struct Sprite *); +void AnimSolarBeamBigOrb(struct Sprite *); +void AnimSolarBeamSmallOrb(struct Sprite *); void AnimAbsorptionOrb(struct Sprite *); void AnimHyperBeamOrb(struct Sprite *); void AnimSporeParticle(struct Sprite *); diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index ab9209d78..709e77538 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -3,23 +3,21 @@ #include "global.h" -#define STAT_CHANGE_WORKED 0 -#define STAT_CHANGE_DIDNT_WORK 1 +// Arguments for 'flags' in HandleBattleWindow +#define WINDOW_CLEAR (1 << 0) +#define WINDOW_BG1 (1 << 7) -#define WINDOW_CLEAR 0x1 -#define WINDOW_x80 0x80 - -void SetMoveEffect(bool8 primary, u8 certain); -bool8 UproarWakeUpCheck(u8 battlerId); -u8 AI_TypeCalc(u16 move, u16 targetSpecies, u8 targetAbility); -u8 TypeCalc(u16 move, u8 attacker, u8 defender); void AI_CalcDmg(u8 attacker, u8 defender); -bool32 IsMonGettingExpSentOut(void); -void BattleCreateYesNoCursorAt(void); -void BattleDestroyYesNoCursorAt(void); -void HandleBattleWindow(u8 xStart, u8 yStart, u8 xEnd, u8 yEnd, u8 flags); +u8 TypeCalc(u16 move, u8 attacker, u8 defender); +u8 AI_TypeCalc(u16 move, u16 targetSpecies, u8 targetAbility); u8 GetBattlerTurnOrderNum(u8 battlerId); +void SetMoveEffect(bool8 primary, u8 certain); +bool32 IsMonGettingExpSentOut(void); +void BattleDestroyYesNoCursorAt(void); +void BattleCreateYesNoCursorAt(void); void BufferMoveToLearnIntoBattleTextBuff2(void); +void HandleBattleWindow(u8 xStart, u8 yStart, u8 xEnd, u8 yEnd, u8 flags); +bool8 UproarWakeUpCheck(u8 battlerId); extern void (* const gBattleScriptingCommandsTable[])(void); diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 080922775..ed2af35f7 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -197,7 +197,7 @@ extern const u8 BattleScript_BerryPPHealEnd2[]; extern const u8 BattleScript_ItemHealHP_End2[]; extern const u8 BattleScript_ItemHealHP_Ret[]; extern const u8 BattleScript_SelectingNotAllowedMoveChoiceItem[]; -extern const u8 BattleScript_HangedOnMsg[]; +extern const u8 BattleScript_FocusBandActivates[]; extern const u8 BattleScript_BerryConfuseHealEnd2[]; extern const u8 BattleScript_BerryStatRaiseEnd2[]; extern const u8 BattleScript_BerryFocusEnergyEnd2[]; diff --git a/include/battle_string_ids.h b/include/battle_string_ids.h index c78452622..76b0194fe 100644 --- a/include/battle_string_ids.h +++ b/include/battle_string_ids.h @@ -211,10 +211,10 @@ #define STRINGID_STATROSE 210 #define STRINGID_STATHARSHLY 211 #define STRINGID_STATFELL 212 -#define STRINGID_PKMNSSTATCHANGED 213 -#define STRINGID_PKMNSSTATCHANGED2 214 -#define STRINGID_PKMNSSTATCHANGED3 215 -#define STRINGID_PKMNSSTATCHANGED4 216 +#define STRINGID_ATTACKERSSTATROSE 213 +#define STRINGID_DEFENDERSSTATROSE 214 +#define STRINGID_ATTACKERSSTATFELL 215 +#define STRINGID_DEFENDERSSTATFELL 216 #define STRINGID_CRITICALHIT 217 #define STRINGID_ONEHITKO 218 #define STRINGID_123POOF 219 @@ -323,7 +323,7 @@ #define STRINGID_SOOTHINGAROMA 322 #define STRINGID_ITEMSCANTBEUSEDNOW 323 #define STRINGID_FORXCOMMAYZ 324 -#define STRINGID_USINGXTHEYOFZN 325 +#define STRINGID_USINGITEMSTATOFPKMNROSE 325 #define STRINGID_PKMNUSEDXTOGETPUMPED 326 #define STRINGID_PKMNSXMADEYUSELESS 327 #define STRINGID_PKMNTRAPPEDBYSANDTOMB 328 @@ -392,4 +392,202 @@ // and are instead handled explicitly by BufferStringBattle. #define BATTLESTRINGS_TABLE_START STRINGID_TRAINER1LOSETEXT +// The below IDs are all indexes into battle message tables, +// used to determine which of a set of messages to print. +// They are assigned to the MULTISTRING_CHOOSER byte of gBattleCommunication +// and read when e.g. the command printfromtable is used. + +// gStatUpStringIds +#define B_MSG_ATTACKER_STAT_ROSE 0 +#define B_MSG_DEFENDER_STAT_ROSE 1 +#define B_MSG_STAT_WONT_INCREASE 2 +#define B_MSG_STAT_ROSE_EMPTY 3 +#define B_MSG_STAT_ROSE_ITEM 4 +#define B_MSG_USED_DIRE_HIT 5 + +// gStatDownStringIds +#define B_MSG_ATTACKER_STAT_FELL 0 +#define B_MSG_DEFENDER_STAT_FELL 1 +#define B_MSG_STAT_WONT_DECREASE 2 +#define B_MSG_STAT_FELL_EMPTY 3 + +// gMissStringIds +#define B_MSG_MISSED 0 +#define B_MSG_PROTECTED 1 +#define B_MSG_AVOIDED_ATK 2 +#define B_MSG_AVOIDED_DMG 3 +#define B_MSG_GROUND_MISS 4 + +// gAbsorbDrainStringIds +#define B_MSG_ABSORB 0 +#define B_MSG_ABSORB_OOZE 1 + +// gLeechSeedStringIds +#define B_MSG_LEECH_SEED_SET 0 +#define B_MSG_LEECH_SEED_MISS 1 +#define B_MSG_LEECH_SEED_FAIL 2 +#define B_MSG_LEECH_SEED_DRAIN 3 +#define B_MSG_LEECH_SEED_OOZE 4 + +// gFirstTurnOfTwoStringIds +#define B_MSG_TURN1_RAZOR_WIND 0 +#define B_MSG_TURN1_SOLAR_BEAM 1 +#define B_MSG_TURN1_SKULL_BASH 2 +#define B_MSG_TURN1_SKY_ATTACK 3 +#define B_MSG_TURN1_FLY 4 +#define B_MSG_TURN1_DIG 5 +#define B_MSG_TURN1_DIVE 6 +#define B_MSG_TURN1_BOUNCE 7 + +// gMoveWeatherChangeStringIds +#define B_MSG_STARTED_RAIN 0 +#define B_MSG_STARTED_DOWNPOUR 1 +#define B_MSG_WEATHER_FAILED 2 +#define B_MSG_STARTED_SANDSTORM 3 +#define B_MSG_STARTED_SUNLIGHT 4 +#define B_MSG_STARTED_HAIL 5 + +// gRainContinuesStringIds +#define B_MSG_RAIN_CONTINUES 0 +#define B_MSG_DOWNPOUR_CONTINUES 1 +#define B_MSG_RAIN_STOPPED 2 + +// gSandStormHailContinuesStringIds / gSandStormHailDmgStringIds/ gSandStormHailEndStringIds +#define B_MSG_SANDSTORM 0 +#define B_MSG_HAIL 1 + +// gReflectLightScreenSafeguardStringIds +#define B_MSG_SIDE_STATUS_FAILED 0 +#define B_MSG_SET_REFLECT_SINGLE 1 +#define B_MSG_SET_REFLECT_DOUBLE 2 +#define B_MSG_SET_LIGHTSCREEN_SINGLE 3 +#define B_MSG_SET_LIGHTSCREEN_DOUBLE 4 +#define B_MSG_SET_SAFEGUARD 5 + +// gProtectLikeUsedStringIds +#define B_MSG_PROTECTED_ITSELF 0 +#define B_MSG_BRACED_ITSELF 1 +#define B_MSG_PROTECT_FAILED 2 + +// gRestUsedStringIds +#define B_MSG_REST 0 +#define B_MSG_REST_STATUSED 1 + +// gWokeUpStringIds +#define B_MSG_WOKE_UP 0 +#define B_MSG_WOKE_UP_UPROAR 1 + +// gUproarAwakeStringIds +#define B_MSG_CANT_SLEEP_UPROAR 0 +#define B_MSG_UPROAR_KEPT_AWAKE 1 +#define B_MSG_STAYED_AWAKE_USING 2 + +// gUproarOverTurnStringIds +#define B_MSG_UPROAR_CONTINUES 0 +#define B_MSG_UPROAR_ENDS 1 + +// gStockpileUsedStringIds +#define B_MSG_STOCKPILED 0 +#define B_MSG_CANT_STOCKPILE 1 + +// gSwallowFailStringIds +#define B_MSG_SWALLOW_FAILED 0 +#define B_MSG_SWALLOW_FULL_HP 1 + +// gKOFailedStringIds +#define B_MSG_KO_MISS 0 +#define B_MSG_KO_UNAFFECTED 1 + +// gMistUsedStringIds +#define B_MSG_SET_MIST 0 +#define B_MSG_MIST_FAILED 1 + +// gFocusEnergyUsedStringIds +#define B_MSG_GETTING_PUMPED 0 +#define B_MSG_FOCUS_ENERGY_FAILED 1 + +// gTransformUsedStringIds +#define B_MSG_TRANSFORMED 0 +#define B_MSG_TRANSFORM_FAILED 1 + +// gSubstituteUsedStringIds +#define B_MSG_SET_SUBSTITUTE 0 +#define B_MSG_SUBSTITUTE_FAILED 1 + +// gPartyStatusHealStringIds +#define B_MSG_BELL 0 +#define B_MSG_BELL_SOUNDPROOF_ATTACKER 1 +#define B_MSG_BELL_SOUNDPROOF_PARTNER 2 +#define B_MSG_BELL_BOTH_SOUNDPROOF 3 +#define B_MSG_SOOTHING_AROMA 4 + +// gFutureMoveUsedStringIds +#define B_MSG_FUTURE_SIGHT 0 +#define B_MSG_DOOM_DESIRE 1 + +// gItemSwapStringIds +#define B_MSG_ITEM_SWAP_TAKEN 0 +#define B_MSG_ITEM_SWAP_GIVEN 1 +#define B_MSG_ITEM_SWAP_BOTH 2 + +// gSportsUsedStringIds +#define B_MSG_WEAKEN_ELECTRIC 0 +#define B_MSG_WEAKEN_FIRE 1 + +// gCaughtMonStringIds +#define B_MSG_SENT_SOMEONES_PC 0 +#define B_MSG_SENT_BILLS_PC 1 +#define B_MSG_SOMEONES_BOX_FULL 2 +#define B_MSG_BILLS_BOX_FULL 3 + +// gInobedientStringIds +#define B_MSG_LOAFING 0 +#define B_MSG_WONT_OBEY 1 +#define B_MSG_TURNED_AWAY 2 +#define B_MSG_PRETEND_NOT_NOTICE 3 +#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 +#define B_MSG_CANT_GET_CLOSER 1 + +// gSafariPokeblockResultStringIds +#define B_MSG_MON_CURIOUS 0 +#define B_MSG_MON_ENTHRALLED 1 +#define B_MSG_MON_IGNORED 2 + +// gFlashFireStringIds +#define B_MSG_FLASH_FIRE_BOOST 0 +#define B_MSG_FLASH_FIRE_NO_BOOST 1 + +// gBerryEffectStringIds +#define B_MSG_CURED_PROBLEM 0 +#define B_MSG_NORMALIZED_STATUS 1 + +// gNoEscapeStringIds +#define B_MSG_CANT_ESCAPE 0 +#define B_MSG_DONT_LEAVE_BIRCH 1 +#define B_MSG_PREVENTS_ESCAPE 2 +#define B_MSG_CANT_ESCAPE_2 3 +#define B_MSG_ATTACKER_CANT_ESCAPE 4 + +// gGotPoisonedStringIds / gGotParalyzedStringIds / gFellAsleepStringIds +// gGotBurnedStringIds / gGotFrozenStringIds / gAttractUsedStringIds +#define B_MSG_STATUSED 0 +#define B_MSG_STATUSED_BY_ABILITY 1 + +// gBRNPreventionStringIds / gPRLZPreventionStringIds / gPSNPreventionStringIds +#define B_MSG_ABILITY_PREVENTS_MOVE_STATUS 0 +#define B_MSG_ABILITY_PREVENTS_ABILITY_STATUS 1 +#define B_MSG_STATUS_HAD_NO_EFFECT 2 + +// gGotDefrostedStringIds +#define B_MSG_DEFROSTED 0 +#define B_MSG_DEFROSTED_BY_MOVE 1 + +#define NUM_TRAPPING_MOVES 6 + #endif // GUARD_BATTLE_STRING_IDS_H diff --git a/include/battle_util.h b/include/battle_util.h index edec94444..cd0b1ab12 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -10,27 +10,29 @@ #define MOVE_LIMITATION_TAUNT (1 << 4) #define MOVE_LIMITATION_IMPRISON (1 << 5) -#define ABILITYEFFECT_ON_SWITCHIN 0x0 -#define ABILITYEFFECT_ENDTURN 0x1 -#define ABILITYEFFECT_MOVES_BLOCK 0x2 -#define ABILITYEFFECT_ABSORBING 0x3 -#define ABILITYEFFECT_MOVE_END 0x4 -#define ABILITYEFFECT_IMMUNITY 0x5 -#define ABILITYEFFECT_FORECAST 0x6 -#define ABILITYEFFECT_SYNCHRONIZE 0x7 -#define ABILITYEFFECT_ATK_SYNCHRONIZE 0x8 -#define ABILITYEFFECT_INTIMIDATE1 0x9 -#define ABILITYEFFECT_INTIMIDATE2 0xA -#define ABILITYEFFECT_TRACE 0xB -#define ABILITYEFFECT_CHECK_OTHER_SIDE 0xC -#define ABILITYEFFECT_CHECK_BATTLER_SIDE 0xD -#define ABILITYEFFECT_FIELD_SPORT 0xE -#define ABILITYEFFECT_CHECK_FIELD_EXCEPT_BATTLER 0xF // TODO: Is it correct? -#define ABILITYEFFECT_COUNT_OTHER_SIDE 0x10 -#define ABILITYEFFECT_COUNT_BATTLER_SIDE 0x11 -#define ABILITYEFFECT_COUNT_ON_FIELD 0x12 -#define ABILITYEFFECT_CHECK_ON_FIELD 0x13 -#define ABILITYEFFECT_SWITCH_IN_WEATHER 0xFF +#define ABILITYEFFECT_ON_SWITCHIN 0 +#define ABILITYEFFECT_ENDTURN 1 +#define ABILITYEFFECT_MOVES_BLOCK 2 +#define ABILITYEFFECT_ABSORBING 3 +#define ABILITYEFFECT_ON_DAMAGE 4 +#define ABILITYEFFECT_IMMUNITY 5 +#define ABILITYEFFECT_FORECAST 6 +#define ABILITYEFFECT_SYNCHRONIZE 7 +#define ABILITYEFFECT_ATK_SYNCHRONIZE 8 +#define ABILITYEFFECT_INTIMIDATE1 9 +#define ABILITYEFFECT_INTIMIDATE2 10 +#define ABILITYEFFECT_TRACE 11 +#define ABILITYEFFECT_CHECK_OTHER_SIDE 12 +#define ABILITYEFFECT_CHECK_BATTLER_SIDE 13 +#define ABILITYEFFECT_FIELD_SPORT 14 +#define ABILITYEFFECT_CHECK_FIELD_EXCEPT_BATTLER 15 +#define ABILITYEFFECT_COUNT_OTHER_SIDE 16 +#define ABILITYEFFECT_COUNT_BATTLER_SIDE 17 +#define ABILITYEFFECT_COUNT_ON_FIELD 18 +#define ABILITYEFFECT_CHECK_ON_FIELD 19 +#define ABILITYEFFECT_MUD_SPORT 253 +#define ABILITYEFFECT_WATER_SPORT 254 +#define ABILITYEFFECT_SWITCH_IN_WEATHER 255 #define ABILITY_ON_OPPOSING_FIELD(battlerId, abilityId)(AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, battlerId, abilityId, 0, 0)) #define ABILITY_ON_FIELD(abilityId)(AbilityBattleEffects(ABILITYEFFECT_CHECK_ON_FIELD, 0, abilityId, 0, 0)) diff --git a/include/constants/battle.h b/include/constants/battle.h index 2a3be269d..5cc0f3ed4 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -44,39 +44,39 @@ #define BIT_FLANK 2 // Battle Type Flags -#define BATTLE_TYPE_DOUBLE 0x0001 -#define BATTLE_TYPE_LINK 0x0002 -#define BATTLE_TYPE_IS_MASTER 0x0004 // In not-link battles, it's always set. -#define BATTLE_TYPE_TRAINER 0x0008 -#define BATTLE_TYPE_FIRST_BATTLE 0x0010 -#define BATTLE_TYPE_LINK_ESTABLISHED 0x0020 // Set when the link battle setup callback finishes. -#define BATTLE_TYPE_MULTI 0x0040 -#define BATTLE_TYPE_SAFARI 0x0080 -#define BATTLE_TYPE_BATTLE_TOWER 0x0100 -#define BATTLE_TYPE_OLD_MAN_TUTORIAL 0x0200 -#define BATTLE_TYPE_ROAMER 0x0400 -#define BATTLE_TYPE_EREADER_TRAINER 0x0800 -#define BATTLE_TYPE_KYOGRE_GROUDON 0x1000 -#define BATTLE_TYPE_LEGENDARY 0x2000 -#define BATTLE_TYPE_GHOST_UNVEILED 0x2000 // Re-use of BATTLE_TYPE_LEGENDARY, when combined with BATTLE_TYPE_GHOST -#define BATTLE_TYPE_REGI 0x4000 -#define BATTLE_TYPE_GHOST 0x8000 -#define BATTLE_TYPE_POKEDUDE 0x10000 -#define BATTLE_TYPE_WILD_SCRIPTED 0x20000 -#define BATTLE_TYPE_LEGENDARY_FRLG 0x40000 -#define BATTLE_TYPE_TRAINER_TOWER 0x80000 -#define BATTLE_TYPE_x100000 0x100000 -#define BATTLE_TYPE_x200000 0x200000 -#define BATTLE_TYPE_INGAME_PARTNER 0x400000 -#define BATTLE_TYPE_x800000 0x800000 -#define BATTLE_TYPE_RECORDED 0x1000000 -#define BATTLE_TYPE_x2000000 0x2000000 -#define BATTLE_TYPE_x4000000 0x4000000 -#define BATTLE_TYPE_SECRET_BASE 0x8000000 -#define BATTLE_TYPE_GROUDON 0x10000000 -#define BATTLE_TYPE_KYOGRE 0x20000000 -#define BATTLE_TYPE_RAYQUAZA 0x40000000 -#define BATTLE_TYPE_x80000000 0x80000000 +#define BATTLE_TYPE_DOUBLE (1 << 0) +#define BATTLE_TYPE_LINK (1 << 1) +#define BATTLE_TYPE_IS_MASTER (1 << 2) // In not-link battles, it's always set. +#define BATTLE_TYPE_TRAINER (1 << 3) +#define BATTLE_TYPE_FIRST_BATTLE (1 << 4) +#define BATTLE_TYPE_LINK_IN_BATTLE (1 << 5) // Set on battle entry, cleared on exit. Checked rarely +#define BATTLE_TYPE_MULTI (1 << 6) +#define BATTLE_TYPE_SAFARI (1 << 7) +#define BATTLE_TYPE_BATTLE_TOWER (1 << 8) +#define BATTLE_TYPE_OLD_MAN_TUTORIAL (1 << 9) // Used in pokeemerald as BATTLE_TYPE_WALLY_TUTORIAL. +#define BATTLE_TYPE_ROAMER (1 << 10) +#define BATTLE_TYPE_EREADER_TRAINER (1 << 11) +#define BATTLE_TYPE_KYOGRE_GROUDON (1 << 12) +#define BATTLE_TYPE_LEGENDARY (1 << 13) +#define BATTLE_TYPE_GHOST_UNVEILED (1 << 13) // Re-use of BATTLE_TYPE_LEGENDARY, when combined with BATTLE_TYPE_GHOST +#define BATTLE_TYPE_REGI (1 << 14) +#define BATTLE_TYPE_GHOST (1 << 15) // Used in pokeemerald as BATTLE_TYPE_TWO_OPPONENTS. +#define BATTLE_TYPE_POKEDUDE (1 << 16) // Used in pokeemerald as BATTLE_TYPE_DOME. +#define BATTLE_TYPE_WILD_SCRIPTED (1 << 17) // Used in pokeemerald as BATTLE_TYPE_PALACE. +#define BATTLE_TYPE_LEGENDARY_FRLG (1 << 18) // Used in pokeemerald as BATTLE_TYPE_ARENA. +#define BATTLE_TYPE_TRAINER_TOWER (1 << 19) // Used in pokeemerald as BATTLE_TYPE_FACTORY. +#define BATTLE_TYPE_PIKE (1 << 20) // Used in pokeemerald. +#define BATTLE_TYPE_PYRAMID (1 << 21) // Used in pokeemerald. +#define BATTLE_TYPE_INGAME_PARTNER (1 << 22) +#define BATTLE_TYPE_TOWER_LINK_MULTI (1 << 23) // Used in pokeemerald. +#define BATTLE_TYPE_RECORDED (1 << 24) +#define BATTLE_TYPE_RECORDED_LINK (1 << 25) // Used in pokeemerald. +#define BATTLE_TYPE_TRAINER_HILL (1 << 26) // Used in pokeemerald. +#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_RECORDED_IS_MASTER (1 << 31) // Used in pokeemerald. #define IS_BATTLE_TYPE_GHOST_WITHOUT_SCOPE(flags) ((flags) & BATTLE_TYPE_GHOST && !((flags) & BATTLE_TYPE_GHOST_UNVEILED)) #define IS_BATTLE_TYPE_GHOST_WITH_SCOPE(flags) ((flags) & BATTLE_TYPE_GHOST && (flags) & BATTLE_TYPE_GHOST_UNVEILED) @@ -85,54 +85,62 @@ #define RIVAL_BATTLE_TUTORIAL 3 // Battle Outcome defines -#define B_OUTCOME_WON 0x1 -#define B_OUTCOME_LOST 0x2 -#define B_OUTCOME_DREW 0x3 -#define B_OUTCOME_RAN 0x4 -#define B_OUTCOME_PLAYER_TELEPORTED 0x5 -#define B_OUTCOME_MON_FLED 0x6 -#define B_OUTCOME_CAUGHT 0x7 -#define B_OUTCOME_NO_SAFARI_BALLS 0x8 -#define B_OUTCOME_FORFEITED 0x9 -#define B_OUTCOME_MON_TELEPORTED 0xA -#define B_OUTCOME_LINK_BATTLE_RAN 0x80 +#define B_OUTCOME_WON 1 +#define B_OUTCOME_LOST 2 +#define B_OUTCOME_DREW 3 +#define B_OUTCOME_RAN 4 +#define B_OUTCOME_PLAYER_TELEPORTED 5 +#define B_OUTCOME_MON_FLED 6 +#define B_OUTCOME_CAUGHT 7 +#define B_OUTCOME_NO_SAFARI_BALLS 8 +#define B_OUTCOME_FORFEITED 9 +#define B_OUTCOME_MON_TELEPORTED 10 +#define B_OUTCOME_LINK_BATTLE_RAN (1 << 7) // 128 // Non-volatile status conditions // These persist remain outside of battle and after switching out -#define STATUS1_NONE 0x0 -#define STATUS1_SLEEP 0x7 -#define STATUS1_POISON 0x8 -#define STATUS1_BURN 0x10 -#define STATUS1_FREEZE 0x20 -#define STATUS1_PARALYSIS 0x40 -#define STATUS1_TOXIC_POISON 0x80 -#define STATUS1_TOXIC_COUNTER 0xF00 +#define STATUS1_NONE 0 +#define STATUS1_SLEEP (1 << 0 | 1 << 1 | 1 << 2) // First 3 bits (Number of turns to sleep) +#define STATUS1_SLEEP_TURN(num) ((num) << 0) // Just for readability (or if rearranging statuses) +#define STATUS1_POISON (1 << 3) +#define STATUS1_BURN (1 << 4) +#define STATUS1_FREEZE (1 << 5) +#define STATUS1_PARALYSIS (1 << 6) +#define STATUS1_TOXIC_POISON (1 << 7) +#define STATUS1_TOXIC_COUNTER (1 << 8 | 1 << 9 | 1 << 10 | 1 << 11) +#define STATUS1_TOXIC_TURN(num) ((num) << 8) #define STATUS1_PSN_ANY (STATUS1_POISON | STATUS1_TOXIC_POISON) #define STATUS1_ANY (STATUS1_SLEEP | STATUS1_POISON | STATUS1_BURN | STATUS1_FREEZE | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON) // Volatile status ailments // These are removed after exiting the battle or switching out -#define STATUS2_CONFUSION 0x00000007 -#define STATUS2_FLINCHED 0x00000008 -#define STATUS2_UPROAR 0x00000070 -#define STATUS2_BIDE 0x00000300 // two bits 0x100, 0x200 -#define STATUS2_LOCK_CONFUSE 0x00000C00 -#define STATUS2_MULTIPLETURNS 0x00001000 -#define STATUS2_WRAPPED 0x0000E000 -#define STATUS2_INFATUATION 0x000F0000 // 4 bits, one for every battler +#define STATUS2_CONFUSION (1 << 0 | 1 << 1 | 1 << 2) +#define STATUS2_CONFUSION_TURN(num) ((num) << 0) +#define STATUS2_FLINCHED (1 << 3) +#define STATUS2_UPROAR (1 << 4 | 1 << 5 | 1 << 6) +#define STATUS2_UPROAR_TURN(num) ((num) << 4) +#define STATUS2_UNUSED (1 << 7) +#define STATUS2_BIDE (1 << 8 | 1 << 9) +#define STATUS2_BIDE_TURN(num) (((num) << 8) & STATUS2_BIDE) +#define STATUS2_LOCK_CONFUSE (1 << 10 | 1 << 11) // e.g. Thrash +#define STATUS2_LOCK_CONFUSE_TURN(num)((num) << 10) +#define STATUS2_MULTIPLETURNS (1 << 12) +#define STATUS2_WRAPPED (1 << 13 | 1 << 14 | 1 << 15) +#define STATUS2_WRAPPED_TURN(num) ((num) << 13) +#define STATUS2_INFATUATION (1 << 16 | 1 << 17 | 1 << 18 | 1 << 19) // 4 bits, one for every battler #define STATUS2_INFATUATED_WITH(battler) (gBitTable[battler] << 16) -#define STATUS2_FOCUS_ENERGY 0x00100000 -#define STATUS2_TRANSFORMED 0x00200000 -#define STATUS2_RECHARGE 0x00400000 -#define STATUS2_RAGE 0x00800000 -#define STATUS2_SUBSTITUTE 0x01000000 -#define STATUS2_DESTINY_BOND 0x02000000 -#define STATUS2_ESCAPE_PREVENTION 0x04000000 -#define STATUS2_NIGHTMARE 0x08000000 -#define STATUS2_CURSED 0x10000000 -#define STATUS2_FORESIGHT 0x20000000 -#define STATUS2_DEFENSE_CURL 0x40000000 -#define STATUS2_TORMENT 0x80000000 +#define STATUS2_FOCUS_ENERGY (1 << 20) +#define STATUS2_TRANSFORMED (1 << 21) +#define STATUS2_RECHARGE (1 << 22) +#define STATUS2_RAGE (1 << 23) +#define STATUS2_SUBSTITUTE (1 << 24) +#define STATUS2_DESTINY_BOND (1 << 25) +#define STATUS2_ESCAPE_PREVENTION (1 << 26) +#define STATUS2_NIGHTMARE (1 << 27) +#define STATUS2_CURSED (1 << 28) +#define STATUS2_FORESIGHT (1 << 29) +#define STATUS2_DEFENSE_CURL (1 << 30) +#define STATUS2_TORMENT (1 << 31) // Seems like per-battler statuses. Not quite sure how to categorize these #define STATUS3_LEECHSEED_BATTLER (1 << 0 | 1 << 1) // The battler to receive HP from Leech Seed @@ -158,32 +166,32 @@ #define STATUS3_SEMI_INVULNERABLE (STATUS3_UNDERGROUND | STATUS3_ON_AIR | STATUS3_UNDERWATER) // Not really sure what a "hitmarker" is. -#define HITMARKER_x10 0x00000010 -#define HITMARKER_x20 0x00000020 -#define HITMARKER_DESTINYBOND 0x00000040 -#define HITMARKER_NO_ANIMATIONS 0x00000080 -#define HITMARKER_IGNORE_SUBSTITUTE 0x00000100 -#define HITMARKER_NO_ATTACKSTRING 0x00000200 -#define HITMARKER_ATTACKSTRING_PRINTED 0x00000400 -#define HITMARKER_NO_PPDEDUCT 0x00000800 -#define HITMARKER_SWAP_ATTACKER_TARGET 0x00001000 -#define HITMARKER_IGNORE_SAFEGUARD 0x00002000 -#define HITMARKER_SYNCHRONISE_EFFECT 0x00004000 -#define HITMARKER_RUN 0x00008000 -#define HITMARKER_IGNORE_ON_AIR 0x00010000 -#define HITMARKER_IGNORE_UNDERGROUND 0x00020000 -#define HITMARKER_IGNORE_UNDERWATER 0x00040000 -#define HITMARKER_UNABLE_TO_USE_MOVE 0x00080000 -#define HITMARKER_PASSIVE_DAMAGE 0x00100000 -#define HITMARKER_x200000 0x00200000 -#define HITMARKER_PLAYER_FAINTED 0x00400000 -#define HITMARKER_ALLOW_NO_PP 0x00800000 -#define HITMARKER_GRUDGE 0x01000000 -#define HITMARKER_OBEYS 0x02000000 -#define HITMARKER_x4000000 0x04000000 -#define HITMARKER_CHARGING 0x08000000 -#define HITMARKER_FAINTED(battler) (gBitTable[battler] << 0x1C) -#define HITMARKER_FAINTED2(battler) (0x10000000 << battler) +#define HITMARKER_WAKE_UP_CLEAR (1 << 4) // Cleared when waking up. Never set or checked. +#define HITMARKER_SKIP_DMG_TRACK (1 << 5) +#define HITMARKER_DESTINYBOND (1 << 6) +#define HITMARKER_NO_ANIMATIONS (1 << 7) +#define HITMARKER_IGNORE_SUBSTITUTE (1 << 8) +#define HITMARKER_NO_ATTACKSTRING (1 << 9) +#define HITMARKER_ATTACKSTRING_PRINTED (1 << 10) +#define HITMARKER_NO_PPDEDUCT (1 << 11) +#define HITMARKER_SWAP_ATTACKER_TARGET (1 << 12) +#define HITMARKER_IGNORE_SAFEGUARD (1 << 13) +#define HITMARKER_SYNCHRONISE_EFFECT (1 << 14) +#define HITMARKER_RUN (1 << 15) +#define HITMARKER_IGNORE_ON_AIR (1 << 16) +#define HITMARKER_IGNORE_UNDERGROUND (1 << 17) +#define HITMARKER_IGNORE_UNDERWATER (1 << 18) +#define HITMARKER_UNABLE_TO_USE_MOVE (1 << 19) +#define HITMARKER_PASSIVE_DAMAGE (1 << 20) +#define HITMARKER_DISOBEDIENT_MOVE (1 << 21) +#define HITMARKER_PLAYER_FAINTED (1 << 22) +#define HITMARKER_ALLOW_NO_PP (1 << 23) +#define HITMARKER_GRUDGE (1 << 24) +#define HITMARKER_OBEYS (1 << 25) +#define HITMARKER_NEVER_SET (1 << 26) // Cleared as part of a large group. Never set or checked +#define HITMARKER_CHARGING (1 << 27) +#define HITMARKER_FAINTED(battler) (gBitTable[battler] << 28) +#define HITMARKER_FAINTED2(battler) ((1 << 28) << battler) // Per-side statuses that affect an entire party #define SIDE_STATUS_REFLECT (1 << 0) @@ -219,7 +227,7 @@ #define B_WEATHER_SUN (B_WEATHER_SUN_TEMPORARY | B_WEATHER_SUN_PERMANENT) #define B_WEATHER_HAIL_TEMPORARY (1 << 7) #define B_WEATHER_HAIL (B_WEATHER_HAIL_TEMPORARY) -#define WEATHER_ANY (B_WEATHER_RAIN | B_WEATHER_SANDSTORM | B_WEATHER_SUN | B_WEATHER_HAIL) +#define B_WEATHER_ANY (B_WEATHER_RAIN | B_WEATHER_SANDSTORM | B_WEATHER_SUN | B_WEATHER_HAIL) // Move Effects #define MOVE_EFFECT_SLEEP 1 @@ -309,6 +317,13 @@ #define BATTLE_TERRAIN_LANCE 18 #define BATTLE_TERRAIN_CHAMPION 19 +#define CASTFORM_NORMAL 0 +#define CASTFORM_FIRE 1 +#define CASTFORM_WATER 2 +#define CASTFORM_ICE 3 +#define NUM_CASTFORM_FORMS 4 +#define CASTFORM_SUBSTITUTE (1 << 7) + // Return value for IsRunningFromBattleImpossible. #define BATTLE_RUN_SUCCESS 0 #define BATTLE_RUN_FORBIDDEN 1 diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index 80be08905..f8972ce31 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -342,9 +342,9 @@ #define BG_FISSURE 21 #define BG_BUG_OPPONENT 22 #define BG_BUG_PLAYER 23 -#define BG_SOLARBEAM_OPPONENT 24 -#define BG_SOLARBEAM_PLAYER 25 -#define BG_SOLARBEAM_CONTESTS 26 +#define BG_SOLAR_BEAM_OPPONENT 24 +#define BG_SOLAR_BEAM_PLAYER 25 +#define BG_SOLAR_BEAM_CONTESTS 26 // table ids for general animations #define B_ANIM_CASTFORM_CHANGE 0x0 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index b54f01353..5555eecb9 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -152,7 +152,7 @@ #define EFFECT_FUTURE_SIGHT 148 #define EFFECT_GUST 149 #define EFFECT_FLINCH_MINIMIZE_HIT 150 // STOMP ASTONISH EXTRASENSORY NEEDLE_ARM -#define EFFECT_SOLARBEAM 151 +#define EFFECT_SOLAR_BEAM 151 #define EFFECT_THUNDER 152 #define EFFECT_TELEPORT 153 #define EFFECT_BEAT_UP 154 diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index db2a0372b..6856f4bf8 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -30,8 +30,22 @@ #define sMULTIPLAYER_ID gBattleScripting + 0x25 #define sSPECIAL_TRAINER_BATTLE_TYPE gBattleScripting + 0x26 -#define cEFFECT_CHOOSER gBattleCommunication + 3 -#define cMULTISTRING_CHOOSER gBattleCommunication + 5 +// Array entries for battle communication +#define MULTIUSE_STATE 0 +#define CURSOR_POSITION 1 +#define TASK_ID 1 // task Id and cursor position share the same field +#define SPRITES_INIT_STATE1 1 // shares the Id as well +#define SPRITES_INIT_STATE2 2 +#define MOVE_EFFECT_BYTE 3 +#define ACTIONS_CONFIRMED_COUNT 4 +#define MULTISTRING_CHOOSER 5 +#define MISS_TYPE 6 +#define MSG_DISPLAY 7 +#define BATTLE_COMMUNICATION_ENTRIES_COUNT 8 + +#define cEFFECT_CHOOSER (gBattleCommunication + MOVE_EFFECT_BYTE) +#define cMULTISTRING_CHOOSER (gBattleCommunication + MULTISTRING_CHOOSER) +#define cMISS_TYPE (gBattleCommunication + MISS_TYPE) // Battle Script defines for getting the wanted battler #define BS_TARGET 0 @@ -39,8 +53,8 @@ #define BS_EFFECT_BATTLER 2 #define BS_FAINTED 3 #define BS_ATTACKER_WITH_PARTNER 4 // for Cmd_updatestatusicon -#define BS_UNKNOWN_5 5 // for openpartyscreen -#define BS_UNKNOWN_6 6 // for openpartyscreen +#define BS_FAINTED_LINK_MULTIPLE_1 5 // for openpartyscreen +#define BS_FAINTED_LINK_MULTIPLE_2 6 // for openpartyscreen #define BS_BATTLER_0 7 #define BS_ATTACKER_SIDE 8 // for Cmd_jumpifability #define BS_NOT_ATTACKER_SIDE 9 // for Cmd_jumpifability @@ -50,9 +64,6 @@ #define BS_PLAYER2 13 // for Cmd_updatestatusicon #define BS_OPPONENT2 14 -// used for openpartyscreen -#define OPEN_PARTY_ALLOW_CANCEL 0x80 - // atk 01, accuracy calc #define NO_ACC_CALC 0xFFFE #define NO_ACC_CALC_CHECK_LOCK_ON 0xFFFF @@ -72,23 +83,23 @@ #define VARIOUS_SET_MAGIC_COAT_TARGET 1 #define VARIOUS_IS_RUNNING_IMPOSSIBLE 2 #define VARIOUS_GET_MOVE_TARGET 3 -#define VARIOUS_CASE_4 4 +#define VARIOUS_GET_BATTLER_FAINTED 4 #define VARIOUS_RESET_INTIMIDATE_TRACE_BITS 5 #define VARIOUS_UPDATE_CHOICE_MOVE_ON_LVL_UP 6 -#define VARIOUS_RESET_PLAYER_FAINTED_FLAG 7 +#define VARIOUS_RESET_PLAYER_FAINTED 7 #define VARIOUS_CASE_8 8 #define VARIOUS_RETURN_OPPONENT_MON1 9 #define VARIOUS_RETURN_OPPONENT_MON2 10 #define VARIOUS_CHECK_POKEFLUTE 11 #define VARIOUS_WAIT_FANFARE 12 -// atk80, dmg manipulation -#define ATK80_DMG_CHANGE_SIGN 0 -#define ATK80_DMG_HALF_BY_TWO_NOT_MORE_THAN_HALF_MAX_HP 1 -#define ATK80_DMG_DOUBLED 2 +// Cmd_manipulatedmg +#define DMG_CHANGE_SIGN 0 +#define DMG_RECOIL_FROM_MISS 1 +#define DMG_DOUBLED 2 -// atk4F, a flag used for the jumpifcantswitch command -#define ATK4F_DONT_CHECK_STATUSES 0x80 +// Cmd_jumpifcantswitch +#define SWITCH_IGNORE_ESCAPE_PREVENTION (1 << 7) // Cmd_statbuffchange #define STAT_CHANGE_ALLOW_PTR (1 << 0) // If set, allow use of jumpptr. Set in every use of statbuffchange @@ -100,6 +111,18 @@ #define STAT_CHANGE_MULTIPLE_STATS (1 << 2) #define STAT_CHANGE_CANT_PREVENT (1 << 3) +// stat flags for Cmd_playstatchangeanimation +#define BIT_HP (1 << 0) +#define BIT_ATK (1 << 1) +#define BIT_DEF (1 << 2) +#define BIT_SPEED (1 << 3) +#define BIT_SPATK (1 << 4) +#define BIT_SPDEF (1 << 5) +#define BIT_ACC (1 << 6) +#define BIT_EVASION (1 << 7) + +#define PARTY_SCREEN_OPTIONAL (1 << 7) // Flag for first argument to openpartyscreen + // cases for Cmd_moveend #define MOVEEND_RAGE 0 #define MOVEEND_DEFROST 1 @@ -120,13 +143,4 @@ #define MOVEEND_NEXT_TARGET 16 #define MOVEEND_COUNT 17 -#define BIT_HP 0x1 -#define BIT_ATK 0x2 -#define BIT_DEF 0x4 -#define BIT_SPEED 0x8 -#define BIT_SPATK 0x10 -#define BIT_SPDEF 0x20 -#define BIT_ACC 0x40 -#define BIT_EVASION 0x80 - #endif // GUARD_CONSTANTS_BATTLE_SCRIPT_COMMANDS_H diff --git a/include/constants/items.h b/include/constants/items.h index fc1e008a0..4ee7e3014 100644 --- a/include/constants/items.h +++ b/include/constants/items.h @@ -372,7 +372,7 @@ #define ITEM_TM19_GIGA_DRAIN ITEM_TM19 #define ITEM_TM20_SAFEGUARD ITEM_TM20 #define ITEM_TM21_FRUSTRATION ITEM_TM21 -#define ITEM_TM22_SOLARBEAM ITEM_TM22 +#define ITEM_TM22_SOLAR_BEAM ITEM_TM22 #define ITEM_TM23_IRON_TAIL ITEM_TM23 #define ITEM_TM24_THUNDERBOLT ITEM_TM24 #define ITEM_TM25_THUNDER ITEM_TM25 diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 79024cf23..dbea7dff5 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -134,31 +134,32 @@ #define EGG_GROUPS_PER_MON 2 // Pokemon natures -#define NATURE_HARDY 0 -#define NATURE_LONELY 1 -#define NATURE_BRAVE 2 -#define NATURE_ADAMANT 3 -#define NATURE_NAUGHTY 4 -#define NATURE_BOLD 5 -#define NATURE_DOCILE 6 -#define NATURE_RELAXED 7 -#define NATURE_IMPISH 8 -#define NATURE_LAX 9 -#define NATURE_TIMID 10 -#define NATURE_HASTY 11 -#define NATURE_SERIOUS 12 -#define NATURE_JOLLY 13 -#define NATURE_NAIVE 14 -#define NATURE_MODEST 15 -#define NATURE_MILD 16 -#define NATURE_QUIET 17 -#define NATURE_BASHFUL 18 -#define NATURE_RASH 19 -#define NATURE_CALM 20 -#define NATURE_GENTLE 21 -#define NATURE_SASSY 22 -#define NATURE_CAREFUL 23 -#define NATURE_QUIRKY 24 +#define NATURE_HARDY 0 +#define NATURE_LONELY 1 +#define NATURE_BRAVE 2 +#define NATURE_ADAMANT 3 +#define NATURE_NAUGHTY 4 +#define NATURE_BOLD 5 +#define NATURE_DOCILE 6 +#define NATURE_RELAXED 7 +#define NATURE_IMPISH 8 +#define NATURE_LAX 9 +#define NATURE_TIMID 10 +#define NATURE_HASTY 11 +#define NATURE_SERIOUS 12 +#define NATURE_JOLLY 13 +#define NATURE_NAIVE 14 +#define NATURE_MODEST 15 +#define NATURE_MILD 16 +#define NATURE_QUIET 17 +#define NATURE_BASHFUL 18 +#define NATURE_RASH 19 +#define NATURE_CALM 20 +#define NATURE_GENTLE 21 +#define NATURE_SASSY 22 +#define NATURE_CAREFUL 23 +#define NATURE_QUIRKY 24 +#define NUM_NATURES 25 // Pokemon Stats #define STAT_HP 0 diff --git a/include/graphics.h b/include/graphics.h index ded24bd7b..4ddc0deea 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -4258,7 +4258,7 @@ extern const u32 gBattleAnimBgPalette_Sky[]; extern const u32 gBattleAnimBgPalette_Aurora[]; extern const u32 gBattleAnimBgPalette_Fissure[]; extern const u32 gBattleAnimBgPalette_Bug[]; -extern const u32 gBattleAnimBgPalette_Solarbeam[]; +extern const u32 gBattleAnimBgPalette_SolarBeam[]; extern const u32 gBattleAnimBgPalette_Surf[]; extern const u32 gBattleAnimBgTilemap_Dark[]; extern const u32 gBattleAnimBgTilemap_Ghost[]; diff --git a/include/strings.h b/include/strings.h index 02f773596..c7663fef9 100644 --- a/include/strings.h +++ b/include/strings.h @@ -188,7 +188,7 @@ extern const u8 gText_Ghost[]; // pokemon extern const u8 gBattleText_Rose[]; -extern const u8 gText_PkmnsStatChanged2[]; +extern const u8 gText_DefendersStatRose[]; extern const u8 gBattleText_GetPumped[]; extern const u8 gBattleText_MistShroud[]; extern const u8 gText_BadEgg[]; diff --git a/include/text.h b/include/text.h index e5ed4477d..1567c8d82 100644 --- a/include/text.h +++ b/include/text.h @@ -85,7 +85,7 @@ #define CHAR_DYNAMIC_PLACEHOLDER 0xF7 #define CHAR_KEYPAD_ICON 0xF8 -#define CHAR_EXTRA_EMOJI 0xF9 +#define CHAR_EXTRA_SYMBOL 0xF9 #define CHAR_PROMPT_SCROLL 0xFA // waits for button press and scrolls dialog #define CHAR_PROMPT_CLEAR 0xFB // waits for button press and clears dialog #define EXT_CTRL_CODE_BEGIN 0xFC // extended control code @@ -93,6 +93,9 @@ #define CHAR_NEWLINE 0xFE #define EOS 0xFF // end of string +// CHAR_EXTRA_SYMBOL chars +#define CHAR_LV_2 0x05 + #define TEXT_COLOR_TRANSPARENT 0x0 #define TEXT_COLOR_WHITE 0x1 #define TEXT_COLOR_DARK_GRAY 0x2 @@ -156,6 +159,8 @@ #define TEXT_SPEED_INSTANT 0 #define TEXT_SKIP_DRAW 0xFF +#define FONT_SMALL 0 + enum { FONTATTR_MAX_LETTER_WIDTH, diff --git a/include/window.h b/include/window.h index 1c3d9be9c..f64adce25 100644 --- a/include/window.h +++ b/include/window.h @@ -17,6 +17,14 @@ enum WINDOW_TILE_DATA }; +// Mode for CopyWindowToVram, CopyWindowRectToVram and CopyWindowToVram8Bit +enum { + COPYWIN_NONE, + COPYWIN_MAP, + COPYWIN_GFX, + COPYWIN_FULL, +}; + struct WindowTemplate { u8 bg; @@ -57,11 +65,6 @@ int AddWindowWithoutTileMap(const struct WindowTemplate *template); void RemoveWindow(u8 windowId); void FreeAllWindowBuffers(void); -// Mode parameter for funcs below -#define COPYWIN_MAP 1 -#define COPYWIN_GFX 2 -#define COPYWIN_BOTH 3 - void CopyWindowToVram(u8 windowId, u8 mode); void CopyWindowToVram8Bit(u8 windowId, u8 mode); diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index e14d6e965..eaa203a54 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -250,7 +250,7 @@ static const u16 sDiscouragedPowerfulMoveEffects[] = EFFECT_SKY_ATTACK, EFFECT_RECHARGE, EFFECT_SKULL_BASH, - EFFECT_SOLARBEAM, + EFFECT_SOLAR_BEAM, EFFECT_SPIT_UP, EFFECT_FOCUS_PUNCH, EFFECT_SUPERPOWER, diff --git a/src/battle_anim.c b/src/battle_anim.c index a77542edf..2154748df 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -1723,9 +1723,9 @@ const struct BattleAnimBackground gBattleAnimBackgroundTable[] = [BG_FISSURE] = {gBattleAnimBgImage_Fissure, gBattleAnimBgPalette_Fissure, gBattleAnimBgTilemap_Fissure}, [BG_BUG_OPPONENT] = {gBattleAnimBgImage_Highspeed, gBattleAnimBgPalette_Bug, gBattleAnimBgTilemap_HighspeedOpponent}, [BG_BUG_PLAYER] = {gBattleAnimBgImage_Highspeed, gBattleAnimBgPalette_Bug, gBattleAnimBgTilemap_HighspeedPlayer}, - [BG_SOLARBEAM_OPPONENT] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_Solarbeam, gBattleAnimBgTilemap_ImpactOpponent}, - [BG_SOLARBEAM_PLAYER] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_Solarbeam, gBattleAnimBgTilemap_ImpactPlayer}, - [BG_SOLARBEAM_CONTESTS] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_Solarbeam, gBattleAnimBgTilemap_ImpactContests}, + [BG_SOLAR_BEAM_OPPONENT] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_SolarBeam, gBattleAnimBgTilemap_ImpactOpponent}, + [BG_SOLAR_BEAM_PLAYER] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_SolarBeam, gBattleAnimBgTilemap_ImpactPlayer}, + [BG_SOLAR_BEAM_CONTESTS] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_SolarBeam, gBattleAnimBgTilemap_ImpactContests}, }; static void (*const sScriptCmdTable[])(void) = diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c index 5fdaad719..7b39b7095 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -12,7 +12,7 @@ EWRAM_DATA static s16 gUnknown_203999C[4] = {0}; // Function Declarations static void AnimMovePowderParticleStep(struct Sprite *); -static void AnimSolarbeamSmallOrbStep(struct Sprite *); +static void AnimSolarBeamSmallOrbStep(struct Sprite *); static void AnimAbsorptionOrbStep(struct Sprite *); static void AnimHyperBeamOrbStep(struct Sprite *); static void AnimLeechSeedStep(struct Sprite *); @@ -137,49 +137,49 @@ const struct SpriteTemplate gPoisonPowderParticleSpriteTemplate = .callback = AnimMovePowderParticle, }; -static const union AnimCmd sSolarbeamBigOrbAnimCmds1[] = +static const union AnimCmd sSolarBeamBigOrbAnimCmds1[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; -static const union AnimCmd sSolarbeamBigOrbAnimCmds2[] = +static const union AnimCmd sSolarBeamBigOrbAnimCmds2[] = { ANIMCMD_FRAME(1, 1), ANIMCMD_END, }; -static const union AnimCmd sSolarbeamBigOrbAnimCmds3[] = +static const union AnimCmd sSolarBeamBigOrbAnimCmds3[] = { ANIMCMD_FRAME(2, 1), ANIMCMD_END, }; -static const union AnimCmd sSolarbeamBigOrbAnimCmds4[] = +static const union AnimCmd sSolarBeamBigOrbAnimCmds4[] = { ANIMCMD_FRAME(3, 1), ANIMCMD_END, }; -static const union AnimCmd sSolarbeamBigOrbAnimCmds5[] = +static const union AnimCmd sSolarBeamBigOrbAnimCmds5[] = { ANIMCMD_FRAME(4, 1), ANIMCMD_END, }; -static const union AnimCmd sSolarbeamBigOrbAnimCmds6[] = +static const union AnimCmd sSolarBeamBigOrbAnimCmds6[] = { ANIMCMD_FRAME(5, 1), ANIMCMD_END, }; -static const union AnimCmd sSolarbeamBigOrbAnimCmds7[] = +static const union AnimCmd sSolarBeamBigOrbAnimCmds7[] = { ANIMCMD_FRAME(6, 1), ANIMCMD_END, }; -static const union AnimCmd sSolarbeamSmallOrbAnimCms[] = +static const union AnimCmd sSolarBeamSmallOrbAnimCms[] = { ANIMCMD_FRAME(7, 1), ANIMCMD_END, @@ -191,20 +191,20 @@ static const union AnimCmd sPowerAbsorptionOrbAnimCmds[] = ANIMCMD_END, }; -static const union AnimCmd *const sSolarbeamBigOrbAnimTable[] = +static const union AnimCmd *const sSolarBeamBigOrbAnimTable[] = { - sSolarbeamBigOrbAnimCmds1, - sSolarbeamBigOrbAnimCmds2, - sSolarbeamBigOrbAnimCmds3, - sSolarbeamBigOrbAnimCmds4, - sSolarbeamBigOrbAnimCmds5, - sSolarbeamBigOrbAnimCmds6, - sSolarbeamBigOrbAnimCmds7, + sSolarBeamBigOrbAnimCmds1, + sSolarBeamBigOrbAnimCmds2, + sSolarBeamBigOrbAnimCmds3, + sSolarBeamBigOrbAnimCmds4, + sSolarBeamBigOrbAnimCmds5, + sSolarBeamBigOrbAnimCmds6, + sSolarBeamBigOrbAnimCmds7, }; -static const union AnimCmd *const sSolarbeamSmallOrbAnimTable[] = +static const union AnimCmd *const sSolarBeamSmallOrbAnimTable[] = { - sSolarbeamSmallOrbAnimCms, + sSolarBeamSmallOrbAnimCms, }; static const union AnimCmd *const sPowerAbsorptionOrbAnimTable[] = @@ -234,26 +234,26 @@ const struct SpriteTemplate gPowerAbsorptionOrbSpriteTemplate = .callback = AnimPowerAbsorptionOrb, }; -const struct SpriteTemplate gSolarbeamBigOrbSpriteTemplate = +const struct SpriteTemplate gSolarBeamBigOrbSpriteTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_ORBS, .oam = &gOamData_AffineOff_ObjNormal_8x8, - .anims = sSolarbeamBigOrbAnimTable, + .anims = sSolarBeamBigOrbAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = AnimSolarbeamBigOrb, + .callback = AnimSolarBeamBigOrb, }; -const struct SpriteTemplate gSolarbeamSmallOrbSpriteTemplate = +const struct SpriteTemplate gSolarBeamSmallOrbSpriteTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_ORBS, .oam = &gOamData_AffineOff_ObjNormal_8x8, - .anims = sSolarbeamSmallOrbAnimTable, + .anims = sSolarBeamSmallOrbAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = AnimSolarbeamSmallOrb, + .callback = AnimSolarBeamSmallOrb, }; static const union AffineAnimCmd sStockpileAbsorptionOrbAffineCmds[] = @@ -306,7 +306,7 @@ const struct SpriteTemplate gHyperBeamOrbSpriteTemplate = .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_ORBS, .oam = &gOamData_AffineOff_ObjNormal_8x8, - .anims = sSolarbeamBigOrbAnimTable, + .anims = sSolarBeamBigOrbAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimHyperBeamOrb, @@ -2219,7 +2219,7 @@ void AnimPowerAbsorptionOrb(struct Sprite* sprite) // arg 1: initial y pixel offset // arg 2: duration // arg 3: sprite anim number -void AnimSolarbeamBigOrb(struct Sprite* sprite) +void AnimSolarBeamBigOrb(struct Sprite* sprite) { InitSpritePosToAnimAttacker(sprite, TRUE); StartSpriteAnim(sprite, gBattleAnimArgs[3]); @@ -2231,12 +2231,12 @@ void AnimSolarbeamBigOrb(struct Sprite* sprite) } // Moves a small orb in a wavy pattern towards the target mon. -// The small orb "circles" the big orbs in AnimSolarbeamBigOrb. +// The small orb "circles" the big orbs in AnimSolarBeamBigOrb. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: duration // arg 3: initial wave offset -void AnimSolarbeamSmallOrb(struct Sprite* sprite) +void AnimSolarBeamSmallOrb(struct Sprite* sprite) { InitSpritePosToAnimAttacker(sprite, TRUE); sprite->data[0] = gBattleAnimArgs[2]; @@ -2246,11 +2246,11 @@ void AnimSolarbeamSmallOrb(struct Sprite* sprite) sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); InitAnimLinearTranslation(sprite); sprite->data[5] = gBattleAnimArgs[3]; - sprite->callback = AnimSolarbeamSmallOrbStep; + sprite->callback = AnimSolarBeamSmallOrbStep; sprite->callback(sprite); } -static void AnimSolarbeamSmallOrbStep(struct Sprite* sprite) +static void AnimSolarBeamSmallOrbStep(struct Sprite* sprite) { if (AnimTranslateLinear(sprite)) { @@ -2272,7 +2272,7 @@ static void AnimSolarbeamSmallOrbStep(struct Sprite* sprite) // Creates 15 small secondary orbs used in the solarbeam anim effect. // There is a 7-frame delay between each of them. // No args. -void AnimTask_CreateSmallSolarbeamOrbs(u8 taskId) +void AnimTask_CreateSmallSolarBeamOrbs(u8 taskId) { if (--gTasks[taskId].data[0] == -1) { @@ -2282,7 +2282,7 @@ void AnimTask_CreateSmallSolarbeamOrbs(u8 taskId) gBattleAnimArgs[1] = 0; gBattleAnimArgs[2] = 80; gBattleAnimArgs[3] = 0; - CreateSpriteAndAnimate(&gSolarbeamSmallOrbSpriteTemplate, 0, 0, GetBattlerSpriteSubpriority(gBattleAnimTarget) + 1); + CreateSpriteAndAnimate(&gSolarBeamSmallOrbSpriteTemplate, 0, 0, GetBattlerSpriteSubpriority(gBattleAnimTarget) + 1); } if (gTasks[taskId].data[1] == 15) diff --git a/src/battle_controller_oak_old_man.c b/src/battle_controller_oak_old_man.c index f578c7136..6dfdf4213 100644 --- a/src/battle_controller_oak_old_man.c +++ b/src/battle_controller_oak_old_man.c @@ -1766,7 +1766,7 @@ static void OakOldManHandlePrintString(void) { switch (*stringId) { - case STRINGID_PKMNSSTATCHANGED4: + case STRINGID_DEFENDERSSTATFELL: if (!BtlCtrl_OakOldMan_TestState2Flag(FIRST_BATTLE_MSG_FLAG_STAT_CHG)) { BtlCtrl_OakOldMan_SetState2Flag(FIRST_BATTLE_MSG_FLAG_STAT_CHG); diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 1a7670c3c..5d13586be 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -487,7 +487,7 @@ void TryReceiveLinkBattleData(void) s32 j; u8 *recvBuffer; - if (gReceivedRemoteLinkPlayers && (gBattleTypeFlags & BATTLE_TYPE_LINK_ESTABLISHED) && (gLinkPlayers[0].linkType == 0x2211)) + if (gReceivedRemoteLinkPlayers && (gBattleTypeFlags & BATTLE_TYPE_LINK_IN_BATTLE) && (gLinkPlayers[0].linkType == 0x2211)) { LinkRfu_DestroyIdleTask(); for (i = 0; i < GetLinkPlayerCount(); ++i) diff --git a/src/battle_main.c b/src/battle_main.c index 2c2648e62..710463543 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -1051,7 +1051,7 @@ static void CB2_HandleStartBattle(void) SetMainCallback2(BattleMainCB2); if (gBattleTypeFlags & BATTLE_TYPE_LINK) { - gBattleTypeFlags |= BATTLE_TYPE_LINK_ESTABLISHED; + gBattleTypeFlags |= BATTLE_TYPE_LINK_IN_BATTLE; } } break; @@ -1409,7 +1409,7 @@ static void CB2_HandleStartMultiBattle(void) gMain.callback1 = BattleMainCB1; SetMainCallback2(BattleMainCB2); if (gBattleTypeFlags & BATTLE_TYPE_LINK) - gBattleTypeFlags |= BATTLE_TYPE_LINK_ESTABLISHED; + gBattleTypeFlags |= BATTLE_TYPE_LINK_IN_BATTLE; } break; case 5: @@ -2433,7 +2433,7 @@ static void BattleIntroGetMonsData(void) { case 0: gActiveBattler = gBattleCommunication[1]; - BtlController_EmitGetMonData(0, REQUEST_ALL_BATTLE, 0); + BtlController_EmitGetMonData(BUFFER_A, REQUEST_ALL_BATTLE, 0); MarkBattlerForControllerExec(gActiveBattler); ++gBattleCommunication[MULTIUSE_STATE]; break; @@ -2742,7 +2742,7 @@ static void Unused_AutoProgressToSwitchInAnims(void) { if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { - BtlController_EmitSwitchInAnim(0, gBattlerPartyIndexes[gActiveBattler], FALSE); + BtlController_EmitSwitchInAnim(BUFFER_A, gBattlerPartyIndexes[gActiveBattler], FALSE); MarkBattlerForControllerExec(gActiveBattler); } } @@ -3098,7 +3098,7 @@ static void HandleTurnActionSelectionState(void) *(gBattleStruct->battlerPartyIndexes + gActiveBattler) = gBattlerPartyIndexes[gActiveBattler]; if (gBattleMons[gActiveBattler].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION) || gStatuses3[gActiveBattler] & STATUS3_ROOTED) { - BtlController_EmitChoosePokemon(0, PARTY_ACTION_CANT_SWITCH, 6, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); + BtlController_EmitChoosePokemon(BUFFER_A, PARTY_ACTION_CANT_SWITCH, 6, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); } else if ((i = ABILITY_ON_OPPOSING_FIELD(gActiveBattler, ABILITY_SHADOW_TAG)) || ((i = ABILITY_ON_OPPOSING_FIELD(gActiveBattler, ABILITY_ARENA_TRAP)) @@ -3107,16 +3107,16 @@ static void HandleTurnActionSelectionState(void) || ((i = AbilityBattleEffects(ABILITYEFFECT_CHECK_FIELD_EXCEPT_BATTLER, gActiveBattler, ABILITY_MAGNET_PULL, 0, 0)) && IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_STEEL))) { - BtlController_EmitChoosePokemon(0, ((i - 1) << 4) | PARTY_ACTION_ABILITY_PREVENTS, 6, gLastUsedAbility, gBattleStruct->battlerPartyOrders[gActiveBattler]); + BtlController_EmitChoosePokemon(BUFFER_A, ((i - 1) << 4) | PARTY_ACTION_ABILITY_PREVENTS, 6, gLastUsedAbility, gBattleStruct->battlerPartyOrders[gActiveBattler]); } else { if (gActiveBattler == 2 && gChosenActionByBattler[0] == B_ACTION_SWITCH) - BtlController_EmitChoosePokemon(0, PARTY_ACTION_CHOOSE_MON, *(gBattleStruct->monToSwitchIntoId + 0), ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); + BtlController_EmitChoosePokemon(BUFFER_A, PARTY_ACTION_CHOOSE_MON, *(gBattleStruct->monToSwitchIntoId + 0), ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); else if (gActiveBattler == 3 && gChosenActionByBattler[1] == B_ACTION_SWITCH) - BtlController_EmitChoosePokemon(0, PARTY_ACTION_CHOOSE_MON, *(gBattleStruct->monToSwitchIntoId + 1), ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); + BtlController_EmitChoosePokemon(BUFFER_A, PARTY_ACTION_CHOOSE_MON, *(gBattleStruct->monToSwitchIntoId + 1), ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); else - BtlController_EmitChoosePokemon(0, PARTY_ACTION_CHOOSE_MON, 6, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); + BtlController_EmitChoosePokemon(BUFFER_A, PARTY_ACTION_CHOOSE_MON, 6, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); } MarkBattlerForControllerExec(gActiveBattler); break; @@ -3874,7 +3874,7 @@ static void HandleAction_UseMove(void) gBattleStruct->atkCancellerTracker = 0; gMoveResultFlags = 0; gMultiHitCounter = 0; - gBattleCommunication[6] = 0; + gBattleCommunication[MISS_TYPE] = 0; gCurrMovePos = gChosenMovePos = *(gBattleStruct->chosenMovePositions + gBattlerAttacker); // choose move if (gProtectStructs[gBattlerAttacker].noValidMoves) @@ -4344,8 +4344,8 @@ static void HandleAction_NothingIsFainted(void) gHitMarker &= ~(HITMARKER_DESTINYBOND | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_ATTACKSTRING_PRINTED | HITMARKER_NO_PPDEDUCT | HITMARKER_IGNORE_SAFEGUARD | HITMARKER_IGNORE_ON_AIR | HITMARKER_IGNORE_UNDERGROUND | HITMARKER_IGNORE_UNDERWATER | HITMARKER_PASSIVE_DAMAGE - | HITMARKER_OBEYS | HITMARKER_x10 | HITMARKER_SYNCHRONISE_EFFECT - | HITMARKER_CHARGING | HITMARKER_x4000000); + | HITMARKER_OBEYS | HITMARKER_WAKE_UP_CLEAR | HITMARKER_SYNCHRONISE_EFFECT + | HITMARKER_CHARGING | HITMARKER_NEVER_SET); } static void HandleAction_ActionFinished(void) @@ -4356,8 +4356,8 @@ static void HandleAction_ActionFinished(void) gHitMarker &= ~(HITMARKER_DESTINYBOND | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_ATTACKSTRING_PRINTED | HITMARKER_NO_PPDEDUCT | HITMARKER_IGNORE_SAFEGUARD | HITMARKER_IGNORE_ON_AIR | HITMARKER_IGNORE_UNDERGROUND | HITMARKER_IGNORE_UNDERWATER | HITMARKER_PASSIVE_DAMAGE - | HITMARKER_OBEYS | HITMARKER_x10 | HITMARKER_SYNCHRONISE_EFFECT - | HITMARKER_CHARGING | HITMARKER_x4000000); + | HITMARKER_OBEYS | HITMARKER_WAKE_UP_CLEAR | HITMARKER_SYNCHRONISE_EFFECT + | HITMARKER_CHARGING | HITMARKER_NEVER_SET); gCurrentMove = MOVE_NONE; gBattleMoveDamage = 0; gMoveResultFlags = 0; diff --git a/src/battle_message.c b/src/battle_message.c index 63911400d..3dde60f49 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -302,11 +302,11 @@ static const u8 sText_StatSharply[] = _("sharply "); const u8 gBattleText_Rose[] = _("rose!"); static const u8 sText_StatHarshly[] = _("harshly "); static const u8 sText_StatFell[] = _("fell!"); -static const u8 sText_PkmnsStatChanged[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1}\n{B_BUFF2}"); -const u8 gText_PkmnsStatChanged2[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1}\n{B_BUFF2}"); -static const u8 sText_UsingXTheYOfZN[] = _("Using {B_LAST_ITEM}, the {B_BUFF1}\nof {B_SCR_ACTIVE_NAME_WITH_PREFIX} {B_BUFF2}"); -static const u8 sText_PkmnsStatChanged3[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1}\n{B_BUFF2}"); -static const u8 sText_PkmnsStatChanged4[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1}\n{B_BUFF2}"); +static const u8 sText_AttackersStatRose[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1}\n{B_BUFF2}"); +const u8 gText_DefendersStatRose[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1}\n{B_BUFF2}"); +static const u8 sText_UsingItemTheStatOfPkmnRose[] = _("Using {B_LAST_ITEM}, the {B_BUFF1}\nof {B_SCR_ACTIVE_NAME_WITH_PREFIX} {B_BUFF2}"); +static const u8 sText_AttackersStatFell[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1}\n{B_BUFF2}"); +static const u8 sText_DefendersStatFell[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1}\n{B_BUFF2}"); static const u8 sText_StatsWontIncrease2[] = _("{B_ATK_NAME_WITH_PREFIX}'s stats won't\ngo any higher!"); static const u8 sText_StatsWontDecrease2[] = _("{B_DEF_NAME_WITH_PREFIX}'s stats won't\ngo any lower!"); static const u8 sText_CriticalHit[] = _("A critical hit!"); @@ -715,10 +715,10 @@ const u8 *const gBattleStringsTable[] = { [STRINGID_STATROSE - 12] = gBattleText_Rose, [STRINGID_STATHARSHLY - 12] = sText_StatHarshly, [STRINGID_STATFELL - 12] = sText_StatFell, - [STRINGID_PKMNSSTATCHANGED - 12] = sText_PkmnsStatChanged, - [STRINGID_PKMNSSTATCHANGED2 - 12] = gText_PkmnsStatChanged2, - [STRINGID_PKMNSSTATCHANGED3 - 12] = sText_PkmnsStatChanged3, - [STRINGID_PKMNSSTATCHANGED4 - 12] = sText_PkmnsStatChanged4, + [STRINGID_ATTACKERSSTATROSE - 12] = sText_AttackersStatRose, + [STRINGID_DEFENDERSSTATROSE - 12] = gText_DefendersStatRose, + [STRINGID_ATTACKERSSTATFELL - 12] = sText_AttackersStatFell, + [STRINGID_DEFENDERSSTATFELL - 12] = sText_DefendersStatFell, [STRINGID_CRITICALHIT - 12] = sText_CriticalHit, [STRINGID_ONEHITKO - 12] = sText_OneHitKO, [STRINGID_123POOF - 12] = sText_123Poof, @@ -827,7 +827,7 @@ const u8 *const gBattleStringsTable[] = { [STRINGID_SOOTHINGAROMA - 12] = sText_SoothingAroma, [STRINGID_ITEMSCANTBEUSEDNOW - 12] = sText_ItemsCantBeUsedNow, [STRINGID_FORXCOMMAYZ - 12] = sText_ForXCommaYZ, - [STRINGID_USINGXTHEYOFZN - 12] = sText_UsingXTheYOfZN, + [STRINGID_USINGITEMSTATOFPKMNROSE - 12] = sText_UsingItemTheStatOfPkmnRose, [STRINGID_PKMNUSEDXTOGETPUMPED - 12] = sText_PkmnUsedXToGetPumped, [STRINGID_PKMNSXMADEYUSELESS - 12] = sText_PkmnsXMadeYUseless, [STRINGID_PKMNTRAPPEDBYSANDTOMB - 12] = sText_PkmnTrappedBySandTomb, @@ -990,18 +990,19 @@ const u16 gUproarAwakeStringIds[] = { STRINGID_PKMNSTAYEDAWAKEUSING }; -const u16 gStatUpStringIds[] = { - STRINGID_PKMNSSTATCHANGED, - STRINGID_PKMNSSTATCHANGED2, - STRINGID_STATSWONTINCREASE, - STRINGID_EMPTYSTRING3, - STRINGID_USINGXTHEYOFZN, - STRINGID_PKMNUSEDXTOGETPUMPED +const u16 gStatUpStringIds[] = +{ + [B_MSG_ATTACKER_STAT_ROSE] = STRINGID_ATTACKERSSTATROSE, + [B_MSG_DEFENDER_STAT_ROSE] = STRINGID_DEFENDERSSTATROSE, + [B_MSG_STAT_WONT_INCREASE] = STRINGID_STATSWONTINCREASE, + [B_MSG_STAT_ROSE_EMPTY] = STRINGID_EMPTYSTRING3, + [B_MSG_STAT_ROSE_ITEM] = STRINGID_USINGITEMSTATOFPKMNROSE, + [B_MSG_USED_DIRE_HIT] = STRINGID_PKMNUSEDXTOGETPUMPED, }; const u16 gStatDownStringIds[] = { - STRINGID_PKMNSSTATCHANGED3, - STRINGID_PKMNSSTATCHANGED4, + STRINGID_ATTACKERSSTATFELL, + STRINGID_DEFENDERSSTATFELL, STRINGID_STATSWONTDECREASE, STRINGID_EMPTYSTRING3 }; @@ -2456,7 +2457,7 @@ void BattlePutTextOnWindow(const u8 *text, u8 windowId) { if (!(textFlags & 0x80)) { PutWindowTilemap(windowId); - CopyWindowToVram(windowId, COPYWIN_BOTH); + CopyWindowToVram(windowId, COPYWIN_FULL); } } diff --git a/src/battle_records.c b/src/battle_records.c index 2eb997717..33fbf89f1 100644 --- a/src/battle_records.c +++ b/src/battle_records.c @@ -557,7 +557,7 @@ static void PrintBattleRecords(void) static void CommitWindow(u8 windowId) { PutWindowTilemap(windowId); - CopyWindowToVram(windowId, COPYWIN_BOTH); + CopyWindowToVram(windowId, COPYWIN_FULL); } static void LoadFrameGfxOnBg(u8 bg) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 1cb0c16df..3b45edde4 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -38,7 +38,7 @@ #include "constants/pokemon.h" #include "constants/maps.h" -extern const u8 *const gBattleScriptsForMoveEffects[]; +extern const u8* const gBattleScriptsForMoveEffects[]; #define DEFENDER_IS_PROTECTED ((gProtectStructs[gBattlerTarget].protected) && (gBattleMoves[gCurrentMove].flags & FLAG_PROTECT_AFFECTED)) @@ -51,16 +51,15 @@ static bool8 IsTwoTurnsMove(u16 move); static void TrySetDestinyBondToHappen(void); static u8 AttacksThisTurn(u8 battlerId, u16 move); // Note: returns 1 if it's a charging turn, otherwise 2. static void CheckWonderGuardAndLevitate(void); -static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8, const u8 *BS_ptr); -static void sub_8026480(void); +static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8, const u8* BS_ptr); +static void InitLevelUpBanner(void); static bool8 SlideInLevelUpBanner(void); +static bool8 SlideOutLevelUpBanner(void); static void DrawLevelUpWindow1(void); static void DrawLevelUpWindow2(void); -static bool8 SlideOutLevelUpBanner(void); -static void PutMonIconOnLvlUpBox(void); +static void PutMonIconOnLvlUpBanner(void); static void DrawLevelUpBannerText(void); - -static void SpriteCB_MonIconOnLvlUpBanner(struct Sprite *sprite); +static void SpriteCB_MonIconOnLvlUpBanner(struct Sprite* sprite); static void Cmd_attackcanceler(void); static void Cmd_accuracycheck(void); @@ -662,8 +661,8 @@ static const struct WindowTemplate sUnusedWinTemplate = .baseBlock = 0x3F }; -static const u16 sLevelUpBanner_Pal[] = INCBIN_U16("graphics/battle_interface/unk_battlebox.gbapal"); -static const u32 sLevelUpBanner_Gfx[] = INCBIN_U32("graphics/battle_interface/unk_battlebox.4bpp.lz"); +static const u16 sLevelUpBanner_Pal[] = INCBIN_U16("graphics/battle_interface/level_up_banner.gbapal"); +static const u32 sLevelUpBanner_Gfx[] = INCBIN_U32("graphics/battle_interface/level_up_banner.4bpp.lz"); // unused static const u8 sRubyLevelUpStatBoxStats[] = @@ -815,7 +814,7 @@ static const u8 sBallCatchBonuses[] = [ITEM_SAFARI_BALL - ITEM_ULTRA_BALL] = 15 }; -// not used +// Not used. Maybe related to gBattlePalaceNatureToMoveGroupLikelihood from Emerald? static const u32 gUnknown_8250898 = 0xFF7EAE60; static void Cmd_attackcanceler(void) @@ -849,7 +848,7 @@ static void Cmd_attackcanceler(void) if (!(gHitMarker & HITMARKER_OBEYS) && !(gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) { - i = IsMonDisobedient(); + i = IsMonDisobedient(); // why use the 'i' variable...? switch (i) { case 0: @@ -873,6 +872,7 @@ static void Cmd_attackcanceler(void) gBattlescriptCurrInstr = BattleScript_MagicCoatBounce; return; } + for (i = 0; i < gBattlersCount; i++) { if ((gProtectStructs[gBattlerByTurnOrder[i]].stealMove) && gBattleMoves[gCurrentMove].flags & FLAG_SNATCH_AFFECTED) @@ -885,6 +885,7 @@ static void Cmd_attackcanceler(void) return; } } + if (gSpecialStatuses[gBattlerTarget].lightningRodRedirected) { gSpecialStatuses[gBattlerTarget].lightningRodRedirected = FALSE; @@ -901,7 +902,7 @@ static void Cmd_attackcanceler(void) gMoveResultFlags |= MOVE_RESULT_MISSED; gLastLandedMoves[gBattlerTarget] = 0; gLastHitByType[gBattlerTarget] = 0; - gBattleCommunication[6] = 1; + gBattleCommunication[MISS_TYPE] = B_MSG_PROTECTED; gBattlescriptCurrInstr++; } else @@ -934,7 +935,7 @@ static void Cmd_jumpifaffectedbyprotect(void) { gMoveResultFlags |= MOVE_RESULT_MISSED; JumpIfMoveFailed(5, 0); - gBattleCommunication[6] = 1; + gBattleCommunication[MISS_TYPE] = B_MSG_PROTECTED; } else { @@ -949,7 +950,7 @@ static bool8 JumpIfMoveAffectedByProtect(u16 move) { gMoveResultFlags |= MOVE_RESULT_MISSED; JumpIfMoveFailed(7, move); - gBattleCommunication[6] = 1; + gBattleCommunication[MISS_TYPE] = B_MSG_PROTECTED; affected = TRUE; } return affected; @@ -1034,9 +1035,14 @@ static void Cmd_accuracycheck(void) if (move == ACC_CURR_MOVE) move = gCurrentMove; + GET_MOVE_TYPE(move, type); - if (JumpIfMoveAffectedByProtect(move) || AccuracyCalcHelper(move)) + + if (JumpIfMoveAffectedByProtect(move)) return; + if (AccuracyCalcHelper(move)) + return; + if (gBattleMons[gBattlerTarget].status2 & STATUS2_FORESIGHT) { u8 acc = gBattleMons[gBattlerAttacker].statStages[STAT_ACC]; @@ -1083,15 +1089,17 @@ static void Cmd_accuracycheck(void) if (holdEffect == HOLD_EFFECT_EVASION_UP) calc = (calc * (100 - param)) / 100; + // final calculation if ((Random() % 100 + 1) > calc) { gMoveResultFlags |= MOVE_RESULT_MISSED; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && (gBattleMoves[move].target == MOVE_TARGET_BOTH || gBattleMoves[move].target == MOVE_TARGET_FOES_AND_ALLY)) - gBattleCommunication[6] = 2; + gBattleCommunication[MISS_TYPE] = B_MSG_AVOIDED_ATK; else - gBattleCommunication[6] = 0; + gBattleCommunication[MISS_TYPE] = B_MSG_MISSED; + CheckWonderGuardAndLevitate(); } JumpIfMoveFailed(7, move); @@ -1100,61 +1108,64 @@ static void Cmd_accuracycheck(void) static void Cmd_attackstring(void) { - if (gBattleControllerExecFlags == 0) + if (gBattleControllerExecFlags) + return; + + if (!(gHitMarker & (HITMARKER_NO_ATTACKSTRING | HITMARKER_ATTACKSTRING_PRINTED))) { - if (!(gHitMarker & (HITMARKER_NO_ATTACKSTRING | HITMARKER_ATTACKSTRING_PRINTED))) - { - PrepareStringBattle(STRINGID_USEDMOVE, gBattlerAttacker); - gHitMarker |= HITMARKER_ATTACKSTRING_PRINTED; - } - gBattlescriptCurrInstr++; - gBattleCommunication[MSG_DISPLAY] = 0; + PrepareStringBattle(STRINGID_USEDMOVE, gBattlerAttacker); + gHitMarker |= HITMARKER_ATTACKSTRING_PRINTED; } + gBattlescriptCurrInstr++; + gBattleCommunication[MSG_DISPLAY] = 0; } static void Cmd_ppreduce(void) { s32 ppToDeduct = 1; - if (gBattleControllerExecFlags == 0) + if (gBattleControllerExecFlags) + return; + + if (!gSpecialStatuses[gBattlerAttacker].ppNotAffectedByPressure) { - if (!gSpecialStatuses[gBattlerAttacker].ppNotAffectedByPressure) + switch (gBattleMoves[gCurrentMove].target) { - switch (gBattleMoves[gCurrentMove].target) - { - case MOVE_TARGET_FOES_AND_ALLY: - ppToDeduct += AbilityBattleEffects(ABILITYEFFECT_COUNT_ON_FIELD, gBattlerAttacker, ABILITY_PRESSURE, 0, 0); - break; - case MOVE_TARGET_BOTH: - case MOVE_TARGET_OPPONENTS_FIELD: - ppToDeduct += AbilityBattleEffects(ABILITYEFFECT_COUNT_OTHER_SIDE, gBattlerAttacker, ABILITY_PRESSURE, 0, 0); - break; - default: - if (gBattlerAttacker != gBattlerTarget && gBattleMons[gBattlerTarget].ability == ABILITY_PRESSURE) - ppToDeduct++; - break; - } + case MOVE_TARGET_FOES_AND_ALLY: + ppToDeduct += AbilityBattleEffects(ABILITYEFFECT_COUNT_ON_FIELD, gBattlerAttacker, ABILITY_PRESSURE, 0, 0); + break; + case MOVE_TARGET_BOTH: + case MOVE_TARGET_OPPONENTS_FIELD: + ppToDeduct += AbilityBattleEffects(ABILITYEFFECT_COUNT_OTHER_SIDE, gBattlerAttacker, ABILITY_PRESSURE, 0, 0); + break; + default: + if (gBattlerAttacker != gBattlerTarget && gBattleMons[gBattlerTarget].ability == ABILITY_PRESSURE) + ppToDeduct++; + break; } - if (!(gHitMarker & (HITMARKER_NO_PPDEDUCT | HITMARKER_NO_ATTACKSTRING)) && gBattleMons[gBattlerAttacker].pp[gCurrMovePos]) - { - gProtectStructs[gBattlerAttacker].notFirstStrike = 1; - - if (gBattleMons[gBattlerAttacker].pp[gCurrMovePos] > ppToDeduct) - gBattleMons[gBattlerAttacker].pp[gCurrMovePos] -= ppToDeduct; - else - gBattleMons[gBattlerAttacker].pp[gCurrMovePos] = 0; - - if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_TRANSFORMED) - && !((gDisableStructs[gBattlerAttacker].mimickedMoves) & gBitTable[gCurrMovePos])) - { - gActiveBattler = gBattlerAttacker; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_PPMOVE1_BATTLE + gCurrMovePos, 0, 1, &gBattleMons[gBattlerAttacker].pp[gCurrMovePos]); - MarkBattlerForControllerExec(gBattlerAttacker); - } - } - gHitMarker &= ~(HITMARKER_NO_PPDEDUCT); - gBattlescriptCurrInstr++; } + + if (!(gHitMarker & (HITMARKER_NO_PPDEDUCT | HITMARKER_NO_ATTACKSTRING)) && gBattleMons[gBattlerAttacker].pp[gCurrMovePos]) + { + gProtectStructs[gBattlerAttacker].notFirstStrike = 1; + + if (gBattleMons[gBattlerAttacker].pp[gCurrMovePos] > ppToDeduct) + gBattleMons[gBattlerAttacker].pp[gCurrMovePos] -= ppToDeduct; + else + gBattleMons[gBattlerAttacker].pp[gCurrMovePos] = 0; + + if (MOVE_IS_PERMANENT(gBattlerAttacker, gCurrMovePos)) + { + gActiveBattler = gBattlerAttacker; + BtlController_EmitSetMonData(BUFFER_A, REQUEST_PPMOVE1_BATTLE + gCurrMovePos, 0, + sizeof(gBattleMons[gBattlerAttacker].pp[gCurrMovePos]), + &gBattleMons[gBattlerAttacker].pp[gCurrMovePos]); + MarkBattlerForControllerExec(gBattlerAttacker); + } + } + + gHitMarker &= ~HITMARKER_NO_PPDEDUCT; + gBattlescriptCurrInstr++; } static void Cmd_critcalc(void) @@ -1163,11 +1174,14 @@ static void Cmd_critcalc(void) u16 item, critChance; item = gBattleMons[gBattlerAttacker].item; + if (item == ITEM_ENIGMA_BERRY) holdEffect = gEnigmaBerries[gBattlerAttacker].holdEffect; else holdEffect = ItemId_GetHoldEffect(item); + gPotentialItemEffectBattler = gBattlerAttacker; + critChance = 2 * ((gBattleMons[gBattlerAttacker].status2 & STATUS2_FOCUS_ENERGY) != 0) + (gBattleMoves[gCurrentMove].effect == EFFECT_HIGH_CRITICAL) + (gBattleMoves[gCurrentMove].effect == EFFECT_SKY_ATTACK) @@ -1176,8 +1190,10 @@ static void Cmd_critcalc(void) + (holdEffect == HOLD_EFFECT_SCOPE_LENS) + 2 * (holdEffect == HOLD_EFFECT_LUCKY_PUNCH && gBattleMons[gBattlerAttacker].species == SPECIES_CHANSEY) + 2 * (holdEffect == HOLD_EFFECT_STICK && gBattleMons[gBattlerAttacker].species == SPECIES_FARFETCHD); - if (critChance >= NELEMS(sCriticalHitChance)) - critChance = NELEMS(sCriticalHitChance) - 1; + + if (critChance >= ARRAY_COUNT(sCriticalHitChance)) + critChance = ARRAY_COUNT(sCriticalHitChance) - 1; + if ((gBattleMons[gBattlerTarget].ability != ABILITY_BATTLE_ARMOR && gBattleMons[gBattlerTarget].ability != ABILITY_SHELL_ARMOR) && !(gStatuses3[gBattlerAttacker] & STATUS3_CANT_SCORE_A_CRIT) && !(gBattleTypeFlags & BATTLE_TYPE_OLD_MAN_TUTORIAL) @@ -1187,54 +1203,47 @@ static void Cmd_critcalc(void) gCritMultiplier = 2; else gCritMultiplier = 1; + gBattlescriptCurrInstr++; } static void Cmd_damagecalc(void) { u16 sideStatus = gSideStatuses[GET_BATTLER_SIDE(gBattlerTarget)]; - - gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBattlerAttacker], - &gBattleMons[gBattlerTarget], - gCurrentMove, - sideStatus, - gDynamicBasePower, - gBattleStruct->dynamicMoveType, - gBattlerAttacker, - gBattlerTarget); + gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBattlerAttacker], &gBattleMons[gBattlerTarget], gCurrentMove, + sideStatus, gDynamicBasePower, + gBattleStruct->dynamicMoveType, gBattlerAttacker, gBattlerTarget); gBattleMoveDamage = gBattleMoveDamage * gCritMultiplier * gBattleScripting.dmgMultiplier; + if (gStatuses3[gBattlerAttacker] & STATUS3_CHARGED_UP && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC) gBattleMoveDamage *= 2; if (gProtectStructs[gBattlerAttacker].helpingHand) gBattleMoveDamage = gBattleMoveDamage * 15 / 10; + gBattlescriptCurrInstr++; } void AI_CalcDmg(u8 attacker, u8 defender) { u16 sideStatus = gSideStatuses[GET_BATTLER_SIDE(defender)]; - - gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[attacker], - &gBattleMons[defender], - gCurrentMove, - sideStatus, - gDynamicBasePower, - gBattleStruct->dynamicMoveType, - attacker, - defender); + gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[attacker], &gBattleMons[defender], gCurrentMove, + sideStatus, gDynamicBasePower, + gBattleStruct->dynamicMoveType, attacker, defender); gDynamicBasePower = 0; gBattleMoveDamage = gBattleMoveDamage * gCritMultiplier * gBattleScripting.dmgMultiplier; + if (gStatuses3[attacker] & STATUS3_CHARGED_UP && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC) gBattleMoveDamage *= 2; if (gProtectStructs[attacker].helpingHand) gBattleMoveDamage = gBattleMoveDamage * 15 / 10; } -void ModulateDmgByType(u8 multiplier) +static void ModulateDmgByType(u8 multiplier) { gBattleMoveDamage = gBattleMoveDamage * multiplier / 10; - if (gBattleMoveDamage == 0 && multiplier) + if (gBattleMoveDamage == 0 && multiplier != 0) gBattleMoveDamage = 1; + switch (multiplier) { case TYPE_MUL_NO_EFFECT: @@ -1273,7 +1282,9 @@ static void Cmd_typecalc(void) gBattlescriptCurrInstr++; return; } + GET_MOVE_TYPE(gCurrentMove, moveType); + // check stab if (IS_BATTLER_OF_TYPE(gBattlerAttacker, moveType)) { @@ -1287,7 +1298,7 @@ static void Cmd_typecalc(void) gMoveResultFlags |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE); gLastLandedMoves[gBattlerTarget] = 0; gLastHitByType[gBattlerTarget] = 0; - gBattleCommunication[6] = moveType; + gBattleCommunication[MISS_TYPE] = B_MSG_GROUND_MISS; RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); } else @@ -1314,6 +1325,7 @@ static void Cmd_typecalc(void) i += 3; } } + if (gBattleMons[gBattlerTarget].ability == ABILITY_WONDER_GUARD && AttacksThisTurn(gBattlerAttacker, gCurrentMove) == 2 && (!(gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE) || ((gMoveResultFlags & (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)) == (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE))) && gBattleMoves[gCurrentMove].power) @@ -1322,11 +1334,12 @@ static void Cmd_typecalc(void) gMoveResultFlags |= MOVE_RESULT_MISSED; gLastLandedMoves[gBattlerTarget] = 0; gLastHitByType[gBattlerTarget] = 0; - gBattleCommunication[6] = 3; + gBattleCommunication[MISS_TYPE] = B_MSG_AVOIDED_DMG; RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); } if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) gProtectStructs[gBattlerAttacker].targetNotAffected = 1; + gBattlescriptCurrInstr++; } @@ -1338,14 +1351,17 @@ static void CheckWonderGuardAndLevitate(void) if (gCurrentMove == MOVE_STRUGGLE || !gBattleMoves[gCurrentMove].power) return; + GET_MOVE_TYPE(gCurrentMove, moveType); + if (gBattleMons[gBattlerTarget].ability == ABILITY_LEVITATE && moveType == TYPE_GROUND) { gLastUsedAbility = ABILITY_LEVITATE; - gBattleCommunication[6] = moveType; + gBattleCommunication[MISS_TYPE] = B_MSG_GROUND_MISS; RecordAbilityBattle(gBattlerTarget, ABILITY_LEVITATE); return; } + while (TYPE_EFFECT_ATK_TYPE(i) != TYPE_ENDTABLE) { if (TYPE_EFFECT_ATK_TYPE(i) == TYPE_FORESIGHT) @@ -1355,7 +1371,6 @@ static void CheckWonderGuardAndLevitate(void) i += 3; continue; } - if (TYPE_EFFECT_ATK_TYPE(i) == moveType) { // check no effect @@ -1372,6 +1387,7 @@ static void CheckWonderGuardAndLevitate(void) gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE; gProtectStructs[gBattlerAttacker].targetNotAffected = 1; } + // check super effective if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type1 && TYPE_EFFECT_MULTIPLIER(i) == 20) flags |= 1; @@ -1379,6 +1395,7 @@ static void CheckWonderGuardAndLevitate(void) && gBattleMons[gBattlerTarget].type1 != gBattleMons[gBattlerTarget].type2 && TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_SUPER_EFFECTIVE) flags |= 1; + // check not very effective if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type1 && TYPE_EFFECT_MULTIPLIER(i) == 5) flags |= 2; @@ -1389,23 +1406,24 @@ static void CheckWonderGuardAndLevitate(void) } i += 3; } + if (gBattleMons[gBattlerTarget].ability == ABILITY_WONDER_GUARD && AttacksThisTurn(gBattlerAttacker, gCurrentMove) == 2) { if (((flags & 2) || !(flags & 1)) && gBattleMoves[gCurrentMove].power) { gLastUsedAbility = ABILITY_WONDER_GUARD; - gBattleCommunication[6] = 3; + gBattleCommunication[MISS_TYPE] = B_MSG_AVOIDED_DMG; RecordAbilityBattle(gBattlerTarget, ABILITY_WONDER_GUARD); } } } -// same as ModulateDmgByType except different arguments -static void ModulateDmgByType2(u8 multiplier, u16 move, u8 *flags) +static void ModulateDmgByType2(u8 multiplier, u16 move, u8* flags) // same as ModulateDmgByType except different arguments { gBattleMoveDamage = gBattleMoveDamage * multiplier / 10; if (gBattleMoveDamage == 0 && multiplier != 0) gBattleMoveDamage = 1; + switch (multiplier) { case TYPE_MUL_NO_EFFECT: @@ -1442,7 +1460,9 @@ u8 TypeCalc(u16 move, u8 attacker, u8 defender) if (move == MOVE_STRUGGLE) return 0; + moveType = gBattleMoves[move].type; + // check stab if (IS_BATTLER_OF_TYPE(attacker, moveType)) { @@ -1479,12 +1499,14 @@ u8 TypeCalc(u16 move, u8 attacker, u8 defender) i += 3; } } - if (gBattleMons[defender].ability == ABILITY_WONDER_GUARD - && !(flags & MOVE_RESULT_MISSED) - && AttacksThisTurn(attacker, move) == 2 - && (!(flags & MOVE_RESULT_SUPER_EFFECTIVE) || ((flags & (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)) == (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE))) - && gBattleMoves[move].power) + + if (gBattleMons[defender].ability == ABILITY_WONDER_GUARD && !(flags & MOVE_RESULT_MISSED) + && AttacksThisTurn(attacker, move) == 2 + && (!(flags & MOVE_RESULT_SUPER_EFFECTIVE) || ((flags & (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)) == (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE))) + && gBattleMoves[move].power) + { flags |= MOVE_RESULT_MISSED; + } return flags; } @@ -1497,7 +1519,9 @@ u8 AI_TypeCalc(u16 move, u16 targetSpecies, u8 targetAbility) if (move == MOVE_STRUGGLE) return 0; + moveType = gBattleMoves[move].type; + if (targetAbility == ABILITY_LEVITATE && moveType == TYPE_GROUND) { flags = MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE; @@ -1511,7 +1535,6 @@ u8 AI_TypeCalc(u16 move, u16 targetSpecies, u8 targetAbility) i += 3; continue; } - if (TYPE_EFFECT_ATK_TYPE(i) == moveType) { // check type1 @@ -1637,39 +1660,40 @@ static void Cmd_adjustnormaldamage2(void) // The same as adjustnormaldamage exce static void Cmd_attackanimation(void) { - if (gBattleControllerExecFlags == 0) + if (gBattleControllerExecFlags) + return; + + if ((gHitMarker & HITMARKER_NO_ANIMATIONS) && (gCurrentMove != MOVE_TRANSFORM && gCurrentMove != MOVE_SUBSTITUTE)) { - if ((gHitMarker & HITMARKER_NO_ANIMATIONS) && (gCurrentMove != MOVE_TRANSFORM && gCurrentMove != MOVE_SUBSTITUTE)) + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_Pausex20; + gBattleScripting.animTurn++; + gBattleScripting.animTargetsHit++; + } + else + { + if ((gBattleMoves[gCurrentMove].target & MOVE_TARGET_BOTH + || gBattleMoves[gCurrentMove].target & MOVE_TARGET_FOES_AND_ALLY + || gBattleMoves[gCurrentMove].target & MOVE_TARGET_DEPENDS) + && gBattleScripting.animTargetsHit) { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_Pausex20; - ++gBattleScripting.animTurn; - ++gBattleScripting.animTargetsHit; + gBattlescriptCurrInstr++; + return; + } + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) + { + gActiveBattler = gBattlerAttacker; + + BtlController_EmitMoveAnimation(BUFFER_A, gCurrentMove, gBattleScripting.animTurn, gBattleMovePower, gBattleMoveDamage, gBattleMons[gBattlerAttacker].friendship, &gDisableStructs[gBattlerAttacker]); + gBattleScripting.animTurn++; + gBattleScripting.animTargetsHit++; + MarkBattlerForControllerExec(gBattlerAttacker); + gBattlescriptCurrInstr++; } else { - if ((gBattleMoves[gCurrentMove].target & MOVE_TARGET_BOTH - || gBattleMoves[gCurrentMove].target & MOVE_TARGET_FOES_AND_ALLY - || gBattleMoves[gCurrentMove].target & MOVE_TARGET_DEPENDS) - && gBattleScripting.animTargetsHit) - { - gBattlescriptCurrInstr++; - return; - } - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) - { - gActiveBattler = gBattlerAttacker; - BtlController_EmitMoveAnimation(0, gCurrentMove, gBattleScripting.animTurn, gBattleMovePower, gBattleMoveDamage, gBattleMons[gBattlerAttacker].friendship, &gDisableStructs[gBattlerAttacker]); - ++gBattleScripting.animTurn; - ++gBattleScripting.animTargetsHit; - MarkBattlerForControllerExec(gBattlerAttacker); - gBattlescriptCurrInstr++; - } - else - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_Pausex20; - } + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_Pausex20; } } } @@ -1682,157 +1706,164 @@ static void Cmd_waitanimation(void) static void Cmd_healthbarupdate(void) { - if (gBattleControllerExecFlags == 0) - { - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) - { - gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); + if (gBattleControllerExecFlags) + return; - if (gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE && gDisableStructs[gActiveBattler].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) - { - PrepareStringBattle(STRINGID_SUBSTITUTEDAMAGED, gActiveBattler); - } - else - { - s16 healthValue; - s32 currDmg = gBattleMoveDamage; - s32 maxPossibleDmgValue = 10000; // not present in R/S, ensures that huge damage values don't change sign - - if (currDmg <= maxPossibleDmgValue) - healthValue = currDmg; - else - healthValue = maxPossibleDmgValue; - BtlController_EmitHealthBarUpdate(0, healthValue); - MarkBattlerForControllerExec(gActiveBattler); - if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER && gBattleMoveDamage > 0) - gBattleResults.playerMonWasDamaged = TRUE; - } + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) + { + gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); + + if (gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE && gDisableStructs[gActiveBattler].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) + { + PrepareStringBattle(STRINGID_SUBSTITUTEDAMAGED, gActiveBattler); + } + else + { + s16 healthValue; + + s32 currDmg = gBattleMoveDamage; + s32 maxPossibleDmgValue = 10000; // not present in R/S, ensures that huge damage values don't change sign + + if (currDmg <= maxPossibleDmgValue) + healthValue = currDmg; + else + healthValue = maxPossibleDmgValue; + + BtlController_EmitHealthBarUpdate(BUFFER_A, healthValue); + MarkBattlerForControllerExec(gActiveBattler); + + if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER && gBattleMoveDamage > 0) + gBattleResults.playerMonWasDamaged = TRUE; } - gBattlescriptCurrInstr += 2; } + + gBattlescriptCurrInstr += 2; } static void Cmd_datahpupdate(void) { u32 moveType; - if (gBattleControllerExecFlags == 0) + if (gBattleControllerExecFlags) + return; + + if (gBattleStruct->dynamicMoveType == 0) + moveType = gBattleMoves[gCurrentMove].type; + else if (!(gBattleStruct->dynamicMoveType & F_DYNAMIC_TYPE_1)) + moveType = gBattleStruct->dynamicMoveType & DYNAMIC_TYPE_MASK; + else + moveType = gBattleMoves[gCurrentMove].type; + + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) { - if (gBattleStruct->dynamicMoveType == 0) - moveType = gBattleMoves[gCurrentMove].type; - else if (!(gBattleStruct->dynamicMoveType & 0x40)) - moveType = gBattleStruct->dynamicMoveType & 0x3F; - else - moveType = gBattleMoves[gCurrentMove].type; - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) + gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); + if (gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE && gDisableStructs[gActiveBattler].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) { - gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - if (gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE && gDisableStructs[gActiveBattler].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) + if (gDisableStructs[gActiveBattler].substituteHP >= gBattleMoveDamage) { - if (gDisableStructs[gActiveBattler].substituteHP >= gBattleMoveDamage) + if (gSpecialStatuses[gActiveBattler].dmg == 0) + gSpecialStatuses[gActiveBattler].dmg = gBattleMoveDamage; + gDisableStructs[gActiveBattler].substituteHP -= gBattleMoveDamage; + gHpDealt = gBattleMoveDamage; + } + else + { + if (gSpecialStatuses[gActiveBattler].dmg == 0) + gSpecialStatuses[gActiveBattler].dmg = gDisableStructs[gActiveBattler].substituteHP; + gHpDealt = gDisableStructs[gActiveBattler].substituteHP; + gDisableStructs[gActiveBattler].substituteHP = 0; + } + // check substitute fading + if (gDisableStructs[gActiveBattler].substituteHP == 0) + { + gBattlescriptCurrInstr += 2; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_SubstituteFade; + return; + } + } + else + { + gHitMarker &= ~HITMARKER_IGNORE_SUBSTITUTE; + if (gBattleMoveDamage < 0) // hp goes up + { + gBattleMons[gActiveBattler].hp -= gBattleMoveDamage; + if (gBattleMons[gActiveBattler].hp > gBattleMons[gActiveBattler].maxHP) + gBattleMons[gActiveBattler].hp = gBattleMons[gActiveBattler].maxHP; + + } + else // hp goes down + { + if (gHitMarker & HITMARKER_SKIP_DMG_TRACK) { - if (gSpecialStatuses[gActiveBattler].dmg == 0) - gSpecialStatuses[gActiveBattler].dmg = gBattleMoveDamage; - gDisableStructs[gActiveBattler].substituteHP -= gBattleMoveDamage; + gHitMarker &= ~HITMARKER_SKIP_DMG_TRACK; + } + else + { + gTakenDmg[gActiveBattler] += gBattleMoveDamage; + if (gBattlescriptCurrInstr[1] == BS_TARGET) + gTakenDmgByBattler[gActiveBattler] = gBattlerAttacker; + else + gTakenDmgByBattler[gActiveBattler] = gBattlerTarget; + } + + if (gBattleMons[gActiveBattler].hp > gBattleMoveDamage) + { + gBattleMons[gActiveBattler].hp -= gBattleMoveDamage; gHpDealt = gBattleMoveDamage; } else { - if (gSpecialStatuses[gActiveBattler].dmg == 0) - gSpecialStatuses[gActiveBattler].dmg = gDisableStructs[gActiveBattler].substituteHP; - gHpDealt = gDisableStructs[gActiveBattler].substituteHP; - gDisableStructs[gActiveBattler].substituteHP = 0; + gHpDealt = gBattleMons[gActiveBattler].hp; + gBattleMons[gActiveBattler].hp = 0; } - // check substitute fading - if (gDisableStructs[gActiveBattler].substituteHP == 0) - { - gBattlescriptCurrInstr += 2; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SubstituteFade; - return; - } - } - else - { - gHitMarker &= ~(HITMARKER_IGNORE_SUBSTITUTE); - if (gBattleMoveDamage < 0) // hp goes up - { - gBattleMons[gActiveBattler].hp -= gBattleMoveDamage; - if (gBattleMons[gActiveBattler].hp > gBattleMons[gActiveBattler].maxHP) - gBattleMons[gActiveBattler].hp = gBattleMons[gActiveBattler].maxHP; - } - else // hp goes down + if (!gSpecialStatuses[gActiveBattler].dmg && !(gHitMarker & HITMARKER_PASSIVE_DAMAGE)) + gSpecialStatuses[gActiveBattler].dmg = gHpDealt; + + if (IS_TYPE_PHYSICAL(moveType) && !(gHitMarker & HITMARKER_PASSIVE_DAMAGE) && gCurrentMove != MOVE_PAIN_SPLIT) { - if (gHitMarker & HITMARKER_x20) + gProtectStructs[gActiveBattler].physicalDmg = gHpDealt; + gSpecialStatuses[gActiveBattler].physicalDmg = gHpDealt; + if (gBattlescriptCurrInstr[1] == BS_TARGET) { - gHitMarker &= ~(HITMARKER_x20); + gProtectStructs[gActiveBattler].physicalBattlerId = gBattlerAttacker; + gSpecialStatuses[gActiveBattler].physicalBattlerId = gBattlerAttacker; } else { - gTakenDmg[gActiveBattler] += gBattleMoveDamage; - if (gBattlescriptCurrInstr[1] == BS_TARGET) - gTakenDmgByBattler[gActiveBattler] = gBattlerAttacker; - else - gTakenDmgByBattler[gActiveBattler] = gBattlerTarget; + gProtectStructs[gActiveBattler].physicalBattlerId = gBattlerTarget; + gSpecialStatuses[gActiveBattler].physicalBattlerId = gBattlerTarget; } - - if (gBattleMons[gActiveBattler].hp > gBattleMoveDamage) + } + else if (!IS_TYPE_PHYSICAL(moveType) && !(gHitMarker & HITMARKER_PASSIVE_DAMAGE)) + { + gProtectStructs[gActiveBattler].specialDmg = gHpDealt; + gSpecialStatuses[gActiveBattler].specialDmg = gHpDealt; + if (gBattlescriptCurrInstr[1] == BS_TARGET) { - gBattleMons[gActiveBattler].hp -= gBattleMoveDamage; - gHpDealt = gBattleMoveDamage; + gProtectStructs[gActiveBattler].specialBattlerId = gBattlerAttacker; + gSpecialStatuses[gActiveBattler].specialBattlerId = gBattlerAttacker; } else { - gHpDealt = gBattleMons[gActiveBattler].hp; - gBattleMons[gActiveBattler].hp = 0; - } - if (!gSpecialStatuses[gActiveBattler].dmg && !(gHitMarker & HITMARKER_PASSIVE_DAMAGE)) - gSpecialStatuses[gActiveBattler].dmg = gHpDealt; - if (IS_TYPE_PHYSICAL(moveType) && !(gHitMarker & HITMARKER_PASSIVE_DAMAGE) && gCurrentMove != MOVE_PAIN_SPLIT) - { - gProtectStructs[gActiveBattler].physicalDmg = gHpDealt; - gSpecialStatuses[gActiveBattler].physicalDmg = gHpDealt; - if (gBattlescriptCurrInstr[1] == BS_TARGET) - { - gProtectStructs[gActiveBattler].physicalBattlerId = gBattlerAttacker; - gSpecialStatuses[gActiveBattler].physicalBattlerId = gBattlerAttacker; - } - else - { - gProtectStructs[gActiveBattler].physicalBattlerId = gBattlerTarget; - gSpecialStatuses[gActiveBattler].physicalBattlerId = gBattlerTarget; - } - } - else if (!IS_TYPE_PHYSICAL(moveType) && !(gHitMarker & HITMARKER_PASSIVE_DAMAGE)) - { - gProtectStructs[gActiveBattler].specialDmg = gHpDealt; - gSpecialStatuses[gActiveBattler].specialDmg = gHpDealt; - if (gBattlescriptCurrInstr[1] == BS_TARGET) - { - gProtectStructs[gActiveBattler].specialBattlerId = gBattlerAttacker; - gSpecialStatuses[gActiveBattler].specialBattlerId = gBattlerAttacker; - } - else - { - gProtectStructs[gActiveBattler].specialBattlerId = gBattlerTarget; - gSpecialStatuses[gActiveBattler].specialBattlerId = gBattlerTarget; - } + gProtectStructs[gActiveBattler].specialBattlerId = gBattlerTarget; + gSpecialStatuses[gActiveBattler].specialBattlerId = gBattlerTarget; } } - gHitMarker &= ~(HITMARKER_PASSIVE_DAMAGE); - BtlController_EmitSetMonData(BUFFER_A, REQUEST_HP_BATTLE, 0, 2, &gBattleMons[gActiveBattler].hp); - MarkBattlerForControllerExec(gActiveBattler); } + gHitMarker &= ~HITMARKER_PASSIVE_DAMAGE; + BtlController_EmitSetMonData(BUFFER_A, REQUEST_HP_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].hp), &gBattleMons[gActiveBattler].hp); + MarkBattlerForControllerExec(gActiveBattler); } - else - { - gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - if (gSpecialStatuses[gActiveBattler].dmg == 0) - gSpecialStatuses[gActiveBattler].dmg = 0xFFFF; - } - gBattlescriptCurrInstr += 2; } + else + { + gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); + if (gSpecialStatuses[gActiveBattler].dmg == 0) + gSpecialStatuses[gActiveBattler].dmg = 0xFFFF; + } + gBattlescriptCurrInstr += 2; } static void Cmd_critmessage(void) @@ -1850,136 +1881,138 @@ static void Cmd_critmessage(void) static void Cmd_effectivenesssound(void) { - if (gBattleControllerExecFlags == 0) + if (gBattleControllerExecFlags) + return; + + gActiveBattler = gBattlerTarget; + if (!(gMoveResultFlags & MOVE_RESULT_MISSED)) { - gActiveBattler = gBattlerTarget; - if (!(gMoveResultFlags & MOVE_RESULT_MISSED)) + switch (gMoveResultFlags & (u8)(~MOVE_RESULT_MISSED)) { - switch (gMoveResultFlags & (u8)(~(MOVE_RESULT_MISSED))) + case MOVE_RESULT_SUPER_EFFECTIVE: + BtlController_EmitPlaySE(BUFFER_A, SE_SUPER_EFFECTIVE); + MarkBattlerForControllerExec(gActiveBattler); + break; + case MOVE_RESULT_NOT_VERY_EFFECTIVE: + BtlController_EmitPlaySE(BUFFER_A, SE_NOT_EFFECTIVE); + MarkBattlerForControllerExec(gActiveBattler); + break; + case MOVE_RESULT_DOESNT_AFFECT_FOE: + case MOVE_RESULT_FAILED: + // no sound + break; + case MOVE_RESULT_FOE_ENDURED: + case MOVE_RESULT_ONE_HIT_KO: + case MOVE_RESULT_FOE_HUNG_ON: + default: + if (gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE) { - case MOVE_RESULT_SUPER_EFFECTIVE: BtlController_EmitPlaySE(BUFFER_A, SE_SUPER_EFFECTIVE); MarkBattlerForControllerExec(gActiveBattler); - break; - case MOVE_RESULT_NOT_VERY_EFFECTIVE: + } + else if (gMoveResultFlags & MOVE_RESULT_NOT_VERY_EFFECTIVE) + { BtlController_EmitPlaySE(BUFFER_A, SE_NOT_EFFECTIVE); MarkBattlerForControllerExec(gActiveBattler); - break; - case MOVE_RESULT_DOESNT_AFFECT_FOE: - case MOVE_RESULT_FAILED: - // no sound - break; - case MOVE_RESULT_FOE_ENDURED: - case MOVE_RESULT_ONE_HIT_KO: - case MOVE_RESULT_FOE_HUNG_ON: - default: - if (gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE) - { - BtlController_EmitPlaySE(BUFFER_A, SE_SUPER_EFFECTIVE); - MarkBattlerForControllerExec(gActiveBattler); - } - else if (gMoveResultFlags & MOVE_RESULT_NOT_VERY_EFFECTIVE) - { - BtlController_EmitPlaySE(BUFFER_A, SE_NOT_EFFECTIVE); - MarkBattlerForControllerExec(gActiveBattler); - } - else if (!(gMoveResultFlags & (MOVE_RESULT_DOESNT_AFFECT_FOE | MOVE_RESULT_FAILED))) - { - BtlController_EmitPlaySE(BUFFER_A, SE_EFFECTIVE); - MarkBattlerForControllerExec(gActiveBattler); - } - break; } + else if (!(gMoveResultFlags & (MOVE_RESULT_DOESNT_AFFECT_FOE | MOVE_RESULT_FAILED))) + { + BtlController_EmitPlaySE(BUFFER_A, SE_EFFECTIVE); + MarkBattlerForControllerExec(gActiveBattler); + } + break; } - gBattlescriptCurrInstr++; } + gBattlescriptCurrInstr++; } static void Cmd_resultmessage(void) { u32 stringId = 0; - if (gBattleControllerExecFlags == 0) + if (gBattleControllerExecFlags) + return; + + if (gMoveResultFlags & MOVE_RESULT_MISSED && (!(gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) || gBattleCommunication[MISS_TYPE] > B_MSG_AVOIDED_ATK)) { - if (gMoveResultFlags & MOVE_RESULT_MISSED && (!(gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) || gBattleCommunication[6] > 2)) + stringId = gMissStringIds[gBattleCommunication[MISS_TYPE]]; + gBattleCommunication[MSG_DISPLAY] = 1; + } + else + { + gBattleCommunication[MSG_DISPLAY] = 1; + switch (gMoveResultFlags & (u8)(~MOVE_RESULT_MISSED)) { - stringId = gMissStringIds[gBattleCommunication[6]]; - gBattleCommunication[MSG_DISPLAY] = 1; - } - else - { - gBattleCommunication[MSG_DISPLAY] = 1; - switch (gMoveResultFlags & (u8)(~(MOVE_RESULT_MISSED))) + case MOVE_RESULT_SUPER_EFFECTIVE: + stringId = STRINGID_SUPEREFFECTIVE; + break; + case MOVE_RESULT_NOT_VERY_EFFECTIVE: + stringId = STRINGID_NOTVERYEFFECTIVE; + break; + case MOVE_RESULT_ONE_HIT_KO: + stringId = STRINGID_ONEHITKO; + break; + case MOVE_RESULT_FOE_ENDURED: + stringId = STRINGID_PKMNENDUREDHIT; + break; + case MOVE_RESULT_FAILED: + stringId = STRINGID_BUTITFAILED; + break; + case MOVE_RESULT_DOESNT_AFFECT_FOE: + stringId = STRINGID_ITDOESNTAFFECT; + break; + case MOVE_RESULT_FOE_HUNG_ON: + gLastUsedItem = gBattleMons[gBattlerTarget].item; + gPotentialItemEffectBattler = gBattlerTarget; + gMoveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_FocusBandActivates; + return; + default: + if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) { - case MOVE_RESULT_SUPER_EFFECTIVE: - stringId = STRINGID_SUPEREFFECTIVE; - break; - case MOVE_RESULT_NOT_VERY_EFFECTIVE: - stringId = STRINGID_NOTVERYEFFECTIVE; - break; - case MOVE_RESULT_ONE_HIT_KO: - stringId = STRINGID_ONEHITKO; - break; - case MOVE_RESULT_FOE_ENDURED: - stringId = STRINGID_PKMNENDUREDHIT; - break; - case MOVE_RESULT_FAILED: - stringId = STRINGID_BUTITFAILED; - break; - case MOVE_RESULT_DOESNT_AFFECT_FOE: stringId = STRINGID_ITDOESNTAFFECT; - break; - case MOVE_RESULT_FOE_HUNG_ON: + } + else if (gMoveResultFlags & MOVE_RESULT_ONE_HIT_KO) + { + gMoveResultFlags &= ~MOVE_RESULT_ONE_HIT_KO; + gMoveResultFlags &= ~MOVE_RESULT_SUPER_EFFECTIVE; + gMoveResultFlags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_OneHitKOMsg; + return; + } + else if (gMoveResultFlags & MOVE_RESULT_FOE_ENDURED) + { + gMoveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_EnduredMsg; + return; + } + else if (gMoveResultFlags & MOVE_RESULT_FOE_HUNG_ON) + { gLastUsedItem = gBattleMons[gBattlerTarget].item; gPotentialItemEffectBattler = gBattlerTarget; gMoveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON); BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_HangedOnMsg; + gBattlescriptCurrInstr = BattleScript_FocusBandActivates; return; - default: - if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) - { - stringId = STRINGID_ITDOESNTAFFECT; - } - else if (gMoveResultFlags & MOVE_RESULT_ONE_HIT_KO) - { - gMoveResultFlags &= ~(MOVE_RESULT_ONE_HIT_KO); - gMoveResultFlags &= ~(MOVE_RESULT_SUPER_EFFECTIVE); - gMoveResultFlags &= ~(MOVE_RESULT_NOT_VERY_EFFECTIVE); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_OneHitKOMsg; - return; - } - else if (gMoveResultFlags & MOVE_RESULT_FOE_ENDURED) - { - gMoveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_EnduredMsg; - return; - } - else if (gMoveResultFlags & MOVE_RESULT_FOE_HUNG_ON) - { - gLastUsedItem = gBattleMons[gBattlerTarget].item; - gPotentialItemEffectBattler = gBattlerTarget; - gMoveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_HangedOnMsg; - return; - } - else if (gMoveResultFlags & MOVE_RESULT_FAILED) - { - stringId = STRINGID_BUTITFAILED; - } - else - { - gBattleCommunication[MSG_DISPLAY] = 0; - } + } + else if (gMoveResultFlags & MOVE_RESULT_FAILED) + { + stringId = STRINGID_BUTITFAILED; + } + else + { + gBattleCommunication[MSG_DISPLAY] = 0; } } - if (stringId) - PrepareStringBattle(stringId, gBattlerAttacker); - gBattlescriptCurrInstr++; } + + if (stringId) + PrepareStringBattle(stringId, gBattlerAttacker); + + gBattlescriptCurrInstr++; } static void Cmd_printstring(void) @@ -1987,7 +2020,6 @@ static void Cmd_printstring(void) if (gBattleControllerExecFlags == 0) { u16 var = T2_READ_16(gBattlescriptCurrInstr + 1); - PrepareStringBattle(var, gBattlerAttacker); gBattlescriptCurrInstr += 3; gBattleCommunication[MSG_DISPLAY] = 1; @@ -1997,8 +2029,10 @@ static void Cmd_printstring(void) static void Cmd_printselectionstring(void) { gActiveBattler = gBattlerAttacker; - BtlController_EmitPrintSelectionString(0, T2_READ_16(gBattlescriptCurrInstr + 1)); + + BtlController_EmitPrintSelectionString(BUFFER_A, T2_READ_16(gBattlescriptCurrInstr + 1)); MarkBattlerForControllerExec(gActiveBattler); + gBattlescriptCurrInstr += 3; gBattleCommunication[MSG_DISPLAY] = 1; } @@ -2014,7 +2048,6 @@ static void Cmd_waitmessage(void) else { u16 toWait = T2_READ_16(gBattlescriptCurrInstr + 1); - if (++gPauseCounterBattle >= toWait) { gPauseCounterBattle = 0; @@ -2029,10 +2062,11 @@ static void Cmd_printfromtable(void) { if (gBattleControllerExecFlags == 0) { - const u16 *ptr = (const u16 *) T1_READ_PTR(gBattlescriptCurrInstr + 1); - + const u16* ptr = (const u16*) T1_READ_PTR(gBattlescriptCurrInstr + 1); ptr += gBattleCommunication[MULTISTRING_CHOOSER]; + PrepareStringBattle(*ptr, gBattlerAttacker); + gBattlescriptCurrInstr += 5; gBattleCommunication[MSG_DISPLAY] = 1; } @@ -2042,12 +2076,13 @@ static void Cmd_printselectionstringfromtable(void) { if (gBattleControllerExecFlags == 0) { - const u16 *ptr = (const u16 *) T1_READ_PTR(gBattlescriptCurrInstr + 1); - + const u16* ptr = (const u16*) T1_READ_PTR(gBattlescriptCurrInstr + 1); ptr += gBattleCommunication[MULTISTRING_CHOOSER]; + gActiveBattler = gBattlerAttacker; - BtlController_EmitPrintSelectionString(0, *ptr); + BtlController_EmitPrintSelectionString(BUFFER_A, *ptr); MarkBattlerForControllerExec(gActiveBattler); + gBattlescriptCurrInstr += 5; gBattleCommunication[MSG_DISPLAY] = 1; } @@ -2056,11 +2091,21 @@ static void Cmd_printselectionstringfromtable(void) u8 GetBattlerTurnOrderNum(u8 battlerId) { s32 i; - - for (i = 0; i < gBattlersCount && gBattlerByTurnOrder[i] != battlerId; i++); + for (i = 0; i < gBattlersCount; i++) + { + if (gBattlerByTurnOrder[i] == battlerId) + break; + } return i; } +// Called INCREMENT_RESET_RETURN in Emerald which adds "gBattleCommunication[MOVE_EFFECT_BYTE] = 0;" before the return. +#define INCREMENT_RETURN \ +{ \ + gBattlescriptCurrInstr++; \ + return; \ +} + void SetMoveEffect(bool8 primary, u8 certain) { bool32 statusChanged = FALSE; @@ -2070,7 +2115,7 @@ void SetMoveEffect(bool8 primary, u8 certain) if (gBattleCommunication[MOVE_EFFECT_BYTE] & MOVE_EFFECT_AFFECTS_USER) { gEffectBattler = gBattlerAttacker; // battlerId that effects get applied on - gBattleCommunication[MOVE_EFFECT_BYTE] &= ~(MOVE_EFFECT_AFFECTS_USER); + gBattleCommunication[MOVE_EFFECT_BYTE] &= ~MOVE_EFFECT_AFFECTS_USER; affectsUser = MOVE_EFFECT_AFFECTS_USER; gBattleScripting.battler = gBattlerTarget; // theoretically the attacker } @@ -2079,42 +2124,26 @@ void SetMoveEffect(bool8 primary, u8 certain) gEffectBattler = gBattlerTarget; gBattleScripting.battler = gBattlerAttacker; } - if (gBattleTypeFlags & BATTLE_TYPE_POKEDUDE - && gBattleCommunication[MOVE_EFFECT_BYTE] != 1 - && GetBattlerSide(gEffectBattler) == B_SIDE_OPPONENT) - { - gBattlescriptCurrInstr++; - return; - } - if (gBattleMons[gEffectBattler].ability == ABILITY_SHIELD_DUST - && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) - && !primary - && gBattleCommunication[MOVE_EFFECT_BYTE] <= 9) - { - gBattlescriptCurrInstr++; - return; - } - if (gSideStatuses[GET_BATTLER_SIDE(gEffectBattler)] & SIDE_STATUS_SAFEGUARD - && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) - && !primary - && gBattleCommunication[MOVE_EFFECT_BYTE] <= 7) - { - gBattlescriptCurrInstr++; - return; - } + if (gBattleTypeFlags & BATTLE_TYPE_POKEDUDE && gBattleCommunication[MOVE_EFFECT_BYTE] != 1 + && GetBattlerSide(gEffectBattler) == B_SIDE_OPPONENT) + INCREMENT_RETURN + + if (gBattleMons[gEffectBattler].ability == ABILITY_SHIELD_DUST && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) + && !primary && gBattleCommunication[MOVE_EFFECT_BYTE] <= 9) + INCREMENT_RETURN + + if (gSideStatuses[GET_BATTLER_SIDE(gEffectBattler)] & SIDE_STATUS_SAFEGUARD && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) + && !primary && gBattleCommunication[MOVE_EFFECT_BYTE] <= 7) + INCREMENT_RETURN + if (gBattleMons[gEffectBattler].hp == 0 - && gBattleCommunication[MOVE_EFFECT_BYTE] != MOVE_EFFECT_PAYDAY - && gBattleCommunication[MOVE_EFFECT_BYTE] != MOVE_EFFECT_STEAL_ITEM) - { - gBattlescriptCurrInstr++; - return; - } - if (gBattleMons[gEffectBattler].status2 & STATUS2_SUBSTITUTE - && affectsUser != MOVE_EFFECT_AFFECTS_USER) - { - gBattlescriptCurrInstr++; - return; - } + && gBattleCommunication[MOVE_EFFECT_BYTE] != MOVE_EFFECT_PAYDAY + && gBattleCommunication[MOVE_EFFECT_BYTE] != MOVE_EFFECT_STEAL_ITEM) + INCREMENT_RETURN + + if (gBattleMons[gEffectBattler].status2 & STATUS2_SUBSTITUTE && affectsUser != MOVE_EFFECT_AFFECTS_USER) + INCREMENT_RETURN + if (gBattleCommunication[MOVE_EFFECT_BYTE] <= PRIMARY_STATUS_MOVE_EFFECT) { switch (sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]) @@ -2122,11 +2151,15 @@ void SetMoveEffect(bool8 primary, u8 certain) case STATUS1_SLEEP: // check active uproar if (gBattleMons[gEffectBattler].ability != ABILITY_SOUNDPROOF) + { for (gActiveBattler = 0; gActiveBattler < gBattlersCount && !(gBattleMons[gActiveBattler].status2 & STATUS2_UPROAR); - ++gActiveBattler); + gActiveBattler++) + {} + } else gActiveBattler = gBattlersCount; + if (gBattleMons[gEffectBattler].status1) break; if (gActiveBattler != gBattlersCount) @@ -2135,35 +2168,39 @@ void SetMoveEffect(bool8 primary, u8 certain) break; if (gBattleMons[gEffectBattler].ability == ABILITY_INSOMNIA) break; + CancelMultiTurnMoves(gEffectBattler); statusChanged = TRUE; break; case STATUS1_POISON: if (gBattleMons[gEffectBattler].ability == ABILITY_IMMUNITY - && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) + && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) { gLastUsedAbility = ABILITY_IMMUNITY; RecordAbilityBattle(gEffectBattler, ABILITY_IMMUNITY); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_PSNPrevention; + if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_ABILITY_STATUS; + gHitMarker &= ~HITMARKER_IGNORE_SAFEGUARD; } else { - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_MOVE_STATUS; } return; } if ((IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_POISON) || IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_STEEL)) - && (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) - && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) + && (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) + && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) { BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_PSNPrevention; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; + + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STATUS_HAD_NO_EFFECT; return; } if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_POISON)) @@ -2174,34 +2211,37 @@ void SetMoveEffect(bool8 primary, u8 certain) break; if (gBattleMons[gEffectBattler].ability == ABILITY_IMMUNITY) break; + statusChanged = TRUE; break; case STATUS1_BURN: if (gBattleMons[gEffectBattler].ability == ABILITY_WATER_VEIL - && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) + && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) { gLastUsedAbility = ABILITY_WATER_VEIL; RecordAbilityBattle(gEffectBattler, ABILITY_WATER_VEIL); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_BRNPrevention; if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_ABILITY_STATUS; + gHitMarker &= ~HITMARKER_IGNORE_SAFEGUARD; } else { - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_MOVE_STATUS; } return; } if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_FIRE) - && (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) - && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) + && (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) + && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) { BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_BRNPrevention; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; + + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STATUS_HAD_NO_EFFECT; return; } if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_FIRE)) @@ -2210,6 +2250,7 @@ void SetMoveEffect(bool8 primary, u8 certain) break; if (gBattleMons[gEffectBattler].status1) break; + statusChanged = TRUE; break; case STATUS1_FREEZE: @@ -2219,10 +2260,11 @@ void SetMoveEffect(bool8 primary, u8 certain) break; if (gBattleMons[gEffectBattler].status1) break; - if (noSunCanFreeze == 0) + if (noSunCanFreeze == FALSE) break; if (gBattleMons[gEffectBattler].ability == ABILITY_MAGMA_ARMOR) break; + CancelMultiTurnMoves(gEffectBattler); statusChanged = TRUE; break; @@ -2233,16 +2275,18 @@ void SetMoveEffect(bool8 primary, u8 certain) { gLastUsedAbility = ABILITY_LIMBER; RecordAbilityBattle(gEffectBattler, ABILITY_LIMBER); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_PRLZPrevention; + if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_ABILITY_STATUS; + gHitMarker &= ~HITMARKER_IGNORE_SAFEGUARD; } else { - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_MOVE_STATUS; } return; } @@ -2251,6 +2295,7 @@ void SetMoveEffect(bool8 primary, u8 certain) } if (gBattleMons[gEffectBattler].status1) break; + statusChanged = TRUE; break; case STATUS1_TOXIC_POISON: @@ -2258,26 +2303,29 @@ void SetMoveEffect(bool8 primary, u8 certain) { gLastUsedAbility = ABILITY_IMMUNITY; RecordAbilityBattle(gEffectBattler, ABILITY_IMMUNITY); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_PSNPrevention; + if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_ABILITY_STATUS; + gHitMarker &= ~HITMARKER_IGNORE_SAFEGUARD; } else { - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_MOVE_STATUS; } return; } if ((IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_POISON) || IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_STEEL)) - && (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) - && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) + && (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) + && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) { BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_PSNPrevention; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; + + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STATUS_HAD_NO_EFFECT; return; } if (gBattleMons[gEffectBattler].status1) @@ -2286,9 +2334,10 @@ void SetMoveEffect(bool8 primary, u8 certain) { if (gBattleMons[gEffectBattler].ability == ABILITY_IMMUNITY) break; + // It's redundant, because at this point we know the status1 value is 0. - gBattleMons[gEffectBattler].status1 &= ~(STATUS1_TOXIC_POISON); - gBattleMons[gEffectBattler].status1 &= ~(STATUS1_POISON); + gBattleMons[gEffectBattler].status1 &= ~STATUS1_TOXIC_POISON; + gBattleMons[gEffectBattler].status1 &= ~STATUS1_POISON; statusChanged = TRUE; break; } @@ -2301,30 +2350,36 @@ void SetMoveEffect(bool8 primary, u8 certain) if (statusChanged == TRUE) { BattleScriptPush(gBattlescriptCurrInstr + 1); + if (sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]] == STATUS1_SLEEP) - gBattleMons[gEffectBattler].status1 |= ((Random() & 3) + 2); + gBattleMons[gEffectBattler].status1 |= STATUS1_SLEEP_TURN((Random() & 3) + 2); // 2-5 turns else gBattleMons[gEffectBattler].status1 |= sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gActiveBattler = gEffectBattler; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gEffectBattler].status1); + BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gEffectBattler].status1), &gBattleMons[gEffectBattler].status1); MarkBattlerForControllerExec(gActiveBattler); + if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STATUSED_BY_ABILITY; + gHitMarker &= ~HITMARKER_IGNORE_SAFEGUARD; } else { - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STATUSED; } + // for synchronize + if (gBattleCommunication[MOVE_EFFECT_BYTE] == MOVE_EFFECT_POISON || gBattleCommunication[MOVE_EFFECT_BYTE] == MOVE_EFFECT_TOXIC || gBattleCommunication[MOVE_EFFECT_BYTE] == MOVE_EFFECT_PARALYSIS || gBattleCommunication[MOVE_EFFECT_BYTE] == MOVE_EFFECT_BURN) { - u8 *synchronizeEffect = &gBattleStruct->synchronizeMoveEffect; + u8* synchronizeEffect = &gBattleStruct->synchronizeMoveEffect; *synchronizeEffect = gBattleCommunication[MOVE_EFFECT_BYTE]; gHitMarker |= HITMARKER_SYNCHRONISE_EFFECT; } @@ -2354,7 +2409,8 @@ void SetMoveEffect(bool8 primary, u8 certain) } else { - gBattleMons[gEffectBattler].status2 |= (((Random()) % 0x4)) + 2; + gBattleMons[gEffectBattler].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); // 2-5 turns + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; } @@ -2385,7 +2441,8 @@ void SetMoveEffect(bool8 primary, u8 certain) { gBattleMons[gEffectBattler].status2 |= STATUS2_MULTIPLETURNS; gLockedMoves[gEffectBattler] = gCurrentMove; - gBattleMons[gEffectBattler].status2 |= ((Random() & 3) + 2) << 4; + gBattleMons[gEffectBattler].status2 |= STATUS2_UPROAR_TURN((Random() & 3) + 2); // 2-5 turns + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; } @@ -2429,15 +2486,20 @@ void SetMoveEffect(bool8 primary, u8 certain) } else { - gBattleMons[gEffectBattler].status2 |= ((Random() & 3) + 3) << 0xD; + gBattleMons[gEffectBattler].status2 |= STATUS2_WRAPPED_TURN((Random() & 3) + 3); // 3-6 turns + *(gBattleStruct->wrappedMove + gEffectBattler * 2 + 0) = gCurrentMove; *(gBattleStruct->wrappedMove + gEffectBattler * 2 + 1) = gCurrentMove >> 8; *(gBattleStruct->wrappedBy + gEffectBattler) = gBattlerAttacker; + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + for (gBattleCommunication[MULTISTRING_CHOOSER] = 0; ; gBattleCommunication[MULTISTRING_CHOOSER]++) { - if (gBattleCommunication[MULTISTRING_CHOOSER] > 4 || gTrappingMoves[gBattleCommunication[MULTISTRING_CHOOSER]] == gCurrentMove) + if (gBattleCommunication[MULTISTRING_CHOOSER] >= NUM_TRAPPING_MOVES - 1) + break; + if (gTrappingMoves[gBattleCommunication[MULTISTRING_CHOOSER]] == gCurrentMove) break; } } @@ -2446,6 +2508,7 @@ void SetMoveEffect(bool8 primary, u8 certain) gBattleMoveDamage = (gHpDealt) / 4; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; break; @@ -2458,8 +2521,7 @@ void SetMoveEffect(bool8 primary, u8 certain) case MOVE_EFFECT_EVS_PLUS_1: if (ChangeStatBuffs(SET_STAT_BUFF_VALUE(1), gBattleCommunication[MOVE_EFFECT_BYTE] - MOVE_EFFECT_ATK_PLUS_1 + 1, - affectsUser, - NULL)) + affectsUser, 0)) { gBattlescriptCurrInstr++; } @@ -2480,8 +2542,7 @@ void SetMoveEffect(bool8 primary, u8 certain) case MOVE_EFFECT_EVS_MINUS_1: if (ChangeStatBuffs(SET_STAT_BUFF_VALUE(1) | STAT_BUFF_NEGATIVE, gBattleCommunication[MOVE_EFFECT_BYTE] - MOVE_EFFECT_ATK_MINUS_1 + 1, - affectsUser, - NULL)) + affectsUser, 0)) { gBattlescriptCurrInstr++; } @@ -2502,8 +2563,7 @@ void SetMoveEffect(bool8 primary, u8 certain) case MOVE_EFFECT_EVS_PLUS_2: if (ChangeStatBuffs(SET_STAT_BUFF_VALUE(2), gBattleCommunication[MOVE_EFFECT_BYTE] - MOVE_EFFECT_ATK_PLUS_2 + 1, - affectsUser, - NULL)) + affectsUser, 0)) { gBattlescriptCurrInstr++; } @@ -2524,8 +2584,7 @@ void SetMoveEffect(bool8 primary, u8 certain) case MOVE_EFFECT_EVS_MINUS_2: if (ChangeStatBuffs(SET_STAT_BUFF_VALUE(2) | STAT_BUFF_NEGATIVE, gBattleCommunication[MOVE_EFFECT_BYTE] - MOVE_EFFECT_ATK_MINUS_2 + 1, - affectsUser, - NULL)) + affectsUser, 0)) { gBattlescriptCurrInstr++; } @@ -2554,22 +2613,23 @@ void SetMoveEffect(bool8 primary, u8 certain) gBattlescriptCurrInstr++; break; } + side = GetBattlerSide(gBattlerAttacker); if (GetBattlerSide(gBattlerAttacker) == B_SIDE_OPPONENT - && !(gBattleTypeFlags & - (BATTLE_TYPE_EREADER_TRAINER - | BATTLE_TYPE_BATTLE_TOWER - | BATTLE_TYPE_LINK)) + && !(gBattleTypeFlags & + (BATTLE_TYPE_EREADER_TRAINER + | BATTLE_TYPE_BATTLE_TOWER + | BATTLE_TYPE_LINK)) && gTrainerBattleOpponent_A != 0x400) { gBattlescriptCurrInstr++; } else if (!(gBattleTypeFlags & - (BATTLE_TYPE_EREADER_TRAINER - | BATTLE_TYPE_BATTLE_TOWER - | BATTLE_TYPE_LINK)) - && gTrainerBattleOpponent_A != 0x400 - && (gWishFutureKnock.knockedOffMons[side] & gBitTable[gBattlerPartyIndexes[gBattlerAttacker]])) + (BATTLE_TYPE_EREADER_TRAINER + | BATTLE_TYPE_BATTLE_TOWER + | BATTLE_TYPE_LINK)) + && gTrainerBattleOpponent_A != 0x400 + && (gWishFutureKnock.knockedOffMons[side] & gBitTable[gBattlerPartyIndexes[gBattlerAttacker]])) { gBattlescriptCurrInstr++; } @@ -2589,19 +2649,23 @@ void SetMoveEffect(bool8 primary, u8 certain) } else { - u16 *changedItem = &gBattleStruct->changedItems[gBattlerAttacker]; + u16* changedItem = &gBattleStruct->changedItems[gBattlerAttacker]; gLastUsedItem = *changedItem = gBattleMons[gBattlerTarget].item; gBattleMons[gBattlerTarget].item = ITEM_NONE; + gActiveBattler = gBattlerAttacker; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, 2, &gLastUsedItem); + BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gLastUsedItem), &gLastUsedItem); MarkBattlerForControllerExec(gBattlerAttacker); + gActiveBattler = gBattlerTarget; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gBattlerTarget].item); + BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].item), &gBattleMons[gBattlerTarget].item); MarkBattlerForControllerExec(gBattlerTarget); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_ItemSteal; - *(u8 *)((u8 *)(&gBattleStruct->choicedMove[gBattlerTarget]) + 0) = 0; - *(u8 *)((u8 *)(&gBattleStruct->choicedMove[gBattlerTarget]) + 1) = 0; + + *(u8*)((u8*)(&gBattleStruct->choicedMove[gBattlerTarget]) + 0) = 0; + *(u8*)((u8*)(&gBattleStruct->choicedMove[gBattlerTarget]) + 1) = 0; } } break; @@ -2629,10 +2693,12 @@ void SetMoveEffect(bool8 primary, u8 certain) } else { - gBattleMons[gBattlerTarget].status1 &= ~(STATUS1_PARALYSIS); + gBattleMons[gBattlerTarget].status1 &= ~STATUS1_PARALYSIS; + gActiveBattler = gBattlerTarget; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_TargetPRLZHeal; } @@ -2645,6 +2711,7 @@ void SetMoveEffect(bool8 primary, u8 certain) gBattleMoveDamage = gHpDealt / 3; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; break; @@ -2657,7 +2724,7 @@ void SetMoveEffect(bool8 primary, u8 certain) { gBattleMons[gEffectBattler].status2 |= STATUS2_MULTIPLETURNS; gLockedMoves[gEffectBattler] = gCurrentMove; - gBattleMons[gEffectBattler].status2 |= (((Random() & 1) + 2) << 0xA); + gBattleMons[gEffectBattler].status2 |= STATUS2_LOCK_CONFUSE_TURN((Random() & 1) + 2); // thrash for 2-3 turns } break; case MOVE_EFFECT_KNOCK_OFF: @@ -2678,13 +2745,16 @@ void SetMoveEffect(bool8 primary, u8 certain) if (gBattleMons[gEffectBattler].item) { side = GetBattlerSide(gEffectBattler); + gLastUsedItem = gBattleMons[gEffectBattler].item; gBattleMons[gEffectBattler].item = ITEM_NONE; gWishFutureKnock.knockedOffMons[side] |= gBitTable[gBattlerPartyIndexes[gEffectBattler]]; + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_KnockedOff; - *(u8 *)((u8 *)(&gBattleStruct->choicedMove[gEffectBattler]) + 0) = 0; - *(u8 *)((u8 *)(&gBattleStruct->choicedMove[gEffectBattler]) + 1) = 0; + + *(u8*)((u8*)(&gBattleStruct->choicedMove[gEffectBattler]) + 0) = 0; + *(u8*)((u8*)(&gBattleStruct->choicedMove[gEffectBattler]) + 1) = 0; } else { @@ -2708,25 +2778,27 @@ static void Cmd_seteffectwithchance(void) percentChance = gBattleMoves[gCurrentMove].secondaryEffectChance * 2; else percentChance = gBattleMoves[gCurrentMove].secondaryEffectChance; + if (gBattleCommunication[MOVE_EFFECT_BYTE] & MOVE_EFFECT_CERTAIN - && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) + && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) { - gBattleCommunication[MOVE_EFFECT_BYTE] &= ~(MOVE_EFFECT_CERTAIN); - SetMoveEffect(0, MOVE_EFFECT_CERTAIN); + gBattleCommunication[MOVE_EFFECT_BYTE] &= ~MOVE_EFFECT_CERTAIN; + SetMoveEffect(FALSE, MOVE_EFFECT_CERTAIN); } else if (Random() % 100 <= percentChance - && gBattleCommunication[MOVE_EFFECT_BYTE] - && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) + && gBattleCommunication[MOVE_EFFECT_BYTE] + && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) { if (percentChance >= 100) - SetMoveEffect(0, MOVE_EFFECT_CERTAIN); + SetMoveEffect(FALSE, MOVE_EFFECT_CERTAIN); else - SetMoveEffect(0, 0); + SetMoveEffect(FALSE, 0); } else { gBattlescriptCurrInstr++; } + gBattleCommunication[MOVE_EFFECT_BYTE] = 0; gBattleScripting.multihitMoveEffect = 0; } @@ -2749,6 +2821,7 @@ static void Cmd_clearstatusfromeffect(void) gBattleMons[gActiveBattler].status1 &= (~sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]); else gBattleMons[gActiveBattler].status2 &= (~sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]); + gBattleCommunication[MOVE_EFFECT_BYTE] = 0; gBattlescriptCurrInstr += 2; gBattleScripting.multihitMoveEffect = 0; @@ -2764,9 +2837,10 @@ static void Cmd_tryfaintmon(void) if (gHitMarker & HITMARKER_FAINTED(gActiveBattler)) { BS_ptr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + BattleScriptPop(); gBattlescriptCurrInstr = BS_ptr; - gSideStatuses[GetBattlerSide(gActiveBattler)] &= ~(SIDE_STATUS_SPIKES_DAMAGED); + gSideStatuses[GetBattlerSide(gActiveBattler)] &= ~SIDE_STATUS_SPIKES_DAMAGED; } else { @@ -2798,20 +2872,20 @@ static void Cmd_tryfaintmon(void) if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { gHitMarker |= HITMARKER_PLAYER_FAINTED; - if (gBattleResults.playerFaintCounter < 0xFF) - ++gBattleResults.playerFaintCounter; + if (gBattleResults.playerFaintCounter < 255) + gBattleResults.playerFaintCounter++; AdjustFriendshipOnBattleFaint(gActiveBattler); } else { - if (gBattleResults.opponentFaintCounter < 0xFF) - ++gBattleResults.opponentFaintCounter; + if (gBattleResults.opponentFaintCounter < 255) + gBattleResults.opponentFaintCounter++; gBattleResults.lastOpponentSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); *(u8 *)(&gBattleStruct->field_182) = gBattlerAttacker; } if ((gHitMarker & HITMARKER_DESTINYBOND) && gBattleMons[gBattlerAttacker].hp != 0) { - gHitMarker &= ~(HITMARKER_DESTINYBOND); + gHitMarker &= ~HITMARKER_DESTINYBOND; BattleScriptPush(gBattlescriptCurrInstr); gBattleMoveDamage = gBattleMons[battlerId].hp; gBattlescriptCurrInstr = BattleScript_DestinyBondTakesLife; @@ -2828,8 +2902,9 @@ static void Cmd_tryfaintmon(void) BattleScriptPush(gBattlescriptCurrInstr); gBattlescriptCurrInstr = BattleScript_GrudgeTakesPp; gActiveBattler = gBattlerAttacker; - BtlController_EmitSetMonData(BUFFER_A, moveIndex + REQUEST_PPMOVE1_BATTLE, 0, 1, &gBattleMons[gActiveBattler].pp[moveIndex]); + BtlController_EmitSetMonData(BUFFER_A, moveIndex + REQUEST_PPMOVE1_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].pp[moveIndex]), &gBattleMons[gActiveBattler].pp[moveIndex]); MarkBattlerForControllerExec(gActiveBattler); + PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerAttacker].moves[moveIndex]) } } @@ -2845,7 +2920,7 @@ static void Cmd_dofaintanimation(void) if (gBattleControllerExecFlags == 0) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - BtlController_EmitFaintAnimation(0); + BtlController_EmitFaintAnimation(BUFFER_A); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; } @@ -2856,9 +2931,11 @@ static void Cmd_cleareffectsonfaint(void) if (gBattleControllerExecFlags == 0) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); + gBattleMons[gActiveBattler].status1 = 0; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 0x4, &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); + FaintClearSetData(); // Effects like attractions, trapping, etc. gBattlescriptCurrInstr += 2; } @@ -2868,7 +2945,7 @@ static void Cmd_jumpifstatus(void) { u8 battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); u32 flags = T2_READ_32(gBattlescriptCurrInstr + 2); - const u8 *jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 6); + const u8* jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 6); if (gBattleMons[battlerId].status1 & flags && gBattleMons[battlerId].hp != 0) gBattlescriptCurrInstr = jumpPtr; @@ -2880,7 +2957,7 @@ static void Cmd_jumpifstatus2(void) { u8 battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); u32 flags = T2_READ_32(gBattlescriptCurrInstr + 2); - const u8 *jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 6); + const u8* jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 6); if (gBattleMons[battlerId].status2 & flags && gBattleMons[battlerId].hp != 0) gBattlescriptCurrInstr = jumpPtr; @@ -2892,7 +2969,7 @@ static void Cmd_jumpifability(void) { u8 battlerId; u8 ability = gBattlescriptCurrInstr[2]; - const u8 *jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 3); + const u8* jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 3); if (gBattlescriptCurrInstr[1] == BS_ATTACKER_SIDE) { @@ -2939,7 +3016,7 @@ static void Cmd_jumpifsideaffecting(void) { u8 side; u16 flags; - const u8 *jumpPtr; + const u8* jumpPtr; if (gBattlescriptCurrInstr[1] == BS_ATTACKER) side = GET_BATTLER_SIDE(gBattlerAttacker); @@ -2988,6 +3065,7 @@ static void Cmd_jumpifstat(void) ret++; break; } + if (ret) gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 5); else @@ -2996,22 +3074,23 @@ static void Cmd_jumpifstat(void) static void Cmd_jumpifstatus3condition(void) { - u32 flags; + u32 status; const u8 *jumpPtr; gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - flags = T2_READ_32(gBattlescriptCurrInstr + 2); + status = T2_READ_32(gBattlescriptCurrInstr + 2); jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 7); + if (gBattlescriptCurrInstr[6]) { - if (gStatuses3[gActiveBattler] & flags) + if ((gStatuses3[gActiveBattler] & status) != 0) gBattlescriptCurrInstr += 11; else gBattlescriptCurrInstr = jumpPtr; } else { - if (gStatuses3[gActiveBattler] & flags) + if ((gStatuses3[gActiveBattler] & status) != 0) gBattlescriptCurrInstr = jumpPtr; else gBattlescriptCurrInstr += 11; @@ -3022,7 +3101,7 @@ static void Cmd_jumpiftype(void) { u8 battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); u8 type = gBattlescriptCurrInstr[2]; - const u8 *jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 3); + const u8* jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 3); if (IS_BATTLER_OF_TYPE(battlerId, type)) gBattlescriptCurrInstr = jumpPtr; @@ -3041,16 +3120,16 @@ static void Cmd_getexp(void) gBattlerFainted = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); sentIn = gSentPokesToOpponent[(gBattlerFainted & 2) >> 1]; + switch (gBattleScripting.getexpState) { case 0: // check if should receive exp at all - if (GetBattlerSide(gBattlerFainted) != B_SIDE_OPPONENT - || (gBattleTypeFlags & - (BATTLE_TYPE_LINK - | BATTLE_TYPE_TRAINER_TOWER - | BATTLE_TYPE_BATTLE_TOWER - | BATTLE_TYPE_SAFARI - | BATTLE_TYPE_EREADER_TRAINER))) + if (GetBattlerSide(gBattlerFainted) != B_SIDE_OPPONENT || (gBattleTypeFlags & + (BATTLE_TYPE_LINK + | BATTLE_TYPE_TRAINER_TOWER + | BATTLE_TYPE_BATTLE_TOWER + | BATTLE_TYPE_SAFARI + | BATTLE_TYPE_EREADER_TRAINER))) { gBattleScripting.getexpState = 6; // goto last case } @@ -3067,18 +3146,20 @@ static void Cmd_getexp(void) for (viaSentIn = 0, i = 0; i < PARTY_SIZE; i++) { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != SPECIES_NONE && GetMonData(&gPlayerParty[i], MON_DATA_HP) != 0) - { - if (gBitTable[i] & sentIn) - ++viaSentIn; - item = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); - if (item == ITEM_ENIGMA_BERRY) - holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect; - else - holdEffect = ItemId_GetHoldEffect(item); - if (holdEffect == HOLD_EFFECT_EXP_SHARE) - ++viaExpShare; - } + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) == SPECIES_NONE || GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0) + continue; + if (gBitTable[i] & sentIn) + viaSentIn++; + + item = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); + + if (item == ITEM_ENIGMA_BERRY) + holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect; + else + holdEffect = ItemId_GetHoldEffect(item); + + if (holdEffect == HOLD_EFFECT_EXP_SHARE) + viaExpShare++; } calculatedExp = gBaseStats[gBattleMons[gBattlerFainted].species].expYield * gBattleMons[gBattlerFainted].level / 7; @@ -3139,12 +3220,14 @@ static void Cmd_getexp(void) PlayBGM(MUS_VICTORY_WILD); gBattleStruct->wildVictorySong++; } + if (GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_HP)) { if (gBattleStruct->sentInPokes & 1) gBattleMoveDamage = *exp; else gBattleMoveDamage = 0; + if (holdEffect == HOLD_EFFECT_EXP_SHARE) gBattleMoveDamage += gExpShareExp; if (holdEffect == HOLD_EFFECT_LUCKY_EGG) @@ -3161,10 +3244,11 @@ static void Cmd_getexp(void) { i = STRINGID_EMPTYSTRING4; } + // get exp getter battlerId if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { - if (!(gBattlerPartyIndexes[2] != gBattleStruct->expGetterMonId) && !(gAbsentBattlerFlags & gBitTable[2])) + if (gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId && !(gAbsentBattlerFlags & gBitTable[2])) gBattleStruct->expGetterBattlerId = 2; else { @@ -3296,72 +3380,91 @@ static void Cmd_getexp(void) } } +// For battles that aren't BATTLE_TYPE_LINK or BATTLE_TYPE_RECORDED_LINK, the only thing this +// command does is check whether the player has won/lost by totaling each team's HP. It then +// sets gBattleOutcome accordingly, if necessary. static void Cmd_checkteamslost(void) { u16 HP_count = 0; s32 i; - if (gBattleControllerExecFlags == 0) + if (gBattleControllerExecFlags) + return; + + for (i = 0; i < PARTY_SIZE; i++) { - for (i = 0; i < PARTY_SIZE; i++) - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) - HP_count += GetMonData(&gPlayerParty[i], MON_DATA_HP); - if (HP_count == 0) - gBattleOutcome |= B_OUTCOME_LOST; - for (HP_count = 0, i = 0; i < PARTY_SIZE; i++) - if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES) && !GetMonData(&gEnemyParty[i], MON_DATA_IS_EGG)) - HP_count += GetMonData(&gEnemyParty[i], MON_DATA_HP); - if (HP_count == 0) - gBattleOutcome |= B_OUTCOME_WON; - if (gBattleOutcome == 0 && (gBattleTypeFlags & BATTLE_TYPE_LINK)) + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) { - s32 foundPlayer; - s32 foundOpponent; + HP_count += GetMonData(&gPlayerParty[i], MON_DATA_HP); + } + } + if (HP_count == 0) + gBattleOutcome |= B_OUTCOME_LOST; + HP_count = 0; - for (foundPlayer = 0, i = 0; i < gBattlersCount; i += 2) - { - u32 *ptr = &gHitMarker; - u32 hitMarkerUnk = 0x10000000; - - i++; - --i; - if ((hitMarkerUnk << i) & *ptr && !gSpecialStatuses[i].faintedHasReplacement) - ++foundPlayer; - } - for (foundOpponent = 0, i = 1; i < gBattlersCount; i += 2) - { - u32 *ptr = &gHitMarker; - u32 hitMarkerUnk = 0x10000000; - - { - u8 match; + // Get total HP for the enemy's party to determine if the player has won + for (i = 0; i < PARTY_SIZE; i++) + { + if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES) && !GetMonData(&gEnemyParty[i], MON_DATA_IS_EGG)) + { + HP_count += GetMonData(&gEnemyParty[i], MON_DATA_HP); + } + } + if (HP_count == 0) + gBattleOutcome |= B_OUTCOME_WON; - ++match; - --match; - } - if ((hitMarkerUnk << i) & *ptr && !gSpecialStatuses[i].faintedHasReplacement) - ++foundOpponent; - } - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + // For link battles that haven't ended, count number of empty battler spots + // In link multi battles, jump to pointer if more than 1 spot empty + // In non-multi battles, jump to pointer if 1 spot is missing on both sides + if (gBattleOutcome == 0 && (gBattleTypeFlags & BATTLE_TYPE_LINK)) + { + s32 emptyPlayerSpots; + s32 emptyOpponentSpots; + + for (emptyPlayerSpots = 0, i = 0; i < gBattlersCount; i += 2) + { + u32 *ptr = &gHitMarker; + u32 hitMarkerUnk = 0x10000000; + + i++; + --i; + if ((hitMarkerUnk << i) & *ptr && !gSpecialStatuses[i].faintedHasReplacement) + emptyPlayerSpots++; + } + for (emptyOpponentSpots = 0, i = 1; i < gBattlersCount; i += 2) + { + u32 *ptr = &gHitMarker; + u32 hitMarkerUnk = 0x10000000; + { - if (foundOpponent + foundPlayer > 1) - gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1); - else - gBattlescriptCurrInstr += 5; + u8 match; + + ++match; + --match; } + if ((hitMarkerUnk << i) & *ptr && !gSpecialStatuses[i].faintedHasReplacement) + emptyOpponentSpots++; + } + + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + if (emptyOpponentSpots + emptyPlayerSpots > 1) + gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1); else - { - if (foundOpponent != 0 && foundPlayer != 0) - gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1); - else - gBattlescriptCurrInstr += 5; - } + gBattlescriptCurrInstr += 5; } else { - gBattlescriptCurrInstr += 5; + if (emptyOpponentSpots != 0 && emptyPlayerSpots != 0) + gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1); + else + gBattlescriptCurrInstr += 5; } } + else + { + gBattlescriptCurrInstr += 5; + } } static void MoveValuesCleanUp(void) @@ -3370,9 +3473,9 @@ static void MoveValuesCleanUp(void) gBattleScripting.dmgMultiplier = 1; gCritMultiplier = 1; gBattleCommunication[MOVE_EFFECT_BYTE] = 0; - gBattleCommunication[6] = 0; - gHitMarker &= ~(HITMARKER_DESTINYBOND); - gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT); + gBattleCommunication[MISS_TYPE] = 0; + gHitMarker &= ~HITMARKER_DESTINYBOND; + gHitMarker &= ~HITMARKER_SYNCHRONISE_EFFECT; } static void Cmd_movevaluescleanup(void) @@ -3403,9 +3506,9 @@ static void Cmd_goto(void) static void Cmd_jumpifbyte(void) { u8 caseID = gBattlescriptCurrInstr[1]; - const u8 *memByte = T2_READ_PTR(gBattlescriptCurrInstr + 2); + const u8* memByte = T2_READ_PTR(gBattlescriptCurrInstr + 2); u8 value = gBattlescriptCurrInstr[6]; - const u8 *jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 7); + const u8* jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 7); gBattlescriptCurrInstr += 11; @@ -3441,11 +3544,12 @@ static void Cmd_jumpifbyte(void) static void Cmd_jumpifhalfword(void) { u8 caseID = gBattlescriptCurrInstr[1]; - const u16 *memHword = T2_READ_PTR(gBattlescriptCurrInstr + 2); + const u16* memHword = T2_READ_PTR(gBattlescriptCurrInstr + 2); u16 value = T2_READ_16(gBattlescriptCurrInstr + 6); - const u8 *jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 8); + const u8* jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 8); gBattlescriptCurrInstr += 12; + switch (caseID) { case CMP_EQUAL: @@ -3478,11 +3582,12 @@ static void Cmd_jumpifhalfword(void) static void Cmd_jumpifword(void) { u8 caseID = gBattlescriptCurrInstr[1]; - const u32 *memWord = T2_READ_PTR(gBattlescriptCurrInstr + 2); + const u32* memWord = T2_READ_PTR(gBattlescriptCurrInstr + 2); u32 value = T1_READ_32(gBattlescriptCurrInstr + 6); - const u8 *jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 10); + const u8* jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 10); gBattlescriptCurrInstr += 14; + switch (caseID) { case CMP_EQUAL: @@ -3514,12 +3619,12 @@ static void Cmd_jumpifword(void) static void Cmd_jumpifarrayequal(void) { - const u8 *mem1 = T2_READ_PTR(gBattlescriptCurrInstr + 1); - const u8 *mem2 = T2_READ_PTR(gBattlescriptCurrInstr + 5); + const u8* mem1 = T2_READ_PTR(gBattlescriptCurrInstr + 1); + const u8* mem2 = T2_READ_PTR(gBattlescriptCurrInstr + 5); u32 size = gBattlescriptCurrInstr[9]; - const u8 *jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 10); - u8 i; + const u8* jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 10); + u8 i; for (i = 0; i < size; i++) { if (*mem1 != *mem2) @@ -3527,8 +3632,9 @@ static void Cmd_jumpifarrayequal(void) gBattlescriptCurrInstr += 14; break; } - ++mem1, ++mem2; + mem1++, mem2++; } + if (i == size) gBattlescriptCurrInstr = jumpPtr; } @@ -3536,18 +3642,19 @@ static void Cmd_jumpifarrayequal(void) static void Cmd_jumpifarraynotequal(void) { u8 equalBytes = 0; - const u8 *mem1 = T2_READ_PTR(gBattlescriptCurrInstr + 1); - const u8 *mem2 = T2_READ_PTR(gBattlescriptCurrInstr + 5); + const u8* mem1 = T2_READ_PTR(gBattlescriptCurrInstr + 1); + const u8* mem2 = T2_READ_PTR(gBattlescriptCurrInstr + 5); u32 size = gBattlescriptCurrInstr[9]; - const u8 *jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 10); - u8 i; + const u8* jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 10); + u8 i; for (i = 0; i < size; i++) { if (*mem1 == *mem2) - ++equalBytes; - ++mem1, ++mem2; + equalBytes++; + mem1++, mem2++; } + if (equalBytes != size) gBattlescriptCurrInstr = jumpPtr; else @@ -3556,67 +3663,63 @@ static void Cmd_jumpifarraynotequal(void) static void Cmd_setbyte(void) { - u8 *memByte = T2_READ_PTR(gBattlescriptCurrInstr + 1); - + u8* memByte = T2_READ_PTR(gBattlescriptCurrInstr + 1); *memByte = gBattlescriptCurrInstr[5]; + gBattlescriptCurrInstr += 6; } static void Cmd_addbyte(void) { - u8 *memByte = T2_READ_PTR(gBattlescriptCurrInstr + 1); - + u8* memByte = T2_READ_PTR(gBattlescriptCurrInstr + 1); *memByte += gBattlescriptCurrInstr[5]; gBattlescriptCurrInstr += 6; } static void Cmd_subbyte(void) { - u8 *memByte = T2_READ_PTR(gBattlescriptCurrInstr + 1); - + u8* memByte = T2_READ_PTR(gBattlescriptCurrInstr + 1); *memByte -= gBattlescriptCurrInstr[5]; gBattlescriptCurrInstr += 6; } static void Cmd_copyarray(void) { - u8 *dest = T2_READ_PTR(gBattlescriptCurrInstr + 1); - const u8 *src = T2_READ_PTR(gBattlescriptCurrInstr + 5); + u8* dest = T2_READ_PTR(gBattlescriptCurrInstr + 1); + const u8* src = T2_READ_PTR(gBattlescriptCurrInstr + 5); s32 size = gBattlescriptCurrInstr[9]; - s32 i; + s32 i; for (i = 0; i < size; i++) - { dest[i] = src[i]; - } + gBattlescriptCurrInstr += 10; } static void Cmd_copyarraywithindex(void) { - u8 *dest = T2_READ_PTR(gBattlescriptCurrInstr + 1); - const u8 *src = T2_READ_PTR(gBattlescriptCurrInstr + 5); - const u8 *index = T2_READ_PTR(gBattlescriptCurrInstr + 9); + u8* dest = T2_READ_PTR(gBattlescriptCurrInstr + 1); + const u8* src = T2_READ_PTR(gBattlescriptCurrInstr + 5); + const u8* index = T2_READ_PTR(gBattlescriptCurrInstr + 9); s32 size = gBattlescriptCurrInstr[13]; - s32 i; + s32 i; for (i = 0; i < size; i++) - { dest[i] = src[i + *index]; - } + gBattlescriptCurrInstr += 14; } static void Cmd_orbyte(void) { - u8 *memByte = T2_READ_PTR(gBattlescriptCurrInstr + 1); + u8* memByte = T2_READ_PTR(gBattlescriptCurrInstr + 1); *memByte |= gBattlescriptCurrInstr[5]; gBattlescriptCurrInstr += 6; } static void Cmd_orhalfword(void) { - u16 *memHword = T2_READ_PTR(gBattlescriptCurrInstr + 1); + u16* memHword = T2_READ_PTR(gBattlescriptCurrInstr + 1); u16 val = T2_READ_16(gBattlescriptCurrInstr + 5); *memHword |= val; @@ -3625,7 +3728,7 @@ static void Cmd_orhalfword(void) static void Cmd_orword(void) { - u32 *memWord = T2_READ_PTR(gBattlescriptCurrInstr + 1); + u32* memWord = T2_READ_PTR(gBattlescriptCurrInstr + 1); u32 val = T2_READ_32(gBattlescriptCurrInstr + 5); *memWord |= val; @@ -3634,15 +3737,14 @@ static void Cmd_orword(void) static void Cmd_bicbyte(void) { - u8 *memByte = T2_READ_PTR(gBattlescriptCurrInstr + 1); - + u8* memByte = T2_READ_PTR(gBattlescriptCurrInstr + 1); *memByte &= ~(gBattlescriptCurrInstr[5]); gBattlescriptCurrInstr += 6; } static void Cmd_bichalfword(void) { - u16 *memHword = T2_READ_PTR(gBattlescriptCurrInstr + 1); + u16* memHword = T2_READ_PTR(gBattlescriptCurrInstr + 1); u16 val = T2_READ_16(gBattlescriptCurrInstr + 5); *memHword &= ~val; @@ -3651,7 +3753,7 @@ static void Cmd_bichalfword(void) static void Cmd_bicword(void) { - u32 *memWord = T2_READ_PTR(gBattlescriptCurrInstr + 1); + u32* memWord = T2_READ_PTR(gBattlescriptCurrInstr + 1); u32 val = T2_READ_32(gBattlescriptCurrInstr + 5); *memWord &= ~val; @@ -3663,7 +3765,6 @@ static void Cmd_pause(void) if (gBattleControllerExecFlags == 0) { u16 value = T2_READ_16(gBattlescriptCurrInstr + 1); - if (++gPauseCounterBattle >= value) { gPauseCounterBattle = 0; @@ -3684,7 +3785,8 @@ static void Cmd_healthbar_update(void) gActiveBattler = gBattlerTarget; else gActiveBattler = gBattlerAttacker; - BtlController_EmitHealthBarUpdate(0, gBattleMoveDamage); + + BtlController_EmitHealthBarUpdate(BUFFER_A, gBattleMoveDamage); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; } @@ -3746,10 +3848,11 @@ static void Cmd_endselectionscript(void) static void Cmd_playanimation(void) { - const u16 *argumentPtr; + const u16* argumentPtr; gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); argumentPtr = T2_READ_PTR(gBattlescriptCurrInstr + 3); + if (gBattlescriptCurrInstr[2] == B_ANIM_STATS_CHANGE || gBattlescriptCurrInstr[2] == B_ANIM_SNATCH_MOVE || gBattlescriptCurrInstr[2] == B_ANIM_SUBSTITUTE_FADE @@ -3785,14 +3888,16 @@ static void Cmd_playanimation(void) } } -static void Cmd_playanimation_var(void) // animation Id is stored in the first pointer +// Same as playanimation, except it takes a pointer to some animation id, instead of taking the value directly +static void Cmd_playanimation_var(void) { - const u16 *argumentPtr; - const u8 *animationIdPtr; + const u16* argumentPtr; + const u8* animationIdPtr; gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); animationIdPtr = T2_READ_PTR(gBattlescriptCurrInstr + 2); argumentPtr = T2_READ_PTR(gBattlescriptCurrInstr + 6); + if (*animationIdPtr == B_ANIM_STATS_CHANGE || *animationIdPtr == B_ANIM_SNATCH_MOVE || *animationIdPtr == B_ANIM_SUBSTITUTE_FADE) @@ -3829,7 +3934,6 @@ static void Cmd_playanimation_var(void) // animation Id is stored in the first p static void Cmd_setgraphicalstatchangevalues(void) { u8 value = 0; - switch (GET_STAT_BUFF_VALUE2(gBattleScripting.statChanger)) { case SET_STAT_BUFF_VALUE(1): // +1 @@ -3859,6 +3963,7 @@ static void Cmd_playstatchangeanimation(void) gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); statsToCheck = gBattlescriptCurrInstr[2]; + if (gBattlescriptCurrInstr[3] & STAT_CHANGE_NEGATIVE) // goes down { s16 startingStatAnimId; @@ -3873,7 +3978,7 @@ static void Cmd_playstatchangeanimation(void) { if (gBattlescriptCurrInstr[3] & STAT_CHANGE_CANT_PREVENT) { - if (gBattleMons[gActiveBattler].statStages[currStat] > 0) + if (gBattleMons[gActiveBattler].statStages[currStat] > MIN_STAT_STAGE) { statAnimId = startingStatAnimId + currStat; changeableStatsCount++; @@ -3885,15 +3990,14 @@ static void Cmd_playstatchangeanimation(void) && !(gBattleMons[gActiveBattler].ability == ABILITY_KEEN_EYE && currStat == STAT_ACC) && !(gBattleMons[gActiveBattler].ability == ABILITY_HYPER_CUTTER && currStat == STAT_ATK)) { - if (gBattleMons[gActiveBattler].statStages[currStat] > 0) + if (gBattleMons[gActiveBattler].statStages[currStat] > MIN_STAT_STAGE) { statAnimId = startingStatAnimId + currStat; changeableStatsCount++; } } } - statsToCheck >>= 1; - currStat++; + statsToCheck >>= 1, currStat++; } if (changeableStatsCount > 1) // more than one stat, so the color is gray @@ -3914,14 +4018,14 @@ static void Cmd_playstatchangeanimation(void) while (statsToCheck != 0) { - if (statsToCheck & 1 && gBattleMons[gActiveBattler].statStages[currStat] < 0xC) + if (statsToCheck & 1 && gBattleMons[gActiveBattler].statStages[currStat] < MAX_STAT_STAGE) { statAnimId = startingStatAnimId + currStat; changeableStatsCount++; } - statsToCheck >>= 1; - currStat++; + statsToCheck >>= 1, currStat++; } + if (changeableStatsCount > 1) // more than one stat, so the color is gray { if (gBattlescriptCurrInstr[3] & STAT_CHANGE_BY_TWO) @@ -3930,6 +4034,7 @@ static void Cmd_playstatchangeanimation(void) statAnimId = STAT_ANIM_MULTIPLE_PLUS1; } } + if (gBattlescriptCurrInstr[3] & STAT_CHANGE_MULTIPLE_STATS && changeableStatsCount < 2) { gBattlescriptCurrInstr += 4; @@ -4019,7 +4124,7 @@ static void Cmd_moveend(void) gBattleScripting.moveendState++; break; case MOVEEND_ON_DAMAGE_ABILITIES: // Such as abilities activating on contact(Poison Spore, Rough Skin, etc.). - if (AbilityBattleEffects(ABILITYEFFECT_MOVE_END, gBattlerTarget, 0, 0, 0)) + if (AbilityBattleEffects(ABILITYEFFECT_ON_DAMAGE, gBattlerTarget, 0, 0, 0)) effect = TRUE; gBattleScripting.moveendState++; break; @@ -4037,8 +4142,8 @@ static void Cmd_moveend(void) case MOVEEND_CHOICE_MOVE: // update choice band move if (gHitMarker & HITMARKER_OBEYS && holdEffectAtk == HOLD_EFFECT_CHOICE_BAND - && gChosenMove != MOVE_STRUGGLE - && (*choicedMoveAtk == 0 || *choicedMoveAtk == 0xFFFF)) + && gChosenMove != MOVE_STRUGGLE + && (*choicedMoveAtk == MOVE_NONE || *choicedMoveAtk == MOVE_UNAVAILABLE)) { if (gChosenMove == MOVE_BATON_PASS && !(gMoveResultFlags & MOVE_RESULT_FAILED)) { @@ -4053,18 +4158,17 @@ static void Cmd_moveend(void) break; } if (i == MAX_MON_MOVES) - *choicedMoveAtk = 0; + *choicedMoveAtk = MOVE_NONE; gBattleScripting.moveendState++; break; case MOVEEND_CHANGED_ITEMS: // changed held items for (i = 0; i < gBattlersCount; i++) { - u16 *changedItem = &gBattleStruct->changedItems[i]; - - if (*changedItem != 0) + u16* changedItem = &gBattleStruct->changedItems[i]; + if (*changedItem != ITEM_NONE) { gBattleMons[i].item = *changedItem; - *changedItem = 0; + *changedItem = ITEM_NONE; } } gBattleScripting.moveendState++; @@ -4082,7 +4186,7 @@ static void Cmd_moveend(void) break; case MOVEEND_ATTACKER_INVISIBLE: // make attacker sprite invisible if (gStatuses3[gBattlerAttacker] & (STATUS3_SEMI_INVULNERABLE) - && gHitMarker & HITMARKER_NO_ANIMATIONS) + && gHitMarker & HITMARKER_NO_ANIMATIONS) { gActiveBattler = gBattlerAttacker; BtlController_EmitSpriteInvisibility(BUFFER_A, TRUE); @@ -4094,13 +4198,13 @@ static void Cmd_moveend(void) break; case MOVEEND_ATTACKER_VISIBLE: // make attacker sprite visible if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT - || !(gStatuses3[gBattlerAttacker] & (STATUS3_SEMI_INVULNERABLE)) - || WasUnableToUseMove(gBattlerAttacker)) + || !(gStatuses3[gBattlerAttacker] & (STATUS3_SEMI_INVULNERABLE)) + || WasUnableToUseMove(gBattlerAttacker)) { gActiveBattler = gBattlerAttacker; BtlController_EmitSpriteInvisibility(BUFFER_A, FALSE); MarkBattlerForControllerExec(gActiveBattler); - gStatuses3[gBattlerAttacker] &= ~(STATUS3_SEMI_INVULNERABLE); + gStatuses3[gBattlerAttacker] &= ~STATUS3_SEMI_INVULNERABLE; gSpecialStatuses[gBattlerAttacker].restoredBattlerSprite = 1; gBattleScripting.moveendState++; return; @@ -4108,14 +4212,13 @@ static void Cmd_moveend(void) gBattleScripting.moveendState++; break; case MOVEEND_TARGET_VISIBLE: // make target sprite visible - if (!gSpecialStatuses[gBattlerTarget].restoredBattlerSprite - && gBattlerTarget < gBattlersCount - && !(gStatuses3[gBattlerTarget] & STATUS3_SEMI_INVULNERABLE)) + if (!gSpecialStatuses[gBattlerTarget].restoredBattlerSprite && gBattlerTarget < gBattlersCount + && !(gStatuses3[gBattlerTarget] & STATUS3_SEMI_INVULNERABLE)) { gActiveBattler = gBattlerTarget; BtlController_EmitSpriteInvisibility(BUFFER_A, FALSE); MarkBattlerForControllerExec(gActiveBattler); - gStatuses3[gBattlerTarget] &= ~(STATUS3_SEMI_INVULNERABLE); + gStatuses3[gBattlerTarget] &= ~STATUS3_SEMI_INVULNERABLE; gBattleScripting.moveendState++; return; } @@ -4125,7 +4228,7 @@ static void Cmd_moveend(void) for (i = 0; i < gBattlersCount; i++) { if (gDisableStructs[i].substituteHP == 0) - gBattleMons[i].status2 &= ~(STATUS2_SUBSTITUTE); + gBattleMons[i].status2 &= ~STATUS2_SUBSTITUTE; } gBattleScripting.moveendState++; break; @@ -4135,7 +4238,7 @@ static void Cmd_moveend(void) gActiveBattler = gBattlerAttacker; gBattlerAttacker = gBattlerTarget; gBattlerTarget = gActiveBattler; - gHitMarker &= ~(HITMARKER_SWAP_ATTACKER_TARGET); + gHitMarker &= ~HITMARKER_SWAP_ATTACKER_TARGET; } if (gHitMarker & HITMARKER_ATTACKSTRING_PRINTED) { @@ -4191,21 +4294,21 @@ static void Cmd_moveend(void) *(gBattleStruct->lastTakenMove + gBattlerTarget * 2 + 0) = gChosenMove; *(gBattleStruct->lastTakenMove + gBattlerTarget * 2 + 1) = gChosenMove >> 8; + target = gBattlerTarget; attacker = gBattlerAttacker; - *(attacker * 2 + target * 8 + (gBattleStruct->lastTakenMoveFrom) + 0) = gChosenMove; + *(attacker * 2 + target * 8 + (u8*)(gBattleStruct->lastTakenMoveFrom) + 0) = gChosenMove; + target = gBattlerTarget; attacker = gBattlerAttacker; - *(attacker * 2 + target * 8 + (gBattleStruct->lastTakenMoveFrom) + 1) = gChosenMove >> 8; + *(attacker * 2 + target * 8 + (u8*)(gBattleStruct->lastTakenMoveFrom) + 1) = gChosenMove >> 8; } gBattleScripting.moveendState++; break; case MOVEEND_NEXT_TARGET: // For moves hitting two opposing Pokemon. - if (!(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) - && gBattleTypeFlags & BATTLE_TYPE_DOUBLE - && !gProtectStructs[gBattlerAttacker].chargingTurn - && gBattleMoves[gCurrentMove].target == MOVE_TARGET_BOTH - && !(gHitMarker & HITMARKER_NO_ATTACKSTRING)) + if (!(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) && gBattleTypeFlags & BATTLE_TYPE_DOUBLE + && !gProtectStructs[gBattlerAttacker].chargingTurn && gBattleMoves[gCurrentMove].target == MOVE_TARGET_BOTH + && !(gHitMarker & HITMARKER_NO_ATTACKSTRING)) { u8 battlerId = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerTarget))); if (gBattleMons[battlerId].hp != 0) @@ -4228,12 +4331,14 @@ static void Cmd_moveend(void) case MOVEEND_COUNT: break; } + if (endMode == 1 && effect == FALSE) gBattleScripting.moveendState = MOVEEND_COUNT; if (endMode == 2 && endState == gBattleScripting.moveendState) gBattleScripting.moveendState = MOVEEND_COUNT; - } - while (gBattleScripting.moveendState != MOVEEND_COUNT && effect == FALSE); + + } while (gBattleScripting.moveendState != MOVEEND_COUNT && effect == FALSE); + if (gBattleScripting.moveendState == MOVEEND_COUNT && effect == FALSE) gBattlescriptCurrInstr += 3; } @@ -4249,7 +4354,7 @@ static void Cmd_typecalc2(void) gLastUsedAbility = gBattleMons[gBattlerTarget].ability; gMoveResultFlags |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE); gLastLandedMoves[gBattlerTarget] = 0; - gBattleCommunication[6] = moveType; + gBattleCommunication[MISS_TYPE] = B_MSG_GROUND_MISS; RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); } else @@ -4324,7 +4429,7 @@ static void Cmd_typecalc2(void) gLastUsedAbility = ABILITY_WONDER_GUARD; gMoveResultFlags |= MOVE_RESULT_MISSED; gLastLandedMoves[gBattlerTarget] = 0; - gBattleCommunication[6] = 3; + gBattleCommunication[MISS_TYPE] = B_MSG_AVOIDED_DMG; RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); } if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) @@ -4346,14 +4451,17 @@ static void Cmd_returnatktoball(void) static void Cmd_getswitchedmondata(void) { - if (gBattleControllerExecFlags == 0) - { - gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - gBattlerPartyIndexes[gActiveBattler] = *(gBattleStruct->monToSwitchIntoId + gActiveBattler); - BtlController_EmitGetMonData(0, REQUEST_ALL_BATTLE, gBitTable[gBattlerPartyIndexes[gActiveBattler]]); - MarkBattlerForControllerExec(gActiveBattler); - gBattlescriptCurrInstr += 2; - } + if (gBattleControllerExecFlags) + return; + + gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); + + gBattlerPartyIndexes[gActiveBattler] = *(gBattleStruct->monToSwitchIntoId + gActiveBattler); + + BtlController_EmitGetMonData(BUFFER_A, REQUEST_ALL_BATTLE, gBitTable[gBattlerPartyIndexes[gActiveBattler]]); + MarkBattlerForControllerExec(gActiveBattler); + + gBattlescriptCurrInstr += 2; } static void Cmd_switchindataupdate(void) @@ -4362,56 +4470,67 @@ static void Cmd_switchindataupdate(void) s32 i; u8 *monData; - if (gBattleControllerExecFlags == 0) + if (gBattleControllerExecFlags) + return; + + gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); + oldData = gBattleMons[gActiveBattler]; + monData = (u8*)(&gBattleMons[gActiveBattler]); + + for (i = 0; i < sizeof(struct BattlePokemon); i++) + monData[i] = gBattleBufferB[gActiveBattler][4 + i]; + + gBattleMons[gActiveBattler].type1 = gBaseStats[gBattleMons[gActiveBattler].species].type1; + gBattleMons[gActiveBattler].type2 = gBaseStats[gBattleMons[gActiveBattler].species].type2; + gBattleMons[gActiveBattler].ability = GetAbilityBySpecies(gBattleMons[gActiveBattler].species, gBattleMons[gActiveBattler].abilityNum); + + // check knocked off item + i = GetBattlerSide(gActiveBattler); + if (gWishFutureKnock.knockedOffMons[i] & gBitTable[gBattlerPartyIndexes[gActiveBattler]]) { - gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - oldData = gBattleMons[gActiveBattler]; - monData = (u8 *)(&gBattleMons[gActiveBattler]); - for (i = 0; i < sizeof(struct BattlePokemon); i++) - { - monData[i] = gBattleBufferB[gActiveBattler][4 + i]; - } - gBattleMons[gActiveBattler].type1 = gBaseStats[gBattleMons[gActiveBattler].species].type1; - gBattleMons[gActiveBattler].type2 = gBaseStats[gBattleMons[gActiveBattler].species].type2; - gBattleMons[gActiveBattler].ability = GetAbilityBySpecies(gBattleMons[gActiveBattler].species, gBattleMons[gActiveBattler].abilityNum); - // check knocked off item - i = GetBattlerSide(gActiveBattler); - if (gWishFutureKnock.knockedOffMons[i] & gBitTable[gBattlerPartyIndexes[gActiveBattler]]) - gBattleMons[gActiveBattler].item = 0; - if (gBattleMoves[gCurrentMove].effect == EFFECT_BATON_PASS) - { - for (i = 0; i < NUM_BATTLE_STATS; i++) - { - gBattleMons[gActiveBattler].statStages[i] = oldData.statStages[i]; - } - gBattleMons[gActiveBattler].status2 = oldData.status2; - } - SwitchInClearSetData(); - gBattleScripting.battler = gActiveBattler; - PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gActiveBattler, gBattlerPartyIndexes[gActiveBattler]); - gBattlescriptCurrInstr += 2; + gBattleMons[gActiveBattler].item = ITEM_NONE; } + + if (gBattleMoves[gCurrentMove].effect == EFFECT_BATON_PASS) + { + for (i = 0; i < NUM_BATTLE_STATS; i++) + { + gBattleMons[gActiveBattler].statStages[i] = oldData.statStages[i]; + } + gBattleMons[gActiveBattler].status2 = oldData.status2; + } + + SwitchInClearSetData(); + + gBattleScripting.battler = gActiveBattler; + + PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gActiveBattler, gBattlerPartyIndexes[gActiveBattler]); + + gBattlescriptCurrInstr += 2; } static void Cmd_switchinanim(void) { - if (gBattleControllerExecFlags == 0) - { - gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT - && !(gBattleTypeFlags & - (BATTLE_TYPE_LINK - | BATTLE_TYPE_LEGENDARY - | BATTLE_TYPE_OLD_MAN_TUTORIAL - | BATTLE_TYPE_POKEDUDE - | BATTLE_TYPE_EREADER_TRAINER - | BATTLE_TYPE_GHOST))) - HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), FLAG_SET_SEEN, gBattleMons[gActiveBattler].personality); - gAbsentBattlerFlags &= ~(gBitTable[gActiveBattler]); - BtlController_EmitSwitchInAnim(0, gBattlerPartyIndexes[gActiveBattler], gBattlescriptCurrInstr[2]); - MarkBattlerForControllerExec(gActiveBattler); - gBattlescriptCurrInstr += 3; - } + if (gBattleControllerExecFlags) + return; + + gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); + + if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT + && !(gBattleTypeFlags & (BATTLE_TYPE_LINK + | BATTLE_TYPE_LEGENDARY + | BATTLE_TYPE_OLD_MAN_TUTORIAL + | BATTLE_TYPE_POKEDUDE + | BATTLE_TYPE_EREADER_TRAINER + | BATTLE_TYPE_GHOST))) + HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), FLAG_SET_SEEN, gBattleMons[gActiveBattler].personality); + + gAbsentBattlerFlags &= ~(gBitTable[gActiveBattler]); + + BtlController_EmitSwitchInAnim(BUFFER_A, gBattlerPartyIndexes[gActiveBattler], gBattlescriptCurrInstr[2]); + MarkBattlerForControllerExec(gActiveBattler); + + gBattlescriptCurrInstr += 3; } static void Cmd_jumpifcantswitch(void) @@ -4420,10 +4539,10 @@ static void Cmd_jumpifcantswitch(void) s32 lastMonId; struct Pokemon *party; - gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1] & ~(ATK4F_DONT_CHECK_STATUSES)); - if (!(gBattlescriptCurrInstr[1] & ATK4F_DONT_CHECK_STATUSES) - && ((gBattleMons[gActiveBattler].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)) - || (gStatuses3[gActiveBattler] & STATUS3_ROOTED))) + gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1] & ~SWITCH_IGNORE_ESCAPE_PREVENTION); + if (!(gBattlescriptCurrInstr[1] & SWITCH_IGNORE_ESCAPE_PREVENTION) + && ((gBattleMons[gActiveBattler].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)) + || (gStatuses3[gActiveBattler] & STATUS3_ROOTED))) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); } @@ -4445,6 +4564,7 @@ static void Cmd_jumpifcantswitch(void) && gBattlerPartyIndexes[gActiveBattler] != i) break; } + if (i == lastMonId) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); else @@ -4457,41 +4577,49 @@ static void Cmd_jumpifcantswitch(void) if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT) { battlerIn1 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) battlerIn2 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); else battlerIn2 = battlerIn1; + party = gEnemyParty; } else { battlerIn1 = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) battlerIn2 = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); else battlerIn2 = battlerIn1; + party = gPlayerParty; } + for (i = 0; i < PARTY_SIZE; i++) { if (GetMonData(&party[i], MON_DATA_HP) != 0 && GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE && !GetMonData(&party[i], MON_DATA_IS_EGG) - && i != gBattlerPartyIndexes[battlerIn1] - && i != gBattlerPartyIndexes[battlerIn2]) + && i != gBattlerPartyIndexes[battlerIn1] && i != gBattlerPartyIndexes[battlerIn2]) break; } - if (i == 6) + + if (i == PARTY_SIZE) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); else gBattlescriptCurrInstr += 6; } } -static void ChooseMonToSendOut(u8 arg0) +// Opens the party screen to choose a new Pokémon to send out. +// slotId is the Pokémon to replace. +// Note that this is not used by the Switch action, only replacing fainted Pokémon or Baton Pass +static void ChooseMonToSendOut(u8 slotId) { *(gBattleStruct->battlerPartyIndexes + gActiveBattler) = gBattlerPartyIndexes[gActiveBattler]; - BtlController_EmitChoosePokemon(0, PARTY_ACTION_SEND_OUT, arg0, 0, gBattleStruct->battlerPartyOrders[gActiveBattler]); + BtlController_EmitChoosePokemon(BUFFER_A, PARTY_ACTION_SEND_OUT, slotId, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); MarkBattlerForControllerExec(gActiveBattler); } @@ -4505,11 +4633,12 @@ static void Cmd_openpartyscreen(void) battlerId = 0; flags = 0; jumpPtr = T1_READ_PTR(gBattlescriptCurrInstr + 2); - if (gBattlescriptCurrInstr[1] == 5) + + if (gBattlescriptCurrInstr[1] == BS_FAINTED_LINK_MULTIPLE_1) { if ((gBattleTypeFlags & (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI)) != BATTLE_TYPE_DOUBLE) { - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; ++gActiveBattler) + for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { if (gHitMarker & HITMARKER_FAINTED(gActiveBattler)) { @@ -4522,7 +4651,7 @@ static void Cmd_openpartyscreen(void) } else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement) { - ChooseMonToSendOut(6); + ChooseMonToSendOut(PARTY_SIZE); gSpecialStatuses[gActiveBattler].faintedHasReplacement = TRUE; } } @@ -4535,9 +4664,10 @@ static void Cmd_openpartyscreen(void) } else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { - u8 flag40_0, flag40_1, flag40_2, flag40_3; + bool8 hasReplacement_0, hasReplacement_1, hasReplacement_2, hasReplacement_3; + + hitmarkerFaintBits = gHitMarker >> 28; - hitmarkerFaintBits = gHitMarker >> 0x1C; if (gBitTable[0] & hitmarkerFaintBits) { gActiveBattler = 0; @@ -4624,11 +4754,12 @@ static void Cmd_openpartyscreen(void) MarkBattlerForControllerExec(gActiveBattler); } } - flag40_0 = gSpecialStatuses[0].faintedHasReplacement; - if (!flag40_0) + + hasReplacement_0 = gSpecialStatuses[0].faintedHasReplacement; + if (!hasReplacement_0) { - flag40_2 = gSpecialStatuses[2].faintedHasReplacement; - if (!flag40_2 && hitmarkerFaintBits != 0) + hasReplacement_2 = gSpecialStatuses[2].faintedHasReplacement; + if (!hasReplacement_2 && hitmarkerFaintBits != 0) { if (gAbsentBattlerFlags & gBitTable[0]) gActiveBattler = 2; @@ -4640,16 +4771,17 @@ static void Cmd_openpartyscreen(void) } } - flag40_1 = gSpecialStatuses[1].faintedHasReplacement; - if (!flag40_1) + hasReplacement_1 = gSpecialStatuses[1].faintedHasReplacement; + if (!hasReplacement_1) { - flag40_3 = gSpecialStatuses[3].faintedHasReplacement; - if (!flag40_3 && hitmarkerFaintBits != 0) + hasReplacement_3 = gSpecialStatuses[3].faintedHasReplacement; + if (!hasReplacement_3 && hitmarkerFaintBits != 0) { if (gAbsentBattlerFlags & gBitTable[1]) gActiveBattler = 3; else gActiveBattler = 1; + BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_MSG_ONLY); MarkBattlerForControllerExec(gActiveBattler); } @@ -4657,7 +4789,7 @@ static void Cmd_openpartyscreen(void) } gBattlescriptCurrInstr += 6; } - else if (gBattlescriptCurrInstr[1] == 6) + else if (gBattlescriptCurrInstr[1] == BS_FAINTED_LINK_MULTIPLE_2) { if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) { @@ -4683,7 +4815,7 @@ static void Cmd_openpartyscreen(void) if (gBitTable[3] & hitmarkerFaintBits && hitmarkerFaintBits & gBitTable[1]) { gActiveBattler = 3; - if (HasNoMonsToSwitch(gActiveBattler, gBattleBufferB[1][1], 6)) + if (HasNoMonsToSwitch(gActiveBattler, gBattleBufferB[1][1], PARTY_SIZE)) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler); @@ -4700,36 +4832,34 @@ static void Cmd_openpartyscreen(void) } else { + // Not multi or double battle gBattlescriptCurrInstr += 6; } } else { + // Multi battle gBattlescriptCurrInstr += 6; } - hitmarkerFaintBits = gHitMarker >> 0x1C; + hitmarkerFaintBits = gHitMarker >> 28; gBattlerFainted = 0; - while (1) - { - if (gBitTable[gBattlerFainted] & hitmarkerFaintBits) - break; - if (gBattlerFainted >= gBattlersCount) - break; + while (!(gBitTable[gBattlerFainted] & hitmarkerFaintBits) + && gBattlerFainted < gBattlersCount) gBattlerFainted++; - } if (gBattlerFainted == gBattlersCount) gBattlescriptCurrInstr = jumpPtr; } else { - if (gBattlescriptCurrInstr[1] & OPEN_PARTY_ALLOW_CANCEL) + if (gBattlescriptCurrInstr[1] & PARTY_SCREEN_OPTIONAL) hitmarkerFaintBits = PARTY_ACTION_CHOOSE_MON; // Used here as the caseId for the EmitChoose function. else hitmarkerFaintBits = PARTY_ACTION_SEND_OUT; - battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1] & ~(OPEN_PARTY_ALLOW_CANCEL)); + + battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1] & ~PARTY_SCREEN_OPTIONAL); if (gSpecialStatuses[battlerId].faintedHasReplacement) { gBattlescriptCurrInstr += 6; @@ -4745,15 +4875,18 @@ static void Cmd_openpartyscreen(void) { gActiveBattler = battlerId; *(gBattleStruct->battlerPartyIndexes + gActiveBattler) = gBattlerPartyIndexes[gActiveBattler]; - BtlController_EmitChoosePokemon(0, hitmarkerFaintBits, *(gBattleStruct->monToSwitchIntoId + (gActiveBattler ^ 2)), 0, gBattleStruct->battlerPartyOrders[gActiveBattler]); + + BtlController_EmitChoosePokemon(BUFFER_A, hitmarkerFaintBits, *(gBattleStruct->monToSwitchIntoId + (gActiveBattler ^ 2)), 0, gBattleStruct->battlerPartyOrders[gActiveBattler]); MarkBattlerForControllerExec(gActiveBattler); + gBattlescriptCurrInstr += 6; - if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_LEFT && gBattleResults.playerSwitchesCounter < 0xFF) - ++gBattleResults.playerSwitchesCounter; + + if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_LEFT && gBattleResults.playerSwitchesCounter < 255) + gBattleResults.playerSwitchesCounter++; if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; ++gActiveBattler) + for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { if (gActiveBattler != battlerId) { @@ -4767,6 +4900,7 @@ static void Cmd_openpartyscreen(void) gActiveBattler = GetBattlerAtPosition(GetBattlerPosition(battlerId) ^ BIT_SIDE); if (gAbsentBattlerFlags & gBitTable[gActiveBattler]) gActiveBattler ^= BIT_FLANK; + BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_MSG_ONLY); MarkBattlerForControllerExec(gActiveBattler); } @@ -4777,44 +4911,51 @@ static void Cmd_openpartyscreen(void) static void Cmd_switchhandleorder(void) { s32 i; + if (gBattleControllerExecFlags) + return; - if (gBattleControllerExecFlags == 0) + gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); + + switch (gBattlescriptCurrInstr[2]) { - gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - switch (gBattlescriptCurrInstr[2]) + case 0: + for (i = 0; i < gBattlersCount; i++) { - case 0: - for (i = 0; i < gBattlersCount; i++) - if (gBattleBufferB[i][0] == 0x22) - *(gBattleStruct->monToSwitchIntoId + i) = gBattleBufferB[i][1]; - break; - case 1: - if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) - UpdatePartyOwnerOnSwitch_NonMulti(gActiveBattler); - break; - case 2: - gBattleCommunication[0] = gBattleBufferB[gActiveBattler][1]; - *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = gBattleBufferB[gActiveBattler][1]; - - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + if (gBattleBufferB[i][0] == CONTROLLER_CHOSENMONRETURNVALUE) { - *(gActiveBattler * 3 + (u8 *)(gBattleStruct->battlerPartyOrders) + 0) &= 0xF; - *(gActiveBattler * 3 + (u8 *)(gBattleStruct->battlerPartyOrders) + 0) |= (gBattleBufferB[gActiveBattler][2] & 0xF0); - *(gActiveBattler * 3 + (u8 *)(gBattleStruct->battlerPartyOrders) + 1) = gBattleBufferB[gActiveBattler][3]; - *((gActiveBattler ^ BIT_FLANK) * 3 + (u8 *)(gBattleStruct->battlerPartyOrders) + 0) &= (0xF0); - *((gActiveBattler ^ BIT_FLANK) * 3 + (u8 *)(gBattleStruct->battlerPartyOrders) + 0) |= (gBattleBufferB[gActiveBattler][2] & 0xF0) >> 4; - *((gActiveBattler ^ BIT_FLANK) * 3 + (u8 *)(gBattleStruct->battlerPartyOrders) + 2) = gBattleBufferB[gActiveBattler][3]; + *(gBattleStruct->monToSwitchIntoId + i) = gBattleBufferB[i][1]; } - else - { - UpdatePartyOwnerOnSwitch_NonMulti(gActiveBattler); - } - PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerAttacker].species) - PREPARE_MON_NICK_BUFFER(gBattleTextBuff2, gActiveBattler, gBattleBufferB[gActiveBattler][1]) - break; } - gBattlescriptCurrInstr += 3; + break; + case 1: + if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) + UpdatePartyOwnerOnSwitch_NonMulti(gActiveBattler); + break; + case 2: + gBattleCommunication[0] = gBattleBufferB[gActiveBattler][1]; + *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = gBattleBufferB[gActiveBattler][1]; + + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + *(gActiveBattler * 3 + (u8*)(gBattleStruct->battlerPartyOrders) + 0) &= 0xF; + *(gActiveBattler * 3 + (u8*)(gBattleStruct->battlerPartyOrders) + 0) |= (gBattleBufferB[gActiveBattler][2] & 0xF0); + *(gActiveBattler * 3 + (u8*)(gBattleStruct->battlerPartyOrders) + 1) = gBattleBufferB[gActiveBattler][3]; + + *((gActiveBattler ^ BIT_FLANK) * 3 + (u8 *)(gBattleStruct->battlerPartyOrders) + 0) &= (0xF0); + *((gActiveBattler ^ BIT_FLANK) * 3 + (u8 *)(gBattleStruct->battlerPartyOrders) + 0) |= (gBattleBufferB[gActiveBattler][2] & 0xF0) >> 4; + *((gActiveBattler ^ BIT_FLANK) * 3 + (u8 *)(gBattleStruct->battlerPartyOrders) + 2) = gBattleBufferB[gActiveBattler][3]; + } + else + { + UpdatePartyOwnerOnSwitch_NonMulti(gActiveBattler); + } + PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerAttacker].species) + PREPARE_MON_NICK_BUFFER(gBattleTextBuff2, gActiveBattler, gBattleBufferB[gActiveBattler][1]) + + break; } + + gBattlescriptCurrInstr += 3; } static void Cmd_switchineffects(void) @@ -4823,22 +4964,31 @@ static void Cmd_switchineffects(void) gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); UpdateSentPokesToOpponentValue(gActiveBattler); + gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler); gSpecialStatuses[gActiveBattler].faintedHasReplacement = FALSE; + if (!(gSideStatuses[GetBattlerSide(gActiveBattler)] & SIDE_STATUS_SPIKES_DAMAGED) - && (gSideStatuses[GetBattlerSide(gActiveBattler)] & SIDE_STATUS_SPIKES) - && !IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_FLYING) - && gBattleMons[gActiveBattler].ability != ABILITY_LEVITATE) + && (gSideStatuses[GetBattlerSide(gActiveBattler)] & SIDE_STATUS_SPIKES) + && !IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_FLYING) + && gBattleMons[gActiveBattler].ability != ABILITY_LEVITATE) { u8 spikesDmg; gSideStatuses[GetBattlerSide(gActiveBattler)] |= SIDE_STATUS_SPIKES_DAMAGED; + + // Present in pokeemerald but not here + // gBattleMons[gActiveBattler].status2 &= ~STATUS2_DESTINY_BOND; + // gHitMarker &= ~HITMARKER_DESTINYBOND; + spikesDmg = (5 - gSideTimers[GetBattlerSide(gActiveBattler)].spikesAmount) * 2; gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / (spikesDmg); if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; + gBattleScripting.battler = gActiveBattler; BattleScriptPushCursor(); + if (gBattlescriptCurrInstr[1] == BS_TARGET) gBattlescriptCurrInstr = BattleScript_SpikesOnTarget; else if (gBattlescriptCurrInstr[1] == BS_ATTACKER) @@ -4848,8 +4998,14 @@ static void Cmd_switchineffects(void) } else { + // There is a hack here in pokeemerald to ensure the truant counter will be 0 when the battler's next turn starts. + // The truant counter is not updated in the case where a mon switches in after a lost judgement in the battle arena. if (gBattleMons[gActiveBattler].ability == ABILITY_TRUANT) + //if (gBattleMons[gActiveBattler].ability == ABILITY_TRUANT && !gDisableStructs[gActiveBattler].truantSwitchInHack) // In pokeemerald. gDisableStructs[gActiveBattler].truantCounter = 1; + + //gDisableStructs[gActiveBattler].truantSwitchInHack = 0; // In pokeemerald, otherwise unused. + if (!AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, gActiveBattler, 0, 0, 0) && !ItemBattleEffects(ITEMEFFECT_ON_SWITCH_IN, gActiveBattler, FALSE)) { @@ -4863,11 +5019,11 @@ static void Cmd_switchineffects(void) for (i = 0; i < gBattlersCount; i++) { - u16 *hpOnSwitchout = &gBattleStruct->hpOnSwitchout[GetBattlerSide(i)]; + u16* hpOnSwitchout = &gBattleStruct->hpOnSwitchout[GetBattlerSide(i)]; *hpOnSwitchout = gBattleMons[i].hp; } - if (gBattlescriptCurrInstr[1] == 5) + if (gBattlescriptCurrInstr[1] == BS_FAINTED_LINK_MULTIPLE_1) { u32 hitmarkerFaintBits = gHitMarker >> 28; @@ -4894,6 +5050,7 @@ static void Cmd_trainerslidein(void) gActiveBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); BtlController_EmitTrainerSlide(BUFFER_A); MarkBattlerForControllerExec(gActiveBattler); + gBattlescriptCurrInstr += 2; } @@ -4902,6 +5059,7 @@ static void Cmd_playse(void) gActiveBattler = gBattlerAttacker; BtlController_EmitPlaySE(BUFFER_A, T2_READ_16(gBattlescriptCurrInstr + 1)); MarkBattlerForControllerExec(gActiveBattler); + gBattlescriptCurrInstr += 3; } @@ -4910,6 +5068,7 @@ static void Cmd_fanfare(void) gActiveBattler = gBattlerAttacker; BtlController_EmitPlayFanfare(BUFFER_A, T2_READ_16(gBattlescriptCurrInstr + 1)); MarkBattlerForControllerExec(gActiveBattler); + gBattlescriptCurrInstr += 3; } @@ -4918,6 +5077,7 @@ static void Cmd_playfaintcry(void) gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); BtlController_EmitFaintingCry(BUFFER_A); MarkBattlerForControllerExec(gActiveBattler); + gBattlescriptCurrInstr += 2; } @@ -4926,6 +5086,7 @@ static void Cmd_endlinkbattle(void) gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); BtlController_EmitEndLinkBattle(BUFFER_A, gBattleOutcome); MarkBattlerForControllerExec(gActiveBattler); + gBattlescriptCurrInstr += 1; } @@ -4934,6 +5095,7 @@ static void Cmd_returntoball(void) gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); BtlController_EmitReturnMonToBall(BUFFER_A, TRUE); MarkBattlerForControllerExec(gActiveBattler); + gBattlescriptCurrInstr += 2; } @@ -4941,10 +5103,11 @@ static void Cmd_handlelearnnewmove(void) { const u8 *learnedMovePtr = T1_READ_PTR(gBattlescriptCurrInstr + 1); const u8 *nothingToLearnPtr = T1_READ_PTR(gBattlescriptCurrInstr + 5); + u16 learnMove = MonTryLearningNewMove(&gPlayerParty[gBattleStruct->expGetterMonId], gBattlescriptCurrInstr[9]); - while (learnMove == MON_ALREADY_KNOWS_MOVE) learnMove = MonTryLearningNewMove(&gPlayerParty[gBattleStruct->expGetterMonId], FALSE); + if (learnMove == MOVE_NONE) { gBattlescriptCurrInstr = nothingToLearnPtr; @@ -4956,6 +5119,7 @@ static void Cmd_handlelearnnewmove(void) else { gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); + if (gBattlerPartyIndexes[gActiveBattler] == gBattleStruct->expGetterMonId && !(gBattleMons[gActiveBattler].status2 & STATUS2_TRANSFORMED)) { @@ -4970,6 +5134,7 @@ static void Cmd_handlelearnnewmove(void) GiveMoveToBattleMon(&gBattleMons[gActiveBattler], learnMove); } } + gBattlescriptCurrInstr = learnedMovePtr; } } @@ -4981,9 +5146,9 @@ static void Cmd_yesnoboxlearnmove(void) switch (gBattleScripting.learnMoveState) { case 0: - HandleBattleWindow(0x17, 8, 0x1D, 0xD, 0); + HandleBattleWindow(23, 8, 29, 13, 0); BattlePutTextOnWindow(gText_BattleYesNoChoice, (B_WIN_YESNO | B_TEXT_FLAG_NONE)); - ++gBattleScripting.learnMoveState; + gBattleScripting.learnMoveState++; gBattleCommunication[CURSOR_POSITION] = 0; BattleCreateYesNoCursorAt(); break; @@ -5007,9 +5172,9 @@ static void Cmd_yesnoboxlearnmove(void) PlaySE(SE_SELECT); if (gBattleCommunication[1] == 0) { - HandleBattleWindow(0x17, 0x8, 0x1D, 0xD, WINDOW_CLEAR); - BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); - ++gBattleScripting.learnMoveState; + HandleBattleWindow(23, 8, 29, 13, WINDOW_CLEAR); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); + gBattleScripting.learnMoveState++; } else { @@ -5027,15 +5192,14 @@ static void Cmd_yesnoboxlearnmove(void) { FreeAllWindowBuffers(); ShowSelectMovePokemonSummaryScreen(gPlayerParty, gBattleStruct->expGetterMonId, gPlayerPartyCount - 1, ReshowBattleScreenAfterMenu, gMoveToLearn); - ++gBattleScripting.learnMoveState; + gBattleScripting.learnMoveState++; } break; case 3: if (!gPaletteFade.active && gMain.callback2 == BattleMainCB2) { u8 movePosition = GetMoveSlotToReplace(); - - if (movePosition == 4) + if (movePosition == MAX_MON_MOVES) { gBattleScripting.learnMoveState = 4; } @@ -5051,20 +5215,20 @@ static void Cmd_yesnoboxlearnmove(void) else { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + PREPARE_MOVE_BUFFER(gBattleTextBuff2, moveId) + RemoveMonPPBonus(&gPlayerParty[gBattleStruct->expGetterMonId], movePosition); SetMonMoveSlot(&gPlayerParty[gBattleStruct->expGetterMonId], gMoveToLearn, movePosition); - if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterMonId - && !(gBattleMons[0].status2 & STATUS2_TRANSFORMED) - && !(gDisableStructs[0].mimickedMoves & gBitTable[movePosition])) + + if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterMonId && MOVE_IS_PERMANENT(0, movePosition)) { RemoveBattleMonPPBonus(&gBattleMons[0], movePosition); SetBattleMonMoveSlot(&gBattleMons[0], gMoveToLearn, movePosition); } if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE - && gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId - && !(gBattleMons[2].status2 & STATUS2_TRANSFORMED) - && !(gDisableStructs[2].mimickedMoves & gBitTable[movePosition])) + && gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId + && MOVE_IS_PERMANENT(2, movePosition)) { RemoveBattleMonPPBonus(&gBattleMons[2], movePosition); SetBattleMonMoveSlot(&gBattleMons[2], gMoveToLearn, movePosition); @@ -5074,7 +5238,7 @@ static void Cmd_yesnoboxlearnmove(void) } break; case 4: - HandleBattleWindow(0x17, 8, 0x1D, 0xD, WINDOW_CLEAR); + HandleBattleWindow(23, 8, 29, 13, WINDOW_CLEAR); gBattlescriptCurrInstr += 5; break; case 5: @@ -5091,9 +5255,9 @@ static void Cmd_yesnoboxstoplearningmove(void) switch (gBattleScripting.learnMoveState) { case 0: - HandleBattleWindow(0x17, 8, 0x1D, 0xD, 0); + HandleBattleWindow(23, 8, 29, 13, 0); BattlePutTextOnWindow(gText_BattleYesNoChoice, (B_WIN_YESNO | B_TEXT_FLAG_NONE)); - ++gBattleScripting.learnMoveState; + gBattleScripting.learnMoveState++; gBattleCommunication[CURSOR_POSITION] = 0; BattleCreateYesNoCursorAt(); break; @@ -5120,13 +5284,14 @@ static void Cmd_yesnoboxstoplearningmove(void) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else gBattlescriptCurrInstr += 5; - HandleBattleWindow(0x17, 0x8, 0x1D, 0xD, WINDOW_CLEAR); + + HandleBattleWindow(23, 8, 29, 13, WINDOW_CLEAR); } else if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - HandleBattleWindow(0x17, 0x8, 0x1D, 0xD, WINDOW_CLEAR); + HandleBattleWindow(23, 8, 29, 13, WINDOW_CLEAR); } break; } @@ -5135,15 +5300,14 @@ static void Cmd_yesnoboxstoplearningmove(void) static void Cmd_hitanimation(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); + if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) { gBattlescriptCurrInstr += 2; } - else if (!(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE) - || !(gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE) - || gDisableStructs[gActiveBattler].substituteHP == 0) + else if (!(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE) || !(gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE) || gDisableStructs[gActiveBattler].substituteHP == 0) { - BtlController_EmitHitAnimation(0); + BtlController_EmitHitAnimation(BUFFER_A); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; } @@ -5221,6 +5385,7 @@ static void Cmd_getmoneyreward(void) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } +// Command is never used static void Cmd_updatebattlermoves(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); @@ -5228,16 +5393,15 @@ static void Cmd_updatebattlermoves(void) switch (gBattleCommunication[0]) { case 0: - BtlController_EmitGetMonData(0, REQUEST_ALL_BATTLE, 0); + BtlController_EmitGetMonData(BUFFER_A, REQUEST_ALL_BATTLE, 0); MarkBattlerForControllerExec(gActiveBattler); - ++gBattleCommunication[0]; + gBattleCommunication[0]++; break; case 1: if (gBattleControllerExecFlags == 0) { s32 i; - struct BattlePokemon *bufferPoke = (struct BattlePokemon *) &gBattleBufferB[gActiveBattler][4]; - + struct BattlePokemon *bufferPoke = (struct BattlePokemon*) &gBattleBufferB[gActiveBattler][4]; for (i = 0; i < MAX_MON_MOVES; i++) { gBattleMons[gActiveBattler].moves[i] = bufferPoke->moves[i]; @@ -5277,40 +5441,43 @@ static void Cmd_drawpartystatussummary(void) struct Pokemon *party; struct HpAndStatus hpStatuses[PARTY_SIZE]; - if (gBattleControllerExecFlags == 0) + if (gBattleControllerExecFlags) + return; + + gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); + + if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) + party = gPlayerParty; + else + party = gEnemyParty; + + for (i = 0; i < PARTY_SIZE; i++) { - gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - - if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) - party = gPlayerParty; - else - party = gEnemyParty; - - for (i = 0; i < PARTY_SIZE; i++) + if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_NONE + || GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG) { - if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_NONE - || GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG) - { - hpStatuses[i].hp = 0xFFFF; - hpStatuses[i].status = 0; - } - else - { - hpStatuses[i].hp = GetMonData(&party[i], MON_DATA_HP); - hpStatuses[i].status = GetMonData(&party[i], MON_DATA_STATUS); - } + hpStatuses[i].hp = 0xFFFF; + hpStatuses[i].status = 0; + } + else + { + hpStatuses[i].hp = GetMonData(&party[i], MON_DATA_HP); + hpStatuses[i].status = GetMonData(&party[i], MON_DATA_STATUS); } - BtlController_EmitDrawPartyStatusSummary(0, hpStatuses, 1); - MarkBattlerForControllerExec(gActiveBattler); - gBattlescriptCurrInstr += 2; } + + BtlController_EmitDrawPartyStatusSummary(BUFFER_A, hpStatuses, 1); + MarkBattlerForControllerExec(gActiveBattler); + + gBattlescriptCurrInstr += 2; } static void Cmd_hidepartystatussummary(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - BtlController_EmitHidePartyStatusSummary(0); + BtlController_EmitHidePartyStatusSummary(BUFFER_A); MarkBattlerForControllerExec(gActiveBattler); + gBattlescriptCurrInstr += 2; } @@ -5320,6 +5487,7 @@ static void Cmd_jumptocalledmove(void) gCurrentMove = gCalledMove; else gChosenMove = gCurrentMove = gCalledMove; + gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; } @@ -5329,10 +5497,10 @@ static void Cmd_statusanimation(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); if (!(gStatuses3[gActiveBattler] & STATUS3_SEMI_INVULNERABLE) - && gDisableStructs[gActiveBattler].substituteHP == 0 - && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) + && gDisableStructs[gActiveBattler].substituteHP == 0 + && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) { - BtlController_EmitStatusAnimation(0, FALSE, gBattleMons[gActiveBattler].status1); + BtlController_EmitStatusAnimation(BUFFER_A, FALSE, gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); } gBattlescriptCurrInstr += 2; @@ -5348,10 +5516,10 @@ static void Cmd_status2animation(void) gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); wantedToAnimate = T1_READ_32(gBattlescriptCurrInstr + 2); if (!(gStatuses3[gActiveBattler] & STATUS3_SEMI_INVULNERABLE) - && gDisableStructs[gActiveBattler].substituteHP == 0 - && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) + && gDisableStructs[gActiveBattler].substituteHP == 0 + && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) { - BtlController_EmitStatusAnimation(0, TRUE, gBattleMons[gActiveBattler].status2 & wantedToAnimate); + BtlController_EmitStatusAnimation(BUFFER_A, TRUE, gBattleMons[gActiveBattler].status2 & wantedToAnimate); MarkBattlerForControllerExec(gActiveBattler); } gBattlescriptCurrInstr += 6; @@ -5367,10 +5535,10 @@ static void Cmd_chosenstatusanimation(void) gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); wantedStatus = T1_READ_32(gBattlescriptCurrInstr + 3); if (!(gStatuses3[gActiveBattler] & STATUS3_SEMI_INVULNERABLE) - && gDisableStructs[gActiveBattler].substituteHP == 0 - && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) + && gDisableStructs[gActiveBattler].substituteHP == 0 + && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) { - BtlController_EmitStatusAnimation(0, gBattlescriptCurrInstr[2], wantedStatus); + BtlController_EmitStatusAnimation(BUFFER_A, gBattlescriptCurrInstr[2], wantedStatus); MarkBattlerForControllerExec(gActiveBattler); } gBattlescriptCurrInstr += 7; @@ -5382,9 +5550,9 @@ static void Cmd_yesnobox(void) switch (gBattleCommunication[0]) { case 0: - HandleBattleWindow(0x17, 8, 0x1D, 0xD, 0); + HandleBattleWindow(23, 8, 29, 13, 0); BattlePutTextOnWindow(gText_BattleYesNoChoice, (B_WIN_YESNO | B_TEXT_FLAG_NONE)); - ++gBattleCommunication[0]; + gBattleCommunication[0]++; gBattleCommunication[CURSOR_POSITION] = 0; BattleCreateYesNoCursorAt(); break; @@ -5407,13 +5575,13 @@ static void Cmd_yesnobox(void) { gBattleCommunication[CURSOR_POSITION] = 1; PlaySE(SE_SELECT); - HandleBattleWindow(0x17, 8, 0x1D, 0xD, WINDOW_CLEAR); + HandleBattleWindow(23, 8, 29, 13, WINDOW_CLEAR); gBattlescriptCurrInstr++; } else if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); - HandleBattleWindow(0x17, 8, 0x1D, 0xD, WINDOW_CLEAR); + HandleBattleWindow(23, 8, 29, 13, WINDOW_CLEAR); gBattlescriptCurrInstr++; } break; @@ -5426,11 +5594,11 @@ static void Cmd_cancelallactions(void) for (i = 0; i < gBattlersCount; i++) gActionsByTurnOrder[i] = B_ACTION_CANCEL_PARTNER; + gBattlescriptCurrInstr++; } -// The same as 0x7, except there's no random damage multiplier. -static void Cmd_adjustsetdamage(void) +static void Cmd_adjustsetdamage(void) // The same as adjustnormaldamage, except there's no random damage multiplier. { u8 holdEffect, param; @@ -5444,7 +5612,9 @@ static void Cmd_adjustsetdamage(void) holdEffect = ItemId_GetHoldEffect(gBattleMons[gBattlerTarget].item); param = ItemId_GetHoldEffectParam(gBattleMons[gBattlerTarget].item); } + gPotentialItemEffectBattler = gBattlerTarget; + if (holdEffect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < param) { RecordItemEffectBattle(gBattlerTarget, holdEffect); @@ -5470,20 +5640,24 @@ static void Cmd_adjustsetdamage(void) static void Cmd_removeitem(void) { - u16 *usedHeldItem; + u16* usedHeldItem; gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); + usedHeldItem = &gBattleStruct->usedHeldItems[gActiveBattler]; *usedHeldItem = gBattleMons[gActiveBattler].item; gBattleMons[gActiveBattler].item = ITEM_NONE; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBattler].item); + + BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].item), &gBattleMons[gActiveBattler].item); MarkBattlerForControllerExec(gActiveBattler); + gBattlescriptCurrInstr += 2; } static void Cmd_atknameinbuff1(void) { PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBattlerAttacker, gBattlerPartyIndexes[gBattlerAttacker]) + gBattlescriptCurrInstr++; } @@ -5491,6 +5665,9 @@ static void Cmd_drawlvlupbox(void) { if (gBattleScripting.drawlvlupboxState == 0) { + // If the Pokémon getting exp is not in-battle then + // slide out a banner with their name and icon on it. + // Otherwise skip ahead. if (IsMonGettingExpSentOut()) gBattleScripting.drawlvlupboxState = 3; else @@ -5500,10 +5677,11 @@ static void Cmd_drawlvlupbox(void) switch (gBattleScripting.drawlvlupboxState) { case 1: - gBattle_BG2_Y = 0x60; + // Start level up banner + gBattle_BG2_Y = 96; SetBgAttribute(2, BG_ATTR_PRIORITY, 0); ShowBg(2); - sub_8026480(); + InitLevelUpBanner(); gBattleScripting.drawlvlupboxState = 2; break; case 2: @@ -5511,44 +5689,49 @@ static void Cmd_drawlvlupbox(void) gBattleScripting.drawlvlupboxState = 3; break; case 3: + // Init level up box gBattle_BG1_X = 0; - gBattle_BG1_Y = 0x100; + gBattle_BG1_Y = 256; SetBgAttribute(0, BG_ATTR_PRIORITY, 1); SetBgAttribute(1, BG_ATTR_PRIORITY, 0); ShowBg(0); ShowBg(1); - HandleBattleWindow(18, 7, 0x1D, 0x13, WINDOW_x80); + HandleBattleWindow(18, 7, 29, 19, WINDOW_BG1); gBattleScripting.drawlvlupboxState = 4; break; case 4: + // Draw page 1 of level up box DrawLevelUpWindow1(); - PutWindowTilemap(12); - CopyWindowToVram(12, COPYWIN_BOTH); - ++gBattleScripting.drawlvlupboxState; + PutWindowTilemap(B_WIN_LEVEL_UP_BOX); + CopyWindowToVram(B_WIN_LEVEL_UP_BOX, COPYWIN_FULL); + gBattleScripting.drawlvlupboxState++; break; case 5: case 7: + // Wait for draw after each page if (!IsDma3ManagerBusyWithBgCopy()) { gBattle_BG1_Y = 0; - ++gBattleScripting.drawlvlupboxState; + gBattleScripting.drawlvlupboxState++; } break; case 6: - if (gMain.newKeys) + if (gMain.newKeys != 0) { + // Draw page 2 of level up box PlaySE(SE_SELECT); DrawLevelUpWindow2(); - CopyWindowToVram(12, COPYWIN_GFX); - ++gBattleScripting.drawlvlupboxState; + CopyWindowToVram(B_WIN_LEVEL_UP_BOX, COPYWIN_GFX); + gBattleScripting.drawlvlupboxState++; } break; case 8: - if (gMain.newKeys) + if (gMain.newKeys != 0) { + // Close level up box PlaySE(SE_SELECT); - HandleBattleWindow(18, 7, 0x1D, 0x13, WINDOW_x80 | WINDOW_CLEAR); - ++gBattleScripting.drawlvlupboxState; + HandleBattleWindow(18, 7, 29, 19, WINDOW_BG1 | WINDOW_CLEAR); + gBattleScripting.drawlvlupboxState++; } break; case 9: @@ -5562,6 +5745,7 @@ static void Cmd_drawlvlupbox(void) SetBgAttribute(2, BG_ATTR_PRIORITY, 2); ShowBg(2); + gBattleScripting.drawlvlupboxState = 10; } break; @@ -5583,7 +5767,7 @@ static void DrawLevelUpWindow1(void) u16 currStats[NUM_STATS]; GetMonLevelUpWindowStats(&gPlayerParty[gBattleStruct->expGetterMonId], currStats); - DrawLevelUpWindowPg1(12, gBattleResources->beforeLvlUp->stats, currStats, 0xE, 0xD, 0xF); + DrawLevelUpWindowPg1(B_WIN_LEVEL_UP_BOX, gBattleResources->beforeLvlUp->stats, currStats, TEXT_DYNAMIC_COLOR_5, TEXT_DYNAMIC_COLOR_4, TEXT_DYNAMIC_COLOR_6); } static void DrawLevelUpWindow2(void) @@ -5591,18 +5775,20 @@ static void DrawLevelUpWindow2(void) u16 currStats[NUM_STATS]; GetMonLevelUpWindowStats(&gPlayerParty[gBattleStruct->expGetterMonId], currStats); - DrawLevelUpWindowPg2(12, currStats, 0xE, 0xD, 0xF); + DrawLevelUpWindowPg2(B_WIN_LEVEL_UP_BOX, currStats, TEXT_DYNAMIC_COLOR_5, TEXT_DYNAMIC_COLOR_4, TEXT_DYNAMIC_COLOR_6); } -static void sub_8026480(void) +static void InitLevelUpBanner(void) { gBattle_BG2_Y = 0; - gBattle_BG2_X = 0x1A0; + gBattle_BG2_X = LEVEL_UP_BANNER_START; + LoadPalette(sLevelUpBanner_Pal, 0x60, 0x20); - CopyToWindowPixelBuffer(13, sLevelUpBanner_Gfx, 0, 0); - PutWindowTilemap(13); - CopyWindowToVram(13, COPYWIN_BOTH); - PutMonIconOnLvlUpBox(); + CopyToWindowPixelBuffer(B_WIN_LEVEL_UP_BANNER, sLevelUpBanner_Gfx, 0, 0); + PutWindowTilemap(B_WIN_LEVEL_UP_BANNER); + CopyWindowToVram(B_WIN_LEVEL_UP_BANNER, COPYWIN_FULL); + + PutMonIconOnLvlUpBanner(); } static bool8 SlideInLevelUpBanner(void) @@ -5634,9 +5820,10 @@ static void DrawLevelUpBannerText(void) monLevel = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_LEVEL); monGender = GetMonGender(&gPlayerParty[gBattleStruct->expGetterMonId]); GetMonNickname(&gPlayerParty[gBattleStruct->expGetterMonId], gStringVar4); + printerTemplate.currentChar = gStringVar4; printerTemplate.windowId = B_WIN_LEVEL_UP_BANNER; - printerTemplate.fontId = 0; + printerTemplate.fontId = FONT_SMALL; printerTemplate.x = 32; printerTemplate.y = 0; printerTemplate.currentX = 32; @@ -5647,10 +5834,12 @@ static void DrawLevelUpBannerText(void) printerTemplate.fgColor = TEXT_COLOR_WHITE; printerTemplate.bgColor = TEXT_COLOR_TRANSPARENT; printerTemplate.shadowColor = TEXT_COLOR_DARK_GRAY; - AddTextPrinter(&printerTemplate, 0xFF, NULL); + + AddTextPrinter(&printerTemplate, TEXT_SKIP_DRAW, NULL); + txtPtr = gStringVar4; - gStringVar4[0] = 0xF9; - *++txtPtr = 5; + gStringVar4[0] = CHAR_EXTRA_SYMBOL; + *++txtPtr = CHAR_LV_2; *++txtPtr = 0; txtPtr2 = txtPtr + 1; txtPtr = ConvertIntToDecimalStringN(++txtPtr, monLevel, STR_CONV_MODE_LEFT_ALIGN, 3); @@ -5660,22 +5849,24 @@ static void DrawLevelUpBannerText(void) { if (monGender == MON_MALE) { - txtPtr = WriteColorChangeControlCode(txtPtr, 0, 0xC); - txtPtr = WriteColorChangeControlCode(txtPtr, 1, 0xD); + txtPtr = WriteColorChangeControlCode(txtPtr, 0, TEXT_DYNAMIC_COLOR_3); + txtPtr = WriteColorChangeControlCode(txtPtr, 1, TEXT_DYNAMIC_COLOR_4); *(txtPtr++) = CHAR_MALE; } else { - txtPtr = WriteColorChangeControlCode(txtPtr, 0, 0xE); - txtPtr = WriteColorChangeControlCode(txtPtr, 1, 0xF); + txtPtr = WriteColorChangeControlCode(txtPtr, 0, TEXT_DYNAMIC_COLOR_5); + txtPtr = WriteColorChangeControlCode(txtPtr, 1, TEXT_DYNAMIC_COLOR_6); *(txtPtr++) = CHAR_FEMALE; } *(txtPtr++) = EOS; } + printerTemplate.y = 10; printerTemplate.currentY = 10; AddTextPrinter(&printerTemplate, TEXT_SKIP_DRAW, NULL); - CopyWindowToVram(13, COPYWIN_GFX); + + CopyWindowToVram(B_WIN_LEVEL_UP_BANNER, COPYWIN_GFX); } static bool8 SlideOutLevelUpBanner(void) @@ -5691,35 +5882,40 @@ static bool8 SlideOutLevelUpBanner(void) return (gBattle_BG2_X != LEVEL_UP_BANNER_START); } -#define sDestroy data[0] -#define sSavedLvlUpBoxXPosition data[1] +#define sDestroy data[0] +#define sXOffset data[1] -static void PutMonIconOnLvlUpBox(void) +static void PutMonIconOnLvlUpBanner(void) { u8 spriteId; - const u16 *iconPal; + const u16* iconPal; struct SpriteSheet iconSheet; struct SpritePalette iconPalSheet; + u16 species = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPECIES); u32 personality = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_PERSONALITY); - const u8 *iconPtr = GetMonIconPtr(species, personality, 1); + const u8* iconPtr = GetMonIconPtr(species, personality, 1); iconSheet.data = iconPtr; iconSheet.size = 0x200; iconSheet.tag = TAG_LVLUP_BANNER_MON_ICON; + iconPal = GetValidMonIconPalettePtr(species); iconPalSheet.data = iconPal; iconPalSheet.tag = TAG_LVLUP_BANNER_MON_ICON; + LoadSpriteSheet(&iconSheet); LoadSpritePalette(&iconPalSheet); + spriteId = CreateSprite(&sSpriteTemplate_MonIconOnLvlUpBanner, 256, 10, 0); gSprites[spriteId].sDestroy = FALSE; - gSprites[spriteId].sSavedLvlUpBoxXPosition = gBattle_BG2_X; + gSprites[spriteId].sXOffset = gBattle_BG2_X; } static void SpriteCB_MonIconOnLvlUpBanner(struct Sprite* sprite) { - sprite->x2 = sprite->sSavedLvlUpBoxXPosition - gBattle_BG2_X; + sprite->x2 = sprite->sXOffset - gBattle_BG2_X; + if (sprite->x2 != 0) { sprite->sDestroy = TRUE; @@ -5732,12 +5928,16 @@ static void SpriteCB_MonIconOnLvlUpBanner(struct Sprite* sprite) } } +#undef sDestroy +#undef sXOffset + bool32 IsMonGettingExpSentOut(void) { if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterMonId) return TRUE; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId) return TRUE; + return FALSE; } @@ -5766,7 +5966,13 @@ static void Cmd_recordlastability(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); RecordAbilityBattle(gActiveBattler, gLastUsedAbility); - gBattlescriptCurrInstr += 1; // UB: Should be + 2, one byte for command and one byte for battlerId argument. + +#ifdef BUGFIX + // This command occupies two bytes (one for the command id, and one for the battler id parameter). + gBattlescriptCurrInstr += 2; +#else + gBattlescriptCurrInstr += 1; +#endif } void BufferMoveToLearnIntoBattleTextBuff2(void) @@ -5801,6 +6007,7 @@ static void Cmd_hpthresholds(void) result = gBattleMons[opposingBattler].hp * 100 / gBattleMons[opposingBattler].maxHP; if (result == 0) result = 1; + if (result > 69 || !gBattleMons[opposingBattler].hp) gBattleStruct->hpScale = 0; else if (result > 39) @@ -5810,6 +6017,7 @@ static void Cmd_hpthresholds(void) else gBattleStruct->hpScale = 3; } + gBattlescriptCurrInstr += 2; } @@ -5835,6 +6043,7 @@ static void Cmd_hpthresholds2(void) else gBattleStruct->hpScale = 3; } + gBattlescriptCurrInstr += 2; } @@ -5872,13 +6081,13 @@ static void Cmd_various(void) gBattleCommunication[0] = IsRunningFromBattleImpossible(); break; case VARIOUS_GET_MOVE_TARGET: - gBattlerTarget = GetMoveTarget(gCurrentMove, 0); + gBattlerTarget = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); break; - case VARIOUS_CASE_4: + case VARIOUS_GET_BATTLER_FAINTED: if (gHitMarker & HITMARKER_FAINTED(gActiveBattler)) - gBattleCommunication[0] = 1; + gBattleCommunication[0] = TRUE; else - gBattleCommunication[0] = 0; + gBattleCommunication[0] = FALSE; break; case VARIOUS_RESET_INTIMIDATE_TRACE_BITS: gSpecialStatuses[gActiveBattler].intimidatedMon = 0; @@ -5893,7 +6102,9 @@ static void Cmd_various(void) gActiveBattler = 0; else gActiveBattler = 2; + choicedMove = &gBattleStruct->choicedMove[gActiveBattler]; + for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMons[gActiveBattler].moves[i] == *choicedMove) @@ -5903,12 +6114,14 @@ static void Cmd_various(void) *choicedMove = MOVE_NONE; } break; - case VARIOUS_RESET_PLAYER_FAINTED_FLAG: + case VARIOUS_RESET_PLAYER_FAINTED: if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_DOUBLE)) - && gBattleTypeFlags & BATTLE_TYPE_TRAINER - && gBattleMons[0].hp != 0 - && gBattleMons[1].hp != 0) - gHitMarker &= ~(HITMARKER_PLAYER_FAINTED); + && gBattleTypeFlags & BATTLE_TYPE_TRAINER + && gBattleMons[0].hp != 0 + && gBattleMons[1].hp != 0) + { + gHitMarker &= ~HITMARKER_PLAYER_FAINTED; + } break; case VARIOUS_CASE_8: i = 0; // redundant @@ -5998,6 +6211,7 @@ static void Cmd_various(void) return; break; } + gBattlescriptCurrInstr += 3; } @@ -6017,19 +6231,19 @@ static void Cmd_setprotectlike(void) // protect and endure if (gBattleMoves[gCurrentMove].effect == EFFECT_PROTECT) { gProtectStructs[gBattlerAttacker].protected = 1; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PROTECTED_ITSELF; } if (gBattleMoves[gCurrentMove].effect == EFFECT_ENDURE) { gProtectStructs[gBattlerAttacker].endured = 1; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_BRACED_ITSELF; } gDisableStructs[gBattlerAttacker].protectUses++; } else { gDisableStructs[gBattlerAttacker].protectUses = 0; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PROTECT_FAILED; gMoveResultFlags |= MOVE_RESULT_MISSED; } @@ -6038,42 +6252,54 @@ static void Cmd_setprotectlike(void) // protect and endure static void Cmd_tryexplosion(void) { - if (gBattleControllerExecFlags == 0) - { - for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; ++gBattlerTarget) - if (gBattleMons[gBattlerTarget].ability == ABILITY_DAMP) - break; - if (gBattlerTarget == gBattlersCount) - { - gActiveBattler = gBattlerAttacker; - gBattleMoveDamage = gBattleMons[gActiveBattler].hp; - BtlController_EmitHealthBarUpdate(0, INSTANT_HP_BAR_DROP); - MarkBattlerForControllerExec(gActiveBattler); - gBattlescriptCurrInstr++; + if (gBattleControllerExecFlags) + return; - for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; ++gBattlerTarget) - if (gBattlerTarget != gBattlerAttacker && !(gAbsentBattlerFlags & gBitTable[gBattlerTarget])) - break; - } - else + // Explosion can only fail if any battler has Damp + for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++) + { + if (gBattleMons[gBattlerTarget].ability == ABILITY_DAMP) + break; + } + + if (gBattlerTarget == gBattlersCount) + { + // Success, no battlers with Damp. Drop user's HP bar to 0 + gActiveBattler = gBattlerAttacker; + gBattleMoveDamage = gBattleMons[gActiveBattler].hp; + BtlController_EmitHealthBarUpdate(BUFFER_A, INSTANT_HP_BAR_DROP); + MarkBattlerForControllerExec(gActiveBattler); + gBattlescriptCurrInstr++; + + // Find first target + for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++) { - gLastUsedAbility = ABILITY_DAMP; - RecordAbilityBattle(gBattlerTarget, gBattleMons[gBattlerTarget].ability); - gBattlescriptCurrInstr = BattleScript_DampStopsExplosion; + if (gBattlerTarget == gBattlerAttacker) + continue; + if (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget])) + break; } } + else + { + // Failed, a battler has Damp + gLastUsedAbility = ABILITY_DAMP; + RecordAbilityBattle(gBattlerTarget, gBattleMons[gBattlerTarget].ability); + gBattlescriptCurrInstr = BattleScript_DampStopsExplosion; + } } static void Cmd_setatkhptozero(void) { - if (gBattleControllerExecFlags == 0) - { - gActiveBattler = gBattlerAttacker; - gBattleMons[gActiveBattler].hp = 0; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_HP_BATTLE, 0, 2, &gBattleMons[gActiveBattler].hp); - MarkBattlerForControllerExec(gActiveBattler); - gBattlescriptCurrInstr++; - } + if (gBattleControllerExecFlags) + return; + + gActiveBattler = gBattlerAttacker; + gBattleMons[gActiveBattler].hp = 0; + BtlController_EmitSetMonData(BUFFER_A, REQUEST_HP_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].hp), &gBattleMons[gActiveBattler].hp); + MarkBattlerForControllerExec(gActiveBattler); + + gBattlescriptCurrInstr++; } static void Cmd_jumpifnexttargetvalid(void) @@ -6082,9 +6308,14 @@ static void Cmd_jumpifnexttargetvalid(void) if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { - for (++gBattlerTarget; ; ++gBattlerTarget) - if (gBattlerTarget != gBattlerAttacker && !(gAbsentBattlerFlags & gBitTable[gBattlerTarget])) + for (gBattlerTarget++; ; gBattlerTarget++) + { + if (gBattlerTarget == gBattlerAttacker) + continue; + if (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget])) break; + } + if (gBattlerTarget >= gBattlersCount) gBattlescriptCurrInstr += 5; else @@ -6098,14 +6329,16 @@ static void Cmd_jumpifnexttargetvalid(void) static void Cmd_tryhealhalfhealth(void) { - const u8 *failPtr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + const u8* failPtr = T1_READ_PTR(gBattlescriptCurrInstr + 1); if (gBattlescriptCurrInstr[5] == BS_ATTACKER) gBattlerTarget = gBattlerAttacker; + gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 2; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattleMoveDamage *= -1; + if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP) gBattlescriptCurrInstr = failPtr; else @@ -6117,41 +6350,44 @@ static void Cmd_trymirrormove(void) s32 validMovesCount; s32 i; u16 move; - u16 movesArray[3]; + u16 validMoves[MAX_BATTLERS_COUNT - 1]; + + for (i = 0; i < (MAX_BATTLERS_COUNT - 1); i++) // -1 to exclude the user + validMoves[i] = MOVE_NONE; - for (i = 0; i < 3; i++) - movesArray[i] = 0; for (validMovesCount = 0, i = 0; i < gBattlersCount; i++) { - if (i != gBattlerAttacker) { move = T1_READ_16(i * 2 + gBattlerAttacker * 8 + gBattleStruct->lastTakenMoveFrom); + if (move != MOVE_NONE && move != MOVE_UNAVAILABLE) { - movesArray[validMovesCount] = move; + validMoves[validMovesCount] = move; validMovesCount++; } } } + move = T1_READ_16(gBattleStruct->lastTakenMove + gBattlerAttacker * 2); - move++;move--; + move++;move--; // why? + if (move != MOVE_NONE && move != MOVE_UNAVAILABLE) { - gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); + gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; gCurrentMove = move; - gBattlerTarget = GetMoveTarget(gCurrentMove, 0); + gBattlerTarget = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; } else if (validMovesCount != 0) { - gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); + gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; i = Random() % validMovesCount; - gCurrentMove = movesArray[i]; - gBattlerTarget = GetMoveTarget(gCurrentMove, 0); + gCurrentMove = validMoves[i]; + gBattlerTarget = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; } - else + else // no valid moves found { gSpecialStatuses[gBattlerAttacker].ppNotAffectedByPressure = TRUE; gBattlescriptCurrInstr++; @@ -6163,12 +6399,12 @@ static void Cmd_setrain(void) if (gBattleWeather & B_WEATHER_RAIN) { gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEATHER_FAILED; } else { gBattleWeather = B_WEATHER_RAIN_TEMPORARY; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_RAIN; gWishFutureKnock.weatherDuration = 5; } gBattlescriptCurrInstr++; @@ -6179,7 +6415,7 @@ static void Cmd_setreflect(void) if (gSideStatuses[GET_BATTLER_SIDE(gBattlerAttacker)] & SIDE_STATUS_REFLECT) { gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SIDE_STATUS_FAILED; } else { @@ -6188,9 +6424,9 @@ static void Cmd_setreflect(void) gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].reflectBattlerId = gBattlerAttacker; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && CountAliveMonsInBattle(BATTLE_ALIVE_ATK_SIDE) == 2) - gBattleCommunication[MULTISTRING_CHOOSER] = 2; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_REFLECT_DOUBLE; else - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_REFLECT_SINGLE; } gBattlescriptCurrInstr++; } @@ -6200,19 +6436,20 @@ static void Cmd_setseeded(void) if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT || gStatuses3[gBattlerTarget] & STATUS3_LEECHSEED) { gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_MISS; } else if (IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_GRASS)) { gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_FAIL; } else { gStatuses3[gBattlerTarget] |= gBattlerAttacker; gStatuses3[gBattlerTarget] |= STATUS3_LEECHSEED; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_SET; } + gBattlescriptCurrInstr++; } @@ -6220,29 +6457,30 @@ static void Cmd_manipulatedamage(void) { switch (gBattlescriptCurrInstr[1]) { - case ATK80_DMG_CHANGE_SIGN: + case DMG_CHANGE_SIGN: gBattleMoveDamage *= -1; break; - case ATK80_DMG_HALF_BY_TWO_NOT_MORE_THAN_HALF_MAX_HP: + case DMG_RECOIL_FROM_MISS: gBattleMoveDamage /= 2; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; if ((gBattleMons[gBattlerTarget].maxHP / 2) < gBattleMoveDamage) gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 2; break; - case ATK80_DMG_DOUBLED: + case DMG_DOUBLED: gBattleMoveDamage *= 2; break; } + gBattlescriptCurrInstr += 2; } static void Cmd_trysetrest(void) { const u8 *failJump = T1_READ_PTR(gBattlescriptCurrInstr + 1); - gActiveBattler = gBattlerTarget = gBattlerAttacker; gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP * (-1); + if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP) { gBattlescriptCurrInstr = failJump; @@ -6250,11 +6488,12 @@ static void Cmd_trysetrest(void) else { if (gBattleMons[gBattlerTarget].status1 & ((u8)(~STATUS1_SLEEP))) - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_REST_STATUSED; else - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - gBattleMons[gBattlerTarget].status1 = 3; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_REST; + + gBattleMons[gBattlerTarget].status1 = STATUS1_SLEEP_TURN(3); + BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 5; } @@ -6262,7 +6501,7 @@ static void Cmd_trysetrest(void) static void Cmd_jumpifnotfirstturn(void) { - const u8 *failJump = T1_READ_PTR(gBattlescriptCurrInstr + 1); + const u8* failJump = T1_READ_PTR(gBattlescriptCurrInstr + 1); if (gDisableStructs[gBattlerAttacker].isFirstTurn) gBattlescriptCurrInstr += 5; @@ -6289,11 +6528,13 @@ bool8 UproarWakeUpCheck(u8 battlerId) if (gBattlerTarget == 0xFF) gBattlerTarget = i; else if (gBattlerTarget == i) - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CANT_SLEEP_UPROAR; else - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_UPROAR_KEPT_AWAKE; + break; } + if (i == gBattlersCount) return FALSE; else @@ -6312,7 +6553,7 @@ static void Cmd_jumpifcantmakeasleep(void) || gBattleMons[gBattlerTarget].ability == ABILITY_VITAL_SPIRIT) { gLastUsedAbility = gBattleMons[gBattlerTarget].ability; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STAYED_AWAKE_USING; gBattlescriptCurrInstr = jumpPtr; RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); } @@ -6327,7 +6568,7 @@ static void Cmd_stockpile(void) if (gDisableStructs[gBattlerAttacker].stockpileCounter == 3) { gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CANT_STOCKPILE; } else { @@ -6335,22 +6576,21 @@ static void Cmd_stockpile(void) PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 1, gDisableStructs[gBattlerAttacker].stockpileCounter) - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STOCKPILED; } gBattlescriptCurrInstr++; } static void Cmd_stockpiletobasedamage(void) { - const u8 *jumpPtr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - + const u8* jumpPtr = T1_READ_PTR(gBattlescriptCurrInstr + 1); if (gDisableStructs[gBattlerAttacker].stockpileCounter == 0) { gBattlescriptCurrInstr = jumpPtr; } else { - if (gBattleCommunication[6] != 1) + if (gBattleCommunication[MISS_TYPE] != B_MSG_PROTECTED) { gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBattlerAttacker], &gBattleMons[gBattlerTarget], gCurrentMove, gSideStatuses[GET_BATTLER_SIDE(gBattlerTarget)], 0, @@ -6361,6 +6601,7 @@ static void Cmd_stockpiletobasedamage(void) if (gProtectStructs[gBattlerAttacker].helpingHand) gBattleMoveDamage = gBattleMoveDamage * 15 / 10; } + gDisableStructs[gBattlerAttacker].stockpileCounter = 0; gBattlescriptCurrInstr += 5; } @@ -6368,19 +6609,19 @@ static void Cmd_stockpiletobasedamage(void) static void Cmd_stockpiletohpheal(void) { - const u8 *jumpPtr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + const u8* jumpPtr = T1_READ_PTR(gBattlescriptCurrInstr + 1); if (gDisableStructs[gBattlerAttacker].stockpileCounter == 0) { gBattlescriptCurrInstr = jumpPtr; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWALLOW_FAILED; } else if (gBattleMons[gBattlerAttacker].maxHP == gBattleMons[gBattlerAttacker].hp) { gDisableStructs[gBattlerAttacker].stockpileCounter = 0; gBattlescriptCurrInstr = jumpPtr; gBattlerTarget = gBattlerAttacker; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWALLOW_FULL_HP; } else { @@ -6431,6 +6672,7 @@ static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8 *BS_ptr) flags &= ~STAT_CHANGE_NOT_PROTECT_AFFECTED; PREPARE_STAT_BUFFER(gBattleTextBuff1, statId) + if (statValue <= -1) // Stat decrease. { if (gSideTimers[GET_BATTLER_SIDE(gActiveBattler)].mistTimer @@ -6506,7 +6748,7 @@ static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8 *BS_ptr) } return STAT_CHANGE_DIDNT_WORK; } - else if (gBattleMons[gActiveBattler].ability == ABILITY_SHIELD_DUST && !flags) + else if (gBattleMons[gActiveBattler].ability == ABILITY_SHIELD_DUST && flags == 0) { return STAT_CHANGE_DIDNT_WORK; } @@ -6522,14 +6764,18 @@ static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8 *BS_ptr) gBattleTextBuff2[3] = STRINGID_STATHARSHLY >> 8; index = 4; } - gBattleTextBuff2[index++] = B_BUFF_STRING; - gBattleTextBuff2[index++] = STRINGID_STATFELL; - gBattleTextBuff2[index++] = STRINGID_STATFELL >> 8; + gBattleTextBuff2[index] = B_BUFF_STRING; + index++; + gBattleTextBuff2[index] = STRINGID_STATFELL; + index++; + gBattleTextBuff2[index] = STRINGID_STATFELL >> 8; + index++; gBattleTextBuff2[index] = B_BUFF_EOS; - if (gBattleMons[gActiveBattler].statStages[statId] == 0) - gBattleCommunication[MULTISTRING_CHOOSER] = 2; + + if (gBattleMons[gActiveBattler].statStages[statId] == MIN_STAT_STAGE) + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STAT_WONT_DECREASE; else - gBattleCommunication[MULTISTRING_CHOOSER] = (gBattlerTarget == gActiveBattler); + gBattleCommunication[MULTISTRING_CHOOSER] = (gBattlerTarget == gActiveBattler); // B_MSG_ATTACKER_STAT_FELL or B_MSG_DEFENDER_STAT_FELL } } else // stat increase @@ -6544,30 +6790,38 @@ static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8 *BS_ptr) gBattleTextBuff2[3] = STRINGID_STATSHARPLY >> 8; index = 4; } - gBattleTextBuff2[index++] = B_BUFF_STRING; - gBattleTextBuff2[index++] = STRINGID_STATROSE; - gBattleTextBuff2[index++] = STRINGID_STATROSE >> 8; + gBattleTextBuff2[index] = B_BUFF_STRING; + index++; + gBattleTextBuff2[index] = STRINGID_STATROSE; + index++; + gBattleTextBuff2[index] = STRINGID_STATROSE >> 8; + index++; gBattleTextBuff2[index] = B_BUFF_EOS; - if (gBattleMons[gActiveBattler].statStages[statId] == 0xC) - gBattleCommunication[MULTISTRING_CHOOSER] = 2; + + if (gBattleMons[gActiveBattler].statStages[statId] == MAX_STAT_STAGE) + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STAT_WONT_INCREASE; else - gBattleCommunication[MULTISTRING_CHOOSER] = (gBattlerTarget == gActiveBattler); + gBattleCommunication[MULTISTRING_CHOOSER] = (gBattlerTarget == gActiveBattler); // B_MSG_ATTACKER_STAT_ROSE or B_MSG_DEFENDER_STAT_ROSE } + gBattleMons[gActiveBattler].statStages[statId] += statValue; - if (gBattleMons[gActiveBattler].statStages[statId] < 0) - gBattleMons[gActiveBattler].statStages[statId] = 0; - if (gBattleMons[gActiveBattler].statStages[statId] > 0xC) - gBattleMons[gActiveBattler].statStages[statId] = 0xC; - if (gBattleCommunication[MULTISTRING_CHOOSER] == 2 && flags & STAT_CHANGE_ALLOW_PTR) + if (gBattleMons[gActiveBattler].statStages[statId] < MIN_STAT_STAGE) + gBattleMons[gActiveBattler].statStages[statId] = MIN_STAT_STAGE; + if (gBattleMons[gActiveBattler].statStages[statId] > MAX_STAT_STAGE) + gBattleMons[gActiveBattler].statStages[statId] = MAX_STAT_STAGE; + + if (gBattleCommunication[MULTISTRING_CHOOSER] == B_MSG_STAT_WONT_INCREASE && flags & STAT_CHANGE_ALLOW_PTR) gMoveResultFlags |= MOVE_RESULT_MISSED; - if (gBattleCommunication[MULTISTRING_CHOOSER] == 2 && !(flags & STAT_CHANGE_ALLOW_PTR)) + + if (gBattleCommunication[MULTISTRING_CHOOSER] == B_MSG_STAT_WONT_INCREASE && !(flags & STAT_CHANGE_ALLOW_PTR)) return STAT_CHANGE_DIDNT_WORK; + return STAT_CHANGE_WORKED; } static void Cmd_statbuffchange(void) { - const u8 *jumpPtr = T1_READ_PTR(gBattlescriptCurrInstr + 2); + const u8* jumpPtr = T1_READ_PTR(gBattlescriptCurrInstr + 2); if (ChangeStatBuffs(gBattleScripting.statChanger & 0xF0, GET_STAT_BUFF_ID(gBattleScripting.statChanger), gBattlescriptCurrInstr[1], jumpPtr) == STAT_CHANGE_WORKED) gBattlescriptCurrInstr += 6; } @@ -6577,8 +6831,11 @@ static void Cmd_normalisebuffs(void) // haze s32 i, j; for (i = 0; i < gBattlersCount; i++) - for (j = 0; j < NUM_BATTLE_STATS; ++j) - gBattleMons[i].statStages[j] = 6; + { + for (j = 0; j < NUM_BATTLE_STATS; j++) + gBattleMons[i].statStages[j] = DEFAULT_STAT_STAGE; + } + gBattlescriptCurrInstr++; } @@ -6587,7 +6844,8 @@ static void Cmd_setbide(void) gBattleMons[gBattlerAttacker].status2 |= STATUS2_MULTIPLETURNS; gLockedMoves[gBattlerAttacker] = gCurrentMove; gTakenDmg[gBattlerAttacker] = 0; - gBattleMons[gBattlerAttacker].status2 |= (STATUS2_BIDE - 0x100); // 2 turns + gBattleMons[gBattlerAttacker].status2 |= STATUS2_BIDE_TURN(2); + gBattlescriptCurrInstr++; } @@ -6595,6 +6853,7 @@ static void Cmd_confuseifrepeatingattackends(void) { if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_LOCK_CONFUSE)) gBattleCommunication[MOVE_EFFECT_BYTE] = (MOVE_EFFECT_THRASH | MOVE_EFFECT_AFFECTS_USER); + gBattlescriptCurrInstr++; } @@ -6612,12 +6871,14 @@ static void Cmd_setmultihitcounter(void) else gMultiHitCounter += 2; } + gBattlescriptCurrInstr += 2; } static void Cmd_initmultihitstring(void) { PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) + gBattlescriptCurrInstr++; } @@ -6630,7 +6891,6 @@ static bool8 TryDoForceSwitchOut(void) else { u16 random = Random() & 0xFF; - if ((u32)((random * (gBattleMons[gBattlerAttacker].level + gBattleMons[gBattlerTarget].level) >> 8) + 1) <= (gBattleMons[gBattlerTarget].level / 4)) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); @@ -6638,6 +6898,7 @@ static bool8 TryDoForceSwitchOut(void) } *(gBattleStruct->battlerPartyIndexes + gBattlerTarget) = gBattlerPartyIndexes[gBattlerTarget]; } + gBattlescriptCurrInstr = BattleScript_SuccessForceOut; return TRUE; } @@ -6730,7 +6991,7 @@ static void Cmd_forcerandomswitch(void) if (!IsMultiBattle()) UpdatePartyOwnerOnSwitch_NonMulti(gBattlerTarget); SwitchPartyOrderLinkMulti(gBattlerTarget, i, 0); - SwitchPartyOrderLinkMulti(gBattlerTarget ^ 2, i, 1); + SwitchPartyOrderLinkMulti(gBattlerTarget ^ BIT_FLANK, i, 1); } } else @@ -6749,11 +7010,14 @@ static void Cmd_tryconversiontypechange(void) // randomly changes user's type to { if (gBattleMons[gBattlerAttacker].moves[validMoves] == MOVE_NONE) break; - ++validMoves; + + validMoves++; } - for (moveChecked = 0; moveChecked < validMoves; ++moveChecked) + + for (moveChecked = 0; moveChecked < validMoves; moveChecked++) { moveType = gBattleMoves[gBattleMons[gBattlerAttacker].moves[moveChecked]].type; + if (moveType == TYPE_MYSTERY) { if (IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST)) @@ -6767,6 +7031,7 @@ static void Cmd_tryconversiontypechange(void) // randomly changes user's type to break; } } + if (moveChecked == validMoves) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); @@ -6775,8 +7040,10 @@ static void Cmd_tryconversiontypechange(void) // randomly changes user's type to { do { - while ((moveChecked = Random() & 3) >= validMoves); + while ((moveChecked = Random() & (MAX_MON_MOVES - 1)) >= validMoves); + moveType = gBattleMoves[gBattleMons[gBattlerAttacker].moves[moveChecked]].type; + if (moveType == TYPE_MYSTERY) { if (IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST)) @@ -6785,10 +7052,11 @@ static void Cmd_tryconversiontypechange(void) // randomly changes user's type to moveType = TYPE_NORMAL; } } - while (moveType == gBattleMons[gBattlerAttacker].type1 - || moveType == gBattleMons[gBattlerAttacker].type2); + while (moveType == gBattleMons[gBattlerAttacker].type1 || moveType == gBattleMons[gBattlerAttacker].type2); + SET_BATTLER_TYPE(gBattlerAttacker, moveType); PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType); + gBattlescriptCurrInstr += 5; } } @@ -6798,9 +7066,10 @@ static void Cmd_givepaydaymoney(void) if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) && gPaydayMoney != 0) { u32 bonusMoney = gPaydayMoney * gBattleStruct->moneyMultiplier; - AddMoney(&gSaveBlock1Ptr->money, bonusMoney); + PREPARE_HWORD_NUMBER_BUFFER(gBattleTextBuff1, 5, bonusMoney) + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_PrintPayDayMoneyString; } @@ -6815,18 +7084,20 @@ static void Cmd_setlightscreen(void) if (gSideStatuses[GET_BATTLER_SIDE(gBattlerAttacker)] & SIDE_STATUS_LIGHTSCREEN) { gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SIDE_STATUS_FAILED; } else { gSideStatuses[GET_BATTLER_SIDE(gBattlerAttacker)] |= SIDE_STATUS_LIGHTSCREEN; gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].lightscreenTimer = 5; gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].lightscreenBattlerId = gBattlerAttacker; + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && CountAliveMonsInBattle(BATTLE_ALIVE_ATK_SIDE) == 2) - gBattleCommunication[MULTISTRING_CHOOSER] = 4; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_LIGHTSCREEN_DOUBLE; else - gBattleCommunication[MULTISTRING_CHOOSER] = 3; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_LIGHTSCREEN_SINGLE; } + gBattlescriptCurrInstr++; } @@ -6844,7 +7115,9 @@ static void Cmd_tryKO(void) holdEffect = ItemId_GetHoldEffect(gBattleMons[gBattlerTarget].item); param = ItemId_GetHoldEffectParam(gBattleMons[gBattlerTarget].item); } + gPotentialItemEffectBattler = gBattlerTarget; + if (holdEffect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < param) { RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_FOCUS_BAND); @@ -6861,7 +7134,6 @@ static void Cmd_tryKO(void) else { u16 chance; - if (!(gStatuses3[gBattlerTarget] & STATUS3_ALWAYS_HITS)) { chance = gBattleMoves[gCurrentMove].accuracy + (gBattleMons[gBattlerAttacker].level - gBattleMons[gBattlerTarget].level); @@ -6907,9 +7179,9 @@ static void Cmd_tryKO(void) { gMoveResultFlags |= MOVE_RESULT_MISSED; if (gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level) - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_KO_MISS; else - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_KO_UNAFFECTED; gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } @@ -6920,6 +7192,7 @@ static void Cmd_damagetohalftargethp(void) // super fang gBattleMoveDamage = gBattleMons[gBattlerTarget].hp / 2; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; + gBattlescriptCurrInstr++; } @@ -6928,12 +7201,12 @@ static void Cmd_setsandstorm(void) if (gBattleWeather & B_WEATHER_SANDSTORM) { gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEATHER_FAILED; } else { gBattleWeather = B_WEATHER_SANDSTORM_TEMPORARY; - gBattleCommunication[MULTISTRING_CHOOSER] = 3; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_SANDSTORM; gWishFutureKnock.weatherDuration = 5; } gBattlescriptCurrInstr++; @@ -7045,47 +7318,47 @@ static void Cmd_tryinfatuating(void) static void Cmd_updatestatusicon(void) { - if (gBattleControllerExecFlags == 0) + if (gBattleControllerExecFlags) + return; + + if (gBattlescriptCurrInstr[1] == BS_PLAYER2) { - if (gBattlescriptCurrInstr[1] == BS_PLAYER2) + for (gActiveBattler = gBattleControllerExecFlags; gActiveBattler < gBattlersCount; gActiveBattler++) { - for (gActiveBattler = gBattleControllerExecFlags; gActiveBattler < gBattlersCount; ++gActiveBattler) - { - if (!(gAbsentBattlerFlags & gBitTable[gActiveBattler])) - { - BtlController_EmitStatusIconUpdate(0, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); - MarkBattlerForControllerExec(gActiveBattler); - } - } - gBattlescriptCurrInstr += 2; - } - else if (gBattlescriptCurrInstr[1] == BS_ATTACKER_WITH_PARTNER) - { - gActiveBattler = gBattlerAttacker; if (!(gAbsentBattlerFlags & gBitTable[gActiveBattler])) { - BtlController_EmitStatusIconUpdate(0, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); + BtlController_EmitStatusIconUpdate(BUFFER_A, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); MarkBattlerForControllerExec(gActiveBattler); } - if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - { - gActiveBattler = GetBattlerAtPosition(GetBattlerPosition(gBattlerAttacker) ^ BIT_FLANK); - if (!(gAbsentBattlerFlags & gBitTable[gActiveBattler])) - { - BtlController_EmitStatusIconUpdate(0, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); - MarkBattlerForControllerExec(gActiveBattler); - } - } - gBattlescriptCurrInstr += 2; } - else + gBattlescriptCurrInstr += 2; + } + else if (gBattlescriptCurrInstr[1] == BS_ATTACKER_WITH_PARTNER) + { + gActiveBattler = gBattlerAttacker; + if (!(gAbsentBattlerFlags & gBitTable[gActiveBattler])) { - - gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - BtlController_EmitStatusIconUpdate(0, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); + BtlController_EmitStatusIconUpdate(BUFFER_A, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); MarkBattlerForControllerExec(gActiveBattler); - gBattlescriptCurrInstr += 2; } + if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + { + gActiveBattler = GetBattlerAtPosition(GetBattlerPosition(gBattlerAttacker) ^ BIT_FLANK); + if (!(gAbsentBattlerFlags & gBitTable[gActiveBattler])) + { + BtlController_EmitStatusIconUpdate(BUFFER_A, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); + MarkBattlerForControllerExec(gActiveBattler); + } + } + gBattlescriptCurrInstr += 2; + } + else + { + + gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); + BtlController_EmitStatusIconUpdate(BUFFER_A, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); + MarkBattlerForControllerExec(gActiveBattler); + gBattlescriptCurrInstr += 2; } } @@ -7094,14 +7367,14 @@ static void Cmd_setmist(void) if (gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].mistTimer) { gMoveResultFlags |= MOVE_RESULT_FAILED; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MIST_FAILED; } else { gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].mistTimer = 5; gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].mistBattlerId = gBattlerAttacker; gSideStatuses[GET_BATTLER_SIDE(gBattlerAttacker)] |= SIDE_STATUS_MIST; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_MIST; } gBattlescriptCurrInstr++; } @@ -7111,12 +7384,12 @@ static void Cmd_setfocusenergy(void) if (gBattleMons[gBattlerAttacker].status2 & STATUS2_FOCUS_ENERGY) { gMoveResultFlags |= MOVE_RESULT_FAILED; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FOCUS_ENERGY_FAILED; } else { gBattleMons[gBattlerAttacker].status2 |= STATUS2_FOCUS_ENERGY; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_GETTING_PUMPED; } gBattlescriptCurrInstr++; } @@ -7129,7 +7402,7 @@ static void Cmd_transformdataexecution(void) || gStatuses3[gBattlerTarget] & STATUS3_SEMI_INVULNERABLE) { gMoveResultFlags |= MOVE_RESULT_FAILED; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TRANSFORM_FAILED; } else { @@ -7141,11 +7414,15 @@ static void Cmd_transformdataexecution(void) gDisableStructs[gBattlerAttacker].disableTimer = 0; gDisableStructs[gBattlerAttacker].transformedMonPersonality = gBattleMons[gBattlerTarget].personality; gDisableStructs[gBattlerAttacker].mimickedMoves = 0; + PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerTarget].species) - battleMonAttacker = (u8 *)(&gBattleMons[gBattlerAttacker]); - battleMonTarget = (u8 *)(&gBattleMons[gBattlerTarget]); + + battleMonAttacker = (u8*)(&gBattleMons[gBattlerAttacker]); + battleMonTarget = (u8*)(&gBattleMons[gBattlerTarget]); + for (i = 0; i < offsetof(struct BattlePokemon, pp); i++) battleMonAttacker[i] = battleMonTarget[i]; + for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMoves[gBattleMons[gBattlerAttacker].moves[i]].pp < 5) @@ -7153,10 +7430,11 @@ static void Cmd_transformdataexecution(void) else gBattleMons[gBattlerAttacker].pp[i] = 5; } + gActiveBattler = gBattlerAttacker; BtlController_EmitResetActionMoveSelection(BUFFER_A, RESET_MOVE_SELECTION); MarkBattlerForControllerExec(gActiveBattler); - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TRANSFORMED; } } @@ -7169,17 +7447,18 @@ static void Cmd_setsubstitute(void) if (gBattleMons[gBattlerAttacker].hp <= hp) { gBattleMoveDamage = 0; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SUBSTITUTE_FAILED; } 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) if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; + gBattleMons[gBattlerAttacker].status2 |= STATUS2_SUBSTITUTE; gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_WRAPPED; gDisableStructs[gBattlerAttacker].substituteHP = gBattleMoveDamage; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_SUBSTITUTE; gHitMarker |= HITMARKER_IGNORE_SUBSTITUTE; } @@ -7189,14 +7468,16 @@ static void Cmd_setsubstitute(void) static bool8 IsMoveUncopyableByMimic(u16 move) { s32 i; + for (i = 0; sMovesForbiddenToCopy[i] != MIMIC_FORBIDDEN_END + && sMovesForbiddenToCopy[i] != move; i++); - for (i = 0; sMovesForbiddenToCopy[i] != MIMIC_FORBIDDEN_END && sMovesForbiddenToCopy[i] != move; i++); return (sMovesForbiddenToCopy[i] != MIMIC_FORBIDDEN_END); } static void Cmd_mimicattackcopy(void) { gChosenMove = MOVE_UNAVAILABLE; + if (IsMoveUncopyableByMimic(gLastMoves[gBattlerTarget]) || gBattleMons[gBattlerAttacker].status2 & STATUS2_TRANSFORMED || gLastMoves[gBattlerTarget] == MOVE_NONE @@ -7213,6 +7494,7 @@ static void Cmd_mimicattackcopy(void) if (gBattleMons[gBattlerAttacker].moves[i] == gLastMoves[gBattlerTarget]) break; } + if (i == MAX_MON_MOVES) { gBattleMons[gBattlerAttacker].moves[gCurrMovePos] = gLastMoves[gBattlerTarget]; @@ -7222,6 +7504,7 @@ static void Cmd_mimicattackcopy(void) gBattleMons[gBattlerAttacker].pp[gCurrMovePos] = 5; PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastMoves[gBattlerTarget]) + gDisableStructs[gBattlerAttacker].mimickedMoves |= gBitTable[gCurrMovePos]; gBattlescriptCurrInstr += 5; } @@ -7253,11 +7536,12 @@ static void Cmd_metronome(void) if (sMovesForbiddenToCopy[i] == METRONOME_FORBIDDEN_END) break; } + if (sMovesForbiddenToCopy[i] == METRONOME_FORBIDDEN_END) { gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; - gBattlerTarget = GetMoveTarget(gCurrentMove, 0); + gBattlerTarget = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); return; } } @@ -7369,6 +7653,7 @@ static void Cmd_trysetencore(void) { i = MAX_MON_MOVES; } + if (gDisableStructs[gBattlerTarget].encoredMove == MOVE_NONE && i != MAX_MON_MOVES && gBattleMons[gBattlerTarget].pp[i] != 0) { @@ -7390,14 +7675,16 @@ static void Cmd_painsplitdmgcalc(void) { s32 hpDiff = (gBattleMons[gBattlerAttacker].hp + gBattleMons[gBattlerTarget].hp) / 2; s32 painSplitHp = gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - hpDiff; - u8 *storeLoc = (void *)(&gBattleScripting.painSplitHp); + u8* storeLoc = (void*)(&gBattleScripting.painSplitHp); storeLoc[0] = (painSplitHp); storeLoc[1] = (painSplitHp & 0x0000FF00) >> 8; storeLoc[2] = (painSplitHp & 0x00FF0000) >> 16; storeLoc[3] = (painSplitHp & 0xFF000000) >> 24; + gBattleMoveDamage = gBattleMons[gBattlerAttacker].hp - hpDiff; gSpecialStatuses[gBattlerTarget].dmg = 0xFFFF; + gBattlescriptCurrInstr += 5; } else @@ -7409,12 +7696,12 @@ static void Cmd_painsplitdmgcalc(void) static void Cmd_settypetorandomresistance(void) // conversion 2 { if (gLastLandedMoves[gBattlerAttacker] == MOVE_NONE - || gLastLandedMoves[gBattlerAttacker] == 0xFFFF) + || gLastLandedMoves[gBattlerAttacker] == MOVE_UNAVAILABLE) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else if (IsTwoTurnsMove(gLastLandedMoves[gBattlerAttacker]) - && gBattleMons[gLastHitBy[gBattlerAttacker]].status2 & STATUS2_MULTIPLETURNS) + && gBattleMons[gLastHitBy[gBattlerAttacker]].status2 & STATUS2_MULTIPLETURNS) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } @@ -7425,7 +7712,9 @@ static void Cmd_settypetorandomresistance(void) // conversion 2 for (rands = 0; rands < 1000; rands++) { while (((i = Random() % 128) > sizeof(gTypeEffectiveness) / 3)); + i *= 3; + if (TYPE_EFFECT_ATK_TYPE(i) == gLastHitByType[gBattlerAttacker] && TYPE_EFFECT_MULTIPLIER(i) <= TYPE_MUL_NOT_EFFECTIVE && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_EFFECT_DEF_TYPE(i))) @@ -7467,7 +7756,7 @@ static void Cmd_settypetorandomresistance(void) // conversion 2 static void Cmd_setalwayshitflag(void) { gStatuses3[gBattlerTarget] &= ~STATUS3_ALWAYS_HITS; - gStatuses3[gBattlerTarget] |= 0x10; + gStatuses3[gBattlerTarget] |= STATUS3_ALWAYS_HITS_TURN(2); gDisableStructs[gBattlerTarget].battlerWithSureHit = gBattlerAttacker; gBattlescriptCurrInstr++; } @@ -7475,6 +7764,7 @@ static void Cmd_setalwayshitflag(void) static void Cmd_copymovepermanently(void) // sketch { gChosenMove = MOVE_UNAVAILABLE; + if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_TRANSFORMED) && gLastPrintedMoves[gBattlerTarget] != MOVE_STRUGGLE && gLastPrintedMoves[gBattlerTarget] != MOVE_NONE @@ -7484,8 +7774,13 @@ static void Cmd_copymovepermanently(void) // sketch s32 i; for (i = 0; i < MAX_MON_MOVES; i++) - if (gBattleMons[gBattlerAttacker].moves[i] != MOVE_SKETCH && gBattleMons[gBattlerAttacker].moves[i] == gLastPrintedMoves[gBattlerTarget]) + { + if (gBattleMons[gBattlerAttacker].moves[i] == MOVE_SKETCH) + continue; + if (gBattleMons[gBattlerAttacker].moves[i] == gLastPrintedMoves[gBattlerTarget]) break; + } + if (i != MAX_MON_MOVES) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); @@ -7497,15 +7792,19 @@ static void Cmd_copymovepermanently(void) // sketch gBattleMons[gBattlerAttacker].moves[gCurrMovePos] = gLastPrintedMoves[gBattlerTarget]; gBattleMons[gBattlerAttacker].pp[gCurrMovePos] = gBattleMoves[gLastPrintedMoves[gBattlerTarget]].pp; gActiveBattler = gBattlerAttacker; + for (i = 0; i < MAX_MON_MOVES; i++) { movePpData.moves[i] = gBattleMons[gBattlerAttacker].moves[i]; movePpData.pp[i] = gBattleMons[gBattlerAttacker].pp[i]; } movePpData.ppBonuses = gBattleMons[gBattlerAttacker].ppBonuses; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_MOVES_PP_BATTLE, 0, sizeof(struct MovePpInfo), &movePpData); + + BtlController_EmitSetMonData(BUFFER_A, REQUEST_MOVES_PP_BATTLE, 0, sizeof(movePpData), &movePpData); MarkBattlerForControllerExec(gActiveBattler); + PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastPrintedMoves[gBattlerTarget]) + gBattlescriptCurrInstr += 5; } } @@ -7520,7 +7819,7 @@ static bool8 IsTwoTurnsMove(u16 move) if (gBattleMoves[move].effect == EFFECT_SKULL_BASH || gBattleMoves[move].effect == EFFECT_RAZOR_WIND || gBattleMoves[move].effect == EFFECT_SKY_ATTACK - || gBattleMoves[move].effect == EFFECT_SOLARBEAM + || gBattleMoves[move].effect == EFFECT_SOLAR_BEAM || gBattleMoves[move].effect == EFFECT_SEMI_INVULNERABLE || gBattleMoves[move].effect == EFFECT_BIDE) return TRUE; @@ -7530,8 +7829,11 @@ static bool8 IsTwoTurnsMove(u16 move) static bool8 IsInvalidForSleepTalkOrAssist(u16 move) { - if (move == MOVE_NONE || move == MOVE_SLEEP_TALK || move == MOVE_ASSIST - || move == MOVE_MIRROR_MOVE || move == MOVE_METRONOME) + if (move == MOVE_NONE + || move == MOVE_SLEEP_TALK + || move == MOVE_ASSIST + || move == MOVE_MIRROR_MOVE + || move == MOVE_METRONOME) return TRUE; else return FALSE; @@ -7540,17 +7842,20 @@ static bool8 IsInvalidForSleepTalkOrAssist(u16 move) static u8 AttacksThisTurn(u8 battlerId, u16 move) // Note: returns 1 if it's a charging turn, otherwise 2 { // first argument is unused - if (gBattleMoves[move].effect == EFFECT_SOLARBEAM - && (gBattleWeather & B_WEATHER_SUN)) + if (gBattleMoves[move].effect == EFFECT_SOLAR_BEAM + && (gBattleWeather & B_WEATHER_SUN)) return 2; + if (gBattleMoves[move].effect == EFFECT_SKULL_BASH || gBattleMoves[move].effect == EFFECT_RAZOR_WIND || gBattleMoves[move].effect == EFFECT_SKY_ATTACK - || gBattleMoves[move].effect == EFFECT_SOLARBEAM + || gBattleMoves[move].effect == EFFECT_SOLAR_BEAM || gBattleMoves[move].effect == EFFECT_SEMI_INVULNERABLE || gBattleMoves[move].effect == EFFECT_BIDE) + { if ((gHitMarker & HITMARKER_CHARGING)) return 1; + } return 2; } @@ -7562,15 +7867,16 @@ static void Cmd_trychoosesleeptalkmove(void) for (i = 0; i < MAX_MON_MOVES; i++) { if (IsInvalidForSleepTalkOrAssist(gBattleMons[gBattlerAttacker].moves[i]) - || gBattleMons[gBattlerAttacker].moves[i] == MOVE_FOCUS_PUNCH - || gBattleMons[gBattlerAttacker].moves[i] == MOVE_UPROAR - || IsTwoTurnsMove(gBattleMons[gBattlerAttacker].moves[i])) + || gBattleMons[gBattlerAttacker].moves[i] == MOVE_FOCUS_PUNCH + || gBattleMons[gBattlerAttacker].moves[i] == MOVE_UPROAR + || IsTwoTurnsMove(gBattleMons[gBattlerAttacker].moves[i])) { unusableMovesBits |= gBitTable[i]; } } - unusableMovesBits = CheckMoveLimitations(gBattlerAttacker, unusableMovesBits, ~(MOVE_LIMITATION_PP)); - if (unusableMovesBits == 0xF) // all 4 moves cannot be chosen + + unusableMovesBits = CheckMoveLimitations(gBattlerAttacker, unusableMovesBits, ~MOVE_LIMITATION_PP); + if (unusableMovesBits == (1 << MAX_MON_MOVES) - 1) // all 4 moves cannot be chosen { gBattlescriptCurrInstr += 5; } @@ -7579,12 +7885,14 @@ static void Cmd_trychoosesleeptalkmove(void) u32 movePosition; do - movePosition = Random() & 3; - while ((gBitTable[movePosition] & unusableMovesBits)); + { + movePosition = Random() & (MAX_MON_MOVES - 1); + } while ((gBitTable[movePosition] & unusableMovesBits)); + gCalledMove = gBattleMons[gBattlerAttacker].moves[movePosition]; gCurrMovePos = movePosition; - gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - gBattlerTarget = GetMoveTarget(gCalledMove, 0); + gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; + gBattlerTarget = GetMoveTarget(gCalledMove, NO_TARGET_OVERRIDE); gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } @@ -7599,11 +7907,12 @@ static void TrySetDestinyBondToHappen(void) { u8 sideAttacker = GetBattlerSide(gBattlerAttacker); u8 sideTarget = GetBattlerSide(gBattlerTarget); - if (gBattleMons[gBattlerTarget].status2 & STATUS2_DESTINY_BOND - && sideAttacker != sideTarget - && !(gHitMarker & HITMARKER_GRUDGE)) + && sideAttacker != sideTarget + && !(gHitMarker & HITMARKER_GRUDGE)) + { gHitMarker |= HITMARKER_DESTINYBOND; + } } static void Cmd_trysetdestinybondtohappen(void) @@ -7617,11 +7926,12 @@ static void Cmd_remaininghptopower(void) s32 i; s32 hpFraction = GetScaledHPFraction(gBattleMons[gBattlerAttacker].hp, gBattleMons[gBattlerAttacker].maxHP, 48); - for (i = 0; i < (s32)sizeof(sFlailHpScaleToPowerTable); i += 2) + for (i = 0; i < (s32) sizeof(sFlailHpScaleToPowerTable); i += 2) { if (hpFraction <= sFlailHpScaleToPowerTable[i]) break; } + gDynamicBasePower = sFlailHpScaleToPowerTable[i + 1]; gBattlescriptCurrInstr++; } @@ -7642,21 +7952,28 @@ static void Cmd_tryspiteppreduce(void) if (i != MAX_MON_MOVES && gBattleMons[gBattlerTarget].pp[i] > 1) { s32 ppToDeduct = (Random() & 3) + 2; - if (gBattleMons[gBattlerTarget].pp[i] < ppToDeduct) ppToDeduct = gBattleMons[gBattlerTarget].pp[i]; + PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastMoves[gBattlerTarget]) - ConvertIntToDecimalStringN(gBattleTextBuff2, ppToDeduct, 0, 1); + + ConvertIntToDecimalStringN(gBattleTextBuff2, ppToDeduct, STR_CONV_MODE_LEFT_ALIGN, 1); + PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff2, 1, ppToDeduct) + gBattleMons[gBattlerTarget].pp[i] -= ppToDeduct; gActiveBattler = gBattlerTarget; + + // if (MOVE_IS_PERMANENT(gActiveBattler, i)), but backwards if (!(gDisableStructs[gActiveBattler].mimickedMoves & gBitTable[i]) - && !(gBattleMons[gActiveBattler].status2 & STATUS2_TRANSFORMED)) + && !(gBattleMons[gActiveBattler].status2 & STATUS2_TRANSFORMED)) { - BtlController_EmitSetMonData(BUFFER_A, REQUEST_PPMOVE1_BATTLE + i, 0, 1, &gBattleMons[gActiveBattler].pp[i]); + BtlController_EmitSetMonData(BUFFER_A, REQUEST_PPMOVE1_BATTLE + i, 0, sizeof(gBattleMons[gActiveBattler].pp[i]), &gBattleMons[gActiveBattler].pp[i]); MarkBattlerForControllerExec(gActiveBattler); } + gBattlescriptCurrInstr += 5; + if (gBattleMons[gBattlerTarget].pp[i] == 0) CancelMultiTurnMoves(gBattlerTarget); } @@ -7681,36 +7998,43 @@ static void Cmd_healpartystatus(void) struct Pokemon *party; s32 i; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_BELL; + if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) party = gPlayerParty; else party = gEnemyParty; + if (gBattleMons[gBattlerAttacker].ability != ABILITY_SOUNDPROOF) { gBattleMons[gBattlerAttacker].status1 = 0; - gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_NIGHTMARE); + gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE; } else { RecordAbilityBattle(gBattlerAttacker, gBattleMons[gBattlerAttacker].ability); - gBattleCommunication[MULTISTRING_CHOOSER] |= 1; + gBattleCommunication[MULTISTRING_CHOOSER] |= B_MSG_BELL_SOUNDPROOF_ATTACKER; } + gActiveBattler = gBattleScripting.battler = GetBattlerAtPosition(GetBattlerPosition(gBattlerAttacker) ^ BIT_FLANK); + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE - && !(gAbsentBattlerFlags & gBitTable[gActiveBattler])) + && !(gAbsentBattlerFlags & gBitTable[gActiveBattler])) { if (gBattleMons[gActiveBattler].ability != ABILITY_SOUNDPROOF) { gBattleMons[gActiveBattler].status1 = 0; - gBattleMons[gActiveBattler].status2 &= ~(STATUS2_NIGHTMARE); + gBattleMons[gActiveBattler].status2 &= ~STATUS2_NIGHTMARE; } else { RecordAbilityBattle(gActiveBattler, gBattleMons[gActiveBattler].ability); - gBattleCommunication[MULTISTRING_CHOOSER] |= 2; + gBattleCommunication[MULTISTRING_CHOOSER] |= B_MSG_BELL_SOUNDPROOF_PARTNER; } } + + // Because the above MULTISTRING_CHOOSER are ORd, if both are set then it will be B_MSG_BELL_BOTH_SOUNDPROOF + for (i = 0; i < PARTY_SIZE; i++) { u16 species = GetMonData(&party[i], MON_DATA_SPECIES2); @@ -7723,11 +8047,12 @@ static void Cmd_healpartystatus(void) if (gBattlerPartyIndexes[gBattlerAttacker] == i) ability = gBattleMons[gBattlerAttacker].ability; else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE - && gBattlerPartyIndexes[gActiveBattler] == i - && !(gAbsentBattlerFlags & gBitTable[gActiveBattler])) + && gBattlerPartyIndexes[gActiveBattler] == i + && !(gAbsentBattlerFlags & gBitTable[gActiveBattler])) ability = gBattleMons[gActiveBattler].ability; else ability = GetAbilityBySpecies(species, abilityNum); + if (ability != ABILITY_SOUNDPROOF) toHeal |= (1 << i); } @@ -7735,25 +8060,29 @@ static void Cmd_healpartystatus(void) } else // Aromatherapy { - gBattleCommunication[MULTISTRING_CHOOSER] = 4; - toHeal = 0x3F; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SOOTHING_AROMA; + toHeal = (1 << PARTY_SIZE) - 1; + gBattleMons[gBattlerAttacker].status1 = 0; - gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_NIGHTMARE); + gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE; + gActiveBattler = GetBattlerAtPosition(GetBattlerPosition(gBattlerAttacker) ^ BIT_FLANK); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE - && !(gAbsentBattlerFlags & gBitTable[gActiveBattler])) + && !(gAbsentBattlerFlags & gBitTable[gActiveBattler])) { gBattleMons[gActiveBattler].status1 = 0; - gBattleMons[gActiveBattler].status2 &= ~(STATUS2_NIGHTMARE); + gBattleMons[gActiveBattler].status2 &= ~STATUS2_NIGHTMARE; } } + if (toHeal) { gActiveBattler = gBattlerAttacker; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, toHeal, 4, &zero); + BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, toHeal, sizeof(zero), &zero); MarkBattlerForControllerExec(gActiveBattler); } + gBattlescriptCurrInstr++; } @@ -7769,6 +8098,7 @@ static void Cmd_cursetarget(void) gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 2; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; + gBattlescriptCurrInstr += 5; } } @@ -7785,7 +8115,7 @@ static void Cmd_trysetspikes(void) else { gSideStatuses[targetSide] |= SIDE_STATUS_SPIKES; - ++gSideTimers[targetSide].spikesAmount; + gSideTimers[targetSide].spikesAmount++; gBattlescriptCurrInstr += 5; } } @@ -7804,9 +8134,9 @@ static void Cmd_trysetperishsong(void) for (i = 0; i < gBattlersCount; i++) { if (gStatuses3[i] & STATUS3_PERISH_SONG - || gBattleMons[i].ability == ABILITY_SOUNDPROOF) + || gBattleMons[i].ability == ABILITY_SOUNDPROOF) { - ++notAffectedCount; + notAffectedCount++; } else { @@ -7815,7 +8145,9 @@ static void Cmd_trysetperishsong(void) gDisableStructs[i].perishSongTimerStartValue = 3; } } + PressurePPLoseOnUsingPerishSong(gBattlerAttacker); + if (notAffectedCount == gBattlersCount) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else @@ -7841,12 +8173,18 @@ static void Cmd_rolloutdamagecalculation(void) gLockedMoves[gBattlerAttacker] = gCurrentMove; } if (--gDisableStructs[gBattlerAttacker].rolloutTimer == 0) // last hit - gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_MULTIPLETURNS); + { + gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_MULTIPLETURNS; + } + gDynamicBasePower = gBattleMoves[gCurrentMove].power; + for (i = 1; i < (5 - gDisableStructs[gBattlerAttacker].rolloutTimer); i++) gDynamicBasePower *= 2; + if (gBattleMons[gBattlerAttacker].status2 & STATUS2_DEFENSE_CURL) gDynamicBasePower *= 2; + gBattlescriptCurrInstr++; } } @@ -7854,7 +8192,7 @@ static void Cmd_rolloutdamagecalculation(void) static void Cmd_jumpifconfusedandstatmaxed(void) { if (gBattleMons[gBattlerTarget].status2 & STATUS2_CONFUSION - && gBattleMons[gBattlerTarget].statStages[gBattlescriptCurrInstr[1]] == 12) + && gBattleMons[gBattlerTarget].statStages[gBattlescriptCurrInstr[1]] == MAX_STAT_STAGE) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); else gBattlescriptCurrInstr += 6; @@ -7872,11 +8210,13 @@ static void Cmd_furycuttercalc(void) s32 i; if (gDisableStructs[gBattlerAttacker].furyCutterCounter != 5) - ++gDisableStructs[gBattlerAttacker].furyCutterCounter; + gDisableStructs[gBattlerAttacker].furyCutterCounter++; + gDynamicBasePower = gBattleMoves[gCurrentMove].power; for (i = 1; i < gDisableStructs[gBattlerAttacker].furyCutterCounter; i++) gDynamicBasePower *= 2; + gBattlescriptCurrInstr++; } } @@ -7887,6 +8227,7 @@ static void Cmd_friendshiptodamagecalculation(void) gDynamicBasePower = 10 * (gBattleMons[gBattlerAttacker].friendship) / 25; else // EFFECT_FRUSTRATION gDynamicBasePower = 10 * (255 - gBattleMons[gBattlerAttacker].friendship) / 25; + gBattlescriptCurrInstr++; } @@ -7895,17 +8236,11 @@ static void Cmd_presentdamagecalculation(void) s32 rand = Random() & 0xFF; if (rand < 102) - { gDynamicBasePower = 40; - } else if (rand < 178) - { gDynamicBasePower = 80; - } else if (rand < 204) - { gDynamicBasePower = 120; - } else { gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 4; @@ -7914,16 +8249,12 @@ static void Cmd_presentdamagecalculation(void) gBattleMoveDamage *= -1; } if (rand < 204) - { gBattlescriptCurrInstr = BattleScript_HitFromCritCalc; - } else if (gBattleMons[gBattlerTarget].maxHP == gBattleMons[gBattlerTarget].hp) - { gBattlescriptCurrInstr = BattleScript_AlreadyAtFullHp; - } else { - gMoveResultFlags &= ~(MOVE_RESULT_DOESNT_AFFECT_FOE); + gMoveResultFlags &= ~MOVE_RESULT_DOESNT_AFFECT_FOE; gBattlescriptCurrInstr = BattleScript_PresentHealTarget; } } @@ -7933,15 +8264,16 @@ static void Cmd_setsafeguard(void) if (gSideStatuses[GET_BATTLER_SIDE(gBattlerAttacker)] & SIDE_STATUS_SAFEGUARD) { gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SIDE_STATUS_FAILED; } else { gSideStatuses[GET_BATTLER_SIDE(gBattlerAttacker)] |= SIDE_STATUS_SAFEGUARD; gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].safeguardTimer = 5; gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].safeguardBattlerId = gBattlerAttacker; - gBattleCommunication[MULTISTRING_CHOOSER] = 5; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_SAFEGUARD; } + gBattlescriptCurrInstr++; } @@ -7984,10 +8316,17 @@ static void Cmd_magnitudedamagecalculation(void) gDynamicBasePower = 150; magnitude = 10; } + PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 2, magnitude) - for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; ++gBattlerTarget) - if (gBattlerTarget != gBattlerAttacker && !(gAbsentBattlerFlags & gBitTable[gBattlerTarget])) // a valid target was found + + for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++) + { + if (gBattlerTarget == gBattlerAttacker) + continue; + if (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget])) // a valid target was found break; + } + gBattlescriptCurrInstr++; } @@ -8007,23 +8346,27 @@ static void Cmd_jumpifnopursuitswitchdmg(void) else gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); } + if (gChosenActionByBattler[gBattlerTarget] == B_ACTION_USE_MOVE - && gBattlerAttacker == *(gBattleStruct->moveTarget + gBattlerTarget) - && !(gBattleMons[gBattlerTarget].status1 & (STATUS1_SLEEP | STATUS1_FREEZE)) - && gBattleMons[gBattlerAttacker].hp - && !gDisableStructs[gBattlerTarget].truantCounter - && gChosenMoveByBattler[gBattlerTarget] == MOVE_PURSUIT) + && gBattlerAttacker == *(gBattleStruct->moveTarget + gBattlerTarget) + && !(gBattleMons[gBattlerTarget].status1 & (STATUS1_SLEEP | STATUS1_FREEZE)) + && gBattleMons[gBattlerAttacker].hp + && !gDisableStructs[gBattlerTarget].truantCounter + && gChosenMoveByBattler[gBattlerTarget] == MOVE_PURSUIT) { s32 i; for (i = 0; i < gBattlersCount; i++) + { if (gBattlerByTurnOrder[i] == gBattlerTarget) - gActionsByTurnOrder[i] = 11; + gActionsByTurnOrder[i] = B_ACTION_TRY_FINISH; + } + gCurrentMove = MOVE_PURSUIT; gCurrMovePos = gChosenMovePos = *(gBattleStruct->chosenMovePositions + gBattlerTarget); gBattlescriptCurrInstr += 5; gBattleScripting.animTurn = 1; - gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); + gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; } else { @@ -8036,14 +8379,15 @@ static void Cmd_setsunny(void) if (gBattleWeather & B_WEATHER_SUN) { gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEATHER_FAILED; } else { gBattleWeather = B_WEATHER_SUN_TEMPORARY; - gBattleCommunication[MULTISTRING_CHOOSER] = 4; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_SUNLIGHT; gWishFutureKnock.weatherDuration = 5; } + gBattlescriptCurrInstr++; } @@ -8053,13 +8397,15 @@ static void Cmd_maxattackhalvehp(void) // belly drum if (!(gBattleMons[gBattlerAttacker].maxHP / 2)) halfHp = 1; - if (gBattleMons[gBattlerAttacker].statStages[STAT_ATK] < 12 - && gBattleMons[gBattlerAttacker].hp > halfHp) + + if (gBattleMons[gBattlerAttacker].statStages[STAT_ATK] < MAX_STAT_STAGE + && gBattleMons[gBattlerAttacker].hp > halfHp) { - gBattleMons[gBattlerAttacker].statStages[STAT_ATK] = 12; + gBattleMons[gBattlerAttacker].statStages[STAT_ATK] = MAX_STAT_STAGE; gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 2; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; + gBattlescriptCurrInstr += 5; } else @@ -8073,7 +8419,10 @@ static void Cmd_copyfoestats(void) // psych up s32 i; for (i = 0; i < NUM_BATTLE_STATS; i++) + { gBattleMons[gBattlerAttacker].statStages[i] = gBattleMons[gBattlerTarget].statStages[i]; + } + gBattlescriptCurrInstr += 5; // Has an unused jump ptr(possibly for a failed attempt) parameter. } @@ -8082,26 +8431,28 @@ static void Cmd_rapidspinfree(void) if (gBattleMons[gBattlerAttacker].status2 & STATUS2_WRAPPED) { gBattleScripting.battler = gBattlerTarget; - gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_WRAPPED); + gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_WRAPPED; gBattlerTarget = *(gBattleStruct->wrappedBy + gBattlerAttacker); + gBattleTextBuff1[0] = B_BUFF_PLACEHOLDER_BEGIN; gBattleTextBuff1[1] = B_BUFF_MOVE; gBattleTextBuff1[2] = *(gBattleStruct->wrappedMove + gBattlerAttacker * 2 + 0); gBattleTextBuff1[3] = *(gBattleStruct->wrappedMove + gBattlerAttacker * 2 + 1); gBattleTextBuff1[4] = B_BUFF_EOS; + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_WrapFree; } else if (gStatuses3[gBattlerAttacker] & STATUS3_LEECHSEED) { - gStatuses3[gBattlerAttacker] &= ~(STATUS3_LEECHSEED); - gStatuses3[gBattlerAttacker] &= ~(STATUS3_LEECHSEED_BATTLER); + gStatuses3[gBattlerAttacker] &= ~STATUS3_LEECHSEED; + gStatuses3[gBattlerAttacker] &= ~STATUS3_LEECHSEED_BATTLER; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_LeechSeedFree; } else if (gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_SPIKES) { - gSideStatuses[GetBattlerSide(gBattlerAttacker)] &= ~(SIDE_STATUS_SPIKES); + gSideStatuses[GetBattlerSide(gBattlerAttacker)] &= ~SIDE_STATUS_SPIKES; gSideTimers[GetBattlerSide(gBattlerAttacker)].spikesAmount = 0; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_SpikesFree; @@ -8121,6 +8472,7 @@ static void Cmd_setdefensecurlbit(void) static void Cmd_recoverbasedonsunlight(void) { gBattlerTarget = gBattlerAttacker; + if (gBattleMons[gBattlerAttacker].hp != gBattleMons[gBattlerAttacker].maxHP) { if (gBattleWeather == 0 || !WEATHER_HAS_EFFECT) @@ -8158,19 +8510,28 @@ static void Cmd_hiddenpowercalc(void) | ((gBattleMons[gBattlerAttacker].speedIV & 1) << 3) | ((gBattleMons[gBattlerAttacker].spAttackIV & 1) << 4) | ((gBattleMons[gBattlerAttacker].spDefenseIV & 1) << 5); + gDynamicBasePower = (40 * powerBits) / 63 + 30; - gBattleStruct->dynamicMoveType = (15 * typeBits) / 63 + 1; + + // Subtract 3 instead of 1 below because 2 types are excluded (TYPE_NORMAL and TYPE_MYSTERY) + // The final + 1 skips past Normal, and the following conditional skips TYPE_MYSTERY + gBattleStruct->dynamicMoveType = ((NUMBER_OF_MON_TYPES - 3) * typeBits) / 63 + 1; if (gBattleStruct->dynamicMoveType >= TYPE_MYSTERY) - ++gBattleStruct->dynamicMoveType; - gBattleStruct->dynamicMoveType |= 0xC0; + gBattleStruct->dynamicMoveType++; + gBattleStruct->dynamicMoveType |= F_DYNAMIC_TYPE_1 | F_DYNAMIC_TYPE_2; + gBattlescriptCurrInstr++; } static void Cmd_selectfirstvalidtarget(void) { - for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; ++gBattlerTarget) - if (gBattlerTarget != gBattlerAttacker && !(gAbsentBattlerFlags & gBitTable[gBattlerTarget])) + for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++) + { + if (gBattlerTarget == gBattlerAttacker) + continue; + if (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget])) break; + } gBattlescriptCurrInstr++; } @@ -8185,20 +8546,18 @@ static void Cmd_trysetfutureattack(void) gWishFutureKnock.futureSightMove[gBattlerTarget] = gCurrentMove; gWishFutureKnock.futureSightAttacker[gBattlerTarget] = gBattlerAttacker; gWishFutureKnock.futureSightCounter[gBattlerTarget] = 3; - gWishFutureKnock.futureSightDmg[gBattlerTarget] = CalculateBaseDamage(&gBattleMons[gBattlerAttacker], - &gBattleMons[gBattlerTarget], - gCurrentMove, - gSideStatuses[GET_BATTLER_SIDE(gBattlerTarget)], - 0, - 0, - gBattlerAttacker, - gBattlerTarget); + gWishFutureKnock.futureSightDmg[gBattlerTarget] = CalculateBaseDamage(&gBattleMons[gBattlerAttacker], &gBattleMons[gBattlerTarget], gCurrentMove, + gSideStatuses[GET_BATTLER_SIDE(gBattlerTarget)], 0, + 0, gBattlerAttacker, gBattlerTarget); + if (gProtectStructs[gBattlerAttacker].helpingHand) gWishFutureKnock.futureSightDmg[gBattlerTarget] = gWishFutureKnock.futureSightDmg[gBattlerTarget] * 15 / 10; + if (gCurrentMove == MOVE_DOOM_DESIRE) - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DOOM_DESIRE; else - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FUTURE_SIGHT; + gBattlescriptCurrInstr += 5; } } @@ -8211,6 +8570,7 @@ static void Cmd_trydobeatup(void) party = gPlayerParty; else party = gEnemyParty; + if (gBattleMons[gBattlerTarget].hp == 0) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); @@ -8218,19 +8578,20 @@ static void Cmd_trydobeatup(void) else { u8 beforeLoop = gBattleCommunication[0]; - - for (;gBattleCommunication[0] < 6; ++gBattleCommunication[0]) + for (;gBattleCommunication[0] < PARTY_SIZE; gBattleCommunication[0]++) { if (GetMonData(&party[gBattleCommunication[0]], MON_DATA_HP) - && GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES2) - && GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES2) != SPECIES_EGG - && !GetMonData(&party[gBattleCommunication[0]], MON_DATA_STATUS)) + && GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES2) + && GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES2) != SPECIES_EGG + && !GetMonData(&party[gBattleCommunication[0]], MON_DATA_STATUS)) break; } - if (gBattleCommunication[0] < 6) + if (gBattleCommunication[0] < PARTY_SIZE) { PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gBattlerAttacker, gBattleCommunication[0]) + gBattlescriptCurrInstr += 9; + gBattleMoveDamage = gBaseStats[GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES)].baseAttack; gBattleMoveDamage *= gBattleMoves[gCurrentMove].power; gBattleMoveDamage *= (GetMonData(&party[gBattleCommunication[0]], MON_DATA_LEVEL) * 2 / 5 + 2); @@ -8238,7 +8599,8 @@ static void Cmd_trydobeatup(void) gBattleMoveDamage = (gBattleMoveDamage / 50) + 2; if (gProtectStructs[gBattlerAttacker].helpingHand) gBattleMoveDamage = gBattleMoveDamage * 15 / 10; - ++gBattleCommunication[0]; + + gBattleCommunication[0]++; } else if (beforeLoop != 0) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); @@ -8262,6 +8624,7 @@ static void Cmd_setsemiinvulnerablebit(void) gStatuses3[gBattlerAttacker] |= STATUS3_UNDERWATER; break; } + gBattlescriptCurrInstr++; } @@ -8280,6 +8643,7 @@ static void Cmd_clearsemiinvulnerablebit(void) gStatuses3[gBattlerAttacker] &= ~STATUS3_UNDERWATER; break; } + gBattlescriptCurrInstr++; } @@ -8287,6 +8651,7 @@ static void Cmd_setminimize(void) { if (gHitMarker & HITMARKER_OBEYS) gStatuses3[gBattlerAttacker] |= STATUS3_MINIMIZED; + gBattlescriptCurrInstr++; } @@ -8295,30 +8660,33 @@ static void Cmd_sethail(void) if (gBattleWeather & B_WEATHER_HAIL) { gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEATHER_FAILED; } else { gBattleWeather = B_WEATHER_HAIL_TEMPORARY; - gBattleCommunication[MULTISTRING_CHOOSER] = 5; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_HAIL; gWishFutureKnock.weatherDuration = 5; } + gBattlescriptCurrInstr++; } -static void Cmd_trymemento(void) // memento +static void Cmd_trymemento(void) { - if (gBattleMons[gBattlerTarget].statStages[STAT_ATK] == 0 - && gBattleMons[gBattlerTarget].statStages[STAT_SPATK] == 0 - && gBattleCommunication[6] != 1) + if (gBattleMons[gBattlerTarget].statStages[STAT_ATK] == MIN_STAT_STAGE + && gBattleMons[gBattlerTarget].statStages[STAT_SPATK] == MIN_STAT_STAGE + && gBattleCommunication[MISS_TYPE] != B_MSG_PROTECTED) { + // Failed, unprotected target already has minimum Attack and Special Attack. gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { + // Success, drop user's HP bar to 0 gActiveBattler = gBattlerAttacker; gBattleMoveDamage = gBattleMons[gActiveBattler].hp; - BtlController_EmitHealthBarUpdate(0, INSTANT_HP_BAR_DROP); + BtlController_EmitHealthBarUpdate(BUFFER_A, INSTANT_HP_BAR_DROP); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 5; } @@ -8341,9 +8709,9 @@ static void Cmd_setcharge(void) static void Cmd_callterrainattack(void) // nature power { - gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); + gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; gCurrentMove = sNaturePowerMoves[gBattleTerrain]; - gBattlerTarget = GetMoveTarget(gCurrentMove, 0); + gBattlerTarget = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); BattleScriptPush(gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]); gBattlescriptCurrInstr++; } @@ -8355,7 +8723,7 @@ static void Cmd_cureifburnedparalysedorpoisoned(void) // refresh gBattleMons[gBattlerAttacker].status1 = 0; gBattlescriptCurrInstr += 5; gActiveBattler = gBattlerAttacker; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); } else @@ -8402,10 +8770,11 @@ static void Cmd_settaunt(void) static void Cmd_trysethelpinghand(void) { gBattlerTarget = GetBattlerAtPosition(GetBattlerPosition(gBattlerAttacker) ^ BIT_FLANK); + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE - && !(gAbsentBattlerFlags & gBitTable[gBattlerTarget]) - && !gProtectStructs[gBattlerAttacker].helpingHand - && !gProtectStructs[gBattlerTarget].helpingHand) + && !(gAbsentBattlerFlags & gBitTable[gBattlerTarget]) + && !gProtectStructs[gBattlerAttacker].helpingHand + && !gProtectStructs[gBattlerTarget].helpingHand) { gProtectStructs[gBattlerTarget].helpingHand = 1; gBattlescriptCurrInstr += 5; @@ -8420,9 +8789,11 @@ static void Cmd_tryswapitems(void) // trick { // opponent can't swap items with player in regular battles if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_TOWER - || (GetBattlerSide(gBattlerAttacker) == B_SIDE_OPPONENT - && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER)) - && gTrainerBattleOpponent_A != TRAINER_SECRET_BASE)) + || (GetBattlerSide(gBattlerAttacker) == B_SIDE_OPPONENT + && !(gBattleTypeFlags & (BATTLE_TYPE_LINK + | BATTLE_TYPE_BATTLE_TOWER + | BATTLE_TYPE_EREADER_TRAINER)) + && gTrainerBattleOpponent_A != TRAINER_SECRET_BASE)) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } @@ -8432,20 +8803,22 @@ static void Cmd_tryswapitems(void) // trick u8 sideTarget = GetBattlerSide(gBattlerTarget); // you can't swap items if they were knocked off in regular battles - if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER)) - && gTrainerBattleOpponent_A != TRAINER_SECRET_BASE - && (gWishFutureKnock.knockedOffMons[sideAttacker] & gBitTable[gBattlerPartyIndexes[gBattlerAttacker]] - || gWishFutureKnock.knockedOffMons[sideTarget] & gBitTable[gBattlerPartyIndexes[gBattlerTarget]])) + if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK + | BATTLE_TYPE_BATTLE_TOWER + | BATTLE_TYPE_EREADER_TRAINER)) + && gTrainerBattleOpponent_A != TRAINER_SECRET_BASE + && (gWishFutureKnock.knockedOffMons[sideAttacker] & gBitTable[gBattlerPartyIndexes[gBattlerAttacker]] + || gWishFutureKnock.knockedOffMons[sideTarget] & gBitTable[gBattlerPartyIndexes[gBattlerTarget]])) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } // can't swap if two pokemon don't have an item // or if either of them is an enigma berry or a mail - else if ((gBattleMons[gBattlerAttacker].item == 0 && gBattleMons[gBattlerTarget].item == 0) - || gBattleMons[gBattlerAttacker].item == ITEM_ENIGMA_BERRY - || gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY - || IS_ITEM_MAIL(gBattleMons[gBattlerAttacker].item) - || IS_ITEM_MAIL(gBattleMons[gBattlerTarget].item)) + else if ((gBattleMons[gBattlerAttacker].item == ITEM_NONE && gBattleMons[gBattlerTarget].item == ITEM_NONE) + || gBattleMons[gBattlerAttacker].item == ITEM_ENIGMA_BERRY + || gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY + || IS_ITEM_MAIL(gBattleMons[gBattlerAttacker].item) + || IS_ITEM_MAIL(gBattleMons[gBattlerTarget].item)) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } @@ -8464,35 +8837,43 @@ static void Cmd_tryswapitems(void) // trick newItemAtk = &gBattleStruct->changedItems[gBattlerAttacker]; oldItemAtk = gBattleMons[gBattlerAttacker].item; *newItemAtk = gBattleMons[gBattlerTarget].item; - gBattleMons[gBattlerAttacker].item = 0; - gBattleMons[gBattlerTarget].item = oldItemAtk; - gActiveBattler = gBattlerAttacker; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, 2, newItemAtk); - MarkBattlerForControllerExec(gBattlerAttacker); - gActiveBattler = gBattlerTarget; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gBattlerTarget].item); - MarkBattlerForControllerExec(gBattlerTarget); - *(u8 *)((u8 *)(&gBattleStruct->choicedMove[gBattlerTarget]) + 0) = 0; - *(u8 *)((u8 *)(&gBattleStruct->choicedMove[gBattlerTarget]) + 1) = 0; - *(u8 *)((u8 *)(&gBattleStruct->choicedMove[gBattlerAttacker]) + 0) = 0; - *(u8 *)((u8 *)(&gBattleStruct->choicedMove[gBattlerAttacker]) + 1) = 0; + gBattleMons[gBattlerAttacker].item = ITEM_NONE; + gBattleMons[gBattlerTarget].item = oldItemAtk; + + gActiveBattler = gBattlerAttacker; + BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(*newItemAtk), newItemAtk); + MarkBattlerForControllerExec(gBattlerAttacker); + + gActiveBattler = gBattlerTarget; + BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].item), &gBattleMons[gBattlerTarget].item); + MarkBattlerForControllerExec(gBattlerTarget); + + *(u8*)((u8*)(&gBattleStruct->choicedMove[gBattlerTarget]) + 0) = 0; + *(u8*)((u8*)(&gBattleStruct->choicedMove[gBattlerTarget]) + 1) = 0; + + *(u8*)((u8*)(&gBattleStruct->choicedMove[gBattlerAttacker]) + 0) = 0; + *(u8*)((u8*)(&gBattleStruct->choicedMove[gBattlerAttacker]) + 1) = 0; + gBattlescriptCurrInstr += 5; + PREPARE_ITEM_BUFFER(gBattleTextBuff1, *newItemAtk) PREPARE_ITEM_BUFFER(gBattleTextBuff2, oldItemAtk) + if (oldItemAtk != ITEM_NONE && *newItemAtk != ITEM_NONE) - gBattleCommunication[MULTISTRING_CHOOSER] = 2; // attacker's item -> <- target's item + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ITEM_SWAP_BOTH; // attacker's item -> <- target's item else if (oldItemAtk == ITEM_NONE && *newItemAtk != ITEM_NONE) - gBattleCommunication[MULTISTRING_CHOOSER] = 0; // nothing -> <- target's item + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ITEM_SWAP_TAKEN; // nothing -> <- target's item else - gBattleCommunication[MULTISTRING_CHOOSER] = 1; // attacker's item -> <- nothing + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ITEM_SWAP_GIVEN; // attacker's item -> <- nothing } } } static void Cmd_trycopyability(void) // role play { - if (gBattleMons[gBattlerTarget].ability != ABILITY_NONE && gBattleMons[gBattlerTarget].ability != ABILITY_WONDER_GUARD) + if (gBattleMons[gBattlerTarget].ability != ABILITY_NONE + && gBattleMons[gBattlerTarget].ability != ABILITY_WONDER_GUARD) { gBattleMons[gBattlerAttacker].ability = gBattleMons[gBattlerTarget].ability; gLastUsedAbility = gBattleMons[gBattlerTarget].ability; @@ -8522,14 +8903,17 @@ static void Cmd_trywish(void) break; case 1: // heal effect PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gBattlerTarget, gWishFutureKnock.wishMonId[gBattlerTarget]) + gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 2; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattleMoveDamage *= -1; + if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); else gBattlescriptCurrInstr += 6; + break; } } @@ -8550,25 +8934,26 @@ static void Cmd_trysetroots(void) // ingrain static void Cmd_doubledamagedealtifdamaged(void) { if ((gProtectStructs[gBattlerAttacker].physicalDmg != 0 - && gProtectStructs[gBattlerAttacker].physicalBattlerId == gBattlerTarget) - || (gProtectStructs[gBattlerAttacker].specialDmg != 0 - && gProtectStructs[gBattlerAttacker].specialBattlerId == gBattlerTarget)) + && gProtectStructs[gBattlerAttacker].physicalBattlerId == gBattlerTarget) + || (gProtectStructs[gBattlerAttacker].specialDmg != 0 + && gProtectStructs[gBattlerAttacker].specialBattlerId == gBattlerTarget)) { gBattleScripting.dmgMultiplier = 2; } + gBattlescriptCurrInstr++; } static void Cmd_setyawn(void) { if (gStatuses3[gBattlerTarget] & STATUS3_YAWN - || gBattleMons[gBattlerTarget].status1 & STATUS1_ANY) + || gBattleMons[gBattlerTarget].status1 & STATUS1_ANY) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { - gStatuses3[gBattlerTarget] |= 0x1000; + gStatuses3[gBattlerTarget] |= STATUS3_YAWN_TURN(2); gBattlescriptCurrInstr += 5; } } @@ -8591,7 +8976,6 @@ static void Cmd_scaledamagebyhealthratio(void) if (gDynamicBasePower == 0) { u8 power = gBattleMoves[gCurrentMove].power; - gDynamicBasePower = gBattleMons[gBattlerAttacker].hp * power / gBattleMons[gBattlerAttacker].maxHP; if (gDynamicBasePower == 0) gDynamicBasePower = 1; @@ -8601,8 +8985,8 @@ static void Cmd_scaledamagebyhealthratio(void) static void Cmd_tryswapabilities(void) // skill swap { - if ((gBattleMons[gBattlerAttacker].ability == 0 - && gBattleMons[gBattlerTarget].ability == 0) + if ((gBattleMons[gBattlerAttacker].ability == ABILITY_NONE + && gBattleMons[gBattlerTarget].ability == ABILITY_NONE) || gBattleMons[gBattlerAttacker].ability == ABILITY_WONDER_GUARD || gBattleMons[gBattlerTarget].ability == ABILITY_WONDER_GUARD || gMoveResultFlags & MOVE_RESULT_NO_EFFECT) @@ -8612,7 +8996,6 @@ static void Cmd_tryswapabilities(void) // skill swap else { u8 abilityAtk = gBattleMons[gBattlerAttacker].ability; - gBattleMons[gBattlerAttacker].ability = gBattleMons[gBattlerTarget].ability; gBattleMons[gBattlerTarget].ability = abilityAtk; @@ -8632,20 +9015,18 @@ static void Cmd_tryimprison(void) sideAttacker = GetBattlerSide(gBattlerAttacker); PressurePPLoseOnUsingImprison(gBattlerAttacker); - for (battlerId = 0; battlerId < gBattlersCount; ++battlerId) + for (battlerId = 0; battlerId < gBattlersCount; battlerId++) { if (sideAttacker != GetBattlerSide(battlerId)) { s32 attackerMoveId; - - for (attackerMoveId = 0; attackerMoveId < MAX_MON_MOVES; ++attackerMoveId) + for (attackerMoveId = 0; attackerMoveId < MAX_MON_MOVES; attackerMoveId++) { s32 i; - for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMons[gBattlerAttacker].moves[attackerMoveId] == gBattleMons[battlerId].moves[i] - && gBattleMons[gBattlerAttacker].moves[attackerMoveId] != MOVE_NONE) + && gBattleMons[gBattlerAttacker].moves[attackerMoveId] != MOVE_NONE) break; } if (i != MAX_MON_MOVES) @@ -8680,55 +9061,65 @@ static void Cmd_trysetgrudge(void) static void Cmd_weightdamagecalculation(void) { s32 i; - for (i = 0; sWeightToDamageTable[i] != 0xFFFF; i += 2) { if (sWeightToDamageTable[i] > GetPokedexHeightWeight(SpeciesToNationalPokedexNum(gBattleMons[gBattlerTarget].species), 1)) break; } + if (sWeightToDamageTable[i] != 0xFFFF) gDynamicBasePower = sWeightToDamageTable[i + 1]; else gDynamicBasePower = 120; + gBattlescriptCurrInstr++; } static void Cmd_assistattackselect(void) { s32 chooseableMovesNo = 0; - struct Pokemon *party; + struct Pokemon* party; s32 monId, moveId; - u16 *movesArray = gBattleStruct->assistPossibleMoves; + u16* validMoves = gBattleStruct->assistPossibleMoves; if (GET_BATTLER_SIDE(gBattlerAttacker) != B_SIDE_PLAYER) party = gEnemyParty; else party = gPlayerParty; - for (monId = 0; monId < PARTY_SIZE; ++monId) + + for (monId = 0; monId < PARTY_SIZE; monId++) { - if (monId == gBattlerPartyIndexes[gBattlerAttacker] - || GetMonData(&party[monId], MON_DATA_SPECIES2) == SPECIES_NONE - || GetMonData(&party[monId], MON_DATA_SPECIES2) == SPECIES_EGG) + if (monId == gBattlerPartyIndexes[gBattlerAttacker]) continue; - for (moveId = 0; moveId < MAX_MON_MOVES; ++moveId) + if (GetMonData(&party[monId], MON_DATA_SPECIES2) == SPECIES_NONE) + continue; + if (GetMonData(&party[monId], MON_DATA_SPECIES2) == SPECIES_EGG) + continue; + + for (moveId = 0; moveId < MAX_MON_MOVES; moveId++) { s32 i = 0; u16 move = GetMonData(&party[monId], MON_DATA_MOVE1 + moveId); if (IsInvalidForSleepTalkOrAssist(move)) continue; + for (; sMovesForbiddenToCopy[i] != ASSIST_FORBIDDEN_END && move != sMovesForbiddenToCopy[i]; i++); - if (sMovesForbiddenToCopy[i] != ASSIST_FORBIDDEN_END || move == MOVE_NONE) + + if (sMovesForbiddenToCopy[i] != ASSIST_FORBIDDEN_END) continue; - movesArray[chooseableMovesNo] = move; - ++chooseableMovesNo; + if (move == MOVE_NONE) + continue; + + validMoves[chooseableMovesNo] = move; + chooseableMovesNo++; } } if (chooseableMovesNo) { - gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - gCalledMove = movesArray[((Random() & 0xFF) * chooseableMovesNo) >> 8]; - gBattlerTarget = GetMoveTarget(gCalledMove, 0); + gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; + gCalledMove = validMoves[((Random() & 0xFF) * chooseableMovesNo) >> 8]; + gBattlerTarget = GetMoveTarget(gCalledMove, NO_TARGET_OVERRIDE); gBattlescriptCurrInstr += 5; } else @@ -8747,7 +9138,7 @@ static void Cmd_trysetmagiccoat(void) } else { - gProtectStructs[gBattlerAttacker].bounceMove = 1; + gProtectStructs[gBattlerAttacker].bounceMove = TRUE; gBattlescriptCurrInstr += 5; } } @@ -8772,10 +9163,17 @@ static void Cmd_trygetintimidatetarget(void) gBattleScripting.battler = gBattleStruct->intimidateBattler; side = GetBattlerSide(gBattleScripting.battler); + PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gBattleMons[gBattleScripting.battler].ability) - for (;gBattlerTarget < gBattlersCount; ++gBattlerTarget) - if (GetBattlerSide(gBattlerTarget) != side && !(gAbsentBattlerFlags & gBitTable[gBattlerTarget])) + + for (;gBattlerTarget < gBattlersCount; gBattlerTarget++) + { + if (GetBattlerSide(gBattlerTarget) == side) + continue; + if (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget])) break; + } + if (gBattlerTarget >= gBattlersCount) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else @@ -8785,14 +9183,19 @@ static void Cmd_trygetintimidatetarget(void) static void Cmd_switchoutabilities(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); + switch (gBattleMons[gActiveBattler].ability) { case ABILITY_NATURAL_CURE: gBattleMons[gActiveBattler].status1 = 0; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, gBitTable[*(gBattleStruct->battlerPartyIndexes + gActiveBattler)], 4, &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, + gBitTable[*(gBattleStruct->battlerPartyIndexes + gActiveBattler)], + sizeof(gBattleMons[gActiveBattler].status1), + &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); break; } + gBattlescriptCurrInstr += 2; } @@ -8872,10 +9275,13 @@ static void Cmd_pickup(void) static void Cmd_docastformchangeanimation(void) { gActiveBattler = gBattleScripting.battler; + if (gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE) - *(&gBattleStruct->formToChangeInto) |= 0x80; + *(&gBattleStruct->formToChangeInto) |= CASTFORM_SUBSTITUTE; + BtlController_EmitBattleAnimation(BUFFER_A, B_ANIM_CASTFORM_CHANGE, gBattleStruct->formToChangeInto); MarkBattlerForControllerExec(gActiveBattler); + gBattlescriptCurrInstr++; } @@ -8901,7 +9307,7 @@ static void Cmd_settypebasedhalvers(void) // water and mud sport if (!(gStatuses3[gBattlerAttacker] & STATUS3_MUDSPORT)) { gStatuses3[gBattlerAttacker] |= STATUS3_MUDSPORT; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_ELECTRIC; worked = TRUE; } } @@ -8910,10 +9316,11 @@ static void Cmd_settypebasedhalvers(void) // water and mud sport if (!(gStatuses3[gBattlerAttacker] & STATUS3_WATERSPORT)) { gStatuses3[gBattlerAttacker] |= STATUS3_WATERSPORT; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_FIRE; worked = TRUE; } } + if (worked) gBattlescriptCurrInstr += 5; else @@ -8924,19 +9331,20 @@ static void Cmd_setweatherballtype(void) { if (WEATHER_HAS_EFFECT) { - if (gBattleWeather & WEATHER_ANY) + if (gBattleWeather & B_WEATHER_ANY) gBattleScripting.dmgMultiplier = 2; if (gBattleWeather & B_WEATHER_RAIN) - *(&gBattleStruct->dynamicMoveType) = TYPE_WATER | 0x80; + *(&gBattleStruct->dynamicMoveType) = TYPE_WATER | F_DYNAMIC_TYPE_2; else if (gBattleWeather & B_WEATHER_SANDSTORM) - *(&gBattleStruct->dynamicMoveType) = TYPE_ROCK | 0x80; + *(&gBattleStruct->dynamicMoveType) = TYPE_ROCK | F_DYNAMIC_TYPE_2; else if (gBattleWeather & B_WEATHER_SUN) - *(&gBattleStruct->dynamicMoveType) = TYPE_FIRE | 0x80; + *(&gBattleStruct->dynamicMoveType) = TYPE_FIRE | F_DYNAMIC_TYPE_2; else if (gBattleWeather & B_WEATHER_HAIL) - *(&gBattleStruct->dynamicMoveType) = TYPE_ICE | 0x80; + *(&gBattleStruct->dynamicMoveType) = TYPE_ICE | F_DYNAMIC_TYPE_2; else - *(&gBattleStruct->dynamicMoveType) = TYPE_NORMAL | 0x80; + *(&gBattleStruct->dynamicMoveType) = TYPE_NORMAL | F_DYNAMIC_TYPE_2; } + gBattlescriptCurrInstr++; } @@ -8951,8 +9359,10 @@ static void Cmd_tryrecycleitem(void) gLastUsedItem = *usedHeldItem; *usedHeldItem = ITEM_NONE; gBattleMons[gActiveBattler].item = gLastUsedItem; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBattler].item); + + BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].item), &gBattleMons[gActiveBattler].item); MarkBattlerForControllerExec(gActiveBattler); + gBattlescriptCurrInstr += 5; } else @@ -8967,6 +9377,7 @@ static void Cmd_settypetoterrain(void) { SET_BATTLER_TYPE(gBattlerAttacker, sTerrainToType[gBattleTerrain]); PREPARE_TYPE_BUFFER(gBattleTextBuff1, sTerrainToType[gBattleTerrain]); + gBattlescriptCurrInstr += 5; } else @@ -8975,20 +9386,21 @@ static void Cmd_settypetoterrain(void) } } +// Unused static void Cmd_pursuitdoubles(void) { gActiveBattler = GetBattlerAtPosition(GetBattlerPosition(gBattlerAttacker) ^ BIT_FLANK); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE - && !(gAbsentBattlerFlags & gBitTable[gActiveBattler]) - && gChosenActionByBattler[gActiveBattler] == 0 - && gChosenMoveByBattler[gActiveBattler] == MOVE_PURSUIT) + && !(gAbsentBattlerFlags & gBitTable[gActiveBattler]) + && gChosenActionByBattler[gActiveBattler] == B_ACTION_USE_MOVE + && gChosenMoveByBattler[gActiveBattler] == MOVE_PURSUIT) { - gActionsByTurnOrder[gActiveBattler] = 11; + gActionsByTurnOrder[gActiveBattler] = B_ACTION_TRY_FINISH; gCurrentMove = MOVE_PURSUIT; gBattlescriptCurrInstr += 5; gBattleScripting.animTurn = 1; - gBattleScripting.field_20 = gBattlerAttacker; + gBattleScripting.pursuitDoublesAttacker = gBattlerAttacker; gBattlerAttacker = gActiveBattler; } else @@ -9000,10 +9412,12 @@ static void Cmd_pursuitdoubles(void) static void Cmd_snatchsetbattlers(void) { gEffectBattler = gBattlerAttacker; + if (gBattlerAttacker == gBattlerTarget) gBattlerAttacker = gBattlerTarget = gBattleScripting.battler; else gBattlerTarget = gBattleScripting.battler; + gBattleScripting.battler = gEffectBattler; gBattlescriptCurrInstr++; } @@ -9014,8 +9428,8 @@ static void Cmd_removelightscreenreflect(void) // brick break if (gSideTimers[opposingSide].reflectTimer || gSideTimers[opposingSide].lightscreenTimer) { - gSideStatuses[opposingSide] &= ~(SIDE_STATUS_REFLECT); - gSideStatuses[opposingSide] &= ~(SIDE_STATUS_LIGHTSCREEN); + gSideStatuses[opposingSide] &= ~SIDE_STATUS_REFLECT; + gSideStatuses[opposingSide] &= ~SIDE_STATUS_LIGHTSCREEN; gSideTimers[opposingSide].reflectTimer = 0; gSideTimers[opposingSide].lightscreenTimer = 0; gBattleScripting.animTurn = 1; @@ -9026,6 +9440,7 @@ static void Cmd_removelightscreenreflect(void) // brick break gBattleScripting.animTurn = 0; gBattleScripting.animTargetsHit = 0; } + gBattlescriptCurrInstr++; } @@ -9033,139 +9448,151 @@ static void Cmd_handleballthrow(void) { u8 ballMultiplier = 0; - if (gBattleControllerExecFlags == 0) - { - gActiveBattler = gBattlerAttacker; - gBattlerTarget = gBattlerAttacker ^ BIT_SIDE; - if (gBattleTypeFlags & BATTLE_TYPE_GHOST) - { - BtlController_EmitBallThrowAnim(0, BALL_GHOST_DODGE); - MarkBattlerForControllerExec(gActiveBattler); - gBattlescriptCurrInstr = BattleScript_GhostBallDodge; - } - else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - { - BtlController_EmitBallThrowAnim(0, BALL_TRAINER_BLOCK); - MarkBattlerForControllerExec(gActiveBattler); - gBattlescriptCurrInstr = BattleScript_TrainerBallBlock; - } - else if (gBattleTypeFlags & (BATTLE_TYPE_POKEDUDE | BATTLE_TYPE_OLD_MAN_TUTORIAL)) - { - BtlController_EmitBallThrowAnim(0, BALL_3_SHAKES_SUCCESS); - MarkBattlerForControllerExec(gActiveBattler); - gBattlescriptCurrInstr = BattleScript_OldMan_Pokedude_CaughtMessage; - } - else - { - u32 odds; - u8 catchRate; + if (gBattleControllerExecFlags) + return; - if (gLastUsedItem == ITEM_SAFARI_BALL) - catchRate = gBattleStruct->safariCatchFactor * 1275 / 100; - else - catchRate = gBaseStats[gBattleMons[gBattlerTarget].species].catchRate; - if (gLastUsedItem > ITEM_SAFARI_BALL) + gActiveBattler = gBattlerAttacker; + gBattlerTarget = gBattlerAttacker ^ BIT_SIDE; + + if (gBattleTypeFlags & BATTLE_TYPE_GHOST) + { + BtlController_EmitBallThrowAnim(BUFFER_A, BALL_GHOST_DODGE); + MarkBattlerForControllerExec(gActiveBattler); + gBattlescriptCurrInstr = BattleScript_GhostBallDodge; + } + else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + { + BtlController_EmitBallThrowAnim(BUFFER_A, BALL_TRAINER_BLOCK); + MarkBattlerForControllerExec(gActiveBattler); + gBattlescriptCurrInstr = BattleScript_TrainerBallBlock; + } + else if (gBattleTypeFlags & (BATTLE_TYPE_POKEDUDE | BATTLE_TYPE_OLD_MAN_TUTORIAL)) + { + BtlController_EmitBallThrowAnim(BUFFER_A, BALL_3_SHAKES_SUCCESS); + MarkBattlerForControllerExec(gActiveBattler); + gBattlescriptCurrInstr = BattleScript_OldMan_Pokedude_CaughtMessage; + } + else + { + u32 odds; + u8 catchRate; + + if (gLastUsedItem == ITEM_SAFARI_BALL) + catchRate = gBattleStruct->safariCatchFactor * 1275 / 100; + else + catchRate = gBaseStats[gBattleMons[gBattlerTarget].species].catchRate; + + if (gLastUsedItem > ITEM_SAFARI_BALL) + { + switch (gLastUsedItem) { - switch (gLastUsedItem) - { - case ITEM_NET_BALL: - if (IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_WATER) || IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_BUG)) - ballMultiplier = 30; - else - ballMultiplier = 10; - break; - case ITEM_DIVE_BALL: - if (GetCurrentMapType() == MAP_TYPE_UNDERWATER) - ballMultiplier = 35; - else - ballMultiplier = 10; - break; - case ITEM_NEST_BALL: - if (gBattleMons[gBattlerTarget].level < 40) - { - ballMultiplier = 40 - gBattleMons[gBattlerTarget].level; - if (ballMultiplier <= 9) - ballMultiplier = 10; - } - else - { - ballMultiplier = 10; - } - break; - case ITEM_REPEAT_BALL: - if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBattlerTarget].species), FLAG_GET_CAUGHT)) - ballMultiplier = 30; - else - ballMultiplier = 10; - break; - case ITEM_TIMER_BALL: - ballMultiplier = gBattleResults.battleTurnCounter + 10; - if (ballMultiplier > 40) - ballMultiplier = 40; - break; - case ITEM_LUXURY_BALL: - case ITEM_PREMIER_BALL: + case ITEM_NET_BALL: + if (IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_WATER) || IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_BUG)) + ballMultiplier = 30; + else ballMultiplier = 10; - break; - } - } - else - ballMultiplier = sBallCatchBonuses[gLastUsedItem - 2]; - odds = (catchRate * ballMultiplier / 10) - * (gBattleMons[gBattlerTarget].maxHP * 3 - gBattleMons[gBattlerTarget].hp * 2) - / (3 * gBattleMons[gBattlerTarget].maxHP); - if (gBattleMons[gBattlerTarget].status1 & (STATUS1_SLEEP | STATUS1_FREEZE)) - odds *= 2; - if (gBattleMons[gBattlerTarget].status1 & (STATUS1_POISON | STATUS1_BURN | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON)) - odds = (odds * 15) / 10; - if (gLastUsedItem != ITEM_SAFARI_BALL) - { - if (gLastUsedItem == ITEM_MASTER_BALL) + break; + case ITEM_DIVE_BALL: + if (GetCurrentMapType() == MAP_TYPE_UNDERWATER) + ballMultiplier = 35; + else + ballMultiplier = 10; + break; + case ITEM_NEST_BALL: + if (gBattleMons[gBattlerTarget].level < 40) { - gBattleResults.usedMasterBall = TRUE; + ballMultiplier = 40 - gBattleMons[gBattlerTarget].level; + if (ballMultiplier <= 9) + ballMultiplier = 10; } else { - if (gBattleResults.catchAttempts[gLastUsedItem - ITEM_ULTRA_BALL] < 0xFF) - ++gBattleResults.catchAttempts[gLastUsedItem - ITEM_ULTRA_BALL]; + ballMultiplier = 10; } + break; + case ITEM_REPEAT_BALL: + if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBattlerTarget].species), FLAG_GET_CAUGHT)) + ballMultiplier = 30; + else + ballMultiplier = 10; + break; + case ITEM_TIMER_BALL: + ballMultiplier = gBattleResults.battleTurnCounter + 10; + if (ballMultiplier > 40) + ballMultiplier = 40; + break; + case ITEM_LUXURY_BALL: + case ITEM_PREMIER_BALL: + ballMultiplier = 10; + break; } - if (odds > 254) // mon caught + } + else + ballMultiplier = sBallCatchBonuses[gLastUsedItem - ITEM_ULTRA_BALL]; + + odds = (catchRate * ballMultiplier / 10) + * (gBattleMons[gBattlerTarget].maxHP * 3 - gBattleMons[gBattlerTarget].hp * 2) + / (3 * gBattleMons[gBattlerTarget].maxHP); + + if (gBattleMons[gBattlerTarget].status1 & (STATUS1_SLEEP | STATUS1_FREEZE)) + odds *= 2; + if (gBattleMons[gBattlerTarget].status1 & (STATUS1_POISON | STATUS1_BURN | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON)) + odds = (odds * 15) / 10; + + if (gLastUsedItem != ITEM_SAFARI_BALL) + { + if (gLastUsedItem == ITEM_MASTER_BALL) + { + gBattleResults.usedMasterBall = TRUE; + } + else + { + if (gBattleResults.catchAttempts[gLastUsedItem - ITEM_ULTRA_BALL] < 255) + gBattleResults.catchAttempts[gLastUsedItem - ITEM_ULTRA_BALL]++; + } + } + + if (odds > 254) // mon caught + { + BtlController_EmitBallThrowAnim(BUFFER_A, BALL_3_SHAKES_SUCCESS); + MarkBattlerForControllerExec(gActiveBattler); + gBattlescriptCurrInstr = BattleScript_SuccessBallThrow; + SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_POKEBALL, &gLastUsedItem); + + if (CalculatePlayerPartyCount() == PARTY_SIZE) + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + else + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + } + else // mon may be caught, calculate shakes + { + u8 shakes; + + odds = Sqrt(Sqrt(16711680 / odds)); + odds = 1048560 / odds; + + for (shakes = 0; shakes < BALL_3_SHAKES_SUCCESS && Random() < odds; shakes++); + + if (gLastUsedItem == ITEM_MASTER_BALL) + shakes = BALL_3_SHAKES_SUCCESS; // why calculate the shakes before that check? + + BtlController_EmitBallThrowAnim(BUFFER_A, shakes); + MarkBattlerForControllerExec(gActiveBattler); + + if (shakes == BALL_3_SHAKES_SUCCESS) // mon caught, copy of the code above { - BtlController_EmitBallThrowAnim(0, BALL_3_SHAKES_SUCCESS); - MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr = BattleScript_SuccessBallThrow; SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_POKEBALL, &gLastUsedItem); - if (CalculatePlayerPartyCount() == 6) + + if (CalculatePlayerPartyCount() == PARTY_SIZE) gBattleCommunication[MULTISTRING_CHOOSER] = 0; else gBattleCommunication[MULTISTRING_CHOOSER] = 1; } - else // mon may be caught, calculate shakes + else // not caught { - u8 shakes; - - odds = Sqrt(Sqrt(16711680 / odds)); - odds = 1048560 / odds; - for (shakes = 0; shakes < 4 && Random() < odds; ++shakes); - if (gLastUsedItem == ITEM_MASTER_BALL) - shakes = BALL_3_SHAKES_SUCCESS; // why calculate the shakes before that check? - BtlController_EmitBallThrowAnim(0, shakes); - MarkBattlerForControllerExec(gActiveBattler); - if (shakes == BALL_3_SHAKES_SUCCESS) // mon caught, copy of the code above - { - gBattlescriptCurrInstr = BattleScript_SuccessBallThrow; - SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_POKEBALL, &gLastUsedItem); - if (CalculatePlayerPartyCount() == 6) - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - else // not caught - { - gBattleCommunication[MULTISTRING_CHOOSER] = shakes; - gBattlescriptCurrInstr = BattleScript_ShakeBallThrow; - } + gBattleCommunication[MULTISTRING_CHOOSER] = shakes; + gBattlescriptCurrInstr = BattleScript_ShakeBallThrow; } } } @@ -9177,7 +9604,7 @@ static void Cmd_givecaughtmon(void) { if (!ShouldShowBoxWasFullMessage()) { - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SENT_SOMEONES_PC; StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_PC_BOX_TO_SEND_MON))); GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_NICKNAME, gStringVar2); } @@ -9186,13 +9613,17 @@ static void Cmd_givecaughtmon(void) StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_PC_BOX_TO_SEND_MON))); // box the mon was sent to GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_NICKNAME, gStringVar2); StringCopy(gStringVar3, GetBoxNamePtr(GetPCBoxToSendMon())); //box the mon was going to be sent to - gBattleCommunication[MULTISTRING_CHOOSER] = 2; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SOMEONES_BOX_FULL; } + + // Change to B_MSG_SENT_BILLS_PC or B_MSG_BILLS_BOX_FULL if (FlagGet(FLAG_SYS_NOT_SOMEONES_PC)) gBattleCommunication[MULTISTRING_CHOOSER]++; } + gBattleResults.caughtMonSpecies = gBattleMons[gBattlerAttacker ^ BIT_SIDE].species; GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_NICKNAME, gBattleResults.caughtMonNick); + gBattlescriptCurrInstr++; } @@ -9219,15 +9650,15 @@ static void Cmd_displaydexinfo(void) switch (gBattleCommunication[0]) { case 0: - BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_WHITE); - ++gBattleCommunication[0]; + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_WHITE); + gBattleCommunication[0]++; break; case 1: if (!gPaletteFade.active) { FreeAllWindowBuffers(); gBattleCommunication[TASK_ID] = DexScreen_RegisterMonToPokedex(species); - ++gBattleCommunication[0]; + gBattleCommunication[0]++; } break; case 2: @@ -9237,14 +9668,14 @@ static void Cmd_displaydexinfo(void) { CpuFill32(0, (void *)VRAM, VRAM_SIZE); SetVBlankCallback(VBlankCB_Battle); - ++gBattleCommunication[0]; + gBattleCommunication[0]++; } break; case 3: InitBattleBgsVideo(); LoadBattleTextboxAndBackground(); - gBattle_BG3_X = 0x100; - ++gBattleCommunication[0]; + gBattle_BG3_X = 256; + gBattleCommunication[0]++; break; case 4: if (!IsDma3ManagerBusyWithBgCopy()) @@ -9258,10 +9689,10 @@ static void Cmd_displaydexinfo(void) 0, 0xFFFF); CpuFill32(0, gPlttBufferFaded, BG_PLTT_SIZE); - BeginNormalPaletteFade(0x1FFFF, 0, 0x10, 0, RGB_BLACK); + BeginNormalPaletteFade(0x1FFFF, 0, 16, 0, RGB_BLACK); ShowBg(0); ShowBg(3); - ++gBattleCommunication[0]; + gBattleCommunication[0]++; } break; case 5: @@ -9276,9 +9707,9 @@ void HandleBattleWindow(u8 xStart, u8 yStart, u8 xEnd, u8 yEnd, u8 flags) s32 destY, destX; u16 var = 0; - for (destY = yStart; destY <= yEnd; ++destY) + for (destY = yStart; destY <= yEnd; destY++) { - for (destX = xStart; destX <= xEnd; ++destX) + for (destX = xStart; destX <= xEnd; destX++) { if (destY == yStart) { @@ -9307,9 +9738,11 @@ void HandleBattleWindow(u8 xStart, u8 yStart, u8 xEnd, u8 yEnd, u8 flags) else var = 0x1026; } + if (flags & WINDOW_CLEAR) var = 0; - if (flags & WINDOW_x80) + + if (flags & WINDOW_BG1) CopyToBgTilemapBufferRect_ChangePalette(1, &var, destX, destY, 1, 1, 0x11); else CopyToBgTilemapBufferRect_ChangePalette(0, &var, destX, destY, 1, 1, 0x11); @@ -9321,7 +9754,6 @@ void HandleBattleWindow(u8 xStart, u8 yStart, u8 xEnd, u8 yEnd, u8 flags) void BattleCreateYesNoCursorAt(void) { u16 src[2]; - src[0] = 1; src[1] = 2; CopyToBgTilemapBufferRect_ChangePalette(0, src, 0x18, 9 + (2 * gBattleCommunication[1]), 1, 2, 0x11); @@ -9331,9 +9763,9 @@ void BattleCreateYesNoCursorAt(void) void BattleDestroyYesNoCursorAt(void) { u16 src[2]; - src[0] = 32; src[1] = 32; + CopyToBgTilemapBufferRect_ChangePalette(0, src, 0x18, 9 + (2 * gBattleCommunication[1]), 1, 2, 0x11); CopyBgTilemapBufferToVram(0); } @@ -9343,9 +9775,9 @@ static void Cmd_trygivecaughtmonnick(void) switch (gBattleCommunication[MULTIUSE_STATE]) { case 0: - HandleBattleWindow(0x17, 8, 0x1D, 0xD, 0); + HandleBattleWindow(23, 8, 29, 13, 0); BattlePutTextOnWindow(gText_BattleYesNoChoice, (B_WIN_YESNO | B_TEXT_FLAG_NONE)); - ++gBattleCommunication[MULTIUSE_STATE]; + gBattleCommunication[MULTIUSE_STATE]++; gBattleCommunication[CURSOR_POSITION] = 0; BattleCreateYesNoCursorAt(); break; @@ -9369,7 +9801,7 @@ static void Cmd_trygivecaughtmonnick(void) PlaySE(SE_SELECT); if (gBattleCommunication[CURSOR_POSITION] == 0) { - ++gBattleCommunication[MULTIUSE_STATE]; + gBattleCommunication[MULTIUSE_STATE]++; BeginFastPaletteFade(3); } else @@ -9388,12 +9820,14 @@ static void Cmd_trygivecaughtmonnick(void) { GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_NICKNAME, gBattleStruct->caughtMonNick); FreeAllWindowBuffers(); + DoNamingScreen(NAMING_SCREEN_CAUGHT_MON, gBattleStruct->caughtMonNick, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_SPECIES), GetMonGender(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]]), GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_PERSONALITY, NULL), BattleMainCB2); - ++gBattleCommunication[MULTIUSE_STATE]; + + gBattleCommunication[MULTIUSE_STATE]++; } break; case 3: diff --git a/src/battle_util.c b/src/battle_util.c index 4efbc7656..383a8fc0e 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -687,7 +687,7 @@ u8 DoBattlerEndTurnEffects(void) { u8 effect = 0; - gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_x20); + gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_SKIP_DMG_TRACK); while (gBattleStruct->turnEffectsBattlerId < gBattlersCount && gBattleStruct->turnEffectsTracker <= ENDTURN_BATTLER_COUNT) { gActiveBattler = gBattlerAttacker = gBattlerByTurnOrder[gBattleStruct->turnEffectsBattlerId]; @@ -1000,13 +1000,13 @@ u8 DoBattlerEndTurnEffects(void) return effect; } } - gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_x20); + gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_SKIP_DMG_TRACK); return 0; } bool8 HandleWishPerishSongOnTurnEnd(void) { - gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_x20); + gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_SKIP_DMG_TRACK); switch (gBattleStruct->wishPerishSongState) { case 0: @@ -1073,7 +1073,7 @@ bool8 HandleWishPerishSongOnTurnEnd(void) } break; } - gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_x20); + gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_SKIP_DMG_TRACK); return FALSE; } @@ -1874,7 +1874,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA } } break; - case ABILITYEFFECT_MOVE_END: // Think contact abilities. + case ABILITYEFFECT_ON_DAMAGE: // Think contact abilities. switch (gLastUsedAbility) { case ABILITY_COLOR_CHANGE: @@ -2234,12 +2234,12 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA case ABILITYEFFECT_FIELD_SPORT: // 14 switch (gLastUsedAbility) { - case 0xFD: + case ABILITYEFFECT_MUD_SPORT: for (i = 0; i < gBattlersCount; ++i) if (gStatuses3[i] & STATUS3_MUDSPORT) effect = i + 1; break; - case 0xFE: + case ABILITYEFFECT_WATER_SPORT: for (i = 0; i < gBattlersCount; ++i) if (gStatuses3[i] & STATUS3_WATERSPORT) effect = i + 1; @@ -2976,7 +2976,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) { gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_FLINCH; BattleScriptPushCursor(); - SetMoveEffect(0, 0); + SetMoveEffect(FALSE, 0); BattleScriptPop(); } break; @@ -3158,7 +3158,7 @@ u8 IsMonDisobedient(void) gCalledMove = gBattleMons[gBattlerAttacker].moves[gCurrMovePos]; gBattlescriptCurrInstr = BattleScript_IgnoresAndUsesRandomMove; gBattlerTarget = GetMoveTarget(gCalledMove, 0); - gHitMarker |= HITMARKER_x200000; + gHitMarker |= HITMARKER_DISOBEDIENT_MOVE; return 2; } } diff --git a/src/berry_crush.c b/src/berry_crush.c index a52b7516c..254bd170f 100644 --- a/src/berry_crush.c +++ b/src/berry_crush.c @@ -1274,7 +1274,7 @@ static u32 Cmd_PrintMessage(struct BerryCrushGame * game, u8 *args) { AddTextPrinterParameterized2(0, 2, sMessages[bMsgId], game->textSpeed, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); } - CopyWindowToVram(0, COPYWIN_BOTH); + CopyWindowToVram(0, COPYWIN_FULL); break; case 1: if (!IsTextPrinterActive(0)) @@ -2223,7 +2223,7 @@ static u32 Cmd_SaveGame(struct BerryCrushGame * game, u8 *args) return 0; DrawDialogueFrame(0, FALSE); AddTextPrinterParameterized2(0, 2, gText_SavingDontTurnOffThePower2, 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); - CopyWindowToVram(0, COPYWIN_BOTH); + CopyWindowToVram(0, COPYWIN_FULL); CreateTask(Task_LinkSave, 0); break; case 3: @@ -2370,7 +2370,7 @@ static u32 Cmd_StopGame(struct BerryCrushGame * game, UNUSED u8 *args) AddTextPrinterParameterized2(0, 2, sMessages[MSG_NO_BERRIES], game->textSpeed, NULL, 2, 1, 3); else AddTextPrinterParameterized2(0, 2, sMessages[MSG_DROPPED], game->textSpeed, NULL, 2, 1, 3); - CopyWindowToVram(0, COPYWIN_BOTH); + CopyWindowToVram(0, COPYWIN_FULL); break; case 1: if (IsTextPrinterActive(0)) @@ -3073,7 +3073,7 @@ static bool32 OpenResultsWindow(struct BerryCrushGame * game, struct BerryCrushG printCrushingResults(game); break; case 5: - CopyWindowToVram(spriteManager->resultsWindowId, COPYWIN_BOTH); + CopyWindowToVram(spriteManager->resultsWindowId, COPYWIN_FULL); spriteManager->resultsState = 0; return TRUE; } @@ -3166,7 +3166,7 @@ static void Task_ShowBerryCrushRankings(u8 taskId) yPos += 14; score = 0; } - CopyWindowToVram(tWindowId, COPYWIN_BOTH); + CopyWindowToVram(tWindowId, COPYWIN_FULL); break; case 2: if (JOY_NEW(A_BUTTON | B_BUTTON)) @@ -3263,7 +3263,7 @@ static void DrawPlayerNameWindows(struct BerryCrushGame * game) game->players[i].name ); } - CopyWindowToVram(game->gfx.nameWindowIds[i], COPYWIN_BOTH); + CopyWindowToVram(game->gfx.nameWindowIds[i], COPYWIN_FULL); } CopyBgTilemapBufferToVram(0); } diff --git a/src/cable_club.c b/src/cable_club.c index ba5ff54a4..da1bfffcb 100644 --- a/src/cable_club.c +++ b/src/cable_club.c @@ -80,13 +80,13 @@ static void PrintNewCountOnLinkPlayerCountDisplayWindow(u16 windowId, s32 num) SetStdWindowBorderStyle(windowId, FALSE); StringExpandPlaceholders(gStringVar4, gUnknown_841DF82); AddTextPrinterParameterized(windowId, 2, gStringVar4, 0, 0, TEXT_SKIP_DRAW, NULL); - CopyWindowToVram(windowId, COPYWIN_BOTH); + CopyWindowToVram(windowId, COPYWIN_FULL); } static void DestroyLinkPlayerCountDisplayWindow(u16 windowId) { ClearStdWindowAndFrame(windowId, FALSE); - CopyWindowToVram(windowId, COPYWIN_BOTH); + CopyWindowToVram(windowId, COPYWIN_FULL); } static void UpdateLinkPlayerCountDisplay(u8 taskId, u8 num) @@ -723,7 +723,7 @@ static void sub_8081624(void) void CB2_ReturnFromCableClubBattle(void) { - gBattleTypeFlags &= (u16)~BATTLE_TYPE_LINK_ESTABLISHED; + gBattleTypeFlags &= (u16)~BATTLE_TYPE_LINK_IN_BATTLE; Overworld_ResetMapMusic(); LoadPlayerParty(); SavePlayerBag(); diff --git a/src/clear_save_data_screen.c b/src/clear_save_data_screen.c index 4b68b49bb..75e671445 100644 --- a/src/clear_save_data_screen.c +++ b/src/clear_save_data_screen.c @@ -139,7 +139,7 @@ static void Task_HandleYesNoMenu(u8 taskId) PlaySE(SE_SELECT); FillWindowPixelBuffer(1, PIXEL_FILL(1)); AddTextPrinterParameterized4(1, 2, 0, 3, 1, 1, sTextColor, 0, gUnknown_841B6B9); - CopyWindowToVram(1, COPYWIN_BOTH); + CopyWindowToVram(1, COPYWIN_FULL); ClearSaveData(); break; case MENU_NOTHING_CHOSEN: diff --git a/src/credits.c b/src/credits.c index ce08606e6..d9dde1c2c 100644 --- a/src/credits.c +++ b/src/credits.c @@ -761,7 +761,7 @@ static void CreateCreditsWindow(void) sCreditsMgr->windowId = AddWindow(&sCreditsWindowTemplate); FillWindowPixelBuffer(sCreditsMgr->windowId, PIXEL_FILL(0)); PutWindowTilemap(sCreditsMgr->windowId); - CopyWindowToVram(sCreditsMgr->windowId, COPYWIN_BOTH); + CopyWindowToVram(sCreditsMgr->windowId, COPYWIN_FULL); sCreditsMgr->windowIsActive = TRUE; } diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index ad7572c72..c6457675d 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -990,7 +990,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_SOLAR_BEAM] = { - .effect = EFFECT_SOLARBEAM, + .effect = EFFECT_SOLAR_BEAM, .power = 120, .type = TYPE_GRASS, .accuracy = 100, diff --git a/src/data/pokemon/tmhm_learnsets.h b/src/data/pokemon/tmhm_learnsets.h index 1e3e347ca..0aa21e85b 100644 --- a/src/data/pokemon/tmhm_learnsets.h +++ b/src/data/pokemon/tmhm_learnsets.h @@ -15,7 +15,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM32_DOUBLE_TEAM) | TMHM(TM36_SLUDGE_BOMB) @@ -35,7 +35,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM32_DOUBLE_TEAM) | TMHM(TM36_SLUDGE_BOMB) @@ -57,7 +57,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM26_EARTHQUAKE) | TMHM(TM27_RETURN) | TMHM(TM32_DOUBLE_TEAM) @@ -239,7 +239,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM19_GIGA_DRAIN) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM29_PSYCHIC) | TMHM(TM30_SHADOW_BALL) @@ -264,7 +264,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM31_BRICK_BREAK) | TMHM(TM32_DOUBLE_TEAM) @@ -758,7 +758,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM18_RAIN_DANCE) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) @@ -794,7 +794,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM18_RAIN_DANCE) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) @@ -867,7 +867,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM18_RAIN_DANCE) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) | TMHM(TM27_RETURN) @@ -901,7 +901,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM18_RAIN_DANCE) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) | TMHM(TM27_RETURN) @@ -974,7 +974,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM32_DOUBLE_TEAM) | TMHM(TM36_SLUDGE_BOMB) @@ -992,7 +992,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM32_DOUBLE_TEAM) | TMHM(TM36_SLUDGE_BOMB) @@ -1011,7 +1011,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM32_DOUBLE_TEAM) | TMHM(TM36_SLUDGE_BOMB) @@ -1029,7 +1029,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM28_DIG) | TMHM(TM32_DOUBLE_TEAM) @@ -1052,7 +1052,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM28_DIG) | TMHM(TM32_DOUBLE_TEAM) @@ -1073,7 +1073,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM29_PSYCHIC) | TMHM(TM32_DOUBLE_TEAM) @@ -1093,7 +1093,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM29_PSYCHIC) | TMHM(TM32_DOUBLE_TEAM) @@ -1607,7 +1607,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM32_DOUBLE_TEAM) | TMHM(TM36_SLUDGE_BOMB) @@ -1626,7 +1626,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM32_DOUBLE_TEAM) | TMHM(TM36_SLUDGE_BOMB) @@ -1646,7 +1646,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM32_DOUBLE_TEAM) | TMHM(TM36_SLUDGE_BOMB) @@ -1778,7 +1778,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM11_SUNNY_DAY) | TMHM(TM17_PROTECT) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM27_RETURN) | TMHM(TM32_DOUBLE_TEAM) @@ -1797,7 +1797,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM15_HYPER_BEAM) | TMHM(TM17_PROTECT) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM27_RETURN) | TMHM(TM32_DOUBLE_TEAM) @@ -2348,7 +2348,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM29_PSYCHIC) | TMHM(TM32_DOUBLE_TEAM) @@ -2372,7 +2372,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM29_PSYCHIC) | TMHM(TM32_DOUBLE_TEAM) @@ -2495,7 +2495,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM18_RAIN_DANCE) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) @@ -2647,7 +2647,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM18_RAIN_DANCE) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) @@ -2680,7 +2680,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM32_DOUBLE_TEAM) | TMHM(TM36_SLUDGE_BOMB) @@ -2706,7 +2706,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM18_RAIN_DANCE) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) @@ -2872,7 +2872,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM18_RAIN_DANCE) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) | TMHM(TM27_RETURN) @@ -3021,7 +3021,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM18_RAIN_DANCE) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) @@ -3198,7 +3198,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM18_RAIN_DANCE) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) @@ -3356,7 +3356,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM18_RAIN_DANCE) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) | TMHM(TM26_EARTHQUAKE) @@ -3560,7 +3560,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM18_RAIN_DANCE) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) @@ -3608,7 +3608,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM19_GIGA_DRAIN) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) @@ -3655,7 +3655,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM19_GIGA_DRAIN) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM27_RETURN) | TMHM(TM32_DOUBLE_TEAM) @@ -3676,7 +3676,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM19_GIGA_DRAIN) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM27_RETURN) | TMHM(TM32_DOUBLE_TEAM) @@ -3700,7 +3700,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM19_GIGA_DRAIN) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM26_EARTHQUAKE) | TMHM(TM27_RETURN) @@ -3874,7 +3874,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM18_RAIN_DANCE) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM24_THUNDERBOLT) | TMHM(TM27_RETURN) @@ -3903,7 +3903,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM18_RAIN_DANCE) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) @@ -3976,7 +3976,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM19_GIGA_DRAIN) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM28_DIG) | TMHM(TM31_BRICK_BREAK) @@ -4000,7 +4000,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM19_GIGA_DRAIN) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM28_DIG) | TMHM(TM31_BRICK_BREAK) @@ -4020,7 +4020,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM28_DIG) | TMHM(TM29_PSYCHIC) @@ -4040,7 +4040,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM28_DIG) | TMHM(TM29_PSYCHIC) @@ -4151,7 +4151,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM18_RAIN_DANCE) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM27_RETURN) | TMHM(TM28_DIG) @@ -4177,7 +4177,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM18_RAIN_DANCE) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM28_DIG) | TMHM(TM29_PSYCHIC) @@ -4202,7 +4202,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM18_RAIN_DANCE) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM29_PSYCHIC) | TMHM(TM30_SHADOW_BALL) @@ -4229,7 +4229,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM18_RAIN_DANCE) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM29_PSYCHIC) | TMHM(TM30_SHADOW_BALL) @@ -4258,7 +4258,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM18_RAIN_DANCE) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM29_PSYCHIC) | TMHM(TM30_SHADOW_BALL) @@ -4284,7 +4284,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM18_RAIN_DANCE) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM29_PSYCHIC) | TMHM(TM30_SHADOW_BALL) @@ -4373,7 +4373,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM19_GIGA_DRAIN) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM32_DOUBLE_TEAM) | TMHM(TM36_SLUDGE_BOMB) @@ -4493,7 +4493,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM32_DOUBLE_TEAM) | TMHM(TM40_AERIAL_ACE) @@ -4510,7 +4510,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM32_DOUBLE_TEAM) | TMHM(TM40_AERIAL_ACE) @@ -4528,7 +4528,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM32_DOUBLE_TEAM) | TMHM(TM40_AERIAL_ACE) @@ -4547,7 +4547,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM18_RAIN_DANCE) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) @@ -4577,7 +4577,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM19_GIGA_DRAIN) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM32_DOUBLE_TEAM) | TMHM(TM36_SLUDGE_BOMB) @@ -4598,7 +4598,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM19_GIGA_DRAIN) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM32_DOUBLE_TEAM) | TMHM(TM36_SLUDGE_BOMB) @@ -4615,7 +4615,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM29_PSYCHIC) | TMHM(TM30_SHADOW_BALL) @@ -4855,7 +4855,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM26_EARTHQUAKE) | TMHM(TM27_RETURN) | TMHM(TM28_DIG) @@ -4877,7 +4877,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM26_EARTHQUAKE) | TMHM(TM27_RETURN) | TMHM(TM28_DIG) @@ -4901,7 +4901,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM18_RAIN_DANCE) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) @@ -4982,7 +4982,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM18_RAIN_DANCE) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) | TMHM(TM26_EARTHQUAKE) @@ -5017,7 +5017,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM18_RAIN_DANCE) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) @@ -5455,7 +5455,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM12_TAUNT) | TMHM(TM17_PROTECT) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM27_RETURN) | TMHM(TM30_SHADOW_BALL) @@ -5481,7 +5481,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM15_HYPER_BEAM) | TMHM(TM17_PROTECT) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM27_RETURN) | TMHM(TM30_SHADOW_BALL) @@ -5568,7 +5568,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM18_RAIN_DANCE) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) @@ -5593,7 +5593,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM18_RAIN_DANCE) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) @@ -5731,7 +5731,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM18_RAIN_DANCE) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) @@ -5766,7 +5766,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM18_RAIN_DANCE) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) @@ -5826,7 +5826,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM18_RAIN_DANCE) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM27_RETURN) | TMHM(TM28_DIG) @@ -6003,7 +6003,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM19_GIGA_DRAIN) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) | TMHM(TM26_EARTHQUAKE) @@ -6039,7 +6039,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM19_GIGA_DRAIN) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM29_PSYCHIC) | TMHM(TM30_SHADOW_BALL) @@ -6114,7 +6114,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM19_GIGA_DRAIN) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM27_RETURN) | TMHM(TM28_DIG) @@ -6140,7 +6140,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM19_GIGA_DRAIN) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM27_RETURN) | TMHM(TM28_DIG) @@ -6169,7 +6169,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM19_GIGA_DRAIN) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM26_EARTHQUAKE) | TMHM(TM27_RETURN) @@ -6450,7 +6450,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM19_GIGA_DRAIN) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM29_PSYCHIC) | TMHM(TM30_SHADOW_BALL) @@ -6473,7 +6473,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM29_PSYCHIC) | TMHM(TM30_SHADOW_BALL) @@ -6499,7 +6499,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM18_RAIN_DANCE) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM32_DOUBLE_TEAM) | TMHM(TM42_FACADE) @@ -6522,7 +6522,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM18_RAIN_DANCE) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM31_BRICK_BREAK) | TMHM(TM32_DOUBLE_TEAM) @@ -6552,7 +6552,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM18_RAIN_DANCE) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM31_BRICK_BREAK) | TMHM(TM32_DOUBLE_TEAM) @@ -6575,7 +6575,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM28_DIG) | TMHM(TM30_SHADOW_BALL) @@ -6595,7 +6595,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM28_DIG) | TMHM(TM30_SHADOW_BALL) @@ -6621,7 +6621,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM28_DIG) | TMHM(TM30_SHADOW_BALL) @@ -6646,7 +6646,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM28_DIG) | TMHM(TM30_SHADOW_BALL) @@ -6666,7 +6666,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM28_DIG) | TMHM(TM30_SHADOW_BALL) @@ -6688,7 +6688,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM28_DIG) | TMHM(TM30_SHADOW_BALL) @@ -6745,7 +6745,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM19_GIGA_DRAIN) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM32_DOUBLE_TEAM) | TMHM(TM36_SLUDGE_BOMB) @@ -6767,7 +6767,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM19_GIGA_DRAIN) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM27_RETURN) | TMHM(TM31_BRICK_BREAK) @@ -6866,7 +6866,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM18_RAIN_DANCE) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM30_SHADOW_BALL) | TMHM(TM32_DOUBLE_TEAM) @@ -6888,7 +6888,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM18_RAIN_DANCE) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM30_SHADOW_BALL) | TMHM(TM32_DOUBLE_TEAM) @@ -6960,7 +6960,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM18_RAIN_DANCE) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) @@ -6987,7 +6987,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM18_RAIN_DANCE) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) @@ -7014,7 +7014,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM18_RAIN_DANCE) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) @@ -7048,7 +7048,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM18_RAIN_DANCE) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM26_EARTHQUAKE) | TMHM(TM27_RETURN) | TMHM(TM28_DIG) @@ -7073,7 +7073,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM18_RAIN_DANCE) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM26_EARTHQUAKE) | TMHM(TM27_RETURN) | TMHM(TM28_DIG) @@ -7383,7 +7383,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM26_EARTHQUAKE) | TMHM(TM27_RETURN) | TMHM(TM28_DIG) @@ -7404,7 +7404,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM26_EARTHQUAKE) | TMHM(TM27_RETURN) | TMHM(TM28_DIG) @@ -7428,7 +7428,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM26_EARTHQUAKE) | TMHM(TM27_RETURN) @@ -7660,7 +7660,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM32_DOUBLE_TEAM) | TMHM(TM37_SANDSTORM) @@ -7680,7 +7680,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM32_DOUBLE_TEAM) | TMHM(TM37_SANDSTORM) @@ -7769,7 +7769,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM26_EARTHQUAKE) | TMHM(TM27_RETURN) | TMHM(TM29_PSYCHIC) @@ -7906,7 +7906,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM18_RAIN_DANCE) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM31_BRICK_BREAK) | TMHM(TM32_DOUBLE_TEAM) @@ -7982,7 +7982,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM18_RAIN_DANCE) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM32_DOUBLE_TEAM) | TMHM(TM40_AERIAL_ACE) @@ -8005,7 +8005,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM18_RAIN_DANCE) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM26_EARTHQUAKE) | TMHM(TM27_RETURN) @@ -8085,7 +8085,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM30_SHADOW_BALL) | TMHM(TM32_DOUBLE_TEAM) @@ -8108,7 +8108,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM18_RAIN_DANCE) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) | TMHM(TM27_RETURN) @@ -8140,7 +8140,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM18_RAIN_DANCE) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) | TMHM(TM26_EARTHQUAKE) @@ -8174,7 +8174,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM18_RAIN_DANCE) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) | TMHM(TM26_EARTHQUAKE) @@ -8204,7 +8204,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM18_RAIN_DANCE) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM30_SHADOW_BALL) | TMHM(TM32_DOUBLE_TEAM) @@ -8229,7 +8229,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM18_RAIN_DANCE) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM30_SHADOW_BALL) | TMHM(TM32_DOUBLE_TEAM) @@ -8253,7 +8253,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM19_GIGA_DRAIN) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM26_EARTHQUAKE) | TMHM(TM27_RETURN) | TMHM(TM32_DOUBLE_TEAM) @@ -8279,7 +8279,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM18_RAIN_DANCE) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM30_SHADOW_BALL) | TMHM(TM32_DOUBLE_TEAM) @@ -8302,7 +8302,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM18_RAIN_DANCE) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM26_EARTHQUAKE) | TMHM(TM27_RETURN) | TMHM(TM30_SHADOW_BALL) @@ -8332,7 +8332,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM18_RAIN_DANCE) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM26_EARTHQUAKE) | TMHM(TM27_RETURN) | TMHM(TM30_SHADOW_BALL) @@ -8538,7 +8538,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM18_RAIN_DANCE) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) @@ -8649,7 +8649,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM18_RAIN_DANCE) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) @@ -8683,7 +8683,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM18_RAIN_DANCE) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) | TMHM(TM27_RETURN) @@ -8710,7 +8710,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM18_RAIN_DANCE) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) | TMHM(TM27_RETURN) @@ -8736,7 +8736,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM18_RAIN_DANCE) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) | TMHM(TM27_RETURN) @@ -8759,7 +8759,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM27_RETURN) | TMHM(TM32_DOUBLE_TEAM) | TMHM(TM36_SLUDGE_BOMB) @@ -8777,7 +8777,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM19_GIGA_DRAIN) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM26_EARTHQUAKE) | TMHM(TM27_RETURN) | TMHM(TM32_DOUBLE_TEAM) @@ -9160,7 +9160,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) @@ -9196,7 +9196,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM17_PROTECT) | TMHM(TM18_RAIN_DANCE) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM23_IRON_TAIL) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) @@ -9234,7 +9234,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM18_RAIN_DANCE) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) | TMHM(TM26_EARTHQUAKE) @@ -9272,7 +9272,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM18_RAIN_DANCE) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) | TMHM(TM26_EARTHQUAKE) @@ -9337,7 +9337,7 @@ static const u32 sTMHMLearnsets[][2] = | TMHM(TM18_RAIN_DANCE) | TMHM(TM20_SAFEGUARD) | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLARBEAM) + | TMHM(TM22_SOLAR_BEAM) | TMHM(TM24_THUNDERBOLT) | TMHM(TM25_THUNDER) | TMHM(TM27_RETURN) diff --git a/src/daycare.c b/src/daycare.c index 141f40db5..5d65d199d 100644 --- a/src/daycare.c +++ b/src/daycare.c @@ -1542,7 +1542,7 @@ void ShowDaycareLevelMenu(void) menuTemplate.windowId = windowId; listMenuTaskId = ListMenuInit(&menuTemplate, 0, 0); - CopyWindowToVram(windowId, COPYWIN_BOTH); + CopyWindowToVram(windowId, COPYWIN_FULL); daycareMenuTaskId = CreateTask(Task_HandleDaycareLevelMenuInput, 3); gTasks[daycareMenuTaskId].tMenuListTaskId = listMenuTaskId; @@ -1937,7 +1937,7 @@ static void CB2_EggHatch_1(void) PlayFanfare(MUS_EVOLVED); sEggHatchData->CB2_state++; PutWindowTilemap(sEggHatchData->windowId); - CopyWindowToVram(sEggHatchData->windowId, COPYWIN_BOTH); + CopyWindowToVram(sEggHatchData->windowId, COPYWIN_FULL); break; case 6: if (IsFanfareTaskInactive()) diff --git a/src/dodrio_berry_picking.c b/src/dodrio_berry_picking.c index 0a8fe41ef..75ea3a52d 100644 --- a/src/dodrio_berry_picking.c +++ b/src/dodrio_berry_picking.c @@ -2341,7 +2341,7 @@ static void Task_ShowDodrioBerryPickingRecords(u8 taskId) case 0: data[1] = AddWindow(&sUnknown_84755E0); sub_81538D0(data[1]); - CopyWindowToVram(data[1], COPYWIN_BOTH); + CopyWindowToVram(data[1], COPYWIN_FULL); data[0]++; break; case 1: diff --git a/src/dodrio_berry_picking_2.c b/src/dodrio_berry_picking_2.c index 4d737dcee..f032945d6 100644 --- a/src/dodrio_berry_picking_2.c +++ b/src/dodrio_berry_picking_2.c @@ -1370,7 +1370,7 @@ static void sub_81556E0(void) AddTextPrinterParameterized(gUnknown_203F440->unk3008[1], 2, gText_Yes, 8, 2, -1, NULL); AddTextPrinterParameterized(gUnknown_203F440->unk3008[1], 2, gText_No, 8, 16, -1, NULL); AddTextPrinterParameterized(gUnknown_203F440->unk3008[1], 2, gText_SelectorArrow2, 0, y == 1 ? 2 : 16, -1, NULL); - CopyWindowToVram(gUnknown_203F440->unk3008[1], COPYWIN_BOTH); + CopyWindowToVram(gUnknown_203F440->unk3008[1], COPYWIN_FULL); // Increment state only if A or B button have been pressed. if (JOY_NEW(A_BUTTON)) { @@ -1425,7 +1425,7 @@ static void sub_8155A78(void) gUnknown_203F440->state++; break; case 1: - CopyWindowToVram(0, COPYWIN_BOTH); + CopyWindowToVram(0, COPYWIN_FULL); gUnknown_203F440->state++; break; case 2: diff --git a/src/easy_chat_3.c b/src/easy_chat_3.c index 2230e8589..e02a93905 100644 --- a/src/easy_chat_3.c +++ b/src/easy_chat_3.c @@ -1323,7 +1323,7 @@ static void PrintTitleText(void) FillWindowPixelBuffer(0, PIXEL_FILL(0)); EC_AddTextPrinterParameterized2(0, 1, titleText, xOffset, 0, TEXT_SKIP_DRAW, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY); PutWindowTilemap(0); - CopyWindowToVram(0, COPYWIN_BOTH); + CopyWindowToVram(0, COPYWIN_FULL); } static void EC_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16)) @@ -1379,7 +1379,7 @@ static void PrintECInterfaceTextById(u8 direction) if (text2) EC_AddTextPrinterParameterized(1, 1, text2, 0, 16, TEXT_SKIP_DRAW, NULL); - CopyWindowToVram(1, COPYWIN_BOTH); + CopyWindowToVram(1, COPYWIN_FULL); } static void EC_CreateYesNoMenuWithInitialCursorPos(u8 initialCursorPos) @@ -1435,7 +1435,7 @@ static void PrintECFields(void) ecWord++; for (k = 0; k < 7; k++) { - *str++ = CHAR_EXTRA_EMOJI; + *str++ = CHAR_EXTRA_SYMBOL; *str++ = 9; } @@ -1454,7 +1454,7 @@ static void PrintECFields(void) EC_AddTextPrinterParameterized(sEasyChatGraphicsResources->windowId, 1, sEasyChatGraphicsResources->ecPrintBuffer, 0, i * 16, TEXT_SKIP_DRAW, NULL); } - CopyWindowToVram(sEasyChatGraphicsResources->windowId, COPYWIN_BOTH); + CopyWindowToVram(sEasyChatGraphicsResources->windowId, COPYWIN_FULL); } static void DrawECFrameInTilemapBuffer(u16 *tilemap) diff --git a/src/evolution_scene.c b/src/evolution_scene.c index 2769b032a..9a02b091f 100644 --- a/src/evolution_scene.c +++ b/src/evolution_scene.c @@ -912,7 +912,7 @@ static void Task_EvolutionScene(u8 taskId) case MVSTATE_PRINT_YES_NO: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { - HandleBattleWindow(0x17, 8, 0x1D, 0xD, 0); + HandleBattleWindow(23, 8, 29, 13, 0); BattlePutTextOnWindow(gText_BattleYesNoChoice, (B_WIN_YESNO | B_TEXT_FLAG_NONE)); gTasks[taskId].tLearnMoveState++; sEvoCursorPos = 0; diff --git a/src/fame_checker.c b/src/fame_checker.c index 4164fdea3..e44ff2371 100644 --- a/src/fame_checker.c +++ b/src/fame_checker.c @@ -994,7 +994,7 @@ static void Setup_DrawMsgAndListBoxes(void) static void FC_PutWindowTilemapAndCopyWindowToVramMode3(u8 windowId) { PutWindowTilemap(windowId); - CopyWindowToVram(windowId, COPYWIN_BOTH); + CopyWindowToVram(windowId, COPYWIN_FULL); } static bool8 SetMessageSelectorIconObjMode(u8 spriteId, u8 objMode) @@ -1578,7 +1578,7 @@ static u8 FC_PopulateListMenu(void) static void FC_PutWindowTilemapAndCopyWindowToVramMode3_2(u8 windowId) { PutWindowTilemap(windowId); - CopyWindowToVram(windowId, COPYWIN_BOTH); + CopyWindowToVram(windowId, COPYWIN_FULL); } static void FC_CreateScrollIndicatorArrowPair(void) diff --git a/src/field_screen_effect.c b/src/field_screen_effect.c index 8e0e76488..4519bb27e 100644 --- a/src/field_screen_effect.c +++ b/src/field_screen_effect.c @@ -396,7 +396,7 @@ static void Task_RushInjuredPokemonToCenter(u8 taskId) Menu_LoadStdPalAt(0xF0); FillWindowPixelBuffer(windowId, PIXEL_FILL(0)); PutWindowTilemap(windowId); - CopyWindowToVram(windowId, COPYWIN_BOTH); + CopyWindowToVram(windowId, COPYWIN_FULL); loc = GetHealLocation(1); if (gSaveBlock1Ptr->lastHealLocation.mapGroup == loc->group && gSaveBlock1Ptr->lastHealLocation.mapNum == loc->map diff --git a/src/field_specials.c b/src/field_specials.c index fdb26e9e7..c8107febf 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -1103,7 +1103,7 @@ void DrawElevatorCurrentFloorWindow(void) strwidth = GetStringWidth(2, floorname, 0); AddTextPrinterParameterized(sElevatorCurrentFloorWindowId, 2, floorname, 56 - strwidth, 16, 0xFF, NULL); PutWindowTilemap(sElevatorCurrentFloorWindowId); - CopyWindowToVram(sElevatorCurrentFloorWindowId, COPYWIN_BOTH); + CopyWindowToVram(sElevatorCurrentFloorWindowId, COPYWIN_FULL); } } @@ -1364,7 +1364,7 @@ static void Task_CreateScriptListMenu(u8 taskId) Task_CreateMenuRemoveScrollIndicatorArrowPair(taskId); task->data[14] = ListMenuInit(&sFieldSpecialsListMenuTemplate, task->data[7], task->data[8]); PutWindowTilemap(task->data[13]); - CopyWindowToVram(task->data[13], COPYWIN_BOTH); + CopyWindowToVram(task->data[13], COPYWIN_FULL); gTasks[taskId].func = Task_ListMenuHandleInput; } diff --git a/src/fldeff_flash.c b/src/fldeff_flash.c index f001bf241..8129a1a54 100644 --- a/src/fldeff_flash.c +++ b/src/fldeff_flash.c @@ -436,7 +436,7 @@ static void Task_MapPreviewScreen_0(u8 taskId) if (!MapPreview_IsGfxLoadFinished()) { data[4] = MapPreview_CreateMapNameWindow(data[3]); - CopyWindowToVram(data[4], COPYWIN_BOTH); + CopyWindowToVram(data[4], COPYWIN_FULL); data[0]++; } break; diff --git a/src/graphics.c b/src/graphics.c index 03986a03f..b1266dc90 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1033,7 +1033,7 @@ const u32 gBattleAnimBgTilemap_Ghost[] = INCBIN_U32("graphics/battle_anims/backg const u32 gBattleAnimSpritePal_WhipHit[] = INCBIN_U32("graphics/battle_anims/sprites/whip_hit.gbapal.lz"); -const u32 gBattleAnimBgPalette_Solarbeam[] = INCBIN_U32("graphics/battle_anims/backgrounds/solarbeam.gbapal.lz"); +const u32 gBattleAnimBgPalette_SolarBeam[] = INCBIN_U32("graphics/battle_anims/backgrounds/solarbeam.gbapal.lz"); const u32 gFile_graphics_unknown_unknown_E7CFB0_tilemap[] = INCBIN_U32("graphics/unknown/unknown_E7CFB0.bin.lz"); diff --git a/src/hall_of_fame.c b/src/hall_of_fame.c index 97eb6f5c8..3b7f6708c 100644 --- a/src/hall_of_fame.c +++ b/src/hall_of_fame.c @@ -453,7 +453,7 @@ static void Task_Hof_InitTeamSaveData(u8 taskId) DrawDialogueFrame(0, 0); AddTextPrinterParameterized2(0, 2, gText_SavingDontTurnOffThePower2, 0, NULL, 2, 1, 3); - CopyWindowToVram(0, COPYWIN_BOTH); + CopyWindowToVram(0, COPYWIN_FULL); gTasks[taskId].func = Task_Hof_TrySaveData; } @@ -591,7 +591,7 @@ static void Task_Hof_ApplauseAndConfetti(u8 taskId) } BeginNormalPaletteFade(sSelectedPaletteIndices, 0, 12, 12, HALL_OF_FAME_BG_PAL); FillWindowPixelBuffer(0, PIXEL_FILL(0)); - CopyWindowToVram(0, COPYWIN_BOTH); + CopyWindowToVram(0, COPYWIN_FULL); gTasks[taskId].data[3] = 7; gTasks[taskId].func = Task_Hof_WaitBorderFadeAway; } @@ -639,7 +639,7 @@ static void Task_Hof_WaitAndPrintPlayerInfo(u8 taskId) HallOfFame_PrintPlayerInfo(1, 2); DrawDialogueFrame(0, 0); AddTextPrinterParameterized2(0, 2, gText_LeagueChamp, 0, NULL, 2, 1, 3); - CopyWindowToVram(0, COPYWIN_BOTH); + CopyWindowToVram(0, COPYWIN_FULL); gTasks[taskId].func = Task_Hof_ExitOnKeyPressed; } } @@ -969,7 +969,7 @@ static void Task_HofPC_PrintDataIsCorrupted(u8 taskId) TopBarWindowPrintString(gText_ABUTTONExit, 8, TRUE); DrawDialogueFrame(0, 0); AddTextPrinterParameterized2(0, 2, gText_HOFCorrupted, 0, NULL, 2, 1, 3); - CopyWindowToVram(0, COPYWIN_BOTH); + CopyWindowToVram(0, COPYWIN_FULL); gTasks[taskId].func = Task_HofPC_ExitOnButtonPress; } @@ -985,7 +985,7 @@ static void HallOfFame_PrintWelcomeText(u8 not, u8 used) FillWindowPixelBuffer(0, PIXEL_FILL(0)); PutWindowTilemap(0); AddTextPrinterParameterized3(0, 2, x, 1, sTextColors[0], 0, gText_WelcomeToHOF); - CopyWindowToVram(0, COPYWIN_BOTH); + CopyWindowToVram(0, COPYWIN_FULL); } static void HallOfFame_PrintMonInfo(struct HallofFameMon* currMon, u8 unused1, u8 unused2) @@ -1072,7 +1072,7 @@ static void HallOfFame_PrintMonInfo(struct HallofFameMon* currMon, u8 unused1, u AddTextPrinterParameterized3(0, 2, 0x60, 0x11, sTextColors[0], 0, text); } - CopyWindowToVram(0, COPYWIN_BOTH); + CopyWindowToVram(0, COPYWIN_FULL); } static void HallOfFame_PrintPlayerInfo(u8 unused1, u8 unused2) @@ -1115,7 +1115,7 @@ static void HallOfFame_PrintPlayerInfo(u8 unused1, u8 unused2) AddTextPrinterParameterized3(1, 2, textWidth - 36, 32, sTextColors[1], 0, text); - CopyWindowToVram(1, COPYWIN_BOTH); + CopyWindowToVram(1, COPYWIN_FULL); } static void ClearVramOamPltt_LoadHofPal(void) diff --git a/src/help_system_util.c b/src/help_system_util.c index f23bbbcff..fc74662f7 100644 --- a/src/help_system_util.c +++ b/src/help_system_util.c @@ -522,7 +522,7 @@ void HelpSystemRenderText(u8 font, u8 * dest, const u8 * src, u8 x, u8 y, u8 wid BlitBitmapRect4Bit(&srcBlit, &destBlit, 0, 0, x, y, GetKeypadIconWidth(curChar), GetKeypadIconHeight(curChar), 0); x += GetKeypadIconWidth(curChar); break; - case CHAR_EXTRA_EMOJI: + case CHAR_EXTRA_SYMBOL: curChar = *src + 0x100; src++; //fallthrough diff --git a/src/intro.c b/src/intro.c index 9ca210887..bee854379 100644 --- a/src/intro.c +++ b/src/intro.c @@ -991,7 +991,7 @@ static void IntroCB_Init(struct IntroSequenceData * this) FillWindowPixelBuffer(0, PIXEL_FILL(0)); BlitBitmapToWindow(0, this->gamefreakTextBitmap, 0, 40, 144, 16); PutWindowTilemap(0); - CopyWindowToVram(0, COPYWIN_BOTH); + CopyWindowToVram(0, COPYWIN_FULL); this->state++; break; case 1: diff --git a/src/learn_move.c b/src/learn_move.c index 3fcaca5d3..9c00245fc 100644 --- a/src/learn_move.c +++ b/src/learn_move.c @@ -690,7 +690,7 @@ static void PrintTeachWhichMoveToStrVar1(bool8 onInit) StringExpandPlaceholders(gStringVar4, gText_TeachWhichMoveToMon); PrintTextOnWindow(7, gStringVar4, 0, 2, 0, 2); PutWindowTilemap(7); - CopyWindowToVram(7, COPYWIN_BOTH); + CopyWindowToVram(7, COPYWIN_FULL); } } @@ -880,7 +880,7 @@ static void PrintMoveInfoHandleCancel_CopyToVram(void) CopyWindowToVram(2, COPYWIN_GFX); CopyWindowToVram(2, COPYWIN_GFX); CopyWindowToVram(5, COPYWIN_GFX); - CopyWindowToVram(7, COPYWIN_BOTH); + CopyWindowToVram(7, COPYWIN_FULL); } static void MoveRelearnerMenu_MoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list) diff --git a/src/link.c b/src/link.c index 55409c35b..0b85e2f35 100644 --- a/src/link.c +++ b/src/link.c @@ -1369,7 +1369,7 @@ static void LinkCB_WaitAckCommand5FFF(void) } if (count == linkPlayerCount) { - gBattleTypeFlags &= ~(BATTLE_TYPE_LINK_ESTABLISHED | 0xFFFF0000); + gBattleTypeFlags &= ~(BATTLE_TYPE_LINK_IN_BATTLE | 0xFFFF0000); gLinkVSyncDisabled = TRUE; CloseLink(); gLinkCallback = NULL; @@ -1513,7 +1513,7 @@ void sub_800AE1C(void) PutWindowTilemap(0); PutWindowTilemap(2); CopyWindowToVram(0, 0); - CopyWindowToVram(2, COPYWIN_BOTH); + CopyWindowToVram(2, COPYWIN_FULL); ShowBg(0); ShowBg(1); } @@ -1526,7 +1526,7 @@ void sub_800AED0(void) PutWindowTilemap(1); PutWindowTilemap(2); CopyWindowToVram(1, 0); - CopyWindowToVram(2, COPYWIN_BOTH); + CopyWindowToVram(2, COPYWIN_FULL); ShowBg(0); } diff --git a/src/link_rfu_2.c b/src/link_rfu_2.c index d2c605d7b..b8e79fc7b 100644 --- a/src/link_rfu_2.c +++ b/src/link_rfu_2.c @@ -1373,7 +1373,7 @@ static void WaitAllReadyToCloseLink(void) } if (count == playerCount) { - gBattleTypeFlags &= ~(BATTLE_TYPE_LINK_ESTABLISHED | 0xFFFF0000); + gBattleTypeFlags &= ~(BATTLE_TYPE_LINK_IN_BATTLE | 0xFFFF0000); if (Rfu.parent_child == MODE_CHILD) { Rfu.errorState = 3; diff --git a/src/link_rfu_3.c b/src/link_rfu_3.c index 1eadc35f4..de0a63490 100644 --- a/src/link_rfu_3.c +++ b/src/link_rfu_3.c @@ -199,7 +199,7 @@ static const u8 sWireless_RSEtoASCIITable[] = { 0x20, 0x20, 0x2b, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, [CHAR_DYNAMIC_PLACEHOLDER] = ' ', [CHAR_KEYPAD_ICON] = ' ', - [CHAR_EXTRA_EMOJI] = ' ', + [CHAR_EXTRA_SYMBOL] = ' ', [CHAR_PROMPT_SCROLL] = ' ', [CHAR_PROMPT_CLEAR] = ' ', [EXT_CTRL_CODE_BEGIN] = ' ', diff --git a/src/mail.c b/src/mail.c index 114a006e8..0b77b5a2f 100644 --- a/src/mail.c +++ b/src/mail.c @@ -676,8 +676,8 @@ static void AddMailMessagePrinters(void) width = GetStringWidth(1, gText_From, 0); AddTextPrinterParameterized3(1, 1, sMailViewResources->nameX, sMailViewResources->messageLayout->nameY, sTextColor, 0, gText_From); AddTextPrinterParameterized3(1, 1, sMailViewResources->nameX + width, sMailViewResources->messageLayout->nameY, sTextColor, 0, sMailViewResources->authorNameBuffer); - CopyWindowToVram(0, COPYWIN_BOTH); - CopyWindowToVram(1, COPYWIN_BOTH); + CopyWindowToVram(0, COPYWIN_FULL); + CopyWindowToVram(1, COPYWIN_FULL); } static void VBlankCB_ShowMail(void) diff --git a/src/main_menu.c b/src/main_menu.c index e02f557e1..2959966a9 100644 --- a/src/main_menu.c +++ b/src/main_menu.c @@ -352,7 +352,7 @@ static void Task_PrintMainMenuText(u8 taskId) AddTextPrinterParameterized3(MAIN_MENU_WINDOW_NEWGAME_ONLY, 2, 2, 2, sTextColor1, -1, gText_NewGame); MainMenu_DrawWindow(&sWindowTemplate[MAIN_MENU_WINDOW_NEWGAME_ONLY]); PutWindowTilemap(MAIN_MENU_WINDOW_NEWGAME_ONLY); - CopyWindowToVram(MAIN_MENU_WINDOW_NEWGAME_ONLY, COPYWIN_BOTH); + CopyWindowToVram(MAIN_MENU_WINDOW_NEWGAME_ONLY, COPYWIN_FULL); break; case MAIN_MENU_CONTINUE: FillWindowPixelBuffer(MAIN_MENU_WINDOW_CONTINUE, PIXEL_FILL(10)); @@ -365,7 +365,7 @@ static void Task_PrintMainMenuText(u8 taskId) PutWindowTilemap(MAIN_MENU_WINDOW_CONTINUE); PutWindowTilemap(MAIN_MENU_WINDOW_NEWGAME); CopyWindowToVram(MAIN_MENU_WINDOW_CONTINUE, COPYWIN_GFX); - CopyWindowToVram(MAIN_MENU_WINDOW_NEWGAME, COPYWIN_BOTH); + CopyWindowToVram(MAIN_MENU_WINDOW_NEWGAME, COPYWIN_FULL); break; case MAIN_MENU_MYSTERYGIFT: FillWindowPixelBuffer(MAIN_MENU_WINDOW_CONTINUE, PIXEL_FILL(10)); @@ -384,7 +384,7 @@ static void Task_PrintMainMenuText(u8 taskId) PutWindowTilemap(MAIN_MENU_WINDOW_MYSTERYGIFT); CopyWindowToVram(MAIN_MENU_WINDOW_CONTINUE, COPYWIN_GFX); CopyWindowToVram(MAIN_MENU_WINDOW_NEWGAME, COPYWIN_GFX); - CopyWindowToVram(MAIN_MENU_WINDOW_MYSTERYGIFT, COPYWIN_BOTH); + CopyWindowToVram(MAIN_MENU_WINDOW_MYSTERYGIFT, COPYWIN_FULL); break; } gTasks[taskId].func = Task_WaitDma3AndFadeIn; diff --git a/src/map_name_popup.c b/src/map_name_popup.c index 6367757d3..6a2918030 100644 --- a/src/map_name_popup.c +++ b/src/map_name_popup.c @@ -182,7 +182,7 @@ static u16 MapNamePopupCreateWindow(bool32 palintoFadedBuffer) DrawTextBorderOuter(windowId, r6, 0xD); PutWindowTilemap(windowId); MapNamePopupPrintMapNameOnWindow(windowId); - CopyWindowToVram(windowId, COPYWIN_BOTH); + CopyWindowToVram(windowId, COPYWIN_FULL); return windowId; } diff --git a/src/map_preview_screen.c b/src/map_preview_screen.c index 0490f23e0..100db712a 100644 --- a/src/map_preview_screen.c +++ b/src/map_preview_screen.c @@ -484,7 +484,7 @@ static void Task_RunMapPreviewScreenForest(u8 taskId) case 0: if (!MapPreview_IsGfxLoadFinished() && !IsDma3ManagerBusyWithBgCopy()) { - CopyWindowToVram(data[11], COPYWIN_BOTH); + CopyWindowToVram(data[11], COPYWIN_FULL); data[0]++; } break; diff --git a/src/menu.c b/src/menu.c index a245f0743..328497259 100644 --- a/src/menu.c +++ b/src/menu.c @@ -44,7 +44,7 @@ void DrawDialogFrameWithCustomTileAndPalette(u8 windowId, bool8 copyToVram, u16 FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); PutWindowTilemap(windowId); if (copyToVram == TRUE) - CopyWindowToVram(windowId, COPYWIN_BOTH); + CopyWindowToVram(windowId, COPYWIN_FULL); } // not used @@ -56,7 +56,7 @@ static void DrawDialogFrameWithCustomTile(u8 windowId, bool8 copyToVram, u16 til FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); PutWindowTilemap(windowId); if (copyToVram == TRUE) - CopyWindowToVram(windowId, COPYWIN_BOTH); + CopyWindowToVram(windowId, COPYWIN_FULL); } static void WindowFunc_DrawDialogFrameWithCustomTileAndPalette(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum) @@ -96,7 +96,7 @@ void ClearDialogWindowAndFrameToTransparent(u8 windowId, bool8 copyToVram) FillWindowPixelBuffer(windowId, PIXEL_FILL(0)); ClearWindowTilemap(windowId); if (copyToVram == TRUE) - CopyWindowToVram(windowId, COPYWIN_BOTH); + CopyWindowToVram(windowId, COPYWIN_FULL); } static void WindowFunc_ClearDialogWindowAndFrameNullPalette(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum) @@ -112,7 +112,7 @@ void DrawStdFrameWithCustomTileAndPalette(u8 windowId, bool8 copyToVram, u16 bas FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); PutWindowTilemap(windowId); if (copyToVram == TRUE) - CopyWindowToVram(windowId, COPYWIN_BOTH); + CopyWindowToVram(windowId, COPYWIN_FULL); } // not used @@ -124,7 +124,7 @@ static void DrawStdFrameWithCustomTile(u8 windowId, bool8 copyToVram, u16 baseTi FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); PutWindowTilemap(windowId); if (copyToVram == TRUE) - CopyWindowToVram(windowId, COPYWIN_BOTH); + CopyWindowToVram(windowId, COPYWIN_FULL); } static void WindowFunc_DrawStdFrameWithCustomTileAndPalette(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum) @@ -145,7 +145,7 @@ void ClearStdWindowAndFrameToTransparent(u8 windowId, bool8 copyToVram) FillWindowPixelBuffer(windowId, PIXEL_FILL(0)); ClearWindowTilemap(windowId); if (copyToVram == TRUE) - CopyWindowToVram(windowId, COPYWIN_BOTH); + CopyWindowToVram(windowId, COPYWIN_FULL); } static void WindowFunc_ClearStdWindowAndFrameToTransparent(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum) @@ -195,7 +195,7 @@ void TopBarWindowPrintString(const u8 *string, u8 unused, bool8 copyToVram) width = GetStringWidth(0, string, 0); AddTextPrinterParameterized3(sTopBarWindowId, 0, -20 - width, 1, gUnknown_8456618, 0, string); if (copyToVram) - CopyWindowToVram(sTopBarWindowId, COPYWIN_BOTH); + CopyWindowToVram(sTopBarWindowId, COPYWIN_FULL); } } @@ -228,7 +228,7 @@ void TopBarWindowPrintTwoStrings(const u8 *string, const u8 *string2, bool8 fgCo } AddTextPrinterParameterized4(sTopBarWindowId, 1, 4, 1, 0, 0, color, 0, string); if (copyToVram) - CopyWindowToVram(sTopBarWindowId, COPYWIN_BOTH); + CopyWindowToVram(sTopBarWindowId, COPYWIN_FULL); } } @@ -236,7 +236,7 @@ void TopBarWindowPrintTwoStrings(const u8 *string, const u8 *string2, bool8 fgCo static void CopyTopBarWindowToVram(void) { if (sTopBarWindowId != 0xFF) - CopyWindowToVram(sTopBarWindowId, COPYWIN_BOTH); + CopyWindowToVram(sTopBarWindowId, COPYWIN_FULL); } void ClearTopBarWindow(void) @@ -244,7 +244,7 @@ void ClearTopBarWindow(void) if (sTopBarWindowId != 0xFF) { FillWindowPixelBuffer(sTopBarWindowId, PIXEL_FILL(15)); - CopyWindowToVram(sTopBarWindowId, COPYWIN_BOTH); + CopyWindowToVram(sTopBarWindowId, COPYWIN_FULL); } } @@ -254,7 +254,7 @@ void DestroyTopBarWindow(void) { FillWindowPixelBuffer(sTopBarWindowId, PIXEL_FILL(0)); ClearWindowTilemap(sTopBarWindowId); - CopyWindowToVram(sTopBarWindowId, COPYWIN_BOTH); + CopyWindowToVram(sTopBarWindowId, COPYWIN_FULL); RemoveWindow(sTopBarWindowId); sTopBarWindowId = 0xFF; } diff --git a/src/mevent_show_card.c b/src/mevent_show_card.c index 3270052f7..bf2fe23b5 100644 --- a/src/mevent_show_card.c +++ b/src/mevent_show_card.c @@ -396,7 +396,7 @@ static void sub_8145D18(u8 whichWindow) } break; } - CopyWindowToVram(windowId, COPYWIN_BOTH); + CopyWindowToVram(windowId, COPYWIN_FULL); } static void sub_8146060(void) diff --git a/src/mevent_show_news.c b/src/mevent_show_news.c index 91a80739c..e874a93c2 100644 --- a/src/mevent_show_news.c +++ b/src/mevent_show_news.c @@ -326,8 +326,8 @@ static void sub_8146A30(void) { AddTextPrinterParameterized3(sWork->windowIds[1], 3, 0, 16 * i + 2, sTextPals[sWork->bgSpec->textPal2], 0, sWork->messages[i]); } - CopyWindowToVram(sWork->windowIds[0], COPYWIN_BOTH); - CopyWindowToVram(sWork->windowIds[1], COPYWIN_BOTH); + CopyWindowToVram(sWork->windowIds[0], COPYWIN_FULL); + CopyWindowToVram(sWork->windowIds[1], COPYWIN_FULL); } static void sub_8146B58(void) diff --git a/src/mystery_gift_menu.c b/src/mystery_gift_menu.c index 8290930d7..4db94d60a 100644 --- a/src/mystery_gift_menu.c +++ b/src/mystery_gift_menu.c @@ -530,7 +530,7 @@ void AddTextPrinterToWindow1(const u8 *str) AddTextPrinterParameterized4(1, 2, 0, 2, 0, 2, sMG_Ereader_TextColor_2, 0, gStringVar4); DrawTextBorderOuter(1, 0x001, 0xF); PutWindowTilemap(1); - CopyWindowToVram(1, COPYWIN_BOTH); + CopyWindowToVram(1, COPYWIN_FULL); } void ClearTextWindow(void) diff --git a/src/naming_screen.c b/src/naming_screen.c index 888225235..a3d15126f 100644 --- a/src/naming_screen.c +++ b/src/naming_screen.c @@ -707,7 +707,7 @@ static void pokemon_transfer_to_pc_with_message(void) DrawDialogueFrame(0, FALSE); gTextFlags.canABSpeedUpPrint = TRUE; AddTextPrinterParameterized2(0, 2, gStringVar4, GetTextSpeedSetting(), NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); - CopyWindowToVram(0, COPYWIN_BOTH); + CopyWindowToVram(0, COPYWIN_FULL); } static bool8 sub_809E1D4(void) @@ -1886,7 +1886,7 @@ static void sub_809FAE4(void) FillWindowPixelBuffer(sNamingScreenData->windows[4], PIXEL_FILL(15)); AddTextPrinterParameterized3(sNamingScreenData->windows[4], 0, 236 - strwidth, 0, color, 0, gText_MoveOkBack); PutWindowTilemap(sNamingScreenData->windows[4]); - CopyWindowToVram(sNamingScreenData->windows[4], COPYWIN_BOTH); + CopyWindowToVram(sNamingScreenData->windows[4], COPYWIN_FULL); } static void sub_809FB70(void) diff --git a/src/new_menu_helpers.c b/src/new_menu_helpers.c index 2d7e8c4b4..22f559f8a 100644 --- a/src/new_menu_helpers.c +++ b/src/new_menu_helpers.c @@ -471,7 +471,7 @@ void DrawDialogueFrame(u8 windowId, bool8 copyToVram) FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); PutWindowTilemap(windowId); if (copyToVram == TRUE) - CopyWindowToVram(windowId, COPYWIN_BOTH); + CopyWindowToVram(windowId, COPYWIN_FULL); } void DrawStdWindowFrame(u8 windowId, bool8 copyToVram) @@ -480,7 +480,7 @@ void DrawStdWindowFrame(u8 windowId, bool8 copyToVram) FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); PutWindowTilemap(windowId); if (copyToVram == TRUE) - CopyWindowToVram(windowId, COPYWIN_BOTH); + CopyWindowToVram(windowId, COPYWIN_FULL); } void ClearDialogWindowAndFrame(u8 windowId, bool8 copyToVram) @@ -489,7 +489,7 @@ void ClearDialogWindowAndFrame(u8 windowId, bool8 copyToVram) FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); ClearWindowTilemap(windowId); if (copyToVram == TRUE) - CopyWindowToVram(windowId, COPYWIN_BOTH); + CopyWindowToVram(windowId, COPYWIN_FULL); if (gQuestLogState == QL_STATE_PLAYBACK) CommitQuestLogWindow1(); } @@ -500,7 +500,7 @@ void ClearStdWindowAndFrame(u8 windowId, bool8 copyToVram) FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); ClearWindowTilemap(windowId); if (copyToVram == TRUE) - CopyWindowToVram(windowId, COPYWIN_BOTH); + CopyWindowToVram(windowId, COPYWIN_FULL); } static void WindowFunc_DrawStandardFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum) @@ -644,7 +644,7 @@ void DisplayItemMessageOnField(u8 taskId, u8 textSpeed, const u8 *string, TaskFu { LoadStdWindowFrameGfx(); DisplayMessageAndContinueTask(taskId, 0, DLG_WINDOW_BASE_TILE_NUM, DLG_WINDOW_PALETTE_NUM, textSpeed, GetTextSpeedSetting(), string, callback); - CopyWindowToVram(0, COPYWIN_BOTH); + CopyWindowToVram(0, COPYWIN_FULL); } void DisplayYesNoMenuDefaultYes(void) diff --git a/src/oak_speech.c b/src/oak_speech.c index ef38732ff..f23905fd7 100644 --- a/src/oak_speech.c +++ b/src/oak_speech.c @@ -594,7 +594,7 @@ static void CreateHelpDocsPage1(void) PutWindowTilemap(sOakSpeechResources->unk_0014[0]); FillWindowPixelBuffer(sOakSpeechResources->unk_0014[0], 0x00); AddTextPrinterParameterized4(sOakSpeechResources->unk_0014[0], 2, 2, 0, 1, 1, sTextColor_HelpSystem, 0, gNewGame_HelpDocs1); - CopyWindowToVram(sOakSpeechResources->unk_0014[0], COPYWIN_BOTH); + CopyWindowToVram(sOakSpeechResources->unk_0014[0], COPYWIN_FULL); FillBgTilemapBufferRect_Palette0(1, 0x3000, 1, 3, 5, 16); CopyBgTilemapBufferToVram(1); } @@ -616,7 +616,7 @@ static void Task_OakSpeech4(u8 taskId) PutWindowTilemap(sOakSpeechResources->unk_0014[i]); FillWindowPixelBuffer(sOakSpeechResources->unk_0014[i], 0x00); AddTextPrinterParameterized4(sOakSpeechResources->unk_0014[i], 2, 6, 0, 1, 1, sTextColor_HelpSystem, 0, sHelpDocsPtrs[i + r7 * 3]); - CopyWindowToVram(sOakSpeechResources->unk_0014[i], COPYWIN_BOTH); + CopyWindowToVram(sOakSpeechResources->unk_0014[i], COPYWIN_FULL); } if (sOakSpeechResources->unk_0012 == 1) @@ -685,7 +685,7 @@ static void Task_OakSpeech3(u8 taskId) { FillWindowPixelBuffer(sOakSpeechResources->unk_0014[i], 0x00); ClearWindowTilemap(sOakSpeechResources->unk_0014[i]); - CopyWindowToVram(sOakSpeechResources->unk_0014[i], COPYWIN_BOTH); + CopyWindowToVram(sOakSpeechResources->unk_0014[i], COPYWIN_FULL); RemoveWindow(sOakSpeechResources->unk_0014[i]); sOakSpeechResources->unk_0014[i] = 0; } @@ -709,7 +709,7 @@ static void Task_OakSpeech5(u8 taskId) { FillWindowPixelBuffer(sOakSpeechResources->unk_0014[i], 0x00); ClearWindowTilemap(sOakSpeechResources->unk_0014[i]); - CopyWindowToVram(sOakSpeechResources->unk_0014[i], COPYWIN_BOTH); + CopyWindowToVram(sOakSpeechResources->unk_0014[i], COPYWIN_FULL); RemoveWindow(sOakSpeechResources->unk_0014[i]); sOakSpeechResources->unk_0014[i] = 0; } @@ -743,7 +743,7 @@ static void Task_OakSpeech6(u8 taskId) data[14] = AddWindow(&sNewGameAdventureIntroWindowTemplates[0]); PutWindowTilemap(data[14]); FillWindowPixelBuffer(data[14], 0x00); - CopyWindowToVram(data[14], COPYWIN_BOTH); + CopyWindowToVram(data[14], COPYWIN_FULL); sOakSpeechResources->unk_0012 = 0; gMain.state = 0; data[15] = 16; @@ -866,7 +866,7 @@ static void Task_OakSpeech8(u8 taskId) DestroyTopBarWindow(); FillWindowPixelBuffer(data[14], 0x00); ClearWindowTilemap(data[14]); - CopyWindowToVram(data[14], COPYWIN_BOTH); + CopyWindowToVram(data[14], COPYWIN_FULL); RemoveWindow(data[14]); data[14] = 0; FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20); @@ -912,7 +912,7 @@ static void Task_OakSpeech9(u8 taskId) { \ AddTextPrinterParameterized2(0, 4, str, speed, NULL, 2, 1, 3); \ } \ - CopyWindowToVram(0, COPYWIN_BOTH); \ + CopyWindowToVram(0, COPYWIN_FULL); \ }) static void Task_OakSpeech10(u8 taskId) @@ -1082,7 +1082,7 @@ static void Task_OakSpeech19(u8 taskId) sOakSpeechResources->textColor[2] = 3; AddTextPrinterParameterized3(gTasks[taskId].data[13], 2, 8, 17, sOakSpeechResources->textColor, 0, gText_Girl); Menu_InitCursor(gTasks[taskId].data[13], 2, 0, 1, GetFontAttribute(2, 1) + 2, 2, 0); - CopyWindowToVram(gTasks[taskId].data[13], COPYWIN_BOTH); + CopyWindowToVram(gTasks[taskId].data[13], COPYWIN_FULL); gTasks[taskId].func = Task_OakSpeech20; } } @@ -1881,7 +1881,7 @@ static void PrintNameChoiceOptions(u8 taskId, u8 hasPlayerBeenNamed) AddTextPrinterParameterized(data[13], 2, textPtrs[i], 8, 16 * (i + 1) + 1, 0, NULL); } Menu_InitCursor(data[13], 2, 0, 1, 16, 5, 0); - CopyWindowToVram(data[13], COPYWIN_BOTH); + CopyWindowToVram(data[13], COPYWIN_FULL); } static void GetDefaultName(u8 hasPlayerBeenNamed, u8 rivalNameChoice) diff --git a/src/option_menu.c b/src/option_menu.c index 8994caa13..53b0da882 100644 --- a/src/option_menu.c +++ b/src/option_menu.c @@ -320,7 +320,7 @@ static void OptionMenu_PickSwitchCancel(void) FillWindowPixelBuffer(2, PIXEL_FILL(15)); AddTextPrinterParameterized3(2, 0, x, 0, sOptionMenuPickSwitchCancelTextColor, 0, gText_PickSwitchCancel); PutWindowTilemap(2); - CopyWindowToVram(2, COPYWIN_BOTH); + CopyWindowToVram(2, COPYWIN_FULL); } static void OptionMenu_ResetSpriteData(void) @@ -502,7 +502,7 @@ static void BufferOptionMenuString(u8 selection) break; } PutWindowTilemap(1); - CopyWindowToVram(1, COPYWIN_BOTH); + CopyWindowToVram(1, COPYWIN_FULL); } static void CloseAndSaveOptionMenu(u8 taskId) @@ -526,7 +526,7 @@ static void PrintOptionMenuHeader(void) FillWindowPixelBuffer(0, PIXEL_FILL(1)); AddTextPrinterParameterized(WIN_TEXT_OPTION, 2, gText_MenuOption, 8, 1, TEXT_SKIP_DRAW, NULL); PutWindowTilemap(0); - CopyWindowToVram(0, COPYWIN_BOTH); + CopyWindowToVram(0, COPYWIN_FULL); } static void DrawOptionMenuBg(void) diff --git a/src/pokemon.c b/src/pokemon.c index ec52955b5..82b5bf596 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -2475,9 +2475,9 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de attack = (150 * attack) / 100; if (defender->ability == ABILITY_MARVEL_SCALE && defender->status1) defense = (150 * defense) / 100; - if (type == TYPE_ELECTRIC && AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, 0, 0xFD, 0)) + if (type == TYPE_ELECTRIC && AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, 0, ABILITYEFFECT_MUD_SPORT, 0)) gBattleMovePower /= 2; - if (type == TYPE_FIRE && AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, 0, 0xFE, 0)) + if (type == TYPE_FIRE && AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, 0, ABILITYEFFECT_WATER_SPORT, 0)) gBattleMovePower /= 2; if (type == TYPE_GRASS && attacker->ability == ABILITY_OVERGROW && attacker->hp <= (attacker->maxHP / 3)) gBattleMovePower = (150 * gBattleMovePower) / 100; @@ -4217,7 +4217,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov // I have to re-use this variable to match. r5 = gActiveBattler; gActiveBattler = battleMonId; - BtlController_EmitGetMonData(0, 0, 0); + BtlController_EmitGetMonData(BUFFER_A, 0, 0); MarkBattlerForControllerExec(gActiveBattler); gActiveBattler = r5; } @@ -4845,7 +4845,7 @@ static void BufferStatRoseMessage(int stat) gBattlerTarget = gBattlerInMenuId; StringCopy(gBattleTextBuff1, gStatNamesTable[sStatsToRaise[stat]]); StringCopy(gBattleTextBuff2, gBattleText_Rose); - BattleStringExpandPlaceholdersToDisplayedString(gText_PkmnsStatChanged2); + BattleStringExpandPlaceholdersToDisplayedString(gText_DefendersStatRose); } const u8 *Battle_PrintStatBoosterEffectMessage(u16 itemId) @@ -5987,7 +5987,7 @@ static u16 GetDeoxysStat(struct Pokemon *mon, s32 statId) u16 statValue; u8 nature; - if (gBattleTypeFlags & BATTLE_TYPE_LINK_ESTABLISHED || GetMonData(mon, MON_DATA_SPECIES, NULL) != SPECIES_DEOXYS) + if (gBattleTypeFlags & BATTLE_TYPE_LINK_IN_BATTLE || GetMonData(mon, MON_DATA_SPECIES, NULL) != SPECIES_DEOXYS) { return statValue = 0; } diff --git a/src/pokemon_jump.c b/src/pokemon_jump.c index 8faa5747b..1287bbab5 100644 --- a/src/pokemon_jump.c +++ b/src/pokemon_jump.c @@ -4515,7 +4515,7 @@ static void Task_ShowPokemonJumpRecords(u8 taskId) case 0: tWindowId = AddWindow(&sWindowTemplate_Records); PrintRecordsText(tWindowId); - CopyWindowToVram(tWindowId, COPYWIN_BOTH); + CopyWindowToVram(tWindowId, COPYWIN_FULL); tState++; break; case 1: diff --git a/src/pokemon_special_anim_scene.c b/src/pokemon_special_anim_scene.c index c39c5e1e3..8da24dd06 100644 --- a/src/pokemon_special_anim_scene.c +++ b/src/pokemon_special_anim_scene.c @@ -341,7 +341,7 @@ void InitPokemonSpecialAnimScene(struct PokemonSpecialAnimScene * buffer, u16 an LoadBgGfxByAnimType(animType); FillWindowPixelBuffer(0, PIXEL_FILL(0)); TextWindow_SetUserSelectedFrame(0, 0x000, 0xe0); - CopyWindowToVram(0, COPYWIN_BOTH); + CopyWindowToVram(0, COPYWIN_FULL); ShowBg(0); ShowBg(3); HideBg(1); @@ -370,7 +370,7 @@ void PSA_ShowMessageWindow(void) PutWindowTilemap(0); FillWindowPixelBuffer(0, PIXEL_FILL(1)); DrawTextBorderOuter(0, 0x001, 0xE); - CopyWindowToVram(0, COPYWIN_BOTH); + CopyWindowToVram(0, COPYWIN_FULL); } void PSA_HideMessageWindow(void) @@ -612,7 +612,7 @@ UNUSED void PSA_DrawLevelUpWindowPg1(u16 *statsBefore, u16 *statsAfter) DrawTextBorderOuter(1, 0x001, 0xE); DrawLevelUpWindowPg1(1, statsBefore, statsAfter, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY); PutWindowTilemap(1); - CopyWindowToVram(1, COPYWIN_BOTH); + CopyWindowToVram(1, COPYWIN_FULL); } UNUSED void PSA_DrawLevelUpWindowPg2(u16 *currStats) { diff --git a/src/pokemon_storage_system_2.c b/src/pokemon_storage_system_2.c index f5b9ca115..fb6c61db4 100644 --- a/src/pokemon_storage_system_2.c +++ b/src/pokemon_storage_system_2.c @@ -246,8 +246,8 @@ static void Task_PokemonStorageSystemPC(u8 taskId) DrawDialogueFrame(0, 0); FillWindowPixelBuffer(0, PIXEL_FILL(1)); AddTextPrinterParameterized2(0, 2, sUnknown_83CDA20[task->data[1]].desc, TEXT_SKIP_DRAW, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); - CopyWindowToVram(0, COPYWIN_BOTH); - CopyWindowToVram(task->data[15], COPYWIN_BOTH); + CopyWindowToVram(0, COPYWIN_FULL); + CopyWindowToVram(task->data[15], COPYWIN_FULL); task->data[0]++; break; case 1: diff --git a/src/pokemon_storage_system_5.c b/src/pokemon_storage_system_5.c index bd1aba0ef..fdc32d388 100644 --- a/src/pokemon_storage_system_5.c +++ b/src/pokemon_storage_system_5.c @@ -1127,7 +1127,7 @@ static void SetCursorMonData(void *pokemon, u8 mode) *(txtPtr++) = TEXT_COLOR_WHITE; *(txtPtr++) = TEXT_COLOR_LIGHT_GRAY; *(txtPtr++) = CHAR_SPACE; - *(txtPtr++) = CHAR_EXTRA_EMOJI; + *(txtPtr++) = CHAR_EXTRA_SYMBOL; *(txtPtr++) = 5; // LV_2 txtPtr = ConvertIntToDecimalStringN(txtPtr, gPSSData->cursorMonLevel, STR_CONV_MODE_LEFT_ALIGN, 3); diff --git a/src/pokemon_storage_system_7.c b/src/pokemon_storage_system_7.c index a9b538cae..95d199172 100644 --- a/src/pokemon_storage_system_7.c +++ b/src/pokemon_storage_system_7.c @@ -127,7 +127,7 @@ static bool8 sub_8095138(void) sub_80956A4(sMoveMonsPtr->fromRow, sMoveMonsPtr->fromColumn); SetBgAttribute(0, BG_ATTR_PALETTEMODE, 1); PutWindowTilemap(gPSSData->field_2200); - CopyWindowToVram8Bit(gPSSData->field_2200, COPYWIN_BOTH); + CopyWindowToVram8Bit(gPSSData->field_2200, COPYWIN_FULL); BlendPalettes(0x3F00, 8, RGB_WHITE); sub_8094D14(2); SetGpuRegBits(REG_OFFSET_BG0CNT, BGCNT_256COLOR); diff --git a/src/quest_log.c b/src/quest_log.c index cbeca4b72..a950b9014 100644 --- a/src/quest_log.c +++ b/src/quest_log.c @@ -501,7 +501,7 @@ void DrawPreviouslyOnQuestHeader(u8 sceneNum) PutWindowTilemap(sQuestLogHeaderWindowIds[1]); CopyWindowToVram(sQuestLogHeaderWindowIds[0], COPYWIN_GFX); CopyWindowToVram(sQuestLogHeaderWindowIds[2], COPYWIN_GFX); - CopyWindowToVram(sQuestLogHeaderWindowIds[1], COPYWIN_BOTH); + CopyWindowToVram(sQuestLogHeaderWindowIds[1], COPYWIN_FULL); } void CommitQuestLogWindow1(void) diff --git a/src/region_map.c b/src/region_map.c index 68d9ba9a2..2f73db580 100644 --- a/src/region_map.c +++ b/src/region_map.c @@ -1920,16 +1920,16 @@ static void DisplayCurrentDungeonName(void) StringCopy(sRegionMap->dungeonName, sMapNames[descOffset]); AddTextPrinterParameterized3(WIN_DUNGEON_NAME, 2, 12, 2, sTextColorTable[GetSelectedMapsecType(LAYER_DUNGEON) - 2], 0, sRegionMap->dungeonName); PutWindowTilemap(WIN_DUNGEON_NAME); - CopyWindowToVram(WIN_DUNGEON_NAME, COPYWIN_BOTH); + CopyWindowToVram(WIN_DUNGEON_NAME, COPYWIN_FULL); } } static void ClearMapsecNameText(void) { FillWindowPixelBuffer(WIN_MAP_NAME, PIXEL_FILL(0)); - CopyWindowToVram(WIN_MAP_NAME, COPYWIN_BOTH); + CopyWindowToVram(WIN_MAP_NAME, COPYWIN_FULL); FillWindowPixelBuffer(WIN_DUNGEON_NAME, PIXEL_FILL(0)); - CopyWindowToVram(WIN_DUNGEON_NAME, COPYWIN_BOTH); + CopyWindowToVram(WIN_DUNGEON_NAME, COPYWIN_FULL); } static void BufferRegionMapBg(u8 bg, u16 *map) @@ -2492,7 +2492,7 @@ static void Task_DrawDungeonMapPreviewFlavorText(u8 taskId) break; case 2: FillWindowPixelBuffer(WIN_MAP_PREVIEW, PIXEL_FILL(0)); - CopyWindowToVram(WIN_MAP_PREVIEW, COPYWIN_BOTH); + CopyWindowToVram(WIN_MAP_PREVIEW, COPYWIN_FULL); PutWindowTilemap(WIN_MAP_PREVIEW); sDungeonMapPreview->drawState++; break; @@ -2502,7 +2502,7 @@ static void Task_DrawDungeonMapPreviewFlavorText(u8 taskId) { AddTextPrinterParameterized3(WIN_MAP_PREVIEW, 2, 4, 0, sTextColor_Green, -1, GetDungeonName(GetDungeonMapsecUnderCursor())); AddTextPrinterParameterized3(WIN_MAP_PREVIEW, 2, 2, 14, sTextColor_White, -1, GetDungeonFlavorText(GetDungeonMapsecUnderCursor())); - CopyWindowToVram(WIN_MAP_PREVIEW, COPYWIN_BOTH); + CopyWindowToVram(WIN_MAP_PREVIEW, COPYWIN_FULL); sDungeonMapPreview->drawState++; } // Tint image @@ -2521,7 +2521,7 @@ static void Task_DrawDungeonMapPreviewFlavorText(u8 taskId) if (JOY_NEW(B_BUTTON) || JOY_NEW(A_BUTTON)) { FillWindowPixelBuffer(WIN_MAP_PREVIEW, PIXEL_FILL(0)); - CopyWindowToVram(WIN_MAP_PREVIEW, COPYWIN_BOTH); + CopyWindowToVram(WIN_MAP_PREVIEW, COPYWIN_FULL); sDungeonMapPreview->mainState++; sDungeonMapPreview->drawState++; } @@ -3001,8 +3001,8 @@ static void Task_MapCloseAnim(u8 taskId) { case 0: ClearOrDrawTopBar(TRUE); - CopyWindowToVram(WIN_TOPBAR_LEFT, COPYWIN_BOTH); - CopyWindowToVram(WIN_TOPBAR_RIGHT, COPYWIN_BOTH); + CopyWindowToVram(WIN_TOPBAR_LEFT, COPYWIN_FULL); + CopyWindowToVram(WIN_TOPBAR_RIGHT, COPYWIN_FULL); sMapOpenCloseAnim->closeState++; break; case 1: @@ -4294,7 +4294,7 @@ static void PrintTopBarTextRight(const u8 *str) else FillWindowPixelBuffer(WIN_TOPBAR_RIGHT, PIXEL_FILL(15)); AddTextPrinterParameterized3(WIN_TOPBAR_RIGHT, 0, 0, 0, sTextColors, 0, str); - CopyWindowToVram(WIN_TOPBAR_RIGHT, COPYWIN_BOTH); + CopyWindowToVram(WIN_TOPBAR_RIGHT, COPYWIN_FULL); } static void ClearOrDrawTopBar(bool8 clear) diff --git a/src/slot_machine.c b/src/slot_machine.c index 9ceac198e..24a728046 100644 --- a/src/slot_machine.c +++ b/src/slot_machine.c @@ -2119,7 +2119,7 @@ static bool8 SlotsTask_MessageOutOfCoins(u8 * state, struct SlotMachineSetupTask { case 0: Slot_PrintOnWindow0(gString_OutOfCoins); - CopyWindowToVram(0, COPYWIN_BOTH); + CopyWindowToVram(0, COPYWIN_FULL); (*state)++; break; case 1: @@ -2137,7 +2137,7 @@ static bool8 SlotsTask_AskQuitPlaying(u8 * state, struct SlotMachineSetupTaskDat case 0: Slot_PrintOnWindow0(gString_QuitPlaying); Slot_CreateYesNoMenu(0); - CopyWindowToVram(0, COPYWIN_BOTH); + CopyWindowToVram(0, COPYWIN_FULL); (*state)++; break; case 1: @@ -2155,7 +2155,7 @@ static bool8 SlotsTask_DestroyYesNoMenu(u8 * state, struct SlotMachineSetupTaskD case 0: Slot_ClearWindow0(); Slot_DestroyYesNoMenu(); - CopyWindowToVram(0, COPYWIN_BOTH); + CopyWindowToVram(0, COPYWIN_FULL); (*state)++; break; case 1: diff --git a/src/start_menu.c b/src/start_menu.c index 80c9d7f59..2c0de8245 100644 --- a/src/start_menu.c +++ b/src/start_menu.c @@ -912,7 +912,7 @@ static void task50_after_link_battle_save(u8 taskId) AddTextPrinterParameterized2(0, 2, gText_SavingDontTurnOffThePower2, 0xFF, NULL, 2, 1, 3); DrawTextBorderOuter(0, 0x008, 0x0F); PutWindowTilemap(0); - CopyWindowToVram(0, COPYWIN_BOTH); + CopyWindowToVram(0, COPYWIN_FULL); BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); if (gWirelessCommType != 0 && InUnionRoom()) data[0] = 5; diff --git a/src/strings.c b/src/strings.c index 0855152f5..b8b989b80 100644 --- a/src/strings.c +++ b/src/strings.c @@ -215,7 +215,7 @@ const u8 gText_TheBerryPouchWillBePutAway[] = _("The BERRY POUCH will be\nput aw const u8 gText_ShopBuy[] = _("BUY"); const u8 gText_ShopSell[] = _("SELL"); const u8 gText_ShopQuit[] = _("SEE YA!"); -const u8 gText_InBagVar1[] = _("IN BAG:{SMALL} {STR_VAR_1}"); +const u8 gText_InBagVar1[] = _("IN BAG:{FONT_SMALL} {STR_VAR_1}"); const u8 gText_QuitShopping[] = _("Quit shopping."); const u8 gText_Var1CertainlyHowMany[] = _("{STR_VAR_1}? Certainly.\nHow many would you like?"); const u8 gText_Var1AndYouWantedVar2[] = _("{STR_VAR_1}, and you want {STR_VAR_2}.\nThat will be ¥{STR_VAR_3}. Okay?"); @@ -419,11 +419,11 @@ const u8 gText_DoubleBattle[] = _("DOUBLE BATTLE"); const u8 gText_MultiBattle[] = _("MULTI BATTLE"); const u8 gText_MakeAChallenge[] = _("Make a challenge."); const u8 gText_Info_2[] = _("INFO"); -const u8 gText_FreshWater_200[] = _("FRESH WATER{CLEAR_TO 0x57}{SMALL}¥200"); -const u8 gText_SodaPop_300[] = _("SODA POP{CLEAR_TO 0x57}{SMALL}¥300"); -const u8 gText_Lemonade_350[] = _("LEMONADE{CLEAR_TO 0x57}{SMALL}¥350"); -const u8 gText_50Coins_1000[] = _("{SMALL} 50 COINS{CLEAR_TO 0x45}¥1,000"); -const u8 gText_500Coins_10000[] = _("{SMALL}500 COINS{CLEAR_TO 0x40}¥10,000"); +const u8 gText_FreshWater_200[] = _("FRESH WATER{CLEAR_TO 0x57}{FONT_SMALL}¥200"); +const u8 gText_SodaPop_300[] = _("SODA POP{CLEAR_TO 0x57}{FONT_SMALL}¥300"); +const u8 gText_Lemonade_350[] = _("LEMONADE{CLEAR_TO 0x57}{FONT_SMALL}¥350"); +const u8 gText_50Coins_1000[] = _("{FONT_SMALL} 50 COINS{CLEAR_TO 0x45}¥1,000"); +const u8 gText_500Coins_10000[] = _("{FONT_SMALL}500 COINS{CLEAR_TO 0x40}¥10,000"); const u8 gText_Excellent[] = _("Excellent"); const u8 gText_NotSoBad[] = _("Not so bad"); const u8 gText_RedShard[] = _("RED SHARD"); @@ -433,11 +433,11 @@ const u8 gText_GreenShard[] = _("GREEN SHARD"); const u8 gUnknown_8417A30[] = _("バトルタワ-"); const u8 gText_Right[] = _("Right"); const u8 gText_Left[] = _("Left"); -const u8 gText_Tm13_4000Coins[] = _("TM13{CLEAR_TO 0x48}{SMALL}4,000 COINS"); -const u8 gText_Tm23_3500Coins[] = _("TM23{CLEAR_TO 0x48}{SMALL}3,500 COINS"); -const u8 gText_Tm24_4000Coins[] = _("TM24{CLEAR_TO 0x48}{SMALL}4,000 COINS"); -const u8 gText_Tm30_4500Coins[] = _("TM30{CLEAR_TO 0x48}{SMALL}4,500 COINS"); -const u8 gText_Tm35_4000Coins[] = _("TM35{CLEAR_TO 0x48}{SMALL}4,000 COINS"); +const u8 gText_Tm13_4000Coins[] = _("TM13{CLEAR_TO 0x48}{FONT_SMALL}4,000 COINS"); +const u8 gText_Tm23_3500Coins[] = _("TM23{CLEAR_TO 0x48}{FONT_SMALL}3,500 COINS"); +const u8 gText_Tm24_4000Coins[] = _("TM24{CLEAR_TO 0x48}{FONT_SMALL}4,000 COINS"); +const u8 gText_Tm30_4500Coins[] = _("TM30{CLEAR_TO 0x48}{FONT_SMALL}4,500 COINS"); +const u8 gText_Tm35_4000Coins[] = _("TM35{CLEAR_TO 0x48}{FONT_SMALL}4,000 COINS"); const u8 gText_1F_2[] = _("1F"); const u8 gText_2F_2[] = _("2F"); const u8 gText_3F_2[] = _("3F"); @@ -485,18 +485,18 @@ const u8 gText_FreshWater[] = _("FRESH WATER"); const u8 gText_SodaPop[] = _("SODA POP"); const u8 gText_Lemonade[] = _("LEMONADE"); const u8 gText_Coins_2[] = _("COINS"); -const u8 gText_Bicycle_1000000[] = _("BICYCLE{CLEAR_TO 0x49}{SMALL}¥1,000,000"); +const u8 gText_Bicycle_1000000[] = _("BICYCLE{CLEAR_TO 0x49}{FONT_SMALL}¥1,000,000"); const u8 gText_NoThanks[] = _("NO THANKS"); -const u8 gText_Abra_180Coins[] = _("ABRA{CLEAR_TO 0x55}{SMALL} 180 COINS"); -const u8 gText_Clefairy_500Coins[] = _("CLEFAIRY{CLEAR_TO 0x55}{SMALL} 500 COINS"); -const u8 gText_Dratini_2800Coins[] = _("DRATINI{CLEAR_TO 0x4B}{SMALL} 2,800 COINS"); -const u8 gText_Scyther_5500Coins[] = _("SCYTHER{CLEAR_TO 0x4B}{SMALL} 5,500 COINS"); -const u8 gText_Porygon_9999Coins[] = _("PORYGON{CLEAR_TO 0x4B}{SMALL} 9,999 COINS"); -const u8 gText_Abra_120Coins[] = _("ABRA{CLEAR_TO 0x55}{SMALL} 120 COINS"); -const u8 gText_Clefairy_750Coins[] = _("CLEFAIRY{CLEAR_TO 0x55}{SMALL} 750 COINS"); -const u8 gText_Pinsir_2500Coins[] = _("PINSIR{CLEAR_TO 0x4B}{SMALL} 2,500 COINS"); -const u8 gText_Dratini_4600Coins[] = _("DRATINI{CLEAR_TO 0x4B}{SMALL} 4,600 COINS"); -const u8 gText_Porygon_6500Coins[] = _("PORYGON{CLEAR_TO 0x4B}{SMALL} 6,500 COINS"); +const u8 gText_Abra_180Coins[] = _("ABRA{CLEAR_TO 0x55}{FONT_SMALL} 180 COINS"); +const u8 gText_Clefairy_500Coins[] = _("CLEFAIRY{CLEAR_TO 0x55}{FONT_SMALL} 500 COINS"); +const u8 gText_Dratini_2800Coins[] = _("DRATINI{CLEAR_TO 0x4B}{FONT_SMALL} 2,800 COINS"); +const u8 gText_Scyther_5500Coins[] = _("SCYTHER{CLEAR_TO 0x4B}{FONT_SMALL} 5,500 COINS"); +const u8 gText_Porygon_9999Coins[] = _("PORYGON{CLEAR_TO 0x4B}{FONT_SMALL} 9,999 COINS"); +const u8 gText_Abra_120Coins[] = _("ABRA{CLEAR_TO 0x55}{FONT_SMALL} 120 COINS"); +const u8 gText_Clefairy_750Coins[] = _("CLEFAIRY{CLEAR_TO 0x55}{FONT_SMALL} 750 COINS"); +const u8 gText_Pinsir_2500Coins[] = _("PINSIR{CLEAR_TO 0x4B}{FONT_SMALL} 2,500 COINS"); +const u8 gText_Dratini_4600Coins[] = _("DRATINI{CLEAR_TO 0x4B}{FONT_SMALL} 4,600 COINS"); +const u8 gText_Porygon_6500Coins[] = _("PORYGON{CLEAR_TO 0x4B}{FONT_SMALL} 6,500 COINS"); const u8 gText_NoThanks_2[] = _("NO THANKS"); const u8 gText_HelixFossil[] = _("HELIX FOSSIL"); const u8 gText_DomeFossil[] = _("DOME FOSSIL"); @@ -532,11 +532,11 @@ const u8 gText_1BigMushroom[] = _("1 BIG MUSHROOM"); const u8 gText_SeviiIslands[] = _("SEVII ISLANDS"); const u8 gText_NavelRock[] = _("NAVEL ROCK"); const u8 gText_BirthIsland[] = _("BIRTH ISLAND"); -const u8 gText_MiracleSeed_1000Coins[] = _("MIRACLE SEED{CLEAR_TO 0x50}{SMALL}1,000 COINS"); -const u8 gText_Charcoal_1000Coins[] = _("CHARCOAL{CLEAR_TO 0x50}{SMALL}1,000 COINS"); -const u8 gText_MysticWater_1000Coins[] = _("MYSTIC WATER{CLEAR_TO 0x50}{SMALL}1,000 COINS"); -const u8 gText_YellowFlute_1600Coins[] = _("YELLOW FLUTE{CLEAR_TO 0x50}{SMALL}1,600 COINS"); -const u8 gText_SmokeBall_800Coins[] = _("SMOKE BALL{CLEAR_TO 0x5A}{SMALL}800 COINS"); +const u8 gText_MiracleSeed_1000Coins[] = _("MIRACLE SEED{CLEAR_TO 0x50}{FONT_SMALL}1,000 COINS"); +const u8 gText_Charcoal_1000Coins[] = _("CHARCOAL{CLEAR_TO 0x50}{FONT_SMALL}1,000 COINS"); +const u8 gText_MysticWater_1000Coins[] = _("MYSTIC WATER{CLEAR_TO 0x50}{FONT_SMALL}1,000 COINS"); +const u8 gText_YellowFlute_1600Coins[] = _("YELLOW FLUTE{CLEAR_TO 0x50}{FONT_SMALL}1,600 COINS"); +const u8 gText_SmokeBall_800Coins[] = _("SMOKE BALL{CLEAR_TO 0x5A}{FONT_SMALL}800 COINS"); const u8 gText_Dummy_8417F67[] = _(""); const u8 gText_Dummy_8417F68[] = _(""); const u8 gText_BecomeLeader[] = _("BECOME LEADER"); @@ -582,17 +582,17 @@ const u8 gText_NowOn[] = _("Now on:"); const u8 gText_LinkedGamePlay[] = _("LINKED GAME PLAY"); const u8 gText_DirectCorner[] = _("DIRECT CORNER"); const u8 gText_UnionRoom[] = _("UNION ROOM"); -const u8 gText_Energypowder_50[] = _("ENERGYPOWDER{CLEAR_TO 0x74}{SMALL}50"); -const u8 gText_EnergyRoot_80[] = _("ENERGY ROOT{CLEAR_TO 0x74}{SMALL}80"); -const u8 gText_HealPowder_50[] = _("HEAL POWDER{CLEAR_TO 0x74}{SMALL}50"); -const u8 gText_RevivalHerb_300[] = _("REVIVAL HERB{CLEAR_TO 0x6F}{SMALL}300"); -const u8 gText_Protein_1000[] = _("PROTEIN{CLEAR_TO 0x65}{SMALL}1,000"); -const u8 gText_Iron_1000[] = _("IRON{CLEAR_TO 0x65}{SMALL}1,000"); -const u8 gText_Carbos_1000[] = _("CARBOS{CLEAR_TO 0x65}{SMALL}1,000"); -const u8 gText_Calcium_1000[] = _("CALCIUM{CLEAR_TO 0x65}{SMALL}1,000"); -const u8 gText_Zinc_1000[] = _("ZINC{CLEAR_TO 0x65}{SMALL}1,000"); -const u8 gText_HpUp_1000[] = _("HP UP{CLEAR_TO 0x65}{SMALL}1,000"); -const u8 gText_PpUp_3000[] = _("PP UP{CLEAR_TO 0x65}{SMALL}3,000"); +const u8 gText_Energypowder_50[] = _("ENERGYPOWDER{CLEAR_TO 0x74}{FONT_SMALL}50"); +const u8 gText_EnergyRoot_80[] = _("ENERGY ROOT{CLEAR_TO 0x74}{FONT_SMALL}80"); +const u8 gText_HealPowder_50[] = _("HEAL POWDER{CLEAR_TO 0x74}{FONT_SMALL}50"); +const u8 gText_RevivalHerb_300[] = _("REVIVAL HERB{CLEAR_TO 0x6F}{FONT_SMALL}300"); +const u8 gText_Protein_1000[] = _("PROTEIN{CLEAR_TO 0x65}{FONT_SMALL}1,000"); +const u8 gText_Iron_1000[] = _("IRON{CLEAR_TO 0x65}{FONT_SMALL}1,000"); +const u8 gText_Carbos_1000[] = _("CARBOS{CLEAR_TO 0x65}{FONT_SMALL}1,000"); +const u8 gText_Calcium_1000[] = _("CALCIUM{CLEAR_TO 0x65}{FONT_SMALL}1,000"); +const u8 gText_Zinc_1000[] = _("ZINC{CLEAR_TO 0x65}{FONT_SMALL}1,000"); +const u8 gText_HpUp_1000[] = _("HP UP{CLEAR_TO 0x65}{FONT_SMALL}1,000"); +const u8 gText_PpUp_3000[] = _("PP UP{CLEAR_TO 0x65}{FONT_SMALL}3,000"); const u8 gString_BattleRecords_PlayersBattleResults[] = _("{PLAYER}'s BATTLE RESULTS"); const u8 gString_BattleRecords_TotalRecord[] = _("TOTAL RECORD W:{STR_VAR_1} L:{STR_VAR_2} D:{STR_VAR_3}"); const u8 gString_BattleRecords_ColumnHeaders[] = _("WIN{CLEAR_TO 0x30}LOSE{CLEAR_TO 0x60}DRAW"); @@ -911,14 +911,14 @@ const u8 gUnknown_841B285[] = _(" was used on\n"); const u8 gUnknown_841B293[] = _("."); const u8 gUnknown_841B295[] = _("'s level rose to\n"); const u8 gUnknown_841B2A7[] = _("."); -const u8 gUnknown_841B2A9[] = _("{SMALL}MAX.{SIZE 0x02} HP"); +const u8 gUnknown_841B2A9[] = _("{FONT_SMALL}MAX.{SIZE 0x02} HP"); const u8 gUnknown_841B2B7[] = _("ATTACK"); const u8 gUnknown_841B2BE[] = _("DEFENSE"); const u8 gUnknown_841B2C6[] = _("SPEED"); const u8 gUnknown_841B2CC[] = _("SP. ATK"); const u8 gUnknown_841B2D4[] = _("SP. DEF"); -const u8 gUnknown_841B2DC[] = _("{SMALL}{PLUS}{SIZE 0x02}"); -const u8 gUnknown_841B2E5[] = _("{SMALL}-{SIZE 0x02}"); +const u8 gUnknown_841B2DC[] = _("{FONT_SMALL}{PLUS}{SIZE 0x02}"); +const u8 gUnknown_841B2E5[] = _("{FONT_SMALL}-{SIZE 0x02}"); const u8 gUnknown_841B2ED[] = _("1, "); const u8 gUnknown_841B2F1[] = _("2, and ‥ ‥ ‥ "); const u8 gUnknown_841B2FF[] = _("Poof!\p"); diff --git a/src/text.c b/src/text.c index acf5bb7ec..248802a5f 100644 --- a/src/text.c +++ b/src/text.c @@ -785,7 +785,7 @@ u16 RenderText(struct TextPrinter *textPrinter) textPrinter->state = 3; TextPrinterInitDownArrowCounters(textPrinter); return 3; - case CHAR_EXTRA_EMOJI: + case CHAR_EXTRA_SYMBOL: currChar = *textPrinter->printerTemplate.currentChar | 0x100; textPrinter->printerTemplate.currentChar++; break; @@ -971,7 +971,7 @@ s32 GetStringWidthFixedWidthFont(const u8 *str, u8 fontId, u8 letterSpacing) case CHAR_PROMPT_CLEAR: break; case CHAR_KEYPAD_ICON: - case CHAR_EXTRA_EMOJI: + case CHAR_EXTRA_SYMBOL: ++strPos; default: ++width; @@ -1121,8 +1121,8 @@ s32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing) } break; case CHAR_KEYPAD_ICON: - case CHAR_EXTRA_EMOJI: - if (*str == CHAR_EXTRA_EMOJI) + case CHAR_EXTRA_SYMBOL: + if (*str == CHAR_EXTRA_SYMBOL) glyphWidth = func(*++str | 0x100, isJapanese); else glyphWidth = GetKeypadIconWidth(*++str); @@ -1241,7 +1241,7 @@ u8 RenderTextFont9(u8 *pixels, u8 fontId, u8 *str, int a3, int a4, int a5, int a break; case CHAR_DYNAMIC_PLACEHOLDER: case CHAR_KEYPAD_ICON: - case CHAR_EXTRA_EMOJI: + case CHAR_EXTRA_SYMBOL: case PLACEHOLDER_BEGIN: ++strPos; break; diff --git a/src/trade.c b/src/trade.c index 3dd540962..96aae81c1 100644 --- a/src/trade.c +++ b/src/trade.c @@ -1732,7 +1732,7 @@ static void TradeMenuCB_0(void) UnionRoomAndTradeMenuPrintOptions(1, 3, 16, 2, sMenuAction_SummaryTrade); Menu_InitCursor(1, 3, 0, 0, 16, 2, 0); PutWindowTilemap(1); - CopyWindowToVram(1, COPYWIN_BOTH); + CopyWindowToVram(1, COPYWIN_FULL); sTradeMenuResourcesPtr->tradeMenuCBnum = 1; } else if (sTradeMenuResourcesPtr->tradeMenuCursorPosition < 12) @@ -2164,9 +2164,9 @@ static void HandleRedrawTradeMenuOnSide(u8 side) BuildMovesString(movesString, whichParty, partyIdx); AddTextPrinterParameterized4((side * 2) + 15, 1, 0, 0, 0, 0, sTextColor_PartyMonNickname, 0, movesString); PutWindowTilemap((side * 2) + 14); - CopyWindowToVram((side * 2) + 14, COPYWIN_BOTH); + CopyWindowToVram((side * 2) + 14, COPYWIN_FULL); PutWindowTilemap((side * 2) + 15); - CopyWindowToVram((side * 2) + 15, COPYWIN_BOTH); + CopyWindowToVram((side * 2) + 15, COPYWIN_FULL); sTradeMenuResourcesPtr->menuRedrawState[side]++; break; case 4: @@ -2234,7 +2234,7 @@ static void PrintPartyMonNickname(u8 whichParty, u8 windowId, const u8 *str) xPos = (64u - GetStringWidth(0, str, GetFontAttribute(0, FONTATTR_LETTER_SPACING))) / 2; AddTextPrinterParameterized3(windowId, 0, xPos, 4, sTextColor_PartyMonNickname, speed, str); PutWindowTilemap(windowId); - CopyWindowToVram(windowId, COPYWIN_BOTH); + CopyWindowToVram(windowId, COPYWIN_FULL); } static void PrintPartyNicknames(u8 whichParty) @@ -2445,7 +2445,7 @@ static void PrintTradeErrorOrStatusMessage(u8 idx) AddTextPrinterParameterized(0, 3, sTradeErrorOrStatusMessagePtrs[idx], 0, 2, 0xFF, NULL); DrawTextBorderOuter(0, 0x014, 12); PutWindowTilemap(0); - CopyWindowToVram(0, COPYWIN_BOTH); + CopyWindowToVram(0, COPYWIN_FULL); } static bool8 LoadUISprites(void) diff --git a/src/trade_scene.c b/src/trade_scene.c index 7a3642020..d3db122dd 100644 --- a/src/trade_scene.c +++ b/src/trade_scene.c @@ -922,7 +922,7 @@ void LinkTradeDrawWindow(void) { FillWindowPixelBuffer(0, PIXEL_FILL(15)); PutWindowTilemap(0); - CopyWindowToVram(0, COPYWIN_BOTH); + CopyWindowToVram(0, COPYWIN_FULL); } static void TradeAnimInit_LoadGfx(void) @@ -999,7 +999,7 @@ static void CB2_InitTradeAnim_InGameTrade(void) LoadTradeMonPic(1, 1); FillWindowPixelBuffer(0, PIXEL_FILL(15)); PutWindowTilemap(0); - CopyWindowToVram(0, COPYWIN_BOTH); + CopyWindowToVram(0, COPYWIN_FULL); gMain.state++; break; case 9: @@ -1330,7 +1330,7 @@ static bool8 DoTradeAnim_Cable(void) { SetTradeSequenceBgGpuRegs(4); FillWindowPixelBuffer(0, PIXEL_FILL(15)); - CopyWindowToVram(0, COPYWIN_BOTH); + CopyWindowToVram(0, COPYWIN_FULL); sTradeData->state++; } break; @@ -1827,7 +1827,7 @@ static bool8 DoTradeAnim_Wireless(void) { SetTradeSequenceBgGpuRegs(4); FillWindowPixelBuffer(0, PIXEL_FILL(15)); - CopyWindowToVram(0, COPYWIN_BOTH); + CopyWindowToVram(0, COPYWIN_FULL); sTradeData->state++; } break; @@ -2768,7 +2768,7 @@ void DrawTextOnTradeWindow(u8 windowId, const u8 *str, s8 speed) sTradeData->textColor[1] = 1; sTradeData->textColor[2] = 6; AddTextPrinterParameterized4(windowId, 2, 0, 2, 0, 2, sTradeData->textColor, speed, str); - CopyWindowToVram(windowId, COPYWIN_BOTH); + CopyWindowToVram(windowId, COPYWIN_FULL); } static void Task_AnimateWirelessSignal(u8 taskId) diff --git a/src/trainer_card.c b/src/trainer_card.c index 0479f9c73..bf56915ff 100644 --- a/src/trainer_card.c +++ b/src/trainer_card.c @@ -621,7 +621,7 @@ static void Task_TrainerCard(u8 taskId) SetCloseLinkCallback(); DrawDialogueFrame(0, 1); AddTextPrinterParameterized(0, 2, gText_WaitingTrainerFinishReading, 0, 1, TEXT_SKIP_DRAW, 0); - CopyWindowToVram(0, COPYWIN_BOTH); + CopyWindowToVram(0, COPYWIN_FULL); sTrainerCardDataPtr->mainState = STATE_CLOSE_CARD_LINK; break; case STATE_CLOSE_CARD_LINK: @@ -1464,7 +1464,7 @@ static void LoadStickerGfx(void) static void DrawTrainerCardWindow(u8 windowId) { PutWindowTilemap(windowId); - CopyWindowToVram(windowId, COPYWIN_BOTH); + CopyWindowToVram(windowId, COPYWIN_FULL); } static bool8 SetTrainerCardBgsAndPals(void) diff --git a/src/trainer_tower.c b/src/trainer_tower.c index 210837745..a589dcbef 100644 --- a/src/trainer_tower.c +++ b/src/trainer_tower.c @@ -917,7 +917,7 @@ static void ShowResultsBoard(void) } PutWindowTilemap(windowId); - CopyWindowToVram(windowId, COPYWIN_BOTH); + CopyWindowToVram(windowId, COPYWIN_FULL); VarSet(VAR_TEMP_1, windowId); } @@ -1070,7 +1070,7 @@ void PrintTrainerTowerRecords(void) } PutWindowTilemap(windowId); - CopyWindowToVram(windowId, COPYWIN_BOTH); + CopyWindowToVram(windowId, COPYWIN_FULL); FreeTrainerTowerDataStruct(); } diff --git a/src/union_room_battle.c b/src/union_room_battle.c index e7a19bbbe..11307891c 100644 --- a/src/union_room_battle.c +++ b/src/union_room_battle.c @@ -78,7 +78,7 @@ static bool32 UnionRoomBattle_PrintTextOnWindow0(s16 * state, const u8 * str, s3 DrawTextBorderOuter(0, 0x001, 0xD); UnionRoomBattle_CreateTextPrinter(0, str, 0, 2, speed); PutWindowTilemap(0); - CopyWindowToVram(0, COPYWIN_BOTH); + CopyWindowToVram(0, COPYWIN_FULL); (*state)++; break; case 1: diff --git a/src/union_room_chat.c b/src/union_room_chat.c index 995d2473f..191201ec0 100644 --- a/src/union_room_chat.c +++ b/src/union_room_chat.c @@ -972,7 +972,7 @@ static void AppendCharacterToChatMessageBuffer(void) charsStr = gUnionRoomKeyboardText[sWork->currentPage][sWork->currentRow]; for (i = 0; i < sWork->currentCol; i++) { - if (*charsStr == CHAR_EXTRA_EMOJI) + if (*charsStr == CHAR_EXTRA_SYMBOL) charsStr++; charsStr++; } @@ -995,7 +995,7 @@ static void AppendCharacterToChatMessageBuffer(void) str = GetEndOfUnk1A(); while (--strLength != -1 && sWork->bufferCursorPos < MESSAGE_BUFFER_NCHAR) { - if (*charsStr == CHAR_EXTRA_EMOJI) + if (*charsStr == CHAR_EXTRA_SYMBOL) { *str = *charsStr; charsStr++; @@ -1030,7 +1030,7 @@ static void ToggleCaseOfLastCharacterInChatMessageBuffer(void) sWork->lastBufferCursorPos = sWork->bufferCursorPos - 1; str = GetPtrToLastCharOfUnk1A(); - if (*str != CHAR_EXTRA_EMOJI) + if (*str != CHAR_EXTRA_SYMBOL) { character = sCaseToggleTable[*str]; if (character) @@ -1088,7 +1088,7 @@ static u8 *GetPtrToLastCharOfUnk1A(void) while (*str != EOS) { str2 = str; - if (*str == CHAR_EXTRA_EMOJI) + if (*str == CHAR_EXTRA_SYMBOL) str++; str++; } @@ -1109,7 +1109,7 @@ static u16 GetNumCharsInMessageEntryBuffer(void) strLength -= 10; for (i = 0; i < strLength; i++) { - if (*str == CHAR_EXTRA_EMOJI) + if (*str == CHAR_EXTRA_SYMBOL) str++; str++; @@ -1250,7 +1250,7 @@ u8 *UnionRoomChat_GetEndOfMessageEntryBuffer(void) u8 *str = sWork->messageEntryBuffer; for (i = 0; i < numChars; i++) { - if (*str == CHAR_EXTRA_EMOJI) + if (*str == CHAR_EXTRA_SYMBOL) str++; str++; @@ -1268,7 +1268,7 @@ u16 UnionRoomChat_GetNumCharsInMessageEntryBuffer(void) u8 *str = sWork->messageEntryBuffer; for (count = 0, i = 0; i < numChars; count++, i++) { - if (*str == CHAR_EXTRA_EMOJI) + if (*str == CHAR_EXTRA_SYMBOL) str++; str++; diff --git a/src/union_room_chat_display.c b/src/union_room_chat_display.c index 040b21367..e06bd8aa0 100644 --- a/src/union_room_chat_display.c +++ b/src/union_room_chat_display.c @@ -488,7 +488,7 @@ static bool32 DisplaySubtask_PrintWin3(u8 *state) { case 0: PrintKeyboardSwapTextsOnWin3(); - CopyWindowToVram(3, COPYWIN_BOTH); + CopyWindowToVram(3, COPYWIN_FULL); break; case 1: return IsDma3ManagerBusyWithBgCopy(); @@ -504,7 +504,7 @@ static bool32 DisplaySubtask_HideWin3(u8 *state) { case 0: ClearWin3(); - CopyWindowToVram(3, COPYWIN_BOTH); + CopyWindowToVram(3, COPYWIN_FULL); break; case 1: return IsDma3ManagerBusyWithBgCopy(); @@ -557,7 +557,7 @@ static bool32 DisplaySubtask_ShowQuitChattingDialog(u8 *state) case 0: PlaceStdMessageWindow(STDMESSAGE_QUIT_CHATTING, 0); PlaceYesNoMenuAt(23, 11, 1); - CopyWindowToVram(sWork->messageWindowId, COPYWIN_BOTH); + CopyWindowToVram(sWork->messageWindowId, COPYWIN_FULL); break; case 1: return IsDma3ManagerBusyWithBgCopy(); @@ -636,7 +636,7 @@ static bool32 DisplaySubtask_PrintRegisterWhere(u8 *state) if (!IsDma3ManagerBusyWithBgCopy()) { PlaceStdMessageWindow(STDMESSAGE_REGISTER_WHERE, 16); - CopyWindowToVram(sWork->messageWindowId, COPYWIN_BOTH); + CopyWindowToVram(sWork->messageWindowId, COPYWIN_FULL); } else { @@ -677,7 +677,7 @@ static bool32 DisplaySubtask_CancelRegister(u8 *state) if (!IsDma3ManagerBusyWithBgCopy()) { HideStdMessageWindow(); - CopyWindowToVram(sWork->messageWindowId, COPYWIN_BOTH); + CopyWindowToVram(sWork->messageWindowId, COPYWIN_FULL); } else { @@ -800,7 +800,7 @@ static bool32 DisplaySubtask_PrintInputText(u8 *state) { case 0: PlaceStdMessageWindow(STDMESSAGE_INPUT_TEXT, 16); - CopyWindowToVram(sWork->messageWindowId, COPYWIN_BOTH); + CopyWindowToVram(sWork->messageWindowId, COPYWIN_FULL); (*state)++; break; case 1: @@ -816,7 +816,7 @@ static bool32 DisplaySubtask_PrintExitingChat(u8 *state) { case 0: PlaceStdMessageWindow(STDMESSAGE_EXITING_CHAT, 0); - CopyWindowToVram(sWork->messageWindowId, COPYWIN_BOTH); + CopyWindowToVram(sWork->messageWindowId, COPYWIN_FULL); (*state)++; break; case 1: @@ -837,7 +837,7 @@ static bool32 DisplaySubtask_PrintLeaderLeft(u8 *state) str = UnionRoomChat_GetNameOfPlayerWhoDisbandedChat(); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, str); PlaceStdMessageWindow(STDMESSAGE_LEADER_LEFT, 0); - CopyWindowToVram(sWork->messageWindowId, COPYWIN_BOTH); + CopyWindowToVram(sWork->messageWindowId, COPYWIN_FULL); (*state)++; break; case 1: @@ -854,7 +854,7 @@ static bool32 DisplaySubtask_AskSave(u8 *state) case 0: PlaceStdMessageWindow(STDMESSAGE_ASK_SAVE, 0); PlaceYesNoMenuAt(23, 10, 1); - CopyWindowToVram(sWork->messageWindowId, COPYWIN_BOTH); + CopyWindowToVram(sWork->messageWindowId, COPYWIN_FULL); (*state)++; break; case 1: @@ -871,7 +871,7 @@ static bool32 DisplaySubtask_AskOverwriteSave(u8 *state) case 0: PlaceStdMessageWindow(STDMESSAGE_ASK_OVERWRITE, 0); PlaceYesNoMenuAt(23, 10, 1); - CopyWindowToVram(sWork->messageWindowId, COPYWIN_BOTH); + CopyWindowToVram(sWork->messageWindowId, COPYWIN_FULL); (*state)++; break; case 1: @@ -887,7 +887,7 @@ static bool32 DisplaySubtask_PrintSavingDontTurnOffPower(u8 *state) { case 0: PlaceStdMessageWindow(STDMESSAGE_SAVING_NO_OFF, 0); - CopyWindowToVram(sWork->messageWindowId, COPYWIN_BOTH); + CopyWindowToVram(sWork->messageWindowId, COPYWIN_FULL); (*state)++; break; case 1: @@ -905,7 +905,7 @@ static bool32 DisplaySubtask_PrintSavedTheGame(u8 *state) DynamicPlaceholderTextUtil_Reset(); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock2Ptr->playerName); PlaceStdMessageWindow(STDMESSAGE_SAVED_THE_GAME, 0); - CopyWindowToVram(sWork->messageWindowId, COPYWIN_BOTH); + CopyWindowToVram(sWork->messageWindowId, COPYWIN_FULL); (*state)++; break; case 1: @@ -922,7 +922,7 @@ static bool32 DisplaySubtask_ShowConfirmLeaderLeaveDialog(u8 *state) case 0: PlaceStdMessageWindow(STDMESSAGE_WARN_LEADER_LEAVE, 0); PlaceYesNoMenuAt(23, 10, 1); - CopyWindowToVram(sWork->messageWindowId, COPYWIN_BOTH); + CopyWindowToVram(sWork->messageWindowId, COPYWIN_FULL); (*state)++; break; case 1: @@ -1287,21 +1287,21 @@ static void LoadWin0(void) LoadPalette(sWin0PalF, 0xF0, 0x20); PutWindowTilemap(0); FillWindowPixelBuffer(0, PIXEL_FILL(1)); - CopyWindowToVram(0, COPYWIN_BOTH); + CopyWindowToVram(0, COPYWIN_FULL); } static void LoadWin2(void) { PutWindowTilemap(2); PrintCurrentKeyboardPage(); - CopyWindowToVram(2, COPYWIN_BOTH); + CopyWindowToVram(2, COPYWIN_FULL); } static void LoadWin1(void) { FillWindowPixelBuffer(1, PIXEL_FILL(0)); PutWindowTilemap(1); - CopyWindowToVram(1, COPYWIN_BOTH); + CopyWindowToVram(1, COPYWIN_FULL); } static void LoadWin3(void) diff --git a/src/window.c b/src/window.c index 1828202a6..076f4fe07 100644 --- a/src/window.c +++ b/src/window.c @@ -233,7 +233,7 @@ void CopyWindowToVram(u8 windowId, u8 mode) case COPYWIN_GFX: LoadBgTiles(windowLocal.window.bg, windowLocal.tileData, windowSize, windowLocal.window.baseBlock); break; - case COPYWIN_BOTH: + case COPYWIN_FULL: LoadBgTiles(windowLocal.window.bg, windowLocal.tileData, windowSize, windowLocal.window.baseBlock); CopyBgTilemapBufferToVram(windowLocal.window.bg); break; diff --git a/src/window_8bpp.c b/src/window_8bpp.c index a96785339..77bddf2c7 100644 --- a/src/window_8bpp.c +++ b/src/window_8bpp.c @@ -107,7 +107,7 @@ void CopyWindowToVram8Bit(u8 windowId, u8 mode) case COPYWIN_GFX: LoadBgTiles(sWindowPtr->window.bg, sWindowPtr->tileData, sWindowSize, sWindowPtr->window.baseBlock); break; - case COPYWIN_BOTH: + case COPYWIN_FULL: LoadBgTiles(sWindowPtr->window.bg, sWindowPtr->tileData, sWindowSize, sWindowPtr->window.baseBlock); CopyBgTilemapBufferToVram(sWindowPtr->window.bg); break; diff --git a/src/wireless_communication_status_screen.c b/src/wireless_communication_status_screen.c index f22564e47..026654e81 100644 --- a/src/wireless_communication_status_screen.c +++ b/src/wireless_communication_status_screen.c @@ -292,7 +292,7 @@ static void Task_WirelessCommunicationScreen(u8 taskId) WCSS_AddTextPrinterParameterized(2, 3, gStringVar4, 4, 100, 2); } PutWindowTilemap(2); - CopyWindowToVram(2, COPYWIN_BOTH); + CopyWindowToVram(2, COPYWIN_FULL); } if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON)) {