#include "global.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 "task.h" #include "text.h" #include "util.h" extern u16 gUnknown_030042A4; extern u16 gUnknown_030042A0; extern struct Window gUnknown_03004210; extern void (*gBattleBankFunc[])(void); 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 #elif GERMAN #define SUB_803037C_TILE_DATA_OFFSET 444 #endif 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(); 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 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]; 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; gUnknown_030042A0 = 160; FillWindowRect(&gUnknown_03004210, 10, 2, 15, 27, 18); FillWindowRect(&gUnknown_03004210, 10, 2, 35, 16, 38); 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(gActionSelectionCursor[gActiveBank], 0); 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) { }