变量和四则运算(文本版)
上一章说到, 变量可以存储对象,达到实际上存储Scope的效果。实际上它能存储更多的东西,可以说变量能存储的东西远远不止一个类型,基本上除了一些半残废的Scope和list剩下的多少都能包装,这样可以让一些对象可以做到传递。
因此就需要讨论variable最基本的语法,经过前两章理论的折磨,无论是谁都迫不及待想写代码的,因此本章终于有了写文本代码的环节!
设置最基本的variable的语法是这样的
set_variable = { name = <string> value = <any_excepet_list> }
name 就是你起variable的名字
value则是一个很随便的值,只要是可以用到的scope,都可以作为variable
因此来一个最为简单的set_variable实例,就以COUNTRY为例子:
set_variable = { name = gdp_scale_value = this.gdp }
这整出了一个叫做gdp_scale的variable
设定之后我们通过`var:`来调用,用`root.var:gdp_scale`就好
然而,不是所有的COUNTRY都有这个root.var:gdp_scale,在一些你需要用variable的情况下,尝试使用
has_variable = <variable_name>
在实例中,就是
has variable = gdp_scale
当不需要variable,需要清除的时候,同理也有
remove_variable = <variable_name>
也就是
remove_variable = gdp_scale
这下这边也没有gdp_scale
那么再重新建立起gdp_scale,这次要搞修改了
首先最简单的赋值自然就是继续用set_variable,但是不是任何时候set_variable 都管用,因此,是时候了解四则运算了
# 第二节 四则运算
四则运算当然不能用传统编程语言的+=,-= *=,笑死,P社甚至连+ - * /都没有
所以基本上的四则运算都是在一些提供四则运算的地方进行计算的
比如,change_variable
简单来说就是,+ - * / 在文本代码中称呼为 add, substract, multiply, divide
所以用一些value来对gdp_scale进行进一步计算
change_variable = {
name = gdp_scale
add = root.income
substract =root.techs_researched
multiply = { #避免navy_size = 0的情况
value = root.navy_size
add = 1
}
divide = {
value = root.army_size #避免army_size = 0的情况
add = 1
}
}
如果你只是想临时改一改,并不想真的用到, 并不是真的想保存,你可以试一下script_value,这个可以包装这个variable,让这个variable更好调用
fancy_gdp_scale = {
value = this.var:gdp_scale
add = root.income
substract =root.techs_researched
multiply = root.navy_size
divide = {
value = root.army_size #避免army_size = 0的情况
add = 1
}
}
使用的时候只需要,this.fancy_gdp_scale,非常方便
而且script_value甚至支持取整
fancy_gdp_scale = {
value = this.var:gdp_scale
add = root.income
substract =root.techs_researched
multiply = root.navy_size
divide = root.army_size
round = yes
}
那么variable可以取整吗,可以,但是比较复杂
round_variable = { name = gdp_scale_nearest = 1 } # 实际上这是round到某个数字的倍数, 所以请不要设置成0
## 加中加中加
翻阅Script_value的文档可得, script_value远比单纯算variable要更丰富, 除了可以加减乘除, 还可以用modulo取模, 用fixed_range和integer_range获取随机数, max和min设置最大最小值, 这远比variable的计算更为方便
尽管说有clamp_variable这些effect让variable也能做到上述的事情, 但是写在同一个script_value里面会使得代码更易于维护
此外script_value还能用if_else来, 这就是下一节流程控制的内容了
name_of_scripted_value = {
# Mathematical_operations
add = number/scripted_value/scope.something
subtract = ...
multiply = ...
divide = ... # 别除以0
modulo = ... # 别除以0
value = ... # 直接设置
max = ... # 设置最大值
min = ... # 设置最小值
round = yes # 四舍五入
ceiling = yes # 向上取整
floor = yes # 向下取整
round_to = 5 # 向数字的倍数靠近(如果是26那就得到25)
fixed_range = { # 随机小数
min = ... script_value
max = ...
}
integer_range = { # 随机整数
min = ...
max = ...
}
if = { # These_operations_are_executed_if_the_limit_is_met. You_can_also_put "if" inside_an "if"
limit = { some_conditions }
add = 5
divide = ...
...
}
else_if = { # If_the "if" above_is_not_met, these_operations_are_executed, as_long_as_the_limit_is_met. You_can_put_several "else_if" in_a row
limit = { some_conditions }
operations...
}
else = { # If_the "if" or "else_if" above_is_not_met, these_operations_are_executed
operations...
}
}
## 全局变量,列表
在我要放下课铃的时候我突然发觉一个重大问题,如果需要面对不特定scope的时候,怎么样才能存好一个scope?
一个解决方案是,全局变量
和变量一样
使用
set_global_variable = { name = big_yuan_zhong_value = c:GBR }
然后调用global_var: `global_var:big_yuan_zhong`
如果要设定全球所有国家对这个global_var:big_yuan_zhong关系-20的话,就这样用
every_country = {
limit = { NOT = { this = global_var:big_yuan_zhong } }
change_relations = { country = global_var:big_yuan_zhong_value = -20 }
}
只有一个big_yuan_zhong对GBR确实不公平,可能需要更多的big_yuan_zhong,因此建立一个列表,还得是全局的列表
add_to_global_variable_list = { name = big_yuan_zhongs target = global_var:big_yuan_zhong }
add_to_global_variable_list = { name = big_yuan_zhongs target = c:FRA }
add_to_global_variable_list = { name = big_yuan_zhongs target = c:PRU }
然后把-20的代码换成这样
every_country = {
limit = { NOT = { is_target_in_global_variable_list = { name = big_yuan_zhongs_target = this } } }
every_in_global_list = {
variable = big_yuan_zhongs
prev = {
change_relations = { country = prev_value = -20 }
}
}
}
对的, 查找对象是否在list就是用is_target_in_global_variable_list
如果要从列表上删掉一个big_yuan_zhong, 那可以用remove_list_global_variable
remove_list_global_variable = { name = X_target = Y }
比如使用remove_list_global_variable = { name = big_yuan_zhongs_target = c:FRA }
如果需要根据索引获得一个列表的元素, 那可以用ordered_in_global_list,
ordered_in_global_list = {
variable = big_yuan_zhongs # 设置目标列表
# limit = { <triggers> } # 可以用limit筛选
# order_by = script_value # 可以用一些list内元素的script_value排序
position = 1 # 从0开始
# min = int # 可以设置最大最小值
# max = script_value
# check_range_bounds = no # If_you_don't_want_an_error_logged_if_the_list_is_smaller_than_the_min/max
add_treasury = 50000 # 就这么一看
}
所以可以看出, 全局变量和作用域变量只有是否看作用域的区别, 列表也是一样的, 可以通过查阅wiki和文档获取更多列表和变量的信息