我试图在 2.0+ 版本中修复 mod: Ciri in Night City - Main Menu Background Replacer,添加对往日之影 Logo 的支持。
Update 1.1.0:v1.0.0 中,载入游戏时的动画消失了,我将其修复,但最后一个动画也会变成被更改的主菜单背景
写在前面:加载动画丢失的问题,归根到底是因为这个原 Mod 对背景的修改手段太粗暴了,而往日之影 Logo 缺失,则是因为这个 Mod 过期了。
如果想修复丢失的加载动画,直接跳到 “找回丢失的加载动画” 阅读就行。
这一节将从头开始构建这个 Mod。
原 Mod 启动效果图,可以看到没有往日之影的 logo:
# Logo 的修改方法
修改工具:WolvenKit
# 往日之影 Logo 补充
打开 Mod Browser,找到安装好的原 Mod
选择 base 文件夹,然后鼠标右键 Add selected items to project
左侧 Project Explorer 中找到 menu_background.xbm 和 menu_background_1080p.xbm,这是出问题的文件,直接删掉就行,如下:
# 最后的工作:打包
Buid -> Pack Project,会在项目文件夹下打包为 zip 压缩包,这就是修复好的 Mod,安装到 CP2077,并卸载掉原 Mod。
效果如下,成功补上往日之影的 Logo:
# 分析原 Mod
最好先阅读:archive 内容解析
我的分析过程其实绕了很大的弯子,有兴趣可以看一下。
# 定位背景图片的位置
原 Mod 修改的文件还是有很多的,为了找到正确的思路,我选择先定位被修改的背景图片。
根据游戏主线进度不同,赛博朋克的主菜单背景会更换图片。
寻找后,我发现对应的目录: base\gameplay\gui\world\loading_screens\
该目录下所谓 loading_screen_5_after_q101、loading_screen_10_after_q112,应该对应了主线中某些事件的发生,比如图片 loading_screen_10_after_q112\loading_screen_10_shot_01.xbm:
这显然是在潜入山车安装病毒之后会出现的那个背景图。
再比如图片 loading_screen_5_after_q101\loading_screen_5_shot_01.xbm:
这对应目前我的主菜单图片:
# 进一步分析 inkwidget
如果我要更换这个主菜单的背景图片,应该需要更改对应的 inkwidget 中的内容。
原 mod 虽然不能显示往日之影的 logo,但是背景替换功能还是正常的,因此可以做一定的参考。
着重分析:loading_screen_5_after_q101.inkwidget,因为这对应目前我主菜单的背景图片,方便我进行分析。这里面应该包括构成当前主菜单界面的资源。
左:原文件;右:原 Mod 中修改后的文件
先看右侧的原 Mod 文件,主要是文件 cp_bq_alphafaded.bk2,这就是被替换的希里背景动画。
然后看左侧的游戏原文件,因为目前我的主菜单背景是 short01 的图片,所以不看 short02、short03 的内容:
smoke_loop.bk2:一个冒烟的动画视频
shot_01_assets.inkatlas:对文件 short_01_assets.xbm 进行了分割,提取出图片后面的三个光柱(ad)以及闪烁的灯光(antenna_lights)
short_01_assets.xbm 如下,应该能理解我的意思:
loading_screen_5_shot_01.inkatlas:对应为主体背景,因为分割的那 4 个参数 Bottom、Left...,分别设置为了 0 和 1,也就是顶格分割,取了图片整体。
如下是对主页面要素的标注,①对应 smoke_loop.bk2,②对应 shot_01_assets.inkatlas:
因此,如果只是要更换当前的背景图片,把 loading_screen_5_shot_01.xbm 换掉就行。
# 原 Mod 思路分析
上一节说换 loading_screen_5_shot_01.xbm,其实是不够的。
先说第一个原因:背景图片是会跟着主线剧情切换的。
仔细对比可以发现,Mod 中更改的 loading_screen_5_after_q101.inkwidget,其内容和游戏原文件: base\gameplay\gui\world\loading_screens\initial_loading_screen\initial_loading_screen.inkwidget 完全一致。
左:Mod 中的文件;右:initial_loading_screen.inkwidget
而我们知道,initial_loading_screen.inkwidget 中的 cp_bq_alphafaded.bk2,已经被替换为希里的背景动画了。
因此 loading_screen_5_after_q101 对应的背景就会被替换为希里。
再看原 Mod,每一个对应文件夹下的 inkwidget,其内容都被改成了 initial_loading_screen.inkwidget
所以说原 Mod 的思路很绝:既然背景图片会换,那就把它们都改了!
# 往日之影 Logo 修复点分析
上面分析了这么多其实对修复往日之影的 Logo 完全没用,因为在游戏原文件 loading_screen_5_after_q101.inkwidget 中,我并没有找到 Logo 的部分,上述内容都是原 Mod 更改背景图片的思路。
但是把已经分析出作用的文件去掉,原 Mod 的结构就简单多了。
我马上就发现了:base\gameplay\gui\fullscreen\main_menu\menu_background.xbm,以及 menu_background_1080p.xbm
左:原 Mod 中的 menu_background.xbm;右:游戏原目录中的 menu_background.xbm
少了什么一目了然,就是往日之影的 Logo。
正确的文件游戏里已经有了,现在加载不出来是因为原 Mod 中的文件覆盖了游戏的默认文件。
因此如果要修复这个 Logo,只要把 Mod 里这两张图片删了就行。
# Update:修复丢失的加载动画
先说说修复完 Logo 之后我发现的这个新问题:
从主菜单载入游戏存档时,一般会播放一个小剧场,和主菜单背景一样,会跟随剧情变化而变化。而问题就是,这个小剧场没了,加载过程全黑。
这个小剧场其实由三段动画构成。先看看这三段动画的例子:
动画一:
动画二:
动画三:
# 加载动画丢失原因分析
之所以加载动画会丢失,究其原因是原 Mod 直接将每一个对应文件夹(loading_screen_5_after_q101)下的 inkwidget,都替换成了 initial_loading_screen.inkwidget。
这显然会导致很多问题,loading_screen_5_after_q101.inkwidget 是和加载动画相关的关键文件(具体参考 archive 内容解析 #inkwidget)。
从下面那张对比图可以看出,loading_screen_5_after_q101.inkwidget 下对应的三个加载动画资源,ls_01,ls_02,ls_03 在 initial_loading_screen.inkwidget 中都没有了,只剩下 main_menu 和 loading_screen。
而 main_menu 对应 cp_bq_alphafaded.bk2 资源,也就是替换的希里的背景,loading_screen 则是对应另一个进入主菜单时的动画资源。
因此,游戏找不到 ls_01,ls_02,ls_03,也就丢失了加载动画
# 加载动画修复方法
因为上述原因,只能从头构建这个 Mod。
首先创建一个新项目,和修复 Logo 时差不多,在 Asset Browser 中找到原 Mod 的 cp_bg_alpha_faded.bk2,也就是希里背景,加入到项目中。
然后找到游戏中的 loading_screen_5_after_q101.inkwidget 和 initial_loading_screen.inkwidget,将前者加入项目,并打开编辑,后者选择 Open without adding to project 即可。
复制 initial_loading_screen.inkwidget 中的 cp_bq_alphafaded.bk2 资源,然后加入 loading_screen_5_after_q101.inkwidget 的 externalDependenciesForInternalItems 中:
然后进入 ls_01 的 children,删除里面的 1-6 项,这些都是组成原主菜单背景的资源。至于第 0 项 fade_to_black,应该是衔接动画,不能删除,否则会导致主菜单背景动画播放卡顿。
然后复制 initial_loading_screen.inkwidget 中 main_menu -> children 中的 cp_bg_alpha,这对应希里的背景动画资源,因为对应文件已经做出替换。
粘贴到 loading_screen_5_after_q101.inkwidget 之前删除其他资源的位置即可:
同样的操作,对 loading_screens 中 其他文件夹下的 .inkwidget 都做一遍,就全都能替换掉了。
唯一的问题:
ls_01 对应主菜单背景动画和加载动画三,ls_02 对应加载动画一,ls_03 对应加载动画二。
因此我为了替换主菜单背景动画,修改了 ls_01,加载动画三不可避免的也会变成希里的背景。暂时没有找到解决方法。