From c84f05baaad5ff14da312cd4971e6da56bd72c0f Mon Sep 17 00:00:00 2001 From: cawtds <38510667+cawtds@users.noreply.github.com> Date: Fri, 21 Jun 2024 23:16:57 +0200 Subject: [PATCH] added 5 narrow fonts from expansion --- charmap.txt | 5 + gflib/text.c | 535 +++++++++++- gflib/text.h | 17 +- graphics/fonts/latin_narrow.png | Bin 0 -> 3449 bytes graphics/fonts/latin_narrower.png | Bin 0 -> 7346 bytes graphics/fonts/latin_short_narrow.png | Bin 0 -> 7508 bytes graphics/fonts/latin_small_narrow.png | Bin 0 -> 3114 bytes graphics/fonts/latin_small_narrower.png | Bin 0 -> 7037 bytes graphics_file_rules.mk | 17 + include/item.h | 2 +- src/battle_message.c | 9 + src/braille_text.c | 2 +- src/item.c | 31 + src/new_menu_helpers.c | 52 +- test/text.c | 1040 +++++++++++------------ 15 files changed, 1162 insertions(+), 548 deletions(-) create mode 100644 graphics/fonts/latin_narrow.png create mode 100644 graphics/fonts/latin_narrower.png create mode 100644 graphics/fonts/latin_short_narrow.png create mode 100644 graphics/fonts/latin_small_narrow.png create mode 100644 graphics/fonts/latin_small_narrower.png diff --git a/charmap.txt b/charmap.txt index 66b8b5393..cc3902a03 100644 --- a/charmap.txt +++ b/charmap.txt @@ -461,6 +461,11 @@ FONT_NORMAL = FC 06 02 FONT_NORMAL_COPY_2 = FC 06 03 FONT_MALE = FC 06 04 FONT_FEMALE = FC 06 05 +FONT_NARROW = FC 06 07 +FONT_SMALL_NARROW = FC 06 08 +FONT_NARROWER = FC 06 0A +FONT_SMALL_NARROWER = FC 06 0B +FONT_SHORT_NARROW = FC 06 0C @ colors diff --git a/gflib/text.c b/gflib/text.c index cb8c106ab..a9c3c98ed 100644 --- a/gflib/text.c +++ b/gflib/text.c @@ -24,12 +24,22 @@ static void DecompressGlyph_NormalCopy1(u16 glyphId, bool32 isJapanese); static void DecompressGlyph_NormalCopy2(u16 glyphId, bool32 isJapanese); static void DecompressGlyph_Male(u16 glyphId, bool32 isJapanese); static void DecompressGlyph_Bold(u16 glyphId); -static s32 GetGlyphWidth_Small(u16 glyphId, bool32 isJapanese); -static s32 GetGlyphWidth_NormalCopy1(u16 glyphId, bool32 isJapanese); -static s32 GetGlyphWidth_Normal(u16 glyphId, bool32 isJapanese); -static s32 GetGlyphWidth_NormalCopy2(u16 glyphId, bool32 isJapanese); -static s32 GetGlyphWidth_Male(u16 glyphId, bool32 isJapanese); -static s32 GetGlyphWidth_Female(u16 glyphId, bool32 isJapanese); +static void DecompressGlyph_Narrow(u16, bool32); +static void DecompressGlyph_SmallNarrow(u16, bool32); +static void DecompressGlyph_Narrower(u16, bool32); +static void DecompressGlyph_SmallNarrower(u16, bool32); +static void DecompressGlyph_ShortNarrow(u16, bool32); +static u32 GetGlyphWidth_Small(u16 glyphId, bool32 isJapanese); +static u32 GetGlyphWidth_NormalCopy1(u16 glyphId, bool32 isJapanese); +static u32 GetGlyphWidth_Normal(u16 glyphId, bool32 isJapanese); +static u32 GetGlyphWidth_NormalCopy2(u16 glyphId, bool32 isJapanese); +static u32 GetGlyphWidth_Male(u16 glyphId, bool32 isJapanese); +static u32 GetGlyphWidth_Female(u16 glyphId, bool32 isJapanese); +static u32 GetGlyphWidth_Narrow(u16, bool32); +static u32 GetGlyphWidth_SmallNarrow(u16, bool32); +static u32 GetGlyphWidth_Narrower(u16, bool32); +static u32 GetGlyphWidth_SmallNarrower(u16, bool32); +static u32 GetGlyphWidth_ShortNarrow(u16, bool32); static void SpriteCB_TextCursor(struct Sprite *sprite); TextFlags gTextFlags; @@ -55,7 +65,12 @@ static const struct GlyphWidthFunc sGlyphWidthFuncs[] = { { FONT_NORMAL_COPY_2, GetGlyphWidth_NormalCopy2 }, { FONT_MALE, GetGlyphWidth_Male }, { FONT_FEMALE, GetGlyphWidth_Female }, - { FONT_BRAILLE, GetGlyphWidth_Braille } + { FONT_BRAILLE, GetGlyphWidth_Braille }, + { FONT_NARROW, GetGlyphWidth_Narrow }, + { FONT_SMALL_NARROW, GetGlyphWidth_SmallNarrow }, + { FONT_NARROWER, GetGlyphWidth_Narrower }, + { FONT_SMALL_NARROWER, GetGlyphWidth_SmallNarrower }, + { FONT_SHORT_NARROW, GetGlyphWidth_ShortNarrow }, }; static const struct SpriteSheet sSpriteSheets_TextCursor[] = @@ -390,6 +405,187 @@ static const u8 sFontFemaleJapaneseGlyphWidths[] = 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0 }; +ALIGNED(4) const u16 gFontSmallNarrowLatinGlyphs[] = INCBIN_U16("graphics/fonts/small_narrow.latfont"); +ALIGNED(4) const u8 gFontSmallNarrowLatinGlyphWidths[] = { + 3, 5, 5, 5, 5, 5, 5, 5, 5, 4, 3, 4, 4, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 3, 4, 5, 5, 5, 5, 4, 3, + 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 8, 5, 6, 3, + 3, 3, 3, 3, 8, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 5, 5, 3, 8, 8, 8, 8, 8, 8, 8, 4, 5, 4, 4, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 3, 3, 3, 3, 3, 4, + 3, 3, 3, 3, 3, 3, 3, 5, 3, 8, 8, 8, 8, 1, 2, 3, + 4, 5, 6, 7, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 3, 5, 5, + 5, 5, 5, 3, 3, 5, 5, 5, 3, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, + 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 5, + 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, + 3, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 3, +}; + +ALIGNED(4) const u16 gFontNarrowLatinGlyphs[] = INCBIN_U16("graphics/fonts/narrow.latfont"); +ALIGNED(4) const u8 gFontNarrowLatinGlyphWidths[] = { + 3, 5, 5, 5, 5, 5, 5, 5, 5, 4, 3, 4, 4, 5, 5, 5, + 8, 5, 5, 5, 5, 6, 5, 5, 3, 5, 5, 5, 5, 5, 4, 3, + 4, 4, 5, 5, 5, 8, 5, 5, 5, 5, 5, 6, 9, 6, 6, 3, + 3, 3, 3, 3, 8, 8, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 5, 5, 4, 8, 8, 8, 7, 8, 8, 4, 4, 6, 4, 4, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 3, 3, 3, 3, 3, 4, + 3, 3, 3, 3, 3, 3, 3, 5, 3, 7, 7, 7, 7, 1, 2, 3, + 4, 5, 6, 7, 5, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 8, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 3, 5, 3, + 5, 5, 5, 3, 3, 5, 5, 6, 3, 6, 6, 5, 5, 5, 5, 5, + 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, + 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 8, + 3, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 10, 10, 10, 10, 8, 8, 10, 8, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 3, +}; + +ALIGNED(4) const u16 gFontNarrowerLatinGlyphs[] = INCBIN_U16("graphics/fonts/narrower.latfont"); +ALIGNED(4) const u8 gFontNarrowerLatinGlyphWidths[] = { + 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, + 8, 4, 4, 4, 5, 5, 4, 4, 3, 4, 4, 4, 4, 4, 4, 3, + 4, 4, 4, 4, 4, 6, 4, 4, 4, 5, 4, 5, 8, 6, 6, 3, + 3, 3, 3, 3, 8, 8, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 5, 5, 4, 8, 8, 8, 7, 8, 8, 4, 4, 6, 4, 4, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 3, 4, + 3, 3, 3, 3, 3, 3, 3, 5, 3, 7, 7, 7, 7, 0, 0, 3, + 4, 5, 6, 7, 4, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 3, 5, 3, + 5, 5, 5, 3, 3, 5, 5, 6, 3, 6, 6, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 5, 5, 4, 4, 4, 4, 4, 4, 4, + 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 4, + 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, + 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 10, 10, 10, 10, 8, 8, 10, 8, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 3, +}; + +ALIGNED(4) const u16 gFontSmallNarrowerLatinGlyphs[] = INCBIN_U16("graphics/fonts/small_narrower.latfont"); +ALIGNED(4) const u8 gFontSmallNarrowerLatinGlyphWidths[] = { + 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, + 5, 4, 4, 4, 5, 4, 4, 4, 3, 4, 4, 4, 4, 4, 3, 3, + 4, 4, 4, 4, 4, 6, 4, 4, 4, 5, 4, 4, 7, 5, 6, 3, + 3, 3, 3, 3, 8, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 5, 4, 3, 7, 7, 7, 8, 8, 8, 8, 4, 5, 4, 4, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 3, 4, + 3, 3, 3, 3, 3, 3, 3, 5, 3, 8, 8, 8, 8, 0, 0, 3, + 4, 5, 6, 7, 4, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 3, 4, 4, + 5, 5, 5, 3, 3, 5, 5, 5, 4, 5, 5, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 3, 4, + 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, + 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 8, 8, 8, 8, 8, 7, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 3, +}; + +ALIGNED(4) const u16 gFontShortNarrowLatinGlyphs[] = INCBIN_U16("graphics/fonts/short_narrow.latfont"); +ALIGNED(4) const u8 gFontShortNarrowLatinGlyphWidths[] = { + 3, 5, 5, 5, 5, 5, 5, 5, 5, 4, 3, 4, 4, 5, 5, 5, + 8, 5, 5, 5, 5, 6, 5, 5, 3, 5, 5, 5, 5, 5, 4, 3, + 4, 4, 5, 5, 5, 8, 5, 5, 5, 5, 6, 6, 9, 6, 6, 3, + 3, 3, 3, 3, 10, 8, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 6, 6, 6, 8, 8, 8, 8, 8, 8, 4, 6, 8, 5, 5, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 3, 3, 3, 3, 3, 6, + 3, 3, 3, 3, 3, 3, 3, 6, 3, 12, 12, 12, 12, 0, 0, 3, + 4, 5, 6, 7, 8, 8, 8, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 8, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 5, + 6, 6, 6, 3, 3, 6, 6, 8, 5, 9, 6, 5, 5, 5, 5, 5, + 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, + 5, 5, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, + 4, 6, 5, 5, 5, 5, 5, 5, 4, 5, 5, 6, 4, 5, 5, 8, + 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 12, 12, 12, 12, 8, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 3, +}; + + static const u16 sFontBoldJapaneseGlyphs[] = INCBIN_U16("graphics/fonts/japanese_bold.fwjpnfont"); u16 FontFunc_Small(struct TextPrinter *textPrinter) @@ -464,6 +660,66 @@ u16 FontFunc_Female(struct TextPrinter *textPrinter) return RenderText(textPrinter); } +u16 FontFunc_Narrow(struct TextPrinter *textPrinter) +{ + struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub; + + if (subStruct->hasGlyphIdBeenSet == FALSE) + { + textPrinter->subUnion.sub.glyphId = FONT_NARROW; + subStruct->hasGlyphIdBeenSet = TRUE; + } + return RenderText(textPrinter); +} + +u16 FontFunc_SmallNarrow(struct TextPrinter *textPrinter) +{ + struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub; + + if (subStruct->hasGlyphIdBeenSet == FALSE) + { + textPrinter->subUnion.sub.glyphId = FONT_SMALL_NARROW; + subStruct->hasGlyphIdBeenSet = TRUE; + } + return RenderText(textPrinter); +} + +u16 FontFunc_Narrower(struct TextPrinter *textPrinter) +{ + struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub; + + if (subStruct->hasGlyphIdBeenSet == FALSE) + { + textPrinter->subUnion.sub.glyphId = FONT_NARROWER; + subStruct->hasGlyphIdBeenSet = TRUE; + } + return RenderText(textPrinter); +} + +u16 FontFunc_SmallNarrower(struct TextPrinter *textPrinter) +{ + struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub; + + if (subStruct->hasGlyphIdBeenSet == FALSE) + { + textPrinter->subUnion.sub.glyphId = FONT_SMALL_NARROWER; + subStruct->hasGlyphIdBeenSet = TRUE; + } + return RenderText(textPrinter); +} + +u16 FontFunc_ShortNarrow(struct TextPrinter *textPrinter) +{ + struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub; + + if (subStruct->hasGlyphIdBeenSet == FALSE) + { + textPrinter->subUnion.sub.glyphId = FONT_SHORT_NARROW; + subStruct->hasGlyphIdBeenSet = TRUE; + } + return RenderText(textPrinter); +} + void TextPrinterInitDownArrowCounters(struct TextPrinter *textPrinter) { struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub; @@ -843,6 +1099,21 @@ u16 RenderText(struct TextPrinter *textPrinter) case FONT_FEMALE: DecompressGlyph_Female(currChar, textPrinter->japanese); break; + case FONT_NARROW: + DecompressGlyph_Narrow(currChar, textPrinter->japanese); + break; + case FONT_SMALL_NARROW: + DecompressGlyph_SmallNarrow(currChar, textPrinter->japanese); + break; + case FONT_NARROWER: + DecompressGlyph_Narrower(currChar, textPrinter->japanese); + break; + case FONT_SMALL_NARROWER: + DecompressGlyph_SmallNarrower(currChar, textPrinter->japanese); + break; + case FONT_SHORT_NARROW: + DecompressGlyph_ShortNarrow(currChar, textPrinter->japanese); + break; } CopyGlyphToWindow(textPrinter); @@ -923,7 +1194,7 @@ u16 RenderText(struct TextPrinter *textPrinter) return RENDER_FINISH; } -s32 (*GetFontWidthFunc(u8 glyphId))(u16 _glyphId, bool32 _isJapanese) +u32 (*GetFontWidthFunc(u8 glyphId))(u16 _glyphId, bool32 _isJapanese) { u32 i; @@ -940,7 +1211,7 @@ s32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing) { bool8 isJapanese; int minGlyphWidth; - s32 (*func)(u16 glyphId, bool32 isJapanese); + u32 (*func)(u16 glyphId, bool32 isJapanese); int localLetterSpacing; u32 lineWidth; const u8 *bufferPointer; @@ -1304,7 +1575,7 @@ void DecompressGlyph_Small(u16 glyphId, bool32 isJapanese) } } -static s32 GetGlyphWidth_Small(u16 glyphId, bool32 isJapanese) +static u32 GetGlyphWidth_Small(u16 glyphId, bool32 isJapanese) { if (isJapanese == TRUE) return 8; @@ -1338,7 +1609,7 @@ static void DecompressGlyph_NormalCopy1(u16 glyphId, bool32 isJapanese) } } -static s32 GetGlyphWidth_NormalCopy1(u16 glyphId, bool32 isJapanese) +static u32 GetGlyphWidth_NormalCopy1(u16 glyphId, bool32 isJapanese) { if (isJapanese == TRUE) return 8; @@ -1404,7 +1675,7 @@ void DecompressGlyph_Normal(u16 glyphId, bool32 isJapanese) } } -static s32 GetGlyphWidth_Normal(u16 glyphId, bool32 isJapanese) +static u32 GetGlyphWidth_Normal(u16 glyphId, bool32 isJapanese) { if (isJapanese == TRUE) { @@ -1454,7 +1725,7 @@ static void DecompressGlyph_NormalCopy2(u16 glyphId, bool32 isJapanese) DecompressGlyph_Normal(glyphId, isJapanese); } -static s32 GetGlyphWidth_NormalCopy2(u16 glyphId, bool32 isJapanese) +static u32 GetGlyphWidth_NormalCopy2(u16 glyphId, bool32 isJapanese) { if (isJapanese == TRUE) return 10; @@ -1520,7 +1791,7 @@ static void DecompressGlyph_Male(u16 glyphId, bool32 isJapanese) } } -static s32 GetGlyphWidth_Male(u16 glyphId, bool32 isJapanese) +static u32 GetGlyphWidth_Male(u16 glyphId, bool32 isJapanese) { if (isJapanese == TRUE) { @@ -1591,7 +1862,7 @@ void DecompressGlyph_Female(u16 glyphId, bool32 isJapanese) } } -static s32 GetGlyphWidth_Female(u16 glyphId, bool32 isJapanese) +static u32 GetGlyphWidth_Female(u16 glyphId, bool32 isJapanese) { if (isJapanese == TRUE) { @@ -1613,21 +1884,241 @@ static void DecompressGlyph_Bold(u16 glyphId) gGlyphInfo.height = 12; } +static void DecompressGlyph_Narrow(u16 glyphId, bool32 isJapanese) +{ + const u16 *glyphs; + + if (isJapanese == TRUE) + { + glyphs = sFontNormalJapaneseGlyphs + (0x100 * (glyphId >> 0x4)) + (0x8 * (glyphId % 0x10)); + DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); + DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20)); + DecompressGlyphTile(glyphs + 0x10, (u16 *)(gGlyphInfo.pixels + 0x40)); + DecompressGlyphTile(glyphs + 0x18, (u16 *)(gGlyphInfo.pixels + 0x60)); + gGlyphInfo.width = 8; + gGlyphInfo.height = 15; + } + else + { + glyphs = gFontNarrowLatinGlyphs + (0x20 * glyphId); + gGlyphInfo.width = gFontNarrowLatinGlyphWidths[glyphId]; + + if (gGlyphInfo.width <= 8) + { + DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); + DecompressGlyphTile(glyphs + 0x10, (u16 *)(gGlyphInfo.pixels + 0x40)); + } + else + { + DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); + DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20)); + DecompressGlyphTile(glyphs + 0x10, (u16 *)(gGlyphInfo.pixels + 0x40)); + DecompressGlyphTile(glyphs + 0x18, (u16 *)(gGlyphInfo.pixels + 0x60)); + } + + gGlyphInfo.height = 15; + } +} + +static u32 GetGlyphWidth_Narrow(u16 glyphId, bool32 isJapanese) +{ + if (isJapanese == TRUE) + return 8; + else + return gFontNarrowLatinGlyphWidths[glyphId]; +} + +static void DecompressGlyph_SmallNarrow(u16 glyphId, bool32 isJapanese) +{ + const u16 *glyphs; + + if (isJapanese == TRUE) + { + glyphs = sFontNormalJapaneseGlyphs + (0x100 * (glyphId >> 0x4)) + (0x8 * (glyphId & 0xF)); + DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); + DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20)); + DecompressGlyphTile(glyphs + 0x10, (u16 *)(gGlyphInfo.pixels + 0x40)); + DecompressGlyphTile(glyphs + 0x18, (u16 *)(gGlyphInfo.pixels + 0x60)); + gGlyphInfo.width = 8; + gGlyphInfo.height = 12; + } + else + { + glyphs = gFontSmallNarrowLatinGlyphs + (0x20 * glyphId); + gGlyphInfo.width = gFontSmallNarrowLatinGlyphWidths[glyphId]; + + if (gGlyphInfo.width <= 8) + { + DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); + DecompressGlyphTile(glyphs + 0x10, (u16 *)(gGlyphInfo.pixels + 0x40)); + } + else + { + DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); + DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20)); + DecompressGlyphTile(glyphs + 0x10, (u16 *)(gGlyphInfo.pixels + 0x40)); + DecompressGlyphTile(glyphs + 0x18, (u16 *)(gGlyphInfo.pixels + 0x60)); + } + + gGlyphInfo.height = 12; + } +} + +static u32 GetGlyphWidth_SmallNarrow(u16 glyphId, bool32 isJapanese) +{ + if (isJapanese == TRUE) + return 8; + else + return gFontSmallNarrowLatinGlyphWidths[glyphId]; +} + +static void DecompressGlyph_Narrower(u16 glyphId, bool32 isJapanese) +{ + const u16 *glyphs; + + if (isJapanese == TRUE) + { + glyphs = sFontNormalJapaneseGlyphs + (0x100 * (glyphId >> 0x4)) + (0x8 * (glyphId % 0x10)); + DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); + DecompressGlyphTile(glyphs + 0x10, (u16 *)(gGlyphInfo.pixels + 0x40)); + gGlyphInfo.width = 8; + gGlyphInfo.height = 15; + } + else + { + glyphs = gFontNarrowerLatinGlyphs + (0x20 * glyphId); + gGlyphInfo.width = gFontNarrowerLatinGlyphWidths[glyphId]; + + if (gGlyphInfo.width <= 8) + { + DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); + DecompressGlyphTile(glyphs + 0x10, (u16 *)(gGlyphInfo.pixels + 0x40)); + } + else + { + DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); + DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20)); + DecompressGlyphTile(glyphs + 0x10, (u16 *)(gGlyphInfo.pixels + 0x40)); + DecompressGlyphTile(glyphs + 0x18, (u16 *)(gGlyphInfo.pixels + 0x60)); + } + + gGlyphInfo.height = 15; + } +} + +static u32 GetGlyphWidth_Narrower(u16 glyphId, bool32 isJapanese) +{ + if (isJapanese == TRUE) + return 8; + else + return gFontNarrowerLatinGlyphWidths[glyphId]; +} + +static void DecompressGlyph_SmallNarrower(u16 glyphId, bool32 isJapanese) +{ + const u16 *glyphs; + + if (isJapanese == TRUE) + { + glyphs = sFontNormalJapaneseGlyphs + (0x100 * (glyphId >> 0x4)) + (0x8 * (glyphId % 0x10)); + DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); + DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20)); + DecompressGlyphTile(glyphs + 0x10, (u16 *)(gGlyphInfo.pixels + 0x40)); + DecompressGlyphTile(glyphs + 0x18, (u16 *)(gGlyphInfo.pixels + 0x60)); + gGlyphInfo.width = 8; + gGlyphInfo.height = 15; + } + else + { + glyphs = gFontSmallNarrowerLatinGlyphs + (0x20 * glyphId); + gGlyphInfo.width = gFontSmallNarrowerLatinGlyphWidths[glyphId]; + + if (gGlyphInfo.width <= 8) + { + DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); + DecompressGlyphTile(glyphs + 0x10, (u16 *)(gGlyphInfo.pixels + 0x40)); + } + else + { + DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); + DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20)); + DecompressGlyphTile(glyphs + 0x10, (u16 *)(gGlyphInfo.pixels + 0x40)); + DecompressGlyphTile(glyphs + 0x18, (u16 *)(gGlyphInfo.pixels + 0x60)); + } + + gGlyphInfo.height = 15; + } +} + +static u32 GetGlyphWidth_SmallNarrower(u16 glyphId, bool32 isJapanese) +{ + if (isJapanese == TRUE) + return 8; + else + return gFontSmallNarrowerLatinGlyphWidths[glyphId]; +} + +static void DecompressGlyph_ShortNarrow(u16 glyphId, bool32 isJapanese) +{ + const u16 *glyphs; + + if (isJapanese == TRUE) + { + glyphs = sFontNormalJapaneseGlyphs + (0x100 * (glyphId >> 0x3)) + (0x10 * (glyphId & 0x7)); + DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); + DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20)); + DecompressGlyphTile(glyphs + 0x10, (u16 *)(gGlyphInfo.pixels + 0x40)); + DecompressGlyphTile(glyphs + 0x18, (u16 *)(gGlyphInfo.pixels + 0x60)); + gGlyphInfo.width = sFontNormalJapaneseGlyphWidths[glyphId]; + gGlyphInfo.height = 14; + } + else + { + glyphs = gFontShortNarrowLatinGlyphs + (0x20 * glyphId); + gGlyphInfo.width = gFontShortNarrowLatinGlyphWidths[glyphId]; + + if (gGlyphInfo.width <= 8) + { + DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); + DecompressGlyphTile(glyphs + 0x10, (u16 *)(gGlyphInfo.pixels + 0x40)); + } + else + { + DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); + DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20)); + DecompressGlyphTile(glyphs + 0x10, (u16 *)(gGlyphInfo.pixels + 0x40)); + DecompressGlyphTile(glyphs + 0x18, (u16 *)(gGlyphInfo.pixels + 0x60)); + } + + gGlyphInfo.height = 14; + } +} + +static u32 GetGlyphWidth_ShortNarrow(u16 glyphId, bool32 isJapanese) +{ + if (isJapanese == TRUE) + return sFontNormalJapaneseGlyphWidths[glyphId]; + else + return gFontShortNarrowLatinGlyphWidths[glyphId]; +} + static const s8 sNarrowerFontIds[] = { - [FONT_SMALL] = -1, // FONT_SMALL_NARROW, - [FONT_NORMAL] = -1, // FONT_NARROW, + [FONT_SMALL] = FONT_SMALL_NARROW, // FONT_SMALL_NARROW, + [FONT_NORMAL] = FONT_NARROW, // FONT_NARROW, // [FONT_SHORT] = FONT_SHORT_NARROW, // [FONT_SHORT_COPY_1] = FONT_SHORT_NARROW, // [FONT_SHORT_COPY_2] = FONT_SHORT_NARROW, // [FONT_SHORT_COPY_3] = FONT_SHORT_NARROW, [FONT_BRAILLE] = -1, - // [FONT_NARROW] = FONT_NARROWER, - // [FONT_SMALL_NARROW] = FONT_SMALL_NARROWER, + [FONT_NARROW] = FONT_NARROWER, + [FONT_SMALL_NARROW] = FONT_SMALL_NARROWER, [FONT_BOLD] = -1, - // [FONT_NARROWER] = -1, - // [FONT_SMALL_NARROWER] = -1, - // [FONT_SHORT_NARROW] = -1, + [FONT_NARROWER] = -1, + [FONT_SMALL_NARROWER] = -1, + [FONT_SHORT_NARROW] = -1, + [FONT_MALE] = FONT_NORMAL, + [FONT_FEMALE] = FONT_NORMAL, }; // If the narrowest font ID doesn't fit the text, we still return that diff --git a/gflib/text.h b/gflib/text.h index 2be25986d..bb2ea518a 100644 --- a/gflib/text.h +++ b/gflib/text.h @@ -20,6 +20,11 @@ enum { FONT_FEMALE, FONT_BRAILLE, FONT_BOLD, + FONT_NARROW, + FONT_SMALL_NARROW, // Very similar to FONT_SMALL, some glyphs are narrower + FONT_NARROWER, + FONT_SMALL_NARROWER, + FONT_SHORT_NARROW, }; // Return values for font functions @@ -125,7 +130,7 @@ extern const struct FontInfo *gFonts; struct GlyphWidthFunc { u32 fontId; - s32 (*func)(u16 glyphId, bool32 isJapanese); + u32 (*func)(u16 glyphId, bool32 isJapanese); }; typedef struct { @@ -166,6 +171,11 @@ u16 FontFunc_NormalCopy2(struct TextPrinter *textPrinter); u16 FontFunc_Male(struct TextPrinter *textPrinter); u16 FontFunc_Female(struct TextPrinter *textPrinter); u16 FontFunc_Braille(struct TextPrinter *textPrinter); +u16 FontFunc_Narrow(struct TextPrinter *textPrinter); +u16 FontFunc_SmallNarrow(struct TextPrinter *textPrinter); +u16 FontFunc_Narrower(struct TextPrinter *textPrinter); +u16 FontFunc_SmallNarrower(struct TextPrinter *textPrinter); +u16 FontFunc_ShortNarrow(struct TextPrinter *textPrinter); void TextPrinterInitDownArrowCounters(struct TextPrinter *textPrinter); void TextPrinterDrawDownArrow(struct TextPrinter *textPrinter); @@ -175,7 +185,7 @@ bool16 TextPrinterWaitWithDownArrow(struct TextPrinter *textPrinter); bool16 TextPrinterWait(struct TextPrinter *textPrinter); void DrawDownArrow(u8 windowId, u16 x, u16 y, u8 bgColor, bool8 drawArrow, u8 *counter, u8 *yCoordIndex); u16 RenderText(struct TextPrinter *textPrinter); -s32 (*GetFontWidthFunc(u8 glyphId))(u16, bool32); +u32 (*GetFontWidthFunc(u8 glyphId))(u16, bool32); s32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing); u8 RenderTextHandleBold(u8 *pixels, u8 fontId, u8 *str); u8 DrawKeypadIcon(u8 windowId, u8 keypadIconId, u16 x, u16 y); @@ -187,10 +197,11 @@ u8 GetMenuCursorDimensionByFont(u8 fontId, u8 whichDimension); void DecompressGlyph_Small(u16 glyphId, bool32 isJapanese); void DecompressGlyph_Normal(u16 glyphId, bool32 isJapanese); void DecompressGlyph_Female(u16 glyphId, bool32 isJapanese); -s32 GetGlyphWidth_Braille(u16 font_type, bool32 isJapanese); +u32 GetGlyphWidth_Braille(u16 font_type, bool32 isJapanese); u8 CreateTextCursorSprite(u8 sheetId, u16 x, u16 y, u8 priority, u8 subpriority); void DestroyTextCursorSprite(u8 spriteId); +u32 GetFontIdToFit(const u8 *string, u32 widestFontId, u32 letterSpacing, u32 widthPx); u8 *PrependFontIdToFit(u8 *start, u8 *end, u32 fontId, u32 width); #endif // GUARD_TEXT_H diff --git a/graphics/fonts/latin_narrow.png b/graphics/fonts/latin_narrow.png new file mode 100644 index 0000000000000000000000000000000000000000..08652d45f4896aac83a107b00b8086f2740b2964 GIT binary patch literal 3449 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 literal 0 HcmV?d00001 diff --git a/graphics/fonts/latin_short_narrow.png b/graphics/fonts/latin_short_narrow.png new file mode 100644 index 0000000000000000000000000000000000000000..cf48712719ace38225213bdf1b896ac07e7f9e19 GIT binary patch literal 7508 zcmeHKdo+~m_kU*wYUSA-|t$#?^)~n{qM|rXT8s}pS?eO@6WTJz1}C4 z>f#_PttJfsfUJ|FohtyqpdlQ9BcPYUJMR$abv@R78_$&%h2li8gP5TpiWkEHQD8JP z2mqo7!l*uS2yMwPAC)ZO*rgft#wVvtC#MgVbPViT*1D8u_wZAKW%v0cYW7&5_txv$ zTMdj=B@#`R+elzVW0)d~5d9gYx!YTC$Ll<_Ox1j$f#?2?(bwp1ru+uxIcQYhS=W$Ad6tZ{35_eOgI zgIx;Y?bPEhOVA_k<8P)U4oXvW1pp9K9 zV<=-`6ne((Z3`{1x~p}gdQC~$(#=a9+$p8;+N0ICV-D7MR9+mn{3K&*z8frfL3GFz zq7S2NlJ^>H)W5kQ*W=_?G1s~NX_vf5SHDka(@QTgt0vnw*l%BiaMQv1@bI$2-eIwB}vKM31@Vo86l zU&m&*_KC!gMxW2D!$r%ytBAQ~{4xA9aH_0)OqRouOjFj6yLPj&@k!j=N9UU6mD#Eh zHPuD2B&g`3nNV?Uqd1f3>@Y(bgB=JOMu%~rssjKE>u3&*z7yo30>NM=%M$&%u^EkG zGAz-a#uOZdV+)2b9b+Rvw^$cXGmgsF1D$14}0iuY8L_-|LKAO3UfVPrGSwt{`NUnApzC%DWOLPd2$01>{ zQBhHbQAURBh+r(<+}s?CBVY*x45WeK#;|y_Xbg+1vjFi8!w%%qBbXc>lg&acVA2BF zkvvN@8d^vF9$y%TLiq!p#r@6##0NH-#=+tZaoDgh?2i^)p8YNe)`IH}ol&eS z$Yn=H&_VlMAd9E-BLsu~hdn1UB6Kkw1|18Af?<#<7xIe#i%SP53iS_*1qy;@|Zz?lJ%F^7FHJ1`7sd4{14o}X#bx3qB5jKp^)s@^vH$qoa`*o3;szAHl4{J zeH-F&Ac&)b7-Lg&9EM0^m|y~p%z`j9GaTML$P~nbri34$oLF2QjYS6+pdfHVCWJ%4 z6B)*Mx;ci1BZ3$rXl8~nqvHcHj3B%@!GvgLZfy2(fMP&UL}Mbs zlz?YojEw0<7zj296KG;?f}w!~b0Z=l2xQ>CMZ=(zHn1bYXwY^t!)U=Emct5O^szuV z$%g7=i6$80{*+KdX}loFz!L4uWJN~*x!}$W1KoJE1vc@fcmk0?Fu@bejEwO{W`8Pq zfDv4%5*IM>I71`i;>yCdkf3BBVrdI?3IQz2pkVeM^VF*S>45$=v(AE)5Xcz_~Fv!%L7D&Sp=zm4$vV(Y0ve!&f9U#K4E!zSf2!-hMwj%T z*C~(%eFa59m!-owk8+`l))K0-yM1Q+yqTFL|-sVp{E! zx9_xcPsSAUy@eIJp5v>xtJMkU;TcZk%rs~gcPDxPq4d7-%+d1w^c)Ll~`@%?GG=-h#bU!@R^)87GyyWcG20{&d}Q8nzI2lnERa z>|giJ(emXjV6|*t+3KgYdBep<0$(ywn-r%YPq^WJ*sJezEGO#oL?tfV zSD`Bt!(%&<4;EHDlMt*kvM}MkE}!W(SUU(Bmfm53V&2MKZ;YHB8D_`jg^l6o z5j{sTm37>KXX*W68d-YrmO2~G0$0`d`IJa+JGW*6{;J3hyt5zhLKf)@waLv(1fFXV zoadp@=a$g(VY%f=yQ@w~Dc~O@pN91ci|l_neTs`=joSC`Ctj&Jd{&P1N-m%!C9Bgd zNXI3uUBS^i_`>lUHQ{!Ny31?@@(FUHDk8(SRvQ!tc1eifU+dQ6_sS=k^Y@D-I|1|7 zO2Y{PgdXv;2Ze(Qmp!rLxC(tJyX?cR2!CzykY$2YUH)AY#knVe5x5P_rrvCzb7Mr}W zbqFrP5ST1im~ASit^ z*tNT@&pLcilsb{31avf>fX{j;t=!5^jWE%{&yr^{Pb8x2Z^-(-8g~y-5s})L$1BC~ z+Y3|H$<||RU+o#)49Brsj;fEl7f|*Dx8It-mHe!5nX?LvcpL5w!j6HkIS}@G0;sf3 zKNG)aT*>_!f^S=(S-cPQRLxi3meKWzQf z#&wbECojr6HEo||7pNXM9Y1^$NL!Adi8xZCHs(aVn2wYUktF50@bw^wDKDkas3hr(1deqDreY-O;%$6++7+>cT1iE*fEG?M6B^Jc`Do#d<1L>7O zXwpDtzYTdg;>?Ke z=c=_NN|o+w2kajmiyd#!dn5fN>z)e1cM1HmrAyV85uoveM1VLtfGo3O!($kip-BzB zaQ3yRW{wmfsT?iK-|5}X{}m{e<@mX-c5KaXR&@9D9MT=T+!Djz;w3y^1;35hJ9e>S z-_2u%hS%cA_P;6p*Nh#icE@@E%{=S__}f0R5n_!J3SYYPHPc=iNje@ z54Idow)R3sNo1yr=W9NRSfA}3XlFZ=qP2c3rhn}CI-!%C2%XYN*SXSxaE<_q;hB1? zfG{aRFk;1(*nygy(?^8IJ3Ow+XwxzkZw!vr$q*u@S2EYPXWxvQdZ--MS0$mC|mM^CB`nsZ(bb z&GLOXOUr$^!g$r4t<7OQfZx&UN09Xn)#O9+u0_X`)&wf8Y9{zeXO_w!#*$Ay zQ&UZ7JC`s~ezXQBaMzVHCU1@r^RAccNvz%BQcMbI&^6dHPrj%??oBK-8qA-w_bDkf zimysT9>~Z~(zUiXl&v3)7GRW@-+OMj%?92T@w_6E8vK(We%?J~$N4NV;y|WI(vu=1JfuSyeY^ov zRvR08eoK{}mD7##;elTUf{r8J6xPV9^%hWY&N<#Yc`*h+Z)F?ovL?dYFN;~TL6yvJ z>Pib_q zp4T{S;SZ2YQadZ}OT$lPoZO(u3pS7?R&cHe38X2dvk&%#Waa4aHPZS6E&{;Q2;|@; zahBS?k=xtU#C&U2aj@Nm`GPaRhhhTqh64+!U%U}>oq@hvzqN@e)%;Z=-r}=71OBs` zhK=y*OpM>4!O&VO!`JXuWLk!*r;K~a^CwIF-#gb&T^Ox-a1RbVs?%xb`0d(Su~cUR z)X)Q4QvTz?r?QSD5?%QP9oDJV0>OZhGo7Y%&eqeU%QjIu#0O(h^2~hJ`A}U3_|9%NA0EZoh1cpQ3qXnW* zH;t?PYQ^|%2GoO7B4JDlV3{Xh&S+N2^E6j!!{UeNSh=aRL)Gi? z&pGoyk3PNx@+xiHGJa~sS~XQvV2)KA@_M~g@=DouL7{%G&%PK~UmJM$DX)4c&V|2q zX8L{Uw2F}c+n&}}HZon2QCBwKHlB(HjEVylhhnwAI&AOT>-wlDHDOssuwU%0GnWtD z`>;)Eezw*zMNrkWm$l?GUj8%bbza{d-ML!p#G<lK<&rcgk7RPI%4cc(p3lVVIOCpB9g2QUhdsth< zT%29G7n=Zo!APw=d%oQl`tt)T@E?KE~_py!=$tvY3p*xA$D1Hf%^(s z3u%yS;W0oCvCFFqc5_jo>c~id-6WiBMM)V6uup8}>4JUYB*QFhhDOwdz0k;8dE5&f z(dCds&LSfNi{?BUb0PVp^*u8BeH@Obp$UV6br58!>;lq+q3*G3rNm*FT#2i?D{Q40 zU|TKQN{PU!{3Il$%G`w@8U!Fe)RJbgAaM&CP781h8^G#~Lak`fY7Ol|BQ$n_tu&_D z)ldU)y3n*h4Gq|gh8r2N5hnE;m8(*=wV=>RMCELW0cT-SzhM(_hj$?f3c*IGa+aJk zAZ?2Fo#WeVgij*fP~N=1MF(Wzn=741V*s%Jp&LiX4uE$Z34MQ`JcgBu^4kEMED=*}=JY8V@XvroYzmYcd!0H0T*7f7>lL`j)J_<=UHiiLgT@UJm8VWsu zZk$OaIFVgATyg+$1$p;|17N$r(|G($h|^cY0BFJY#vU}%0BK#YZNhfl*n{m9z=>?Z zM+Tg0v2DV;jhS9=u-A+$RP1Rxz|#pgn)Go`0(cc34p3z<_1XncJ`{s z7zEUU{9Vv3$PK8rX%K(T3+SB_;A39E*bB+0Yy&mkEO>wi{5k_X-Mt6MYS6YCuhP zx+%Y0yp_+&?bq}kv42HnPlmOiCjYD+Q2q}|T$O;n1f0I08=OBId^M72!HO)rx+8OW z5WJu+0C2rd*RS7<0N~O7T|jvdP!|+Hx8UMx2w+76_T|RnT7E0rmz92~nl2pg=&uFC zx)8sW!QFN!zgdx8*bw67u55{(g`d8q0eou%uo5?205%!2CA~A*l7GwZ3qR<0in0rr zQSxx4Ly`%3{6&}pFjXhOLjdYI0F^}oAcu?% zc-b|Ta{+Mo4cYWf3EIum1pppNc`R}c;-suJDM;>#8~~rjOlknHME;jBM@0eZSy%+1 zz5+d?t$i*4e&xch{30&^zoVh@b=Fs5Zo=>mYi72Ye;~pG5rQYbFsXgBUCo1U%U(2w1He|0CB&(azZe$bBIpR=cz-!G-wO z|A_n&@p(5)dH}iK=EYjo_~iW;SA z25{HZG%^6M`c8EVxak+VYo`p*ckZPD&}8MPVKw`0WH~YDS>S;@V*p+U9){-C;7(|K z5zwmmvq-v@-7rA;9fao9;ALcd5zg(;!dy!L3N0j`Mhx1Glc$LK^PiB`fIG*T0dTLw z3n#3)lOX^o)ldNL4hZfJ2)E?JK@xy-)yU+i7b`|DGAj?uS}D>xUGMiv3)B3XQ=1hm zXa&=Nla-_o_nOYvqagrRomdf_{T=ot#t`(%x9IO*q*n!1=k=Y~4NNY8LiV0BjR3Z}hsjA(z8FYqolN_C_w{ z%V@+(^l7xw9A#ij0N{tDT4lmKjd|s<|FUfdR4%mZJ?{f>&~^ZTv;VRyZ3dv=T4bL8 z00a@8Z-&Ny*_O4?I0ULD;SGMp0xU(Q3+x?O4UG-Jejx_f&dhu=NCC7WpbsR*V6#ILje49InMti%l$G8fQR$fUGNSFl(PO9 zGfWh~UV*s)g<1d?dwyT&>O*FL9Vk3@3lOJZ-<9_RnOlG{u#LvJtx*6wo-x-L*p(Vq zJ{BO3WwP?jgUGfZj@ycE_d~kdh2&Fua$Sw@1aQBeE|~$dTj`RT5K*)wADqXFLU|7( zHFl%~Buy(H@HK(}5NIFWCmPUvE+2aV39bb@Bm=%i3BYR!*dV}D33#gSjBAbO^m)M7 zXljw%jcYXmG`0-@cWh}0w`9QA=*unvR#pZ94XZMb$$+ns>H?ge*9p*+fT^kw|B~NE z+FG`(&jY?j_d<$kQUKYF)eQnXT27Z#Un9gc?e9}$)m~4Cc`1{fbjiGsd@7Je8r4y{ zJra=6ZLJq$0eF2wls49rkdc5`zXM%SwqmwU%X)e`1E6lTfB_BJoe2qfyqp2>bcgQV zasadP?hiUy09wxhVnAEod3l0bF%rv~OO?l32cweTA7n^HHdty9J-`D#6M#=;m<12;fN}tQD#I*zfCrQV;8Pi9!2>*? z8~~rnFbf{w0p$SrREAmb01qe!z^5|If(Lj&IRHMDVHP~V1IhvLsSLB=0Ul5efKO$Z z1rP9masYfP!z_4!2b2Tg(;X#548YO-ZU8AU44DA%l;_Xy7YfXZ_NsL2-Hljmm;%b=sD?sW{{{-TbkvH{Ji z0jN{5@(jj=W0!;pTLK_(0spKy07Mm_usq+W>cQ54$*u%!3L5=*aJnXj0sjv37ab}H zL3{(cgaE2uS9hW20)&ZS*pTNZtO0w}C7?Y9ZFx>j9|k8*I)*{TFj=Q@4#83!-+)%l z37>weY2Y8~RwwbNP8SCvt8lzX=f4s9`h-(NcK%pMunAoHXeT)Hx)lvE{kLN=Z z@1(Bj<4LQYPj{8>FN{|{-ehrn0y;p0{fzZkJntghDS{rtfURFk8@41$bJeCoiXo zWx6}Yg3T6me__JR5_g+g&`w4aq9xcHL6rf)z)fl6qCV?$fBLfqRF(&)iEZTcRxOV07*qoM6N<$ Ef`EUkkN^Mx literal 0 HcmV?d00001 diff --git a/graphics/fonts/latin_small_narrower.png b/graphics/fonts/latin_small_narrower.png new file mode 100644 index 0000000000000000000000000000000000000000..a183bed7cc286937c85ea2f7d7245fa41750ae85 GIT binary patch literal 7037 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 literal 0 HcmV?d00001 diff --git a/graphics_file_rules.mk b/graphics_file_rules.mk index 0ebcb878b..ff9a0109e 100644 --- a/graphics_file_rules.mk +++ b/graphics_file_rules.mk @@ -36,6 +36,23 @@ JPCONTESTGFXDIR := graphics/contest/japanese types := normal fight flying poison ground rock bug ghost steel mystery fire water grass electric psychic ice dragon dark contest_types := cool beauty cute smart tough + +### Fonts ### +$(FONTGFXDIR)/narrow.latfont: $(FONTGFXDIR)/latin_narrow.png + $(GFX) $< $@ + +$(FONTGFXDIR)/small_narrow.latfont: $(FONTGFXDIR)/latin_small_narrow.png + $(GFX) $< $@ + +$(FONTGFXDIR)/narrower.latfont: $(FONTGFXDIR)/latin_narrower.png + $(GFX) $< $@ + +$(FONTGFXDIR)/small_narrower.latfont: $(FONTGFXDIR)/latin_small_narrower.png + $(GFX) $< $@ + +$(FONTGFXDIR)/short_narrow.latfont: $(FONTGFXDIR)/latin_short_narrow.png + $(GFX) $< $@ + $(FONTGFXDIR)/latin_small.latfont: $(FONTGFXDIR)/latin_small.png $(GFX) $< $@ diff --git a/include/item.h b/include/item.h index e2de9cab4..ed57e4b30 100644 --- a/include/item.h +++ b/include/item.h @@ -39,7 +39,7 @@ extern struct BagPocket gBagPockets[]; void GetBerryCountString(u8 *dst, const u8 *berryName, u32 quantity); void CopyItemName(u16 itemId, u8 *string); -void CopyItemNameHandlePlural(u16 itemId, u8 *string, u32 quantity); +u8 *CopyItemNameHandlePlural(u16 itemId, u8 *string, u32 quantity); bool8 IsBagPocketNonEmpty(u8 pocket); bool8 CheckBagHasItem(u16 itemId, u16 count); bool8 CheckBagHasSpace(u16 itemId, u16 count); diff --git a/src/battle_message.c b/src/battle_message.c index 874acc449..0ba12fb70 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -3829,6 +3829,15 @@ void BattlePutTextOnWindow(const u8 *text, u8 windowId) { printerTemplate.fgColor = sTextOnWindowsInfo_Normal[windowId].fgColor; printerTemplate.bgColor = sTextOnWindowsInfo_Normal[windowId].bgColor; printerTemplate.shadowColor = sTextOnWindowsInfo_Normal[windowId].shadowColor; + + if (B_WIN_MOVE_NAME_1 <= windowId && windowId <= B_WIN_MOVE_NAME_4) + { + // We cannot check the actual width of the window because + // B_WIN_MOVE_NAME_1 and B_WIN_MOVE_NAME_3 are 16 wide for + // Z-move details. + printerTemplate.fontId = GetFontIdToFit(text, printerTemplate.fontId, printerTemplate.letterSpacing, 8 * TILE_WIDTH); + } + if (windowId == B_WIN_OAK_OLD_MAN) gTextFlags.useAlternateDownArrow = FALSE; else diff --git a/src/braille_text.c b/src/braille_text.c index d4afdf87f..6a0478678 100644 --- a/src/braille_text.c +++ b/src/braille_text.c @@ -206,7 +206,7 @@ static void DecompressGlyph_Braille(u16 glyph) gGlyphInfo.height = 16; } -s32 GetGlyphWidth_Braille(u16 font_type, bool32 isJapanese) +u32 GetGlyphWidth_Braille(u16 font_type, bool32 isJapanese) { return 16; } diff --git a/src/item.c b/src/item.c index 860cb5574..5158d6031 100644 --- a/src/item.c +++ b/src/item.c @@ -19,6 +19,8 @@ EWRAM_DATA struct BagPocket gBagPockets[NUM_BAG_POCKETS] = {}; void SortAndCompactBagPocket(struct BagPocket * pocket); +static const u8 *ItemId_GetPluralName(u16); +static bool32 DoesItemHavePluralName(u16); // Item descriptions and data #include "constants/moves.h" @@ -83,6 +85,25 @@ void CopyItemName(u16 itemId, u8 * dest) StringCopy(dest, ItemId_GetName(itemId)); } +const u8 sText_s[] =_("s"); + +u8 *CopyItemNameHandlePlural(u16 itemId, u8 *dst, u32 quantity) +{ + if (quantity == 1) + { + return StringCopy(dst, ItemId_GetName(itemId)); + } + else if (DoesItemHavePluralName(itemId)) + { + return StringCopy(dst, ItemId_GetPluralName(itemId)); + } + else + { + u8 *end = StringCopy(dst, ItemId_GetName(itemId)); + return StringCopy(end, sText_s); + } +} + s8 BagPocketGetFirstEmptySlot(u8 pocketId) { u16 i; @@ -617,6 +638,16 @@ u16 ItemId_GetPrice(u16 itemId) return gItemsInfo[SanitizeItemId(itemId)].price; } +static bool32 DoesItemHavePluralName(u16 itemId) +{ + return (gItemsInfo[SanitizeItemId(itemId)].pluralName[0] != '\0'); +} + +static const u8 *ItemId_GetPluralName(u16 itemId) +{ + return gItemsInfo[SanitizeItemId(itemId)].pluralName; +} + u8 ItemId_GetHoldEffect(u16 itemId) { return gItemsInfo[SanitizeItemId(itemId)].holdEffect; diff --git a/src/new_menu_helpers.c b/src/new_menu_helpers.c index c857d7001..57b127801 100644 --- a/src/new_menu_helpers.c +++ b/src/new_menu_helpers.c @@ -137,7 +137,57 @@ static const struct FontInfo gFontInfos[] = .fgColor = 1, .bgColor = 2, .shadowColor = 15, - } + }, + [FONT_NARROW] = { + .fontFunction = FontFunc_Narrow, + .maxLetterWidth = 5, + .maxLetterHeight = 16, + .letterSpacing = 0, + .lineSpacing = 0, + .fgColor = 2, + .bgColor = 1, + .shadowColor = 3, + }, + [FONT_SMALL_NARROW] = { + .fontFunction = FontFunc_SmallNarrow, + .maxLetterWidth = 5, + .maxLetterHeight = 8, + .letterSpacing = 0, + .lineSpacing = 0, + .fgColor = 2, + .bgColor = 1, + .shadowColor = 3, + }, + [FONT_NARROWER] = { + .fontFunction = FontFunc_Narrower, + .maxLetterWidth = 5, + .maxLetterHeight = 16, + .letterSpacing = 0, + .lineSpacing = 0, + .fgColor = 2, + .bgColor = 1, + .shadowColor = 3, + }, + [FONT_SMALL_NARROWER] = { + .fontFunction = FontFunc_SmallNarrower, + .maxLetterWidth = 5, + .maxLetterHeight = 8, + .letterSpacing = 0, + .lineSpacing = 0, + .fgColor = 2, + .bgColor = 1, + .shadowColor = 3, + }, + [FONT_SHORT_NARROW] = { + .fontFunction = FontFunc_ShortNarrow, + .maxLetterWidth = 5, + .maxLetterHeight = 14, + .letterSpacing = 0, + .lineSpacing = 0, + .fgColor = 2, + .bgColor = 1, + .shadowColor = 3, + }, }; static const u8 gMenuCursorDimensions[][2] = diff --git a/test/text.c b/test/text.c index cd182401d..e8eb4f7f2 100644 --- a/test/text.c +++ b/test/text.c @@ -1,550 +1,550 @@ -// #include "global.h" -// #include "test/test.h" -// #include "battle_main.h" -// #include "item.h" -// #include "text.h" -// #include "constants/abilities.h" -// #include "constants/items.h" -// #include "constants/moves.h" +#include "global.h" +#include "test/test.h" +#include "battle_main.h" +#include "item.h" +#include "text.h" +#include "constants/abilities.h" +#include "constants/items.h" +#include "constants/moves.h" -// TEST("Move names fit on Pokemon Summary Screen") -// { -// u32 i; -// const u32 fontId = FONT_NARROWER, widthPx = 72; -// u32 move = MOVE_NONE; -// for (i = 1; i < MOVES_COUNT; i++) -// { -// PARAMETRIZE_LABEL("%S", gMovesInfo[i].name) { move = i; } -// } -// EXPECT_LE(GetStringWidth(fontId, gMovesInfo[move].name, 0), widthPx); -// } +TEST("Move names fit on Pokemon Summary Screen") +{ + u32 i; + const u32 fontId = FONT_NARROWER, widthPx = 72; + u32 move = MOVE_NONE; + for (i = 1; i < MOVES_COUNT; i++) + { + PARAMETRIZE_LABEL("%S", gMovesInfo[i].name) { move = i; } + } + EXPECT_LE(GetStringWidth(fontId, gMovesInfo[move].name, 0), widthPx); +} -// TEST("Move names fit on Battle Screen") -// { -// u32 i; -// const u32 fontId = FONT_NARROWER, widthPx = 64; -// u32 move = MOVE_NONE; -// for (i = 1; i < MOVES_COUNT; i++) -// { -// PARAMETRIZE_LABEL("%S", gMovesInfo[i].name) { move = i; } -// } -// EXPECT_LE(GetStringWidth(fontId, gMovesInfo[move].name, 0), widthPx); -// } +TEST("Move names fit on Battle Screen") +{ + u32 i; + const u32 fontId = FONT_NARROWER, widthPx = 64; + u32 move = MOVE_NONE; + for (i = 1; i < MOVES_COUNT; i++) + { + PARAMETRIZE_LABEL("%S", gMovesInfo[i].name) { move = i; } + } + EXPECT_LE(GetStringWidth(fontId, gMovesInfo[move].name, 0), widthPx); +} -// TEST("Move names fit on Contest Screen") -// { -// u32 i; -// const u32 fontId = FONT_NARROWER, widthPx = 61; -// u32 move = MOVE_NONE; -// for (i = 1; i < MOVES_COUNT; i++) -// { -// PARAMETRIZE_LABEL("%S", gMovesInfo[i].name) { move = i; } -// } -// // All moves explicitly listed here are too big to fit. -// switch (move) -// { -// case MOVE_NATURES_MADNESS: -// EXPECT_GT(GetStringWidth(fontId, gMovesInfo[move].name, 0), widthPx); -// break; -// default: -// EXPECT_LE(GetStringWidth(fontId, gMovesInfo[move].name, 0), widthPx); -// break; -// } -// } +TEST("Move names fit on Contest Screen") +{ + u32 i; + const u32 fontId = FONT_NARROWER, widthPx = 61; + u32 move = MOVE_NONE; + for (i = 1; i < MOVES_COUNT; i++) + { + PARAMETRIZE_LABEL("%S", gMovesInfo[i].name) { move = i; } + } + // All moves explicitly listed here are too big to fit. + switch (move) + { + case MOVE_NATURES_MADNESS: + EXPECT_GT(GetStringWidth(fontId, gMovesInfo[move].name, 0), widthPx); + break; + default: + EXPECT_LE(GetStringWidth(fontId, gMovesInfo[move].name, 0), widthPx); + break; + } +} -// TEST("Move names fit on TMs & HMs Bag Screen") -// { -// u32 i; -// const u32 fontId = FONT_NARROWER, widthPx = 63; -// u32 move = MOVE_NONE; -// for (i = 1; i < ITEMS_COUNT; i++) -// { -// if (gItemsInfo[i].pocket == POCKET_TM_HM) -// { -// PARAMETRIZE_LABEL("%S", gMovesInfo[gItemsInfo[i].secondaryId].name) { move = gItemsInfo[i].secondaryId; } -// } -// } -// EXPECT_LE(GetStringWidth(fontId, gMovesInfo[move].name, 0), widthPx); -// } +TEST("Move names fit on TMs & HMs Bag Screen") +{ + u32 i; + const u32 fontId = FONT_NARROWER, widthPx = 63; + u32 move = MOVE_NONE; + for (i = 1; i < ITEMS_COUNT; i++) + { + if (gItemsInfo[i].pocket == POCKET_TM_HM) + { + PARAMETRIZE_LABEL("%S", gMovesInfo[gItemsInfo[i].secondaryId].name) { move = gItemsInfo[i].secondaryId; } + } + } + EXPECT_LE(GetStringWidth(fontId, gMovesInfo[move].name, 0), widthPx); +} -// TEST("Move names fit on Move Relearner Screen") -// { -// u32 i; -// const u32 fontId = FONT_NARROWER, widthPx = 72; -// u32 move = MOVE_NONE; -// for (i = 1; i < MOVES_COUNT; i++) -// { -// PARAMETRIZE_LABEL("%S", gMovesInfo[i].name) { move = i; } -// } -// EXPECT_LE(GetStringWidth(fontId, gMovesInfo[move].name, 0), widthPx); -// } +TEST("Move names fit on Move Relearner Screen") +{ + u32 i; + const u32 fontId = FONT_NARROWER, widthPx = 72; + u32 move = MOVE_NONE; + for (i = 1; i < MOVES_COUNT; i++) + { + PARAMETRIZE_LABEL("%S", gMovesInfo[i].name) { move = i; } + } + EXPECT_LE(GetStringWidth(fontId, gMovesInfo[move].name, 0), widthPx); +} -// TEST("Item names fit on Bag Screen (list)") -// { -// u32 i; -// const u32 fontId = FONT_NARROWER; -// const u32 tmHmBerryWidthPx = 71, restWidthPx = 88; -// u32 item = ITEM_NONE; -// for (i = 1; i < ITEMS_COUNT; i++) -// { -// PARAMETRIZE_LABEL("%S", gItemsInfo[i].name) { item = i; } -// } -// if (gItemsInfo[item].pocket == POCKET_TM_HM || gItemsInfo[item].pocket == POCKET_BERRIES) -// EXPECT_LE(GetStringWidth(fontId, gItemsInfo[item].name, 0), tmHmBerryWidthPx); -// else -// EXPECT_LE(GetStringWidth(fontId, gItemsInfo[item].name, 0), restWidthPx); -// } +TEST("Item names fit on Bag Screen (list)") +{ + u32 i; + const u32 fontId = FONT_NARROWER; + const u32 tmHmBerryWidthPx = 71, restWidthPx = 88; + u32 item = ITEM_NONE; + for (i = 1; i < ITEMS_COUNT; i++) + { + PARAMETRIZE_LABEL("%S", gItemsInfo[i].name) { item = i; } + } + if (gItemsInfo[item].pocket == POCKET_TM_HM || gItemsInfo[item].pocket == POCKET_BERRIES) + EXPECT_LE(GetStringWidth(fontId, gItemsInfo[item].name, 0), tmHmBerryWidthPx); + else + EXPECT_LE(GetStringWidth(fontId, gItemsInfo[item].name, 0), restWidthPx); +} -// TEST("Item plural names fit on Bag Screen (left box)") -// { -// u32 i; -// // -6 for the question mark in FONT_NORMAL. -// const u32 fontId = FONT_NARROWER, widthPx = 102 - 6; -// u32 item = ITEM_NONE; -// u8 pluralName[ITEM_NAME_PLURAL_LENGTH + 1]; -// for (i = 1; i < ITEMS_COUNT; i++) -// { -// PARAMETRIZE_LABEL("%S", gItemsInfo[i].name) { item = i; } -// } -// CopyItemNameHandlePlural(item, pluralName, 2); -// EXPECT_LE(GetStringWidth(fontId, pluralName, 0), widthPx); -// } +TEST("Item plural names fit on Bag Screen (left box)") +{ + u32 i; + // -6 for the question mark in FONT_NORMAL. + const u32 fontId = FONT_NARROWER, widthPx = 102 - 6; + u32 item = ITEM_NONE; + u8 pluralName[ITEM_NAME_PLURAL_LENGTH + 1]; + for (i = 1; i < ITEMS_COUNT; i++) + { + PARAMETRIZE_LABEL("%S", gItemsInfo[i].name) { item = i; } + } + CopyItemNameHandlePlural(item, pluralName, 2); + EXPECT_LE(GetStringWidth(fontId, pluralName, 0), widthPx); +} -// TEST("Item plural names fit on PC storage (left box)") -// { -// u32 i; -// // -6 for the question mark in FONT_NORMAL. -// const u32 fontId = FONT_NARROWER, widthPx = 104 - 6; -// u32 item = ITEM_NONE; -// u8 pluralName[ITEM_NAME_PLURAL_LENGTH + 1]; -// for (i = 1; i < ITEMS_COUNT; i++) -// { -// PARAMETRIZE_LABEL("%S", gItemsInfo[i].name) { item = i; } -// } -// CopyItemNameHandlePlural(item, pluralName, 2); -// EXPECT_LE(GetStringWidth(fontId, pluralName, 0), widthPx); -// } +TEST("Item plural names fit on PC storage (left box)") +{ + u32 i; + // -6 for the question mark in FONT_NORMAL. + const u32 fontId = FONT_NARROWER, widthPx = 104 - 6; + u32 item = ITEM_NONE; + u8 pluralName[ITEM_NAME_PLURAL_LENGTH + 1]; + for (i = 1; i < ITEMS_COUNT; i++) + { + PARAMETRIZE_LABEL("%S", gItemsInfo[i].name) { item = i; } + } + CopyItemNameHandlePlural(item, pluralName, 2); + EXPECT_LE(GetStringWidth(fontId, pluralName, 0), widthPx); +} -// TEST("Item names fit on Pokemon Storage System") -// { -// u32 i; -// const u32 fontId = FONT_SMALL_NARROWER, widthPx = 50; -// u32 item = ITEM_NONE; -// for (i = 1; i < ITEMS_COUNT; i++) -// { -// if (gItemsInfo[i].importance) continue; -// PARAMETRIZE_LABEL("%S", gItemsInfo[i].name) { item = i; } -// } -// // All items explicitly listed here are too big to fit. The ones -// // with a hold effect are listed at the bottom in case you want to -// // focus on making them fit (they are the most likely to appear on -// // the storage system UI, along with anything that could be held -// // in the wild). -// switch (item) -// { -// case ITEM_ENERGY_POWDER: -// case ITEM_PEWTER_CRUNCHIES: -// case ITEM_RAGE_CANDY_BAR: -// case ITEM_LUMIOSE_GALETTE: -// case ITEM_HEALTH_FEATHER: -// case ITEM_MUSCLE_FEATHER: -// case ITEM_RESIST_FEATHER: -// case ITEM_GENIUS_FEATHER: -// case ITEM_CLEVER_FEATHER: -// case ITEM_ABILITY_CAPSULE: -// case ITEM_DYNAMAX_CANDY: -// case ITEM_MAX_MUSHROOMS: -// case ITEM_GOLD_BOTTLE_CAP: -// case ITEM_PRETTY_FEATHER: -// case ITEM_STRANGE_SOUVENIR: -// case ITEM_FOSSILIZED_BIRD: -// case ITEM_FOSSILIZED_FISH: -// case ITEM_FOSSILIZED_DRAKE: -// case ITEM_FOSSILIZED_DINO: -// case ITEM_SURPRISE_MULCH: -// case ITEM_YELLOW_APRICORN: -// case ITEM_GREEN_APRICORN: -// case ITEM_WHITE_APRICORN: -// case ITEM_BLACK_APRICORN: -// case ITEM_THUNDER_STONE: -// case ITEM_GALARICA_WREATH: -// case ITEM_STRAWBERRY_SWEET: -// case ITEM_AUSPICIOUS_ARMOR: -// case ITEM_BIG_BAMBOO_SHOOT: -// case ITEM_GIMMIGHOUL_COIN: -// case ITEM_LEADERS_CREST: -// case ITEM_MALICIOUS_ARMOR: -// case ITEM_TINY_BAMBOO_SHOOT: -// case ITEM_BUG_TERA_SHARD: -// case ITEM_DARK_TERA_SHARD: -// case ITEM_DRAGON_TERA_SHARD: -// case ITEM_ELECTRIC_TERA_SHARD: -// case ITEM_FAIRY_TERA_SHARD: -// case ITEM_FIGHTING_TERA_SHARD: -// case ITEM_FIRE_TERA_SHARD: -// case ITEM_FLYING_TERA_SHARD: -// case ITEM_GHOST_TERA_SHARD: -// case ITEM_GRASS_TERA_SHARD: -// case ITEM_GROUND_TERA_SHARD: -// case ITEM_ICE_TERA_SHARD: -// case ITEM_NORMAL_TERA_SHARD: -// case ITEM_POISON_TERA_SHARD: -// case ITEM_PSYCHIC_TERA_SHARD: -// case ITEM_ROCK_TERA_SHARD: -// case ITEM_STEEL_TERA_SHARD: -// case ITEM_WATER_TERA_SHARD: -// case ITEM_BLACK_AUGURITE: -// case ITEM_UNREMARKABLE_TEACUP: -// case ITEM_MASTERPIECE_TEACUP: -// case ITEM_FRESH_START_MOCHI: -// case ITEM_STELLAR_TERA_SHARD: -// case ITEM_JUBILIFE_MUFFIN: -// case ITEM_SUPERB_REMEDY: -// case ITEM_AUX_POWERGUARD: -// case ITEM_CHOICE_DUMPLING: -// case ITEM_TWICE_SPICED_RADISH: -// // Items with hold effects: -// case ITEM_ELECTRIC_MEMORY: -// case ITEM_FIGHTING_MEMORY: -// case ITEM_GROUND_MEMORY: -// case ITEM_PSYCHIC_MEMORY: -// case ITEM_DRAGON_MEMORY: -// case ITEM_CHARIZARDITE_X: -// case ITEM_CHARIZARDITE_Y: -// case ITEM_ULTRANECROZIUM_Z: -// case ITEM_DEEP_SEA_SCALE: -// case ITEM_DEEP_SEA_TOOTH: -// case ITEM_NEVER_MELT_ICE: -// case ITEM_WEAKNESS_POLICY: -// case ITEM_SAFETY_GOGGLES: -// case ITEM_ADRENALINE_ORB: -// case ITEM_TERRAIN_EXTENDER: -// case ITEM_PROTECTIVE_PADS: -// case ITEM_HEAVY_DUTY_BOOTS: -// case ITEM_UTILITY_UMBRELLA: -// case ITEM_MARANGA_BERRY: -// case ITEM_PUNCHING_GLOVE: -// case ITEM_BOOSTER_ENERGY: -// case ITEM_ADAMANT_CRYSTAL: -// case ITEM_LUSTROUS_GLOBE: -// case ITEM_CORNERSTONE_MASK: -// case ITEM_WELLSPRING_MASK: -// case ITEM_HEARTHFLAME_MASK: -// EXPECT_GT(GetStringWidth(fontId, gItemsInfo[item].name, 0), widthPx); -// break; -// default: -// EXPECT_LE(GetStringWidth(fontId, gItemsInfo[item].name, 0), widthPx); -// break; -// } -// } +TEST("Item names fit on Pokemon Storage System") +{ + u32 i; + const u32 fontId = FONT_SMALL_NARROWER, widthPx = 50; + u32 item = ITEM_NONE; + for (i = 1; i < ITEMS_COUNT; i++) + { + if (gItemsInfo[i].importance) continue; + PARAMETRIZE_LABEL("%S", gItemsInfo[i].name) { item = i; } + } + // All items explicitly listed here are too big to fit. The ones + // with a hold effect are listed at the bottom in case you want to + // focus on making them fit (they are the most likely to appear on + // the storage system UI, along with anything that could be held + // in the wild). + switch (item) + { + case ITEM_ENERGY_POWDER: + case ITEM_PEWTER_CRUNCHIES: + case ITEM_RAGE_CANDY_BAR: + case ITEM_LUMIOSE_GALETTE: + case ITEM_HEALTH_FEATHER: + case ITEM_MUSCLE_FEATHER: + case ITEM_RESIST_FEATHER: + case ITEM_GENIUS_FEATHER: + case ITEM_CLEVER_FEATHER: + case ITEM_ABILITY_CAPSULE: + case ITEM_DYNAMAX_CANDY: + case ITEM_MAX_MUSHROOMS: + case ITEM_GOLD_BOTTLE_CAP: + case ITEM_PRETTY_FEATHER: + case ITEM_STRANGE_SOUVENIR: + case ITEM_FOSSILIZED_BIRD: + case ITEM_FOSSILIZED_FISH: + case ITEM_FOSSILIZED_DRAKE: + case ITEM_FOSSILIZED_DINO: + case ITEM_SURPRISE_MULCH: + case ITEM_YELLOW_APRICORN: + case ITEM_GREEN_APRICORN: + case ITEM_WHITE_APRICORN: + case ITEM_BLACK_APRICORN: + case ITEM_THUNDER_STONE: + case ITEM_GALARICA_WREATH: + case ITEM_STRAWBERRY_SWEET: + case ITEM_AUSPICIOUS_ARMOR: + case ITEM_BIG_BAMBOO_SHOOT: + case ITEM_GIMMIGHOUL_COIN: + case ITEM_LEADERS_CREST: + case ITEM_MALICIOUS_ARMOR: + case ITEM_TINY_BAMBOO_SHOOT: + case ITEM_BUG_TERA_SHARD: + case ITEM_DARK_TERA_SHARD: + case ITEM_DRAGON_TERA_SHARD: + case ITEM_ELECTRIC_TERA_SHARD: + case ITEM_FAIRY_TERA_SHARD: + case ITEM_FIGHTING_TERA_SHARD: + case ITEM_FIRE_TERA_SHARD: + case ITEM_FLYING_TERA_SHARD: + case ITEM_GHOST_TERA_SHARD: + case ITEM_GRASS_TERA_SHARD: + case ITEM_GROUND_TERA_SHARD: + case ITEM_ICE_TERA_SHARD: + case ITEM_NORMAL_TERA_SHARD: + case ITEM_POISON_TERA_SHARD: + case ITEM_PSYCHIC_TERA_SHARD: + case ITEM_ROCK_TERA_SHARD: + case ITEM_STEEL_TERA_SHARD: + case ITEM_WATER_TERA_SHARD: + case ITEM_BLACK_AUGURITE: + case ITEM_UNREMARKABLE_TEACUP: + case ITEM_MASTERPIECE_TEACUP: + case ITEM_FRESH_START_MOCHI: + case ITEM_STELLAR_TERA_SHARD: + case ITEM_JUBILIFE_MUFFIN: + case ITEM_SUPERB_REMEDY: + case ITEM_AUX_POWERGUARD: + case ITEM_CHOICE_DUMPLING: + case ITEM_TWICE_SPICED_RADISH: + // Items with hold effects: + case ITEM_ELECTRIC_MEMORY: + case ITEM_FIGHTING_MEMORY: + case ITEM_GROUND_MEMORY: + case ITEM_PSYCHIC_MEMORY: + case ITEM_DRAGON_MEMORY: + case ITEM_CHARIZARDITE_X: + case ITEM_CHARIZARDITE_Y: + case ITEM_ULTRANECROZIUM_Z: + case ITEM_DEEP_SEA_SCALE: + case ITEM_DEEP_SEA_TOOTH: + case ITEM_NEVER_MELT_ICE: + case ITEM_WEAKNESS_POLICY: + case ITEM_SAFETY_GOGGLES: + case ITEM_ADRENALINE_ORB: + case ITEM_TERRAIN_EXTENDER: + case ITEM_PROTECTIVE_PADS: + case ITEM_HEAVY_DUTY_BOOTS: + case ITEM_UTILITY_UMBRELLA: + case ITEM_MARANGA_BERRY: + case ITEM_PUNCHING_GLOVE: + case ITEM_BOOSTER_ENERGY: + case ITEM_ADAMANT_CRYSTAL: + case ITEM_LUSTROUS_GLOBE: + case ITEM_CORNERSTONE_MASK: + case ITEM_WELLSPRING_MASK: + case ITEM_HEARTHFLAME_MASK: + EXPECT_GT(GetStringWidth(fontId, gItemsInfo[item].name, 0), widthPx); + break; + default: + EXPECT_LE(GetStringWidth(fontId, gItemsInfo[item].name, 0), widthPx); + break; + } +} -// TEST("Item names fit on Pokemon Summary Screen") -// { -// u32 i; -// const u32 fontId = FONT_NARROWER, widthPx = 72; -// u32 item = ITEM_NONE; -// for (i = 1; i < ITEMS_COUNT; i++) -// { -// if (gItemsInfo[i].importance) continue; -// PARAMETRIZE_LABEL("%S", gItemsInfo[i].name) { item = i; } -// } -// // All items explicitly listed here are too big to fit. -// switch (item) -// { -// case ITEM_UNREMARKABLE_TEACUP: -// EXPECT_GT(GetStringWidth(fontId, gItemsInfo[item].name, 0), widthPx); -// break; -// default: -// EXPECT_LE(GetStringWidth(fontId, gItemsInfo[item].name, 0), widthPx); -// break; -// } -// } +TEST("Item names fit on Pokemon Summary Screen") +{ + u32 i; + const u32 fontId = FONT_NARROWER, widthPx = 72; + u32 item = ITEM_NONE; + for (i = 1; i < ITEMS_COUNT; i++) + { + if (gItemsInfo[i].importance) continue; + PARAMETRIZE_LABEL("%S", gItemsInfo[i].name) { item = i; } + } + // All items explicitly listed here are too big to fit. + switch (item) + { + case ITEM_UNREMARKABLE_TEACUP: + EXPECT_GT(GetStringWidth(fontId, gItemsInfo[item].name, 0), widthPx); + break; + default: + EXPECT_LE(GetStringWidth(fontId, gItemsInfo[item].name, 0), widthPx); + break; + } +} -// TEST("Item names fit on Shop Screen") -// { -// u32 i; -// const u32 fontId = FONT_NARROWER, widthPx = 84; -// u32 item = ITEM_NONE; -// for (i = 1; i < ITEMS_COUNT; i++) -// { -// PARAMETRIZE_LABEL("%S", gItemsInfo[i].name) { item = i; } -// } -// EXPECT_LE(GetStringWidth(fontId, gItemsInfo[item].name, 0), widthPx); -// } +TEST("Item names fit on Shop Screen") +{ + u32 i; + const u32 fontId = FONT_NARROWER, widthPx = 84; + u32 item = ITEM_NONE; + for (i = 1; i < ITEMS_COUNT; i++) + { + PARAMETRIZE_LABEL("%S", gItemsInfo[i].name) { item = i; } + } + EXPECT_LE(GetStringWidth(fontId, gItemsInfo[item].name, 0), widthPx); +} -// TEST("Species names fit on Battle Screen HP box") -// { -// u32 i, genderWidthPx; -// const u32 fontId = FONT_SMALL_NARROWER, widthPx = 54; -// u32 species = SPECIES_NONE; -// genderWidthPx = GetStringWidth(fontId, COMPOUND_STRING("♂"), 0); -// for (i = 1; i < NUM_SPECIES; i++) -// { -// if (IsSpeciesEnabled(i)) -// { -// PARAMETRIZE_LABEL("%S", gSpeciesInfo[i].speciesName) { species = i; } -// } -// } -// if (gSpeciesInfo[i].genderRatio != MON_GENDERLESS) -// EXPECT_LE(GetStringWidth(fontId, gSpeciesInfo[species].speciesName, 0) - genderWidthPx, widthPx); -// else -// EXPECT_LE(GetStringWidth(fontId, gSpeciesInfo[species].speciesName, 0), widthPx); -// } +TEST("Species names fit on Battle Screen HP box") +{ + u32 i, genderWidthPx; + const u32 fontId = FONT_SMALL_NARROWER, widthPx = 54; + u32 species = SPECIES_NONE; + genderWidthPx = GetStringWidth(fontId, COMPOUND_STRING("♂"), 0); + for (i = 1; i < NUM_SPECIES; i++) + { + if (IsSpeciesEnabled(i)) + { + PARAMETRIZE_LABEL("%S", gSpeciesInfo[i].speciesName) { species = i; } + } + } + if (gSpeciesInfo[i].genderRatio != MON_GENDERLESS) + EXPECT_LE(GetStringWidth(fontId, gSpeciesInfo[species].speciesName, 0) - genderWidthPx, widthPx); + else + EXPECT_LE(GetStringWidth(fontId, gSpeciesInfo[species].speciesName, 0), widthPx); +} -// TEST("Species names fit on Party Screen") -// { -// u32 i; -// const u32 fontId = FONT_SMALL_NARROWER, widthPx = 50; -// u32 species = SPECIES_NONE; -// for (i = 1; i < NUM_SPECIES; i++) -// { -// if (IsSpeciesEnabled(i)) -// { -// PARAMETRIZE_LABEL("%S", gSpeciesInfo[i].speciesName) { species = i; } -// } -// } -// EXPECT_LE(GetStringWidth(fontId, gSpeciesInfo[species].speciesName, 0), widthPx); -// } +TEST("Species names fit on Party Screen") +{ + u32 i; + const u32 fontId = FONT_SMALL_NARROWER, widthPx = 50; + u32 species = SPECIES_NONE; + for (i = 1; i < NUM_SPECIES; i++) + { + if (IsSpeciesEnabled(i)) + { + PARAMETRIZE_LABEL("%S", gSpeciesInfo[i].speciesName) { species = i; } + } + } + EXPECT_LE(GetStringWidth(fontId, gSpeciesInfo[species].speciesName, 0), widthPx); +} -// TEST("Species names fit on Pokemon Summary Screen") -// { -// u32 i; -// const u32 fontId = FONT_NARROWER, widthPx = 63; -// u32 species = SPECIES_NONE; -// for (i = 1; i < NUM_SPECIES; i++) -// { -// if (IsSpeciesEnabled(i)) -// { -// PARAMETRIZE_LABEL("%S", gSpeciesInfo[i].speciesName) { species = i; } -// } -// } -// EXPECT_LE(GetStringWidth(fontId, gSpeciesInfo[species].speciesName, 0), widthPx); -// } +TEST("Species names fit on Pokemon Summary Screen") +{ + u32 i; + const u32 fontId = FONT_NARROWER, widthPx = 63; + u32 species = SPECIES_NONE; + for (i = 1; i < NUM_SPECIES; i++) + { + if (IsSpeciesEnabled(i)) + { + PARAMETRIZE_LABEL("%S", gSpeciesInfo[i].speciesName) { species = i; } + } + } + EXPECT_LE(GetStringWidth(fontId, gSpeciesInfo[species].speciesName, 0), widthPx); +} -// TEST("Species names fit on Pokedex Screen") -// { -// u32 i; -// const u32 fontId = FONT_NARROWER, widthPx = 50; -// u32 species = SPECIES_NONE; -// for (i = 1; i < NUM_SPECIES; i++) -// { -// if (IsSpeciesEnabled(i)) -// { -// PARAMETRIZE_LABEL("%S", gSpeciesInfo[i].speciesName) { species = i; } -// } -// } -// EXPECT_LE(GetStringWidth(fontId, gSpeciesInfo[species].speciesName, 0), widthPx); -// } +TEST("Species names fit on Pokedex Screen") +{ + u32 i; + const u32 fontId = FONT_NARROWER, widthPx = 50; + u32 species = SPECIES_NONE; + for (i = 1; i < NUM_SPECIES; i++) + { + if (IsSpeciesEnabled(i)) + { + PARAMETRIZE_LABEL("%S", gSpeciesInfo[i].speciesName) { species = i; } + } + } + EXPECT_LE(GetStringWidth(fontId, gSpeciesInfo[species].speciesName, 0), widthPx); +} -// TEST("Species names fit on Pokedex Screen - Cries") -// { -// u32 i; -// const u32 fontId = FONT_NARROWER, widthPx = 60; -// u32 species = SPECIES_NONE; -// for (i = 1; i < NUM_SPECIES; i++) -// { -// if (IsSpeciesEnabled(i)) -// { -// PARAMETRIZE_LABEL("%S", gSpeciesInfo[i].speciesName) { species = i; } -// } -// } -// EXPECT_LE(GetStringWidth(fontId, gSpeciesInfo[species].speciesName, 0), widthPx); -// } +TEST("Species names fit on Pokedex Screen - Cries") +{ + u32 i; + const u32 fontId = FONT_NARROWER, widthPx = 60; + u32 species = SPECIES_NONE; + for (i = 1; i < NUM_SPECIES; i++) + { + if (IsSpeciesEnabled(i)) + { + PARAMETRIZE_LABEL("%S", gSpeciesInfo[i].speciesName) { species = i; } + } + } + EXPECT_LE(GetStringWidth(fontId, gSpeciesInfo[species].speciesName, 0), widthPx); +} -// TEST("Species names fit on Pokemon Storage System") -// { -// u32 i; -// u32 species = SPECIES_NONE; -// for (i = 1; i < NUM_SPECIES; i++) -// { -// if (IsSpeciesEnabled(i)) -// { -// PARAMETRIZE_LABEL("%S", gSpeciesInfo[i].speciesName) { species = i; } -// } -// } -// EXPECT_LE(GetStringWidth(FONT_NARROWER, gSpeciesInfo[species].speciesName, 0), 66); -// EXPECT_LE(GetStringWidth(FONT_SHORT_NARROW, gSpeciesInfo[species].speciesName, 0), 60); -// } +TEST("Species names fit on Pokemon Storage System") +{ + u32 i; + u32 species = SPECIES_NONE; + for (i = 1; i < NUM_SPECIES; i++) + { + if (IsSpeciesEnabled(i)) + { + PARAMETRIZE_LABEL("%S", gSpeciesInfo[i].speciesName) { species = i; } + } + } + EXPECT_LE(GetStringWidth(FONT_NARROWER, gSpeciesInfo[species].speciesName, 0), 66); + EXPECT_LE(GetStringWidth(FONT_SHORT_NARROW, gSpeciesInfo[species].speciesName, 0), 60); +} -// TEST("Species names fit on Contest Screen") -// { -// u32 i; -// const u32 fontId = FONT_NARROWER, widthPx = 50; -// u32 species = SPECIES_NONE; -// for (i = 1; i < NUM_SPECIES; i++) -// { -// if (IsSpeciesEnabled(i)) -// { -// PARAMETRIZE_LABEL("%S", gSpeciesInfo[i].speciesName) { species = i; } -// } -// } -// EXPECT_LE(GetStringWidth(fontId, gSpeciesInfo[species].speciesName, 0), widthPx); -// } +TEST("Species names fit on Contest Screen") +{ + u32 i; + const u32 fontId = FONT_NARROWER, widthPx = 50; + u32 species = SPECIES_NONE; + for (i = 1; i < NUM_SPECIES; i++) + { + if (IsSpeciesEnabled(i)) + { + PARAMETRIZE_LABEL("%S", gSpeciesInfo[i].speciesName) { species = i; } + } + } + EXPECT_LE(GetStringWidth(fontId, gSpeciesInfo[species].speciesName, 0), widthPx); +} -// TEST("Species names fit on Contest Screen - Rankings") -// { -// u32 i; -// const u32 fontId = FONT_NARROWER, widthPx = 49; -// u32 species = SPECIES_NONE; -// for (i = 1; i < NUM_SPECIES; i++) -// { -// if (IsSpeciesEnabled(i)) -// { -// PARAMETRIZE_LABEL("%S", gSpeciesInfo[i].speciesName) { species = i; } -// } -// } -// EXPECT_LE(GetStringWidth(fontId, gSpeciesInfo[species].speciesName, 0), widthPx); -// } +TEST("Species names fit on Contest Screen - Rankings") +{ + u32 i; + const u32 fontId = FONT_NARROWER, widthPx = 49; + u32 species = SPECIES_NONE; + for (i = 1; i < NUM_SPECIES; i++) + { + if (IsSpeciesEnabled(i)) + { + PARAMETRIZE_LABEL("%S", gSpeciesInfo[i].speciesName) { species = i; } + } + } + EXPECT_LE(GetStringWidth(fontId, gSpeciesInfo[species].speciesName, 0), widthPx); +} -// TEST("Species names fit on Battle Dome Screen") -// { -// u32 i; -// const u32 fontId = FONT_SHORT_NARROW, widthPx = 60; -// u32 species = SPECIES_NONE; -// for (i = 1; i < NUM_SPECIES; i++) -// { -// if (IsSpeciesEnabled(i)) -// { -// PARAMETRIZE_LABEL("%S", gSpeciesInfo[i].speciesName) { species = i; } -// } -// } -// EXPECT_LE(GetStringWidth(fontId, gSpeciesInfo[species].speciesName, 0), widthPx); -// } +TEST("Species names fit on Battle Dome Screen") +{ + u32 i; + const u32 fontId = FONT_SHORT_NARROW, widthPx = 60; + u32 species = SPECIES_NONE; + for (i = 1; i < NUM_SPECIES; i++) + { + if (IsSpeciesEnabled(i)) + { + PARAMETRIZE_LABEL("%S", gSpeciesInfo[i].speciesName) { species = i; } + } + } + EXPECT_LE(GetStringWidth(fontId, gSpeciesInfo[species].speciesName, 0), widthPx); +} -// TEST("Species names fit on Hall of Fame") -// { -// u32 i; -// const u32 fontId = FONT_NARROWER, widthPx = 66; -// u32 species = SPECIES_NONE; -// for (i = 1; i < NUM_SPECIES; i++) -// { -// if (IsSpeciesEnabled(i)) -// { -// PARAMETRIZE_LABEL("%S", gSpeciesInfo[i].speciesName) { species = i; } -// } -// } -// EXPECT_LE(GetStringWidth(fontId, gSpeciesInfo[species].speciesName, 0), widthPx); -// } +TEST("Species names fit on Hall of Fame") +{ + u32 i; + const u32 fontId = FONT_NARROWER, widthPx = 66; + u32 species = SPECIES_NONE; + for (i = 1; i < NUM_SPECIES; i++) + { + if (IsSpeciesEnabled(i)) + { + PARAMETRIZE_LABEL("%S", gSpeciesInfo[i].speciesName) { species = i; } + } + } + EXPECT_LE(GetStringWidth(fontId, gSpeciesInfo[species].speciesName, 0), widthPx); +} -// TEST("Species names fit on Naming Screen") -// { -// u32 i; -// const u32 fontId = FONT_NARROWER, widthPx = 64; -// u32 species = SPECIES_NONE; -// for (i = 1; i < NUM_SPECIES; i++) -// { -// if (IsSpeciesEnabled(i)) -// { -// PARAMETRIZE_LABEL("%S", gSpeciesInfo[i].speciesName) { species = i; } -// } -// } -// EXPECT_LE(GetStringWidth(fontId, gSpeciesInfo[species].speciesName, 0), widthPx); -// } +TEST("Species names fit on Naming Screen") +{ + u32 i; + const u32 fontId = FONT_NARROWER, widthPx = 64; + u32 species = SPECIES_NONE; + for (i = 1; i < NUM_SPECIES; i++) + { + if (IsSpeciesEnabled(i)) + { + PARAMETRIZE_LABEL("%S", gSpeciesInfo[i].speciesName) { species = i; } + } + } + EXPECT_LE(GetStringWidth(fontId, gSpeciesInfo[species].speciesName, 0), widthPx); +} -// TEST("Species names fit on PokeNav Condition Screen") -// { -// u32 i; -// const u32 fontId = FONT_NARROWER, widthPx = 57; -// u32 species = SPECIES_NONE; -// for (i = 1; i < NUM_SPECIES; i++) -// { -// if (IsSpeciesEnabled(i)) -// { -// PARAMETRIZE_LABEL("%S", gSpeciesInfo[i].speciesName) { species = i; } -// } -// } -// EXPECT_LE(GetStringWidth(fontId, gSpeciesInfo[species].speciesName, 0), widthPx); -// } +TEST("Species names fit on PokeNav Condition Screen") +{ + u32 i; + const u32 fontId = FONT_NARROWER, widthPx = 57; + u32 species = SPECIES_NONE; + for (i = 1; i < NUM_SPECIES; i++) + { + if (IsSpeciesEnabled(i)) + { + PARAMETRIZE_LABEL("%S", gSpeciesInfo[i].speciesName) { species = i; } + } + } + EXPECT_LE(GetStringWidth(fontId, gSpeciesInfo[species].speciesName, 0), widthPx); +} -// TEST("Species names fit on PokeNav Condition Search Screen") -// { -// u32 i; -// const u32 fontId = FONT_NARROWER, widthPx = 60; -// u32 species = SPECIES_NONE; -// for (i = 1; i < NUM_SPECIES; i++) -// { -// if (IsSpeciesEnabled(i)) -// { -// PARAMETRIZE_LABEL("%S", gSpeciesInfo[i].speciesName) { species = i; } -// } -// } -// EXPECT_LE(GetStringWidth(fontId, gSpeciesInfo[species].speciesName, 0), widthPx); -// } +TEST("Species names fit on PokeNav Condition Search Screen") +{ + u32 i; + const u32 fontId = FONT_NARROWER, widthPx = 60; + u32 species = SPECIES_NONE; + for (i = 1; i < NUM_SPECIES; i++) + { + if (IsSpeciesEnabled(i)) + { + PARAMETRIZE_LABEL("%S", gSpeciesInfo[i].speciesName) { species = i; } + } + } + EXPECT_LE(GetStringWidth(fontId, gSpeciesInfo[species].speciesName, 0), widthPx); +} -// TEST("Species names fit on PokeNav Ribbon Screen") -// { -// u32 i; -// const u32 fontId = FONT_NARROWER, widthPx = 60; -// u32 species = SPECIES_NONE; -// for (i = 1; i < NUM_SPECIES; i++) -// { -// if (IsSpeciesEnabled(i)) -// { -// PARAMETRIZE_LABEL("%S", gSpeciesInfo[i].speciesName) { species = i; } -// } -// } -// EXPECT_LE(GetStringWidth(fontId, gSpeciesInfo[species].speciesName, 0), widthPx); -// } +TEST("Species names fit on PokeNav Ribbon Screen") +{ + u32 i; + const u32 fontId = FONT_NARROWER, widthPx = 60; + u32 species = SPECIES_NONE; + for (i = 1; i < NUM_SPECIES; i++) + { + if (IsSpeciesEnabled(i)) + { + PARAMETRIZE_LABEL("%S", gSpeciesInfo[i].speciesName) { species = i; } + } + } + EXPECT_LE(GetStringWidth(fontId, gSpeciesInfo[species].speciesName, 0), widthPx); +} -// TEST("Species names fit on PokeNav Ribbon List Screen") -// { -// u32 i; -// const u32 fontId = FONT_NARROWER, widthPx = 60; -// u32 species = SPECIES_NONE; -// for (i = 1; i < NUM_SPECIES; i++) -// { -// if (IsSpeciesEnabled(i)) -// { -// PARAMETRIZE_LABEL("%S", gSpeciesInfo[i].speciesName) { species = i; } -// } -// } -// EXPECT_LE(GetStringWidth(fontId, gSpeciesInfo[species].speciesName, 0), widthPx); -// } +TEST("Species names fit on PokeNav Ribbon List Screen") +{ + u32 i; + const u32 fontId = FONT_NARROWER, widthPx = 60; + u32 species = SPECIES_NONE; + for (i = 1; i < NUM_SPECIES; i++) + { + if (IsSpeciesEnabled(i)) + { + PARAMETRIZE_LABEL("%S", gSpeciesInfo[i].speciesName) { species = i; } + } + } + EXPECT_LE(GetStringWidth(fontId, gSpeciesInfo[species].speciesName, 0), widthPx); +} -// TEST("Ability names fit on Pokemon Summary Screen") -// { -// u32 i; -// const u32 fontId = FONT_NORMAL, widthPx = 144; -// u32 ability = ABILITY_NONE; -// for (i = 1; i < ABILITIES_COUNT; i++) -// { -// PARAMETRIZE_LABEL("%S", gAbilitiesInfo[i].name) { ability = i; } -// } -// EXPECT_LE(GetStringWidth(fontId, gAbilitiesInfo[ability].name, 0), widthPx); -// } +TEST("Ability names fit on Pokemon Summary Screen") +{ + u32 i; + const u32 fontId = FONT_NORMAL, widthPx = 144; + u32 ability = ABILITY_NONE; + for (i = 1; i < ABILITIES_COUNT; i++) + { + PARAMETRIZE_LABEL("%S", gAbilitiesInfo[i].name) { ability = i; } + } + EXPECT_LE(GetStringWidth(fontId, gAbilitiesInfo[ability].name, 0), widthPx); +} -// TEST("Ability names fit on Ability Pop-Up") -// { -// u32 i; -// const u32 fontId = FONT_SMALL_NARROWER, widthPx = 76; -// u32 ability = ABILITY_NONE; -// for (i = 1; i < ABILITIES_COUNT; i++) -// { -// PARAMETRIZE_LABEL("%S", gAbilitiesInfo[i].name) { ability = i; } -// } -// EXPECT_LE(GetStringWidth(fontId, gAbilitiesInfo[ability].name, 0), widthPx); -// } +TEST("Ability names fit on Ability Pop-Up") +{ + u32 i; + const u32 fontId = FONT_SMALL_NARROWER, widthPx = 76; + u32 ability = ABILITY_NONE; + for (i = 1; i < ABILITIES_COUNT; i++) + { + PARAMETRIZE_LABEL("%S", gAbilitiesInfo[i].name) { ability = i; } + } + EXPECT_LE(GetStringWidth(fontId, gAbilitiesInfo[ability].name, 0), widthPx); +} -// TEST("Type names fit on Battle Screen") -// { -// u32 i; -// const u32 fontId = FONT_NARROWER, widthPx = 39; -// u32 type = TYPE_NORMAL; -// for (i = 0; i < NUMBER_OF_MON_TYPES; i++) -// { -// PARAMETRIZE_LABEL("%S", gTypesInfo[i].name) { type = i; } -// } -// EXPECT_LE(GetStringWidth(fontId, gTypesInfo[type].name, 0), widthPx); -// } +TEST("Type names fit on Battle Screen") +{ + u32 i; + const u32 fontId = FONT_NARROWER, widthPx = 39; + u32 type = TYPE_NORMAL; + for (i = 0; i < NUMBER_OF_MON_TYPES; i++) + { + PARAMETRIZE_LABEL("%S", gTypesInfo[i].name) { type = i; } + } + EXPECT_LE(GetStringWidth(fontId, gTypesInfo[type].name, 0), widthPx); +} -// TEST("Type names fit on Pokedex Search Screen") -// { -// u32 i; -// const u32 fontId = FONT_NARROWER, widthPx = 38; -// u32 type = TYPE_NORMAL; -// for (i = 0; i < NUMBER_OF_MON_TYPES; i++) -// { -// PARAMETRIZE_LABEL("%S", gTypesInfo[i].name) { type = i; } -// } -// EXPECT_LE(GetStringWidth(fontId, gTypesInfo[type].name, 0), widthPx); -// } +TEST("Type names fit on Pokedex Search Screen") +{ + u32 i; + const u32 fontId = FONT_NARROWER, widthPx = 38; + u32 type = TYPE_NORMAL; + for (i = 0; i < NUMBER_OF_MON_TYPES; i++) + { + PARAMETRIZE_LABEL("%S", gTypesInfo[i].name) { type = i; } + } + EXPECT_LE(GetStringWidth(fontId, gTypesInfo[type].name, 0), widthPx); +}