找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 8689|回复: 5

[游戏] 金水修改简易教程之综述篇

[复制链接]

107

主题

2972

回帖

2万

积分

VIP名士

积分
21587
声望
19498 声
银两
268320 两
回帖
2972
精华
24
阅读权限
180
注册时间
2007-5-29
最后登录
2024-8-11

侠士

发表于 2014-3-10 13:19 | 显示全部楼层 |阅读模式
金庸水浒传(以下简称金水)又称猪三,是小小猪团队的第三个正式作品。我们的制作主要是基于其演示版之上的修改。目前代码主要由weyl管理,即传说中的bt大神,ka(黄顺坤)也在其中做了不少贡献,包括提供修改器等等,有困难可以向他们求教。以下提到的各种资源,群共享里一般都有,可以去下载。
需要的工具主要有这些:
1、Lazarus。用于编译pascal代码。
2、Notepad++。一个免费的代码编辑工具,可以用来编辑lua代码。当然也可用其他工具来代替,如ultraedit,MadEdit。
3、sfe0.72.22。ka制作的具有可视界面的最新版修改器,用来修改各种存档数据。
4、sfe2。ka制作的最新版sfe修改器,但不具有UI,只能命令行操作,主要用来数据的压缩和解压。
5、其他各种图片处理工具,如photoshop、Xnview等等。


金水的代码分为两个部分,一是采用pascal编写的核心引擎,二是采用lua编写的小脚本。其中pascal程序编译生成exe运行,lua则不需要,只有在游戏中触发时才进行调用,所以可以开着游戏随时修改。


pacal代码一般可采用lazarus编译,主要有以下几个部分:
kys_type:定义的全局变量
kys_engine:一些最底层的函数,如读取音频,绘图,显示文字等等,这一部分一般不用改动
kys_main:初始化及选单、行走等主要功能
kys_event:原来的instruct系列指令在这一部分得到了重写,大多数常用功能都是在这里实现的
kys_battle:战斗相关函数
kys_draw:各种不同功能的读图绘图函数
kys_script:为lua脚本提供的各种接口函数,通过堆栈在pascal和lua之间传递数据。主要是将kys_event里的各种指令在这里注册为lua函数,方便lua调用


lua方面:
..\kys\script\oldevent\文件夹下0~1085的程序为原版苍龙的事件程序
主要有五种调用方式:
1、用修改器修改事件层,将对应事件序号改为0~1085之间的某一值,则剧情中触发该事件即为调用对应序号的oldevent程序。
2、用ModifyEvent在其他lua程序中可以随时进行修改,可随时改动事件层参数,后面再详细讲。
3、在pascal代码中执行CallEvent(序号)。此即为1和2调用lua脚本的函数。
4、在pascal代码用ExecScript(路径,函数名)调用对应路径的lua脚本,这是比CallEvent更底层的函数。
5、在其他lua程序中用dofile(路径)调用对应路径的lua脚本。
..\kys\script\1.lua是各种测试函数,可以在游戏选单的“离开-test”中调用,输入脚本序号和函数序号。


lua写代码的详细教程可参见:http://www.txdx.net/thread-517145-1-1.html
跟这个教程基本是差不多的,只不过金水重写了很多函数,命名上也规范了些,但是进行了重载,所以是向前兼容的。也就是说,比如添加物品的命令,你可以像这个教程中提到的用老版的“instruct_32”命令,也可以用规范命名后的“additem”命令。这些函数可以在kys_scrip里查看,群里也有个对应的表格介绍。


数据类型:
金水最重要的数据有三个,分别是Rdata,Ddata和Sdata,这些数据都写在存档里,分别为save文件夹中的R*.grp,D*.grp,S*.grp。其中*为存档序号。
Ranger.grp,ALLDEF.grp,ALLSIN.grp为这三个数据对应的初始存档数据。Ranger.idx是个简单的二进制文件,记录R文件中各数据段的长度。
Rdata,Ddata和Sdata在pascal中采用LoadR和SaveR两个函数载入和存档。可以采用ka的sfe修改器进行修改。


Rdata:
Rdata通过LoadR读入后不再是一个整体,而是记录成
  1.   
  2. InShip, Useless1, Mx, My, Sx, Sy, MFace, ShipX, ShipY, ShipX1, ShipY1, ShipFace: smallint;  
  3. TeamList: array[0..5] of smallint;   
  4. RItemList: array of TItemList;  
  5. Rrole: array[-1..1000] of TRole;  
  6. Ritem: array[-1..1000] of TItem;  
  7. Rscence: array[-1..1000] of TScence;  
  8. Rmagic: array[-1..1000] of TMagic;  
  9. RShop: array[-1..20] of TShop;
复制代码
总共分为六个部分
1、基本数据:包括InShip, Useless1, Mx, My, Sx, Sy, MFace, ShipX, ShipY, ShipX1, ShipY1, ShipFace,TeamList,RItemList。都是些主角相关的全局信息,坐标持有物品队伍等。
2、人物:Rrole。游戏中所有NPC的各项属性,在lua中通过GetRolePro和PutRolePro进行读写。需要注意的是,这里所谓的NPC都是可以实际进行战斗的,有着各方面的属性,而游戏中所见到大街上的各种NPC,实际上只是个场景贴图而已,并不是所有人物都要做成这种拥有全面属性的战斗NPC。
3、物品:Ritem。通过GetItemPro和PutItemPro读写。
4、场景:Rscence。主要包括场景名称序号,和各种出入口,跳转口等等。GetScencePro和PutScencePro读写。
5、武功:Rmagic。通过GetMagicPro和PutMagicPro读写。
6、小宝商店:RShop。这部分数据较少,其实本不该单独列一项。这是原版中实现小宝商店每次随机售卖物品的功能,记录生成的随机表。值得一提的是,由于这部分在数据的末端,所以我们要想添加更多全局变量的话,可以扩大这一部分的容量,并重新规定向其中写入的全局数据的格式。
这些数据可以通过对比群共享中的r.xls获取其具体功能及位置。


Ddata:
读入后只记录成Ddata这一个变量,用于保存事件相关参数。
是个三维广义矩阵。第一维是场景id,第二维是事件id,第三维是参数序号(共有11个),所以它是按照从场景到场景子事件,再到事件参数的索引顺序来储存事件的。
这三维的取值范围分别为0~400, 0~199, 0~10
其中参数序号分为:
(0)是否能通过,0可以通过,1被拦住走不过
(1)不明白,都是写0
(2)第一个事件编号,空格触发,不想触发直接写0
(3)第二个事件编号,使用物品触发
(4)第三个事件编号,走过时自动触发
(5)开始贴图编号,-2表示贴图不变,0表示清除贴图
(6)结束贴图编号,-2表示贴图不变,0表示清除贴图
(7)临时贴图编号,-2表示贴图不变,0表示清除贴图
(8)动画延迟,-2表示不变
(9)横坐标X,-2表示不变,当场景位置为0时,此XY参数生效
(10)纵坐标Y,-2表示不变
ModifyEvent为修改Data的整合函数,有两个模式:
1、当输入变量个数大于等于13时,即为50指令中最经典的instruct_3函数。前两个参数分别为Ddata的前两维,即场景id,事件id,而第3~13个参数即为前面提到的11个参数。
2、当输入变量个数为4时,即为以前的SetD函数,固定修改Ddata中的某一项数值。ModifyEvent(x,y,z,m),即为将Ddata[x,y,z]位置储存的数据赋值为m。第一项为0时,即为当前场景,第二项为0时,即为当前事件。
其中,instruct_3函数的说明详见http://www.txdx.net/thread-517039-1-1.html
SetD函数的说明详见http://www.txdx.net/thread-518105-1-1.html




Sdata:
读入后只记录成Sdata这一个变量,用来保存各场景的分层数据:
这是一个4维数据,第一维同样为场景id(0~400)
第二维为场景层(0~5),包括0-地面, 1-建筑, 2-物品, 3-事件, 4-建筑高度, 5-物品高度
第三第四维分别为子场景中该事件的X坐标和Y坐标(0~63)。从程序来看,或者应是Y坐标在前,X坐标在后?好像和Ddata中的参数顺序不太一样。
instruct_3中也涉及到对S数据的修改,当贴图发生变化时,会在该坐标处重新载入贴图。贴图的序号是smap中标号的两倍。


在pascal中,最主要的一些事情就是对内存中的这三个数据的操作,如添加物品的指令,就是对Rdata中的RItemList进行修改,增删或改变事件,就是修改Ddata,改变场景贴图及读写各种场景信息,则是修改Sdata。

1544

主题

4万

回帖

11万

积分

程序

积分
110294
声望
93911 声
银两
3500916 两
回帖
42646
精华
9
阅读权限
150
注册时间
2009-6-14
最后登录
2022-10-18
发表于 2014-3-10 17:46 | 显示全部楼层
围观一下,不明觉厉。
羽生江湖广播剧社 梁迷的广播剧社
金枝托冷沁香寒,华苞欲绽慕朝颜。丹心意向何处系,随风绾处自天边。

回复

使用道具 举报

9

主题

42

回帖

1685

积分

声名鹊起

积分
1685
声望
1634 声
银两
18118 两
回帖
42
精华
0
阅读权限
40
注册时间
2007-1-23
最后登录
2020-2-28
发表于 2014-3-10 19:52 | 显示全部楼层
支持有泪大神
梁羽生家园,梁迷网络的家http://www.yushengbbs.net
回复

使用道具 举报

3

主题

327

回帖

4665

积分

一派掌门

积分
4665
声望
3977 声
银两
20543 两
回帖
327
精华
0
阅读权限
100
注册时间
2010-9-24
最后登录
2024-5-9
发表于 2014-3-11 20:28 | 显示全部楼层
有泪辛苦……这是要招工么?在精神上支持你们。。
梁羽生家园,梁迷网络的家http://www.yushengbbs.net
回复

使用道具 举报

0

主题

1

回帖

159

积分

师出名门

积分
159
声望
158 声
银两
3204 两
回帖
1
精华
0
阅读权限
25
注册时间
2010-3-22
最后登录
2018-11-22
发表于 2014-3-19 23:39 | 显示全部楼层
shipx1,shipx2,shipface实际上并未使用,其中一个被用作存档是否在小场景中的标记,需注意
梁羽生家园,梁迷网络的家http://www.yushengbbs.net
回复

使用道具 举报

164

主题

4917

回帖

1万

积分

一派掌门

积分
15652
声望
11611 声
银两
96247 两
回帖
4917
精华
5
阅读权限
100
注册时间
2008-11-30
最后登录
2024-3-17

四叶草

发表于 2014-3-20 15:04 | 显示全部楼层
围观一下,是要弄梁版的?
梁羽生家园,梁迷网络的家http://www.yushengbbs.net
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|家园基金|梁羽生家园 ( 鄂ICP备16023429号-1 )

GMT+8, 2024-11-24 12:50 , Processed in 0.056642 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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