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

变量和四则运算(文本版)

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

上一章说到, 变量可以存储对象,达到实际上存储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和文档获取更多列表和变量的信息

变量和四则运算(文本版)的评论 (共 条)

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