CK3 mod 修复记录 (1)

于 2024-03-19 发布

CK3有一个mod叫做Configurable News Feed,历经三代作者,现在还在更新的是Configurable News Feed - Updated。这个mod能够自定义自己想要收到的通知,近至至亲远达宗族成员、上下级的生老病死都可以自定义接受与否,对于扮演家族长非常有意义。但是问题在于,这个mod在普通模式下会导致成就不能解锁,在铁人模式下会导致设置菜单打不开——configurable这个核心没了,那就麻了;而对于我来说,能够解锁成就是游戏的核心驱动力。所以,昨天晚上我决定下手解决这个问题,并且花了一个钟完全了解了这个症结所在,成功帮助维护者修复了这个bug。

What

最早在2023年5月18日的时候Sunghowl提出这个mod会禁用成就,随后B flat表示铁人模式会让configuration button失效;之后有很多玩家遇到了相同的问题。

Why

Lost Nomad指出了问题所在:gui/newsfeed.gui中使用了ExecuteConsoleCommand指令,导致成就被锁定。

How

之前在评论区或者什么地方我看到了一位玩家曾经提出,有一个mod曾经也是这样创建窗口的,因为在以前这是在runtime创建窗口的唯一方式;而现在有了另外的方法,所以那个mod通过先创建窗口然后hide了它,在需要的时候才visible,来解决了问题。这便是思路。

通过查阅ck3 wiki(其实是搜索ExecuteConsoleCommand而出现的)Interface页面,主要是New windows and toggles一节,了解到需要做以下改动:

  1. 创建gui/scripted_widgets路径并创建一个文件newsfeed_setting.txt来让窗口系统在启动时把窗口创建出来
  2. 通过visible field来控制窗口的可见性,并修改相关的button代码来让用户能够控制可见性

分析完成,那么我们打开问题之源gui/newsfeed.gui,看到以下段落:

1
2
3
4
5
6
7
8
9
10
11
12
state = {
  name = open_settings
  trigger_when = "[GetVariableSystem.Exists('newsfeed_settings_shown')]"
  on_start = "[ExecuteConsoleCommand('gui.CreateWidget gui/newsfeed_settings.gui newsfeed_settings_window')]"
}

state = {
  name = close_settings
  trigger_when = "[Not(GetVariableSystem.Exists('newsfeed_settings_shown'))]"
  on_start = "[ExecuteConsoleCommand('gui.ClearWidgets newsfeed_settings_window')]"
}

可知两个重要信息:

  1. window名字是newsfeed_settings_window,其他控件是通过这个名字来访问它的
  2. newsfeed_settings_window的文件是gui/newsfeed_settings.gui

那么打开gui/newsfeed_settings.gui,看到开头第一部分就写明了name = "newsfeed_settings_window",那么参照wiki就知道gui/scripted_widgets/newsfeed_setting.txt的内容是:

1
gui/newsfeed_settings.gui = newsfeed_settings_window

顺手把gui/newsfeed.gui的两个ExecuteConsoleCommand整行注释掉之后,启动游戏就会发现新建游戏地图加载出来之后mod的设置界面直接弹出来了关都关不掉,同时不会锁成就了。

接下来就是控制可见性。根据wiki,再对照gui/newsfeed_settings.gui的内容,可以感悟到1wiki里面写的visible应该放在这一级:

1
2
types NewsFeed {
    type newsfeed_settings_menu = window {

打开游戏发现确实开始的时候窗口不见了。

剩下的就是对每一个相关的地方使用新的方法控制visible了,以及替换掉旧的判断窗口是否显示的方法:

  1. 以前是Exists('newsfeed_settings_shown'),现在是Exists('show_newsfeed_settings_window')
  2. 以前是Clear('newsfeed_settings_shown'),现在是Toggle('show_newsfeed_settings_window')

改完就好了。

  1. 其实我是开了debug模式和gui_editor之后,无意间发现原来的文件对窗口加的两个state跟我点击Add添加的visible是同一级的,才定位到位置。 

目录