Vic3 mod 制作教程 第四章 流程控制
流程控制是很多編程語言都擁有的概念,即判斷、循環(huán)、遍歷,P社的文本代碼也不例外,因此,本章就文本代碼進(jìn)行闡述。
# 第一節(jié)?? ?判斷
## 第一小節(jié) if else else_if
if, else, else_if可以說是伴隨很多編程用戶的常用關(guān)鍵詞,當(dāng)然,這個視頻也不是和人細(xì)說編程相關(guān)的東西,本視頻一直都面向于沒有任何基礎(chǔ)的玩家。
if和else_if都帶有一個名為limit的trigger上下文,如果limit為真,執(zhí)行下面語句,如果下面有else_if,繼續(xù)向else_if判斷,直到下面沒有else_if或者是else,或者完全沒有if,else,else_if的任一代碼為止。
下面就是實(shí)例, 隨便設(shè)置一個變量get_var, 使其值為9999:
通過改變get_var,使其值分別為9999,15000,30000,查看不同的效果
請注意else和else_if不能單獨(dú)使用,只能匹配在if或者else_if的后面,else只能使用一次,作為兜底的情況,而else_if可以根據(jù)limit內(nèi)trigger的不同而重復(fù)使用多次
所以就代碼習(xí)慣而言,建議else和else_if緊跟在上一句的右大括號后空一格
```perl
if = {
??? limit = { this.var:get_var < 10000 }
??? add_treasury = 10000
} else_if = {
??? limit = { this.var:get_var >= 10000 this.var:get_var <= 20000? }
??? add_treasury = 20000
} else = { # 如果沒有else,那么當(dāng)gdp > 20000的時候什么也不會發(fā)生
??? add_treasury = 30000
}
if = { # 此處開始第二個判斷,所以gdp< < 10000的國家其實(shí)能獲得40000
??? limit = { this.var:get_var < 10000 }
??? add_treasury = 30000
}
```
## 第二小節(jié) trigger下的 if,else,else_if
然而,請記住,不同的上下文有別,查閱文檔可得,這三者都是effect,所以,應(yīng)當(dāng)留意,它們是有對應(yīng)的trigger版本的。
只需要在前面添加`trigger_`就行。
自然,trigger下的trigger_if,trigger_else,trigger_else_if的里面全都是trigger,而limit里面的trigger決定了這個trigger是否顯示。
同樣的場景做出差不多的實(shí)例,同樣通過改變get_var,使其值分別為9999,15000,30000,查看不同的trigger效果
可以看到,它們只會顯示匹配trigger_if,trigger_else,trigger_else_if的情況,如果需要顯示limit里面的效果,建議是使用AND,OR,NOR,NAND這些trigger。
除此之外,trigger_if,trigger_else,trigger_else_if和它們的effect版本就沒有什么區(qū)別了,運(yùn)行邏輯和代碼建議,都是差不多的
```perl
trigger_if = {
??? limit = { has_variable = get_var this.var:get_var < 10000 }
??? this.gdp > this.var:get_var
} trigger_else_if = {
??? limit = { has_variable = get_var? }
??? this.gdp = this.var:get_var
} trigger_else = { # 如果沒有else,那么當(dāng)gdp > 20000的時候什么也不會發(fā)生
??? this.gdp > 1000000
}
# 只會顯示匹配trigger_if,trigger_else,trigger_else_if的情況
```
## 第三小節(jié) switch
switch也是判斷的老熟客,通過檢測一個確定的量然后根據(jù)不同的數(shù)值得出不同的結(jié)果。
在實(shí)例中把var:get_var設(shè)置為1或者2或者其他數(shù)字
在一些高級用法中,可以將一些變量的數(shù)值用flag:表示出來,可以得到相當(dāng)驚艷的效果,fallback是什么都沒有匹配到的情況,相當(dāng)于上文的else或者trigger_else,所以也可以不用寫,這樣當(dāng)什么都匹配不到的時候,就沒有任何效果
```perl
switch = {
??? trigger = var:get_var
??? 1 = {
??????? add_treasury = 1000
??? }
??? 2 = {
??????? add_treasury = 2000
??? }
??? fallback = { # 什么都沒有匹配到的情況,也可以不寫
??????? add_treasury = 1
??? }
}
```
switch在trigger和effect都通用,但是請注意上下文問題,不要在使用trigger的情況下用到effect。
同樣的,在trigger的上下文中,switch不同情況下大括號的文本代碼也應(yīng)當(dāng)是trigger,不能與effect混淆,不然一個都不會顯示
但是其他部分,則和effect版本沒有任何區(qū)別,使用起來相當(dāng)方便,比if,else,else_if方便多了,所以,為了方便維護(hù)和代碼運(yùn)行效率,在擁有一個確定對象作為trigger的時候,應(yīng)當(dāng)盡量使用switch
```perl
switch = {
??? trigger = var:get_var
??? 1 = {
??????? this.gdp > 1000000
??? }
??? 2 = {
??????? this.gdp > 2000000
??? }
??? fallback = { # 什么都沒有匹配到的情況,也可以不寫
??????? this.gdp = 3000000
??? }
}
```
# 第二節(jié)?? ?遍歷