欢迎光临散文网 会员登陆 & 注册

Vic3 mod 制作教程 第四章 流程控制

2023-08-11 15:16 作者:普洛斯佩罗亲王  | 我要投稿

流程控制是很多编程语言都拥有的概念,即判断、循环、遍历,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
    }
}
```

# 第二节    遍历


Vic3 mod 制作教程 第四章 流程控制的评论 (共 条)

分享到微博请遵守国家法律