Merge branch 'master' into doc-sixisland

This commit is contained in:
GriffinR
2020-03-02 10:48:56 -05:00
committed by GitHub
141 changed files with 2894 additions and 4342 deletions
+4 -4
View File
@@ -1127,11 +1127,11 @@ static void LinkOpponentHandleDrawTrainerPic(void)
}
else if (gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender != MALE)
{
trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_PLAYER_4];
trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_LEAF];
}
else
{
trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_PLAYER_3];
trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_RED];
}
}
else
@@ -1152,11 +1152,11 @@ static void LinkOpponentHandleDrawTrainerPic(void)
}
else if (gLinkPlayers[GetMultiplayerId() ^ BIT_SIDE].gender != MALE)
{
trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_PLAYER_4];
trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_LEAF];
}
else
{
trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_PLAYER_3];
trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_RED];
}
}
DecompressTrainerFrontPic(trainerPicId, gActiveBattler);
+3 -3
View File
@@ -419,7 +419,7 @@ void ClearPlayerLinkBattleRecords(void)
static void IncTrainerCardWinCount(s32 battlerId)
{
u16 *wins = &gTrainerCards[battlerId].linkBattleWins;
u16 *wins = &gTrainerCards[battlerId].rse.linkBattleWins;
(*wins)++;
if (*wins > 9999)
*wins = 9999;
@@ -427,7 +427,7 @@ static void IncTrainerCardWinCount(s32 battlerId)
static void IncTrainerCardLossCount(s32 battlerId)
{
u16 *losses = &gTrainerCards[battlerId].linkBattleLosses;
u16 *losses = &gTrainerCards[battlerId].rse.linkBattleLosses;
(*losses)++;
if (*losses > 9999)
*losses = 9999;
@@ -453,7 +453,7 @@ void TryRecordLinkBattleOutcome(s32 battlerId)
if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP(UNION_ROOM) || gSaveBlock1Ptr->location.mapNum != MAP_NUM(UNION_ROOM))
{
UpdateBattleOutcomeOnTrainerCards(battlerId);
AddOpponentLinkBattleRecord(&gSaveBlock2Ptr->linkBattleRecords, gTrainerCards[battlerId].playerName, gTrainerCards[battlerId].trainerId, gBattleOutcome, gLinkPlayers[battlerId].language);
AddOpponentLinkBattleRecord(&gSaveBlock2Ptr->linkBattleRecords, gTrainerCards[battlerId].rse.playerName, gTrainerCards[battlerId].rse.trainerId, gBattleOutcome, gLinkPlayers[battlerId].language);
}
}
+964
View File
@@ -0,0 +1,964 @@
#include "global.h"
#include "gflib.h"
#include "battle.h"
#include "battle_records.h"
#include "cable_club.h"
#include "event_data.h"
#include "event_scripts.h"
#include "field_message_box.h"
#include "field_weather.h"
#include "link.h"
#include "load_save.h"
#include "m4a.h"
#include "mevent.h"
#include "new_menu_helpers.h"
#include "overworld.h"
#include "quest_log.h"
#include "script.h"
#include "script_pokemon_util.h"
#include "start_menu.h"
#include "strings.h"
#include "task.h"
#include "trade.h"
#include "trainer_card.h"
#include "union_room.h"
#include "constants/songs.h"
#include "constants/cable_club.h"
#include "constants/field_weather.h"
u32 UnusedVarNeededToMatch[8];
static void Task_Linkup0(u8 taskId);
static void Task_Linkup1(u8 taskId);
static void Task_LinkupMaster_2(u8 taskId);
static void Task_LinkupMaster_3(u8 taskId);
static void Task_LinkupMaster_4(u8 taskId);
static void Task_LinkupMaster_5(u8 taskId);
static void Task_LinkupSlave_2(u8 taskId);
static void Task_LinkupMaster_6(u8 taskId);
static void Task_Linkup_6a(u8 taskId);
static void Task_Linkup_7(u8 taskId);
static void Task_Linkup_Canceled(u8 taskId);
static void Task_Linkup_ErroredOut(u8 taskId);
static bool8 Task_Linkup_TimedOut(u8 taskId);
static void Task_ReestablishLinkInCableClubRoom_0(u8 taskId);
static void Task_ReestablishLinkInCableClubRoom_1(u8 taskId);
static void Task_ReestablishLinkInCableClubRoom_Master(u8 taskId);
static void Task_ReestablishLinkInCableClubRoom_2(u8 taskId);
static const struct WindowTemplate gUnknown_83C6AB0 = {
.bg = 0,
.tilemapLeft = 16,
.tilemapTop = 11,
.width = 11,
.height = 2,
.paletteNum = 15,
.baseBlock = 0x125
};
static const u8 *const sStarsMessagePtrs[] = {
gUnknown_841DF8B,
gUnknown_841DF92,
gUnknown_841DF99,
gUnknown_841DFA0
};
static void CreateLinkupTask(u8 lower, u8 higher)
{
u8 taskId;
if (FindTaskIdByFunc(Task_Linkup0) == 0xFF)
{
taskId = CreateTask(Task_Linkup0, 80);
gTasks[taskId].data[1] = lower;
gTasks[taskId].data[2] = higher;
}
}
static void PrintNewCountOnLinkPlayerCountDisplayWindow(u16 windowId, s32 num)
{
ConvertIntToDecimalStringN(gStringVar1, num, STR_CONV_MODE_LEFT_ALIGN, 1);
SetStdWindowBorderStyle(windowId, FALSE);
StringExpandPlaceholders(gStringVar4, gUnknown_841DF82);
AddTextPrinterParameterized(windowId, 2, gStringVar4, 0, 0, TEXT_SPEED_FF, NULL);
CopyWindowToVram(windowId, 3);
}
static void DestroyLinkPlayerCountDisplayWindow(u16 windowId)
{
ClearStdWindowAndFrame(windowId, FALSE);
CopyWindowToVram(windowId, 3);
}
static void UpdateLinkPlayerCountDisplay(u8 taskId, u8 num)
{
s16 *data = gTasks[taskId].data;
if (num != data[3])
{
if (num < 2)
DestroyLinkPlayerCountDisplayWindow(data[5]);
else
PrintNewCountOnLinkPlayerCountDisplayWindow(data[5], num);
data[3] = num;
}
}
static u16 sub_8080844(u8 lower, u8 higher)
{
switch (GetLinkPlayerDataExchangeStatusTimed(lower, higher))
{
case EXCHANGE_COMPLETE:
return 1;
case EXCHANGE_IN_PROGRESS:
return 3;
case EXCHANGE_STAT_4:
return 7;
case EXCHANGE_STAT_5:
return 9;
case EXCHANGE_STAT_6:
ConvertIntToDecimalStringN(gStringVar1, GetLinkPlayerCount_2(), STR_CONV_MODE_LEFT_ALIGN, 1);
return 4;
default:
return 0;
}
}
static bool32 sub_80808BC(u8 taskId)
{
if (HasLinkErrorOccurred() == TRUE)
{
gTasks[taskId].func = Task_Linkup_ErroredOut;
return TRUE;
}
return FALSE;
}
static bool32 sub_80808F0(u8 taskId)
{
if (JOY_NEW(B_BUTTON) && !IsLinkConnectionEstablished())
{
gLinkType = 0;
gTasks[taskId].func = Task_Linkup_Canceled;
return TRUE;
}
return FALSE;
}
static bool32 sub_808093C(u8 taskId)
{
if (IsLinkConnectionEstablished())
{
SetSuppressLinkErrorMessage(TRUE);
}
if (JOY_NEW(B_BUTTON))
{
gLinkType = 0;
gTasks[taskId].func = Task_Linkup_Canceled;
return TRUE;
}
return FALSE;
}
static bool32 sub_8080990(u8 taskId)
{
if (GetSioMultiSI() == TRUE)
{
gTasks[taskId].func = Task_Linkup_ErroredOut;
return TRUE;
}
return FALSE;
}
static void sub_80809C4(u8 taskId)
{
gTasks[taskId].data[0]++;
if (gTasks[taskId].data[0] == 10)
{
sub_800A474(2);
DestroyTask(taskId);
}
}
static void Task_Linkup0(u8 taskId)
{
s16 *data = gTasks[taskId].data;
if (data[0] == 0)
{
OpenLinkTimed();
sub_800AA24();
ResetLinkPlayers();
data[5] = AddWindow(&gUnknown_83C6AB0);
}
else if (data[0] > 9)
{
gTasks[taskId].func = Task_Linkup1;
}
data[0]++;
}
static void Task_Linkup1(u8 taskId)
{
u8 linkPlayerCount = GetLinkPlayerCount_2();
if (sub_80808F0(taskId) != TRUE && sub_808093C(taskId) != TRUE && linkPlayerCount >= 2)
{
SetSuppressLinkErrorMessage(TRUE);
gTasks[taskId].data[3] = 0;
if (IsLinkMaster() == TRUE)
{
PlaySE(SE_PIN);
ShowFieldAutoScrollMessage(CableClub_Text_WhenAllPlayersReadyAConfirmBCancel);
gTasks[taskId].func = Task_LinkupMaster_2;
}
else
{
PlaySE(SE_BOO);
ShowFieldAutoScrollMessage(CableClub_Text_AwaitingLinkupBCancel);
gTasks[taskId].func = Task_LinkupSlave_2;
}
}
}
static void Task_LinkupMaster_2(u8 taskId)
{
if (sub_80808F0(taskId) != TRUE && sub_8080990(taskId) != TRUE && sub_80808BC(taskId) != TRUE && !textbox_any_visible())
{
gTasks[taskId].data[3] = 0;
gTasks[taskId].func = Task_LinkupMaster_3;
}
}
static void Task_LinkupMaster_3(u8 taskId)
{
s16 *data = gTasks[taskId].data;
s32 linkPlayerCount = GetLinkPlayerCount_2();
if (sub_80808F0(taskId) != TRUE && sub_8080990(taskId) != TRUE && sub_80808BC(taskId) != TRUE)
{
UpdateLinkPlayerCountDisplay(taskId, linkPlayerCount);
if (JOY_NEW(A_BUTTON) && linkPlayerCount >= data[1])
{
sub_800A900(linkPlayerCount);
DestroyLinkPlayerCountDisplayWindow(data[5]);
ConvertIntToDecimalStringN(gStringVar1, linkPlayerCount, STR_CONV_MODE_LEFT_ALIGN, 1);
ShowFieldAutoScrollMessage(CableClub_Text_StartLinkWithXPlayersAConfirmBCancel);
gTasks[taskId].func = Task_LinkupMaster_4;
}
}
}
static void Task_LinkupMaster_4(u8 taskId)
{
if (sub_80808F0(taskId) != TRUE && sub_8080990(taskId) != TRUE && sub_80808BC(taskId) != TRUE && !textbox_any_visible())
{
if (GetSavedPlayerCount() != GetLinkPlayerCount_2())
{
ShowFieldAutoScrollMessage(CableClub_Text_WhenAllPlayersReadyAConfirmBCancel);
gTasks[taskId].func = Task_LinkupMaster_2;
}
else if (JOY_HELD(B_BUTTON))
{
ShowFieldAutoScrollMessage(CableClub_Text_WhenAllPlayersReadyAConfirmBCancel);
gTasks[taskId].func = Task_LinkupMaster_2;
}
else if (JOY_HELD(A_BUTTON))
{
PlaySE(SE_SELECT);
CheckShouldAdvanceLinkState();
gTasks[taskId].func = Task_LinkupMaster_5;
}
}
}
static void Task_LinkupMaster_5(u8 taskId)
{
u8 lower = gTasks[taskId].data[1];
u8 higher = gTasks[taskId].data[2];
u16 *res;
if (sub_80808BC(taskId) != TRUE && Task_Linkup_TimedOut(taskId) != TRUE)
{
if (GetLinkPlayerCount_2() != GetSavedPlayerCount())
{
gTasks[taskId].func = Task_Linkup_ErroredOut;
}
else
{
res = &gSpecialVar_Result;
*res = sub_8080844(lower, higher);
if (*res)
gTasks[taskId].func = Task_LinkupMaster_6;
}
}
}
static void Task_LinkupSlave_2(u8 taskId)
{
u8 lower = gTasks[taskId].data[1];
u8 higher = gTasks[taskId].data[2];
u16 *res;
if (sub_80808F0(taskId) != TRUE && sub_80808BC(taskId) != TRUE)
{
res = &gSpecialVar_Result;
*res = sub_8080844(lower, higher);
if (*res)
{
if (*res == 3 || *res == 4)
{
Link_TryStartSend5FFF();
HideFieldMessageBox();
gTasks[taskId].func = Task_Linkup_7;
}
else if (*res == 7 || *res == 9)
{
CloseLink();
HideFieldMessageBox();
gTasks[taskId].func = Task_Linkup_7;
}
else
{
gFieldLinkPlayerCount = GetLinkPlayerCount_2();
gLocalLinkPlayerId = GetMultiplayerId();
sub_800A900(gFieldLinkPlayerCount);
TrainerCard_GenerateCardForLinkPlayer((void*)gBlockSendBuffer);
gTasks[taskId].func = Task_Linkup_6a;
}
}
}
}
static bool32 AnyConnectedPartnersPlayingRS(void)
{
int i;
u16 version;
for (i = 0; i < GetLinkPlayerCount(); i++)
{
version = gLinkPlayers[i].version & 0xFF;
if (version == VERSION_RUBY || version == VERSION_SAPPHIRE)
return TRUE;
}
return FALSE;
}
static void Task_LinkupMaster_6(u8 taskId)
{
if (sub_80808BC(taskId) != TRUE)
{
if (gSpecialVar_Result == 4)
{
if (AnyConnectedPartnersPlayingRS() == TRUE)
CloseLink();
else
Link_TryStartSend5FFF();
HideFieldMessageBox();
gTasks[taskId].func = Task_Linkup_7;
}
else if (gSpecialVar_Result == 3)
{
Link_TryStartSend5FFF();
HideFieldMessageBox();
gTasks[taskId].func = Task_Linkup_7;
}
else if (gSpecialVar_Result == 7 || gSpecialVar_Result == 9)
{
CloseLink();
HideFieldMessageBox();
gTasks[taskId].func = Task_Linkup_7;
}
else
{
gFieldLinkPlayerCount = GetLinkPlayerCount_2();
gLocalLinkPlayerId = GetMultiplayerId();
sub_800A900(gFieldLinkPlayerCount);
TrainerCard_GenerateCardForLinkPlayer((void*)gBlockSendBuffer);
gTasks[taskId].func = Task_Linkup_6a;
sub_800A474(2);
}
}
}
static void Task_Linkup_6a(u8 taskId)
{
u8 i;
u16 version;
u8 * dest;
if (sub_80808BC(taskId) != TRUE && GetBlockReceivedStatus() == sub_800A8A4())
{
for(i = 0; i < GetLinkPlayerCount(); i++)
{
version = gLinkPlayers[i].version & 0xFF;
if (version != VERSION_FIRE_RED && version != VERSION_LEAF_GREEN)
{
const struct TrainerCardRSE * src = (const struct TrainerCardRSE *)gBlockRecvBuffer[i];
gTrainerCards[i].rse = *src;
gTrainerCards[i].version = gLinkPlayers[i].version;
}
else
{
const struct TrainerCard * src = (const struct TrainerCard *)gBlockRecvBuffer[i];
gTrainerCards[i] = *src;
}
}
SetSuppressLinkErrorMessage(FALSE);
ResetBlockReceivedFlags();
HideFieldMessageBox();
if (gSpecialVar_Result == 1)
{
// Dumb trick required to match
if (gLinkType == LINKTYPE_0x4411)
*UnusedVarNeededToMatch += 0;
DestroyLinkPlayerCountDisplayWindow(gTasks[taskId].data[5]);
EnableBothScriptContexts();
DestroyTask(taskId);
}
else
{
Link_TryStartSend5FFF();
gTasks[taskId].func = Task_Linkup_7;
}
}
}
static void Task_Linkup_7(u8 taskId)
{
if (!gReceivedRemoteLinkPlayers)
{
DestroyLinkPlayerCountDisplayWindow(gTasks[taskId].data[5]);
EnableBothScriptContexts();
RemoveWindow(gTasks[taskId].data[5]);
DestroyTask(taskId);
}
}
static void Task_Linkup_Canceled(u8 taskId)
{
gSpecialVar_Result = 5;
DestroyLinkPlayerCountDisplayWindow(gTasks[taskId].data[5]);
HideFieldMessageBox();
EnableBothScriptContexts();
DestroyTask(taskId);
}
static void Task_Linkup_ErroredOut(u8 taskId)
{
gSpecialVar_Result = 6;
DestroyLinkPlayerCountDisplayWindow(gTasks[taskId].data[5]);
HideFieldMessageBox();
EnableBothScriptContexts();
DestroyTask(taskId);
}
static bool8 Task_Linkup_TimedOut(u8 taskId)
{
gTasks[taskId].data[4]++;
if (gTasks[taskId].data[4] > 600)
{
gTasks[taskId].func = Task_Linkup_ErroredOut;
return TRUE;
}
return FALSE;
}
void TryBattleLinkup(void)
{
u8 lower, higher;
higher = lower = 2;
switch (gSpecialVar_0x8004)
{
case USING_SINGLE_BATTLE:
higher = lower = 2;
gLinkType = LINKTYPE_SINGLE_BATTLE;
break;
case USING_DOUBLE_BATTLE:
higher = lower = 2;
gLinkType = LINKTYPE_DOUBLE_BATTLE;
break;
case USING_MULTI_BATTLE:
higher = lower = 4;
gLinkType = LINKTYPE_MULTI_BATTLE;
break;
}
CreateLinkupTask(lower, higher);
}
void TryTradeLinkup(void)
{
gLinkType = LINKTYPE_0x1133;
gBattleTypeFlags = 0;
CreateLinkupTask(2, 2);
}
void TryRecordMixLinkup(void)
{
gSpecialVar_Result = 0;
gLinkType = LINKTYPE_0x3311;
gBattleTypeFlags = 0;
CreateLinkupTask(2, 4);
}
void sub_8081128(void)
{
gLinkType = LINKTYPE_0x6601;
gBattleTypeFlags = 0;
CreateLinkupTask(4, 4);
}
u8 CreateTask_ReestablishLinkInCableClubRoom(void)
{
if (FuncIsActiveTask(Task_ReestablishLinkInCableClubRoom_0))
return 0xFF;
switch (gSpecialVar_0x8004)
{
case USING_SINGLE_BATTLE:
gLinkType = LINKTYPE_SINGLE_BATTLE;
break;
case USING_DOUBLE_BATTLE:
gLinkType = LINKTYPE_DOUBLE_BATTLE;
break;
case USING_MULTI_BATTLE:
gLinkType = LINKTYPE_MULTI_BATTLE;
break;
case USING_TRADE_CENTER:
gLinkType = LINKTYPE_0x1111;
break;
case USING_RECORD_CORNER:
gLinkType = LINKTYPE_0x3322;
break;
}
return CreateTask(Task_ReestablishLinkInCableClubRoom_0, 80);
}
static void Task_ReestablishLinkInCableClubRoom_0(u8 taskId)
{
s16 *data = gTasks[taskId].data;
if (data[0] == 0)
{
OpenLink();
ResetLinkPlayers();
CreateTask(sub_8081A90, 80);
}
else if (data[0] > 9)
gTasks[taskId].func = Task_ReestablishLinkInCableClubRoom_1;
data[0]++;
}
static void Task_ReestablishLinkInCableClubRoom_1(u8 taskId)
{
if (GetLinkPlayerCount_2() >= 2)
{
if (IsLinkMaster() == TRUE)
{
gTasks[taskId].func = Task_ReestablishLinkInCableClubRoom_Master;
}
else
{
gTasks[taskId].func = Task_ReestablishLinkInCableClubRoom_2;
}
}
}
static void Task_ReestablishLinkInCableClubRoom_Master(u8 taskId)
{
if (GetSavedPlayerCount() == GetLinkPlayerCount_2())
{
CheckShouldAdvanceLinkState();
gTasks[taskId].func = Task_ReestablishLinkInCableClubRoom_2;
}
}
static void Task_ReestablishLinkInCableClubRoom_2(u8 taskId)
{
if (gReceivedRemoteLinkPlayers == TRUE && IsLinkPlayerDataExchangeComplete() == TRUE)
{
sub_800A9A4();
sub_8009FE8();
DestroyTask(taskId);
}
}
void Special_CableClub_AskSaveTheGame(void)
{
Field_AskSaveTheGame();
}
static void Task_StartWiredCableClubBattle(u8 taskId)
{
struct Task * task = &gTasks[taskId];
switch (task->data[0])
{
case 0:
FadeScreen(FADE_TO_BLACK, 0);
gLinkType = LINKTYPE_BATTLE;
ClearLinkCallback_2();
task->data[0]++;
break;
case 1:
if (!gPaletteFade.active)
task->data[0]++;
break;
case 2:
task->data[1]++;
if (task->data[1] > 20)
task->data[0]++;
break;
case 3:
Link_TryStartSend5FFF();
task->data[0]++;
break;
case 4:
if (!gReceivedRemoteLinkPlayers)
task->data[0]++;
break;
case 5:
if (gLinkPlayers[0].trainerId & 1)
PlayMapChosenOrBattleBGM(MUS_BATTLE32);
else
PlayMapChosenOrBattleBGM(MUS_BATTLE20);
switch (gSpecialVar_0x8004)
{
case USING_SINGLE_BATTLE:
gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK;
break;
case USING_DOUBLE_BATTLE:
gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK | BATTLE_TYPE_DOUBLE;
break;
case USING_MULTI_BATTLE:
ReducePlayerPartyToThree();
gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI;
break;
}
CleanupOverworldWindowsAndTilemaps();
gTrainerBattleOpponent_A = TRAINER_LINK_OPPONENT;
SetMainCallback2(CB2_InitBattle);
gMain.savedCallback = CB2_ReturnFromCableClubBattle;
DestroyTask(taskId);
break;
}
}
static void Task_StartWirelessCableClubBattle(u8 taskId)
{
s16 *data = gTasks[taskId].data;
int i;
switch (data[0])
{
case 0:
FadeScreen(FADE_TO_BLACK, 0);
gLinkType = LINKTYPE_BATTLE;
ClearLinkCallback_2();
data[0] = 1;
break;
case 1:
if (!gPaletteFade.active)
data[0] = 2;
break;
case 2:
SendBlock(0, &gLocalLinkPlayer, sizeof(struct LinkPlayer));
data[0] = 3;
break;
case 3:
if (GetBlockReceivedStatus() == sub_800A8D4())
{
for (i = 0; i < GetLinkPlayerCount(); i++)
{
gLinkPlayers[i] = *(struct LinkPlayer *)gBlockRecvBuffer[i];
IntlConvertLinkPlayerName(&gLinkPlayers[i]);
ResetBlockReceivedFlag(i);
}
data[0] = 4;
}
break;
case 4:
data[1]++;
if (data[1] > 20)
data[0] = 5;
break;
case 5:
PrepareSendLinkCmd2FFE_or_RfuCmd6600();
data[0] = 6;
break;
case 6:
if (IsLinkTaskFinished())
data[0] = 7;
break;
case 7:
if (gLinkPlayers[0].trainerId & 1)
PlayMapChosenOrBattleBGM(MUS_BATTLE32);
else
PlayMapChosenOrBattleBGM(MUS_BATTLE20);
gLinkPlayers[0].linkType = LINKTYPE_BATTLE;
switch (gSpecialVar_0x8004)
{
case USING_SINGLE_BATTLE:
gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK;
break;
case USING_DOUBLE_BATTLE:
gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK | BATTLE_TYPE_DOUBLE;
break;
case USING_MULTI_BATTLE:
ReducePlayerPartyToThree();
gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI;
break;
}
CleanupOverworldWindowsAndTilemaps();
gTrainerBattleOpponent_A = TRAINER_LINK_OPPONENT;
SetMainCallback2(CB2_InitBattle);
gMain.savedCallback = CB2_ReturnFromCableClubBattle;
DestroyTask(taskId);
break;
}
}
static void sub_8081624(void)
{
switch (gMain.state)
{
case 0:
Link_TryStartSend5FFF();
gMain.state++;
break;
case 1:
if (IsLinkTaskFinished())
SetMainCallback2(CB2_ReturnToField);
break;
}
}
void CB2_ReturnFromCableClubBattle(void)
{
gBattleTypeFlags &= (u16)~BATTLE_TYPE_20;
sub_8055DB8();
LoadPlayerParty();
SavePlayerBag();
Special_UpdateTrainerFansAfterLinkBattle();
if (gSpecialVar_0x8004 != USING_MULTI_BATTLE)
{
TryRecordLinkBattleOutcome(gLocalLinkPlayerId ^ 1);
if (gWirelessCommType != 0)
{
switch (gBattleOutcome)
{
case B_OUTCOME_WON:
MEvent_RecordIdOfWonderCardSenderByEventType(0, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId);
break;
case B_OUTCOME_LOST:
MEvent_RecordIdOfWonderCardSenderByEventType(1, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId);
break;
}
}
}
if (InUnionRoom() == TRUE)
{
gMain.savedCallback = sub_8081624;
}
else
{
gMain.savedCallback = c2_8056854;
}
SetMainCallback2(CB2_SetUpSaveAfterLinkBattle);
}
void CleanupLinkRoomState(void)
{
if (gSpecialVar_0x8004 == USING_SINGLE_BATTLE || gSpecialVar_0x8004 == USING_DOUBLE_BATTLE || gSpecialVar_0x8004 == USING_MULTI_BATTLE)
{
LoadPlayerParty();
SavePlayerBag();
}
copy_saved_warp2_bank_and_enter_x_to_warp1(127);
}
void sub_8081770(void)
{
sub_8057F5C();
}
static void Task_EnterCableClubSeat(u8 taskId)
{
struct Task * task = &gTasks[taskId];
switch (task->data[0])
{
case 0:
ShowFieldMessage(CableClub_Text_PleaseWaitBCancel);
task->data[0] = 1;
break;
case 1:
if (IsFieldMessageBoxHidden())
{
sub_8057F34();
SetLocalLinkPlayerId(gSpecialVar_0x8005);
task->data[0] = 2;
}
break;
case 2:
switch (sub_8057EC0())
{
case 0:
break;
case 1:
HideFieldMessageBox();
task->data[0] = 0;
sub_8057F70();
SwitchTaskToFollowupFunc(taskId);
break;
case 2:
task->data[0] = 3;
break;
}
break;
case 3:
sub_8057F48();
sub_80F771C(TRUE);
DestroyTask(taskId);
EnableBothScriptContexts();
break;
}
}
static void CreateEnterCableClubSeatTaskWithFollowupFunc(TaskFunc followUpFunc)
{
u8 taskId = CreateTask(Task_EnterCableClubSeat, 80);
SetTaskFuncWithFollowupFunc(taskId, Task_EnterCableClubSeat, followUpFunc);
ScriptContext1_Stop();
}
static void Task_StartWiredCableClubTrade(u8 taskId)
{
struct Task * task = &gTasks[taskId];
switch (task->data[0])
{
case 0:
ScriptContext2_Enable();
FadeScreen(FADE_TO_BLACK, 0);
ClearLinkCallback_2();
task->data[0]++;
break;
case 1:
if (!gPaletteFade.active)
task->data[0]++;
break;
case 2:
gSelectedTradeMonPositions[0] = 0;
gSelectedTradeMonPositions[1] = 0;
m4aMPlayAllStop();
Link_TryStartSend5FFF();
task->data[0]++;
break;
case 3:
if (!gReceivedRemoteLinkPlayers)
{
SetMainCallback2(CB2_ReturnFromLinkTrade);
DestroyTask(taskId);
}
break;
}
}
static void Task_StartWirelessCableClubTrade(u8 taskId)
{
s16 *data = gTasks[taskId].data;
switch (data[0])
{
case 0:
ScriptContext2_Enable();
FadeScreen(FADE_TO_BLACK, 0);
Rfu_set_zero();
data[0]++;
break;
case 1:
if (!gPaletteFade.active)
data[0]++;
break;
case 2:
gSelectedTradeMonPositions[0] = 0;
gSelectedTradeMonPositions[1] = 0;
m4aMPlayAllStop();
PrepareSendLinkCmd2FFE_or_RfuCmd6600();
data[0]++;
break;
case 3:
if (IsLinkTaskFinished())
{
UnionRoom_CreateTask_CallCB2ReturnFromLinkTrade();
DestroyTask(taskId);
}
break;
}
}
void EnterTradeSeat(void)
{
if (gWirelessCommType)
CreateEnterCableClubSeatTaskWithFollowupFunc(Task_StartWirelessCableClubTrade);
else
CreateEnterCableClubSeatTaskWithFollowupFunc(Task_StartWiredCableClubTrade);
}
static void CreateTask_StartWiredCableClubTrade(void)
{
CreateTask(Task_StartWiredCableClubTrade, 80);
}
void Special_WiredCableClubTrade(void)
{
CreateTask_StartWiredCableClubTrade();
ScriptContext1_Stop();
}
void EnterColosseumPlayerSpot(void)
{
gLinkType = LINKTYPE_BATTLE;
if (gWirelessCommType)
CreateEnterCableClubSeatTaskWithFollowupFunc(Task_StartWirelessCableClubBattle);
else
CreateEnterCableClubSeatTaskWithFollowupFunc(Task_StartWiredCableClubBattle);
}
static void Debug_CreateTaskEnterCableClubSeat(void)
{
CreateTask(Task_EnterCableClubSeat, 80);
ScriptContext1_Stop();
}
void Script_ShowLinkTrainerCard(void)
{
ShowTrainerCardInLink(gSpecialVar_0x8006, CB2_ReturnToFieldContinueScriptPlayMapMusic);
}
bool32 GetSeeingLinkPlayerCardMsg(u8 who)
{
u8 stars;
gSpecialVar_0x8006 = who;
StringCopy(gStringVar1, gLinkPlayers[who].name);
stars = GetTrainerCardStars(who);
if (stars == 0)
return FALSE;
StringCopy(gStringVar2, sStarsMessagePtrs[stars - 1]);
return TRUE;
}
void sub_8081A90(u8 taskId)
{
struct Task * task = &gTasks[taskId];
task->data[0]++;
if (task->data[0] > 300)
{
CloseLink();
SetMainCallback2(CB2_LinkError);
DestroyTask(taskId);
}
if (gReceivedRemoteLinkPlayers)
DestroyTask(taskId);
}
static void sub_8081AE4(u8 taskId)
{
if (!gReceivedRemoteLinkPlayers)
{
EnableBothScriptContexts();
DestroyTask(taskId);
}
}
static void sub_8081B08(u8 taskId)
{
Link_TryStartSend5FFF();
gTasks[taskId].func = sub_8081AE4;
}
+8 -8
View File
@@ -133,10 +133,10 @@ const u8 gFacilityClassToPicIndex[] =
[FACILITY_CLASS_CRUSH_KIN] = 130,
[FACILITY_CLASS_SIS_AND_BRO_2] = 131,
[FACILITY_CLASS_PKMN_PROF] = 132,
[FACILITY_CLASS_PLAYER] = 133,
[FACILITY_CLASS_PLAYER_2] = 134,
[FACILITY_CLASS_PLAYER_3] = 135,
[FACILITY_CLASS_PLAYER_4] = 136,
[FACILITY_CLASS_BRENDAN] = TRAINER_PIC_RS_BRENDAN_2,
[FACILITY_CLASS_MAY] = TRAINER_PIC_RS_MAY_2,
[FACILITY_CLASS_RED] = TRAINER_PIC_RED,
[FACILITY_CLASS_LEAF] = TRAINER_PIC_LEAF,
[FACILITY_CLASS_TEAM_ROCKET_2] = 137,
[FACILITY_CLASS_PSYCHIC_4] = 138,
[FACILITY_CLASS_CRUSH_GIRL] = 139,
@@ -287,10 +287,10 @@ const u8 gFacilityClassToTrainerClass[] =
[FACILITY_CLASS_CRUSH_KIN] = CLASS_CRUSH_KIN,
[FACILITY_CLASS_SIS_AND_BRO_2] = CLASS_SIS_AND_BRO_2,
[FACILITY_CLASS_PKMN_PROF] = CLASS_PKMN_PROF,
[FACILITY_CLASS_PLAYER] = CLASS_PLAYER,
[FACILITY_CLASS_PLAYER_2] = CLASS_PLAYER,
[FACILITY_CLASS_PLAYER_3] = CLASS_PLAYER,
[FACILITY_CLASS_PLAYER_4] = CLASS_PLAYER,
[FACILITY_CLASS_BRENDAN] = CLASS_PLAYER,
[FACILITY_CLASS_MAY] = CLASS_PLAYER,
[FACILITY_CLASS_RED] = CLASS_PLAYER,
[FACILITY_CLASS_LEAF] = CLASS_PLAYER,
[FACILITY_CLASS_TEAM_ROCKET_2] = CLASS_TEAM_ROCKET,
[FACILITY_CLASS_PSYCHIC_4] = CLASS_PSYCHIC_2,
[FACILITY_CLASS_CRUSH_GIRL] = CLASS_CRUSH_GIRL,
+2 -2
View File
@@ -172,7 +172,7 @@ static void task_mpl_807DD60(u8 taskId)
switch (task->data[0])
{
case 0:
task->data[1] = sub_8081150();
task->data[1] = CreateTask_ReestablishLinkInCableClubRoom();
task->data[0]++;
break;
case 1:
@@ -192,7 +192,7 @@ static void task_mpl_807DD60(u8 taskId)
}
}
void sub_807DDD0(void)
void FieldCB_ReturnToFieldWiredLink(void)
{
ScriptContext2_Enable();
Overworld_PlaySpecialMapMusic();
+8 -7
View File
@@ -165,7 +165,7 @@ void Special_SetHiddenItemFlag(void)
FlagSet(gSpecialVar_0x8004);
}
u8 Special_GetLeadMonFriendship(void)
u8 GetLeadMonFriendship(void)
{
struct Pokemon * pokemon = &gPlayerParty[GetLeadMonIndex()];
if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) == 255)
@@ -672,10 +672,10 @@ void IncrementResortGorgeousStepCounter(void)
}
}
void Special_SampleResortGorgeousMonAndReward(void)
void SampleResortGorgeousMonAndReward(void)
{
u16 var4036 = VarGet(VAR_RESORT_GORGEOUS_REQUESTED_MON);
if (var4036 == SPECIES_NONE || var4036 == 0xFFFF)
u16 requestedSpecies = VarGet(VAR_RESORT_GORGEOUS_REQUESTED_MON);
if (requestedSpecies == SPECIES_NONE || requestedSpecies == 0xFFFF)
{
VarSet(VAR_RESORT_GORGEOUS_REQUESTED_MON, SampleResortGorgeousMon());
VarSet(VAR_RESORT_GORGEOUS_REWARD, SampleResortGorgeousReward());
@@ -1695,7 +1695,7 @@ void Special_UpdateTrainerCardPhotoIcons(void)
VarSet(VAR_TRAINER_CARD_MON_ICON_TINT_IDX, gSpecialVar_0x8004);
}
u16 Special_StickerLadyGetBragFlags(void)
u16 StickerManGetBragFlags(void)
{
u16 result = 0;
u32 numEggs;
@@ -2458,14 +2458,15 @@ void Special_BrailleCursorToggle(void)
}
}
bool8 Special_PlayerPartyContainsSpeciesWithPlayerID(void)
bool8 PlayerPartyContainsSpeciesWithPlayerID(void)
{
// 8004 = species
u8 playerCount = CalculatePlayerPartyCount();
u8 i;
for (i = 0; i < playerCount; i++)
{
if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL) == gSpecialVar_0x8004 && GetPlayerTrainerId() == GetMonData(&gPlayerParty[i], MON_DATA_OT_ID, NULL))
if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL) == gSpecialVar_0x8004
&& GetPlayerTrainerId() == GetMonData(&gPlayerParty[i], MON_DATA_OT_ID, NULL))
return TRUE;
}
return FALSE;
+4 -4
View File
@@ -1210,10 +1210,10 @@ const u32 gUnknown_8E990F8[] = INCBIN_U32("graphics/interface/naming_screen_8E99
const u8 gUnknown_8E99118[] = INCBIN_U8("graphics/tm_case/unk_8E99118.4bpp");
const u16 gFireRedTrainerCard_Pal[] = INCBIN_U16("graphics/trainer_card/0star.gbapal");
const u32 gFireRedTrainerCard_Gfx[] = INCBIN_U32("graphics/trainer_card/card.4bpp.lz");
const u16 gEmeraldTrainerCard_Pal[] = INCBIN_U16("graphics/trainer_card/0star_em.gbapal");
const u32 gEmeraldTrainerCard_Gfx[] = INCBIN_U32("graphics/trainer_card/card_em.4bpp.lz");
const u16 gKantoTrainerCard_Pal[] = INCBIN_U16("graphics/trainer_card/0star.gbapal");
const u32 gKantoTrainerCard_Gfx[] = INCBIN_U32("graphics/trainer_card/card.4bpp.lz");
const u16 gHoennTrainerCard_Pal[] = INCBIN_U16("graphics/trainer_card/0star_em.gbapal");
const u32 gHoennTrainerCard_Gfx[] = INCBIN_U32("graphics/trainer_card/card_em.4bpp.lz");
const u16 gUnknown_8E99D8C[] = INCBIN_U16("graphics/link_rfu/unk_8E99DAC.gbapal");
const u32 gUnknown_8E99DAC[] = INCBIN_U32("graphics/link_rfu/unk_8E99DAC.4bpp.lz");
+4 -4
View File
@@ -796,7 +796,7 @@ u8 GetLinkPlayerDataExchangeStatusTimed(int lower, int upper)
if (lower > cmpVal || cmpVal > upper)
{
sPlayerDataExchangeStatus = EXCHANGE_STAT_6;
return 6;
return EXCHANGE_STAT_6;
}
else
{
@@ -1006,15 +1006,15 @@ bool8 SendBlock(u8 unused, const void *src, u16 size)
return InitBlockSend(src, size);
}
bool8 sub_800A474(u8 a0)
bool8 sub_800A474(u8 blockRequestType)
{
if (gWirelessCommType == 1)
{
return sub_80FA0F8(a0);
return sub_80FA0F8(blockRequestType);
}
if (gLinkCallback == NULL)
{
gBlockRequestType = a0;
gBlockRequestType = blockRequestType;
BuildSendCmd(LINKCMD_0xCCCC);
return TRUE;
}
+587 -545
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -300,7 +300,7 @@ u16 sub_810C2FC(u16 species, bool8 isFrontPic, u8 paletteSlot, u8 windowId)
return sub_810C050(species, 0, 0, isFrontPic, paletteSlot, windowId, TRUE);
}
u16 sub_810C330(u16 species, bool8 isFrontPic, u16 destX, u16 destY, u8 paletteSlot, u8 windowId)
u16 CreateTrainerCardTrainerPicSprite(u16 species, bool8 isFrontPic, u16 destX, u16 destY, u8 paletteSlot, u8 windowId)
{
return sub_810C0C0(species, 0, 0, isFrontPic, destX, destY, paletteSlot, windowId, TRUE);
}
+14 -13
View File
@@ -46,6 +46,7 @@
#include "constants/cable_club.h"
#include "constants/field_weather.h"
#include "constants/species.h"
#include "constants/trainer_card.h"
#include "constants/union_room.h"
static EWRAM_DATA u8 sUnionRoomPlayerName[12] = {};
@@ -1735,7 +1736,7 @@ static void Task_CallCB2ReturnFromLinkTrade(u8 taskId)
DestroyTask(taskId);
}
u8 UnionRoom_CreateTask_CallBC2ReturnFromLinkTrade(void)
u8 UnionRoom_CreateTask_CallCB2ReturnFromLinkTrade(void)
{
u8 taskId = CreateTask(Task_CallCB2ReturnFromLinkTrade, 0);
@@ -1848,7 +1849,7 @@ void StartUnionRoomBattle(u16 battleFlags)
gLinkPlayers[0].linkType = LINKTYPE_BATTLE;
gLinkPlayers[GetMultiplayerId()].id = GetMultiplayerId();
gLinkPlayers[GetMultiplayerId() ^ 1].id = GetMultiplayerId() ^ 1;
gMain.savedCallback = sub_8081668;
gMain.savedCallback = CB2_ReturnFromCableClubBattle;
gBattleTypeFlags = battleFlags;
PlayBattleBGM();
}
@@ -4692,23 +4693,23 @@ static void ViewURoomPartnerTrainerCard(u8 *unused, struct UnkStruct_URoom * uro
StringCopy(uroom->trainerCardStrbufs[0], gTrainerClassNames[sub_80447F0()]);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, uroom->trainerCardStrbufs[0]);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, trainerCard->playerName);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, trainerCard->rse.playerName);
StringCopy(uroom->field_174, gUnknown_84594B0[trainerCard->stars]);
StringCopy(uroom->field_174, gUnknown_84594B0[trainerCard->rse.stars]);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, uroom->field_174);
ConvertIntToDecimalStringN(uroom->trainerCardStrbufs[2], trainerCard->caughtMonsCount, STR_CONV_MODE_LEFT_ALIGN, 3);
ConvertIntToDecimalStringN(uroom->trainerCardStrbufs[2], trainerCard->rse.caughtMonsCount, STR_CONV_MODE_LEFT_ALIGN, 3);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, uroom->trainerCardStrbufs[2]);
ConvertIntToDecimalStringN(uroom->trainerCardStrbufs[3], trainerCard->playTimeHours, STR_CONV_MODE_LEFT_ALIGN, 3);
ConvertIntToDecimalStringN(uroom->trainerCardStrbufs[4], trainerCard->playTimeMinutes, STR_CONV_MODE_LEADING_ZEROS, 2);
ConvertIntToDecimalStringN(uroom->trainerCardStrbufs[3], trainerCard->rse.playTimeHours, STR_CONV_MODE_LEFT_ALIGN, 3);
ConvertIntToDecimalStringN(uroom->trainerCardStrbufs[4], trainerCard->rse.playTimeMinutes, STR_CONV_MODE_LEADING_ZEROS, 2);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, uroom->trainerCardStrbufs[3]);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(5, uroom->trainerCardStrbufs[4]);
DynamicPlaceholderTextUtil_ExpandPlaceholders(uroom->field_1A4, gUnknown_84594C4);
StringCopy(gStringVar4, uroom->field_1A4);
n = trainerCard->linkBattleWins;
n = trainerCard->rse.linkBattleWins;
if (n > 9999)
{
n = 9999;
@@ -4716,7 +4717,7 @@ static void ViewURoomPartnerTrainerCard(u8 *unused, struct UnkStruct_URoom * uro
ConvertIntToDecimalStringN(uroom->trainerCardStrbufs[0], n, STR_CONV_MODE_LEFT_ALIGN, 4);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, uroom->trainerCardStrbufs[0]);
n = trainerCard->linkBattleLosses;
n = trainerCard->rse.linkBattleLosses;
if (n > 9999)
{
n = 9999;
@@ -4724,12 +4725,12 @@ static void ViewURoomPartnerTrainerCard(u8 *unused, struct UnkStruct_URoom * uro
ConvertIntToDecimalStringN(uroom->trainerCardStrbufs[1], n, STR_CONV_MODE_LEFT_ALIGN, 4);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, uroom->trainerCardStrbufs[1]);
ConvertIntToDecimalStringN(uroom->trainerCardStrbufs[2], trainerCard->pokemonTrades, STR_CONV_MODE_LEFT_ALIGN, 5);
ConvertIntToDecimalStringN(uroom->trainerCardStrbufs[2], trainerCard->rse.pokemonTrades, STR_CONV_MODE_LEFT_ALIGN, 5);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, uroom->trainerCardStrbufs[2]);
for (i = 0; i < 4; i++)
for (i = 0; i < TRAINER_CARD_PROFILE_LENGTH; i++)
{
CopyEasyChatWord(uroom->trainerCardStrbufs[i + 3], trainerCard->var_28[i]);
CopyEasyChatWord(uroom->trainerCardStrbufs[i + 3], trainerCard->rse.easyChatProfile[i]);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(i + 4, uroom->trainerCardStrbufs[i + 3]);
}
@@ -4743,7 +4744,7 @@ static void ViewURoomPartnerTrainerCard(u8 *unused, struct UnkStruct_URoom * uro
}
else if (parent_child == MODE_CHILD)
{
DynamicPlaceholderTextUtil_ExpandPlaceholders(uroom->field_1A4, gUnknown_8459580[trainerCard->gender]);
DynamicPlaceholderTextUtil_ExpandPlaceholders(uroom->field_1A4, gUnknown_8459580[trainerCard->rse.gender]);
StringAppend(gStringVar4, uroom->field_1A4);
}
}