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.c304
1 files changed, 304 insertions, 0 deletions
diff --git a/src/cable_club.c b/src/cable_club.c
new file mode 100644
index 000000000..45fb347f3
--- /dev/null
+++ b/src/cable_club.c
@@ -0,0 +1,304 @@
+#include "global.h"
+#include "asm.h"
+#include "field_message_box.h"
+#include "link.h"
+#include "main.h"
+#include "script.h"
+#include "songs.h"
+#include "sound.h"
+#include "string_util.h"
+#include "task.h"
+#include "text.h"
+#include "trainer_card.h"
+
+extern u16 gScriptResult;
+extern struct TrainerCard gTrainerCards[4];
+
+extern u8 gUnknown_03004860;
+extern u8 gFieldLinkPlayerCount;
+
+extern u8 gUnknown_081A4932[];
+extern const u8 gUnknown_081A4975[];
+
+void sub_8082D4C();
+void sub_8082D60(u8, u8);
+u16 sub_8082D9C(u8, u8);
+u32 sub_8082DF4(u8);
+u32 sub_8082E28(u8);
+u32 sub_8082EB8(u8);
+void sub_8082FEC(u8 taskId);
+static void sub_80830E4(u8 taskId);
+void sub_8083188(u8 taskId);
+static void sub_8083288(u8 taskId);
+static void sub_8083314(u8 taskId);
+void sub_80833C4(u8 taskId);
+void sub_8083418(u8 taskId);
+u8 sub_8083444(u8 taskId);
+
+void sub_808303C(u8 taskId) {
+ s32 linkPlayerCount;
+ s16 *taskData;
+
+ taskData = gTasks[taskId].data;
+
+ linkPlayerCount = GetLinkPlayerCount_2();
+
+ if (sub_8082E28(taskId) == 1 ||
+ sub_8082EB8(taskId) == 1 ||
+ sub_8082DF4(taskId) == 1)
+ {
+ return;
+ }
+
+ sub_8082D60(taskId, linkPlayerCount);
+
+ if (!(gMain.newKeys & A_BUTTON))
+ {
+ return;
+ }
+
+ if (linkPlayerCount < taskData[1])
+ {
+ return;
+ }
+
+ sub_80081C8(linkPlayerCount);
+ sub_8082D4C();
+ ConvertIntToDecimalStringN(gStringVar1, linkPlayerCount, STR_CONV_MODE_LEFT_ALIGN, 1); // r5
+ ShowFieldAutoScrollMessage((u8 *) gUnknown_081A4975);
+ gTasks[taskId].func = sub_80830E4;
+}
+
+#ifdef NONMATCHING
+static void sub_80830E4(u8 taskId) {
+ if (sub_8082E28(taskId) == 1 ||
+ sub_8082EB8(taskId) == 1 ||
+ sub_8082DF4(taskId) == 1 ||
+ GetFieldMessageBoxMode())
+ {
+ return;
+ }
+
+ if (sub_800820C() == GetLinkPlayerCount_2() &&
+ !(gMain.heldKeys & B_BUTTON))
+ {
+ ShowFieldAutoScrollMessage(gUnknown_081A4932);
+ gTasks[taskId].func = sub_8082FEC;
+ return;
+ }
+
+ if (gMain.heldKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sub_8007F4C();
+ gTasks[(u32) taskId].func = sub_8083188;
+ }
+}
+#else
+__attribute__((naked))
+static void sub_80830E4(u8 taskId) {
+ asm(".syntax unified\n\
+ push {r4-r6,lr}\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ adds r6, r5, 0\n\
+ adds r0, r5, 0\n\
+ bl sub_8082E28\n\
+ cmp r0, 0x1\n\
+ beq _08083178\n\
+ adds r0, r5, 0\n\
+ bl sub_8082EB8\n\
+ cmp r0, 0x1\n\
+ beq _08083178\n\
+ adds r0, r5, 0\n\
+ bl sub_8082DF4\n\
+ cmp r0, 0x1\n\
+ beq _08083178\n\
+ bl GetFieldMessageBoxMode\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _08083178\n\
+ bl sub_800820C\n\
+ adds r4, r0, 0\n\
+ bl GetLinkPlayerCount_2\n\
+ lsls r4, 24\n\
+ lsls r0, 24\n\
+ cmp r4, r0\n\
+ bne _08083132\n\
+ ldr r0, _08083148 @ =gMain\n\
+ ldrh r1, [r0, 0x2C]\n\
+ movs r0, 0x2\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08083158\n\
+_08083132:\n\
+ ldr r0, _0808314C @ =gUnknown_081A4932\n\
+ bl ShowFieldAutoScrollMessage\n\
+ ldr r1, _08083150 @ =gTasks\n\
+ lsls r0, r5, 2\n\
+ adds r0, r5\n\
+ lsls r0, 3\n\
+ adds r0, r1\n\
+ ldr r1, _08083154 @ =sub_8082FEC\n\
+ str r1, [r0]\n\
+ b _08083178\n\
+ .align 2, 0\n\
+_08083148: .4byte gMain\n\
+_0808314C: .4byte gUnknown_081A4932\n\
+_08083150: .4byte gTasks\n\
+_08083154: .4byte sub_8082FEC\n\
+_08083158:\n\
+ movs r0, 0x1\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08083178\n\
+ movs r0, 0x5\n\
+ bl PlaySE\n\
+ bl sub_8007F4C\n\
+ ldr r0, _08083180 @ =gTasks\n\
+ lsls r1, r6, 2\n\
+ adds r1, r6\n\
+ lsls r1, 3\n\
+ adds r1, r0\n\
+ ldr r0, _08083184 @ =sub_8083188\n\
+ str r0, [r1]\n\
+_08083178:\n\
+ pop {r4-r6}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_08083180: .4byte gTasks\n\
+_08083184: .4byte sub_8083188\n\
+ .syntax divided\n");
+}
+#endif
+
+void sub_8083188(u8 taskId) {
+ u8 local1, local2;
+ u16 *result;
+
+ local1 = gTasks[taskId].data[1];
+ local2 = gTasks[taskId].data[2];
+
+
+ if (sub_8082DF4(taskId) == 1 ||
+ sub_8083444(taskId) == 1)
+ {
+ return;
+ }
+
+ if (GetLinkPlayerCount_2() != sub_800820C())
+ {
+ gTasks[taskId].func = sub_8083418;
+ return;
+ }
+
+ result = &gScriptResult;
+ *result = sub_8082D9C(local1, local2);
+ if (*result)
+ {
+ gTasks[taskId].func = sub_8083288;
+ }
+}
+
+void sub_80831F8(u8 taskId) {
+ u8 local1, local2;
+ u16 *result;
+
+ local1 = gTasks[taskId].data[1];
+ local2 = gTasks[taskId].data[2];
+
+ if (sub_8082E28(taskId) == 1 ||
+ sub_8082DF4(taskId) == 1)
+ {
+ return;
+ }
+
+ result = &gScriptResult;
+ *result = sub_8082D9C(local1, local2);
+ if (*result == 0)
+ {
+ return;
+ }
+
+
+ if (*result == 3)
+ {
+ sub_800832C();
+ HideFieldMessageBox();
+ gTasks[taskId].func = sub_80833C4;
+ }
+ else
+ {
+ gFieldLinkPlayerCount = GetLinkPlayerCount_2();
+ gUnknown_03004860 = GetMultiplayerId();
+ sub_80081C8(gFieldLinkPlayerCount);
+ sub_8093390((struct TrainerCard *) gBlockSendBuffer);
+ gTasks[taskId].func = sub_8083314;
+ }
+}
+
+static void sub_8083288(u8 taskId) {
+ if (sub_8082DF4(taskId) == 1)
+ {
+ return;
+ }
+
+ if (gScriptResult == 3)
+ {
+ sub_800832C();
+ HideFieldMessageBox();
+ gTasks[taskId].func = sub_80833C4;
+ }
+ else
+ {
+ gFieldLinkPlayerCount = GetLinkPlayerCount_2();
+ gUnknown_03004860 = GetMultiplayerId();
+ sub_80081C8(gFieldLinkPlayerCount);
+ sub_8093390((struct TrainerCard *) gBlockSendBuffer);
+ gTasks[taskId].func = sub_8083314;
+ sub_8007E9C(2);
+ }
+}
+
+static void sub_8083314(u8 taskId) {
+ u8 index;
+
+ struct TrainerCard *trainerCards;
+
+ if (sub_8082DF4(taskId) == 1)
+ {
+ return;
+ }
+
+ if (GetBlockReceivedStatus() != sub_8008198())
+ {
+ return;
+ }
+
+ index = 0;
+ trainerCards = gTrainerCards;
+ for (index = 0; index < GetLinkPlayerCount(); index++)
+ {
+ void *src;
+ src = gBlockRecvBuffer[index];
+ memcpy(&trainerCards[index], src, sizeof(struct TrainerCard));
+ }
+
+ SetSuppressLinkErrorMessage(FALSE);
+ ResetBlockReceivedFlags();
+ HideFieldMessageBox();
+
+ if (gScriptResult == 1)
+ {
+ u16 linkType;
+ linkType = gLinkType;
+ sub_8082D4C(0x00004411, linkType);
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ return;
+ }
+
+ sub_800832C();
+ gTasks[taskId].func = sub_80833C4;
+}