From 92dd1f106bcf47fbcf310fdf0f246c8c22b97aed Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Sun, 28 Jul 2019 18:28:15 -0500 Subject: match atk49_moveend --- asmdiff.sh | 2 +- include/battle.h | 4 +- include/constants/battle.h | 348 +++++++ include/constants/battle_constants.h | 348 ------- src/battle/anim/battle_intro.c | 2 +- src/battle/anim/current.c | 2 +- src/battle/anim/dark.c | 2 +- src/battle/anim/fight.c | 2 +- src/battle/anim/ghost.c | 2 +- src/battle/anim/ice.c | 2 +- src/battle/anim/normal.c | 2 +- src/battle/battle_2.c | 1 - src/battle/battle_4.c | 1860 +++++++--------------------------- src/battle/battle_ai_switch_items.c | 1 - src/pokemon_item_effect.c | 2 +- 15 files changed, 714 insertions(+), 1866 deletions(-) create mode 100644 include/constants/battle.h delete mode 100644 include/constants/battle_constants.h diff --git a/asmdiff.sh b/asmdiff.sh index 4654b2101..414a43826 100755 --- a/asmdiff.sh +++ b/asmdiff.sh @@ -4,4 +4,4 @@ OBJDUMP="$DEVKITARM/bin/arm-none-eabi-objdump -D -bbinary -marmv4t -Mforce-thumb OPTIONS="--start-address=$(($1)) --stop-address=$(($1 + $2))" $OBJDUMP $OPTIONS baserom.gba > baserom.dump $OBJDUMP $OPTIONS pokeruby.gba > pokeruby.dump -diff -u baserom.dump pokeruby.dump | less +colordiff -u baserom.dump pokeruby.dump diff --git a/include/battle.h b/include/battle.h index a799f8360..78b9d13de 100644 --- a/include/battle.h +++ b/include/battle.h @@ -2,7 +2,7 @@ #define GUARD_BATTLE_H #include "sprite.h" -#include "constants/battle_constants.h" +#include "constants/battle.h" #include "battle_setup.h" #define GET_BATTLER_POSITION(bank)((gBattlerPositions[bank])) @@ -762,6 +762,8 @@ extern u16 gBattle_WIN0V; extern u16 gBattle_WIN1H; extern u16 gBattle_WIN1V; +extern u8 gLastHitBy[MAX_BATTLERS_COUNT]; + extern u8 gDisplayedStringBattle[]; extern u16 gBattleTypeFlags; diff --git a/include/constants/battle.h b/include/constants/battle.h new file mode 100644 index 000000000..afa7fecf1 --- /dev/null +++ b/include/constants/battle.h @@ -0,0 +1,348 @@ +#ifndef GUARD_CONSTANTS_BATTLE_CONSTANTS_H +#define GUARD_CONSTANTS_BATTLE_CONSTANTS_H + +/* + * A battler may be in one of four positions on the field. The first bit determines + * what side the battler is on, either the player's side or the opponent's side. + * The second bit determines what flank the battler is on, either the left or right. + * Note that the opponent's flanks are drawn corresponding to their perspective, so + * their right mon appears on the left, and their left mon appears on the right. + * The battler ID is usually the same as the position, except in the case of link battles. + * + * + ------------------------- + + * | Opponent's side | + * | Right Left | + * | 3 1 | + * | | + * | Player's side | + * | Left Right | + * | 0 2 | + * ----------------------------+ + * | | + * | | + * +---------------------------+ + */ + +#define MAX_BATTLERS_COUNT 4 + +#define B_POSITION_PLAYER_LEFT 0 +#define B_POSITION_OPPONENT_LEFT 1 +#define B_POSITION_PLAYER_RIGHT 2 +#define B_POSITION_OPPONENT_RIGHT 3 + +// These macros can be used with either battler ID or positions to get the partner or the opposite mon +#define BATTLE_OPPOSITE(id) ((id) ^ 1) +#define BATTLE_PARTNER(id) ((id) ^ 2) + +#define B_SIDE_PLAYER 0 +#define B_SIDE_OPPONENT 1 + +#define B_FLANK_LEFT 0 +#define B_FLANK_RIGHT 1 + +#define BIT_SIDE 1 +#define BIT_FLANK 2 + +#define STATUS_SLEEP 0x7 +#define STATUS_POISON 0x8 +#define STATUS_BURN 0x10 +#define STATUS_FREEZE 0x20 +#define STATUS_PARALYSIS 0x40 +#define STATUS_TOXIC_POISON 0x80 +#define STATUS_TOXIC_COUNTER 0xF00 + +#define STATUS_PSN_ANY ((STATUS_POISON | STATUS_TOXIC_POISON)) +#define STATUS_ANY ((STATUS_SLEEP | STATUS_POISON | STATUS_BURN | STATUS_FREEZE | STATUS_PARALYSIS | STATUS_TOXIC_POISON)) + +#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 +#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 STATUS3_LEECHSEED_BANK 0x3 +#define STATUS3_LEECHSEED 0x4 +#define STATUS3_ALWAYS_HITS 0x18 //two bits +#define STATUS3_PERISH_SONG 0x20 +#define STATUS3_ON_AIR 0x40 +#define STATUS3_UNDERGROUND 0x80 +#define STATUS3_MINIMIZED 0x100 +#define STATUS3_ROOTED 0x400 +#define STATUS3_CHARGED_UP 0x200 +#define STATUS3_YAWN 0x1800 //two bits +#define STATUS3_IMPRISIONED 0x2000 +#define STATUS3_GRUDGE 0x4000 +#define STATUS3_CANT_SCORE_A_CRIT 0x8000 +#define STATUS3_MUDSPORT 0x10000 +#define STATUS3_WATERSPORT 0x20000 +#define STATUS3_UNDERWATER 0x40000 +#define STATUS3_INTIMIDATE_POKES 0x80000 +#define STATUS3_TRACE 0x100000 + +#define STATUS3_SEMI_INVULNERABLE ((STATUS3_UNDERGROUND | STATUS3_ON_AIR | STATUS3_UNDERWATER)) + +#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_PURSUIT_TRAP 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_x100000 0x00100000 +#define HITMARKER_x200000 0x00200000 +#define HITMARKER_x400000 0x00400000 +#define HITMARKER_x800000 0x00800000 +#define HITMARKER_GRUDGE 0x01000000 +#define HITMARKER_OBEYS 0x02000000 +#define HITMARKER_x4000000 0x04000000 +#define HITMARKER_x8000000 0x08000000 +#define HITMARKER_FAINTED(bank) ((gBitTable[bank] << 0x1C)) +#define HITMARKER_UNK(bank) ((0x10000000 << bank)) + +// Flags describing move's result +#define MOVE_RESULT_MISSED (1 << 0) +#define MOVE_RESULT_SUPER_EFFECTIVE (1 << 1) +#define MOVE_RESULT_NOT_VERY_EFFECTIVE (1 << 2) +#define MOVE_RESULT_DOESNT_AFFECT_FOE (1 << 3) +#define MOVE_RESULT_ONE_HIT_KO (1 << 4) +#define MOVE_RESULT_FAILED (1 << 5) +#define MOVE_RESULT_FOE_ENDURED (1 << 6) +#define MOVE_RESULT_FOE_HUNG_ON (1 << 7) +#define MOVE_RESULT_NO_EFFECT (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE | MOVE_RESULT_FAILED) + +#define BATTLE_TYPE_DOUBLE 0x0001 +#define BATTLE_TYPE_LINK 0x0002 +#define BATTLE_TYPE_WILD 0x0004 +#define BATTLE_TYPE_TRAINER 0x0008 +#define BATTLE_TYPE_FIRST_BATTLE 0x0010 +#define BATTLE_TYPE_20 0x0020 +#define BATTLE_TYPE_MULTI 0x0040 +#define BATTLE_TYPE_SAFARI 0x0080 +#define BATTLE_TYPE_BATTLE_TOWER 0x0100 +#define BATTLE_TYPE_WALLY_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_REGI 0x4000 +#define BATTLE_TYPE_LINK_DOUBLE (BATTLE_TYPE_MULTI | BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK | BATTLE_TYPE_DOUBLE) + +#define SECRET_BASE_OPPONENT 0x400 +#define LINK_BATTLE_OPPONENT 0x800 + +#define BATTLE_WON 0x1 +#define BATTLE_LOST 0x2 +#define BATTLE_DREW 0x3 +#define BATTLE_RAN 0x4 +#define BATTLE_PLAYER_TELEPORTED 0x5 +#define BATTLE_POKE_FLED 0x6 +#define BATTLE_CAUGHT 0x7 +#define BATTLE_OUT_OF_BALLS 0x8 +#define BATTLE_OPPONENT_TELEPORTED 0xA + +#define OUTCOME_LINK_BATTLE_RUN 0x80 + +#define SIDE_STATUS_REFLECT (1 << 0) +#define SIDE_STATUS_LIGHTSCREEN (1 << 1) +#define SIDE_STATUS_X4 (1 << 2) +#define SIDE_STATUS_SPIKES (1 << 4) +#define SIDE_STATUS_SAFEGUARD (1 << 5) +#define SIDE_STATUS_FUTUREATTACK (1 << 6) +#define SIDE_STATUS_MIST (1 << 8) +#define SIDE_STATUS_SPIKES_DAMAGED (1 << 9) + +#define ACTION_USE_MOVE 0 +#define ACTION_USE_ITEM 1 +#define ACTION_SWITCH 2 +#define ACTION_RUN 3 +#define ACTION_WATCHES_CAREFULLY 4 +#define ACTION_SAFARI_ZONE_BALL 5 +#define ACTION_POKEBLOCK_CASE 6 +#define ACTION_GO_NEAR 7 +#define ACTION_SAFARI_ZONE_RUN 8 +#define ACTION_9 9 +#define ACTION_RUN_BATTLESCRIPT 10 // when executing an action +#define ACTION_CANCEL_PARTNER 12 // when choosing an action +#define ACTION_FINISHED 12 // when executing an action +#define ACTION_NOTHING_FAINTED 13 // when choosing an action +#define ACTION_INIT_VALUE 0xFF + +#define TARGET_SELECTED_POKEMON 0 +#define TARGET_SPECIAL (1 << 0) +#define TARGET_UNK2 (1 << 1) +#define TARGET_RANDOM (1 << 2) +#define TARGET_BOTH_ENEMIES (1 << 3) +#define TARGET_USER (1 << 4) +#define TARGET_ALL_EXCEPT_USER (1 << 5) +#define TARGET_ENEMY_SIDE (1 << 6) + +#define F_MAKES_CONTACT (1 << 0) +#define F_AFFECTED_BY_PROTECT (1 << 1) +#define F_AFFECTED_BY_MAGIC_COAT (1 << 2) +#define F_AFFECTED_BY_SNATCH (1 << 3) +#define F_MIRROR_MOVE_COMPATIBLE (1 << 4) +#define F_AFFECTED_BY_KINGS_ROCK (1 << 5) + +#define AI_ACTION_DONE 0x0001 +#define AI_ACTION_FLEE 0x0002 +#define AI_ACTION_WATCH 0x0004 +#define AI_ACTION_DO_NOT_ATTACK 0x0008 +#define AI_ACTION_UNK5 0x0010 +#define AI_ACTION_UNK6 0x0020 +#define AI_ACTION_UNK7 0x0040 +#define AI_ACTION_UNK8 0x0080 + +#define ABILITYEFFECT_ON_SWITCHIN 0x0 +#define ABILITYEFFECT_ENDTURN 0x1 +#define ABILITYEFFECT_MOVES_BLOCK 0x2 +#define ABILITYEFFECT_ABSORBING 0x3 +#define ABILITYEFFECT_CONTACT 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_BANK_SIDE 0xD +#define ABILITYEFFECT_FIELD_SPORT 0xE +#define ABILITYEFFECT_CHECK_FIELD_EXCEPT_BANK 0xF +#define ABILITYEFFECT_COUNT_OTHER_SIZE 0x10 +#define ABILITYEFFECT_COUNT_BANK_SIDE 0x11 +#define ABILITYEFFECT_COUNT_ON_FIELD 0x12 +#define ABILITYEFFECT_CHECK_ON_FIELD 0x13 + +#define WEATHER_HAS_EFFECT ((!AbilityBattleEffects(ABILITYEFFECT_CHECK_ON_FIELD, 0, ABILITY_CLOUD_NINE, 0, 0) && !AbilityBattleEffects(ABILITYEFFECT_CHECK_ON_FIELD, 0, ABILITY_AIR_LOCK, 0, 0))) + +#define MAX_TRAINER_ITEMS 4 +#define MAX_MON_MOVES 4 + +// Battle Weather flags +#define WEATHER_RAIN_TEMPORARY (1 << 0) +#define WEATHER_RAIN_DOWNPOUR (1 << 1) // unused +#define WEATHER_RAIN_PERMANENT (1 << 2) +#define WEATHER_RAIN_ANY (WEATHER_RAIN_TEMPORARY | WEATHER_RAIN_DOWNPOUR | WEATHER_RAIN_PERMANENT) +#define WEATHER_SANDSTORM_TEMPORARY (1 << 3) +#define WEATHER_SANDSTORM_PERMANENT (1 << 4) +#define WEATHER_SANDSTORM_ANY (WEATHER_SANDSTORM_TEMPORARY | WEATHER_SANDSTORM_PERMANENT) +#define WEATHER_SUN_TEMPORARY (1 << 5) +#define WEATHER_SUN_PERMANENT (1 << 6) +#define WEATHER_SUN_ANY (WEATHER_SUN_TEMPORARY | WEATHER_SUN_PERMANENT) +#define WEATHER_HAIL (1 << 7) +#define WEATHER_HAIL_ANY (WEATHER_HAIL) +#define WEATHER_ANY (WEATHER_RAIN_ANY | WEATHER_SANDSTORM_ANY | WEATHER_SUN_ANY | WEATHER_HAIL_ANY) + +#define MOVE_TARGET_SELECTED 0x0 +#define MOVE_TARGET_DEPENDS 0x1 +#define MOVE_TARGET_USER 0x2 +#define MOVE_TARGET_RANDOM 0x4 +#define MOVE_TARGET_x10 0x10 +#define MOVE_TARGET_BOTH 0x8 +#define MOVE_TARGET_FOES_AND_ALLY 0x20 +#define MOVE_TARGET_OPPONENTS_FIELD 0x40 + +// 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 BS_GET_TARGET 0 +#define BS_GET_ATTACKER 1 +#define BS_GET_EFFECT_BANK 2 +#define BS_GET_gBank1 3 +#define BS_GET_BANK_0 7 +#define BS_ATTACKER_WITH_PARTNER 4 // for atk98_status_icon_update +#define BS_GET_ATTACKER_SIDE 8 // for atk1E_jumpifability +#define BS_GET_NOT_ATTACKER_SIDE 9 // for atk1E_jumpifability +#define BS_GET_SCRIPTING_BANK 10 +#define BS_GET_OPPONENT1 12 +#define BS_GET_PLAYER2 13 +#define BS_GET_OPPONENT2 14 + +// status animation table +#define B_ANIM_STATUS_PSN 0x0 +#define B_ANIM_STATUS_CONFUSION 0x1 +#define B_ANIM_STATUS_BRN 0x2 +#define B_ANIM_STATUS_INFATUATION 0x3 +#define B_ANIM_STATUS_SLP 0x4 +#define B_ANIM_STATUS_PRZ 0x5 +#define B_ANIM_STATUS_FRZ 0x6 +#define B_ANIM_STATUS_CURSED 0x7 +#define B_ANIM_STATUS_NIGHTMARE 0x8 +#define B_ANIM_STATUS_WRAPPED 0x9 + +// general animation table +#define B_ANIM_CASTFORM_CHANGE 0x0 +#define B_ANIM_STATS_CHANGE 0x1 +#define B_ANIM_SUBSTITUTE_FADE 0x2 +#define B_ANIM_SUBSTITUTE_APPEAR 0x3 +#define B_ANIM_POKEBLOCK_THROW 0x4 +#define B_ANIM_ITEM_KNOCKOFF 0x5 +#define B_ANIM_TURN_TRAP 0x6 +#define B_ANIM_ITEM_EFFECT 0x7 +#define B_ANIM_SMOKEBALL_ESCAPE 0x8 +#define B_ANIM_HANGED_ON 0x9 +#define B_ANIM_RAIN_CONTINUES 0xA +#define B_ANIM_SUN_CONTINUES 0xB +#define B_ANIM_SANDSTORM_CONTINUES 0xC +#define B_ANIM_HAIL_CONTINUES 0xD +#define B_ANIM_LEECH_SEED_DRAIN 0xE +#define B_ANIM_MON_HIT 0xF +#define B_ANIM_ITEM_STEAL 0x10 +#define B_ANIM_SNATCH_MOVE 0x11 +#define B_ANIM_FUTURE_SIGHT_HIT 0x12 +#define B_ANIM_DOOM_DESIRE_HIT 0x13 +#define B_ANIM_FOCUS_PUNCH_SET_UP 0x14 +#define B_ANIM_INGRAIN_HEAL 0x15 +#define B_ANIM_WISH_HEAL 0x16 + +// special animation table +#define B_ANIM_LVL_UP 0x0 +#define B_ANIM_SWITCH_OUT_PLAYER_MON 0x1 +#define B_ANIM_SWITCH_OUT_OPPONENT_MON 0x2 +#define B_ANIM_BALL_THROW 0x3 +#define B_ANIM_SAFARI_BALL_THROW 0x4 +#define B_ANIM_SUBSTITUTE_TO_MON 0x5 +#define B_ANIM_MON_TO_SUBSTITUTE 0x6 + +// AI switch items +#define AI_ITEM_FULL_RESTORE 1 +#define AI_ITEM_HEAL_HP 2 +#define AI_ITEM_CURE_CONDITION 3 +#define AI_ITEM_X_STAT 4 +#define AI_ITEM_GUARD_SPECS 5 +#define AI_ITEM_NOT_RECOGNIZABLE 6 + +#endif // GUARD_CONSTANTS_BATTLE_CONSTANTS_H diff --git a/include/constants/battle_constants.h b/include/constants/battle_constants.h deleted file mode 100644 index afa7fecf1..000000000 --- a/include/constants/battle_constants.h +++ /dev/null @@ -1,348 +0,0 @@ -#ifndef GUARD_CONSTANTS_BATTLE_CONSTANTS_H -#define GUARD_CONSTANTS_BATTLE_CONSTANTS_H - -/* - * A battler may be in one of four positions on the field. The first bit determines - * what side the battler is on, either the player's side or the opponent's side. - * The second bit determines what flank the battler is on, either the left or right. - * Note that the opponent's flanks are drawn corresponding to their perspective, so - * their right mon appears on the left, and their left mon appears on the right. - * The battler ID is usually the same as the position, except in the case of link battles. - * - * + ------------------------- + - * | Opponent's side | - * | Right Left | - * | 3 1 | - * | | - * | Player's side | - * | Left Right | - * | 0 2 | - * ----------------------------+ - * | | - * | | - * +---------------------------+ - */ - -#define MAX_BATTLERS_COUNT 4 - -#define B_POSITION_PLAYER_LEFT 0 -#define B_POSITION_OPPONENT_LEFT 1 -#define B_POSITION_PLAYER_RIGHT 2 -#define B_POSITION_OPPONENT_RIGHT 3 - -// These macros can be used with either battler ID or positions to get the partner or the opposite mon -#define BATTLE_OPPOSITE(id) ((id) ^ 1) -#define BATTLE_PARTNER(id) ((id) ^ 2) - -#define B_SIDE_PLAYER 0 -#define B_SIDE_OPPONENT 1 - -#define B_FLANK_LEFT 0 -#define B_FLANK_RIGHT 1 - -#define BIT_SIDE 1 -#define BIT_FLANK 2 - -#define STATUS_SLEEP 0x7 -#define STATUS_POISON 0x8 -#define STATUS_BURN 0x10 -#define STATUS_FREEZE 0x20 -#define STATUS_PARALYSIS 0x40 -#define STATUS_TOXIC_POISON 0x80 -#define STATUS_TOXIC_COUNTER 0xF00 - -#define STATUS_PSN_ANY ((STATUS_POISON | STATUS_TOXIC_POISON)) -#define STATUS_ANY ((STATUS_SLEEP | STATUS_POISON | STATUS_BURN | STATUS_FREEZE | STATUS_PARALYSIS | STATUS_TOXIC_POISON)) - -#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 -#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 STATUS3_LEECHSEED_BANK 0x3 -#define STATUS3_LEECHSEED 0x4 -#define STATUS3_ALWAYS_HITS 0x18 //two bits -#define STATUS3_PERISH_SONG 0x20 -#define STATUS3_ON_AIR 0x40 -#define STATUS3_UNDERGROUND 0x80 -#define STATUS3_MINIMIZED 0x100 -#define STATUS3_ROOTED 0x400 -#define STATUS3_CHARGED_UP 0x200 -#define STATUS3_YAWN 0x1800 //two bits -#define STATUS3_IMPRISIONED 0x2000 -#define STATUS3_GRUDGE 0x4000 -#define STATUS3_CANT_SCORE_A_CRIT 0x8000 -#define STATUS3_MUDSPORT 0x10000 -#define STATUS3_WATERSPORT 0x20000 -#define STATUS3_UNDERWATER 0x40000 -#define STATUS3_INTIMIDATE_POKES 0x80000 -#define STATUS3_TRACE 0x100000 - -#define STATUS3_SEMI_INVULNERABLE ((STATUS3_UNDERGROUND | STATUS3_ON_AIR | STATUS3_UNDERWATER)) - -#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_PURSUIT_TRAP 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_x100000 0x00100000 -#define HITMARKER_x200000 0x00200000 -#define HITMARKER_x400000 0x00400000 -#define HITMARKER_x800000 0x00800000 -#define HITMARKER_GRUDGE 0x01000000 -#define HITMARKER_OBEYS 0x02000000 -#define HITMARKER_x4000000 0x04000000 -#define HITMARKER_x8000000 0x08000000 -#define HITMARKER_FAINTED(bank) ((gBitTable[bank] << 0x1C)) -#define HITMARKER_UNK(bank) ((0x10000000 << bank)) - -// Flags describing move's result -#define MOVE_RESULT_MISSED (1 << 0) -#define MOVE_RESULT_SUPER_EFFECTIVE (1 << 1) -#define MOVE_RESULT_NOT_VERY_EFFECTIVE (1 << 2) -#define MOVE_RESULT_DOESNT_AFFECT_FOE (1 << 3) -#define MOVE_RESULT_ONE_HIT_KO (1 << 4) -#define MOVE_RESULT_FAILED (1 << 5) -#define MOVE_RESULT_FOE_ENDURED (1 << 6) -#define MOVE_RESULT_FOE_HUNG_ON (1 << 7) -#define MOVE_RESULT_NO_EFFECT (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE | MOVE_RESULT_FAILED) - -#define BATTLE_TYPE_DOUBLE 0x0001 -#define BATTLE_TYPE_LINK 0x0002 -#define BATTLE_TYPE_WILD 0x0004 -#define BATTLE_TYPE_TRAINER 0x0008 -#define BATTLE_TYPE_FIRST_BATTLE 0x0010 -#define BATTLE_TYPE_20 0x0020 -#define BATTLE_TYPE_MULTI 0x0040 -#define BATTLE_TYPE_SAFARI 0x0080 -#define BATTLE_TYPE_BATTLE_TOWER 0x0100 -#define BATTLE_TYPE_WALLY_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_REGI 0x4000 -#define BATTLE_TYPE_LINK_DOUBLE (BATTLE_TYPE_MULTI | BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK | BATTLE_TYPE_DOUBLE) - -#define SECRET_BASE_OPPONENT 0x400 -#define LINK_BATTLE_OPPONENT 0x800 - -#define BATTLE_WON 0x1 -#define BATTLE_LOST 0x2 -#define BATTLE_DREW 0x3 -#define BATTLE_RAN 0x4 -#define BATTLE_PLAYER_TELEPORTED 0x5 -#define BATTLE_POKE_FLED 0x6 -#define BATTLE_CAUGHT 0x7 -#define BATTLE_OUT_OF_BALLS 0x8 -#define BATTLE_OPPONENT_TELEPORTED 0xA - -#define OUTCOME_LINK_BATTLE_RUN 0x80 - -#define SIDE_STATUS_REFLECT (1 << 0) -#define SIDE_STATUS_LIGHTSCREEN (1 << 1) -#define SIDE_STATUS_X4 (1 << 2) -#define SIDE_STATUS_SPIKES (1 << 4) -#define SIDE_STATUS_SAFEGUARD (1 << 5) -#define SIDE_STATUS_FUTUREATTACK (1 << 6) -#define SIDE_STATUS_MIST (1 << 8) -#define SIDE_STATUS_SPIKES_DAMAGED (1 << 9) - -#define ACTION_USE_MOVE 0 -#define ACTION_USE_ITEM 1 -#define ACTION_SWITCH 2 -#define ACTION_RUN 3 -#define ACTION_WATCHES_CAREFULLY 4 -#define ACTION_SAFARI_ZONE_BALL 5 -#define ACTION_POKEBLOCK_CASE 6 -#define ACTION_GO_NEAR 7 -#define ACTION_SAFARI_ZONE_RUN 8 -#define ACTION_9 9 -#define ACTION_RUN_BATTLESCRIPT 10 // when executing an action -#define ACTION_CANCEL_PARTNER 12 // when choosing an action -#define ACTION_FINISHED 12 // when executing an action -#define ACTION_NOTHING_FAINTED 13 // when choosing an action -#define ACTION_INIT_VALUE 0xFF - -#define TARGET_SELECTED_POKEMON 0 -#define TARGET_SPECIAL (1 << 0) -#define TARGET_UNK2 (1 << 1) -#define TARGET_RANDOM (1 << 2) -#define TARGET_BOTH_ENEMIES (1 << 3) -#define TARGET_USER (1 << 4) -#define TARGET_ALL_EXCEPT_USER (1 << 5) -#define TARGET_ENEMY_SIDE (1 << 6) - -#define F_MAKES_CONTACT (1 << 0) -#define F_AFFECTED_BY_PROTECT (1 << 1) -#define F_AFFECTED_BY_MAGIC_COAT (1 << 2) -#define F_AFFECTED_BY_SNATCH (1 << 3) -#define F_MIRROR_MOVE_COMPATIBLE (1 << 4) -#define F_AFFECTED_BY_KINGS_ROCK (1 << 5) - -#define AI_ACTION_DONE 0x0001 -#define AI_ACTION_FLEE 0x0002 -#define AI_ACTION_WATCH 0x0004 -#define AI_ACTION_DO_NOT_ATTACK 0x0008 -#define AI_ACTION_UNK5 0x0010 -#define AI_ACTION_UNK6 0x0020 -#define AI_ACTION_UNK7 0x0040 -#define AI_ACTION_UNK8 0x0080 - -#define ABILITYEFFECT_ON_SWITCHIN 0x0 -#define ABILITYEFFECT_ENDTURN 0x1 -#define ABILITYEFFECT_MOVES_BLOCK 0x2 -#define ABILITYEFFECT_ABSORBING 0x3 -#define ABILITYEFFECT_CONTACT 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_BANK_SIDE 0xD -#define ABILITYEFFECT_FIELD_SPORT 0xE -#define ABILITYEFFECT_CHECK_FIELD_EXCEPT_BANK 0xF -#define ABILITYEFFECT_COUNT_OTHER_SIZE 0x10 -#define ABILITYEFFECT_COUNT_BANK_SIDE 0x11 -#define ABILITYEFFECT_COUNT_ON_FIELD 0x12 -#define ABILITYEFFECT_CHECK_ON_FIELD 0x13 - -#define WEATHER_HAS_EFFECT ((!AbilityBattleEffects(ABILITYEFFECT_CHECK_ON_FIELD, 0, ABILITY_CLOUD_NINE, 0, 0) && !AbilityBattleEffects(ABILITYEFFECT_CHECK_ON_FIELD, 0, ABILITY_AIR_LOCK, 0, 0))) - -#define MAX_TRAINER_ITEMS 4 -#define MAX_MON_MOVES 4 - -// Battle Weather flags -#define WEATHER_RAIN_TEMPORARY (1 << 0) -#define WEATHER_RAIN_DOWNPOUR (1 << 1) // unused -#define WEATHER_RAIN_PERMANENT (1 << 2) -#define WEATHER_RAIN_ANY (WEATHER_RAIN_TEMPORARY | WEATHER_RAIN_DOWNPOUR | WEATHER_RAIN_PERMANENT) -#define WEATHER_SANDSTORM_TEMPORARY (1 << 3) -#define WEATHER_SANDSTORM_PERMANENT (1 << 4) -#define WEATHER_SANDSTORM_ANY (WEATHER_SANDSTORM_TEMPORARY | WEATHER_SANDSTORM_PERMANENT) -#define WEATHER_SUN_TEMPORARY (1 << 5) -#define WEATHER_SUN_PERMANENT (1 << 6) -#define WEATHER_SUN_ANY (WEATHER_SUN_TEMPORARY | WEATHER_SUN_PERMANENT) -#define WEATHER_HAIL (1 << 7) -#define WEATHER_HAIL_ANY (WEATHER_HAIL) -#define WEATHER_ANY (WEATHER_RAIN_ANY | WEATHER_SANDSTORM_ANY | WEATHER_SUN_ANY | WEATHER_HAIL_ANY) - -#define MOVE_TARGET_SELECTED 0x0 -#define MOVE_TARGET_DEPENDS 0x1 -#define MOVE_TARGET_USER 0x2 -#define MOVE_TARGET_RANDOM 0x4 -#define MOVE_TARGET_x10 0x10 -#define MOVE_TARGET_BOTH 0x8 -#define MOVE_TARGET_FOES_AND_ALLY 0x20 -#define MOVE_TARGET_OPPONENTS_FIELD 0x40 - -// 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 BS_GET_TARGET 0 -#define BS_GET_ATTACKER 1 -#define BS_GET_EFFECT_BANK 2 -#define BS_GET_gBank1 3 -#define BS_GET_BANK_0 7 -#define BS_ATTACKER_WITH_PARTNER 4 // for atk98_status_icon_update -#define BS_GET_ATTACKER_SIDE 8 // for atk1E_jumpifability -#define BS_GET_NOT_ATTACKER_SIDE 9 // for atk1E_jumpifability -#define BS_GET_SCRIPTING_BANK 10 -#define BS_GET_OPPONENT1 12 -#define BS_GET_PLAYER2 13 -#define BS_GET_OPPONENT2 14 - -// status animation table -#define B_ANIM_STATUS_PSN 0x0 -#define B_ANIM_STATUS_CONFUSION 0x1 -#define B_ANIM_STATUS_BRN 0x2 -#define B_ANIM_STATUS_INFATUATION 0x3 -#define B_ANIM_STATUS_SLP 0x4 -#define B_ANIM_STATUS_PRZ 0x5 -#define B_ANIM_STATUS_FRZ 0x6 -#define B_ANIM_STATUS_CURSED 0x7 -#define B_ANIM_STATUS_NIGHTMARE 0x8 -#define B_ANIM_STATUS_WRAPPED 0x9 - -// general animation table -#define B_ANIM_CASTFORM_CHANGE 0x0 -#define B_ANIM_STATS_CHANGE 0x1 -#define B_ANIM_SUBSTITUTE_FADE 0x2 -#define B_ANIM_SUBSTITUTE_APPEAR 0x3 -#define B_ANIM_POKEBLOCK_THROW 0x4 -#define B_ANIM_ITEM_KNOCKOFF 0x5 -#define B_ANIM_TURN_TRAP 0x6 -#define B_ANIM_ITEM_EFFECT 0x7 -#define B_ANIM_SMOKEBALL_ESCAPE 0x8 -#define B_ANIM_HANGED_ON 0x9 -#define B_ANIM_RAIN_CONTINUES 0xA -#define B_ANIM_SUN_CONTINUES 0xB -#define B_ANIM_SANDSTORM_CONTINUES 0xC -#define B_ANIM_HAIL_CONTINUES 0xD -#define B_ANIM_LEECH_SEED_DRAIN 0xE -#define B_ANIM_MON_HIT 0xF -#define B_ANIM_ITEM_STEAL 0x10 -#define B_ANIM_SNATCH_MOVE 0x11 -#define B_ANIM_FUTURE_SIGHT_HIT 0x12 -#define B_ANIM_DOOM_DESIRE_HIT 0x13 -#define B_ANIM_FOCUS_PUNCH_SET_UP 0x14 -#define B_ANIM_INGRAIN_HEAL 0x15 -#define B_ANIM_WISH_HEAL 0x16 - -// special animation table -#define B_ANIM_LVL_UP 0x0 -#define B_ANIM_SWITCH_OUT_PLAYER_MON 0x1 -#define B_ANIM_SWITCH_OUT_OPPONENT_MON 0x2 -#define B_ANIM_BALL_THROW 0x3 -#define B_ANIM_SAFARI_BALL_THROW 0x4 -#define B_ANIM_SUBSTITUTE_TO_MON 0x5 -#define B_ANIM_MON_TO_SUBSTITUTE 0x6 - -// AI switch items -#define AI_ITEM_FULL_RESTORE 1 -#define AI_ITEM_HEAL_HP 2 -#define AI_ITEM_CURE_CONDITION 3 -#define AI_ITEM_X_STAT 4 -#define AI_ITEM_GUARD_SPECS 5 -#define AI_ITEM_NOT_RECOGNIZABLE 6 - -#endif // GUARD_CONSTANTS_BATTLE_CONSTANTS_H diff --git a/src/battle/anim/battle_intro.c b/src/battle/anim/battle_intro.c index a189b1425..c18f5790c 100644 --- a/src/battle/anim/battle_intro.c +++ b/src/battle/anim/battle_intro.c @@ -1,5 +1,5 @@ #include "global.h" -#include "constants/battle_constants.h" +#include "constants/battle.h" #include "battle.h" #include "battle_anim.h" #include "battle_anim_80CA710.h" diff --git a/src/battle/anim/current.c b/src/battle/anim/current.c index 9b447ce5a..23bf9373d 100644 --- a/src/battle/anim/current.c +++ b/src/battle/anim/current.c @@ -4,7 +4,7 @@ #include "rom_8077ABC.h" #include "sound.h" #include "trig.h" -#include "constants/battle_constants.h" +#include "constants/battle.h" #include "constants/songs.h" extern s16 gBattleAnimArgs[]; diff --git a/src/battle/anim/dark.c b/src/battle/anim/dark.c index 47f86b744..f98623ee6 100644 --- a/src/battle/anim/dark.c +++ b/src/battle/anim/dark.c @@ -9,7 +9,7 @@ #include "sound.h" #include "sprite.h" #include "trig.h" -#include "constants/battle_constants.h" +#include "constants/battle.h" extern s16 gBattleAnimArgs[]; extern u8 gBattleAnimAttacker; diff --git a/src/battle/anim/fight.c b/src/battle/anim/fight.c index f51a5c56c..6b8d8a3b5 100644 --- a/src/battle/anim/fight.c +++ b/src/battle/anim/fight.c @@ -5,7 +5,7 @@ #include "sprite.h" #include "task.h" #include "trig.h" -#include "constants/battle_constants.h" +#include "constants/battle.h" extern s16 gBattleAnimArgs[]; extern u8 gBankAttacker; diff --git a/src/battle/anim/ghost.c b/src/battle/anim/ghost.c index 52911f366..c4bbe8458 100644 --- a/src/battle/anim/ghost.c +++ b/src/battle/anim/ghost.c @@ -7,7 +7,7 @@ #include "scanline_effect.h" #include "sound.h" #include "trig.h" -#include "constants/battle_constants.h" +#include "constants/battle.h" #include "constants/songs.h" extern s16 gBattleAnimArgs[]; diff --git a/src/battle/anim/ice.c b/src/battle/anim/ice.c index fed21ebe9..76300df4b 100644 --- a/src/battle/anim/ice.c +++ b/src/battle/anim/ice.c @@ -4,7 +4,7 @@ #include "rom_8077ABC.h" #include "battle.h" #include "battle_anim.h" -#include "constants/battle_constants.h" +#include "constants/battle.h" #include "task.h" #include "decompress.h" #include "palette.h" diff --git a/src/battle/anim/normal.c b/src/battle/anim/normal.c index 4ac8737ad..b611ca62e 100644 --- a/src/battle/anim/normal.c +++ b/src/battle/anim/normal.c @@ -10,7 +10,7 @@ #include "sound.h" #include "task.h" #include "trig.h" -#include "constants/battle_constants.h" +#include "constants/battle.h" #include "constants/songs.h" extern s16 gBattleAnimArgs[]; diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index 411a1ae46..ee318351e 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -97,7 +97,6 @@ extern u16 gLastLandedMoves[]; extern u16 gLastHitByType[]; extern u16 gUnknown_02024C4C[]; extern u16 gLockedMoves[]; -extern u8 gLastHitBy[]; extern u16 gChosenMovesByBanks[]; extern u32 gHitMarker; extern u8 gUnknown_02024C70[]; diff --git a/src/battle/battle_4.c b/src/battle/battle_4.c index a84e16116..e7c821b39 100644 --- a/src/battle/battle_4.c +++ b/src/battle/battle_4.c @@ -5541,7 +5541,7 @@ static void atk23_getexp(void) gBattleResources_statsBeforeLvlUp->spd = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPEED); gBattleResources_statsBeforeLvlUp->spAtk = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPATK); gBattleResources_statsBeforeLvlUp->spDef = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPDEF); - + gActiveBattler = gBattleStruct->expGetterBank; EmitExpBarUpdate(0, gBattleStruct->expGetterID, gBattleMoveDamage); @@ -6687,1498 +6687,59 @@ _08021772:\n\ movs r0, 0x4\n\ ands r0, r1\n\ cmp r0, 0\n\ - beq _08021790\n\ - cmp r3, 0x1\n\ - bgt _08021790\n\ - adds r0, r2, 0x4\n\ - mov r1, r9\n\ - b _080217E6\n\ - .align 2, 0\n\ -_0802178C: .4byte gBattleMons+0x18 @ gBattleMons.statStages\n\ -_08021790:\n\ - cmp r3, 0\n\ - beq _080217E0\n\ - ldr r0, _080217D0 @ =gSharedMem\n\ - ldr r1, _080217D4 @ =0x000160dc\n\ - adds r4, r0, r1\n\ - ldrb r0, [r4]\n\ - cmp r0, 0\n\ - bne _080217E0\n\ - movs r0, 0\n\ - movs r1, 0x1\n\ - mov r2, r8\n\ - str r3, [sp]\n\ - bl EmitBattleAnimation\n\ - ldr r0, _080217D8 @ =gActiveBattler\n\ - ldrb r0, [r0]\n\ - bl MarkBufferBankForExecution\n\ - ldr r0, _080217DC @ =gBattlescriptCurrInstr\n\ - ldr r0, [r0]\n\ - ldrb r1, [r0, 0x3]\n\ - movs r0, 0x4\n\ - ands r0, r1\n\ - ldr r3, [sp]\n\ - cmp r0, 0\n\ - beq _080217CC\n\ - cmp r3, 0x1\n\ - ble _080217CC\n\ - movs r0, 0x1\n\ - strb r0, [r4]\n\ -_080217CC:\n\ - ldr r1, _080217DC @ =gBattlescriptCurrInstr\n\ - b _080217E2\n\ - .align 2, 0\n\ -_080217D0: .4byte gSharedMem\n\ -_080217D4: .4byte 0x000160dc\n\ -_080217D8: .4byte gActiveBattler\n\ -_080217DC: .4byte gBattlescriptCurrInstr\n\ -_080217E0:\n\ - mov r1, r9\n\ -_080217E2:\n\ - ldr r0, [r1]\n\ - adds r0, 0x4\n\ -_080217E6:\n\ - str r0, [r1]\n\ - add sp, 0x4\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .syntax divided"); -} - -#endif // NONMATCHING - -#ifdef NONMATCHING -static void atk49_moveend(void) -{ - int i; - int effect = 0; - u16 last_move = 0, *choiced_move_atk; - int arg1, arg2, hold_effect_atk, move_type; - if (gLastUsedMove != 0xFFFF) - last_move = gLastUsedMove; - - arg1 = T2_READ_8(gBattlescriptCurrInstr + 1); - arg2 = T2_READ_8(gBattlescriptCurrInstr + 2); - if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY) - hold_effect_atk = gEnigmaBerries[gBankAttacker].holdEffect; - else - hold_effect_atk = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item); - - choiced_move_atk = (u16*)(gBankAttacker * (ewram_addr + 0x160E8)); - if (gBattleStruct->dynamicMoveType) - move_type = gBattleStruct->dynamicMoveType & 0x3F; - else - move_type = gBattleMoves[gCurrentMove].type; - - do - { - switch (gBattleStruct->cmd49StateTracker) - { - case 0: //rage check - if (gBattleMons[gBankTarget].status2 & STATUS2_RAGE - && gBattleMons[gBankTarget].hp && gBankAttacker != gBankTarget - && GetBattlerSide(gBankAttacker) != GetBattlerSide(gBankTarget) - && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && TARGET_TURN_DAMAGED - && gBattleMoves[gCurrentMove].power && gBattleMons[gBankTarget].statStages[STAT_STAGE_ATK] <= 0xB) - { - gBattleMons[gBankTarget].statStages[STAT_STAGE_ATK]++; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_RageIsBuilding; - effect = 1; - } - gBattleStruct->cmd49StateTracker++; - break; - case 1: //defrosting check - if (gBattleMons[gBankTarget].status1 & STATUS_FREEZE - && gBattleMons[gBankTarget].hp && gBankAttacker != gBankTarget - && gSpecialStatuses[gBankTarget].moveturnLostHP - && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && move_type == TYPE_FIRE) - { - gBattleMons[gBankTarget].status1 &= ~(STATUS_FREEZE); - gActiveBattler = gBankTarget; - EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBankTarget].status1); - MarkBufferBankForExecution(gActiveBattler); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_DefrostedViaFireMove; - effect = 1; - } - gBattleStruct->cmd49StateTracker++; - break; - case 2: //target synchronize - if (AbilityBattleEffects(ABILITYEFFECT_SYNCHRONIZE, gBankTarget, 0, 0, 0)) - effect = 1; - gBattleStruct->cmd49StateTracker++; - break; - case 3: //contact abilities - if (AbilityBattleEffects(ABILITYEFFECT_CONTACT, gBankTarget, 0, 0, 0)) - effect = 1; - gBattleStruct->cmd49StateTracker++; - break; - case 4: //status immunities - if (AbilityBattleEffects(ABILITYEFFECT_IMMUNITY, 0, 0, 0, 0)) - effect = 1; //it loops through 4 banks, so we increment after its done with all banks - else - gBattleStruct->cmd49StateTracker++; - break; - case 5: //attacker synchronize - if (AbilityBattleEffects(ABILITYEFFECT_ATK_SYNCHRONIZE, gBankAttacker, 0, 0, 0)) - effect = 1; - gBattleStruct->cmd49StateTracker++; - break; - case 6: //update choice band move - if (gHitMarker & HITMARKER_OBEYS && hold_effect_atk == HOLD_EFFECT_CHOICE_BAND - && gLastUsedMove != MOVE_STRUGGLE && (*choiced_move_atk == 0 || *choiced_move_atk == 0xFFF) - && gLastUsedMove != MOVE_BATON_PASS && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) - { - *choiced_move_atk = gLastUsedMove; - for (i = 0; i < 4 && gBattleMons[gBankAttacker].moves[i] != *choiced_move_atk; i++){} - if (i == 4) - *choiced_move_atk = 0; - } - gBattleStruct->cmd49StateTracker++; - break; - case 7: //changed held items - for (i = 0; i < gBattlersCount; i++) - { - #define CHANGED_ITEM (((*u16)(gSharedMem + 0x160F0))) - if (CHANGED_ITEM(i)) - gBattleMons[i].item = CHANGED_ITEM(i); - } - gBattleStruct->cmd49StateTracker++; - break; - case 8: //make sprite invisible - if (gStatuses3[gBankAttacker] & (STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER) - && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) - { - gActiveBattler = gBankAttacker; - EmitSpriteInvisibility(0, 1); - MarkBufferBankForExecution(gActiveBattler); - } - gBattleStruct->cmd49StateTracker++; - break; - case 9: //semi-invlurneable attacker make visible - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) || !(gStatuses3[gBankAttacker] & (STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) - || WasUnableToUseMove(gBankAttacker)) - { - gActiveBattler = gBankAttacker; - EmitSpriteInvisibility(0, 0); - MarkBufferBankForExecution(gActiveBattler); - gStatuses3 &= ~(STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER); - gSpecialStatuses[gBankAttacker].restored_bank_sprite = 1; - } - gBattleStruct->cmd49StateTracker++; - break; - case 10: //semi-invlurneable target make visible - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) || !(gStatuses3[gBankTarget] & (STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) - || WasUnableToUseMove(gBankTarget)) - { - gActiveBattler = gBankTarget; - EmitSpriteInvisibility(0, 0); - MarkBufferBankForExecution(gActiveBattler); - gStatuses3 &= ~(STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER); - gSpecialStatuses[gBankTarget].restored_bank_sprite = 1; - } - gBattleStruct->cmd49StateTracker++; - break; - case 11: // - } - - } while (effect == 0) -} -#else -NAKED -void atk49_moveend(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x18\n\ - movs r0, 0\n\ - mov r10, r0\n\ - ldr r0, _08021834 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r0]\n\ - ldrb r1, [r0, 0x1]\n\ - str r1, [sp, 0x10]\n\ - ldrb r0, [r0, 0x2]\n\ - str r0, [sp, 0x14]\n\ - ldr r1, _08021838 @ =gBattleMons\n\ - ldr r0, _0802183C @ =gBankAttacker\n\ - ldrb r2, [r0]\n\ - movs r0, 0x58\n\ - muls r0, r2\n\ - adds r1, r0, r1\n\ - ldrh r0, [r1, 0x2E]\n\ - cmp r0, 0xAF\n\ - bne _08021844\n\ - ldr r1, _08021840 @ =gEnigmaBerries\n\ - lsls r0, r2, 3\n\ - subs r0, r2\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r0, [r0, 0x7]\n\ - b _0802184E\n\ - .align 2, 0\n\ -_08021834: .4byte gBattlescriptCurrInstr\n\ -_08021838: .4byte gBattleMons\n\ -_0802183C: .4byte gBankAttacker\n\ -_08021840: .4byte gEnigmaBerries\n\ -_08021844:\n\ - ldrh r0, [r1, 0x2E]\n\ - bl ItemId_GetHoldEffect\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ -_0802184E:\n\ - str r0, [sp, 0x8]\n\ - ldr r0, _0802186C @ =gBankAttacker\n\ - ldrb r1, [r0]\n\ - lsls r1, 1\n\ - ldr r0, _08021870 @ =gSharedMem + 0x160E8\n\ - adds r1, r0\n\ - str r1, [sp, 0xC]\n\ - subs r0, 0xCC\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - beq _080218C0\n\ - movs r2, 0x3F\n\ - ands r2, r0\n\ - str r2, [sp, 0x4]\n\ - b _080218D2\n\ - .align 2, 0\n\ -_0802186C: .4byte gBankAttacker\n\ -_08021870: .4byte gSharedMem + 0x160E8\n\ -_08021874:\n\ - strb r2, [r7]\n\ - ldr r0, [r5]\n\ - orrs r0, r6\n\ - str r0, [r5]\n\ - ldr r0, _080218AC @ =gSharedMem\n\ - ldr r3, _080218B0 @ =0x0001600c\n\ - adds r0, r3\n\ - strb r4, [r0]\n\ - bl MoveValuesCleanUp\n\ - ldr r2, _080218B4 @ =gBattleScriptsForMoveEffects\n\ - mov r4, r8\n\ - ldrh r1, [r4]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - add r0, r9\n\ - ldrb r0, [r0]\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - ldr r0, [r0]\n\ - bl BattleScriptPush\n\ - ldr r1, _080218B8 @ =gBattlescriptCurrInstr\n\ - ldr r0, _080218BC @ =gUnknown_081D9B2D\n\ - bl _0802229C\n\ - .align 2, 0\n\ -_080218AC: .4byte gSharedMem\n\ -_080218B0: .4byte 0x0001600c\n\ -_080218B4: .4byte gBattleScriptsForMoveEffects\n\ -_080218B8: .4byte gBattlescriptCurrInstr\n\ -_080218BC: .4byte gUnknown_081D9B2D\n\ -_080218C0:\n\ - ldr r2, _080218D8 @ =gBattleMoves\n\ - ldr r0, _080218DC @ =gCurrentMove\n\ - ldrh r1, [r0]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - ldrb r0, [r0, 0x2]\n\ - str r0, [sp, 0x4]\n\ -_080218D2:\n\ - ldr r5, _080218E0 @ =gSharedMem\n\ - mov r12, r5\n\ - b _080218EE\n\ - .align 2, 0\n\ -_080218D8: .4byte gBattleMoves\n\ -_080218DC: .4byte gCurrentMove\n\ -_080218E0: .4byte gSharedMem\n\ -_080218E4:\n\ - mov r0, r10\n\ - cmp r0, 0\n\ - beq _080218EE\n\ - bl _08022286\n\ -_080218EE:\n\ - ldr r0, _08021908 @ =0x0001600c\n\ - add r0, r12\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x11\n\ - bls _080218FC\n\ - bl _0802224E\n\ -_080218FC:\n\ - lsls r0, 2\n\ - ldr r1, _0802190C @ =_08021910\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ - .align 2, 0\n\ -_08021908: .4byte 0x0001600c\n\ -_0802190C: .4byte _08021910\n\ - .align 2, 0\n\ -_08021910:\n\ - .4byte _08021958\n\ - .4byte _08021A34\n\ - .4byte _08021AF0\n\ - .4byte _08021B20\n\ - .4byte _08021B44\n\ - .4byte _08021B78\n\ - .4byte _08021B9C\n\ - .4byte _08021C40\n\ - .4byte _08021C78\n\ - .4byte _08021CA8\n\ - .4byte _08021CCC\n\ - .4byte _08021D18\n\ - .4byte _08021DAC\n\ - .4byte _08021E30\n\ - .4byte _08021E70\n\ - .4byte _08022068\n\ - .4byte _080221C0\n\ - .4byte _0802224E\n\ -_08021958:\n\ - ldr r5, _08021A08 @ =gBattleMons\n\ - ldr r2, _08021A0C @ =gBankTarget\n\ - ldrb r4, [r2]\n\ - movs r6, 0x58\n\ - adds r3, r4, 0\n\ - muls r3, r6\n\ - adds r0, r5, 0\n\ - adds r0, 0x50\n\ - adds r0, r3, r0\n\ - ldr r1, [r0]\n\ - movs r0, 0x80\n\ - lsls r0, 16\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - beq _080219FE\n\ - adds r0, r3, r5\n\ - ldrh r0, [r0, 0x28]\n\ - cmp r0, 0\n\ - beq _080219FE\n\ - ldr r0, _08021A10 @ =gBankAttacker\n\ - ldrb r1, [r0]\n\ - cmp r1, r4\n\ - beq _080219FE\n\ - adds r0, r1, 0\n\ - bl GetBattlerSide\n\ - adds r4, r0, 0\n\ - ldr r1, _08021A0C @ =gBankTarget\n\ - ldrb r0, [r1]\n\ - bl GetBattlerSide\n\ - lsls r4, 24\n\ - lsls r0, 24\n\ - cmp r4, r0\n\ - beq _080219FE\n\ - ldr r0, _08021A14 @ =gMoveResultFlags\n\ - ldrb r1, [r0]\n\ - movs r0, 0x29\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _080219FE\n\ - ldr r2, _08021A18 @ =gProtectStructs\n\ - ldr r4, _08021A0C @ =gBankTarget\n\ - ldrb r3, [r4]\n\ - lsls r1, r3, 4\n\ - adds r0, r2, 0x4\n\ - adds r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - bne _080219C8\n\ - adds r0, r2, 0\n\ - adds r0, 0x8\n\ - adds r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - beq _080219FE\n\ -_080219C8:\n\ - ldr r2, _08021A1C @ =gBattleMoves\n\ - ldr r0, _08021A20 @ =gCurrentMove\n\ - ldrh r1, [r0]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - ldrb r0, [r0, 0x1]\n\ - cmp r0, 0\n\ - beq _080219FE\n\ - adds r0, r3, 0\n\ - muls r0, r6\n\ - adds r1, r0, r5\n\ - ldrb r2, [r1, 0x19]\n\ - movs r0, 0x19\n\ - ldrsb r0, [r1, r0]\n\ - cmp r0, 0xB\n\ - bgt _080219FE\n\ - adds r0, r2, 0x1\n\ - strb r0, [r1, 0x19]\n\ - bl BattleScriptPushCursor\n\ - ldr r1, _08021A24 @ =gBattlescriptCurrInstr\n\ - ldr r0, _08021A28 @ =BattleScript_RageIsBuilding\n\ - str r0, [r1]\n\ - movs r5, 0x1\n\ - mov r10, r5\n\ -_080219FE:\n\ - ldr r2, _08021A2C @ =gSharedMem\n\ - ldr r0, _08021A30 @ =0x0001600c\n\ - adds r1, r2, r0\n\ - b _08021E00\n\ - .align 2, 0\n\ -_08021A08: .4byte gBattleMons\n\ -_08021A0C: .4byte gBankTarget\n\ -_08021A10: .4byte gBankAttacker\n\ -_08021A14: .4byte gMoveResultFlags\n\ -_08021A18: .4byte gProtectStructs\n\ -_08021A1C: .4byte gBattleMoves\n\ -_08021A20: .4byte gCurrentMove\n\ -_08021A24: .4byte gBattlescriptCurrInstr\n\ -_08021A28: .4byte BattleScript_RageIsBuilding\n\ -_08021A2C: .4byte gSharedMem\n\ -_08021A30: .4byte 0x0001600c\n\ -_08021A34:\n\ - ldr r2, _08021AD0 @ =gBattleMons\n\ - ldr r1, _08021AD4 @ =gBankTarget\n\ - ldrb r4, [r1]\n\ - movs r3, 0x58\n\ - mov r12, r3\n\ - mov r3, r12\n\ - muls r3, r4\n\ - adds r7, r2, 0\n\ - adds r7, 0x4C\n\ - adds r6, r3, r7\n\ - ldr r5, [r6]\n\ - movs r0, 0x20\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - bne _08021A54\n\ - b _08021DFA\n\ -_08021A54:\n\ - adds r0, r3, r2\n\ - ldrh r0, [r0, 0x28]\n\ - cmp r0, 0\n\ - bne _08021A5E\n\ - b _08021DFA\n\ -_08021A5E:\n\ - ldr r0, _08021AD8 @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - cmp r0, r4\n\ - bne _08021A68\n\ - b _08021DFA\n\ -_08021A68:\n\ - ldr r0, _08021ADC @ =gSpecialStatuses\n\ - lsls r1, r4, 2\n\ - adds r1, r4\n\ - lsls r1, 2\n\ - adds r0, 0xC\n\ - adds r1, r0\n\ - ldr r0, [r1]\n\ - cmp r0, 0\n\ - bne _08021A7C\n\ - b _08021DFA\n\ -_08021A7C:\n\ - ldr r0, _08021AE0 @ =gMoveResultFlags\n\ - ldrb r1, [r0]\n\ - movs r0, 0x29\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08021A8A\n\ - b _08021DFA\n\ -_08021A8A:\n\ - ldr r4, [sp, 0x4]\n\ - cmp r4, 0xA\n\ - beq _08021A92\n\ - b _08021DFA\n\ -_08021A92:\n\ - movs r0, 0x21\n\ - negs r0, r0\n\ - ands r5, r0\n\ - str r5, [r6]\n\ - ldr r4, _08021AE4 @ =gActiveBattler\n\ - ldr r5, _08021AD4 @ =gBankTarget\n\ - ldrb r0, [r5]\n\ - strb r0, [r4]\n\ - ldrb r0, [r5]\n\ - mov r1, r12\n\ - muls r1, r0\n\ - adds r0, r1, 0\n\ - adds r0, r7\n\ - str r0, [sp]\n\ - movs r0, 0\n\ - movs r1, 0x28\n\ - movs r2, 0\n\ - movs r3, 0x4\n\ - bl EmitSetMonData\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - bl BattleScriptPushCursor\n\ - ldr r1, _08021AE8 @ =gBattlescriptCurrInstr\n\ - ldr r0, _08021AEC @ =BattleScript_DefrostedViaFireMove\n\ - str r0, [r1]\n\ - movs r2, 0x1\n\ - mov r10, r2\n\ - b _08021DFA\n\ - .align 2, 0\n\ -_08021AD0: .4byte gBattleMons\n\ -_08021AD4: .4byte gBankTarget\n\ -_08021AD8: .4byte gBankAttacker\n\ -_08021ADC: .4byte gSpecialStatuses\n\ -_08021AE0: .4byte gMoveResultFlags\n\ -_08021AE4: .4byte gActiveBattler\n\ -_08021AE8: .4byte gBattlescriptCurrInstr\n\ -_08021AEC: .4byte BattleScript_DefrostedViaFireMove\n\ -_08021AF0:\n\ - ldr r0, _08021B14 @ =gBankTarget\n\ - ldrb r1, [r0]\n\ - movs r0, 0\n\ - str r0, [sp]\n\ - movs r0, 0x7\n\ - movs r2, 0\n\ - movs r3, 0\n\ - bl AbilityBattleEffects\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08021B0C\n\ - movs r4, 0x1\n\ - mov r10, r4\n\ -_08021B0C:\n\ - ldr r2, _08021B18 @ =gSharedMem\n\ - ldr r5, _08021B1C @ =0x0001600c\n\ - adds r1, r2, r5\n\ - b _08021E00\n\ - .align 2, 0\n\ -_08021B14: .4byte gBankTarget\n\ -_08021B18: .4byte gSharedMem\n\ -_08021B1C: .4byte 0x0001600c\n\ -_08021B20:\n\ - ldr r0, _08021B40 @ =gBankTarget\n\ - ldrb r1, [r0]\n\ - movs r0, 0\n\ - str r0, [sp]\n\ - movs r0, 0x4\n\ - movs r2, 0\n\ - movs r3, 0\n\ - bl AbilityBattleEffects\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _08021B3A\n\ - b _08021DFA\n\ -_08021B3A:\n\ - movs r0, 0x1\n\ - mov r10, r0\n\ - b _08021DFA\n\ - .align 2, 0\n\ -_08021B40: .4byte gBankTarget\n\ -_08021B44:\n\ - movs r0, 0\n\ - str r0, [sp]\n\ - movs r0, 0x5\n\ - movs r1, 0\n\ - movs r2, 0\n\ - movs r3, 0\n\ - bl AbilityBattleEffects\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08021B68\n\ - movs r4, 0x1\n\ - mov r10, r4\n\ - ldr r5, _08021B64 @ =gSharedMem\n\ - mov r12, r5\n\ - b _0802224E\n\ - .align 2, 0\n\ -_08021B64: .4byte gSharedMem\n\ -_08021B68:\n\ - ldr r2, _08021B70 @ =gSharedMem\n\ - ldr r0, _08021B74 @ =0x0001600c\n\ - adds r1, r2, r0\n\ - b _08021E00\n\ - .align 2, 0\n\ -_08021B70: .4byte gSharedMem\n\ -_08021B74: .4byte 0x0001600c\n\ -_08021B78:\n\ - ldr r0, _08021B98 @ =gBankAttacker\n\ - ldrb r1, [r0]\n\ - movs r0, 0\n\ - str r0, [sp]\n\ - movs r0, 0x8\n\ - movs r2, 0\n\ - movs r3, 0\n\ - bl AbilityBattleEffects\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _08021B92\n\ - b _08021DFA\n\ -_08021B92:\n\ - movs r1, 0x1\n\ - mov r10, r1\n\ - b _08021DFA\n\ - .align 2, 0\n\ -_08021B98: .4byte gBankAttacker\n\ -_08021B9C:\n\ - ldr r0, _08021C28 @ =gHitMarker\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - lsls r1, 18\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08021BE0\n\ - ldr r4, [sp, 0x8]\n\ - cmp r4, 0x1D\n\ - bne _08021BE0\n\ - ldr r0, _08021C2C @ =gChosenMove\n\ - ldrh r2, [r0]\n\ - adds r7, r0, 0\n\ - cmp r2, 0xA5\n\ - beq _08021BE0\n\ - ldr r5, [sp, 0xC]\n\ - ldrh r1, [r5]\n\ - cmp r1, 0\n\ - beq _08021BC8\n\ - ldr r0, _08021C30 @ =0x0000ffff\n\ - cmp r1, r0\n\ - bne _08021BE0\n\ -_08021BC8:\n\ - cmp r2, 0xE2\n\ - bne _08021BDA\n\ - ldr r0, _08021C34 @ =gMoveResultFlags\n\ - ldrb r1, [r0]\n\ - movs r0, 0x20\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _08021BDA\n\ - b _08022244\n\ -_08021BDA:\n\ - ldrh r0, [r7]\n\ - ldr r1, [sp, 0xC]\n\ - strh r0, [r1]\n\ -_08021BE0:\n\ - movs r4, 0\n\ - ldr r2, _08021C38 @ =gBattleMons\n\ - ldr r3, _08021C3C @ =gBankAttacker\n\ - ldrb r1, [r3]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - adds r2, 0xC\n\ - adds r0, r2\n\ - ldrh r0, [r0]\n\ - ldr r5, [sp, 0xC]\n\ - ldrh r1, [r5]\n\ - mov r9, r3\n\ - cmp r0, r1\n\ - beq _08021C18\n\ - mov r6, r9\n\ - movs r3, 0x58\n\ - adds r5, r1, 0\n\ -_08021C02:\n\ - adds r4, 0x1\n\ - cmp r4, 0x3\n\ - bgt _08021C18\n\ - lsls r0, r4, 1\n\ - ldrb r1, [r6]\n\ - muls r1, r3\n\ - adds r0, r1\n\ - adds r0, r2\n\ - ldrh r0, [r0]\n\ - cmp r0, r5\n\ - bne _08021C02\n\ -_08021C18:\n\ - cmp r4, 0x4\n\ - beq _08021C1E\n\ - b _08022244\n\ -_08021C1E:\n\ - movs r0, 0\n\ - ldr r1, [sp, 0xC]\n\ -_08021C22:\n\ - strh r0, [r1]\n\ - b _08022244\n\ - .align 2, 0\n\ -_08021C28: .4byte gHitMarker\n\ -_08021C2C: .4byte gChosenMove\n\ -_08021C30: .4byte 0x0000ffff\n\ -_08021C34: .4byte gMoveResultFlags\n\ -_08021C38: .4byte gBattleMons\n\ -_08021C3C: .4byte gBankAttacker\n\ -_08021C40:\n\ - movs r4, 0\n\ - ldr r0, _08021C6C @ =gBattlersCount\n\ - ldrb r2, [r0]\n\ - cmp r4, r2\n\ - blt _08021C4C\n\ - b _08022244\n\ -_08021C4C:\n\ - movs r5, 0\n\ - ldr r2, _08021C70 @ =gSharedMem + 0x160F0\n\ - ldr r3, _08021C74 @ =gBattleMons\n\ -_08021C52:\n\ - ldrh r1, [r2]\n\ - cmp r1, 0\n\ - beq _08021C5C\n\ - strh r1, [r3, 0x2E]\n\ - strh r5, [r2]\n\ -_08021C5C:\n\ - adds r2, 0x2\n\ - adds r3, 0x58\n\ - adds r4, 0x1\n\ - ldrb r1, [r0]\n\ - cmp r4, r1\n\ - blt _08021C52\n\ - b _08022244\n\ - .align 2, 0\n\ -_08021C6C: .4byte gBattlersCount\n\ -_08021C70: .4byte gSharedMem + 0x160F0\n\ -_08021C74: .4byte gBattleMons\n\ -_08021C78:\n\ - movs r0, 0x3\n\ - movs r1, 0\n\ - movs r2, 0\n\ - bl ItemBattleEffects\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08021C98\n\ - movs r2, 0x1\n\ - mov r10, r2\n\ - ldr r3, _08021C94 @ =gSharedMem\n\ - mov r12, r3\n\ - b _0802224E\n\ - .align 2, 0\n\ -_08021C94: .4byte gSharedMem\n\ -_08021C98:\n\ - ldr r2, _08021CA0 @ =gSharedMem\n\ - ldr r4, _08021CA4 @ =0x0001600c\n\ - adds r1, r2, r4\n\ - b _08021E00\n\ - .align 2, 0\n\ -_08021CA0: .4byte gSharedMem\n\ -_08021CA4: .4byte 0x0001600c\n\ -_08021CA8:\n\ - movs r0, 0x4\n\ - movs r1, 0\n\ - movs r2, 0\n\ - bl ItemBattleEffects\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08021CBC\n\ - movs r5, 0x1\n\ - mov r10, r5\n\ -_08021CBC:\n\ - ldr r2, _08021CC4 @ =gSharedMem\n\ - ldr r0, _08021CC8 @ =0x0001600c\n\ - adds r1, r2, r0\n\ - b _08021E00\n\ - .align 2, 0\n\ -_08021CC4: .4byte gSharedMem\n\ -_08021CC8: .4byte 0x0001600c\n\ -_08021CCC:\n\ - ldr r1, _08021D04 @ =gStatuses3\n\ - ldr r0, _08021D08 @ =gBankAttacker\n\ - ldrb r2, [r0]\n\ - lsls r0, r2, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - ldr r1, _08021D0C @ =0x000400c0\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _08021CE2\n\ - b _08021DFA\n\ -_08021CE2:\n\ - ldr r0, _08021D10 @ =gHitMarker\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _08021CF0\n\ - b _08021DFA\n\ -_08021CF0:\n\ - ldr r4, _08021D14 @ =gActiveBattler\n\ - strb r2, [r4]\n\ - movs r0, 0\n\ - movs r1, 0x1\n\ - bl EmitSpriteInvisibility\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - b _08021DFA\n\ - .align 2, 0\n\ -_08021D04: .4byte gStatuses3\n\ -_08021D08: .4byte gBankAttacker\n\ -_08021D0C: .4byte 0x000400c0\n\ -_08021D10: .4byte gHitMarker\n\ -_08021D14: .4byte gActiveBattler\n\ -_08021D18:\n\ - ldr r0, _08021D88 @ =gMoveResultFlags\n\ - ldrb r1, [r0]\n\ - movs r0, 0x29\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _08021D44\n\ - ldr r1, _08021D8C @ =gStatuses3\n\ - ldr r0, _08021D90 @ =gBankAttacker\n\ - ldrb r2, [r0]\n\ - lsls r0, r2, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - ldr r1, _08021D94 @ =0x000400c0\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08021D44\n\ - adds r0, r2, 0\n\ - bl WasUnableToUseMove\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08021D7E\n\ -_08021D44:\n\ - ldr r4, _08021D98 @ =gActiveBattler\n\ - ldr r5, _08021D90 @ =gBankAttacker\n\ - ldrb r0, [r5]\n\ - strb r0, [r4]\n\ - movs r0, 0\n\ - movs r1, 0\n\ - bl EmitSpriteInvisibility\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - ldr r0, _08021D8C @ =gStatuses3\n\ - ldrb r2, [r5]\n\ - lsls r2, 2\n\ - adds r2, r0\n\ - ldr r0, [r2]\n\ - ldr r1, _08021D9C @ =0xfffbff3f\n\ - ands r0, r1\n\ - str r0, [r2]\n\ - ldr r2, _08021DA0 @ =gSpecialStatuses\n\ - ldrb r1, [r5]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - ldrb r1, [r0]\n\ - movs r2, 0x4\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ -_08021D7E:\n\ - ldr r2, _08021DA4 @ =gSharedMem\n\ - ldr r4, _08021DA8 @ =0x0001600c\n\ - adds r1, r2, r4\n\ - b _08021E00\n\ - .align 2, 0\n\ -_08021D88: .4byte gMoveResultFlags\n\ -_08021D8C: .4byte gStatuses3\n\ -_08021D90: .4byte gBankAttacker\n\ -_08021D94: .4byte 0x000400c0\n\ -_08021D98: .4byte gActiveBattler\n\ -_08021D9C: .4byte 0xfffbff3f\n\ -_08021DA0: .4byte gSpecialStatuses\n\ -_08021DA4: .4byte gSharedMem\n\ -_08021DA8: .4byte 0x0001600c\n\ -_08021DAC:\n\ - ldr r2, _08021E0C @ =gSpecialStatuses\n\ - ldr r1, _08021E10 @ =gBankTarget\n\ - ldrb r3, [r1]\n\ - lsls r4, r3, 2\n\ - adds r0, r4, r3\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - ldrb r0, [r0]\n\ - lsls r0, 29\n\ - cmp r0, 0\n\ - blt _08021DFA\n\ - ldr r0, _08021E14 @ =gBattlersCount\n\ - ldrb r0, [r0]\n\ - cmp r3, r0\n\ - bcs _08021DFA\n\ - ldr r5, _08021E18 @ =gStatuses3\n\ - adds r0, r4, r5\n\ - ldr r0, [r0]\n\ - ldr r1, _08021E1C @ =0x000400c0\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _08021DFA\n\ - ldr r4, _08021E20 @ =gActiveBattler\n\ - strb r3, [r4]\n\ - movs r0, 0\n\ - movs r1, 0\n\ - bl EmitSpriteInvisibility\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - ldr r0, _08021E10 @ =gBankTarget\n\ - ldrb r2, [r0]\n\ - lsls r2, 2\n\ - adds r2, r5\n\ - ldr r0, [r2]\n\ - ldr r1, _08021E24 @ =0xfffbff3f\n\ - ands r0, r1\n\ - str r0, [r2]\n\ -_08021DFA:\n\ - ldr r2, _08021E28 @ =gSharedMem\n\ - ldr r3, _08021E2C @ =0x0001600c\n\ - adds r1, r2, r3\n\ -_08021E00:\n\ - ldrb r0, [r1]\n\ - adds r0, 0x1\n\ - strb r0, [r1]\n\ - mov r12, r2\n\ - b _0802224E\n\ - .align 2, 0\n\ -_08021E0C: .4byte gSpecialStatuses\n\ -_08021E10: .4byte gBankTarget\n\ -_08021E14: .4byte gBattlersCount\n\ -_08021E18: .4byte gStatuses3\n\ -_08021E1C: .4byte 0x000400c0\n\ -_08021E20: .4byte gActiveBattler\n\ -_08021E24: .4byte 0xfffbff3f\n\ -_08021E28: .4byte gSharedMem\n\ -_08021E2C: .4byte 0x0001600c\n\ -_08021E30:\n\ - movs r4, 0\n\ - ldr r0, _08021E60 @ =gBattlersCount\n\ - ldrb r5, [r0]\n\ - cmp r4, r5\n\ - blt _08021E3C\n\ - b _08022244\n\ -_08021E3C:\n\ - ldr r2, _08021E64 @ =gDisableStructs\n\ - ldr r5, _08021E68 @ =0xfeffffff\n\ - adds r3, r0, 0\n\ - ldr r1, _08021E6C @ =gBattleMons+0x50\n\ -_08021E44:\n\ - ldrb r0, [r2, 0xA]\n\ - cmp r0, 0\n\ - bne _08021E50\n\ - ldr r0, [r1]\n\ - ands r0, r5\n\ - str r0, [r1]\n\ -_08021E50:\n\ - adds r2, 0x1C\n\ - adds r1, 0x58\n\ - adds r4, 0x1\n\ - ldrb r0, [r3]\n\ - cmp r4, r0\n\ - blt _08021E44\n\ - b _08022244\n\ - .align 2, 0\n\ -_08021E60: .4byte gBattlersCount\n\ -_08021E64: .4byte gDisableStructs\n\ -_08021E68: .4byte 0xfeffffff\n\ -_08021E6C: .4byte gBattleMons+0x50\n\ -_08021E70:\n\ - ldr r1, _08021F2C @ =gHitMarker\n\ - ldr r3, [r1]\n\ - movs r0, 0x80\n\ - lsls r0, 5\n\ - ands r0, r3\n\ - ldr r2, _08021F30 @ =gBankAttacker\n\ - mov r9, r2\n\ - adds r5, r1, 0\n\ - cmp r0, 0\n\ - beq _08021E9A\n\ - ldr r0, _08021F34 @ =gActiveBattler\n\ - ldrb r2, [r2]\n\ - strb r2, [r0]\n\ - ldr r1, _08021F38 @ =gBankTarget\n\ - ldrb r0, [r1]\n\ - mov r4, r9\n\ - strb r0, [r4]\n\ - strb r2, [r1]\n\ - ldr r0, _08021F3C @ =0xffffefff\n\ - ands r3, r0\n\ - str r3, [r5]\n\ -_08021E9A:\n\ - ldr r1, _08021F40 @ =gBattleMoves\n\ - ldr r2, _08021F44 @ =gChosenMove\n\ - ldrh r3, [r2]\n\ - lsls r0, r3, 1\n\ - adds r0, r3\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - mov r8, r1\n\ - adds r7, r2, 0\n\ - cmp r0, 0x7F\n\ - bne _08021EBE\n\ - ldr r0, _08021F48 @ =gMoveResultFlags\n\ - ldrb r1, [r0]\n\ - movs r0, 0x29\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08021ECA\n\ -_08021EBE:\n\ - ldr r1, _08021F4C @ =gUnknown_02024C2C\n\ - mov r2, r9\n\ - ldrb r0, [r2]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - strh r3, [r0]\n\ -_08021ECA:\n\ - ldr r0, _08021F50 @ =gAbsentBattlerFlags\n\ - ldrb r1, [r0]\n\ - ldr r2, _08021F54 @ =gBitTable\n\ - mov r3, r9\n\ - ldrb r4, [r3]\n\ - lsls r0, r4, 2\n\ - adds r0, r2\n\ - ldr r3, [r0]\n\ - ands r1, r3\n\ - adds r6, r2, 0\n\ - cmp r1, 0\n\ - beq _08021EE4\n\ - b _08022244\n\ -_08021EE4:\n\ - ldr r0, _08021F58 @ =0x000160a6\n\ - add r0, r12\n\ - ldrb r0, [r0]\n\ - ands r0, r3\n\ - cmp r0, 0\n\ - beq _08021EF2\n\ - b _08022244\n\ -_08021EF2:\n\ - ldrh r2, [r7]\n\ - lsls r0, r2, 1\n\ - adds r0, r2\n\ - lsls r0, 2\n\ - add r0, r8\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x7F\n\ - bne _08021F04\n\ - b _08022244\n\ -_08021F04:\n\ - ldr r0, [r5]\n\ - movs r1, 0x80\n\ - lsls r1, 18\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08021F68\n\ - ldr r1, _08021F5C @ =gLastUsedMove\n\ - lsls r0, r4, 1\n\ - adds r0, r1\n\ - strh r2, [r0]\n\ - ldr r0, _08021F60 @ =gUnknown_02024C4C\n\ - mov r4, r9\n\ - ldrb r1, [r4]\n\ - lsls r1, 1\n\ - adds r1, r0\n\ - ldr r0, _08021F64 @ =gCurrentMove\n\ - ldrh r0, [r0]\n\ - strh r0, [r1]\n\ - b _08021F82\n\ - .align 2, 0\n\ -_08021F2C: .4byte gHitMarker\n\ -_08021F30: .4byte gBankAttacker\n\ -_08021F34: .4byte gActiveBattler\n\ -_08021F38: .4byte gBankTarget\n\ -_08021F3C: .4byte 0xffffefff\n\ -_08021F40: .4byte gBattleMoves\n\ -_08021F44: .4byte gChosenMove\n\ -_08021F48: .4byte gMoveResultFlags\n\ -_08021F4C: .4byte gUnknown_02024C2C\n\ -_08021F50: .4byte gAbsentBattlerFlags\n\ -_08021F54: .4byte gBitTable\n\ -_08021F58: .4byte 0x000160a6\n\ -_08021F5C: .4byte gLastUsedMove\n\ -_08021F60: .4byte gUnknown_02024C4C\n\ -_08021F64: .4byte gCurrentMove\n\ -_08021F68:\n\ - ldr r1, _08021FD0 @ =gLastUsedMove\n\ - lsls r0, r4, 1\n\ - adds r0, r1\n\ - ldr r1, _08021FD4 @ =0x0000ffff\n\ - strh r1, [r0]\n\ - ldr r1, _08021FD8 @ =gUnknown_02024C4C\n\ - mov r2, r9\n\ - ldrb r0, [r2]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - movs r1, 0x1\n\ - negs r1, r1\n\ - strh r1, [r0]\n\ -_08021F82:\n\ - ldr r2, _08021FDC @ =gBankTarget\n\ - ldrb r3, [r2]\n\ - lsls r0, r3, 2\n\ - adds r0, r6\n\ - ldr r0, [r0]\n\ - lsls r0, 28\n\ - ldr r1, [r5]\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - bne _08021FA0\n\ - ldr r0, _08021FE0 @ =gLastHitBy\n\ - adds r0, r3, r0\n\ - mov r3, r9\n\ - ldrb r1, [r3]\n\ - strb r1, [r0]\n\ -_08021FA0:\n\ - ldr r0, [r5]\n\ - movs r1, 0x80\n\ - lsls r1, 18\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0802204C\n\ - ldr r0, _08021FE4 @ =gMoveResultFlags\n\ - ldrb r1, [r0]\n\ - movs r0, 0x29\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0802204C\n\ - ldrh r2, [r7]\n\ - ldr r0, _08021FD4 @ =0x0000ffff\n\ - cmp r2, r0\n\ - bne _08021FEC\n\ - ldr r1, _08021FE8 @ =gLastLandedMoves\n\ - ldr r4, _08021FDC @ =gBankTarget\n\ - ldrb r0, [r4]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - strh r2, [r0]\n\ - b _08022244\n\ - .align 2, 0\n\ -_08021FD0: .4byte gLastUsedMove\n\ -_08021FD4: .4byte 0x0000ffff\n\ -_08021FD8: .4byte gUnknown_02024C4C\n\ -_08021FDC: .4byte gBankTarget\n\ -_08021FE0: .4byte gLastHitBy\n\ -_08021FE4: .4byte gMoveResultFlags\n\ -_08021FE8: .4byte gLastLandedMoves\n\ -_08021FEC:\n\ - ldr r0, _08022014 @ =gLastLandedMoves\n\ - ldr r5, _08022018 @ =gBankTarget\n\ - ldrb r1, [r5]\n\ - lsls r1, 1\n\ - adds r1, r0\n\ - ldr r4, _0802201C @ =gCurrentMove\n\ - ldrh r0, [r4]\n\ - strh r0, [r1]\n\ - ldr r0, _08022020 @ =0x0001601c\n\ - add r0, r12\n\ - ldrb r3, [r0]\n\ - cmp r3, 0\n\ - beq _08022028\n\ - ldr r0, _08022024 @ =gLastHitByType\n\ - ldrb r1, [r5]\n\ - lsls r1, 1\n\ - adds r1, r0\n\ - movs r0, 0x3F\n\ - ands r0, r3\n\ - b _08021C22\n\ - .align 2, 0\n\ -_08022014: .4byte gLastLandedMoves\n\ -_08022018: .4byte gBankTarget\n\ -_0802201C: .4byte gCurrentMove\n\ -_08022020: .4byte 0x0001601c\n\ -_08022024: .4byte gLastHitByType\n\ -_08022028:\n\ - ldr r0, _08022044 @ =gLastHitByType\n\ - ldr r1, _08022048 @ =gBankTarget\n\ - ldrb r2, [r1]\n\ - lsls r2, 1\n\ - adds r2, r0\n\ - ldrh r1, [r4]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - add r0, r8\n\ - ldrb r0, [r0, 0x2]\n\ - strh r0, [r2]\n\ - b _08022244\n\ - .align 2, 0\n\ -_08022044: .4byte gLastHitByType\n\ -_08022048: .4byte gBankTarget\n\ -_0802204C:\n\ - ldr r0, _0802205C @ =gLastLandedMoves\n\ - ldr r2, _08022060 @ =gBankTarget\n\ - ldrb r1, [r2]\n\ - lsls r1, 1\n\ - adds r1, r0\n\ - ldr r0, _08022064 @ =0x0000ffff\n\ - b _08021C22\n\ - .align 2, 0\n\ -_0802205C: .4byte gLastLandedMoves\n\ -_08022060: .4byte gBankTarget\n\ -_08022064: .4byte 0x0000ffff\n\ -_08022068:\n\ - ldr r0, _0802212C @ =gAbsentBattlerFlags\n\ - ldrb r1, [r0]\n\ - ldr r6, _08022130 @ =gBitTable\n\ - ldr r2, _08022134 @ =gBankAttacker\n\ - ldrb r5, [r2]\n\ - lsls r0, r5, 2\n\ - adds r0, r6\n\ - ldr r4, [r0]\n\ - ands r1, r4\n\ - mov r9, r2\n\ - cmp r1, 0\n\ - beq _08022082\n\ - b _08022244\n\ -_08022082:\n\ - ldr r0, _08022138 @ =0x000160a6\n\ - add r0, r12\n\ - ldrb r0, [r0]\n\ - ands r0, r4\n\ - cmp r0, 0\n\ - beq _08022090\n\ - b _08022244\n\ -_08022090:\n\ - ldr r1, _0802213C @ =gBattleMoves\n\ - ldr r4, _08022140 @ =gChosenMove\n\ - ldrh r3, [r4]\n\ - lsls r0, r3, 1\n\ - adds r0, r3\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r1, [r0, 0x8]\n\ - movs r0, 0x10\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0802215C\n\ - ldr r0, _08022144 @ =gHitMarker\n\ - ldr r1, [r0]\n\ - movs r0, 0x80\n\ - lsls r0, 18\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0802215C\n\ - ldr r2, _08022148 @ =gBankTarget\n\ - ldrb r0, [r2]\n\ - cmp r5, r0\n\ - bne _080220C0\n\ - b _08022244\n\ -_080220C0:\n\ - adds r2, r0, 0\n\ - lsls r0, r2, 2\n\ - adds r0, r6\n\ - ldr r0, [r0]\n\ - lsls r0, 28\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - bne _0802215C\n\ - ldr r0, _0802214C @ =gMoveResultFlags\n\ - ldrb r1, [r0]\n\ - movs r0, 0x29\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0802215C\n\ - lsls r0, r2, 1\n\ - ldr r5, _08022150 @ =0x000160ac\n\ - adds r0, r5\n\ - add r0, r12\n\ - strb r3, [r0]\n\ - ldr r0, _08022148 @ =gBankTarget\n\ - ldrb r1, [r0]\n\ - lsls r1, 1\n\ - ldr r2, _08022154 @ =0x000160ad\n\ - adds r1, r2\n\ - add r1, r12\n\ - ldrh r0, [r4]\n\ - lsrs r0, 8\n\ - strb r0, [r1]\n\ - ldr r3, _08022148 @ =gBankTarget\n\ - ldrb r2, [r3]\n\ - lsls r2, 2\n\ - mov r5, r9\n\ - ldrb r0, [r5]\n\ - lsrs r0, 1\n\ - lsls r0, 1\n\ - ldr r1, _08022158 @ =0x00016100\n\ - adds r0, r1\n\ - adds r2, r0\n\ - add r2, r12\n\ - ldrh r0, [r4]\n\ - strb r0, [r2]\n\ - ldrb r2, [r3]\n\ - lsls r2, 2\n\ - ldrb r0, [r5]\n\ - lsrs r0, 1\n\ - lsls r0, 1\n\ - adds r1, 0x1\n\ - adds r0, r1\n\ - adds r2, r0\n\ - add r2, r12\n\ - ldrh r0, [r4]\n\ - lsrs r0, 8\n\ - strb r0, [r2]\n\ - b _08022244\n\ - .align 2, 0\n\ -_0802212C: .4byte gAbsentBattlerFlags\n\ -_08022130: .4byte gBitTable\n\ -_08022134: .4byte gBankAttacker\n\ -_08022138: .4byte 0x000160a6\n\ -_0802213C: .4byte gBattleMoves\n\ -_08022140: .4byte gChosenMove\n\ -_08022144: .4byte gHitMarker\n\ -_08022148: .4byte gBankTarget\n\ -_0802214C: .4byte gMoveResultFlags\n\ -_08022150: .4byte 0x000160ac\n\ -_08022154: .4byte 0x000160ad\n\ -_08022158: .4byte 0x00016100\n\ -_0802215C:\n\ - mov r1, r9\n\ - ldrb r0, [r1]\n\ - ldr r2, _080221B4 @ =gBankTarget\n\ - ldrb r2, [r2]\n\ - cmp r0, r2\n\ - beq _08022244\n\ - ldr r3, _080221B4 @ =gBankTarget\n\ - ldrb r0, [r3]\n\ - lsls r0, 1\n\ - ldr r4, _080221B8 @ =0x000160ac\n\ - adds r0, r4\n\ - add r0, r12\n\ - movs r3, 0\n\ - strb r3, [r0]\n\ - ldr r5, _080221B4 @ =gBankTarget\n\ - ldrb r0, [r5]\n\ - lsls r0, 1\n\ - ldr r1, _080221BC @ =0x000160ad\n\ - adds r0, r1\n\ - add r0, r12\n\ - strb r3, [r0]\n\ - ldrb r2, [r5]\n\ - lsls r2, 2\n\ - mov r4, r9\n\ - ldrb r0, [r4]\n\ - lsrs r0, 1\n\ - lsls r0, 1\n\ - adds r1, 0x53\n\ - adds r0, r1\n\ - adds r2, r0\n\ - add r2, r12\n\ - strb r3, [r2]\n\ - ldrb r2, [r5]\n\ - lsls r2, 2\n\ - ldrb r0, [r4]\n\ - lsrs r0, 1\n\ - lsls r0, 1\n\ - adds r1, 0x1\n\ - adds r0, r1\n\ - adds r2, r0\n\ - add r2, r12\n\ - strb r3, [r2]\n\ - b _08022244\n\ - .align 2, 0\n\ -_080221B4: .4byte gBankTarget\n\ -_080221B8: .4byte 0x000160ac\n\ -_080221BC: .4byte 0x000160ad\n\ -_080221C0:\n\ - ldr r5, _080222B0 @ =gHitMarker\n\ - ldr r2, [r5]\n\ - movs r0, 0x80\n\ - lsls r0, 12\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - bne _08022244\n\ - ldr r0, _080222B4 @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08022244\n\ - ldr r1, _080222B8 @ =gProtectStructs\n\ - ldr r0, _080222BC @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - lsls r0, 4\n\ - adds r0, r1\n\ - ldrb r0, [r0, 0x1]\n\ - lsls r0, 29\n\ + beq _08021790\n\ + cmp r3, 0x1\n\ + bgt _08021790\n\ + adds r0, r2, 0x4\n\ + mov r1, r9\n\ + b _080217E6\n\ + .align 2, 0\n\ +_0802178C: .4byte gBattleMons+0x18 @ gBattleMons.statStages\n\ +_08021790:\n\ + cmp r3, 0\n\ + beq _080217E0\n\ + ldr r0, _080217D0 @ =gSharedMem\n\ + ldr r1, _080217D4 @ =0x000160dc\n\ + adds r4, r0, r1\n\ + ldrb r0, [r4]\n\ cmp r0, 0\n\ - blt _08022244\n\ - ldr r0, _080222C0 @ =gBattleMoves\n\ - mov r9, r0\n\ - ldr r1, _080222C4 @ =gCurrentMove\n\ - mov r8, r1\n\ - ldrh r0, [r1]\n\ - lsls r1, r0, 1\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - add r1, r9\n\ - ldrb r0, [r1, 0x6]\n\ - cmp r0, 0x8\n\ - bne _08022244\n\ - movs r6, 0x80\n\ - lsls r6, 2\n\ - adds r4, r6, 0\n\ - ands r4, r2\n\ - cmp r4, 0\n\ - bne _08022244\n\ - ldr r7, _080222C8 @ =gBankTarget\n\ - ldrb r0, [r7]\n\ - bl GetBattlerPosition\n\ - movs r1, 0x2\n\ - eors r0, r1\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - bl GetBattlerAtPosition\n\ - lsls r0, 24\n\ - lsrs r2, r0, 24\n\ - ldr r1, _080222CC @ =gBattleMons\n\ - movs r0, 0x58\n\ - muls r0, r2\n\ - adds r0, r1\n\ - ldrh r0, [r0, 0x28]\n\ + bne _080217E0\n\ + movs r0, 0\n\ + movs r1, 0x1\n\ + mov r2, r8\n\ + str r3, [sp]\n\ + bl EmitBattleAnimation\n\ + ldr r0, _080217D8 @ =gActiveBattler\n\ + ldrb r0, [r0]\n\ + bl MarkBufferBankForExecution\n\ + ldr r0, _080217DC @ =gBattlescriptCurrInstr\n\ + ldr r0, [r0]\n\ + ldrb r1, [r0, 0x3]\n\ + movs r0, 0x4\n\ + ands r0, r1\n\ + ldr r3, [sp]\n\ cmp r0, 0\n\ - beq _0802223A\n\ - bl _08021874\n\ -_0802223A:\n\ - ldr r0, [r5]\n\ - orrs r0, r6\n\ - str r0, [r5]\n\ - ldr r2, _080222D0 @ =gSharedMem\n\ - mov r12, r2\n\ -_08022244:\n\ - ldr r1, _080222D4 @ =0x0001600c\n\ - add r1, r12\n\ - ldrb r0, [r1]\n\ - adds r0, 0x1\n\ - strb r0, [r1]\n\ -_0802224E:\n\ - ldr r3, [sp, 0x10]\n\ + beq _080217CC\n\ cmp r3, 0x1\n\ - bne _08022262\n\ - mov r4, r10\n\ - cmp r4, 0\n\ - bne _08022262\n\ - ldr r1, _080222D4 @ =0x0001600c\n\ - add r1, r12\n\ - movs r0, 0x11\n\ - strb r0, [r1]\n\ -_08022262:\n\ - ldr r5, [sp, 0x10]\n\ - cmp r5, 0x2\n\ - bne _08022278\n\ - ldr r1, _080222D4 @ =0x0001600c\n\ - add r1, r12\n\ - ldr r0, [sp, 0x14]\n\ - ldrb r2, [r1]\n\ - cmp r0, r2\n\ - bne _08022278\n\ - movs r0, 0x11\n\ - strb r0, [r1]\n\ -_08022278:\n\ - ldr r0, _080222D4 @ =0x0001600c\n\ - add r0, r12\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x11\n\ - beq _08022286\n\ - bl _080218E4\n\ -_08022286:\n\ - ldr r0, _080222D4 @ =0x0001600c\n\ - add r0, r12\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x11\n\ - bne _0802229E\n\ - mov r3, r10\n\ - cmp r3, 0\n\ - bne _0802229E\n\ - ldr r1, _080222D8 @ =gBattlescriptCurrInstr\n\ + ble _080217CC\n\ + movs r0, 0x1\n\ + strb r0, [r4]\n\ +_080217CC:\n\ + ldr r1, _080217DC @ =gBattlescriptCurrInstr\n\ + b _080217E2\n\ + .align 2, 0\n\ +_080217D0: .4byte gSharedMem\n\ +_080217D4: .4byte 0x000160dc\n\ +_080217D8: .4byte gActiveBattler\n\ +_080217DC: .4byte gBattlescriptCurrInstr\n\ +_080217E0:\n\ + mov r1, r9\n\ +_080217E2:\n\ ldr r0, [r1]\n\ - adds r0, 0x3\n\ -_0802229C:\n\ + adds r0, 0x4\n\ +_080217E6:\n\ str r0, [r1]\n\ -_0802229E:\n\ - add sp, 0x18\n\ + add sp, 0x4\n\ pop {r3-r5}\n\ mov r8, r3\n\ mov r9, r4\n\ @@ -8186,23 +6747,310 @@ _0802229E:\n\ pop {r4-r7}\n\ pop {r0}\n\ bx r0\n\ - .align 2, 0\n\ -_080222B0: .4byte gHitMarker\n\ -_080222B4: .4byte gBattleTypeFlags\n\ -_080222B8: .4byte gProtectStructs\n\ -_080222BC: .4byte gBankAttacker\n\ -_080222C0: .4byte gBattleMoves\n\ -_080222C4: .4byte gCurrentMove\n\ -_080222C8: .4byte gBankTarget\n\ -_080222CC: .4byte gBattleMons\n\ -_080222D0: .4byte gSharedMem\n\ -_080222D4: .4byte 0x0001600c\n\ -_080222D8: .4byte gBattlescriptCurrInstr\n\ - .syntax divided" - ); + .syntax divided"); } + #endif // NONMATCHING +#define BattleScript_FlushMessageBox gUnknown_081D9B2D + +extern u8 BattleScript_RageIsBuilding[]; +extern u8 BattleScript_DefrostedViaFireMove[]; +extern u8 BattleScript_FlushMessageBox[]; + +// atk49, moveend cases +#define ATK49_RAGE 0 +#define ATK49_DEFROST 1 +#define ATK49_SYNCHRONIZE_TARGET 2 +#define ATK49_MOVE_END_ABILITIES 3 +#define ATK49_STATUS_IMMUNITY_ABILITIES 4 +#define ATK49_SYNCHRONIZE_ATTACKER 5 +#define ATK49_CHOICE_MOVE 6 +#define ATK49_CHANGED_ITEMS 7 +#define ATK49_ATTACKER_INVISIBLE 8 +#define ATK49_ATTACKER_VISIBLE 9 +#define ATK49_TARGET_VISIBLE 10 +#define ATK49_ITEM_EFFECTS_ALL 11 +#define ATK49_KINGSROCK_SHELLBELL 12 +#define ATK49_SUBSTITUTE 13 +#define ATK49_UPDATE_LAST_MOVES 14 +#define ATK49_MIRROR_MOVE 15 +#define ATK49_NEXT_TARGET 16 +#define ATK49_COUNT 17 + +void atk49_moveend(void) +{ + int i; + bool32 effect = FALSE; + u16 moveType; + u8 holdEffectAtk; + u16 *choicedMoveAtk; + u8 arg1, arg2; + + arg1 = T2_READ_8(gBattlescriptCurrInstr + 1); + arg2 = T2_READ_8(gBattlescriptCurrInstr + 2); + + if (gBattleMons[gBankAttacker].item == ITEM_ENIGMA_BERRY) + holdEffectAtk = gEnigmaBerries[gBankAttacker].holdEffect; + else + holdEffectAtk = ItemId_GetHoldEffect(gBattleMons[gBankAttacker].item); + + choicedMoveAtk = &((u16*)(gSharedMem + 0x160E8))[gBankAttacker]; + GET_MOVE_TYPE(gCurrentMove, moveType); + + do + { + switch (gBattleStruct->cmd49StateTracker) + { + case ATK49_RAGE: // rage check + if (gBattleMons[gBankTarget].status2 & STATUS2_RAGE + && gBattleMons[gBankTarget].hp != 0 && gBankAttacker != gBankTarget + && GetBattlerSide(gBankAttacker) != GetBattlerSide(gBankTarget) + && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && (gProtectStructs[gBankTarget].physicalDmg != 0 || gProtectStructs[gBankTarget].specialDmg != 0) + && gBattleMoves[gCurrentMove].power && gBattleMons[gBankTarget].statStages[STAT_STAGE_ATK] <= 0xB) + { + gBattleMons[gBankTarget].statStages[STAT_STAGE_ATK]++; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_RageIsBuilding; + effect = TRUE; + } + gBattleStruct->cmd49StateTracker++; + break; + case ATK49_DEFROST: // defrosting check + if (gBattleMons[gBankTarget].status1 & STATUS_FREEZE + && gBattleMons[gBankTarget].hp && gBankAttacker != gBankTarget + && gSpecialStatuses[gBankTarget].moveturnLostHP_special + && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && moveType == TYPE_FIRE) + { + gBattleMons[gBankTarget].status1 &= ~(STATUS_FREEZE); + gActiveBattler = gBankTarget; + EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBankTarget].status1); + MarkBufferBankForExecution(gActiveBattler); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_DefrostedViaFireMove; + effect = TRUE; + } + gBattleStruct->cmd49StateTracker++; + break; + case ATK49_SYNCHRONIZE_TARGET: // target synchronize + if (AbilityBattleEffects(ABILITYEFFECT_SYNCHRONIZE, gBankTarget, 0, 0, 0)) + effect = TRUE; + gBattleStruct->cmd49StateTracker++; + break; + case ATK49_MOVE_END_ABILITIES: // Such as abilities activating on contact(Poison Spore, Rough Skin, etc.). + if (AbilityBattleEffects(ABILITYEFFECT_MOVE_END, gBankTarget, 0, 0, 0)) + effect = TRUE; + gBattleStruct->cmd49StateTracker++; + break; + case ATK49_STATUS_IMMUNITY_ABILITIES: //status immunities + if (AbilityBattleEffects(ABILITYEFFECT_IMMUNITY, 0, 0, 0, 0)) + effect = TRUE; //it loops through 4 banks, so we increment after its done with all banks + else + gBattleStruct->cmd49StateTracker++; + break; + case ATK49_SYNCHRONIZE_ATTACKER: //attacker synchronize + if (AbilityBattleEffects(ABILITYEFFECT_ATK_SYNCHRONIZE, gBankAttacker, 0, 0, 0)) + effect = TRUE; + gBattleStruct->cmd49StateTracker++; + break; + case ATK49_CHOICE_MOVE: //update choice band move + if (!(gHitMarker & HITMARKER_OBEYS) || holdEffectAtk != HOLD_EFFECT_CHOICE_BAND + || gChosenMove == MOVE_STRUGGLE || (*choicedMoveAtk != 0 && *choicedMoveAtk != 0xFFFF)) + goto LOOP; + if (gChosenMove == MOVE_BATON_PASS && !(gMoveResultFlags & MOVE_RESULT_FAILED)) + { + gBattleStruct->cmd49StateTracker++; + break; + } + *choicedMoveAtk = gChosenMove; + LOOP: + { + for (i = 0; i < 4; i++) + { + if (gBattleMons[gBankAttacker].moves[i] == *choicedMoveAtk) + break; + } + if (i == 4) + *choicedMoveAtk = 0; + gBattleStruct->cmd49StateTracker++; + } + break; + case ATK49_CHANGED_ITEMS: // changed held items + for (i = 0; i < gBattlersCount; i++) + { + #define CHANGED_ITEM ((u16 *)(gSharedMem + 0x160F0)) + if (CHANGED_ITEM[i] != 0) + { + gBattleMons[i].item = CHANGED_ITEM[i]; + CHANGED_ITEM[i] = 0; + } + #undef CHANGED_ITEM + } + gBattleStruct->cmd49StateTracker++; + break; + case ATK49_ATTACKER_INVISIBLE: // make attacker sprite invisible + if (ItemBattleEffects(ITEMEFFECT_MOVE_END, 0, FALSE)) + effect = TRUE; + else + gBattleStruct->cmd49StateTracker++; + break; + case ATK49_ATTACKER_VISIBLE: // make attacker sprite visible + if (ItemBattleEffects(ITEMEFFECT_KINGSROCK_SHELLBELL, 0, FALSE)) + effect = TRUE; + gBattleStruct->cmd49StateTracker++; + break; + case ATK49_TARGET_VISIBLE: // make target sprite visible + if ((gStatuses3[gBankAttacker] & 0x400C0) && (gHitMarker & HITMARKER_NO_ANIMATIONS)) + { + gActiveBattler = gBankAttacker; + EmitSpriteInvisibility(0, 1); + MarkBufferBankForExecution(gActiveBattler); + } + gBattleStruct->cmd49StateTracker++; + break; + case ATK49_ITEM_EFFECTS_ALL: // item effects for all battlers + if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT + || !(gStatuses3[gBankAttacker] & (STATUS3_SEMI_INVULNERABLE)) + || WasUnableToUseMove(gBankAttacker)) + { + gActiveBattler = gBankAttacker; + EmitSpriteInvisibility(0, FALSE); + MarkBufferBankForExecution(gActiveBattler); + gStatuses3[gBankAttacker] &= ~(STATUS3_SEMI_INVULNERABLE); + gSpecialStatuses[gBankAttacker].restoredBankSprite = 1; + } + gBattleStruct->cmd49StateTracker++; + break; + case ATK49_KINGSROCK_SHELLBELL: // king's rock and shell bell + if (!gSpecialStatuses[gBankTarget].restoredBankSprite && gBankTarget < gBattlersCount + && !(gStatuses3[gBankTarget] & STATUS3_SEMI_INVULNERABLE)) + { + gActiveBattler = gBankTarget; + EmitSpriteInvisibility(0, FALSE); + MarkBufferBankForExecution(gActiveBattler); + gStatuses3[gBankTarget] &= ~(STATUS3_SEMI_INVULNERABLE); + } + gBattleStruct->cmd49StateTracker++; + break; + case ATK49_SUBSTITUTE: // update substitute + for (i = 0; i < gBattlersCount; i++) + { + if (gDisableStructs[i].substituteHP == 0) + gBattleMons[i].status2 &= ~(STATUS2_SUBSTITUTE); + } + gBattleStruct->cmd49StateTracker++; + break; + case ATK49_UPDATE_LAST_MOVES: + if (gHitMarker & HITMARKER_PURSUIT_TRAP) + { + gActiveBattler = gBankAttacker; + gBankAttacker = gBankTarget; + gBankTarget = gActiveBattler; + gHitMarker &= ~(HITMARKER_PURSUIT_TRAP); + } + + if (gBattleMoves[gChosenMove].effect != 0x7F || (gMoveResultFlags & 0x29)) + gUnknown_02024C2C[gBankAttacker] = gChosenMove; + + if (!(gAbsentBattlerFlags & gBitTable[gBankAttacker]) + && !(gSharedMem[0x160A6] & gBitTable[gBankAttacker]) + && gBattleMoves[gChosenMove].effect != EFFECT_BATON_PASS) + { + if (gHitMarker & HITMARKER_OBEYS) + { + gLastUsedMove[gBankAttacker] = gChosenMove; + gUnknown_02024C4C[gBankAttacker] = gCurrentMove; + } + else + { + gLastUsedMove[gBankAttacker] = 0xFFFF; + gUnknown_02024C4C[gBankAttacker] = 0xFFFF; + } + + if (!(gHitMarker & HITMARKER_FAINTED(gBankTarget))) + gLastHitBy[gBankTarget] = gBankAttacker; + + if (gHitMarker & HITMARKER_OBEYS && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) + { + if (gChosenMove == 0xFFFF) + { + gLastLandedMoves[gBankTarget] = gChosenMove; + } + else + { + gLastLandedMoves[gBankTarget] = gCurrentMove; + GET_MOVE_TYPE(gCurrentMove, gLastHitByType[gBankTarget]); + } + } + else + { + gLastLandedMoves[gBankTarget] = 0xFFFF; + } + } + gBattleStruct->cmd49StateTracker++; + break; + case ATK49_MIRROR_MOVE: + if (!(gAbsentBattlerFlags & gBitTable[gBankAttacker]) && !(gSharedMem[0x160A6] & gBitTable[gBankAttacker])) + { + if (gBattleMoves[gChosenMove].flags & 0x10 && gHitMarker & HITMARKER_OBEYS + && gBankAttacker != gBankTarget && !(gHitMarker & HITMARKER_FAINTED(gBankTarget)) + && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) + { + gSharedMem[0x160AC + gBankTarget * 2 + 0] = gChosenMove; + gSharedMem[0x160AC + gBankTarget * 2 + 1] = gChosenMove >> 8; + + gSharedMem[0x16100 + gBankTarget * 4 + 0 + (gBankAttacker / 2) * 2] = gChosenMove; + gSharedMem[0x16100 + gBankTarget * 4 + 1 + (gBankAttacker / 2) * 2] = gChosenMove >> 8; + } + else if (gBankAttacker != gBankTarget) + { + gSharedMem[0x160AC + gBankTarget * 2 + 0] = 0; + gSharedMem[0x160AC + gBankTarget * 2 + 1] = 0; + + gSharedMem[0x16100 + gBankTarget * 4 + 0 + (gBankAttacker / 2) * 2] = 0; + gSharedMem[0x16100 + gBankTarget * 4 + 1 + (gBankAttacker / 2) * 2] = 0; + } + } + gBattleStruct->cmd49StateTracker++; + break; + case ATK49_NEXT_TARGET: + if (!(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) && gBattleTypeFlags & BATTLE_TYPE_DOUBLE + && !gProtectStructs[gBankAttacker].chargingTurn && gBattleMoves[gCurrentMove].target == MOVE_TARGET_BOTH + && !(gHitMarker & HITMARKER_NO_ATTACKSTRING)) + { + u8 battlerId = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBankTarget))); + if (gBattleMons[battlerId].hp != 0) + { + gBankTarget = battlerId; + gHitMarker |= HITMARKER_NO_ATTACKSTRING; + gBattleStruct->cmd49StateTracker = 0; + MoveValuesCleanUp(); + BattleScriptPush(gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]); + gBattlescriptCurrInstr = BattleScript_FlushMessageBox; + return; + } + else + { + gHitMarker |= HITMARKER_NO_ATTACKSTRING; + } + } + gBattleStruct->cmd49StateTracker++; + break; + case ATK49_COUNT: + break; + } + + if (arg1 == 1 && effect == FALSE) + gBattleStruct->cmd49StateTracker = ATK49_COUNT; + if (arg1 == 2 && arg2 == gBattleStruct->cmd49StateTracker) + gBattleStruct->cmd49StateTracker = ATK49_COUNT; + + } while (gBattleStruct->cmd49StateTracker != ATK49_COUNT && effect == FALSE); + + if (gBattleStruct->cmd49StateTracker == ATK49_COUNT && effect == FALSE) + gBattlescriptCurrInstr += 3; +} + static void atk4A_typecalc2(void) { u8 flags = 0; @@ -14010,15 +12858,15 @@ static void atkC1_hiddenpowercalc(void) ((gBattleMons[gBankAttacker].speedIV & 1) << 3) | ((gBattleMons[gBankAttacker].spAttackIV & 1) << 4) | ((gBattleMons[gBankAttacker].spDefenseIV & 1) << 5); - + gDynamicBasePower = 30 + (power * 40 / 63); - + gBattleStruct->dynamicMoveType = ((type * 15) / 63) + 1; if (gBattleStruct->dynamicMoveType >= TYPE_MYSTERY) gBattleStruct->dynamicMoveType++; - + gBattleStruct->dynamicMoveType |= 0xC0; - + gBattlescriptCurrInstr++; } diff --git a/src/battle/battle_ai_switch_items.c b/src/battle/battle_ai_switch_items.c index 4dd7614bf..2cf11b50e 100644 --- a/src/battle/battle_ai_switch_items.c +++ b/src/battle/battle_ai_switch_items.c @@ -16,7 +16,6 @@ extern u8 gUnknown_02023A14_50; -extern u8 gLastHitBy[]; extern u8 gActiveBattler; extern u16 gBattleTypeFlags; extern u8 gAbsentBattlerFlags; diff --git a/src/pokemon_item_effect.c b/src/pokemon_item_effect.c index 59b216af0..e16d08073 100644 --- a/src/pokemon_item_effect.c +++ b/src/pokemon_item_effect.c @@ -1,5 +1,5 @@ #include "global.h" -#include "constants/battle_constants.h" +#include "constants/battle.h" #include "constants/hold_effects.h" #include "constants/items.h" #include "constants/species.h" -- cgit v1.2.3