1643 lines
35 KiB
C
1643 lines
35 KiB
C
#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
|
|
{
|
|
u16 unk0;
|
|
u16 windowId;
|
|
u16 unk4;
|
|
u8 unk6;
|
|
u8 unk7;
|
|
s8 unk8;
|
|
u8 unk9;
|
|
u8 unkA[0xC1];
|
|
u8 unkCC[0x200];
|
|
u16 unk2CE;
|
|
int unk2D0;
|
|
int unk2D4;
|
|
struct Sprite *unk2D8;
|
|
struct Sprite *unk2DC;
|
|
struct Sprite *unk2E0;
|
|
struct Sprite *unk2E4;
|
|
struct Sprite *unk2E8;
|
|
struct Sprite *unk2EC;
|
|
struct Sprite *unk2F0;
|
|
struct Sprite *unk2F4;
|
|
struct Sprite *unk2F8;
|
|
struct Sprite *unk2FC;
|
|
u16 unk300[BG_SCREEN_SIZE / 2];
|
|
u16 unkB00[BG_SCREEN_SIZE / 2];
|
|
};
|
|
|
|
struct EasyChatPhraseFrameDimensions
|
|
{
|
|
u8 left;
|
|
u8 top;
|
|
u8 width;
|
|
u8 height;
|
|
};
|
|
|
|
EWRAM_DATA struct Unk203A11C *gUnknown_203ACEC = NULL;
|
|
|
|
bool8 sub_8100258(void);
|
|
bool8 sub_8100290(void);
|
|
bool8 sub_8100374(void);
|
|
bool8 sub_81003A8(void);
|
|
bool8 sub_81003EC(void);
|
|
bool8 sub_8100430(void);
|
|
bool8 sub_8100474(void);
|
|
bool8 sub_81004B8(void);
|
|
bool8 sub_81004F4(void);
|
|
bool8 sub_81005C0(void);
|
|
bool8 sub_8100660(void);
|
|
bool8 sub_8100720(void);
|
|
bool8 sub_810072C(void);
|
|
bool8 sub_8100774(void);
|
|
bool8 sub_81007D0(void);
|
|
bool8 sub_8100890(void);
|
|
bool8 sub_810093C(void);
|
|
bool8 sub_81009F8(void);
|
|
bool8 sub_8100A04(void);
|
|
bool8 sub_8100A78(void);
|
|
bool8 sub_8100AE8(void);
|
|
bool8 sub_8100B70(void);
|
|
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);
|
|
void sub_8100F44(void);
|
|
void sub_8100FDC(void);
|
|
void sub_8101100(u16 *buffer);
|
|
void sub_81012CC(void);
|
|
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(int a0);
|
|
bool8 sub_81016AC(void);
|
|
void sub_81016E4(u8 a0);
|
|
void sub_8101830(int left, int top, int width, int height);
|
|
void sub_810198C(void);
|
|
void sub_81019B0(s16 a0, u8 a1);
|
|
bool8 sub_8101A10(void);
|
|
s32 sub_8101A48(void);
|
|
void sub_8101A5C(u8 left, u8 top, u8 right, u8 bottom);
|
|
void sub_8101A90(void);
|
|
void sub_8101AC4(void);
|
|
void sub_8101B58(u8 a0, u8 a1);
|
|
void sub_8101B88(void);
|
|
void sub_8101BA8(void);
|
|
void sub_8101BC0(void);
|
|
void sub_8101C48(void);
|
|
void sub_8101C80(void);
|
|
void sub_8101E80(void);
|
|
void sub_8101F04(void);
|
|
void sub_8101F80(void);
|
|
void sub_8101FAC(void);
|
|
bool8 sub_8102018(void);
|
|
void sub_81020AC(void);
|
|
bool8 sub_81020D0(void);
|
|
void sub_810215C(void);
|
|
void sub_8102178(void);
|
|
bool8 sub_81021B8(void);
|
|
void sub_81021D4(void);
|
|
void sub_810224C(void);
|
|
void sub_81022B0(void);
|
|
void sub_81022E0(u8 a0);
|
|
void sub_8102320(void);
|
|
void sub_8102394(void);
|
|
void sub_81023F8(void);
|
|
void sub_8102428(void);
|
|
|
|
const u16 gUnknown_843F3B8[] = INCBIN_U16("graphics/link_rfu/unk_843F3F8.gbapal");
|
|
const u16 gUnknown_843F3D8[] = INCBIN_U16("graphics/link_rfu/unk_8E9BD28.gbapal");
|
|
const u16 gUnknown_843F3F8[] = INCBIN_U16("graphics/link_rfu/unk_843F3F8.4bpp");
|
|
const u16 gUnknown_843F418[] = INCBIN_U16("graphics/link_rfu/unk_843F418.4bpp");
|
|
const u16 gUnknown_843F518[] = INCBIN_U16("graphics/link_rfu/unk_843F518.4bpp");
|
|
const u16 gUnknown_843F618[] = INCBIN_U16("graphics/link_rfu/unk_843F638.gbapal");
|
|
const u32 gUnknown_843F638[] = INCBIN_U32("graphics/link_rfu/unk_843F638.4bpp.lz");
|
|
const u16 gUnknown_843F76C[] = INCBIN_U16("graphics/link_rfu/unk_843F76C.gbapal");
|
|
const u16 gUnknown_843F78C[] = INCBIN_U16("graphics/link_rfu/unk_843F78C.gbapal");
|
|
const u32 gUnknown_843F7AC[] = INCBIN_U32("graphics/link_rfu/unk_843F7AC.4bpp.lz");
|
|
|
|
const u16 gUnknown_843F874[] = {
|
|
RGB( 0, 0, 0),
|
|
RGB( 0, 0, 0),
|
|
RGB( 7, 25, 31),
|
|
RGB(21, 21, 29)
|
|
};
|
|
|
|
const u16 gUnknown_843F87C[] = {
|
|
RGB( 0, 0, 0),
|
|
RGB(31, 31, 31),
|
|
RGB(12, 12, 12),
|
|
RGB(27, 26, 27),
|
|
RGB( 8, 17, 9)
|
|
};
|
|
|
|
const struct EasyChatPhraseFrameDimensions sPhraseFrameDimensions[] = {
|
|
{
|
|
.left = 0x03,
|
|
.top = 0x04,
|
|
.width = 0x18,
|
|
.height = 0x04
|
|
}, {
|
|
.left = 0x01,
|
|
.top = 0x04,
|
|
.width = 0x1b,
|
|
.height = 0x04
|
|
}, {
|
|
.left = 0x03,
|
|
.top = 0x00,
|
|
.width = 0x18,
|
|
.height = 0x0a
|
|
}, {
|
|
.left = 0x06,
|
|
.top = 0x06,
|
|
.width = 0x12,
|
|
.height = 0x04
|
|
}, {
|
|
.left = 0x10,
|
|
.top = 0x04,
|
|
.width = 0x09,
|
|
.height = 0x02
|
|
}, {
|
|
.left = 0x0e,
|
|
.top = 0x04,
|
|
.width = 0x12,
|
|
.height = 0x04
|
|
}
|
|
};
|
|
|
|
const struct BgTemplate sEasyChatBgTemplates[] = {
|
|
{
|
|
.bg = 0,
|
|
.charBaseIndex = 0,
|
|
.mapBaseIndex = 28,
|
|
.screenSize = 0,
|
|
.paletteMode = 0,
|
|
.priority = 0,
|
|
.baseTile = 0,
|
|
}, {
|
|
.bg = 1,
|
|
.charBaseIndex = 3,
|
|
.mapBaseIndex = 29,
|
|
.screenSize = 0,
|
|
.paletteMode = 0,
|
|
.priority = 1,
|
|
.baseTile = 0,
|
|
}, {
|
|
.bg = 2,
|
|
.charBaseIndex = 0,
|
|
.mapBaseIndex = 30,
|
|
.screenSize = 0,
|
|
.paletteMode = 0,
|
|
.priority = 2,
|
|
.baseTile = 0x80,
|
|
}, {
|
|
.bg = 3,
|
|
.charBaseIndex = 2,
|
|
.mapBaseIndex = 31,
|
|
.screenSize = 0,
|
|
.paletteMode = 0,
|
|
.priority = 3,
|
|
.baseTile = 0,
|
|
}
|
|
};
|
|
|
|
const struct WindowTemplate sEasyChatWindowTemplates[] = {
|
|
{
|
|
.bg = 1,
|
|
.tilemapLeft = 7,
|
|
.tilemapTop = 0,
|
|
.width = 16,
|
|
.height = 2,
|
|
.paletteNum = 10,
|
|
.baseBlock = 0x10,
|
|
},
|
|
{
|
|
.bg = 0,
|
|
.tilemapLeft = 4,
|
|
.tilemapTop = 15,
|
|
.width = 22,
|
|
.height = 4,
|
|
.paletteNum = 15,
|
|
.baseBlock = 0xA,
|
|
},
|
|
{
|
|
.bg = 2,
|
|
.tilemapLeft = 1,
|
|
.tilemapTop = 0,
|
|
.width = 28,
|
|
.height = 32,
|
|
.paletteNum = 3,
|
|
.baseBlock = 0,
|
|
},
|
|
DUMMY_WIN_TEMPLATE,
|
|
};
|
|
|
|
const struct WindowTemplate sEasyChatYesNoWindowTemplate = {
|
|
.bg = 0,
|
|
.tilemapLeft = 22,
|
|
.tilemapTop = 9,
|
|
.width = 5,
|
|
.height = 4,
|
|
.paletteNum = 15,
|
|
.baseBlock = 0x062
|
|
};
|
|
|
|
const u8 gUnknown_843F8D8[] = _("{UNDERSCORE}");
|
|
const u8 sText_Clear17[] = _("{CLEAR 17}");
|
|
|
|
const u8 *const sEasyChatKeyboardText[] = {
|
|
gUnknown_847A8D8,
|
|
gUnknown_847A8FA,
|
|
gUnknown_847A913,
|
|
gUnknown_847A934
|
|
};
|
|
|
|
bool8 sub_80FFF80(void)
|
|
{
|
|
if (!sub_8100BF4())
|
|
return FALSE;
|
|
else
|
|
return TRUE;
|
|
}
|
|
|
|
bool8 sub_80FFF98(void)
|
|
{
|
|
switch (gUnknown_203ACEC->unk0)
|
|
{
|
|
case 0:
|
|
ResetBgsAndClearDma3BusyFlags(0);
|
|
InitBgsFromTemplates(0, sEasyChatBgTemplates, NELEMS(sEasyChatBgTemplates));
|
|
SetBgTilemapBuffer(3, gUnknown_203ACEC->unkB00);
|
|
SetBgTilemapBuffer(1, gUnknown_203ACEC->unk300);
|
|
InitWindows(sEasyChatWindowTemplates);
|
|
DeactivateAllTextPrinters();
|
|
sub_8100CBC();
|
|
sub_8100C5C();
|
|
CpuFastFill(0, (void *)VRAM + 0x1000000, 0x400);
|
|
break;
|
|
case 1:
|
|
DecompressAndLoadBgGfxUsingHeap(3, gEasyChatWindow_Gfx, 0, 0, 0);
|
|
CopyToBgTilemapBuffer(3, gEasyChatWindow_Tilemap, 0, 0);
|
|
sub_8100F44();
|
|
sub_8102428();
|
|
CopyBgTilemapBufferToVram(3);
|
|
break;
|
|
case 2:
|
|
sub_8101100(gUnknown_203ACEC->unk300);
|
|
DecompressAndLoadBgGfxUsingHeap(1, gUnknown_843F7AC, 0, 0, 0);
|
|
CopyBgTilemapBufferToVram(1);
|
|
break;
|
|
case 3:
|
|
sub_8100D24();
|
|
sub_8100E34();
|
|
sub_8100FDC();
|
|
sub_81012CC();
|
|
break;
|
|
case 4:
|
|
sub_8101A90();
|
|
sub_8101AC4();
|
|
break;
|
|
case 5:
|
|
if (IsDma3ManagerBusyWithBgCopy())
|
|
{
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
sub_8101A5C(0, 0, 0, 0);
|
|
SetGpuReg(REG_OFFSET_WININ, WIN_RANGE(0, 63));
|
|
SetGpuReg(REG_OFFSET_WINOUT, WIN_RANGE(0, 59));
|
|
ShowBg(3);
|
|
ShowBg(1);
|
|
ShowBg(2);
|
|
ShowBg(0);
|
|
sub_81021D4();
|
|
sub_8102320();
|
|
}
|
|
break;
|
|
default:
|
|
return FALSE;
|
|
}
|
|
|
|
gUnknown_203ACEC->unk0++;
|
|
return TRUE;
|
|
}
|
|
|
|
void sub_810011C(void)
|
|
{
|
|
if (gUnknown_203ACEC)
|
|
Free(gUnknown_203ACEC);
|
|
}
|
|
|
|
void sub_8100134(u16 arg0)
|
|
{
|
|
gUnknown_203ACEC->unk4 = arg0;
|
|
gUnknown_203ACEC->unk0 = 0;
|
|
sub_810014C();
|
|
}
|
|
|
|
bool8 sub_810014C(void)
|
|
{
|
|
switch (gUnknown_203ACEC->unk4)
|
|
{
|
|
case 0: return FALSE;
|
|
case 1: return sub_8100258();
|
|
case 2: return sub_8100290();
|
|
case 3: return sub_8100374();
|
|
case 4: return sub_8100430();
|
|
case 5: return sub_81003A8();
|
|
case 6: return sub_81003EC();
|
|
case 7: return sub_8100474();
|
|
case 8: return sub_81004B8();
|
|
case 9: return sub_81004F4();
|
|
case 10: return sub_81005C0();
|
|
case 11: return sub_81007D0();
|
|
case 12: return sub_8100890();
|
|
case 13: return sub_810093C();
|
|
case 14: return sub_8100720();
|
|
case 15: return sub_810072C();
|
|
case 16: return sub_8100774();
|
|
case 17: return sub_81009F8();
|
|
case 18: return sub_8100A78();
|
|
case 19: return sub_8100A04();
|
|
case 20: return sub_8100B70();
|
|
case 21: return sub_8100AE8();
|
|
case 22: return sub_8100660();
|
|
default: return FALSE;
|
|
}
|
|
}
|
|
|
|
bool8 sub_8100258(void)
|
|
{
|
|
switch (gUnknown_203ACEC->unk0)
|
|
{
|
|
case 0:
|
|
sub_8100FDC();
|
|
gUnknown_203ACEC->unk0++;
|
|
break;
|
|
case 1:
|
|
return IsDma3ManagerBusyWithBgCopy();
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
bool8 sub_8100290(void)
|
|
{
|
|
u8 i;
|
|
u16 *ecWordBuffer;
|
|
u16 *ecWord;
|
|
u8 frameId;
|
|
u8 cursorColumn, cursorRow, numColumns;
|
|
s16 var1;
|
|
int stringWidth;
|
|
int trueStringWidth;
|
|
int var2;
|
|
u8 str[64];
|
|
|
|
ecWordBuffer = GetEasyChatWordBuffer();
|
|
frameId = GetEasyChatScreenFrameId();
|
|
cursorColumn = GetMainCursorColumn();
|
|
cursorRow = GetMainCursorRow();
|
|
numColumns = GetNumColumns();
|
|
ecWord = &ecWordBuffer[cursorRow * numColumns];
|
|
var1 = 8 * sPhraseFrameDimensions[frameId].left + 13;
|
|
for (i = 0; i < cursorColumn; i++)
|
|
{
|
|
if (*ecWord == 0xFFFF)
|
|
{
|
|
stringWidth = GetStringWidth(1, gUnknown_843F8D8, 0) * 7;
|
|
}
|
|
else
|
|
{
|
|
CopyEasyChatWord(str, *ecWord);
|
|
stringWidth = GetStringWidth(1, str, 0);
|
|
}
|
|
|
|
trueStringWidth = stringWidth + 17;
|
|
var1 += trueStringWidth;
|
|
ecWord++;
|
|
}
|
|
|
|
var2 = 8 * (sPhraseFrameDimensions[frameId].top + cursorRow * 2 + 1) + 1;
|
|
sub_8101B58(var1, var2);
|
|
return FALSE;
|
|
}
|
|
|
|
bool8 sub_8100374(void)
|
|
{
|
|
u8 xOffset;
|
|
switch (GetMainCursorColumn())
|
|
{
|
|
case 0:
|
|
xOffset = 28;
|
|
break;
|
|
case 1:
|
|
xOffset = 115;
|
|
break;
|
|
case 2:
|
|
xOffset = 191;
|
|
break;
|
|
default:
|
|
return FALSE;
|
|
}
|
|
sub_8101B58(xOffset, 97);
|
|
return FALSE;
|
|
}
|
|
|
|
bool8 sub_81003A8(void)
|
|
{
|
|
switch (gUnknown_203ACEC->unk0)
|
|
{
|
|
case 0:
|
|
sub_8101B88();
|
|
sub_8100E7C(2);
|
|
sub_8100F18(1);
|
|
gUnknown_203ACEC->unk0++;
|
|
break;
|
|
case 1:
|
|
return IsDma3ManagerBusyWithBgCopy();
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
bool8 sub_81003EC(void)
|
|
{
|
|
switch (gUnknown_203ACEC->unk0)
|
|
{
|
|
case 0:
|
|
sub_8101B88();
|
|
sub_8100E7C(3);
|
|
sub_8100F18(0);
|
|
gUnknown_203ACEC->unk0++;
|
|
break;
|
|
case 1:
|
|
return IsDma3ManagerBusyWithBgCopy();
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
bool8 sub_8100430(void)
|
|
{
|
|
switch (gUnknown_203ACEC->unk0)
|
|
{
|
|
case 0:
|
|
sub_8101B88();
|
|
sub_8100E7C(1);
|
|
sub_8100F18(1);
|
|
gUnknown_203ACEC->unk0++;
|
|
break;
|
|
case 1:
|
|
return IsDma3ManagerBusyWithBgCopy();
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
bool8 sub_8100474(void)
|
|
{
|
|
switch (gUnknown_203ACEC->unk0)
|
|
{
|
|
case 0:
|
|
sub_8101BA8();
|
|
sub_8100E7C(0);
|
|
ShowBg(0);
|
|
gUnknown_203ACEC->unk0++;
|
|
break;
|
|
case 1:
|
|
return IsDma3ManagerBusyWithBgCopy();
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
bool8 sub_81004B8(void)
|
|
{
|
|
switch (gUnknown_203ACEC->unk0)
|
|
{
|
|
case 0:
|
|
sub_8101BA8();
|
|
sub_8100E7C(0);
|
|
sub_8100FDC();
|
|
gUnknown_203ACEC->unk0++;
|
|
// Fall through
|
|
case 1:
|
|
return IsDma3ManagerBusyWithBgCopy();
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
bool8 sub_81004F4(void)
|
|
{
|
|
switch (gUnknown_203ACEC->unk0)
|
|
{
|
|
case 0:
|
|
sub_8101B88();
|
|
HideBg(0);
|
|
sub_8101A5C(0, 0, 0, 0);
|
|
sub_810131C();
|
|
gUnknown_203ACEC->unk0++;
|
|
break;
|
|
case 1:
|
|
if (!IsDma3ManagerBusyWithBgCopy())
|
|
{
|
|
sub_81015D4(0);
|
|
gUnknown_203ACEC->unk0++;
|
|
}
|
|
break;
|
|
case 2:
|
|
if (!IsDma3ManagerBusyWithBgCopy() && !sub_81016AC())
|
|
gUnknown_203ACEC->unk0++;
|
|
break;
|
|
case 3:
|
|
if (!IsDma3ManagerBusyWithBgCopy())
|
|
{
|
|
sub_8101FAC();
|
|
gUnknown_203ACEC->unk0++;
|
|
}
|
|
break;
|
|
case 4:
|
|
if (!sub_8102018())
|
|
{
|
|
sub_8101BC0();
|
|
sub_81022E0(0);
|
|
sub_810224C();
|
|
gUnknown_203ACEC->unk0++;
|
|
return FALSE;
|
|
}
|
|
break;
|
|
default:
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
bool8 sub_81005C0(void)
|
|
{
|
|
switch (gUnknown_203ACEC->unk0)
|
|
{
|
|
case 0:
|
|
sub_8101C48();
|
|
sub_81020AC();
|
|
sub_81022B0();
|
|
gUnknown_203ACEC->unk0++;
|
|
break;
|
|
case 1:
|
|
if (sub_81020D0() == TRUE)
|
|
break;
|
|
|
|
sub_81015D4(1);
|
|
gUnknown_203ACEC->unk0++;
|
|
// Fall through
|
|
case 2:
|
|
if (!sub_81016AC())
|
|
gUnknown_203ACEC->unk0++;
|
|
break;
|
|
case 3:
|
|
if (!IsDma3ManagerBusyWithBgCopy())
|
|
{
|
|
sub_8101BA8();
|
|
ShowBg(0);
|
|
gUnknown_203ACEC->unk0++;
|
|
}
|
|
break;
|
|
case 4:
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
bool8 sub_8100660(void)
|
|
{
|
|
switch (gUnknown_203ACEC->unk0)
|
|
{
|
|
case 0:
|
|
sub_8101C48();
|
|
sub_81022B0();
|
|
sub_810215C();
|
|
sub_81015D4(5);
|
|
gUnknown_203ACEC->unk0++;
|
|
break;
|
|
case 1:
|
|
if (!sub_81016AC() && !sub_81021B8())
|
|
{
|
|
sub_810131C();
|
|
gUnknown_203ACEC->unk0++;
|
|
}
|
|
break;
|
|
case 2:
|
|
if (!IsDma3ManagerBusyWithBgCopy())
|
|
{
|
|
sub_81015D4(6);
|
|
sub_8102178();
|
|
gUnknown_203ACEC->unk0++;
|
|
}
|
|
break;
|
|
case 3:
|
|
if (!sub_81016AC() && !sub_81021B8())
|
|
{
|
|
sub_810224C();
|
|
sub_8101BC0();
|
|
gUnknown_203ACEC->unk0++;
|
|
return FALSE;
|
|
}
|
|
break;
|
|
case 4:
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
bool8 sub_8100720(void)
|
|
{
|
|
sub_8101C80();
|
|
return FALSE;
|
|
}
|
|
|
|
bool8 sub_810072C(void)
|
|
{
|
|
switch (gUnknown_203ACEC->unk0)
|
|
{
|
|
case 0:
|
|
sub_81019B0(1, 2);
|
|
gUnknown_203ACEC->unk0++;
|
|
// Fall through
|
|
case 1:
|
|
if (!sub_8101A10())
|
|
{
|
|
sub_8101C80();
|
|
sub_810224C();
|
|
return FALSE;
|
|
}
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
bool8 sub_8100774(void)
|
|
{
|
|
switch (gUnknown_203ACEC->unk0)
|
|
{
|
|
case 0:
|
|
sub_81019B0(-1, 2);
|
|
gUnknown_203ACEC->unk0++;
|
|
// Fall through
|
|
case 1:
|
|
if (!sub_8101A10())
|
|
{
|
|
sub_810224C();
|
|
gUnknown_203ACEC->unk0++;
|
|
return FALSE;
|
|
}
|
|
break;
|
|
case 2:
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
bool8 sub_81007D0(void)
|
|
{
|
|
switch (gUnknown_203ACEC->unk0)
|
|
{
|
|
case 0:
|
|
sub_8101C48();
|
|
sub_81020AC();
|
|
sub_81022B0();
|
|
gUnknown_203ACEC->unk0++;
|
|
break;
|
|
case 1:
|
|
if (!sub_81020D0())
|
|
{
|
|
sub_81015BC();
|
|
gUnknown_203ACEC->unk0++;
|
|
}
|
|
break;
|
|
case 2:
|
|
if (!IsDma3ManagerBusyWithBgCopy())
|
|
{
|
|
sub_81015D4(2);
|
|
gUnknown_203ACEC->unk0++;
|
|
}
|
|
break;
|
|
case 3:
|
|
if (!sub_81016AC())
|
|
{
|
|
sub_81012E0(2);
|
|
gUnknown_203ACEC->unk0++;
|
|
}
|
|
break;
|
|
case 4:
|
|
if (!IsDma3ManagerBusyWithBgCopy())
|
|
{
|
|
sub_8101E80();
|
|
sub_81022E0(1);
|
|
sub_810224C();
|
|
sub_8102394();
|
|
gUnknown_203ACEC->unk0++;
|
|
return FALSE;
|
|
}
|
|
break;
|
|
case 5:
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
bool8 sub_8100890(void)
|
|
{
|
|
switch (gUnknown_203ACEC->unk0)
|
|
{
|
|
case 0:
|
|
sub_8100FDC();
|
|
gUnknown_203ACEC->unk0++;
|
|
break;
|
|
case 1:
|
|
sub_8101F80();
|
|
sub_81022B0();
|
|
sub_81023F8();
|
|
sub_81015BC();
|
|
gUnknown_203ACEC->unk0++;
|
|
break;
|
|
case 2:
|
|
if (!IsDma3ManagerBusyWithBgCopy())
|
|
{
|
|
sub_81015D4(3);
|
|
gUnknown_203ACEC->unk0++;
|
|
}
|
|
break;
|
|
case 3:
|
|
if (!sub_81016AC())
|
|
{
|
|
ShowBg(0);
|
|
gUnknown_203ACEC->unk0++;
|
|
}
|
|
break;
|
|
case 4:
|
|
if (!IsDma3ManagerBusyWithBgCopy())
|
|
{
|
|
sub_8101BA8();
|
|
gUnknown_203ACEC->unk0++;
|
|
return FALSE;
|
|
}
|
|
break;
|
|
case 5:
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
bool8 sub_810093C(void)
|
|
{
|
|
switch (gUnknown_203ACEC->unk0)
|
|
{
|
|
case 0:
|
|
sub_8101F80();
|
|
sub_81022B0();
|
|
sub_81023F8();
|
|
sub_81015BC();
|
|
gUnknown_203ACEC->unk0++;
|
|
break;
|
|
case 1:
|
|
if (!IsDma3ManagerBusyWithBgCopy())
|
|
{
|
|
sub_81015D4(4);
|
|
gUnknown_203ACEC->unk0++;
|
|
}
|
|
break;
|
|
case 2:
|
|
if (!sub_81016AC())
|
|
{
|
|
sub_810131C();
|
|
gUnknown_203ACEC->unk0++;
|
|
}
|
|
break;
|
|
case 3:
|
|
if (!IsDma3ManagerBusyWithBgCopy())
|
|
{
|
|
sub_8101FAC();
|
|
gUnknown_203ACEC->unk0++;
|
|
}
|
|
break;
|
|
case 4:
|
|
if (!sub_8102018())
|
|
{
|
|
sub_8101BC0();
|
|
sub_81022E0(0);
|
|
sub_810224C();
|
|
gUnknown_203ACEC->unk0++;
|
|
return FALSE;
|
|
}
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
bool8 sub_81009F8(void)
|
|
{
|
|
sub_8101F04();
|
|
return FALSE;
|
|
}
|
|
|
|
bool8 sub_8100A04(void)
|
|
{
|
|
switch (gUnknown_203ACEC->unk0)
|
|
{
|
|
case 0:
|
|
sub_81013EC();
|
|
gUnknown_203ACEC->unk0++;
|
|
break;
|
|
case 1:
|
|
if (!IsDma3ManagerBusyWithBgCopy())
|
|
{
|
|
sub_81019B0(1, 2);
|
|
gUnknown_203ACEC->unk0++;
|
|
}
|
|
break;
|
|
case 2:
|
|
if (!sub_8101A10())
|
|
{
|
|
sub_8101F04();
|
|
sub_810224C();
|
|
sub_8102394();
|
|
gUnknown_203ACEC->unk0++;
|
|
return FALSE;
|
|
}
|
|
break;
|
|
case 3:
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
bool8 sub_8100A78(void)
|
|
{
|
|
switch (gUnknown_203ACEC->unk0)
|
|
{
|
|
case 0:
|
|
sub_8101410();
|
|
gUnknown_203ACEC->unk0++;
|
|
break;
|
|
case 1:
|
|
if (!IsDma3ManagerBusyWithBgCopy())
|
|
{
|
|
sub_81019B0(-1, 2);
|
|
gUnknown_203ACEC->unk0++;
|
|
}
|
|
break;
|
|
case 2:
|
|
if (!sub_8101A10())
|
|
{
|
|
sub_810224C();
|
|
sub_8102394();
|
|
gUnknown_203ACEC->unk0++;
|
|
return FALSE;
|
|
}
|
|
break;
|
|
case 3:
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
bool8 sub_8100AE8(void)
|
|
{
|
|
switch (gUnknown_203ACEC->unk0)
|
|
{
|
|
case 0:
|
|
sub_8101434();
|
|
gUnknown_203ACEC->unk0++;
|
|
break;
|
|
case 1:
|
|
if (!IsDma3ManagerBusyWithBgCopy())
|
|
{
|
|
s16 var0 = sub_80FFE48() - sub_8101A48();
|
|
sub_81019B0(var0, 4);
|
|
gUnknown_203ACEC->unk0++;
|
|
}
|
|
break;
|
|
case 2:
|
|
if (!sub_8101A10())
|
|
{
|
|
sub_8101F04();
|
|
sub_810224C();
|
|
sub_8102394();
|
|
gUnknown_203ACEC->unk0++;
|
|
return FALSE;
|
|
}
|
|
break;
|
|
case 3:
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
bool8 sub_8100B70(void)
|
|
{
|
|
switch (gUnknown_203ACEC->unk0)
|
|
{
|
|
case 0:
|
|
sub_8101478();
|
|
gUnknown_203ACEC->unk0++;
|
|
break;
|
|
case 1:
|
|
if (!IsDma3ManagerBusyWithBgCopy())
|
|
{
|
|
s16 var0 = sub_80FFE48() - sub_8101A48();
|
|
sub_81019B0(var0, 4);
|
|
gUnknown_203ACEC->unk0++;
|
|
}
|
|
break;
|
|
case 2:
|
|
if (!sub_8101A10())
|
|
{
|
|
sub_810224C();
|
|
sub_8102394();
|
|
gUnknown_203ACEC->unk0++;
|
|
return FALSE;
|
|
}
|
|
break;
|
|
case 3:
|
|
return FALSE;
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
void sub_81015BC(void)
|
|
{
|
|
FillWindowPixelBuffer(2, PIXEL_FILL(1));
|
|
CopyWindowToVram(2, 2);
|
|
}
|
|
|
|
void sub_81015D4(int arg0)
|
|
{
|
|
switch (arg0)
|
|
{
|
|
case 0:
|
|
gUnknown_203ACEC->unk6 = 0;
|
|
gUnknown_203ACEC->unk7 = 10;
|
|
break;
|
|
case 1:
|
|
gUnknown_203ACEC->unk6 = 9;
|
|
gUnknown_203ACEC->unk7 = 0;
|
|
break;
|
|
case 2:
|
|
gUnknown_203ACEC->unk6 = 11;
|
|
gUnknown_203ACEC->unk7 = 17;
|
|
break;
|
|
case 3:
|
|
gUnknown_203ACEC->unk6 = 17;
|
|
gUnknown_203ACEC->unk7 = 0;
|
|
break;
|
|
case 4:
|
|
gUnknown_203ACEC->unk6 = 17;
|
|
gUnknown_203ACEC->unk7 = 10;
|
|
break;
|
|
case 5:
|
|
gUnknown_203ACEC->unk6 = 18;
|
|
gUnknown_203ACEC->unk7 = 22;
|
|
break;
|
|
case 6:
|
|
gUnknown_203ACEC->unk6 = 22;
|
|
gUnknown_203ACEC->unk7 = 18;
|
|
break;
|
|
}
|
|
|
|
gUnknown_203ACEC->unk8 = gUnknown_203ACEC->unk6 < gUnknown_203ACEC->unk7 ? 1 : -1;
|
|
}
|
|
|
|
bool8 sub_81016AC(void)
|
|
{
|
|
u8 var0, var1;
|
|
if (gUnknown_203ACEC->unk6 == gUnknown_203ACEC->unk7)
|
|
return FALSE;
|
|
|
|
gUnknown_203ACEC->unk6 += gUnknown_203ACEC->unk8;
|
|
sub_81016E4(gUnknown_203ACEC->unk6);
|
|
var0 = gUnknown_203ACEC->unk6;
|
|
var1 = gUnknown_203ACEC->unk7;
|
|
return (var0 ^ var1) > 0;
|
|
}
|
|
|
|
void sub_81016E4(u8 arg0)
|
|
{
|
|
FillBgTilemapBufferRect_Palette0(1, 0, 0, 10, 30, 10);
|
|
switch (arg0)
|
|
{
|
|
case 0:
|
|
break;
|
|
case 1:
|
|
sub_8101830(11, 14, 3, 2);
|
|
break;
|
|
case 2:
|
|
sub_8101830(9, 14, 7, 2);
|
|
break;
|
|
case 3:
|
|
sub_8101830(7, 14, 11, 2);
|
|
break;
|
|
case 4:
|
|
sub_8101830(5, 14, 15, 2);
|
|
break;
|
|
case 5:
|
|
sub_8101830(3, 14, 19, 2);
|
|
break;
|
|
case 6:
|
|
sub_8101830(1, 14, 23, 2);
|
|
break;
|
|
case 11:
|
|
sub_8101830(1, 10, 24, 10);
|
|
break;
|
|
case 12:
|
|
sub_8101830(1, 10, 25, 10);
|
|
break;
|
|
case 13:
|
|
sub_8101830(1, 10, 26, 10);
|
|
break;
|
|
case 14:
|
|
sub_8101830(1, 10, 27, 10);
|
|
break;
|
|
case 15:
|
|
sub_8101830(1, 10, 28, 10);
|
|
break;
|
|
case 16:
|
|
sub_8101830(1, 10, 29, 10);
|
|
break;
|
|
case 17:
|
|
sub_8101830(0, 10, 30, 10);
|
|
break;
|
|
case 10:
|
|
case 18:
|
|
sub_8101830(1, 10, 23, 10);
|
|
break;
|
|
case 9:
|
|
case 19:
|
|
sub_8101830(1, 11, 23, 8);
|
|
break;
|
|
case 8:
|
|
case 20:
|
|
sub_8101830(1, 12, 23, 6);
|
|
break;
|
|
case 7:
|
|
case 21:
|
|
sub_8101830(1, 13, 23, 4);
|
|
break;
|
|
case 22:
|
|
sub_8101830(1, 14, 23, 2);
|
|
break;
|
|
}
|
|
|
|
CopyBgTilemapBufferToVram(1);
|
|
}
|
|
|
|
void sub_8101830(int left, int top, int width, int height)
|
|
{
|
|
u16 *tilemap;
|
|
int right;
|
|
int bottom;
|
|
int x, y;
|
|
|
|
tilemap = gUnknown_203ACEC->unk300;
|
|
right = left + width - 1;
|
|
bottom = top + height - 1;
|
|
x = left;
|
|
y = top;
|
|
tilemap[y * 32 + x] = 0x4001;
|
|
x++;
|
|
for (; x < right; x++)
|
|
tilemap[y * 32 + x] = 0x4002;
|
|
|
|
tilemap[y * 32 + x] = 0x4003;
|
|
y++;
|
|
for (; y < bottom; y++)
|
|
{
|
|
tilemap[y * 32 + left] = 0x4005;
|
|
x = left + 1;
|
|
for (; x < right; x++)
|
|
tilemap[y * 32 + x] = 0x4000;
|
|
|
|
tilemap[y * 32 + x] = 0x4007;
|
|
}
|
|
|
|
tilemap[y * 32 + left] = 0x4009;
|
|
x = left + 1;
|
|
for (; x < right; x++)
|
|
tilemap[y * 32 + x] = 0x400A;
|
|
|
|
tilemap[y * 32 + x] = 0x400B;
|
|
sub_8101A5C((left + 1) * 8, (top + 1) * 8, (width - 2) * 8, (height - 2) * 8);
|
|
}
|
|
|
|
void sub_810198C(void)
|
|
{
|
|
ChangeBgY(2, 0x800, 0);
|
|
gUnknown_203ACEC->unk2CE = 0;
|
|
}
|
|
|
|
void sub_81019B0(s16 arg0, u8 arg1)
|
|
{
|
|
int bgY;
|
|
s16 var0;
|
|
|
|
bgY = GetBgY(2);
|
|
gUnknown_203ACEC->unk2CE += arg0;
|
|
var0 = arg0 * 16;
|
|
bgY += var0 << 8;
|
|
if (arg1)
|
|
{
|
|
gUnknown_203ACEC->unk2D0 = bgY;
|
|
gUnknown_203ACEC->unk2D4 = arg1 * 256;
|
|
if (var0 < 0)
|
|
gUnknown_203ACEC->unk2D4 = -gUnknown_203ACEC->unk2D4;
|
|
}
|
|
else
|
|
{
|
|
ChangeBgY(2, bgY, 0);
|
|
}
|
|
}
|
|
|
|
bool8 sub_8101A10(void)
|
|
{
|
|
int bgY;
|
|
|
|
bgY = GetBgY(2);
|
|
if (bgY == gUnknown_203ACEC->unk2D0)
|
|
{
|
|
return FALSE;
|
|
}
|
|
else
|
|
{
|
|
ChangeBgY(2, gUnknown_203ACEC->unk2D4, 1);
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
int sub_8101A48(void)
|
|
{
|
|
return gUnknown_203ACEC->unk2CE;
|
|
}
|
|
|
|
void sub_8101A5C(u8 left, u8 top, u8 width, u8 height)
|
|
{
|
|
u16 horizontalDimensions = WIN_RANGE(left, left + width);
|
|
u16 verticalDimensions = WIN_RANGE(top, top + height);
|
|
SetGpuReg(REG_OFFSET_WIN0H, horizontalDimensions);
|
|
SetGpuReg(REG_OFFSET_WIN0V, verticalDimensions);
|
|
}
|