diff options
Diffstat (limited to 'src/misc/rom3.c')
-rw-r--r-- | src/misc/rom3.c | 1168 |
1 files changed, 1168 insertions, 0 deletions
diff --git a/src/misc/rom3.c b/src/misc/rom3.c new file mode 100644 index 000000000..3f4860ecc --- /dev/null +++ b/src/misc/rom3.c @@ -0,0 +1,1168 @@ +#include "global.h" +#include "battle.h" +#include "battle_811DA74.h" +#include "battle_ai.h" +#include "battle_anim.h" +#include "battle_anim_81258BC.h" +#include "battle_anim_8137220.h" +#include "cable_club.h" +#include "items.h" +#include "link.h" +#include "pokemon.h" +#include "rom3.h" +#include "rom_8094928.h" +#include "species.h" +#include "task.h" +#include "util.h" +#include "battle_message.h" +#include "data2.h" + +extern u8 unk_2000000[]; + +#define EWRAM_14000 ((u8 *)(unk_2000000 + 0x14000)) +#define EWRAM_15000 ((u8 *)(unk_2000000 + 0x15000)) + +extern u16 gBattleTypeFlags; +extern u16 gBattleWeather; +extern struct BattlePokemon gBattleMons[]; + +static EWRAM_DATA u8 gUnknown_020238C4 = 0; +static EWRAM_DATA u8 gUnknown_020238C5 = 0; +static EWRAM_DATA u8 gUnknown_020238C6 = 0; + +extern u32 gUnknown_020239FC; +extern u8 gBattleBufferA[][0x200]; +extern u8 gBattleBufferB[][0x200]; +extern u8 gActiveBank; +extern u32 gBattleExecBuffer; +extern u8 gNoOfAllBanks; +extern u16 gBattlePartyID[]; +extern u8 gBanksBySide[]; +extern u16 gCurrentMove; +extern u16 gUnknown_02024BE8; +extern u16 gLastUsedItem; +extern u8 gLastUsedAbility; +extern u8 gBankAttacker; +extern u8 gBankTarget; +extern u8 gEffectBank; +extern u8 gStringBank; +extern u8 gAbsentBankFlags; +extern u8 gMultiHitCounter; +extern u8 gUnknown_02024C78; +extern u8 gBattleOutcome; +extern u8 gActionSelectionCursor[]; +extern u8 gMoveSelectionCursor[]; +extern u8 gBattleTextBuff1[]; +extern u8 gBattleTextBuff2[]; +extern u8 gBattleTextBuff3[]; +extern void (*gBattleMainFunc)(void); +extern void (*gBattleBankFunc[])(void); + +u8 gBattleBuffersTransferData[0x170]; + +void sub_800B858(void) +{ + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + OpenLink(); + CreateTask(sub_8083C50, 0); + sub_800BF28(); + } +} + +void setup_poochyena_battle(void) +{ + s32 i; + + gBattleMainFunc = nullsub_41; + for (i = 0; i < 4; i++) + { + gBattleBankFunc[i] = nullsub_91; + gBanksBySide[i] = 0xFF; + gActionSelectionCursor[i] = 0; + gMoveSelectionCursor[i] = 0; + } + sub_800B858(); + gBattleExecBuffer = 0; + battle_anim_clear_some_data(); + ClearBattleMonForms(); + BattleAI_HandleItemUseBeforeAISetup(); + if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) + { + ZeroEnemyPartyMons(); + CreateMon(&gEnemyParty[0], SPECIES_POOCHYENA, 2, 32, 0, 0, 0, 0); + i = ITEM_NONE; + SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, (u8 *)&i); + } + gUnknown_020239FC = 0; + gUnknown_02024C78 = 0; +} + +void sub_800B950(void) +{ + s32 i; + + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + sub_800BA78(); + else + sub_800B9A8(); + sub_800BD54(); + if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) + { + for (i = 0; i < gNoOfAllBanks; i++) + sub_8094978(i, 0); + } +} + +void sub_800B9A8(void) +{ + if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + { + gBattleMainFunc = sub_8010800; + if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) + gBattleBankFunc[0] = SetBankFuncToSafariBufferRunCommand; + else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL) + gBattleBankFunc[0] = SetBankFuncToWallyBufferRunCommand; + else + gBattleBankFunc[0] = SetBankFuncToPlayerBufferRunCommand; + gBanksBySide[0] = 0; + gBattleBankFunc[1] = SetBankFuncToOpponentBufferRunCommand; + gBanksBySide[1] = 1; + gNoOfAllBanks = 2; + } + else + { + gBattleMainFunc = sub_8010800; + gBattleBankFunc[0] = SetBankFuncToPlayerBufferRunCommand; + gBanksBySide[0] = 0; + gBattleBankFunc[1] = SetBankFuncToOpponentBufferRunCommand; + gBanksBySide[1] = 1; + gBattleBankFunc[2] = SetBankFuncToPlayerBufferRunCommand; + gBanksBySide[2] = 2; + gBattleBankFunc[3] = SetBankFuncToOpponentBufferRunCommand; + gBanksBySide[3] = 3; + gNoOfAllBanks = 4; + } +} + +void sub_800BA78(void) +{ + u8 multiplayerId; + int i; + + if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + { + if (gBattleTypeFlags & BATTLE_TYPE_WILD) + { + gBattleMainFunc = sub_8010800; + gBattleBankFunc[0] = SetBankFuncToPlayerBufferRunCommand; + gBanksBySide[0] = 0; + gBattleBankFunc[1] = SetBankFuncToLinkOpponentBufferRunCommand; + gBanksBySide[1] = 1; + gNoOfAllBanks = 2; + } + else + { + gBattleBankFunc[1] = SetBankFuncToPlayerBufferRunCommand; + gBanksBySide[1] = 0; + gBattleBankFunc[0] = SetBankFuncToLinkOpponentBufferRunCommand; + gBanksBySide[0] = 1; + gNoOfAllBanks = 2; + } + return; + } + if ((gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_DOUBLE)) == BATTLE_TYPE_DOUBLE) + { + if (gBattleTypeFlags & BATTLE_TYPE_WILD) + { + gBattleMainFunc = sub_8010800; + gBattleBankFunc[0] = SetBankFuncToPlayerBufferRunCommand; + gBanksBySide[0] = 0; + gBattleBankFunc[1] = SetBankFuncToLinkOpponentBufferRunCommand; + gBanksBySide[1] = 1; + gBattleBankFunc[2] = SetBankFuncToPlayerBufferRunCommand; + gBanksBySide[2] = 2; + gBattleBankFunc[3] = SetBankFuncToLinkOpponentBufferRunCommand; + gBanksBySide[3] = 3; + gNoOfAllBanks = 4; + } + else + { + gBattleBankFunc[1] = SetBankFuncToPlayerBufferRunCommand; + gBanksBySide[1] = 0; + gBattleBankFunc[0] = SetBankFuncToLinkOpponentBufferRunCommand; + gBanksBySide[0] = 1; + gBattleBankFunc[3] = SetBankFuncToPlayerBufferRunCommand; + gBanksBySide[3] = 2; + gBattleBankFunc[2] = SetBankFuncToLinkOpponentBufferRunCommand; + gBanksBySide[2] = 3; + gNoOfAllBanks = 4; + + } + return; + } + multiplayerId = GetMultiplayerId(); + if (gBattleTypeFlags & BATTLE_TYPE_WILD) + gBattleMainFunc = sub_8010800; + for (i = 0; i < 4; i++) + { + switch (gLinkPlayers[i].lp_field_18) + { + case 0: + case 3: + sub_8094978(gLinkPlayers[i].lp_field_18, 0); + break; + case 1: + case 2: + sub_8094978(gLinkPlayers[i].lp_field_18, 1); + break; + } + + if (i == multiplayerId) + { + gBattleBankFunc[gLinkPlayers[i].lp_field_18] = SetBankFuncToPlayerBufferRunCommand; + switch (gLinkPlayers[i].lp_field_18) + { + case 0: + case 3: + gBanksBySide[gLinkPlayers[i].lp_field_18] = 0; + gBattlePartyID[gLinkPlayers[i].lp_field_18] = 0; + break; + case 1: + case 2: + gBanksBySide[gLinkPlayers[i].lp_field_18] = 2; + gBattlePartyID[gLinkPlayers[i].lp_field_18] = 3; + break; + } + } + else + { + if ((!(gLinkPlayers[i].lp_field_18 & 1) && !(gLinkPlayers[multiplayerId].lp_field_18 & 1)) + || ((gLinkPlayers[i].lp_field_18 & 1) && (gLinkPlayers[multiplayerId].lp_field_18 & 1))) + { + gBattleBankFunc[gLinkPlayers[i].lp_field_18] = SetBankFuncToLinkPartnerBufferRunCommand; + switch (gLinkPlayers[i].lp_field_18) + { + case 0: + case 3: + gBanksBySide[gLinkPlayers[i].lp_field_18] = 0; + gBattlePartyID[gLinkPlayers[i].lp_field_18] = 0; + break; + case 1: + case 2: + gBanksBySide[gLinkPlayers[i].lp_field_18] = 2; + gBattlePartyID[gLinkPlayers[i].lp_field_18] = 3; + break; + } + } + else + { + gBattleBankFunc[gLinkPlayers[i].lp_field_18] = SetBankFuncToLinkOpponentBufferRunCommand; + switch (gLinkPlayers[i].lp_field_18) + { + case 0: + case 3: + gBanksBySide[gLinkPlayers[i].lp_field_18] = 1; + gBattlePartyID[gLinkPlayers[i].lp_field_18] = 0; + break; + case 1: + case 2: + gBanksBySide[gLinkPlayers[i].lp_field_18] = 3; + gBattlePartyID[gLinkPlayers[i].lp_field_18] = 3; + break; + } + } + } + } + gNoOfAllBanks = 4; +} + +void sub_800BD54(void) +{ + int i; + int j; + + if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) + { + for (i = 0; i < gNoOfAllBanks; i++) + { + for (j = 0; j < 6; j++) + { + if (i < 2) + { + if (!(gBanksBySide[i] & 1)) + { + if (GetMonData(&gPlayerParty[j], MON_DATA_HP) != 0 + && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES2) != 0 + && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES2) != SPECIES_EGG + && GetMonData(&gPlayerParty[j], MON_DATA_IS_EGG) == 0) + { + gBattlePartyID[i] = j; + break; + } + } + else + { + if (GetMonData(&gEnemyParty[j], MON_DATA_HP) != 0 + && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != 0 + && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != SPECIES_EGG + && GetMonData(&gEnemyParty[j], MON_DATA_IS_EGG) == 0) + { + gBattlePartyID[i] = j; + break; + } + } + } + else + { + if (!(gBanksBySide[i] & 1)) + { + if (GetMonData(&gPlayerParty[j], MON_DATA_HP) != 0 + && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES) != 0 //Probably a typo by Game Freak. The rest use SPECIES2 + && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES2) != SPECIES_EGG + && GetMonData(&gPlayerParty[j], MON_DATA_IS_EGG) == 0 + && gBattlePartyID[i - 2] != j) + { + gBattlePartyID[i] = j; + break; + } + } + else + { + if (GetMonData(&gEnemyParty[j], MON_DATA_HP) != 0 + && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != 0 + && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != SPECIES_EGG + && GetMonData(&gEnemyParty[j], MON_DATA_IS_EGG) == 0 + && gBattlePartyID[i - 2] != j) + { + gBattlePartyID[i] = j; + break; + } + } + } + } + } + } +} + +void PrepareBufferDataTransfer(u8 a, u8 *data, u16 size) +{ + int i; + + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + PrepareBufferDataTransferLink(a, size, data); + } + else + { + switch (a) + { + case 0: + for (i = 0; i < size; i++) + { + gBattleBufferA[gActiveBank][i] = *data; + data++; + } + break; + case 1: + for (i = 0; i < size; i++) + { + gBattleBufferB[gActiveBank][i] = *data; + data++; + } + break; + } + } +} + +void sub_800BF28(void) +{ + gUnknown_020238C4 = CreateTask(sub_800C1A8, 0); + gTasks[gUnknown_020238C4].data[11] = 0; + gTasks[gUnknown_020238C4].data[12] = 0; + gTasks[gUnknown_020238C4].data[13] = 0; + gTasks[gUnknown_020238C4].data[14] = 0; + gTasks[gUnknown_020238C4].data[15] = 0; + gUnknown_020238C5 = CreateTask(sub_800C47C, 0); + gTasks[gUnknown_020238C5].data[12] = 0; + gTasks[gUnknown_020238C5].data[13] = 0; + gTasks[gUnknown_020238C5].data[14] = 0; + gTasks[gUnknown_020238C5].data[15] = 0; + gUnknown_020238C6 = 0; + CpuFill16(0, EWRAM_14000, 0x2000); +} + +void PrepareBufferDataTransferLink(u8 a, u16 size, u8 *data) +{ + s32 r9; + int i; + + r9 = size - size % 4 + 4; + if (gTasks[gUnknown_020238C4].data[14] + r9 + 9 > 0x1000) + { + gTasks[gUnknown_020238C4].data[12] = gTasks[gUnknown_020238C4].data[14]; + gTasks[gUnknown_020238C4].data[14] = 0; + } + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14000] = a; + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14001] = gActiveBank; + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14002] = gBankAttacker; + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14003] = gBankTarget; + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14004] = r9; + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14005] = (r9 & 0x0000FF00) >> 8; + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14006] = gAbsentBankFlags; + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14007] = gEffectBank; + for (i = 0; i < size; i++) + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14008 + i] = data[i]; + gTasks[gUnknown_020238C4].data[14] = gTasks[gUnknown_020238C4].data[14] + r9 + 8; +} + +void sub_800C1A8(u8 taskId) +{ + u16 var; + + switch (gTasks[taskId].data[11]) + { + case 0: + gTasks[taskId].data[10] = 100; + gTasks[taskId].data[11]++; + break; + case 1: + gTasks[taskId].data[10]--; + if (gTasks[taskId].data[10] == 0) + gTasks[taskId].data[11]++; + break; + case 2: + GetLinkPlayerCount_2(); + if (IsLinkMaster()) + { + sub_8007F4C(); + gTasks[taskId].data[11]++; + break; + } + gTasks[taskId].data[11]++; + break; + case 3: + if (gTasks[taskId].data[15] != gTasks[taskId].data[14]) + { + if (gTasks[taskId].data[13] == 0) + { + if (gTasks[taskId].data[15] > gTasks[taskId].data[14] + && gTasks[taskId].data[15] == gTasks[taskId].data[12]) + { + gTasks[taskId].data[12] = 0; + gTasks[taskId].data[15] = 0; + } + var = (unk_2000000[gTasks[taskId].data[15] + 0x14004] | (unk_2000000[gTasks[taskId].data[15] + 0x14005] << 8)) + 8; + SendBlock(bitmask_all_link_players_but_self(), &unk_2000000[gTasks[taskId].data[15] + 0x14000], var); + gTasks[taskId].data[11]++; + } + else + { + gTasks[taskId].data[13]--; + break; + } + } + break; + case 4: + if (sub_8007ECC()) + { + var = unk_2000000[gTasks[taskId].data[15] + 0x14004] | (unk_2000000[gTasks[taskId].data[15] + 0x14005] << 8); + gTasks[taskId].data[13] = 1; + gTasks[taskId].data[15] = gTasks[taskId].data[15] + var + 8; + gTasks[taskId].data[11] = 3; + } + break; + case 5: + gTasks[taskId].data[13]--; + if (gTasks[taskId].data[13] == 0) + { + gTasks[taskId].data[13] = 1; + gTasks[taskId].data[11] = 3; + } + break; + } +} + +//fix me +void sub_800C35C(void) +{ + u8 i; //r4 + s32 j; //r2 + u16 r6; //r6 + u8 *recvBuffer; //r3 + u8 *dest; //r5 + u8 *src; //r4 + + if (gReceivedRemoteLinkPlayers != 0 && (gBattleTypeFlags & 0x20) && gLinkPlayers[0].linkType == 0x2211) + { + for (i = 0; i < GetLinkPlayerCount(); i++) + { + if (GetBlockReceivedStatus() & gBitTable[i]) + { + ResetBlockReceivedFlag(i); + recvBuffer = (u8 *)&gBlockRecvBuffer[i]; +#ifndef NONMATCHING + asm(""); + recvBuffer = (u8 *)&gBlockRecvBuffer[i]; +#endif + r6 = gBlockRecvBuffer[i][2]; + if (gTasks[gUnknown_020238C5].data[14] + 9 + r6 > 0x1000) + { + gTasks[gUnknown_020238C5].data[12] = gTasks[gUnknown_020238C5].data[14]; + gTasks[gUnknown_020238C5].data[14] = 0; + } + //_0800C402 + dest = EWRAM_15000 + gTasks[gUnknown_020238C5].data[14]; + src = recvBuffer; + for (j = 0; j < r6 + 8; j++) + dest[j] = src[j]; + gTasks[gUnknown_020238C5].data[14] = gTasks[gUnknown_020238C5].data[14] + r6 + 8; + } + //_0800C446 + } + } +} + +void sub_800C47C(u8 taskId) +{ + u16 r7; + u8 r4; + u8 r2; + + if (gTasks[taskId].data[15] != gTasks[taskId].data[14]) + { + if (gTasks[taskId].data[15] > gTasks[taskId].data[14] + && gTasks[taskId].data[15] == gTasks[taskId].data[12]) + { + gTasks[taskId].data[12] = 0; + gTasks[taskId].data[15] = 0; + } + r4 = unk_2000000[0x15000 + gTasks[taskId].data[15] + 1]; + r7 = unk_2000000[0x15000 + gTasks[taskId].data[15] + 4] | (unk_2000000[0x15000 + gTasks[taskId].data[15] + 5] << 8); + switch (unk_2000000[0x15000 + gTasks[taskId].data[15] + 0]) + { + case 0: + if (gBattleExecBuffer & gBitTable[r4]) + return; + memcpy(gBattleBufferA[r4], &unk_2000000[0x15000 + gTasks[taskId].data[15] + 8], r7); + sub_80155A4(r4); + if (!(gBattleTypeFlags & BATTLE_TYPE_WILD)) + { + gBankAttacker = unk_2000000[0x15000 + gTasks[taskId].data[15] + 2]; + gBankTarget = unk_2000000[0x15000 + gTasks[taskId].data[15] + 3]; + gAbsentBankFlags = unk_2000000[0x15000 + gTasks[taskId].data[15] + 6]; + gEffectBank = unk_2000000[0x15000 + gTasks[taskId].data[15] + 7]; + } + break; + case 1: + memcpy(gBattleBufferB[r4], &unk_2000000[0x15000 + gTasks[taskId].data[15] + 8], r7); + break; + case 2: + r2 = unk_2000000[0x15000 + gTasks[taskId].data[15] + 8]; + gBattleExecBuffer &= ~(gBitTable[r4] << (r2 * 4)); + break; + } + gTasks[taskId].data[15] = gTasks[taskId].data[15] + r7 + 8; + } +} + +void EmitGetAttributes(u8 a, u8 b, u8 c) +{ + gBattleBuffersTransferData[0] = 0; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = c; + gBattleBuffersTransferData[3] = 0; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void Emitcmd1(u8 a, u8 b, u8 c) +{ + gBattleBuffersTransferData[0] = 1; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = c; + gBattleBuffersTransferData[3] = 0; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void EmitSetAttributes(u8 a, u8 b, u8 c, u8 d, void *e) +{ + int i; + + gBattleBuffersTransferData[0] = 2; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = c; + for (i = 0; i < d; i++) + gBattleBuffersTransferData[3 + i] = *(u8*)(e++); + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, d + 3); +} + +void Emitcmd3(u8 a, u8 b, u8 c, u8 *d) +{ + int i; + + gBattleBuffersTransferData[0] = 3; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = c; + for (i = 0; i < c; i++) + gBattleBuffersTransferData[3 + i] = *(d++); + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, c + 3); +} + +void EmitLoadPokeSprite(u8 a) +{ + gBattleBuffersTransferData[0] = 4; + gBattleBuffersTransferData[1] = 4; + gBattleBuffersTransferData[2] = 4; + gBattleBuffersTransferData[3] = 4; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void EmitSendOutPoke(u8 a, u8 b, u8 c) +{ + gBattleBuffersTransferData[0] = 5; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = c; + gBattleBuffersTransferData[3] = 5; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void EmitReturnPokeToBall(u8 a, u8 b) +{ + gBattleBuffersTransferData[0] = 6; + gBattleBuffersTransferData[1] = b; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 2); +} + +void EmitTrainerThrow(u8 a) +{ + gBattleBuffersTransferData[0] = 7; + gBattleBuffersTransferData[1] = 7; + gBattleBuffersTransferData[2] = 7; + gBattleBuffersTransferData[3] = 7; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void EmitTrainerSlide(u8 a) +{ + gBattleBuffersTransferData[0] = 8; + gBattleBuffersTransferData[1] = 8; + gBattleBuffersTransferData[2] = 8; + gBattleBuffersTransferData[3] = 8; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void EmitTrainerSlideBack(u8 a) +{ + gBattleBuffersTransferData[0] = 9; + gBattleBuffersTransferData[1] = 9; + gBattleBuffersTransferData[2] = 9; + gBattleBuffersTransferData[3] = 9; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void Emitcmd10(u8 a) +{ + gBattleBuffersTransferData[0] = 10; + gBattleBuffersTransferData[1] = 10; + gBattleBuffersTransferData[2] = 10; + gBattleBuffersTransferData[3] = 10; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void Emitcmd11(u8 a) +{ + gBattleBuffersTransferData[0] = 11; + gBattleBuffersTransferData[1] = 11; + gBattleBuffersTransferData[2] = 11; + gBattleBuffersTransferData[3] = 11; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void Emitcmd12(u8 a) +{ + gBattleBuffersTransferData[0] = 12; + gBattleBuffersTransferData[1] = 12; + gBattleBuffersTransferData[2] = 12; + gBattleBuffersTransferData[3] = 12; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void EmitBallThrow(u8 a, u8 b) +{ + gBattleBuffersTransferData[0] = 13; + gBattleBuffersTransferData[1] = b; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 2); +} + +void EmitPuase(u8 a, u8 b, u8 *c) +{ + int i; + + gBattleBuffersTransferData[0] = 14; + gBattleBuffersTransferData[1] = b; + for (i = 0; i < b * 3; i++) + gBattleBuffersTransferData[2 + i] = *(c++); + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, b * 3 + 2); +} + +void EmitMoveAnimation(u8 a, u16 b, u8 c, u16 d, s32 e, u8 f, struct DisableStruct *g) +{ + gBattleBuffersTransferData[0] = 15; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; + gBattleBuffersTransferData[3] = c; + gBattleBuffersTransferData[4] = d; + gBattleBuffersTransferData[5] = (d & 0xFF00) >> 8; + gBattleBuffersTransferData[6] = e; + gBattleBuffersTransferData[7] = (e & 0x0000FF00) >> 8; + gBattleBuffersTransferData[8] = (e & 0x00FF0000) >> 16; + gBattleBuffersTransferData[9] = (e & 0xFF000000) >> 24; + gBattleBuffersTransferData[10] = f; + gBattleBuffersTransferData[11] = gMultiHitCounter; + if (AbilityBattleEffects(14, 0, 13, 0, 0) == 0 && AbilityBattleEffects(14, 0, 0x4D, 0, 0) == 0) + { + gBattleBuffersTransferData[12] = gBattleWeather; + gBattleBuffersTransferData[13] = (gBattleWeather & 0xFF00) >> 8; + } + else + { + gBattleBuffersTransferData[12] = 0; + gBattleBuffersTransferData[13] = 0; + } + gBattleBuffersTransferData[14] = 0; + gBattleBuffersTransferData[15] = 0; + memcpy(&gBattleBuffersTransferData[16], g, sizeof(*g)); + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 0x2C); +} + +void EmitPrintString(u8 a, u16 stringID) +{ + s32 i; + struct StringInfoBattle* stringInfo; + + gBattleBuffersTransferData[0] = 16; + gBattleBuffersTransferData[1] = gBattleOutcome; + gBattleBuffersTransferData[2] = stringID; + gBattleBuffersTransferData[3] = (stringID & 0xFF00) >> 8; + + stringInfo = (struct StringInfoBattle*)(&gBattleBuffersTransferData[4]); + stringInfo->currentMove = gCurrentMove; + stringInfo->lastMove = gUnknown_02024BE8; + stringInfo->lastItem = gLastUsedItem; + stringInfo->lastAbility = gLastUsedAbility; + stringInfo->scrActive = BATTLE_STRUCT->scriptingActive; + stringInfo->unk1605E = BATTLE_STRUCT->unk1605E; + stringInfo->hpScale = BATTLE_STRUCT->hpScale; + stringInfo->StringBank = gStringBank; + stringInfo->moveType = gBattleMoves[gCurrentMove].type; + + for (i = 0; i < 4; i++) + stringInfo->abilities[i] = gBattleMons[i].ability; + for (i = 0; i < 0x10; i++) + { + stringInfo->textBuffs[0][i] = gBattleTextBuff1[i]; + stringInfo->textBuffs[1][i] = gBattleTextBuff2[i]; + stringInfo->textBuffs[2][i] = gBattleTextBuff3[i]; + } + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, sizeof(struct StringInfoBattle) + 4); +} + +void EmitPrintStringPlayerOnly(u8 a, u16 stringID) +{ + s32 i; + struct StringInfoBattle* stringInfo; + + gBattleBuffersTransferData[0] = 17; + gBattleBuffersTransferData[1] = 17; + gBattleBuffersTransferData[2] = stringID; + gBattleBuffersTransferData[3] = (stringID & 0xFF00) >> 8; + + stringInfo = (struct StringInfoBattle*)(&gBattleBuffersTransferData[4]); + stringInfo->currentMove = gCurrentMove; + stringInfo->lastMove = gUnknown_02024BE8; + stringInfo->lastItem = gLastUsedItem; + stringInfo->lastAbility = gLastUsedAbility; + stringInfo->scrActive = BATTLE_STRUCT->scriptingActive; + stringInfo->unk1605E = BATTLE_STRUCT->unk1605E; + + for (i = 0; i < 4; i++) + stringInfo->abilities[i] = gBattleMons[i].ability; + for (i = 0; i < 0x10; i++) + { + stringInfo->textBuffs[0][i] = gBattleTextBuff1[i]; + stringInfo->textBuffs[1][i] = gBattleTextBuff2[i]; + stringInfo->textBuffs[2][i] = gBattleTextBuff3[i]; + } + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, sizeof(struct StringInfoBattle) + 4); +} + +void Emitcmd18(u8 a, u8 b, u16 c) +{ + gBattleBuffersTransferData[0] = 18; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = c; + gBattleBuffersTransferData[3] = (c & 0xFF00) >> 8; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void Emitcmd19(u8 a, u8 b) +{ + gBattleBuffersTransferData[0] = 19; + gBattleBuffersTransferData[1] = b; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 2); +} + +void Emitcmd20(u8 a, u8 b, u8 c, u8 *d) +{ + u32 i; + + gBattleBuffersTransferData[0] = 20; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = c; + gBattleBuffersTransferData[3] = 0; + for (i = 0; i < 20; i++) + gBattleBuffersTransferData[4 + i] = d[i]; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 24); +} + +void EmitOpenBag(u8 a, u8 *b) +{ + int i; + + gBattleBuffersTransferData[0] = 21; + for (i = 0; i < 3; i++) + gBattleBuffersTransferData[1 + i] = b[i]; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void EmitChoosePokemon(u8 a, u8 b, u8 c, u8 d, u8 *e) +{ + int i; + + gBattleBuffersTransferData[0] = 22; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = c; + gBattleBuffersTransferData[3] = d; + for (i = 0; i < 3; i++) + gBattleBuffersTransferData[4 + i] = e[i]; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 8); //but only 7 bytes were written +} + +void Emitcmd23(u8 a) +{ + gBattleBuffersTransferData[0] = 23; + gBattleBuffersTransferData[1] = 23; + gBattleBuffersTransferData[2] = 23; + gBattleBuffersTransferData[3] = 23; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +// FIXME: I think this function is supposed to take s16 as its second argument, +// but battle_4.c expects u16 +void EmitHealthBarUpdate(u8 a, u16 b) +{ + gBattleBuffersTransferData[0] = 24; + gBattleBuffersTransferData[1] = 0; + gBattleBuffersTransferData[2] = (s16)b; + gBattleBuffersTransferData[3] = ((s16)b & 0xFF00) >> 8; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +// FIXME: I think this function is supposed to take s16 as its third argument, +// but battle_4.c expects u16 +void EmitExpBarUpdate(u8 a, u8 b, u16 c) +{ + gBattleBuffersTransferData[0] = 25; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = (s16)c; + gBattleBuffersTransferData[3] = ((s16)c & 0xFF00) >> 8; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void EmitStatusIconUpdate(u8 a, u32 b, u32 c) +{ + gBattleBuffersTransferData[0] = 26; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = (b & 0x0000FF00) >> 8; + gBattleBuffersTransferData[3] = (b & 0x00FF0000) >> 16; + gBattleBuffersTransferData[4] = (b & 0xFF000000) >> 24; + gBattleBuffersTransferData[5] = c; + gBattleBuffersTransferData[6] = (c & 0x0000FF00) >> 8; + gBattleBuffersTransferData[7] = (c & 0x00FF0000) >> 16; + gBattleBuffersTransferData[8] = (c & 0xFF000000) >> 24; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 9); +} + +void EmitStatusAnimation(u8 a, u8 b, u32 c) +{ + gBattleBuffersTransferData[0] = 27; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = c; + gBattleBuffersTransferData[3] = (c & 0x0000FF00) >> 8; + gBattleBuffersTransferData[4] = (c & 0x00FF0000) >> 16; + gBattleBuffersTransferData[5] = (c & 0xFF000000) >> 24; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 6); +} + +void EmitStatusXor(u8 a, u8 b) +{ + gBattleBuffersTransferData[0] = 28; + gBattleBuffersTransferData[1] = b; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 2); +} + +void Emitcmd29(u8 a, u16 b, u8 *c) +{ + int i; + + gBattleBuffersTransferData[0] = 29; + gBattleBuffersTransferData[1] = 29; + gBattleBuffersTransferData[2] = b; + gBattleBuffersTransferData[3] = (b & 0xFF00) >> 8; + for (i = 0; i < b; i++) + gBattleBuffersTransferData[4 + i] = *(c++); + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, b + 4); +} + +void EmitDMATransfer(u8 a, u32 b, u16 c, u8 *d) +{ + int i; + + gBattleBuffersTransferData[0] = 30; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = (b & 0x0000FF00) >> 8; + gBattleBuffersTransferData[3] = (b & 0x00FF0000) >> 16; + gBattleBuffersTransferData[4] = (b & 0xFF000000) >> 24; + gBattleBuffersTransferData[5] = c; + gBattleBuffersTransferData[6] = (c & 0xFF00) >> 8; + for (i = 0; i < c; i++) + gBattleBuffersTransferData[7 + i] = *(d++); + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, c + 7); +} + +void Emitcmd31(u8 a, u16 b, u8 *c) +{ + int i; + + gBattleBuffersTransferData[0] = 31; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; + for (i = 0; i < b; i++) + gBattleBuffersTransferData[3 + i] = *(c++); + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, b + 3); +} + +void Emitcmd32(u8 a, u16 b, u8 *c) +{ + int i; + + gBattleBuffersTransferData[0] = 32; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; + for (i = 0; i < b; i++) + gBattleBuffersTransferData[3 + i] = *(c++); + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, b + 3); +} + +void Emitcmd33(u8 a, u8 b, u16 c) +{ + gBattleBuffersTransferData[0] = 33; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = c; + gBattleBuffersTransferData[3] = (c & 0xFF00) >> 8; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void Emitcmd34(u8 a, u8 b, u8 *c) +{ + int i; + + gBattleBuffersTransferData[0] = 34; + gBattleBuffersTransferData[1] = b; + for (i = 0; i < 3; i++) + gBattleBuffersTransferData[2 + i] = c[i]; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 5); +} + +void Emitcmd35(u8 a, u16 b) +{ + gBattleBuffersTransferData[0] = 35; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; + gBattleBuffersTransferData[3] = 0; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void Emitcmd36(u8 a, u16 b) +{ + gBattleBuffersTransferData[0] = 36; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; + gBattleBuffersTransferData[3] = 0; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void Emitcmd37(u8 a) +{ + gBattleBuffersTransferData[0] = 37; + gBattleBuffersTransferData[1] = 37; + gBattleBuffersTransferData[2] = 37; + gBattleBuffersTransferData[3] = 37; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void Emitcmd38(u8 a, u8 b) +{ + gBattleBuffersTransferData[0] = 38; + gBattleBuffersTransferData[1] = b; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 2); +} + +void Emitcmd39(u8 a) +{ + gBattleBuffersTransferData[0] = 39; + gBattleBuffersTransferData[1] = 39; + gBattleBuffersTransferData[2] = 39; + gBattleBuffersTransferData[3] = 39; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void Emitcmd40(u8 a) +{ + gBattleBuffersTransferData[0] = 40; + gBattleBuffersTransferData[1] = 40; + gBattleBuffersTransferData[2] = 40; + gBattleBuffersTransferData[3] = 40; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void EmitHitAnimation(u8 a) +{ + gBattleBuffersTransferData[0] = 41; + gBattleBuffersTransferData[1] = 41; + gBattleBuffersTransferData[2] = 41; + gBattleBuffersTransferData[3] = 41; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void Emitcmd42(u8 a) +{ + gBattleBuffersTransferData[0] = 42; + gBattleBuffersTransferData[1] = 42; + gBattleBuffersTransferData[2] = 42; + gBattleBuffersTransferData[3] = 42; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void EmitEffectivenessSound(u8 a, u16 b) +{ + gBattleBuffersTransferData[0] = 43; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; + gBattleBuffersTransferData[3] = 0; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void Emitcmd44(u8 a, u16 b) +{ + gBattleBuffersTransferData[0] = 44; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; + gBattleBuffersTransferData[3] = 0; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void EmitFaintingCry(u8 a) +{ + gBattleBuffersTransferData[0] = 45; + gBattleBuffersTransferData[1] = 45; + gBattleBuffersTransferData[2] = 45; + gBattleBuffersTransferData[3] = 45; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void EmitIntroSlide(u8 a, u8 battleTerrain) +{ + gBattleBuffersTransferData[0] = 46; + gBattleBuffersTransferData[1] = battleTerrain; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 2); +} + +void EmitTrainerBallThrow(u8 a) +{ + gBattleBuffersTransferData[0] = 47; + gBattleBuffersTransferData[1] = 47; + gBattleBuffersTransferData[2] = 47; + gBattleBuffersTransferData[3] = 47; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void Emitcmd48(u8 a, u8 *b, u8 c) +{ + int i; + + gBattleBuffersTransferData[0] = 48; + gBattleBuffersTransferData[1] = c & 0x7F; + gBattleBuffersTransferData[2] = (c & 0x80) >> 7; + gBattleBuffersTransferData[3] = 48; + for (i = 0; i < 48; i++) + gBattleBuffersTransferData[4 + i] = b[i]; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 52); +} + +void Emitcmd49(u8 a) +{ + gBattleBuffersTransferData[0] = 49; + gBattleBuffersTransferData[1] = 49; + gBattleBuffersTransferData[2] = 49; + gBattleBuffersTransferData[3] = 49; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void Emitcmd50(u8 a) +{ + gBattleBuffersTransferData[0] = 50; + gBattleBuffersTransferData[1] = 50; + gBattleBuffersTransferData[2] = 50; + gBattleBuffersTransferData[3] = 50; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void EmitSpriteInvisibility(u8 a, u8 b) +{ + gBattleBuffersTransferData[0] = 51; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = 51; + gBattleBuffersTransferData[3] = 51; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void EmitBattleAnimation(u8 a, u8 b, u16 c) +{ + gBattleBuffersTransferData[0] = 52; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = c; + gBattleBuffersTransferData[3] = (c & 0xFF00) >> 8; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void EmitLinkStandbyMsg(u8 a, u8 b) +{ + gBattleBuffersTransferData[0] = 53; + gBattleBuffersTransferData[1] = b; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 2); +} + +void EmitResetActionMoveSelection(u8 a, u8 b) +{ + gBattleBuffersTransferData[0] = 54; + gBattleBuffersTransferData[1] = b; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 2); +} + +void Emitcmd55(u8 a, u8 b) +{ + gBattleBuffersTransferData[0] = 55; + gBattleBuffersTransferData[1] = b; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 2); +} |