维多利亚3吧 关注:103,638贴子:1,432,779
  • 14回复贴,共1

【改派教程向】简论几种V3事件的触发方式

只看楼主收藏回复

表面上,在玩家的角度中维多利亚3的事件触发只有四种方式1.普通事件,也就是会在大地图上弹出的那种。2.由决议触发的事件。3.由事件触发的事件【如英国的鸦片战争事件】4.由日志触发的事件。
但是如果你恰好是个MODDER或者改派,看过events文件中的某些事件的触发条件,这个时候你会惊奇的发现,这些事件中只分出来了两类—— 1.填写了trigger=内容的事件,2.trigger=为空的事件。你表示这并不惊奇,因为有些事件,比如维多利亚女皇的加冕礼事件,就是要靠日志完成才能触发的。 但随着你继续深挖,你发现,有些你自认为应该有触发的事件,比如清朝覆灭,反而是为空的。你觉得不应该,这个事件大清所拥有的两个日志中都没有提及,也不是决议触发的。这个时候你对事件触发的逻辑已经有所怀疑了。
于是,你自己写了一个新的事件,可能是个事件链,也可能是单个事件,你做好了一切调试的准备,满足了你在trigger域中写的所有条件,就等着它和v2一样,自动触发。于是,你等了一天,游戏到了1936年,它仍没有触发。
这是怎么回事呢?且听我楼下细说。


IP属地:河北1楼2023-07-08 22:25回复
    首先要明确,不同于v2,v3用trigger区域为空【也就是trigger = {#empty}】取代了is_triggered_only =yes,而且为了给日志和决议让路,大部分的事件并没有详细的触发条件。
    明确了这一点后,我们再来讲v3中事件触发的几种类型。由于trigger为空的事件较多,先讲一下这部分
    表面上,这种条件为空的事件,只有三触发方式,也就是1.日志成功/失败 2.决议触发 3.事件触发。
    这三种事件的触发也非常容易写:
    1.日志触发:
    只需要在日志的on_complete on_fall on_invalid内使用trigger_event语句即可,例如:
    on_fail = {
    trigger_event = { id = paris_commune.3 popup = yes }
    }
    2.决议触发和事件触发更加简单,只需要在决议/事件选项的效果中加上trigger_event即可。
    但如果,事件的触发真的只有这么简单,那它也无法回答我们接下来的两个问题,1.为什么有的事件,触发条件为空,日志,决议,其他事件中也没有显示,结果自己满足特定条件后依然弹出了呢?2.为什么我写的事件,满足了所有触发条件,结果它自己就是不弹呢?
    楼下继续细说。


    IP属地:河北2楼2023-07-08 22:38
    回复
      2025-05-11 21:46:10
      广告
      对于第一个问题,为什么有的事件,触发条件为空,结果在游戏中满足特定条件后它依然还是会弹出?
      这其实也是日志捣的鬼,当一个国家激活了某个日志的情况下,有些日志实际上自己有一个事件判定系统。它的写法如下:
      1.写法一:满足特定条件后激活某特定事件
      对于这种情况,它通常是这么写的。

      注意,if可以并列写多个,同时可以使用else_if实现分支。
      而这种触发的检测跨度,是按照on_xxxx_pulse设定的。 有on_weekly_pulse on_monthly_pulse和on_yearly_pulse三种。分别对应了每周,每月,每年。
      2.写法二:随机触发一些事件
      这个时候有人可能说了,我不想,或者我不知道写什么触发条件比较好,我只想随机触发几个事件,怎么做?
      其实这更简单,只要配合上random_events 即可。


      IP属地:河北3楼2023-07-08 22:57
      回复
        这个时候有人要问,诶,尤老师,有没有一种可能,让游戏开局时,某些国家就特定发生一些事件,而不需要等待?
        他说他是乱问的,他可不是乱问的啊,很快,我们就要进入无触发事件的最后一种触发方式,开局触发。
        这其实更加简单,你只需要在common/history/countries中找到对应国家的文件,然后给填上一句trigger_event即可,如:

        这样你就可以在游戏开局的时自动触发一个事件,而完全不需要开启游戏速度来等待。


        IP属地:河北4楼2023-07-08 23:02
        回复
          这个时候,我们回到我们最后一个问题:为什么哥们写的有触发事件,在都满足触发条件的情况下,等到1936年成就都拿了,它也没触发?
          这是因为,你虽然写了触发条件,但你并没有写触发的检测间隔!这个检测时机间隔应该在哪里写呢?在common/on_actions/00_code_on_actions.txt文件里!
          这个文件,实际和日志的检测方式类似,只不过它做了个更加细化的区分,它区分出了country,character,state区,这个只需要看on_xxxxx_pulse后面跟的是哪个就可以了。
          而如果,我们想有一个国家级的event,按月检测触发条件,只需要在on_monthly_pulse_country的events={}内加入我们的事件,并保存文件即可。如:

          需要注意的几点是,1.这个events = {}的方法,在日志中配合on_xxxx_pulse也可以使用,效果就是在日志存在的时候当检测到事件满足所有条件后弹出。
          2.这个on_actions内的文件同时也可以使用random_events和if等语句来做到全局性的效果判定和触发,比如当人才池的角色人气低于15的时候会被清除,实际上是写在这里面的。
          3.这个文件中有on_decade_pulse_xxxx on_five_year_pulse_xxxx on_half_yearly_pulse_xxxx等对应十年,五年,半年的语句,但在日志中有没有对应的on_decade_pulse等尚且不知。
          4.在地区和角色部分中,有更多的语句,比如战斗开始,战斗胜利等。这代表着可以扩展很多新东西。


          IP属地:河北5楼2023-07-08 23:19
          回复
            @EasternPrussia 吧主能申精华吗(


            IP属地:河北6楼2023-07-08 23:32
            回复
              先养养


              IP属地:安徽来自Android客户端7楼2023-07-08 23:37
              收起回复
                建议加精,我们mod制作者很需要这些东西


                IP属地:湖南来自Android客户端8楼2023-07-09 10:14
                回复
                  2025-05-11 21:40:10
                  广告
                  在jomini引擎里所有事件都是triggered only啊
                  mtth是克劳塞维茨的老黄历了,jomini引擎必要有个地方指定触发事件的


                  IP属地:浙江来自Android客户端9楼2023-07-09 13:18
                  回复
                    很好的分享。爱来自伦敦大本钟yesyes


                    IP属地:江西10楼2023-07-10 14:38
                    回复
                      加三


                      IP属地:山西来自iPhone客户端11楼2023-07-11 12:12
                      回复
                        太监了吗


                        IP属地:湖南来自Android客户端12楼2023-07-15 13:28
                        收起回复
                          大佬求教!我想通过事件增加一个全球变量,然后在on action 里增加一个每周脉搏,检测有那个变量存在就自动把大于0的投资池资金转移到国库,但似乎无法触发!
                          目的是为了实现以前版本没有私人投资的模式,球球大佬指教,或者可以有别的路径实现吗,比如直接修改国家变量里的“私人建造力分配比例”之类的。


                          IP属地:广东13楼2024-10-01 23:21
                          回复