又一篇研究如何游玩音击的文章
本文仅供学习交流使用。本文不提供涉及软件的下载方式。
音击,オンゲキ,ongeki,是一款街机音游。曾有机会上手了一天,发现是真的好玩。可惜它只在日本运营,所以在国内很难接触到,基本上唯一能玩到的办法就是自己跑游戏。
本文记录了我研究如何在家用 PC 上运行这玩意的历程。网上有一些研究帖子,但相对今天已有些过时,这篇文章大量参照了那些已有资料。
最后一次更新于 1 月 30 日。
目标
音击街机实际上是一台经过深度定制的 PC,运行 Windows 系统并搭载了一些加密措施。如果能获取到游戏本体并模拟按钮信号输入,理论上能够在普通家用 PC 上运行游戏。如果想在国内略微体验一下游戏,这是一个门槛相对较低的办法。
这篇文章希望
- ✅ 在普通 PC 上运行音击,并使用键盘和鼠标操作。
- ➖ 自制手台,模拟实际的游戏体验。
运行音击
事前准备
为了运行音击,需要
- 游戏本体:游戏本体在解密后应是一份基于 Unity3D 引擎制作的游戏程序。可执行文件名为
mu3.exe
。 - 模拟器:用于模拟街机环境,并映射输入。工具名为 segatools。
- 服务端:当然别想着连接官方服务器,我们也需要自己搭建服务器。目前 1.40 的一个可用服务端为 artemis。
模拟器和服务端的抽象程度从源码可见一斑,解密游戏本体有多抽象我也大致了解了一下[1]:结论是这辈子应该学不会了。
十分感谢他们的付出,否则像我这种业余选手根本没可能玩得上。有了极其靠谱的工具后,留给我们的工作已经足够简单。
配置服务端
安装 Python 3.9。
安装 mysql 或 mariadb。
创建数据库:
1 |
|
将 example_config
文件夹更名为 config
。内含各种游戏的配置——没错 artemis 是一个很全能的服务端。如果想要设置游戏中的细节,可以修改 ongeki 配置。
依照 requirements.txt
安装依赖。
调整 core.yaml
,按照 mysql 配置修改 IP、用户,添加 AimeDB key。
运行 python dbutils.py create
来创建剩余数据表。
配置 segatools
检查游戏本体目录结构。除 Unity3D 引擎游戏特有的目录之外,还应包含
1 |
|
将 segatools 放置到游戏本体的根目录下,注意修改配置文件中的设置,配置文件中注释写得足够清楚。
配置网络
最后设置好本体和服务端的 IP。使用 ipconfig
或者网络属性等窗口获取自己的局域网 IP。务必是局域网 IP,最好以 192.168
开头,10.
段在我的测试中不能使用。另外,不能使用 127.0.0.1
、0.0.0.0
,这些 IP 被游戏本体屏蔽了,不知道这样做的原因是什么,可能他们的程序员对网络有着特殊的执念。
修改服务端的配置。配置位于 config/core.yaml
。将其中的 listen_address
与 hostname
都修改为刚刚查到的局域网 IP。
修改游戏本体的配置,或者说模拟器的配置。配置位于 segatools.ini
。将其中的两个 IP 地址也都改为上文 IP。
有人可能注意到
subnet
应该填网段。不过这样能用所以就没管了。
启动和配置游戏
找到 DEVICE
文件夹下的 aime.txt
文件,内容就是玩家的 aime id。正常游戏时应该从 aime 卡中读取,模拟器直接将该文件注入到游戏中。将其修改为任意 20 位数字。
先启动服务端,后启动游戏,按照以下步骤:
- 运行 artemis,启动服务端。正常情况下能看到服务启动完成的日志输出。
- 运行游戏本体的
start.bat
,启动游戏。
理想情况下,一个黑色的自检画面会在短暂等待后弹出。第一次启动时该自检会卡在第一幕第二项上非常长时间,游戏将生成一些缓存文件,后续加载会稍快。第二幕与第三幕自检过程中,服务端应有相应访问日志,否则请检查 IP 配置是否出错。
自检完成后进入游戏界面,网络图标为绿色。现在就已经可以游玩了。
- 长按回车键模拟读卡信号,注册账号。
- 使用
3
键投币。 - 默认情况下,操作方式为:6K 分别为 ASD JKL,两个菜单键为 U O,鼠标控制摇杆,左右为侧键。通过修改 segatools 的配置文件,可以更换按键。
我认为把侧键配置到鼠标左右上的想法非常蠢。
小结
文章很多内容是回忆着写出的,主要起到备忘的作用,所以难免遗漏、错写或者过于简写;除此之外,看看是否有人有兴趣交流。后续可能会扩充内容。
附录 A:Bug Fix
最新版 artemis 还没有适配 bright MEMORY 1.40。如果在第二次运行游戏投币时崩溃,那么需要修改源代码 title/ongeki/index.py
中对版本号的判别部分:
1 |
|
附录 B:segatools 的原理简述,输入设备模拟
如果打开 start.bat 文件,能发现以下关键内容
1 |
|
inject 来自于项目 capnhook,能够将指定 dll 注入到可执行文件中,并由 dll 劫持启动流程,在真正的程序启动前用自己的函数替换掉原本的 API。segatools 通过这种方式劫持游戏程序检测设备型号、网络操作、注册表操作、IO 等函数,从而伪装街机环境并将游戏输入映射至键盘和鼠标。
segatools 的 mu3 hook 部分定义了自定义模拟输入设备的接口。可能有用。
附录 C:maimai 逆向
这篇文章 尝试逆向 maimai 的游戏本体,可一窥难度。
制作手台
键鼠真的只是能用,如果想要体验这款游戏,还是需要一个简单的外设来模拟街机按键。
后续计划做一个音击手台来游玩。工程比较大,更新随缘。