【番外】事件窗口的界面文件
來自專欄鋼鐵雄心四Mod製作相關
1 人贊了文章
應 @Kyle·Broflovski 同志之邀,本文簡單帶領讀者閱覽一遍事件窗口的界面文件。
我們找到"interface"文件夾下的"eventwindow.gui"文件,它就決定了事件窗口的構成。

我們可以看到界面的定義基本遵從了這樣一個格式:
containerWindowType = { name = "<窗口名>" <其他定義> <其他元素> = { <其他元素的各類定義> }}
在"gui"文件中,"窗口",也就是"containerWindowType"可以說是基本的單位(當然,視具體定義內容的不同其實有很多情況,但是在多數情況下,尤其是在製作自定義界面時,這句話是沒有問題的),所有元素都需要窗口來承載,即便這個"窗口"未必需要讓玩家看見。比如你希望有一個憑空的按鈕,你在定義時就需要先定義一個窗口,然後在窗口下定義這個按鈕,不用擔心玩家會點到它,因為這個"窗口"沒有設置圖片或背景。但是關於自定義界面的修改知識跟事件窗口修改關係有限,暫不展開介紹。
在進一步說明之前,我們應該達成這樣一個認識:對於事件窗口這類與內核關聯較深的界面,"gui"文件中的元素"name"一般是不可更改的,其只用來決定各元素的位置和排列方式等,而不能真正改變這些功能的運作方式。比如,你可以讓選項由豎排變成橫排,或者兩列,都是可以的;但是你如果想讓選項摺疊在一起,需要點選一個按鈕才能展開,那就是天方夜譚了。
(注:下文建議與"eventwindow.gui"一同閱讀)
事件有四個種類:一般事件、省份事件、新聞事件、將領事件,其中一般事件與省份事件共用同一個窗口定義,所以在文件中可以發現三個最大的承載窗口:"EventWindow""EventWindow_leader"以及"EventWindow_News",其對應關係相信也一目了然了。
我們以"EventWindow"為例,首先可以看到在這一"窗口"下除了其他元素外還有如下介面:
position = { x=-282 y=-310 } # 坐標size = { width = 581 height =427 } # 窗口尺寸moveable = yes # 窗口是否可以被滑鼠拖拽Orientation = CENTER # 坐標運作方式,在本例為零坐標居中 show_sound = event_popup # 窗口出現時播放的音效hide_sound = menu_close_window # 窗口關閉時播放的音效
關於"窗口"下全部的可用介面、各個介面的全部可用指令等等,請允許筆者暫且拖延,在本文中只介紹原文件所應用到的介面,一方面是在修改涉及內核的界面時不建議進行不必要的大刪改,一方面是筆者另外準備了一篇針對自定義界面用法的教程,那篇文章還遠遠沒有準備妥當,而這些內容也應該出現在那篇文章里。
接下來則是"EventWindow"窗口下的各個元素了:
background = { name = "Background" spriteType ="GFX_tiled_window_transparent"}
這是"窗口"的背景,只有設置了背景,窗口才是對於玩家可見的(當然你背景搞個透明圖那就另當別論),而且很不湊巧的,它就是張透明圖。

接下來是"top_Window"次窗口:
containerWindowType = { name = "top_Window" position = { x=0 y=0 } size = { width = 581 height =121 } moveable = yes Orientation = UPPER_LEFT background = { name = "Background" spriteType ="GFX_event_report_top_win" } # 背景 instantTextBoxType = { name = "Title" # 不要改動 position = { x = 14 y = 70 } # 坐標 font = "hoi4_typewriter22" # 文本所應用的字體 borderSize = {x = 0 y = 0} # 邊框厚度,相當於向右下角偏移的坐標 text = "Title text here!" # 由於標題對接內核,故而這一介面在此處無用 maxWidth = 551 # 文本的最大寬度 maxHeight = 32 # 文本的最大高度 format = centre # 文本的對齊方式 } # 這一整個元素為一個文本,在此處是事件標題,文本的具體原理在將來會介紹 buttonType = { name = "btn_minimize" # 將事件收納到決議欄的小按鈕 position = {x=10 y=45} # 坐標 spriteType = "GFX_event_button_minimize" # 按鈕的圖片 clicksound = click_default # 點擊按鈕觸發的聲效 }}

次之則是"midsection":
containerWindowType = { name = "midsection" position = { x=0 y=121 } size = { width = 580 height = 100 } moveable = yes clipping = no # 窗口是否可以自動裁剪(影響窗口內容超框時的反饋) Orientation = UPPER_LEFT background = { name = "Background" quadTextureSprite ="GFX_event_report_tileable_midsection" } instantTextBoxType = { # 事件描述的文本 name = "Description" position = { x = 31 y = 0 } font = "hoi4_typewriter16" borderSize = {x = 0 y = 0} text = "Long text here!" maxWidth = 512 maxHeight = 230 format = left } }

最後是"bottom_Window":
containerWindowType = { name = "bottom_Window" position = { x=0 y=221 } size = { width = 581 height = 206 } moveable = yes clipping = no Orientation = UPPER_LEFT background = { name = "Background" spriteType ="GFX_event_report_bottom_win" } iconType = { # 事件圖片 name ="event_picture" spriteType = "GFX_report_event_001" position = { x = 5 y = 5 } Orientation = "UPPER_LEFT" allwaystransparent = yes # 這一介面使得玩家的滑鼠無法點擊到事件圖片(即若沒有這一介面,玩家滑鼠停滯在事件圖片上時是不能拖拽窗口的) } iconType = { # 事件圖片旁邊的小曲別針圖片,刪了也無妨 name ="event_pic_clip" spriteType = "GFX_event_pic_clip" position = { x = -3 y = 35 } Orientation = "UPPER_LEFT" } gridBoxType = { # 選項列表 name = "options_grid" position = { x = 215 y = -1 } size = { width = 300 height = 30 } # 總大小 slotsize = { width = 300 height = 47 } # 單個項目所佔的大小 max_slots_horizontal = 1 # 排列方式 format = "UPPER_LEFT" }}

我們再來到文件尾,可以找到關於選項的定義:
containerWindowType = { name = "event_option_entry" size = { width = 300 height = 47 } clipping = no background = { name = "event_option_background" spriteType ="GFX_event_option_entry" } instantTextBoxType = { name = "Name" position = { x = 5 y = 0 } font = "hoi_20bs" maxWidth = 340 maxHeight = 40 format = center vertical_alignment = center alwaystransparent = yes }}
這一段文件決定了每一個選項的樣子。
通過閱覽一遍文件,我們可以發現事件窗口修改的思路就是調整這些元素的坐標和所調用的圖片,並且要注意到事件上中下的切分方式,這是為了使得不同長度的描述文本對應不同的事件尺寸。
添加滑塊其實很簡單,只需要在"bottom_Window"窗口下添加如下介面:
verticalScrollbar = "right_vertical_slider"margin = {top=0 left=0 bottom=0 right=0} # 滑塊所限制之內容的坐標偏移
再經過一些坐標和尺寸的調整,就可以迎接我們的摺疊選項了:

那麼,如果我們想讓選項排成兩列甚至是三列呢?
只需要將"options_grid"下的"max_slots_horizontal"數值調整為你所需要的列數即可(並且調整其尺寸,如,若單個選項佔5*5像素,你希望每三個選項一列,則調整"options_grid"的尺寸為300*15)。
在我們了解了如何移動界面元素的坐標後,我們再來看看該如何修改圖片吧。
首先我們知道了,在界面中定義一個圖片是通過如下的方式:
iconType = { # name ="<圖標id>" spriteType = "<調用的圖片>" position = { x = -3 y = 35 } # 坐標 Orientation = "UPPER_LEFT" # 對齊方式}# 範例iconType = { name ="event_pic_clip" spriteType = "GFX_event_pic_clip" position = { x = -3 y = 35 } Orientation = "UPPER_LEFT"}# 對於背景background = { name = "<背景id>" spriteType ="<調用的圖片>"}# 範例background = { name = "event_option_background" spriteType ="GFX_event_option_entry"}
那麼這些被調用的圖片來自何處呢?
我們可以看到在"interface"文件夾下,還存在著大量的".gfx"後綴的文件,它們就是圖片的來源。
你可以新建一個".gfx"文件亦或是沿用已有的,圖片定義在任何一個".gfx"文件中都可以被系統讀取。
用軟體打開該文件後,其基本的定義方式也是一目了然的:

故而我們可以總結出,一個完整的".gfx"文件,由以下的格式組成:
spriteTypes = { <各類元素>}
筆者暫時不講解原版文件中各類定義的作用,對於初學者,掌握基本的定義圖片的格式即可:
spriteType = { name = "<圖片id,筆者個人將其稱為"GFX項目">" texturefile = "<路徑,要注意此處所用的斜杠與常用的相反>"}# 範例spriteType = { name = "GFX_event_news_pic_overlay" texturefile = "gfx/interface/event_news_pic_overlay.dds"}
通過在".gfx"文件中進行如此定義,系統就可以讀取你的圖片了。在gui中所調用的,正是此處所定義的圖片id,筆者亦稱之為"GFX項目"。
在製作和修改界面時,我們會發現調整過程並不是一蹴而就的,但是隨著版本更新,P社也在儘可能為Modder們創造更加方便的條件。
以debug模式啟動遊戲(在steam中右鍵遊戲-屬性-常規-設置啟動項中輸入"-debug"不含引號)後,你對gui文件的修改可以被遊戲自動讀取並更新窗口,換句話說,在這個模式下,只需要啟動一次遊戲就可以進行坐標的調整和試錯了。
同時,控制台指令中同樣給予了重新讀取指定文件的方式,只需要在控制台中輸入"reload interface/<相應文件名帶後綴>",遊戲就會重新讀取指定的文件。但是很遺憾,gfx文件不在此列,圖片定義是必須重啟遊戲才能生效的。
並且在調整界面時,Modder還有一個可以利用的特殊模式。
在控制台中輸入"gui"後,遊戲會啟動一個特殊的覆蓋層,為玩家標識滑鼠所停留的窗口的尺寸、滑鼠所停留的元素的"name""GFX項目""當前幀數"等信息,活用此功能可以使製作更加方便。

以上就是所有內容了,界面修改相關的較全面的教程筆者仍在梳理,本文簡單介紹了一下事件窗口gui文件的內容,沒有太多教程性質的內容,如果實在不理解,請在評論區追問,筆者會嘗試解答,讀者亦可以自行嘗試修改,積累經驗。
推薦閱讀:
TAG:鋼鐵雄心4遊戲 | P社遊戲 | 鋼鐵雄心HeartsofIron |

