#!/usr/bin/env python3"""The game's fonts, cut down to the characters it writes (config/lang.yaml): python3 tools/fonts.py <Lato-Bold.ttf> <cjk.ttf> <korean.ttf>ui.ttf: Lato Bold (OFL), Latin + Cyrillic. cjk.ttf: Noto Sans SC (OFL), Japanese + Chinese. ko.ttf: Noto Sans KR (OFL)."""import os, re, sysfrom fontTools import subsetfrom fontTools.ttLib import TTFontroot = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..')text = open(os.path.join(root, 'config', 'lang.yaml'), encoding='utf-8').read()blocks = dict(re.findall(r'^(\w\w):\n((?: .*\n)+)', text, re.M))basic = ''.join(chr(c) for c in range(32, 127)) + '‹›…'def cut(src, dst, chars): opt = subset.Options() opt.layout_features = ['kern'] opt.name_IDs = [1, 2] opt.notdef_outline = True font = TTFont(src) if 'fvar' in font: # a variable font: its bold instance from fontTools.varLib import instancer font = instancer.instantiateVariableFont(font, {'wght': 700}) cmap = font.getBestCmap() missing = sorted(set(c for c in chars if ord(c) not in cmap and c.strip())) s = subset.Subsetter(opt) s.populate(text=chars) s.subset(font) font.save(os.path.join(root, 'assets', 'fonts', dst)) print(dst, os.path.getsize(os.path.join(root, 'assets', 'fonts', dst)), 'bytes', 'MISSING: ' + ''.join(missing) if missing else '')latin = ''.join(v for k, v in blocks.items() if k not in ('ja', 'zh', 'ko'))cut(sys.argv[1], 'ui.ttf', basic + latin + ''.join(chr(c) for c in list(range(0xA0, 0x180)) + list(range(0x400, 0x460)) + [0x490, 0x491]))cut(sys.argv[2], 'cjk.ttf', basic + blocks['ja'] + blocks['zh'])cut(sys.argv[3], 'ko.ttf', basic + blocks['ko'])