diff options
| author | scnorton <scnorton@biociphers.org> | 2017-06-28 17:37:17 -0400 | 
|---|---|---|
| committer | scnorton <scnorton@biociphers.org> | 2017-06-28 17:37:17 -0400 | 
| commit | 26a48d7e926d3c7841a28b2af8cbbd170923469e (patch) | |
| tree | fa83e9a7105769c66e3a66b3c6871984293db329 /src/battle_6.c | |
| parent | 39efcb2a6d169fba0ff33f1bd25e2947b74881a0 (diff) | |
| parent | 06b6cada0ddedc62063171703ba6607019751a9a (diff) | |
Merge branch 'master' into use_pokeblock
Diffstat (limited to 'src/battle_6.c')
| -rw-r--r-- | src/battle_6.c | 1484 | 
1 files changed, 1467 insertions, 17 deletions
| diff --git a/src/battle_6.c b/src/battle_6.c index bc540ce72..9ea3f240a 100644 --- a/src/battle_6.c +++ b/src/battle_6.c @@ -1,28 +1,74 @@  #include "global.h" -#include "asm.h" +#include "battle.h" +#include "battle_interface.h" +#include "battle_message.h" +#include "data2.h"  #include "menu_cursor.h" +#include "palette.h" +#include "pokemon.h" +#include "rom3.h" +#include "songs.h" +#include "sound.h" +#include "sprite.h" +#include "string_util.h" +#include "task.h"  #include "text.h" +#include "util.h" + +//Possibly PokemonSubstruct1 +struct UnknownStruct3 +{ +    u16 moves[4]; +    u8 pp[4]; +    u8 ppBonuses; +};  extern u16 gUnknown_030042A4;  extern u16 gUnknown_030042A0;  extern struct Window gUnknown_03004210; -extern void (*gUnknown_03004330[])(void); - -extern u8 gUnknown_02024A60; -extern u8 gUnknown_02024E60[]; -extern u8 gUnknown_020238CC[]; +extern void (*gBattleBankFunc[])(void); -extern u16 gUnknown_030042C0; -extern u16 gUnknown_030041B4; -extern u16 gUnknown_03004288; -extern u16 gUnknown_03004280; +extern u8 gActiveBank; +extern u8 gActionSelectionCursor[]; +extern u8 gDisplayedStringBattle[]; +extern u8 gMoveSelectionCursor[]; +extern u8 gBattleBufferA[][0x200]; +extern u8 gBankInMenu; +extern u16 gBattlePartyID[]; +extern u8 gHealthboxIDs[]; +extern u8 gDoingBattleAnim; +extern u8 gObjectBankIDs[]; +extern u16 gBattleTypeFlags; +extern u8 gBattleOutcome; +extern void (*gAnimScriptCallback)(void); +extern bool8 gAnimScriptActive; +extern u16 gMovePowerMoveAnim; +extern u32 gMoveDmgMoveAnim; +extern u8 gHappinessMoveAnim; +extern u16 gWeatherMoveAnim; +extern u32 *gDisableStructMoveAnim; +extern u32 gPID_perBank[]; +extern u8 gBattleMonForms[]; +extern u16 gUnknown_02024DE8; +extern u8 gUnknown_02024E68[]; +extern struct SpriteTemplate gUnknown_02024E8C; +extern u8 gUnknown_0202F7C4; +extern u8 gUnknown_02038470[];  extern u16 gUnknown_030041B0; +extern u16 gUnknown_030041B4;  extern u16 gUnknown_030041B8; +extern u16 gUnknown_03004280; +extern u16 gUnknown_03004288; +extern u16 gUnknown_030042A4; +extern u16 gUnknown_030042C0; +extern u8 gUnknown_03004344; +extern u8 gUnknown_0300434C[];  extern const u8 gUnknown_08400CA8[];  extern const u8 gUnknown_08400CF3[]; +extern const u8 gUnknown_08400D38[];  #if ENGLISH  #define SUB_803037C_TILE_DATA_OFFSET 440 @@ -30,7 +76,952 @@ extern const u8 gUnknown_08400CF3[];  #define SUB_803037C_TILE_DATA_OFFSET 444  #endif -void sub_803037C(void) { +extern void sub_802C68C(void); +extern void sub_802E1B0(void); +extern void sub_802E3B4(); +extern void sub_802E220(); +extern void sub_802E2D4(); +extern void sub_802E004(void); +extern void sub_802DF30(void); +extern void sub_80325B8(void); +extern void PlayerBufferExecCompleted(void); +extern void bx_t1_healthbar_update(void); +extern void nullsub_91(void); +extern void sub_802D924(u8); +extern void sub_802E434(void); +extern bool8 mplay_80342A4(u8); +extern void move_anim_start_t2_for_situation(); +extern void bx_blink_t1(void); +extern void sub_8047858(); +extern u8 GetBankSide(u8); +extern void sub_80E43C0(); +extern void oamt_add_pos2_onto_pos1(); +extern void sub_8078B34(struct Sprite *); +extern void oamt_set_x3A_32(); +extern void sub_80318FC(); +extern bool8 IsDoubleBattle(void); +extern void sub_802D500(void); +extern void dp11b_obj_free(); +extern bool8 sub_8078874(u8); +extern bool8 move_anim_start_t3(); +extern void sub_802E460(void); +extern void b_link_standby_message(void); +extern void sub_802D18C(void); +extern void sub_802DF18(void); +extern void BufferStringBattle(); +extern void sub_80326EC(); +extern void ExecuteMoveAnim(); +extern void sub_8031F24(void); +extern void sub_80324BC(); +extern u8 sub_8031720(); +extern void bx_wait_t1(void); +extern u8 GetBankByPlayerAI(u8); +extern void sub_802DE10(void); +extern void sub_80105EC(struct Sprite *); +extern void sub_802D274(void); +extern void sub_802D23C(void); +extern u8 GetBankIdentity(u8); +extern void sub_8031AF4(); +extern void sub_80313A0(struct Sprite *); +extern void sub_802D204(void); +extern u8 sub_8079E90(); +extern void sub_802DEAC(void); +extern void sub_80312F0(struct Sprite *); +extern u8 sub_8077ABC(); +extern u8 sub_8077F68(); +extern u8 sub_8046400(); +extern void sub_802D798(void); +extern void bx_0802E404(void); + +u32 dp01_getattr_by_ch1_for_player_pokemon_(u8, u8 *); +void dp01_setattr_by_ch1_for_player_pokemon(u8); +void sub_802F934(u8, u8); +void sub_802FB2C(void); +void sub_8030190(void); +void sub_80304A8(void); +void sub_8030E38(struct Sprite *); +void task05_08033660(u8); +void sub_8031064(void); + +void PlayerHandleGetAttributes(void) +{ +    u8 unkData[0x100]; +    u32 offset = 0; +    u8 r4; +    s32 i; + +    if (gBattleBufferA[gActiveBank][2] == 0) +    { +        offset += dp01_getattr_by_ch1_for_player_pokemon_(gBattlePartyID[gActiveBank], unkData); +    } +    else +    { +        r4 = gBattleBufferA[gActiveBank][2]; +        for (i = 0; i < 6; i++) +        { +            if (r4 & 1) +                offset += dp01_getattr_by_ch1_for_player_pokemon_(i, unkData + offset); +            r4 >>= 1; +        } +    } +    dp01_build_cmdbuf_x1D_1D_numargs_varargs(1, offset, unkData); +    PlayerBufferExecCompleted(); +} + +// Duplicate of dp01_getattr_by_ch1_for_player_pokemon +u32 dp01_getattr_by_ch1_for_player_pokemon_(u8 a, u8 *buffer) +{ +    struct BattlePokemon battlePokemon; +    struct UnknownStruct3 moveData; +    u8 nickname[20]; +    u8 *src; +    s16 data16; +    u32 data32; +    s32 size = 0; + +    switch (gBattleBufferA[gActiveBank][1]) +    { +    case 0: +        battlePokemon.species = GetMonData(&gPlayerParty[a], MON_DATA_SPECIES); +        battlePokemon.item = GetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM); +        for (size = 0; size < 4; size++) +        { +            battlePokemon.moves[size] = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + size); +            battlePokemon.pp[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); +        } +        battlePokemon.ppBonuses = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); +        battlePokemon.friendship = GetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP); +        battlePokemon.experience = GetMonData(&gPlayerParty[a], MON_DATA_EXP); +        battlePokemon.hpIV = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); +        battlePokemon.attackIV = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); +        battlePokemon.defenseIV = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); +        battlePokemon.speedIV = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); +        battlePokemon.spAttackIV = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); +        battlePokemon.spDefenseIV = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); +        battlePokemon.personality = GetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY); +        battlePokemon.status1 = GetMonData(&gPlayerParty[a], MON_DATA_STATUS); +        battlePokemon.level = GetMonData(&gPlayerParty[a], MON_DATA_LEVEL); +        battlePokemon.hp = GetMonData(&gPlayerParty[a], MON_DATA_HP); +        battlePokemon.maxHP = GetMonData(&gPlayerParty[a], MON_DATA_MAX_HP); +        battlePokemon.attack = GetMonData(&gPlayerParty[a], MON_DATA_ATK); +        battlePokemon.defense = GetMonData(&gPlayerParty[a], MON_DATA_DEF); +        battlePokemon.speed = GetMonData(&gPlayerParty[a], MON_DATA_SPD); +        battlePokemon.spAttack = GetMonData(&gPlayerParty[a], MON_DATA_SPATK); +        battlePokemon.spDefense = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF); +        battlePokemon.isEgg = GetMonData(&gPlayerParty[a], MON_DATA_IS_EGG); +        battlePokemon.altAbility = GetMonData(&gPlayerParty[a], MON_DATA_ALT_ABILITY); +        battlePokemon.otId = GetMonData(&gPlayerParty[a], MON_DATA_OT_ID); +        GetMonData(&gPlayerParty[a], MON_DATA_NICKNAME, nickname); +        StringCopy10(battlePokemon.nickname, nickname); +        GetMonData(&gPlayerParty[a], MON_DATA_OT_NAME, battlePokemon.otName); +        src = (u8 *)&battlePokemon; +        for (size = 0; size < sizeof(battlePokemon); size++) +            buffer[size] = src[size]; +        break; +    case 1: +        data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPECIES); +        buffer[0] = data16; +        buffer[1] = data16 >> 8; +        size = 2; +        break; +    case 2: +        data16 = GetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM); +        buffer[0] = data16; +        buffer[1] = data16 >> 8; +        size = 2; +        break; +    case 3: +        for (size = 0; size < 4; size++) +        { +            moveData.moves[size] = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + size); +            moveData.pp[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); +        } +        moveData.ppBonuses = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); +        src = (u8 *)&moveData; +        for (size = 0; size < sizeof(moveData); size++) +            buffer[size] = src[size]; +        break; +    case 4: +    case 5: +    case 6: +    case 7: +        data16 = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - 4); +        buffer[0] = data16; +        buffer[1] = data16 >> 8; +        size = 2; +        break; +    case 8: +        for (size = 0; size < 4; size++) +            buffer[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); +        buffer[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); +        size++; +        break; +    case 9: +    case 10: +    case 11: +    case 12: +        buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - 9); +        size = 1; +        break; +    case 17: +        data32 = GetMonData(&gPlayerParty[a], MON_DATA_OT_ID); +        buffer[0] = (data32 & 0x000000FF); +        buffer[1] = (data32 & 0x0000FF00) >> 8; +        buffer[2] = (data32 & 0x00FF0000) >> 16; +        size = 3; +        break; +    case 18: +        data32 = GetMonData(&gPlayerParty[a], MON_DATA_EXP); +        buffer[0] = (data32 & 0x000000FF); +        buffer[1] = (data32 & 0x0000FF00) >> 8; +        buffer[2] = (data32 & 0x00FF0000) >> 16; +        size = 3; +        break; +    case 19: +        buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_EV); +        size = 1; +        break; +    case 20: +        buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_EV); +        size = 1; +        break; +    case 21: +        buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_EV); +        size = 1; +        break; +    case 22: +        buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_EV); +        size = 1; +        break; +    case 23: +        buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_EV); +        size = 1; +        break; +    case 24: +        buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_EV); +        size = 1; +        break; +    case 25: +        buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP); +        size = 1; +        break; +    case 26: +        buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_POKERUS); +        size = 1; +        break; +    case 27: +        buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_LOCATION); +        size = 1; +        break; +    case 28: +        buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_LEVEL); +        size = 1; +        break; +    case 29: +        buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_GAME); +        size = 1; +        break; +    case 30: +        buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_POKEBALL); +        size = 1; +        break; +    case 31: +        buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); +        buffer[1] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); +        buffer[2] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); +        buffer[3] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); +        buffer[4] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); +        buffer[5] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); +        size = 6; +        break; +    case 32: +        buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); +        size = 1; +        break; +    case 33: +        buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); +        size = 1; +        break; +    case 34: +        buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); +        size = 1; +        break; +    case 35: +        buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); +        size = 1; +        break; +    case 36: +        buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); +        size = 1; +        break; +    case 37: +        buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); +        size = 1; +        break; +    case 38: +        data32 = GetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY); +        buffer[0] = (data32 & 0x000000FF); +        buffer[1] = (data32 & 0x0000FF00) >> 8; +        buffer[2] = (data32 & 0x00FF0000) >> 16; +        buffer[3] = (data32 & 0xFF000000) >> 24; +        size = 4; +        break; +    case 39: +        data16 = GetMonData(&gPlayerParty[a], MON_DATA_CHECKSUM); +        buffer[0] = data16; +        buffer[1] = data16 >> 8; +        size = 2; +        break; +    case 40: +        data32 = GetMonData(&gPlayerParty[a], MON_DATA_STATUS); +        buffer[0] = (data32 & 0x000000FF); +        buffer[1] = (data32 & 0x0000FF00) >> 8; +        buffer[2] = (data32 & 0x00FF0000) >> 16; +        buffer[3] = (data32 & 0xFF000000) >> 24; +        size = 4; +        break; +    case 41: +        buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_LEVEL); +        size = 1; +        break; +    case 42: +        data16 = GetMonData(&gPlayerParty[a], MON_DATA_HP); +        buffer[0] = data16; +        buffer[1] = data16 >> 8; +        size = 2; +        break; +    case 43: +        data16 = GetMonData(&gPlayerParty[a], MON_DATA_MAX_HP); +        buffer[0] = data16; +        buffer[1] = data16 >> 8; +        size = 2; +        break; +    case 44: +        data16 = GetMonData(&gPlayerParty[a], MON_DATA_ATK); +        buffer[0] = data16; +        buffer[1] = data16 >> 8; +        size = 2; +        break; +    case 45: +        data16 = GetMonData(&gPlayerParty[a], MON_DATA_DEF); +        buffer[0] = data16; +        buffer[1] = data16 >> 8; +        size = 2; +        break; +    case 46: +        data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPD); +        buffer[0] = data16; +        buffer[1] = data16 >> 8; +        size = 2; +        break; +    case 47: +        data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPATK); +        buffer[0] = data16; +        buffer[1] = data16 >> 8; +        size = 2; +        break; +    case 48: +        data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF); +        buffer[0] = data16; +        buffer[1] = data16 >> 8; +        size = 2; +        break; +    case 49: +        buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_COOL); +        size = 1; +        break; +    case 50: +        buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_BEAUTY); +        size = 1; +        break; +    case 51: +        buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_CUTE); +        size = 1; +        break; +    case 52: +        buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SMART); +        size = 1; +        break; +    case 53: +        buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_TOUGH); +        size = 1; +        break; +    case 54: +        buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SHEEN); +        size = 1; +        break; +    case 55: +        buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_COOL_RIBBON); +        size = 1; +        break; +    case 56: +        buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_BEAUTY_RIBBON); +        size = 1; +        break; +    case 57: +        buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_CUTE_RIBBON); +        size = 1; +        break; +    case 58: +        buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SMART_RIBBON); +        size = 1; +        break; +    case 59: +        buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_TOUGH_RIBBON); +        size = 1; +        break; +    } +    return size; +} + +void sub_802ECF0(void) +{ +    struct BattlePokemon battleMon;  // I think this is a BattlePokemon +    u8 *src = (u8 *)&gPlayerParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1]; +    u8 *dst = (u8 *)&battleMon + gBattleBufferA[gActiveBank][1]; +    u8 i; + +    for (i = 0; i < gBattleBufferA[gActiveBank][2]; i++) +        dst[i] = src[i]; +    dp01_build_cmdbuf_x1D_1D_numargs_varargs(1, gBattleBufferA[gActiveBank][2], dst); +    PlayerBufferExecCompleted(); +} + +void PlayerHandleSetAttributes(void) +{ +    u8 r4; +    u8 i; + +    if (gBattleBufferA[gActiveBank][2] == 0) +    { +        dp01_setattr_by_ch1_for_player_pokemon(gBattlePartyID[gActiveBank]); +    } +    else +    { +        r4 = gBattleBufferA[gActiveBank][2]; +        for (i = 0; i < 6; i++) +        { +            if (r4 & 1) +                dp01_setattr_by_ch1_for_player_pokemon(i); +            r4 >>= 1; +        } +    } +    PlayerBufferExecCompleted(); +} + +// Duplicate of sub_811EC68 +void dp01_setattr_by_ch1_for_player_pokemon(u8 a) +{ +    struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBank][3]; +    struct UnknownStruct3 *moveData = (struct UnknownStruct3 *)&gBattleBufferA[gActiveBank][3]; +    s32 i; + +    switch (gBattleBufferA[gActiveBank][1]) +    { +    case 0: +        { +            u8 iv; + +            SetMonData(&gPlayerParty[a], MON_DATA_SPECIES, (u8 *)&battlePokemon->species); +            SetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM, (u8 *)&battlePokemon->item); +            for (i = 0; i < 4; i++) +            { +                SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, (u8 *)&battlePokemon->moves[i]); +                SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, (u8 *)&battlePokemon->pp[i]); +            } +            SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, (u8 *)&battlePokemon->ppBonuses); +            SetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP, (u8 *)&battlePokemon->friendship); +            SetMonData(&gPlayerParty[a], MON_DATA_EXP, (u8 *)&battlePokemon->experience); +            iv = battlePokemon->hpIV; +            SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, (u8 *)&iv); +            iv = battlePokemon->attackIV; +            SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, (u8 *)&iv); +            iv = battlePokemon->defenseIV; +            SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, (u8 *)&iv); +            iv = battlePokemon->speedIV; +            SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, (u8 *)&iv); +            iv = battlePokemon->spAttackIV; +            SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, (u8 *)&iv); +            iv = battlePokemon->spDefenseIV; +            SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, (u8 *)&iv); +            SetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY, (u8 *)&battlePokemon->personality); +            SetMonData(&gPlayerParty[a], MON_DATA_STATUS, (u8 *)&battlePokemon->status1); +            SetMonData(&gPlayerParty[a], MON_DATA_LEVEL, (u8 *)&battlePokemon->level); +            SetMonData(&gPlayerParty[a], MON_DATA_HP, (u8 *)&battlePokemon->hp); +            SetMonData(&gPlayerParty[a], MON_DATA_MAX_HP, (u8 *)&battlePokemon->maxHP); +            SetMonData(&gPlayerParty[a], MON_DATA_ATK, (u8 *)&battlePokemon->attack); +            SetMonData(&gPlayerParty[a], MON_DATA_DEF, (u8 *)&battlePokemon->defense); +            SetMonData(&gPlayerParty[a], MON_DATA_SPD, (u8 *)&battlePokemon->speed); +            SetMonData(&gPlayerParty[a], MON_DATA_SPATK, (u8 *)&battlePokemon->spAttack); +            SetMonData(&gPlayerParty[a], MON_DATA_SPDEF, (u8 *)&battlePokemon->spDefense); +        } +        break; +    case 1: +        SetMonData(&gPlayerParty[a], MON_DATA_SPECIES, &gBattleBufferA[gActiveBank][3]); +        break; +    case 2: +        SetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBank][3]); +        break; +    case 3: +        for (i = 0; i < 4; i++) +        { +            SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, (u8 *)&moveData->moves[i]); +            SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, (u8 *)&moveData->pp[i]); +        } +        SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, &moveData->ppBonuses); +        break; +    case 4: +    case 5: +    case 6: +    case 7: +        SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - 4, &gBattleBufferA[gActiveBank][3]); +        break; +    case 8: +        SetMonData(&gPlayerParty[a], MON_DATA_PP1, &gBattleBufferA[gActiveBank][3]); +        SetMonData(&gPlayerParty[a], MON_DATA_PP2, &gBattleBufferA[gActiveBank][4]); +        SetMonData(&gPlayerParty[a], MON_DATA_PP3, &gBattleBufferA[gActiveBank][5]); +        SetMonData(&gPlayerParty[a], MON_DATA_PP4, &gBattleBufferA[gActiveBank][6]); +        SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBank][7]); +        break; +    case 9: +    case 10: +    case 11: +    case 12: +        SetMonData(&gPlayerParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - 9, &gBattleBufferA[gActiveBank][3]); +        break; +    case 17: +        SetMonData(&gPlayerParty[a], MON_DATA_OT_ID, &gBattleBufferA[gActiveBank][3]); +        break; +    case 18: +        SetMonData(&gPlayerParty[a], MON_DATA_EXP, &gBattleBufferA[gActiveBank][3]); +        break; +    case 19: +        SetMonData(&gPlayerParty[a], MON_DATA_HP_EV, &gBattleBufferA[gActiveBank][3]); +        break; +    case 20: +        SetMonData(&gPlayerParty[a], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBank][3]); +        break; +    case 21: +        SetMonData(&gPlayerParty[a], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBank][3]); +        break; +    case 22: +        SetMonData(&gPlayerParty[a], MON_DATA_SPD_EV, &gBattleBufferA[gActiveBank][3]); +        break; +    case 23: +        SetMonData(&gPlayerParty[a], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBank][3]); +        break; +    case 24: +        SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBank][3]); +        break; +    case 25: +        SetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBank][3]); +        break; +    case 26: +        SetMonData(&gPlayerParty[a], MON_DATA_POKERUS, &gBattleBufferA[gActiveBank][3]); +        break; +    case 27: +        SetMonData(&gPlayerParty[a], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBank][3]); +        break; +    case 28: +        SetMonData(&gPlayerParty[a], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBank][3]); +        break; +    case 29: +        SetMonData(&gPlayerParty[a], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBank][3]); +        break; +    case 30: +        SetMonData(&gPlayerParty[a], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBank][3]); +        break; +    case 31: +        SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]); +        SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][4]); +        SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][5]); +        SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][6]); +        SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][7]); +        SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][8]); +        break; +    case 32: +        SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]); +        break; +    case 33: +        SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][3]); +        break; +    case 34: +        SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][3]); +        break; +    case 35: +        SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][3]); +        break; +    case 36: +        SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][3]); +        break; +    case 37: +        SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][3]); +        break; +    case 38: +        SetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBank][3]); +        break; +    case 39: +        SetMonData(&gPlayerParty[a], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBank][3]); +        break; +    case 40: +        SetMonData(&gPlayerParty[a], MON_DATA_STATUS, &gBattleBufferA[gActiveBank][3]); +        break; +    case 41: +        SetMonData(&gPlayerParty[a], MON_DATA_LEVEL, &gBattleBufferA[gActiveBank][3]); +        break; +    case 42: +        SetMonData(&gPlayerParty[a], MON_DATA_HP, &gBattleBufferA[gActiveBank][3]); +        break; +    case 43: +        SetMonData(&gPlayerParty[a], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBank][3]); +        break; +    case 44: +        SetMonData(&gPlayerParty[a], MON_DATA_ATK, &gBattleBufferA[gActiveBank][3]); +        break; +    case 45: +        SetMonData(&gPlayerParty[a], MON_DATA_DEF, &gBattleBufferA[gActiveBank][3]); +        break; +    case 46: +        SetMonData(&gPlayerParty[a], MON_DATA_SPD, &gBattleBufferA[gActiveBank][3]); +        break; +    case 47: +        SetMonData(&gPlayerParty[a], MON_DATA_SPATK, &gBattleBufferA[gActiveBank][3]); +        break; +    case 48: +        SetMonData(&gPlayerParty[a], MON_DATA_SPDEF, &gBattleBufferA[gActiveBank][3]); +        break; +    case 49: +        SetMonData(&gPlayerParty[a], MON_DATA_COOL, &gBattleBufferA[gActiveBank][3]); +        break; +    case 50: +        SetMonData(&gPlayerParty[a], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBank][3]); +        break; +    case 51: +        SetMonData(&gPlayerParty[a], MON_DATA_CUTE, &gBattleBufferA[gActiveBank][3]); +        break; +    case 52: +        SetMonData(&gPlayerParty[a], MON_DATA_SMART, &gBattleBufferA[gActiveBank][3]); +        break; +    case 53: +        SetMonData(&gPlayerParty[a], MON_DATA_TOUGH, &gBattleBufferA[gActiveBank][3]); +        break; +    case 54: +        SetMonData(&gPlayerParty[a], MON_DATA_SHEEN, &gBattleBufferA[gActiveBank][3]); +        break; +    case 55: +        SetMonData(&gPlayerParty[a], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBank][3]); +        break; +    case 56: +        SetMonData(&gPlayerParty[a], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBank][3]); +        break; +    case 57: +        SetMonData(&gPlayerParty[a], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBank][3]); +        break; +    case 58: +        SetMonData(&gPlayerParty[a], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBank][3]); +        break; +    case 59: +        SetMonData(&gPlayerParty[a], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBank][3]); +        break; +    } +    sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); +} + +void sub_802F7CC(void) +{ +    u8 *dst = (u8 *)&gPlayerParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1]; +    u8 i; + +    for (i = 0; i < gBattleBufferA[gActiveBank][2]; i++) +        dst[i] = gBattleBufferA[gActiveBank][3 + i]; +    PlayerBufferExecCompleted(); +} + +void PlayerHandleLoadPokeSprite(void) +{ +    sub_80318FC(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); +    gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; +    gBattleBankFunc[gActiveBank] = bx_0802E404; +} + +void PlayerHandleSendOutPoke(void) +{ +    sub_8032AA8(gActiveBank, gBattleBufferA[gActiveBank][2]); +    gBattlePartyID[gActiveBank] = gBattleBufferA[gActiveBank][1]; +    sub_80318FC(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); +    gActionSelectionCursor[gActiveBank] = 0; +    gMoveSelectionCursor[gActiveBank] = 0; +    sub_802F934(gActiveBank, gBattleBufferA[gActiveBank][2]); +    gBattleBankFunc[gActiveBank] = sub_802D798; +} + +void sub_802F934(u8 bank, u8 b) +{ +    u16 species; + +    sub_8032AA8(bank, b); +    gBattlePartyID[bank] = gBattleBufferA[bank][1]; +    species = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES); +    gUnknown_0300434C[bank] = CreateInvisibleSpriteWithCallback(sub_80312F0); +    GetMonSpriteTemplate_803C56C(species, GetBankIdentity(bank)); +    gObjectBankIDs[bank] = CreateSprite( +      &gUnknown_02024E8C, +      sub_8077ABC(bank, 2), +      sub_8077F68(bank), +      sub_8079E90(bank)); +    gSprites[gUnknown_0300434C[bank]].data1 = gObjectBankIDs[bank]; +    gSprites[gObjectBankIDs[bank]].data0 = bank; +    gSprites[gObjectBankIDs[bank]].data2 = species; +    gSprites[gObjectBankIDs[bank]].oam.paletteNum = bank; +    StartSpriteAnim(&gSprites[gObjectBankIDs[bank]], gBattleMonForms[bank]); +    gSprites[gObjectBankIDs[bank]].invisible = TRUE; +    gSprites[gObjectBankIDs[bank]].callback = SpriteCallbackDummy; +    gSprites[gUnknown_0300434C[bank]].data0 = sub_8046400(0, 0xFF); +} + +void PlayerHandleReturnPokeToBall(void) +{ +    if (gBattleBufferA[gActiveBank][1] == 0) +    { +        ewram17810[gActiveBank].unk4 = 0; +        gBattleBankFunc[gActiveBank] = sub_802FB2C; +    } +    else +    { +        FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); +        DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); +        sub_8043DB0(gHealthboxIDs[gActiveBank]); +        PlayerBufferExecCompleted(); +    } +} + +void sub_802FB2C(void) +{ +    switch (ewram17810[gActiveBank].unk4) +    { +    case 0: +        if (ewram17800[gActiveBank].unk0_2) +            move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 5); +        ewram17810[gActiveBank].unk4 = 1; +        break; +    case 1: +        if (!ewram17810[gActiveBank].unk0_6) +        { +            ewram17810[gActiveBank].unk4 = 0; +            move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 1); +            gBattleBankFunc[gActiveBank] = sub_802DEAC; +        } +    } +} + +void PlayerHandleTrainerThrow(void) +{ +    s16 r7; + +    if (gBattleTypeFlags & BATTLE_TYPE_MULTI) +    { +        if (GetBankIdentity(gActiveBank) & 2) +            r7 = 16; +        else +            r7 = -16; +    } +    else +    { +        r7 = 0; +    } +    sub_8031AF4(gSaveBlock2.playerGender, gActiveBank); +    GetMonSpriteTemplate_803C5A0(gSaveBlock2.playerGender, GetBankIdentity(gActiveBank)); +    gObjectBankIDs[gActiveBank] = CreateSprite( +      &gUnknown_02024E8C, +      r7 + 80, +      (8 - gTrainerBackPicCoords[gSaveBlock2.playerGender].coords) * 4 + 80, +      sub_8079E90(gActiveBank)); +    gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; +    gSprites[gObjectBankIDs[gActiveBank]].pos2.x = 240; +    gSprites[gObjectBankIDs[gActiveBank]].data0 = -2; +    gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0; +    gBattleBankFunc[gActiveBank] = sub_802D204; +} + +void PlayerHandleTrainerSlide(void) +{ +    sub_8031AF4(gSaveBlock2.playerGender, gActiveBank); +    GetMonSpriteTemplate_803C5A0(gSaveBlock2.playerGender, GetBankIdentity(gActiveBank)); +    gObjectBankIDs[gActiveBank] = CreateSprite( +      &gUnknown_02024E8C, +      80, +      (8 - gTrainerBackPicCoords[gSaveBlock2.playerGender].coords) * 4 + 80, +      30); +    gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; +    gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -96; +    gSprites[gObjectBankIDs[gActiveBank]].data0 = 2; +    gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0; +    gBattleBankFunc[gActiveBank] = sub_802D23C; +} + +void PlayerHandleTrainerSlideBack(void) +{ +    oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]); +    gSprites[gObjectBankIDs[gActiveBank]].data0 = 50; +    gSprites[gObjectBankIDs[gActiveBank]].data2 = -40; +    gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; +    gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; +    oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy); +    StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 1); +    gBattleBankFunc[gActiveBank] = sub_802D274; +} + +void sub_802FE7C(void) +{ +    if (ewram17810[gActiveBank].unk4 == 0) +    { +        if (ewram17800[gActiveBank].unk0_2) +            move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 5); +        ewram17810[gActiveBank].unk4++; +    } +    else +    { +        if (ewram17810[gActiveBank].unk0_6 == 0) +        { +            ewram17810[gActiveBank].unk4 = 0; +            sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); +            PlaySE12WithPanning(SE_POKE_DEAD, -64); +            gSprites[gObjectBankIDs[gActiveBank]].data1 = 0; +            gSprites[gObjectBankIDs[gActiveBank]].data2 = 5; +            gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80105EC; +            gBattleBankFunc[gActiveBank] = sub_802DE10; +        } +    } +} + +void sub_802FF60(void) +{ +    BeginNormalPaletteFade(0xFFFFFFFF, 2, 0, 16, 0); +    PlayerBufferExecCompleted(); +} + +void sub_802FF80(void) +{ +    ewram17840.unk8 = 4; +    gDoingBattleAnim = 1; +    move_anim_start_t4(gActiveBank, gActiveBank, GetBankByPlayerAI(1), 3); +    gBattleBankFunc[gActiveBank] = bx_wait_t1; +} + +void PlayerHandleBallThrow(void) +{ +    u8 var = gBattleBufferA[gActiveBank][1]; + +    ewram17840.unk8 = var; +    gDoingBattleAnim = 1; +    move_anim_start_t4(gActiveBank, gActiveBank, GetBankByPlayerAI(1), 3); +    gBattleBankFunc[gActiveBank] = bx_wait_t1; +} + +void PlayerHandlePuase(void) +{ +    u8 var = gBattleBufferA[gActiveBank][1]; + +    // WTF is this?? +    while (var != 0) +        var--; + +    PlayerBufferExecCompleted(); +} + +void PlayerHandleMoveAnimation(void) +{ +    if (!mplay_80342A4(gActiveBank)) +    { +        u16 r0 = gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8); + +        gUnknown_0202F7C4 = gBattleBufferA[gActiveBank][3]; +        gMovePowerMoveAnim = gBattleBufferA[gActiveBank][4] | (gBattleBufferA[gActiveBank][5] << 8); +        gMoveDmgMoveAnim = gBattleBufferA[gActiveBank][6] | (gBattleBufferA[gActiveBank][7] << 8) | (gBattleBufferA[gActiveBank][8] << 16) | (gBattleBufferA[gActiveBank][9] << 24); +        gHappinessMoveAnim = gBattleBufferA[gActiveBank][10]; +        gWeatherMoveAnim = gBattleBufferA[gActiveBank][12] | (gBattleBufferA[gActiveBank][13] << 8); +        gDisableStructMoveAnim = (u32 *)&gBattleBufferA[gActiveBank][16]; +        gPID_perBank[gActiveBank] = *gDisableStructMoveAnim; +        if (sub_8031720(r0, gUnknown_0202F7C4) != 0) +        { +            // Dead code. sub_8031720 always returns 0. +            PlayerBufferExecCompleted(); +        } +        else +        { +            ewram17810[gActiveBank].unk4 = 0; +            gBattleBankFunc[gActiveBank] = sub_8030190; +        } +    } +} + +void sub_8030190(void) +{ +    u16 r4 = gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8); +    u8 r7 = gBattleBufferA[gActiveBank][11]; + +    switch (ewram17810[gActiveBank].unk4) +    { +    case 0: +        if (ewram17800[gActiveBank].unk0_2 == 1 && ewram17800[gActiveBank].unk0_3 == 0) +        { +            ewram17800[gActiveBank].unk0_3 = 1; +            move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 5); +        } +        ewram17810[gActiveBank].unk4 = 1; +        break; +    case 1: +        if (ewram17810[gActiveBank].unk0_6 == 0) +        { +            sub_80326EC(0); +            ExecuteMoveAnim(r4); +            ewram17810[gActiveBank].unk4 = 2; +        } +        break; +    case 2: +        gAnimScriptCallback(); +        if (!gAnimScriptActive) +        { +            sub_80326EC(1); +            if (ewram17800[gActiveBank].unk0_2 == 1 && r7 < 2) +            { +                move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 6); +                ewram17800[gActiveBank].unk0_3 = 0; +            } +            ewram17810[gActiveBank].unk4 = 3; +        } +        break; +    case 3: +        if (ewram17810[gActiveBank].unk0_6 == 0) +        { +            sub_8031F24(); +            sub_80324BC(gActiveBank, gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); +            ewram17810[gActiveBank].unk4 = 0; +            PlayerBufferExecCompleted(); +        } +        break; +    } +} + +void PlayerHandlePrintString(void) +{ +    gUnknown_030042A4 = 0; +    gUnknown_030042A0 = 0; +    BufferStringBattle(*(u16 *)&gBattleBufferA[gActiveBank][2]); +    sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 0x90, 2, 15); +    gBattleBankFunc[gActiveBank] = sub_802DF18; +} + +void PlayerHandlePrintStringPlayerOnly(void) +{ +    if (GetBankSide(gActiveBank) == 0) +        PlayerHandlePrintString(); +    else +        PlayerBufferExecCompleted(); +} + +void sub_803037C(void) +{      int r4;      gUnknown_030042A4 = 0; @@ -38,20 +1029,479 @@ void sub_803037C(void) {      FillWindowRect(&gUnknown_03004210, 10, 2, 15, 27, 18);      FillWindowRect(&gUnknown_03004210, 10, 2, 35, 16, 38); -    gUnknown_03004330[gUnknown_02024A60] = sub_802C098; +    gBattleBankFunc[gActiveBank] = sub_802C098;      InitWindow(&gUnknown_03004210, gUnknown_08400CF3, 400, 18, 35);      sub_8002F44(&gUnknown_03004210);      sub_814A5C0(0, 0xFFFF, 12, 11679, 0);      for (r4 = 0; r4 < 4; r4++) -    {          nullsub_8(r4); -    } -    sub_802E3E4(gUnknown_02024E60[gUnknown_02024A60], 0); +    sub_802E3E4(gActionSelectionCursor[gActiveBank], 0); -    get_battle_strings_((u8 *) gUnknown_08400CA8); -    InitWindow(&gUnknown_03004210, gUnknown_020238CC, SUB_803037C_TILE_DATA_OFFSET, 2, 35); +    StrCpyDecodeToDisplayedStringBattle((u8 *) gUnknown_08400CA8); +    InitWindow(&gUnknown_03004210, gDisplayedStringBattle, SUB_803037C_TILE_DATA_OFFSET, 2, 35);      sub_8002F44(&gUnknown_03004210);  } + +void nullsub_42() +{ +} + +void sub_8030468(void) +{ +    sub_814A5C0(0, 0xFFFF, 12, 0x2D9F, 0); +    sub_80304A8(); +    gBattleBankFunc[gActiveBank] = sub_802C68C; +} + +void sub_80304A8(void) +{ +    gUnknown_030042A4 = 0; +    gUnknown_030042A0 = 320; +    sub_802E1B0(); +    gUnknown_03004344 = 0xFF; +    sub_802E3B4(gMoveSelectionCursor[gActiveBank], 0); +    if (gBattleBufferA[gActiveBank][2] != 1) +    { +        InitWindow(&gUnknown_03004210, gUnknown_08400D38, 656, 23, 55); +        sub_8002F44(&gUnknown_03004210); +    } +    sub_802E220(); +    sub_802E2D4(); +} + +void PlayerHandleOpenBag(void) +{ +    s32 i; + +    BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); +    gBattleBankFunc[gActiveBank] = sub_802E004; +    gBankInMenu = gActiveBank; +    for (i = 0; i < 3; i++) +        gUnknown_02038470[i] = gBattleBufferA[gActiveBank][1 + i]; +} + +void sub_8030594(void) +{ +    s32 i; + +    gUnknown_0300434C[gActiveBank] = CreateTask(TaskDummy, 0xFF); +    gTasks[gUnknown_0300434C[gActiveBank]].data[0] = gBattleBufferA[gActiveBank][1] & 0xF; +    ewram[0x16054] = gBattleBufferA[gActiveBank][1] >> 4; +    ewram[0x1609D] = gBattleBufferA[gActiveBank][2]; +    ewram[0x160C0] = gBattleBufferA[gActiveBank][3]; +    for (i = 0; i < 3; i++) +        gUnknown_02038470[i] = gBattleBufferA[gActiveBank][4 + i]; +    BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); +    gBattleBankFunc[gActiveBank] = sub_802DF30; +    gBankInMenu = gActiveBank; +} + +void sub_8030674(void) +{ +    sub_80325B8(); +    BeginNormalPaletteFade(0xFFFFFFFF, 2, 0, 16, 0); +    PlayerBufferExecCompleted(); +} + +void PlayerHandleHealthBarUpdate(void) +{ +    s16 r7; + +    load_gfxc_health_bar(0); +    r7 = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); +    if (r7 != 0x7FFF) +    { +        u32 maxHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP); +        u32 curHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_HP); + +        sub_8043D84(gActiveBank, gHealthboxIDs[gActiveBank], maxHP, curHP, r7); +    } +    else +    { +        u32 maxHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP); + +        sub_8043D84(gActiveBank, gHealthboxIDs[gActiveBank], maxHP, 0, r7); +        sub_80440EC(gHealthboxIDs[gActiveBank], 0, 0); +    } +    gBattleBankFunc[gActiveBank] = bx_t1_healthbar_update; +} + +void PlayerHandleExpBarUpdate(void) +{ +    u8 r7 = gBattleBufferA[gActiveBank][1]; + +    if (GetMonData(&gPlayerParty[r7], MON_DATA_LEVEL) >= 100) +    { +        PlayerBufferExecCompleted(); +    } +    else +    { +        u16 r4; +        u8 taskId; + +        load_gfxc_health_bar(1); +        GetMonData(&gPlayerParty[r7], MON_DATA_SPECIES);  // unused return value +        r4 = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); +        taskId = CreateTask(sub_802D924, 10); +        gTasks[taskId].data[0] = r7; +        gTasks[taskId].data[1] = r4; +        gTasks[taskId].data[2] = gActiveBank; +        gBattleBankFunc[gActiveBank] = nullsub_91; +    } +} + +void PlayerHandleStatusIconUpdate(void) +{ +    if (!mplay_80342A4(gActiveBank)) +    { +        sub_8045A5C(gHealthboxIDs[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], 9); +        ewram17810[gActiveBank].unk0_4 = 0; +        gBattleBankFunc[gActiveBank] = sub_802E434; +    } +} + +void PlayerHandleStatusAnimation(void) +{ +    if (!mplay_80342A4(gActiveBank)) +    { +        move_anim_start_t2_for_situation( +          gBattleBufferA[gActiveBank][1], +          gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8) | (gBattleBufferA[gActiveBank][4] << 16) | (gBattleBufferA[gActiveBank][5] << 24)); +        gBattleBankFunc[gActiveBank] = sub_802E434; +    } +} + +void PlayerHandleStatusXor(void) +{ +    u8 val = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_STATUS) ^ gBattleBufferA[gActiveBank][1]; + +    SetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_STATUS, &val); +    PlayerBufferExecCompleted(); +} + +void sub_803097C(void) +{ +    PlayerBufferExecCompleted(); +} + +void PlayerHandleDMATransfer(void) +{ +    u32 val1 = gBattleBufferA[gActiveBank][1] +            | (gBattleBufferA[gActiveBank][2] << 8) +            | (gBattleBufferA[gActiveBank][3] << 16) +            | (gBattleBufferA[gActiveBank][4] << 24); +    u16 val2 = gBattleBufferA[gActiveBank][5] | (gBattleBufferA[gActiveBank][6] << 8); + +    const u8 *src = &gBattleBufferA[gActiveBank][7]; +    u8 *dst = (u8 *)val1; +    u32 size = val2; + +    while (1) +    { +        if (size <= 0x1000) +        { +            DmaCopy16(3, src, dst, size); +            break; +        } +        DmaCopy16(3, src, dst, 0x1000); +        src += 0x1000; +        dst += 0x1000; +        size -= 0x1000; +    } +    PlayerBufferExecCompleted(); +} + +void sub_8030A3C(void) +{ +    PlayBGM(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); +    PlayerBufferExecCompleted(); +} + +void sub_8030A6C(void) +{ +    PlayerBufferExecCompleted(); +} + +void sub_8030A78(void) +{ +    dp01_build_cmdbuf_x21_a_bb(1, 0, 0); +    PlayerBufferExecCompleted(); +} + +void sub_8030A8C(void) +{ +    dp01_build_cmdbuf_x22_a_three_bytes(1, 0, 0); +    PlayerBufferExecCompleted(); +} + +void sub_8030AA0(void) +{ +    dp01_build_cmdbuf_x23_aa_0(1, 0); +    PlayerBufferExecCompleted(); +} + +void sub_8030AB4(void) +{ +    dp01_build_cmdbuf_x24_aa_0(1, 0); +    PlayerBufferExecCompleted(); +} + +void sub_8030AC8(void) +{ +    gUnknown_020238C8.unk0_0 = 0; +    PlayerBufferExecCompleted(); +} + +void sub_8030AE4(void) +{ +    gUnknown_020238C8.unk0_0 = gBattleBufferA[gActiveBank][1]; +    PlayerBufferExecCompleted(); +} + +void sub_8030B1C(void) +{ +    gUnknown_020238C8.unk0_7 = 0; +    PlayerBufferExecCompleted(); +} + +void sub_8030B34(void) +{ +    gUnknown_020238C8.unk0_7 ^= 1; +    PlayerBufferExecCompleted(); +} + +void PlayerHandleHitAnimation(void) +{ +    if (gSprites[gObjectBankIDs[gActiveBank]].invisible == TRUE) +    { +        PlayerBufferExecCompleted(); +    } +    else +    { +        gDoingBattleAnim = 1; +        gSprites[gObjectBankIDs[gActiveBank]].data1 = 0; +        sub_8047858(gActiveBank); +        gBattleBankFunc[gActiveBank] = bx_blink_t1; +    } +} + +void sub_8030BCC(void) +{ +    PlayerBufferExecCompleted(); +} + +void PlayerHandleEffectivenessSound(void) +{ +    s8 pan; + +    if (GetBankSide(gActiveBank) == 0) +        pan = -64; +    else +        pan = 63; +    PlaySE12WithPanning(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8), pan); +    PlayerBufferExecCompleted(); +} + +void sub_8030C1C(void) +{ +    PlayFanfare(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); +    PlayerBufferExecCompleted(); +} + +void PlayerHandleFaintingCry(void) +{ +    u16 species = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES); + +    PlayCry3(species, -25, 5); +    PlayerBufferExecCompleted(); +} + +void PlayerHandleIntroSlide(void) +{ +    sub_80E43C0(gBattleBufferA[gActiveBank][1]); +    gUnknown_02024DE8 |= 1; +    PlayerBufferExecCompleted(); +} + +void PlayerHandleTrainerBallThrow(void) +{ +    u8 paletteNum; +    u8 taskId; + +    oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]); +    gSprites[gObjectBankIDs[gActiveBank]].data0 = 50; +    gSprites[gObjectBankIDs[gActiveBank]].data2 = -40; +    gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; +    gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; +    gSprites[gObjectBankIDs[gActiveBank]].data5 = gActiveBank; +    oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], sub_8030E38); +    StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 1); +    paletteNum = AllocSpritePalette(0xD6F8); +    LoadCompressedPalette(gTrainerBackPicPaletteTable[gSaveBlock2.playerGender].data, 0x100 + paletteNum * 16, 32); +    gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = paletteNum; +    taskId = CreateTask(task05_08033660, 5); +    gTasks[taskId].data[0] = gActiveBank; +    if (ewram17810[gActiveBank].unk0_0) +        gTasks[gUnknown_02024E68[gActiveBank]].func = sub_8044CA0; +    ewram17810[4].unk9 |= 1; +    gBattleBankFunc[gActiveBank] = nullsub_91; +} + +void sub_8030E38(struct Sprite *sprite) +{ +    u8 r4 = sprite->data5; + +    FreeSpriteOamMatrix(sprite); +    FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum)); +    DestroySprite(sprite); +    sub_80318FC(&gPlayerParty[gBattlePartyID[r4]], r4); +    StartSpriteAnim(&gSprites[gObjectBankIDs[r4]], 0); +} + +void task05_08033660(u8 taskId) +{ +    if (gTasks[taskId].data[1] < 31) +    { +        gTasks[taskId].data[1]++; +    } +    else +    { +        u8 savedActiveBank = gActiveBank; + +        gActiveBank = gTasks[taskId].data[0]; +        if (!IsDoubleBattle() || (gBattleTypeFlags & 0x40)) +        { +            gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank]; +            sub_802F934(gActiveBank, 0); +        } +        else +        { +            gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank]; +            sub_802F934(gActiveBank, 0); +            gActiveBank ^= 2; +            gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank]; +            sub_80318FC(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); +            sub_802F934(gActiveBank, 0); +            gActiveBank ^= 2; +        } +        gBattleBankFunc[gActiveBank] = sub_802D500; +        gActiveBank = savedActiveBank; +        DestroyTask(taskId); +    } +} + +void sub_8030FAC(void) +{ +    if (gBattleBufferA[gActiveBank][1] != 0 && GetBankSide(gActiveBank) == 0) +    { +        PlayerBufferExecCompleted(); +    } +    else +    { +        ewram17810[gActiveBank].unk0_0 = 1; +        gUnknown_02024E68[gActiveBank] = sub_8044804(gActiveBank, (struct BattleInterfaceStruct2 *)&gBattleBufferA[gActiveBank][4], gBattleBufferA[gActiveBank][1], gBattleBufferA[gActiveBank][2]); +        ewram17810[gActiveBank].unk5 = 0; +        if (gBattleBufferA[gActiveBank][2] != 0) +            ewram17810[gActiveBank].unk5 = 0x5D; +        gBattleBankFunc[gActiveBank] = sub_8031064; +    } +} + +void sub_8031064(void) +{ +    if (ewram17810[gActiveBank].unk5++ > 0x5C) +    { +        ewram17810[gActiveBank].unk5 = 0; +        PlayerBufferExecCompleted(); +    } +} + +void sub_80310A4(void) +{ +    if (ewram17810[gActiveBank].unk0_0) +        gTasks[gUnknown_02024E68[gActiveBank]].func = sub_8044CA0; +    PlayerBufferExecCompleted(); +} + +void sub_80310F0(void) +{ +    dp11b_obj_free(gActiveBank, 1); +    dp11b_obj_free(gActiveBank, 0); +    PlayerBufferExecCompleted(); +} + +void PlayerHandleSpriteInvisibility(void) +{ +    if (sub_8078874(gActiveBank)) +    { +        gSprites[gObjectBankIDs[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1]; +        sub_8031F88(gActiveBank); +    } +    PlayerBufferExecCompleted(); +} + +void PlayerHandleBattleAnimation(void) +{ +    if (!mplay_80342A4(gActiveBank)) +    { +        u8 val2 = gBattleBufferA[gActiveBank][1]; +        u16 val = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); + +        if (move_anim_start_t3(gActiveBank, gActiveBank, gActiveBank, val2, val)) +            PlayerBufferExecCompleted(); +        else +            gBattleBankFunc[gActiveBank] = sub_802E460; +    } +} + +void PlayerHandleLinkStandbyMsg(void) +{ +    switch (gBattleBufferA[gActiveBank][1]) +    { +    case 0: +        b_link_standby_message(); +        // fall through +    case 1: +        dp11b_obj_free(gActiveBank, 1); +        dp11b_obj_free(gActiveBank, 0); +        break; +    case 2: +        b_link_standby_message(); +        break; +    } +    PlayerBufferExecCompleted(); +} + +void PlayerHandleResetActionMoveSelection(void) +{ +    switch (gBattleBufferA[gActiveBank][1]) +    { +    case 0: +        gActionSelectionCursor[gActiveBank] = 0; +        gMoveSelectionCursor[gActiveBank] = 0; +        break; +    case 1: +        gActionSelectionCursor[gActiveBank] = 0; +        break; +    case 2: +        gMoveSelectionCursor[gActiveBank] = 0; +        break; +    } +    PlayerBufferExecCompleted(); +} + +void sub_80312A0(void) +{ +    gBattleOutcome = gBattleBufferA[gActiveBank][1]; +    FadeOutMapMusic(5); +    BeginFastPaletteFade(3); +    PlayerBufferExecCompleted(); +    gBattleBankFunc[gActiveBank] = sub_802D18C; +} + +void nullsub_43(void) +{ +} | 
