铁血丹心

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

【小教程】R文件结构修改,含修改最大队友数的例子

  [复制链接]
发表于 2012-1-24 23:23 | 显示全部楼层 |阅读模式

马上注册,结交更多侠友!

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

x
本帖最后由 gtfish 于 2012-1-25 16:51 编辑


首先要感谢027大大在我还在苦逼的研究loadrecord的时候言简意赅的教会了我如何增加最大队友数,所以例子部分基本是转述027大大的
还要感谢S大和蓝大
例子外的其他部分是我的一些理解,不对之处,请各位指正

懒得看说明的朋友可以直接看例子,不过想要亲自试验恐怕要等到s大这几天公布源码


温馨提示:修改前记得保存R*.idx和grp,否则导致存档损坏本人概不负责,最好建个新档试验一下

1.什么是R文件
R文件是游戏的数据文件,存储的是队伍基本信息(base),人物信息(person),物品信息(thing),场景信息(Scene),武功信息(wugong),小宝商店信息(shop,这个基本已经不用了)

2.读取R文件时都用到哪些东西
2.1.在常数定义(即全局变量)中定义R文件idx,grp的位置
读取进度*会调用R*.idx和grp,新游戏会调用ranger.idx和grp
常数定义在苍炎SetGlobalConst函数,或者游泳的鱼jyconst.lua文件中可以找到
2.2.常数定义中定义R文件中上面各类信息的结构struct
2.3.R*.idx
这个文件是读取R*.grp的索引文件,里面用24个字节存储了6个数字(4字节一个)
分别表示:
人物数据起始位置,物品数据起始位置,场景数据起始位置,武功数据起始位置,商店数据起始位置,商店数据结束位置
2.4.R*.grp
这个文件是真正的数据,保存进度以后上面提到的各类信息就存在这里

3.游戏中R文件读取和存储的方式
读取进度时:
3.1.从idx文件中读取这6个数字
3.2.从这6个数字标示的位置处按照前面的struct读取数据,放入base,person等数据中
比如idx文件的第一个数字是344(16进制,10进制为836),是人物信息的起始地址,  2.2的结构里有这一句:CC.Person_S["姓名"] = {8, 2, 10}
这就表示R*.grp的344+8号位置开始的10个字节存放了人物的姓名,这个数据是字符型变量
存储进度时原理相同,就是把读取换成写入

4.例子:
试过的朋友都知道,这个代码会报错
for i = 1, 7 do
    JY.Base["队伍" .. i] = i
end
因为JY.Base["队伍7"]没有定义
知道了R文件读取的方式,我们就可以修改R文件的结构,以下就以修改最大队员数为7人为例说明
4.1.修改R文件的结构定义
首先把CC.TeamNum改成7
然后把
  for i = 1, CC.TeamNum do
    CC.Base_S["队伍" .. i] = {24 + 2 * (i - 1), 0, 2}
  end
  for i = 1, CC.MyThingNum do
    CC.Base_S["物品" .. i] = {36 + 4 * (i - 1), 0, 2}
    CC.Base_S["物品数量" .. i] = {36 + 4 * (i - 1) + 2, 0, 2}
  end
改成
  for i = 1, CC.TeamNum do
    CC.Base_S["队伍" .. i] = {24 + 2 * (i - 1), 0, 2}
  end
  for i = 1, CC.MyThingNum do
    CC.Base_S["物品" .. i] = {2+36 + 4 * (i - 1), 0, 2}
    CC.Base_S["物品数量" .. i] = {2+36 + 4 * (i - 1) + 2, 0, 2}
  end
这样改是因为多了一个"队伍7"占去了2个字节,后面的"物品i"就要全部后移2个字节
像这样只修改Base的结构会导致物品数据前两个字节也被当做物品id和数量,这样后面的数据会全部乱掉,因此还要修改idx和grp
4.2修改R*.idx
用二进制文件编辑器(我用的UltraEdit)打开R1.idx,以四个字节为一个数字,把所有数字加2
比如44 03 00 00 改成46 03 00 00,表示人物数据从346的位置开始读取,这里数据和正常16进制相反,高位在后面,常改游戏的朋友应该都不陌生
4.3修改R*.grp
既然要增加"队伍7"就要给他留个位置
同样用编辑器打开,找到第36 + 4 * (1 - 1)处,在前面插入2个字节,内容填00 00(无人物)
如果队伍只有主角一人就是将
FF FF 00 00 00 00 00 00 00 00 00 00 FF 51 (队伍1:主角,队伍2:空人物...队伍6:空人物,银两的物品代号)
改成FF FF 00 00 00 00 00 00 00 00 00 00 00 00 FF 51
这样就大功告成了
再执行
for i = 1, 7 do
    JY.Base["队伍" .. i] = i
end
就是上面图片的效果

PS:
还有个小问题要说明,物品菜单函数Menu_Thing有个参数用的是CC.TeamNum
local r = ShowMenu(menu, CC.TeamNum, 0, CC.MainSubMenuX, CC.MainSubMenuY, 0, 0, 1, 1, CC.DefaultFont, C_ORANGE, C_WHITE)
红色部分改成#menu,不然使用物品会报错,原因见一楼


PPS:对于有兴趣研究loadrecord函数(苍炎中存档函数是SBLDATAL),我说明一下几个可能不容易看懂的函数
大部分函数蓝大给的api函数说明中都有,比如:Byte.create,Byte.loadfile
  local meta_t = {__index = function(t, k)
    return GetDataFromStruct(JY.Data_Base, 0, CC.Base_S, k)
  end, __newindex = function(t, k, v)
    SetDataFromStruct(JY.Data_Base, 0, CC.Base_S, k, v)
  end}
  这里__index是定义索引操作,__newindex是定义新建索引操作(如果是__add就是定义加法+操作,这样说就明白了吧)
  
  setmetatable(JY.Base, meta_t)是把新定义的结构(貌似叫元表)赋给JY.Base,这样base就可以做索引操作和新建索引操作了
  
  for i,v in pairs(CC.Base_S) do  end这个是泛型for,可以取所有元素,不明白的同学自己查查去

评分

参与人数 1声望 +15 收起 理由
tsmdsyp + 15 好帖奖励

查看全部评分

【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-1-24 23:58 | 显示全部楼层
谢谢这么详细易懂的教程..

这个地方,是将menu换成#menu吗?为什么?


local r = ShowMenu(menu, CC.TeamNum, 0, CC.MainSubMenuX, CC.MainSubMenuY, 0, 0, 1, 1, CC.DefaultFont, C_ORANGE, C_WHITE)
改成#menu,不然使用物品会报错


点评

哦,原来是指菜单选项数目,谢谢指点!!  发表于 2012-1-25 00:13
CC.TeamNum换成#menu,因为menu是"全部物品","剧情物品"等6项,原来CC.TeamNum是6不会有问题,但是CC.TeamNum改成了7,而菜单没这么多项,就会报错  发表于 2012-1-25 00:03
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-1-24 23:59 | 显示全部楼层
有点意思哈

点评

不过感觉现在汇编对金庸diy作用不大了吧,用脚本语言方便的多~不过想破解新游戏这一步还是少不了啊  发表于 2012-1-25 17:03
wely大大好,看了您写的修改z.dat的教程,感觉那个时候才是高手云集啊,心向往之,现在金庸diy发展成这样果然是一代一代人努力的结果啊,真不敢想象一个人从头开始多难~~  发表于 2012-1-25 17:03
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-1-25 00:40 | 显示全部楼层
话说俺本来打算在源码版发布后写一个类似的教程的
以把物品栏扩充到300项举例,现在有了你这篇,我就不用写了


话说IDX这文件现在其实完全不需要了
直接把这六个索引值建一个表放在源码里,再改下存取档函数中的调用方式就行了
就用10进制的数字,改起来方便得多
不过这东西也不会经常去改的

点评

谢谢S大支持~~话说我也觉得idx文件有点多此一举,呵呵  发表于 2012-1-25 09:36
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-1-25 01:32 | 显示全部楼层
fish 的帖子真是高產+高質
謝謝您分享的硏究心得
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-1-25 02:31 | 显示全部楼层
好奇怪哦~

为什么空人物是 00 00,而主角号是 FF FF

0号应该是主角吧,FF FF是-1,也就是没人的意思……

点评

这样子加密,不是坑自己爹么~  发表于 2012-1-25 15:02
这是因为苍炎的数据都取了16位反码,FFFF实际是0000,这一点可以从物品数量上得到验证,FF FE表示物品数量为1  发表于 2012-1-25 09:35
好像苍炎的 R file 數據都取了 16 bits 的 1's complement  发表于 2012-1-25 07:02
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-1-25 03:56 | 显示全部楼层
牛人啊!这点内容够我几天消化了
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-1-25 12:12 | 显示全部楼层
果断收藏,回去研究下~
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-2-7 20:03 | 显示全部楼层
mark~~一下,方便学习~
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-2-8 14:49 | 显示全部楼层
FF 表示-1
00才表示0(主角)

你改的不是初始存档,才会显示为FF为0
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-2-12 12:43 | 显示全部楼层
改成了8个队友,显示上没有问题,但是战场上还是最多只出现6个,请问有一劳永逸的解决方法么,还是要改每场战斗的设置-_-
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2012-2-17 19:25 | 显示全部楼层
回复 二宫和也 的帖子

战斗前有个函数设定战场人物位置的,改一下就ok,我没看代码,但是估计里面循环的上限是6,所以只会上6个人,改一下应该就行了,当然不需要每场战斗都改
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-2-17 22:48 | 显示全部楼层
弱弱的问一下,战斗地图我方人物的初始站位怎么修改的?每个战场都只有6个人的位置。莫非每一场战斗的数据都得手动再修改一次?

点评

战斗前有个函数设定战场人物位置的,是warload还是啥来着记不得了,自己看一下源码吧  发表于 2012-2-17 23:58
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-2-18 13:59 | 显示全部楼层
回复 怪羊基德 的帖子

warload加载战斗地图,初始化战斗数据,从data目录下的war.sta文件读取战场人物信息,包括初始站位。可以用Upedit直接编辑。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-2-18 15:21 | 显示全部楼层
回复 南风一梦 的帖子

我知道这个呀。我是说存档文件里面我方初始坐标只能容纳6个人。如果队友多于6个,那么多出来的人放在什么坐标?
如果要重新扩充战斗文件的话,是不是每一场战斗都要手动添加第7个第8个乃至后面人物的坐标?
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-3-24 13:47 | 显示全部楼层
前面的都明白了,但下面的不懂,想請教一下?

在這部份   
4.3修改R*.grp
既然要增加"队伍7"就要给他留个位置
同样用编辑器打开,找到第36 + 4 * (1 - 1)处,在前面插入2个字节,内容填00 00(无人物)
如果队伍只有主角一人就是将
FF FF 00 00 00 00 00 00 00 00 00 00 FF 51 (队伍1:主角,队伍2:空人物...队伍6:空人物,银两的物品代号)
改成FF FF 00 00 00 00 00 00 00 00 00 00 00 00 FF 51
这样就大功告成了

就[ 找到第36 + 4 * (1 - 1)处] 這個不明白,我用查找亦找不到...這個是什麼意思呢?

怎實行呀?

【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-4-3 13:42 | 显示全部楼层
我来支持楼猪的。。。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-7-1 10:21 | 显示全部楼层
谢了,真在研究这个
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

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

GMT+8, 2024-5-16 03:11

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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