summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarcus Huderle <huderlem@gmail.com>2019-03-27 19:09:12 -0500
committerMarcus Huderle <huderlem@gmail.com>2019-03-27 19:09:12 -0500
commitaebc676913addd23a141b527b8d0b26fb5004189 (patch)
tree999739855e610056cc69a678fb4a127fba99ecc3 /src
parentaf1baa89f1c7f657eb096df5bf2677527301b5c4 (diff)
Decompile union_room_chat.c up to sub_801F5B8
Diffstat (limited to 'src')
-rw-r--r--src/new_game.c3
-rw-r--r--src/text.c2
-rwxr-xr-xsrc/union_room_chat.c385
3 files changed, 381 insertions, 9 deletions
diff --git a/src/new_game.c b/src/new_game.c
index 97988497d..19f3461b4 100644
--- a/src/new_game.c
+++ b/src/new_game.c
@@ -43,9 +43,8 @@
#include "field_specials.h"
#include "berry_powder.h"
#include "mevent.h"
+#include "union_room_chat.h"
-
-extern void copy_strings_to_sav1(void);
extern void ResetPokeJumpResults(void);
extern const u8 EventScript_ResetAllMapFlags[];
diff --git a/src/text.c b/src/text.c
index be4bf2697..39912b17d 100644
--- a/src/text.c
+++ b/src/text.c
@@ -1601,7 +1601,7 @@ u16 RenderText(struct TextPrinter *textPrinter)
textPrinter->printerTemplate.currentX = *textPrinter->printerTemplate.currentChar + textPrinter->printerTemplate.x;
textPrinter->printerTemplate.currentChar++;
return 2;
- case 19:
+ case EXT_CTRL_CODE_CLEAR_TO:
{
widthHelper = *textPrinter->printerTemplate.currentChar;
widthHelper += textPrinter->printerTemplate.x;
diff --git a/src/union_room_chat.c b/src/union_room_chat.c
index f7c8be9f1..cc482d929 100755
--- a/src/union_room_chat.c
+++ b/src/union_room_chat.c
@@ -1,5 +1,7 @@
#include "global.h"
#include "alloc.h"
+#include "bg.h"
+#include "dynamic_placeholder_text_util.h"
#include "link.h"
#include "link_rfu.h"
#include "load_save.h"
@@ -12,7 +14,9 @@
#include "sound.h"
#include "sprite.h"
#include "string_util.h"
+#include "strings.h"
#include "task.h"
+#include "window.h"
#include "constants/rgb.h"
#include "constants/songs.h"
@@ -37,13 +41,32 @@ struct UnionRoomChat
u8 unk17;
u8 unk18;
u8 unk19;
- u8 unk1A[0x9F];
+ u8 unk1A[0x1F];
+ u8 unk39[0x40];
+ u8 unk79[0x40];
u8 unkB9[10][21];
u8 filler18B[0x5];
u8 unk190[0x28];
u16 unk1B8;
};
+struct UnionRoomChat2_Unk0
+{
+ int (* unk0)(u8 *);
+ u8 unk4;
+ u8 unk5;
+};
+
+struct UnionRoomChat2
+{
+ struct UnionRoomChat2_Unk0 unk0[3];
+ u16 unk18;
+ u16 unk1A;
+ u8 filler1C[0x2];
+ u16 unk1E;
+ u8 filler20[0x2148];
+};
+
static void sub_801DDD0(struct UnionRoomChat *);
static void c2_081284E0(void);
static void sub_801DF20(void);
@@ -77,19 +100,28 @@ static void sub_801EF7C(u8 *);
static void sub_801EFA8(u8 *);
static void sub_801EFD0(u8 *);
u8 *sub_801F114(void);
-void sub_801F2B4(u8 taskId);
-bool8 sub_801F4D0(void);
-int sub_801F534(void);
-void sub_801F544(void);
-void sub_801F5B8(void);
+static void sub_801F2B4(u8 taskId);
+static bool8 sub_801F4D0(void);
+static bool32 sub_801F534(void);
+static void sub_801F544(void);
+static void sub_801F5B8(void);
void sub_801F5EC(u16, u8);
bool8 sub_801F644(u8);
s8 sub_801FF08(void);
+bool32 sub_8020890(void);
+void sub_8020770(void);
+static void sub_801F574(struct UnionRoomChat2 *);
+static void sub_801F580(void);
+void sub_80208D0(void);
+int sub_801FDD8(u8 *);
extern struct UnionRoomChat *gUnknown_02022C84;
+extern struct UnionRoomChat2 *gUnknown_02022C88;
extern const u8 *const gUnknown_082F2BA8[][10];
extern const u8 gUnknown_082F2AA8[];
+extern const struct BgTemplate gUnknown_082F2C60[4];
+extern const struct WindowTemplate gUnknown_082F2C70[];
void sub_801DD98(void)
@@ -1070,3 +1102,344 @@ static void sub_801EFD0(u8 *arg0)
StringCopy(&arg0[1], gSaveBlock2Ptr->playerName);
arg0[1 + (PLAYER_NAME_LENGTH + 1)] = gUnknown_02022C84->unk13;
}
+
+bool32 sub_801EFF8(u8 *arg0, u8 *arg1)
+{
+ u8 *tempStr;
+ u8 var0 = *arg1;
+ u8 *str = arg1 + 1;
+ arg1 = str;
+ arg1 += 8;
+
+ switch (var0)
+ {
+ case 2:
+ if (gUnknown_02022C84->unk13 != str[8])
+ {
+ DynamicPlaceholderTextUtil_Reset();
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, str);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(arg0, gText_F700JoinedChat);
+ return TRUE;
+ }
+ break;
+ case 1:
+ tempStr = StringCopy(arg0, str);
+ *(tempStr++) = EXT_CTRL_CODE_BEGIN;
+ *(tempStr++) = EXT_CTRL_CODE_CLEAR_TO;
+ *(tempStr++) = 42;
+ *(tempStr++) = CHAR_COLON;
+ StringCopy(tempStr, arg1);
+ return TRUE;
+ case 5:
+ StringCopy(gUnknown_02022C84->unk79, str);
+ // fall through
+ case 3:
+ if (gUnknown_02022C84->unk13 != *arg1)
+ {
+ DynamicPlaceholderTextUtil_Reset();
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, str);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(arg0, gText_F700LeftChat);
+ return TRUE;
+ }
+ break;
+ }
+
+ return FALSE;
+}
+
+u8 sub_801F0B0(void)
+{
+ return gUnknown_02022C84->unk10;
+}
+
+void sub_801F0BC(u8 *arg0, u8 *arg1)
+{
+ *arg0 = gUnknown_02022C84->unk11;
+ *arg1 = gUnknown_02022C84->unk12;
+}
+
+u8 *sub_801F0D0(void)
+{
+ return gUnknown_02022C84->unk1A;
+}
+
+int sub_801F0DC(void)
+{
+ u8 *str = sub_801F0D0();
+ return StringLength_Multibyte(str);
+}
+
+void sub_801F0EC(int *arg0, int *arg1)
+{
+ int diff = gUnknown_02022C84->unk15 - gUnknown_02022C84->unk14;
+ if (diff < 0)
+ {
+ diff *= -1;
+ *arg0 = gUnknown_02022C84->unk15;
+ }
+ else
+ {
+ *arg0 = gUnknown_02022C84->unk14;
+ }
+
+ *arg1 = diff;
+}
+
+u8 *sub_801F114(void)
+{
+ int i;
+ u16 numChars = sub_801EED8();
+ u8 *str = gUnknown_02022C84->unk1A;
+ for (i = 0; i < numChars; i++)
+ {
+ if (*str == CHAR_SPECIAL_F9)
+ *str++;
+
+ str++;
+ }
+
+ return str;
+}
+
+u16 sub_801F144(void)
+{
+ u16 count;
+ u32 i;
+ u16 numChars = sub_801EED8();
+ u8 *str = gUnknown_02022C84->unk1A;
+ for (count = 0, i = 0; i < numChars; count++, i++)
+ {
+ if (*str == CHAR_SPECIAL_F9)
+ str++;
+
+ str++;
+ }
+
+ return count;
+}
+
+u8 *sub_801F180(void)
+{
+ return gUnknown_02022C84->unk39;
+}
+
+u8 sub_801F18C(void)
+{
+ return gUnknown_02022C84->unk16;
+}
+
+int sub_801F198(void)
+{
+ return gUnknown_02022C84->unk15;
+}
+
+int sub_801F1A4(void)
+{
+ u8 *str = sub_801EEA8();
+ u32 character = *str;
+ if (character > 0xFF || gUnknown_082F2AA8[character] == character || gUnknown_082F2AA8[character] == 0)
+ return 3;
+ else
+ return 0;
+}
+
+u8 *sub_801F1D0(void)
+{
+ return gUnknown_02022C84->unk79;
+}
+
+void copy_strings_to_sav1(void)
+{
+ StringCopy(gSaveBlock1Ptr->unk3C88[0], gText_Hello);
+ StringCopy(gSaveBlock1Ptr->unk3C88[1], gText_Pokemon2);
+ StringCopy(gSaveBlock1Ptr->unk3C88[2], gText_Trade);
+ StringCopy(gSaveBlock1Ptr->unk3C88[3], gText_Battle);
+ StringCopy(gSaveBlock1Ptr->unk3C88[4], gText_Lets);
+ StringCopy(gSaveBlock1Ptr->unk3C88[5], gText_Ok);
+ StringCopy(gSaveBlock1Ptr->unk3C88[6], gText_Sorry);
+ StringCopy(gSaveBlock1Ptr->unk3C88[7], gText_YayUnkF9F9);
+ StringCopy(gSaveBlock1Ptr->unk3C88[8], gText_ThankYou);
+ StringCopy(gSaveBlock1Ptr->unk3C88[9], gText_ByeBye);
+}
+
+static void sub_801F2B4(u8 taskId)
+{
+ u8 *buffer;
+ s16 *data = gTasks[taskId].data;
+
+ switch (data[0])
+ {
+ case 0:
+ if (!gReceivedRemoteLinkPlayers)
+ {
+ DestroyTask(taskId);
+ return;
+ }
+
+ data[0] = 1;
+ // fall through
+ case 1:
+ data[4] = GetLinkPlayerCount();
+ if (gUnknown_02022C84->unkD != data[4])
+ {
+ data[0] = 2;
+ gUnknown_02022C84->unkD = data[4];
+ return;
+ }
+
+ data[3] = GetBlockReceivedStatus();
+ if (!data[3] && sub_8011A9C())
+ return;
+
+ data[1] = 0;
+ data[0] = 3;
+ // fall through
+ case 3:
+ for (; data[1] < 5 && ((data[3] >> data[1]) & 1) == 0; data[1]++)
+ ;
+
+ if (data[1] == 5)
+ {
+ data[0] = 1;
+ return;
+ }
+
+ data[2] = data[1];
+ ResetBlockReceivedFlag(data[2]);
+ buffer = (u8 *)gBlockRecvBuffer[data[1]];
+ switch (buffer[0])
+ {
+ default:
+ case 1: data[5] = 3; break;
+ case 2: data[5] = 3; break;
+ case 3: data[5] = 4; break;
+ case 4: data[5] = 5; break;
+ case 5: data[5] = 6; break;
+ }
+
+ if (sub_801EFF8(gUnknown_02022C84->unk39, (u8 *)gBlockRecvBuffer[data[1]]))
+ {
+ gUnknown_02022C84->unk16 = data[1];
+ sub_801F5EC(12, 2);
+ data[0] = 7;
+ }
+ else
+ {
+ data[0] = data[5];
+ }
+
+ data[1]++;
+ break;
+ case 7:
+ if (!sub_801F644(2))
+ data[0] = data[5];
+ break;
+ case 4:
+ if (!gUnknown_02022C84->unk13 && data[2])
+ {
+ if (GetLinkPlayerCount() == 2)
+ {
+ sub_80104B0();
+ gUnknown_02022C84->unk17 = 1;
+ DestroyTask(taskId);
+ return;
+ }
+
+ sub_8011DE0(data[2]);
+ }
+
+ data[0] = 3;
+ break;
+ case 5:
+ if (gUnknown_02022C84->unk13)
+ gUnknown_02022C84->unk17 = 2;
+
+ DestroyTask(taskId);
+ break;
+ case 6:
+ gUnknown_02022C84->unk17 = 3;
+ DestroyTask(taskId);
+ break;
+ case 2:
+ if (!sub_8011A9C())
+ {
+ if (!gUnknown_02022C84->unk13)
+ sub_80110B8(gUnknown_02022C84->unkD);
+
+ data[0] = 1;
+ }
+ break;
+ }
+}
+
+static bool8 sub_801F4D0(void)
+{
+ gUnknown_02022C88 = Alloc(sizeof(*gUnknown_02022C88));
+ if (gUnknown_02022C88 && sub_8020890())
+ {
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, gUnknown_082F2C60, ARRAY_COUNT(gUnknown_082F2C60));
+ InitWindows(gUnknown_082F2C70);
+ reset_temp_tile_data_buffers();
+ sub_8020770();
+ sub_801F574(gUnknown_02022C88);
+ sub_801F580();
+ sub_801F5EC(0, 0);
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+static bool32 sub_801F534(void)
+{
+ return sub_801F644(0);
+}
+
+static void sub_801F544(void)
+{
+ sub_80208D0();
+ if (gUnknown_02022C88)
+ FREE_AND_SET_NULL(gUnknown_02022C88);
+
+ FreeAllWindowBuffers();
+ gScanlineEffect.state = 3;
+}
+
+static void sub_801F574(struct UnionRoomChat2 *arg0)
+{
+ arg0->unk18 = 0xFF;
+ arg0->unk1E = 0xFF;
+ arg0->unk1A = 0;
+}
+
+static void sub_801F580(void)
+{
+ int i;
+
+ if (!gUnknown_02022C88)
+ return;
+
+ for (i = 0; i < 3; i++)
+ {
+ gUnknown_02022C88->unk0[i].unk0 = sub_801FDD8;
+ gUnknown_02022C88->unk0[i].unk4 = 0;
+ gUnknown_02022C88->unk0[i].unk5 = 0;
+ }
+}
+
+static void sub_801F5B8(void)
+{
+ int i;
+
+ if (!gUnknown_02022C88)
+ return;
+
+ for (i = 0; i < 3; i++)
+ {
+ gUnknown_02022C88->unk0[i].unk4 =
+ gUnknown_02022C88->unk0[i].unk0(&gUnknown_02022C88->unk0[i].unk5);
+ }
+}