summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2020-03-07 18:05:54 -0500
committerPikalaxALT <pikalaxalt@gmail.com>2020-03-07 18:05:54 -0500
commitab1d075682a34164ed82810108f909e1f9b46390 (patch)
treebbf4391d137a1ea2249aa3720a735a9b4c2f28fa /src
parent6ce70985ebcb78267290e35e65aadb6a433c1cba (diff)
through sub_8101558
Diffstat (limited to 'src')
-rw-r--r--src/easy_chat_3.c446
-rw-r--r--src/graphics.c2
2 files changed, 442 insertions, 6 deletions
diff --git a/src/easy_chat_3.c b/src/easy_chat_3.c
index d01203dcc..84a53aa1a 100644
--- a/src/easy_chat_3.c
+++ b/src/easy_chat_3.c
@@ -1,8 +1,11 @@
#include "global.h"
#include "gflib.h"
+#include "data_8479668.h"
#include "easy_chat.h"
#include "graphics.h"
+#include "menu.h"
#include "new_menu_helpers.h"
+#include "text_window.h"
struct Unk203A11C
{
@@ -13,8 +16,7 @@ struct Unk203A11C
u8 unk7;
s8 unk8;
u8 unk9;
- u8 unkA;
- u8 unkB[0xC1];
+ u8 unkA[0xC1];
u8 unkCC[0x202];
u16 unk2CE;
int unk2D0;
@@ -69,6 +71,7 @@ bool8 sub_8100BF4(void);
void sub_8100C5C(void);
void sub_8100CBC(void);
void sub_8100D24(void);
+void sub_8100DC4(u8 windowId, u8 fontId, const u8 *str, u8 left, u8 top, u8 speed, u8 bg, u8 fg, u8 shadow);
void sub_8100E34(void);
void sub_8100E7C(u8 a0);
void sub_8100F18(u8 initialCursorPos);
@@ -76,15 +79,21 @@ void sub_8100F44(void);
void sub_8100FDC(void);
void sub_8101100(u16 *buffer);
void sub_81012CC(void);
-void sub_81012E0(u8 a0);
+void sub_81012E0(u32 a0);
void sub_810131C(void);
+void sub_810133C(void);
+void PrintEasyChatKeyboardText(void);
+void sub_81013DC(void);
void sub_81013EC(void);
void sub_8101410(void);
void sub_8101434(void);
void sub_8101478(void);
+void sub_81014AC(u8 a0, u8 a1);
+void sub_8101558(u8 a0, u8 a1);
void sub_81015BC(void);
void sub_81015D4(u8 a0);
bool8 sub_81016AC(void);
+void sub_810198C(void);
void sub_81019B0(s16 a0, u8 a1);
bool8 sub_8101A10(void);
s32 sub_8101A48(void);
@@ -243,7 +252,7 @@ const struct WindowTemplate sEasyChatWindowTemplates[] = {
DUMMY_WIN_TEMPLATE,
};
-const struct WindowTemplate gUnknown_843F8D0 = {
+const struct WindowTemplate sEasyChatYesNoWindowTemplate = {
.bg = 0,
.tilemapLeft = 22,
.tilemapTop = 9,
@@ -254,7 +263,14 @@ const struct WindowTemplate gUnknown_843F8D0 = {
};
const u8 gUnknown_843F8D8[] = _("{UNDERSCORE}");
-const u8 gUnknown_843F8DB[] = _("{CLEAR 17}");
+const u8 sText_Clear17[] = _("{CLEAR 17}");
+
+const u8 *const sEasyChatKeyboardText[] = {
+ gUnknown_847A8D8,
+ gUnknown_847A8FA,
+ gUnknown_847A913,
+ gUnknown_847A934
+};
bool8 sub_80FFF80(void)
{
@@ -981,3 +997,423 @@ bool8 sub_8100B70(void)
return TRUE;
}
+
+bool8 sub_8100BF4(void)
+{
+ gUnknown_203ACEC = Alloc(sizeof(*gUnknown_203ACEC));
+ if (!gUnknown_203ACEC)
+ return FALSE;
+
+ gUnknown_203ACEC->unk0 = 0;
+ gUnknown_203ACEC->unk2D8 = NULL;
+ gUnknown_203ACEC->unk2DC = NULL;
+ gUnknown_203ACEC->unk2E0 = NULL;
+ gUnknown_203ACEC->unk2E4 = NULL;
+ gUnknown_203ACEC->unk2E8 = NULL;
+ gUnknown_203ACEC->unk2EC = NULL;
+ gUnknown_203ACEC->unk2F0 = NULL;
+ gUnknown_203ACEC->unk2F4 = NULL;
+ gUnknown_203ACEC->unk2F8 = NULL;
+ gUnknown_203ACEC->unk2FC = NULL;
+ return TRUE;
+}
+
+void sub_8100C5C(void)
+{
+ ChangeBgX(3, 0, 0);
+ ChangeBgY(3, 0, 0);
+ ChangeBgX(1, 0, 0);
+ ChangeBgY(1, 0, 0);
+ ChangeBgX(2, 0, 0);
+ ChangeBgY(2, 0, 0);
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON);
+}
+
+void sub_8100CBC(void)
+{
+ ResetPaletteFade();
+ LoadPalette(gEasyChatMode_Pal, 0, 32);
+ LoadPalette(gUnknown_843F76C, 1 * 16, 32);
+ LoadPalette(gUnknown_843F78C, 4 * 16, 32);
+ LoadPalette(gUnknown_843F874, 10 * 16, 8);
+ LoadPalette(gUnknown_843F87C, 11 * 16, 10);
+ LoadPalette(gUnknown_843F87C, 15 * 16, 10);
+ LoadPalette(gUnknown_843F87C, 3 * 16, 10);
+}
+
+void sub_8100D24(void)
+{
+ int xOffset;
+ const u8 *titleText = GetTitleText();
+ if (!titleText)
+ return;
+
+ xOffset = (128 - GetStringWidth(1, titleText, 0)) / 2u;
+ FillWindowPixelBuffer(0, PIXEL_FILL(0));
+ sub_8100DC4(0, 1, titleText, xOffset, 0, TEXT_SPEED_FF, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY);
+ PutWindowTilemap(0);
+ CopyWindowToVram(0, 3);
+}
+
+void sub_8100D84(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16))
+{
+ if (fontId == 1) y += 2;
+ AddTextPrinterParameterized(windowId, fontId, str, x, y, speed, callback);
+}
+
+void sub_8100DC4(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 speed, u8 bg, u8 fg, u8 shadow)
+{
+ u8 color[3];
+ if (fontId == 1) y += 2;
+ color[0] = bg;
+ color[1] = fg;
+ color[2] = shadow;
+ AddTextPrinterParameterized3(windowId, fontId, x, y, color, speed, str);
+}
+
+void sub_8100E34(void)
+{
+ FillBgTilemapBufferRect(0, 0, 0, 0, 32, 20, 17);
+ TextWindow_SetUserSelectedFrame(1, 1, 0xE0);
+ DrawTextBorderOuter(1, 1, 14);
+ sub_8100E7C(0);
+ PutWindowTilemap(1);
+ CopyBgTilemapBufferToVram(0);
+}
+
+void sub_8100E7C(u8 arg0)
+{
+ const u8 *text2 = NULL;
+ const u8 *text1 = NULL;
+ switch (arg0)
+ {
+ case 0:
+ GetEasyChatInstructionsText(&text1, &text2);
+ break;
+ case 2:
+ sub_80FFDC8(&text1, &text2);
+ break;
+ case 3:
+ GetEasyChatConfirmText(&text1, &text2);
+ break;
+ case 1:
+ GetEasyChatConfirmDeletionText(&text1, &text2);
+ break;
+ }
+
+ FillWindowPixelBuffer(1, PIXEL_FILL(1));
+ if (text1)
+ sub_8100D84(1, 1, text1, 0, 0, TEXT_SPEED_FF, NULL);
+
+ if (text2)
+ sub_8100D84(1, 1, text2, 0, 16, TEXT_SPEED_FF, NULL);
+
+ CopyWindowToVram(1, 3);
+}
+
+void sub_8100F18(u8 initialCursorPos)
+{
+ CreateYesNoMenu(&sEasyChatYesNoWindowTemplate, 1, 0, 2, 0x001, 14, initialCursorPos);
+}
+
+void sub_8100F44(void)
+{
+ u8 frameId;
+ struct WindowTemplate template;
+
+ frameId = GetEasyChatScreenFrameId();
+ template.bg = 3;
+ template.tilemapLeft = sPhraseFrameDimensions[frameId].left;
+ template.tilemapTop = sPhraseFrameDimensions[frameId].top;
+ template.width = sPhraseFrameDimensions[frameId].width;
+ template.height = sPhraseFrameDimensions[frameId].height;
+ template.paletteNum = 11;
+ template.baseBlock = 0x060;
+ gUnknown_203ACEC->windowId = AddWindow(&template);
+ PutWindowTilemap(gUnknown_203ACEC->windowId);
+}
+
+void sub_8100FDC(void)
+{
+ u16 *ecWord;
+ u8 numColumns, numRows;
+ u8 *str;
+ u8 frameId;
+ int i, j, k;
+
+ ecWord = GetEasyChatWordBuffer();
+ numColumns = GetNumColumns();
+ numRows = GetNumRows();
+ frameId = GetEasyChatScreenFrameId();
+ FillWindowPixelBuffer(gUnknown_203ACEC->windowId, PIXEL_FILL(1));
+ for (i = 0; i < numRows; i++)
+ {
+ str = gUnknown_203ACEC->unkA;
+ str[0] = EOS;
+ str = StringAppend(str, sText_Clear17);
+ for (j = 0; j < numColumns; j++)
+ {
+ if (*ecWord != 0xFFFF)
+ {
+ str = CopyEasyChatWord(str, *ecWord);
+ ecWord++;
+ }
+ else
+ {
+ str = WriteColorChangeControlCode(str, 0, TEXT_COLOR_RED);
+ ecWord++;
+ for (k = 0; k < 7; k++)
+ {
+ *str++ = CHAR_EXTRA_EMOJI;
+ *str++ = 9;
+ }
+
+ str = WriteColorChangeControlCode(str, 0, TEXT_COLOR_DARK_GREY);
+ }
+
+ str = StringAppend(str, sText_Clear17);
+ if (frameId == 2)
+ {
+ if (j == 0 && i == 4)
+ break;
+ }
+ }
+
+ *str = EOS;
+ sub_8100D84(gUnknown_203ACEC->windowId, 1, gUnknown_203ACEC->unkA, 0, i * 16, TEXT_SPEED_FF, NULL);
+ }
+
+ CopyWindowToVram(gUnknown_203ACEC->windowId, 3);
+}
+
+void sub_8101100(u16 *tilemap)
+{
+ u8 frameId;
+ int right, bottom;
+ int x, y;
+
+ frameId = GetEasyChatScreenFrameId();
+ CpuFastFill(0, tilemap, BG_SCREEN_SIZE);
+ if (frameId == 2)
+ {
+ right = sPhraseFrameDimensions[frameId].left + sPhraseFrameDimensions[frameId].width;
+ bottom = sPhraseFrameDimensions[frameId].top + sPhraseFrameDimensions[frameId].height;
+ for (y = sPhraseFrameDimensions[frameId].top; y < bottom; y++)
+ {
+ x = sPhraseFrameDimensions[frameId].left - 1;
+ tilemap[y * 32 + x] = 0x1005;
+ x++;
+ for (; x < right; x++)
+ tilemap[y * 32 + x] = 0x1000;
+
+ tilemap[y* 32 + x] = 0x1007;
+ }
+ }
+ else
+ {
+ y = sPhraseFrameDimensions[frameId].top - 1;
+ x = sPhraseFrameDimensions[frameId].left - 1;
+ right = sPhraseFrameDimensions[frameId].left + sPhraseFrameDimensions[frameId].width;
+ bottom = sPhraseFrameDimensions[frameId].top + sPhraseFrameDimensions[frameId].height;
+ tilemap[y * 32 + x] = 0x1001;
+ x++;
+ for (; x < right; x++)
+ tilemap[y * 32 + x] = 0x1002;
+
+ tilemap[y * 32 + x] = 0x1003;
+ y++;
+ for (; y < bottom; y++)
+ {
+ x = sPhraseFrameDimensions[frameId].left - 1;
+ tilemap[y * 32 + x] = 0x1005;
+ x++;
+ for (; x < right; x++)
+ tilemap[y * 32 + x] = 0x1000;
+
+ tilemap[y* 32 + x] = 0x1007;
+ }
+
+ x = sPhraseFrameDimensions[frameId].left - 1;
+ tilemap[y * 32 + x] = 0x1009;
+ x++;
+ for (; x < right; x++)
+ tilemap[y * 32 + x] = 0x100A;
+
+ tilemap[y * 32 + x] = 0x100B;
+ }
+}
+
+void sub_81012CC(void)
+{
+ PutWindowTilemap(2);
+ CopyBgTilemapBufferToVram(2);
+}
+
+void sub_81012E0(u32 arg0)
+{
+ sub_810198C();
+ FillWindowPixelBuffer(2, PIXEL_FILL(1));
+ switch (arg0)
+ {
+ case 0:
+ sub_810133C();
+ break;
+ case 1:
+ PrintEasyChatKeyboardText();
+ break;
+ case 2:
+ sub_81013DC();
+ break;
+ }
+
+ CopyWindowToVram(2, 2);
+}
+
+void sub_810131C(void)
+{
+ if (!sub_80FFE1C())
+ sub_81012E0(0);
+ else
+ sub_81012E0(1);
+}
+
+void sub_810133C(void)
+{
+ int i;
+ int x, y;
+
+ i = 0;
+ y = 96;
+ while (1)
+ {
+ for (x = 0; x < 2; x++)
+ {
+ u8 groupId = GetSelectedGroupByIndex(i++);
+ if (groupId == EC_NUM_GROUPS)
+ {
+ sub_81019B0(sub_80FFE28(), 0);
+ return;
+ }
+
+ sub_8100D84(2, 1, GetEasyChatWordGroupName(groupId), x * 84 + 10, y, TEXT_SPEED_FF, NULL);
+ }
+
+ y += 16;
+ }
+}
+
+void PrintEasyChatKeyboardText(void)
+{
+ u32 i;
+
+ for (i = 0; i < NELEMS(sEasyChatKeyboardText); i++)
+ sub_8100D84(2, 1, sEasyChatKeyboardText[i], 10, 96 + i * 16, TEXT_SPEED_FF, NULL);
+}
+
+void sub_81013DC(void)
+{
+ sub_81014AC(0, 4);
+}
+
+void sub_81013EC(void)
+{
+ u8 var0 = sub_80FFE48() + 3;
+ sub_8101558(var0, 1);
+ sub_81014AC(var0, 1);
+}
+
+void sub_8101410(void)
+{
+ u8 var0 = sub_80FFE48();
+ sub_8101558(var0, 1);
+ sub_81014AC(var0, 1);
+}
+
+void sub_8101434(void)
+{
+ u8 var0 = sub_80FFE48();
+ u8 var1 = var0 + 4;
+ u8 var2 = sub_80FFE54() + 1;
+ if (var1 > var2)
+ var1 = var2;
+
+ if (var0 < var1)
+ {
+ u8 var3 = var1 - var0;
+ sub_8101558(var0, var3);
+ sub_81014AC(var0, var3);
+ }
+}
+
+void sub_8101478(void)
+{
+ u8 var0 = sub_80FFE48();
+ u8 var1 = sub_8101A48();
+ if (var0 < var1)
+ {
+ u8 var2 = var1 - var0;
+ sub_8101558(var0, var2);
+ sub_81014AC(var0, var2);
+ }
+}
+
+void sub_81014AC(u8 arg0, u8 arg1)
+{
+ int i, j;
+ u16 easyChatWord;
+ u8 *str;
+ int y;
+ u8 y_;
+ int var0;
+
+ var0 = arg0 * 2;
+ y = (arg0 * 16 + 96) & 0xFF;
+
+ for (i = 0; i < arg1; i++)
+ {
+ for (j = 0; j < 2; j++)
+ {
+ // FIXME: Dumb trick needed to match
+ y_ = y << 18 >> 18;
+ easyChatWord = GetDisplayedWordByIndex(var0++);
+ if (easyChatWord != 0xFFFF)
+ {
+
+ CopyEasyChatWordPadded(gUnknown_203ACEC->unkCC, easyChatWord, 0);
+
+ sub_8100D84(2, 1, gUnknown_203ACEC->unkCC, (j * 13 + 3) * 8, y_, TEXT_SPEED_FF, NULL);
+ }
+ }
+ y += 16;
+
+ }
+
+ CopyWindowToVram(2, 2);
+}
+
+void sub_8101558(u8 arg0, u8 arg1)
+{
+ int y;
+ int var0;
+ int var1;
+ int var2;
+
+ y = (arg0 * 16 + 96) & 0xFF;
+ var2 = arg1 * 16;
+ var0 = y + var2;
+ if (var0 > 255)
+ {
+ var1 = var0 - 256;
+ var2 = 256 - y;
+ }
+ else
+ {
+ var1 = 0;
+ }
+
+ FillWindowPixelRect(2, PIXEL_FILL(1), 0, y, 224, var2);
+ if (var1)
+ FillWindowPixelRect(2, PIXEL_FILL(1), 0, 0, 224, var1);
+}
diff --git a/src/graphics.c b/src/graphics.c
index b0712ca8a..100ddfdf6 100644
--- a/src/graphics.c
+++ b/src/graphics.c
@@ -1215,7 +1215,7 @@ const u32 gKantoTrainerCard_Gfx[] = INCBIN_U32("graphics/trainer_card/card.4bpp.
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 u16 gEasyChatMode_Pal[] = INCBIN_U16("graphics/link_rfu/unk_8E99DAC.gbapal");
const u32 gEasyChatWindow_Gfx[] = INCBIN_U32("graphics/link_rfu/unk_8E99DAC.4bpp.lz");
const u32 gEasyChatWindow_Tilemap[] = INCBIN_U32("graphics/link_rfu/unk_8E99E74.bin.lz");