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.2
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.2.tar.gz | 97.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| katsuji-0.2.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 125.7 kB
Release files / katsuji-0.2.2.tar.gz
| Download URL | katsuji-0.2.2.tar.gz |
|---|---|
| Size | 97.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
dd4c715fdb654be6f5382a0ccb98ff9ef21fc60140bf7b2d482da43d710c749d
|
|
BLAKE2b-256 checksum How to use checksums |
03784336cd4c1a7d327161b986494b7158991674812ba3d6715ce443be643c89
|
| 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.2-py3-none-any.whl
| Download URL | katsuji-0.2.2-py3-none-any.whl |
|---|---|
| Size | 28.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
512dd294d7ceec1ff0a0515af31ae7e2c4dc6ed1523fbdc219d332534a246948
|
|
BLAKE2b-256 checksum How to use checksums |
0da9baecd6eaf11b9cf37de4159f06029ca4ad84b7844929b1824b5492b34720
|
| 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
|