添加 Linux 原生游戏到 Wine Steam 里并记录游戏状态 / 让 Wine Steam 里的不同游戏用不同的语言(环境变量)运行

首先解释下这个奇怪的需求哈:

1. 添加 Linux 原生游戏到 Wine Steam 里并记录游戏状态: 可以让 Steam 好友知道自己在玩什么, 而同时又可以避免用 Wine 跑相应游戏带来的性能损失. 如果直接用 Wine 自带的 start.exe 启动 Linux 游戏, 因为 start.exe 会在启动游戏后直接退出 (/wait 参数对 Linux 进程无效), 因此游戏时 Steam 状态会显示为不在游戏中, 这样我们的目的就达不到了…

2. 让 Wine Steam 里的不同游戏用不同的语言(环境变量)运行: Wine 对 CJK 字符编码的修正是和语言(Locale)环境变量有关的, 比如 Touhou 用 ja_JP 环境跑表现一切正常, 而在 zh_CN 或者 en_US 下标题栏均是不同程度的乱码 (其它程序有更严重的问题, 包括全部字符变成问号等). 但是用 Steam 运行游戏时, 所有子进程都直接继承了运行 Steam 时的环境变量, 没有办法修改.

至于为啥不在 Linux 原生版的 Steam 里用? 嗯, 因为想要反向实现需求, 也就是让 Linux 原生版的 Steam 能跑 Wine 的 Steam only 游戏, 这件事情的难度好像不是一般的大… (DRM 什么的, 而且 Steam 是单点登录的)

看起来好像是无关的两个问题哈 <(=^_^=)> 不过呢, 本猫用了相关的方法来解决, 因此放在同一篇博客里介绍啦.

警告: 本方法各种丑陋, 要是产生不适千万不要怪我(

咳咳, 回到正题. 我的思路是使用一个文件锁:

1. Wine 启动一个 wrapper (也就是 Steam 命令行里填写相应的路径)
2. wrapper 首先创建一个临时文件, 然后把文件名传给一个 wine 外运行的脚本
3. 这个时候 wrapper 已经丢失了自己刚刚启动的脚本的运行状态, 但是可以继续通过检测文件是否存在来知道脚本是否已经退出
4. 脚本启动目标程序
5. 脚本等到程序退出再删除临时文件
6. wrapper 检测到临时文件消失后, 退出

本来一开始用 Python 丑陋地写了一个, 不过想到这样还要在 Wine prefix 里装一个 Win 版的 Python, 实在是无比蛋疼, 所以翻着手册用 DOS 批处理 (Batch) 重写了一次. 下面就是本猫的完成品啦~

/usr/local/bin/wine-run.bat

/usr/local/bin/wine-run-helper.sh

给两个文件都加上执行权限, 完成!

然后以 Minecraft 为例, 我介绍一下 Steam 里的配置方法:
添加一个 Non-steam 游戏, 然后修改 Target 为:

(其它环境请自行修改路径哈)
如果是 Arch AUR 的 minecraft 包的话, 图标可以在 Z:\usr\share\pixmaps\minecraft.png 找到~

最后的结果:
2014-04-13-023157_967x707

下面再来继续解决第二个问题, 不同 Locale 怎么办! 嗯你应该已经猜到了, 那就是用 Wine 启动一个 Linux 命令修改环境变量再调用 Wine 来启动目标程序 (哈哈哈哈被蛋疼到了吧)
以 Touhou 14 为例:
Target:

(自行修改路径哈)
图标我是用 wrestool (community/icoutils) 从 exe 中提取后, 再转换为 png 格式的. 具体命令很简单的, 自行 Google 哈(

最后的结果:
2014-04-13-191753_1143x691

2 thoughts on “添加 Linux 原生游戏到 Wine Steam 里并记录游戏状态 / 让 Wine Steam 里的不同游戏用不同的语言(环境变量)运行”

Leave a Reply

Your email address will not be published.