铁血丹心

 找回密码
 我要成为铁血侠客
搜索
查看: 3182|回复: 4

[lua复刻] lua数据结构研究日志

[复制链接]
发表于 2013-3-13 02:25 | 显示全部楼层 |阅读模式
本帖最后由 btxdex 于 2013-3-13 02:26 编辑

翻了一下教程好像没找到数据结构的。搜索到了这个http://www.txdx.net/forum.php?mod=viewthread&tid=475204&highlight=%CA%FD%BE%DD%BD%E1%B9%B9
开始自己研究。使用的版本是游泳的鱼0.66原版。首先根据帖子从修改器下手,这里用的upedit。打开upedit.ini,找到[R_Modify],把TypeNumber改成7,再来到小宝商店一串数据底下。
添加如下:
  1.     TypeName6 =神兵利器
  2.     TypedataItem6 =4

  3.     data(6,0) =1 1 2 0 0 -1 武器代号 武器代号,起始偏移0
  4.     data(6,1) =1 1 10 1 1 -1 名称 武器名称,起始偏移2
  5.     data(6,2) =1 1 2 0 0 -1 攻击力 攻击力,起始偏移12
  6.     data(6,3) =1 1 2 0 0 -1 速度 速度,起始偏移14
复制代码
   ; 数组个数,数组结构成员个数,字节数,是否字串,是否名称,引用数据类型,名字,说明
    ; 间隔使用空格,一定要注意字符串中间不能有空格,而且空格只能有一个,等号后面不能有空格。
这是upedit上的说明,但是他里面原有的设定都没有遵守“等号后面不能有空格”。
保存。

不知道upedit有多智能,我还是先修改一下ranger.idx。用Ultraedit打开ranger.idx。。。打开后完全没经验不知道该干什么。想到我当年用游戏修改器修改数值,我还是用计算器先转换成10进制看看再说。根据win神的指示“[size=11.818181991577148px] idx每个数值分别是每个类别的结束偏移值”,我对比了一下第一个值836和我在upedit.ini里面把data(0,i)加起来的834差不多(哪里加错了?)。算了这都不重要,在最后一个值的十进制数上加16(data(6,i)的数据长度)再换成16进制(直接+1不就完了。。),最后在Ultraedit写上"52 BE 01",保存。

UE自动给我备份了Ranger.idx.bak,怪不得每次看到一堆这个文件。

ranger.grp不知道是不是要手动写一点数据上去修改器才能读,算了,先打开upedit,读取r数据。

一看,已经可以识别了,随便填一点数据,现在开始修改lua源码部分。
打开jyconst.lua,来到CC.ShopScene下面,添加:
  1.    CC.WeaponSize=16; --武器占用字节
  2.    CC.Weapon_S={};
  3.    CC.Weapon_S["武器代号"]={0,0,2}
  4.    CC.Weapon_S["名称"]={2,2,10}
  5.         CC.Weapon_S["攻击力"]={12,0,2}
  6.         CC.Weapon_S["速度"]={14,0,2}
复制代码
再添加一个
  1. CC.DataTypeNum=7;
复制代码
来记录一共有几个数据类型,等下要用到。
打开jymain.lua,在SetGlobal()中添加:
  1. JY.Data_Weapon=nil;
复制代码
马上就要用到。
再来到function LoadRecord(id),读取存档函数。
把idx部分修改如下,代码已经注释:
  1.     --读取R*.idx文件
  2.     local data=Byte.create(CC.DataTypeNum*4); --data保存的是idx数据
  3.     Byte.loadfile(data,CC.R_IDXFilename[id],0,CC.DataTypeNum*4); --从idx读取
  4.         --参数:数组,文件,起始,长度

  5.         local idx={}; --建立idx数组
  6.         idx[0]=0;
  7.         for i =1,CC.DataTypeNum do --数组下标从1开始
  8.             idx[i]=Byte.get32(data,4*(i-1)); --idx[i]对应data中的每一个整数(4byte),data下标从0开始
  9.         end
复制代码
小宝商店之后添加:
  1.     JY.WeaponNum=math.floor((idx[7]-idx[6])/CC.WeaponSize);   --武器

  2.         JY.Data_Weapon=Byte.create(CC.WeaponSize*JY.WeaponNum);
  3.         Byte.loadfile(JY.Data_Weapon,CC.R_GRPFilename[id],idx[6],CC.WeaponSize*JY.WeaponNum);

  4.         for i=0,JY.WeaponNum-1 do
  5.                 JY.Weapon[i]={};
  6.                 local meta_t={
  7.                         __index=function(t,k)
  8.                                 return GetDataFromStruct(JY.Data_Weapon,i*CC.WeaponSize,CC.Weapon_S,k);
  9.                         end,

  10.                         __newindex=function(t,k,v)
  11.                                 SetDataFromStruct(JY.Data_Weapon,i*CC.WeaponSize,CC.Weapon_S,k,v);
  12.                         end
  13.                 }
  14.         setmetatable(JY.Weapon[i],meta_t);
  15.         end
复制代码
完全抄袭JY.Person的读取方法,改了一下变量而已,具体细节没搞懂就不重要了。
下面的保存进度函数中,同样方法处理idx数组,之后在最后面加一行:
  1. Byte.savefile(JY.Data_Weapon,CC.R_GRPFilename[id],idx[6],CC.WeaponSize*JY.WeaponNum);
复制代码

源码修改完毕。

随便找个什么方法进入游戏确认数据可以读取。

最后同时要修改其他的r1,r2,r3等文件不然会出错。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要成为铁血侠客

x

评分

参与人数 1声望 +5 收起 理由
真正的强强 + 5 很不错啊~希望能够早日看到你的作品~

查看全部评分

【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-3-13 08:56 | 显示全部楼层
最后一个data的偏移地址,加上它本身所占的长度,就得那个结果了。

很好,数据都很准确。

顺便提一句,其实r1,r2这些真的是多余的。

点评

原来的程序不改是会出错,是程序读取的问题。但是其实真的没有什么用 - - 我的设置是可以99个存档  发表于 2013-3-13 10:10
r1.idx什么的不改读取会出错..  发表于 2013-3-13 09:48
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-3-13 09:19 | 显示全部楼层
不用sfe不信服,甚好终于有研究技术的了

点评

我这里还有珍藏版的SFE0.72.20  发表于 2013-3-15 11:20
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-3-13 23:05 | 显示全部楼层
想学技术无门。游戏基本都加了密。无从下手。源代码干嘛用没人教。

点评

如果想学的话,应该从没有加密的版本入手。至于修改和编译代码,需要一定编程的基础,但是也不用特别深,要从其他地方找些入门教程。  发表于 2013-3-14 00:12
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2013-3-16 02:30 | 显示全部楼层
本帖最后由 btxdex 于 2013-3-16 02:32 编辑

继续,写了全新的结构和setting.ini之后发现在lua里面还要写很麻烦,修改也麻烦,于是就自己用C++(控制台水平)写了一个读取r数据修改器设置转换lua代码。然后还是有一些东西需要自己处理:1.有无符
2.CC.MyThingNum,CC.MyTeamNum,这种其他部分需要的常量
3.原版ini里面的5个“出招动画帧数”都叫一个名字。任何相同名字的数据,lua无法区别。
然后还有自己代码的缺陷,读取多个数组成员时中间不能有空行。

  1. #include <iostream>
  2. #include <string>
  3. #include <fstream>
  4. #include <vector>
  5. #include <cctype>
  6. #include <sstream>

  7. using namespace std;

  8. #define printSize 1

  9. ifstream fin("setting.txt");
  10. ofstream fout("lua.txt");

  11. struct line{
  12.         int a,b,c,d,e,f;
  13.         string g;
  14. };

  15. int getInt(const string &a,int &idx){ //returns the first int after idx (idx,len-1]
  16.         int n=0;
  17.         int sign=1;
  18.         int firstDig=0;
  19.         for (int i=idx+1;i<a.size();i++){
  20.                 idx=i;
  21.                 if (!n&&a[i]=='-'){
  22.                         sign=-1;
  23.                         continue;
  24.                 }
  25.                 if (isdigit(a[i])){
  26.                         n=n*10+(a[i]-'0');
  27.                         firstDig=1;
  28.                 }
  29.                 else
  30.                         if (firstDig)
  31.                                 break;
  32.         }
  33.         return n*sign;
  34. }
  35. string getString(const string &a,int &idx){
  36.         int strSize=0;
  37.         for (int i=idx+1;i<a.size();i++){
  38.                 if (a[i]==' ')
  39.                         break;
  40.                 strSize++;
  41.         }
  42.         return a.substr(idx+1,strSize);
  43. }
  44. void readArgs(line &l,const string &tmp,int idx){
  45.         l.a=getInt(tmp,idx);
  46.         l.b=getInt(tmp,idx);l.c=getInt(tmp,idx);l.d=getInt(tmp,idx);
  47.         l.e=getInt(tmp,idx);l.f=getInt(tmp,idx);l.g=getString(tmp,idx);
  48. }
  49. int isData(string a){
  50.         stringstream ss;
  51.         ss<<a;
  52.         string f;
  53.         ss>>f;
  54.         string ts=f.substr(0,4);
  55.         if (ts!="data"&&ts!="Data")
  56.                 return 0;
  57.         return 1;
  58. }

  59. int main(){
  60.         string tmp;
  61.         int typeNumber=-1;
  62.         while(getline(fin,tmp)){
  63.                 if (tmp[0]==';')
  64.                         continue;
  65.                 if (typeNumber==-1&&tmp.find("TypeNumber")!=string::npos){
  66.                         int idx = tmp.find('=');
  67.                         typeNumber=getInt(tmp,idx);
  68.                         //cout<<typeNumber;
  69.                 }
  70.                 else
  71.                         continue;
  72.                
  73.                 for (int i=0;i<typeNumber;i++){
  74.                         string varName;
  75.                         int getVarName=0;
  76.                         int curIdx=0;
  77.                         int curByte=0;
  78.                         int dataItem=-1;
  79.                         while(getline(fin,tmp)&&(dataItem==-1||curIdx<dataItem)){
  80.                                 if (tmp.size()==0)
  81.                                         continue;
  82.                                 if (!getVarName&&tmp.find("TypeName")!=string::npos){
  83.                                         int idx = tmp.find('=');
  84.                                         cout<<"请输入 "<<tmp.substr(idx+1)<<" 的变量名"<<endl;
  85.                                         cin>>varName;
  86.                                         varName+="_S";
  87.                                         getVarName=1;
  88.                                         fout<<varName<<"={};"<<endl;
  89.                                         continue;
  90.                                 }
  91.                                 if (dataItem==-1&&(tmp.find("TypeDataItem")!=string::npos||tmp.find("TypedataItem")!=string::npos)){
  92.                                         int idx = tmp.find('=');
  93.                                         dataItem=getInt(tmp,idx);
  94.                                         //cout<<"dataItem "<<dataItem<<endl;
  95.                                         continue;
  96.                                 }
  97.                                 if (!isData(tmp))
  98.                                         continue;
  99.                                 curIdx++;
  100.                                 int idx = tmp.find('=');
  101.                                 /*
  102.                                 int arrayLen,memberNum,byteSize,isString;
  103.                                 int tmpInt1,tmpInt2;
  104.                                 string para;
  105.                                 */
  106.                                 vector<line> vl;
  107.                                 line l;
  108.                                 readArgs(l,tmp,idx);
  109.                                 if (l.a>1){ //假设数组个数为1的数据都没有成员
  110.                                         vl.push_back(l);
  111.                                         int sumOfByte=l.c;
  112.                                         for (int j=1;j<l.b;j++){ //读取成员数据
  113.                                                 //假设之间没有空行等
  114.                                                 getline(fin,tmp);
  115.                                                 line ll;
  116.                                                 int idx = tmp.find('=');
  117.                                                 readArgs(ll,tmp,idx);
  118.                                                 vl.push_back(ll);
  119.                                                 sumOfByte+=ll.c;
  120.                                                 curIdx++;
  121.                                         }
  122.                                         /*
  123.                                            for i=1,CC.MyThingNum do
  124.                                                         CC.Base_S["物品" .. i]={36+4*(i-1),0,2};
  125.                                                         CC.Base_S["物品数量" .. i]={36+4*(i-1)+2,0,2};
  126.                                                 end
  127.                                         */
  128.                                         fout<<"for i=1,"<<l.a<<" do"<<endl;
  129.                                         int cbyte=0;
  130.                                         for (int j=0;j<vl.size();j++){
  131.                                                 if (vl[j].d)
  132.                                                         vl[j].d=2;
  133.                                                 fout<<'\t'<<varName<<"[""<<vl[j].g<<"" .. i]={"<<curByte<<'+'<<sumOfByte<<"*(i-1)+"
  134.                                                 <<cbyte<<','<<vl[j].d<<','<<vl[j].c<<"};"<<endl;
  135.                                                 cbyte+=vl[j].c;
  136.                                         }
  137.                                         fout<<"end"<<endl;
  138.                                         curByte+=sumOfByte*l.a;
  139.                                 }
  140.                                 else{
复制代码



【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

小黑屋|手机版|铁血丹心

GMT+8, 2024-5-3 05:51

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表