summaryrefslogtreecommitdiff
path: root/src/text.c
blob: 69ae21809daf3beeff5bfe20dcb4d8bad0c72d40 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include "global.h"
#include "text.h"
#include "battle.h"
#include "main.h"
#include "palette.h"
#include "string_util.h"

EWRAM_DATA struct TextPrinter gTempTextPrinter;
EWRAM_DATA struct TextPrinter gTextPrinters[NUM_TEXT_PRINTERS];

extern u8 gUnknown_03002F84[];

extern struct FontInfo *gFonts;

u16 AddTextPrinter(struct TextWindow *textWindow, u8 speed, void (*callback)(u16, struct TextWindow *));
void GenerateFontHalfRowLookupTable(u8 fgColor, u8 bgColor, u8 shadowColor);
u32 RenderFont(struct TextPrinter *textPrinter);
void CopyWindowToVram(u8 windowId, u8 mode);

void SetFontsPointer(struct FontInfo *fonts)
{
    gFonts = fonts;
}

void DeactivateAllTextPrinters (void)
{
    int printer;
    for (printer = 0; printer < NUM_TEXT_PRINTERS; ++printer)
        gTextPrinters[printer].sub_union.sub.field_7 = 0;
}

u16 Print(u8 windowId, u8 fontId, u8 *str, u8 x, u8 y, u8 speed, void (*callback)(u16, struct TextWindow *))
{
    struct TextWindow window;

    window.current_text_offset = str;
    window.windowId = windowId;
    window.fontId = fontId;
    window.x = x;
    window.y = y;
    window.currentX = x;
    window.currentY = y;
    window.letterSpacing = gFonts[fontId].letterSpacing;
    window.lineSpacing = gFonts[fontId].lineSpacing;
    window.fontColor_l = gFonts[fontId].fontColor_l;
    window.fontColor_h = gFonts[fontId].fontColor_h;
    window.bgColor = gFonts[fontId].bgColor;
    window.shadowColor = gFonts[fontId].shadowColor;
    return AddTextPrinter(&window, speed, callback);
}

u16 AddTextPrinter(struct TextWindow *textWindow, u8 speed, void (*callback)(u16, struct TextWindow *))
{
    int i;
    u16 j;

    if (!gFonts)
        return FALSE;
    
    gTempTextPrinter.sub_union.sub.field_7 = 1;
    gTempTextPrinter.state = 0;
    gTempTextPrinter.text_speed = speed;
    gTempTextPrinter.delayCounter = 0;
    gTempTextPrinter.scrollDistance = 0;
    
    for (i = 0; i < 7; ++i)
    {
        gTempTextPrinter.sub_union.sub_fields[i] = 0;
    }
    
    gTempTextPrinter.window = *textWindow;
    gTempTextPrinter.callback = callback;
    gTempTextPrinter.minLetterSpacing = 0;
    gTempTextPrinter.japanese = 0;

    GenerateFontHalfRowLookupTable(textWindow->fontColor_h, textWindow->bgColor, textWindow->shadowColor);
    if (speed != 0xFF && speed != 0x0)
    {
        --gTempTextPrinter.text_speed;
        gTextPrinters[textWindow->windowId] = gTempTextPrinter;
    }
    else
    {
        gTempTextPrinter.text_speed = 0;
        for (j = 0; j < 0x400; ++j)
        {
            if (RenderFont(&gTempTextPrinter) == 1)
                break;
        }
        
        if (speed != 0xFF)
          CopyWindowToVram(gTempTextPrinter.window.windowId, 2);
        gTextPrinters[textWindow->windowId].sub_union.sub.field_7 = 0;
    }
    gUnknown_03002F84[0] = 0;
    return TRUE;
}

// struct means TextWindow, no struct means TextPrinter