我赶时间 · 版
Wine + winetricks (dotnet 8 + dotnet 4.8) + 字体迁移
失败的 Man
由于自己没有用过 .Net 开发过,只好摸着石头过河。姑且对未竟的尝试做下笔录。
直接编译
使用的仓库:EvilMask / Emuera.EM · GitLab
克隆下来之后,在 Emuera/UI
下发现使用了大量的 System.Windows.Forms
,也就是 dotnet/winforms。悲伤的是,查了些资料发现这个上古老库只能在 Windows 环境下编译与运行。
白瞎我装了一堆 .Net
的运行时和 SDK。
替代库与替代产品
找替代库的时候,我的核心诉求是将 System.Windwos.Forms
非侵入地迁移至其他替代 UI 库。
冲浪了一会,得到的信息有:
- The GTK Project:一个实现了大部分 winforms 功能的跨平台 UI 库。需要深度改代码。
- Xamarin:巨硬整的一个旧活,也需要深度改代码。
Fegelein21
大佬曾使用它重做了整个 UI,即xEmuera
。 - Porting Winforms Applications | Mono:跨平台 dotnet 实现,似乎提供了迁移手册。
- 参考:c# - How to run a Windows Forms application on macOS?
- 这似乎是最接近答案的一个方案。但由于私家版 EM 里面使用到了 libwebp 的动态库,还得额外去找对版本、去编译,故姑且作罢
现存的跨平台产品:
uEmuera
:使用 Unity 3D 封装,使用引擎的 mono 运行时。由 xerysherry、Fegelein21 两位大佬先后进行优化。是目前较为可靠的跨平台产品。- Fegelein21/XEmuera:基于
Xamarin.Forms
的Emuera
跨平台移植版本。
更详细的信息参阅 Emuera版本 - 中文 era 游戏 Wiki
可惜没有 MacOS 发行版本可以直接下载,手头也不想再安装一个 u3d 大块头,遂摆。
虚拟机
虚拟机至少比安装一个纯血 Windows 强一点点。先排除 Parallels Desktop 这种直接安装镜像的虚拟机,找一坨比较小的:WineHQ。
将 Windows API 调用翻译成动态的 POSIX 调用,免除了性能和其他一些行为的内存占用,让你能够干净地集合 Windows 应用到你的桌面。
MacOS 的安装方式可以参考 官方文档。
1 | # 需要预先安装 homebrew |
安装后便可以用 控制台 导航到 eraTW 的文件目录下输入 wine xx.exe
启动游戏。这里的 xx
便是我们的 emuera 二进制文件。比如:
1 | wine Emuera1824+v18+EMv17+EEv41.exe |
理论、游戏启动成功可能。
捉虫时间到
口口口,口口口口口。
没想到,文字变口了。
这是因为有一部分字体找不到,需要从大伙自己的 PC 上,拷贝补齐字体到 ~/.wine/windows/Fonts/
下。
我当时还用下文提到的 winetricks
安装了 allfonts
,但仍然充满了口口口。
如此一来,中文、日文便能正常显示了!
VbStrConv 不支持宽窄文本转换
开始加载地图的时候,突然报错了!
参考了这几篇博文,好像都没有解决方法:
简单扫了一波代码,鉴定为 Mono 通病。无论哪一个分支,mono-basic
均没有实现 VbStrConv.Wide
或 VbStrConv.Narrow
的转换^[mono 源码 String.vb]。
那么上面提到的使用 mono 运行时的 uEmuera 是怎么做的呢?答案是实现一个自己的 StrConv ^[uEmuera 源码 VisualBasic.cs] ,并将私家版原版中的函数替换掉。但是仔细看这个新的实现,相较原生其实缺少很多字符的映射,包括大量标点符号在内,平片假名转换也遗漏不少。
解决方案便是使用 winetricks
安装正儿八经的 .Net 运行时。
WineTricks 是一个社区开源工具,用于在 Wine 环境中安装各种 Windows 应用程序和库文件。
- 下载 winetricks/src/winetricks at master · Winetricks/winetricks
- 执行
winetricks dotnet8
,按照提示安装 .Net Core 8.0 - 执行
winetricks dotnet48
,按照提示安装 .Net Framework 4.8
再启动游戏,应当就能愉快玩耍了。