铁血丹心

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

[通用] kys复刻版的脚本介绍

[复制链接]
发表于 2009-12-3 14:57 | 显示全部楼层 |阅读模式
本帖最后由 weyl 于 2012-12-17 21:08 编辑

脚本的基本语法是lua,其中添加了很多函数用于在游戏中出现效果和操作数据。
在猪3中首次使用脚本编写了一些特技的效果,在下面将对脚本系统作一个介绍。

首先你必须了解lua的语法。当然在这个小应用中还不需要了解太多,lua在多数时候作为嵌入语言应用,在商业中文游戏里面使用lua编写剧情的有一个《汉之云》。

最好用一个支持lua语法加亮的文本编辑器,因为你没有办法有效地进行调试,大部分时间还是要在游戏中试验执行。PSPad或者Notepad++是不错的选择。
特别地,在某些kys的版本里面你可能看到在系统选单下面出现一个"test"选项,这就是试执行脚本的地方。当然这个只是我用来测试留下的“后门”,功能十分简陋。

除了lua自身,目前的脚本中还提供了数十个函数,基本上包含了常见指令的内容。一些特殊的指令如格式化字串,随机数之类,可以使用lua自身的函数。

附件为目前提供的函数介绍和猪3的特技脚本。当然猪3的脚本是加过密的,这里发布的是它们原始的样子,是纯粹的文本文件。

需要说明的是,在编写脚本时,lua本身的使用比这些函数的应用要重要得多,google可能是你最好的帮手。编写特技的话,猪3的例子也都是可以套用的。

ps:lua是区分大小写的,但是似乎可以在ExecScript这里稍作处理使其对大小写不敏感。例如在执行前用AnsiLowerCase(LowerCase处理中文会有错误)对Script字串进行处理。

[ 本帖最后由 weyl 于 2009-12-4 20:59 编辑 ]

本帖子中包含更多资源

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

x
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2009-12-3 14:57 | 显示全部楼层
脚本文件的基本结构和运行时机

kys复刻版的50指令中有一个50 60指令,用来运行脚本,源码部分如下:
  1.     60: //Call scripts.
  2.       begin
  3.         e2 := e_getvalue(0, e1, e2);
  4.         e3 := e_getvalue(1, e1, e3);
  5.         execscript(pchar('script\' + inttostr(e2) + '.lua'), pchar('f' + inttostr(e3)));
  6.       end;
复制代码
就是说运行script目录下面名为'e2'.lua文件中名为f'e3'的函数,'e2'和'e3'均替换为相应数字。如需要在其他时机执行脚本,可以在所需处添加代码,调用exescript函数。

以传说中的神技一阳指为例,说明脚本文件的结构。
function f13()
声明函数,如果某段代码没有在函数中,那么在执行本文件的时候总是会被执行
  -- 一阳指(减体力)
注释以2个减号开头
  l = {5, 10, 15, 20, 25, 30, 35, 40, 45, 50};
数组的初始化方式
  bnum1 = getbattlenumber();
函数调用后面须有括号,无论参数个数是多少,区分大小写。
目前提供的所有函数均为小写,当然这可能并不是好的习惯,关于函数的作用请参考说明

  rnum1 = getbattlepro(bnum1, 0);
  -- 自身
  bnum2 = selectoneaim(0, 0, 1);
  if bnum2 >= 0 then
    rnum2 = getbattlepro(bnum2, 0);    -- 对方
    v = l[getmagiclevel(rnum1, 160)];  -- 这里的1是武功代码,需修改
    curpp = getrolepro(rnum2, 21);
    curpp = curpp - v;
    if curpp < 0 then
      curpp = 0;
    end
   
    putrolepro(curpp, rnum2, 21);
    -- 计算值并改变
   
    putbattlepro(math.abs(v), bnum2, 9);
  end
注意if结构的写法,很简单
  x, y = getaimposition();
函数可以有两个或更多个返回值
  setaminationlayer(0, 0, 64, 64, 0);
  setaminationlayer(x, y, 1, 1, 1);
  playaction(bnum1, 1, 19);  -- 这里修改效果号
  playhurtvalue(4);

  
end

[ 本帖最后由 weyl 于 2009-12-3 16:09 编辑 ]
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2009-12-3 14:58 | 显示全部楼层
特殊事件解析

在某些版本中应该有我附加的1.lua文件,其中含有这个f3函数,你可以在test之后,用1和f3去执行它。
这个事件就是对键盘或鼠标控制类的反应,完全可以用来编制小游戏。当然如果对pascal和jedi-sdl熟的话还是推荐用编译到exe的方式。
function f3()
  talk(16, 1, "下面你可以在5秒鐘之內移動鼠標,將會即時顯示鼠標的位置。*如果想中間退出的話,按任意的鍵即可。");
注意这个talk函数,可以用来编写普通剧情。*表示强制换行
  t = gettime();
获取当前时间
  clearbutton();
清空键值的缓冲区
  while gettime() - t <= 5 do
          x, y = getmouseposition();
获取鼠标的位置
          clear();   
          showstring(100, 70, x..", "..y);
两个句点是连接字符串的算符
    if checkbutton() > 0 then
      pause();
      break;
    end;        
  end;
上面这个循环基本上就是小游戏所需的“死循环”,当然需要一个退出条件。

  clearbutton();
  talk(17, 5, "演示完畢,給錢。");
end
以下是生成菜单的示例,实际上在脚本中生成菜单比用源码或50指令方便很多。
function f1()
  showstring(100, 70, "要什么东西?");
  a = menu(3, 100, 100, 100, {"康倍特", "景气", "白兰"});
第一个参数是菜单项数,最后一个是字串数组,完全可以在之前把物品队友之类读进来。
这里的菜单项名称是随意写的

  getitem(a, 20);
end
下面是一个较复杂的例子,目的是读出背包中所有的物品供选择,让选中的物品翻倍。请注意getitemlist和getnameasstring两个函数的作用。
function f1()
  showstring(100, 70, "让哪个翻倍?");
  i=0;
  while i<200 do
    item, num = getitemlist(i);
    if num>0 then
      str[i+1]=getnameasstring(1,item);
lua无需事先定义变量,拿过来即可以用
注意lua的数组下标是从1开始
      
    else
      break;
    end
    i=i+1;
  end
  a = menu(i, 100, 100, 120, str);
  if a>=0 then
    item, num  = getitemlist(a);
    getitem(item, num);
  end
end

[ 本帖最后由 weyl 于 2009-12-3 16:43 编辑 ]
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2009-12-3 14:58 | 显示全部楼层
添加新函数的方法

有时可能觉得现有的函数不够用,需要添加新的函数。那么就需要自行修改kys_script.pas并重新编译。

函数的声明部分必须添加'cdecl'后缀,参数必须为'L: Plua_state'。例如获得物品的例子:

function GetItem(L: Plua_state): integer; cdecl;


在实现部分,注意对L的操作,L在这里相当于一个栈。

function GetItem(L: Plua_state): integer; cdecl;
var
  inum, amount: integer;
begin
  inum := floor(lua_tonumber(L, -2));//表示取出栈中第二位的变量,作为数值取得,floor是转为整型
  amount := floor(lua_tonumber(L, -1));//同上
  //在脚本中该函数有2个参数,在前面的参数在栈中的位置较深
  instruct_2(inum, amount);
  result := 0;//表示该函数的返回值的个数,如果有返回值,需要使用"lua_pushnumber(L, temp);  result := 1;"这样的形式

end;


这其中对于字串的操作比较复杂,可以参考GetNameAsString和Menu。

编写完实现部分之后,还需要将其加入脚本的关键字解析部分,即InitialScript中大量的类似

lua_register(Lua_script, 'getitem', GetItem);


的语句,其中第二个参数是脚本中的关键字,我这里面全都用的小写,当然这可能并不太好。

[ 本帖最后由 weyl 于 2009-12-3 16:36 编辑 ]

评分

参与人数 1声望 +14 收起 理由
黄顺坤 + 14 甚好,凶凶兄追加

查看全部评分

【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-12-3 15:00 | 显示全部楼层
鼓掌欢迎weyl发教程!

话说看看你际遇  全扣钱的

[发帖际遇]: jy02785317发现昆仑仙境,离开时落下悬崖,摔断双腿,医治用去银两24两。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-12-3 16:50 | 显示全部楼层
啊,看不懂啊看不懂
跪求KG的脚本解释

[发帖际遇]: 韦小宝得知黄顺坤擒获了冯锡范,大喜过望,奖励银两12两。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-12-3 23:53 | 显示全部楼层
脚本里的中文字符是不是还有什么限制啊
我导入
  1. T=
  2. {
  3. ...--略去一部分代码
  4. dao=
  5. {
  6. "到","道","導","倒","刀","稻","島","盜","悼","搗","忉","蹈","燾","氘","叨","纛",""
  7. },--我打算用这个结构来做拼音输入法,前面是拼音,后面括号里是汉字,但是""这个字一旦加进去就报错,去掉就没事。
  8. ...略去一部分代码
  9. }
复制代码
类似"禱"这样的,虽然不算很多,但也不少啊,真要一个个手动剔除,累死人啊
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2009-12-4 01:28 | 显示全部楼层
应该是string的方式不支持某些汉字,你可以试试将ExecScript这个子程中负责读入的字串改为widestring,文本的保存方式也改用Unicode。
string和widestring可能有从文件读入的方法。如果直接用比fileread要好。

[发帖际遇]: weyl救治何太冲五姑,被何太冲恩将仇报,千辛万苦逃出损失银两21两。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-12-4 03:51 | 显示全部楼层
请教一下weyl大,究竟lua的优势在哪里了~~我看script的源码,似乎就是一套对其他的子程封装的子程(?)

不是太明白它的价值何在

而且还要用lua语言,记得那会常记错,最后干脆就不动script了~
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-12-4 09:28 | 显示全部楼层
lua的好处
要是你新增了一个指令
可以用lua来调用
即使没有配套的sfe

[发帖际遇]: KG拾得李莫愁的冰魄银针,卖出获得银两10两。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-12-4 09:49 | 显示全部楼层
原帖由 weyl 于 2009-12-4 01:28 发表
应该是string的方式不支持某些汉字,你可以试试将ExecScript这个子程中负责读入的字串改为widestring,文本的保存方式也改用Unicode。
string和widestring可能有从文件读入的方法。如果直接用比fileread要好。

[发 ...

我发现,只要是高位为5C的汉字,lua就不认识
一开始怀疑我解释器可能不够好
刚才才游戏里试了下,凡是涉及到这种汉字的,都显示不正常(只认了半边字节)
比如一个常用字“誠”,我把它加到1.lua的f3里面,talk(16, 1, "下面你可以在5秒鐘之內移動鼠標,將會即時顯示鼠標的位置。*如果想中間退出的話,按任意的鍵即可。");
游戏里测试就说的是乱码

[发帖际遇]: jy02785317跑江湖卖艺,施展特技“胡说八道”,结果卖出无名草药若干,得款银两21。


------------------------------------------------------
5C是‘\’的ascii码
怀疑是lua把那看成了转义字符的开始了
我加了个\旧正常了
报错的代码
  1. a=""
  2. print(a)
复制代码
修改後通過的代碼
  1. a="誠"
  2. print(a)
复制代码
同樣的修改後,在游戲裡也正常了

[ 本帖最后由 jy02785317 于 2009-12-4 09:54 编辑 ]

评分

参与人数 1声望 +8 收起 理由
黄顺坤 + 8 加分

查看全部评分

【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2009-12-4 13:39 | 显示全部楼层
最初引入脚本的目的是方便编写剧情
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-12-4 17:06 | 显示全部楼层

回复 十当家 的帖子

原来如此,多谢指教

但如何用lua编写的指令与sfe的指令交互使用呢~也就是编在同一个事件之中

还是说用了lua就不能用sfe~~

再问
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2009-12-4 17:22 | 显示全部楼层
50 60指令,只能执行指定名字。
脚本中有ExecEvent可以执行事件。

[发帖际遇]: weyl四处宣传左子穆为救自己孩子不惜绑架他人孩子的卑鄙无耻行径,被左子穆追杀,丢失银两银两15两。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-12-4 17:38 | 显示全部楼层
哦~~

也就是反过来说,新建新的50指令也可以调用lua或者作等同于lua做到的事情不是?

[发帖际遇]: winson7891用胡萝卜、白萝卜、玉米粒、葱花等材料仿制侠客岛“腊八粥”,获利银两11。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2009-12-4 20:58 | 显示全部楼层
对,喜欢怎么做都可以。
不过新建指令可能需要考虑fishedit的解析,有指导才比较方便,涉及到改修改器。
新增lua关键字可以考虑使用明白浅显的英文单词,懂编程的学起来会很快。

[发帖际遇]: 与韦小宝赌骰子,韦小宝出老千,weyl失去银两20两。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-12-4 21:34 | 显示全部楼层
谢谢回答
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-12-5 02:47 | 显示全部楼层
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-12-5 07:07 | 显示全部楼层
饿, 问个问题
那个getmagiclevel是什么意思?
在那张表里看不到~

[发帖际遇]: killer_zingy卖下一个mod的制作人绝密采访稿,狂赚银两38。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-12-5 10:55 | 显示全部楼层
脚本和武功事件的思路与流程大同小异,只是书写方法简单明了得多。getmagiclevel明显是获取武功等级。
此外,动画英文咋说来着?

[发帖际遇]: 凶神恶煞在黑龙潭边拣到一个手帕,经验证是瑛姑绣的四张机手帕,转手卖得银两10。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-12-5 10:59 | 显示全部楼层

回复 20# 的帖子

amination~~~~~~~~~~~~~~~~~~~~~~~~~~~

[发帖际遇]: killer_zingy在丐帮树林捡到一只叫花鸡,转手卖出赚到银两22。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-12-6 09:43 | 显示全部楼层
setrolepro()和getrolepro()
这两函数,涉及到偏移时,参数应该是实际偏移的1/2
比如人物名,fish里偏移是8,调用这两函数时应该写4


问题是:这两函数对于字符串似乎无法读写啊,读写其他的如攻击防御之类的很正常,但是到了名字这里,就不正常了
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2009-12-6 16:58 | 显示全部楼层
1/2没错,必须按照字读取。
取得名称需要用getnameasstring。
写入字符…………只好新编一个了……
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-12-7 10:28 | 显示全部楼层
哈哈,拣到宝贝了,等有空要用来试试,正好还有F&Q,太好了
感谢weyl大大的介绍与解答和其他人的问题
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

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

GMT+8, 2024-5-19 07:49

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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