|
本帖最后由 jy02785317 于 2010-8-18 11:10 编辑
==============================================================================================
前言 ==============================================================================================
1,以下内容适用于游泳的鱼制作的金庸群侠传LUA复刻版,部分内容亦适用于金庸群侠传原版(DOS版)以及weyl制作的金庸群侠传passcal复刻版
2,以下所使用的修改工具为游泳的鱼制作的FishEdit_lua版,也有用到黄顺坤制作的sfe
3,以下内容侧重于制作mod,对于工具的使用不详加解释。如需进一步讲解,请参考其他文章或者直接联系工具的作者
4,修改时请注意多多备份,若按照以下内容,使您的作品出现了异常,我也无能为力
==============================================================================================
概叙 ==============================================================================================
隔了这么久,才开始写5....
感觉越到后面越不好写,前面的基本有一定规律,什么导入贴图啊,什么做场景图啊,不管你的mod有什么不同,基本都是差不多的
而做起事件来,确很灵活,我也不确定能不能讲清楚
--------------------------------------
首先必须明白lua版和passcal复刻版事件上的区别
dos版,以及passcal复刻版,都是使用d文件,kdef文件,talk文件,这三个文件来做事件
d文件,决定地图中的哪个坐标能触发事件
kdef保存事件的具体内容
ktalk保存人物对话(kdef中的对话指令不直接保存对话,而是将对话一条一条的保存在talk里,事件中只是用对话的编号)
而在lua版里,采用脚本来做事件,故而kdef这个文件,不再需要了
通常,从论坛下载的lua版,在script\oldevent这个文件夹下,就是各个事件了
其文件名格式是oldevent_XXX.lua,XXX为对应的事件编号。
游戏在内场景下,对移动到某坐标,或者对某坐标按空格时,会调用一个函数访问d文件,获取是否能触发事件,如果可以则返回事件编号,假设编号是197,则调用script\oldevent下的oldevent_197.lua这个文件
下面是苍龙逐日里197号事件的脚本内容- --function oldevent_197()
- instruct_1(390,91,0); -- 1(1):[???]说: 有需要我帮忙的地方吗?
- instruct_0(); -- 0(0)::空语句(清屏)
- if instruct_9(0,29) ==true then -- 9(9):是否要求加入?否则跳转到:Label0
- if instruct_20(20,0) ==false then -- 20(14):队伍是否满?是则跳转到:Label1
- instruct_10(91); -- 10(A):加入人物[温青青]
- instruct_14(); -- 14(E):场景变黑
- instruct_3(-2,-2,0,0,0,0,0,0,0,0,-2,-2,-2); -- 3(3):修改事件定义:当前场景:当前场景事件编号
- instruct_0(); -- 0(0)::空语句(清屏)
- instruct_13(); -- 13(D):重新显示场景
- do return; end
- end --:Label1
- instruct_1(391,91,0); -- 1(1):[???]说: 你的队伍已满,我无法加入。
- instruct_0(); -- 0(0)::空语句(清屏)
- do return; end
- end --:Label0
- --end
复制代码 --表示是注释符
如果说没有右边的那些注释,我想这段代码将极其难以看懂,的确如此
都是一些instruct_??的东西,不明所以,从这个角度来看,修改起来确实很麻烦
按理来说,使用脚本编写事件,编写起来容易,读起来也简单,
可是oldevent\下脚本可读性极低
这是因为里面的函数都是instruct的形式(后面的数字实际为指令号),如果说按照其功能换个名,我相信就很容易读了
究其原因,是因为游泳的鱼是自己制作了一个脚本,用于把原来的kdef转化成oldevent\下的脚本,即是说这些个脚本是程序转化来的,而不是人写的,另外其命名,也是根据原先在kdef里的指令号来的,比如说1号指令,就是instruct_(),如此,自然难以理解
如果说,修改的程度很低,可以继续沿用这些函数无妨
但是,如果是从新制作,我的建议是:重新写函数,或者给原先的instruct_??函数起个别名,比如说- cls=instruct_0
- say=instruct_1
复制代码 这样,就可以用cls替代instruct_0(作用为清屏) 用say替代instruct_1(作用为对话),这样就好读多了
当然,你也可以换一种方法,先在passcal版里编辑好事件,然后用游泳的鱼提供的工具自动转化为脚本
对于鱼的kdef专为脚本,有一个地方我很不解,觉得做得不好
转化后,脚本里的对话指令,里面保存的是对话的编号,而不是对话文本
对话文本依然保存在talk文件里,导致修改很麻烦,一方面修改事件要改脚本,另一方面该对话偏偏又要在talk里改
所以,instruct_1这个函数大家最好不要用,可以用talk或者talkEx函数,具体的自己可以在jymain.lua中查看
综合以上,即鱼是将kdef转化为脚本,然后游戏中执行脚本
换个思路,可以考虑游戏中即时解析kdef文件,如此可以像其他版本一样制作事件。这方面的工作,我正在做,当然进度极其缓慢就是了。
另外需要说明的就是50指令,愿kdef里用到的50指令,是无法被鱼提供的工具转化的
我自己也考虑过此方面问题,的确很麻烦,特别是几个神一样的指令~~~~~~~~
所以,lua版还是用脚本制作事件比较好
==============================================================================================
oldevent和newevent ==============================================================================================
--未完待续,明天补(也不一定)
[ 本帖最后由 jy02785317 于 2010-3-10 22:12 编辑 ] |
|