summaryrefslogtreecommitdiff
path: root/src/easy_chat_2.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/easy_chat_2.c')
-rw-r--r--src/easy_chat_2.c1891
1 files changed, 1891 insertions, 0 deletions
diff --git a/src/easy_chat_2.c b/src/easy_chat_2.c
new file mode 100644
index 000000000..363cc49fa
--- /dev/null
+++ b/src/easy_chat_2.c
@@ -0,0 +1,1891 @@
+#include "global.h"
+#include "constants/map_objects.h"
+#include "decompress.h"
+#include "easy_chat.h"
+#include "field_map_obj.h"
+#include "graphics.h"
+#include "menu.h"
+#include "palette.h"
+#include "sprite.h"
+#include "strings.h"
+#include "trig.h"
+
+extern void sub_8095C8C();
+extern void sub_809D104();
+
+void sub_80E8268(void);
+void sub_80E82BC(struct Sprite *);
+void sub_80E8534(void);
+void sub_80E85F8(struct Sprite *);
+void sub_80E872C(struct Sprite *);
+void sub_80E8760(struct Sprite *);
+void sub_80E8818(void);
+void sub_80E8860(struct Sprite *);
+void sub_80E8A7C(void);
+void sub_80E8B78(struct Sprite *);
+void sub_80E8FA4(void);
+void sub_80E9198(u8);
+void sub_80E91D4(u8);
+void sub_80E948C(void);
+void sub_80E95A4(void);
+void sub_80E9620(u16, u16);
+void sub_80E97C0(u16, u16);
+void sub_80E9A4C(void);
+void sub_80E9A60(const u8 *, u16, u16);
+void sub_80E9A7C(u8 *, u16);
+void sub_80E9AD4(void);
+void sub_80E9C74(u16);
+u8 sub_80EA1E0(void);
+void sub_80EA24C(void);
+void sub_80EA348(void);
+void sub_80EA4A4(void);
+void sub_80EA5A0(void);
+void sub_80EA704(void);
+void sub_80EA764(void);
+void sub_80EA7F4(void);
+void sub_80EA8BC(void);
+void sub_80EA948(void);
+void sub_80EAA44(void);
+void sub_80EAAD4(void);
+u8 *sub_80EAD64();
+u8 *sub_80EB218(u8 *, u16, u16);
+u16 sub_80EB2D4(u16);
+
+const u16 InterviewPalette_0[] = INCBIN_U16("graphics/misc/interview_pal0.gbapal");
+const u16 InterviewPalette_1[] = INCBIN_U16("graphics/misc/interview_pal1.gbapal");
+const u8 InterviewArrowTiles[] = INCBIN_U8("graphics/misc/interview_arrow.4bpp");
+const u8 InterviewButtonTiles[] = INCBIN_U8("graphics/misc/interview_buttons.4bpp");
+const u16 gMenuInterviewFrame_Pal[] = INCBIN_U16("graphics/misc/interview_frame.gbapal");
+const u8 gMenuInterviewFrame_Gfx[] = INCBIN_U8("graphics/misc/interview_frame.4bpp.lz");
+const u8 InterviewTriangleCursorTiles[] = INCBIN_U8("graphics/misc/interview_triangle_cursor.4bpp");
+
+void sub_80E8218(void)
+{
+ struct SpriteSheet interviewSpriteSheets[] =
+ {
+ {InterviewTriangleCursorTiles, 0x20, 0},
+ {gInterviewOutlineCursorTiles, 0x700, 1},
+ {InterviewArrowTiles, 0x100, 2},
+ {InterviewButtonTiles, 0x100, 3},
+ {NULL, 0, 0},
+ };
+ struct SpritePalette interviewSpritePalettes[] =
+ {
+ {InterviewPalette_0, 0},
+ {InterviewPalette_1, 1},
+ {NULL, 0},
+ };
+
+ LoadSpriteSheets(interviewSpriteSheets);
+ LoadSpritePalettes(interviewSpritePalettes);
+ sub_80E8268();
+ sub_80E8818();
+ sub_80E8A7C();
+}
+
+const struct OamData gOamData_83DBBF4 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 0,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const struct SpriteTemplate gSpriteTemplate_83DBBFC =
+{
+ .tileTag = 0,
+ .paletteTag = 0,
+ .oam = &gOamData_83DBBF4,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80E82BC,
+};
+
+void sub_80E8268(void)
+{
+ u8 spriteId;
+
+ spriteId = CreateSprite(&gSpriteTemplate_83DBBFC, 0, 0, 0);
+ gSprites[spriteId].pos1.y = gUnknown_083DB694->unk8A * 8 + 8;
+ gSprites[spriteId].pos1.x = gUnknown_083DB694->unk88 * 8 + 4;
+ gSprites[spriteId].data[0] = 0;
+ gSprites[spriteId].data[1] = 0;
+ gUnknown_083DB694->unk98 = &gSprites[spriteId];
+}
+
+void sub_80E82BC(struct Sprite *sprite)
+{
+ if (sprite->data[1] == 0)
+ {
+ if (gUnknown_083DB694->unk87)
+ {
+ u16 r5 = gUnknown_083DB694->unk86;
+ u16 r4 = gUnknown_083DB694->unk85;
+ u16 r7 = 0;
+ u16 i;
+
+ for (i = 0; i < r4; i++)
+ r7 += gUnknown_083DB694->unk8C[r5][i];
+
+ if (r5 == gUnknown_083DB694->unk84)
+ {
+ sprite->pos1.y = 96;
+ sprite->pos1.x = (r4 * 7 + 3) * 8 + 4;
+ }
+ else
+ {
+ sprite->pos1.y = (gUnknown_083DB694->unk8A + r5 * 2) * 8 + 8;
+ sprite->pos1.x = (gUnknown_083DB694->unk88 + r7 + r4 * 11) * 8 + 4;
+ }
+
+ sprite->pos2.x = -6;
+ sprite->data[0] = 0;
+ }
+ else
+ {
+ if (++sprite->data[0] > 2)
+ {
+ sprite->data[0] = 0;
+ if (++sprite->pos2.x > 0)
+ sprite->pos2.x = -6;
+ }
+ }
+ }
+}
+
+void sub_80E8398(u8 a)
+{
+ switch (a)
+ {
+ case 0:
+ gUnknown_083DB694->unk98->data[1] = a;
+ gUnknown_083DB694->unk98->pos2.x = a;
+ gUnknown_083DB694->unk98->invisible = FALSE;
+ break;
+ case 1:
+ gUnknown_083DB694->unk98->data[1] = a;
+ gUnknown_083DB694->unk98->pos2.x = 0;
+ gUnknown_083DB694->unk98->invisible = FALSE;
+ break;
+ case 2:
+ gUnknown_083DB694->unk98->data[1] = 1;
+ gUnknown_083DB694->unk98->pos2.x = 0;
+ gUnknown_083DB694->unk98->invisible = TRUE;
+ break;
+ }
+}
+
+const struct OamData gOamData_83DBC14 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 1,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 1,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const union AnimCmd gSpriteAnim_83DBC1C[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBC24[] =
+{
+#if ENGLISH
+ ANIMCMD_FRAME(8, 5),
+#else
+ ANIMCMD_FRAME(0, 5),
+#endif
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBC2C[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBC34[] =
+{
+ ANIMCMD_FRAME(24, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBC3C[] =
+{
+ ANIMCMD_FRAME(32, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBC44[] =
+{
+ ANIMCMD_FRAME(40, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBC4C[] =
+{
+ ANIMCMD_FRAME(40, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBC54[] =
+{
+ ANIMCMD_FRAME(40, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBC5C[] =
+{
+ ANIMCMD_FRAME(48, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBC64[] =
+{
+#if ENGLISH
+ ANIMCMD_FRAME(40, 5),
+#else
+ ANIMCMD_FRAME(16, 5),
+#endif
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBC6C[] =
+{
+ ANIMCMD_FRAME(48, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBC74[] =
+{
+ ANIMCMD_FRAME(40, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gSpriteAnimTable_83DBC7C[] =
+{
+ gSpriteAnim_83DBC1C,
+ gSpriteAnim_83DBC24,
+ gSpriteAnim_83DBC2C,
+ gSpriteAnim_83DBC34,
+};
+
+const union AnimCmd *const gSpriteAnimTable_83DBC8C[] =
+{
+ gSpriteAnim_83DBC3C,
+ gSpriteAnim_83DBC44,
+ gSpriteAnim_83DBC4C,
+ gSpriteAnim_83DBC54,
+};
+
+const union AnimCmd *const gSpriteAnimTable_83DBC9C[] =
+{
+ gSpriteAnim_83DBC5C,
+ gSpriteAnim_83DBC64,
+ gSpriteAnim_83DBC6C,
+ gSpriteAnim_83DBC74,
+};
+
+/*
+const struct SpriteTemplate gSpriteTemplate_83DBCAC =
+{
+ .tileTag = 1,
+ .paletteTag = 1,
+ .oam = &gOamData_83DBC14,
+ .anims = gSpriteAnimTable_83DBC7C,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80E85F8,
+};
+*/
+
+void sub_80E8420(void)
+{
+ struct SpriteTemplate spriteTemplate_83DBCAC =
+ {
+ .tileTag = 1,
+ .paletteTag = 1,
+ .oam = &gOamData_83DBC14,
+ .anims = gSpriteAnimTable_83DBC7C,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80E85F8,
+ };
+ u8 spriteId;
+
+ spriteId = CreateSprite(&spriteTemplate_83DBCAC, 0, 0, 3);
+ gUnknown_083DB694->unk9C = &gSprites[spriteId];
+
+ spriteTemplate_83DBCAC.anims = gSpriteAnimTable_83DBC8C;
+ spriteTemplate_83DBCAC.callback = sub_80E872C;
+ spriteId = CreateSprite(&spriteTemplate_83DBCAC, 0, 0, 4);
+ gUnknown_083DB694->unkA0 = &gSprites[spriteId];
+
+ spriteTemplate_83DBCAC.anims = gSpriteAnimTable_83DBC9C;
+ spriteTemplate_83DBCAC.callback = sub_80E8760;
+ spriteId = CreateSprite(&spriteTemplate_83DBCAC, 0, 0, 5);
+ gUnknown_083DB694->unkA4 = &gSprites[spriteId];
+
+ gUnknown_083DB694->unk9C->data[0] = 0;
+ gUnknown_083DB694->unkA0->data[0] = 0;
+ gUnknown_083DB694->unkA4->data[0] = 0;
+
+ gUnknown_083DB694->unk9C->data[3] = 0x0101 + IndexOfSpritePaletteTag(1) * 16;
+ sub_80E8534();
+ gUnknown_083DB694->unk96 = 1;
+ REG_BLDCNT = 0x3F40;
+}
+
+void sub_80E8504(void)
+{
+ DestroySprite(gUnknown_083DB694->unk9C);
+ DestroySprite(gUnknown_083DB694->unkA0);
+ DestroySprite(gUnknown_083DB694->unkA4);
+}
+
+void sub_80E8534(void)
+{
+ if (gUnknown_083DB694->unk1B7 != 0)
+ gUnknown_020388AC = 1;
+ else if (gUnknown_083DB694->unk26 == 0)
+ gUnknown_020388AC = 0;
+ else if (gUnknown_083DB694->unk1A8 == 0 && gUnknown_083DB694->unk1A9 == 6)
+ gUnknown_020388AC = 2;
+ else
+ gUnknown_020388AC = 3;
+
+ gUnknown_083DB694->unk9C->data[2] = gUnknown_020388AC;
+ gUnknown_083DB694->unkA0->data[2] = gUnknown_020388AC;
+ gUnknown_083DB694->unkA4->data[2] = gUnknown_020388AC;
+
+ StartSpriteAnim(gUnknown_083DB694->unk9C, gUnknown_020388AC);
+ StartSpriteAnim(gUnknown_083DB694->unkA0, gUnknown_020388AC);
+ StartSpriteAnim(gUnknown_083DB694->unkA4, gUnknown_020388AC);
+
+ gUnknown_083DB694->unk9C->data[5] = 8;
+ gUnknown_083DB694->unk9C->data[6] = 8;
+ gUnknown_083DB694->unk9C->data[1] = 0;
+}
+
+const s8 gUnknown_083DBCC4[][7] =
+{
+ {1, 3, 5, 8, 10, 12, 15},
+ {1, 3, 5, 8, 10, 12, 0},
+ {1, 3, 5, 8, 10, 12, 14},
+ {1, 3, 5, 8, 10, 12, 14},
+};
+
+void sub_80E85F8(struct Sprite *sprite)
+{
+ sprite->data[0]++;
+ if (sprite->data[0] & 1)
+ sprite->data[5] = 8 + (gSineTable[sprite->data[1]] >> 5);
+ else
+ sprite->data[6] = 8 - (gSineTable[sprite->data[1]] >> 5);
+
+ sprite->data[1] = (sprite->data[1] + 5) & 0xFF;
+
+ REG_BLDALPHA = (sprite->data[6] << 8) | sprite->data[5];
+
+ if (gUnknown_083DB694->unk96 != 0)
+ {
+ sub_80E8534();
+
+ gUnknown_083DB694->unk9C->data[5] = 8;
+ gUnknown_083DB694->unk9C->data[6] = 8;
+ gUnknown_083DB694->unk9C->data[1] = 0;
+
+ switch (sprite->data[2])
+ {
+ case 0:
+ sprite->pos1.x = gUnknown_083DB694->unk1A9 * 88 + 32;
+ sprite->pos1.y = (gUnknown_083DB694->unk1A8 - gUnknown_083DB694->unk1B5) * 16 + 96;
+ break;
+ case 1:
+#if ENGLISH
+ sprite->pos1.x = 216;
+#else
+ sprite->pos1.x = 214;
+#endif
+ sprite->pos1.y = gUnknown_083DB694->unk1A8 * 16 + 96;
+ break;
+ case 2:
+ sprite->pos1.x = 151;
+ sprite->pos1.y = 96;
+ break;
+ case 3:
+ sprite->pos1.x = gUnknown_083DBCC4[gUnknown_083DB694->unk1A8][gUnknown_083DB694->unk1A9] * 8 + 31;
+ sprite->pos1.y = (gUnknown_083DB694->unk1A8 - gUnknown_083DB694->unk1B5) * 16 + 96;
+ break;
+ }
+ }
+}
+
+
+void sub_80E872C(struct Sprite *sprite)
+{
+ if (gUnknown_083DB694->unk96 != 0 && sprite->data[2] == 0)
+ {
+ sprite->pos1.x = gUnknown_083DB694->unk9C->pos1.x + 32;
+ sprite->pos1.y = gUnknown_083DB694->unk9C->pos1.y;
+ }
+}
+
+#if ENGLISH
+void sub_80E8760(struct Sprite *sprite)
+{
+ if (gUnknown_083DB694->unk96 != 0)
+ {
+ switch (sprite->data[2])
+ {
+ case 0:
+ sprite->pos1.x = gUnknown_083DB694->unk9C->pos1.x + 64;
+ sprite->pos1.y = gUnknown_083DB694->unk9C->pos1.y;
+ break;
+ case 2:
+ sprite->pos1.x = gUnknown_083DB694->unk9C->pos1.x + 21;
+ sprite->pos1.y = gUnknown_083DB694->unk9C->pos1.y;
+ break;
+ }
+ }
+}
+#else
+__attribute__((naked))
+void sub_80E8760(struct Sprite *sprite)
+{
+ asm(".syntax unified\n\
+ push {lr}\n\
+ adds r2, r0, 0\n\
+ ldr r0, _080E8784 @ =gUnknown_083DB694\n\
+ ldr r1, [r0]\n\
+ adds r0, r1, 0\n\
+ adds r0, 0x96\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0\n\
+ beq _080E87B2\n\
+ movs r3, 0x32\n\
+ ldrsh r0, [r2, r3]\n\
+ cmp r0, 0x1\n\
+ beq _080E8798\n\
+ cmp r0, 0x1\n\
+ bgt _080E8788\n\
+ cmp r0, 0\n\
+ beq _080E878E\n\
+ b _080E87B2\n\
+ .align 2, 0\n\
+_080E8784: .4byte gUnknown_083DB694\n\
+_080E8788:\n\
+ cmp r0, 0x2\n\
+ beq _080E87A2\n\
+ b _080E87B2\n\
+_080E878E:\n\
+ adds r1, 0x9C\n\
+ ldr r0, [r1]\n\
+ ldrh r0, [r0, 0x20]\n\
+ adds r0, 0x40\n\
+ b _080E87AA\n\
+_080E8798:\n\
+ adds r1, 0x9C\n\
+ ldr r0, [r1]\n\
+ ldrh r0, [r0, 0x20]\n\
+ adds r0, 0x1C\n\
+ b _080E87AA\n\
+_080E87A2:\n\
+ adds r1, 0x9C\n\
+ ldr r0, [r1]\n\
+ ldrh r0, [r0, 0x20]\n\
+ adds r0, 0x15\n\
+_080E87AA:\n\
+ strh r0, [r2, 0x20]\n\
+ ldr r0, [r1]\n\
+ ldrh r0, [r0, 0x22]\n\
+ strh r0, [r2, 0x22]\n\
+_080E87B2:\n\
+ pop {r0}\n\
+ bx r0\n\
+ .syntax divided\n");
+}
+#endif
+
+void sub_80E87A4(u8 a)
+{
+ gUnknown_083DB694->unkA8->data[1] = (a == 0);
+ gUnknown_083DB694->unkA8->pos2.x = 0;
+}
+
+void sub_80E87CC(u8 a)
+{
+ gUnknown_083DB694->unkA8->invisible = (a == 0);
+ sub_80E87A4(a);
+ if (a != 0)
+ gUnknown_083DB694->unk1B9 = 1;
+}
+
+void sub_80E8818(void)
+{
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83DBBFC, 0, 0, 0);
+
+ gSprites[spriteId].data[0] = 0;
+ gSprites[spriteId].data[1] = 0;
+ gUnknown_083DB694->unkA8 = &gSprites[spriteId];
+ gUnknown_083DB694->unkA8->callback = sub_80E8860;
+ sub_80E87CC(0);
+}
+
+void sub_80E8860(struct Sprite *sprite)
+{
+ if (sprite->data[1] == 0)
+ {
+ if (gUnknown_083DB694->unk1B9 != 0)
+ {
+ sprite->pos1.x = gUnknown_083DB694->unk99A5 * 88 + 44;
+ sprite->pos1.y = (gUnknown_083DB694->unk99A4 - gUnknown_083DB694->unk9A29) * 16 + 96;
+ sprite->pos2.x = -6;
+ sprite->data[0] = 0;
+ }
+ else
+ {
+ sprite->data[0]++;
+ if (sprite->data[0] > 2)
+ {
+ sprite->data[0] = 0;
+ sprite->pos2.x++;
+ if (sprite->pos2.x > 0)
+ sprite->pos2.x = -6;
+ }
+ }
+ }
+}
+
+void sub_80E88F0(void)
+{
+ u16 i;
+
+ for (i = 0; i < 2; i++)
+ {
+ gUnknown_083DB694->unkAC[i]->invisible = TRUE;
+ gUnknown_083DB694->unkAC[i]->data[1] = 0;
+ gUnknown_083DB694->unkB4[i]->invisible = TRUE;
+ gUnknown_083DB694->unkB4[i]->data[1] = 0;
+ }
+ gUnknown_083DB694->unk9C70 = 0;
+}
+
+void sub_80E8958(u8 animNum)
+{
+ s16 r9;
+ u16 i;
+
+ if (animNum == 0)
+ {
+ r9 = 100;
+ gUnknown_083DB694->unk9C6C = &gUnknown_083DB694->unk1B5;
+ if (gUnknown_083DB694->unk26 == 0)
+ gUnknown_083DB694->unk9C71 = gUnknown_083DB694->unk1B6 - 4;
+ else
+ gUnknown_083DB694->unk9C71 = 0;
+ }
+ else
+ {
+ r9 = 120;
+ gUnknown_083DB694->unk9C6C = &gUnknown_083DB694->unk9A29;
+ gUnknown_083DB694->unk9C71 = gUnknown_083DB694->unk9A28 - 4;
+ for (i = 0; i < 2; i++)
+ {
+ gUnknown_083DB694->unkB4[i]->invisible = FALSE;
+ gUnknown_083DB694->unkB4[i]->data[1] = 1;
+ }
+ }
+
+ if (gUnknown_083DB694->unk9C71 < 0)
+ gUnknown_083DB694->unk9C71 = 0;
+
+ for (i = 0; i < 2; i++)
+ {
+ gUnknown_083DB694->unkAC[i]->pos1.x = r9;
+ gUnknown_083DB694->unkAC[i]->invisible = FALSE;
+ gUnknown_083DB694->unkAC[i]->data[1] = 1;
+ StartSpriteAnim(gUnknown_083DB694->unkAC[i], animNum);
+ }
+
+ gUnknown_083DB694->unk9C70 = 1;
+}
+
+const struct OamData gOamData_83DBCE0 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 1,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const union AnimCmd gSpriteAnim_83DBCE8[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBCF0[] =
+{
+ ANIMCMD_FRAME(4, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gSpriteAnimTable_83DBCF8[] =
+{
+ gSpriteAnim_83DBCE8,
+ gSpriteAnim_83DBCF0,
+};
+
+const union AnimCmd gSpriteAnim_83DBD00[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBD08[] =
+{
+ ANIMCMD_FRAME(4, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gSpriteAnimTable_83DBD10[] =
+{
+ gSpriteAnim_83DBD00,
+ gSpriteAnim_83DBD08,
+};
+
+void sub_80E8A7C(void)
+{
+ struct SpriteTemplate spriteTemplate_83DBD18 =
+ {
+ .tileTag = 2,
+ .paletteTag = 0,
+ .oam = &gOamData_83DBCE0,
+ .anims = gSpriteAnimTable_83DBCF8,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80E8B78,
+ };
+ u16 i;
+ u8 spriteId;
+
+ for (i = 0; i < 2; i++)
+ {
+ spriteId = CreateSprite(&spriteTemplate_83DBD18, 0, 84 + i * 72 , 0);
+ gUnknown_083DB694->unkAC[i] = &gSprites[spriteId];
+ gUnknown_083DB694->unkAC[i]->data[0] = i;
+ gUnknown_083DB694->unkAC[i]->vFlip = i;
+ }
+
+ spriteTemplate_83DBD18.tileTag = 3;
+ spriteTemplate_83DBD18.anims = gSpriteAnimTable_83DBD10;
+
+ for (i = 0; i < 2; i++)
+ {
+ spriteId = CreateSprite(&spriteTemplate_83DBD18, 142 + i * 40, 88, 0);
+ gUnknown_083DB694->unkB4[i] = &gSprites[spriteId];
+ gUnknown_083DB694->unkB4[i]->data[0] = i;
+ gUnknown_083DB694->unkB4[i]->oam.shape = 1;
+ gUnknown_083DB694->unkB4[i]->oam.size = 1;
+ StartSpriteAnim(gUnknown_083DB694->unkB4[i], i);
+ }
+
+ sub_80E8958(0);
+ sub_80E88F0();
+}
+
+void sub_80E8B78(struct Sprite *sprite)
+{
+ bool8 invisible;
+
+ if (gUnknown_083DB694->unk9C70 != 0 && sprite->data[1] != 0)
+ {
+ if (sprite->data[0] == 0)
+ {
+ invisible = FALSE;
+ if (*gUnknown_083DB694->unk9C6C == 0)
+ invisible = TRUE;
+ sprite->invisible = invisible;
+ }
+ else
+ {
+ invisible = FALSE;
+ if (*gUnknown_083DB694->unk9C6C == gUnknown_083DB694->unk9C71)
+ invisible = TRUE;
+ sprite->invisible = invisible;
+ }
+ }
+}
+
+// defined below
+extern const struct SpriteTemplate gSpriteTemplate_83DBD48;
+
+void sub_80E8BF4(u8 reporter, u8 b)
+{
+ struct CompressedSpriteSheet gUnknown_083DBD30 = {gMenuInterviewFrame_Gfx, 2048, 0x0006};
+ struct SpritePalette gUnknown_083DBD38 = {gMenuInterviewFrame_Pal, 0x0004};
+ s16 x;
+ s16 y;
+ u16 gabbyTyGfxId;
+ u8 spriteId;
+
+ switch (b)
+ {
+ case 2:
+ default:
+ x = 64;
+ y = 40;
+ break;
+ case 5:
+ x = 36;
+ y = 48;
+ break;
+ }
+
+ switch (reporter)
+ {
+ case 0: // Gabby
+ default:
+ gabbyTyGfxId = MAP_OBJ_GFX_REPORTER_M;
+ break;
+ case 1: // Ty
+ gabbyTyGfxId = MAP_OBJ_GFX_REPORTER_F;
+ break;
+ }
+
+ LoadCompressedObjectPic(&gUnknown_083DBD30);
+ LoadSpritePalette(&gUnknown_083DBD38);
+ CreateSprite(&gSpriteTemplate_83DBD48, x, y, 1);
+
+ spriteId = AddPseudoFieldObject(
+ (gSaveBlock2.playerGender == MALE) ? MAP_OBJ_GFX_RIVAL_BRENDAN_NORMAL : MAP_OBJ_GFX_RIVAL_MAY_NORMAL,
+ SpriteCallbackDummy, x - 12, y, 0);
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].oam.priority = 0;
+ StartSpriteAnim(&gSprites[spriteId], 3);
+ }
+
+ spriteId = AddPseudoFieldObject(gabbyTyGfxId, SpriteCallbackDummy, x + 12, y, 0);
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].oam.priority = 0;
+ StartSpriteAnim(&gSprites[spriteId], 2);
+ }
+}
+
+const struct OamData gOamData_83DBD40 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const struct SpriteTemplate gSpriteTemplate_83DBD48 =
+{
+ .tileTag = 6,
+ .paletteTag = 4,
+ .oam = &gOamData_83DBD40,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+const struct CompressedSpriteSheet gUnknown_083DBD60 = {gMenuWordGroupIndicator_Gfx, 4096, 0x0007};
+
+const struct SpritePalette gUnknown_083DBD68 = {gMenuWordGroupIndicator_Pal, 0x0005};
+
+const struct OamData gOamData_83DBD70 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 1,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const union AnimCmd gSpriteAnim_83DBD78[] =
+{
+ ANIMCMD_FRAME(96, 3),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBD80[] =
+{
+ ANIMCMD_FRAME(64, 4),
+ ANIMCMD_FRAME(96, 4),
+ ANIMCMD_FRAME(64, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBD94[] =
+{
+ ANIMCMD_FRAME(64, 4),
+ ANIMCMD_FRAME(96, 4),
+ ANIMCMD_FRAME(64, 4),
+ ANIMCMD_FRAME(32, 4),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBDA8[] =
+{
+ ANIMCMD_FRAME(64, 2),
+ ANIMCMD_FRAME(32, 2),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBDB4[] =
+{
+ ANIMCMD_FRAME(64, 2),
+ ANIMCMD_FRAME(0, 2),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBDC0[] =
+{
+ ANIMCMD_FRAME(64, 2),
+ ANIMCMD_FRAME(96, 2),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gSpriteAnimTable_83DBDCC[] =
+{
+ gSpriteAnim_83DBD78,
+ gSpriteAnim_83DBD80,
+ gSpriteAnim_83DBD94,
+ gSpriteAnim_83DBDA8,
+ gSpriteAnim_83DBDB4,
+ gSpriteAnim_83DBDC0,
+};
+
+const struct SpriteTemplate gSpriteTemplate_83DBDE4 =
+{
+ .tileTag = 7,
+ .paletteTag = 5,
+ .oam = &gOamData_83DBD70,
+ .anims = gSpriteAnimTable_83DBDCC,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+void sub_80E8CEC(void)
+{
+ u8 spriteId;
+
+ LoadCompressedObjectPic(&gUnknown_083DBD60);
+ LoadSpritePalette(&gUnknown_083DBD68);
+
+ spriteId = CreateSprite(&gSpriteTemplate_83DBDE4, 224, 88, 0);
+ if (spriteId != MAX_SPRITES)
+ gUnknown_083DB694->unk9C74 = &gSprites[spriteId];
+ else
+ gUnknown_083DB694->unk9C74 = NULL;
+}
+
+void sub_80E8D54(void)
+{
+ if (gUnknown_083DB694->unk9C74 != NULL)
+ {
+ if (gUnknown_083DB694->unk26 == 0)
+ StartSpriteAnim(gUnknown_083DB694->unk9C74, 1);
+ else
+ StartSpriteAnim(gUnknown_083DB694->unk9C74, 2);
+ }
+}
+
+void sub_80E8D8C(u8 a)
+{
+ if (gUnknown_083DB694->unk9C74 != NULL)
+ {
+ if (a != 0)
+ {
+ if (gUnknown_083DB694->unk26 == 0)
+ StartSpriteAnim(gUnknown_083DB694->unk9C74, 3);
+ else
+ StartSpriteAnim(gUnknown_083DB694->unk9C74, 4);
+ }
+ else
+ {
+ StartSpriteAnim(gUnknown_083DB694->unk9C74, 5);
+ }
+ }
+}
+
+const u16 gUnknown_083DBDFC[] = INCBIN_U16("graphics/unknown/unknown_3DBDFC.gbapal");
+
+const u16 gUnknown_083DBE1C[] =
+{
+ 0x300, 0x300, 0x300, 0x300, 0x300, 0x300, 0x300, 0x300, 0x300,
+ 0x301, 0x301, 0x301, 0x301, 0x301, 0x300, 0x300, 0x300, 0x300,
+};
+
+const u16 gUnknown_083DBE40[] = INCBIN_U16("graphics/unknown/unknown_3DBE40.gbapal");
+
+// unused tilemap?
+const u16 gUnused_083DBE60[] =
+{
+ 0x5036, 0x5037, 0x5038, 0x5039, 0x503A, 0x503B,
+ 0x5046, 0x5047, 0x5048, 0x5049, 0x504A, 0x504B,
+ 0x5056, 0x5057, 0x5058, 0x5059, 0x505A, 0x505B,
+ 0x5030, 0x5031, 0x5032, 0x5033, 0x5034, 0x5035,
+ 0x5040, 0x5041, 0x5042, 0x5043, 0x5044, 0x5045,
+ 0x5050, 0x5051, 0x5052, 0x5053, 0x5054, 0x5055,
+};
+
+const u8 gUnknown_083DBEA8[] = _("{CLEAR_TO 88}");
+
+void sub_80E8DD8(void)
+{
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ REG_BG2VOFS = 0;
+ REG_BG2HOFS = 0;
+ REG_BG3HOFS = 0;
+ REG_BG3VOFS = 0;
+
+ REG_BG0CNT = 0x8B00;
+ REG_BG1CNT = 0x0D09;
+
+ CpuCopy16(gUnknown_08E945D0, gUnknown_083DB694->unk1C8, 0x500);
+ LZ77UnCompWram(gUnknown_08E953D0, gUnknown_083DB694->unk6C8);
+ LZ77UnCompVram(gMenuWordGroupFrame_Gfx, (void *)(VRAM + 0x8000));
+ CpuCopy16(gUnknown_083DB694->unk1C8, (void *)(VRAM + 0x6800), 0x500);
+ LoadPalette(gMenuWordGroupFrame1_Pal, 64, 64);
+
+ REG_BG2CNT = 0x0E02;
+
+ DmaClear16(3, (void *)(VRAM + 0x7000), 0x800);
+ DmaCopy16Defvars(3, gUnknown_08E9AB00, (void *)(VRAM + 0x6000), 64);
+ LZ77UnCompVram(gUnknown_08E9AB60, (void *)(VRAM + 0x7000));
+ LoadPalette(gUnknown_08E9AB40, 0, 32);
+ LoadPalette(gUnknown_083DBDFC, 16, 32);
+
+ REG_BG3CNT = 0x0F0F;
+
+ DmaClear32(3, (void *)(VRAM + 0x7800), 0x800);
+ LoadPalette(gUnknown_083DBE40, 32, 32);
+ gPlttBufferUnfaded[63] = RGB(31, 31, 31);
+ gPlttBufferUnfaded[49] = RGB(27, 26, 27);
+ gPlttBufferUnfaded[56] = RGB(28, 28, 28);
+ gPlttBufferFaded[63] = RGB(31, 31, 31);
+ gPlttBufferFaded[49] = RGB(27, 26, 27);
+ gPlttBufferFaded[56] = RGB(28, 28, 28);
+
+ gUnknown_083DB694->unkBC = 0;
+ sub_80E8FA4();
+ sub_80E948C();
+ sub_80E9198(10);
+ sub_80E91D4(0);
+ sub_80E95A4();
+
+ REG_BLDCNT = 0;
+}
+
+// The components are ORed in the reverse order from the normal RGB macro
+#define RGB_(r, g, b) ((((b) & 0x1F) << 10) | (((g) & 0x1F) << 5) | ((r) & 0x1F))
+
+#define R_VAL(color) ((color) & 0x1F)
+#define G_VAL(color) (((color) >> 5) & 0x1F)
+#define B_VAL(color) (((color) >> 10) & 0x1F)
+
+void sub_80E8FA4(void)
+{
+ u16 i;
+ u16 r3;
+ u16 r4;
+ s32 sp0[3];
+ s32 spC[3];
+ s32 sp18[3];
+
+ for (i = 0; i < 3; i++)
+ {
+ sp0[0] = R_VAL(*(gMenuWordGroupFrame2_Pal + i + 1)) << 8;
+ spC[0] = R_VAL(*(gMenuWordGroupFrame2_Pal + i + 4)) << 8;
+ sp0[1] = G_VAL(*(gMenuWordGroupFrame2_Pal + i + 1)) << 8;
+ spC[1] = G_VAL(*(gMenuWordGroupFrame2_Pal + i + 4)) << 8;
+ sp0[2] = B_VAL(*(gMenuWordGroupFrame2_Pal + i + 1)) << 8;
+ spC[2] = B_VAL(*(gMenuWordGroupFrame2_Pal + i + 4)) << 8;
+
+ for (r3 = 0; r3 < 3; r3++)
+ sp18[r3] = (spC[r3] - sp0[r3]) / 8;
+
+ for (r4 = 0; r4 < 8; r4++)
+ {
+ gUnknown_083DB694->unk9C34[i][r4] = RGB_(sp0[0] >> 8, sp0[1] >> 8, sp0[2] >> 8);
+ for (r3 = 0; r3 < 3; r3++)
+ sp0[r3] += sp18[r3];
+ }
+ gUnknown_083DB694->unk9C34[i][r4] = RGB_(spC[0] >> 8, spC[1] >> 8, spC[2] >> 8);
+ }
+ gUnknown_083DB694->unk9C32 = 0;
+}
+
+void sub_80E9108(s8 a)
+{
+ u16 i;
+
+ gUnknown_083DB694->unk9C32 += a;
+ for (i = 0; i < 3; i++)
+ {
+ gPlttBufferUnfaded[81 + i] = gUnknown_083DB694->unk9C34[i][gUnknown_083DB694->unk9C32];
+ gPlttBufferFaded[81 + i] = gUnknown_083DB694->unk9C34[i][gUnknown_083DB694->unk9C32];
+ }
+}
+
+void sub_80E9178(void)
+{
+ gUnknown_083DB694->unk9C32 = 0;
+ sub_80E9108(0);
+}
+
+void sub_80E9198(u8 a)
+{
+ gUnknown_03000740 = a;
+}
+
+u8 sub_80E91A4(void)
+{
+ return gUnknown_03000740;
+}
+
+void sub_80E91B0(const u8 *a, u8 b, u8 c, u8 d)
+{
+ sub_8072AB0(a, b * 8, c * 8, 176, d * 8, 1);
+}
+
+void sub_80E91D4(u8 a)
+{
+ BasicInitMenuWindow(&gWindowConfig_81E6DA8);
+
+ if (a == 10)
+ {
+ MenuZeroFillWindowRect(3, 14, 26, 19);
+ sub_80E9198(10);
+ return;
+ }
+
+ //_080E9200
+ if (sub_80E91A4() == 10)
+ MenuDrawTextWindow(3, 14, 26, 19);
+
+ //_080E9218
+ sub_80E9198(a);
+ switch (a)
+ {
+ case 0:
+ sub_80E91B0(gUnknown_083DB694->unk9C80, 4, 15, 2);
+ sub_80E91B0(gUnknown_083DB694->unk9CC9, 4, 17, 2);
+ break;
+ case 1:
+ sub_80E91B0(gUnknown_083DB694->unk9D12, 4, 15, 2);
+ sub_80E91B0(gUnknown_083DB694->unk9D5B, 4, 17, 2);
+ break;
+ case 2:
+ sub_80E91B0(gOtherText_TextDeletedConfirmPage1, 4, 15, 2);
+ sub_80E91B0(gOtherText_TextDeletedConfirmPage2, 4, 17, 2);
+ break;
+ case 3:
+ switch (gUnknown_083DB694->unk8)
+ {
+ case 9:
+ sub_80E91B0(gOtherText_QuitGivingInfo, 4, 15, 4);
+ break;
+ case 4:
+ sub_80E91B0(gOtherText_StopGivingMail, 4, 15, 4);
+ break;
+ default:
+ sub_80E91B0(gOtherText_QuitEditing, 4, 15, 4);
+ break;
+ }
+ break;
+ case 4:
+ sub_80E91B0(gOtherText_EditedTextNoSavePage1, 4, 15, 2);
+ sub_80E91B0(gOtherText_EditedTextNoSavePage2, 4, 17, 2);
+ break;
+ case 5:
+ sub_80E91B0(gOtherText_EnterAPhraseOrWord, 4, 15, 4);
+ break;
+ case 6:
+ sub_80E91B0(gOtherText_TextNoDelete, 4, 15, 4);
+ break;
+ case 7:
+ sub_80E91B0(gOtherText_OnlyOnePhrase, 4, 15, 2);
+ sub_80E91B0(gOtherText_OriginalSongRestored, 4, 17, 2);
+ break;
+ case 8:
+ sub_80E91B0(gOtherText_TrendyAlready, 4, 15, 4);
+ break;
+ case 9:
+ sub_80E91B0(gOtherText_CombineTwoPhrases, 4, 15, 4);
+ break;
+ }
+}
+
+void sub_80E9368(u8 a)
+{
+ const u8 *r4;
+
+ switch (a)
+ {
+ case 0:
+ r4 = gOtherText_Profile;
+ break;
+ case 1:
+ r4 = gOtherText_AtBattleStart;
+ break;
+ case 2:
+ r4 = gOtherText_UponWinningBattle;
+ break;
+ case 3:
+ r4 = gOtherText_UponLosingBattle;
+ break;
+ case 6:
+ r4 = gOtherText_TheBardsSong;
+ break;
+ case 9:
+ r4 = gOtherText_WhatsHipHappening;
+ break;
+ case 5:
+ case 7:
+ case 8:
+ case 10:
+ case 11:
+ case 12:
+ r4 = gOtherText_Interview;
+ break;
+ case 13:
+ r4 = gOtherText_GoodSaying;
+ break;
+ default:
+ r4 = NULL;
+ break;
+ }
+
+ BasicInitMenuWindow(&gWindowConfig_81E6D8C);
+ gUnknown_083DB694->unk9F8E[0] = EXT_CTRL_CODE_BEGIN;
+ gUnknown_083DB694->unk9F8E[1] = 5;
+ gUnknown_083DB694->unk9F8E[2] = 1;
+ if (r4 != NULL)
+ {
+ sub_8072C74(gUnknown_083DB694->unk9F8E + 3, r4, 240, 2);
+ MenuPrint(gUnknown_083DB694->unk9F8E, 0, 0);
+ }
+ else
+ {
+ u8 *str = gUnknown_083DB694->unk9F8E + 3;
+
+ str[0] = EXT_CTRL_CODE_BEGIN;
+ str[1] = 0x11;
+ str[2] = 0x10;
+ str[3] = EOS;
+
+ MenuPrint(gUnknown_083DB694->unk9F8E, 0, 0);
+ MenuPrint(gUnknown_083DB694->unk9F8E, 28, 0);
+ }
+ BasicInitMenuWindow(&gWindowConfig_81E6DA8);
+}
+
+void sub_80E948C(void)
+{
+ switch (gUnknown_083DB694->unk9)
+ {
+ case 4:
+ sub_809D104((void *)(VRAM + 0x6800), 3, 3, gUnknown_08E94AD0, 0, 26, 24, 6);
+ break;
+ case 5:
+ sub_809D104((void *)(VRAM + 0x6800), 14, 2, gUnknown_08E94AD0, 0, 18, 13, 8);
+ break;
+ case 0:
+ sub_809D104((void *)(VRAM + 0x6800), 2, 2, gUnknown_08E94AD0, 0, 10, 26, 8);
+ break;
+ case 1:
+ sub_809D104((void *)(VRAM + 0x6800), 2, 0, gUnknown_08E94AD0, 0, 0, 26, 10);
+ break;
+ case 2:
+ sub_809D104((void *)(VRAM + 0x6800), 14, 3, gUnknown_08E94AD0, 13, 18, 13, 4);
+ break;
+ case 3:
+ sub_809D104((void *)(VRAM + 0x6800), 3, 2, gUnknown_08E94AD0, 0, 32, 24, 4);
+ break;
+ }
+}
+
+void sub_80E95A4(void)
+{
+ BasicInitMenuWindow(&gWindowConfig_81E6D8C);
+ switch (gUnknown_083DB694->unk9)
+ {
+ case 4:
+ sub_80E9620(4, 6);
+ break;
+ case 5:
+ sub_80E9620(2, 17);
+ break;
+ case 0:
+ sub_80E9620(3, 5);
+ break;
+ case 1:
+ sub_80E9620(0, 5);
+ break;
+ case 2:
+ sub_80E9620(4, 17);
+ break;
+ case 3:
+ sub_80E9620(3, 6);
+ break;
+ }
+ BasicInitMenuWindow(&gWindowConfig_81E6DA8);
+}
+
+void sub_80E9620(u16 a, u16 b)
+{
+ u16 i;
+ u16 j;
+ u16 r10 = 0;
+ u16 r7 = a;
+
+ for (i = 0; i < gUnknown_083DB694->unk84; i++)
+ {
+ u16 r6 = b;
+
+ for (j = 0; j < gUnknown_083DB694->unk83; j++)
+ {
+ if (r10 >= gUnknown_083DB694->unkA)
+ {
+ MenuPrint(gUnknown_083DBEA8, r6, r7);
+ break;
+ }
+ if (gUnknown_083DB694->unkC[r10] == 0xFFFF)
+ {
+ sub_8095C8C((void *)(VRAM + 0x7000), r6, r7, gUnknown_083DBE1C, 0, 0, 9, 2, 9);
+ r6 += 11;
+ }
+ else
+ {
+ sub_80EB218(gUnknown_083DB694->unk9E14, gUnknown_083DB694->unkC[r10], 11);
+ MenuPrint(gUnknown_083DB694->unk9E14, r6, r7);
+ r6 += gUnknown_083DB694->unk8C[i][j] + 11;
+ }
+ r10++;
+ }
+ r7 += 2;
+ }
+}
+
+void sub_80E9744(void)
+{
+ BasicInitMenuWindow(&gWindowConfig_81E6D8C);
+ switch (gUnknown_083DB694->unk9)
+ {
+ case 4:
+ sub_80E97C0(4, 6);
+ break;
+ case 5:
+ sub_80E97C0(2, 17);
+ break;
+ case 0:
+ sub_80E97C0(3, 5);
+ break;
+ case 1:
+ sub_80E97C0(0, 5);
+ break;
+ case 2:
+ sub_80E97C0(4, 17);
+ break;
+ case 3:
+ sub_80E97C0(3, 6);
+ break;
+ }
+ BasicInitMenuWindow(&gWindowConfig_81E6DA8);
+}
+
+void sub_80E97C0(u16 a, u16 b)
+{
+ u8 i;
+ u8 r7 = 0;
+
+ asm("":::"r9");
+
+ for (i = 0; i < gUnknown_083DB694->unk84; i++)
+ {
+ u8 r6;
+ u8 *r2 = gUnknown_083DB694->unk9E6E;
+ u32 r1;
+
+ for (r6 = 0; r6 < gUnknown_083DB694->unk83; r6++)
+ {
+ if (r7 >= gUnknown_083DB694->unkA)
+ break;
+ if (gUnknown_083DB694->unkC[r7] != 0xFFFF)
+ {
+ r2 = sub_80EB218(r2, gUnknown_083DB694->unkC[r7], 0);
+ *r2++ = CHAR_SPACE;
+ }
+ r7++;
+ }
+
+ r1 = gUnknown_083DB694->unk83 * 11;
+ r2[0] = EXT_CTRL_CODE_BEGIN;
+ r2[1] = 0x13;
+ r2[2] = r1 * 8;
+ r2[3] = EOS;
+
+ MenuPrint(gUnknown_083DB694->unk9E6E, b, a);
+
+ a += 2;
+ }
+}
+
+void sub_80E98C4(void)
+{
+ u8 r1;
+ u8 r3;
+
+ BasicInitMenuWindow(&gWindowConfig_81E6D8C);
+ switch (gUnknown_083DB694->unk9)
+ {
+ case 4:
+ r1 = 4;
+ r3 = 2;
+ break;
+ case 5:
+ r1 = 3;
+ r3 = 2;
+ break;
+ case 0:
+ r1 = 3;
+ r3 = 2;
+ break;
+ case 1:
+ r1 = 1;
+ r3 = 3;
+ break;
+ case 2:
+ r1 = 4;
+ r3 = 1;
+ break;
+ case 3:
+ r1 = 3;
+ r3 = 1;
+ break;
+ default:
+ return;
+ }
+ MenuFillWindowRectWithBlankTile(2, r1, 27, r3 * 2 + r1 - 1);
+ BasicInitMenuWindow(&gWindowConfig_81E6DA8);
+}
+
+void sub_80E9940(u8 *a, u8 b)
+{
+ u8 r4 = (b & 7);
+
+ MenuFillWindowRectWithBlankTile(2, r4 * 2, 31, r4 * 2 + 1);
+ sub_80E9A7C(a, b);
+ sub_80E9A60(a, 2, r4 * 2);
+}
+
+extern const u8 gUnknown_083DBEAC[][32];
+
+#if ENGLISH
+void sub_80E9974(void)
+{
+ BasicInitMenuWindow(&gWindowConfig_81E6D54);
+ if (gUnknown_083DB694->unk26 == 0)
+ {
+ u16 i;
+
+ for (i = gUnknown_083DB694->unk1B5; i < gUnknown_083DB694->unk1B5 + 4; i++)
+ sub_80E9940(gUnknown_083DB694->unk9DC9, i);
+ }
+ else
+ {
+ sub_80E9AD4();
+ sub_80E9A60(gUnknown_083DBEAC[0], 2, 0);
+ sub_80E9A60(gUnknown_083DBEAC[1], 2, 2);
+ sub_80E9A60(gUnknown_083DBEAC[2], 2, 4);
+ sub_80E9A60(gUnknown_083DBEAC[3], 2, 6);
+ }
+}
+#else
+__attribute__((naked))
+void sub_80E9974(void)
+{
+ asm(".syntax unified\n\
+ push {r4-r6,lr}\n\
+ ldr r0, _080E99C4 @ =gWindowConfig_81E6D54\n\
+ bl BasicInitMenuWindow\n\
+ ldr r0, _080E99C8 @ =gUnknown_083DB694\n\
+ ldr r2, [r0]\n\
+ adds r0, r2, 0\n\
+ adds r0, 0x26\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _080E99D4\n\
+ ldr r1, _080E99CC @ =0x000001b5\n\
+ adds r0, r2, r1\n\
+ ldrb r0, [r0]\n\
+ lsls r0, 24\n\
+ asrs r0, 24\n\
+ lsls r1, r0, 16\n\
+ lsrs r4, r1, 16\n\
+ adds r0, 0x4\n\
+ cmp r4, r0\n\
+ bge _080E9A02\n\
+ adds r5, r2, 0\n\
+ ldr r2, _080E99CC @ =0x000001b5\n\
+ adds r6, r5, r2\n\
+_080E99A4:\n\
+ lsls r1, r4, 24\n\
+ lsrs r1, 24\n\
+ ldr r2, _080E99D0 @ =0x0000a0f5\n\
+ adds r0, r5, r2\n\
+ bl sub_80E9940\n\
+ adds r0, r4, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r4, r0, 16\n\
+ movs r0, 0\n\
+ ldrsb r0, [r6, r0]\n\
+ adds r0, 0x4\n\
+ cmp r4, r0\n\
+ blt _080E99A4\n\
+ b _080E9A02\n\
+ .align 2, 0\n\
+_080E99C4: .4byte gWindowConfig_81E6D54\n\
+_080E99C8: .4byte gUnknown_083DB694\n\
+_080E99CC: .4byte 0x000001b5\n\
+_080E99D0: .4byte 0x0000a0f5\n\
+_080E99D4:\n\
+ bl sub_80E9AD4\n\
+ ldr r4, _080E9A08 @ =gUnknown_083DBEAC\n\
+ ldr r0, [r4]\n\
+ movs r1, 0x2\n\
+ movs r2, 0\n\
+ bl sub_80E9A60\n\
+ ldr r0, [r4, 0x4]\n\
+ movs r1, 0x2\n\
+ movs r2, 0x2\n\
+ bl sub_80E9A60\n\
+ ldr r0, [r4, 0x8]\n\
+ movs r1, 0x2\n\
+ movs r2, 0x4\n\
+ bl sub_80E9A60\n\
+ ldr r0, [r4, 0xC]\n\
+ movs r1, 0x2\n\
+ movs r2, 0x6\n\
+ bl sub_80E9A60\n\
+_080E9A02:\n\
+ pop {r4-r6}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_080E9A08: .4byte gUnknown_083DBEAC\n\
+ .syntax divided\n");
+}
+#endif
+
+void sub_80E9A14(void)
+{
+ sub_80E9A4C();
+ if (gUnknown_083DB694->unk26 == 0)
+ gUnknown_083DB694->unk1BA += gUnknown_083DB694->unk1B5 * 16;
+}
+
+void sub_80E9A4C(void)
+{
+ gUnknown_083DB694->unk1BA = 0;
+}
+
+void sub_80E9A60(const u8 *a, u16 b, u16 c)
+{
+ c &= 0xF;
+ MenuPrint(a, b, c);
+}
+
+void sub_80E9A7C(u8 *a, u16 b)
+{
+ u16 i;
+ u16 r5 = b * 2;
+
+ for (i = 0; i < 2; i++)
+ {
+ a[0] = EXT_CTRL_CODE_BEGIN;
+ a[1] = 0x12;
+ a[2] = 88 * i;
+ a += 3;
+
+ a = sub_80EAD64(a, gUnknown_083DB694->unk2A[b][i], 11);
+ r5++;
+ if (r5 >= gUnknown_083DB694->unk28)
+ break;
+ }
+}
+
+void sub_80E9AD4(void)
+{
+ u16 i;
+
+ BasicInitMenuWindow(&gWindowConfig_81E6D54);
+ for (i = 0; i < 16; i++)
+ sub_80E9C74(i);
+}
+
+void sub_80E9AF8(u16 a)
+{
+ u8 *r8;
+ u16 i;
+
+ sub_80E9C74(a);
+
+ r8 = gUnknown_083DB694->unk9E14;
+ r8[0] = EXT_CTRL_CODE_BEGIN;
+ r8[1] = 0x11;
+ r8[2] = 0x10;
+ r8 += 3;
+
+ if (gUnknown_083DB694->unk7D != 0)
+ {
+ for (i = 0; i < gUnknown_083DB694->unk99A6[a]; i++)
+ {
+ if (sub_80EB2D4(gUnknown_083DB694->unk9A2A[a][i]) == 7)
+ BasicInitMenuWindow(&gWindowConfig_81E6D70);
+ else
+ BasicInitMenuWindow(&gWindowConfig_81E6D54);
+ sub_80EB218(r8, gUnknown_083DB694->unk9A2A[a][i], 9);
+ sub_80E9A60(gUnknown_083DB694->unk9E14, i * 11 + 4, a * 2);
+ }
+ }
+ else
+ {
+ BasicInitMenuWindow(&gWindowConfig_81E6D54);
+ for (i = 0; i < gUnknown_083DB694->unk99A6[a]; i++)
+ {
+ sub_80EB218(r8, gUnknown_083DB694->unk9A2A[a][i], 9);
+ sub_80E9A60(gUnknown_083DB694->unk9E14, i * 11 + 4, a * 2);
+ }
+ }
+}
+
+void sub_80E9C74(u16 a)
+{
+ a &= 7;
+ MenuFillWindowRectWithBlankTile(0, a * 2, 29, a * 2 + 1);
+}
+
+void sub_80E9C94(void)
+{
+ u16 r5 = min(gUnknown_083DB694->unk9A28, 4);
+ u16 i;
+
+ for (i = 0; i < r5; i++)
+ sub_80E9AF8(gUnknown_083DB694->unk9A29 + i);
+ while (i < 4)
+ sub_80E9C74(i++);
+}
+
+void sub_80E9D00(void)
+{
+ u16 r4;
+ u16 r5;
+
+ if (gUnknown_083DB694->unk1C0 > 0)
+ {
+ r4 = gUnknown_083DB694->unk1C0;
+ r5 = gUnknown_083DB694->unk9A29 + 4;
+ }
+ else
+ {
+ r4 = -gUnknown_083DB694->unk1C0;
+ r5 = gUnknown_083DB694->unk9A29 - r4;
+ }
+ while (--r4 != 0xFFFF)
+ sub_80E9AF8(r5++);
+}
+
+void sub_80E9D7C(void)
+{
+ u16 r6;
+ u16 r4;
+ u16 i;
+
+ BasicInitMenuWindow(&gWindowConfig_81E6D54);
+ if (gUnknown_083DB694->unk1C0 < 0)
+ {
+ r6 = -gUnknown_083DB694->unk1C0;
+ r4 = gUnknown_083DB694->unk1B5 - r6;
+ }
+ else
+ {
+ r6 = gUnknown_083DB694->unk1C0;
+ r4 = gUnknown_083DB694->unk1B5 + 4;
+ }
+ for (i = 0; i < r6; i++)
+ {
+ sub_80E9940(gUnknown_083DB694->unk9DC9, r4);
+ r4++;
+ }
+}
+
+void sub_80E9E08(u8 a)
+{
+ gUnknown_083DB694->unk1BC = (gUnknown_083DB694->unk1BA + gUnknown_083DB694->unk1C0 * 16) & 0x7F;
+ gUnknown_083DB694->unk1BF = (gUnknown_083DB694->unk1C0 < 0) ? -a : a;
+}
+
+bool8 sub_80E9E54(void)
+{
+ gUnknown_083DB694->unk1BA = (gUnknown_083DB694->unk1BA + gUnknown_083DB694->unk1BF) & 0x7F;
+ return (gUnknown_083DB694->unk1BA == gUnknown_083DB694->unk1BC);
+}
+
+void nullsub_23(void)
+{
+}
+
+void sub_80E9E98(void)
+{
+ gUnknown_083DB694->unkBE = 0;
+}
+
+bool8 sub_80E9EA8(void)
+{
+ switch (gUnknown_083DB694->unkBE)
+ {
+ case 0:
+ sub_80EA24C();
+ gUnknown_083DB694->unkBE++;
+ // fall through
+ case 1:
+ if (sub_80EA1E0() != 0)
+ {
+ sub_80EA4A4();
+ gUnknown_083DB694->unkBE++;
+ }
+ break;
+ case 2:
+ if (sub_80EA1E0() != 0)
+ {
+ sub_80EA704();
+ gUnknown_083DB694->unkBE++;
+ }
+ break;
+ case 3:
+ if (sub_80EA1E0() != 0)
+ gUnknown_083DB694->unkBE++;
+ break;
+ case 4:
+ gUnknown_083DB694->unkBE++;
+ break;
+ case 5:
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_80E9F50(void)
+{
+ switch (gUnknown_083DB694->unkBE)
+ {
+ case 0:
+ nullsub_23();
+ sub_80EA764();
+ gUnknown_083DB694->unkBE++;
+ // fall through
+ case 1:
+ if (sub_80EA1E0() != 0)
+ gUnknown_083DB694->unkBE++;
+ break;
+ case 2:
+ sub_80EA5A0();
+ gUnknown_083DB694->unkBE++;
+ // fall through
+ case 3:
+ if (sub_80EA1E0() != 0)
+ gUnknown_083DB694->unkBE++;
+ break;
+ case 4:
+ sub_80EA348();
+ gUnknown_083DB694->unkBE++;
+ // fall through
+ case 5:
+ if (sub_80EA1E0() != 0)
+ gUnknown_083DB694->unkBE++;
+ break;
+ case 6:
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_80E9FD4(void)
+{
+ switch (gUnknown_083DB694->unkBE)
+ {
+ case 0:
+ nullsub_23();
+ sub_80EA5A0();
+ gUnknown_083DB694->unkBE++;
+ // fall through
+ case 1:
+ if (sub_80EA1E0() != 0)
+ return TRUE;
+ break;
+ }
+ return FALSE;
+}
+
+bool8 sub_80EA014(void)
+{
+ switch (gUnknown_083DB694->unkBE)
+ {
+ case 0:
+ sub_80EA4A4();
+ gUnknown_083DB694->unkBE++;
+ // fall through
+ case 1:
+ if (sub_80EA1E0() != 0)
+ return TRUE;
+ break;
+ }
+ return FALSE;
+}
+
+bool8 sub_80EA050(void)
+{
+ switch (gUnknown_083DB694->unkBE)
+ {
+ case 0:
+ nullsub_23();
+ sub_80EA764();
+ gUnknown_083DB694->unkBE++;
+ break;
+ case 1:
+ if (sub_80EA1E0() != 0)
+ {
+ sub_80EA7F4();
+ gUnknown_083DB694->unkBE++;
+ }
+ break;
+ case 2:
+ sub_80E9108(1);
+ if (sub_80EA1E0() != 0)
+ {
+ sub_80EA8BC();
+ gUnknown_083DB694->unkBE++;
+ }
+ break;
+ case 3:
+ sub_80E9108(1);
+ if (sub_80EA1E0() != 0)
+ gUnknown_083DB694->unkBE++;
+ break;
+ case 4:
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_80EA0E4(void)
+{
+ switch (gUnknown_083DB694->unkBE)
+ {
+ case 0:
+ sub_80EA948();
+ gUnknown_083DB694->unkBE++;
+ // fall through
+ case 1:
+ sub_80E9108(-1);
+ if (sub_80EA1E0() != 0)
+ {
+ sub_80EAA44();
+ gUnknown_083DB694->unkBE++;
+ }
+ break;
+ case 2:
+ sub_80E9108(-1);
+ if (sub_80EA1E0() != 0)
+ {
+ sub_80EA704();
+ gUnknown_083DB694->unkBE++;
+ }
+ break;
+ case 3:
+ if (sub_80EA1E0() != 0)
+ gUnknown_083DB694->unkBE++;
+ break;
+ case 4:
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_80EA184(void)
+{
+ switch (gUnknown_083DB694->unkBE)
+ {
+ case 0:
+ sub_80EAAD4();
+ gUnknown_083DB694->unkBE++;
+ // fall through
+ case 1:
+ if (sub_80EA1E0() != 0)
+ gUnknown_083DB694->unkBE++;
+ break;
+ case 2:
+ sub_80E9178();
+ return TRUE;
+ }
+ return FALSE;
+}