katsuji
活字, movable type. Variable-width font tooling for a816 SNES projects.
Build a project's fonts and strings
katsuji.toml at the project root:
[fonts.dialog]
png = "fonts/vwf.png"
cell = [8, 16]
table = "text/ff4fr.tbl"
output = "assets/font.dat"
widths = { "0xFF" = 3, "0xA0" = -1 } # negative trims, positive sets
kerning-candidates = ["Ta", "Te", "va"] # tested for collision kerning
kerning = { "tt" = 2 } # hand-tuned: pixels tighter
[fonts.menu]
png = "fonts/8x8vwf.png"
cell = [8, 8]
table = "text/ff4_menus.tbl"
output = "assets/menu_font.dat"
constants = "assets/menu_font.i" # a816 constants describing the file
[strings.items]
font = "menu"
file = "text/items.txt" # one string per line (or `texts = [...]`)
bpp = 2
ink = 3
paper = 1
blob = "assets/items_vwf.dat" # tiles, no string across a bank edge
index = "assets/items_vwf.idx" # 4 bytes per string: offset lo16, bank, tiles
katsuji build # writes every output, paths relative to katsuji.toml
katsuji banner "Tarot" --table text/ff4fr.tbl --font assets/font.dat
Library
Atlas: a font drawn as a PNG grid of cells.find_kerning/pair_kerning: pair kerning by collision (one diagonal touch, never side by side).VwfFont: the font file the a816 VWF runtime reads (1bpp rows + width per glyph, kerning pairs, height).render/measure: text set at build time exactly as the runtime sets it.Wrapper: word wrap by pixel width, the game's control codes as data.Window/WindowBuilder: fill text windows; a game's script rules drive them.encode_tiles/colourize: SNES 2bpp / 4bpp planar tiles.text_tiles/pack_runs: static strings pre-rendered to a bank-safe blob.
Grown from ff4's tooling: its five fonts rebuild byte for byte, its wrapping and dialog goldens pass.
uv sync
make check
Metadata
Release files for katsuji 0.2.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| katsuji-0.2.3.tar.gz | 98.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| katsuji-0.2.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 126.9 kB
Release files / katsuji-0.2.3.tar.gz
| Download URL | katsuji-0.2.3.tar.gz |
|---|---|
| Size | 98.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c3808db673a29a18a8b0c7e8e94300f80347df51a2128a38cd3a5a5e28bc26f8
|
|
BLAKE2b-256 checksum How to use checksums |
3996a8e1524a286435bd9b8e4b28a4cb2eb3306e2f473511e773698087ed041b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
Hatch/1.18.1 {"ci":true,"cpu":"x86_64","distro":{"id":"noble","libc":{"lib":"glibc","version":"2.39"},"name":"Ubuntu","version":"24.04"},"implementation":{"name":"CPython","version":"3.15.0"},"installer":{"name":"hatch","version":"1.18.1"},"openssl_version":"OpenSSL 3.5.9 29 Sep 2026","python":"3.15.0","system":{"name":"Linux","release":"6.17.0-1022-azure"}} HTTPX2/2.13.1
|
Release files / katsuji-0.2.3-py3-none-any.whl
| Download URL | katsuji-0.2.3-py3-none-any.whl |
|---|---|
| Size | 28.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3d403f710e8241da56e76b867385dfb348284e98c462dfc98d5107b77011b854
|
|
BLAKE2b-256 checksum How to use checksums |
d913febbd67903c0dd5537506bc096875300a7ba1217db731fc99185fa5fa589
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
Hatch/1.18.1 {"ci":true,"cpu":"x86_64","distro":{"id":"noble","libc":{"lib":"glibc","version":"2.39"},"name":"Ubuntu","version":"24.04"},"implementation":{"name":"CPython","version":"3.15.0"},"installer":{"name":"hatch","version":"1.18.1"},"openssl_version":"OpenSSL 3.5.9 29 Sep 2026","python":"3.15.0","system":{"name":"Linux","release":"6.17.0-1022-azure"}} HTTPX2/2.13.1
|