變量和四則運算(文本版)
上一章說到, 變量可以存儲對象,達到實際上存儲Scope的效果。實際上它能存儲更多的東西,可以說變量能存儲的東西遠遠不止一個類型,基本上除了一些半殘廢的Scope和list剩下的多少都能包裝,這樣可以讓一些對象可以做到傳遞。
因此就需要討論variable最基本的語法,經(jīng)過前兩章理論的折磨,無論是誰都迫不及待想寫代碼的,因此本章終于有了寫文本代碼的環(huán)節(jié)!
設(shè)置最基本的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
設(shè)定之后我們通過`var:`來調(diào)用,用`root.var:gdp_scale`就好
然而,不是所有的COUNTRY都有這個root.var:gdp_scale,在一些你需要用variable的情況下,嘗試使用
?
has_variable = <variable_name>
?
在實例中,就是
?
has? variable = gdp_scale
?
當(dāng)不需要variable,需要清除的時候,同理也有
?
remove_variable = <variable_name>
?
也就是
?
remove_variable = gdp_scale
?
這下這邊也沒有g(shù)dp_scale
那么再重新建立起gdp_scale,這次要搞修改了
首先最簡單的賦值自然就是繼續(xù)用set_variable,但是不是任何時候set_variable 都管用,因此,是時候了解四則運算了
# 第二節(jié)?? ?四則運算
四則運算當(dāng)然不能用傳統(tǒng)編程語言的+=,-= *=,笑死,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更好調(diào)用
?
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可以取整嗎,可以,但是比較復(fù)雜
?
round_variable = { name = gdp_scale_nearest = 1 } # 實際上這是round到某個數(shù)字的倍數(shù), 所以請不要設(shè)置成0
?
## 加中加中加
翻閱Script_value的文檔可得, script_value遠比單純算variable要更豐富, 除了可以加減乘除, 還可以用modulo取模, 用fixed_range和integer_range獲取隨機數(shù), max和min設(shè)置最大最小值, 這遠比variable的計算更為方便
盡管說有clamp_variable這些effect讓variable也能做到上述的事情, 但是寫在同一個script_value里面會使得代碼更易于維護
此外script_value還能用if_else來, 這就是下一節(jié)流程控制的內(nèi)容了
name_of_scripted_value = {
?? ?# Mathematical_operations
?? ?add = number/scripted_value/scope.something
?? ?subtract = ...
?? ?multiply = ...
?? ?divide = ... # 別除以0
?? ?modulo = ... # 別除以0
?? ?
?? ?value = ... # 直接設(shè)置
?? ?
?? ?max = ... # 設(shè)置最大值
?? ?min = ... # 設(shè)置最小值
?? ?
?? ?round = yes # 四舍五入
?? ?ceiling = yes # 向上取整
?? ?floor = yes # 向下取整
?? ?round_to = 5 # 向數(shù)字的倍數(shù)靠近(如果是26那就得到25)
??? fixed_range = { # 隨機小數(shù)
?? ??? ?min = ... script_value
?? ??? ?max = ...
?? ?}
?? ?
?? ?integer_range = { # 隨機整數(shù)
?? ??? ?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...
?? ?}
?? ?
?? ?
}
## 全局變量,列表
在我要放下課鈴的時候我突然發(fā)覺一個重大問題,如果需要面對不特定scope的時候,怎么樣才能存好一個scope?
一個解決方案是,全局變量
和變量一樣
使用
?
set_global_variable = { name = big_yuan_zhong_value = c:GBR }
?
然后調(diào)用global_var: `global_var:big_yuan_zhong`
如果要設(shè)定全球所有國家對這個global_var:big_yuan_zhong關(guān)系-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 }
如果需要根據(jù)索引獲得一個列表的元素, 那可以用ordered_in_global_list, ?
ordered_in_global_list = {
??? variable = big_yuan_zhongs # 設(shè)置目標(biāo)列表
??? # limit = { <triggers> } # 可以用limit篩選
??? # order_by = script_value # 可以用一些list內(nèi)元素的script_value排序
??? position = 1 #? 從0開始
??? # min = int # 可以設(shè)置最大最小值
??? # 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 # 就這么一看
}
所以可以看出, 全局變量和作用域變量只有是否看作用域的區(qū)別, 列表也是一樣的, 可以通過查閱wiki和文檔獲取更多列表和變量的信息