diff options
author | ProjectRevoTPP <projectrevotpp@hotmail.com> | 2017-08-12 01:26:29 -0400 |
---|---|---|
committer | ProjectRevoTPP <projectrevotpp@hotmail.com> | 2017-08-12 01:26:29 -0400 |
commit | 1a8fe435e7deabf06029c8e50201136518e3af73 (patch) | |
tree | 9746f2f4f4901e81496465da485d0f5c8a647586 /src/text.c | |
parent | bb0cad7c072703f5a540e8c22c8e137267331f4d (diff) |
split out src/ directory into categorized subdirectories.
Diffstat (limited to 'src/text.c')
-rw-r--r-- | src/text.c | 4324 |
1 files changed, 0 insertions, 4324 deletions
diff --git a/src/text.c b/src/text.c deleted file mode 100644 index b27084b86..000000000 --- a/src/text.c +++ /dev/null @@ -1,4324 +0,0 @@ -#include "global.h" -#include "text.h" -#include "battle.h" -#include "main.h" -#include "palette.h" -#include "songs.h" -#include "sound.h" -#include "string_util.h" - -enum -{ - WIN_STATE_END, - WIN_STATE_BEGIN, - WIN_STATE_NORMAL, - WIN_STATE_INTERRUPTIBLE_PAUSE, - WIN_STATE_PAUSE, - WIN_STATE_WAIT_BUTTON, - WIN_STATE_NEWLINE, - WIN_STATE_PLACEHOLDER, - WIN_STATE_PARAGRAPH, - WIN_STATE_NEWLINE_WAIT, - WIN_STATE_WAIT_SOUND, -}; - -struct Font -{ - u32 type; - u8 *glyphs; - u16 glyphSize; - u16 lowerTileOffset; -}; - -struct GlyphBuffer -{ - // 0-7 left tile - // 8-15 right tile (if it exists) - u32 pixelRows[16]; - - // pixel row filled with BG color - u32 background; - - // table of color indices (not a palette) - u32 colors[16]; -}; - -struct GlyphTileInfo -{ - u8 textMode; - u8 startPixel; - u8 width; - u8 *src; - u32 *dest; - u32 *colors; -}; - -struct ShiftAmount -{ - u32 left; - u32 right; -}; - -static u16 InitVariableWidthFontTileData(struct Window *, u16); -static u16 LoadFixedWidthFont(struct Window *, u16); -static u16 LoadFixedWidthFont_Font1Latin(struct Window *, u16); -static u16 LoadFixedWidthFont_Font4Latin(struct Window *, u16); -static u16 LoadFixedWidthFont_Braille(struct Window *, u16); -static void MultistepLoadFont_LoadGlyph(struct Window *, u16, u8); -static u8 sub_8002FA0(struct Window *, const u8 *); -static u8 InterpretText(struct Window *); -static u8 HandleExtCtrlCode(struct Window *); -static u8 UpdateWindowText(struct Window *); -static u8 DrawGlyph_TextMode0(struct Window *, u32); -static void DrawGlyph_TextMode2(struct Window *, u32); -static void LoadFixedWidthGlyph(struct Window *, u32, u8 *); -static void WriteGlyphTilemap(struct Window *, u16, u16); -static void GetGlyphTilePointers(u8, u8, u16, u8 **, u8 **); -static u16 *GetCursorTilemapPointer(struct Window *); -static void ApplyColors_UnshadowedFont(const u8 *, u32 *, u8, u8); -static void ApplyColors_ShadowedFont(const void *, void *, u8, u8, u8); -static void SetCursorX(struct Window *, u8); -static void AddToCursorX(struct Window *, u8); -static void AddToCursorY(struct Window *, u8); -static void ClipLeft(struct Window *); -static void ClipRight(struct Window *); -static void InitColors(struct Window *); -static void SetBackgroundColor(struct Window *, u8); -static void SetShadowColor(struct Window *, u8); -static void SetForegroundColor(struct Window *, u8); -static u8 GetTextDelay(struct Window *); -static bool8 PlayerCanInterruptWait(struct Window *); -static void ScrollWindowTextLines(struct Window *); -static void ScrollWindowTextLines_TextMode0(struct Window *); -static void DoScroll_TextMode0(struct Window *, u16); -static void ScrollWindowTextLines_TextMode1(struct Window *); -static void DoScroll_TextMode1(struct Window *, u16); -static void ScrollWindowTextLines_TextMode2(struct Window *); -static void DoScroll_TextMode2(struct Window *, u8); -void ClearWindowTextLines(struct Window *); -static void ClearWindowTextLines_TextMode0_TextMode1(struct Window *, u8); -static void ClearWindowTextLines_TextMode2(struct Window *, u8); -static void TryEraseDownArrow(struct Window *); -static u16 GetBlankTileNum(struct Window *); -static u8 WaitWithDownArrow(struct Window *); -static void DrawInitialDownArrow(struct Window *); -static void DrawMovingDownArrow(struct Window *); -static u16 GetCursorTileNum(struct Window *, u32, u32); -static s32 DrawGlyphTiles(struct Window *, u32, u32); -static void UpdateTilemap(struct Window *, u32); -static u8 GetGlyphWidth(struct Window *, u32); -static s32 DrawGlyphTile_ShadowedFont(struct GlyphTileInfo *); - -static void PrintGlyph_TextMode0(struct Window *, u32); -static void PrintGlyph_TextMode1(struct Window *, u32); -static void PrintGlyph_TextMode2(struct Window *, u32); - -static void WriteGlyphTilemap_Font0_Font3(struct Window *, u32); -static void WriteGlyphTilemap_Font1_Font4(struct Window *, u32); -static void WriteGlyphTilemap_Font2_Font5(struct Window *, u32); -static void WriteGlyphTilemap_Font1_Font4(struct Window *, u32); -static void WriteGlyphTilemap_Font2_Font5(struct Window *, u32); -static void WriteGlyphTilemap_Font6(struct Window *, u32); - -static u8 ExtCtrlCode_Nop(struct Window *); -static u8 ExtCtrlCode_ForegroundColor(struct Window *); -static u8 ExtCtrlCode_BackgroundColor(struct Window *); -static u8 ExtCtrlCode_ShadowColor(struct Window *); -static u8 ExtCtrlCode_AllColors(struct Window *); -static u8 ExtCtrlCode_Palette(struct Window *); -static u8 ExtCtrlCode_Font(struct Window *); -static u8 ExtCtrlCode_DefaultFont(struct Window *); -static u8 ExtCtrlCode_Pause(struct Window *); -static u8 ExtCtrlCode_WaitButton(struct Window *); -static u8 ExtCtrlCode_WaitSound(struct Window *); -static u8 ExtCtrlCode_PlayBGM(struct Window *); -static u8 ExtCtrlCode_Escape(struct Window *); -static u8 ExtCtrlCode_Nop2(struct Window *); -static u8 ExtCtrlCode_SetCursorY(struct Window *); -static u8 ExtCtrlCode_ClearWindowTextLines(struct Window *); -static u8 ExtCtrlCode_PlaySE(struct Window *); -static u8 ExtCtrlCode_Skip(struct Window *); -static u8 ExtCtrlCode_SetCursorX(struct Window *); -static u8 ExtCtrlCode_SkipTo(struct Window *); -static u8 ExtCtrlCode_Spacing(struct Window *); -static u8 ExtCtrlCode_Japanese(struct Window *); -static u8 ExtCtrlCode_Latin(struct Window *); - -static void ShiftGlyphTile_UnshadowedFont_Width0(struct GlyphBuffer *, u8 *, u32 *, u8); -static void ShiftGlyphTile_UnshadowedFont_Width1(struct GlyphBuffer *, u8 *, u32 *, u8); -static void ShiftGlyphTile_UnshadowedFont_Width2(struct GlyphBuffer *, u8 *, u32 *, u8); -static void ShiftGlyphTile_UnshadowedFont_Width3(struct GlyphBuffer *, u8 *, u32 *, u8); -static void ShiftGlyphTile_UnshadowedFont_Width4(struct GlyphBuffer *, u8 *, u32 *, u8); -static void ShiftGlyphTile_UnshadowedFont_Width5(struct GlyphBuffer *, u8 *, u32 *, u8); -static void ShiftGlyphTile_UnshadowedFont_Width6(struct GlyphBuffer *, u8 *, u32 *, u8); -static void ShiftGlyphTile_UnshadowedFont_Width7(struct GlyphBuffer *, u8 *, u32 *, u8); -static void ShiftGlyphTile_UnshadowedFont_Width8(struct GlyphBuffer *, u8 *, u32 *, u8); - -static void ShiftGlyphTile_ShadowedFont_Width0(struct GlyphBuffer *, u32 *, u32 *, u8); -static void ShiftGlyphTile_ShadowedFont_Width1(struct GlyphBuffer *, u32 *, u32 *, u8); -static void ShiftGlyphTile_ShadowedFont_Width2(struct GlyphBuffer *, u32 *, u32 *, u8); -static void ShiftGlyphTile_ShadowedFont_Width3(struct GlyphBuffer *, u32 *, u32 *, u8); -static void ShiftGlyphTile_ShadowedFont_Width4(struct GlyphBuffer *, u32 *, u32 *, u8); -static void ShiftGlyphTile_ShadowedFont_Width5(struct GlyphBuffer *, u32 *, u32 *, u8); -static void ShiftGlyphTile_ShadowedFont_Width6(struct GlyphBuffer *, u32 *, u32 *, u8); -static void ShiftGlyphTile_ShadowedFont_Width7(struct GlyphBuffer *, u32 *, u32 *, u8); -static void ShiftGlyphTile_ShadowedFont_Width8(struct GlyphBuffer *, u32 *, u32 *, u8); - -static struct Window *sMultistepLoadFont_Window; -static u16 sMultistepLoadFont_StartOffset; -static u16 sMultistepLoadFont_Index; -static struct Window sTempWindow; -static u8 sWaitType; -static u8 sLineLength; -static struct GlyphBuffer sGlyphBuffer; - -EWRAM_DATA u16 gBGTilemapBuffers[4][0x400] = {0}; - -EWRAM_DATA u8 gStringVar1[0x100] = {0}; -EWRAM_DATA u8 gStringVar2[0x100] = {0}; -EWRAM_DATA u8 gStringVar3[0x100] = {0}; -EWRAM_DATA u8 gStringVar4[0x100] = {0}; - -extern u16 gBattleTypeFlags; -extern u8 gIsLinkContest; -extern u8 gTileBuffer[]; - -vu16 *const gBGControlRegs[] = -{ - ®_BG0CNT, - ®_BG1CNT, - ®_BG2CNT, - ®_BG3CNT, -}; - -vu16 *const gBGHOffsetRegs[] = -{ - ®_BG0HOFS, - ®_BG1HOFS, - ®_BG2HOFS, - ®_BG3HOFS, -}; - -vu16 *const gBGVOffsetRegs[] = -{ - ®_BG0VOFS, - ®_BG1VOFS, - ®_BG2VOFS, - ®_BG3VOFS, -}; - -const u16 gUnknown_081E29D8[] = { 0x100, 0x200, 0x400, 0x800 }; -const u16 gUnknown_081E29E0[] = { 0x100, 0x200, 0x400, 0x800 }; -const u16 gUnknown_081E29E8[] = { 1, 2, 4, 8 }; - -static const u8 sFont0LatinGlyphs[] = INCBIN_U8("graphics/fonts/font0_lat.1bpp"); -static const u8 sFont1LatinGlyphs[] = INCBIN_U8("graphics/fonts/font1_lat.1bpp"); -static const u8 sFont0JapaneseGlyphs[] = INCBIN_U8("graphics/fonts/font0_jpn.1bpp"); -static const u8 sFont1JapaneseGlyphs[] = INCBIN_U8("graphics/fonts/font1_jpn.1bpp"); -static const u8 sBrailleGlyphs[] = INCBIN_U8("graphics/fonts/font6_braille.1bpp"); -static const u32 sDownArrowTiles[] = INCBIN_U32("graphics/fonts/down_arrow.4bpp"); - -// clang-format off -#include "data/text/type1_map.h" -#include "data/text/type3_map.h" -#include "data/text/font1_widths.h" -#include "data/text/font4_widths.h" -#include "data/text/font0_widths.h" -#include "data/text/font3_widths.h" -// clang-format on - -const u16 gUnknownPalette_81E6692[] = INCBIN_U16("graphics/fonts/unknown_81E6692.gbapal"); -const u16 gFontDefaultPalette[] = INCBIN_U16("graphics/fonts/default.gbapal"); - -const u8 sBlankTile[8] = { 0, 0, 0, 0, 0, 0, 0, 0, }; - -static const u32 sGlyphMasks[9][8][3] = -{ - { - { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, - { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, - { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, - { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, - { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, - { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, - { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, - { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, - }, - { - { 0x00000000,0xFFFFFFFF,0xFFFFFFF0, }, - { 0x0000000F,0xFFFFFFFF,0xFFFFFF00, }, - { 0x000000FF,0xFFFFFFFF,0xFFFFF000, }, - { 0x00000FFF,0xFFFFFFFF,0xFFFF0000, }, - { 0x0000FFFF,0xFFFFFFFF,0xFFF00000, }, - { 0x000FFFFF,0xFFFFFFFF,0xFF000000, }, - { 0x00FFFFFF,0xFFFFFFFF,0xF0000000, }, - { 0x0FFFFFFF,0xFFFFFFFF,0x00000000, }, - }, - { - { 0x00000000,0xFFFFFFFF,0xFFFFFF00, }, - { 0x0000000F,0xFFFFFFFF,0xFFFFF000, }, - { 0x000000FF,0xFFFFFFFF,0xFFFF0000, }, - { 0x00000FFF,0xFFFFFFFF,0xFFF00000, }, - { 0x0000FFFF,0xFFFFFFFF,0xFF000000, }, - { 0x000FFFFF,0xFFFFFFFF,0xF0000000, }, - { 0x00FFFFFF,0xFFFFFFFF,0x00000000, }, - { 0x0FFFFFFF,0xFFFFFFF0,0x00000000, }, - }, - { - { 0x00000000,0xFFFFFFFF,0xFFFFF000, }, - { 0x0000000F,0xFFFFFFFF,0xFFFF0000, }, - { 0x000000FF,0xFFFFFFFF,0xFFF00000, }, - { 0x00000FFF,0xFFFFFFFF,0xFF000000, }, - { 0x0000FFFF,0xFFFFFFFF,0xF0000000, }, - { 0x000FFFFF,0xFFFFFFFF,0x00000000, }, - { 0x00FFFFFF,0xFFFFFFF0,0x00000000, }, - { 0x0FFFFFFF,0xFFFFFF00,0x00000000, }, - }, - { - { 0x00000000,0xFFFFFFFF,0xFFFF0000, }, - { 0x0000000F,0xFFFFFFFF,0xFFF00000, }, - { 0x000000FF,0xFFFFFFFF,0xFF000000, }, - { 0x00000FFF,0xFFFFFFFF,0xF0000000, }, - { 0x0000FFFF,0xFFFFFFFF,0x00000000, }, - { 0x000FFFFF,0xFFFFFFF0,0x00000000, }, - { 0x00FFFFFF,0xFFFFFF00,0x00000000, }, - { 0x0FFFFFFF,0xFFFFF000,0x00000000, }, - }, - { - { 0x00000000,0xFFFFFFFF,0xFFF00000, }, - { 0x0000000F,0xFFFFFFFF,0xFF000000, }, - { 0x000000FF,0xFFFFFFFF,0xF0000000, }, - { 0x00000FFF,0xFFFFFFFF,0x00000000, }, - { 0x0000FFFF,0xFFFFFFF0,0x00000000, }, - { 0x000FFFFF,0xFFFFFF00,0x00000000, }, - { 0x00FFFFFF,0xFFFFF000,0x00000000, }, - { 0x0FFFFFFF,0xFFFF0000,0x00000000, }, - }, - { - { 0x00000000,0xFFFFFFFF,0xFF000000, }, - { 0x0000000F,0xFFFFFFFF,0xF0000000, }, - { 0x000000FF,0xFFFFFFFF,0x00000000, }, - { 0x00000FFF,0xFFFFFFF0,0x00000000, }, - { 0x0000FFFF,0xFFFFFF00,0x00000000, }, - { 0x000FFFFF,0xFFFFF000,0x00000000, }, - { 0x00FFFFFF,0xFFFF0000,0x00000000, }, - { 0x0FFFFFFF,0xFFF00000,0x00000000, }, - }, - { - { 0x00000000,0xFFFFFFFF,0xF0000000, }, - { 0x0000000F,0xFFFFFFFF,0x00000000, }, - { 0x000000FF,0xFFFFFFF0,0x00000000, }, - { 0x00000FFF,0xFFFFFF00,0x00000000, }, - { 0x0000FFFF,0xFFFFF000,0x00000000, }, - { 0x000FFFFF,0xFFFF0000,0x00000000, }, - { 0x00FFFFFF,0xFFF00000,0x00000000, }, - { 0x0FFFFFFF,0xFF000000,0x00000000, }, - }, - { - { 0x00000000,0xFFFFFFFF,0x00000000, }, - { 0x0000000F,0xFFFFFFF0,0x00000000, }, - { 0x000000FF,0xFFFFFF00,0x00000000, }, - { 0x00000FFF,0xFFFFF000,0x00000000, }, - { 0x0000FFFF,0xFFFF0000,0x00000000, }, - { 0x000FFFFF,0xFFF00000,0x00000000, }, - { 0x00FFFFFF,0xFF000000,0x00000000, }, - { 0x0FFFFFFF,0xF0000000,0x00000000, }, - }, -}; - -static const struct ShiftAmount sGlyphShiftAmounts[8] = -{ - { 0, 32 }, - { 4, 28 }, - { 8, 24 }, - { 12, 20 }, - { 16, 16 }, - { 20, 12 }, - { 24, 8 }, - { 28, 4 }, -}; - -typedef void (*PrintGlyphFunc)(struct Window *, u32); - -static const PrintGlyphFunc sPrintGlyphFuncs[] = -{ - PrintGlyph_TextMode0, - PrintGlyph_TextMode1, - PrintGlyph_TextMode2, -}; - -typedef void (*WriteGlyphTilemapFunc)(struct Window *, u32); - -static const WriteGlyphTilemapFunc sWriteGlyphTilemapFuncs[] = -{ - WriteGlyphTilemap_Font0_Font3, - WriteGlyphTilemap_Font1_Font4, - WriteGlyphTilemap_Font2_Font5, - WriteGlyphTilemap_Font0_Font3, - WriteGlyphTilemap_Font1_Font4, - WriteGlyphTilemap_Font2_Font5, - WriteGlyphTilemap_Font6, -}; - -static const struct Window sDefaultWindow = { .language = GAME_LANGUAGE }; - -typedef u8 (*ExtCtrlCodeFunc)(struct Window *); - -static const ExtCtrlCodeFunc sExtCtrlCodeFuncs[] = -{ - ExtCtrlCode_Nop, - ExtCtrlCode_ForegroundColor, - ExtCtrlCode_BackgroundColor, - ExtCtrlCode_ShadowColor, - ExtCtrlCode_AllColors, - ExtCtrlCode_Palette, - ExtCtrlCode_Font, - ExtCtrlCode_DefaultFont, - ExtCtrlCode_Pause, - ExtCtrlCode_WaitButton, - ExtCtrlCode_WaitSound, - ExtCtrlCode_PlayBGM, - ExtCtrlCode_Escape, - ExtCtrlCode_Nop2, - ExtCtrlCode_SetCursorY, - ExtCtrlCode_ClearWindowTextLines, - ExtCtrlCode_PlaySE, - ExtCtrlCode_Skip, - ExtCtrlCode_SetCursorX, - ExtCtrlCode_SkipTo, - ExtCtrlCode_Spacing, - ExtCtrlCode_Japanese, - ExtCtrlCode_Latin, -}; - -extern const u32 gFont3LatinGlyphs[]; -extern const u32 gFont4LatinGlyphs[]; -extern const u32 gFont3JapaneseGlyphs[]; -extern const u32 gFont4JapaneseGlyphs[]; - -static const struct Font sFonts[] = -{ - // Japanese fonts - { 0, (u8 *)sFont0JapaneseGlyphs, 16, 8 }, - { 1, (u8 *)sFont1JapaneseGlyphs, 8, 0 }, - { 2, (u8 *)sFont1JapaneseGlyphs, 8, 0 }, - { 4, (u8 *)gFont3JapaneseGlyphs, 64, 512 }, - { 1, (u8 *)gFont4JapaneseGlyphs, 32, 0 }, - { 2, (u8 *)gFont4JapaneseGlyphs, 32, 0 }, - { 3, (u8 *)sBrailleGlyphs, 8, 0 }, - // Latin - { 0, (u8 *)sFont0LatinGlyphs, 16, 8 }, - { 1, (u8 *)sFont1LatinGlyphs, 8, 0 }, - { 2, (u8 *)sFont1LatinGlyphs, 8, 0 }, - { 0, (u8 *)gFont3LatinGlyphs, 64, 32 }, - { 1, (u8 *)gFont4LatinGlyphs, 32, 0 }, - { 2, (u8 *)gFont4LatinGlyphs, 32, 0 }, - { 3, (u8 *)sBrailleGlyphs, 8, 0 }, -}; - -static const u8 sTextSpeedDelays[] = { 6, 3, 1 }; // slow, mid, fast - -static const u8 sExtCtrlCodeLengths[] = -{ - 1, - 2, - 2, - 2, - 4, - 2, - 2, - 1, - 2, - 1, - 1, - 3, - 2, - 2, - 2, - 1, - 3, - 2, - 2, - 2, - 2, - 1, - 1, -}; - -typedef void (*ShiftGlyphTileUnshadowedFunc)(struct GlyphBuffer *, u8 *, u32 *, u8); - -static const ShiftGlyphTileUnshadowedFunc sShiftGlyphTileUnshadowedFuncs[] = -{ - ShiftGlyphTile_UnshadowedFont_Width0, - ShiftGlyphTile_UnshadowedFont_Width1, - ShiftGlyphTile_UnshadowedFont_Width2, - ShiftGlyphTile_UnshadowedFont_Width3, - ShiftGlyphTile_UnshadowedFont_Width4, - ShiftGlyphTile_UnshadowedFont_Width5, - ShiftGlyphTile_UnshadowedFont_Width6, - ShiftGlyphTile_UnshadowedFont_Width7, - ShiftGlyphTile_UnshadowedFont_Width8, -}; - -typedef void (*ShiftGlyphTileShadowedFunc)(struct GlyphBuffer *, u32 *, u32 *, u8); - -static const ShiftGlyphTileShadowedFunc sShiftGlyphTileShadowedFuncs[] = -{ - ShiftGlyphTile_ShadowedFont_Width0, - ShiftGlyphTile_ShadowedFont_Width1, - ShiftGlyphTile_ShadowedFont_Width2, - ShiftGlyphTile_ShadowedFont_Width3, - ShiftGlyphTile_ShadowedFont_Width4, - ShiftGlyphTile_ShadowedFont_Width5, - ShiftGlyphTile_ShadowedFont_Width6, - ShiftGlyphTile_ShadowedFont_Width7, - ShiftGlyphTile_ShadowedFont_Width8, -}; - -const struct WindowConfig gWindowConfig_81E6C3C = -{ - 0, // BG number - 2, // BG character base block - 31, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 0, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6C58 = -{ - 0, // BG number - 0, // BG character base block - 24, // BG screen base block - 0, // BG priority - 0, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 26, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(24), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6C74 = -{ - 0, // BG number - 0, // BG character base block - 0, // BG screen base block - 0, // BG priority - 0, // palette number - 1, // foreground color - 0, // background color - 3, // shadow color - 4, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)OBJ_VRAM0, // tile data - NULL, // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6C90 = -{ - 0, // BG number - 1, // BG character base block - 30, // BG screen base block - 2, // BG priority - 31, // palette number - 15, // foreground color - 0, // background color - 1, // shadow color - 4, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(1), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6CAC = -{ - 0, // BG number - 0, // BG character base block - 0, // BG screen base block - 0, // BG priority - 0, // palette number - 15, // foreground color - 0, // background color - 1, // shadow color - 4, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 8, // width - 60, // height - gTileBuffer, // tile data - NULL, // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6CC8 = -{ - 2, // BG number - 2, // BG character base block - 15, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(15), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6CE4 = -{ - 0, // BG number - 2, // BG character base block - 31, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6D00 = -{ - 0, // BG number - 0, // BG character base block - 31, // BG screen base block - 0, // BG priority - 15, // palette number - 2, // foreground color - 15, // background color - 3, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6D1C = -{ - 1, // BG number - 0, // BG character base block - 31, // BG screen base block - 1, // BG priority - 15, // palette number - 2, // foreground color - 15, // background color - 3, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6D38 = -{ - 0, // BG number - 0, // BG character base block - 0, // BG screen base block - 0, // BG priority - 0, // palette number - 15, // foreground color - 0, // background color - 14, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 8, // width - 64, // height - gTileBuffer, // tile data - NULL, // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6D54 = -{ - 3, // BG number - 3, // BG character base block - 15, // BG screen base block - 3, // BG priority - 2, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(3), // tile data - (u16 *)BG_SCREEN_ADDR(15), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6D70 = -{ - 3, // BG number - 3, // BG character base block - 15, // BG screen base block - 3, // BG priority - 3, // palette number - 1, // foreground color - 3, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(3), // tile data - (u16 *)BG_SCREEN_ADDR(15), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6D8C = -{ - 1, // BG number - 0, // BG character base block - 14, // BG screen base block - 1, // BG priority - 0, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(14), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6DA8 = -{ - 0, // BG number - 0, // BG character base block - 12, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(11), // tilemap -}; - -const struct WindowConfig WindowConfig_TrainerCard_Back_Values = -{ - 0, // BG number - 2, // BG character base block - 30, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowConfig WindowConfig_TrainerCard_Back_Labels = -{ - 0, // BG number - 2, // BG character base block - 30, // BG screen base block - 0, // BG priority - 14, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6DFC = -{ - 0, // BG number - 2, // BG character base block - 31, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6E18 = -{ - 0, // BG number - 2, // BG character base block - 31, // BG screen base block - 1, // BG priority - 15, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6E34 = -{ - 1, // BG number - 0, // BG character base block - 31, // BG screen base block - 1, // BG priority - 15, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6E50 = -{ - 0, // BG number - 2, // BG character base block - 28, // BG screen base block - 0, // BG priority - 13, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(28), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6E6C = -{ - 0, // BG number - 2, // BG character base block - 30, // BG screen base block - 0, // BG priority - 13, // palette number - 15, // foreground color - 0, // background color - 10, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6E88 = -{ - 0, // BG number - 0, // BG character base block - 31, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6EA4 = -{ - 1, // BG number - 0, // BG character base block - 28, // BG screen base block - 1, // BG priority - 1, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 8, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(28), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6EC0 = -{ - 2, // BG number - 2, // BG character base block - 29, // BG screen base block - 2, // BG priority - 1, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 8, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(29), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6EDC = -{ - 1, // BG number - 0, // BG character base block - 28, // BG screen base block - 1, // BG priority - 2, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 8, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(28), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6EF8 = -{ - 2, // BG number - 2, // BG character base block - 29, // BG screen base block - 2, // BG priority - 2, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 8, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(29), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6F14 = -{ - 1, // BG number - 0, // BG character base block - 28, // BG screen base block - 1, // BG priority - 3, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 8, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(28), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6F30 = -{ - 2, // BG number - 2, // BG character base block - 29, // BG screen base block - 2, // BG priority - 3, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 8, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(29), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6F4C = -{ - 3, // BG number - 0, // BG character base block - 30, // BG screen base block - 3, // BG priority - 0, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6F68 = -{ - 0, // BG number - 2, // BG character base block - 13, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(13), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6F84 = -{ - 0, // BG number - 2, // BG character base block - 31, // BG screen base block - 0, // BG priority - 15, // palette number - 15, // foreground color - 0, // background color - 1, // shadow color - 3, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6FA0 = -{ - 1, // BG number - 0, // BG character base block - 24, // BG screen base block - 3, // BG priority - 15, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(24), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6FBC = -{ - 0, // BG number - 0, // BG character base block - 30, // BG screen base block - 0, // BG priority - 15, // palette number - 15, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6FD8 = -{ - 0, // BG number - 0, // BG character base block - 24, // BG screen base block - 0, // BG priority - 15, // palette number - 15, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(24), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6FF4 = -{ - 0, // BG number - 0, // BG character base block - 24, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(24), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E7010 = -{ - 0, // BG number - 0, // BG character base block - 30, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E702C = -{ - 3, // BG number - 2, // BG character base block - 15, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(15), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E7048 = -{ - 2, // BG number - 2, // BG character base block - 14, // BG screen base block - 2, // BG priority - 15, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 16, // tilemap left coordinate - 0, // tilemap top coordinate - 16, // width - 32, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(14), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E7064 = -{ - 2, // BG number - 2, // BG character base block - 14, // BG screen base block - 2, // BG priority - 15, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(14), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E7080 = -{ - 3, // BG number - 0, // BG character base block - 30, // BG screen base block - 3, // BG priority - 11, // palette number - 1, // foreground color - 15, // background color - 5, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E709C = -{ - 0, // BG number - 0, // BG character base block - 31, // BG screen base block - 1, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E70B8 = -{ - 2, // BG number - 0, // BG character base block - 30, // BG screen base block - 2, // BG priority - 11, // palette number - 1, // foreground color - 0, // background color - 5, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E70D4 = -{ - 3, // BG number - 0, // BG character base block - 30, // BG screen base block - 3, // BG priority - 11, // palette number - 1, // foreground color - 15, // background color - 5, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E70F0 = -{ - 0, // BG number - 0, // BG character base block - 0, // BG screen base block - 0, // BG priority - 0, // palette number - 15, // foreground color - 1, // background color - 14, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 32, // width - 32, // height - gTileBuffer, // tile data - NULL, // tilemap -}; - -const struct WindowConfig gWindowConfig_81E710C = -{ - 0, // BG number - 0, // BG character base block - 31, // BG screen base block - 1, // BG priority - 15, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E7128 = -{ - 0, // BG number - 2, // BG character base block - 31, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E7144 = -{ - 0, // BG number - 2, // BG character base block - 31, // BG screen base block - 0, // BG priority - 13, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E7160 = -{ - 1, // BG number - 1, // BG character base block - 10, // BG screen base block - 1, // BG priority - 14, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(1), // tile data - (u16 *)BG_SCREEN_ADDR(10), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E717C = -{ - 0, // BG number - 3, // BG character base block - 31, // BG screen base block - 0, // BG priority - 15, // palette number - 15, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(3), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E7198 = -{ - 0, // BG number - 2, // BG character base block - 15, // BG screen base block - 0, // BG priority - 15, // palette number - 15, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(15), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E71B4 = -{ - 0, // BG number - 2, // BG character base block - 15, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(15), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E71D0 = -{ - 1, // BG number - 1, // BG character base block - 28, // BG screen base block - 0, // BG priority - 5, // palette number - 13, // foreground color - 14, // background color - 15, // shadow color - 3, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(1), // tile data - (u16 *)BG_SCREEN_ADDR(28), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E71EC = -{ - 2, // BG number - 1, // BG character base block - 30, // BG screen base block - 0, // BG priority - 5, // palette number - 13, // foreground color - 14, // background color - 15, // shadow color - 3, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(1), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E7208 = -{ - 0, // BG number - 2, // BG character base block - 28, // BG screen base block - 0, // BG priority - 8, // palette number - 1, // foreground color - 0, // background color - 2, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(28), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E7224 = -{ - 0, // BG number - 0, // BG character base block - 31, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E7240 = -{ - 1, // BG number - 2, // BG character base block - 30, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E725C = -{ - 0, // BG number - 0, // BG character base block - 0, // BG screen base block - 0, // BG priority - 0, // palette number - 15, // foreground color - 0, // background color - 14, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)OBJ_VRAM0, // tile data - NULL, // tilemap -}; - -const struct WindowConfig gWindowConfig_81E7278 = -{ - 0, // BG number - 0, // BG character base block - 0, // BG screen base block - 0, // BG priority - 0, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 16, // width - 32, // height - gTileBuffer, // tile data - NULL, // tilemap -}; - -const struct WindowConfig gWindowConfig_81E7294 = -{ - 0, // BG number - 0, // BG character base block - 0, // BG screen base block - 0, // BG priority - 0, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 4, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 16, // width - 32, // height - gTileBuffer, // tile data - NULL, // tilemap -}; - -static void UpdateBGRegs(const struct WindowConfig *winConfig) -{ - u8 bgNum = winConfig->bgNum; - *gBGHOffsetRegs[bgNum] = 0; - *gBGVOffsetRegs[bgNum] = 0; - *gBGControlRegs[bgNum] = winConfig->priority | (winConfig->screenBaseBlock << 8) | (winConfig->charBaseBlock << 2); -} - -static void ClearBGMem(const struct WindowConfig *winConfig) -{ - CpuFastFill(0, winConfig->tileData, 32); - - if (winConfig->tilemap) - CpuFastFill(0, winConfig->tilemap, 0x800); -} - -void LoadFontDefaultPalette(const struct WindowConfig *winConfig) -{ - LoadPalette(gFontDefaultPalette, 16 * winConfig->paletteNum, 32); -} - -void SetUpWindowConfig(const struct WindowConfig *winConfig) -{ - UpdateBGRegs(winConfig); - ClearBGMem(winConfig); - LoadFontDefaultPalette(winConfig); -} - -u16 InitWindowTileData(struct Window *win, u16 startOffset) -{ - u16 retVal; - - win->tileDataStartOffset = startOffset; - retVal = 0; - - switch (win->config->textMode) - { - case 2: - retVal = InitVariableWidthFontTileData(win, startOffset); - break; - case 1: - switch (win->config->fontNum) - { - case 0: - case 3: - retVal = LoadFixedWidthFont(win, startOffset); - break; - case 1: - case 2: - retVal = LoadFixedWidthFont_Font1Latin(win, startOffset); - break; - case 4: - case 5: - retVal = LoadFixedWidthFont_Font4Latin(win, startOffset); - break; - case 6: - retVal = LoadFixedWidthFont_Braille(win, startOffset); - break; - } - break; - } - - return retVal; -} - -static u16 InitVariableWidthFontTileData(struct Window *win, u16 startOffset) -{ - u8 *buffer; - - win->tileDataStartOffset = startOffset; - win->tileDataOffset = 2; - buffer = win->tileData + 32 * win->tileDataStartOffset; - CpuFastFill(0, buffer, 32); - ApplyColors_UnshadowedFont(sBlankTile, (u32 *)(buffer + 32), win->config->foregroundColor, win->config->backgroundColor); - return win->tileDataStartOffset + win->tileDataOffset + win->width * win->height; -} - -static u16 LoadFixedWidthFont(struct Window *win, u16 startOffset) -{ - s32 glyph; - u8 *buffer = win->tileData + 32 * startOffset; - for (glyph = 0; glyph < 256; glyph++) - { - LoadFixedWidthGlyph(win, glyph, buffer); - buffer += 64; - } - return 2 * glyph; -} - -static u16 LoadFixedWidthFont_Font1Latin(struct Window *win, u16 startOffset) -{ - s32 i; - u8 *buffer = win->tileData + 32 * startOffset; - for (i = 0; i < 256; i++) - { - ApplyColors_UnshadowedFont(&sFont1LatinGlyphs[8 * i], (u32 *)buffer, win->foregroundColor, win->backgroundColor); - buffer += 32; - } - return i; -} - -static u16 LoadFixedWidthFont_Font4Latin(struct Window *win, u16 startOffset) -{ - s32 i; - u8 *buffer = win->tileData + 32 * startOffset; - for (i = 0; i < 256; i++) - { - ApplyColors_ShadowedFont(&gFont4LatinGlyphs[8 * i], buffer, win->foregroundColor, win->shadowColor, win->backgroundColor); - buffer += 32; - } - return i; -} - -static u16 LoadFixedWidthFont_Braille(struct Window *win, u16 startOffset) -{ - s32 i; - u8 *buffer = win->tileData + 32 * startOffset; - for (i = 0; i < 256; i++) - { - ApplyColors_UnshadowedFont(&sBrailleGlyphs[8 * i], (u32 *)buffer, win->foregroundColor, win->backgroundColor); - buffer += 32; - } - return i; -} - -u32 MultistepInitWindowTileData(struct Window *win, u16 startOffset) -{ - u32 retVal; - sMultistepLoadFont_Window = win; - sMultistepLoadFont_Index = 0; - sMultistepLoadFont_StartOffset = startOffset; - win->tileDataStartOffset = startOffset; - retVal = 0; - - switch (win->config->textMode) - { - case 2: - retVal = InitVariableWidthFontTileData(win, startOffset); - break; - case 1: - retVal = 256; - if (win->config->fontNum == 0 - || win->config->fontNum == 3) - retVal *= 2; - break; - } - - return retVal; -} - -bool32 MultistepLoadFont(void) -{ - bool32 retVal = TRUE; - - if (sMultistepLoadFont_Window->config->textMode == 1) - { - s32 i; - - for (i = sMultistepLoadFont_Index; i < sMultistepLoadFont_Index + 16; i++) - MultistepLoadFont_LoadGlyph(sMultistepLoadFont_Window, sMultistepLoadFont_StartOffset, i); - - sMultistepLoadFont_Index += 16; - - if (sMultistepLoadFont_Index < 256) - retVal = FALSE; - } - - return retVal; -} - -static void MultistepLoadFont_LoadGlyph(struct Window *win, u16 startOffset, u8 glyph) -{ - u8 *buffer; - - switch (win->config->fontNum) - { - case 0: - case 3: - buffer = win->tileData + 32 * startOffset + 64 * glyph; - LoadFixedWidthGlyph(win, glyph, buffer); - break; - case 1: - case 2: - buffer = win->tileData + 32 * (glyph + startOffset); - ApplyColors_UnshadowedFont( - &sFont1LatinGlyphs[8 * glyph], - (u32 *)buffer, - win->foregroundColor, - win->backgroundColor); - break; - case 4: - case 5: - buffer = win->tileData + 32 * (glyph + startOffset); - ApplyColors_ShadowedFont( - &gFont4LatinGlyphs[8 * glyph], - buffer, - win->foregroundColor, - win->shadowColor, - win->backgroundColor); - break; - } -} - -void EmptyFunc(void) -{ -} - -void InitWindowFromConfig(struct Window *win, const struct WindowConfig *winConfig) -{ - *win = sDefaultWindow; - win->config = (struct WindowConfig *)winConfig; - win->textMode = winConfig->textMode; - win->spacing = winConfig->spacing; - win->fontNum = winConfig->fontNum; - win->paletteNum = winConfig->paletteNum; - win->tilemapLeft = winConfig->tilemapLeft; - win->tilemapTop = winConfig->tilemapTop; - win->width = winConfig->width; - win->height = winConfig->height; - win->tileData = winConfig->tileData; - win->tilemap = winConfig->tilemap; - InitColors(win); - SetBackgroundColor(win, winConfig->backgroundColor); - SetShadowColor(win, winConfig->shadowColor); - SetForegroundColor(win, winConfig->foregroundColor); -} - -void InitWindow(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top) -{ - struct WindowConfig *winConfig = win->config; - win->textMode = winConfig->textMode; - win->fontNum = winConfig->fontNum; - win->language = GAME_LANGUAGE; - win->paletteNum = winConfig->paletteNum; - win->win_field_B = 0; - win->win_field_C = 0; - win->delayCounter = 0; - win->spacing = winConfig->spacing; - win->win_field_F = 0; - win->tilemapLeft = winConfig->tilemapLeft; - win->tilemapTop = winConfig->tilemapTop; - win->width = winConfig->width; - win->height = winConfig->height; - win->text = text; - win->textIndex = 0; - win->tileDataStartOffset = tileDataStartOffset; - win->tileDataOffset = 0; - win->left = 8 * left; - win->cursorX = 0; - win->top = 8 * top; - win->cursorY = 0; - win->state = WIN_STATE_BEGIN; - win->downArrowCounter = 0; - win->tileData = winConfig->tileData; - win->tilemap = winConfig->tilemap; - InitColors(win); - SetBackgroundColor(win, winConfig->backgroundColor); - SetShadowColor(win, winConfig->shadowColor); - SetForegroundColor(win, winConfig->foregroundColor); -} - -void sub_8002E4C(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u16 top, u32 a6) -{ - u8 val; - - InitWindow(win, text, tileDataStartOffset, 0, 0); - win->left = left; - win->top = top; - val = 0; - if (a6) - val = 255; - win->win_field_F = val; - if (val) - ClipLeft(win); -} - -void sub_8002E90(struct Window *win, const u8 *text) -{ - win->state = WIN_STATE_NORMAL; - win->text = text; - win->textIndex = 0; - win->downArrowCounter = 0; - win->win_field_B = -1; - win->win_field_C = 0; - win->delayCounter = 0; -} - -void sub_8002EB0(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top) -{ - gMain.watchedKeysMask = A_BUTTON | B_BUTTON; - gMain.watchedKeysPressed = 0; - sWaitType = 0; - sLineLength = 26; - InitWindow(win, text, tileDataStartOffset, left, top); - win->win_field_B = -1; - if (win->textMode == 0) - { - u16 val = GetCursorTileNum(win, 0, 0); - u8 *buffer = win->tileData + 32 * val; - ApplyColors_UnshadowedFont(sBlankTile, (u32 *)buffer, win->backgroundColor, win->backgroundColor); - ApplyColors_UnshadowedFont(&sFont1LatinGlyphs[8 * 0x6E], (u32 *)(buffer + 32), win->foregroundColor, win->backgroundColor); - win->tileDataOffset = 2; - } -} - -u8 sub_8002F44(struct Window *win) -{ - while (win->state) - { - if (win->state == WIN_STATE_NEWLINE) - { - AddToCursorY(win, 16); - win->cursorX = 0; - if (win->win_field_F) - ClipLeft(win); - win->state = WIN_STATE_NORMAL; - } - else if (win->state == WIN_STATE_PLACEHOLDER) - { - sub_8002FA0(win, GetExpandedPlaceholder(win->text[win->textIndex++])); - } - - InterpretText(win); - } - return 1; -} - -static u8 sub_8002FA0(struct Window *win, const u8 *text) -{ - u8 retVal; - u8 savedLanguage = win->language; - const u8 *savedText = win->text; - u16 savedTextIndex = win->textIndex; - win->text = text; - win->textIndex = 0; - win->state = WIN_STATE_NORMAL; - retVal = sub_8002F44(win); - win->text = savedText; - win->textIndex = savedTextIndex; - win->state = WIN_STATE_NORMAL; - win->language = savedLanguage; - return retVal; -} - -static u8 InterpretText(struct Window *win) -{ - u8 c = win->text[win->textIndex++]; - - switch (c) - { - case 0xFF: - ClipRight(win); - win->state = WIN_STATE_END; - return 0; - case 0xFD: - win->state = WIN_STATE_PLACEHOLDER; - return 2; - case 0xFE: - ClipRight(win); - win->state = WIN_STATE_NEWLINE; - return 2; - case 0xFB: - DrawInitialDownArrow(win); - win->state = WIN_STATE_PARAGRAPH; - return 2; - case 0xFA: - DrawInitialDownArrow(win); - win->state = WIN_STATE_NEWLINE_WAIT; - return 2; - case 0xFC: - return HandleExtCtrlCode(win); - } - - sPrintGlyphFuncs[win->textMode](win, c); - return 1; -} - -static u8 HandleExtCtrlCode(struct Window *win) -{ - return sExtCtrlCodeFuncs[win->text[win->textIndex++]](win); -} - -static u8 ExtCtrlCode_Nop(struct Window *win) -{ - return 2; -} - -static u8 ExtCtrlCode_ForegroundColor(struct Window *win) -{ - SetForegroundColor(win, win->text[win->textIndex++]); - return 2; -} - -static u8 ExtCtrlCode_BackgroundColor(struct Window *win) -{ - SetBackgroundColor(win, win->text[win->textIndex++]); - return 2; -} - -static u8 ExtCtrlCode_ShadowColor(struct Window *win) -{ - SetShadowColor(win, win->text[win->textIndex++]); - return 2; -} - -static u8 ExtCtrlCode_AllColors(struct Window *win) -{ - SetForegroundColor(win, win->text[win->textIndex++]); - SetBackgroundColor(win, win->text[win->textIndex++]); - SetShadowColor(win, win->text[win->textIndex++]); - return 2; -} - -static u8 ExtCtrlCode_Palette(struct Window *win) -{ - win->paletteNum = win->text[win->textIndex++]; - return 2; -} - -static u8 ExtCtrlCode_Font(struct Window *win) -{ - win->fontNum = win->text[win->textIndex++]; - return 2; -} - -static u8 ExtCtrlCode_DefaultFont(struct Window *win) -{ - win->fontNum = win->config->fontNum; - return 2; -} - -static u8 ExtCtrlCode_Pause(struct Window *win) -{ - ClipRight(win); - win->state = WIN_STATE_PAUSE; - win->delayCounter = win->text[win->textIndex++]; - return 2; -} - -static u8 ExtCtrlCode_WaitButton(struct Window *win) -{ - ClipRight(win); - win->state = WIN_STATE_WAIT_BUTTON; - return 2; -} - -static u8 ExtCtrlCode_WaitSound(struct Window *win) -{ - ClipRight(win); - win->state = WIN_STATE_WAIT_SOUND; - return 2; -} - -static u8 ExtCtrlCode_PlayBGM(struct Window *win) -{ - u16 loByte = win->text[win->textIndex++]; - u16 hiByte = win->text[win->textIndex++] << 8; - PlayBGM(loByte | hiByte); - return 2; -} - -static u8 ExtCtrlCode_Escape(struct Window *win) -{ - sPrintGlyphFuncs[win->textMode](win, win->text[win->textIndex++]); - return 1; -} - -u8 ExtCtrlCode_Nop2(struct Window *win) -{ - return 1; -} - -static u8 ExtCtrlCode_SetCursorY(struct Window *win) -{ - ClipRight(win); - AddToCursorY(win, 8 * win->text[win->textIndex++]); - return 1; -} - -static u8 ExtCtrlCode_ClearWindowTextLines(struct Window *win) -{ - ClearWindowTextLines(win); - return 2; -} - -static u8 ExtCtrlCode_PlaySE(struct Window *win) -{ - u16 loByte = win->text[win->textIndex++]; - u16 hiByte = win->text[win->textIndex++] << 8; - PlaySE(loByte | hiByte); - return 2; -} - -static void DrawSpace(struct Window *win) -{ - if (win->textMode == 1 || (win->left + win->cursorX) & 7 || win->spacing <= 7) - { - sPrintGlyphFuncs[win->textMode](win, 0); - } - else - { - u32 val = sGlyphBuffer.background; - u16 index = GetCursorTileNum(win, 0, 0); - u32 *buffer = (u32 *)(win->tileData + 32 * index); - buffer[0] = val; - buffer[1] = val; - buffer[2] = val; - buffer[3] = val; - buffer[4] = val; - buffer[5] = val; - buffer[6] = val; - buffer[7] = val; - index = GetCursorTileNum(win, 0, 1); - buffer = (u32 *)(win->tileData + 32 * index); - buffer[0] = val; - buffer[1] = val; - buffer[2] = val; - buffer[3] = val; - buffer[4] = val; - buffer[5] = val; - buffer[6] = val; - buffer[7] = val; - UpdateTilemap(win, 1); - AddToCursorX(win, 8); - } -} - -static void sub_8003344(struct Window *win, u8 newX) -{ - u8 savedSpacing = win->spacing; - - if (newX - win->cursorX <= 8) - win->spacing = newX - win->cursorX; - else - win->spacing = 8 - ((win->left + win->cursorX) & 7); - - while (win->cursorX < newX) - { - s32 spacing; - DrawSpace(win); - spacing = newX - win->cursorX; - if (spacing >= 8) - spacing = 8; - win->spacing = spacing; - } - - win->spacing = savedSpacing; -} - -static u8 ExtCtrlCode_Skip(struct Window *win) -{ - sub_8003344(win, win->cursorX + win->text[win->textIndex++]); - return 1; -} - -static u8 ExtCtrlCode_SetCursorX(struct Window *win) -{ - ClipRight(win); - SetCursorX(win, win->text[win->textIndex++]); - return 1; -} - -static u8 ExtCtrlCode_SkipTo(struct Window *win) -{ - sub_8003344(win, win->text[win->textIndex++]); - return 1; -} - -static u8 ExtCtrlCode_Spacing(struct Window *win) -{ - win->spacing = win->text[win->textIndex++]; - return 2; -} - -static u8 ExtCtrlCode_Japanese(struct Window *win) -{ - win->language = LANGUAGE_JAPANESE; - return 2; -} - -static u8 ExtCtrlCode_Latin(struct Window *win) -{ - win->language = GAME_LANGUAGE; - return 2; -} - -u8 sub_8003418(struct Window *win) -{ - u8 retVal = 1; - while (win->state) - { - if (win->state == WIN_STATE_NEWLINE) - { - AddToCursorY(win, 16); - win->cursorX = 0; - if (win->win_field_F) - ClipLeft(win); - win->state = WIN_STATE_NORMAL; - } - if (InterpretText(win) == 1) - { - retVal = 0; - break; - } - } - return retVal; -} - -u8 sub_8003460(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top) -{ - InitWindow(win, text, tileDataStartOffset, left, top); - return sub_8002F44(win); -} - -u8 sub_8003490(struct Window *win, u8 c, u16 tileDataStartOffset, u8 left, u8 top) -{ - u8 retVal; - u8 text[2]; - text[0] = c; - text[1] = EOS; - InitWindow(win, text, tileDataStartOffset, left, top); - retVal = InterpretText(win); - ClipRight(win); - return retVal; -} - -void sub_80034D4(u8 *tileData, const u8 *text) -{ - sub_8004E3C((struct WindowConfig *)&gWindowConfig_81E6C74, tileData, text); -} - -u8 sub_80034EC(u8 *str) -{ - return GetStringWidthGivenWindowConfig((struct WindowConfig *)&gWindowConfig_81E6C74, str); -} - -u8 *sub_8003504(u8 *dest, s32 value, u8 alignAmount, u8 alignType) -{ - sTempWindow.config = (struct WindowConfig *)&gWindowConfig_81E6C74; - InitWindow(&sTempWindow, 0, 0, 0, 0); - return AlignInt2(&sTempWindow, dest, value, alignAmount, alignType); -} - -u8 *sub_8003558(u8 *dest, const u8 *src, u8 alignAmount, u8 alignType) -{ - sTempWindow.config = (struct WindowConfig *)&gWindowConfig_81E6C74; - InitWindow(&sTempWindow, src, 0, 0, 0); - return AlignString(&sTempWindow, dest, src, alignAmount, alignType); -} - -u8 sub_80035AC(struct Window *win) -{ - sWaitType = 0; - return UpdateWindowText(win); -} - -static u8 UpdateWindowText(struct Window *win) -{ - switch (win->state) - { - case WIN_STATE_WAIT_BUTTON: - if (PlayerCanInterruptWait(win)) - { - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - PlaySE(SE_SELECT); - } - else - { - return 0; - } - } - else - { - win->delayCounter--; - if (win->delayCounter) - return 0; - } - win->state = WIN_STATE_NORMAL; - return 0; - case WIN_STATE_INTERRUPTIBLE_PAUSE: - if (PlayerCanInterruptWait(win) && (gMain.heldKeys & (A_BUTTON | B_BUTTON)) && gMain.watchedKeysPressed == TRUE) - { - win->delayCounter = 0; - win->state = WIN_STATE_NORMAL; - break; - } - case WIN_STATE_PAUSE: - if (win->delayCounter) - { - win->delayCounter--; - if (win->delayCounter) - return 0; - } - - win->state = WIN_STATE_NORMAL; - break; - case WIN_STATE_PARAGRAPH: - if (!WaitWithDownArrow(win)) - return 0; - ClearWindowTextLines(win); - win->state = WIN_STATE_NORMAL; - BLOCK_CROSS_JUMP - return 0; - case WIN_STATE_NEWLINE_WAIT: - if (!WaitWithDownArrow(win)) - return 0; - ScrollWindowTextLines(win); - win->state = WIN_STATE_NORMAL; - BLOCK_CROSS_JUMP - return 0; - case WIN_STATE_PLACEHOLDER: - win->textIndex++; - win->state = WIN_STATE_NORMAL; - break; - case WIN_STATE_NEWLINE: - ScrollWindowTextLines(win); - win->state = WIN_STATE_NORMAL; - BLOCK_CROSS_JUMP - return 0; - case WIN_STATE_BEGIN: - ClearWindowTextLines(win); - break; - case WIN_STATE_WAIT_SOUND: - if (IsSEPlaying()) - return 0; - win->state = WIN_STATE_NORMAL; - break; - case WIN_STATE_END: - return 1; - case WIN_STATE_NORMAL: - break; - default: - win->state = WIN_STATE_END; - return 1; - } - - InterpretText(win); - - switch (win->state) - { - case WIN_STATE_END: - return 1; - case WIN_STATE_WAIT_BUTTON: - case WIN_STATE_PARAGRAPH: - case WIN_STATE_NEWLINE_WAIT: - if (PlayerCanInterruptWait(win)) - return 0; - win->delayCounter = 60; - break; - case WIN_STATE_PAUSE: - case WIN_STATE_NEWLINE: - case WIN_STATE_WAIT_SOUND: - break; - default: - win->state = WIN_STATE_INTERRUPTIBLE_PAUSE; - win->delayCounter = GetTextDelay(win); - } - - return 0; -} - -#if defined(ENGLISH) -#define SUB_800374C_LINE_LENGTH 26 -#elif defined(GERMAN) -#define SUB_800374C_LINE_LENGTH 27 -#endif - -u8 sub_800374C(struct Window *win) -{ - u8 retVal; - - sWaitType = 1; - sLineLength = SUB_800374C_LINE_LENGTH; - retVal = UpdateWindowText(win); - sLineLength = 26; - sWaitType = 0; - return retVal; -} - -u8 sub_8003778(struct Window *win) -{ - u8 retVal; - - sWaitType = 2; - sLineLength = 26; - retVal = UpdateWindowText(win); - sWaitType = 0; - return retVal; -} - -u8 sub_80037A0(struct Window *win) -{ - u8 retVal; - - sWaitType = 3; - sLineLength = 17; - retVal = UpdateWindowText(win); - sLineLength = 26; - return retVal; -} - -u32 sub_80037C8(struct Window *win, u8 lineLength) -{ - u8 retVal; - - sWaitType = 0; - sLineLength = lineLength; - retVal = UpdateWindowText(win); - sLineLength = 26; - return retVal; -} - -static void PrintGlyph_TextMode0(struct Window *win, u32 glyph) -{ - AddToCursorX(win, DrawGlyph_TextMode0(win, glyph)); - if (win->win_field_B) - ClipRight(win); -} - -static u8 DrawGlyph_TextMode0(struct Window *win, u32 glyph) -{ - u8 pixelsWidth = GetGlyphWidth(win, glyph); - u32 tilesWidth = DrawGlyphTiles(win, glyph, pixelsWidth); - UpdateTilemap(win, tilesWidth); - return pixelsWidth; -} - -static void PrintGlyph_TextMode1(struct Window *win, u32 glyph) -{ - sWriteGlyphTilemapFuncs[win->fontNum](win, glyph); - win->cursorX += 8; -} - -static void WriteGlyphTilemap_Font0_Font3(struct Window *win, u32 glyph) -{ - s16 val = win->tileDataStartOffset + 2 * glyph; - WriteGlyphTilemap(win, val, val + 1); -} - -static void WriteGlyphTilemap_Font1_Font4(struct Window *win, u32 glyph) -{ - u32 val = glyph * 2; - WriteGlyphTilemap( - win, - win->tileDataStartOffset + sFontType1Map[val], - win->tileDataStartOffset + sFontType1Map[val + 1]); -} - -static void WriteGlyphTilemap_Font2_Font5(struct Window *win, u32 glyph) -{ - WriteGlyphTilemap( - win, - win->tileDataStartOffset + 212, - win->tileDataStartOffset + glyph); -} - -static void WriteGlyphTilemap_Font6(struct Window *win, u32 glyph) -{ - u32 val = glyph * 2; - WriteGlyphTilemap( - win, - win->tileDataStartOffset + sFontType3Map[val], - win->tileDataStartOffset + sFontType3Map[val + 1]); -} - -static void PrintGlyph_TextMode2(struct Window *win, u32 glyph) -{ - u8 width = GetGlyphWidth(win, glyph); - DrawGlyph_TextMode2(win, glyph); - AddToCursorX(win, width); - if (win->win_field_B) - ClipRight(win); -} - -static void DrawGlyph_TextMode2(struct Window *win, u32 glyph) -{ - u8 pixelsWidth = GetGlyphWidth(win, glyph); - u32 tilesWidth = DrawGlyphTiles(win, glyph, pixelsWidth); - UpdateTilemap(win, tilesWidth); -} - -static void LoadFixedWidthGlyph(struct Window *win, u32 glyph, u8 *dest) -{ - u8 *upperTile; - u8 *lowerTile; - - GetGlyphTilePointers(win->fontNum, win->language, glyph, &upperTile, &lowerTile); - - switch (win->fontNum) - { - case 0: - case 1: - case 2: - case 6: - ApplyColors_UnshadowedFont(upperTile, (u32 *)dest, win->foregroundColor, win->backgroundColor); - ApplyColors_UnshadowedFont(lowerTile, (u32 *)(dest + 32), win->foregroundColor, win->backgroundColor); - break; - case 3: - case 4: - case 5: - ApplyColors_ShadowedFont(upperTile, dest, win->foregroundColor, win->shadowColor, win->backgroundColor); - ApplyColors_ShadowedFont(lowerTile, dest + 32, win->foregroundColor, win->shadowColor, win->backgroundColor); - break; - } -} - -static void WriteGlyphTilemap(struct Window *win, u16 upperTileNum, u16 lowerTileNum) -{ - u16 *buffer = GetCursorTilemapPointer(win); - if (buffer) - { - u16 palette = (win->paletteNum << 12); - buffer[0] = upperTileNum | palette; - buffer[32] = lowerTileNum | palette; - } -} - -static void GetGlyphTilePointers(u8 fontNum, u8 language, u16 glyph, u8 **upperTilePtr, u8 **lowerTilePtr) -{ - u16 index; - const struct Font *font; - - if (language == LANGUAGE_JAPANESE) - language = 0; - else - language = 7; - - font = &sFonts[language + fontNum]; - - switch (font->type) - { - case 0: - *upperTilePtr = font->glyphs + glyph * font->glyphSize; - *lowerTilePtr = *upperTilePtr + font->lowerTileOffset; - break; - case 1: - index = 2 * glyph; - *upperTilePtr = font->glyphs + sFontType1Map[index] * font->glyphSize; - *lowerTilePtr = font->glyphs + sFontType1Map[index + 1] * font->glyphSize; - break; - case 2: - *upperTilePtr = font->glyphs + 212 * font->glyphSize; - *lowerTilePtr = font->glyphs + glyph * font->glyphSize; - break; - case 3: - index = 2 * glyph; - *upperTilePtr = font->glyphs + sFontType3Map[index] * font->glyphSize; - *lowerTilePtr = font->glyphs + sFontType3Map[index + 1] * font->glyphSize; - break; - case 4: - *upperTilePtr = font->glyphs - + (glyph & 0xFFF0) * font->glyphSize - + (((glyph &= 0xF) * font->glyphSize) >> 1); - *lowerTilePtr = *upperTilePtr + font->lowerTileOffset; - break; - } -} - -static u16 *GetCursorTilemapPointer(struct Window *win) -{ - u16 *ptr = NULL; - if (win->tilemap) - { - u8 x = ((win->left + win->cursorX) >> 3) + win->tilemapLeft; - u8 y = ((win->top + win->cursorY) >> 3) + win->tilemapTop; - ptr = &win->tilemap[(y * 32) + x]; - } - return ptr; -} - -static void ApplyColors_UnshadowedFont(const u8 *src, u32 *dest, u8 foreground, u8 background) -{ - u32 a[2]; - s32 i; - const u8 *srcRows = src; - - a[0] = background; - a[1] = foreground; - - for (i = 0; i < 8; i++) - { - u32 destRow = a[srcRows[i] & 1] - | (a[(srcRows[i] >> 1) & 1] << 4) - | (a[(srcRows[i] >> 2) & 1] << 8) - | (a[(srcRows[i] >> 3) & 1] << 12) - | (a[(srcRows[i] >> 4) & 1] << 16) - | (a[(srcRows[i] >> 5) & 1] << 20) - | (a[(srcRows[i] >> 6) & 1] << 24) - | (a[(srcRows[i] >> 7) ] << 28); - dest[i] = destRow; - } -} - -static void ApplyColors_ShadowedFont(const void *src, void *dest, u8 foreground, u8 shadow, u8 background) -{ - u32 a[0x10]; - s32 i; - const u32 *curSrc; - u32 *curDest; - u32 colorMask; - - a[0x1] = 0x1; - a[0x2] = 0x2; - a[0x3] = 0x3; - a[0x4] = 0x4; - a[0x5] = 0x5; - a[0x6] = 0x6; - a[0x7] = 0x7; - a[0x8] = 0x8; - a[0x9] = 0x9; - a[0xA] = 0xA; - a[0xB] = 0xB; - a[0xC] = 0xC; - a[0xD] = 0xD; - a[0x0] = background; - a[0xE] = shadow; - a[0xF] = foreground; - - colorMask = 0xF; - - curSrc = src; - curDest = dest; - - for (i = 7; i >= 0; i--) - { - u32 row = *curSrc++; - u32 recoloredRow = a[row & colorMask] - | (a[(row >> 4) & colorMask] << 4) - | (a[(row >> 8) & colorMask] << 8) - | (a[(row >> 12) & colorMask] << 12) - | (a[(row >> 16) & colorMask] << 16) - | (a[(row >> 20) & colorMask] << 20) - | (a[(row >> 24) & colorMask] << 24) - | (a[(row >> 28) ] << 28); - *curDest++ = recoloredRow; - } -} - -static void SetCursorX(struct Window *win, u8 x) -{ - if (win->textMode == 0 && ((win->left + win->cursorX) & 7)) - win->tileDataOffset += 2; - win->cursorX = x; -} - -static void AddToCursorX(struct Window *win, u8 deltaX) -{ - if (win->textMode == 0) - { - u8 x = win->cursorX; - win->cursorX += deltaX; - if (((win->left + win->cursorX) & 0xF8) != ((win->left + x) & 0xF8)) - win->tileDataOffset += 2; - } - else - { - win->cursorX += deltaX; - } -} - -static void AddToCursorY(struct Window *win, u8 deltaY) -{ - if (win->textMode == 0 && ((win->left + win->cursorX) & 7)) - win->tileDataOffset += 2; - win->cursorY += deltaY; -} - -static void EraseAtCursor(struct Window *win) -{ - switch (win->textMode) - { - case 0: - case 2: - DrawGlyphTiles(win, 0, 8); - break; - case 1: - sWriteGlyphTilemapFuncs[win->fontNum](win, 0); - break; - } -} - -static void ClipLeft(struct Window *win) -{ - u32 pixel = win->left & 7; - if (win->textMode != 1 && pixel) - { - const u32 *masks = sGlyphMasks[8][pixel]; - u32 outsideMask = masks[0]; - u32 insideMask = ~outsideMask; - u32 outside = sGlyphBuffer.background & outsideMask; - u16 tileNum = GetCursorTileNum(win, 0, 0); - u32 *buffer = (u32 *)(win->tileData + 32 * tileNum); - buffer[0] = (buffer[0] & insideMask) | outside; - buffer[1] = (buffer[1] & insideMask) | outside; - buffer[2] = (buffer[2] & insideMask) | outside; - buffer[3] = (buffer[3] & insideMask) | outside; - buffer[4] = (buffer[4] & insideMask) | outside; - buffer[5] = (buffer[5] & insideMask) | outside; - buffer[6] = (buffer[6] & insideMask) | outside; - buffer[7] = (buffer[7] & insideMask) | outside; - tileNum = GetCursorTileNum(win, 0, 1); - buffer = (u32 *)(win->tileData + 32 * tileNum); - buffer[0] = (buffer[0] & insideMask) | outside; - buffer[1] = (buffer[1] & insideMask) | outside; - buffer[2] = (buffer[2] & insideMask) | outside; - buffer[3] = (buffer[3] & insideMask) | outside; - buffer[4] = (buffer[4] & insideMask) | outside; - buffer[5] = (buffer[5] & insideMask) | outside; - buffer[6] = (buffer[6] & insideMask) | outside; - buffer[7] = (buffer[7] & insideMask) | outside; - } -} - -static void ClipRight(struct Window *win) -{ - register u8 cursorX asm("r0") = win->cursorX; - u8 left = win->left; - u32 pixel = (cursorX + left) & 7; - if (win->textMode != 1 && pixel) - { - const u32 *masks = sGlyphMasks[8 - pixel][pixel]; - u32 insideMask = masks[0]; - u32 outside = (sGlyphBuffer.background & ~insideMask); - u16 tileNum = GetCursorTileNum(win, 0, 0); - u32 *buffer = (u32 *)(win->tileData + 32 * tileNum); - buffer[0] = (buffer[0] & insideMask) | outside; - buffer[1] = (buffer[1] & insideMask) | outside; - buffer[2] = (buffer[2] & insideMask) | outside; - buffer[3] = (buffer[3] & insideMask) | outside; - buffer[4] = (buffer[4] & insideMask) | outside; - buffer[5] = (buffer[5] & insideMask) | outside; - buffer[6] = (buffer[6] & insideMask) | outside; - buffer[7] = (buffer[7] & insideMask) | outside; - tileNum = GetCursorTileNum(win, 0, 1); - buffer = (u32 *)(win->tileData + 32 * tileNum); - buffer[0] = (buffer[0] & insideMask) | outside; - buffer[1] = (buffer[1] & insideMask) | outside; - buffer[2] = (buffer[2] & insideMask) | outside; - buffer[3] = (buffer[3] & insideMask) | outside; - buffer[4] = (buffer[4] & insideMask) | outside; - buffer[5] = (buffer[5] & insideMask) | outside; - buffer[6] = (buffer[6] & insideMask) | outside; - buffer[7] = (buffer[7] & insideMask) | outside; - UpdateTilemap(win, 1); - } -} - -static void InitColors(struct Window *win) -{ - u32 i; - - win->backgroundColor = 0; - win->shadowColor = 14; - win->foregroundColor = 15; - - for (i = 0; i < 16; i++) - sGlyphBuffer.colors[i] = i; -} - -static void SetBackgroundColor(struct Window *win, u8 color) -{ - u32 val1; - u32 val2; - u32 val3; - win->backgroundColor = color; - sGlyphBuffer.colors[0] = color; - val1 = color | (color << 4); - val2 = val1 | (val1 << 8); - val3 = val2 | (val2 << 16); - sGlyphBuffer.background = val3; -} - -static void SetShadowColor(struct Window *win, u8 color) -{ - win->shadowColor = color; - sGlyphBuffer.colors[14] = color; -} - -static void SetForegroundColor(struct Window *win, u8 color) -{ - win->foregroundColor = color; - sGlyphBuffer.colors[15] = color; -} - -static u8 GetTextDelay(struct Window *win) -{ - if (!PlayerCanInterruptWait(win)) - return 3; - - return sTextSpeedDelays[gSaveBlock2.optionsTextSpeed]; -} - -static bool8 PlayerCanInterruptWait(struct Window *win) -{ - bool8 retVal = TRUE; - - switch (sWaitType) - { - case 2: - retVal = FALSE; - break; - case 3: - retVal = gIsLinkContest ? FALSE : TRUE; - break; - case 1: - retVal = (gBattleTypeFlags & BATTLE_TYPE_LINK) ? FALSE : TRUE; - break; - } - - return retVal; -} - -static void ScrollWindowTextLines(struct Window *win) -{ - switch (win->textMode) - { - case 0: - ScrollWindowTextLines_TextMode0(win); - break; - case 1: - ScrollWindowTextLines_TextMode1(win); - break; - case 2: - ScrollWindowTextLines_TextMode2(win); - break; - } -} - -static void ScrollWindowTextLines_TextMode0(struct Window *win) -{ - if (win->cursorY == 0) - { - win->tileDataOffset = 2 * sLineLength + 2; - win->cursorX = 0; - win->cursorY += 16; - } - else - { - if (win->win_field_C & 2) - win->tileDataOffset = 2 * sLineLength + 2; - else - win->tileDataOffset = 2; - win->win_field_C = win->win_field_C ^ 2; - win->cursorX = 0; - DoScroll_TextMode0(win, sLineLength); - } -} - -static void DoScroll_TextMode0(struct Window *win, u16 lineLength) -{ - u16 *buffer = win->tilemap; - u32 val1 = 32 * (win->top >> 3); - u32 val2 = (win->left >> 3); - u16 fill; - buffer += val1 + val2; - fill = (win->paletteNum << 12) | GetBlankTileNum(win); - CpuCopy16(buffer + 64, buffer, lineLength * 2); - CpuCopy16(buffer + 96, buffer + 32, lineLength * 2); - CpuFill16(fill, buffer + 64, lineLength * 2); - CpuFill16(fill, buffer + 96, lineLength * 2); -} - -static void ScrollWindowTextLines_TextMode1(struct Window *win) -{ - if (win->cursorY == 0) - { - win->cursorX = 0; - win->cursorY += 16; - } - else - { - win->win_field_C ^= 2; - win->cursorX = 0; - DoScroll_TextMode1(win, sLineLength); - } -} - -static void DoScroll_TextMode1(struct Window *win, u16 lineLength) -{ - u16 *buffer = GetCursorTilemapPointer(win); - u16 *dest = buffer - 32; - u16 fill = (win->paletteNum << 12) | GetBlankTileNum(win); - CpuCopy16(buffer + 32, dest, lineLength * 2); - CpuCopy16(buffer + 64, buffer, lineLength * 2); - CpuFill16(fill, buffer + 32, lineLength * 2); - CpuFill16(fill, buffer + 64, lineLength * 2); -} - -static void ScrollWindowTextLines_TextMode2(struct Window *win) -{ - if (win->cursorY == 0) - { - win->cursorX = 0; - win->cursorY += 16; - } - else - { - win->win_field_C ^= 2; - win->cursorX = 0; - DoScroll_TextMode2(win, sLineLength); - } -} - -static void DoScroll_TextMode2(struct Window *win, u8 lineLength) -{ - u8 i; - u8 *buf1 = win->tileData + 32 * GetCursorTileNum(win, 0, -2); - u8 *buf2 = win->tileData + 32 * GetCursorTileNum(win, 0, 0); - u8 *buf4; - u16 *buf3; - u16 a[4]; - - CpuFastCopy(buf2, buf1, 32 * lineLength); - CpuFastFill(sGlyphBuffer.background, buf2, 32 * lineLength); - buf4 = buf2 + 32 * win->width; - CpuFastCopy(buf4, buf1 + 32 * win->width, 32 * lineLength); - CpuFastFill(sGlyphBuffer.background, buf4, 32 * lineLength); - - buf3 = GetCursorTilemapPointer(win) - 64; - - a[0] = (win->tileDataStartOffset + win->tileDataOffset - + ((win->top >> 3) * win->width) - + (win->left >> 3)) - | (win->paletteNum << 12); - a[1] = a[0] + win->width; - a[2] = a[1] + win->width; - a[3] = a[2] + win->width; - - for (i = 0; i < lineLength; i++) - { - buf3[0] = a[0]++; - buf3[32] = a[1]++; - buf3[64] = a[2]++; - buf3[96] = a[3]++; - buf3++; - } -} - -void ClearWindowTextLines(struct Window *win) -{ - switch (win->textMode) - { - case 0: - ClearWindowTextLines_TextMode0_TextMode1(win, sLineLength); - win->tileDataOffset = 2; - break; - case 1: - ClearWindowTextLines_TextMode0_TextMode1(win, sLineLength); - break; - case 2: - ClearWindowTextLines_TextMode2(win, sLineLength); - break; - } -} - -static void ClearWindowTextLines_TextMode0_TextMode1(struct Window *win, u8 lineLength) -{ - u8 i; - u16 *buffer; - u16 fill; - - win->cursorX = 0; - win->cursorY = 0; - win->win_field_C = 0; - - buffer = GetCursorTilemapPointer(win); - fill = GetBlankTileNum(win) | (win->paletteNum << 12); - - for (i = 0; i < 4; i++) - { - u8 j; - for (j = 0; j < lineLength; j++) - buffer[j] = fill; - buffer += 32; - } -} - -static void ClearWindowTextLines_TextMode2(struct Window *win, u8 lineLength) -{ - u8 *buffer; - - win->cursorX = 0; - win->cursorY = 0; - win->win_field_C = 0; - - buffer = win->tileData + 32 * GetCursorTileNum(win, 0, 0); - CpuFastFill(sGlyphBuffer.background, buffer, 32 * lineLength); - buffer += 32 * win->width; - CpuFastFill(sGlyphBuffer.background, buffer, 32 * lineLength); - buffer += 32 * win->width; - CpuFastFill(sGlyphBuffer.background, buffer, 32 * lineLength); - buffer += 32 * win->width; - CpuFastFill(sGlyphBuffer.background, buffer, 32 * lineLength); -} - -static void DrawDownArrow(struct Window *win) -{ - if (PlayerCanInterruptWait(win)) - { - const u32 *downArrowTiles = &sDownArrowTiles[((win->downArrowCounter & 0x0F00) >> 8) * 16]; - - switch (win->textMode) - { - case 1: - { - u8 *buffer; - u16 tileNum = win->tileDataStartOffset + 254; - if (win->fontNum == 0 || win->fontNum == 3) - tileNum *= 2; - buffer = win->tileData + 32 * tileNum; - ApplyColors_ShadowedFont(downArrowTiles, buffer, win->foregroundColor, win->shadowColor, win->backgroundColor); - ApplyColors_ShadowedFont(downArrowTiles + 8, buffer + 32, win->foregroundColor, win->shadowColor, win->backgroundColor); - WriteGlyphTilemap(win, tileNum, tileNum + 1); - break; - } - case 0: - case 2: - { - struct GlyphTileInfo glyphTileInfo; - glyphTileInfo.textMode = win->textMode; - glyphTileInfo.startPixel = (win->left + win->cursorX) & 7; - if (glyphTileInfo.startPixel != 0) - { - u8 *upperTile; - u8 *lowerTile; - GetGlyphTilePointers(win->fontNum, win->language, 0, &upperTile, &lowerTile); - glyphTileInfo.width = 8 - glyphTileInfo.startPixel; - glyphTileInfo.src = upperTile; - glyphTileInfo.dest = (u32 *)(win->tileData + 32 * GetCursorTileNum(win, 1, 0)); - glyphTileInfo.colors = sGlyphBuffer.colors; - DrawGlyphTile_ShadowedFont(&glyphTileInfo); - glyphTileInfo.src = lowerTile; - glyphTileInfo.dest = (u32 *)(win->tileData + 32 * GetCursorTileNum(win, 1, 1)); - DrawGlyphTile_ShadowedFont(&glyphTileInfo); - } - glyphTileInfo.width = 8; - glyphTileInfo.src = (u8 *)downArrowTiles; - glyphTileInfo.dest = (u32 *)(win->tileData + 32 * GetCursorTileNum(win, 0, 0)); - glyphTileInfo.colors = sGlyphBuffer.colors; - DrawGlyphTile_ShadowedFont(&glyphTileInfo); - glyphTileInfo.src += 32; - glyphTileInfo.dest = (u32 *)(win->tileData + 32 * GetCursorTileNum(win, 0, 1)); - DrawGlyphTile_ShadowedFont(&glyphTileInfo); - if (glyphTileInfo.startPixel != 0) - UpdateTilemap(win, 2); - else - UpdateTilemap(win, 1); - break; - } - } - } -} - -static u8 WaitWithDownArrow(struct Window *win) -{ - u8 retVal = 1; - - if (!PlayerCanInterruptWait(win)) - { - win->delayCounter--; - if (!win->delayCounter) - { - TryEraseDownArrow(win); - } - else - { - DrawMovingDownArrow(win); - retVal = 0; - } - } - else - { - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - PlaySE(SE_SELECT); - TryEraseDownArrow(win); - } - else - { - DrawMovingDownArrow(win); - retVal = 0; - } - } - - return retVal; -} - -static void DrawInitialDownArrow(struct Window *win) -{ - win->downArrowCounter = 0; - DrawDownArrow(win); -} - -static void DrawMovingDownArrow(struct Window *win) -{ - u16 downArrowPos = (win->downArrowCounter & 0x0F00) >> 8; - u16 wait = win->downArrowCounter & 0x000F; - u16 newVal; - - wait++; - - if (wait == 6) - { - wait = 0; - downArrowPos++; - if (downArrowPos > 3) - downArrowPos = 0; - win->downArrowCounter = downArrowPos << 8; - DrawDownArrow(win); - } - - newVal = downArrowPos << 8; - newVal |= wait; - - win->downArrowCounter = newVal; -} - -static void TryEraseDownArrow(struct Window *win) -{ - win->downArrowCounter = 0; - if (PlayerCanInterruptWait(win) == TRUE) - EraseAtCursor(win); -} - -u16 GetWindowTilemapEntry(struct Window *win, u8 x, u8 y) -{ - u16 *tilemap = win->tilemap; - return tilemap[32 * y + x]; -} - -void DrawWindowRect(struct Window *win, u16 tilemapEntry, u8 left, u8 top, u8 right, u8 bottom) -{ - u8 i; - u16 *buffer = &win->tilemap[top * 32]; - - for (i = left; i <= right; i++) - buffer[i] = tilemapEntry; - - for (i = top + 1; i < bottom - 1; i++) - { - buffer += 32; - buffer[left] = tilemapEntry; - buffer[right] = tilemapEntry; - } - - if (top != bottom) - { - buffer += 32; - for (i = left; i <= right; i++) - buffer[i] = tilemapEntry; - } -} - -void DrawWindowRect_DefaultPalette(struct Window *win, u16 tileNum, u8 left, u8 top, u8 right, u8 bottom) -{ - DrawWindowRect(win, (win->paletteNum << 12) | tileNum, left, top, right, bottom); -} - -void FillWindowRect(struct Window *win, u16 tilemapEntry, u8 left, u8 top, u8 right, u8 bottom) -{ - u16 *buffer = &win->tilemap[top * 32]; - while (top++ <= bottom) - { - u8 j; - for (j = left; j <= right; j++) - buffer[j] = tilemapEntry; - buffer += 32; - } -} - -void FillWindowRect_DefaultPalette(struct Window *win, u16 tileNum, u8 left, u8 top, u8 right, u8 bottom) -{ - FillWindowRect(win, (win->paletteNum << 12) | tileNum, left, top, right, bottom); -} - -void ZeroFillWindowRect(struct Window *win, u8 left, u8 top, u8 right, u8 bottom) -{ - FillWindowRect_DefaultPalette(win, 0, left, top, right, bottom); -} - -void FillWindowRectWithBlankTile(struct Window *win, u8 left, u8 top, u8 right, u8 bottom) -{ - u16 tileNum = GetBlankTileNum(win); - FillWindowRect_DefaultPalette(win, tileNum, left, top, right, bottom); -} - -static u16 GetBlankTileNum(struct Window *win) -{ - u16 retVal = win->tileDataStartOffset; - - switch (win->textMode) - { - case 0: - break; - case 2: - retVal++; - break; - case 1: - switch (win->fontNum) - { - case 1: - case 2: - case 4: - case 5: - retVal += 212; - case 0: - case 3: - case 6: - break; - default: - retVal = 0; - } - break; - } - - return retVal; -} - -static s32 sub_80048D8(struct Window *win, u8 x, u8 y) -{ - win->cursorX = x; - win->cursorY = y & 0xF8; -} - -static u8 GetGlyphWidth(struct Window *win, u32 glyph) -{ - u8 width = 8; - -#ifdef BUGFIX_GLYPHWIDTH - if (win->language != LANGUAGE_JAPANESE) -#else - if (win->language == LANGUAGE_ENGLISH) -#endif - { - width = win->spacing; - if (!win->spacing) - { - switch (win->fontNum) - { - case 3: - width = sFont3Widths[glyph]; - break; - case 4: - case 5: - width = sFont4Widths[sFontType1Map[2 * glyph + 1]]; - break; - case 0: - width = sFont0Widths[glyph]; - break; - case 1: - case 2: - width = sFont1Widths[sFontType1Map[2 * glyph + 1]]; - break; - case 6: - width = 8; - break; - default: - width = 8; - } - } - } - - return width; -} - -u8 GetExtCtrlCodeLength(u8 code) -{ - u8 length = 0; - if (code <= 0x16) - length = sExtCtrlCodeLengths[code]; - return length; -} - -u8 *AlignInt1(struct Window *win, u8 *dest, s32 value, u8 alignAmount, u8 alignType) -{ - u8 temp[16]; - u8 width; - switch (alignType) - { - case 0: - ConvertIntToDecimalString(temp, value); - dest = StringCopy(dest, temp); - dest[0] = 0xFC; - dest[1] = 19; - dest[2] = alignAmount; - dest += 3; - *dest = 0xFF; - break; - case 1: - ConvertIntToDecimalString(temp, value); - width = GetStringWidth(win, temp); - if (alignAmount > width) - { - dest[0] = 0xFC; - dest[1] = 19; - dest[2] = alignAmount - width; - dest += 3; - } - dest = StringCopy(dest, temp); - break; - case 2: - ConvertIntToDecimalString(temp, value); - width = GetStringWidth(win, temp); - if (alignAmount > width) - { - dest[0] = 0xFC; - dest[1] = 19; - dest[2] = (alignAmount - width) / 2; - dest += 3; - } - dest = StringCopy(dest, temp); - if (alignAmount > width) - { - dest[0] = 0xFC; - dest[1] = 19; - dest[2] = alignAmount; - dest += 3; - *dest = 0xFF; - } - break; - } - return dest; -} - -u8 *AlignInt2(struct Window *win, u8 *dest, s32 value, u8 alignAmount, u8 alignType) -{ - u8 temp[16]; - u8 width; - switch (alignType) - { - case 0: - ConvertIntToDecimalString(temp, value); - width = GetStringWidth(win, temp); - dest = StringCopy(dest, temp); - dest[0] = 0xFC; - dest[1] = 17; - dest[2] = alignAmount - width; - dest += 3; - *dest = 0xFF; - break; - case 1: - ConvertIntToDecimalString(temp, value); - width = GetStringWidth(win, temp); - if (alignAmount > width) - { - dest[0] = 0xFC; - dest[1] = 17; - dest[2] = alignAmount - width; - dest += 3; - } - dest = StringCopy(dest, temp); - break; - case 2: - ConvertIntToDecimalString(temp, value); - width = GetStringWidth(win, temp); - if (alignAmount > width) - { - dest[0] = 0xFC; - dest[1] = 17; - dest[2] = (alignAmount - width) / 2; - dest += 3; - } - dest = StringCopy(dest, temp); - if (alignAmount > width) - { - dest[0] = 0xFC; - dest[1] = 17; - dest[2] = (alignAmount - width) / 2; - dest += 3; - *dest = 0xFF; - } - break; - } - return dest; -} - -u8 *AlignString(struct Window *win, u8 *dest, const u8 *src, u8 alignAmount, u8 alignType) -{ - u8 width; - switch (alignType) - { - case 0: - dest = StringCopy(dest, src); - dest[0] = 0xFC; - dest[1] = 19; - dest[2] = alignAmount; - dest += 3; - *dest = 0xFF; - break; - case 1: - width = GetStringWidth(win, src); - if (alignAmount > width) - { - dest[0] = 0xFC; - dest[1] = 19; - dest[2] = alignAmount - width; - dest += 3; - } - dest = StringCopy(dest, src); - break; - case 2: - width = GetStringWidth(win, src); - if (alignAmount > width) - { - dest[0] = 0xFC; - dest[1] = 19; - dest[2] = (alignAmount - width) / 2; - dest += 3; - } - dest = StringCopy(dest, src); - if (alignAmount > width) - { - dest[0] = 0xFC; - dest[1] = 19; - dest[2] = alignAmount; - dest += 3; - *dest = 0xFF; - } - break; - } - return dest; -} - -u8 GetStringWidth(struct Window *win, const u8 *s) -{ - u8 width = 0; - u8 savedFontNum = win->fontNum; - u8 savedCharset = win->language; - u8 savedSpacing = win->spacing; - s32 i = 0; - - while (s[i] != 0xFF) - { - u8 c = s[i]; - switch (c) - { - case 0xFD: - { - u8 temp; - i++; - temp = win->language; - width += GetStringWidth(win, GetExpandedPlaceholder(s[i])); - win->language = temp; - i++; - break; - } - case 0xFC: - i++; - switch (s[i]) - { - case 6: - win->fontNum = s[i + 1]; - break; - case 7: - win->fontNum = win->config->fontNum; - break; - case 0x11: - width += s[i + 1]; - break; - case 0x12: - case 0x13: - if (width < s[i + 1]) - width = s[i + 1]; - break; - case 0x14: - win->spacing = s[i + 1]; - break; - case 0x15: - win->language = LANGUAGE_JAPANESE; - break; - case 0x16: - win->language = GAME_LANGUAGE; - break; - } - - i += GetExtCtrlCodeLength(s[i]); - break; - default: - i++; - width += GetGlyphWidth(win, c); - } - } - - win->spacing = savedSpacing; - win->language = savedCharset; - win->fontNum = savedFontNum; - - return width; -} - -u8 sub_8004D04(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u16 top, u32 a6) -{ - sub_8002E4C(win, text, tileDataStartOffset, left, top, a6); - return sub_8002F44(win); -} - -u8 sub_8004D38(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top) -{ - u8 width = GetStringWidth(win, text); - InitWindow(win, text, tileDataStartOffset, left - ((u32)(width + 7) >> 3), top); - EraseAtCursor(win); - width &= 7; - if (width) - width = 8 - width; - sub_80048D8(win, width, 0); - return sub_8002F44(win); -} - -u8 sub_8004DB0(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top, u16 a6) -{ - register u32 val asm("r5") = (u8)((a6 >> 1) - (GetStringWidth(win, text) >> 1)); - left += (val >> 3); - InitWindow(win, text, tileDataStartOffset, left, top); - EraseAtCursor(win); - sub_80048D8(win, val & 7, 0); - return sub_8002F44(win); -} - -u8 sub_8004E24(struct Window *win) -{ - return win->paletteNum; -} - -void sub_8004E28(struct Window *win, u8 *foreground, u8 *background, u8 *shadow) -{ - *foreground = win->foregroundColor; - *background = win->backgroundColor; - *shadow = win->shadowColor; -} - -void sub_8004E3C(struct WindowConfig *winConfig, u8 *tileData, const u8 *text) -{ - sTempWindow.config = winConfig; - InitWindow(&sTempWindow, text, 0, 0, 0); - sTempWindow.tileData = tileData; - sub_8002F44(&sTempWindow); -} - -u8 GetStringWidthGivenWindowConfig(struct WindowConfig *winConfig, const u8 *s) -{ - sTempWindow.config = winConfig; - InitWindow(&sTempWindow, s, 0, 0, 0); - return GetStringWidth(&sTempWindow, s); -} - -void ConvertInternationalString(u8 *s, u8 language) -{ - if (language == LANGUAGE_JAPANESE) - { - u8 i; - - StripExtCtrlCodes(s); - i = StringLength(s); - s[i++] = 0xFC; - s[i++] = 22; - s[i++] = 0xFF; - - i--; - - while (i != (u8)-1) - { - s[i + 2] = s[i]; - i--; - } - - s[0] = 0xFC; - s[1] = 21; - } -} - -void StripExtCtrlCodes(u8 *str) -{ - u16 srcIndex = 0; - u16 destIndex = 0; - while (str[srcIndex] != 0xFF) - { - if (str[srcIndex] == 0xFC) - { - srcIndex++; - srcIndex += GetExtCtrlCodeLength(str[srcIndex]); - } - else - { - str[destIndex++] = str[srcIndex++]; - } - } - str[destIndex] = 0xFF; -} - -static const u8 *SkipExtCtrlCode(const u8 *s) -{ - while (*s == 0xFC) - { - s++; - s += GetExtCtrlCodeLength(*s); - } - - return s; -} - -s32 StringCompareWithoutExtCtrlCodes(const u8 *str1, const u8 *str2) -{ - s32 retVal = 0; - - while (1) - { - str1 = SkipExtCtrlCode(str1); - str2 = SkipExtCtrlCode(str2); - - if (*str1 > *str2) - break; - - if (*str1 < *str2) - { - retVal = -1; - if (*str2 == 0xFF) - retVal = 1; - } - - if (*str1 == 0xFF) - return retVal; - - str1++; - str2++; - } - - retVal = 1; - - if (*str1 == 0xFF) - retVal = -1; - - return retVal; -} - -u8 sub_8004FD0(struct Window *win, u8 *dest, const u8 *src, u16 tileDataStartOffset, u8 left, u16 top, u8 width, u32 a8) -{ - u8 newlineCount = 0; - u8 extCtrlCodeLength; - u8 *start; - u32 endsWithoutNewline; - - if (dest == NULL) - dest = gStringVar4; - - start = dest; - endsWithoutNewline = FALSE; - - while (*src != 0xFF) - { - switch (*src) - { - default: - *dest = *src; - dest++; - src++; - endsWithoutNewline = TRUE; - break; - case 0xFC: - extCtrlCodeLength = GetExtCtrlCodeLength(src[1]) + 1; - memcpy(dest, src, extCtrlCodeLength); - dest += extCtrlCodeLength; - src += extCtrlCodeLength; - break; - case 0xFE: - dest[0] = 0xFC; - dest[1] = 19; - dest[2] = width; - dest[3] = 0xFE; - dest += 4; - src++; - newlineCount++; - endsWithoutNewline = FALSE; - break; - } - } - - dest[0] = 0xFC; - dest[1] = 19; - dest[2] = width; - dest[3] = 0xFF; - - if (endsWithoutNewline) - newlineCount++; - - sub_8002E4C(win, start, tileDataStartOffset, left, top, a8); - sub_8002F44(win); - - return newlineCount; -} - -static s32 DrawGlyphTile_UnshadowedFont(struct GlyphTileInfo *glyphTileInfo) -{ - struct GlyphBuffer *glyphBuffer = &sGlyphBuffer; - u32 colors[2]; - u32 *buffer = glyphTileInfo->dest; - const u32 *masks = sGlyphMasks[glyphTileInfo->width][glyphTileInfo->startPixel]; - u32 mask1 = masks[0] | masks[2]; - - glyphBuffer->pixelRows[0] = buffer[0] & mask1; - glyphBuffer->pixelRows[1] = buffer[1] & mask1; - glyphBuffer->pixelRows[2] = buffer[2] & mask1; - glyphBuffer->pixelRows[3] = buffer[3] & mask1; - glyphBuffer->pixelRows[4] = buffer[4] & mask1; - glyphBuffer->pixelRows[5] = buffer[5] & mask1; - glyphBuffer->pixelRows[6] = buffer[6] & mask1; - glyphBuffer->pixelRows[7] = buffer[7] & mask1; - - if (glyphTileInfo->startPixel + glyphTileInfo->width > 8) - { - u32 mask2 = masks[1]; - if (glyphTileInfo->textMode == 2) - { - glyphBuffer->pixelRows[8] = buffer[8] & mask2; - glyphBuffer->pixelRows[9] = buffer[9] & mask2; - glyphBuffer->pixelRows[10] = buffer[10] & mask2; - glyphBuffer->pixelRows[11] = buffer[11] & mask2; - glyphBuffer->pixelRows[12] = buffer[12] & mask2; - glyphBuffer->pixelRows[13] = buffer[13] & mask2; - glyphBuffer->pixelRows[14] = buffer[14] & mask2; - glyphBuffer->pixelRows[15] = buffer[15] & mask2; - } - else - { - glyphBuffer->pixelRows[8] = buffer[16] & mask2; - glyphBuffer->pixelRows[9] = buffer[17] & mask2; - glyphBuffer->pixelRows[10] = buffer[18] & mask2; - glyphBuffer->pixelRows[11] = buffer[19] & mask2; - glyphBuffer->pixelRows[12] = buffer[20] & mask2; - glyphBuffer->pixelRows[13] = buffer[21] & mask2; - glyphBuffer->pixelRows[14] = buffer[22] & mask2; - glyphBuffer->pixelRows[15] = buffer[23] & mask2; - } - } - - colors[0] = glyphTileInfo->colors[0]; - colors[1] = glyphTileInfo->colors[15]; - - sShiftGlyphTileUnshadowedFuncs[glyphTileInfo->width](glyphBuffer, glyphTileInfo->src, colors, glyphTileInfo->startPixel); - - buffer[0] = glyphBuffer->pixelRows[0]; - buffer[1] = glyphBuffer->pixelRows[1]; - buffer[2] = glyphBuffer->pixelRows[2]; - buffer[3] = glyphBuffer->pixelRows[3]; - buffer[4] = glyphBuffer->pixelRows[4]; - buffer[5] = glyphBuffer->pixelRows[5]; - buffer[6] = glyphBuffer->pixelRows[6]; - buffer[7] = glyphBuffer->pixelRows[7]; - - if (glyphTileInfo->startPixel + glyphTileInfo->width > 8) - { - if (glyphTileInfo->textMode != 2) - buffer += 8; - buffer[8] = glyphBuffer->pixelRows[8]; - buffer[9] = glyphBuffer->pixelRows[9]; - buffer[10] = glyphBuffer->pixelRows[10]; - buffer[11] = glyphBuffer->pixelRows[11]; - buffer[12] = glyphBuffer->pixelRows[12]; - buffer[13] = glyphBuffer->pixelRows[13]; - buffer[14] = glyphBuffer->pixelRows[14]; - buffer[15] = glyphBuffer->pixelRows[15]; - } - - return (glyphTileInfo->startPixel + glyphTileInfo->width) / 8; -} - -static void ShiftGlyphTile_UnshadowedFont_Width0(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *a3, u8 startPixel) -{ -} - -static void ShiftGlyphTile_UnshadowedFont_Width1(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - u32 val = colors[src[i] >> 7]; - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -static void ShiftGlyphTile_UnshadowedFont_Width2(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - u32 val = (colors[(src[i] >> 7) & 1] << 0) - | (colors[(src[i] >> 6) & 1] << 4); - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -static void ShiftGlyphTile_UnshadowedFont_Width3(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - // XXX: why 4? - u32 val = (colors[(src[i] >> 7) & 1] << 0) - | (colors[(src[i] >> 6) & 1] << 4) - | (colors[(src[i] >> 5) & 1] << 8) - | (colors[(src[i] >> 4) & 1] << 12); - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -static void ShiftGlyphTile_UnshadowedFont_Width4(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - u32 val = (colors[(src[i] >> 7) & 1] << 0) - | (colors[(src[i] >> 6) & 1] << 4) - | (colors[(src[i] >> 5) & 1] << 8) - | (colors[(src[i] >> 4) & 1] << 12); - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -static void ShiftGlyphTile_UnshadowedFont_Width5(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - u32 val = (colors[(src[i] >> 7) & 1] << 0) - | (colors[(src[i] >> 6) & 1] << 4) - | (colors[(src[i] >> 5) & 1] << 8) - | (colors[(src[i] >> 4) & 1] << 12) - | (colors[(src[i] >> 3) & 1] << 16); - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -static void ShiftGlyphTile_UnshadowedFont_Width6(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - u32 val = (colors[(src[i] >> 7) & 1] << 0) - | (colors[(src[i] >> 6) & 1] << 4) - | (colors[(src[i] >> 5) & 1] << 8) - | (colors[(src[i] >> 4) & 1] << 12) - | (colors[(src[i] >> 3) & 1] << 16) - | (colors[(src[i] >> 2) & 1] << 20); - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -static void ShiftGlyphTile_UnshadowedFont_Width7(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - u32 val = (colors[(src[i] >> 7) & 1] << 0) - | (colors[(src[i] >> 6) & 1] << 4) - | (colors[(src[i] >> 5) & 1] << 8) - | (colors[(src[i] >> 4) & 1] << 12) - | (colors[(src[i] >> 3) & 1] << 16) - | (colors[(src[i] >> 2) & 1] << 20) - | (colors[(src[i] >> 1) & 1] << 24); - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -static void ShiftGlyphTile_UnshadowedFont_Width8(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - u32 val = (colors[(src[i] >> 7) & 1] << 0) - | (colors[(src[i] >> 6) & 1] << 4) - | (colors[(src[i] >> 5) & 1] << 8) - | (colors[(src[i] >> 4) & 1] << 12) - | (colors[(src[i] >> 3) & 1] << 16) - | (colors[(src[i] >> 2) & 1] << 20) - | (colors[(src[i] >> 1) & 1] << 24) - | (colors[(src[i] >> 0) & 1] << 28); - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -static s32 DrawGlyphTile_ShadowedFont(struct GlyphTileInfo *glyphTileInfo) -{ - struct GlyphBuffer *glyphBuffer = &sGlyphBuffer; - u32 *buffer = glyphTileInfo->dest; - const u32 *masks = sGlyphMasks[glyphTileInfo->width][glyphTileInfo->startPixel]; - u32 mask1 = masks[0] | masks[2]; - - glyphBuffer->pixelRows[0] = buffer[0] & mask1; - glyphBuffer->pixelRows[1] = buffer[1] & mask1; - glyphBuffer->pixelRows[2] = buffer[2] & mask1; - glyphBuffer->pixelRows[3] = buffer[3] & mask1; - glyphBuffer->pixelRows[4] = buffer[4] & mask1; - glyphBuffer->pixelRows[5] = buffer[5] & mask1; - glyphBuffer->pixelRows[6] = buffer[6] & mask1; - glyphBuffer->pixelRows[7] = buffer[7] & mask1; - - if (glyphTileInfo->startPixel + glyphTileInfo->width > 8) - { - u32 mask2 = masks[1]; - if (glyphTileInfo->textMode == 2) - { - glyphBuffer->pixelRows[8] = buffer[8] & mask2; - glyphBuffer->pixelRows[9] = buffer[9] & mask2; - glyphBuffer->pixelRows[10] = buffer[10] & mask2; - glyphBuffer->pixelRows[11] = buffer[11] & mask2; - glyphBuffer->pixelRows[12] = buffer[12] & mask2; - glyphBuffer->pixelRows[13] = buffer[13] & mask2; - glyphBuffer->pixelRows[14] = buffer[14] & mask2; - glyphBuffer->pixelRows[15] = buffer[15] & mask2; - } - else - { - glyphBuffer->pixelRows[8] = buffer[16] & mask2; - glyphBuffer->pixelRows[9] = buffer[17] & mask2; - glyphBuffer->pixelRows[10] = buffer[18] & mask2; - glyphBuffer->pixelRows[11] = buffer[19] & mask2; - glyphBuffer->pixelRows[12] = buffer[20] & mask2; - glyphBuffer->pixelRows[13] = buffer[21] & mask2; - glyphBuffer->pixelRows[14] = buffer[22] & mask2; - glyphBuffer->pixelRows[15] = buffer[23] & mask2; - } - } - - sShiftGlyphTileShadowedFuncs[glyphTileInfo->width](glyphBuffer, (u32 *)glyphTileInfo->src, glyphTileInfo->colors, glyphTileInfo->startPixel); - - buffer[0] = glyphBuffer->pixelRows[0]; - buffer[1] = glyphBuffer->pixelRows[1]; - buffer[2] = glyphBuffer->pixelRows[2]; - buffer[3] = glyphBuffer->pixelRows[3]; - buffer[4] = glyphBuffer->pixelRows[4]; - buffer[5] = glyphBuffer->pixelRows[5]; - buffer[6] = glyphBuffer->pixelRows[6]; - buffer[7] = glyphBuffer->pixelRows[7]; - - if (glyphTileInfo->startPixel + glyphTileInfo->width > 8) - { - if (glyphTileInfo->textMode != 2) - buffer += 8; - buffer[8] = glyphBuffer->pixelRows[8]; - buffer[9] = glyphBuffer->pixelRows[9]; - buffer[10] = glyphBuffer->pixelRows[10]; - buffer[11] = glyphBuffer->pixelRows[11]; - buffer[12] = glyphBuffer->pixelRows[12]; - buffer[13] = glyphBuffer->pixelRows[13]; - buffer[14] = glyphBuffer->pixelRows[14]; - buffer[15] = glyphBuffer->pixelRows[15]; - } - - return (glyphTileInfo->startPixel + glyphTileInfo->width) / 8; -} - -static void ShiftGlyphTile_ShadowedFont_Width0(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) -{ -} - -static void ShiftGlyphTile_ShadowedFont_Width1(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - u32 val = colors[src[i] & 0xF]; - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -static void ShiftGlyphTile_ShadowedFont_Width2(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - u32 val = (colors[(src[i] >> 0) & 0xF] << 0) - | (colors[(src[i] >> 4) & 0xF] << 4); - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -static void ShiftGlyphTile_ShadowedFont_Width3(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - u32 val = (colors[(src[i] >> 0) & 0xF] << 0) - | (colors[(src[i] >> 4) & 0xF] << 4) - | (colors[(src[i] >> 8) & 0xF] << 8); - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -static void ShiftGlyphTile_ShadowedFont_Width4(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - u32 val = (colors[(src[i] >> 0) & 0xF] << 0) - | (colors[(src[i] >> 4) & 0xF] << 4) - | (colors[(src[i] >> 8) & 0xF] << 8) - | (colors[(src[i] >> 12) & 0xF] << 12); - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -#define SHIFT_GLYPH_WIDTH5_STEP(i) \ -val = (colors[(src[i] >> 0) & 0xF] << 0) \ - | (colors[(src[i] >> 4) & 0xF] << 4) \ - | (colors[(src[i] >> 8) & 0xF] << 8) \ - | (colors[(src[i] >> 12) & 0xF] << 12) \ - | (colors[(src[i] >> 16) & 0xF] << 16); \ -glyphBuffer->pixelRows[i] |= val << shiftAmount->left; \ -glyphBuffer->pixelRows[i + 8] |= val >> shiftAmount->right; \ - -static void ShiftGlyphTile_ShadowedFont_Width5(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u32 val; - SHIFT_GLYPH_WIDTH5_STEP(0) - SHIFT_GLYPH_WIDTH5_STEP(1) - SHIFT_GLYPH_WIDTH5_STEP(2) - SHIFT_GLYPH_WIDTH5_STEP(3) - SHIFT_GLYPH_WIDTH5_STEP(4) - SHIFT_GLYPH_WIDTH5_STEP(5) - SHIFT_GLYPH_WIDTH5_STEP(6) - SHIFT_GLYPH_WIDTH5_STEP(7) -} - -#define SHIFT_GLYPH_WIDTH6_STEP(i) \ -val = (colors[(src[i] >> 0) & 0xF] << 0) \ - | (colors[(src[i] >> 4) & 0xF] << 4) \ - | (colors[(src[i] >> 8) & 0xF] << 8) \ - | (colors[(src[i] >> 12) & 0xF] << 12) \ - | (colors[(src[i] >> 16) & 0xF] << 16) \ - | (colors[(src[i] >> 20) & 0xF] << 20); \ -glyphBuffer->pixelRows[i] |= val << shiftAmount->left; \ -glyphBuffer->pixelRows[i + 8] |= val >> shiftAmount->right; \ - -static void ShiftGlyphTile_ShadowedFont_Width6(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u32 val; - SHIFT_GLYPH_WIDTH6_STEP(0) - SHIFT_GLYPH_WIDTH6_STEP(1) - SHIFT_GLYPH_WIDTH6_STEP(2) - SHIFT_GLYPH_WIDTH6_STEP(3) - SHIFT_GLYPH_WIDTH6_STEP(4) - SHIFT_GLYPH_WIDTH6_STEP(5) - SHIFT_GLYPH_WIDTH6_STEP(6) - SHIFT_GLYPH_WIDTH6_STEP(7) -} - -#define SHIFT_GLYPH_WIDTH7_STEP(i) \ -val = (colors[(src[i] >> 0) & 0xF] << 0) \ - | (colors[(src[i] >> 4) & 0xF] << 4) \ - | (colors[(src[i] >> 8) & 0xF] << 8) \ - | (colors[(src[i] >> 12) & 0xF] << 12) \ - | (colors[(src[i] >> 16) & 0xF] << 16) \ - | (colors[(src[i] >> 20) & 0xF] << 20) \ - | (colors[(src[i] >> 24) & 0xF] << 24); \ -glyphBuffer->pixelRows[i] |= val << shiftAmount->left; \ -glyphBuffer->pixelRows[i + 8] |= val >> shiftAmount->right; \ - -static void ShiftGlyphTile_ShadowedFont_Width7(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u32 val; - SHIFT_GLYPH_WIDTH7_STEP(0) - SHIFT_GLYPH_WIDTH7_STEP(1) - SHIFT_GLYPH_WIDTH7_STEP(2) - SHIFT_GLYPH_WIDTH7_STEP(3) - SHIFT_GLYPH_WIDTH7_STEP(4) - SHIFT_GLYPH_WIDTH7_STEP(5) - SHIFT_GLYPH_WIDTH7_STEP(6) - SHIFT_GLYPH_WIDTH7_STEP(7) -} - -#define SHIFT_GLYPH_WIDTH8_STEP(i) \ -val = (colors[(src[i] >> 0) & 0xF] << 0) \ - | (colors[(src[i] >> 4) & 0xF] << 4) \ - | (colors[(src[i] >> 8) & 0xF] << 8) \ - | (colors[(src[i] >> 12) & 0xF] << 12) \ - | (colors[(src[i] >> 16) & 0xF] << 16) \ - | (colors[(src[i] >> 20) & 0xF] << 20) \ - | (colors[(src[i] >> 24) & 0xF] << 24) \ - | (colors[(src[i] >> 28) ] << 28); \ -glyphBuffer->pixelRows[i] |= val << shiftAmount->left; \ -glyphBuffer->pixelRows[i + 8] |= val >> shiftAmount->right; \ - -static void ShiftGlyphTile_ShadowedFont_Width8(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u32 val; - SHIFT_GLYPH_WIDTH8_STEP(0) - SHIFT_GLYPH_WIDTH8_STEP(1) - SHIFT_GLYPH_WIDTH8_STEP(2) - SHIFT_GLYPH_WIDTH8_STEP(3) - SHIFT_GLYPH_WIDTH8_STEP(4) - SHIFT_GLYPH_WIDTH8_STEP(5) - SHIFT_GLYPH_WIDTH8_STEP(6) - SHIFT_GLYPH_WIDTH8_STEP(7) -} - -static s32 DrawGlyphTiles(struct Window *win, u32 glyph, u32 glyphWidth) -{ - struct GlyphTileInfo glyphTileInfo; - u8 *upperTile; - u8 *lowerTile; - s32 retVal = 0; - - GetGlyphTilePointers(win->fontNum, win->language, glyph, &upperTile, &lowerTile); - glyphTileInfo.textMode = win->textMode; - glyphTileInfo.startPixel = (win->left + win->cursorX) & 7; - glyphTileInfo.width = glyphWidth; - glyphTileInfo.src = upperTile; - glyphTileInfo.dest = (u32 *)(win->tileData + 32 * GetCursorTileNum(win, 0, 0)); - glyphTileInfo.colors = sGlyphBuffer.colors; - - switch (win->fontNum) - { - case 0: - case 1: - case 2: - case 6: - DrawGlyphTile_UnshadowedFont(&glyphTileInfo); - glyphTileInfo.src = lowerTile; - glyphTileInfo.dest = (u32 *)(win->tileData + 32 * GetCursorTileNum(win, 0, 1)); - retVal = DrawGlyphTile_UnshadowedFont(&glyphTileInfo); - break; - case 3: - case 4: - case 5: - DrawGlyphTile_ShadowedFont(&glyphTileInfo); - glyphTileInfo.src = lowerTile; - glyphTileInfo.dest = (u32 *)(win->tileData + 32 * GetCursorTileNum(win, 0, 1)); - retVal = DrawGlyphTile_ShadowedFont(&glyphTileInfo); - break; - } - - return retVal; -} - -static void UpdateTilemap(struct Window *win, u32 tilesWidth) -{ - u16 *tilemap = GetCursorTilemapPointer(win); - if (tilesWidth && tilemap) - { - u16 paletteNum = (win->paletteNum << 12); - u16 upperLeftTileNum = GetCursorTileNum(win, 0, 0); - u16 lowerLeftTileNum = GetCursorTileNum(win, 0, 1); - tilemap[0] = upperLeftTileNum | paletteNum; - tilemap[32] = lowerLeftTileNum | paletteNum; - if (tilesWidth == 2) - { - u16 upperRightTileNum = GetCursorTileNum(win, 1, 0); - u16 lowerRightTileNum = GetCursorTileNum(win, 1, 1); - tilemap[1] = upperRightTileNum | paletteNum; - tilemap[33] = lowerRightTileNum | paletteNum; - } - } -} - -static u16 GetCursorTileNum(struct Window *win, u32 xOffset, u32 yOffset) -{ - u16 index; - - if (win->textMode == 2) - index = win->tileDataStartOffset - + win->tileDataOffset - + (((win->top + win->cursorY) >> 3) + yOffset) * win->width - + (((win->left + win->cursorX) >> 3) + xOffset); - else - index = win->tileDataStartOffset + win->tileDataOffset + 2 * xOffset + yOffset; - - return index; -} |