mirror of
https://github.com/pret/pokeruby.git
synced 2026-10-03 07:17:50 -05:00
1197 lines
40 KiB
C
1197 lines
40 KiB
C
#include "global.h"
|
|
#include "battle.h"
|
|
#include "battle_controllers.h"
|
|
#include "battle_811DA74.h"
|
|
#include "battle_ai_script_commands.h"
|
|
#include "battle_anim.h"
|
|
#include "battle_anim_81258BC.h"
|
|
#include "battle_anim_8137220.h"
|
|
#include "battle_util.h"
|
|
#include "cable_club.h"
|
|
#include "constants/items.h"
|
|
#include "link.h"
|
|
#include "pokemon.h"
|
|
#include "rom_8094928.h"
|
|
#include "constants/species.h"
|
|
#include "task.h"
|
|
#include "util.h"
|
|
#include "battle_message.h"
|
|
#include "data2.h"
|
|
#include "ewram.h"
|
|
#include "constants/abilities.h"
|
|
|
|
extern u16 gBattleTypeFlags;
|
|
extern u16 gBattleWeather;
|
|
extern struct BattlePokemon gBattleMons[];
|
|
|
|
static EWRAM_DATA u8 sLinkSendTaskId = 0;
|
|
static EWRAM_DATA u8 sLinkReceiveTaskId = 0;
|
|
static EWRAM_DATA u8 gUnknown_020238C6 = 0;
|
|
|
|
extern u32 gUnknown_020239FC;
|
|
extern u8 gBattleBufferA[][0x200];
|
|
extern u8 gBattleBufferB[][0x200];
|
|
extern u8 gActiveBattler;
|
|
extern u32 gBattleControllerExecFlags;
|
|
extern u8 gBattlersCount;
|
|
extern u16 gBattlerPartyIndexes[];
|
|
extern u8 gBattlerPositions[];
|
|
extern u16 gCurrentMove;
|
|
extern u16 gChosenMove;
|
|
extern u16 gLastUsedItem;
|
|
extern u8 gLastUsedAbility;
|
|
extern u8 gBattlerAttacker;
|
|
extern u8 gBattlerTarget;
|
|
extern u8 gEffectBattler;
|
|
extern u8 gPotentialItemEffectBattler;
|
|
extern u8 gAbsentBattlerFlags;
|
|
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 (*gBattlerControllerFuncs[])(void);
|
|
|
|
u8 gBattleBuffersTransferData[0x170];
|
|
|
|
// this file's funcionts
|
|
static void CreateTasksForSendRecvLinkBuffers(void);
|
|
static void InitSinglePlayerBtlControllers(void);
|
|
static void SetBattlePartyIds(void);
|
|
static void Task_HandleSendLinkBuffersData(u8 taskId);
|
|
static void Task_HandleCopyReceivedLinkBuffersData(u8 taskId);
|
|
|
|
void HandleLinkBattleSetup(void)
|
|
{
|
|
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
|
|
{
|
|
OpenLink();
|
|
CreateTask(sub_8083C50, 0);
|
|
CreateTasksForSendRecvLinkBuffers();
|
|
}
|
|
}
|
|
|
|
#if DEBUG
|
|
extern u8 gUnknown_02023A14_50;
|
|
#endif
|
|
|
|
void SetUpBattleVarsAndBirchPoochyena(void)
|
|
{
|
|
s32 i;
|
|
|
|
gBattleMainFunc = nullsub_41;
|
|
|
|
for (i = 0; i < MAX_BATTLERS_COUNT; i++)
|
|
{
|
|
gBattlerControllerFuncs[i] = nullsub_91;
|
|
gBattlerPositions[i] = 0xFF;
|
|
gActionSelectionCursor[i] = 0;
|
|
gMoveSelectionCursor[i] = 0;
|
|
}
|
|
|
|
HandleLinkBattleSetup();
|
|
gBattleControllerExecFlags = 0;
|
|
ClearBattleAnimationVars();
|
|
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, &i);
|
|
}
|
|
gUnknown_020239FC = 0;
|
|
gUnknown_02024C78 = 0;
|
|
|
|
#if DEBUG
|
|
if (gUnknown_02023A14_50 & 0x80)
|
|
{
|
|
gSharedMem[0x160fd] = 0;
|
|
gSharedMem[0x160fe] = 0;
|
|
gSharedMem[0x160ff] = 0;
|
|
((u32 *) gBattleBuffersTransferData)[64]++;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void sub_800B950(void)
|
|
{
|
|
s32 i;
|
|
|
|
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
|
|
InitLinkBtlControllers();
|
|
else
|
|
InitSinglePlayerBtlControllers();
|
|
|
|
SetBattlePartyIds();
|
|
|
|
if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI))
|
|
{
|
|
for (i = 0; i < gBattlersCount; i++)
|
|
sub_8094978(i, 0);
|
|
}
|
|
}
|
|
|
|
static void InitSinglePlayerBtlControllers(void)
|
|
{
|
|
if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
|
|
{
|
|
gBattleMainFunc = sub_8010800;
|
|
if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)
|
|
gBattlerControllerFuncs[0] = SetBankFuncToSafariBufferRunCommand;
|
|
else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL)
|
|
gBattlerControllerFuncs[0] = SetBankFuncToWallyBufferRunCommand;
|
|
else
|
|
gBattlerControllerFuncs[0] = SetBankFuncToPlayerBufferRunCommand;
|
|
gBattlerPositions[0] = 0;
|
|
gBattlerControllerFuncs[1] = SetBankFuncToOpponentBufferRunCommand;
|
|
gBattlerPositions[1] = 1;
|
|
gBattlersCount = 2;
|
|
}
|
|
else
|
|
{
|
|
gBattleMainFunc = sub_8010800;
|
|
gBattlerControllerFuncs[0] = SetBankFuncToPlayerBufferRunCommand;
|
|
gBattlerPositions[0] = 0;
|
|
gBattlerControllerFuncs[1] = SetBankFuncToOpponentBufferRunCommand;
|
|
gBattlerPositions[1] = 1;
|
|
gBattlerControllerFuncs[2] = SetBankFuncToPlayerBufferRunCommand;
|
|
gBattlerPositions[2] = 2;
|
|
gBattlerControllerFuncs[3] = SetBankFuncToOpponentBufferRunCommand;
|
|
gBattlerPositions[3] = 3;
|
|
gBattlersCount = 4;
|
|
}
|
|
}
|
|
|
|
void InitLinkBtlControllers(void)
|
|
{
|
|
u8 multiplayerId;
|
|
int i;
|
|
|
|
if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
|
|
{
|
|
if (gBattleTypeFlags & BATTLE_TYPE_WILD)
|
|
{
|
|
gBattleMainFunc = sub_8010800;
|
|
gBattlerControllerFuncs[0] = SetBankFuncToPlayerBufferRunCommand;
|
|
gBattlerPositions[0] = 0;
|
|
gBattlerControllerFuncs[1] = SetBankFuncToLinkOpponentBufferRunCommand;
|
|
gBattlerPositions[1] = 1;
|
|
gBattlersCount = 2;
|
|
}
|
|
else
|
|
{
|
|
gBattlerControllerFuncs[1] = SetBankFuncToPlayerBufferRunCommand;
|
|
gBattlerPositions[1] = 0;
|
|
gBattlerControllerFuncs[0] = SetBankFuncToLinkOpponentBufferRunCommand;
|
|
gBattlerPositions[0] = 1;
|
|
gBattlersCount = 2;
|
|
}
|
|
return;
|
|
}
|
|
if ((gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_DOUBLE)) == BATTLE_TYPE_DOUBLE)
|
|
{
|
|
if (gBattleTypeFlags & BATTLE_TYPE_WILD)
|
|
{
|
|
gBattleMainFunc = sub_8010800;
|
|
gBattlerControllerFuncs[0] = SetBankFuncToPlayerBufferRunCommand;
|
|
gBattlerPositions[0] = 0;
|
|
gBattlerControllerFuncs[1] = SetBankFuncToLinkOpponentBufferRunCommand;
|
|
gBattlerPositions[1] = 1;
|
|
gBattlerControllerFuncs[2] = SetBankFuncToPlayerBufferRunCommand;
|
|
gBattlerPositions[2] = 2;
|
|
gBattlerControllerFuncs[3] = SetBankFuncToLinkOpponentBufferRunCommand;
|
|
gBattlerPositions[3] = 3;
|
|
gBattlersCount = 4;
|
|
}
|
|
else
|
|
{
|
|
gBattlerControllerFuncs[1] = SetBankFuncToPlayerBufferRunCommand;
|
|
gBattlerPositions[1] = 0;
|
|
gBattlerControllerFuncs[0] = SetBankFuncToLinkOpponentBufferRunCommand;
|
|
gBattlerPositions[0] = 1;
|
|
gBattlerControllerFuncs[3] = SetBankFuncToPlayerBufferRunCommand;
|
|
gBattlerPositions[3] = 2;
|
|
gBattlerControllerFuncs[2] = SetBankFuncToLinkOpponentBufferRunCommand;
|
|
gBattlerPositions[2] = 3;
|
|
gBattlersCount = 4;
|
|
|
|
}
|
|
return;
|
|
}
|
|
multiplayerId = GetMultiplayerId();
|
|
if (gBattleTypeFlags & BATTLE_TYPE_WILD)
|
|
gBattleMainFunc = sub_8010800;
|
|
for (i = 0; i < 4; i++)
|
|
{
|
|
switch (gLinkPlayers[i].id)
|
|
{
|
|
case 0:
|
|
case 3:
|
|
sub_8094978(gLinkPlayers[i].id, 0);
|
|
break;
|
|
case 1:
|
|
case 2:
|
|
sub_8094978(gLinkPlayers[i].id, 1);
|
|
break;
|
|
}
|
|
|
|
if (i == multiplayerId)
|
|
{
|
|
gBattlerControllerFuncs[gLinkPlayers[i].id] = SetBankFuncToPlayerBufferRunCommand;
|
|
switch (gLinkPlayers[i].id)
|
|
{
|
|
case 0:
|
|
case 3:
|
|
gBattlerPositions[gLinkPlayers[i].id] = 0;
|
|
gBattlerPartyIndexes[gLinkPlayers[i].id] = 0;
|
|
break;
|
|
case 1:
|
|
case 2:
|
|
gBattlerPositions[gLinkPlayers[i].id] = 2;
|
|
gBattlerPartyIndexes[gLinkPlayers[i].id] = 3;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ((!(gLinkPlayers[i].id & 1) && !(gLinkPlayers[multiplayerId].id & 1))
|
|
|| ((gLinkPlayers[i].id & 1) && (gLinkPlayers[multiplayerId].id & 1)))
|
|
{
|
|
gBattlerControllerFuncs[gLinkPlayers[i].id] = SetBankFuncToLinkPartnerBufferRunCommand;
|
|
switch (gLinkPlayers[i].id)
|
|
{
|
|
case 0:
|
|
case 3:
|
|
gBattlerPositions[gLinkPlayers[i].id] = 0;
|
|
gBattlerPartyIndexes[gLinkPlayers[i].id] = 0;
|
|
break;
|
|
case 1:
|
|
case 2:
|
|
gBattlerPositions[gLinkPlayers[i].id] = 2;
|
|
gBattlerPartyIndexes[gLinkPlayers[i].id] = 3;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
gBattlerControllerFuncs[gLinkPlayers[i].id] = SetBankFuncToLinkOpponentBufferRunCommand;
|
|
switch (gLinkPlayers[i].id)
|
|
{
|
|
case 0:
|
|
case 3:
|
|
gBattlerPositions[gLinkPlayers[i].id] = 1;
|
|
gBattlerPartyIndexes[gLinkPlayers[i].id] = 0;
|
|
break;
|
|
case 1:
|
|
case 2:
|
|
gBattlerPositions[gLinkPlayers[i].id] = 3;
|
|
gBattlerPartyIndexes[gLinkPlayers[i].id] = 3;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
gBattlersCount = 4;
|
|
}
|
|
|
|
static void SetBattlePartyIds(void)
|
|
{
|
|
s32 i, j;
|
|
|
|
if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI))
|
|
{
|
|
for (i = 0; i < gBattlersCount; i++)
|
|
{
|
|
for (j = 0; j < PARTY_SIZE; j++)
|
|
{
|
|
if (i < 2)
|
|
{
|
|
if (GET_BATTLER_SIDE2(i) == B_SIDE_PLAYER)
|
|
{
|
|
if (GetMonData(&gPlayerParty[j], MON_DATA_HP) != 0
|
|
&& GetMonData(&gPlayerParty[j], MON_DATA_SPECIES2) != SPECIES_NONE
|
|
&& GetMonData(&gPlayerParty[j], MON_DATA_SPECIES2) != SPECIES_EGG
|
|
&& GetMonData(&gPlayerParty[j], MON_DATA_IS_EGG) == 0)
|
|
{
|
|
gBattlerPartyIndexes[i] = j;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (GetMonData(&gEnemyParty[j], MON_DATA_HP) != 0
|
|
&& GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != SPECIES_NONE
|
|
&& GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != SPECIES_EGG
|
|
&& GetMonData(&gEnemyParty[j], MON_DATA_IS_EGG) == 0)
|
|
{
|
|
gBattlerPartyIndexes[i] = j;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (GET_BATTLER_SIDE2(i) == B_SIDE_PLAYER)
|
|
{
|
|
if (GetMonData(&gPlayerParty[j], MON_DATA_HP) != 0
|
|
&& GetMonData(&gPlayerParty[j], MON_DATA_SPECIES) != SPECIES_NONE // 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
|
|
&& gBattlerPartyIndexes[i - 2] != j)
|
|
{
|
|
gBattlerPartyIndexes[i] = j;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (GetMonData(&gEnemyParty[j], MON_DATA_HP) != 0
|
|
&& GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != SPECIES_NONE
|
|
&& GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != SPECIES_EGG
|
|
&& GetMonData(&gEnemyParty[j], MON_DATA_IS_EGG) == 0
|
|
&& gBattlerPartyIndexes[i - 2] != j)
|
|
{
|
|
gBattlerPartyIndexes[i] = j;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
static void PrepareBufferDataTransfer(u8 bufferId, u8 *data, u16 size)
|
|
{
|
|
s32 i;
|
|
|
|
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
|
|
{
|
|
PrepareBufferDataTransferLink(bufferId, size, data);
|
|
}
|
|
else
|
|
{
|
|
switch (bufferId)
|
|
{
|
|
case 0:
|
|
for (i = 0; i < size; i++)
|
|
{
|
|
gBattleBufferA[gActiveBattler][i] = *data;
|
|
data++;
|
|
}
|
|
break;
|
|
case 1:
|
|
for (i = 0; i < size; i++)
|
|
{
|
|
gBattleBufferB[gActiveBattler][i] = *data;
|
|
data++;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
static void CreateTasksForSendRecvLinkBuffers(void)
|
|
{
|
|
sLinkSendTaskId = CreateTask(Task_HandleSendLinkBuffersData, 0);
|
|
gTasks[sLinkSendTaskId].data[11] = 0;
|
|
gTasks[sLinkSendTaskId].data[12] = 0;
|
|
gTasks[sLinkSendTaskId].data[13] = 0;
|
|
gTasks[sLinkSendTaskId].data[14] = 0;
|
|
gTasks[sLinkSendTaskId].data[15] = 0;
|
|
|
|
sLinkReceiveTaskId = CreateTask(Task_HandleCopyReceivedLinkBuffersData, 0);
|
|
gTasks[sLinkReceiveTaskId].data[12] = 0;
|
|
gTasks[sLinkReceiveTaskId].data[13] = 0;
|
|
gTasks[sLinkReceiveTaskId].data[14] = 0;
|
|
gTasks[sLinkReceiveTaskId].data[15] = 0;
|
|
|
|
gUnknown_020238C6 = 0;
|
|
CpuFill16(0, &gSharedMem[BSTRUCT_OFF(linkSend)], sizeof(gBattleStruct->linkSend) + sizeof(gBattleStruct->linkRecv));
|
|
}
|
|
|
|
void PrepareBufferDataTransferLink(u8 a, u16 size, u8 *data)
|
|
{
|
|
s32 r9;
|
|
int i;
|
|
|
|
r9 = size - size % 4 + 4;
|
|
if (gTasks[sLinkSendTaskId].data[14] + r9 + 9 > 0x1000)
|
|
{
|
|
gTasks[sLinkSendTaskId].data[12] = gTasks[sLinkSendTaskId].data[14];
|
|
gTasks[sLinkSendTaskId].data[14] = 0;
|
|
}
|
|
|
|
BCOMM(linkSend, state, gTasks[sLinkSendTaskId].data[14], 0) = a;
|
|
BCOMM(linkSend, activeBattler, gTasks[sLinkSendTaskId].data[14], 0) = gActiveBattler;
|
|
BCOMM(linkSend, battlerAttacker, gTasks[sLinkSendTaskId].data[14], 0) = gBattlerAttacker;
|
|
BCOMM(linkSend, battlerTarget, gTasks[sLinkSendTaskId].data[14], 0) = gBattlerTarget;
|
|
BCOMM(linkSend, size, gTasks[sLinkSendTaskId].data[14], 0) = r9;
|
|
BCOMM(linkSend, size, gTasks[sLinkSendTaskId].data[14], 1) = (r9 & 0x0000FF00) >> 8;
|
|
BCOMM(linkSend, absentBattlerFlags, gTasks[sLinkSendTaskId].data[14], 0) = gAbsentBattlerFlags;
|
|
BCOMM(linkSend, effectBattler, gTasks[sLinkSendTaskId].data[14], 0) = gEffectBattler;
|
|
|
|
for (i = 0; i < size; i++)
|
|
BCOMM(linkSend, data, gTasks[sLinkSendTaskId].data[14], i) = data[i];
|
|
gTasks[sLinkSendTaskId].data[14] = gTasks[sLinkSendTaskId].data[14] + r9 + 8;
|
|
}
|
|
|
|
void Task_HandleSendLinkBuffersData(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 = (BCOMM(linkSend, size, gTasks[taskId].data[15], 0) | (BCOMM(linkSend, size, gTasks[taskId].data[15], 1) << 8)) + 8;
|
|
SendBlock(bitmask_all_link_players_but_self(), &gSharedMem[BSTRUCT_OFF(linkSend) + gTasks[taskId].data[15]], var);
|
|
gTasks[taskId].data[11]++;
|
|
}
|
|
else
|
|
{
|
|
gTasks[taskId].data[13]--;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
case 4:
|
|
if (IsLinkTaskFinished())
|
|
{
|
|
var = (BCOMM(linkSend, size, gTasks[taskId].data[15], 0) | (BCOMM(linkSend, size, gTasks[taskId].data[15], 1) << 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
|
|
u16 *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 = gBlockRecvBuffer[i];
|
|
#ifndef NONMATCHING
|
|
asm("");
|
|
recvBuffer = gBlockRecvBuffer[i];
|
|
#endif
|
|
r6 = gBlockRecvBuffer[i][2];
|
|
if (gTasks[sLinkReceiveTaskId].data[14] + 9 + r6 > 0x1000)
|
|
{
|
|
gTasks[sLinkReceiveTaskId].data[12] = gTasks[sLinkReceiveTaskId].data[14];
|
|
gTasks[sLinkReceiveTaskId].data[14] = 0;
|
|
}
|
|
//_0800C402
|
|
dest = &gSharedMem[BSTRUCT_OFF(linkRecv) + gTasks[sLinkReceiveTaskId].data[14]];
|
|
src = (u8 *)recvBuffer;
|
|
for (j = 0; j < r6 + 8; j++)
|
|
dest[j] = src[j];
|
|
gTasks[sLinkReceiveTaskId].data[14] = gTasks[sLinkReceiveTaskId].data[14] + r6 + 8;
|
|
}
|
|
//_0800C446
|
|
}
|
|
}
|
|
}
|
|
|
|
static void Task_HandleCopyReceivedLinkBuffersData(u8 taskId)
|
|
{
|
|
u16 blockSize;
|
|
u8 battlerId;
|
|
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;
|
|
}
|
|
battlerId = BCOMM(linkRecv, activeBattler, gTasks[taskId].data[15], 0);
|
|
blockSize = BCOMM(linkRecv, size, gTasks[taskId].data[15], 0)
|
|
| (BCOMM(linkRecv, size, gTasks[taskId].data[15], 1) << 8);
|
|
switch (BCOMM(linkRecv, state, gTasks[taskId].data[15], 0))
|
|
{
|
|
case 0:
|
|
if (gBattleControllerExecFlags & gBitTable[battlerId])
|
|
return;
|
|
memcpy(gBattleBufferA[battlerId], &BCOMM(linkRecv, data, gTasks[taskId].data[15], 0), blockSize);
|
|
sub_80155A4(battlerId);
|
|
if (!(gBattleTypeFlags & BATTLE_TYPE_WILD))
|
|
{
|
|
gBattlerAttacker = BCOMM(linkRecv, battlerAttacker, gTasks[taskId].data[15], 0);
|
|
gBattlerTarget = BCOMM(linkRecv, battlerTarget, gTasks[taskId].data[15], 0);
|
|
gAbsentBattlerFlags = BCOMM(linkRecv, absentBattlerFlags, gTasks[taskId].data[15], 0);
|
|
gEffectBattler = BCOMM(linkRecv, effectBattler, gTasks[taskId].data[15], 0);
|
|
}
|
|
break;
|
|
case 1:
|
|
memcpy(gBattleBufferB[battlerId], &BCOMM(linkRecv, data, gTasks[taskId].data[15], 0), blockSize);
|
|
break;
|
|
case 2:
|
|
r2 = BCOMM(linkRecv, data, gTasks[taskId].data[15], 0);
|
|
gBattleControllerExecFlags &= ~(gBitTable[battlerId] << (r2 * 4));
|
|
break;
|
|
}
|
|
|
|
gTasks[taskId].data[15] = gTasks[taskId].data[15] + blockSize + 8;
|
|
}
|
|
}
|
|
|
|
void BtlController_EmitGetMonData(u8 bufferId, u8 requestId, u8 monToCheck)
|
|
{
|
|
gBattleBuffersTransferData[0] = CONTROLLER_GETMONDATA;
|
|
gBattleBuffersTransferData[1] = requestId;
|
|
gBattleBuffersTransferData[2] = monToCheck;
|
|
gBattleBuffersTransferData[3] = 0;
|
|
PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
|
|
}
|
|
|
|
void BtlController_EmitGetRawMonData(u8 bufferId, u8 monId, u8 bytes)
|
|
{
|
|
gBattleBuffersTransferData[0] = CONTROLLER_GETRAWMONDATA;
|
|
gBattleBuffersTransferData[1] = monId;
|
|
gBattleBuffersTransferData[2] = bytes;
|
|
gBattleBuffersTransferData[3] = 0;
|
|
PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
|
|
}
|
|
|
|
void BtlController_EmitSetMonData(u8 bufferId, u8 requestId, u8 monToCheck, u8 bytes, void *data)
|
|
{
|
|
s32 i;
|
|
|
|
gBattleBuffersTransferData[0] = CONTROLLER_SETMONDATA;
|
|
gBattleBuffersTransferData[1] = requestId;
|
|
gBattleBuffersTransferData[2] = monToCheck;
|
|
for (i = 0; i < bytes; i++)
|
|
gBattleBuffersTransferData[3 + i] = *(u8*)(data++);
|
|
PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 3 + bytes);
|
|
}
|
|
|
|
void BtlController_EmitSetRawMonData(u8 bufferId, u8 monId, u8 bytes, void *data)
|
|
{
|
|
s32 i;
|
|
|
|
gBattleBuffersTransferData[0] = CONTROLLER_SETRAWMONDATA;
|
|
gBattleBuffersTransferData[1] = monId;
|
|
gBattleBuffersTransferData[2] = bytes;
|
|
for (i = 0; i < bytes; i++)
|
|
gBattleBuffersTransferData[3 + i] = *(u8*)(data++);
|
|
PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, bytes + 3);
|
|
}
|
|
|
|
void BtlController_EmitLoadMonSprite(u8 bufferId)
|
|
{
|
|
gBattleBuffersTransferData[0] = CONTROLLER_LOADMONSPRITE;
|
|
gBattleBuffersTransferData[1] = CONTROLLER_LOADMONSPRITE;
|
|
gBattleBuffersTransferData[2] = CONTROLLER_LOADMONSPRITE;
|
|
gBattleBuffersTransferData[3] = CONTROLLER_LOADMONSPRITE;
|
|
PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
|
|
}
|
|
|
|
void BtlController_EmitSwitchInAnim(u8 bufferId, u8 partyId, bool8 dontClearSubstituteBit)
|
|
{
|
|
gBattleBuffersTransferData[0] = CONTROLLER_SWITCHINANIM;
|
|
gBattleBuffersTransferData[1] = partyId;
|
|
gBattleBuffersTransferData[2] = dontClearSubstituteBit;
|
|
gBattleBuffersTransferData[3] = 5;
|
|
PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
|
|
}
|
|
|
|
void BtlController_EmitReturnMonToBall(u8 bufferId, u8 arg1)
|
|
{
|
|
gBattleBuffersTransferData[0] = CONTROLLER_RETURNMONTOBALL;
|
|
gBattleBuffersTransferData[1] = arg1;
|
|
PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 2);
|
|
}
|
|
|
|
void BtlController_EmitDrawTrainerPic(u8 bufferId)
|
|
{
|
|
gBattleBuffersTransferData[0] = CONTROLLER_DRAWTRAINERPIC;
|
|
gBattleBuffersTransferData[1] = CONTROLLER_DRAWTRAINERPIC;
|
|
gBattleBuffersTransferData[2] = CONTROLLER_DRAWTRAINERPIC;
|
|
gBattleBuffersTransferData[3] = CONTROLLER_DRAWTRAINERPIC;
|
|
PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
|
|
}
|
|
|
|
void BtlController_EmitTrainerSlide(u8 bufferId)
|
|
{
|
|
gBattleBuffersTransferData[0] = CONTROLLER_TRAINERSLIDE;
|
|
gBattleBuffersTransferData[1] = CONTROLLER_TRAINERSLIDE;
|
|
gBattleBuffersTransferData[2] = CONTROLLER_TRAINERSLIDE;
|
|
gBattleBuffersTransferData[3] = CONTROLLER_TRAINERSLIDE;
|
|
PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
|
|
}
|
|
|
|
void BtlController_EmitTrainerSlideBack(u8 bufferId)
|
|
{
|
|
gBattleBuffersTransferData[0] = CONTROLLER_TRAINERSLIDEBACK;
|
|
gBattleBuffersTransferData[1] = CONTROLLER_TRAINERSLIDEBACK;
|
|
gBattleBuffersTransferData[2] = CONTROLLER_TRAINERSLIDEBACK;
|
|
gBattleBuffersTransferData[3] = CONTROLLER_TRAINERSLIDEBACK;
|
|
PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
|
|
}
|
|
|
|
void BtlController_EmitFaintAnimation(u8 bufferId)
|
|
{
|
|
gBattleBuffersTransferData[0] = CONTROLLER_FAINTANIMATION;
|
|
gBattleBuffersTransferData[1] = CONTROLLER_FAINTANIMATION;
|
|
gBattleBuffersTransferData[2] = CONTROLLER_FAINTANIMATION;
|
|
gBattleBuffersTransferData[3] = CONTROLLER_FAINTANIMATION;
|
|
PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
|
|
}
|
|
|
|
void BtlController_EmitPaletteFade(u8 bufferId)
|
|
{
|
|
gBattleBuffersTransferData[0] = CONTROLLER_PALETTEFADE;
|
|
gBattleBuffersTransferData[1] = CONTROLLER_PALETTEFADE;
|
|
gBattleBuffersTransferData[2] = CONTROLLER_PALETTEFADE;
|
|
gBattleBuffersTransferData[3] = CONTROLLER_PALETTEFADE;
|
|
PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
|
|
}
|
|
|
|
void BtlController_EmitSuccessBallThrowAnim(u8 bufferId)
|
|
{
|
|
gBattleBuffersTransferData[0] = CONTROLLER_SUCCESSBALLTHROWANIM;
|
|
gBattleBuffersTransferData[1] = CONTROLLER_SUCCESSBALLTHROWANIM;
|
|
gBattleBuffersTransferData[2] = CONTROLLER_SUCCESSBALLTHROWANIM;
|
|
gBattleBuffersTransferData[3] = CONTROLLER_SUCCESSBALLTHROWANIM;
|
|
PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
|
|
}
|
|
|
|
void BtlController_EmitBallThrowAnim(u8 bufferId, u8 caseId)
|
|
{
|
|
gBattleBuffersTransferData[0] = CONTROLLER_BALLTHROWANIM;
|
|
gBattleBuffersTransferData[1] = caseId;
|
|
PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 2);
|
|
}
|
|
|
|
void BtlController_EmitPause(u8 bufferId, u8 toWait, void *data)
|
|
{
|
|
s32 i;
|
|
|
|
gBattleBuffersTransferData[0] = CONTROLLER_PAUSE;
|
|
gBattleBuffersTransferData[1] = toWait;
|
|
for (i = 0; i < toWait * 3; i++)
|
|
gBattleBuffersTransferData[2 + i] = *(u8*)(data++);
|
|
PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, toWait * 3 + 2);
|
|
}
|
|
|
|
void BtlController_EmitMoveAnimation(u8 bufferId, u16 move, u8 turnOfMove, u16 movePower, s32 dmg, u8 friendship, struct DisableStruct *disableStructPtr)
|
|
{
|
|
gBattleBuffersTransferData[0] = CONTROLLER_MOVEANIMATION;
|
|
gBattleBuffersTransferData[1] = move;
|
|
gBattleBuffersTransferData[2] = (move & 0xFF00) >> 8;
|
|
gBattleBuffersTransferData[3] = turnOfMove;
|
|
gBattleBuffersTransferData[4] = movePower;
|
|
gBattleBuffersTransferData[5] = (movePower & 0xFF00) >> 8;
|
|
gBattleBuffersTransferData[6] = dmg;
|
|
gBattleBuffersTransferData[7] = (dmg & 0x0000FF00) >> 8;
|
|
gBattleBuffersTransferData[8] = (dmg & 0x00FF0000) >> 16;
|
|
gBattleBuffersTransferData[9] = (dmg & 0xFF000000) >> 24;
|
|
gBattleBuffersTransferData[10] = friendship;
|
|
gBattleBuffersTransferData[11] = gMultiHitCounter;
|
|
if (WEATHER_HAS_EFFECT2)
|
|
{
|
|
gBattleBuffersTransferData[12] = gBattleWeather;
|
|
gBattleBuffersTransferData[13] = (gBattleWeather & 0xFF00) >> 8;
|
|
}
|
|
else
|
|
{
|
|
gBattleBuffersTransferData[12] = 0;
|
|
gBattleBuffersTransferData[13] = 0;
|
|
}
|
|
gBattleBuffersTransferData[14] = 0;
|
|
gBattleBuffersTransferData[15] = 0;
|
|
memcpy(&gBattleBuffersTransferData[16], disableStructPtr, sizeof(struct DisableStruct));
|
|
PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 16 + sizeof(struct DisableStruct));
|
|
}
|
|
|
|
void BtlController_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 = gChosenMove;
|
|
stringInfo->lastItem = gLastUsedItem;
|
|
stringInfo->lastAbility = gLastUsedAbility;
|
|
stringInfo->scrActive = gBattleStruct->scriptingActive;
|
|
stringInfo->unk1605E = gBattleStruct->unk1605E;
|
|
stringInfo->hpScale = gBattleStruct->hpScale;
|
|
stringInfo->StringBank = gPotentialItemEffectBattler;
|
|
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 BtlController_EmitPrintSelectionString(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 = gChosenMove;
|
|
stringInfo->lastItem = gLastUsedItem;
|
|
stringInfo->lastAbility = gLastUsedAbility;
|
|
stringInfo->scrActive = gBattleStruct->scriptingActive;
|
|
stringInfo->unk1605E = gBattleStruct->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 BtlController_EmitChooseAction(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 BtlController_EmitUnknownYesNoBox(u8 a, u8 b)
|
|
{
|
|
gBattleBuffersTransferData[0] = 19;
|
|
gBattleBuffersTransferData[1] = b;
|
|
PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 2);
|
|
}
|
|
|
|
void BtlController_EmitChooseMove(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 BtlController_EmitChooseItem(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 BtlController_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 BtlController_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 BtlController_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 BtlController_EmitExpUpdate(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 BtlController_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 BtlController_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 BtlController_EmitStatusXor(u8 a, u8 b)
|
|
{
|
|
gBattleBuffersTransferData[0] = 28;
|
|
gBattleBuffersTransferData[1] = b;
|
|
PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 2);
|
|
}
|
|
|
|
void BtlController_EmitDataTransfer(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 BtlController_EmitDMA3Transfer(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 BtlController_EmitPlayBGM(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 BtlController_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 BtlController_EmitTwoReturnValues(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 BtlController_EmitChosenMonReturnValue(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 BtlController_EmitOneReturnValue(u8 a, u16 b)
|
|
{
|
|
gBattleBuffersTransferData[0] = 35;
|
|
gBattleBuffersTransferData[1] = b;
|
|
gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8;
|
|
gBattleBuffersTransferData[3] = 0;
|
|
PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4);
|
|
}
|
|
|
|
void BtlController_EmitOneReturnValue_Duplicate(u8 a, u16 b)
|
|
{
|
|
gBattleBuffersTransferData[0] = 36;
|
|
gBattleBuffersTransferData[1] = b;
|
|
gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8;
|
|
gBattleBuffersTransferData[3] = 0;
|
|
PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4);
|
|
}
|
|
|
|
void BtlController_EmitCmd37(u8 a)
|
|
{
|
|
gBattleBuffersTransferData[0] = 37;
|
|
gBattleBuffersTransferData[1] = 37;
|
|
gBattleBuffersTransferData[2] = 37;
|
|
gBattleBuffersTransferData[3] = 37;
|
|
PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4);
|
|
}
|
|
|
|
void BtlController_EmitCmd38(u8 a, u8 b)
|
|
{
|
|
gBattleBuffersTransferData[0] = 38;
|
|
gBattleBuffersTransferData[1] = b;
|
|
PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 2);
|
|
}
|
|
|
|
void BtlController_EmitCmd39(u8 a)
|
|
{
|
|
gBattleBuffersTransferData[0] = 39;
|
|
gBattleBuffersTransferData[1] = 39;
|
|
gBattleBuffersTransferData[2] = 39;
|
|
gBattleBuffersTransferData[3] = 39;
|
|
PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4);
|
|
}
|
|
|
|
void BtlController_EmitCmd40(u8 a)
|
|
{
|
|
gBattleBuffersTransferData[0] = 40;
|
|
gBattleBuffersTransferData[1] = 40;
|
|
gBattleBuffersTransferData[2] = 40;
|
|
gBattleBuffersTransferData[3] = 40;
|
|
PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4);
|
|
}
|
|
|
|
void BtlController_EmitHitAnimation(u8 a)
|
|
{
|
|
gBattleBuffersTransferData[0] = 41;
|
|
gBattleBuffersTransferData[1] = 41;
|
|
gBattleBuffersTransferData[2] = 41;
|
|
gBattleBuffersTransferData[3] = 41;
|
|
PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4);
|
|
}
|
|
|
|
void BtlController_EmitCmd42(u8 a)
|
|
{
|
|
gBattleBuffersTransferData[0] = 42;
|
|
gBattleBuffersTransferData[1] = 42;
|
|
gBattleBuffersTransferData[2] = 42;
|
|
gBattleBuffersTransferData[3] = 42;
|
|
PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4);
|
|
}
|
|
|
|
void BtlController_EmitPlaySE(u8 a, u16 b)
|
|
{
|
|
gBattleBuffersTransferData[0] = 43;
|
|
gBattleBuffersTransferData[1] = b;
|
|
gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8;
|
|
gBattleBuffersTransferData[3] = 0;
|
|
PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4);
|
|
}
|
|
|
|
void BtlController_EmitPlayFanfareOrBGM(u8 a, u16 b)
|
|
{
|
|
gBattleBuffersTransferData[0] = 44;
|
|
gBattleBuffersTransferData[1] = b;
|
|
gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8;
|
|
gBattleBuffersTransferData[3] = 0;
|
|
PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4);
|
|
}
|
|
|
|
void BtlController_EmitFaintingCry(u8 a)
|
|
{
|
|
gBattleBuffersTransferData[0] = 45;
|
|
gBattleBuffersTransferData[1] = 45;
|
|
gBattleBuffersTransferData[2] = 45;
|
|
gBattleBuffersTransferData[3] = 45;
|
|
PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4);
|
|
}
|
|
|
|
void BtlController_EmitIntroSlide(u8 a, u8 battleTerrain)
|
|
{
|
|
gBattleBuffersTransferData[0] = 46;
|
|
gBattleBuffersTransferData[1] = battleTerrain;
|
|
PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 2);
|
|
}
|
|
|
|
void BtlController_EmitIntroTrainerBallThrow(u8 a)
|
|
{
|
|
gBattleBuffersTransferData[0] = 47;
|
|
gBattleBuffersTransferData[1] = 47;
|
|
gBattleBuffersTransferData[2] = 47;
|
|
gBattleBuffersTransferData[3] = 47;
|
|
PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4);
|
|
}
|
|
|
|
void BtlController_EmitDrawPartyStatusSummary(u8 a, struct HpAndStatus *hpAndStatus, 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] = *(i + (u8*)(hpAndStatus));
|
|
PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 52);
|
|
}
|
|
|
|
void BtlController_EmitHidePartyStatusSummary(u8 a)
|
|
{
|
|
gBattleBuffersTransferData[0] = 49;
|
|
gBattleBuffersTransferData[1] = 49;
|
|
gBattleBuffersTransferData[2] = 49;
|
|
gBattleBuffersTransferData[3] = 49;
|
|
PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4);
|
|
}
|
|
|
|
void BtlController_EmitEndBounceEffect(u8 a)
|
|
{
|
|
gBattleBuffersTransferData[0] = 50;
|
|
gBattleBuffersTransferData[1] = 50;
|
|
gBattleBuffersTransferData[2] = 50;
|
|
gBattleBuffersTransferData[3] = 50;
|
|
PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4);
|
|
}
|
|
|
|
void BtlController_EmitSpriteInvisibility(u8 a, u8 b)
|
|
{
|
|
gBattleBuffersTransferData[0] = 51;
|
|
gBattleBuffersTransferData[1] = b;
|
|
gBattleBuffersTransferData[2] = 51;
|
|
gBattleBuffersTransferData[3] = 51;
|
|
PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4);
|
|
}
|
|
|
|
void BtlController_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 BtlController_EmitLinkStandbyMsg(u8 a, u8 b)
|
|
{
|
|
gBattleBuffersTransferData[0] = 53;
|
|
gBattleBuffersTransferData[1] = b;
|
|
PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 2);
|
|
}
|
|
|
|
void BtlController_EmitResetActionMoveSelection(u8 a, u8 b)
|
|
{
|
|
gBattleBuffersTransferData[0] = 54;
|
|
gBattleBuffersTransferData[1] = b;
|
|
PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 2);
|
|
}
|
|
|
|
void BtlController_EmitCmd55(u8 a, u8 b)
|
|
{
|
|
gBattleBuffersTransferData[0] = 55;
|
|
gBattleBuffersTransferData[1] = b;
|
|
PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 2);
|
|
}
|