summaryrefslogtreecommitdiff
path: root/src/cable_club.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cable_club.c')
-rw-r--r--src/cable_club.c397
1 files changed, 397 insertions, 0 deletions
diff --git a/src/cable_club.c b/src/cable_club.c
new file mode 100644
index 000000000..348a2a83d
--- /dev/null
+++ b/src/cable_club.c
@@ -0,0 +1,397 @@
+#include "global.h"
+#include "gflib.h"
+#include "event_data.h"
+#include "event_scripts.h"
+#include "field_message_box.h"
+#include "link.h"
+#include "overworld.h"
+#include "new_menu_helpers.h"
+#include "script.h"
+#include "strings.h"
+#include "task.h"
+#include "trainer_card.h"
+#include "constants/songs.h"
+
+void sub_80809F8(u8 taskId);
+void sub_8080A4C(u8 taskId);
+void sub_8080AD0(u8 taskId);
+void sub_8080B20(u8 taskId);
+void sub_8080BC8(u8 taskId);
+void sub_8080C6C(u8 taskId);
+void sub_8080CDC(u8 taskId);
+void sub_8080DC0(u8 taskId);
+void sub_8080E6C(u8 taskId);
+void sub_8080F78(u8 taskId);
+void sub_8080FB4(u8 taskId);
+void sub_8080FF0(u8 taskId);
+bool8 sub_808102C(u8 taskId);
+
+static const struct WindowTemplate gUnknown_83C6AB0 = {
+ .bg = 0,
+ .tilemapLeft = 16,
+ .tilemapTop = 11,
+ .width = 11,
+ .height = 2,
+ .paletteNum = 15,
+ .baseBlock = 0x125
+};
+
+const u8 *const gUnknown_83C6AB8[] = {
+ gUnknown_841DF8B,
+ gUnknown_841DF92,
+ gUnknown_841DF99,
+ gUnknown_841DFA0
+};
+
+void sub_8080748(u8 a0, u8 a1)
+{
+ u8 taskId;
+ if (FindTaskIdByFunc(sub_80809F8) == 0xFF)
+ {
+ taskId = CreateTask(sub_80809F8, 80);
+ gTasks[taskId].data[1] = a0;
+ gTasks[taskId].data[2] = a1;
+ }
+}
+
+void sub_808078C(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);
+}
+
+void sub_80807E8(u16 windowId)
+{
+ ClearStdWindowAndFrame(windowId, FALSE);
+ CopyWindowToVram(windowId, 3);
+}
+
+void sub_8080808(u8 taskId, u8 num)
+{
+ s16 *data = gTasks[taskId].data;
+ if (num != data[3])
+ {
+ if (num < 2)
+ sub_80807E8(data[5]);
+ else
+ sub_808078C(data[5], num);
+ data[3] = num;
+ }
+}
+
+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;
+ }
+}
+
+bool32 sub_80808BC(u8 taskId)
+{
+ if (HasLinkErrorOccurred() == TRUE)
+ {
+ gTasks[taskId].func = sub_8080FF0;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool32 sub_80808F0(u8 taskId)
+{
+ if (JOY_NEW(B_BUTTON) && !IsLinkConnectionEstablished())
+ {
+ gLinkType = 0;
+ gTasks[taskId].func = sub_8080FB4;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool32 sub_808093C(u8 taskId)
+{
+ if (IsLinkConnectionEstablished())
+ {
+ SetSuppressLinkErrorMessage(TRUE);
+ }
+ if (JOY_NEW(B_BUTTON))
+ {
+ gLinkType = 0;
+ gTasks[taskId].func = sub_8080FB4;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool32 sub_8080990(u8 taskId)
+{
+ if (GetSioMultiSI() == TRUE)
+ {
+ gTasks[taskId].func = sub_8080FF0;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void sub_80809C4(u8 taskId)
+{
+ gTasks[taskId].data[0]++;
+ if (gTasks[taskId].data[0] == 10)
+ {
+ sub_800A474(2);
+ DestroyTask(taskId);
+ }
+}
+
+void sub_80809F8(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 = sub_8080A4C;
+ }
+ data[0]++;
+}
+
+void sub_8080A4C(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 = sub_8080AD0;
+ }
+ else
+ {
+ PlaySE(SE_BOO);
+ ShowFieldAutoScrollMessage(CableClub_Text_AwaitingLinkupBCancel);
+ gTasks[taskId].func = sub_8080CDC;
+ }
+ }
+}
+
+void sub_8080AD0(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 = sub_8080B20;
+ }
+}
+
+void sub_8080B20(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ s32 linkPlayerCount = GetLinkPlayerCount_2();
+ if (sub_80808F0(taskId) != TRUE && sub_8080990(taskId) != TRUE && sub_80808BC(taskId) != TRUE)
+ {
+ sub_8080808(taskId, linkPlayerCount);
+ if (JOY_NEW(A_BUTTON) && linkPlayerCount >= data[1])
+ {
+ sub_800A900(linkPlayerCount);
+ sub_80807E8(data[5]);
+ ConvertIntToDecimalStringN(gStringVar1, linkPlayerCount, STR_CONV_MODE_LEFT_ALIGN, 1);
+ ShowFieldAutoScrollMessage(CableClub_Text_StartLinkWithXPlayersAConfirmBCancel);
+ gTasks[taskId].func = sub_8080BC8;
+ }
+ }
+}
+
+void sub_8080BC8(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 = sub_8080AD0;
+ }
+ else if (JOY_HELD(B_BUTTON))
+ {
+ ShowFieldAutoScrollMessage(CableClub_Text_WhenAllPlayersReadyAConfirmBCancel);
+ gTasks[taskId].func = sub_8080AD0;
+ }
+ else if (JOY_HELD(A_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ CheckShouldAdvanceLinkState();
+ gTasks[taskId].func = sub_8080C6C;
+ }
+ }
+}
+
+void sub_8080C6C(u8 taskId)
+{
+ u8 lower = gTasks[taskId].data[1];
+ u8 higher = gTasks[taskId].data[2];
+ u16 *res;
+ if (sub_80808BC(taskId) != TRUE && sub_808102C(taskId) != TRUE)
+ {
+ if (GetLinkPlayerCount_2() != GetSavedPlayerCount())
+ {
+ gTasks[taskId].func = sub_8080FF0;
+ }
+ else
+ {
+ res = &gSpecialVar_Result;
+ *res = sub_8080844(lower, higher);
+ if (*res)
+ gTasks[taskId].func = sub_8080DC0;
+ }
+ }
+}
+
+void sub_8080CDC(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 = sub_8080F78;
+ }
+ else if (*res == 7 || *res == 9)
+ {
+ CloseLink();
+ HideFieldMessageBox();
+ gTasks[taskId].func = sub_8080F78;
+ }
+ else
+ {
+ gFieldLinkPlayerCount = GetLinkPlayerCount_2();
+ gLocalLinkPlayerId = GetMultiplayerId();
+ sub_800A900(gFieldLinkPlayerCount);
+ TrainerCard_GenerateCardForLinkPlayer((void*)gBlockSendBuffer);
+ gTasks[taskId].func = sub_8080E6C;
+ }
+ }
+ }
+}
+
+bool32 sub_8080D8C(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;
+}
+
+void sub_8080DC0(u8 taskId)
+{
+ if (sub_80808BC(taskId) != TRUE)
+ {
+ if (gSpecialVar_Result == 4)
+ {
+ if (sub_8080D8C() == TRUE)
+ CloseLink();
+ else
+ Link_TryStartSend5FFF();
+ HideFieldMessageBox();
+ gTasks[taskId].func = sub_8080F78;
+ }
+ else if (gSpecialVar_Result == 3)
+ {
+ Link_TryStartSend5FFF();
+ HideFieldMessageBox();
+ gTasks[taskId].func = sub_8080F78;
+ }
+ else if (gSpecialVar_Result == 7 || gSpecialVar_Result == 9)
+ {
+ CloseLink();
+ HideFieldMessageBox();
+ gTasks[taskId].func = sub_8080F78;
+ }
+ else
+ {
+ gFieldLinkPlayerCount = GetLinkPlayerCount_2();
+ gLocalLinkPlayerId = GetMultiplayerId();
+ sub_800A900(gFieldLinkPlayerCount);
+ TrainerCard_GenerateCardForLinkPlayer((void*)gBlockSendBuffer);
+ gTasks[taskId].func = sub_8080E6C;
+ sub_800A474(2);
+ }
+ }
+}
+
+void sub_8080E6C(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 == 0x4411)
+ gFieldLinkPlayerCount += 0;
+ sub_80807E8(gTasks[taskId].data[5]);
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ }
+ else
+ {
+ Link_TryStartSend5FFF();
+ gTasks[taskId].func = sub_8080F78;
+ }
+ }
+}