|
本帖最后由 神崎亚里亚 于 2012-12-14 13:41 编辑
通过.xsa文件修改,可以改变mm在不同情况下的动作,以及后续动作.
一周前就想改xsa了,今天下决心开始干.
文件结构大概是知道了,来源于这张图.
经过几个小时的努力(学习iostream,试探地址),成功的用c++读取了xsa文件. 现在能做到的是读取每个动作的start frame, end frame, speed 以及ifrepeat. 还没有找到next frame所在的位置..
下表是从.xsa文件里读出来的.因为太长了我就列了前几行.做过xa文件修改的朋友应该很熟悉吧.这和xa文件里的数据是一样的.
No. | speed | start | end | 1 | 1.5 | 10 | 20 | 2 | 1.2 | 30 | 70 | 3 | 1.2 | 80 | 120 | 4 | 1.5 | 1250 | 1290 | 5 | 1 | 740 | 760 | 6 | 2 | 760 | 780 | 7 | 1.2 | 780 | 800 | 8 | 2 | 800 | 820 | 9 | 1 | 880 | 900 | 10 | 1.7 | 900 | 920 | 11 | 0.8 | 880 | 900 | 12 | 1.2 | 900 | 920 | 13 | 1.7 | 130 | 150 | 14 | 1.6 | 710 | 730 | 15 | 2 | 1640 | 1660 | 16 | 2 | 1660 | 1680 | 17 | 2.2 | 1700 | 1720 | 101 | 0.5 | 7700 | 7710 | 102 | 1.5 | 7750 | 7770 | 103 | 1 | 7770 | 7790 | 104 | 1.5 | 7790 | 7810 |
按说在xsa文件里修改这些值就可以改变游戏里的动作了.但是我刚试了一下,修改了走路和跑步的动作,但是没用.
然后 我把4个xsa文件都删了,mm该怎么走还是怎么走...这可让我纳闷了..难道我这个2.2ogg版本不需要读取xsa文件?
于是我查了论坛里的腰碎补丁,也是改xsa文件的.我用A型腰碎补丁替换了4个xsa文件,但是mm依然故我!拒绝拥抱的时候啥变化也没有....
我再度怀疑我这个版本是不是不用读xsa文件....
谁能告诉我这是为什么???
工作尚未完成. 还没有找到nextframe的地址. 也没有能通过xsa改变mm的动作.
哪位大大有兴趣,做个修改器吧..我不会.
附上读写文件源代码:
//读写ai3 xsa文件. 1.0版. 作者:神崎亚里亚 Dec.13.2012
#include <iostream>
#include <fstream>
using namespace std;
void main()
{
fstream pp("ax01_01_01.xsa",ios::binary|ios::in|ios::out);
struct Clip {
char nff[64];
float speed;
float unknown1;
float start;
float end;
};
char unknownB[28];
cout<<sizeof(Clip)<<endl;;
Clip rr;
int count=0;
char a;
int suojin=11;
// cout<<"please enter the suojin number:";
// cin>>suojin;
pp.read(reinterpret_cast<char *>(&a),suojin);
int inta;
int intb;
float next;
fwrite( pp, 509, 100.0, 480.0, 730.0); //把509号动作的速度改成100,始末帧改成480和730.
while(pp ) //开始读文件,输出每个clip的始末帧和速度
{
pp.read(reinterpret_cast<char *>(&rr),sizeof(Clip));
pp.read(reinterpret_cast<char *>(unknownB),28);
if(rr.speed>0)
cout<<count<<" "<<rr.speed<<" "<<rr.start<<" "<<rr.end<<" "<<endl;
count++;
}
pp.close();
}
//把关键帧写入文件
void writefile( fstream &file, int serial_num, float speed, float start, float end)
{
float a;
file.seekp( 7+ serial_num * 108, ios::beg );
file.seekp( 68, ios::cur);
streamsize size =4;
a = speed;
file.write( reinterpret_cast<char *>(&a), size);
file.seekp( 4, ios::cur); //start
a = start;
file.write( reinterpret_cast<char *>(&a),size);
a = end;
file.write( reinterpret_cast<char *>(&a), size);
cout<<"**!"<<endl;
file.seekp(0,ios::beg);
}
|
|