又一篇研究如何游玩音击的文章

本文仅供学习交流使用。本文不提供涉及软件的下载方式。

音击,オンゲキ,ongeki,是一款街机音游。曾有机会上手了一天,发现是真的好玩。可惜它只在日本运营,所以在国内很难接触到,基本上唯一能玩到的办法就是自己跑游戏。

本文记录了我研究如何在家用 PC 上运行这玩意的历程。网上有一些研究帖子,但相对今天已有些过时,这篇文章大量参照了那些已有资料。

最后一次更新于 1 月 30 日。

目标

音击街机实际上是一台经过深度定制的 PC,运行 Windows 系统并搭载了一些加密措施。如果能获取到游戏本体并模拟按钮信号输入,理论上能够在普通家用 PC 上运行游戏。如果想在国内略微体验一下游戏,这是一个门槛相对较低的办法。

这篇文章希望

  • ✅ 在普通 PC 上运行音击,并使用键盘和鼠标操作。
  • ➖ 自制手台,模拟实际的游戏体验。

运行音击

事前准备

为了运行音击,需要

  • 游戏本体:游戏本体在解密后应是一份基于 Unity3D 引擎制作的游戏程序。可执行文件名为 mu3.exe
  • 模拟器:用于模拟街机环境,并映射输入。工具名为 segatools
  • 服务端:当然别想着连接官方服务器,我们也需要自己搭建服务器。目前 1.40 的一个可用服务端为 artemis

模拟器和服务端的抽象程度从源码可见一斑,解密游戏本体有多抽象我也大致了解了一下[1]:结论是这辈子应该学不会了。

十分感谢他们的付出,否则像我这种业余选手根本没可能玩得上。有了极其靠谱的工具后,留给我们的工作已经足够简单。

配置服务端

安装 Python 3.9。

安装 mysql 或 mariadb。

创建数据库:

1
2
3
4
5
CREATE USER 'aime'@'localhost' IDENTIFIED BY '<Enter Password Here>';
CREATE DATABASE aime;
GRANT Alter,Create,Delete,Drop,Index,Insert,References,Select,Update ON aime.* TO 'aime'@'localhost';
-- FLUSH PRIVILEGES;
-- exit;

example_config 文件夹更名为 config。内含各种游戏的配置——没错 artemis 是一个很全能的服务端。如果想要设置游戏中的细节,可以修改 ongeki 配置。

依照 requirements.txt 安装依赖。

调整 core.yaml,按照 mysql 配置修改 IP、用户,添加 AimeDB key。

运行 python dbutils.py create 来创建剩余数据表。

配置 segatools

检查游戏本体目录结构。除 Unity3D 引擎游戏特有的目录之外,还应包含

1
2
3
/app
/option
/amfs

将 segatools 放置到游戏本体的根目录下,注意修改配置文件中的设置,配置文件中注释写得足够清楚。

配置网络

最后设置好本体和服务端的 IP。使用 ipconfig 或者网络属性等窗口获取自己的局域网 IP。务必是局域网 IP,最好以 192.168 开头,10. 段在我的测试中不能使用。另外,不能使用 127.0.0.10.0.0.0,这些 IP 被游戏本体屏蔽了,不知道这样做的原因是什么,可能他们的程序员对网络有着特殊的执念。

修改服务端的配置。配置位于 config/core.yaml。将其中的 listen_addresshostname 都修改为刚刚查到的局域网 IP。

修改游戏本体的配置,或者说模拟器的配置。配置位于 segatools.ini。将其中的两个 IP 地址也都改为上文 IP。

有人可能注意到 subnet 应该填网段。不过这样能用所以就没管了。

启动和配置游戏

找到 DEVICE 文件夹下的 aime.txt 文件,内容就是玩家的 aime id。正常游戏时应该从 aime 卡中读取,模拟器直接将该文件注入到游戏中。将其修改为任意 20 位数字。

先启动服务端,后启动游戏,按照以下步骤:

  1. 运行 artemis,启动服务端。正常情况下能看到服务启动完成的日志输出。
  2. 运行游戏本体的 start.bat,启动游戏。

理想情况下,一个黑色的自检画面会在短暂等待后弹出。第一次启动时该自检会卡在第一幕第二项上非常长时间,游戏将生成一些缓存文件,后续加载会稍快。第二幕与第三幕自检过程中,服务端应有相应访问日志,否则请检查 IP 配置是否出错。

自检完成后进入游戏界面,网络图标为绿色。现在就已经可以游玩了。

  1. 长按回车键模拟读卡信号,注册账号。
  2. 使用 3 键投币。
  3. 默认情况下,操作方式为:6K 分别为 ASD JKL,两个菜单键为 U O,鼠标控制摇杆,左右为侧键。通过修改 segatools 的配置文件,可以更换按键。

我认为把侧键配置到鼠标左右上的想法非常蠢。

小结

文章很多内容是回忆着写出的,主要起到备忘的作用,所以难免遗漏、错写或者过于简写;除此之外,看看是否有人有兴趣交流。后续可能会扩充内容。

附录 A:Bug Fix

最新版 artemis 还没有适配 bright MEMORY 1.40。如果在第二次运行游戏投币时崩溃,那么需要修改源代码 title/ongeki/index.py 中对版本号的判别部分:

1
2
3
4
5
6
7
8
# ...
elif version >= 125 and version < 130: # Red Plus
internal_ver = OngekiConstants.VER_ONGEKI_RED_PLUS
elif version >= 130 and version < 135: # Bright
internal_ver = OngekiConstants.VER_ONGEKI_BRIGHT
elif version >= 135 and version < 140: # Bright Memory # >>> 将 140 修改为 150
internal_ver = OngekiConstants.VER_ONGEKI_BRIGHT_MEMORY
# ...

附录 B:segatools 的原理简述,输入设备模拟

如果打开 start.bat 文件,能发现以下关键内容

1
2
start /min inject -d -k mu3hook.dll amdaemon.exe -f -c config_common.json config_server.json config_client.json
inject -d -k mu3hook.dll mu3 -screen-fullscreen 0 -popupwindow -screen-width 1080 -screen-height 1920

inject 来自于项目 capnhook,能够将指定 dll 注入到可执行文件中,并由 dll 劫持启动流程,在真正的程序启动前用自己的函数替换掉原本的 API。segatools 通过这种方式劫持游戏程序检测设备型号、网络操作、注册表操作、IO 等函数,从而伪装街机环境并将游戏输入映射至键盘和鼠标。

segatools 的 mu3 hook 部分定义了自定义模拟输入设备的接口。可能有用。

附录 C:maimai 逆向

这篇文章 尝试逆向 maimai 的游戏本体,可一窥难度。

制作手台

键鼠真的只是能用,如果想要体验这款游戏,还是需要一个简单的外设来模拟街机按键。

后续计划做一个音击手台来游玩。工程比较大,更新随缘。


  1. link 1 link 2。这位的博客其他文章也介绍了大量街机逆向相关的知识。

又一篇研究如何游玩音击的文章
https://blog.chenc.me/2024/01/30/play-ongeki/
作者
CC
发布于
2024年1月30日
许可协议