SDVX获取与安装
- Arcade PC Dump loader emulation retrogaming
- Nyaa
- en attente
- 音乐游戏Arcade PC与工具集中整理帖 陆续更新中 2021/2/25 - 『 ROM交流区 』 - 琵琶行论坛 - Powered by Discuz!
- bemani.guide
google一下基本都能找到,这里简单汇总一下,有这些基本上能搞定安装问题了。
遇到的问题
无法刷卡
在游玩过程中会遇到刷卡输入密码后出错然后重复刷卡重复出错的问题,原因是没有给asphyxia装SDVX的账号插件,参考这个asphyxia-core/plugins
无法开启MEGAMIX BATTLE等模式
原因是在游戏的test设置中开启了free play,关掉,然后确保给asphyxia装了最新的SDVX插件(貌似网上找不到,但是集成在了KFC-2021060802
的游戏本体中)
开启女武神模式
BemaniPatcher一开始是支持直接给dll打补丁以开启女武神模式的,但是由于某些原因移除了对所有游戏的最新版本的patch支持。可以在这里找到对旧版本(KFC-2021060802
)的patch代码,照葫芦画瓢去patch最新版本即可。具体来说就是将最新版的soundvoltex.dll
拖到hexed.it中,然后搜索byte数组87050000480f45ca488bc1
(从旧版本得到,进行模式匹配),使用大端序搜索,搜索到以后修改8705
为470c
即可,然后替换游戏目录下的dll。最后还需要修改contentspropea3-config.xml
文件,将<spec __type="str">F</spec>
改成<spec __type="str">G</spec>
就ok了。顺带一提把<dest __type="str">J</dest>
改成<dest __type="str">A</dest>
可以切换到英语。参考自Arcade PC。
iPad手台
不知道网上有没有现成的轮子能充当iPad手台,反正自己早就有想过要造个轮子了,趁放假有空搞一波。
这是成品——SDVXPAD。使用方法参考brokenithm-kb,我的readme里面也有写。需要注意的是要用管理员身份打开,否则无法工作。
下面简单讲下造轮子过程,只想用轮子的可以到此结束了。
魔改Brokenithm-kb
修改后端代码
Brokenithm-kb是网页版的中二控制器,但是事实上他并不能用来玩中二,原因是他产生的模拟输入无法被中二接受,简而言之就是虚拟按键和真实按键之间存在区别,这个区别导致了包括中二以及SDVX在内的许多游戏无法接受虚拟输入。出于性能考虑,一些需要迅速反馈的游戏往往会直接和输入设备进行类似驱动级别的底层交互,而非windows的输入回调api。
参考:
- windows模拟键盘鼠标事件DirectX游戏中
总之Brokenithm-kb使用的user32.dll中的SendInput API是不管用了,网上找了一堆解决方案都不太好使,最终找到了DD.dll,虽然不开源,而且每次调用都要进行联网和服务器通信,有点担心是否有后门。但是目前来说用起来还是比较方便的,等之后有空逆向一下看看。
修改Brokenithm-kb源码中KeyboardSimulator.cpp的输入相关的代码,用DD的API替换掉即可。
首先在开头处初始化DD.dll
代码语言:javascript复制HINSTANCE hinst = LoadLibraryW(L"DD.dll");
typedef int(__stdcall*lpfun_DD_todc)(int);
typedef int(__stdcall*lpfun_DD_btn)(int btn);
typedef int(__stdcall*lpfun_DD_key)(int code, int flag);
lpfun_DD_todc dd_todc = (lpfun_DD_todc)GetProcAddress(hinst, "DD_todc");//VK code to ddcode
lpfun_DD_btn dd_btn = (lpfun_DD_btn)GetProcAddress(hinst, "DD_btn");//Mouse move rel.
lpfun_DD_key dd_key = (lpfun_DD_key)GetProcAddress(hinst, "DD_key");//Keyboard
修改按键表(可以不改,看个人喜好)
代码语言:javascript复制WORD YUANCON_BTN_MAP[N_BUTTONS] = {
'6', 'A', '4', 'S', '2', 'D', '0', 'F',
'X', 'Z', 'V', 'C', 'T', 'S', 'R', 'Q',
'P', 'O', 'N', 'M', 'L', 'K', 'J', 'I',
'H', 'G', 'F', 'E', 'D', 'C', 'B', 'A',
'Y', 'Q', 'W','E', 'R', 'T'};
在构造函数KeyboardSimulator::Impl::Impl
中添加以下代码用于检查DD是否正常加载
if (dd_todc && dd_btn && dd_key)
{
int st = dd_btn(0); //DD Initialize
if(st == 1){
spdlog::info("DD init OK");
}
}
else {
spdlog::info("DD init ERROR");
}
修改key_down和key_up
代码语言:javascript复制void KeyboardSimulator::Impl::key_down(int i)
{
spdlog::debug("{} Down", m_layout[i]);
int ddcode = dd_todc(m_layout[i]);
dd_key(ddcode,1);
}
void KeyboardSimulator::Impl::key_up(int i)
{
spdlog::debug("{} Up", m_layout[i]);
int ddcode = dd_todc(m_layout[i]);
dd_key(ddcode,2);
}
然后删除原来的冗余代码就完事了。
编译可能比较麻烦,还得搞cmake、vspkg和VS2019的环境,可以偷懒用github的action功能,交给github服务器去编译,只不过效率太低,每次编译都去重新配环境了,编译一次要两分钟左右,不方便调试,最后还是自己配环境了。不得不说Visual Studio真的是太笨重了,但是没办法,用VS Code编译老是出错,后来想着参考github编译的过程来一条一条的输入命令应该能行,然而到了vspkg的步骤还是提示要安装VS2019,服了。
修改前端布局
由于原作者代码写的鲁棒性比较好,前端改起来也很方便。直接贴代码
代码语言:javascript复制<body>
<div id="fullscreen">
<!-- Offset for LED display -->
<div class="container">
<div class="vol-container grow"></div>
<div class="bt-container grow">
<canvas id="canvas" width="33" height="1"></canvas>
</div>
<div class="fx-container grow"></div>
</div>
<!-- Hitbox Divs -->
<div class="container" id="main">
<div class="vol-container grow">
<div class="air key" data-air="1" data-kflag="0"></div>
<div class="air key" data-air="1" data-kflag="1"></div>
<div class="air key" data-air="1" data-kflag="2"></div>
<div class="air key" data-air="1" data-kflag="3"></div>
<!-- <div class="air key" data-air="1" data-kflag="4"></div> -->
</div>
<div class="bt-container grow">
<div class="key" data-kflag="0"></div>
<div class="key" data-kflag="2"></div>
<div class="key" data-kflag="4"></div>
<div class="key" data-kflag="6"></div>
</div>
<div class="fx-container grow">
<div class="key" data-kflag="8"></div>
<div class="key" data-kflag="10"></div>
</div>
</div>
</div>
<script src="/config.js"></script>
<script src="/app.js"></script>
</body>
同时要修改style里面的内容
代码语言:javascript复制.vol-container {
display: flex;
flex-flow: row nowrap;
align-items: stretch;
flex: 1;
}
.bt-container {
display: flex;
flex-flow: row nowrap;
align-items: stretch;
flex: 1;
}
.fx-container {
display: flex;
flex-flow: row nowrap;
align-items: stretch;
flex: 1;
}
js部分不用改,直接复用得了,改了大半天没啥用处,浪费时间。这里有个很迷惑的点是data-kflag对于air键来说可以用1、2、3、4这样的间隔,而对于其他按键则需要2、4、6、8这样的间隔,否则会出现用多指的时候会触发明明没有按到的按键这样的bug,折腾了快一天都没搞明白为啥。
结语
虽然花了好久搞了个iPad手台,然而实际上游玩体验并不好,还不如用键盘打的分高。玩了一小会儿,定级开始打12、13的歌以后发现键盘已经无法应付了,有很多需要左手拧旋钮右手按左边两个按键的操作,没办法,还是下单买个手台了。