438 lines
13 KiB
C
438 lines
13 KiB
C
#include "global.h"
|
|
#include "bg.h"
|
|
#include "palette.h"
|
|
#include "window.h"
|
|
#include "text.h"
|
|
#include "new_menu_helpers.h"
|
|
#include "text_window.h"
|
|
#include "menu.h"
|
|
#include "menu_helpers.h"
|
|
|
|
#define STD_WINDOW_PALETTE_NUM 14
|
|
#define STD_WINDOW_BASE_TILE_NUM 0x214
|
|
#define DLG_WINDOW_PALETTE_NUM 15
|
|
#define DLG_WINDOW_BASE_TILE_NUM 0x200
|
|
|
|
static EWRAM_DATA u8 gUnknown_0203CD8C = 0;
|
|
static EWRAM_DATA u8 gUnknown_0203CD8D = 0;
|
|
|
|
const u16 gUnknown_0860F074[] = INCBIN_U16("graphics/interface/860F074.gbapal");
|
|
static const u8 gUnknown_0860F094[] = { 8, 4, 1 };
|
|
|
|
static const struct WindowTemplate gUnknown_0860F098[] =
|
|
{
|
|
{ 0x00, 0x02, 0x0F, 0x1B, 0x04, 0x0F, 0x194 },
|
|
DUMMY_WIN_TEMPLATE
|
|
};
|
|
|
|
static const struct WindowTemplate gUnknown_0860F0A8 =
|
|
{
|
|
0x00, 0x15, 0x09, 0x05, 0x04, 0x0F, 0x125
|
|
};
|
|
|
|
// Forward declarations
|
|
extern void sub_81973A4(void);
|
|
extern void DrawStandardFrame(u8, u8, u8, u8, u8, u8);
|
|
extern void DrawDialogueFrame(u8, u8, u8, u8, u8, u8);
|
|
extern void sub_81977BC(u8, u8, u8, u8, u8, u8);
|
|
extern void sub_8197804(u8, u8, u8, u8, u8, u8);
|
|
|
|
void sub_81971D0(void)
|
|
{
|
|
InitWindows(gUnknown_0860F098);
|
|
gUnknown_0203CD8C = 0xFF;
|
|
gUnknown_0203CD8D = 0xFF;
|
|
}
|
|
|
|
void sub_81971F4(void)
|
|
{
|
|
FreeAllWindowBuffers();
|
|
}
|
|
|
|
void sub_8197200(void)
|
|
{
|
|
ChangeBgX(0, 0, 0);
|
|
ChangeBgY(0, 0, 0);
|
|
DeactivateAllTextPrinters();
|
|
sub_81973A4();
|
|
}
|
|
|
|
u16 sub_8197224(void)
|
|
{
|
|
RunTextPrinters();
|
|
return IsTextPrinterActive(0);
|
|
}
|
|
|
|
u16 AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 *str, u8 speed, void (*callback)(struct TextSubPrinter *, u16), u8 fgColor, u8 bgColor, u8 shadowColor)
|
|
{
|
|
struct TextSubPrinter printer;
|
|
|
|
printer.current_text_offset = str;
|
|
printer.windowId = windowId;
|
|
printer.fontId = fontId;
|
|
printer.x = 0;
|
|
printer.y = 1;
|
|
printer.currentX = 0;
|
|
printer.currentY = 1;
|
|
printer.letterSpacing = 0;
|
|
printer.lineSpacing = 0;
|
|
printer.fontColor_l = 0;
|
|
printer.fgColor = fgColor;
|
|
printer.bgColor = bgColor;
|
|
printer.shadowColor = shadowColor;
|
|
|
|
gTextFlags.flag_1 = 0;
|
|
return AddTextPrinter(&printer, speed, callback);
|
|
}
|
|
|
|
void AddTextPrinterForMessage(bool8 allowSkippingDelayWithButtonPress)
|
|
{
|
|
void (*callback)(struct TextSubPrinter *, u16) = NULL;
|
|
gTextFlags.flag_0 = allowSkippingDelayWithButtonPress;
|
|
AddTextPrinterParameterized(0, 1, gStringVar4, GetPlayerTextSpeed(), callback, 2, 1, 3);
|
|
}
|
|
|
|
void AddTextPrinterForMessage_2(bool8 allowSkippingDelayWithButtonPress)
|
|
{
|
|
gTextFlags.flag_0 = allowSkippingDelayWithButtonPress;
|
|
AddTextPrinterParameterized(0, 1, gStringVar4, GetPlayerTextSpeed(), NULL, 2, 1, 3);
|
|
}
|
|
|
|
void AddTextPrinterWithCustomSpeedForMessage(bool8 allowSkippingDelayWithButtonPress, u8 speed)
|
|
{
|
|
gTextFlags.flag_0 = allowSkippingDelayWithButtonPress;
|
|
AddTextPrinterParameterized(0, 1, gStringVar4, speed, NULL, 2, 1, 3);
|
|
}
|
|
|
|
void sub_81973A4(void)
|
|
{
|
|
copy_textbox_border_tile_patterns_to_vram(0, DLG_WINDOW_BASE_TILE_NUM, 0xF0);
|
|
sub_809882C(0, STD_WINDOW_BASE_TILE_NUM, 0xE0);
|
|
}
|
|
|
|
void NewMenuHelpers_DrawDialogueFrame(u8 windowId, bool8 copyToVram)
|
|
{
|
|
CallWindowFunction(windowId, DrawDialogueFrame);
|
|
FillWindowPixelBuffer(windowId, 0x11);
|
|
PutWindowTilemap(windowId);
|
|
if (copyToVram == TRUE)
|
|
CopyWindowToVram(windowId, 3);
|
|
}
|
|
|
|
void NewMenuHelpers_DrawStdWindowFrame(u8 windowId, bool8 copyToVram)
|
|
{
|
|
CallWindowFunction(windowId, DrawStandardFrame);
|
|
FillWindowPixelBuffer(windowId, 0x11);
|
|
PutWindowTilemap(windowId);
|
|
if (copyToVram == TRUE)
|
|
CopyWindowToVram(windowId, 3);
|
|
}
|
|
|
|
void sub_8197434(u8 windowId, bool8 copyToVram)
|
|
{
|
|
CallWindowFunction(windowId, sub_8197804);
|
|
FillWindowPixelBuffer(windowId, 0x11);
|
|
ClearWindowTilemap(windowId);
|
|
if (copyToVram == TRUE)
|
|
CopyWindowToVram(windowId, 3);
|
|
}
|
|
|
|
void sub_819746C(u8 windowId, bool8 copyToVram)
|
|
{
|
|
CallWindowFunction(windowId, sub_81977BC);
|
|
FillWindowPixelBuffer(windowId, 0x11);
|
|
ClearWindowTilemap(windowId);
|
|
if (copyToVram == TRUE)
|
|
CopyWindowToVram(windowId, 3);
|
|
}
|
|
|
|
void DrawStandardFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)
|
|
{
|
|
int i;
|
|
|
|
FillBgTilemapBufferRect(bg,
|
|
STD_WINDOW_BASE_TILE_NUM + 0,
|
|
tilemapLeft - 1,
|
|
tilemapTop - 1,
|
|
1,
|
|
1,
|
|
STD_WINDOW_PALETTE_NUM);
|
|
FillBgTilemapBufferRect(bg,
|
|
STD_WINDOW_BASE_TILE_NUM + 1,
|
|
tilemapLeft,
|
|
tilemapTop - 1,
|
|
width,
|
|
1,
|
|
STD_WINDOW_PALETTE_NUM);
|
|
FillBgTilemapBufferRect(bg,
|
|
STD_WINDOW_BASE_TILE_NUM + 2,
|
|
tilemapLeft + width,
|
|
tilemapTop - 1,
|
|
1,
|
|
1,
|
|
STD_WINDOW_PALETTE_NUM);
|
|
|
|
for (i = tilemapTop; i < tilemapTop + height; i++)
|
|
{
|
|
FillBgTilemapBufferRect(bg,
|
|
STD_WINDOW_BASE_TILE_NUM + 3,
|
|
tilemapLeft - 1,
|
|
i,
|
|
1,
|
|
1,
|
|
STD_WINDOW_PALETTE_NUM);
|
|
FillBgTilemapBufferRect(bg,
|
|
STD_WINDOW_BASE_TILE_NUM + 5,
|
|
tilemapLeft + width,
|
|
i,
|
|
1,
|
|
1,
|
|
STD_WINDOW_PALETTE_NUM);
|
|
}
|
|
|
|
FillBgTilemapBufferRect(bg,
|
|
STD_WINDOW_BASE_TILE_NUM + 6,
|
|
tilemapLeft - 1,
|
|
tilemapTop + height,
|
|
1,
|
|
1,
|
|
STD_WINDOW_PALETTE_NUM);
|
|
FillBgTilemapBufferRect(bg,
|
|
STD_WINDOW_BASE_TILE_NUM + 7,
|
|
tilemapLeft,
|
|
tilemapTop + height,
|
|
width,
|
|
1,
|
|
STD_WINDOW_PALETTE_NUM);
|
|
FillBgTilemapBufferRect(bg,
|
|
STD_WINDOW_BASE_TILE_NUM + 8,
|
|
tilemapLeft + width,
|
|
tilemapTop + height,
|
|
1,
|
|
1,
|
|
STD_WINDOW_PALETTE_NUM);
|
|
}
|
|
|
|
void DrawDialogueFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)
|
|
{
|
|
FillBgTilemapBufferRect(bg,
|
|
DLG_WINDOW_BASE_TILE_NUM + 1,
|
|
tilemapLeft - 2,
|
|
tilemapTop - 1,
|
|
1,
|
|
1,
|
|
DLG_WINDOW_PALETTE_NUM);
|
|
FillBgTilemapBufferRect(bg,
|
|
DLG_WINDOW_BASE_TILE_NUM + 3,
|
|
tilemapLeft - 1,
|
|
tilemapTop - 1,
|
|
1,
|
|
1,
|
|
DLG_WINDOW_PALETTE_NUM);
|
|
FillBgTilemapBufferRect(bg,
|
|
DLG_WINDOW_BASE_TILE_NUM + 4,
|
|
tilemapLeft,
|
|
tilemapTop - 1,
|
|
width - 1,
|
|
1,
|
|
DLG_WINDOW_PALETTE_NUM);
|
|
FillBgTilemapBufferRect(bg,
|
|
DLG_WINDOW_BASE_TILE_NUM + 5,
|
|
tilemapLeft + width - 1,
|
|
tilemapTop - 1,
|
|
1,
|
|
1,
|
|
DLG_WINDOW_PALETTE_NUM);
|
|
FillBgTilemapBufferRect(bg,
|
|
DLG_WINDOW_BASE_TILE_NUM + 6,
|
|
tilemapLeft + width,
|
|
tilemapTop - 1,
|
|
1,
|
|
1,
|
|
DLG_WINDOW_PALETTE_NUM);
|
|
FillBgTilemapBufferRect(bg,
|
|
DLG_WINDOW_BASE_TILE_NUM + 7,
|
|
tilemapLeft - 2,
|
|
tilemapTop,
|
|
1,
|
|
5,
|
|
DLG_WINDOW_PALETTE_NUM);
|
|
FillBgTilemapBufferRect(bg,
|
|
DLG_WINDOW_BASE_TILE_NUM + 9,
|
|
tilemapLeft - 1,
|
|
tilemapTop,
|
|
width + 1,
|
|
5,
|
|
DLG_WINDOW_PALETTE_NUM);
|
|
FillBgTilemapBufferRect(bg,
|
|
DLG_WINDOW_BASE_TILE_NUM + 10,
|
|
tilemapLeft + width,
|
|
tilemapTop,
|
|
1,
|
|
5,
|
|
DLG_WINDOW_PALETTE_NUM);
|
|
FillBgTilemapBufferRect(bg,
|
|
BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 1),
|
|
tilemapLeft - 2,
|
|
tilemapTop + height,
|
|
1,
|
|
1,
|
|
DLG_WINDOW_PALETTE_NUM);
|
|
FillBgTilemapBufferRect(bg,
|
|
BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 3),
|
|
tilemapLeft - 1,
|
|
tilemapTop + height,
|
|
1,
|
|
1,
|
|
DLG_WINDOW_PALETTE_NUM);
|
|
FillBgTilemapBufferRect(bg,
|
|
BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 4),
|
|
tilemapLeft,
|
|
tilemapTop + height,
|
|
width - 1,
|
|
1,
|
|
DLG_WINDOW_PALETTE_NUM);
|
|
FillBgTilemapBufferRect(bg,
|
|
BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 5),
|
|
tilemapLeft + width - 1,
|
|
tilemapTop + height,
|
|
1,
|
|
1,
|
|
DLG_WINDOW_PALETTE_NUM);
|
|
FillBgTilemapBufferRect(bg,
|
|
BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 6),
|
|
tilemapLeft + width,
|
|
tilemapTop + height,
|
|
1,
|
|
1,
|
|
DLG_WINDOW_PALETTE_NUM);
|
|
}
|
|
|
|
void sub_81977BC(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)
|
|
{
|
|
FillBgTilemapBufferRect(bg, 0, tilemapLeft - 1, tilemapTop - 1, width + 2, height + 2, STD_WINDOW_PALETTE_NUM);
|
|
}
|
|
|
|
void sub_8197804(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)
|
|
{
|
|
FillBgTilemapBufferRect(bg, 0, tilemapLeft - 3, tilemapTop - 1, width + 6, height + 2, STD_WINDOW_PALETTE_NUM);
|
|
}
|
|
|
|
void SetStandardWindowBorderStyle(u8 windowId, bool8 copyToVram)
|
|
{
|
|
SetWindowBorderStyle(windowId, copyToVram, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM);
|
|
}
|
|
|
|
void sub_819786C(u8 windowId, bool8 copyToVram)
|
|
{
|
|
copy_textbox_border_tile_patterns_to_vram(windowId, DLG_WINDOW_BASE_TILE_NUM, 0xF0);
|
|
sub_8197B1C(windowId, copyToVram, DLG_WINDOW_BASE_TILE_NUM, 0xF);
|
|
}
|
|
|
|
void sub_819789C(void)
|
|
{
|
|
LoadPalette(gUnknown_0860F074, 0xE0, 0x14);
|
|
}
|
|
|
|
void sub_81978B0(u16 offset)
|
|
{
|
|
LoadPalette(gUnknown_0860F074, offset, 0x14);
|
|
}
|
|
|
|
const u16 *sub_81978C8(void)
|
|
{
|
|
return gUnknown_0860F074;
|
|
}
|
|
|
|
u16 sub_81978D0(u8 colorNum)
|
|
{
|
|
if (colorNum > 15)
|
|
colorNum = 0;
|
|
return gUnknown_0860F074[colorNum];
|
|
}
|
|
|
|
void DisplayItemMessageOnField(u8 taskId, const u8 *string, TaskFunc callback)
|
|
{
|
|
sub_81973A4();
|
|
DisplayMessageAndContinueTask(taskId, 0, DLG_WINDOW_BASE_TILE_NUM, DLG_WINDOW_PALETTE_NUM, 1, GetPlayerTextSpeed(), string, callback);
|
|
CopyWindowToVram(0, 3);
|
|
}
|
|
|
|
void sub_8197930(void)
|
|
{
|
|
CreateYesNoMenu(&gUnknown_0860F0A8, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM, 0);
|
|
}
|
|
|
|
void sub_8197948(u8 initialCursorPos)
|
|
{
|
|
CreateYesNoMenu(&gUnknown_0860F0A8, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM, initialCursorPos);
|
|
}
|
|
|
|
u32 sub_8197964(void)
|
|
{
|
|
if (gTextFlags.flag_3)
|
|
return 1;
|
|
return gSaveBlock2Ptr->optionsTextSpeed;
|
|
}
|
|
|
|
u8 GetPlayerTextSpeed(void)
|
|
{
|
|
u32 speed;
|
|
if (gSaveBlock2Ptr->optionsTextSpeed > 2)
|
|
gSaveBlock2Ptr->optionsTextSpeed = 1;
|
|
speed = sub_8197964();
|
|
return gUnknown_0860F094[speed];
|
|
}
|
|
|
|
u8 sub_81979C4(u8 a1)
|
|
{
|
|
if (gUnknown_0203CD8C == 0xFF)
|
|
gUnknown_0203CD8C = sub_8198AA4(0, 0x16, 1, 7, (a1 * 2) + 2, 0xF, 0x139);
|
|
return gUnknown_0203CD8C;
|
|
}
|
|
|
|
u8 GetStartMenuWindowId(void)
|
|
{
|
|
return gUnknown_0203CD8C;
|
|
}
|
|
|
|
void remove_start_menu_window_maybe(void)
|
|
{
|
|
if (gUnknown_0203CD8C != 0xFF)
|
|
{
|
|
RemoveWindow(gUnknown_0203CD8C);
|
|
gUnknown_0203CD8C = 0xFF;
|
|
}
|
|
}
|
|
|
|
u16 sub_8197A30(void)
|
|
{
|
|
return DLG_WINDOW_BASE_TILE_NUM;
|
|
}
|
|
|
|
u16 sub_8197A38(void)
|
|
{
|
|
return STD_WINDOW_BASE_TILE_NUM;
|
|
}
|
|
|
|
u8 AddMapNamePopUpWindow(void)
|
|
{
|
|
if (gUnknown_0203CD8D == 0xFF)
|
|
gUnknown_0203CD8D = sub_8198AA4(0, 1, 1, 10, 3, 14, 0x107);
|
|
return gUnknown_0203CD8D;
|
|
}
|
|
|
|
u8 GetMapNamePopUpWindowId(void)
|
|
{
|
|
return gUnknown_0203CD8D;
|
|
}
|
|
|
|
void RemoveMapNamePopUpWindow(void)
|
|
{
|
|
if (gUnknown_0203CD8D != 0xFF)
|
|
{
|
|
RemoveWindow(gUnknown_0203CD8D);
|
|
gUnknown_0203CD8D = 0xFF;
|
|
}
|
|
}
|