mirror of
https://github.com/pret/pokefirered.git
synced 2026-05-09 12:35:23 -05:00
1691 lines
65 KiB
C
1691 lines
65 KiB
C
#include "global.h"
|
|
#include "main.h"
|
|
#include "palette.h"
|
|
#include "string_util.h"
|
|
#include "window.h"
|
|
#include "text.h"
|
|
#include "sprite.h"
|
|
#include "blit.h"
|
|
#include "sound.h"
|
|
#include "m4a.h"
|
|
#include "quest_log.h"
|
|
#include "window.h"
|
|
#include "graphics.h"
|
|
#include "dynamic_placeholder_text_util.h"
|
|
#include "constants/songs.h"
|
|
|
|
extern u8 gGlyphInfo[0x90];
|
|
extern const struct OamData gOamData_AffineOff_ObjNormal_16x16;
|
|
|
|
static void DecompressGlyphFont3(u16 glyphId, bool32 isJapanese);
|
|
static void DecompressGlyphFont4(u16 glyphId, bool32 isJapanese);
|
|
|
|
TextFlags gTextFlags;
|
|
|
|
const u8 gDownArrowTiles[] = INCBIN_U8("data/graphics/fonts/down_arrow.4bpp");
|
|
const u8 gDarkDownArrowTiles[] = INCBIN_U8("data/graphics/fonts/down_arrow_RS.4bpp");
|
|
const u8 gTinyArrowTiles[] = INCBIN_U8("data/graphics/fonts/down_arrow_2.4bpp");
|
|
const u8 gTinyDarkDownArrowTiles[] = INCBIN_U8("data/graphics/fonts/down_arrow_RS_2.4bpp");
|
|
const u8 gDoubleArrowTiles1[] = INCBIN_U8("data/graphics/fonts/down_arrow_3.4bpp");
|
|
const u8 gDoubleArrowTiles2[] = INCBIN_U8("data/graphics/fonts/down_arrow_4.4bpp");
|
|
|
|
const u8 gDownArrowYCoords[] = { 0x0, 0x10, 0x20, 0x10 };
|
|
const u8 gWindowVerticalScrollSpeeds[] = { 0x1, 0x2 , 0x4 , 0x0 };
|
|
|
|
const struct GlyphWidthFunc gGlyphWidthFuncs[] = {
|
|
{ 0x0, GetGlyphWidthFont0 },
|
|
{ 0x1, GetGlyphWidthFont1 },
|
|
{ 0x2, GetGlyphWidthFont2 },
|
|
{ 0x3, GetGlyphWidthFont3 },
|
|
{ 0x4, GetGlyphWidthFont4 },
|
|
{ 0x5, GetGlyphWidthFont5 },
|
|
{ 0x6, GetGlyphWidthFont6 }
|
|
};
|
|
|
|
const struct SpriteSheet gUnknown_81EA68C[] =
|
|
{
|
|
{gDoubleArrowTiles1, sizeof(gDoubleArrowTiles1), 0x8000},
|
|
{gDoubleArrowTiles2, sizeof(gDoubleArrowTiles2), 0x8000},
|
|
{NULL}
|
|
};
|
|
|
|
const struct SpritePalette gUnknown_81EA6A4[] =
|
|
{
|
|
{gTMCaseMainWindowPalette, 0x8000},
|
|
{NULL}
|
|
};
|
|
|
|
const struct SpriteTemplate gUnknown_81EA6B4 =
|
|
{
|
|
.tileTag = 0x8000,
|
|
.paletteTag = 0x8000,
|
|
.oam = &gOamData_AffineOff_ObjNormal_16x16,
|
|
.anims = gDummySpriteAnimTable,
|
|
.images = NULL,
|
|
.affineAnims = gDummySpriteAffineAnimTable,
|
|
.callback = sub_80062B0,
|
|
};
|
|
|
|
const struct KeypadIcon gKeypadIcons[] = {
|
|
{ 0x0, 0x8, 0xC },
|
|
{ 0x1, 0x8, 0xC },
|
|
{ 0x2, 0x10, 0xC },
|
|
{ 0x4, 0x10, 0xC },
|
|
{ 0x6, 0x18, 0xC },
|
|
{ 0x9, 0x18, 0xC },
|
|
{ 0xC, 0x8, 0xC },
|
|
{ 0xD, 0x8, 0xC },
|
|
{ 0xE, 0x8, 0xC },
|
|
{ 0xF, 0x8, 0xC },
|
|
{ 0x20, 0x8, 0xC },
|
|
{ 0x21, 0x8, 0xC },
|
|
{ 0x22, 0x8, 0xC },
|
|
};
|
|
|
|
const u8 gKeypadIconTiles[] = INCBIN_U8("data/graphics/fonts/keypad_icons.4bpp");
|
|
|
|
// Font 0
|
|
const u16 gFont0LatinGlyphs[] = INCBIN_U16("data/graphics/fonts/font0_latin.latfont");
|
|
const u8 gFont0LatinGlyphWidths[] =
|
|
{
|
|
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x05, 0x04, 0x04, 0x05,
|
|
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
|
|
0x05, 0x05, 0x04, 0x05, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06, 0x05, 0x05, 0x05, 0x05,
|
|
0x05, 0x05, 0x08, 0x07, 0x08, 0x05, 0x05, 0x05, 0x05, 0x05, 0x08, 0x08, 0x07, 0x05,
|
|
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
|
|
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x08,
|
|
0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x04, 0x07, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
|
|
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04,
|
|
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x08, 0x08, 0x08, 0x08, 0x05,
|
|
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x07, 0x07, 0x05, 0x05, 0x05, 0x05, 0x05,
|
|
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
|
|
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x08, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
|
|
0x05, 0x05, 0x05, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
|
|
0x05, 0x08, 0x05, 0x08, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04,
|
|
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x05, 0x05, 0x05,
|
|
0x05, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x05, 0x05,
|
|
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
|
|
0x05, 0x08, 0x07, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
|
|
0x05, 0x05, 0x05, 0x05, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
|
|
0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
|
|
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
|
|
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
|
|
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
|
|
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
|
|
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
|
|
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
|
|
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
|
|
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
|
|
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
|
|
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
|
|
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
|
|
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
|
|
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
|
|
0x05, 0x05, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
|
|
0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
|
|
0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
|
|
0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x05
|
|
};
|
|
const u16 gFont0JapaneseGlyphs[] = INCBIN_U16("data/graphics/fonts/font0_jap.fwjpnfont");
|
|
|
|
// Font 1
|
|
const u16 gFont1LatinGlyphs[] = INCBIN_U16("data/graphics/fonts/font1_latin.latfont");
|
|
const u8 gFont1LatinGlyphWidths[] =
|
|
{
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x08, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x09, 0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0A, 0x08, 0x05, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x08,
|
|
0x08, 0x08, 0x08, 0x08, 0x08, 0x04, 0x06, 0x08, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0C, 0x0C, 0x0C, 0x0C, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x06, 0x05, 0x06, 0x06, 0x06, 0x03, 0x03, 0x06,
|
|
0x06, 0x08, 0x05, 0x09, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x06, 0x06, 0x04, 0x06, 0x05,
|
|
0x05, 0x06, 0x05, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x08, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x0C, 0x0C, 0x0C, 0x0C, 0x08, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
|
|
0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
|
|
0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
|
|
0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x06
|
|
};
|
|
const u16 gFont1JapaneseGlyphs[] = INCBIN_U16("data/graphics/fonts/font1_jap.fwjpnfont");
|
|
|
|
// Font 2
|
|
const u16 gFont2LatinGlyphs[] = INCBIN_U16("data/graphics/fonts/font2_latin.latfont");
|
|
const u8 gFont2LatinGlyphWidths[] =
|
|
{
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x08, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x09, 0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0A, 0x08, 0x05, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x08,
|
|
0x08, 0x08, 0x08, 0x08, 0x08, 0x04, 0x06, 0x08, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0C, 0x0C, 0x0C, 0x0C, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x06, 0x05, 0x06, 0x06, 0x06, 0x03, 0x03, 0x06,
|
|
0x06, 0x08, 0x05, 0x09, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x06, 0x06, 0x04, 0x06, 0x05,
|
|
0x05, 0x06, 0x05, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x08, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x0C, 0x0C, 0x0C, 0x0C, 0x08, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
|
|
0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
|
|
0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
|
|
0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x06
|
|
};
|
|
const u16 gFont2JapaneseGlyphs[] = INCBIN_U16("data/graphics/fonts/font2_jap.fwjpnfont");
|
|
const u8 gFont2JapaneseGlyphWidths[] =
|
|
{
|
|
0x00, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x09, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x09, 0x08, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08,
|
|
0x08, 0x08, 0x08, 0x05, 0x09, 0x0A, 0x0A, 0x0A, 0x08, 0x0A, 0x0A, 0x0A, 0x0A, 0x08,
|
|
0x08, 0x08, 0x0A, 0x0A, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x06, 0x06, 0x02, 0x04, 0x06,
|
|
0x03, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x00
|
|
};
|
|
|
|
// Font 4
|
|
const u16 gFont4LatinGlyphs[] = INCBIN_U16("data/graphics/fonts/font4_latin.latfont");
|
|
const u8 gFont4LatinGlyphWidths[] =
|
|
{
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x08, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x09, 0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0A, 0x08, 0x05, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x08,
|
|
0x08, 0x08, 0x08, 0x08, 0x08, 0x04, 0x06, 0x08, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0C, 0x0C, 0x0C, 0x0C, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x06, 0x05, 0x06, 0x06, 0x06, 0x03, 0x03, 0x06,
|
|
0x06, 0x08, 0x05, 0x09, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x06, 0x06, 0x04, 0x06, 0x05,
|
|
0x05, 0x06, 0x05, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x08, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x0C, 0x0C, 0x0C, 0x0C, 0x08, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
|
|
0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
|
|
0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
|
|
0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x06
|
|
};
|
|
const u16 gFont4JapaneseGlyphs[] = INCBIN_U16("data/graphics/fonts/font4_jap.fwjpnfont");
|
|
const u8 gFont4JapaneseGlyphWidths[] =
|
|
{
|
|
0x00, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x09, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x09, 0x08, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08,
|
|
0x08, 0x08, 0x08, 0x05, 0x09, 0x0A, 0x0A, 0x0A, 0x08, 0x0A, 0x0A, 0x0A, 0x0A, 0x08,
|
|
0x08, 0x08, 0x0A, 0x0A, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x06, 0x06, 0x02, 0x04, 0x06,
|
|
0x03, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x00
|
|
};
|
|
|
|
// Font 5
|
|
const u16 gFont5LatinGlyphs[] = INCBIN_U16("data/graphics/fonts/font5_latin.latfont");
|
|
const u8 gFont5LatinGlyphWidths[] =
|
|
{
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x08, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x09, 0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0A, 0x08, 0x05, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x08,
|
|
0x08, 0x08, 0x08, 0x08, 0x08, 0x04, 0x06, 0x08, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0C, 0x0C, 0x0C, 0x0C, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x06, 0x05, 0x06, 0x06, 0x06, 0x03, 0x03, 0x06,
|
|
0x06, 0x08, 0x05, 0x09, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x06, 0x06, 0x04, 0x06, 0x05,
|
|
0x05, 0x06, 0x05, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x08, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x0C, 0x0C, 0x0C, 0x0C, 0x08, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
|
|
0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
|
|
0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
|
|
0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x06
|
|
};
|
|
const u16 gFont5JapaneseGlyphs[] = INCBIN_U16("data/graphics/fonts/font5_jap.fwjpnfont");
|
|
const u8 gFont5JapaneseGlyphWidths[] =
|
|
{
|
|
0x00, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x09, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x08, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x09, 0x08, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08,
|
|
0x08, 0x08, 0x08, 0x05, 0x09, 0x0A, 0x0A, 0x0A, 0x08, 0x0A, 0x0A, 0x0A, 0x0A, 0x08,
|
|
0x08, 0x08, 0x0A, 0x0A, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x06, 0x06, 0x02, 0x04, 0x06,
|
|
0x03, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
|
|
0x06, 0x06, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
|
|
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x00
|
|
};
|
|
|
|
// Font 9
|
|
const u16 gFont9JapaneseGlyphs[] = INCBIN_U16("data/graphics/fonts/font9_jap.fwjpnfont");
|
|
|
|
u16 Font0Func(struct TextPrinter *textPrinter)
|
|
{
|
|
struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub;
|
|
|
|
if (subStruct->hasGlyphIdBeenSet == 0)
|
|
{
|
|
textPrinter->subUnion.sub.glyphId = 0;
|
|
subStruct->hasGlyphIdBeenSet = 1;
|
|
}
|
|
return RenderText(textPrinter);
|
|
}
|
|
|
|
u16 Font1Func(struct TextPrinter *textPrinter)
|
|
{
|
|
struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub;
|
|
|
|
if (subStruct->hasGlyphIdBeenSet == 0)
|
|
{
|
|
textPrinter->subUnion.sub.glyphId = 1;
|
|
subStruct->hasGlyphIdBeenSet = 1;
|
|
}
|
|
return RenderText(textPrinter);
|
|
}
|
|
|
|
u16 Font2Func(struct TextPrinter *textPrinter)
|
|
{
|
|
struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub;
|
|
|
|
if (subStruct->hasGlyphIdBeenSet == 0)
|
|
{
|
|
textPrinter->subUnion.sub.glyphId = 2;
|
|
subStruct->hasGlyphIdBeenSet = 1;
|
|
}
|
|
return RenderText(textPrinter);
|
|
}
|
|
|
|
u16 Font3Func(struct TextPrinter *textPrinter)
|
|
{
|
|
struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub;
|
|
|
|
if (subStruct->hasGlyphIdBeenSet == 0)
|
|
{
|
|
textPrinter->subUnion.sub.glyphId = 3;
|
|
subStruct->hasGlyphIdBeenSet = 1;
|
|
}
|
|
return RenderText(textPrinter);
|
|
}
|
|
|
|
u16 Font4Func(struct TextPrinter *textPrinter)
|
|
{
|
|
struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub;
|
|
|
|
if (subStruct->hasGlyphIdBeenSet == 0)
|
|
{
|
|
textPrinter->subUnion.sub.glyphId = 4;
|
|
subStruct->hasGlyphIdBeenSet = 1;
|
|
}
|
|
return RenderText(textPrinter);
|
|
}
|
|
|
|
u16 Font5Func(struct TextPrinter *textPrinter)
|
|
{
|
|
struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub;
|
|
|
|
if (subStruct->hasGlyphIdBeenSet == 0)
|
|
{
|
|
textPrinter->subUnion.sub.glyphId = 5;
|
|
subStruct->hasGlyphIdBeenSet = 1;
|
|
}
|
|
return RenderText(textPrinter);
|
|
}
|
|
|
|
void TextPrinterInitDownArrowCounters(struct TextPrinter *textPrinter)
|
|
{
|
|
struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub;
|
|
|
|
if (gTextFlags.autoScroll == 1)
|
|
subStruct->autoScrollDelay = 0;
|
|
else
|
|
{
|
|
subStruct->downArrowYPosIdx = 0;
|
|
subStruct->downArrowDelay = 0;
|
|
}
|
|
}
|
|
|
|
void TextPrinterDrawDownArrow(struct TextPrinter *textPrinter)
|
|
{
|
|
struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub;
|
|
const u8 *arrowTiles;
|
|
|
|
if (gTextFlags.autoScroll == 0)
|
|
{
|
|
if (subStruct->downArrowDelay != 0)
|
|
{
|
|
subStruct->downArrowDelay = ((*(u32*)&textPrinter->subUnion.sub) << 19 >> 27) - 1; // convoluted way of getting field_1, necessary to match
|
|
}
|
|
else
|
|
{
|
|
FillWindowPixelRect(
|
|
textPrinter->printerTemplate.windowId,
|
|
textPrinter->printerTemplate.bgColor << 4 | textPrinter->printerTemplate.bgColor,
|
|
textPrinter->printerTemplate.currentX,
|
|
textPrinter->printerTemplate.currentY,
|
|
10,
|
|
12);
|
|
|
|
switch (gTextFlags.useAlternateDownArrow)
|
|
{
|
|
case 0:
|
|
default:
|
|
arrowTiles = gDownArrowTiles;
|
|
break;
|
|
case 1:
|
|
arrowTiles = gDarkDownArrowTiles;
|
|
break;
|
|
}
|
|
|
|
BlitBitmapRectToWindow(
|
|
textPrinter->printerTemplate.windowId,
|
|
arrowTiles,
|
|
gDownArrowYCoords[*(u32*)subStruct << 17 >> 30], // subStruct->downArrowYPosIdx but again, stupidly retrieved
|
|
0,
|
|
0x80,
|
|
0x10,
|
|
textPrinter->printerTemplate.currentX,
|
|
textPrinter->printerTemplate.currentY,
|
|
10,
|
|
12);
|
|
CopyWindowToVram(textPrinter->printerTemplate.windowId, 0x2);
|
|
|
|
subStruct->downArrowDelay = 0x8;
|
|
subStruct->downArrowYPosIdx = (*(u32*)subStruct << 17 >> 30) + 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
void TextPrinterClearDownArrow(struct TextPrinter *textPrinter)
|
|
{
|
|
FillWindowPixelRect(
|
|
textPrinter->printerTemplate.windowId,
|
|
textPrinter->printerTemplate.bgColor << 4 | textPrinter->printerTemplate.bgColor,
|
|
textPrinter->printerTemplate.currentX,
|
|
textPrinter->printerTemplate.currentY,
|
|
10,
|
|
12);
|
|
CopyWindowToVram(textPrinter->printerTemplate.windowId, 0x2);
|
|
}
|
|
|
|
bool8 TextPrinterWaitAutoMode(struct TextPrinter *textPrinter)
|
|
{
|
|
struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub;
|
|
u8 delay = (gUnknown_203ADFA == 2) ? 50 : 120;
|
|
|
|
if (subStruct->autoScrollDelay == delay)
|
|
{
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
subStruct->autoScrollDelay++;
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
bool16 TextPrinterWaitWithDownArrow(struct TextPrinter *textPrinter)
|
|
{
|
|
bool8 result = FALSE;
|
|
if (gTextFlags.autoScroll != 0)
|
|
{
|
|
result = TextPrinterWaitAutoMode(textPrinter);
|
|
}
|
|
else
|
|
{
|
|
TextPrinterDrawDownArrow(textPrinter);
|
|
if (JOY_NEW(A_BUTTON | B_BUTTON))
|
|
{
|
|
result = TRUE;
|
|
PlaySE(SE_SELECT);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
bool16 TextPrinterWait(struct TextPrinter *textPrinter)
|
|
{
|
|
bool16 result = FALSE;
|
|
if (gTextFlags.autoScroll != 0)
|
|
{
|
|
result = TextPrinterWaitAutoMode(textPrinter);
|
|
}
|
|
else
|
|
{
|
|
if (JOY_NEW(A_BUTTON | B_BUTTON))
|
|
{
|
|
result = TRUE;
|
|
PlaySE(SE_SELECT);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
void DrawDownArrow(u8 windowId, u16 x, u16 y, u8 bgColor, bool8 drawArrow, u8 *counter, u8 *yCoordIndex)
|
|
{
|
|
const u8 *arrowTiles;
|
|
|
|
if (*counter != 0)
|
|
{
|
|
--*counter;
|
|
}
|
|
else
|
|
{
|
|
FillWindowPixelRect(windowId, (bgColor << 4) | bgColor, x, y, 10, 12);
|
|
if (drawArrow == 0)
|
|
{
|
|
switch (gTextFlags.useAlternateDownArrow)
|
|
{
|
|
case 0:
|
|
default:
|
|
arrowTiles = gDownArrowTiles;
|
|
break;
|
|
case 1:
|
|
arrowTiles = gDarkDownArrowTiles;
|
|
break;
|
|
}
|
|
|
|
BlitBitmapRectToWindow(
|
|
windowId,
|
|
arrowTiles,
|
|
gDownArrowYCoords[*yCoordIndex & 3],
|
|
0,
|
|
0x80,
|
|
0x10,
|
|
x,
|
|
y,
|
|
10,
|
|
12);
|
|
CopyWindowToVram(windowId, 0x2);
|
|
*counter = 8;
|
|
++*yCoordIndex;
|
|
}
|
|
}
|
|
}
|
|
|
|
u16 RenderText(struct TextPrinter *textPrinter)
|
|
{
|
|
struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub;
|
|
u16 currChar;
|
|
s32 width;
|
|
s32 widthHelper;
|
|
|
|
switch (textPrinter->state)
|
|
{
|
|
case 0:
|
|
if (JOY_HELD(A_BUTTON | B_BUTTON) && subStruct->hasPrintBeenSpedUp)
|
|
textPrinter->delayCounter = 0;
|
|
|
|
if (textPrinter->delayCounter && textPrinter->textSpeed)
|
|
{
|
|
textPrinter->delayCounter--;
|
|
if (gTextFlags.canABSpeedUpPrint && JOY_NEW(A_BUTTON | B_BUTTON))
|
|
{
|
|
subStruct->hasPrintBeenSpedUp = TRUE;
|
|
textPrinter->delayCounter = 0;
|
|
}
|
|
return 3;
|
|
}
|
|
|
|
if (gTextFlags.autoScroll)
|
|
textPrinter->delayCounter = 1;
|
|
else
|
|
textPrinter->delayCounter = textPrinter->textSpeed;
|
|
|
|
currChar = *textPrinter->printerTemplate.currentChar;
|
|
textPrinter->printerTemplate.currentChar++;
|
|
|
|
switch (currChar)
|
|
{
|
|
case CHAR_NEWLINE:
|
|
textPrinter->printerTemplate.currentX = textPrinter->printerTemplate.x;
|
|
textPrinter->printerTemplate.currentY += gFonts[textPrinter->printerTemplate.fontId].maxLetterHeight + textPrinter->printerTemplate.lineSpacing;
|
|
return 2;
|
|
case PLACEHOLDER_BEGIN:
|
|
textPrinter->printerTemplate.currentChar++;
|
|
return 2;
|
|
case EXT_CTRL_CODE_BEGIN:
|
|
currChar = *textPrinter->printerTemplate.currentChar;
|
|
textPrinter->printerTemplate.currentChar++;
|
|
switch (currChar)
|
|
{
|
|
case 1:
|
|
textPrinter->printerTemplate.fgColor = *textPrinter->printerTemplate.currentChar;
|
|
textPrinter->printerTemplate.currentChar++;
|
|
GenerateFontHalfRowLookupTable(textPrinter->printerTemplate.fgColor, textPrinter->printerTemplate.bgColor, textPrinter->printerTemplate.shadowColor);
|
|
return 2;
|
|
case 2:
|
|
textPrinter->printerTemplate.bgColor = *textPrinter->printerTemplate.currentChar;
|
|
textPrinter->printerTemplate.currentChar++;
|
|
GenerateFontHalfRowLookupTable(textPrinter->printerTemplate.fgColor, textPrinter->printerTemplate.bgColor, textPrinter->printerTemplate.shadowColor);
|
|
return 2;
|
|
case 3:
|
|
textPrinter->printerTemplate.shadowColor = *textPrinter->printerTemplate.currentChar;
|
|
textPrinter->printerTemplate.currentChar++;
|
|
GenerateFontHalfRowLookupTable(textPrinter->printerTemplate.fgColor, textPrinter->printerTemplate.bgColor, textPrinter->printerTemplate.shadowColor);
|
|
return 2;
|
|
case 4:
|
|
textPrinter->printerTemplate.fgColor = *textPrinter->printerTemplate.currentChar;
|
|
textPrinter->printerTemplate.currentChar++;
|
|
textPrinter->printerTemplate.bgColor = *textPrinter->printerTemplate.currentChar;
|
|
textPrinter->printerTemplate.currentChar++;
|
|
textPrinter->printerTemplate.shadowColor = *textPrinter->printerTemplate.currentChar;
|
|
textPrinter->printerTemplate.currentChar++;
|
|
GenerateFontHalfRowLookupTable(textPrinter->printerTemplate.fgColor, textPrinter->printerTemplate.bgColor, textPrinter->printerTemplate.shadowColor);
|
|
return 2;
|
|
case 5:
|
|
textPrinter->printerTemplate.currentChar++;
|
|
return 2;
|
|
case 6:
|
|
subStruct->glyphId = *textPrinter->printerTemplate.currentChar;
|
|
textPrinter->printerTemplate.currentChar++;
|
|
return 2;
|
|
case EXT_CTRL_CODE_UNKNOWN_7:
|
|
return 2;
|
|
case 8:
|
|
textPrinter->delayCounter = *textPrinter->printerTemplate.currentChar;
|
|
textPrinter->printerTemplate.currentChar++;
|
|
textPrinter->state = 6;
|
|
return 2;
|
|
case 9:
|
|
textPrinter->state = 1;
|
|
if (gTextFlags.autoScroll)
|
|
subStruct->autoScrollDelay = 0;
|
|
return 3;
|
|
case 10:
|
|
textPrinter->state = 5;
|
|
return 3;
|
|
case 11:
|
|
currChar = *textPrinter->printerTemplate.currentChar;
|
|
textPrinter->printerTemplate.currentChar++;
|
|
currChar |= *textPrinter->printerTemplate.currentChar << 8;
|
|
textPrinter->printerTemplate.currentChar++;
|
|
if ((u8)(gUnknown_203ADFA - 2u) > 1)
|
|
PlayBGM(currChar);
|
|
return 2;
|
|
case 16:
|
|
currChar = *textPrinter->printerTemplate.currentChar;
|
|
textPrinter->printerTemplate.currentChar++;
|
|
currChar |= (*textPrinter->printerTemplate.currentChar << 8);
|
|
textPrinter->printerTemplate.currentChar++;
|
|
PlaySE(currChar);
|
|
return 2;
|
|
case 12:
|
|
textPrinter->printerTemplate.currentChar++;
|
|
currChar = *textPrinter->printerTemplate.currentChar;
|
|
break;
|
|
case 13:
|
|
textPrinter->printerTemplate.currentX = textPrinter->printerTemplate.x + *textPrinter->printerTemplate.currentChar;
|
|
textPrinter->printerTemplate.currentChar++;
|
|
return 2;
|
|
case 14:
|
|
textPrinter->printerTemplate.currentY = textPrinter->printerTemplate.y + *textPrinter->printerTemplate.currentChar;
|
|
textPrinter->printerTemplate.currentChar++;
|
|
return 2;
|
|
case 15:
|
|
FillWindowPixelBuffer(textPrinter->printerTemplate.windowId, PIXEL_FILL(textPrinter->printerTemplate.bgColor));
|
|
return 2;
|
|
case 23:
|
|
m4aMPlayStop(&gMPlayInfo_BGM);
|
|
return 2;
|
|
case 24:
|
|
m4aMPlayContinue(&gMPlayInfo_BGM);
|
|
return 2;
|
|
case EXT_CTRL_CODE_CLEAR:
|
|
width = *textPrinter->printerTemplate.currentChar;
|
|
textPrinter->printerTemplate.currentChar++;
|
|
if (width > 0)
|
|
{
|
|
ClearTextSpan(textPrinter, width);
|
|
textPrinter->printerTemplate.currentX += width;
|
|
return 0;
|
|
}
|
|
return 2;
|
|
case 18:
|
|
textPrinter->printerTemplate.currentX = *textPrinter->printerTemplate.currentChar + textPrinter->printerTemplate.x;
|
|
textPrinter->printerTemplate.currentChar++;
|
|
return 2;
|
|
case EXT_CTRL_CODE_CLEAR_TO:
|
|
{
|
|
widthHelper = *textPrinter->printerTemplate.currentChar;
|
|
widthHelper += textPrinter->printerTemplate.x;
|
|
textPrinter->printerTemplate.currentChar++;
|
|
width = widthHelper - textPrinter->printerTemplate.currentX;
|
|
if (width > 0)
|
|
{
|
|
ClearTextSpan(textPrinter, width);
|
|
textPrinter->printerTemplate.currentX += width;
|
|
return 0;
|
|
}
|
|
}
|
|
return 2;
|
|
case EXT_CTRL_CODE_MIN_LETTER_SPACING:
|
|
textPrinter->minLetterSpacing = *textPrinter->printerTemplate.currentChar++;
|
|
return 2;
|
|
case EXT_CTRL_CODE_JPN:
|
|
textPrinter->japanese = 1;
|
|
return 2;
|
|
case EXT_CTRL_CODE_ENG:
|
|
textPrinter->japanese = 0;
|
|
return 2;
|
|
}
|
|
break;
|
|
case CHAR_PROMPT_CLEAR:
|
|
textPrinter->state = 2;
|
|
TextPrinterInitDownArrowCounters(textPrinter);
|
|
return 3;
|
|
case CHAR_PROMPT_SCROLL:
|
|
textPrinter->state = 3;
|
|
TextPrinterInitDownArrowCounters(textPrinter);
|
|
return 3;
|
|
case CHAR_EXTRA_EMOJI:
|
|
currChar = *textPrinter->printerTemplate.currentChar | 0x100;
|
|
textPrinter->printerTemplate.currentChar++;
|
|
break;
|
|
case CHAR_KEYPAD_ICON:
|
|
currChar = *textPrinter->printerTemplate.currentChar++;
|
|
gGlyphInfo[0x80] = DrawKeypadIcon(textPrinter->printerTemplate.windowId, currChar, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY);
|
|
textPrinter->printerTemplate.currentX += gGlyphInfo[0x80] + textPrinter->printerTemplate.letterSpacing;
|
|
return 0;
|
|
case EOS:
|
|
return 1;
|
|
}
|
|
|
|
switch (subStruct->glyphId)
|
|
{
|
|
case 0:
|
|
DecompressGlyphFont0(currChar, textPrinter->japanese);
|
|
break;
|
|
case 1:
|
|
DecompressGlyphFont1(currChar, textPrinter->japanese);
|
|
break;
|
|
case 2:
|
|
DecompressGlyphFont2(currChar, textPrinter->japanese);
|
|
break;
|
|
case 3:
|
|
DecompressGlyphFont3(currChar, textPrinter->japanese);
|
|
break;
|
|
case 4:
|
|
DecompressGlyphFont4(currChar, textPrinter->japanese);
|
|
break;
|
|
case 5:
|
|
DecompressGlyphFont5(currChar, textPrinter->japanese);
|
|
}
|
|
|
|
CopyGlyphToWindow(textPrinter);
|
|
|
|
if (textPrinter->minLetterSpacing)
|
|
{
|
|
textPrinter->printerTemplate.currentX += gGlyphInfo[0x80];
|
|
width = textPrinter->minLetterSpacing - gGlyphInfo[0x80];
|
|
if (width > 0)
|
|
{
|
|
ClearTextSpan(textPrinter, width);
|
|
textPrinter->printerTemplate.currentX += width;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (textPrinter->japanese)
|
|
textPrinter->printerTemplate.currentX += (gGlyphInfo[0x80] + textPrinter->printerTemplate.letterSpacing);
|
|
else
|
|
textPrinter->printerTemplate.currentX += gGlyphInfo[0x80];
|
|
}
|
|
return 0;
|
|
case 1:
|
|
if (TextPrinterWait(textPrinter))
|
|
textPrinter->state = 0;
|
|
return 3;
|
|
case 2:
|
|
if (TextPrinterWaitWithDownArrow(textPrinter))
|
|
{
|
|
FillWindowPixelBuffer(textPrinter->printerTemplate.windowId, PIXEL_FILL(textPrinter->printerTemplate.bgColor));
|
|
textPrinter->printerTemplate.currentX = textPrinter->printerTemplate.x;
|
|
textPrinter->printerTemplate.currentY = textPrinter->printerTemplate.y;
|
|
textPrinter->state = 0;
|
|
}
|
|
return 3;
|
|
case 3:
|
|
if (TextPrinterWaitWithDownArrow(textPrinter))
|
|
{
|
|
TextPrinterClearDownArrow(textPrinter);
|
|
textPrinter->scrollDistance = gFonts[textPrinter->printerTemplate.fontId].maxLetterHeight + textPrinter->printerTemplate.lineSpacing;
|
|
textPrinter->printerTemplate.currentX = textPrinter->printerTemplate.x;
|
|
textPrinter->state = 4;
|
|
}
|
|
return 3;
|
|
case 4:
|
|
if (textPrinter->scrollDistance)
|
|
{
|
|
|
|
if (textPrinter->scrollDistance < gWindowVerticalScrollSpeeds[gSaveBlock2Ptr->optionsTextSpeed])
|
|
{
|
|
ScrollWindow(textPrinter->printerTemplate.windowId, 0, textPrinter->scrollDistance, PIXEL_FILL(textPrinter->printerTemplate.bgColor));
|
|
textPrinter->scrollDistance = 0;
|
|
}
|
|
else
|
|
{
|
|
ScrollWindow(textPrinter->printerTemplate.windowId, 0, gWindowVerticalScrollSpeeds[gSaveBlock2Ptr->optionsTextSpeed], PIXEL_FILL(textPrinter->printerTemplate.bgColor));
|
|
textPrinter->scrollDistance -= gWindowVerticalScrollSpeeds[gSaveBlock2Ptr->optionsTextSpeed];
|
|
}
|
|
CopyWindowToVram(textPrinter->printerTemplate.windowId, 2);
|
|
}
|
|
else
|
|
{
|
|
textPrinter->state = 0;
|
|
}
|
|
return 3;
|
|
case 5:
|
|
if (!IsSEPlaying())
|
|
textPrinter->state = 0;
|
|
return 3;
|
|
case 6:
|
|
if (textPrinter->delayCounter != 0)
|
|
textPrinter->delayCounter--;
|
|
else
|
|
textPrinter->state = 0;
|
|
return 3;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
s32 GetStringWidthFixedWidthFont(const u8 *str, u8 fontId, u8 letterSpacing)
|
|
{
|
|
int i;
|
|
u8 width;
|
|
int temp;
|
|
int temp2;
|
|
u8 line;
|
|
int strPos;
|
|
u8 lineWidths[8];
|
|
const u8 *strLocal;
|
|
|
|
for (i = 0; i < 8; i++)
|
|
{
|
|
lineWidths[i] = 0;
|
|
}
|
|
|
|
width = 0;
|
|
line = 0;
|
|
strLocal = str;
|
|
strPos = 0;
|
|
|
|
do
|
|
{
|
|
temp = strLocal[strPos++];
|
|
switch (temp)
|
|
{
|
|
case 0xFE:
|
|
case 0xFF:
|
|
lineWidths[line] = width;
|
|
width = 0;
|
|
line++;
|
|
break;
|
|
case 0xFC:
|
|
temp2 = strLocal[strPos++];
|
|
switch (temp2)
|
|
{
|
|
case 0x4:
|
|
++strPos;
|
|
case 0xB:
|
|
case 0x10:
|
|
++strPos;
|
|
case 0x1:
|
|
case 0x2:
|
|
case 0x3:
|
|
case 0x5:
|
|
case 0x6:
|
|
case 0x8:
|
|
case 0xC:
|
|
case 0xD:
|
|
case 0xE:
|
|
case 0x11:
|
|
case 0x12:
|
|
case 0x13:
|
|
case 0x14:
|
|
++strPos;
|
|
break;
|
|
case 0x7:
|
|
case 0x9:
|
|
case 0xA:
|
|
case 0xF:
|
|
case 0x15:
|
|
case 0x16:
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
case 0xF7:
|
|
case 0xFD:
|
|
++strPos;
|
|
break;
|
|
case 0xFA:
|
|
case 0xFB:
|
|
break;
|
|
case 0xF8:
|
|
case 0xF9:
|
|
++strPos;
|
|
default:
|
|
++width;
|
|
break;
|
|
}
|
|
} while (temp != 0xFF);
|
|
|
|
for (width = 0, strPos = 0; strPos < 8; ++strPos)
|
|
{
|
|
if (width < lineWidths[strPos])
|
|
width = lineWidths[strPos];
|
|
}
|
|
|
|
return (u8)(GetFontAttribute(fontId, 0) + letterSpacing) * width;
|
|
}
|
|
|
|
s32 (*GetFontWidthFunc(u8 glyphId))(u16 _glyphId, bool32 _isJapanese)
|
|
{
|
|
u32 i;
|
|
|
|
for (i = 0; i < 7; ++i)
|
|
{
|
|
if (glyphId == gGlyphWidthFuncs[i].fontId)
|
|
return *gGlyphWidthFuncs[i].func;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
s32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing)
|
|
{
|
|
bool8 isJapanese;
|
|
int minGlyphWidth;
|
|
s32 (*func)(u16 glyphId, bool32 isJapanese);
|
|
int localLetterSpacing;
|
|
register u32 lineWidth asm("r5");
|
|
const u8 *bufferPointer;
|
|
int glyphWidth;
|
|
u32 width;
|
|
|
|
isJapanese = 0;
|
|
minGlyphWidth = 0;
|
|
|
|
func = GetFontWidthFunc(fontId);
|
|
if (func == NULL)
|
|
return 0;
|
|
|
|
if (letterSpacing == -1)
|
|
localLetterSpacing = GetFontAttribute(fontId, 2);
|
|
else
|
|
localLetterSpacing = letterSpacing;
|
|
|
|
width = 0;
|
|
lineWidth = 0;
|
|
bufferPointer = NULL;
|
|
|
|
while (*str != 0xFF)
|
|
{
|
|
switch (*str)
|
|
{
|
|
case 0xFE:
|
|
if (lineWidth > width)
|
|
width = lineWidth;
|
|
lineWidth = 0;
|
|
break;
|
|
case 0xFD:
|
|
switch (*++str)
|
|
{
|
|
case 0x2:
|
|
bufferPointer = gStringVar1;
|
|
break;
|
|
case 0x3:
|
|
bufferPointer = gStringVar2;
|
|
break;
|
|
case 0x4:
|
|
bufferPointer = gStringVar3;
|
|
break;
|
|
default:
|
|
return 0;
|
|
}
|
|
case 0xF7:
|
|
if (bufferPointer == NULL)
|
|
bufferPointer = DynamicPlaceholderTextUtil_GetPlaceholderPtr(*++str);
|
|
while (*bufferPointer != 0xFF)
|
|
{
|
|
glyphWidth = func(*bufferPointer++, isJapanese);
|
|
if (minGlyphWidth > 0)
|
|
{
|
|
if (glyphWidth < minGlyphWidth)
|
|
glyphWidth = minGlyphWidth;
|
|
}
|
|
else if (isJapanese)
|
|
{
|
|
glyphWidth += localLetterSpacing;
|
|
}
|
|
lineWidth += glyphWidth;
|
|
}
|
|
bufferPointer = NULL;
|
|
break;
|
|
case 0xFC:
|
|
switch (*++str)
|
|
{
|
|
case 0x4:
|
|
++str;
|
|
case 0xB:
|
|
case 0x10:
|
|
++str;
|
|
case 0x1:
|
|
case 0x2:
|
|
case 0x3:
|
|
case 0x5:
|
|
case 0x8:
|
|
case 0xC:
|
|
case 0xD:
|
|
case 0xE:
|
|
++str;
|
|
break;
|
|
case 0x6:
|
|
func = GetFontWidthFunc(*++str);
|
|
if (func == NULL)
|
|
return 0;
|
|
if (letterSpacing == -1)
|
|
localLetterSpacing = GetFontAttribute(*str, 2);
|
|
break;
|
|
case 0x11:
|
|
glyphWidth = *++str;
|
|
lineWidth += glyphWidth;
|
|
break;
|
|
case 0x12:
|
|
lineWidth = *++str;
|
|
break;
|
|
case 0x13:
|
|
if (*++str > lineWidth)
|
|
lineWidth = *str;
|
|
break;
|
|
case 0x14:
|
|
minGlyphWidth = *++str;
|
|
break;
|
|
case 0x15:
|
|
isJapanese = 1;
|
|
break;
|
|
case 0x16:
|
|
isJapanese = 0;
|
|
break;
|
|
case 0x7:
|
|
case 0x9:
|
|
case 0xA:
|
|
case 0xF:
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
case 0xF8:
|
|
case 0xF9:
|
|
if (*str == 0xF9)
|
|
glyphWidth = func(*++str | 0x100, isJapanese);
|
|
else
|
|
glyphWidth = GetKeypadIconWidth(*++str);
|
|
|
|
if (minGlyphWidth > 0)
|
|
{
|
|
if (glyphWidth < minGlyphWidth)
|
|
glyphWidth = minGlyphWidth;
|
|
}
|
|
else if (isJapanese)
|
|
{
|
|
glyphWidth += localLetterSpacing;
|
|
}
|
|
lineWidth += glyphWidth;
|
|
break;
|
|
case 0xFA:
|
|
case 0xFB:
|
|
break;
|
|
default:
|
|
glyphWidth = func(*str, isJapanese);
|
|
if (minGlyphWidth > 0)
|
|
{
|
|
if (glyphWidth < minGlyphWidth)
|
|
glyphWidth = minGlyphWidth;
|
|
lineWidth += glyphWidth;
|
|
}
|
|
else
|
|
{
|
|
if (fontId != 6 && isJapanese)
|
|
{
|
|
glyphWidth += localLetterSpacing;
|
|
}
|
|
lineWidth += glyphWidth;
|
|
}
|
|
break;
|
|
}
|
|
++str;
|
|
}
|
|
|
|
if (lineWidth > width)
|
|
return lineWidth;
|
|
return width;
|
|
}
|
|
|
|
u8 RenderTextFont9(u8 *pixels, u8 fontId, u8 *str)
|
|
{
|
|
u8 shadowColor;
|
|
u8 *strLocal;
|
|
int strPos;
|
|
int temp;
|
|
int temp2;
|
|
u8 colorBackup[3];
|
|
u8 fgColor;
|
|
u8 bgColor;
|
|
|
|
SaveTextColors(&colorBackup[0], &colorBackup[1], &colorBackup[2]);
|
|
|
|
fgColor = 1;
|
|
bgColor = 0;
|
|
shadowColor = 3;
|
|
|
|
GenerateFontHalfRowLookupTable(1, 0, 3);
|
|
strLocal = str;
|
|
strPos = 0;
|
|
|
|
do
|
|
{
|
|
temp = strLocal[strPos++];
|
|
switch (temp)
|
|
{
|
|
case 0xFC:
|
|
temp2 = strLocal[strPos++];
|
|
switch (temp2)
|
|
{
|
|
case 0x4:
|
|
fgColor = strLocal[strPos++];
|
|
bgColor = strLocal[strPos++];
|
|
shadowColor = strLocal[strPos++];
|
|
GenerateFontHalfRowLookupTable(fgColor, bgColor, shadowColor);
|
|
continue;
|
|
case 0x1:
|
|
fgColor = strLocal[strPos++];
|
|
GenerateFontHalfRowLookupTable(fgColor, bgColor, shadowColor);
|
|
continue;
|
|
case 0x2:
|
|
bgColor = strLocal[strPos++];
|
|
GenerateFontHalfRowLookupTable(fgColor, bgColor, shadowColor);
|
|
continue;
|
|
case 0x3:
|
|
shadowColor = strLocal[strPos++];
|
|
GenerateFontHalfRowLookupTable(fgColor, bgColor, shadowColor);
|
|
continue;
|
|
case 0x6:
|
|
fontId = strLocal[strPos++];
|
|
break;
|
|
case 0xB:
|
|
case 0x10:
|
|
++strPos;
|
|
case 0x5:
|
|
case 0x8:
|
|
case 0xC:
|
|
case 0xD:
|
|
case 0xE:
|
|
case 0x11:
|
|
case 0x12:
|
|
case 0x13:
|
|
case 0x14:
|
|
++strPos;
|
|
break;
|
|
case 0x7:
|
|
case 0x9:
|
|
case 0xA:
|
|
case 0xF:
|
|
case 0x15:
|
|
case 0x16:
|
|
default:
|
|
continue;
|
|
}
|
|
break;
|
|
case 0xF7:
|
|
case 0xF8:
|
|
case 0xF9:
|
|
case 0xFD:
|
|
++strPos;
|
|
break;
|
|
case 0xFA:
|
|
case 0xFB:
|
|
case 0xFE:
|
|
case 0xFF:
|
|
break;
|
|
default:
|
|
DecompressGlyphFont9(temp);
|
|
CpuCopy32(gGlyphInfo, pixels, 0x20);
|
|
CpuCopy32(gGlyphInfo + 0x40, pixels + 0x20, 0x20);
|
|
pixels += 0x40;
|
|
break;
|
|
}
|
|
}
|
|
while (temp != 0xFF);
|
|
|
|
RestoreTextColors(&colorBackup[0], &colorBackup[1], &colorBackup[2]);
|
|
return 1;
|
|
}
|
|
|
|
void sub_80062B0(struct Sprite *sprite)
|
|
{
|
|
if(sprite->data[0])
|
|
{
|
|
sprite->data[0]--;
|
|
}
|
|
else
|
|
{
|
|
sprite->data[0] = 8;
|
|
switch(sprite->data[1])
|
|
{
|
|
case 0:
|
|
sprite->pos2.y = 0;
|
|
break;
|
|
case 1:
|
|
sprite->pos2.y = 1;
|
|
break;
|
|
case 2:
|
|
sprite->pos2.y = 2;
|
|
break;
|
|
case 3:
|
|
sprite->pos2.y = 1;
|
|
sprite->data[1] = 0;
|
|
return;
|
|
}
|
|
sprite->data[1]++;
|
|
}
|
|
}
|
|
|
|
u8 CreateTextCursorSpriteForOakSpeech(u8 sheetId, u16 x, u16 y, u8 priority, u8 subpriority)
|
|
{
|
|
u8 spriteId;
|
|
LoadSpriteSheet(&gUnknown_81EA68C[sheetId & 1]);
|
|
LoadSpritePalette(gUnknown_81EA6A4);
|
|
spriteId = CreateSprite(&gUnknown_81EA6B4, x + 3, y + 4, subpriority);
|
|
gSprites[spriteId].oam.priority = (priority & 3);
|
|
gSprites[spriteId].oam.matrixNum = 0;
|
|
gSprites[spriteId].data[0] = 8;
|
|
return spriteId;
|
|
}
|
|
|
|
void sub_8006398(u8 spriteId)
|
|
{
|
|
DestroySprite(&gSprites[spriteId]);
|
|
FreeSpriteTilesByTag(0x8000);
|
|
FreeSpritePaletteByTag(0x8000);
|
|
}
|
|
|
|
u8 DrawKeypadIcon(u8 windowId, u8 keypadIconId, u16 x, u16 y)
|
|
{
|
|
BlitBitmapRectToWindow(
|
|
windowId,
|
|
gKeypadIconTiles + (gKeypadIcons[keypadIconId].tileOffset * 0x20),
|
|
0,
|
|
0,
|
|
0x80,
|
|
0x80,
|
|
x,
|
|
y,
|
|
gKeypadIcons[keypadIconId].width,
|
|
gKeypadIcons[keypadIconId].height);
|
|
return gKeypadIcons[keypadIconId].width;
|
|
}
|
|
|
|
u8 GetKeypadIconTileOffset(u8 keypadIconId)
|
|
{
|
|
return gKeypadIcons[keypadIconId].tileOffset;
|
|
}
|
|
|
|
u8 GetKeypadIconWidth(u8 keypadIconId)
|
|
{
|
|
return gKeypadIcons[keypadIconId].width;
|
|
}
|
|
|
|
u8 GetKeypadIconHeight(u8 keypadIconId)
|
|
{
|
|
return gKeypadIcons[keypadIconId].height;
|
|
}
|
|
|
|
void DecompressGlyphFont0(u16 glyphId, bool32 isJapanese)
|
|
{
|
|
const u16* glyphs;
|
|
|
|
if (isJapanese == 1)
|
|
{
|
|
glyphs = gFont0JapaneseGlyphs + (0x100 * (glyphId >> 0x4)) + (0x8 * (glyphId & 0xF));
|
|
DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo);
|
|
DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo + 0x40));
|
|
gGlyphInfo[0x80] = 8;
|
|
gGlyphInfo[0x81] = 12;
|
|
}
|
|
else
|
|
{
|
|
glyphs = gFont0LatinGlyphs + (0x10 * glyphId);
|
|
DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo);
|
|
DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo + 0x40));
|
|
gGlyphInfo[0x80] = gFont0LatinGlyphWidths[glyphId];
|
|
gGlyphInfo[0x81] = 13;
|
|
}
|
|
}
|
|
|
|
s32 GetGlyphWidthFont0(u16 glyphId, bool32 isJapanese)
|
|
{
|
|
if (isJapanese == TRUE)
|
|
return 8;
|
|
else
|
|
return gFont0LatinGlyphWidths[glyphId];
|
|
}
|
|
|
|
void DecompressGlyphFont1(u16 glyphId, bool32 isJapanese)
|
|
{
|
|
const u16* glyphs;
|
|
|
|
if (isJapanese == TRUE)
|
|
{
|
|
int eff;
|
|
glyphs = gFont1JapaneseGlyphs + (0x100 * (glyphId >> 0x4)) + (0x8 * (glyphId & (eff = 0xF))); // shh, no questions, only matching now
|
|
DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo);
|
|
DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo + 0x40));
|
|
gGlyphInfo[0x80] = 8;
|
|
gGlyphInfo[0x81] = 16;
|
|
}
|
|
else
|
|
{
|
|
glyphs = gFont1LatinGlyphs + (0x20 * glyphId);
|
|
DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo);
|
|
DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo + 0x20));
|
|
DecompressGlyphTile(glyphs + 0x10, (u16 *)(gGlyphInfo + 0x40));
|
|
DecompressGlyphTile(glyphs + 0x18, (u16 *)(gGlyphInfo + 0x60));
|
|
gGlyphInfo[0x80] = gFont1LatinGlyphWidths[glyphId];
|
|
gGlyphInfo[0x81] = 14;
|
|
}
|
|
}
|
|
|
|
s32 GetGlyphWidthFont1(u16 glyphId, bool32 isJapanese)
|
|
{
|
|
if (isJapanese == TRUE)
|
|
return 8;
|
|
else
|
|
return gFont1LatinGlyphWidths[glyphId];
|
|
}
|
|
|
|
void DecompressGlyphFont2(u16 glyphId, bool32 isJapanese)
|
|
{
|
|
const u16* glyphs;
|
|
int i;
|
|
u8 lastColor;
|
|
|
|
if(isJapanese == TRUE)
|
|
{
|
|
if(glyphId == 0)
|
|
{
|
|
lastColor = GetLastTextColor(2);
|
|
|
|
for(i = 0; i < 0x80; i++)
|
|
{
|
|
gGlyphInfo[i] = lastColor | lastColor << 4;
|
|
// Game Freak, please. writing the same values over and over...
|
|
gGlyphInfo[0x80] = 10;
|
|
gGlyphInfo[0x81] = 12;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
glyphs = gFont2JapaneseGlyphs + (0x100 * (glyphId >> 0x3)) + (0x10 * (glyphId & 0x7));
|
|
DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo);
|
|
DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo + 0x20));
|
|
DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo + 0x40));
|
|
DecompressGlyphTile(glyphs + 0x88, (u16 *)(gGlyphInfo + 0x60));
|
|
gGlyphInfo[0x80] = gFont2JapaneseGlyphWidths[glyphId];
|
|
gGlyphInfo[0x81] = 12;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(glyphId == 0)
|
|
{
|
|
lastColor = GetLastTextColor(2);
|
|
|
|
for(i = 0; i < 0x80; i++)
|
|
{
|
|
gGlyphInfo[i] = lastColor | lastColor << 4;
|
|
// but why
|
|
gGlyphInfo[0x80] = gFont2LatinGlyphWidths[0];
|
|
gGlyphInfo[0x81] = 14;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
glyphs = gFont2LatinGlyphs + (0x20 * glyphId);
|
|
DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo);
|
|
DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo + 0x20));
|
|
DecompressGlyphTile(glyphs + 0x10, (u16 *)(gGlyphInfo + 0x40));
|
|
DecompressGlyphTile(glyphs + 0x18, (u16 *)(gGlyphInfo + 0x60));
|
|
gGlyphInfo[0x80] = gFont2LatinGlyphWidths[glyphId];
|
|
gGlyphInfo[0x81] = 14;
|
|
}
|
|
}
|
|
}
|
|
|
|
s32 GetGlyphWidthFont2(u16 glyphId, bool32 isJapanese)
|
|
{
|
|
if (isJapanese == TRUE)
|
|
{
|
|
if(glyphId == 0)
|
|
return 10;
|
|
|
|
return gFont2JapaneseGlyphWidths[glyphId];
|
|
}
|
|
else
|
|
{
|
|
return gFont2LatinGlyphWidths[glyphId];
|
|
}
|
|
}
|
|
|
|
static void DecompressGlyphFont3(u16 glyphId, bool32 isJapanese)
|
|
{
|
|
const u16* glyphs;
|
|
int i;
|
|
u8 lastColor;
|
|
|
|
if(isJapanese == TRUE)
|
|
{
|
|
if(glyphId == 0)
|
|
{
|
|
lastColor = GetLastTextColor(2);
|
|
|
|
for(i = 0; i < 0x80; i++)
|
|
{
|
|
gGlyphInfo[i] = lastColor | lastColor << 4;
|
|
// Game Freak, please. writing the same values over and over...
|
|
gGlyphInfo[0x80] = 10;
|
|
gGlyphInfo[0x81] = 12;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
glyphs = gFont2JapaneseGlyphs + (0x100 * (glyphId >> 0x3)) + (0x10 * (glyphId & 0x7));
|
|
DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo);
|
|
DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo + 0x20));
|
|
DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo + 0x40));
|
|
DecompressGlyphTile(glyphs + 0x88, (u16 *)(gGlyphInfo + 0x60));
|
|
gGlyphInfo[0x80] = 10;
|
|
gGlyphInfo[0x81] = 12;
|
|
}
|
|
}
|
|
else
|
|
DecompressGlyphFont2(glyphId, isJapanese);
|
|
}
|
|
|
|
s32 GetGlyphWidthFont3(u16 glyphId, bool32 isJapanese)
|
|
{
|
|
if(isJapanese == TRUE)
|
|
return 10;
|
|
else
|
|
return gFont2LatinGlyphWidths[glyphId];
|
|
}
|
|
|
|
static void DecompressGlyphFont4(u16 glyphId, bool32 isJapanese)
|
|
{
|
|
const u16* glyphs;
|
|
int i;
|
|
u8 lastColor;
|
|
|
|
if(isJapanese == TRUE)
|
|
{
|
|
if(glyphId == 0)
|
|
{
|
|
lastColor = GetLastTextColor(2);
|
|
|
|
for(i = 0; i < 0x80; i++)
|
|
{
|
|
gGlyphInfo[i] = lastColor | lastColor << 4;
|
|
// Game Freak, please. writing the same values over and over...
|
|
gGlyphInfo[0x80] = 10;
|
|
gGlyphInfo[0x81] = 12;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
glyphs = gFont4JapaneseGlyphs + (0x100 * (glyphId >> 0x3)) + (0x10 * (glyphId & 0x7));
|
|
DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo);
|
|
DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo + 0x20));
|
|
DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo + 0x40));
|
|
DecompressGlyphTile(glyphs + 0x88, (u16 *)(gGlyphInfo + 0x60));
|
|
gGlyphInfo[0x80] = gFont4JapaneseGlyphWidths[glyphId];
|
|
gGlyphInfo[0x81] = 12;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(glyphId == 0)
|
|
{
|
|
lastColor = GetLastTextColor(2);
|
|
|
|
for(i = 0; i < 0x80; i++)
|
|
{
|
|
gGlyphInfo[i] = lastColor | lastColor << 4;
|
|
// but why
|
|
gGlyphInfo[0x80] = gFont4LatinGlyphWidths[0];
|
|
gGlyphInfo[0x81] = 14;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
glyphs = gFont4LatinGlyphs + (0x20 * glyphId);
|
|
DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo);
|
|
DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo + 0x20));
|
|
DecompressGlyphTile(glyphs + 0x10, (u16 *)(gGlyphInfo + 0x40));
|
|
DecompressGlyphTile(glyphs + 0x18, (u16 *)(gGlyphInfo + 0x60));
|
|
gGlyphInfo[0x80] = gFont4LatinGlyphWidths[glyphId];
|
|
gGlyphInfo[0x81] = 14;
|
|
}
|
|
}
|
|
}
|
|
|
|
s32 GetGlyphWidthFont4(u16 glyphId, bool32 isJapanese)
|
|
{
|
|
if(isJapanese == TRUE)
|
|
{
|
|
if(glyphId == 0)
|
|
return 10;
|
|
|
|
return gFont4JapaneseGlyphWidths[glyphId];
|
|
}
|
|
else
|
|
return gFont4LatinGlyphWidths[glyphId];
|
|
}
|
|
|
|
void DecompressGlyphFont5(u16 glyphId, bool32 isJapanese)
|
|
{
|
|
const u16* glyphs;
|
|
int i;
|
|
u8 lastColor;
|
|
|
|
if(isJapanese == TRUE)
|
|
{
|
|
if(glyphId == 0)
|
|
{
|
|
lastColor = GetLastTextColor(2);
|
|
|
|
for(i = 0; i < 0x80; i++)
|
|
{
|
|
gGlyphInfo[i] = lastColor | lastColor << 4;
|
|
// Game Freak, please. writing the same values over and over...
|
|
gGlyphInfo[0x80] = 10;
|
|
gGlyphInfo[0x81] = 12;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
glyphs = gFont5JapaneseGlyphs + (0x100 * (glyphId >> 0x3)) + (0x10 * (glyphId & 0x7));
|
|
DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo);
|
|
DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo + 0x20));
|
|
DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo + 0x40));
|
|
DecompressGlyphTile(glyphs + 0x88, (u16 *)(gGlyphInfo + 0x60));
|
|
gGlyphInfo[0x80] = gFont5JapaneseGlyphWidths[glyphId];
|
|
gGlyphInfo[0x81] = 12;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(glyphId == 0)
|
|
{
|
|
lastColor = GetLastTextColor(2);
|
|
|
|
for(i = 0; i < 0x80; i++)
|
|
{
|
|
gGlyphInfo[i] = lastColor | lastColor << 4;
|
|
// but why
|
|
gGlyphInfo[0x80] = gFont5LatinGlyphWidths[0];
|
|
gGlyphInfo[0x81] = 14;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
glyphs = gFont5LatinGlyphs + (0x20 * glyphId);
|
|
DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo);
|
|
DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo + 0x20));
|
|
DecompressGlyphTile(glyphs + 0x10, (u16 *)(gGlyphInfo + 0x40));
|
|
DecompressGlyphTile(glyphs + 0x18, (u16 *)(gGlyphInfo + 0x60));
|
|
gGlyphInfo[0x80] = gFont5LatinGlyphWidths[glyphId];
|
|
gGlyphInfo[0x81] = 14;
|
|
}
|
|
}
|
|
}
|
|
|
|
s32 GetGlyphWidthFont5(u16 glyphId, bool32 isJapanese)
|
|
{
|
|
if(isJapanese == TRUE)
|
|
{
|
|
if(glyphId == 0)
|
|
return 10;
|
|
|
|
return gFont5JapaneseGlyphWidths[glyphId];
|
|
}
|
|
else
|
|
return gFont5LatinGlyphWidths[glyphId];
|
|
}
|
|
|
|
void DecompressGlyphFont9(u16 glyphId)
|
|
{
|
|
const u16* glyphs = gFont9JapaneseGlyphs + (0x100 * (glyphId >> 0x4)) + (0x8 * (glyphId & 0xF));
|
|
DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo);
|
|
DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo + 0x40));
|
|
gGlyphInfo[0x80] = 8;
|
|
gGlyphInfo[0x81] = 12;
|
|
}
|