|
本帖最后由 jy02785317 于 2010-8-18 11:09 编辑
==============================================================================================
前言 ==============================================================================================
1,以下内容适用于游泳的鱼制作的金庸群侠传LUA复刻版,部分内容亦适用于金庸群侠传原版(DOS版)以及weyl制作的金庸群侠传passcal复刻版
2,以下所使用的修改工具为游泳的鱼制作的FishEdit_lua版,也有用到黄顺坤制作的sfe
3,以下内容侧重于制作mod,对于工具的使用不详加解释。如需进一步讲解,请参考其他文章或者直接联系工具的作者
4,修改时请注意多多备份,若按照以下内容,使您的作品出现了异常,我也无能为力
==============================================================================================
修改初步 ==============================================================================================
从本篇开始,正式进入lua版修改,以下内容将只适用于lua版
首先,简略介绍一下lua版
lua复刻版是通过C+lua来实现的,游戏目录下的 C程序jylua.exe负责绘图播放音乐接收按键等底层工作,而游戏控制权则交给jymain.lua来负责。- 游戏调用流程
- a. C程序jysdllua.exe 进行初始化工作。
- b. C程序加载lua文件script\jymain.lua。
- c. C程序运行lua文件中的jymain函数,控制权转交给lua。
- d. jymian函数加载其他的lua文件。按照游戏逻辑运行。
复制代码 所以,制作mod的大部分工作,只需要修改lua文件即可实现,不需要修改主程序。但如果对一些底层工作需要改动时,还是得去修改主程序。像在上一篇提到的绘图次序问题,就只能通过修改主程序实现(其实可以在lua中实现,早期的lua版绘制地图函数也是通过lua来实现的,但是由于性能原因,后来把这一功能放在c里实现的,所以如果不在乎性能,完全可以自己用lua来写绘制地图函数)
文件结构- .\ 根目录,包括游戏主程序jysdllua.exe,配置文件config.lua,错误日志debug.txt(记录lua部分),error.txt(记录c部分)
- .\data\ 资源文件以及存档等,目前的原版金庸群侠传lua复刻以及藏龙族日lua复刻,都是直接把原dos版的文件复制到data下,即此文件夹下文件结构和dos版一致,这也是我们之前使用sfe时选择dos的原因
- .\script\ 控制游戏逻辑的lua文件jymain.lua 游戏数据结构以及常量定义jyconst.lua mod的额外修改jymodily.lua
- .\script\oldevent 事件文件,通常是从kdef转化而来,如果自己重新制作,这部分忽悠一些改动,留到以后再详叙
- .\pic\ 图片
- .\sound\ 声音
复制代码修改简要流程
a. 用文本编辑器修改代码
b. 用luac5.1.exe编译代码。排除语法错误。
c. 运行JYsdlLua.exe,测试功能是否实现。
d. 如果出现程序直接退出,可以到主目录下查看debug.txt文件,找到出错的位置。然后再
看可能有什么问题。
==============================================================================================
修改R文件数据结构 ==============================================================================================
如果要制作新的mod,实现新的功能,修改存档数据,即修改R文件数据结构必不可少
打开jyconst.lua文件,找到- --定义记录文件R×结构。 lua不支持结构,无法直接从二进制文件中读取,因此需要这些定义,用table中不同的名字来仿真结构。
- CC.TeamNum=6; --队伍人数
- CC.MyThingNum=200 --主角物品数量
- CC.Kungfunum=10 --角色武功数量
- CC.Base_S={}; --保存基本数据的结构,以便以后存取
- CC.Base_S["乘船"]={0,0,2} -- 起始位置(从0开始),数据类型(0有符号 1无符号,2字符串),长度
- CC.Base_S["无用"]={2,0,2};
- CC.Base_S["人X"]={4,0,2};
- CC.Base_S["人Y"]={6,0,2};
- CC.Base_S["人X1"]={8,0,2};
- CC.Base_S["人Y1"]={10,0,2};
- CC.Base_S["人方向"]={12,0,2};
- CC.Base_S["船X"]={14,0,2};
- CC.Base_S["船Y"]={16,0,2};
- CC.Base_S["船X1"]={18,0,2};
- CC.Base_S["船Y1"]={20,0,2};
- CC.Base_S["船方向"]={22,0,2};
- 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
- CC.PersonSize=182; --每个人物数据占用字节
- CC.Person_S={}; --保存人物数据的结构,以便以后存取
- CC.Person_S["代号"]={0,0,2}
- CC.Person_S["头像代号"]={2,0,2}
- CC.Person_S["生命增长"]={4,0,2}
- CC.Person_S["无用"]={6,0,2}
- CC.Person_S["姓名"]={8,2,10}
- CC.Person_S["外号"]={18,2,10}
- CC.Person_S["性别"]={28,0,2}
- CC.Person_S["等级"]={30,0,2}
- CC.Person_S["经验"]={32,1,2}
- CC.Person_S["生命"]={34,0,2}
- CC.Person_S["生命最大值"]={36,0,2}
- CC.Person_S["受伤程度"]={38,0,2}
- CC.Person_S["中毒程度"]={40,0,2}
- CC.Person_S["体力"]={42,0,2}
- CC.Person_S["物品修炼点数"]={44,0,2}
- CC.Person_S["武器"]={46,0,2}
- CC.Person_S["防具"]={48,0,2}
- for i=1,5 do
- CC.Person_S["出招动画帧数" .. i]={50+2*(i-1),0,2};
- CC.Person_S["出招动画延迟" .. i]={60+2*(i-1),0,2};
- CC.Person_S["武功音效延迟" .. i]={70+2*(i-1),0,2};
- end
- CC.Person_S["内力性质"]={80,0,2}
- CC.Person_S["内力"]={82,0,2}
- CC.Person_S["内力最大值"]={84,0,2}
- CC.Person_S["攻击力"]={86,0,2}
- CC.Person_S["轻功"]={88,0,2}
- CC.Person_S["防御力"]={90,0,2}
- CC.Person_S["医疗能力"]={92,0,2}
- CC.Person_S["用毒能力"]={94,0,2}
- CC.Person_S["解毒能力"]={96,0,2}
- CC.Person_S["抗毒能力"]={98,0,2}
- CC.Person_S["拳掌功夫"]={100,0,2}
- CC.Person_S["御剑能力"]={102,0,2}
- CC.Person_S["耍刀技巧"]={104,0,2}
- CC.Person_S["特殊兵器"]={106,0,2}
- CC.Person_S["暗器技巧"]={108,0,2}
- CC.Person_S["武学常识"]={110,0,2}
- CC.Person_S["品德"]={112,0,2}
- CC.Person_S["攻击带毒"]={114,0,2}
- CC.Person_S["左右互搏"]={116,0,2}
- CC.Person_S["声望"]={118,0,2}
- CC.Person_S["资质"]={120,0,2}
- CC.Person_S["修炼物品"]={122,0,2}
- CC.Person_S["修炼点数"]={124,0,2}
- for i=1,10 do
- CC.Person_S["武功" .. i]={126+2*(i-1),0,2};
- CC.Person_S["武功等级" .. i]={146+2*(i-1),0,2};
- end
- for i=1,4 do
- CC.Person_S["携带物品" .. i]={166+2*(i-1),0,2};
- CC.Person_S["携带物品数量" .. i]={174+2*(i-1),0,2};
- end
- CC.ThingSize=190; --每个人物数据占用字节
- CC.Thing_S={};
- CC.Thing_S["代号"]={0,0,2}
- CC.Thing_S["名称"]={2,2,20}
- CC.Thing_S["名称2"]={22,2,20}
- CC.Thing_S["物品说明"]={42,2,30}
- CC.Thing_S["练出武功"]={72,0,2}
- CC.Thing_S["暗器动画编号"]={74,0,2}
- CC.Thing_S["使用人"]={76,0,2}
- CC.Thing_S["装备类型"]={78,0,2}
- CC.Thing_S["显示物品说明"]={80,0,2}
- CC.Thing_S["类型"]={82,0,2}
- CC.Thing_S["未知5"]={84,0,2}
- CC.Thing_S["未知6"]={86,0,2}
- CC.Thing_S["未知7"]={88,0,2}
- CC.Thing_S["加生命"]={90,0,2}
- CC.Thing_S["加生命最大值"]={92,0,2}
- CC.Thing_S["加中毒解毒"]={94,0,2}
- CC.Thing_S["加体力"]={96,0,2}
- CC.Thing_S["改变内力性质"]={98,0,2}
- CC.Thing_S["加内力"]={100,0,2}
- CC.Thing_S["加内力最大值"]={102,0,2}
- CC.Thing_S["加攻击力"]={104,0,2}
- CC.Thing_S["加轻功"]={106,0,2}
- CC.Thing_S["加防御力"]={108,0,2}
- CC.Thing_S["加医疗能力"]={110,0,2}
- CC.Thing_S["加用毒能力"]={112,0,2}
- CC.Thing_S["加解毒能力"]={114,0,2}
- CC.Thing_S["加抗毒能力"]={116,0,2}
- CC.Thing_S["加拳掌功夫"]={118,0,2}
- CC.Thing_S["加御剑能力"]={120,0,2}
- CC.Thing_S["加耍刀技巧"]={122,0,2}
- CC.Thing_S["加特殊兵器"]={124,0,2}
- CC.Thing_S["加暗器技巧"]={126,0,2}
- CC.Thing_S["加武学常识"]={128,0,2}
- CC.Thing_S["加品德"]={130,0,2}
- CC.Thing_S["加攻击次数"]={132,0,2}
- CC.Thing_S["加攻击带毒"]={134,0,2}
- CC.Thing_S["仅修炼人物"]={136,0,2}
- CC.Thing_S["需内力性质"]={138,0,2}
- CC.Thing_S["需内力"]={140,0,2}
- CC.Thing_S["需攻击力"]={142,0,2}
- CC.Thing_S["需轻功"]={144,0,2}
- CC.Thing_S["需用毒能力"]={146,0,2}
- CC.Thing_S["需医疗能力"]={148,0,2}
- CC.Thing_S["需解毒能力"]={150,0,2}
- CC.Thing_S["需拳掌功夫"]={152,0,2}
- CC.Thing_S["需御剑能力"]={154,0,2}
- CC.Thing_S["需耍刀技巧"]={156,0,2}
- CC.Thing_S["需特殊兵器"]={158,0,2}
- CC.Thing_S["需暗器技巧"]={160,0,2}
- CC.Thing_S["需资质"]={162,0,2}
- CC.Thing_S["需经验"]={164,0,2}
- CC.Thing_S["练出物品需经验"]={166,0,2}
- CC.Thing_S["需材料"]={168,0,2}
- for i=1,5 do
- CC.Thing_S["练出物品" .. i]={170+2*(i-1),0,2};
- CC.Thing_S["需要物品数量" .. i]={180+2*(i-1),0,2};
- end
- CC.SceneSize=52; --每个场景数据占用字节
- CC.Scene_S={};
- CC.Scene_S["代号"]={0,0,2}
- CC.Scene_S["名称"]={2,2,10}
- CC.Scene_S["出门音乐"]={12,0,2}
- CC.Scene_S["进门音乐"]={14,0,2}
- CC.Scene_S["跳转场景"]={16,0,2}
- CC.Scene_S["进入条件"]={18,0,2}
- CC.Scene_S["外景入口X1"]={20,0,2}
- CC.Scene_S["外景入口Y1"]={22,0,2}
- CC.Scene_S["外景入口X2"]={24,0,2}
- CC.Scene_S["外景入口Y2"]={26,0,2}
- CC.Scene_S["入口X"]={28,0,2}
- CC.Scene_S["入口Y"]={30,0,2}
- CC.Scene_S["出口X1"]={32,0,2}
- CC.Scene_S["出口X2"]={34,0,2}
- CC.Scene_S["出口X3"]={36,0,2}
- CC.Scene_S["出口Y1"]={38,0,2}
- CC.Scene_S["出口Y2"]={40,0,2}
- CC.Scene_S["出口Y3"]={42,0,2}
- CC.Scene_S["跳转口X1"]={44,0,2}
- CC.Scene_S["跳转口Y1"]={46,0,2}
- CC.Scene_S["跳转口X2"]={48,0,2}
- CC.Scene_S["跳转口Y2"]={50,0,2}
- CC.WugongSize=136; --每个武功数据占用字节
- CC.Wugong_S={};
- CC.Wugong_S["代号"]={0,0,2}
- CC.Wugong_S["名称"]={2,2,10}
- CC.Wugong_S["未知1"]={12,0,2}
- CC.Wugong_S["未知2"]={14,0,2}
- CC.Wugong_S["未知3"]={16,0,2}
- CC.Wugong_S["未知4"]={18,0,2}
- CC.Wugong_S["未知5"]={20,0,2}
- CC.Wugong_S["出招音效"]={22,0,2}
- CC.Wugong_S["武功类型"]={24,0,2}
- CC.Wugong_S["武功动画&音效"]={26,0,2}
- CC.Wugong_S["伤害类型"]={28,0,2}
- CC.Wugong_S["攻击范围"]={30,0,2}
- CC.Wugong_S["消耗内力点数"]={32,0,2}
- CC.Wugong_S["敌人中毒点数"]={34,0,2}
- for i=1,10 do
- CC.Wugong_S["攻击力" .. i]={36+2*(i-1),0,2};
- CC.Wugong_S["移动范围" .. i]={56+2*(i-1),0,2};
- CC.Wugong_S["杀伤范围" .. i]={76+2*(i-1),0,2};
- CC.Wugong_S["加内力" .. i]={96+2*(i-1),0,2};
- CC.Wugong_S["杀内力" .. i]={116+2*(i-1),0,2};
- end
- CC.ShopSize=30; --每个小宝商店数据占用字节
- CC.Shop_S={};
- for i=1,5 do
- CC.Shop_S["物品" .. i]={0+2*(i-1),0,2};
- CC.Shop_S["物品数量" .. i]={10+2*(i-1),0,2};
- CC.Shop_S["物品价格" .. i]={20+2*(i-1),0,2};
- end
复制代码 注意里面的名字,这个比较重要,既是显示的名字,也是引用时的名字
比如说想要用到主角的等级,那就就是JY.Person[0]["等级"]
JY是游戏中用于储存R文件数据的表,是最常用的表,另外还有表CC用于储存常量,WAR储存战场数据,以后详述
JY.Person是JY表中储存人物数据的表,类似的还有JY.Thing,JY.Wugong,JY.Shop等
[0]这个0是人物编号,主角一般都是编号0
['等级'],根据你的需要,可以随意修改等级为其他属性,但必须是之前在上述代码中定义过了的量
修改时,建议把一些原有的量改成你需要的量,不建议新加。
新加属性不是不可以,只是有些麻烦,因为新加的话,R文件结构就有了变化,对应的还必须修改fishedit.ini不然修改器无法修改
一般小的改动就把一些无用的量改成你需要的量,大的改动则随意吧,麻烦是肯定了的
如果你把一些现存的有用的量改了,游戏运行一般会出错
比如说把['攻击力']改了,那么在攻击时,伤害函数会调用['攻击力'],可是现在已经没有这个量了,那么肯定会报错。所以一般需要挑无用的量。
继续看jyconst.lua文件,注意到- CC.Level=30; ---人物等级和每等级经验
- CC.Exp={ 50, 150, 300 ,500 , 750 ,
- 1050, 1400, 1800 ,2250 , 2750 ,
- 3850, 5050, 6350 ,7750 , 9250 ,
- 10850, 12550, 14350 ,16750 , 18250 ,
- 21400, 24700, 28150 ,31750 , 35500 ,
- 39400, 43450, 47650 ,52000 , 60000 };
复制代码 修改这部分数据,可以改动人物最大等级及每级所需经验- CC.MMapBoat={}; --主地图船可以进入的贴图
- local tmpBoat={ {0x166,0x16a},{0x176,0x17c},{0x1ca,0x1d0},{0x1fa,0x262},{0x3f8,0x3fe},};
- for i,v in ipairs(tmpBoat) do --把这些数据变换成数组,其中有值就是可以进入
- for j=v[1],v[2],2 do
- CC.MMapBoat[j]=1;
- end
- end
复制代码 定义大地图上,属于水的贴图一般不需要修改,除非你添加了新的属于水面的贴图- CC.SceneWater={}; --场景人不能进入的贴图
- local tmpWater={ {0x166,0x16a},{0x176,0x17c},{0x1ca,0x1d0},{0x1fa,0x262},{0x332,0x338},
- {0x346,0x346},{0x3a6,0x3a8},{0x3f8,0x3fe},{0x52c,0x544},};
- for i,v in ipairs(tmpWater) do --把这些数据变换成数组,其中空项就是可以进入的贴图
- for j=v[1],v[2],2 do
- CC.SceneWater[j]=1;
- end
- end
复制代码 场景地图中的水面贴图,一般也不用改- CC.WarWater={}; --战斗地图人不能进入的贴图
- local tmpWater={ {0x166,0x16a},{0x176,0x17c},{0x1ca,0x1d0},{0x1fa,0x262},{0x332,0x338},
- {0x346,0x346},{0x3a6,0x3a8},{0x3f8,0x3fe},{0x52c,0x544},};
- for i,v in ipairs(tmpWater) do --把这些数据变换成数组,其中空项就是可以进入的贴图
- for j=v[1],v[2],2 do
- CC.WarWater[j]=1;
- end
- end
复制代码 同上啊~~~~~~事实上这三部分数据都是差不多的,因为smp,wmp,mmp在2500号之前基本都一致,只是可能有的少一部分贴图而已- --离队人员列表: {人员id,离队调用函数} ----如果有新的离队人员加入,直接在这里增加
- CC.PersonExit={{1,950},{2,952},{9,954},{16,956},{17,958},
- {25,960},{28,962},{29,964},{35,966},{36,968},
- {37,970},{38,972},{44,974},{45,976},{47,978},
- {48,980},{49,982},{51,984},{53,986},{54,988},
- {58,990},{59,992},{61,994},{63,996},{76,998}, }
- --所有可加入人员离队需要清除的D*事件,清除后这些人就找不到了。得到武林帖指令使用
- CC.AllPersonExit={ {0,0},{49,2},{4,1},{44,0},{44,1},{37,5},{30,0},{59,0},{40,3},{56,1},{1,7},{1,8},{1,10},
- {40,7},{40,8},{77,0},{54,0},{62,3},{62,4},{60,2},{60,15},{52,1},{61,0},{61,8},{78,0},
- {18,0},{18,1},{69,0},{69,1},{45,0},{52,2},{42,6},{42,7},{8,8},{7,6},{80,1}, };
复制代码 很简单,自己看注释- CC.Shemale={ [78]=1,[93]=1} --需要自宫的书的id
复制代码 把这个加上来,主要是说一件事:藏龙族日lua版里,这里写错了.....写成了葵花和玄冥的id.....导致避邪不用自宫 练玄冥反而需要
我贴出来的部分已经修改正确了
[code]
CC.ExtraOffense={{106,57,100}, --武功武器配合增加攻击力, 依次为:武器物品id,武功id,攻击力增加
{107,49,50},
{108,49,50},
{110,54,80},
{115,63,50},
{116,67,70},
{119,68,100},}
CC.NewPersonName="徐小侠"; --新游戏的数据
CC.NewGameSceneID=70; --场景ID
CC.NewGameSceneX=19; --场景坐标
CC.NewGameSceneY=20;
CC.NewGameEvent=691; --新游戏场景执行事件。如果没有,则看新游戏坐标后面有没有事件。
CC.NewPersonPic=3445; --开始主角pic
CC.PersonAttribMax={}; --人物属性最大值
CC.PersonAttribMax["经验"]=60000;
CC.PersonAttribMax["物品修炼点数"]=60000;
CC.PersonAttribMax["修炼点数"]=60000;
CC.PersonAttribMax["生命最大值"]=999;
CC.PersonAttribMax["受伤程度"]=100;
CC.PersonAttribMax["中毒程度"]=100;
CC.PersonAttribMax["内力最大值"]=999;
CC.PersonAttribMax["体力"]=100;
CC.PersonAttribMax["攻击力"]=100;
CC.PersonAttribMax["防御力"]=100;
CC.PersonAttribMax["轻功"]=100;
CC.PersonAttribMax["医疗能力"]=100;
CC.PersonAttribMax["用毒能力"]=100;
CC.PersonAttribMax["解毒能力"]=100;
CC.PersonAttribMax["抗毒能力"]=100;
CC.PersonAttribMax["拳掌功夫"]=100;
CC.PersonAttribMax["御剑能力"]=100;
CC.PersonAttribMax["耍刀技巧"]=100;
CC.PersonAttribMax["特殊兵器"]=100;
CC.PersonAttribMax["暗器技巧"]=100;
CC.PersonAttribMax["武学常识"]=100;
CC.PersonAttribMax["品德"]=100;
CC.PersonAttribMax["资质"]=100;
CC.PersonAttribMax["攻击带毒"]=100;
[code]
新游戏属性以及属性最大值,不过通常而言,这部分数据也可以放在jymodily.lua里,如果jymodily里有相同的定义,则jyconst里的无效
---未完待续
[ 本帖最后由 jy02785317 于 2010-2-27 10:09 编辑 ] |
|