钢铁雄心4吧 关注:428,708贴子:7,772,127

【12.20日志翻译】圣诞节与模组制作

只看楼主收藏回复

嗨,大家好,一周一度日志时!普通人找圣诞礼物而开发者摸鱼等新年的好日子!我们觉得这次可以打破史上最长日志的记录啦!当然啦,我也不会放过这个灵魂作画发贺图的好机会哒!
(不管怎么样这图我都不会转的。。。)
我们已经放假啦!一月见!但是呢,下周我还准备了一份特别日志哦。群星的主管——也是个二战粉——会完成一份贼拉长的德国部队番号表。他已经帮我们搞掂新的师团命名系统的德国部分啦,里面全是干货呢。
现在来说说做莫得的事儿吧,如果你知道啥是莫得的话……很烧脑哒!简单来说,modder们以后可以搞一些真的很coooooooooool的玩意儿啦!
还在看废话吗?好滴!
modder献礼在此!


IP属地:北京1楼2017-12-21 18:42回复
    决议
    钢丝的设计师们捣鼓出的闪亮亮的一堆玩意儿中的一个就是决议系统了。我们之前已经提过它了,但是呢我还是觉得总会有那么一两个modder想用它的,下面就是介绍啦。
    最简易的决议可以写成这样:
    christmas_presents = { #圣诞礼物
    more_guns = { #更多的枪杆子
    }
    }
    它被写在common\decisions目录下的a,txt,任何决议都需要一个大分类,在上例中这个分类是christmas_presents
    christmas_presents要像这样定义:
    christmas_presents = { #圣诞礼物
    }
    它被写在common\decisions\categories目录下的a.txt
    它在游戏里是这样的:

    它不需要任何条件也不会有任何效果,如果有人真的想要枪杆子的话会失望的。所以咱们还得写。


    IP属地:北京2楼2017-12-21 18:42
    回复
      效果
      给选定的决议添加效果是这样的:
      complete_effect = { #效果
      add_equipment_to_stockpile = { #添加装备
      type = infantry_equipment_1 #36年步枪
      amount = 1337
      }
      }
      条件
      你可以给决议和大分类设定先决条件(allowed)
      任何在一开局就符合这些条件的国家将会把这些决议放进潜在池。如果你是给大分类写的条件,那么该分类下所有的决议都要检测这些条件。就像内阁一样,他们是由国家代码限制的。
      至于锁定一个决议则是由像国策一样的动态条件完成的,写法是available
      available = { #条件
      has_country_flag = santa_podcat
      }
      我们还加了另外一个决议,叫做邀请圣诞老人,让它来set这个flag。对它而言我们设置了消耗,要花费政治点数。
      cost = 42
      你要是写了成百上千个决议,界面就会有点乱,而意识形态啊战争啊啥的还会锁定它们的条件,也就是说很多时候玩家完全用不到它们。这时候就要用到可见条件了。(visible)当符合条件时决议才会出现。
      available与visible都是可以写给大分类的,所以如果你有一些想给一连串决议应用的复杂的条件,你只写一遍就够了,但是我们可没准备好优化它们的可读性,所以也不要用的那么随意。
      本地化(翻译)
      大分类与决议都有名字和描述
      christmas_presents:0 "Christmas Presents"
      christmas_presents_desc:0 "To fight off the cold and the dark we need to gather christmas present."
      invite_santa:0 "Invite Santa"
      invite_santa_desc:0 "In the darkest of times there is only one place to turn. Ask Santa Podcat for gifts."
      你也可以利用像是[Root.GetNameDef], [Root.GetLeader]这种动态文本。
      我们的决议看上去就像这样:

      这就是决议的基本要领了,但是还有一些技巧你可能会用到。
      待着,滚开,回来,别回来了
      有些决议你可能想让它们被点了之后还能在界面里待上那么一会儿。还有一些呢你们还会想过段时间之后还能多点几次,还有一些呢点一次就足够了。
      days_remove = 5 #在移除界面前保留5天
      days_re_enable = 5 #5天后会在界面里出现并且能再度点击
      fire_only_once = yes #一局游戏就一次
      我们还添加了当决议被移除时的可以发生的效果,这么写:
      days_remove = 5
      remove_effect = {
      add_political_power = 50
      }
      这样就会让它5天之后移除还能留下50pp的家当。
      修正
      给决议写个修正可以让它激活期间影响国家
      modifier = { political_power_gain = 1 }
      上面全部例子写出来就是这样:
      christmas_presents = {
      invite_santa = {
      allowed = { tag = SWE }
      available = {
      date > 1936.11.30
      date < 1936.12.25
      }
      visible = {
      NOT = { has_country_flag = sadness_and_darkness }
      }
      fire_only_once = yes
      cost = 42
      complete_effect = {
      custom_effect_tooltip = invite_santa_tt
      set_country_flag = santa_podcat
      }
      }
      more_guns = {
      allowed = { tag = SWE }
      available = {
      has_country_flag = santa_podcat
      }
      visible = {
      NOT = { has_country_flag = sadness_and_darkness }
      }
      modifier = {
      political_power_gain = 1
      }
      days_re_enable = 5
      days_remove = 5
      remove_effect = {
      add_political_power = 50
      }
      complete_effect = {
      add_equipment_to_stockpile = {
      type = infantry_equipment_1
      amount = 1337
      }
      }
      }
      }


      IP属地:北京3楼2017-12-21 18:43
      回复
        指向性决议
        现在谈谈如果你想让两个国家之间发生点什么的话要怎么办。给全世界的每个国家都写上然后一切都乱糟糟的。
        输入targeted decisions。尽管还是有点乱但是好多了好伐。
        系统每天都会判断有没有国家符合target_trigger的条件,而找到这样的国家之后它那儿就会出现这个决议。
        条件和效果里就可以利用FROM来指代另一个国家了。
        (我们让这个代码是FROM不是没有理由的,相信我们,绝对不是没有理由的,不,不能说!)
        ruin_christmas = {
        allowed = { tag = FIN }
        target_trigger = {
        FROM = {
        OR = {
        tag = SWE
        tag = DEN
        tag = NOR
        }
        }
        }
        available = {
        FROM = { has_country_flag = santa_podcat }
        }
        complete_effect = {
        declare_war_on = {
        target = FROM
        type = ruin_christmas
        }
        FROM = {
        set_country_flag = sadness_and_darkness
        }
        }
        }

        上面例子里芬兰有机会毁了圣诞节并且向瑞典,丹麦或挪威宣战,芬兰呐……
        注意指示国家的flag、FROM的使用方法。这是个生成两个国家之间互动的给力法子。FROM可以在target_trigger, available, visible, remove_effect, complete_effect或ai_will_do里使用。
        目标甚至还可以这样写在本地化
        ruin_christmas:0 "Ruin Christmas for [From.GetNameDef]"


        IP属地:北京4楼2017-12-21 18:44
        收起回复
          笔记
          因为target_trigger是会检测全球国家的所以它可能不那么好控制。如果你只想单纯地通过国策在一个指定国家上搞事,那么可以这么办。
          activate_targeted_decision = { target = TAG decision = decision_to_activate }
          你还可以把指向性决议拿来给同一个国家解锁一个新决议
          这种时候你就不需要写什么allowed或是target_trigger,直接写在文件里就好。


          IP属地:北京5楼2017-12-21 18:44
          回复
            任务
            跟决议写在一起甚至还长得差不多。这玩意儿可以要求玩家在一定时间内完成或者回避一些事情。
            more_cake = {
            allowed = { tag = SWE }
            available = {
            controls_state = 64 #THIS IS THE ACTUAL OBJECTIVE
            }
            activation = {
            has_stability < 0.3 #This starts the mission
            }
            Is_good = no
            days_mission_timeout = 3
            fire_only_once = yes
            timeout_effect = {
            DEN = { annex_country = { target = ROOT } }
            }
            complete_effect = {
            add_political_power = 1337
            }
            }

            这个例子呢,瑞典的稳定度已经糟糕透了,引发了这个任务(触发条件activate为真)。available语句用来检测是否完成目标,complete_effect则是完成之后的效果。(我们拿available作为目标的语句不是没有理由的,真的,不是没有理由的。)
            Is_good = yes/no只会决定文本和进度条的颜色。timeout_effect则是当days_mission_timeout(剩余时间)到0了才会触发的效果。
            记着修正是不能给任务用的,但是我们也许将来会更新这个功能。


            IP属地:北京6楼2017-12-21 18:45
            回复
              AI
              我不怎么建议利用决议发动一场战争,不过我们还是搞了几个方式来告诉ai它们要点的决议是干什么的。
              war_with_on_remove = TAG
              war_with_on_complete = TAG
              war_with_on_timeout = TAG
              war_with_target_on_remove = yes
              war_with_target_on_complete = yes
              war_with_target_on_timeout = yes
              ai_will_do也是像国策那样写。它将决定ai点决议的优先级。如果一个决议没写ai_will_do的话,ai会当它不存在。


              IP属地:北京7楼2017-12-21 18:45
              回复
                定制消耗
                对于某些决议你可能不想让它花费pp。我们加入了一个定制花费的条件以允许你定义你自己的花费。下面是例子。
                custom_cost_trigger = {
                has_army_experience > 10
                }
                custom_cost_text = army_xp_more_than_10
                army_xp_more_than_10:0 "§H10§!£army_experience"
                army_xp_more_than_10_blocked:0 "§R10§!£army_experience"
                army_xp_more_than_10_tooltip:0 "It costs 10£army_experience to select this."

                当你用上custom_cost_trigger时,默认的消耗就被无视了,它就会检测条件。
                我们为custom_cost_trigger准备的本地化接口跟一般界面的差不多,我们的例子里我们使用了army_xp_more_than_10会显示,但是当我们没有足够的经验,army_xp_more_than_10_blocked就会显示
                Army_xp_more_than_10_tooltip是不必须的,而它会替换画面底部的默认文本
                编辑:
                定制花费条件是一种先决条件,它只能用来检测你是否能够点下决议。它不会直接产生任何影响。在上面的例子里你需要在效果里手动减掉陆军经验。(而且最好把它隐藏掉)
                另外一个可以搞的事情呢,是在available里写上条件而把不论你想消耗的什么写在效果里,不过看上去好点。
                对于长期花费而言,这是一种告诉玩家条件的好方式,它不会看上去像什么免费的乐色,它让条件更好地与玩家交流。


                IP属地:北京8楼2017-12-21 18:46
                回复
                  高亮省份
                  当鼠标放到决议上时可以高亮一个随机的符合条件的省份,并且点击后会将镜头移向该省份
                  范例:
                  highlight_states = { state = 64 }


                  IP属地:北京9楼2017-12-21 18:46
                  回复
                    大分类管理
                    大分类的优先级决定了它们在界面中的顺序。这种顺序是可以被修改的,所以你可以根据条件改换这种顺序。
                    christmas_presents = {
                    priority = {
                    base = 0
                    modifier = {
                    add = 10
                    has_country_flag = christmas_time
                    }
                    }
                    }
                    Icons and pictures
                    picture = picture_name
                    Corresponds to GFX_decision_cat_picture_name
                    icon = icon_name
                    Corresponds to GFX_decision_icon_name
                    图标写法


                    IP属地:北京10楼2017-12-21 18:46
                    回复
                      指向性任务
                      跟一般的指向性决议触发原理一样,但是要是写上了days_mission_timeout,它们就会变成指向性任务。
                      总的来说对于这个系统你有一些事情可以做,而它们很需要好好解释,我觉得我已经解释了大半,不过有任何不解也尽管问。


                      IP属地:北京11楼2017-12-21 18:46
                      回复
                        新功能
                        从其他项目里摘语句真的很开心
                        set_variable = { a = 20 }
                        set_variable = { b = ROOT.political_power }
                        multiply_variable = { var = b value = 2 }
                        check_variable = { a > b }
                        这样将变量a的值设置为20,变量b设置与ROOT国家的pp值相等,给它翻个倍然后再伸出手和公婆比一比
                        变量是可以利用@来动态命名的,以前提过,这次就不说了。
                        像这样检查pp没什么意义啦,但是要是你想到要怎么利用,那下面这些玩意儿就能让你做很多有趣的事情。
                        set_variable, add_to_variable, subtract_from_variable, multiply_variable, divide_variable, clamp_variable, has_variable, check_variable (compare = less_than, less_than_or_equals, greater_than, greater_than_or_equals, equals, not_equals)
                        你设置变量时还可以“连锁触发”,它也许比event target功能还要方便,但是你也许会写出某种不可能的情况。
                        set_variable = { b = FROM.FROM.FROM.political_power }
                        当然还有临时性变量,只有一些正确的条件或效果下才存在,它们就像一般的变量,但是要用set_temp_variable来set,它们的优势在于可以在条件或效果中做运算相关的行为
                        变量在本地化文件里可以使用 ? 来显示
                        Some_loc_key:0 "Value of a: [?Root.a]"
                        这会显示:变量a:20(因为刚才a就是20)
                        你还可以通过这种方式取得党派支持率的数值:party_popularity@democratic
                        像 party_popularity或political_power这种变量是打娘胎就伴随着游戏的只能被读取的特殊变量。它们是直接跟游戏内核互动的。底下是一系列可以使用的特殊变量。
                        Country: political_power, command_power, manpower, max_available_manpower, max_manpower, opinion, stability, modifier, party_popularity.
                        State: resistance, arms_factory_level, industrial_complex_level, infrastructure_level
                        外交关系也是一种你可以利用的特殊变量
                        set_variable = { var = eng_opinion_on_turkey value = ENG.opinion@TUR }
                        变量是一种包产到户的功能,除非你设置一个全球变量
                        下面的第一个例子为64号省份set了一个值为1的变量a
                        第二个例子给全球set了一个值为1的变量b
                        64 = { set_variable = { a = 1 } }
                        set_variable = { global.b = 1 }
                        如果你给你自己的变量命名为 political_power一类特殊变量的话,什么鬼事都会发生,从宇宙大爆炸到天上下火,到瑞典球队踢赢意大利球队,到死者复生。
                        So don’t do it.
                        所以别作死哦。


                        IP属地:北京12楼2017-12-21 18:47
                        收起回复
                          有的时候你会码了好几个小时语句然后完完全全的冇用。(p社内部就不会发生这种事情,所以我们只是假定会发生这种事情)使用list_vars这个控制台语句会显示你正选定的国家或省份的所有变量。要是不想选定它们你也有办法。
                          在控制台这样:
                          list_vars ENG (prints variables set on ENG)
                          list_vars 37 (prints vars on Sj?lland)
                          变量可以在很多地方用到
                          add_political_power = 141.infrastructure_level
                          这样就可以增加与Svealand的基建等级相同数值的pp,还能更进一步
                          set_temp_variable = { a = 141.infrastructure_level }
                          multiply_variable = { var = a value = 20 }
                          add_political_power = a
                          这样就可以增加与Svealand的基建等级相比二十倍数值的pp,还能更进一步
                          大部分简易的效果和条件对变量来说就是个数字,但是你连续用多个参数运算的话可不保证有用。
                          “所以,”你会这么说,“这就是一种flag嘛,那我们要不要扔掉flag呢?这就是你们想从我们这里得到的?p社?一个完全flag冷淡的社区?”
                          不啊,flag是一种更快速更明智的检测功能选择不是嘛,只要你想就一直用下去吧。
                          我们还添加了list_flags这条控制台指令,这样flag们也好检查多了。


                          IP属地:北京13楼2017-12-21 18:48
                          回复(1)
                            这条日志已经太长了,但是我承诺变量方面的事情在明年的论坛里会补充更多的细节
                            预设本地化
                            已经放到文件里了还能用哦,很多人已经不陌生了。
                            允许你创造属于自己的动态文本接口
                            defined_text -> this is it, we're defining the text
                            text -> a discrete entry that can be picked to display in loc.
                            trigger -> determines if a text entry will be picked or not.
                            (The triggers need to be valid for the scope the key is called in (eg Root or From.From)
                            localization_key -> points to the localization key that'll be used if trigger passes
                            defined_text = {
                            name = GetIsThisDiaryLong
                            text = {
                            trigger = {
                            always = yes
                            }
                            localization_key = YES_YES_YES
                            }
                            text = {
                            localization_key = NO
                            }
                            }
                            (上面这堆在文件里也有)
                            笔记:国策只要写上了dynamic = yes就也能适用这个功能


                            IP属地:北京14楼2017-12-21 18:49
                            回复
                              Namelists
                              番号表
                              GER_Inf_01 = {
                              name = "Infantry Divisions"
                              for_countries = { GER }
                              can_use = { always = yes }
                              division_types = { "infantry" }
                              # Number reservation system will tie to another group.
                              link_numbering_with = { GER_dog_divisions }
                              fallback_name = "%d. Infanterie-Division"
                              # Names with numbers (only one number per entry).
                              # It's okay to have gaps in numbering.
                              ordered =
                              {
                              1 = { "%d. Infanterie-Division" }
                              2 = { "%d. Infanterie-Division" }
                              3 = { "%d. Infanterie-Division" }
                              4 = { "%d. Infanterie-Division" }
                              一览无遗了吧
                              link_numbering_with将会指定适用这些列表的师团
                              can_use则决定是否激活这个列表
                              Stability and War Support
                              Since national unity is no longer a thing, modders can already now start replacing set_national_unity and add_national_unity with the new set_stability and add_stability and war_support. Things like national_unity_factor work the same way, just replace national_unity with stability or war_support as appropriate. Triggers work as you’d expect (has_stability and has_war_support). Setting and trigger off of stability/war_support is on a scale of 0-1 (so set_stability = 0.5 and has_war_support > 0.3)
                              稳定度与战争支持
                              这段真的都是废话……意思是只要把现在的凝聚力的national_unity部分替换成stability或者war_support就可以用了


                              IP属地:北京15楼2017-12-21 18:49
                              回复