【鋼鐵雄心4/MOD教程】第-1篇:1.5新系統——決議的編寫
大家好,這次能來為本專欄寫一個新系列的、畫風有點不一樣的「科普」(雖然這普及可能跨度有點大),非常榮幸。我與另外幾位MOD圈的朋友本來希望寫一個從0開始一步一步HOI4/群星的MOD教程,但是由於P社HOI4 1.5的更新,我們自然也想「蹭蹭熱度」,所以提前先介紹一下決議。這其中有很多很多語句是假定大家有MOD基礎了,所以如果沒有MOD基礎但是也希望學習MOD修改遊戲的朋友們不用灰心,可以關注我們後續的文章。這篇教程相對本專欄其他文章可能主題方面差的有點遠,所以不感興趣的朋友可以不用在意這個系列的文章。
(另外給大家一個小消息:明清之際的作者很快會更新,大家不要慌)
提示:本文需要一定的MOD基礎
大家都知道,P社在鋼鐵雄心4的1.5版本中添加了一個新的系統——決議。有別於國策和事件,P社稱這個系統是「玩家可控且更加靈活的」。不管他們原版在利用這個系統的時候究竟是否做到了這點,對廣大玩家和modder來說,多一個系統總是喜聞樂見的。在之後的專欄文章中會一步一步詳細指導一下P社遊戲的mod製作流程,但在本文,還需要您有一定MOD基礎。
大致上,我們可以把決議分成兩類:
可以被主動激活的,不可以被主動激活的。
前者就是普通決議,後者則是任務/危機。
下面我們來詳解這些決議如何編寫。
基本篇:
- 基本架構:
首先,決議系統中存在一個名為決議組的東西。
決議組是什麼呢?就如此上的恢復拜占庭帝國一樣,這是將同一類決議歸類到一個大類下,並且加上圖片和文字描述的東西。
聽起來像是一個沒有實際作用的東西,實際上如果沒有決議組,你無法添加決議。
如何編寫決議組?(請遵守MOD原則,不要在遊戲文件夾修改/添加/刪除文件,而是創建MOD)
在common/decisions/categories文件夾下任意新建一個.txt文件,之後用任意工具打開(不涉及編碼)
我們拿遊戲內的文件舉例子
form_scandinavia_category = { icon = generic_formable_nations picture = GFX_decision_cat_generic_scandinavia allowed = { has_dlc = "Waking the Tiger" }}
這裡是成立大斯的決議組。
首先我們要寫一個
xxx = {}
大框架,這裡xxx便是你新建決議組的名稱,注意不要與其它的重複,接下來我們還要用。
接著花括弧內的參數有:
(1)icon = xxx(非必要)
這裡的icon=xxx表示決議組的圖標,具體可見上方成立拜拜的圖標。
這是圖標
(2)picture=xxx(非必要)
決議的圖片。
這是圖片
(3) allowed ={}(非必要)
花括弧內是編寫條件。這裡allow中只在開局檢查一次條件,只要開局檢查條件不滿足,此後就一直不會顯示決議組(以及其中的所有決議)。這是一個靜態的檢測。因此我個人不常用這個,特別是沒有必要在決議組內檢查。頂多只有P社蠢驢用來檢查DLC(你不會在一盤遊戲中途購買DLC並下載吧?)
(4)決議的文本
你可能發現了,這裡並沒有提供決議的文本的參數。實際上,你只需要在任意一個localisation里添加xxx:0 「文本」 和xxx_desc:0 「文本」就可以添加決議組的名字和描述了。這裡我懶得漢化包拆包,拿自己的私貨舉例子吧:
form_UNE_category = { icon = generic_formable_nations}
我定義的決議組名字叫form_UNE,於是應該這樣編寫:
1.決議的基本架構
(1)決議的第一步
這裡我們先介紹瞬時的普通決議。
首先,當您編寫好了決議組後才可以添加決議。
我們在common/decisions下新建一個.txt,並用任意文本編輯器打開。
首先,我們寫決議,第一步是先把決議組的名字作為最外層的主嵌套,接下來我們添加決議都要在這個花括弧內進行。
form_UNE_category = {#剛剛我們定義的決議組名字#接下來我們就要在這裡面添加決議代碼}
(2)添加第一個決議
接下來我們添加第一個決議,這隻需要再增加一個嵌套,嵌套前可以任意命名,這就是你要添加的決議的名字。這樣,我們就加入了第一個空的決議。
(注意:一個嵌套就是一個決議,決議之間是平行的)
form_UNE_category = { form_UNE = {#注意:這裡的命名我用的和決議組相似,實際上是任意的 #接下來第一個決議的一切都在這裡面編寫 }}
在這裡介紹一下決議的兩個性質:
可見性:你可以在決議欄里看到這條決議,無論能否執行
可執行:你可以執行決議
這個決議空空如也,我們該怎麼修飾它呢?接下來介紹它的參數
△0:icon =x(後來補上去的)
和前面的決議組裡icon的一個效果
△1:allowed = {#條件}
如我之前所說,這裡的allowed和決議組內的差不多,不過這只是開局檢測一次,如果不滿足,這條決議整局都不可見,而不是整組決議不可見。
這是一個靜態的檢測,一旦開局不滿足,哪怕後來滿足了allowed內的條件,都不會再顯示這條決議。
除非是一定要檢測開局,無視後來發展的情況(這幾乎不存在)。
例如:如果要限制玩家開局必須是39劇本,那麼就可以用這個,檢測開局的年份,如果不是39年,那麼,該決議全局不可見。(這樣即使時間走到了39年,這個決議也是不可見的)
然而這其實也能用start_date解決…(劃掉)。
其他情況我不推薦用,一作為MOD還要限制玩家DLC,說不過去。二,如果不是用來限制DLC,它幾乎可以被如下一個參數取代(動態檢測)。
所以我一般推薦大家不寫,或者留空
form_UNE_category = { form_UNE = { allowed = { } }}
(經過與大佬的交流,補充:如果只要檢測開局一次的那就盡量用這個,因為visible動態檢測會耗費CPU不停的檢測,例如:檢測tag)
△2.visible = {#條件}
這是一條動態檢測語句(有一定延遲)。當花括弧內的條件滿足時,決議會變得可見。一不滿足,決議會變得不可見。
它不是只開局檢測一次,而是實時在檢測,因此很常用。特別是:當我們已經執行了一次該決議後,要讓這個決議不再可見,我們可以用到它。這是很常見的,比如變身之類的決議,如果已經滿足條件後,執行了一次變身,我們當然不希望玩家能夠再看到這條變身決議,即使它無法執行也很奇怪。
舉例:
visible = {
NOT = { has_global_flag = form_UNE_flag }
}
如果沒有全局變數form_UNE_flag,那麼這條決議可見。
這將搭配接下來的語句,我們可以實現「執行一次後決議就不再可見」。
△3.available = {#條件}
這是判斷決議是否可以執行的語句。如果花括弧內的條件滿足,那麼這個決議就是可以執行的,否則便不可以執行。
可執行是建立在可見的基礎上的,如果不滿足可見性,那麼可執行性也無從談起(大家都知道執行決議是點決議欄後面那個亮起來的帶勾的信,如果決議都不顯示了,也就沒有這個信了)。
例如:
available = { custom_trigger_tooltip = { tooltip = form_UNE_world_required_tt all_state = { is_owned_by = ROOT } }}
我在這裡的意思是設置一個自定義文本,實際條件是,地圖上所有地區都屬於ROOT國家。(ROOT就是指「想要」執行該決議的國家。比如美國想執行,那ROOT就是美國。法國想執行,那ROOT就是法國)
不同於可見性,available的條件是可以通過把滑鼠停在書信符號上來查看的。
於是 現在我們的代碼變成了:
form_UNE_category = { form_UNE = { icon = generic_form_nation allowed = { } available = { custom_trigger_tooltip = { tooltip = form_UNE_world_required_tt all_state = { is_owned_by = ROOT } } } visible = { NOT = { has_global_flag = form_UNE_flag } } }
註:available,visible,allowed三者的順序並不重要。
現在的代碼在遊戲中如圖所示:
不過這個決議現在還沒有給這個決議添加執行後的效果。
△4:cost = X
非常簡單的一個參數,用於設置執行決議需要花費的政治點數。X為數字。
例如:
cost =25
△5:complete_effect = {#效果}
接下來就是另一個非常重要的東西,完成獎勵了。完成獎勵其實就是效果語句,和上面的條件一樣,效果也是大家自由發揮的。不過別忘了我們之前留的一個坑。
示例:
complete_effect = { set_cosmetic_tag = UNE custom_effect_tooltip = form_UNE_world_reward_tt hidden_effect = { every_state = { if = { limit = { NOT = { is_core_of = ROOT } } add_core_of = ROOT } } set_global_flag = form_UNE_flag country_event = { id = more_dec_form.1 hours = 6 } } }
我們來分析一下這裡的每一句話,首先是執行後給執行的國家加上一個自定義標籤:UNE,然後設置一個名為form_UNE_world_reward_tt的自定義文本,然後下方加上隱藏效果(不顯示具體效果)。
隱藏效果包括,首先,把所有不是本國核心領土的地區加上本國核心。然後設置一個全局變數form_UNE_flag。注意,這時候就和前面的visible聯動起來:
visible = { NOT = { has_global_flag = form_UNE_flag }}
當我們執行這個決議後,就設置了一個變數form_UNE_flag,這時visible的條件(沒有該全局變數)就不滿足了,那麼決議就不可見,完成了我們需要的效果。接著是一個延遲6小時的事件。
△6ai_will_do = {}(非必要)
設置AI傾向(執行的概率),如:
ai_will_do = { factor = 100}
△7.決議名文本
這裡你是不是又疑惑了?決議名的文本在哪,事實上,和決議組一樣,只要在隨意一個localisation文件里加入一行 決議名稱:0 「文本」 即可
補充好相關文本後,最後的代碼、效果
form_UNE_category = { form_UNE = { icon = generic_form_nation allowed = { } available = { custom_trigger_tooltip = { tooltip = form_UNE_world_required_tt all_state = { is_owned_by = ROOT } } } visible = { NOT = { has_global_flag = form_UNE_flag } } cost = 25 complete_effect = { set_cosmetic_tag = UNE custom_effect_tooltip = form_UNE_world_reward_tt hidden_effect = { every_state = { if = { limit = { NOT = { is_core_of = ROOT } } add_core_of = ROOT } } set_global_flag = form_UNE_flag country_event = { id = more_dec_form.1 hours = 6 } } } ai_will_do = { factor = 100 } }}
(當然,我用了annex all)
明天(今天白天)我們將更新更高階的決議的教程,不見不散。
推薦閱讀: