diff options
Diffstat (limited to 'src/text.c')
-rw-r--r-- | src/text.c | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/src/text.c b/src/text.c new file mode 100644 index 000000000..69ae21809 --- /dev/null +++ b/src/text.c @@ -0,0 +1,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 |