From 26b89d17fcc06f87324254d89cdd55ecb03f8267 Mon Sep 17 00:00:00 2001 From: The Gears of Progress Date: Tue, 27 Jan 2026 09:29:28 -0500 Subject: [PATCH] Updating font generation --- Makefile | 2 +- building_on_windows.txt | 2 +- font_helper/main.py | 160 --------------- graphics/latin_normal.png | Bin 3077 -> 0 bytes graphics/unused graphics/japanese_normal.png | Bin 9919 -> 0 bytes include/debug_mode.h | 2 +- include/japanese_normal.h | 19 ++ include/japanese_small.h | 21 -- include/latin_normal.h | 15 +- source/japanese_normal.c | 198 ++++++++++++++++++ source/text_engine.cpp | 6 +- text_helper/fonts/japanese_normal.png | Bin 0 -> 2932 bytes text_helper/fonts/latin_normal.png | Bin 0 -> 3080 bytes text_helper/main.py | 203 +++++++++---------- 14 files changed, 323 insertions(+), 305 deletions(-) delete mode 100644 font_helper/main.py delete mode 100644 graphics/latin_normal.png delete mode 100644 graphics/unused graphics/japanese_normal.png create mode 100644 include/japanese_normal.h delete mode 100644 include/japanese_small.h create mode 100644 source/japanese_normal.c create mode 100644 text_helper/fonts/japanese_normal.png create mode 100644 text_helper/fonts/latin_normal.png diff --git a/Makefile b/Makefile index efce3bb..8cf1eca 100644 --- a/Makefile +++ b/Makefile @@ -166,7 +166,7 @@ generate_data: @echo "----------------------------------------------------------------" @echo @tools/payload-generator/payload-generator to_compress - @python3 text_helper/main.py + @python text_helper/main.py @echo "Compressing bin files!" @echo -n "[" @find to_compress -name "*.bin" -print0 | xargs -0 -n1 ./compress_lz10.sh diff --git a/building_on_windows.txt b/building_on_windows.txt index c359334..6d5a432 100644 --- a/building_on_windows.txt +++ b/building_on_windows.txt @@ -19,4 +19,4 @@ break-system-packages = true pacman -S openssl-devel export CMAKE_TLS_VERIFY=0 -pip install pandas requests openpyxl \ No newline at end of file +pip install pandas requests openpyxl pypng \ No newline at end of file diff --git a/font_helper/main.py b/font_helper/main.py deleted file mode 100644 index 8265056..0000000 --- a/font_helper/main.py +++ /dev/null @@ -1,160 +0,0 @@ -import os -import math -from PIL import Image -import numpy as np - -# THIS PROGRAM ASSUMES THAT THE FIRST TWO COLORS IN THE PALETTE ARE THE BACKGROUND AND CELL BACKGROUND! - -dir = os.curdir -BACKGROUND_PAL_INDEX = 0 -CELL_PAL_INDEX = 1 - -class Font: - def __init__(self, fileName, numColors, numChars, numCharsX, numCharsY, cellWidth, cellHeight): - self.fileName = fileName - self.numColors = numColors - self.numChars = numChars - self.numCharsX = numCharsX - self.numCharsY = numCharsY - self.cellWidth = cellWidth - self.cellHeight = cellHeight - - self.bpp = int(math.log(numColors, 2)) + 1 - self.numWords = self.numChars * self.cellWidth * self.cellHeight * self.bpp // (8 * 4) - self.numBytes = self.numWords * 4 - - self.charWordTable = [0] * self.numWords - self.charWidthTable = [0] * self.numBytes - - -def build_h(myFont): - with open(dir + "/include/" + myFont.fileName + ".h", 'w') as f: - f.write(f''' -#ifndef __{myFont.fileName.upper()}__ -#define __{myFont.fileName.upper()}__ - -extern const TFont {myFont.fileName}Font; - -#define {myFont.fileName}GlyphsLen {myFont.numBytes} -extern const unsigned int {myFont.fileName}Glyphs[{myFont.numBytes}]; - -#define {myFont.fileName}WidthsLen {myFont.numChars} -extern const unsigned char {myFont.fileName}Widths[{myFont.numChars}]; - -#endif -''') - f.close() - -def build_c(myFont): - with open(dir + "/source/" + myFont.fileName + ".c", 'w') as f: - f.write(f'''typedef struct TFont -{{ - const void *data; //!< Character data. - const unsigned char *widths; //!< Width table for vwf. - const unsigned char *heights; //!< Height table for vhf. - unsigned short charOffset; //!< Character offset. - unsigned short charnumChars; //!< Character numChars. - unsigned char charW; //!< Character width (fwf). - unsigned char charH; //!< Character height. - unsigned char cellW; //!< Glyph cell width. - unsigned char cellH; //!< Glyph cell height. - unsigned short cellSize; //!< Cell-size (bytes). - unsigned char bpp; //!< Font bitdepth; - unsigned char extra; //!< Padding. Free to use. -}} TFont;\n -''') - - f.write(f'const unsigned int {myFont.fileName}Glyphs[{myFont.numWords}] __attribute__((aligned(4)))=\n{{\n\t') - - for i in range(myFont.numWords): - f.write(f'{myFont.charWordTable[i]:#010x},') - if (i == myFont.numWords - 1): - f.write("\n};\n\n") - elif (i % 64 == 63): - f.write("\n\n\t") - elif (i % 8 == 7): - f.write("\n\t") - - f.write(f'const unsigned char {myFont.fileName}Widths[{myFont.numChars}] __attribute__((aligned(4)))=\n{{\n\t') - - for i in range(myFont.numChars): - f.write(f'{myFont.charWidthTable[i]:#04x}, ') - if (i == myFont.numChars - 1): - f.write("\n};\n\n") - elif (i % 128 == 127): - f.write("\n\n\t") - elif (i % 16 == 15): - f.write("\n\t") - - f.write(f'''const TFont {myFont.fileName}Font= -{{ - {myFont.fileName}Glyphs, - {myFont.fileName}Widths, - 0, // All heights are the same - 0, // Character offset, is set to zero - {myFont.numChars}, - {myFont.cellWidth}, {myFont.cellHeight}, - {myFont.cellWidth}, {myFont.cellHeight}, - {myFont.numBytes // myFont.numChars}, - {myFont.bpp}, - 0, // Padding, left blank -}}; - ''') - - f.close() - -def generate_tables(myFont): - img = Image.open(f'{dir}/graphics/{myFont.fileName}.png') - if (img.mode != "P"): - print("Error: Image file does not contain a palette") - exit() - pixels = img.load() - - bitsPerWord = 32 - pixelsPerTileX = 8 - pixelsPerTileY = 8 - tilesPerCharX = myFont.cellWidth // pixelsPerTileX - tilesPerCharY = myFont.cellHeight // pixelsPerTileY - charsPerChartX = myFont.numCharsX - charsPerChartY = myFont.numCharsY - - globalX = 0 - globalY = 0 - bitTotal = 0 - - for charY in range(charsPerChartY): - for charX in range(charsPerChartX): - for tileY in range(tilesPerCharY): - for tileX in range(tilesPerCharX): - for pixelY in range(pixelsPerTileY): - for pixelX in range(pixelsPerTileX): - - arrayIndex = bitTotal // bitsPerWord - bitIndex = bitTotal % bitsPerWord - - globalX = pixelX + (tileX * pixelsPerTileX) + (charX * tilesPerCharX * pixelsPerTileX) - globalY = pixelY + (tileY * pixelsPerTileY) + (charY * tilesPerCharY * pixelsPerTileY) - - val = (pixels[globalX, globalY] - 2) & ((1 << myFont.bpp) - 1) - myFont.charWordTable[arrayIndex] |= val << bitIndex - - #print(f'globalX: {globalX}, globalY: {globalY}, arrayIndex:{arrayIndex}, bitIndex:{bitIndex}, val:{val}') - bitTotal += myFont.bpp - - #print(f'{charX, charY}') - - myFont.charWidthTable[(charY * charsPerChartX) + charX] = (tilesPerCharX * pixelsPerTileX) - for x in range(tilesPerCharX * pixelsPerTileX): - globalX = x + (charX * tilesPerCharX * pixelsPerTileX) - globalY = 0 + (charY * tilesPerCharY * pixelsPerTileY) - #print(f'x: {globalX}, y: {globalY}') - if (pixels[globalX, globalY] == BACKGROUND_PAL_INDEX): - myFont.charWidthTable[(charY * charsPerChartX) + charX] = x - break - -# Main: -latin_normal = Font("latin_normal", 1, 256, 16, 16, 16, 16) -generate_tables(latin_normal) -build_h(latin_normal) -build_c(latin_normal) - diff --git a/graphics/latin_normal.png b/graphics/latin_normal.png deleted file mode 100644 index e3f323b60e9cc91492d554866bb17aaee0fb6eee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3077 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 GiTy7;R7W@f diff --git a/include/debug_mode.h b/include/debug_mode.h index eedf682..045cb88 100644 --- a/include/debug_mode.h +++ b/include/debug_mode.h @@ -2,7 +2,7 @@ #define DEBUG_MODE_H #define VERSION "v1.2.1" -#define PTGB_BUILD_LANGUAGE 2 +#define PTGB_BUILD_LANGUAGE 1 #define DEBUG_MODE true diff --git a/include/japanese_normal.h b/include/japanese_normal.h new file mode 100644 index 0000000..f621375 --- /dev/null +++ b/include/japanese_normal.h @@ -0,0 +1,19 @@ +#include "debug_mode.h" +#include "pokemon_data.h" + +#if PTGB_BUILD_LANGUAGE == 1 + +#ifndef __JAPANESE_NORMAL__ +#define __JAPANESE_NORMAL__ + +extern const TFont japanese_normalFont; + +#define japanese_normalGlyphsLen 4096 +extern const unsigned int japanese_normalGlyphs[4096]; + +#define japanese_normalWidthsLen 256 +extern const unsigned char japanese_normalWidths[256]; + +#endif + +#endif diff --git a/include/japanese_small.h b/include/japanese_small.h deleted file mode 100644 index 5529479..0000000 --- a/include/japanese_small.h +++ /dev/null @@ -1,21 +0,0 @@ -#include "debug_mode.h" -#include "pokemon_data.h" - -#if PTGB_BUILD_LANGUAGE == JPN_ID - -//{{BLOCK(japanese_small) - -#ifndef __JAPANESE_SMALL__ -#define __JAPANESE_SMALL__ - -extern const TFont japanese_smallFont; - -#define japanese_smallGlyphsLen 4096 -extern const unsigned int japanese_smallGlyphs[1024]; -#define BUILD_FONT &japanese_smallFont - -#endif // __JAPANESE_SMALL__ - -//}}BLOCK(japanese_small) - -#endif \ No newline at end of file diff --git a/include/latin_normal.h b/include/latin_normal.h index c6bdd7a..a9601b4 100644 --- a/include/latin_normal.h +++ b/include/latin_normal.h @@ -1,14 +1,19 @@ +#include "debug_mode.h" +#include "pokemon_data.h" -//{{BLOCK(latin_normal) +#if PTGB_BUILD_LANGUAGE != 1 #ifndef __LATIN_NORMAL__ #define __LATIN_NORMAL__ extern const TFont latin_normalFont; -#define latin_normalGlyphsLen 4096 -extern const unsigned int latin_normalGlyphs[1024]; +#define latin_normalGlyphsLen 8192 +extern const unsigned int latin_normalGlyphs[8192]; -#endif // __LATIN_NORMAL__ +#define latin_normalWidthsLen 256 +extern const unsigned char latin_normalWidths[256]; -//}}BLOCK(latin_normal) +#endif + +#endif diff --git a/source/japanese_normal.c b/source/japanese_normal.c new file mode 100644 index 0000000..4c7bb2e --- /dev/null +++ b/source/japanese_normal.c @@ -0,0 +1,198 @@ +typedef struct TFont +{ + const void *data; //!< Character data. + const unsigned char *widths; //!< Width table for vwf. + const unsigned char *heights; //!< Height table for vhf. + unsigned short charOffset; //!< Character offset. + unsigned short charnumChars; //!< Character numChars. + unsigned char charW; //!< Character width (fwf). + unsigned char charH; //!< Character height. + unsigned char cellW; //!< Glyph cell width. + unsigned char cellH; //!< Glyph cell height. + unsigned short cellSize; //!< Cell-size (bytes). + unsigned char bpp; //!< Font bitdepth; + unsigned char extra; //!< Padding. Free to use. +} TFont; + +const unsigned int japanese_normalGlyphs[1024] __attribute__((aligned(4)))= +{ + 0x00000000,0x00000000,0x00000000,0x00000000,0x04000000,0x3e24043f,0x264d5565,0x00000000, + 0x00000000,0x41412101,0x06094141,0x00000000,0x1c000000,0x40413e00,0x1c204040,0x00000000, + 0x0e000000,0x10103f00,0x61120c08,0x00000000,0x24000000,0x3e04445f,0x36454545,0x00000000, + 0x22000000,0x22225f42,0x18212122,0x00000000,0x08000000,0x207e103e,0x3c020240,0x00000000, + 0x20000000,0x02040810,0x20100804,0x00000000,0x20000000,0x21217d21,0x12212121,0x00000000, + 0x00000000,0x0000201e,0x3c020000,0x00000000,0x10000000,0x20207e10,0x3c020240,0x00000000, + 0x02000000,0x02020202,0x38440202,0x00000000,0x20000000,0x2438207f,0x18203824,0x00000000, + 0x22000000,0x22227f22,0x3c020222,0x00000000,0x3e000000,0x087f0810,0x38040404,0x00000000, + + 0x02000000,0x017a023f,0x79050101,0x00000000,0x02000000,0x3a02023f,0x1c204046,0x00000000, + 0x00000000,0x40201f00,0x1c204040,0x00000000,0x3f000000,0x02040810,0x38040202,0x00000000, + 0x02000000,0x020e3202,0x3e010101,0x00000000,0x02000000,0x2102422f,0x18246439,0x00000000, + 0x00000000,0x01014139,0x72090101,0x00000000,0x12000000,0x4d563e12,0x32555569,0x00000000, + 0x02000000,0x42463a07,0x324a4a73,0x00000000,0x00000000,0x49494a3c,0x26494949,0x00000000, + 0x21000000,0x2121217d,0x19256539,0x00000000,0x07000000,0x21611202,0x0c122121,0x00000000, + 0x1e000000,0x08040808,0x0c515252,0x00000000,0x00000000,0x11120a04,0x40402021,0x00000000, + 0x7d000000,0x21217d21,0x19256539,0x00000000,0x08000000,0x083f083f,0x0629190e,0x00000000, + + 0x0e000000,0x3e282808,0x10262969,0x00000000,0x04000000,0x4624041f,0x38464505,0x00000000, + 0x12000000,0x55563e12,0x264d4d55,0x00000000,0x04000000,0x3e04043e,0x38440404,0x00000000, + 0x12000000,0x42573a12,0x04042442,0x00000000,0x10000000,0x5151533d,0x08103c51,0x00000000, + 0x10000000,0x10107010,0x0e51311e,0x00000000,0x18000000,0x463a0222,0x1c204040,0x00000000, + 0x42000000,0x44424242,0x18204040,0x00000000,0x3e000000,0x221c0810,0x3c524c41,0x00000000, + 0x02000000,0x22261a07,0x42222223,0x00000000,0x3e000000,0x221c0810,0x1c204041,0x00000000, + 0x02000000,0x42463a07,0x32424243,0x00000000,0x08000000,0x196e043f,0x7c020214,0x00000000, + 0x04000000,0x06020204,0x3149494a,0x00000000,0x00000000,0x083e0800,0x2c5a6a3c,0x00000000, + + 0x00000000,0x21110000,0x06012121,0x00000000,0x00000000,0x1c001c00,0x0c102022,0x00000000, + 0x00000000,0x1f000e00,0x310a0408,0x00000000,0x00000000,0x445f2400,0x1625251e,0x00000000, + 0x00000000,0x2a1f1200,0x0212222a,0x00000000,0x00000000,0x2b1d0800,0x04182929,0x00000000, + 0x00000000,0x08380800,0x0629190e,0x00000000,0x52500000,0x22225f22,0x18212122,0x00000000, + 0x54500000,0x107f083f,0x1e010120,0x00000000,0x20000000,0x52540810,0x20100804,0x00000000, + 0x50500000,0x21217d21,0x12212121,0x00000000,0x50500000,0x0000300e,0x3c020000,0x00000000, + 0x58500000,0x10103f08,0x1e010120,0x00000000,0x52000000,0x02020252,0x38440202,0x00000000, + 0x50500000,0x2438207f,0x18203824,0x00000000,0x52500000,0x22227f22,0x3c020222,0x00000000, + + 0x5e500000,0x087f0810,0x38040404,0x00000000,0x52500000,0x017a023f,0x79050101,0x00000000, + 0x52500000,0x3a02023f,0x1c204046,0x00000000,0x50500000,0x40201f00,0x1c204040,0x00000000, + 0x3f000000,0x52540810,0x38040202,0x00000000,0x52500000,0x020e3202,0x3e010101,0x00000000, + 0x51500000,0x21217d21,0x19256539,0x00000000,0x57500000,0x21611202,0x0c122121,0x00000000, + 0x5e500000,0x08040808,0x0c515252,0x00000000,0x50000000,0x11120a54,0x40402021,0x00000000, + 0x51500000,0x217d217d,0x19256539,0x00000000,0x51200000,0x21217d21,0x19256539,0x00000000, + 0xa7400000,0x21611242,0x0c122121,0x00000000,0xae400000,0x08040850,0x0c515252,0x00000000, + 0x40000000,0x11124aa4,0x40402021,0x00000000,0xa1400000,0x217d215d,0x19256539,0x00000000, + + 0x00000000,0x1e000000,0x0c102020,0x00000000,0x00000000,0x4840407f,0x04080828,0x00000000, + 0x20000000,0x17181020,0x10101010,0x00000000,0x08000000,0x41417f08,0x18204040,0x00000000, + 0x00000000,0x0808083e,0x7f080808,0x00000000,0x20000000,0x30307f20,0x20232428,0x00000000, + 0x04000000,0x44447f04,0x30424444,0x00000000,0x08000000,0x08087f08,0x0808087f,0x00000000, + 0x02000000,0x2222223e,0x0c102020,0x00000000,0x02000000,0x21227e02,0x0c102020,0x00000000, + 0x00000000,0x2020203e,0x3e202020,0x00000000,0x22000000,0x22227f22,0x0c102020,0x00000000, + 0x00000000,0x20272007,0x0f102020,0x00000000,0x00000000,0x1020203e,0x43442810,0x00000000, + 0x02000000,0x22223f02,0x3c020212,0x00000000,0x00000000,0x40444242,0x0c102020,0x00000000, + + 0x02000000,0x7946427e,0x1c204040,0x00000000,0x20000000,0x7f10101e,0x0c101010,0x00000000, + 0x00000000,0x40494949,0x1c204040,0x00000000,0x3e000000,0x107f0000,0x04081010,0x00000000, + 0x02000000,0x0e020202,0x02020232,0x00000000,0x10000000,0x10107f10,0x06081010,0x00000000, + 0x00000000,0x0000003e,0x007f0000,0x00000000,0x00000000,0x2620203f,0x47281018,0x00000000, + 0x08000000,0x1820407f,0x0808482f,0x00000000,0x00000000,0x20202020,0x030c1010,0x00000000, + 0x00000000,0x22222202,0x41414242,0x00000000,0x01000000,0x013f0101,0x3e010101,0x00000000, + 0x00000000,0x2020203f,0x06081010,0x00000000,0x00000000,0x11120a04,0x40402021,0x00000000, + 0x08000000,0x2a087f08,0x0849492a,0x00000000,0x00000000,0x2240407f,0x20100814,0x00000000, + + 0x0e000000,0x300e0030,0x38060000,0x00000000,0x08000000,0x24040408,0x7f414222,0x00000000, + 0x20000000,0x30282620,0x07485020,0x00000000,0x00000000,0x3f04043f,0x78040404,0x00000000, + 0x04000000,0x44447f04,0x04040424,0x00000000,0x00000000,0x1010101e,0x7f101010,0x00000000, + 0x00000000,0x3e20203f,0x3f202020,0x00000000,0x1e000000,0x203f0000,0x0c102020,0x00000000, + 0x22000000,0x22222222,0x18202020,0x00000000,0x0a000000,0x0a0a0a0a,0x19294a4a,0x00000000, + 0x02000000,0x02020202,0x0e122202,0x00000000,0x00000000,0x2121213f,0x3f212121,0x00000000, + 0x00000000,0x4041417f,0x18204040,0x00000000,0x00000000,0x3e20203f,0x0e102020,0x00000000, + 0x00000000,0x40404403,0x0f102040,0x00000000,0x00000000,0x203f0000,0x02040414,0x00000000, + + 0x00000000,0x20200000,0x10101618,0x00000000,0x00000000,0x3e080000,0x0c102022,0x00000000, + 0x00000000,0x3e000000,0x3e080808,0x00000000,0x00000000,0x3e100000,0x18121418,0x00000000, + 0x00000000,0x3f040000,0x04041424,0x00000000,0x00000000,0x1c000000,0x3e101010,0x00000000, + 0x00000000,0x3e000000,0x3e203c20,0x00000000,0x54500000,0x44447f04,0x30424444,0x00000000, + 0x58500000,0x08087f08,0x0808087f,0x00000000,0x52500000,0x2222223e,0x0c102020,0x00000000, + 0x52500000,0x21227e02,0x0c102020,0x00000000,0x50500000,0x2020203e,0x3e202020,0x00000000, + 0x52500000,0x22227f22,0x0c102020,0x00000000,0x50500000,0x20270007,0x0f102020,0x00000000, + 0x50500000,0x1020203e,0x43442810,0x00000000,0x2a280000,0x22223f02,0x3c020212,0x00000000, + + 0x50500000,0x20222101,0x06081010,0x00000000,0x52500000,0x7946423e,0x1c204040,0x00000000, + 0x28280000,0x7f10101e,0x0c101010,0x00000000,0x50500000,0x40494909,0x1c204040,0x00000000, + 0x5e500000,0x107f0000,0x04081010,0x00000000,0x52500000,0x0e020202,0x02020232,0x00000000, + 0x50500000,0x22222200,0x41414242,0x00000000,0x51500000,0x013f0101,0x3e010101,0x00000000, + 0x50500000,0x2020203f,0x06081010,0x00000000,0x50000000,0x11120a54,0x40402021,0x00000000, + 0x58500000,0x2a087f08,0x0849492a,0x00000000,0xa0400000,0x22222240,0x41414242,0x00000000, + 0xa1400000,0x013f0141,0x3e010101,0x00000000,0xa0400000,0x2020205f,0x06081010,0x00000000, + 0xa0400000,0x11120a44,0x40402021,0x00000000,0xa8400000,0x2a083f48,0x0849492a,0x00000000, + + 0x00000000,0x0a000000,0x1820202a,0x00000000,0x1c000000,0x22222222,0x1c222222,0x00000000, + 0x08000000,0x0808080c,0x1c080808,0x00000000,0x1c000000,0x10202222,0x3e020408,0x00000000, + 0x1c000000,0x18202222,0x1c222220,0x00000000,0x18000000,0x12121414,0x10103e12,0x00000000, + 0x3e000000,0x1e020202,0x1c222020,0x00000000,0x1c000000,0x1e020222,0x1c222222,0x00000000, + 0x3e000000,0x10202020,0x08080810,0x00000000,0x1c000000,0x1c222222,0x1c222222,0x00000000, + 0x1c000000,0x3c222222,0x1c222020,0x00000000,0x18000000,0x183c3c3c,0x18000018,0x00000000, + 0x3c000000,0x18306666,0x18000018,0x00000000,0x00000000,0x00000000,0x06090906,0x00000000, + 0x00000000,0x3e000000,0x00000000,0x00000000,0x00000000,0x0c000000,0x0000000c,0x00000000, + + 0x00000000,0x22000000,0x00000000,0x00000000,0x427e0000,0x0e0a0a7a,0x00000000,0x00000000, + 0x00000000,0x38000000,0x212f2828,0x0000003f,0x023e0000,0x00020202,0x00000000,0x00000000, + 0x00000000,0x00000000,0x10101010,0x0000001f,0x08000000,0x1c082a1c,0x1c222222,0x00000000, + 0x1c000000,0x1c222222,0x08083e08,0x00000000,0x00000000,0x49497f00,0x6141417f,0x00000000, + 0x00000000,0x00000000,0x06060000,0x00000000,0x00000000,0x22000000,0x22140814,0x00000000, + 0x20200000,0x08081010,0x02020404,0x00000000,0x1c000000,0x22222222,0x2222223e,0x00000000, + 0x1e000000,0x1e222222,0x1e222222,0x00000000,0x1c000000,0x02022222,0x1c222202,0x00000000, + 0x1e000000,0x22222222,0x1e222222,0x00000000,0x3e000000,0x3e020202,0x3e020202,0x00000000, + + 0x3e000000,0x1e020202,0x02020202,0x00000000,0x1c000000,0x02022222,0x1c222232,0x00000000, + 0x22000000,0x3e222222,0x22222222,0x00000000,0x1c000000,0x08080808,0x1c080808,0x00000000, + 0x20000000,0x20202020,0x1c222222,0x00000000,0x22000000,0x060a1222,0x2222120a,0x00000000, + 0x02000000,0x02020202,0x3e020202,0x00000000,0x41000000,0x55636341,0x41494955,0x00000000, + 0x22000000,0x2a262622,0x2232322a,0x00000000,0x1c000000,0x22222222,0x1c222222,0x00000000, + 0x1e000000,0x1e222222,0x02020202,0x00000000,0x1c000000,0x22222222,0x5c263a22,0x00000000, + 0x1e000000,0x1e222222,0x22222212,0x00000000,0x1c000000,0x1c022222,0x1c222220,0x00000000, + 0x3e000000,0x08080808,0x08080808,0x00000000,0x22000000,0x22222222,0x1c222222,0x00000000, + + 0x22000000,0x14222222,0x08081414,0x00000000,0x41000000,0x55554949,0x41416363,0x00000000, + 0x22000000,0x08141422,0x22221414,0x00000000,0x22000000,0x14142222,0x08080808,0x00000000, + 0x3e000000,0x08101020,0x3e020404,0x00000000,0x00000000,0x20201c00,0x3c22223c,0x00000000, + 0x00000000,0x02020202,0x1e22221e,0x00000000,0x00000000,0x02221c00,0x1c220202,0x00000000, + 0x00000000,0x20202020,0x3c22223c,0x00000000,0x00000000,0x221c0000,0x1c22023e,0x00000000, + 0x00000000,0x04040418,0x0404041e,0x00000000,0x00000000,0x22223c00,0x1c22203c,0x00000000, + 0x00000000,0x1e020202,0x22222222,0x00000000,0x00000000,0x00080800,0x08080808,0x00000000, + 0x00000000,0x10001010,0x0c121210,0x00000000,0x02000000,0x0a122202,0x22120a06,0x00000000, + + 0x00000000,0x0808080c,0x08080808,0x00000000,0x00000000,0x49493f00,0x49494949,0x00000000, + 0x00000000,0x22221e00,0x22222222,0x00000000,0x00000000,0x22221c00,0x1c222222,0x00000000, + 0x00000000,0x22221e00,0x0202021e,0x00000000,0x00000000,0x22223c00,0x2020203c,0x00000000, + 0x00000000,0x0c340400,0x04040404,0x00000000,0x00000000,0x02221c00,0x1c22201c,0x00000000, + 0x00000000,0x041e0404,0x18040404,0x00000000,0x00000000,0x22222200,0x3c222222,0x00000000, + 0x00000000,0x22222200,0x08081414,0x00000000,0x00000000,0x49414100,0x22365549,0x00000000, + 0x00000000,0x14224100,0x41221408,0x00000000,0x00000000,0x22222200,0x1c20203c,0x00000000, + 0x00000000,0x20407e00,0x7e040810,0x00000000,0x06000000,0x3e3e1e0e,0x00060e1e,0x00000000, + + 0x00000000,0x00000c0c,0x000c0c00,0x00000000,0x00120000,0x2222221c,0x2222223e,0x00000000, + 0x00120000,0x2222221c,0x1c222222,0x00000000,0x00120000,0x22222222,0x1c222222,0x00000000, + 0x00120000,0x20201c00,0x3c22223c,0x00000000,0x00120000,0x22221c00,0x1c222222,0x00000000, + 0x00120000,0x22222200,0x3c222222,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, + 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, + 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, + 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, + 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +}; + +const unsigned char japanese_normalWidths[256] __attribute__((aligned(4)))= +{ + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +}; + +const TFont japanese_normalFont= +{ + japanese_normalGlyphs, + japanese_normalWidths, + 0, // All heights are the same + 0, // Character offset, is set to zero + 256, + 8, 16, + 8, 16, + 16, + 1, + 0, // Padding, left blank +}; + \ No newline at end of file diff --git a/source/text_engine.cpp b/source/text_engine.cpp index 01fd39f..088db00 100644 --- a/source/text_engine.cpp +++ b/source/text_engine.cpp @@ -8,9 +8,8 @@ #include "debug_mode.h" #include "button_menu.h" #include "sprite_data.h" -//#include "latin_short.h" #include "latin_normal.h" -#include "japanese_small.h" +#include "japanese_normal.h" #include "text_data_table.h" #include "background_engine.h" @@ -74,8 +73,7 @@ void init_text_engine() 0, // Paper 0), // Special CLR_WHITE, // White text - //&latin_shortFont, // Custom font - &latin_normalFont, // Custom font + &japanese_normalFont, // Custom font NULL // Use default chr4 renderer ); tte_init_con(); diff --git a/text_helper/fonts/japanese_normal.png b/text_helper/fonts/japanese_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..68747f397f8c4812272b3b44e3c0680ad4336f03 GIT binary patch literal 2932 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 J_x>y~?!P}LRZ;)| literal 0 HcmV?d00001 diff --git a/text_helper/fonts/latin_normal.png b/text_helper/fonts/latin_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..bbb026197e8e7766f4e43299248db75d646d2d4b GIT binary patch literal 3080 zcmbtW`9IYA9{zl1hB1Sg8e3s(r%X~3M+{= zBcTGK>6q<~fv|}C{&t6mWm@$f0dCl!Mr*~k7rc2@aKVY1>hzx54Y^ABR6*pEUzu?F zO4ynf&AEVj3Ujk0X6QmSv?!|f4({u1J?)s%DGces)5nFWr8vc~9qBzfBbRk**d=AK z#Vsw^2*Up{zZ8JH*n#pGm*0)0o(S{}Qf_+%oVQL*>X%E+dL2mi>YdBzG@$+QfFVH3 zhYs6YT%$~}0tQQCq$z-cH=F$h_iVGGwqW(>U=Z-ZFwkugmBivP@ItRRP@yQI+}bb+4R$DFsLs*jJR1i?U64MxG$3U2FSq!}Az ztzr{dg?~DGr%=foD$>cejxd$y*h>{2=VE9#GMusGpuI(0*0sGAU=cwp4FtnZWq;rX zb^tfQghb&iU+Ei`+TsIh9qwc`m$eT-{+d9VHY5z1zXro6&mrtfOZ7-iN}WW1J=RP^ z00z{}fmOk^+bQbe=(|QQZ6^a;c>1B)OPn!o%-C{hbxGL2Hf%4w+L)7!`s}4aHC)r( zsl~(zf&-!;kV*hJR-x;Q$q+FxN?6hMGVmMe^cAFQ=fKnxL;}~pp;r(d=ssW2?ebj$ z!m(7NP?N7hVatt<2H|q;Q67N`0T>3vS&>$F-wW*JTJC?fB-{xQ>Z;m@Wf4Ea%p8zhv5s{3KJ&3j#Yl-3G)H9KtbwbtJ@4=+<=2wp%`|}v$Nb?e0 z0dxp9C+~^VkHGrELee}00F1^1+;j;b-?m-|)yDWCIayV^m(G9fw5x-8K^<#^j_|l> z(_}hRiuNqP5X5u<4|7kEd+#PdX7CPsF%WQM)%_a$;GC7^o&3ZHJa733jgSqUvouMQEnm@8=yjckB)>V%HaekIr=C`JiRto9jid~+@?%yYN`ZW;mgT?y$Hmlt4- z0C&CYd0i%<8#5~L=S4)MAZwLh+)|9pY>Uku=TD3!Xw$6jt@=(ThTp#?0m#D7Kgs z8JzhUuR=KM9=wlSY4G*h*6XzBx)O-f4=vO>H;z-w)@tU4ZoP?FQ3o3{^@Q&~e#FNE z?*acBV}z6Ti81uKM0Yp0nSx6<_!+lgspIcIw?I;$XbQ0qD+O=1X#Y;Box6N$Of2z3 z>F=cQsMVSAQQn-`jfKFY2B`w{((~!#`9Um<(Og#5PlcNVAPqt-zXKoqf}a2fuXyEw zQ;5qHR3sJEe*B%#5Eiqn1p6ZD`lPc^)AwL)>#~Gi*7KJc1rhsc+b@QOivfR?s&i8&*|r@Z1i6b+Yt^5~Z`MBmFf=!-i`|>lrn(&Tqnes)pRVnKmj~M&(K(FU zkp{#_DN^vk>1RcE-D-<_OYia(K!Q$Xte>l&Z@lsla#7l!d-9TEYZv(_L`YA9a;ETy zNIfr4W_q8xWL^~`_7Yg5mP!ov6P}wj3`QTO@p|5_q4M^}nF(j4teD?jh*_2eXp$R@ zF4Gm?=mX)VW7hZinAyv_O@$Y2>U)6j*u|$ zvPu}eC>Igb(oyxg_cD z40kAu>Iy}vtlT<$c0JrAC~PEo(Pcdkn*+DaO2dGv_jtXRvEJ%Fk3M^puB8;X?D0{m$85Lv>X! zg}rx-ym07*-6ncuLS2UO&3Mnm1Ts}fgOE;1x_?V%%O^QmSxE(cu>NaTl_M5hoiMxA zB|^)8Ak>wA`&V|rpOwvGo(`aVCEMfV-%ED_?66FV80+a zgOg_bOX>24IeIUXERjZ()YgSJ`)wzA4}8`WP+91ihOv)fN@-k=#_-eXm^e3bNN&9j z@|G?ceA=gx6ejesDIILWo-1Ha2N=|D8GE?X!ou0gkGBm72Na=S`l7^7mk*7C|GwM1fbUA_dKE76~&#*=R@)t$0T zT-*+E{*9|PVh=5frL5?Vu-QowQe2TA#a5Y1#Oc;+zX?h|nkP7HC${^Bb}z+#o0PZw iO1Da>+`zwd+rS=#nV|80xS{{lcykjQ;}Ros^uGZOb$fgO literal 0 HcmV?d00001 diff --git a/text_helper/main.py b/text_helper/main.py index 8d1481f..0fc3613 100755 --- a/text_helper/main.py +++ b/text_helper/main.py @@ -8,8 +8,8 @@ import sys from pathlib import Path import hashlib import math -from PIL import Image import numpy as np +import png class Languages(Enum): Japanese = 0 @@ -31,87 +31,6 @@ new_file_path = BASE_DIR / 'new_text.xlsx' old_file_path = BASE_DIR / 'text.xlsx' json_file_path = BASE_DIR / 'output.json' -mainDict = {} -textSections = [] -charArrays = { - "International": [0] * 0x100, - "Japanese": [0] * 0x100, -} -charArrayOfLanguage = { - Languages.Japanese: charArrays["Japanese"], - Languages.English: charArrays["International"], - Languages.French: charArrays["International"], - Languages.German: charArrays["International"], - Languages.Italian: charArrays["International"], - Languages.SpanishEU: charArrays["International"], - Languages.SpanishLA: charArrays["International"], -} - -jpnCharWidthArray = [ - 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, -0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, -0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, -0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, -0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, -0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, -0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, -0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, -0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, -0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, -0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, -0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, -0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, -0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, -0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, -0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0x0, 0x0, ] - -engCharWidthArray = [ - 0x4, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x0, 0x6, 0x6, 0x6, 0x6, 0x6, -0x8, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x0, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x0, -0x6, 0x6, 0x6, 0x6, 0x6, 0x8, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x9, 0x6, 0x6, 0x0, -0x0, 0x0, 0x0, 0x0, 0xA, 0x8, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, -0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, -0x6, 0x6, 0x4, 0x8, 0x8, 0x8, 0x7, 0x8, 0x8, 0x4, 0x6, 0x6, 0x4, 0x4, 0x0, 0x0, -0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, -0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x7, 0x7, 0x7, 0x2, 0x3, 0x4, -0x5, 0x5, 0x6, 0x7, 0x5, 0x6, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, -0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, -0x8, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x4, 0x6, 0x3, 0x6, 0x3, -0x6, 0x6, 0x6, 0x3, 0x3, 0x6, 0x6, 0x6, 0x3, 0x7, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, -0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, -0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x4, 0x5, 0x6, -0x4, 0x6, 0x6, 0x6, 0x6, 0x6, 0x5, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x8, -0x3, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, ] - -charConversionList = [ - # replaces the first char in the list with the latter - ["'", "’"], -] - -jpnEscapeCharConversionList = [ - ["{SCL}", [0xFA]], - ["{CLR}", [0xFB]], - ["{DEF}", [0xFC, 0x06, 0x02]], - ["{FEM}", [0xFC, 0x06, 0x03]], # ??? - ["{MLE}", [0xFC, 0x06, 0x04]], - ["{FPC}", [0xFC, 0x06, 0x05]], - ["{PLR}", [0xFD, 0x01]], - ["{NEW}", [0xFE]], - ["{END}", [0xFF]], -] - -itlEscapeCharConversionList = [ - ["{SCL}", [0xFA]], - ["{CLR}", [0xFB]], - ["{DEF}", [0xFC, 0x01, 0x02]], - ["{FEM}", [0xFC, 0x01, 0x04]], - ["{FPC}", [0xFC, 0x01, 0x06]], - ["{MLE}", [0xFC, 0x01, 0x08]], - ["{PLR}", [0xFD, 0x01]], - ["{NEW}", [0xFE]], - ["{END}", [0xFF]], -] - def split_into_sentences(text: str) -> list[str]: # -*- coding: utf-8 -*- import re @@ -194,13 +113,8 @@ def split_sentence_into_lines(sentence, offset, pixelsPerChar, pixelsInLine, lan # Figure out the length of the word in pixels for char in word: if (pixelsPerChar == "Variable"): - if(lang == Languages.Japanese): - wordLength += jpnCharWidthArray[convert_char_to_byte(ord(char), charArrayOfLanguage[lang], lang)] - spaceLength = jpnCharWidthArray[convert_char_to_byte(ord(' '), charArrayOfLanguage[lang], lang)] - else: - wordLength += engCharWidthArray[convert_char_to_byte(ord(char), charArrayOfLanguage[lang], lang)] - spaceLength = engCharWidthArray[convert_char_to_byte(ord(' '), charArrayOfLanguage[lang], lang)] - + wordLength += charArrayOfLanguage[lang]["font"].charWidthTable[convert_char_to_byte(ord(char), charArrayOfLanguage[lang]["array"], lang)] + spaceLength = charArrayOfLanguage[lang]["font"].charWidthTable[convert_char_to_byte(ord(' '), charArrayOfLanguage[lang]["array"], lang)] elif (pixelsPerChar == "Default"): if (lang == Languages.Japanese): wordLength += 8 @@ -259,6 +173,7 @@ def convert_char_to_byte(incoming, array, lang): log_warning_error(lang, "Warning", f"Character {pair[0]} was used but is not in character table. Replaced with {pair[1]} .") index = 0 + #print(array) for val in array: if str(val) == chr(incoming): return index @@ -290,12 +205,9 @@ def convert_item(ogDict, lang): pixelsInLine = ogDict["pixelsInLine"] include_box_breaks = ogDict["includeBoxBreaks"] - if lang == Languages.Japanese: - arr = charArrayOfLanguage[lang] - list = jpnEscapeCharConversionList - else: - arr = charArrayOfLanguage[lang] - list = itlEscapeCharConversionList + arr = charArrayOfLanguage[lang]["array"] + list = charArrayOfLanguage[lang]["escape"] + for pair in list: if pair[0] in line: escapeString = "" @@ -365,7 +277,7 @@ def convert_item(ogDict, lang): outStr = newStr byteStr = "" - arr = charArrayOfLanguage[lang] + arr = charArrayOfLanguage[lang]["array"] for char in outStr[:-1]: byteStr += f"{convert_char_to_byte(ord(char), arr, lang):02x} " if (len(outStr) > 0 and outStr[-1] != ' '): # Check if the last char is a space @@ -474,7 +386,7 @@ def transfer_xlsx_to_dict(): val = currSheet.iloc[r + 1, c + offset] if pd.isna(val): val = " " - value[r * 0x10 + c] = val + value["array"][r * 0x10 + c] = val # print(charArrays[key]) offset += 16 @@ -578,7 +490,7 @@ def output_json_file(): for item in mainDict[lang.name][section]: string = mainDict[lang.name][section][item]["bytes"].split(" ") outText = "" - arr = charArrayOfLanguage[lang] + arr = charArrayOfLanguage[lang]["array"] for byte in string: byte = arr[int(byte, 16)] outText += str(byte) @@ -594,14 +506,17 @@ BACKGROUND_PAL_INDEX = 0 CELL_PAL_INDEX = 1 class Font: - def __init__(self, fileName, numColors, numChars, numCharsX, numCharsY, cellWidth, cellHeight): + def __init__(self, fileName, conditional, numColors, numChars, numCharsX, numCharsY, cellWidth, cellHeight, charWidth, charHeight): self.fileName = fileName + self.conditional = conditional self.numColors = numColors self.numChars = numChars self.numCharsX = numCharsX self.numCharsY = numCharsY self.cellWidth = cellWidth self.cellHeight = cellHeight + self.charWidth = charWidth + self.charHeight = charHeight self.bpp = int(math.log(numColors, 2)) + 1 self.numWords = self.numChars * self.cellWidth * self.cellHeight * self.bpp // (8 * 4) @@ -612,7 +527,11 @@ class Font: def build_h(myFont): with open(fontDir + "/include/" + myFont.fileName + ".h", 'w') as f: - f.write(f''' + f.write(f'''#include "debug_mode.h" +#include "pokemon_data.h" + +#if {myFont.conditional} + #ifndef __{myFont.fileName.upper()}__ #define __{myFont.fileName.upper()}__ @@ -624,6 +543,8 @@ extern const unsigned int {myFont.fileName}Glyphs[{myFont.numBytes}]; #define {myFont.fileName}WidthsLen {myFont.numChars} extern const unsigned char {myFont.fileName}Widths[{myFont.numChars}]; +#endif + #endif ''') f.close() @@ -676,7 +597,7 @@ def build_c(myFont): 0, // All heights are the same 0, // Character offset, is set to zero {myFont.numChars}, - {myFont.cellWidth}, {myFont.cellHeight}, + {myFont.charWidth}, {myFont.charHeight}, {myFont.cellWidth}, {myFont.cellHeight}, {myFont.numBytes // myFont.numChars}, {myFont.bpp}, @@ -687,11 +608,15 @@ def build_c(myFont): f.close() def generate_tables(myFont): - img = Image.open(f'{fontDir}/graphics/{myFont.fileName}.png') - if (img.mode != "P"): + reader = png.Reader(f'{fontDir}/text_helper/fonts/{myFont.fileName}.png') + png_info = reader.read()[3] + palette = png_info.get('palette') + if (palette is None): print("Error: Image file does not contain a palette") exit() - pixels = img.load() + + width, height, rows, info = reader.read() + pixels = list(rows) bitsPerWord = 32 pixelsPerTileX = 8 @@ -707,8 +632,8 @@ def generate_tables(myFont): for charY in range(charsPerChartY): for charX in range(charsPerChartX): - for tileY in range(tilesPerCharY): - for tileX in range(tilesPerCharX): + for tileX in range(tilesPerCharX): # Tiles go from top to bottom, then left to right + for tileY in range(tilesPerCharY): for pixelY in range(pixelsPerTileY): for pixelX in range(pixelsPerTileX): @@ -718,7 +643,10 @@ def generate_tables(myFont): globalX = pixelX + (tileX * pixelsPerTileX) + (charX * tilesPerCharX * pixelsPerTileX) globalY = pixelY + (tileY * pixelsPerTileY) + (charY * tilesPerCharY * pixelsPerTileY) - val = (pixels[globalX, globalY] - 2) & ((1 << myFont.bpp) - 1) + val = (pixels[globalY][globalX] - 1) + if val < 0: + val = 0 + val &= myFont.bpp myFont.charWordTable[arrayIndex] |= val << bitIndex #print(f'globalX: {globalX}, globalY: {globalY}, arrayIndex:{arrayIndex}, bitIndex:{bitIndex}, val:{val}') @@ -731,17 +659,68 @@ def generate_tables(myFont): globalX = x + (charX * tilesPerCharX * pixelsPerTileX) globalY = 0 + (charY * tilesPerCharY * pixelsPerTileY) #print(f'x: {globalX}, y: {globalY}') - if (pixels[globalX, globalY] == BACKGROUND_PAL_INDEX): + if (pixels[globalY][globalX] == BACKGROUND_PAL_INDEX): myFont.charWidthTable[(charY * charsPerChartX) + charX] = x break def generate_font(): - latin_normal = Font("latin_normal", 1, 256, 16, 16, 16, 16) - generate_tables(latin_normal) - build_h(latin_normal) - build_c(latin_normal) + for font in fonts.values(): + generate_tables(font) + build_h(font) + build_c(font) +mainDict = {} +textSections = [] +fonts = { + "International": Font("latin_normal", "PTGB_BUILD_LANGUAGE != 1", 1, 256, 16, 16, 16, 16, 16, 14), + "Japanese": Font("japanese_normal", "PTGB_BUILD_LANGUAGE == 1", 1, 256, 16, 16, 8, 16, 8, 16), +} +charArrays = { + "International": { + "array": [0] * 0x100, + "font": fonts["International"], + "escape": [ + ["{SCL}", [0xFA]], + ["{CLR}", [0xFB]], + ["{DEF}", [0xFC, 0x01, 0x02]], + ["{FEM}", [0xFC, 0x01, 0x04]], + ["{FPC}", [0xFC, 0x01, 0x06]], + ["{MLE}", [0xFC, 0x01, 0x08]], + ["{PLR}", [0xFD, 0x01]], + ["{NEW}", [0xFE]], + ["{END}", [0xFF]], + ] + }, + "Japanese": { + "array": [0] * 0x100, + "font": fonts["Japanese"], + "escape": [ + ["{SCL}", [0xFA]], + ["{CLR}", [0xFB]], + ["{DEF}", [0xFC, 0x06, 0x02]], + ["{FEM}", [0xFC, 0x06, 0x03]], # ??? + ["{MLE}", [0xFC, 0x06, 0x04]], + ["{FPC}", [0xFC, 0x06, 0x05]], + ["{PLR}", [0xFD, 0x01]], + ["{NEW}", [0xFE]], + ["{END}", [0xFF]], + ] + }, +} +charArrayOfLanguage = { + Languages.Japanese: charArrays["Japanese"], + Languages.English: charArrays["International"], + Languages.French: charArrays["International"], + Languages.German: charArrays["International"], + Languages.Italian: charArrays["International"], + Languages.SpanishEU: charArrays["International"], + Languages.SpanishLA: charArrays["International"], +} +charConversionList = [ + # replaces the first char in the list with the latter + ["'", "’"], +] # Main print("Running text_helper:")