中文字怎麼畫上去
技術篇
原版的字是 8×8 像素,畫在 320×200 的畫面上。英文夠用,中文放不下。解法是讓遊戲美術和中文字用不同的解析度:美術放大兩倍以上,中文直接畫在放大後的畫面。
為什麼不能把中文縮小
I 代實際試過:把 12 像素的中文畫在 320×200 裡,再整張放大三倍。結果筆畫糊掉,行距還重疊,完全讀不了。像素畫放大後看起來是方塊,中文字放大後還是只有 12 格的資訊量,再放大也不會多出筆畫。
所以要反過來。內部畫布拉到 640×400,正好是原版的兩倍。底圖用最近鄰放大(每個像素直接變成 2×2 的方塊),維持銳利。中文在 640×400 的座標上畫,一個字就有 16 格的資訊量。
六代的選擇
| 代 | 內部畫布 | 字型 | 類型 |
|---|---|---|---|
| I | 640×400 | Noto Serif CJK TC,16 像素 | TrueType,抗鋸齒 |
| II | 320×200 的 N 倍,建議 960×600 | 文泉驛正黑,24×24 | TrueType |
| III | 640×480 | Noto Sans CJK | TrueType,透過 SDL_ttf |
| IV | 640×400 | Noto Sans CJK TC,可換宋體、楷體 | 灰階字庫,設定畫面另用 SDF 紋理字 |
| V | 640×400 | 倚天 3.53 的 16×15 點陣 | 點陣,手工調整過 |
| VI | 640×400 | 文泉驛 Zen Hei Sharp 16×16 | 內嵌點陣,Big5 排列 |
TrueType 或點陣字
TrueType 字型來源乾淨、可以任意尺寸,III 代就靠它一次換掉全遊戲的文字。
V 代選了另一條路:1990 年代 DOS 中文遊戲用的倚天字型。它的 16×15 點陣是為這個尺寸手工調的,TrueType 縮到這麼小會糊,筆畫比例也不對。代價是字庫衍生自 1993 年的商業字型,不能隨專案散布,要玩家自備。另外還要處理幾個細節:
- 漢字庫不含全形標點,標點在
SPCFONT.15。漏了它,畫面會出現「字是倚天、標點是別的字型」,所以工具在缺檔時直接報錯。 - Big5 到字庫的索引不是線性的。用四個已知字(「一」「中」「猴」「。」)驗證公式,改動後都要重跑。
- 中文寬 16 像素,正好是英文 8 像素的兩倍,混排時欄位對得齊。

VI 代:一個「杜」字換來的改版
VI 代原本用 12×12 點陣。有朋友把「杜普雷」看成「壯普雷」,因為「木」被擠成一條連續橫筆。問題出在格子不夠,調字型救不回來。
v2.0 參考 1991 年 PC-98 日文版的做法,把畫面拆成三層:遊戲照舊畫在 320×200,放大兩倍後,再疊一層 640×400 的中文。遊戲既有的繪圖程式一行都不用改。


幾個經典亂碼
下面這些錯誤看起來都像「字型壞了」,根因都在編碼。
Big5 第二個位元組撞到反斜線(VI 代)
「許、功、年、橋」等 88 個常用字的第二個位元組是 0x5C,也就是 \。文字檔的載入程式把它當跳脫字元,後面整段錯位。最後改用帶長度前綴的二進位格式。
英文解碼程式砍掉中文高位元(III 代)
底部訊息區的中文全變成控制碼。上游有一行 gString[pos] & 0x7F,只留低七位,對英文沒影響,對 UTF-8 中文就是破壞。
16 位元字串被當 UTF-8 讀(IV 代)
商店對白整段亂碼夾空白。腳本引擎把含中文的字串存成 UCS2,輸出時卻當 UTF-8 讀,高位的 0x00 還把字串截斷。修法是依字串的實際編碼逐字轉換。
斷行靠空格(VI 代)
引擎用空格找斷點,中文沒有空格,整句變成一個單字,直接超出面板。修法是把每個中文字當成獨立的單字。
量的和畫的不一致(V 代)
計算寬度和實際繪製只要判斷條件不同,算出來的斷行就和畫面不符,症狀卻很像譯文太長。V 代把度量和斷行抽成獨立模組,繪圖只用它的結果。
玩家要輸入的字不能翻(IV、V 代)
咒語、Yes、No 和對話關鍵字會拿來和玩家打的字比對。翻成中文就再也比對不到,所以這些字維持英文,只換顯示的部分。
來源:u1-cht 中文化筆記、u2-cht 工程文件、u3-cht 字元修正、u4-cht 商店文字、u5-cht 中文化筆記、u6-cht v2.0 發行說明。