精明的程序员——节奏大师乐谱破解

来源:互联网 发布:mac照片全选 编辑:程序博客网 时间:2024/04/28 22:28

精明的程序员——节奏大师乐谱破解

这几天迷上了节奏大师,玩了不到50关,就觉得越往后越吃力,自己的大脑手指有些跟不上了。
我想,要不做个机械臂加摄像头的程序,让摄像头捕捉游戏画面,cpu图像处理,控制机械臂去触摸屏幕。简单想,如果做出来倒是蛮酷的,不过现在时间比较紧,做这个需要花大功夫。
仔细琢磨之后觉得从软件实现的角度考虑,有两点可以优化。第一:机械臂可以省去,用操作系统提供的inject touch event的API代替,这样一来可以省去不必要的控制机械臂的时间,二来实时性也会好很多;第二,摄像头可以省去,用操作系统提供的capture screen的API代替,这样拿到的图像较为清晰,对处理和分析都有很好的帮助。
不过这两个外设去掉之后,做出来的程序显然不那么酷炫了,就好像一个简单的游戏外挂在后台运行而已。说到游戏外挂,大都是改内存数值,或修改程序来做到,用到图像处理的还比较少。主要因为通过图像识别游戏状态比较难做,按键精灵有这个功能,不过用它做出来的外挂都是一些比较简单的。
既然图像识别比较难做,我可否也绕开此步骤。分析游戏,我发现节奏大师每首音乐都有规律的谱面,这肯定是分析乐谱文件生成的。如果我也能分析出乐谱文件的格式,而生成一些touch event,岂不是更加简单,连capture screen和图像分析都不用考虑了。
于是乎,下载android版本的节奏大师apk文件,解压,搜索*.mp3,找到xinshoujiaoxue.mp3,再搜索xinshoujiaoxue*,除了mp3文件外又找到一个xinshoujiaoxue_4k_ez.imd文件。我猜这个文件就是我想要的乐谱了,4k=4 key,ez=easy?
打开文件一览全貌,乱码,看来不是text格式,看来有的分析了,再用16进制格式打开,得到下图:


乍一看还蛮有规律,很多0,再一看发现5E 40也常常出现:


在分析之前,我决定先玩一下新手教学,看看里面的动作都有些什么,这样分析起来也好有个参照。玩过之后发现很简单,我简单记下了这些动作:


我不知道节奏大师开发者把4key计数从0开始还是1开始,作为程序员,我先按0开始编号。新手教学很简单,8个点击,8个移动,两个直线,一个折线。好了,下面开始分析啦。先把那些16进制数重新排一下行,使得看起来比较舒服,按什么规律换行?5E 40。前面很多行都有5E 40,不妨把它直接删掉看剩下数字的规律:


横着不是很容易看,按列看就会有所发现,第一列基本逐一递减,第二列基本间隔4增加,第三列比较有规律,即数字周期性增长,第四列基本间隔2增加。好像是个等差数列啊,转成10进制,用excel画图看看:


在这张图里,我试玩时的那些动作完全体现不出来,只能看到程周期性递减,猜想可能是和时间相关的东西,类似时间轴吧。
继续看后面的数据,后面的数据不是以5E 40开头,所以刚刚没有替换成换行,看似也没什么规律:


只有手动换行了,通过一些规律找到周期数,即可知道每行列数,然后试着重新断行,得到如下结果:


看着还是比较有规律的。开始仔细研究,就是一直盯着它看,脑子里想想着刚刚玩过的新手试玩的规律,瞬间可以对上了!


激动!差不多对照上之后就开始分析每个byte或bit的语义了。有了对照,语义不难找出,最终我得出了如下结论:


红色区域表示执行的动作,0=touch,1=move,2=hold;白色区域的数值有点奇怪,不过我猜应该是表示时间戳的,搜了几个发现在之前5E 40开头的那堆数字里果然可以找到;蓝色区域表示从哪个key开始,即游戏中的哪一列开始touch、move或hold;如果动作是hold,那么最后的4 bytes,即黄色区域猜想应该是表示hold的时间吧,可以看到表示次折线动作的最后4行可以解读为:“当时间为10 A4时,从列2向右move一列,当时间同样为10 A4时,hold列3,hold时间为D0 07,当时间为E0 AB时,从列3向左move一列,当时间同样为E0 AB时,hold列2,hold时间为D0 07”,这样算一下E0 AB == 10 A4 + D0 07,是一条连续的折线,这验证了黄白区域表示时间的结论;如果动作是move,那么最后的4 bytes,即紫色区域应该表示move方向,对照游戏FF FF FF FF表示向左,01 00 00 00表示向右。等一下。全FF的补码应该是-1,那01 00 00 00应该表示+1?哦,或许是大小端的缘故,应该反着看就是+1的int格式了。怪不得文件开头那堆5E 40开头的行画出来的图是周期递减的,大小端转换一下,应该就变成了递增了吧。不急,我再当转换一下画一次。还没有画图,转成10进制的数字就吓了我一跳:


这就不用画图了,太规律了。时间间隔为500,最大值28000,应该单位是毫秒,即28秒。由此判断5E 40开头的为时间戳不错。
以上写的这些,像个流水账,不过的确是我按着自己的思维过程一步步记下来的。我也不知道分析这个有什么用,就是单纯地觉得很有意思。
还有4个数,即最后4行的行首的6 2 2 A还不知道是什么意思。如果大家有兴趣可以帮忙分析一下,我们可以一起讨论。
原创粉丝点击