From 0e85a3d155e887c2970c4b093a3c0926293d67ab Mon Sep 17 00:00:00 2001 From: Marcin Kurczewski Date: Wed, 29 Jan 2025 13:58:11 +0100 Subject: [PATCH] tr2: add accented fonts Resolves #2356. --- data/tr2/glyphs/buttons.png | Bin 0 -> 1602 bytes data/tr2/glyphs/glyphs.png | Bin 0 -> 12287 bytes data/tr2/glyphs/mapping.txt | 25 + data/tr2/glyphs/mapping_basic_latin.txt | 104 +++ .../glyphs/mapping_combining_diactrics.txt | 16 + data/tr2/glyphs/mapping_cyrillic.txt | 101 +++ data/tr2/glyphs/mapping_greek_and_coptic.txt | 73 ++ data/tr2/glyphs/mapping_icons.txt | 33 + .../tr2/glyphs/mapping_latin-1_supplement.txt | 93 +++ data/tr2/glyphs/mapping_latin_extended-a.txt | 128 ++++ data/tr2/glyphs/mapping_latin_extended-b.txt | 33 + .../mapping_latin_extended_additional.txt | 60 ++ data/tr2/glyphs/mapping_misc.txt | 47 ++ data/tr2/ship/cfg/TR2X_gameflow.json5 | 4 + data/tr2/ship/cfg/TR2X_gameflow_level.json5 | 4 + data/tr2/ship/data/injections/font.bin | Bin 0 -> 37276 bytes docs/tr1/README.md | 1 + docs/tr2/CHANGELOG.md | 3 +- docs/tr2/README.md | 6 + src/libtrx/game/text.def | 3 + src/libtrx/game/text_tr2.def | 679 +++++++++++++++--- tools/glyphs/README.md | 70 ++ 22 files changed, 1398 insertions(+), 85 deletions(-) create mode 100644 data/tr2/glyphs/buttons.png create mode 100644 data/tr2/glyphs/glyphs.png create mode 100644 data/tr2/glyphs/mapping.txt create mode 100644 data/tr2/glyphs/mapping_basic_latin.txt create mode 100644 data/tr2/glyphs/mapping_combining_diactrics.txt create mode 100644 data/tr2/glyphs/mapping_cyrillic.txt create mode 100644 data/tr2/glyphs/mapping_greek_and_coptic.txt create mode 100644 data/tr2/glyphs/mapping_icons.txt create mode 100644 data/tr2/glyphs/mapping_latin-1_supplement.txt create mode 100644 data/tr2/glyphs/mapping_latin_extended-a.txt create mode 100644 data/tr2/glyphs/mapping_latin_extended-b.txt create mode 100644 data/tr2/glyphs/mapping_latin_extended_additional.txt create mode 100644 data/tr2/glyphs/mapping_misc.txt create mode 100644 data/tr2/ship/data/injections/font.bin create mode 100644 tools/glyphs/README.md diff --git a/data/tr2/glyphs/buttons.png b/data/tr2/glyphs/buttons.png new file mode 100644 index 0000000000000000000000000000000000000000..41678107a86aaca24d40c07b08125fe043beeed5 GIT binary patch literal 1602 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 Nc)I$ztaD0e0s#GuGJpU8 literal 0 HcmV?d00001 diff --git a/data/tr2/glyphs/mapping.txt b/data/tr2/glyphs/mapping.txt new file mode 100644 index 000000000..b3f801843 --- /dev/null +++ b/data/tr2/glyphs/mapping.txt @@ -0,0 +1,25 @@ +# This file is used by the tooling in the tools/glyphs/ directory and is +# crucial for the game's graphical text handling, serving two roles: +# +# 1. Hardcoding Unicode to sprite mapping +# It generates C macros that map Unicode code points and escaped sequences +# to O_ALPHABET's sprite indices, specify glyph dimensions, and instruct how +# to compose compound characters - all getting hardcoded into the executable. +# 2. Guidance for font.bin creation +# It directs the injector tool in creating the font.bin file that contains +# O_ALPHABET sprite bitmaps, along with additional positional information. +# +# Important notes: +# - Some sprite indices are fixed. This is for compatibility with the original +# game to retains original text format even if font.bin goes missing. + +include "mapping_basic_latin.txt" +include "mapping_icons.txt" +include "mapping_combining_diactrics.txt" +include "mapping_latin-1_supplement.txt" +include "mapping_latin_extended-a.txt" +include "mapping_latin_extended-b.txt" +include "mapping_greek_and_coptic.txt" +include "mapping_cyrillic.txt" +include "mapping_latin_extended_additional.txt" +include "mapping_misc.txt" diff --git a/data/tr2/glyphs/mapping_basic_latin.txt b/data/tr2/glyphs/mapping_basic_latin.txt new file mode 100644 index 000000000..bfbc66534 --- /dev/null +++ b/data/tr2/glyphs/mapping_basic_latin.txt @@ -0,0 +1,104 @@ +# -------------------------------------------------- +# Unicode Block "Basic Latin" (U+0000 to U+007F) +# -------------------------------------------------- +# ASCII a-z +U+0061:a N manual_sprite("glyphs.png", 218, 41, 11, 18, index=26) +U+0062:b N manual_sprite("glyphs.png", 229, 41, 11, 18, index=27) +U+0063:c N manual_sprite("glyphs.png", 240, 41, 11, 18, index=28) +U+0064:d N manual_sprite("glyphs.png", 0, 59, 11, 18, index=29) +U+0065:e N manual_sprite("glyphs.png", 11, 59, 11, 18, index=30) +U+0066:f N manual_sprite("glyphs.png", 22, 59, 11, 18, index=31) +U+0067:g N manual_sprite("glyphs.png", 33, 59, 11, 18, index=32) +U+0068:h N manual_sprite("glyphs.png", 44, 59, 11, 18, index=33) +U+0069:i N manual_sprite("glyphs.png", 55, 59, 7, 18, index=34) +U+006A:j N manual_sprite("glyphs.png", 62, 59, 11, 18, index=35) +U+006B:k N manual_sprite("glyphs.png", 73, 59, 12, 18, index=36) +U+006C:l N manual_sprite("glyphs.png", 85, 59, 7, 18, index=37) +U+006D:m N manual_sprite("glyphs.png", 92, 59, 14, 18, index=38) +U+006E:n N manual_sprite("glyphs.png", 106, 59, 12, 18, index=39) +U+006F:o N manual_sprite("glyphs.png", 118, 59, 11, 18, index=40) +U+0070:p N manual_sprite("glyphs.png", 129, 59, 11, 18, index=41) +U+0071:q N manual_sprite("glyphs.png", 140, 59, 11, 18, index=42) +U+0072:r N manual_sprite("glyphs.png", 151, 59, 10, 18, index=43) +U+0073:s N manual_sprite("glyphs.png", 161, 59, 11, 18, index=44) +U+0074:t N manual_sprite("glyphs.png", 172, 59, 11, 18, index=45) +U+0075:u N manual_sprite("glyphs.png", 183, 59, 11, 18, index=46) +U+0076:v N manual_sprite("glyphs.png", 194, 59, 11, 18, index=47) +U+0077:w N manual_sprite("glyphs.png", 205, 59, 13, 18, index=48) +U+0078:x N manual_sprite("glyphs.png", 218, 59, 11, 18, index=49) +U+0079:y N manual_sprite("glyphs.png", 229, 59, 11, 18, index=50) +U+007A:z N manual_sprite("glyphs.png", 240, 59, 11, 18, index=51) + +# ASCII A-z +U+0041:A N manual_sprite("glyphs.png", 65, 23, 17, 18, index=0) expand(-1) +U+0042:B N manual_sprite("glyphs.png", 82, 23, 13, 18, index=1) +U+0043:C N manual_sprite("glyphs.png", 95, 23, 13, 18, index=2) +U+0044:D N manual_sprite("glyphs.png", 108, 23, 13, 18, index=3) +U+0045:E N manual_sprite("glyphs.png", 121, 23, 13, 18, index=4) +U+0046:F N manual_sprite("glyphs.png", 134, 23, 13, 18, index=5) +U+0047:G N manual_sprite("glyphs.png", 147, 23, 13, 18, index=6) +U+0048:H N manual_sprite("glyphs.png", 160, 23, 15, 18, index=7) +U+0049:I N manual_sprite("glyphs.png", 175, 23, 10, 18, index=8) +U+004A:J N manual_sprite("glyphs.png", 185, 23, 13, 18, index=9) +U+004B:K N manual_sprite("glyphs.png", 198, 23, 14, 18, index=10) +U+004C:L N manual_sprite("glyphs.png", 212, 23, 13, 18, index=11) +U+004D:M N manual_sprite("glyphs.png", 225, 23, 15, 18, index=12) +U+004E:N N manual_sprite("glyphs.png", 240, 23, 15, 18, index=13) +U+004F:O N manual_sprite("glyphs.png", 0, 41, 14, 18, index=14) +U+0050:P N manual_sprite("glyphs.png", 14, 41, 13, 18, index=15) +U+0051:Q N manual_sprite("glyphs.png", 27, 41, 14, 18, index=16) +U+0052:R N manual_sprite("glyphs.png", 41, 41, 14, 18, index=17) +U+0053:S N manual_sprite("glyphs.png", 55, 41, 13, 18, index=18) +U+0054:T N manual_sprite("glyphs.png", 68, 41, 14, 18, index=19) +U+0055:U N manual_sprite("glyphs.png", 82, 41, 15, 18, index=20) +U+0056:V N manual_sprite("glyphs.png", 97, 41, 15, 18, index=21) +U+0057:W N manual_sprite("glyphs.png", 112, 41, 15, 18, index=22) +U+0058:X N manual_sprite("glyphs.png", 127, 41, 14, 18, index=23) +U+0059:Y N manual_sprite("glyphs.png", 141, 41, 14, 18, index=24) +U+005A:Z N manual_sprite("glyphs.png", 155, 41, 13, 18, index=25) + +# Digits 0-9 +U+0030:0 N manual_sprite("glyphs.png", 135, 5, 14, 18, index=52) +U+0031:1 N manual_sprite("glyphs.png", 149, 5, 11, 18, index=53) +U+0032:2 N manual_sprite("glyphs.png", 160, 5, 12, 18, index=54) +U+0033:3 N manual_sprite("glyphs.png", 172, 5, 12, 18, index=55) +U+0034:4 N manual_sprite("glyphs.png", 184, 5, 12, 18, index=56) +U+0035:5 N manual_sprite("glyphs.png", 196, 5, 12, 18, index=57) +U+0036:6 N manual_sprite("glyphs.png", 208, 5, 12, 18, index=58) +U+0037:7 N manual_sprite("glyphs.png", 220, 5, 12, 18, index=59) +U+0038:8 N manual_sprite("glyphs.png", 232, 5, 12, 18, index=60) +U+0039:9 N manual_sprite("glyphs.png", 244, 5, 12, 18, index=61) + +# Basic Punctuation +U+0021:! N manual_sprite("glyphs.png", 0, 5, 6, 18, index=64) +U+0022:" N manual_sprite("glyphs.png", 6, 5, 9, 18) +U+0023:# N manual_sprite("glyphs.png", 16, 5, 14, 18, index=78) +U+0024:$ N manual_sprite("glyphs.png", 30, 5, 11, 18) +U+0025:% N manual_sprite("glyphs.png", 41, 5, 13, 18) +U+0026:& N manual_sprite("glyphs.png", 54, 5, 11, 18) +U+0027:' N manual_sprite("glyphs.png", 65, 5, 6, 18, index=79) +U+0028:( N manual_sprite("glyphs.png", 71, 5, 7, 18) expand(w=-1) +U+0029:) N manual_sprite("glyphs.png", 78, 5, 7, 18) translate(x=1) expand(w=1) +U+002A:* N manual_sprite("glyphs.png", 85, 5, 9, 18) +U+002B:+ N manual_sprite("glyphs.png", 94, 5, 11, 18, index=72) +U+002C:, N manual_sprite("glyphs.png", 105, 5, 6, 18, index=63) +U+002D:- N manual_sprite("glyphs.png", 111, 5, 9, 18, index=71) +U+002E:. N manual_sprite("glyphs.png", 120, 5, 6, 18, index=62) +U+002F:/ N manual_sprite("glyphs.png", 126, 5, 9, 18, index=68) +U+003A:: N manual_sprite("glyphs.png", 0, 23, 6, 18, index=73) +U+003B:; N manual_sprite("glyphs.png", 6, 23, 6, 18) +U+003C:< N manual_sprite("glyphs.png", 13, 23, 9, 18) +U+003D:= N manual_sprite("glyphs.png", 22, 23, 9, 18) +U+003E:> N manual_sprite("glyphs.png", 31, 23, 9, 18) +U+003F:? N manual_sprite("glyphs.png", 41, 23, 12, 18, index=65) +U+0040:@ N manual_sprite("glyphs.png", 53, 23, 12, 18) +U+005B:[ N manual_sprite("glyphs.png", 168, 41, 8, 18, index=66) +U+005C:\ N manual_sprite("glyphs.png", 176, 41, 9, 18, index=76) +U+005D:] N manual_sprite("glyphs.png", 185, 41, 8, 18, index=75) +U+005E:^ N manual_sprite("glyphs.png", 193, 41, 9, 18) +U+005F:_ N manual_sprite("glyphs.png", 202, 41, 9, 18) +U+0060:` N manual_sprite("glyphs.png", 211, 41, 7, 18) +U+007B:{ N manual_sprite("glyphs.png", 0, 77, 8, 18) +U+007C:| N manual_sprite("glyphs.png", 8, 77, 6, 18) +U+007D:} N manual_sprite("glyphs.png", 14, 77, 8, 18) +U+007E:~ N manual_sprite("glyphs.png", 22, 77, 10, 18) diff --git a/data/tr2/glyphs/mapping_combining_diactrics.txt b/data/tr2/glyphs/mapping_combining_diactrics.txt new file mode 100644 index 000000000..4ec89580a --- /dev/null +++ b/data/tr2/glyphs/mapping_combining_diactrics.txt @@ -0,0 +1,16 @@ +# -------------------------------------------------- +# Combining diactrics +# -------------------------------------------------- +"\\{grave accent}" c manual_sprite("glyphs.png", 0, 0, 7, 5, index=77) +"\\{acute accent}" c manual_sprite("glyphs.png", 7, 0, 7, 5, index=70) +"\\{circumflex accent}" c manual_sprite("glyphs.png", 32, 0, 9, 5, index=69) +"\\{circumflex}" N link("\\{circumflex accent}") +"\\{macron}" c manual_sprite("glyphs.png", 23, 0, 9, 5) +"\\{breve}" c manual_sprite("glyphs.png", 50, 0, 8, 5) +"\\{dot above}" c manual_sprite("glyphs.png", 58, 0, 6, 5) +"\\{umlaut}" c manual_sprite("glyphs.png", 14, 0, 9, 5, index=67) +"\\{caron}" c manual_sprite("glyphs.png", 41, 0, 9, 5) +"\\{ring above}" c manual_sprite("glyphs.png", 64, 0, 7, 5) +"\\{tilde}" c manual_sprite("glyphs.png", 71, 0, 10, 5) +"\\{double acute accent}" c manual_sprite("glyphs.png", 81, 0, 9, 5) +"\\{acute umlaut}" c manual_sprite("glyphs.png", 90, 0, 11, 5) diff --git a/data/tr2/glyphs/mapping_cyrillic.txt b/data/tr2/glyphs/mapping_cyrillic.txt new file mode 100644 index 000000000..d42cc1e7c --- /dev/null +++ b/data/tr2/glyphs/mapping_cyrillic.txt @@ -0,0 +1,101 @@ +# -------------------------------------------------- +# Unicode Block "Cyrillic" (U+0400 to U+04FF) +# -------------------------------------------------- +U+0400:Ѐ C combine(U+0415:Е, "\\{grave accent}") +U+0401:Ё C combine(U+0415:Е, "\\{umlaut}") +U+0402:Ђ N manual_sprite("glyphs.png", 73, 167, 15, 18) +U+0403:Ѓ C combine(U+0413:Г, "\\{acute accent}") +U+0404:Є N manual_sprite("glyphs.png", 88, 167, 13, 18) +U+0405:Ѕ N link("S") +U+0406:І N link("I") +U+0407:Ї C combine(U+0406:І, "\\{umlaut}") +U+0408:Ј N link("J") +U+0409:Љ N manual_sprite("glyphs.png", 101, 167, 18, 18) +U+040A:Њ N manual_sprite("glyphs.png", 119, 167, 18, 18) +U+040B:Ћ N manual_sprite("glyphs.png", 137, 167, 16, 18) +U+040C:Ќ C combine(U+041A:К, "\\{acute accent}") +U+040D:Ѝ C combine(U+0418:И, "\\{grave accent}") +U+040E:Ў C combine(U+0423:У, "\\{breve}") +U+040F:Џ N manual_sprite("glyphs.png", 153, 167, 14, 18) +U+0410:А N link("A") +U+0411:Б N manual_sprite("glyphs.png", 167, 167, 13, 18) +U+0412:В N link("B") +U+0413:Г N link(U+0393:Γ) +U+0414:Д N manual_sprite("glyphs.png", 180, 167, 16, 18) +U+0415:Е N link("E") +U+0416:Ж N manual_sprite("glyphs.png", 196, 167, 18, 18) +U+0417:З N manual_sprite("glyphs.png", 214, 167, 12, 18) +U+0418:И N manual_sprite("glyphs.png", 226, 167, 15, 18) +U+0419:Й C combine(U+0418:И, "\\{breve}") +U+041A:К N link("K") +U+041B:Л N manual_sprite("glyphs.png", 241, 167, 15, 18) +U+041C:М N link("M") +U+041D:Н N link("H") +U+041E:О N link("O") +U+041F:П N link(U+03A0:Π) +U+0420:Р N link("P") +U+0421:С N link("C") +U+0422:Т N link("T") +U+0423:У N manual_sprite("glyphs.png", 0, 185, 14, 18) +U+0424:Ф N link(U+03A6:Φ) +U+0425:Х N link("X") +U+0426:Ц N manual_sprite("glyphs.png", 14, 185, 15, 18) +U+0427:Ч N manual_sprite("glyphs.png", 29, 185, 15, 18) +U+0428:Ш N manual_sprite("glyphs.png", 44, 185, 18, 18) +U+0429:Щ N manual_sprite("glyphs.png", 62, 185, 18, 18) +U+042A:Ъ N manual_sprite("glyphs.png", 80, 185, 15, 18) +U+042B:Ы N manual_sprite("glyphs.png", 95, 185, 18, 18) +U+042C:Ь N manual_sprite("glyphs.png", 113, 185, 13, 18) +U+042D:Э N manual_sprite("glyphs.png", 126, 185, 13, 18) +U+042E:Ю N manual_sprite("glyphs.png", 139, 185, 18, 18) +U+042F:Я N manual_sprite("glyphs.png", 157, 185, 13, 18) +U+0430:а N link("a") +U+0431:б N manual_sprite("glyphs.png", 170, 185, 11, 18) +U+0432:в N manual_sprite("glyphs.png", 181, 185, 11, 18) +U+0433:г N manual_sprite("glyphs.png", 192, 185, 10, 18) +U+0434:д N manual_sprite("glyphs.png", 202, 185, 12, 18) +U+0435:е N link("e") +U+0436:ж N manual_sprite("glyphs.png", 214, 185, 17, 18) +U+0437:з N manual_sprite("glyphs.png", 232, 185, 11, 18) +U+0438:и N manual_sprite("glyphs.png", 243, 185, 12, 18) +U+0439:й C combine(U+0438:и, "\\{breve}") +U+043A:к N link(U+0138:ĸ) +U+043B:л N manual_sprite("glyphs.png", 0, 203, 11, 18) +U+043C:м N manual_sprite("glyphs.png", 11, 203, 13, 18) +U+043D:н N manual_sprite("glyphs.png", 24, 203, 11, 18) +U+043E:о N link("o") +U+043F:п N manual_sprite("glyphs.png", 35, 203, 11, 18) +U+0440:р N link("p") +U+0441:с N link("c") +U+0442:т N manual_sprite("glyphs.png", 46, 203, 10, 18) +U+0443:у N link("y") +U+0444:ф N manual_sprite("glyphs.png", 56, 203, 14, 18) +U+0445:х N link("x") +U+0446:ц N manual_sprite("glyphs.png", 70, 203, 12, 18) +U+0447:ч N manual_sprite("glyphs.png", 82, 203, 11, 18) +U+0448:ш N manual_sprite("glyphs.png", 93, 203, 14, 18) +U+0449:щ N manual_sprite("glyphs.png", 107, 203, 15, 18) +U+044A:ъ N manual_sprite("glyphs.png", 122, 203, 13, 18) +U+044B:ы N manual_sprite("glyphs.png", 135, 203, 14, 18) +U+044C:ь N manual_sprite("glyphs.png", 149, 203, 11, 18) +U+044D:э N manual_sprite("glyphs.png", 160, 203, 11, 18) +U+044E:ю N manual_sprite("glyphs.png", 171, 203, 14, 18) +U+044F:я N manual_sprite("glyphs.png", 185, 203, 11, 18) +U+0450:ѐ C combine("e", "\\{grave accent}") +U+0451:ё C combine("e", "\\{umlaut}") +U+0452:ђ N manual_sprite("glyphs.png", 196, 203, 12, 18) +U+0453:ѓ C combine(U+0433:г, "\\{acute accent}") +U+0454:є N manual_sprite("glyphs.png", 208, 203, 11, 18) +U+0455:ѕ N link("s") +U+0456:і N link("i") +U+0457:ї C combine(U+0131:ı, "\\{umlaut}") +U+0458:ј N link("j") +U+0459:љ N manual_sprite("glyphs.png", 219, 203, 16, 18) +U+045A:њ N manual_sprite("glyphs.png", 235, 203, 16, 18) +U+045B:ћ N link(U+0127:ħ) +U+045C:ќ C combine(U+043A:к, "\\{acute accent}") +U+045D:ѝ C combine(U+0438:и, "\\{grave accent}") +U+045E:ў C combine(U+0443:у, "\\{breve}") +U+045F:џ N manual_sprite("glyphs.png", 0, 221, 11, 18) +U+0490:Ґ N manual_sprite("glyphs.png", 11, 221, 13, 18) +U+0491:ґ N manual_sprite("glyphs.png", 24, 221, 10, 18) diff --git a/data/tr2/glyphs/mapping_greek_and_coptic.txt b/data/tr2/glyphs/mapping_greek_and_coptic.txt new file mode 100644 index 000000000..e8bf47863 --- /dev/null +++ b/data/tr2/glyphs/mapping_greek_and_coptic.txt @@ -0,0 +1,73 @@ +# -------------------------------------------------- +# Unicode Block "Greek and Coptic" (U+0370 to U+03FF) +# -------------------------------------------------- +U+0393:Γ N manual_sprite("glyphs.png", 194, 131, 13, 18) +U+0394:Δ N manual_sprite("glyphs.png", 207, 131, 15, 18) +U+0395:Ε N link("E") +U+0396:Ζ N link("Z") +U+0397:Η N link("H") +U+0398:Θ N manual_sprite("glyphs.png", 222, 131, 14, 18) +U+0399:Ι N link("I") +U+039A:Κ N link("K") +U+039B:Λ N manual_sprite("glyphs.png", 236, 131, 17, 18) +U+039C:Μ N link("M") +U+039D:Ν N link("N") +U+039E:Ξ N manual_sprite("glyphs.png", 0, 149, 14, 18) +U+039F:Ο N link("O") +U+03A0:Π N manual_sprite("glyphs.png", 14, 149, 15, 18) +U+03A1:Ρ N link("P") +U+03A3:Σ N manual_sprite("glyphs.png", 29, 149, 13, 18) +U+03A4:Τ N link("T") +U+03A5:Υ N link("Y") +U+03A6:Φ N manual_sprite("glyphs.png", 42, 149, 16, 18) +U+03A7:Χ N link("Z") +U+03A8:Ψ N manual_sprite("glyphs.png", 58, 149, 18, 18) +U+03A9:Ω N manual_sprite("glyphs.png", 76, 149, 14, 18) +U+03B1:α N manual_sprite("glyphs.png", 90, 149, 12, 18) +U+03B2:β N manual_sprite("glyphs.png", 102, 149, 11, 18) +U+03B3:γ N manual_sprite("glyphs.png", 113, 149, 12, 18) +U+03B4:δ N manual_sprite("glyphs.png", 125, 149, 11, 18) +U+03B5:ε N manual_sprite("glyphs.png", 136, 149, 11, 18) +U+03B6:ζ N manual_sprite("glyphs.png", 147, 149, 11, 18) +U+03B7:η N manual_sprite("glyphs.png", 158, 149, 11, 18) +U+03B8:θ N manual_sprite("glyphs.png", 169, 149, 11, 18) +U+03B9:ι N link(U+0131:ı) +U+03BA:κ N link(U+0138:ĸ) +U+03BB:λ N manual_sprite("glyphs.png", 180, 149, 12, 18) +U+03BC:μ N link(U+00B5:µ) +U+03BD:ν N link("v") +U+03BE:ξ N manual_sprite("glyphs.png", 192, 149, 11, 18) +U+03BF:ο N link("o") +U+03C0:π N manual_sprite("glyphs.png", 203, 149, 13, 18) +U+03C1:ρ N manual_sprite("glyphs.png", 216, 149, 11, 18) +U+03C2:ς N manual_sprite("glyphs.png", 227, 149, 11, 18) +U+03C3:σ N manual_sprite("glyphs.png", 238, 149, 12, 18) +U+03C4:τ N manual_sprite("glyphs.png", 0, 167, 10, 18) +U+03C5:υ N manual_sprite("glyphs.png", 10, 167, 11, 18) +U+03C6:φ N manual_sprite("glyphs.png", 21, 167, 14, 18) +U+03C7:χ N manual_sprite("glyphs.png", 35, 167, 11, 18) +U+03C8:ψ N manual_sprite("glyphs.png", 46, 167, 14, 18) +U+03C9:ω N manual_sprite("glyphs.png", 60, 167, 13, 18) + +U+0386:Ά C combine(U+0391:Α, "\\{acute accent}", offset_x=-4, offset_y=2) +U+0388:Έ C combine(U+0395:Ε, "\\{acute accent}", offset_x=-4, offset_y=2) +U+0389:Ή C combine(U+0397:Η, "\\{acute accent}", offset_x=-4, offset_y=2) +U+038A:Ί C combine(U+0399:Ι, "\\{acute accent}", offset_x=-4, offset_y=2) +U+038C:Ό C combine(U+039F:Ο, "\\{acute accent}", offset_x=-4, offset_y=2) +U+038E:Ύ C combine(U+03A5:Υ, "\\{acute accent}", offset_x=-4, offset_y=2) +U+038F:Ώ C combine(U+03A9:Ω, "\\{acute accent}", offset_x=-4, offset_y=2) +U+0390:ΐ C combine(U+03B9:ι, "\\{acute umlaut}") +U+0391:Α N link("A") +U+0392:Β N link("B") +U+03AA:Ϊ C combine(U+0399:Ι, "\\{umlaut}") +U+03AB:Ϋ C combine(U+03A5:Υ, "\\{umlaut}") +U+03AC:ά C combine(U+03B1:α, "\\{acute accent}") +U+03AD:έ C combine(U+03B5:ε, "\\{acute accent}") +U+03AE:ή C combine(U+03B7:η, "\\{acute accent}") +U+03AF:ί C combine(U+03B9:ι, "\\{acute accent}") +U+03B0:ΰ C combine(U+03C5:υ, "\\{acute umlaut}") +U+03CA:ϊ C combine(U+03B9:ι, "\\{umlaut}") +U+03CB:ϋ C combine(U+03C5:υ, "\\{umlaut}") +U+03CC:ό C combine(U+03BF:ο, "\\{acute accent}") +U+03CD:ύ C combine(U+03C5:υ, "\\{acute accent}") +U+03CE:ώ C combine(U+03C9:ω, "\\{acute accent}") diff --git a/data/tr2/glyphs/mapping_icons.txt b/data/tr2/glyphs/mapping_icons.txt new file mode 100644 index 000000000..aa6e5fdf2 --- /dev/null +++ b/data/tr2/glyphs/mapping_icons.txt @@ -0,0 +1,33 @@ +# -------------------------------------------------- +# Icons +# -------------------------------------------------- +"\\{small digit 0}" N grid_sprite("buttons.png", 0, 0, index=82) +"\\{small digit 1}" N grid_sprite("buttons.png", 1, 0, index=83) +"\\{small digit 2}" N grid_sprite("buttons.png", 2, 0, index=84) +"\\{small digit 3}" N grid_sprite("buttons.png", 3, 0, index=85) +"\\{small digit 4}" N grid_sprite("buttons.png", 4, 0, index=86) +"\\{small digit 5}" N grid_sprite("buttons.png", 5, 0, index=87) +"\\{small digit 6}" N grid_sprite("buttons.png", 6, 0, index=88) +"\\{small digit 7}" N grid_sprite("buttons.png", 7, 0, index=89) +"\\{small digit 8}" N grid_sprite("buttons.png", 8, 0, index=90) +"\\{small digit 9}" N grid_sprite("buttons.png", 9, 0, index=91) +"\\{button down}" N grid_sprite("buttons.png", 0, 1, index=106) +"\\{button up}" N grid_sprite("buttons.png", 1, 1, index=107) +"\\{button left}" N grid_sprite("buttons.png", 2, 1, index=108) +"\\{button right}" N grid_sprite("buttons.png", 3, 1, index=109) +"\\{button triangle}" N grid_sprite("buttons.png", 0, 2, index=93) +"\\{button circle}" N grid_sprite("buttons.png", 1, 2, index=94) +"\\{button x}" N grid_sprite("buttons.png", 2, 2, index=95) +"\\{button square}" N grid_sprite("buttons.png", 3, 2, index=96) +"\\{button empty}" N grid_sprite("buttons.png", 0, 3, index=92) +"\\{button l1}" N grid_sprite("buttons.png", 1, 3, index=97) +"\\{button r1}" N grid_sprite("buttons.png", 2, 3, index=98) +"\\{button l2}" N grid_sprite("buttons.png", 3, 3, index=99) +"\\{button r2}" N grid_sprite("buttons.png", 4, 3, index=100) +"\\{icon music}" N grid_sprite("buttons.png", 8, 3, index=101) +"\\{icon sound}" N grid_sprite("buttons.png", 9, 3, index=102) +"\\{ammo shotgun}" N grid_sprite("buttons.png", 7, 1, index=103) +"\\{ammo magnums}" N grid_sprite("buttons.png", 8, 1, index=104) +"\\{ammo uzis}" N grid_sprite("buttons.png", 9, 1, index=105) +"\\{arrow up}" N grid_sprite("buttons.png", 8, 2, index=80) +"\\{arrow down}" N grid_sprite("buttons.png", 9, 2, index=81) translate(y=-2) diff --git a/data/tr2/glyphs/mapping_latin-1_supplement.txt b/data/tr2/glyphs/mapping_latin-1_supplement.txt new file mode 100644 index 000000000..d5d0efaca --- /dev/null +++ b/data/tr2/glyphs/mapping_latin-1_supplement.txt @@ -0,0 +1,93 @@ +# -------------------------------------------------- +# Unicode Block "Latin-1 Supplement" (U+0080 to U+00FF) +# -------------------------------------------------- +U+00A1:¡ N manual_sprite("glyphs.png", 32, 77, 6, 18) +U+00A2:¢ N manual_sprite("glyphs.png", 38, 77, 11, 18) +U+00A3:£ N manual_sprite("glyphs.png", 49, 77, 13, 18) +U+00A4:¤ N manual_sprite("glyphs.png", 62, 77, 12, 18) +U+00A5:¥ N manual_sprite("glyphs.png", 74, 77, 14, 18) +U+00A6:¦ N manual_sprite("glyphs.png", 88, 77, 6, 18) +U+00A7:§ N manual_sprite("glyphs.png", 94, 77, 11, 18) +U+00A9:© N manual_sprite("glyphs.png", 105, 77, 15, 18) +U+00AA:ª N manual_sprite("glyphs.png", 121, 77, 7, 18) +U+00AB:« N manual_sprite("glyphs.png", 128, 77, 9, 18) +U+00AC:¬ N manual_sprite("glyphs.png", 137, 77, 11, 18) +U+00AE:® N manual_sprite("glyphs.png", 148, 77, 15, 18) +U+00B0:° N manual_sprite("glyphs.png", 163, 77, 8, 18) +U+00B1:± N manual_sprite("glyphs.png", 171, 77, 11, 18) +U+00B2:² N manual_sprite("glyphs.png", 20, 95, 7, 9) +U+00B3:³ N manual_sprite("glyphs.png", 13, 104, 7, 9) +U+00B5:µ N manual_sprite("glyphs.png", 182, 77, 11, 18) +U+00B6:¶ N manual_sprite("glyphs.png", 193, 77, 15, 18) +U+00B7:· N manual_sprite("glyphs.png", 208, 77, 6, 18) +U+00B9:¹ N manual_sprite("glyphs.png", 13, 95, 7, 9) +U+00BA:º N manual_sprite("glyphs.png", 214, 77, 7, 18) +U+00BB:» N manual_sprite("glyphs.png", 221, 77, 9, 18) +U+00BC:¼ N manual_sprite("glyphs.png", 230, 77, 13, 18) +U+00BD:½ N manual_sprite("glyphs.png", 243, 77, 13, 18) +U+00BE:¾ N manual_sprite("glyphs.png", 0, 95, 13, 18) +U+00BF:¿ N manual_sprite("glyphs.png", 27, 95, 12, 18) +U+00C0:À C combine("A", "\\{grave accent}") +U+00C1:Á C combine("A", "\\{acute accent}") +U+00C2: C combine("A", "\\{circumflex}") +U+00C3:à C combine("A", "\\{tilde}") +U+00C4:Ä C combine("A", "\\{umlaut}") +U+00C5:Å C combine("A", "\\{ring above}") +U+00C6:Æ N manual_sprite("glyphs.png", 39, 95, 18, 18) +U+00C7:Ç N manual_sprite("glyphs.png", 57, 95, 13, 18) +U+00C8:È C combine("E", "\\{grave accent}") +U+00C9:É C combine("E", "\\{acute accent}") +U+00CA:Ê C combine("E", "\\{circumflex}") +U+00CB:Ë C combine("E", "\\{umlaut}") +U+00CC:Ì C combine("I", "\\{grave accent}") +U+00CD:Í C combine("I", "\\{acute accent}") +U+00CE:Î C combine("I", "\\{circumflex}") +U+00CF:Ï C combine("I", "\\{umlaut}") +U+00D0:Ð N manual_sprite("glyphs.png", 70, 95, 13, 18) +U+00D1:Ñ C combine("N", "\\{tilde}") +U+00D2:Ò C combine("O", "\\{grave accent}") +U+00D3:Ó C combine("O", "\\{acute accent}") +U+00D4:Ô C combine("O", "\\{circumflex}") +U+00D5:Õ C combine("O", "\\{tilde}") +U+00D6:Ö C combine("O", "\\{umlaut}") +U+00D7:× N manual_sprite("glyphs.png", 83, 95, 10, 18) +U+00D8:Ø N manual_sprite("glyphs.png", 93, 95, 14, 18) +U+00D9:Ù C combine("U", "\\{grave accent}") +U+00DA:Ú C combine("U", "\\{acute accent}") +U+00DB:Û C combine("U", "\\{circumflex}") +U+00DC:Ü C combine("U", "\\{umlaut}") +U+00DD:Ý C combine("Y", "\\{acute accent}") +U+00DE:Þ N manual_sprite("glyphs.png", 107, 95, 13, 18) +U+00DF:ß N manual_sprite("glyphs.png", 120, 95, 11, 18, index=74) +U+00E0:à C combine("a", "\\{grave accent}") +U+00E1:á C combine("a", "\\{acute accent}") +U+00E2:â C combine("a", "\\{circumflex}") +U+00E3:ã C combine("a", "\\{tilde}") +U+00E4:ä C combine("a", "\\{umlaut}") +U+00E5:å C combine("a", "\\{ring above}") +U+00E6:æ N manual_sprite("glyphs.png", 131, 95, 16, 18) +U+00E7:ç N manual_sprite("glyphs.png", 147, 95, 11, 18) +U+00E8:è C combine("e", "\\{grave accent}") +U+00E9:é C combine("e", "\\{acute accent}") +U+00EA:ê C combine("e", "\\{circumflex}") +U+00EB:ë C combine("e", "\\{umlaut}") +U+00EC:ì C combine("i", "\\{grave accent}") +U+00ED:í C combine("i", "\\{acute accent}") +U+00EE:î C combine("i", "\\{circumflex}") +U+00EF:ï C combine("i", "\\{umlaut}") +U+00F0:ð N manual_sprite("glyphs.png", 158, 95, 11, 18) +U+00F1:ñ C combine("n", "\\{tilde}") +U+00F2:ò C combine("o", "\\{grave accent}") +U+00F3:ó C combine("o", "\\{acute accent}") +U+00F4:ô C combine("o", "\\{circumflex}") +U+00F5:õ C combine("o", "\\{tilde}") +U+00F6:ö C combine("o", "\\{umlaut}") +U+00F7:÷ N manual_sprite("glyphs.png", 169, 95, 10, 18) +U+00F8:ø N manual_sprite("glyphs.png", 179, 95, 13, 18) +U+00F9:ù C combine("u", "\\{grave accent}") +U+00FA:ú C combine("u", "\\{acute accent}") +U+00FB:û C combine("u", "\\{circumflex}") +U+00FC:ü C combine("u", "\\{umlaut}") +U+00FD:ý C combine("y", "\\{acute accent}") +U+00FE:þ N manual_sprite("glyphs.png", 192, 95, 11, 18) +U+00FF:ÿ C combine("y", "\\{umlaut}") diff --git a/data/tr2/glyphs/mapping_latin_extended-a.txt b/data/tr2/glyphs/mapping_latin_extended-a.txt new file mode 100644 index 000000000..b6ceacaae --- /dev/null +++ b/data/tr2/glyphs/mapping_latin_extended-a.txt @@ -0,0 +1,128 @@ +# -------------------------------------------------- +# Unicode Block "Latin Extended-A" (U+0100 to U+017F) +# -------------------------------------------------- +U+0100:Ā C combine("A", "\\{macron}") +U+0101:ā C combine("a", "\\{macron}") +U+0102:Ă C combine("A", "\\{breve}") +U+0103:ă C combine("a", "\\{breve}") +U+0104:Ą N manual_sprite("glyphs.png", 203, 95, 17, 18) +U+0105:ą N manual_sprite("glyphs.png", 220, 95, 11, 18) +U+0106:Ć C combine("C", "\\{acute accent}") +U+0107:ć C combine("c", "\\{acute accent}") +U+0108:Ĉ C combine("C", "\\{circumflex}") +U+0109:ĉ C combine("c", "\\{circumflex}") +U+010A:Ċ C combine("C", "\\{dot above}") +U+010B:ċ C combine("c", "\\{dot above}") +U+010C:Č C combine("C", "\\{caron}") +U+010D:č C combine("c", "\\{caron}") +U+010E:Ď C combine("D", "\\{caron}") +U+010F:ď C combine("d", "\\{caron}") +U+0110:Đ N link(U+00D0:Ð) +U+0111:đ N manual_sprite("glyphs.png", 231, 95, 12, 18) +U+0112:Ē C combine("E", "\\{macron}") +U+0113:ē C combine("e", "\\{macron}") +U+0114:Ĕ C combine("E", "\\{breve}") +U+0115:ĕ C combine("e", "\\{breve}") +U+0116:Ė C combine("E", "\\{dot above}") +U+0117:ė C combine("e", "\\{dot above}") +U+0118:Ę N manual_sprite("glyphs.png", 243, 95, 13, 18) +U+0119:ę N manual_sprite("glyphs.png", 0, 113, 11, 18) +U+011A:Ě C combine("E", "\\{caron}") +U+011B:ě C combine("e", "\\{caron}") +U+011C:Ĝ C combine("G", "\\{circumflex}") +U+011D:ĝ C combine("g", "\\{circumflex}") +U+011E:Ğ C combine("G", "\\{breve}") +U+011F:ğ C combine("g", "\\{breve}") +U+0120:Ġ C combine("G", "\\{dot above}") +U+0121:ġ C combine("g", "\\{dot above}") +U+0122:Ģ N manual_sprite("glyphs.png", 11, 113, 13, 18) +U+0123:ģ N manual_sprite("glyphs.png", 24, 113, 11, 18) +U+0124:Ĥ C combine("H", "\\{circumflex}") +U+0125:ĥ C combine("h", "\\{circumflex}") +U+0126:Ħ N manual_sprite("glyphs.png", 35, 113, 15, 18) +U+0127:ħ N manual_sprite("glyphs.png", 50, 113, 12, 18) +U+0128:Ĩ C combine("I", "\\{tilde}") +U+0129:ĩ C combine("i", "\\{tilde}") +U+012A:Ī C combine("I", "\\{macron}") +U+012B:ī C combine("i", "\\{macron}") +U+012C:Ĭ C combine("I", "\\{breve}") +U+012D:ĭ C combine("i", "\\{breve}") +U+012E:Į N manual_sprite("glyphs.png", 62, 113, 10, 18) +U+012F:į N manual_sprite("glyphs.png", 72, 113, 7, 18) +U+0130:İ C combine("I", "\\{dot above}") +U+0131:ı N manual_sprite("glyphs.png", 79, 113, 7, 18) +U+0134:Ĵ C combine("J", "\\{circumflex}") +U+0135:ĵ C combine("j", "\\{circumflex}") +U+0136:Ķ N manual_sprite("glyphs.png", 86, 113, 14, 18) +U+0137:ķ N manual_sprite("glyphs.png", 100, 113, 12, 18) +U+0138:ĸ N manual_sprite("glyphs.png", 112, 113, 11, 18) +U+0139:Ĺ C combine("L", "\\{acute accent}") +U+013A:ĺ C combine("l", "\\{acute accent}") +U+013B:Ļ N manual_sprite("glyphs.png", 123, 113, 13, 18) +U+013C:ļ N manual_sprite("glyphs.png", 136, 113, 7, 18) +U+013D:Ľ C combine("L", "\\{caron}") +U+013E:ľ C combine("l", "\\{caron}") +U+013F:Ŀ C combine("L", U+00B7:·, align="middle", offset_x=3, offset_y=-1) +U+0140:ŀ C combine("l", U+00B7:·, align="middle", offset_x=3, offset_y=-1) +U+0141:Ł N manual_sprite("glyphs.png", 143, 113, 14, 18) +U+0142:ł N manual_sprite("glyphs.png", 157, 113, 10, 18) +U+0143:Ń C combine("N", "\\{acute accent}") +U+0144:ń C combine("n", "\\{acute accent}") +U+0145:Ņ N manual_sprite("glyphs.png", 167, 113, 15, 18) +U+0146:ņ N manual_sprite("glyphs.png", 182, 113, 12, 18) +U+0147:Ň C combine("N", "\\{caron}") +U+0148:ň C combine("n", "\\{caron}") +U+0149:ʼn C combine("n", "\\{acute accent}", offset_x=-2) +U+014A:Ŋ N manual_sprite("glyphs.png", 194, 113, 15, 18) +U+014B:ŋ N manual_sprite("glyphs.png", 209, 113, 12, 18) +U+014C:Ō C combine("O", "\\{macron}") +U+014D:ō C combine("o", "\\{macron}") +U+014E:Ŏ C combine("O", "\\{breve}") +U+014F:ŏ C combine("o", "\\{breve}") +U+0150:Ő C combine("O", "\\{double acute accent}") +U+0151:ő C combine("o", "\\{double acute accent}") +U+0152:Œ N manual_sprite("glyphs.png", 221, 113, 18, 18) +U+0153:œ N manual_sprite("glyphs.png", 239, 113, 16, 18) +U+0154:Ŕ C combine("R", "\\{acute accent}") +U+0155:ŕ C combine("r", "\\{acute accent}") +U+0156:Ŗ N manual_sprite("glyphs.png", 0, 131, 14, 18) +U+0157:ŗ N manual_sprite("glyphs.png", 14, 131, 10, 18) +U+0158:Ř C combine("R", "\\{caron}") +U+0159:ř C combine("r", "\\{caron}") +U+015A:Ś C combine("S", "\\{acute accent}") +U+015B:ś C combine("s", "\\{acute accent}") +U+015C:Ŝ C combine("S", "\\{circumflex}") +U+015D:ŝ C combine("s", "\\{circumflex}") +U+015E:Ş N manual_sprite("glyphs.png", 24, 131, 13, 18) +U+015F:ş N manual_sprite("glyphs.png", 37, 131, 11, 18) +U+0160:Š C combine("S", "\\{caron}") +U+0161:š C combine("s", "\\{caron}") +U+0162:Ţ N manual_sprite("glyphs.png", 48, 131, 14, 18) +U+0163:ţ N manual_sprite("glyphs.png", 62, 131, 10, 18) +U+0164:Ť C combine("T", "\\{caron}") +U+0165:ť C combine("t", "\\{caron}") +U+0166:Ŧ N manual_sprite("glyphs.png", 72, 131, 14, 18) +U+0167:ŧ N manual_sprite("glyphs.png", 86, 131, 11, 18) +U+0168:Ũ C combine("U", "\\{tilde}") +U+0169:ũ C combine("u", "\\{tilde}") +U+016A:Ū C combine("U", "\\{macron}") +U+016B:ū C combine("u", "\\{macron}") +U+016C:Ŭ C combine("U", "\\{breve}") +U+016D:ŭ C combine("u", "\\{breve}") +U+016E:Ů C combine("U", "\\{ring above}") +U+016F:ů C combine("u", "\\{ring above}") +U+0170:Ű C combine("U", "\\{double acute accent}") +U+0171:ű C combine("u", "\\{double acute accent}") +U+0172:Ų N manual_sprite("glyphs.png", 97, 131, 15, 18) +U+0173:ų N manual_sprite("glyphs.png", 112, 131, 11, 18) +U+0174:Ŵ C combine("W", "\\{circumflex}") +U+0175:ŵ C combine("w", "\\{circumflex}") +U+0176:Ŷ C combine("Y", "\\{circumflex}") +U+0177:ŷ C combine("y", "\\{circumflex}") +U+0178:Ÿ C combine("Y", "\\{umlaut}") +U+0179:Ź C combine("Z", "\\{acute accent}") +U+017A:ź C combine("z", "\\{acute accent}") +U+017B:Ż C combine("Z", "\\{dot above}") +U+017C:ż C combine("z", "\\{dot above}") +U+017D:Ž C combine("Z", "\\{caron}") +U+017E:ž C combine("z", "\\{caron}") diff --git a/data/tr2/glyphs/mapping_latin_extended-b.txt b/data/tr2/glyphs/mapping_latin_extended-b.txt new file mode 100644 index 000000000..cc95bd665 --- /dev/null +++ b/data/tr2/glyphs/mapping_latin_extended-b.txt @@ -0,0 +1,33 @@ +# -------------------------------------------------- +# Unicode Block "Latin Extended-B" (U+0180 to U+024F) +# -------------------------------------------------- +U+0192:ƒ N manual_sprite("glyphs.png", 123, 131, 11, 18) +U+01CD:Ǎ C combine("A", "\\{caron}") +U+01CE:ǎ C combine("a", "\\{caron}") +U+01CF:Ǐ C combine("I", "\\{caron}") +U+01D0:ǐ C combine("i", "\\{caron}") +U+01D1:Ǒ C combine("O", "\\{caron}") +U+01D2:ǒ C combine("o", "\\{caron}") +U+01D3:Ǔ C combine("U", "\\{caron}") +U+01D4:ǔ C combine("u", "\\{caron}") +U+01E6:Ǧ C combine("G", "\\{caron}") +U+01E7:ǧ C combine("g", "\\{caron}") +U+01E8:Ǩ C combine("K", "\\{caron}") +U+01E9:ǩ C combine("k", "\\{caron}") +U+01F0:ǰ C combine("j", "\\{caron}") +U+01F4:Ǵ C combine("G", "\\{acute accent}") +U+01F5:ǵ C combine("g", "\\{acute accent}") +U+01F8:Ǹ C combine("N", "\\{grave accent}") +U+01F9:ǹ C combine("n", "\\{grave accent}") +U+021E:Ȟ C combine("H", "\\{caron}") +U+021F:ȟ C combine("h", "\\{caron}") +U+0226:Ȧ C combine("A", "\\{dot above}") +U+0227:ȧ C combine("a", "\\{dot above}") +U+022E:Ȯ C combine("O", "\\{dot above}") +U+022F:ȯ C combine("o", "\\{dot above}") +U+0232:Ȳ C combine("Y", "\\{macron}") +U+0233:ȳ C combine("y", "\\{macron}") +U+0218:Ș N manual_sprite("glyphs.png", 134, 131, 13, 18) +U+0219:ș N manual_sprite("glyphs.png", 147, 131, 11, 18) +U+021A:Ț N manual_sprite("glyphs.png", 158, 131, 14, 18) +U+021B:ț N manual_sprite("glyphs.png", 172, 131, 11, 18) diff --git a/data/tr2/glyphs/mapping_latin_extended_additional.txt b/data/tr2/glyphs/mapping_latin_extended_additional.txt new file mode 100644 index 000000000..051dfa73e --- /dev/null +++ b/data/tr2/glyphs/mapping_latin_extended_additional.txt @@ -0,0 +1,60 @@ +# -------------------------------------------------- +# Unicode Block "Latin Extended Additional" (U+1E00 to U+1EFF) +# -------------------------------------------------- +U+1E02:Ḃ C combine("B", "\\{dot above}") +U+1E03:ḃ C combine("b", "\\{dot above}") +U+1E0A:Ḋ C combine("D", "\\{dot above}") +U+1E0B:ḋ C combine("d", "\\{dot above}") +U+1E1E:Ḟ C combine("F", "\\{dot above}") +U+1E1F:ḟ C combine("f", "\\{dot above}") +U+1E20:Ḡ C combine("G", "\\{macron}") +U+1E21:ḡ C combine("g", "\\{macron}") +U+1E22:Ḣ C combine("H", "\\{dot above}") +U+1E23:ḣ C combine("h", "\\{dot above}") +U+1E26:Ḧ C combine("H", "\\{umlaut}") +U+1E27:ḧ C combine("h", "\\{umlaut}") +U+1E30:Ḱ C combine("K", "\\{acute accent}") +U+1E31:ḱ C combine("k", "\\{acute accent}") +U+1E3E:Ḿ C combine("M", "\\{acute accent}") +U+1E3F:ḿ C combine("m", "\\{acute accent}") +U+1E40:Ṁ C combine("M", "\\{dot above}") +U+1E41:ṁ C combine("m", "\\{dot above}") +U+1E44:Ṅ C combine("N", "\\{dot above}") +U+1E45:ṅ C combine("n", "\\{dot above}") +U+1E54:Ṕ C combine("P", "\\{acute accent}") +U+1E55:ṕ C combine("p", "\\{acute accent}") +U+1E56:Ṗ C combine("P", "\\{dot above}") +U+1E57:ṗ C combine("p", "\\{dot above}") +U+1E58:Ṙ C combine("R", "\\{dot above}") +U+1E59:ṙ C combine("r", "\\{dot above}") +U+1E60:Ṡ C combine("S", "\\{dot above}") +U+1E61:ṡ C combine("s", "\\{dot above}") +U+1E6A:Ṫ C combine("T", "\\{dot above}") +U+1E6B:ṫ C combine("t", "\\{dot above}") +U+1E7C:Ṽ C combine("V", "\\{tilde}") +U+1E7D:ṽ C combine("v", "\\{tilde}") +U+1E80:Ẁ C combine("W", "\\{grave accent}") +U+1E81:ẁ C combine("w", "\\{grave accent}") +U+1E82:Ẃ C combine("W", "\\{acute accent}") +U+1E83:ẃ C combine("w", "\\{acute accent}") +U+1E84:Ẅ C combine("W", "\\{umlaut}") +U+1E85:ẅ C combine("w", "\\{umlaut}") +U+1E86:Ẇ C combine("W", "\\{dot above}") +U+1E87:ẇ C combine("w", "\\{dot above}") +U+1E8A:Ẋ C combine("X", "\\{dot above}") +U+1E8B:ẋ C combine("x", "\\{dot above}") +U+1E8C:Ẍ C combine("X", "\\{umlaut}") +U+1E8D:ẍ C combine("x", "\\{umlaut}") +U+1E8E:Ẏ C combine("Y", "\\{dot above}") +U+1E8F:ẏ C combine("y", "\\{dot above}") +U+1E90:Ẑ C combine("Z", "\\{circumflex}") +U+1E91:ẑ C combine("z", "\\{circumflex}") +U+1E97:ẗ C combine("t", "\\{umlaut}") +U+1E98:ẘ C combine("w", "\\{ring above}") +U+1E99:ẙ C combine("y", "\\{ring above}") +U+1EBC:Ẽ C combine("E", "\\{tilde}") +U+1EBD:ẽ C combine("e", "\\{tilde}") +U+1EF2:Ỳ C combine("Y", "\\{grave accent}") +U+1EF3:ỳ C combine("y", "\\{grave accent}") +U+1EF8:Ỹ C combine("Y", "\\{tilde}") +U+1EF9:ỹ C combine("y", "\\{tilde}") diff --git a/data/tr2/glyphs/mapping_misc.txt b/data/tr2/glyphs/mapping_misc.txt new file mode 100644 index 000000000..422e9e997 --- /dev/null +++ b/data/tr2/glyphs/mapping_misc.txt @@ -0,0 +1,47 @@ +# -------------------------------------------------- +# Unicode Block "General Punctuation" (U+2000 to U+206F) +# -------------------------------------------------- +U+2013:– N manual_sprite("glyphs.png", 35, 221, 11, 18) +U+2014:— N manual_sprite("glyphs.png", 46, 221, 18, 18) +U+2018:‘ N manual_sprite("glyphs.png", 64, 221, 6, 9) +U+2019:’ N manual_sprite("glyphs.png", 64, 230, 6, 9) +U+201C:“ N manual_sprite("glyphs.png", 70, 221, 9, 9) +U+201D:” N manual_sprite("glyphs.png", 70, 230, 9, 9) +U+2020:† N manual_sprite("glyphs.png", 80, 221, 10, 18) +U+2021:‡ N manual_sprite("glyphs.png", 90, 221, 10, 18) +U+2022:• N manual_sprite("glyphs.png", 100, 221, 8, 18) +U+2026:… N manual_sprite("glyphs.png", 108, 221, 12, 18) +U+2030:‰ N manual_sprite("glyphs.png", 120, 221, 16, 18) +U+2039:‹ N manual_sprite("glyphs.png", 137, 221, 7, 18) +U+203A:› N manual_sprite("glyphs.png", 144, 221, 7, 18) + + + +# -------------------------------------------------- +# Unicode Block "Superscripts and Subscripts" (U+2070 to U+209F) +# -------------------------------------------------- +U+2074:⁴ N manual_sprite("glyphs.png", 20, 104, 7, 9) + + + +# -------------------------------------------------- +# Unicode Block "Currency Symbols" (U+20A0 to U+20CF) +# -------------------------------------------------- +U+20AC:€ N manual_sprite("glyphs.png", 170, 221, 14, 18) +U+20AF:₯ N manual_sprite("glyphs.png", 151, 221, 19, 18) + + + +# -------------------------------------------------- +# Unicode Block "Letterlike Symbols" (U+2100 to U+214F) +# -------------------------------------------------- +U+2116:№ N manual_sprite("glyphs.png", 184, 221, 18, 18) +U+2122:™ N manual_sprite("glyphs.png", 203, 221, 18, 18) + + + +# -------------------------------------------------- +# Unicode Block "Alphabetic Presentation Forms" (U+FB00 to U+FB4F) +# -------------------------------------------------- +U+FB01:fi N manual_sprite("glyphs.png", 221, 221, 13, 18) +U+FB02:fl N manual_sprite("glyphs.png", 234, 221, 13, 18) diff --git a/data/tr2/ship/cfg/TR2X_gameflow.json5 b/data/tr2/ship/cfg/TR2X_gameflow.json5 index 6d8b7fdcc..94a66d933 100644 --- a/data/tr2/ship/cfg/TR2X_gameflow.json5 +++ b/data/tr2/ship/cfg/TR2X_gameflow.json5 @@ -31,6 +31,10 @@ ], }, + "injections": [ + "data/injections/font.bin", + ], + "levels": [ // 0. Lara's Home { diff --git a/data/tr2/ship/cfg/TR2X_gameflow_level.json5 b/data/tr2/ship/cfg/TR2X_gameflow_level.json5 index 2634d61fc..4083ae9e8 100644 --- a/data/tr2/ship/cfg/TR2X_gameflow_level.json5 +++ b/data/tr2/ship/cfg/TR2X_gameflow_level.json5 @@ -19,6 +19,10 @@ "demo_delay": 30, "secret_track": 47, + "injections": [ + "data/injections/font.bin", + ], + "levels": [ { "path": "PLACEHOLDER", diff --git a/data/tr2/ship/data/injections/font.bin b/data/tr2/ship/data/injections/font.bin new file mode 100644 index 0000000000000000000000000000000000000000..f7127feaeb19eedebb87c692b5dc12278f9b698d GIT binary patch literal 37276 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%0A7?GHU4uv`D1gWtB+ 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 XfiL;E|2d_8J-&YGFZnIk=T!j!kTll* literal 0 HcmV?d00001 diff --git a/docs/tr1/README.md b/docs/tr1/README.md index cb459ed95..c8d845961 100644 --- a/docs/tr1/README.md +++ b/docs/tr1/README.md @@ -367,6 +367,7 @@ Not all options are turned on by default. Refer to `TR1X_ConfigTool.exe` for det #### UI - added proper UI and bar scaling +- added support for more accented characters - added enemy health bars - added PS1 style UI - added fade effects to displayed images diff --git a/docs/tr2/CHANGELOG.md b/docs/tr2/CHANGELOG.md index ff47e6308..05ce3a5e8 100644 --- a/docs/tr2/CHANGELOG.md +++ b/docs/tr2/CHANGELOG.md @@ -1,10 +1,11 @@ ## [Unreleased](https://github.com/LostArtefacts/TRX/compare/tr2-0.9.2...develop) - ××××-××-×× -- added Italian localization to the config tool - added support for 60 FPS rendering +- added support for more accented characters (#2356) - added a `/cheats` console command - added a `/wireframe` console command (#2500) - added a `/fps` console command - added support for `-l`/`--level` argument to play a single level +- added Italian localization to the config tool - changed injections to a new file format with a smaller footprint, improved applicability tests and similar feature support as TR1 (#1967) - fixed smashed windows blocking enemy pathing after loading a save (#2535) - fixed several instances of the camera going out of bounds (#1034) diff --git a/docs/tr2/README.md b/docs/tr2/README.md index e1a6c43bb..1a7001859 100644 --- a/docs/tr2/README.md +++ b/docs/tr2/README.md @@ -30,6 +30,12 @@ game with new enhancements and features. ## Improvements over original game +#### UI +- added support for more accented characters +- added fade effects to displayed images +- added a wireframe mode +- improved support for windowed mode + #### Gameplay - added an option to fix M16 accuracy while running - added optional rendering of pickups in the UI as 3D meshes diff --git a/src/libtrx/game/text.def b/src/libtrx/game/text.def index 311e9d925..9af3bf028 100644 --- a/src/libtrx/game/text.def +++ b/src/libtrx/game/text.def @@ -2,4 +2,7 @@ #include "text_tr1.def" #elif TR_VERSION == 2 #include "text_tr2.def" + GLYPH_DEFINE("\\{secret 1}", GLYPH_SECRET, 16, 0) + GLYPH_DEFINE("\\{secret 2}", GLYPH_SECRET, 16, 1) + GLYPH_DEFINE("\\{secret 3}", GLYPH_SECRET, 16, 2) #endif diff --git a/src/libtrx/game/text_tr2.def b/src/libtrx/game/text_tr2.def index 7306b9bc3..3ca2852cb 100644 --- a/src/libtrx/game/text_tr2.def +++ b/src/libtrx/game/text_tr2.def @@ -1,6 +1,33 @@ +// This file is autogenerated. See tools/glyphs/generate_defs for details. + GLYPH_DEFINE("\n", GLYPH_NEWLINE, 0, -1) GLYPH_DEFINE(" ", GLYPH_SPACE, 0, -1) - +GLYPH_DEFINE("a", GLYPH_NORMAL, 9, 26) +GLYPH_DEFINE("b", GLYPH_NORMAL, 9, 27) +GLYPH_DEFINE("c", GLYPH_NORMAL, 9, 28) +GLYPH_DEFINE("d", GLYPH_NORMAL, 9, 29) +GLYPH_DEFINE("e", GLYPH_NORMAL, 9, 30) +GLYPH_DEFINE("f", GLYPH_NORMAL, 9, 31) +GLYPH_DEFINE("g", GLYPH_NORMAL, 9, 32) +GLYPH_DEFINE("h", GLYPH_NORMAL, 9, 33) +GLYPH_DEFINE("i", GLYPH_NORMAL, 5, 34) +GLYPH_DEFINE("j", GLYPH_NORMAL, 9, 35) +GLYPH_DEFINE("k", GLYPH_NORMAL, 10, 36) +GLYPH_DEFINE("l", GLYPH_NORMAL, 5, 37) +GLYPH_DEFINE("m", GLYPH_NORMAL, 12, 38) +GLYPH_DEFINE("n", GLYPH_NORMAL, 10, 39) +GLYPH_DEFINE("o", GLYPH_NORMAL, 9, 40) +GLYPH_DEFINE("p", GLYPH_NORMAL, 9, 41) +GLYPH_DEFINE("q", GLYPH_NORMAL, 9, 42) +GLYPH_DEFINE("r", GLYPH_NORMAL, 8, 43) +GLYPH_DEFINE("s", GLYPH_NORMAL, 9, 44) +GLYPH_DEFINE("t", GLYPH_NORMAL, 9, 45) +GLYPH_DEFINE("u", GLYPH_NORMAL, 9, 46) +GLYPH_DEFINE("v", GLYPH_NORMAL, 9, 47) +GLYPH_DEFINE("w", GLYPH_NORMAL, 11, 48) +GLYPH_DEFINE("x", GLYPH_NORMAL, 9, 49) +GLYPH_DEFINE("y", GLYPH_NORMAL, 9, 50) +GLYPH_DEFINE("z", GLYPH_NORMAL, 9, 51) GLYPH_DEFINE("A", GLYPH_NORMAL, 14, 0) GLYPH_DEFINE("B", GLYPH_NORMAL, 11, 1) GLYPH_DEFINE("C", GLYPH_NORMAL, 11, 2) @@ -9,7 +36,7 @@ GLYPH_DEFINE("E", GLYPH_NORMAL, 11, 4) GLYPH_DEFINE("F", GLYPH_NORMAL, 11, 5) GLYPH_DEFINE("G", GLYPH_NORMAL, 11, 6) GLYPH_DEFINE("H", GLYPH_NORMAL, 13, 7) -GLYPH_DEFINE("I", GLYPH_NORMAL, 8, 8) +GLYPH_DEFINE("I", GLYPH_NORMAL, 8, 8) GLYPH_DEFINE("J", GLYPH_NORMAL, 11, 9) GLYPH_DEFINE("K", GLYPH_NORMAL, 12, 10) GLYPH_DEFINE("L", GLYPH_NORMAL, 11, 11) @@ -27,93 +54,577 @@ GLYPH_DEFINE("W", GLYPH_NORMAL, 13, 22) GLYPH_DEFINE("X", GLYPH_NORMAL, 12, 23) GLYPH_DEFINE("Y", GLYPH_NORMAL, 12, 24) GLYPH_DEFINE("Z", GLYPH_NORMAL, 11, 25) -GLYPH_DEFINE("a", GLYPH_NORMAL, 9, 26) -GLYPH_DEFINE("b", GLYPH_NORMAL, 9, 27) -GLYPH_DEFINE("c", GLYPH_NORMAL, 9, 28) -GLYPH_DEFINE("d", GLYPH_NORMAL, 9, 29) -GLYPH_DEFINE("e", GLYPH_NORMAL, 9, 30) -GLYPH_DEFINE("f", GLYPH_NORMAL, 9, 31) -GLYPH_DEFINE("g", GLYPH_NORMAL, 9, 32) -GLYPH_DEFINE("h", GLYPH_NORMAL, 9, 33) -GLYPH_DEFINE("i", GLYPH_NORMAL, 5, 34) -GLYPH_DEFINE("j", GLYPH_NORMAL, 9, 35) -GLYPH_DEFINE("k", GLYPH_NORMAL, 9, 36) -GLYPH_DEFINE("l", GLYPH_NORMAL, 5, 37) -GLYPH_DEFINE("m", GLYPH_NORMAL, 12, 38) -GLYPH_DEFINE("n", GLYPH_NORMAL, 10, 39) -GLYPH_DEFINE("o", GLYPH_NORMAL, 9, 40) -GLYPH_DEFINE("p", GLYPH_NORMAL, 9, 41) -GLYPH_DEFINE("q", GLYPH_NORMAL, 9, 42) -GLYPH_DEFINE("r", GLYPH_NORMAL, 8, 43) -GLYPH_DEFINE("s", GLYPH_NORMAL, 9, 44) -GLYPH_DEFINE("t", GLYPH_NORMAL, 8, 45) -GLYPH_DEFINE("u", GLYPH_NORMAL, 9, 46) -GLYPH_DEFINE("v", GLYPH_NORMAL, 9, 47) -GLYPH_DEFINE("w", GLYPH_NORMAL, 11, 48) -GLYPH_DEFINE("x", GLYPH_NORMAL, 9, 49) -GLYPH_DEFINE("y", GLYPH_NORMAL, 9, 50) -GLYPH_DEFINE("z", GLYPH_NORMAL, 9, 51) GLYPH_DEFINE("0", GLYPH_NORMAL, 12, 52) -GLYPH_DEFINE("1", GLYPH_NORMAL, 8, 53) +GLYPH_DEFINE("1", GLYPH_NORMAL, 8, 53) GLYPH_DEFINE("2", GLYPH_NORMAL, 10, 54) GLYPH_DEFINE("3", GLYPH_NORMAL, 10, 55) GLYPH_DEFINE("4", GLYPH_NORMAL, 10, 56) GLYPH_DEFINE("5", GLYPH_NORMAL, 10, 57) GLYPH_DEFINE("6", GLYPH_NORMAL, 10, 58) -GLYPH_DEFINE("7", GLYPH_NORMAL, 9, 59) +GLYPH_DEFINE("7", GLYPH_NORMAL, 9, 59) GLYPH_DEFINE("8", GLYPH_NORMAL, 10, 60) GLYPH_DEFINE("9", GLYPH_NORMAL, 10, 61) - -GLYPH_DEFINE(".", GLYPH_NORMAL, 5, 62) -GLYPH_DEFINE(",", GLYPH_NORMAL, 5, 63) -GLYPH_DEFINE("!", GLYPH_NORMAL, 5, 64) -GLYPH_DEFINE("?", GLYPH_NORMAL, 11, 65) -GLYPH_DEFINE("\"", GLYPH_NORMAL, 9, 66) -GLYPH_DEFINE("\\{umlaut}", GLYPH_COMBINING, 10, 67) -GLYPH_DEFINE("/", GLYPH_NORMAL, 8, 68) -GLYPH_DEFINE("\\{hat}", GLYPH_COMBINING, 6, 69) -GLYPH_DEFINE("\\{acute accent}", GLYPH_COMBINING, 6, 70) -GLYPH_DEFINE("-", GLYPH_NORMAL, 7, 71) -GLYPH_DEFINE("=", GLYPH_NORMAL, 7, 72) -GLYPH_DEFINE(":", GLYPH_NORMAL, 3, 73) -GLYPH_DEFINE("ß", GLYPH_NORMAL, 11, 74) -GLYPH_DEFINE("+", GLYPH_NORMAL, 8, 75) -GLYPH_DEFINE("©", GLYPH_NORMAL, 13, 76) -GLYPH_DEFINE("\\{grave accent}", GLYPH_COMBINING, 16, 77) -GLYPH_DEFINE("&", GLYPH_NORMAL, 9, 78) -GLYPH_DEFINE("'", GLYPH_NORMAL, 4, 79) - -GLYPH_DEFINE("\\{arrow up}", GLYPH_NORMAL, 12, 80) -GLYPH_DEFINE("\\{arrow down}", GLYPH_NORMAL, 12, 81) -GLYPH_DEFINE("\\{small digit 0}", GLYPH_NORMAL, 7, 82) -GLYPH_DEFINE("\\{small digit 1}", GLYPH_NORMAL, 5, 83) -GLYPH_DEFINE("\\{small digit 2}", GLYPH_NORMAL, 7, 84) -GLYPH_DEFINE("\\{small digit 3}", GLYPH_NORMAL, 7, 85) -GLYPH_DEFINE("\\{small digit 4}", GLYPH_NORMAL, 7, 86) -GLYPH_DEFINE("\\{small digit 5}", GLYPH_NORMAL, 7, 87) -GLYPH_DEFINE("\\{small digit 6}", GLYPH_NORMAL, 7, 88) -GLYPH_DEFINE("\\{small digit 7}", GLYPH_NORMAL, 7, 89) -GLYPH_DEFINE("\\{small digit 8}", GLYPH_NORMAL, 7, 90) -GLYPH_DEFINE("\\{small digit 9}", GLYPH_NORMAL, 7, 91) -GLYPH_DEFINE("\\{button empty}", GLYPH_NORMAL, 16, 92) -GLYPH_DEFINE("\\{button triangle}", GLYPH_NORMAL, 16, 93) -GLYPH_DEFINE("\\{button circle}", GLYPH_NORMAL, 16, 94) -GLYPH_DEFINE("\\{button x}", GLYPH_NORMAL, 16, 95) -GLYPH_DEFINE("\\{button square}", GLYPH_NORMAL, 16, 96) -GLYPH_DEFINE("\\{button l1}", GLYPH_NORMAL, 16, 97) -GLYPH_DEFINE("\\{button r1}", GLYPH_NORMAL, 16, 98) -GLYPH_DEFINE("\\{button l2}", GLYPH_NORMAL, 16, 99) -GLYPH_DEFINE("\\{button r2}", GLYPH_NORMAL, 16, 100) -GLYPH_DEFINE("\\{icon music}", GLYPH_NORMAL, 14, 101) -GLYPH_DEFINE("\\{icon sound}", GLYPH_NORMAL, 12, 102) -GLYPH_DEFINE("\\{ammo shotgun}", GLYPH_NORMAL, 8, 103) -GLYPH_DEFINE("\\{ammo magnums}", GLYPH_NORMAL, 8, 104) -GLYPH_DEFINE("\\{ammo uzis}", GLYPH_NORMAL, 8, 105) -GLYPH_DEFINE("\\{button down}", GLYPH_NORMAL, 8, 106) -GLYPH_DEFINE("\\{button up}", GLYPH_NORMAL, 8, 107) -GLYPH_DEFINE("\\{button left}", GLYPH_NORMAL, 8, 108) -GLYPH_DEFINE("\\{button right}", GLYPH_NORMAL, 8, 109) - -GLYPH_DEFINE("\\{secret 1}", GLYPH_SECRET, 16, 0) -GLYPH_DEFINE("\\{secret 2}", GLYPH_SECRET, 16, 1) -GLYPH_DEFINE("\\{secret 3}", GLYPH_SECRET, 16, 2) +GLYPH_DEFINE("!", GLYPH_NORMAL, 4, 64) +GLYPH_DEFINE("\"", GLYPH_NORMAL, 7, 110) +GLYPH_DEFINE("#", GLYPH_NORMAL, 12, 78) +GLYPH_DEFINE("$", GLYPH_NORMAL, 9, 111) +GLYPH_DEFINE("%", GLYPH_NORMAL, 11, 112) +GLYPH_DEFINE("&", GLYPH_NORMAL, 9, 113) +GLYPH_DEFINE("'", GLYPH_NORMAL, 4, 79) +GLYPH_DEFINE("(", GLYPH_NORMAL, 5, 114) +GLYPH_DEFINE(")", GLYPH_NORMAL, 7, 115) +GLYPH_DEFINE("*", GLYPH_NORMAL, 7, 116) +GLYPH_DEFINE("+", GLYPH_NORMAL, 9, 72) +GLYPH_DEFINE(",", GLYPH_NORMAL, 4, 63) +GLYPH_DEFINE("-", GLYPH_NORMAL, 7, 71) +GLYPH_DEFINE(".", GLYPH_NORMAL, 4, 62) +GLYPH_DEFINE("/", GLYPH_NORMAL, 7, 68) +GLYPH_DEFINE(":", GLYPH_NORMAL, 4, 73) +GLYPH_DEFINE(";", GLYPH_NORMAL, 4, 117) +GLYPH_DEFINE("<", GLYPH_NORMAL, 7, 118) +GLYPH_DEFINE("=", GLYPH_NORMAL, 7, 119) +GLYPH_DEFINE(">", GLYPH_NORMAL, 7, 120) +GLYPH_DEFINE("?", GLYPH_NORMAL, 10, 65) +GLYPH_DEFINE("@", GLYPH_NORMAL, 10, 121) +GLYPH_DEFINE("[", GLYPH_NORMAL, 6, 66) +GLYPH_DEFINE("\\", GLYPH_NORMAL, 7, 76) +GLYPH_DEFINE("]", GLYPH_NORMAL, 6, 75) +GLYPH_DEFINE("^", GLYPH_NORMAL, 7, 122) +GLYPH_DEFINE("_", GLYPH_NORMAL, 9, 123) +GLYPH_DEFINE("`", GLYPH_NORMAL, 5, 124) +GLYPH_DEFINE("{", GLYPH_NORMAL, 6, 125) +GLYPH_DEFINE("|", GLYPH_NORMAL, 4, 126) +GLYPH_DEFINE("}", GLYPH_NORMAL, 6, 127) +GLYPH_DEFINE("~", GLYPH_NORMAL, 8, 128) +GLYPH_DEFINE("\\{small digit 0}", GLYPH_NORMAL, 8, 82) +GLYPH_DEFINE("\\{small digit 1}", GLYPH_NORMAL, 4, 83) +GLYPH_DEFINE("\\{small digit 2}", GLYPH_NORMAL, 8, 84) +GLYPH_DEFINE("\\{small digit 3}", GLYPH_NORMAL, 8, 85) +GLYPH_DEFINE("\\{small digit 4}", GLYPH_NORMAL, 8, 86) +GLYPH_DEFINE("\\{small digit 5}", GLYPH_NORMAL, 8, 87) +GLYPH_DEFINE("\\{small digit 6}", GLYPH_NORMAL, 8, 88) +GLYPH_DEFINE("\\{small digit 7}", GLYPH_NORMAL, 8, 89) +GLYPH_DEFINE("\\{small digit 8}", GLYPH_NORMAL, 8, 90) +GLYPH_DEFINE("\\{small digit 9}", GLYPH_NORMAL, 8, 91) +GLYPH_DEFINE("\\{button down}", GLYPH_NORMAL, 11, 106) +GLYPH_DEFINE("\\{button up}", GLYPH_NORMAL, 11, 107) +GLYPH_DEFINE("\\{button left}", GLYPH_NORMAL, 13, 108) +GLYPH_DEFINE("\\{button right}", GLYPH_NORMAL, 13, 109) +GLYPH_DEFINE("\\{button triangle}", GLYPH_NORMAL, 15, 93) +GLYPH_DEFINE("\\{button circle}", GLYPH_NORMAL, 15, 94) +GLYPH_DEFINE("\\{button x}", GLYPH_NORMAL, 15, 95) +GLYPH_DEFINE("\\{button square}", GLYPH_NORMAL, 15, 96) +GLYPH_DEFINE("\\{button empty}", GLYPH_NORMAL, 16, 92) +GLYPH_DEFINE("\\{button l1}", GLYPH_NORMAL, 16, 97) +GLYPH_DEFINE("\\{button r1}", GLYPH_NORMAL, 16, 98) +GLYPH_DEFINE("\\{button l2}", GLYPH_NORMAL, 16, 99) +GLYPH_DEFINE("\\{button r2}", GLYPH_NORMAL, 16, 100) +GLYPH_DEFINE("\\{icon music}", GLYPH_NORMAL, 12, 101) +GLYPH_DEFINE("\\{icon sound}", GLYPH_NORMAL, 14, 102) +GLYPH_DEFINE("\\{ammo shotgun}", GLYPH_NORMAL, 8, 103) +GLYPH_DEFINE("\\{ammo magnums}", GLYPH_NORMAL, 8, 104) +GLYPH_DEFINE("\\{ammo uzis}", GLYPH_NORMAL, 8, 105) +GLYPH_DEFINE("\\{arrow up}", GLYPH_NORMAL, 15, 80) +GLYPH_DEFINE("\\{arrow down}", GLYPH_NORMAL, 15, 81) +GLYPH_DEFINE("\\{grave accent}", GLYPH_COMBINING, 0, 77) +GLYPH_DEFINE("\\{acute accent}", GLYPH_COMBINING, 0, 70) +GLYPH_DEFINE("\\{circumflex accent}", GLYPH_COMBINING, 0, 69) +GLYPH_DEFINE("\\{circumflex}", GLYPH_NORMAL, 7, 69) +GLYPH_DEFINE("\\{macron}", GLYPH_COMBINING, 0, 129) +GLYPH_DEFINE("\\{breve}", GLYPH_COMBINING, 0, 130) +GLYPH_DEFINE("\\{dot above}", GLYPH_COMBINING, 0, 131) +GLYPH_DEFINE("\\{umlaut}", GLYPH_COMBINING, 0, 67) +GLYPH_DEFINE("\\{caron}", GLYPH_COMBINING, 0, 132) +GLYPH_DEFINE("\\{ring above}", GLYPH_COMBINING, 0, 133) +GLYPH_DEFINE("\\{tilde}", GLYPH_COMBINING, 0, 134) +GLYPH_DEFINE("\\{double acute accent}", GLYPH_COMBINING, 0, 135) +GLYPH_DEFINE("\\{acute umlaut}", GLYPH_COMBINING, 0, 136) +GLYPH_DEFINE("¡", GLYPH_NORMAL, 4, 137) +GLYPH_DEFINE("¢", GLYPH_NORMAL, 9, 138) +GLYPH_DEFINE("£", GLYPH_NORMAL, 11, 139) +GLYPH_DEFINE("¤", GLYPH_NORMAL, 10, 140) +GLYPH_DEFINE("¥", GLYPH_NORMAL, 12, 141) +GLYPH_DEFINE("¦", GLYPH_NORMAL, 4, 142) +GLYPH_DEFINE("§", GLYPH_NORMAL, 9, 143) +GLYPH_DEFINE("©", GLYPH_NORMAL, 13, 144) +GLYPH_DEFINE("ª", GLYPH_NORMAL, 5, 145) +GLYPH_DEFINE("«", GLYPH_NORMAL, 7, 146) +GLYPH_DEFINE("¬", GLYPH_NORMAL, 9, 147) +GLYPH_DEFINE("®", GLYPH_NORMAL, 13, 148) +GLYPH_DEFINE("°", GLYPH_NORMAL, 6, 149) +GLYPH_DEFINE("±", GLYPH_NORMAL, 9, 150) +GLYPH_DEFINE("²", GLYPH_NORMAL, 5, 151) +GLYPH_DEFINE("³", GLYPH_NORMAL, 5, 152) +GLYPH_DEFINE("µ", GLYPH_NORMAL, 9, 153) +GLYPH_DEFINE("¶", GLYPH_NORMAL, 13, 154) +GLYPH_DEFINE("·", GLYPH_NORMAL, 4, 155) +GLYPH_DEFINE("¹", GLYPH_NORMAL, 5, 156) +GLYPH_DEFINE("º", GLYPH_NORMAL, 5, 157) +GLYPH_DEFINE("»", GLYPH_NORMAL, 7, 158) +GLYPH_DEFINE("¼", GLYPH_NORMAL, 11, 159) +GLYPH_DEFINE("½", GLYPH_NORMAL, 11, 160) +GLYPH_DEFINE("¾", GLYPH_NORMAL, 11, 161) +GLYPH_DEFINE("¿", GLYPH_NORMAL, 10, 162) +GLYPH_DEFINE("À", GLYPH_COMPOUND, 15, 0, .combine_with = {.mesh_idx = 77, .offset_x = 5, .offset_y = -3}) +GLYPH_DEFINE("Á", GLYPH_COMPOUND, 15, 0, .combine_with = {.mesh_idx = 70, .offset_x = 5, .offset_y = -3}) +GLYPH_DEFINE("Â", GLYPH_COMPOUND, 15, 0, .combine_with = {.mesh_idx = 69, .offset_x = 4, .offset_y = -3}) +GLYPH_DEFINE("Ã", GLYPH_COMPOUND, 15, 0, .combine_with = {.mesh_idx = 134, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("Ä", GLYPH_COMPOUND, 15, 0, .combine_with = {.mesh_idx = 67, .offset_x = 4, .offset_y = -2}) +GLYPH_DEFINE("Å", GLYPH_COMPOUND, 15, 0, .combine_with = {.mesh_idx = 133, .offset_x = 5, .offset_y = -3}) +GLYPH_DEFINE("Æ", GLYPH_NORMAL, 16, 163) +GLYPH_DEFINE("Ç", GLYPH_NORMAL, 11, 164) +GLYPH_DEFINE("È", GLYPH_COMPOUND, 11, 4, .combine_with = {.mesh_idx = 77, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("É", GLYPH_COMPOUND, 11, 4, .combine_with = {.mesh_idx = 70, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("Ê", GLYPH_COMPOUND, 11, 4, .combine_with = {.mesh_idx = 69, .offset_x = 2, .offset_y = -3}) +GLYPH_DEFINE("Ë", GLYPH_COMPOUND, 11, 4, .combine_with = {.mesh_idx = 67, .offset_x = 2, .offset_y = -2}) +GLYPH_DEFINE("Ì", GLYPH_COMPOUND, 8, 8, .combine_with = {.mesh_idx = 77, .offset_x = 1, .offset_y = -3}) +GLYPH_DEFINE("Í", GLYPH_COMPOUND, 8, 8, .combine_with = {.mesh_idx = 70, .offset_x = 1, .offset_y = -3}) +GLYPH_DEFINE("Î", GLYPH_COMPOUND, 8, 8, .combine_with = {.mesh_idx = 69, .offset_x = 0, .offset_y = -3}) +GLYPH_DEFINE("Ï", GLYPH_COMPOUND, 8, 8, .combine_with = {.mesh_idx = 67, .offset_x = 0, .offset_y = -2}) +GLYPH_DEFINE("Ð", GLYPH_NORMAL, 11, 165) +GLYPH_DEFINE("Ñ", GLYPH_COMPOUND, 13, 13, .combine_with = {.mesh_idx = 134, .offset_x = 2, .offset_y = -3}) +GLYPH_DEFINE("Ò", GLYPH_COMPOUND, 12, 14, .combine_with = {.mesh_idx = 77, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("Ó", GLYPH_COMPOUND, 12, 14, .combine_with = {.mesh_idx = 70, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("Ô", GLYPH_COMPOUND, 12, 14, .combine_with = {.mesh_idx = 69, .offset_x = 2, .offset_y = -3}) +GLYPH_DEFINE("Õ", GLYPH_COMPOUND, 12, 14, .combine_with = {.mesh_idx = 134, .offset_x = 2, .offset_y = -3}) +GLYPH_DEFINE("Ö", GLYPH_COMPOUND, 12, 14, .combine_with = {.mesh_idx = 67, .offset_x = 2, .offset_y = -2}) +GLYPH_DEFINE("×", GLYPH_NORMAL, 8, 166) +GLYPH_DEFINE("Ø", GLYPH_NORMAL, 12, 167) +GLYPH_DEFINE("Ù", GLYPH_COMPOUND, 13, 20, .combine_with = {.mesh_idx = 77, .offset_x = 4, .offset_y = -3}) +GLYPH_DEFINE("Ú", GLYPH_COMPOUND, 13, 20, .combine_with = {.mesh_idx = 70, .offset_x = 4, .offset_y = -3}) +GLYPH_DEFINE("Û", GLYPH_COMPOUND, 13, 20, .combine_with = {.mesh_idx = 69, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("Ü", GLYPH_COMPOUND, 13, 20, .combine_with = {.mesh_idx = 67, .offset_x = 3, .offset_y = -2}) +GLYPH_DEFINE("Ý", GLYPH_COMPOUND, 12, 24, .combine_with = {.mesh_idx = 70, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("Þ", GLYPH_NORMAL, 11, 168) +GLYPH_DEFINE("ß", GLYPH_NORMAL, 9, 74) +GLYPH_DEFINE("à", GLYPH_COMPOUND, 9, 26, .combine_with = {.mesh_idx = 77, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("á", GLYPH_COMPOUND, 9, 26, .combine_with = {.mesh_idx = 70, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("â", GLYPH_COMPOUND, 9, 26, .combine_with = {.mesh_idx = 69, .offset_x = 1, .offset_y = 1}) +GLYPH_DEFINE("ã", GLYPH_COMPOUND, 9, 26, .combine_with = {.mesh_idx = 134, .offset_x = 0, .offset_y = 1}) +GLYPH_DEFINE("ä", GLYPH_COMPOUND, 9, 26, .combine_with = {.mesh_idx = 67, .offset_x = 1, .offset_y = 2}) +GLYPH_DEFINE("å", GLYPH_COMPOUND, 9, 26, .combine_with = {.mesh_idx = 133, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("æ", GLYPH_NORMAL, 14, 169) +GLYPH_DEFINE("ç", GLYPH_NORMAL, 9, 170) +GLYPH_DEFINE("è", GLYPH_COMPOUND, 9, 30, .combine_with = {.mesh_idx = 77, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("é", GLYPH_COMPOUND, 9, 30, .combine_with = {.mesh_idx = 70, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("ê", GLYPH_COMPOUND, 9, 30, .combine_with = {.mesh_idx = 69, .offset_x = 1, .offset_y = 1}) +GLYPH_DEFINE("ë", GLYPH_COMPOUND, 9, 30, .combine_with = {.mesh_idx = 67, .offset_x = 1, .offset_y = 2}) +GLYPH_DEFINE("ì", GLYPH_COMPOUND, 5, 34, .combine_with = {.mesh_idx = 77, .offset_x = 0, .offset_y = -2}) +GLYPH_DEFINE("í", GLYPH_COMPOUND, 5, 34, .combine_with = {.mesh_idx = 70, .offset_x = 0, .offset_y = -2}) +GLYPH_DEFINE("î", GLYPH_COMPOUND, 5, 34, .combine_with = {.mesh_idx = 69, .offset_x = -1, .offset_y = -2}) +GLYPH_DEFINE("ï", GLYPH_COMPOUND, 5, 34, .combine_with = {.mesh_idx = 67, .offset_x = -1, .offset_y = -1}) +GLYPH_DEFINE("ð", GLYPH_NORMAL, 9, 171) +GLYPH_DEFINE("ñ", GLYPH_COMPOUND, 10, 39, .combine_with = {.mesh_idx = 134, .offset_x = 1, .offset_y = 1}) +GLYPH_DEFINE("ò", GLYPH_COMPOUND, 9, 40, .combine_with = {.mesh_idx = 77, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("ó", GLYPH_COMPOUND, 9, 40, .combine_with = {.mesh_idx = 70, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("ô", GLYPH_COMPOUND, 9, 40, .combine_with = {.mesh_idx = 69, .offset_x = 1, .offset_y = 1}) +GLYPH_DEFINE("õ", GLYPH_COMPOUND, 9, 40, .combine_with = {.mesh_idx = 134, .offset_x = 0, .offset_y = 1}) +GLYPH_DEFINE("ö", GLYPH_COMPOUND, 9, 40, .combine_with = {.mesh_idx = 67, .offset_x = 1, .offset_y = 2}) +GLYPH_DEFINE("÷", GLYPH_NORMAL, 8, 172) +GLYPH_DEFINE("ø", GLYPH_NORMAL, 11, 173) +GLYPH_DEFINE("ù", GLYPH_COMPOUND, 9, 46, .combine_with = {.mesh_idx = 77, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("ú", GLYPH_COMPOUND, 9, 46, .combine_with = {.mesh_idx = 70, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("û", GLYPH_COMPOUND, 9, 46, .combine_with = {.mesh_idx = 69, .offset_x = 1, .offset_y = 1}) +GLYPH_DEFINE("ü", GLYPH_COMPOUND, 9, 46, .combine_with = {.mesh_idx = 67, .offset_x = 1, .offset_y = 2}) +GLYPH_DEFINE("ý", GLYPH_COMPOUND, 9, 50, .combine_with = {.mesh_idx = 70, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("þ", GLYPH_NORMAL, 9, 174) +GLYPH_DEFINE("ÿ", GLYPH_COMPOUND, 9, 50, .combine_with = {.mesh_idx = 67, .offset_x = 1, .offset_y = 2}) +GLYPH_DEFINE("Ā", GLYPH_COMPOUND, 15, 0, .combine_with = {.mesh_idx = 129, .offset_x = 4, .offset_y = -2}) +GLYPH_DEFINE("ā", GLYPH_COMPOUND, 9, 26, .combine_with = {.mesh_idx = 129, .offset_x = 1, .offset_y = 2}) +GLYPH_DEFINE("Ă", GLYPH_COMPOUND, 15, 0, .combine_with = {.mesh_idx = 130, .offset_x = 4, .offset_y = -3}) +GLYPH_DEFINE("ă", GLYPH_COMPOUND, 9, 26, .combine_with = {.mesh_idx = 130, .offset_x = 1, .offset_y = 1}) +GLYPH_DEFINE("Ą", GLYPH_NORMAL, 15, 175) +GLYPH_DEFINE("ą", GLYPH_NORMAL, 9, 176) +GLYPH_DEFINE("Ć", GLYPH_COMPOUND, 11, 2, .combine_with = {.mesh_idx = 70, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("ć", GLYPH_COMPOUND, 9, 28, .combine_with = {.mesh_idx = 70, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("Ĉ", GLYPH_COMPOUND, 11, 2, .combine_with = {.mesh_idx = 69, .offset_x = 2, .offset_y = -3}) +GLYPH_DEFINE("ĉ", GLYPH_COMPOUND, 9, 28, .combine_with = {.mesh_idx = 69, .offset_x = 1, .offset_y = 1}) +GLYPH_DEFINE("Ċ", GLYPH_COMPOUND, 11, 2, .combine_with = {.mesh_idx = 131, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("ċ", GLYPH_COMPOUND, 9, 28, .combine_with = {.mesh_idx = 131, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("Č", GLYPH_COMPOUND, 11, 2, .combine_with = {.mesh_idx = 132, .offset_x = 2, .offset_y = -3}) +GLYPH_DEFINE("č", GLYPH_COMPOUND, 9, 28, .combine_with = {.mesh_idx = 132, .offset_x = 1, .offset_y = 1}) +GLYPH_DEFINE("Ď", GLYPH_COMPOUND, 11, 3, .combine_with = {.mesh_idx = 132, .offset_x = 2, .offset_y = -3}) +GLYPH_DEFINE("ď", GLYPH_COMPOUND, 9, 29, .combine_with = {.mesh_idx = 132, .offset_x = 1, .offset_y = -2}) +GLYPH_DEFINE("Đ", GLYPH_NORMAL, 11, 165) +GLYPH_DEFINE("đ", GLYPH_NORMAL, 10, 177) +GLYPH_DEFINE("Ē", GLYPH_COMPOUND, 11, 4, .combine_with = {.mesh_idx = 129, .offset_x = 2, .offset_y = -2}) +GLYPH_DEFINE("ē", GLYPH_COMPOUND, 9, 30, .combine_with = {.mesh_idx = 129, .offset_x = 1, .offset_y = 2}) +GLYPH_DEFINE("Ĕ", GLYPH_COMPOUND, 11, 4, .combine_with = {.mesh_idx = 130, .offset_x = 2, .offset_y = -3}) +GLYPH_DEFINE("ĕ", GLYPH_COMPOUND, 9, 30, .combine_with = {.mesh_idx = 130, .offset_x = 1, .offset_y = 1}) +GLYPH_DEFINE("Ė", GLYPH_COMPOUND, 11, 4, .combine_with = {.mesh_idx = 131, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("ė", GLYPH_COMPOUND, 9, 30, .combine_with = {.mesh_idx = 131, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("Ę", GLYPH_NORMAL, 11, 178) +GLYPH_DEFINE("ę", GLYPH_NORMAL, 9, 179) +GLYPH_DEFINE("Ě", GLYPH_COMPOUND, 11, 4, .combine_with = {.mesh_idx = 132, .offset_x = 2, .offset_y = -3}) +GLYPH_DEFINE("ě", GLYPH_COMPOUND, 9, 30, .combine_with = {.mesh_idx = 132, .offset_x = 1, .offset_y = 1}) +GLYPH_DEFINE("Ĝ", GLYPH_COMPOUND, 11, 6, .combine_with = {.mesh_idx = 69, .offset_x = 2, .offset_y = -3}) +GLYPH_DEFINE("ĝ", GLYPH_COMPOUND, 9, 32, .combine_with = {.mesh_idx = 69, .offset_x = 1, .offset_y = 1}) +GLYPH_DEFINE("Ğ", GLYPH_COMPOUND, 11, 6, .combine_with = {.mesh_idx = 130, .offset_x = 2, .offset_y = -3}) +GLYPH_DEFINE("ğ", GLYPH_COMPOUND, 9, 32, .combine_with = {.mesh_idx = 130, .offset_x = 1, .offset_y = 1}) +GLYPH_DEFINE("Ġ", GLYPH_COMPOUND, 11, 6, .combine_with = {.mesh_idx = 131, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("ġ", GLYPH_COMPOUND, 9, 32, .combine_with = {.mesh_idx = 131, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("Ģ", GLYPH_NORMAL, 11, 180) +GLYPH_DEFINE("ģ", GLYPH_NORMAL, 9, 181) +GLYPH_DEFINE("Ĥ", GLYPH_COMPOUND, 13, 7, .combine_with = {.mesh_idx = 69, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("ĥ", GLYPH_COMPOUND, 9, 33, .combine_with = {.mesh_idx = 69, .offset_x = 1, .offset_y = -2}) +GLYPH_DEFINE("Ħ", GLYPH_NORMAL, 13, 182) +GLYPH_DEFINE("ħ", GLYPH_NORMAL, 10, 183) +GLYPH_DEFINE("Ĩ", GLYPH_COMPOUND, 8, 8, .combine_with = {.mesh_idx = 134, .offset_x = 0, .offset_y = -3}) +GLYPH_DEFINE("ĩ", GLYPH_COMPOUND, 5, 34, .combine_with = {.mesh_idx = 134, .offset_x = -2, .offset_y = -2}) +GLYPH_DEFINE("Ī", GLYPH_COMPOUND, 8, 8, .combine_with = {.mesh_idx = 129, .offset_x = 0, .offset_y = -2}) +GLYPH_DEFINE("ī", GLYPH_COMPOUND, 5, 34, .combine_with = {.mesh_idx = 129, .offset_x = -1, .offset_y = -1}) +GLYPH_DEFINE("Ĭ", GLYPH_COMPOUND, 8, 8, .combine_with = {.mesh_idx = 130, .offset_x = 1, .offset_y = -3}) +GLYPH_DEFINE("ĭ", GLYPH_COMPOUND, 5, 34, .combine_with = {.mesh_idx = 130, .offset_x = -1, .offset_y = -2}) +GLYPH_DEFINE("Į", GLYPH_NORMAL, 8, 184) +GLYPH_DEFINE("į", GLYPH_NORMAL, 5, 185) +GLYPH_DEFINE("İ", GLYPH_COMPOUND, 8, 8, .combine_with = {.mesh_idx = 131, .offset_x = 2, .offset_y = -3}) +GLYPH_DEFINE("ı", GLYPH_NORMAL, 5, 186) +GLYPH_DEFINE("Ĵ", GLYPH_COMPOUND, 11, 9, .combine_with = {.mesh_idx = 69, .offset_x = 2, .offset_y = -3}) +GLYPH_DEFINE("ĵ", GLYPH_COMPOUND, 9, 35, .combine_with = {.mesh_idx = 69, .offset_x = 1, .offset_y = -2}) +GLYPH_DEFINE("Ķ", GLYPH_NORMAL, 12, 187) +GLYPH_DEFINE("ķ", GLYPH_NORMAL, 10, 188) +GLYPH_DEFINE("ĸ", GLYPH_NORMAL, 9, 189) +GLYPH_DEFINE("Ĺ", GLYPH_COMPOUND, 11, 11, .combine_with = {.mesh_idx = 70, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("ĺ", GLYPH_COMPOUND, 5, 37, .combine_with = {.mesh_idx = 70, .offset_x = 0, .offset_y = -2}) +GLYPH_DEFINE("Ļ", GLYPH_NORMAL, 11, 190) +GLYPH_DEFINE("ļ", GLYPH_NORMAL, 5, 191) +GLYPH_DEFINE("Ľ", GLYPH_COMPOUND, 11, 11, .combine_with = {.mesh_idx = 132, .offset_x = 2, .offset_y = -3}) +GLYPH_DEFINE("ľ", GLYPH_COMPOUND, 5, 37, .combine_with = {.mesh_idx = 132, .offset_x = -1, .offset_y = -2}) +GLYPH_DEFINE("Ŀ", GLYPH_COMPOUND, 11, 11, .combine_with = {.mesh_idx = 155, .offset_x = 6, .offset_y = -1}) +GLYPH_DEFINE("ŀ", GLYPH_COMPOUND, 5, 37, .combine_with = {.mesh_idx = 155, .offset_x = 3, .offset_y = -1}) +GLYPH_DEFINE("Ł", GLYPH_NORMAL, 12, 192) +GLYPH_DEFINE("ł", GLYPH_NORMAL, 8, 193) +GLYPH_DEFINE("Ń", GLYPH_COMPOUND, 13, 13, .combine_with = {.mesh_idx = 70, .offset_x = 4, .offset_y = -3}) +GLYPH_DEFINE("ń", GLYPH_COMPOUND, 10, 39, .combine_with = {.mesh_idx = 70, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("Ņ", GLYPH_NORMAL, 13, 194) +GLYPH_DEFINE("ņ", GLYPH_NORMAL, 10, 195) +GLYPH_DEFINE("Ň", GLYPH_COMPOUND, 13, 13, .combine_with = {.mesh_idx = 132, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("ň", GLYPH_COMPOUND, 10, 39, .combine_with = {.mesh_idx = 132, .offset_x = 1, .offset_y = 1}) +GLYPH_DEFINE("ʼn", GLYPH_COMPOUND, 10, 39, .combine_with = {.mesh_idx = 70, .offset_x = 0, .offset_y = 1}) +GLYPH_DEFINE("Ŋ", GLYPH_NORMAL, 13, 196) +GLYPH_DEFINE("ŋ", GLYPH_NORMAL, 10, 197) +GLYPH_DEFINE("Ō", GLYPH_COMPOUND, 12, 14, .combine_with = {.mesh_idx = 129, .offset_x = 2, .offset_y = -2}) +GLYPH_DEFINE("ō", GLYPH_COMPOUND, 9, 40, .combine_with = {.mesh_idx = 129, .offset_x = 1, .offset_y = 2}) +GLYPH_DEFINE("Ŏ", GLYPH_COMPOUND, 12, 14, .combine_with = {.mesh_idx = 130, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("ŏ", GLYPH_COMPOUND, 9, 40, .combine_with = {.mesh_idx = 130, .offset_x = 1, .offset_y = 1}) +GLYPH_DEFINE("Ő", GLYPH_COMPOUND, 12, 14, .combine_with = {.mesh_idx = 135, .offset_x = 2, .offset_y = -3}) +GLYPH_DEFINE("ő", GLYPH_COMPOUND, 9, 40, .combine_with = {.mesh_idx = 135, .offset_x = 1, .offset_y = 1}) +GLYPH_DEFINE("Œ", GLYPH_NORMAL, 16, 198) +GLYPH_DEFINE("œ", GLYPH_NORMAL, 14, 199) +GLYPH_DEFINE("Ŕ", GLYPH_COMPOUND, 12, 17, .combine_with = {.mesh_idx = 70, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("ŕ", GLYPH_COMPOUND, 8, 43, .combine_with = {.mesh_idx = 70, .offset_x = 1, .offset_y = 1}) +GLYPH_DEFINE("Ŗ", GLYPH_NORMAL, 12, 200) +GLYPH_DEFINE("ŗ", GLYPH_NORMAL, 8, 201) +GLYPH_DEFINE("Ř", GLYPH_COMPOUND, 12, 17, .combine_with = {.mesh_idx = 132, .offset_x = 2, .offset_y = -3}) +GLYPH_DEFINE("ř", GLYPH_COMPOUND, 8, 43, .combine_with = {.mesh_idx = 132, .offset_x = 0, .offset_y = 1}) +GLYPH_DEFINE("Ś", GLYPH_COMPOUND, 11, 18, .combine_with = {.mesh_idx = 70, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("ś", GLYPH_COMPOUND, 9, 44, .combine_with = {.mesh_idx = 70, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("Ŝ", GLYPH_COMPOUND, 11, 18, .combine_with = {.mesh_idx = 69, .offset_x = 2, .offset_y = -3}) +GLYPH_DEFINE("ŝ", GLYPH_COMPOUND, 9, 44, .combine_with = {.mesh_idx = 69, .offset_x = 1, .offset_y = 1}) +GLYPH_DEFINE("Ş", GLYPH_NORMAL, 11, 202) +GLYPH_DEFINE("ş", GLYPH_NORMAL, 9, 203) +GLYPH_DEFINE("Š", GLYPH_COMPOUND, 11, 18, .combine_with = {.mesh_idx = 132, .offset_x = 2, .offset_y = -3}) +GLYPH_DEFINE("š", GLYPH_COMPOUND, 9, 44, .combine_with = {.mesh_idx = 132, .offset_x = 1, .offset_y = 1}) +GLYPH_DEFINE("Ţ", GLYPH_NORMAL, 12, 204) +GLYPH_DEFINE("ţ", GLYPH_NORMAL, 9, 205) +GLYPH_DEFINE("Ť", GLYPH_COMPOUND, 12, 19, .combine_with = {.mesh_idx = 132, .offset_x = 2, .offset_y = -3}) +GLYPH_DEFINE("ť", GLYPH_COMPOUND, 9, 45, .combine_with = {.mesh_idx = 132, .offset_x = 1, .offset_y = -2}) +GLYPH_DEFINE("Ŧ", GLYPH_NORMAL, 12, 206) +GLYPH_DEFINE("ŧ", GLYPH_NORMAL, 9, 207) +GLYPH_DEFINE("Ũ", GLYPH_COMPOUND, 13, 20, .combine_with = {.mesh_idx = 134, .offset_x = 2, .offset_y = -3}) +GLYPH_DEFINE("ũ", GLYPH_COMPOUND, 9, 46, .combine_with = {.mesh_idx = 134, .offset_x = 0, .offset_y = 1}) +GLYPH_DEFINE("Ū", GLYPH_COMPOUND, 13, 20, .combine_with = {.mesh_idx = 129, .offset_x = 3, .offset_y = -2}) +GLYPH_DEFINE("ū", GLYPH_COMPOUND, 9, 46, .combine_with = {.mesh_idx = 129, .offset_x = 1, .offset_y = 2}) +GLYPH_DEFINE("Ŭ", GLYPH_COMPOUND, 13, 20, .combine_with = {.mesh_idx = 130, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("ŭ", GLYPH_COMPOUND, 9, 46, .combine_with = {.mesh_idx = 130, .offset_x = 1, .offset_y = 1}) +GLYPH_DEFINE("Ů", GLYPH_COMPOUND, 13, 20, .combine_with = {.mesh_idx = 133, .offset_x = 4, .offset_y = -3}) +GLYPH_DEFINE("ů", GLYPH_COMPOUND, 9, 46, .combine_with = {.mesh_idx = 133, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("Ű", GLYPH_COMPOUND, 13, 20, .combine_with = {.mesh_idx = 135, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("ű", GLYPH_COMPOUND, 9, 46, .combine_with = {.mesh_idx = 135, .offset_x = 1, .offset_y = 1}) +GLYPH_DEFINE("Ų", GLYPH_NORMAL, 13, 208) +GLYPH_DEFINE("ų", GLYPH_NORMAL, 9, 209) +GLYPH_DEFINE("Ŵ", GLYPH_COMPOUND, 13, 22, .combine_with = {.mesh_idx = 69, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("ŵ", GLYPH_COMPOUND, 11, 48, .combine_with = {.mesh_idx = 69, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("Ŷ", GLYPH_COMPOUND, 12, 24, .combine_with = {.mesh_idx = 69, .offset_x = 2, .offset_y = -3}) +GLYPH_DEFINE("ŷ", GLYPH_COMPOUND, 9, 50, .combine_with = {.mesh_idx = 69, .offset_x = 1, .offset_y = 1}) +GLYPH_DEFINE("Ÿ", GLYPH_COMPOUND, 12, 24, .combine_with = {.mesh_idx = 67, .offset_x = 2, .offset_y = -2}) +GLYPH_DEFINE("Ź", GLYPH_COMPOUND, 11, 25, .combine_with = {.mesh_idx = 70, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("ź", GLYPH_COMPOUND, 9, 51, .combine_with = {.mesh_idx = 70, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("Ż", GLYPH_COMPOUND, 11, 25, .combine_with = {.mesh_idx = 131, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("ż", GLYPH_COMPOUND, 9, 51, .combine_with = {.mesh_idx = 131, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("Ž", GLYPH_COMPOUND, 11, 25, .combine_with = {.mesh_idx = 132, .offset_x = 2, .offset_y = -3}) +GLYPH_DEFINE("ž", GLYPH_COMPOUND, 9, 51, .combine_with = {.mesh_idx = 132, .offset_x = 1, .offset_y = 1}) +GLYPH_DEFINE("ƒ", GLYPH_NORMAL, 9, 210) +GLYPH_DEFINE("Ǎ", GLYPH_COMPOUND, 15, 0, .combine_with = {.mesh_idx = 132, .offset_x = 4, .offset_y = -3}) +GLYPH_DEFINE("ǎ", GLYPH_COMPOUND, 9, 26, .combine_with = {.mesh_idx = 132, .offset_x = 1, .offset_y = 1}) +GLYPH_DEFINE("Ǐ", GLYPH_COMPOUND, 8, 8, .combine_with = {.mesh_idx = 132, .offset_x = 0, .offset_y = -3}) +GLYPH_DEFINE("ǐ", GLYPH_COMPOUND, 5, 34, .combine_with = {.mesh_idx = 132, .offset_x = -1, .offset_y = -2}) +GLYPH_DEFINE("Ǒ", GLYPH_COMPOUND, 12, 14, .combine_with = {.mesh_idx = 132, .offset_x = 2, .offset_y = -3}) +GLYPH_DEFINE("ǒ", GLYPH_COMPOUND, 9, 40, .combine_with = {.mesh_idx = 132, .offset_x = 1, .offset_y = 1}) +GLYPH_DEFINE("Ǔ", GLYPH_COMPOUND, 13, 20, .combine_with = {.mesh_idx = 132, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("ǔ", GLYPH_COMPOUND, 9, 46, .combine_with = {.mesh_idx = 132, .offset_x = 1, .offset_y = 1}) +GLYPH_DEFINE("Ǧ", GLYPH_COMPOUND, 11, 6, .combine_with = {.mesh_idx = 132, .offset_x = 2, .offset_y = -3}) +GLYPH_DEFINE("ǧ", GLYPH_COMPOUND, 9, 32, .combine_with = {.mesh_idx = 132, .offset_x = 1, .offset_y = 1}) +GLYPH_DEFINE("Ǩ", GLYPH_COMPOUND, 12, 10, .combine_with = {.mesh_idx = 132, .offset_x = 2, .offset_y = -3}) +GLYPH_DEFINE("ǩ", GLYPH_COMPOUND, 10, 36, .combine_with = {.mesh_idx = 132, .offset_x = 1, .offset_y = -2}) +GLYPH_DEFINE("ǰ", GLYPH_COMPOUND, 9, 35, .combine_with = {.mesh_idx = 132, .offset_x = 1, .offset_y = -2}) +GLYPH_DEFINE("Ǵ", GLYPH_COMPOUND, 11, 6, .combine_with = {.mesh_idx = 70, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("ǵ", GLYPH_COMPOUND, 9, 32, .combine_with = {.mesh_idx = 70, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("Ǹ", GLYPH_COMPOUND, 13, 13, .combine_with = {.mesh_idx = 77, .offset_x = 4, .offset_y = -3}) +GLYPH_DEFINE("ǹ", GLYPH_COMPOUND, 10, 39, .combine_with = {.mesh_idx = 77, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("Ȟ", GLYPH_COMPOUND, 13, 7, .combine_with = {.mesh_idx = 132, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("ȟ", GLYPH_COMPOUND, 9, 33, .combine_with = {.mesh_idx = 132, .offset_x = 1, .offset_y = -2}) +GLYPH_DEFINE("Ȧ", GLYPH_COMPOUND, 15, 0, .combine_with = {.mesh_idx = 131, .offset_x = 5, .offset_y = -3}) +GLYPH_DEFINE("ȧ", GLYPH_COMPOUND, 9, 26, .combine_with = {.mesh_idx = 131, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("Ȯ", GLYPH_COMPOUND, 12, 14, .combine_with = {.mesh_idx = 131, .offset_x = 4, .offset_y = -3}) +GLYPH_DEFINE("ȯ", GLYPH_COMPOUND, 9, 40, .combine_with = {.mesh_idx = 131, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("Ȳ", GLYPH_COMPOUND, 12, 24, .combine_with = {.mesh_idx = 129, .offset_x = 2, .offset_y = -2}) +GLYPH_DEFINE("ȳ", GLYPH_COMPOUND, 9, 50, .combine_with = {.mesh_idx = 129, .offset_x = 1, .offset_y = 2}) +GLYPH_DEFINE("Ș", GLYPH_NORMAL, 11, 211) +GLYPH_DEFINE("ș", GLYPH_NORMAL, 9, 212) +GLYPH_DEFINE("Ț", GLYPH_NORMAL, 12, 213) +GLYPH_DEFINE("ț", GLYPH_NORMAL, 9, 214) +GLYPH_DEFINE("Γ", GLYPH_NORMAL, 11, 215) +GLYPH_DEFINE("Δ", GLYPH_NORMAL, 13, 216) +GLYPH_DEFINE("Ε", GLYPH_NORMAL, 11, 4) +GLYPH_DEFINE("Ζ", GLYPH_NORMAL, 11, 25) +GLYPH_DEFINE("Η", GLYPH_NORMAL, 13, 7) +GLYPH_DEFINE("Θ", GLYPH_NORMAL, 12, 217) +GLYPH_DEFINE("Ι", GLYPH_NORMAL, 8, 8) +GLYPH_DEFINE("Κ", GLYPH_NORMAL, 12, 10) +GLYPH_DEFINE("Λ", GLYPH_NORMAL, 15, 218) +GLYPH_DEFINE("Μ", GLYPH_NORMAL, 13, 12) +GLYPH_DEFINE("Ν", GLYPH_NORMAL, 13, 13) +GLYPH_DEFINE("Ξ", GLYPH_NORMAL, 12, 219) +GLYPH_DEFINE("Ο", GLYPH_NORMAL, 12, 14) +GLYPH_DEFINE("Π", GLYPH_NORMAL, 13, 220) +GLYPH_DEFINE("Ρ", GLYPH_NORMAL, 11, 15) +GLYPH_DEFINE("Σ", GLYPH_NORMAL, 11, 221) +GLYPH_DEFINE("Τ", GLYPH_NORMAL, 12, 19) +GLYPH_DEFINE("Υ", GLYPH_NORMAL, 12, 24) +GLYPH_DEFINE("Φ", GLYPH_NORMAL, 14, 222) +GLYPH_DEFINE("Χ", GLYPH_NORMAL, 11, 25) +GLYPH_DEFINE("Ψ", GLYPH_NORMAL, 16, 223) +GLYPH_DEFINE("Ω", GLYPH_NORMAL, 12, 224) +GLYPH_DEFINE("α", GLYPH_NORMAL, 10, 225) +GLYPH_DEFINE("β", GLYPH_NORMAL, 9, 226) +GLYPH_DEFINE("γ", GLYPH_NORMAL, 10, 227) +GLYPH_DEFINE("δ", GLYPH_NORMAL, 9, 228) +GLYPH_DEFINE("ε", GLYPH_NORMAL, 9, 229) +GLYPH_DEFINE("ζ", GLYPH_NORMAL, 9, 230) +GLYPH_DEFINE("η", GLYPH_NORMAL, 9, 231) +GLYPH_DEFINE("θ", GLYPH_NORMAL, 9, 232) +GLYPH_DEFINE("ι", GLYPH_NORMAL, 5, 186) +GLYPH_DEFINE("κ", GLYPH_NORMAL, 9, 189) +GLYPH_DEFINE("λ", GLYPH_NORMAL, 10, 233) +GLYPH_DEFINE("μ", GLYPH_NORMAL, 9, 153) +GLYPH_DEFINE("ν", GLYPH_NORMAL, 9, 47) +GLYPH_DEFINE("ξ", GLYPH_NORMAL, 9, 234) +GLYPH_DEFINE("ο", GLYPH_NORMAL, 9, 40) +GLYPH_DEFINE("π", GLYPH_NORMAL, 11, 235) +GLYPH_DEFINE("ρ", GLYPH_NORMAL, 9, 236) +GLYPH_DEFINE("ς", GLYPH_NORMAL, 9, 237) +GLYPH_DEFINE("σ", GLYPH_NORMAL, 10, 238) +GLYPH_DEFINE("τ", GLYPH_NORMAL, 8, 239) +GLYPH_DEFINE("υ", GLYPH_NORMAL, 9, 240) +GLYPH_DEFINE("φ", GLYPH_NORMAL, 12, 241) +GLYPH_DEFINE("χ", GLYPH_NORMAL, 9, 242) +GLYPH_DEFINE("ψ", GLYPH_NORMAL, 12, 243) +GLYPH_DEFINE("ω", GLYPH_NORMAL, 11, 244) +GLYPH_DEFINE("Ά", GLYPH_COMPOUND, 15, 0, .combine_with = {.mesh_idx = 70, .offset_x = 1, .offset_y = -1}) +GLYPH_DEFINE("Έ", GLYPH_COMPOUND, 11, 4, .combine_with = {.mesh_idx = 70, .offset_x = -1, .offset_y = -1}) +GLYPH_DEFINE("Ή", GLYPH_COMPOUND, 13, 7, .combine_with = {.mesh_idx = 70, .offset_x = 0, .offset_y = -1}) +GLYPH_DEFINE("Ί", GLYPH_COMPOUND, 8, 8, .combine_with = {.mesh_idx = 70, .offset_x = -3, .offset_y = -1}) +GLYPH_DEFINE("Ό", GLYPH_COMPOUND, 12, 14, .combine_with = {.mesh_idx = 70, .offset_x = -1, .offset_y = -1}) +GLYPH_DEFINE("Ύ", GLYPH_COMPOUND, 12, 24, .combine_with = {.mesh_idx = 70, .offset_x = -1, .offset_y = -1}) +GLYPH_DEFINE("Ώ", GLYPH_COMPOUND, 12, 224, .combine_with = {.mesh_idx = 70, .offset_x = -1, .offset_y = -1}) +GLYPH_DEFINE("ΐ", GLYPH_COMPOUND, 5, 186, .combine_with = {.mesh_idx = 136, .offset_x = -2, .offset_y = 1}) +GLYPH_DEFINE("Α", GLYPH_NORMAL, 15, 0) +GLYPH_DEFINE("Β", GLYPH_NORMAL, 11, 1) +GLYPH_DEFINE("Ϊ", GLYPH_COMPOUND, 8, 8, .combine_with = {.mesh_idx = 67, .offset_x = 0, .offset_y = -2}) +GLYPH_DEFINE("Ϋ", GLYPH_COMPOUND, 12, 24, .combine_with = {.mesh_idx = 67, .offset_x = 2, .offset_y = -2}) +GLYPH_DEFINE("ά", GLYPH_COMPOUND, 10, 225, .combine_with = {.mesh_idx = 70, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("έ", GLYPH_COMPOUND, 9, 229, .combine_with = {.mesh_idx = 70, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("ή", GLYPH_COMPOUND, 9, 231, .combine_with = {.mesh_idx = 70, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("ί", GLYPH_COMPOUND, 5, 186, .combine_with = {.mesh_idx = 70, .offset_x = 0, .offset_y = 1}) +GLYPH_DEFINE("ΰ", GLYPH_COMPOUND, 9, 240, .combine_with = {.mesh_idx = 136, .offset_x = 0, .offset_y = 1}) +GLYPH_DEFINE("ϊ", GLYPH_COMPOUND, 5, 186, .combine_with = {.mesh_idx = 67, .offset_x = -1, .offset_y = 2}) +GLYPH_DEFINE("ϋ", GLYPH_COMPOUND, 9, 240, .combine_with = {.mesh_idx = 67, .offset_x = 1, .offset_y = 2}) +GLYPH_DEFINE("ό", GLYPH_COMPOUND, 9, 40, .combine_with = {.mesh_idx = 70, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("ύ", GLYPH_COMPOUND, 9, 240, .combine_with = {.mesh_idx = 70, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("ώ", GLYPH_COMPOUND, 11, 244, .combine_with = {.mesh_idx = 70, .offset_x = 3, .offset_y = 1}) +GLYPH_DEFINE("Ѐ", GLYPH_COMPOUND, 11, 4, .combine_with = {.mesh_idx = 77, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("Ё", GLYPH_COMPOUND, 11, 4, .combine_with = {.mesh_idx = 67, .offset_x = 2, .offset_y = -2}) +GLYPH_DEFINE("Ђ", GLYPH_NORMAL, 13, 245) +GLYPH_DEFINE("Ѓ", GLYPH_COMPOUND, 11, 215, .combine_with = {.mesh_idx = 70, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("Є", GLYPH_NORMAL, 11, 246) +GLYPH_DEFINE("Ѕ", GLYPH_NORMAL, 11, 18) +GLYPH_DEFINE("І", GLYPH_NORMAL, 8, 8) +GLYPH_DEFINE("Ї", GLYPH_COMPOUND, 8, 8, .combine_with = {.mesh_idx = 67, .offset_x = 0, .offset_y = -2}) +GLYPH_DEFINE("Ј", GLYPH_NORMAL, 11, 9) +GLYPH_DEFINE("Љ", GLYPH_NORMAL, 16, 247) +GLYPH_DEFINE("Њ", GLYPH_NORMAL, 16, 248) +GLYPH_DEFINE("Ћ", GLYPH_NORMAL, 14, 249) +GLYPH_DEFINE("Ќ", GLYPH_COMPOUND, 12, 10, .combine_with = {.mesh_idx = 70, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("Ѝ", GLYPH_COMPOUND, 13, 255, .combine_with = {.mesh_idx = 77, .offset_x = 4, .offset_y = -3}) +GLYPH_DEFINE("Ў", GLYPH_COMPOUND, 12, 257, .combine_with = {.mesh_idx = 130, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("Џ", GLYPH_NORMAL, 13, 250) +GLYPH_DEFINE("А", GLYPH_NORMAL, 15, 0) +GLYPH_DEFINE("Б", GLYPH_NORMAL, 11, 251) +GLYPH_DEFINE("В", GLYPH_NORMAL, 11, 1) +GLYPH_DEFINE("Г", GLYPH_NORMAL, 11, 215) +GLYPH_DEFINE("Д", GLYPH_NORMAL, 14, 252) +GLYPH_DEFINE("Е", GLYPH_NORMAL, 11, 4) +GLYPH_DEFINE("Ж", GLYPH_NORMAL, 16, 253) +GLYPH_DEFINE("З", GLYPH_NORMAL, 10, 254) +GLYPH_DEFINE("И", GLYPH_NORMAL, 13, 255) +GLYPH_DEFINE("Й", GLYPH_COMPOUND, 13, 255, .combine_with = {.mesh_idx = 130, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("К", GLYPH_NORMAL, 12, 10) +GLYPH_DEFINE("Л", GLYPH_NORMAL, 13, 256) +GLYPH_DEFINE("М", GLYPH_NORMAL, 13, 12) +GLYPH_DEFINE("Н", GLYPH_NORMAL, 13, 7) +GLYPH_DEFINE("О", GLYPH_NORMAL, 12, 14) +GLYPH_DEFINE("П", GLYPH_NORMAL, 13, 220) +GLYPH_DEFINE("Р", GLYPH_NORMAL, 11, 15) +GLYPH_DEFINE("С", GLYPH_NORMAL, 11, 2) +GLYPH_DEFINE("Т", GLYPH_NORMAL, 12, 19) +GLYPH_DEFINE("У", GLYPH_NORMAL, 12, 257) +GLYPH_DEFINE("Ф", GLYPH_NORMAL, 14, 222) +GLYPH_DEFINE("Х", GLYPH_NORMAL, 12, 23) +GLYPH_DEFINE("Ц", GLYPH_NORMAL, 14, 258) +GLYPH_DEFINE("Ч", GLYPH_NORMAL, 13, 259) +GLYPH_DEFINE("Ш", GLYPH_NORMAL, 16, 260) +GLYPH_DEFINE("Щ", GLYPH_NORMAL, 16, 261) +GLYPH_DEFINE("Ъ", GLYPH_NORMAL, 13, 262) +GLYPH_DEFINE("Ы", GLYPH_NORMAL, 16, 263) +GLYPH_DEFINE("Ь", GLYPH_NORMAL, 11, 264) +GLYPH_DEFINE("Э", GLYPH_NORMAL, 11, 265) +GLYPH_DEFINE("Ю", GLYPH_NORMAL, 16, 266) +GLYPH_DEFINE("Я", GLYPH_NORMAL, 11, 267) +GLYPH_DEFINE("а", GLYPH_NORMAL, 9, 26) +GLYPH_DEFINE("б", GLYPH_NORMAL, 9, 268) +GLYPH_DEFINE("в", GLYPH_NORMAL, 9, 269) +GLYPH_DEFINE("г", GLYPH_NORMAL, 8, 270) +GLYPH_DEFINE("д", GLYPH_NORMAL, 10, 271) +GLYPH_DEFINE("е", GLYPH_NORMAL, 9, 30) +GLYPH_DEFINE("ж", GLYPH_NORMAL, 14, 272) +GLYPH_DEFINE("з", GLYPH_NORMAL, 9, 273) +GLYPH_DEFINE("и", GLYPH_NORMAL, 10, 274) +GLYPH_DEFINE("й", GLYPH_COMPOUND, 10, 274, .combine_with = {.mesh_idx = 130, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("к", GLYPH_NORMAL, 9, 189) +GLYPH_DEFINE("л", GLYPH_NORMAL, 9, 275) +GLYPH_DEFINE("м", GLYPH_NORMAL, 11, 276) +GLYPH_DEFINE("н", GLYPH_NORMAL, 9, 277) +GLYPH_DEFINE("о", GLYPH_NORMAL, 9, 40) +GLYPH_DEFINE("п", GLYPH_NORMAL, 9, 278) +GLYPH_DEFINE("р", GLYPH_NORMAL, 9, 41) +GLYPH_DEFINE("с", GLYPH_NORMAL, 9, 28) +GLYPH_DEFINE("т", GLYPH_NORMAL, 8, 279) +GLYPH_DEFINE("у", GLYPH_NORMAL, 9, 50) +GLYPH_DEFINE("ф", GLYPH_NORMAL, 12, 280) +GLYPH_DEFINE("х", GLYPH_NORMAL, 9, 49) +GLYPH_DEFINE("ц", GLYPH_NORMAL, 10, 281) +GLYPH_DEFINE("ч", GLYPH_NORMAL, 9, 282) +GLYPH_DEFINE("ш", GLYPH_NORMAL, 12, 283) +GLYPH_DEFINE("щ", GLYPH_NORMAL, 13, 284) +GLYPH_DEFINE("ъ", GLYPH_NORMAL, 11, 285) +GLYPH_DEFINE("ы", GLYPH_NORMAL, 12, 286) +GLYPH_DEFINE("ь", GLYPH_NORMAL, 9, 287) +GLYPH_DEFINE("э", GLYPH_NORMAL, 9, 288) +GLYPH_DEFINE("ю", GLYPH_NORMAL, 12, 289) +GLYPH_DEFINE("я", GLYPH_NORMAL, 9, 290) +GLYPH_DEFINE("ѐ", GLYPH_COMPOUND, 9, 30, .combine_with = {.mesh_idx = 77, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("ё", GLYPH_COMPOUND, 9, 30, .combine_with = {.mesh_idx = 67, .offset_x = 1, .offset_y = 2}) +GLYPH_DEFINE("ђ", GLYPH_NORMAL, 10, 291) +GLYPH_DEFINE("ѓ", GLYPH_COMPOUND, 8, 270, .combine_with = {.mesh_idx = 70, .offset_x = 1, .offset_y = 1}) +GLYPH_DEFINE("є", GLYPH_NORMAL, 9, 292) +GLYPH_DEFINE("ѕ", GLYPH_NORMAL, 9, 44) +GLYPH_DEFINE("і", GLYPH_NORMAL, 5, 34) +GLYPH_DEFINE("ї", GLYPH_COMPOUND, 5, 186, .combine_with = {.mesh_idx = 67, .offset_x = -1, .offset_y = 2}) +GLYPH_DEFINE("ј", GLYPH_NORMAL, 9, 35) +GLYPH_DEFINE("љ", GLYPH_NORMAL, 14, 293) +GLYPH_DEFINE("њ", GLYPH_NORMAL, 14, 294) +GLYPH_DEFINE("ћ", GLYPH_NORMAL, 10, 183) +GLYPH_DEFINE("ќ", GLYPH_COMPOUND, 9, 189, .combine_with = {.mesh_idx = 70, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("ѝ", GLYPH_COMPOUND, 10, 274, .combine_with = {.mesh_idx = 77, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("ў", GLYPH_COMPOUND, 9, 50, .combine_with = {.mesh_idx = 130, .offset_x = 1, .offset_y = 1}) +GLYPH_DEFINE("џ", GLYPH_NORMAL, 9, 295) +GLYPH_DEFINE("Ґ", GLYPH_NORMAL, 11, 296) +GLYPH_DEFINE("ґ", GLYPH_NORMAL, 8, 297) +GLYPH_DEFINE("Ḃ", GLYPH_COMPOUND, 11, 1, .combine_with = {.mesh_idx = 131, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("ḃ", GLYPH_COMPOUND, 9, 27, .combine_with = {.mesh_idx = 131, .offset_x = 2, .offset_y = -2}) +GLYPH_DEFINE("Ḋ", GLYPH_COMPOUND, 11, 3, .combine_with = {.mesh_idx = 131, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("ḋ", GLYPH_COMPOUND, 9, 29, .combine_with = {.mesh_idx = 131, .offset_x = 2, .offset_y = -2}) +GLYPH_DEFINE("Ḟ", GLYPH_COMPOUND, 11, 5, .combine_with = {.mesh_idx = 131, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("ḟ", GLYPH_COMPOUND, 9, 31, .combine_with = {.mesh_idx = 131, .offset_x = 2, .offset_y = -2}) +GLYPH_DEFINE("Ḡ", GLYPH_COMPOUND, 11, 6, .combine_with = {.mesh_idx = 129, .offset_x = 2, .offset_y = -2}) +GLYPH_DEFINE("ḡ", GLYPH_COMPOUND, 9, 32, .combine_with = {.mesh_idx = 129, .offset_x = 1, .offset_y = 2}) +GLYPH_DEFINE("Ḣ", GLYPH_COMPOUND, 13, 7, .combine_with = {.mesh_idx = 131, .offset_x = 4, .offset_y = -3}) +GLYPH_DEFINE("ḣ", GLYPH_COMPOUND, 9, 33, .combine_with = {.mesh_idx = 131, .offset_x = 2, .offset_y = -2}) +GLYPH_DEFINE("Ḧ", GLYPH_COMPOUND, 13, 7, .combine_with = {.mesh_idx = 67, .offset_x = 3, .offset_y = -2}) +GLYPH_DEFINE("ḧ", GLYPH_COMPOUND, 9, 33, .combine_with = {.mesh_idx = 67, .offset_x = 1, .offset_y = -1}) +GLYPH_DEFINE("Ḱ", GLYPH_COMPOUND, 12, 10, .combine_with = {.mesh_idx = 70, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("ḱ", GLYPH_COMPOUND, 10, 36, .combine_with = {.mesh_idx = 70, .offset_x = 2, .offset_y = -2}) +GLYPH_DEFINE("Ḿ", GLYPH_COMPOUND, 13, 12, .combine_with = {.mesh_idx = 70, .offset_x = 4, .offset_y = -3}) +GLYPH_DEFINE("ḿ", GLYPH_COMPOUND, 12, 38, .combine_with = {.mesh_idx = 70, .offset_x = 3, .offset_y = 1}) +GLYPH_DEFINE("Ṁ", GLYPH_COMPOUND, 13, 12, .combine_with = {.mesh_idx = 131, .offset_x = 4, .offset_y = -3}) +GLYPH_DEFINE("ṁ", GLYPH_COMPOUND, 12, 38, .combine_with = {.mesh_idx = 131, .offset_x = 4, .offset_y = 1}) +GLYPH_DEFINE("Ṅ", GLYPH_COMPOUND, 13, 13, .combine_with = {.mesh_idx = 131, .offset_x = 4, .offset_y = -3}) +GLYPH_DEFINE("ṅ", GLYPH_COMPOUND, 10, 39, .combine_with = {.mesh_idx = 131, .offset_x = 3, .offset_y = 1}) +GLYPH_DEFINE("Ṕ", GLYPH_COMPOUND, 11, 15, .combine_with = {.mesh_idx = 70, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("ṕ", GLYPH_COMPOUND, 9, 41, .combine_with = {.mesh_idx = 70, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("Ṗ", GLYPH_COMPOUND, 11, 15, .combine_with = {.mesh_idx = 131, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("ṗ", GLYPH_COMPOUND, 9, 41, .combine_with = {.mesh_idx = 131, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("Ṙ", GLYPH_COMPOUND, 12, 17, .combine_with = {.mesh_idx = 131, .offset_x = 4, .offset_y = -3}) +GLYPH_DEFINE("ṙ", GLYPH_COMPOUND, 8, 43, .combine_with = {.mesh_idx = 131, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("Ṡ", GLYPH_COMPOUND, 11, 18, .combine_with = {.mesh_idx = 131, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("ṡ", GLYPH_COMPOUND, 9, 44, .combine_with = {.mesh_idx = 131, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("Ṫ", GLYPH_COMPOUND, 12, 19, .combine_with = {.mesh_idx = 131, .offset_x = 4, .offset_y = -3}) +GLYPH_DEFINE("ṫ", GLYPH_COMPOUND, 9, 45, .combine_with = {.mesh_idx = 131, .offset_x = 2, .offset_y = -2}) +GLYPH_DEFINE("Ṽ", GLYPH_COMPOUND, 13, 21, .combine_with = {.mesh_idx = 134, .offset_x = 2, .offset_y = -3}) +GLYPH_DEFINE("ṽ", GLYPH_COMPOUND, 9, 47, .combine_with = {.mesh_idx = 134, .offset_x = 0, .offset_y = 1}) +GLYPH_DEFINE("Ẁ", GLYPH_COMPOUND, 13, 22, .combine_with = {.mesh_idx = 77, .offset_x = 4, .offset_y = -3}) +GLYPH_DEFINE("ẁ", GLYPH_COMPOUND, 11, 48, .combine_with = {.mesh_idx = 77, .offset_x = 3, .offset_y = 1}) +GLYPH_DEFINE("Ẃ", GLYPH_COMPOUND, 13, 22, .combine_with = {.mesh_idx = 70, .offset_x = 4, .offset_y = -3}) +GLYPH_DEFINE("ẃ", GLYPH_COMPOUND, 11, 48, .combine_with = {.mesh_idx = 70, .offset_x = 3, .offset_y = 1}) +GLYPH_DEFINE("Ẅ", GLYPH_COMPOUND, 13, 22, .combine_with = {.mesh_idx = 67, .offset_x = 3, .offset_y = -2}) +GLYPH_DEFINE("ẅ", GLYPH_COMPOUND, 11, 48, .combine_with = {.mesh_idx = 67, .offset_x = 2, .offset_y = 2}) +GLYPH_DEFINE("Ẇ", GLYPH_COMPOUND, 13, 22, .combine_with = {.mesh_idx = 131, .offset_x = 4, .offset_y = -3}) +GLYPH_DEFINE("ẇ", GLYPH_COMPOUND, 11, 48, .combine_with = {.mesh_idx = 131, .offset_x = 3, .offset_y = 1}) +GLYPH_DEFINE("Ẋ", GLYPH_COMPOUND, 12, 23, .combine_with = {.mesh_idx = 131, .offset_x = 4, .offset_y = -3}) +GLYPH_DEFINE("ẋ", GLYPH_COMPOUND, 9, 49, .combine_with = {.mesh_idx = 131, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("Ẍ", GLYPH_COMPOUND, 12, 23, .combine_with = {.mesh_idx = 67, .offset_x = 2, .offset_y = -2}) +GLYPH_DEFINE("ẍ", GLYPH_COMPOUND, 9, 49, .combine_with = {.mesh_idx = 67, .offset_x = 1, .offset_y = 2}) +GLYPH_DEFINE("Ẏ", GLYPH_COMPOUND, 12, 24, .combine_with = {.mesh_idx = 131, .offset_x = 4, .offset_y = -3}) +GLYPH_DEFINE("ẏ", GLYPH_COMPOUND, 9, 50, .combine_with = {.mesh_idx = 131, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("Ẑ", GLYPH_COMPOUND, 11, 25, .combine_with = {.mesh_idx = 69, .offset_x = 2, .offset_y = -3}) +GLYPH_DEFINE("ẑ", GLYPH_COMPOUND, 9, 51, .combine_with = {.mesh_idx = 69, .offset_x = 1, .offset_y = 1}) +GLYPH_DEFINE("ẗ", GLYPH_COMPOUND, 9, 45, .combine_with = {.mesh_idx = 67, .offset_x = 1, .offset_y = -1}) +GLYPH_DEFINE("ẘ", GLYPH_COMPOUND, 11, 48, .combine_with = {.mesh_idx = 133, .offset_x = 3, .offset_y = 1}) +GLYPH_DEFINE("ẙ", GLYPH_COMPOUND, 9, 50, .combine_with = {.mesh_idx = 133, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("Ẽ", GLYPH_COMPOUND, 11, 4, .combine_with = {.mesh_idx = 134, .offset_x = 1, .offset_y = -3}) +GLYPH_DEFINE("ẽ", GLYPH_COMPOUND, 9, 30, .combine_with = {.mesh_idx = 134, .offset_x = 0, .offset_y = 1}) +GLYPH_DEFINE("Ỳ", GLYPH_COMPOUND, 12, 24, .combine_with = {.mesh_idx = 77, .offset_x = 3, .offset_y = -3}) +GLYPH_DEFINE("ỳ", GLYPH_COMPOUND, 9, 50, .combine_with = {.mesh_idx = 77, .offset_x = 2, .offset_y = 1}) +GLYPH_DEFINE("Ỹ", GLYPH_COMPOUND, 12, 24, .combine_with = {.mesh_idx = 134, .offset_x = 2, .offset_y = -3}) +GLYPH_DEFINE("ỹ", GLYPH_COMPOUND, 9, 50, .combine_with = {.mesh_idx = 134, .offset_x = 0, .offset_y = 1}) +GLYPH_DEFINE("–", GLYPH_NORMAL, 9, 298) +GLYPH_DEFINE("—", GLYPH_NORMAL, 16, 299) +GLYPH_DEFINE("‘", GLYPH_NORMAL, 4, 300) +GLYPH_DEFINE("’", GLYPH_NORMAL, 4, 301) +GLYPH_DEFINE("“", GLYPH_NORMAL, 7, 302) +GLYPH_DEFINE("”", GLYPH_NORMAL, 7, 303) +GLYPH_DEFINE("†", GLYPH_NORMAL, 8, 304) +GLYPH_DEFINE("‡", GLYPH_NORMAL, 8, 305) +GLYPH_DEFINE("•", GLYPH_NORMAL, 6, 306) +GLYPH_DEFINE("…", GLYPH_NORMAL, 10, 307) +GLYPH_DEFINE("‰", GLYPH_NORMAL, 14, 308) +GLYPH_DEFINE("‹", GLYPH_NORMAL, 5, 309) +GLYPH_DEFINE("›", GLYPH_NORMAL, 5, 310) +GLYPH_DEFINE("⁴", GLYPH_NORMAL, 5, 311) +GLYPH_DEFINE("€", GLYPH_NORMAL, 12, 312) +GLYPH_DEFINE("₯", GLYPH_NORMAL, 17, 313) +GLYPH_DEFINE("№", GLYPH_NORMAL, 16, 314) +GLYPH_DEFINE("™", GLYPH_NORMAL, 16, 315) +GLYPH_DEFINE("fi", GLYPH_NORMAL, 11, 316) +GLYPH_DEFINE("fl", GLYPH_NORMAL, 11, 317) diff --git a/tools/glyphs/README.md b/tools/glyphs/README.md new file mode 100644 index 000000000..71620b9a8 --- /dev/null +++ b/tools/glyphs/README.md @@ -0,0 +1,70 @@ +## Glyph Generation Tools + +These tools work alongside the injection tool to expand the original Tomb +Raider character set by adding new characters and accents. + +### Overview + +The game displays text using bitmaps, which are organized as sprites within the +alphabet object found in .phd and .tr2 level files. Additionally, the game +executable has hardcoded information regarding the locations, sizes, and +indices of these glyphs. + +Expanding the character set involves a complex process requiring the use of +multiple tools. + +**Summary:** + +`mapping.txt` + `glyphs.png` → +`generate_defs` → +intermediary files for the injection tool → +TRXInjectionTool → +`font.bin` injected into the game. + +### `mapping.txt` and `glyphs.png` + +The master files are located at `data/tr*/glyphs/*.{png,txt}`. The PNG files +are sprite sheets containing each character, while the text files provide +metadata for each glyph or icon's location, as well as optional transforms such +as shifts or bounding box resizes, using a domain specific language. + +Some characters are composed using special combining sprites. For instance, +instead of creating an accented version of the character `a` for each +variation, we use a single `a` sprite and separate sprites for all possible +accents. This method allows accents to be combined with various base characters +without redundancy. Every individual variation still needs to be defined in +`mapping.txt`. + +All characters are encoded in UTF-8, meaning each character can consist of +multiple bytes. Icons and buttons follow the same approach and are represented +by ASCII sequences like `\{button x}`. The game processes these similarly to +other glyphs. + +### `generate_defs` + +This tool processes `mapping.txt` and the associated source images to create +intermediary files needed by the injection tool, as well as update internal +definition files that end up embedded into the executable at the compilation +phase. It requires an argument for the game version since different games have +unique font styles and specifications. The result is a packed texture atlas +(which the injection tool later repacks) and a JSON file detailing each sprite +texture's location. These files must be placed in their relevant directories +within the injection tool resources. Afterward, the injection tool can be ran +to generate the final output file, `font.bin`, which should be eventually +placed in the injections directory for the game's use. + +### `test_alignment.html` + +This testing tool showcases how `mapping.txt` segments the sprite sheets, +allowing the developers to verify and correct any alignment issues. + +### `generate_compositions` + +This is a simple development tool that outputs all valid accented characters to +the standard output, and it is not a direct part of the main pipeline. + +### `test_language` + +Another development tool, this tests language coverage for the languages +intended to be supported. It operates based on `mapping.txt`, but is not +directly involved in the main pipeline.