Vic3 mod 制作教程 第二章 上下文和Scope(文本版)
大家好啊, 今天給大家說說vic3的mod制作教程。
上一章說到,新版引擎對Scope和Event Target有很強的約束,但是相信看這視頻的基本沒人能弄清楚什么是Scope和Event target,更不用說什么是上下文
上下文是重要的概念,可以指示等于號左邊的類型,通過這種指示可以得到右邊應該填什么值,可以不可以后接大括號
而Scope就是在=后接大括號對應的環(huán)境,很多語句要在判斷完上下文后再判斷Scope的類型,才能推定要填什么
所以,我們就從Scope和上下文說起
# 第一節(jié)?? ?上下文
## 第一小節(jié) 上下文概述
上下文是我自己捏造的名詞,所以我直接用用中文說明,上下文其實就是左邊的單詞加上大括號里面的東西,簡單說明就是代碼運行的環(huán)境。
從使用位置來看,上下文可以分為P社寫死的上下文和可以重復利用的上下文;從類型上看,上下文可以分成effect,trigger,modifier和其他參數(shù),可以重復利用的上下文一般只有前三者。
所以本節(jié)以外的上下文都是專門指用來說P社寫死的上下文,而可以重復利用的上下文則會被稱呼為effect,trigger或者modifier。
分辨是否寫死的上下文比較簡單,寫死的上下文除了其他參數(shù)外,等于號后面均為大括號,而可以重復利用的既有大括號又可以不帶大括號
## 第二小節(jié) 不同的上下文類型
effect的上下文是瞬間發(fā)生的效果,通常以on_xxx.when_xxx,immediate之類的瞬時名詞命名,自然跟著的都應該是。
trigger的上下文是一組布爾判定,如果沒有指定NOR,NOT和OR,默認的上下文都是所有內部trigger的和,也就是AND,通常以is_xxx,enable,trigger命名
modfier則是一個用英文都說不利索的被濫用到極致的名詞,Timed modifier可以是modifier,modifier_type可以是modifier,給定的modifier上下文也叫modifier
modifier_type是最基本的modifier,可以粗略翻譯為”增益“,它們采用給定的格式對指定的Scope產生持續(xù)性的特定的加成。雖然定義它們的文件夾叫做`modifier_types`,但是由于它們對應的Event target 叫做`modifier`,且它們在界面代碼也是這樣稱呼,因此本教程將會采用`modifier`描述這一類“modifier”
Timed modifier是modifier_type的集合,在Hoi4里面是被稱為idea,它們定義了Timed modifier的名稱,內部modifiere的持續(xù)時間等,還可以被effect調用。雖然定義它們的文件夾叫做`modifiers`,但是因為P社的文檔已經全部把它們寫成了`timed modifier`,本教程將會采用`timed modifier`描述這一類“modifier”
給定的modifier上下文,本教程已經約定稱呼其為“modifier的上下文”,它們一般都位于一些持續(xù)性的名詞上,更有可能直接就叫modifier,和Timed modifier相同,也是modifier的集合,只是不能被effect調用
還有一些“modifier”是類似權重的東西,這種只能自己判斷,一般這種不包含`modifier`
## 第三小節(jié) 使用的稍微概述
關于effect,trigger的用法,完整的用法可以參閱wiki,或者在控制臺使用`script_docs`自行生成文檔,但是如果不能掌握Scope和Event target,你根本無法正確使用
此外,無論是effect,trigger都需要符合文檔給出的名稱,或者在Scripted_effect和Scripted_trigger定義出全新的effect函數(shù)和trigger函數(shù),否則它們不會運行,如果在拆解他人mod的時候發(fā)現(xiàn)了陌生的effect和trigger,它們很有可能就是mod作者在Scripted_effect和Scripted_trigger定義出來的
# 第二節(jié)?? ?認識Scope和Event Target
Scope則是游戲里面的內容,Scope就是作用域,就是文本代碼(無論是effect,trigger,還是modifier)作用的輸入輸出類型,而Event_target就是一組輸入Scope,得出不一定同一類型的Scpoe的輸出的關鍵詞
## 三個特殊Scope
在詳細說明Scope之前,需要要說明三個特殊Scope:root,this和prev
root是最底層的scope,在不聲明任何scope的時候,作用的對象就是root。
root的類型一般預先聲明,比如如果確定一個事件是state_event, 那么這個root的類型就是state,對象就是發(fā)生該事件的state
然而,有一些代碼會強行把root強行轉換成其他的類型,這點是需要留意的
this是當前的scope,就是位于等號右側大括號里的輸入類型,在一些需要用到當前Scope作為輸入的文本代碼,可以用this代替
prev是上一層的scope,是等于號左側的單詞在大括號里的的輸入類型,但是不是任何時候都能夠使用prev
## Scope的輸入和輸出
然后就可以說明Scope的輸入和輸出是怎么回事了
Scope一般作為輸入,讓文本代碼在Scope里運行,注意看文檔或者wiki里的`Supported Scopes`,這些就是需要輸入的Scope的類型,所以運行這些代碼需要把Scope設置為對應的類型
有一些`Supported Scopes`是none,那么就需要按照情況來判斷
而作為輸出的時候,一般位于等號的右邊,就是文檔或者Wiki里面寫的`Supported Targets`,直接寫對應的Scope就可以了,當然,一般需要配合Event target來聲明這個Scope
## Event target
Event target 可以使用點連接,也可以寫在大括號里,這取決于是否可以直接聲明這個scope
從Event_target的文檔看,Event_target有以下幾個屬性:`Input Scopes`,`Output Scopes`,`Requires Data`,`Global Link`
`Input Scope`就是輸入的Scope, 比如`c:USA.religion`的輸入就是`c:USA`,翻閱文檔,顯然,`religion`支持`country` Scope作為輸入,因此這是合法輸入,而如果使用`s:STATE_IOWA.religion`則是非法輸入,當然說不定沒準什么時候P社來一次更新就支持`state` Scope了,所以文檔需要時常更新
`Output Scopes`就是輸出的Scope,一般給定什么就是什么,除了有value或者bool輸出的`modifier:`和根據輸入給出type的`type`
`Requires Data`就是是否需要判斷有額外的參數(shù)輸入,參數(shù)的輸入需要是在冒號后面提供,比如`modifier:country_subsidies_all`就是給定了modifier的名字`country_subsidies_all`作為額外參數(shù)來得到指定的modifier的,更為人知曉的則是`s:STATE_IOWA`,給定`STATE_IOWA`作為名字獲取衣阿華州的`state_region` Scope
如果要進一步獲取美國的衣阿華州,則需要結合.的連接和:的提供參數(shù),使用`region_state`轉化為`state scope`,而翻閱文檔可得,`region_state`也是`Requires Data`,所以我們給定國家的名稱,也就是`s:STATE_IOWA.region_state:USA`就可以獲得美國的衣阿華州
`Global Link`就是前面不需要Scope輸入,可以不帶點`modifier:country_subsidies_all`和`s:STATE_IOWA`對應的`modifier:`和`s:`都是不需要Scope輸入的所以可以直接不帶點,而`s:STATE_IOWA.region_state:USA`的???? `.region_state:`需要Scope輸入,所以前面需要帶點
Scope還能通過`save_scope_as = <string>`命名為可以在事件鏈中使用的Event target的`scope`,通過`scope:<string>`調用, 但是只能在一個事件鏈中存儲
另一種存儲就是通過存變量實現(xiàn),這種就要留到下一章再說了
# 我們現(xiàn)在學會了上下文和Scope
現(xiàn)在, 下課
哇襖