Vic3 mod 制作教程 第四章 流程控制
流程控制是很多编程语言都拥有的概念,即判断、循环、遍历,P社的文本代码也不例外,因此,本章就文本代码进行阐述。
# 第一节 判断
## 第一小节 if else else_if
if, else, else_if可以说是伴随很多编程用户的常用关键词,当然,这个视频也不是和人细说编程相关的东西,本视频一直都面向于没有任何基础的玩家。
if和else_if都带有一个名为limit的trigger上下文,如果limit为真,执行下面语句,如果下面有else_if,继续向else_if判断,直到下面没有else_if或者是else,或者完全没有if,else,else_if的任一代码为止。
下面就是实例, 随便设置一个变量get_var, 使其值为9999:
通过改变get_var,使其值分别为9999,15000,30000,查看不同的效果
请注意else和else_if不能单独使用,只能匹配在if或者else_if的后面,else只能使用一次,作为兜底的情况,而else_if可以根据limit内trigger的不同而重复使用多次
所以就代码习惯而言,建议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,那么当gdp > 20000的时候什么也不会发生
add_treasury = 30000
}
if = { # 此处开始第二个判断,所以gdp< < 10000的国家其实能获得40000
limit = { this.var:get_var < 10000 }
add_treasury = 30000
}
```
## 第二小节 trigger下的 if,else,else_if
然而,请记住,不同的上下文有别,查阅文档可得,这三者都是effect,所以,应当留意,它们是有对应的trigger版本的。
只需要在前面添加`trigger_`就行。
自然,trigger下的trigger_if,trigger_else,trigger_else_if的里面全都是trigger,而limit里面的trigger决定了这个trigger是否显示。
同样的场景做出差不多的实例,同样通过改变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版本就没有什么区别了,运行逻辑和代码建议,都是差不多的
```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,那么当gdp > 20000的时候什么也不会发生
this.gdp > 1000000
}
# 只会显示匹配trigger_if,trigger_else,trigger_else_if的情况
```
## 第三小节 switch
switch也是判断的老熟客,通过检测一个确定的量然后根据不同的数值得出不同的结果。
在实例中把var:get_var设置为1或者2或者其他数字
在一些高级用法中,可以将一些变量的数值用flag:表示出来,可以得到相当惊艳的效果,fallback是什么都没有匹配到的情况,相当于上文的else或者trigger_else,所以也可以不用写,这样当什么都匹配不到的时候,就没有任何效果
```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不同情况下大括号的文本代码也应当是trigger,不能与effect混淆,不然一个都不会显示
但是其他部分,则和effect版本没有任何区别,使用起来相当方便,比if,else,else_if方便多了,所以,为了方便维护和代码运行效率,在拥有一个确定对象作为trigger的时候,应当尽量使用switch
```perl
switch = {
trigger = var:get_var
1 = {
this.gdp > 1000000
}
2 = {
this.gdp > 2000000
}
fallback = { # 什么都没有匹配到的情况,也可以不写
this.gdp = 3000000
}
}
```
# 第二节 遍历