diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2019-06-13 13:45:46 -0400 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2019-06-13 13:45:46 -0400 |
commit | e30052e271c649ae2ca08cbbbdf2dc2052e6ae38 (patch) | |
tree | 623a7faf2c7bd09070def94a594f841e1d767acd /src/help_system.c | |
parent | 2ffcf13f6bd243cac85dff4e2c29ba4b3ae44aa4 (diff) |
help_system: through sub_813C3AC
Diffstat (limited to 'src/help_system.c')
-rw-r--r-- | src/help_system.c | 578 |
1 files changed, 578 insertions, 0 deletions
diff --git a/src/help_system.c b/src/help_system.c index 08120952f..afa99c358 100644 --- a/src/help_system.c +++ b/src/help_system.c @@ -9,7 +9,12 @@ #include "sound.h" #include "strings.h" #include "text.h" +#include "blit.h" +#include "event_data.h" #include "constants/songs.h" +#include "constants/flags.h" + +extern u8 gGlyphInfo[]; struct DmaController { @@ -51,6 +56,7 @@ void sub_813BF50(u8); void sub_813BC2C(void); void sub_813BC48(void); void sub_813BC5C(void); +void sub_813C3AC(u8, u16, struct Bitmap *, struct Bitmap *, u8 *, u8, u8, u8, u8); void sub_813C454(const u8 * str); void sub_813C5D4(void); @@ -379,3 +385,575 @@ void sub_813BFC0(u8 mode) break; } } + +void sub_813C004(u8 a0, u8 mode) +{ + switch (mode) + { + case 0: + sub_813BC78(0x1FF, 28, 3, 1, 1, 0); + sub_813BC78(0x1FF, 28, 18, 1, 1, 0); + break; + case 1: + if (a0 == 0) + sub_813BC78(0x1FE, 28, 3, 1, 1, 0); + else + sub_813BC78(0x1FD, 28, 18, 1, 1, 0); + break; + } +} + +#define HelpSystemHandleRenderGlyph(character) ({\ + do {sub_813C3AC(font, character, &srcBlit, &destBlit, dest, x, y, width, height);} while (0); font;\ +}) + +#ifdef NONMATCHING +void HelpSystemRenderText(u8 font, u8 * dest, const u8 * src, u8 x, u8 y, u8 width, u8 height) +{ + // font -> sp+24 + // dest -> sp+28 + // src -> r9 + // x -> sp+34 + // y -> r10 + // width -> sp+2C + // height -> sp+30 + struct Bitmap srcBlit; + struct Bitmap destBlit; + u8 i; + u8 orig_x = x; + s32 clearPixels; + + while (1) + { + u16 curChar = *src++; + switch (curChar) + { + case EOS: + return; + case PLACEHOLDER_BEGIN: + curChar = *src++; + if (curChar == 1) { + for (i = 0; i < 10; i++) + { + if (gSaveBlock2Ptr->playerName[i] == EOS) + break; + HelpSystemHandleRenderGlyph(gSaveBlock2Ptr->playerName[i]); + x += gGlyphInfo[0x80]; + } + } + else if (curChar == 2) + { + for (i = 0; ; i++) + { + if (FlagGet(FLAG_SYS_NOT_SOMEONES_PC) == TRUE) + { + if (gUnknown_841CB3C[i] == EOS) + break; + HelpSystemHandleRenderGlyph(gUnknown_841CB3C[i]); + } + else + { + if (gUnknown_841CB41[i] == EOS) + break; + HelpSystemHandleRenderGlyph(gUnknown_841CB41[i]); + } + x += gGlyphInfo[0x80]; + } + } + break; + case CHAR_PROMPT_SCROLL: + case CHAR_PROMPT_CLEAR: + case CHAR_NEWLINE: + x = orig_x; + y += gGlyphInfo[0x81] + 1; + break; + case EXT_CTRL_CODE_BEGIN: + curChar = *src++; + switch (curChar) + { + case 4: + src++; + //fallthrough + case 11: + case 16: + src++; + //fallthrough + case 1: + case 2: + case 3: + case 5: + case 6: + case 8: + case 12: + case 13: + case 14: + src++; + break; + case 19: + clearPixels = *src + orig_x - x; + if (clearPixels > 0) + { + destBlit.pixels = dest; + destBlit.width = width * 8; + destBlit.height = height * 8; + FillBitmapRect4Bit(&destBlit, x, y, clearPixels, GetFontAttribute(font, 1), 0); + x += clearPixels; + } + src++; + break; + case 17: + case 18: + case 20: + src++; + break; + case 7: + case 9: + case 10: + case 15: + case 21: + case 22: + break; + } + break; + case CHAR_KEYPAD_ICON: + curChar = *src++; + srcBlit.pixels = (u8 *)gKeypadIconTiles + 0x20 * GetKeypadIconTileOffset(curChar); + srcBlit.width = 0x80; + srcBlit.height = 0x80; + destBlit.pixels = dest; + destBlit.width = width * 8; + destBlit.height = height * 8; + BlitBitmapRect4Bit(&srcBlit, &destBlit, 0, 0, x, y, GetKeypadIconWidth(curChar), GetKeypadIconHeight(curChar), 0); + x += GetKeypadIconWidth(curChar); + break; + case CHAR_EXTRA_EMOJI: + curChar = 0x100 | *src++; + //fallthrough + default: + if (curChar == CHAR_SPACE) + { + if (font == 0) + x += 5; + else + x += 4; + } + else + { + HelpSystemHandleRenderGlyph(curChar); + x += gGlyphInfo[0x80]; + } + break; + } + } +} +#else +NAKED +void HelpSystemRenderText(u8 font, u8 * dest, const u8 * src, u8 x, u8 y, u8 width, u8 height) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tsub sp, 0x38\n" + "\tstr r1, [sp, 0x28]\n" + "\tmov r9, r2\n" + "\tldr r1, [sp, 0x58]\n" + "\tldr r2, [sp, 0x5C]\n" + "\tldr r4, [sp, 0x60]\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tstr r0, [sp, 0x24]\n" + "\tlsls r3, 24\n" + "\tlsrs r7, r3, 24\n" + "\tlsls r1, 24\n" + "\tlsrs r1, 24\n" + "\tmov r10, r1\n" + "\tlsls r2, 24\n" + "\tlsrs r2, 24\n" + "\tstr r2, [sp, 0x2C]\n" + "\tlsls r4, 24\n" + "\tlsrs r4, 24\n" + "\tstr r4, [sp, 0x30]\n" + "\tstr r7, [sp, 0x34]\n" + "_0813C0AC_masterLoop:\n" + "\tmov r0, r9\n" + "\tldrb r1, [r0]\n" + "\tmovs r2, 0x1\n" + "\tadd r9, r2\n" + "\tadds r0, r1, 0\n" + "\tsubs r0, 0xF8\n" + "\tcmp r0, 0x7\n" + "\tbls _0813C0BE\n" + "\tb _0813C358\n" + "_0813C0BE:\n" + "\tlsls r0, 2\n" + "\tldr r1, _0813C0C8 @ =_0813C0CC\n" + "\tadds r0, r1\n" + "\tldr r0, [r0]\n" + "\tmov pc, r0\n" + "\t.align 2, 0\n" + "_0813C0C8: .4byte _0813C0CC\n" + "\t.align 2, 0\n" + "_0813C0CC:\n" + "\t.4byte _0813C2D4\n" + "\t.4byte _0813C348\n" + "\t.4byte _0813C1E4\n" + "\t.4byte _0813C1E4\n" + "\t.4byte _0813C200\n" + "\t.4byte _0813C0EC\n" + "\t.4byte _0813C1E4\n" + "\t.4byte _0813C39C\n" + "_0813C0EC:\n" + "\tmov r0, r9\n" + "\tldrb r1, [r0]\n" + "\tmovs r2, 0x1\n" + "\tadd r9, r2\n" + "\tcmp r1, 0x1\n" + "\tbne _0813C154\n" + "\tmovs r4, 0\n" + "\tldr r0, _0813C14C @ =gSaveBlock2Ptr\n" + "\tldr r1, [r0]\n" + "\tldrb r1, [r1]\n" + "\tcmp r1, 0xFF\n" + "\tbeq _0813C0AC_masterLoop\n" + "\tldr r5, _0813C150 @ =gGlyphInfo + 0x80\n" + "_0813C106:\n" + "\tldr r0, [r0]\n" + "\tadds r0, r4\n" + "\tldrb r1, [r0]\n" + "\tldr r0, [sp, 0x28]\n" + "\tstr r0, [sp]\n" + "\tstr r7, [sp, 0x4]\n" + "\tmov r2, r10\n" + "\tstr r2, [sp, 0x8]\n" + "\tldr r0, [sp, 0x2C]\n" + "\tstr r0, [sp, 0xC]\n" + "\tldr r2, [sp, 0x30]\n" + "\tstr r2, [sp, 0x10]\n" + "\tldr r0, [sp, 0x24]\n" + "\tadd r2, sp, 0x14\n" + "\tadd r3, sp, 0x1C\n" + "\tbl sub_813C3AC\n" + "\tldr r0, [sp, 0x24]\n" + "\tldrb r0, [r5]\n" + "\tadds r0, r7, r0\n" + "\tlsls r0, 24\n" + "\tlsrs r7, r0, 24\n" + "\tadds r0, r4, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r4, r0, 24\n" + "\tcmp r4, 0x9\n" + "\tbhi _0813C0AC_masterLoop\n" + "\tldr r0, _0813C14C @ =gSaveBlock2Ptr\n" + "\tldr r1, [r0]\n" + "\tadds r1, r4\n" + "\tldrb r1, [r1]\n" + "\tcmp r1, 0xFF\n" + "\tbne _0813C106\n" + "\tb _0813C0AC_masterLoop\n" + "\t.align 2, 0\n" + "_0813C14C: .4byte gSaveBlock2Ptr\n" + "_0813C150: .4byte gGlyphInfo + 0x80\n" + "_0813C154:\n" + "\tcmp r1, 0x2\n" + "\tbne _0813C0AC_masterLoop\n" + "\tmovs r4, 0\n" + "\tldr r5, _0813C160 @ =gGlyphInfo + 0x80\n" + "\tb _0813C1BC\n" + "\t.align 2, 0\n" + "_0813C160: .4byte gGlyphInfo + 0x80\n" + "_0813C164:\n" + "\tldrb r1, [r1]\n" + "\tldr r2, [sp, 0x28]\n" + "\tstr r2, [sp]\n" + "\tstr r7, [sp, 0x4]\n" + "\tmov r0, r10\n" + "\tstr r0, [sp, 0x8]\n" + "\tldr r2, [sp, 0x2C]\n" + "\tstr r2, [sp, 0xC]\n" + "\tldr r0, [sp, 0x30]\n" + "\tstr r0, [sp, 0x10]\n" + "\tldr r0, [sp, 0x24]\n" + "\tadd r2, sp, 0x14\n" + "\tadd r3, sp, 0x1C\n" + "\tbl sub_813C3AC\n" + "\tb _0813C1AC\n" + "_0813C184:\n" + "\tldr r0, _0813C1D8 @ =gUnknown_841CB41\n" + "\tadds r1, r4, r0\n" + "\tldrb r0, [r1]\n" + "\tcmp r0, 0xFF\n" + "\tbeq _0813C0AC_masterLoop\n" + "\tadds r1, r0, 0\n" + "\tldr r2, [sp, 0x28]\n" + "\tstr r2, [sp]\n" + "\tstr r7, [sp, 0x4]\n" + "\tmov r0, r10\n" + "\tstr r0, [sp, 0x8]\n" + "\tldr r2, [sp, 0x2C]\n" + "\tstr r2, [sp, 0xC]\n" + "\tldr r0, [sp, 0x30]\n" + "\tstr r0, [sp, 0x10]\n" + "\tldr r0, [sp, 0x24]\n" + "\tadd r2, sp, 0x14\n" + "\tadd r3, sp, 0x1C\n" + "\tbl sub_813C3AC\n" + "_0813C1AC:\n" + "\tldr r1, [sp, 0x24]\n" + "\tldrb r0, [r5]\n" + "\tadds r0, r7, r0\n" + "\tlsls r0, 24\n" + "\tlsrs r7, r0, 24\n" + "\tadds r0, r4, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r4, r0, 24\n" + "_0813C1BC:\n" + "\tldr r0, _0813C1DC @ =0x00000834\n" + "\tbl FlagGet\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tcmp r0, 0x1\n" + "\tbne _0813C184\n" + "\tldr r0, _0813C1E0 @ =gUnknown_841CB3C\n" + "\tadds r1, r4, r0\n" + "\tldrb r0, [r1]\n" + "\tcmp r0, 0xFF\n" + "\tbne _0813C164\n" + "\tb _0813C0AC_masterLoop\n" + "\t.align 2, 0\n" + "_0813C1D8: .4byte gUnknown_841CB41\n" + "_0813C1DC: .4byte 0x00000834\n" + "_0813C1E0: .4byte gUnknown_841CB3C\n" + "_0813C1E4:\n" + "\tldr r7, [sp, 0x34]\n" + "\tldr r1, _0813C1FC @ =gGlyphInfo\n" + "\tadds r1, 0x81\n" + "\tmov r0, r10\n" + "\tadds r0, 0x1\n" + "\tldrb r1, [r1]\n" + "\tadds r0, r1\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tmov r10, r0\n" + "\tb _0813C0AC_masterLoop\n" + "\t.align 2, 0\n" + "_0813C1FC: .4byte gGlyphInfo\n" + "_0813C200:\n" + "\tmov r2, r9\n" + "\tldrb r1, [r2]\n" + "\tmovs r0, 0x1\n" + "\tadd r9, r0\n" + "\tsubs r0, r1, 0x1\n" + "\tcmp r0, 0x15\n" + "\tbls _0813C210\n" + "\tb _0813C0AC_masterLoop\n" + "_0813C210:\n" + "\tlsls r0, 2\n" + "\tldr r1, _0813C21C @ =_0813C220\n" + "\tadds r0, r1\n" + "\tldr r0, [r0]\n" + "\tmov pc, r0\n" + "\t.align 2, 0\n" + "_0813C21C: .4byte _0813C220\n" + "\t.align 2, 0\n" + "_0813C220:\n" + "\t.4byte _0813C2C8\n" + "\t.4byte _0813C2C8\n" + "\t.4byte _0813C2C8\n" + "\t.4byte _0813C278\n" + "\t.4byte _0813C2C8\n" + "\t.4byte _0813C2C8\n" + "\t.4byte _0813C0AC_masterLoop\n" + "\t.4byte _0813C2C8\n" + "\t.4byte _0813C0AC_masterLoop\n" + "\t.4byte _0813C0AC_masterLoop\n" + "\t.4byte _0813C27C\n" + "\t.4byte _0813C2C8\n" + "\t.4byte _0813C2C8\n" + "\t.4byte _0813C2C8\n" + "\t.4byte _0813C0AC_masterLoop\n" + "\t.4byte _0813C27C\n" + "\t.4byte _0813C2CE\n" + "\t.4byte _0813C2CE\n" + "\t.4byte _0813C282\n" + "\t.4byte _0813C2CE\n" + "\t.4byte _0813C0AC_masterLoop\n" + "\t.4byte _0813C0AC_masterLoop\n" + "_0813C278:\n" + "\tmovs r1, 0x1\n" + "\tadd r9, r1\n" + "_0813C27C:\n" + "\tmovs r2, 0x1\n" + "\tadd r9, r2\n" + "\tb _0813C2C8\n" + "_0813C282:\n" + "\tmov r2, r9\n" + "\tldrb r0, [r2]\n" + "\tldr r1, [sp, 0x34]\n" + "\tadds r0, r1\n" + "\tsubs r6, r0, r7\n" + "\tcmp r6, 0\n" + "\tble _0813C2C8\n" + "\tldr r2, [sp, 0x28]\n" + "\tstr r2, [sp, 0x1C]\n" + "\tldr r1, [sp, 0x2C]\n" + "\tlsls r0, r1, 3\n" + "\tadd r4, sp, 0x1C\n" + "\tmovs r5, 0\n" + "\tstrh r0, [r4, 0x4]\n" + "\tldr r2, [sp, 0x30]\n" + "\tlsls r0, r2, 3\n" + "\tstrh r0, [r4, 0x6]\n" + "\tldr r0, [sp, 0x24]\n" + "\tmovs r1, 0x1\n" + "\tbl GetFontAttribute\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tlsls r3, r6, 16\n" + "\tlsrs r3, 16\n" + "\tstr r0, [sp]\n" + "\tstr r5, [sp, 0x4]\n" + "\tadds r0, r4, 0\n" + "\tadds r1, r7, 0\n" + "\tmov r2, r10\n" + "\tbl FillBitmapRect4Bit\n" + "\tadds r0, r7, r6\n" + "\tlsls r0, 24\n" + "\tlsrs r7, r0, 24\n" + "_0813C2C8:\n" + "\tmovs r0, 0x1\n" + "\tadd r9, r0\n" + "\tb _0813C0AC_masterLoop\n" + "_0813C2CE:\n" + "\tmovs r1, 0x1\n" + "\tadd r9, r1\n" + "\tb _0813C0AC_masterLoop\n" + "_0813C2D4:\n" + "\tmov r2, r9\n" + "\tldrb r1, [r2]\n" + "\tmovs r0, 0x1\n" + "\tadd r9, r0\n" + "\tadds r6, r1, 0\n" + "\tadds r0, r6, 0\n" + "\tbl GetKeypadIconTileOffset\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 19\n" + "\tldr r1, _0813C344 @ =gKeypadIconTiles\n" + "\tadds r0, r1\n" + "\tstr r0, [sp, 0x14]\n" + "\tadd r1, sp, 0x14\n" + "\tmovs r2, 0\n" + "\tmov r8, r2\n" + "\tmovs r0, 0x80\n" + "\tstrh r0, [r1, 0x4]\n" + "\tstrh r0, [r1, 0x6]\n" + "\tldr r0, [sp, 0x28]\n" + "\tstr r0, [sp, 0x1C]\n" + "\tldr r1, [sp, 0x2C]\n" + "\tlsls r0, r1, 3\n" + "\tadd r5, sp, 0x1C\n" + "\tstrh r0, [r5, 0x4]\n" + "\tldr r2, [sp, 0x30]\n" + "\tlsls r0, r2, 3\n" + "\tstrh r0, [r5, 0x6]\n" + "\tadds r0, r6, 0\n" + "\tbl GetKeypadIconWidth\n" + "\tadds r4, r0, 0\n" + "\tlsls r4, 24\n" + "\tlsrs r4, 24\n" + "\tadds r0, r6, 0\n" + "\tbl GetKeypadIconHeight\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tstr r7, [sp]\n" + "\tmov r1, r10\n" + "\tstr r1, [sp, 0x4]\n" + "\tstr r4, [sp, 0x8]\n" + "\tstr r0, [sp, 0xC]\n" + "\tmov r2, r8\n" + "\tstr r2, [sp, 0x10]\n" + "\tadd r0, sp, 0x14\n" + "\tadds r1, r5, 0\n" + "\tmovs r2, 0\n" + "\tmovs r3, 0\n" + "\tbl BlitBitmapRect4Bit\n" + "\tadds r0, r6, 0\n" + "\tbl GetKeypadIconWidth\n" + "\tb _0813C38E\n" + "\t.align 2, 0\n" + "_0813C344: .4byte gKeypadIconTiles\n" + "_0813C348:\n" + "\tmov r0, r9\n" + "\tldrb r1, [r0]\n" + "\tmovs r2, 0x80\n" + "\tlsls r2, 1\n" + "\tadds r0, r2, 0\n" + "\torrs r1, r0\n" + "\tmovs r0, 0x1\n" + "\tadd r9, r0\n" + "_0813C358:\n" + "\tcmp r1, 0\n" + "\tbne _0813C36A\n" + "\tldr r1, [sp, 0x24]\n" + "\tcmp r1, 0\n" + "\tbne _0813C366\n" + "\tadds r0, r7, 0x5\n" + "\tb _0813C390\n" + "_0813C366:\n" + "\tadds r0, r7, 0x4\n" + "\tb _0813C390\n" + "_0813C36A:\n" + "\tadd r3, sp, 0x1C\n" + "\tldr r2, [sp, 0x28]\n" + "\tstr r2, [sp]\n" + "\tstr r7, [sp, 0x4]\n" + "\tmov r0, r10\n" + "\tstr r0, [sp, 0x8]\n" + "\tldr r2, [sp, 0x2C]\n" + "\tstr r2, [sp, 0xC]\n" + "\tldr r0, [sp, 0x30]\n" + "\tstr r0, [sp, 0x10]\n" + "\tldr r0, [sp, 0x24]\n" + "\tadd r2, sp, 0x14\n" + "\tbl sub_813C3AC\n" + "\tldr r1, [sp, 0x24]\n" + "\tldr r0, _0813C398 @ =gGlyphInfo\n" + "\tadds r0, 0x80\n" + "\tldrb r0, [r0]\n" + "_0813C38E:\n" + "\tadds r0, r7, r0\n" + "_0813C390:\n" + "\tlsls r0, 24\n" + "\tlsrs r7, r0, 24\n" + "\tb _0813C0AC_masterLoop\n" + "\t.align 2, 0\n" + "_0813C398: .4byte gGlyphInfo\n" + "_0813C39C:\n" + "\tadd sp, 0x38\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0"); +} +#endif //NONMATCHING + +void sub_813C3AC(u8 font, u16 glyph, struct Bitmap *srcBlit, struct Bitmap *destBlit, u8 *destBuffer, u8 x, u8 y, u8 width, u8 height) +{ + if (font == 0) + DecompressGlyphFont0(glyph, FALSE); + else if (font == 5) + DecompressGlyphFont5(glyph, FALSE); + else + DecompressGlyphFont2(glyph, FALSE); + srcBlit->pixels = gGlyphInfo; + srcBlit->width = 16; + srcBlit->height = 16; + destBlit->pixels = destBuffer; + destBlit->width = width * 8; + destBlit->height = height * 8; + BlitBitmapRect4Bit(srcBlit, destBlit, 0, 0, x, y, gGlyphInfo[0x80], gGlyphInfo[0x81], 0); +} |