在 Linux 下用 Wine 运行心灵终结

心灵终结是红警 2 的模组,分为四大阵营、12 个子阵营,各有特色。最新的 3.3.6 版本,完结了第二幕剧情。在 Linux 下,心灵终结既可以较容易地用 wine 跑起来,又因为它对显卡要求不高,用虚拟机也可以流畅运行。本文记录了 Linux Wine 环境下,心灵终结的下载、安装、配置过程。

测试环境

名称版本
发行版Linux Mint 21
桌面环境Cinnamon 5.4.12
Wine7.18
Winetricks20220411-next
DXVK1.10.3

下载

有人制作了心灵终结的汉化整合包,在安装过程中,可以设置是否汉化。在安装结束后,针对高版本 Windows 也有相应的优化。可以通过百度贴吧的置顶贴加入 QQ 群,从群文件下载。

官网的安装步骤非常繁琐,分提取文件、下载 3.3.0 的文件解压覆盖、下载音乐包解压、下载 3.3.6 的文件解压覆盖、下载汉化包覆盖等若干步骤。

准备 Wine Prefix

心灵终结的客户端有三个版本,位于游戏目录的 Resources 文件夹下。三者均能在 wine 下运行,不过对应的 wine prefix 配置方法有所不同,视喜好选择其一即可。

以下假设 wine prefix 的位置在 <wine_prefix>

客户端文件位置:Resources/clientogl.exe

使用 OpenGL 客户端最简单。直接新建 wine prefix 即可,无需进行额外设置。

1
WINEPREFIX=<wine_prefix> wineboot

客户端文件位置:Resources/clientdx.exe

使用 DirectX 客户端时,直接运行,窗口内容全黑,需要安装 DXVK 才能正常显示内容。

首先设置 wine prefix,然后从 DXVK 的 GitHub Releases 下载最新版的 DXVK 并解压安装。

1
2
3
4
5
6
7
8
## setup wine prefix
WINEPREFIX=<wine_prefix> wineboot

## download and install dxvk
wget https://github.com/doitsujin/dxvk/releases/download/v1.10.3/dxvk-1.10.3.tar.gz
tar xvf dxvk-1.10.3.tar.gz
cd dxvk-1.10.3
WINEPREFIX=<wine_prefix> ./setup_dxvk.sh install

客户端文件位置:Resources/clientxna.exe

这种方法最为繁琐,需要用 winetricks 安装 XNA Framework:

1
2
WINEPREFIX=<wine_prefix> wineboot
WINEPREFIX=<wine_prefix> winetricks dotnet40 xna40

如何手动下载 XNA Framework

Winetricks 会从 Internet Archive 下载安装程序。然而非常不巧的是,我在安装 XNA Framework 的时候,正赶上网站 503,所以我手动从微软官网下载了 XNA 的安装包,放在 ~/.cache/winetricks/xna40 下。但是只有这一步还不够,winetricks 仍然会尝试下载,并不会直接用我放进去的文件。想要让 winetricks 直接使用本地缓存的安装包,需要修改一下 winetricks 脚本。

如果使用系统的包管理器安装 winetricks,则不建议直接手动修改文件。最好自己下载 winetricks 再修改。

1
2
wget https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks
chmod +x winetricks

搜索 xna40,找到以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
load_xna40()
{
if w_workaround_wine_bug 30718; then
export COMPlus_OnlyUseLatestCLR=1
w_call dotnet40
fi

# https://www.microsoft.com/en-us/download/details.aspx?id=20914
w_download https://web.archive.org/web/20120325002813/https://download.microsoft.com/download/A/C/2/AC2C903B-E6E8-42C2-9FD7-BEBAC362A930/xnafx40_redist.msi e6c41d692ebcba854dad4b1c52bb7ddd05926bad3105595d6596b8bab01c25e7
w_try_cd "${W_CACHE}/${W_PACKAGE}"
w_try "${WINE}" msiexec ${W_OPT_UNATTENDED:+/quiet} /i "${file1}"
}

把第 9 行(w_download 一行)注释掉,然后再运行 winetricks:

1
WINEPREFIX=<wine_prefix> ./winetricks xna40

这样就可以直接从缓存好的文件安装 XNA Framework,不用下载了。这种方法也可以用于直接下载有困难的场景。

关于 32 位的 wine prefix

使用 32 或者 64 位的 wine prefix,客户端和游戏均可正常运行,唯一影响的是客户端播放背景音乐。

客户端播放背景音乐会用到 GStreamer 的插件。如果使用 64 位的 wine prefix,wine 会调用 64 位的 GStreamer 插件,这一般已经安装了。如果使用 32 位的 wine prefix,就需要自己根据 wine 在命令行的输出,安装 32 位的 GStreamer 插件。然而,到目前为止,三种客户端在 wine 下播放背景音乐均有问题:OpenGL 和 XNA 客户端根本无法播放,DirectX 客户端在启动后很短的时间内就会停止播放。

安装游戏

使用 wine 运行整合包安装文件:

1
WINEPREFIX=<wine_prefix> wine <path_to_installation_file>

中文整合包有客户端和游戏内的汉化,我建议两者都要安装:游戏内汉化影响剧情;安装客户端的汉化后可以正确显示存档的中文名。如果想保持客户端的英文界面,并正确显示中文存档名称,可以考虑从心灵终结贴吧的群文件中下载字体解压覆盖。

开始菜单与桌面的快捷方式都不用创建。

在安装过程中使用中文

如果要在安装整合包时使用中文,需要确保语言环境变量设置正确,并通过 winetricks 安装字体:

1
2
WINEPREFIX=<wine_prefix> winetricks cjkfonts
LC_ALL=zh_CN.UTF-8 WINEPREFIX=<wine_prefix> wine <path_to_installation_file>

游戏与客户端内的汉化不需要这两项设置。

按照官网步骤操作即可,详见 http://mentalomega.com/index.php?page=install

Winecfg 设置

1
WINEPREFIX=<wine_prefix> winecfg

启动 winecfg,调整两个选项:

  1. Libraries 选项卡下,添加 ddraw,这是为了使渲染补丁生效。如果不设置渲染补丁,可能无法进入游戏;
  2. Graphics 选项卡下,不要选择虚拟桌面,否则游戏无法全屏运行。

运行客户端

游戏默认安装位置在 <wine_prefix>/drive_c/Program Files (x86)/Mental Omega/。进入该目录,并启动相应的客户端:

1
2
3
4
cd <wine_prefix>/drive_c/Program\ Files\ \(x86\)/Mental\ Omega/
WINEPREFIX=<wine_prefix> wine Resources/clientogl.exe # OpenGL 客户端
WINEPREFIX=<wine_prefix> wine Resources/clientdx.exe # DirectX 客户端
WINEPREFIX=<wine_prefix> wine Resources/clientxna.exe # XNA 客户端

如果无法进入游戏,可以选择渲染补丁。我只测试了 CNC-DDraw。

其它问题

安装汉化后无法通过客户端进入战役

安装汉化后,在客户端进入战役时,游戏加载到一半就会崩溃退出,在 Windows 下却正常。这是 3.3.6 版本新出现的问题。汉化文件是游戏目录下的 expandmo98.mix。临时移走 expandmo98.mix 文件,可以进入战役,不过文字都是英文。退出游戏,把 expandmo98.mix 移回来,用客户端的“载入存档”功能,加载战役,便可绕过此问题。

使用 OBS 只能录到黑屏

如果在客户端的设置中,如果游戏内分辨率与当前分辨率不同,进入游戏后,屏幕的分辨率会改变,导致 OBS 的全屏捕获只能录到黑屏。解决方法:事先手动调整分辨率,保持与客户端内的设置一致,OBS 就能录到屏幕内容了。