Font modding

本頁面所適用的版本可能已經過時,最後更新於1.12

創建新字體

製作新字體需要用到 BMFont 程序,該程序可用於從字體生成字體頁面和描述文件。

在BMFont 安裝完畢後,啟動程序,進入選項菜單並選擇字體設置。導入你的字體文件後,從下拉菜單中選擇字體(字體可以在Google Fonts-谷歌字體進行下載) 。在完成這些步驟後,即可開始配置字體設置。

字體設置

導入字體後便可以設置字體外觀了。為此,再次打開字體設置菜單。以下是需要調整的:

  • 字符集 (Charset): 將其設定為統一碼(Unicode)
  • 大小(Size):這是輸出頁面的每個字體的大小,將其設定為你想要的尺寸。
    • 請注意,較大的字符尺寸會增加對於最終輸出的空間占用,並可能將你的結果分散在多個位圖中。如需使用多個位圖,必須生成單獨定義的字體文件,因此建議儘量將所有字體保留在一個位圖中。(譯者註:由於中文的表意方式與英語不同,將中文字符保留在一張位圖里幾乎不可能,如果你這麼做,可能會導致嚴重的字符缺失等,建議參考https://www.bilibili.com/opus/710497357426327574)
  • 匹配字符高度(Match char height):勾選此項以確保所有字符的高度一致。
  • 字體平滑(Font smoothing):如果字體邊緣在遊戲中看起來過於銳利,請勾選此項。
  • 輪廓厚度(Outline thickness):如果希望字體帶有輪廓,可在此設置所需的輪廓厚度。
    • 請注意,這會導致字符在字體位圖中的尺寸增加,因此會占據更多的空間。

完成設置後,點擊"確定"(OK)以保存更改。

導出選項

設置完字體後,就可以配置導出遊戲可識別的字體位圖格式了。為此,打開導出選項菜單(Export Options)。以下是你可能需要調整的:

  • 填充(Padding):調整字體圖像中每個字符邊緣的內邊距。僅在需要手動編制字體文件且希望字符之間保持一定距離時才需設置此項。
  • 色彩深度(Bit depth):將其設置為32。
  • 間距(Spacing):控制字體圖像中字符之間的最小間距。將此項設置為1-1;如果字符出現相互重疊的問題,請將其設置為更高的值。
  • 寬高(Width & Height):導出的字體位圖的尺寸。調整此項以確保所有字符都能容納在一張圖上。(見上譯者注)
    • 請注意,寬度與高度的增加會顯著增加文件的大小。遊戲無法處理超過16MB的單個字體圖像文件,其中Paradox的中文字體最大文件大小為16,001KB。在不使用較高強度的壓縮的情況下,此限制很容易達到。您可以通過為同一字體定義多個連結的位圖來規避這一限制,就像Paradox 使用的11個 14-16MB 中文字體位圖連結一樣。
  • 通道(Channels):控制字符的合成方式。若未設置輪廓,請將所有通道設為glyph;若已設置輪廓,則將Alpha通道(A)設為outline,其餘通道均設為glyph
  • 預設(Presets):若已手動選擇上述通道,則此項可忽略。選擇任何適合文本的預設即可,但需確保包含 Alpha 通道。
  • 字體描述符(Font descriptor):需設置為文本格式(text)。
  • 材質(Textures):應設置為.dds。
  • 壓縮(Compression):選擇文件所使用的壓縮格式。如果使用DDS文件格式,請選擇適當的壓縮類型。
    • 無壓縮(None):選擇此項即不進行壓縮,但會導致文件體積巨大,並可能會阻止HOI4處理位圖。僅應在較小的字體導出文件中使用。
    • DXT1 是最高級的壓縮選項,擁有最差的畫質,僅支持1或0的透明度(沒有漸變效果,像素要麼完全不透明,要麼完全透明)。
    • DXT3 是中等壓縮,透明度質量較高,且支持漸變效果。
    • DXT5是輕度壓縮,具有最高的畫質和透明度效果,是除「無壓縮」外壓縮率最低的選項。

完成設置後,請點擊 「確定」(OK)以保存更改。

選擇字體字符

軟體右側提供了不同字符類型的複選框。如果使用了字體中不存在的字符,將顯示為一個帶問號的方框。請選擇符合字體用途的字符類型。您還可以在左側窗口中點擊字符圖標,手動選擇字符,從而精確控制哪些字符會包含在位圖中。

在任何情況下,都必須選擇Latin和Latin-1補充中的1-3個空白框(Latin-1可能不會出現),以確保間距正常運作。否則,文字將顯示為無間隔的狀態。

推薦在提示框上使用的字符包括:

  • Latin + Latin-1 Supplement(拉丁+拉丁字母補充-1)
  • Latin Extended-A + B(拉丁字母擴展-A + B)
  • Latin Extended Additional (拉丁字母擴展附加)
  • General Punctuation (一般標點)

取決於語言的推薦地圖字體字符:

  • Latin Extended Additional - 拉丁字母(符號可省略):
    • Latin + Latin-1 Supplement(拉丁+拉丁字母補充-1)
    • Latin Extended-A + B(拉丁字母擴展-A + B)
    • Latin Extended Additional(拉丁字母擴展附加)
  • Cyrillic Alphabet(西里爾字母):
    • Latin + Latin-1 Supplement (blank spacing boxes) - 拉丁+拉丁字母補充-1(包括空白間距框)
    • Cyrillic + Cyrillic Supplement(西里爾字母補充)
    • Cyrillic Extended-B (西里爾擴展-B)

保存字體

設置好字體後,按下鍵盤上的 V 鍵檢查所有字符是否都能容納在一頁中。如果不能,且不打算使用多個字體位圖,則需要增加字體圖像的寬度和高度,或減小字體大小。

通過點擊選項菜單中的「Save bitmap font as...」(快捷鍵 CTRL+S)來保存字體。

圖像文件和字體文件的名稱必須完全相同,除了擴展名。雖然 *.fnt 文件指定了要使用的圖像文件,但遊戲會優先選擇名稱相同的文件,而非內部定義的文件。這一點在位圖字體定義中省略文件擴展名時也能體現。此外,位圖字體定義的名稱無需與字體文件一致,可根據需求進行自定義。

字體的位置由位圖字體定義決定,因此不必放在/Hearts of Iron IV/gfx/fonts/ 文件夾中,儘管基礎遊戲將所有字體都保存在該文件夾中。地圖字體是tahoma_60位圖字體,默認連結到/Hearts of Iron IV/gfx/fonts/hoi_mapfont4 文件,以及相應的../chinese/../japanese/ 文件夾。

快速檢查清單

  • 打開 BMFont並選擇字體。
  • 選擇適當的字體設定並保存更改。
  • 使用正確的設置和所需的字符集導出字體。
  • 從生成的 .dds 文件名稱末尾去掉 "_0",使其與定義字體的文件名稱保持一致。
  • 如有需要,為字體添加 字距調整 (Kerning)
  • 如果是添加新字體而非編輯現有字體,需添加一個bitmapfont = { ... }定義.

字距調整 (Kerning)

儘管許多字體會包含字距調整信息,但有些字體在導出時不會將此信息包含在字體文件中。可以通過打開 *.fnt 文件並查找以 kerning first=開頭的行來確認。若缺少字距調整,可能會導致遊戲中的字符重疊,影響視覺效果。要解決此問題,需在字體文件中手動添加字距調整信息。

為此,打開字體文件,並為每對字距調整字符添加一行,格式如下:

kerning first=<symbol position> second=<symbol position> amount=<pixel width>

在 BMFont 中,將滑鼠懸停在字體編輯區上的字符上,可以通過右下角的狀態欄查看該字符在字體中的位置。像素值表示第一個字符與第二個字符之間的間距。手動創建每個字距調整的效率較低,使用程式語言(如 Python)生成字距調整行則快捷得多。以下是一個可在 Python 3.x 或更高版本中使用的示例腳本:

file = open( "kerning.txt", "wt" )

    # Add the symbol positions of the blank symbol slots here.
    exclude = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 , 15, 16, 17, 18, 19, 20, 21, 22, 23, 25, 26,
                27, 28, 29, 30, 31, 127, 129, 141, 143, 144, 156, 173, 181]

    for x in range( 1, 255 ):
        for y in range(1, 255):
            if x not in exclude:
                if y not in exclude:
                    file.write( "kerning first={0}  second={1}  amount=1\n".format( x, y ) )

    file.close()

定義位圖(Defining bitmaps)

要在 /Hearts of Iron IV/gfx/fonts中連結新字體,必須在 /Hearts of Iron IV/interface/*.gfx file文件中創建一個條目(entry)。如果是編輯已有字體,則該條目已存在,且無需修改。以下是一個示例條目:

bitmapfonts = {
    bitmapfont = {
        name = "my_font"
        fontfiles = {
            "gfx/fonts/font_bitmap_1"
            "gfx/fonts/font_bitmap_2"
        }
        color = 0xffffffff

        textcolors = {
            G = { 86 172 91 }
        }
    }
}
  • name 指定字體的名稱,此名稱用於指定 界面元素所使用的字體文件。所有字體用途都需要此名稱,地圖字體除外(始終為 tahoma_60)。要查找基礎遊戲中位圖字體的使用位置,建議在文本編輯器中搜索 interface 文件夾中的所有 *.gui 文件,,並檢查搜索結果以獲取完整列表。
  • fontfiles指定字體使用的所有位圖的位置,即 /Hearts of Iron IV/gfx/fonts/*.fnt 文件的路徑,但不包含 .fnt 擴展名。文件中不應定義重複的字符。如果字體只使用一個字體文件,可直接使用path = "gfx/fonts/my_font"
  • color 定義字體的顏色,其使用 ARGB 格式的十六進位代碼。0x 後的前兩個字符定義字體的透明度, 00 表示完全透明,FF 表示完全不透明。接下來的六個字符為 RGB 代碼,每種顏色值在 00FF範圍內。
  • textcolors 提供 文本顏色的覆蓋功能,允許將特定文本顏色更改為不同於默認值的顏色,從而在此字體上呈現出不同的效果。

覆蓋位圖(Overriding bitmaps)

此外,可以在遊戲設置為特定語言時覆蓋位圖字體。主要用於非拉丁字母的語言,因為這些字體通常過大,無法壓縮到 16 MB 文件內(例如簡體中文)。默認情況下,HoI4 已將必要的西里爾字母和拉丁字母的地圖字體字符包含在一個文件中,但簡體中文的漢字數量龐大,因此需要 11 個大約 為4096x4000 的位圖文件,並在/Hearts of Iron IV/interface/code_chinese.gfx中使用override block來定義。

上述在 /Hearts of Iron IV/interface/*.gfx 文件中的覆蓋條目示例如下:

bitmapfonts = {
    bitmapfont_override = {
        name = "my_font"
        fontfiles = {
            "gfx/fonts/font_bitmap_1"
            "gfx/fonts/font_bitmap_2"
        }
        languages = { "l_russian" "l_polish" }
    }
}
  • path = "gfx/fonts/my_font" 如果僅使用一個位圖,可以再次使用它,而不必使用 fontfiles =
  • languages = 必須等於 HoI4 支持的語言之一。所有支持的語言在 /Hearts of Iron IV/localisation文件夾中都有對應的文件夾。

生成多個位圖的工作量是唯一的缺點,但這是將不同字母表的字體分開組織的有效方法。如果一個 mod完全採用自定義字體,這種方式還能提供更大的空間,以支持更大、更高質量的字符和字體設計,同時減少鋸齒效果。