[脚本教程之十六]如何编写Function函数的脚本

[十六]如何编写FUNCTION函数的脚本
终于光荣出狱了(没有了PL的护士MM的眷顾,多少有些失落)!开始我们的下面的教程吧,接下来的教程应该是这样的顺序“函数脚本”、“菜单脚本”、“其他脚本如模板、房屋等”、“特殊变量介绍”、“脚本编写技巧”等等。
我出院后的第一个新闻就是听说伟大的pmouse结婚并且暂时辞职去度蜜月去了,哎呀,好难过而且好痛恨的说,因为从他身上我学过和积累了好多好多知识,子曰:三人行,必有我师焉,诚哉斯言!他可不能离开我们,否则那可是UO界一大悲哀和损失,更何况他那个蓝蓝MM我还没有来得及认识。。。。
OK,不废话罗嗦了,开始我们的这一课吧:
函数(FUNCTION)这个如果你学过编程语言的话,应该不难理解,记得我学Delphi的时候,关于函数和过程的说明是这样的:过程是没有返回值的例程,而函数是可以返回值的例程,当然Sphere的函数没有那么复杂,但原理大概差不多。
举个简单的例子,你在UO中设置一个热键:
F1
say An Ex Por
say open my bank
say guards
这样一个热键按下去,你会连续说出这三句话,而F1可以代表你一次操作就可以完成这个过程,而F1就可以理解成这个过程的名字。
函数就是这样一些过程语句的组合,只不过能够在结束后返回一个特定值,假如你在UO中输入一个”.where”这个命令,一定会在头上出现你的所在位置的信息,这个where我们称之为命令,实际上,我们可以通过定义一个函数来实现它的功能,而这个函数名字就叫where。where这类的命令函数在sphere内核中就已经定义过。
合理的使用函数可以让你的脚本可读性变得非常好,最重要的是可以做到有效节省避免代码重复造成资源浪费。我们可以通过调用一个函数的名字,从而达到轻松完成一个需要多语句才可以实现的功能。sphere认为[FUNCTION 函数名]这个语句是一个函数的头部,也就是定义的开始,直到下一个有效定义标记结束,sphere认为这段之间是一个函数的定义和内容。
看一个例子代码:
[Function makeCutCloth] //定义函数名为makecutcloth的函数
src.newitem 01766 //添加一个代码为01766的物品
SRC.ACT.P=<SRC.P> //该物品的P值(位置)和src(源)的位置相同
IF (<ARGN>>0) //如果输入的值大于0
SRC.ACT.AMOUNT=<ARGN> //该物品的数量等于argn值
ENDIF //结束IF判断
src.act.bounce //物品弹起
SRC.ACT.CONT=<SRC.UID> //设置该物品的容器为源的UID
这样我们调用这个函数可以有这样两种方法:
1、脚本中调用
src.makecutcloth 200
2、画面命令行调用
makecutcloth 200
得到的效果是一样的,即添加200个ID为01766的这个物品。
下面我们作一个付钱的函数,做过脚本的人都知道,当从玩家包里面收钱的时候,经常不能收取超过65536的golds,如果要实现这个功能,往往需要写好多句脚本,我们可以作这样一个函数,只要输入一个函数名字paygold xxx(xxx为数量),就可以自动从玩家包里面或者银行里面支付指定数目的金钱。

[FUNCTION paygold] // FUNCTION函数头部定义,名字为paygold
IF !(<args>) //如果只输入paygold,后面不跟数量
return 1 //结束函数返回1,什么都不作
ENDIF //结束IF判断

var.enough=0 //定义一个变量enough,如果没有足够的钱该值为0
var.totalgold=<SRC.FINDLAYER.21.rescount i_gold> + <SRC.FINDLAYER.29.rescount i_gold>

//定义一个变量totalgold,该值是玩家的包内和银行里面的钱的总和

IF (<eval <args>> > <var.totalgold>) //如果函数后面输入的值超过了这个变量值

ELSE //否则,代表总钱数够
var.enough=1 //设置enough变量值为1
IF (<eval <args>> <= <SRC.FINDLAYER.29.rescount i_gold>)
//如果该值小于等于银行里面的钱的总数
goldtopack <args> //调用函数goldtopack,详见下面的该函数的定义
ELSE
goldtopackall //否则调用函数goldtopackall
ENDIF //结束IF判断
payamount <args> //调用函数payamount函数

ENDIF //结束IF判断

[FUNCTION goldtopackall]
//定义函数名字为goldtopackall的函数,这个函数的功能是把银行里面的钱移动到背包中
IF (<SRC.FINDLAYER.29.findid.i_gold.uid>) //如果发现银行中有钱

SRC.FINDLAYER.29.findid.i_gold.cont=<SRC.FINDLAYER.21.uid> //就移动到包中
goldtopackall //调用函数goldtopackall

ENDIF // 结束IF判断

[FUNCTION goldtopack] //定义函数goldtopack
var.counter=<eval <args>> // 定义变量counter,代表将付的钱值
var.found=(<var.counter> – <SRC.FINDLAYER.29.findid.i_gold.amount>)
//定义变量found,该变量值为要付款的数量减去银行里面的每堆钱的数量
IF (<var.found> > 0) //如果变量found大于0,代表可以付款

SRC.FINDLAYER.29.findid.i_gold.cont=<SRC.FINDLAYER.21.uid> //移动钱从bank到背包中
goldtopack <var.found> //判断下一堆钱

ELSE //否则,变量found小于等于0

var.left=(0 – <var.found>) //定义变量left

IF (<var.left>) //如果left为1
SRC.FINDLAYER.29.findid.i_gold.amount <var.left> //设置left值,即数量
ELSE //否则left非1
SRC.FINDLAYER.29.findid.i_gold.remove //删除钱
ENDIF //结束IF判断

SRC.newitem i_gold //创建一个gold
SRC.act.amount <args> //数量等于需要的数量
SRC.act.cont=<SRC.FINDLAYER.21.uid>

ENDIF

[FUNCTION payamount] //定义函数名为payamount的函数

var.counter=<eval <args>> //定义变量counter等于输入的函数参数

IF (<var.counter> > 65000) // 如果counter的值超过65000
SRC.consume 65000 i_gold //收取65000个gold
var.counter=(<var.counter> – 65000) //减去65000
payamount <var.counter> //继续
ELSE
SRC.consume <args> i_gold //收取需要的数量的gold
ENDIF //结束IF判断

调用这个函数的时候,就可以用这样的方法:

ON=@UserDClick //双击触发
SRC.paygold 7000000 //调用函数paygold 700万golds
IF (<var.enough>) //如果enough值为1,代表已经付清款
SRC.NEWITEM=i_deed_evil_compound //添加一个恶魔城堡的契约
SRC.act.bounce //弹起放到包内
ELSE
SRC.SYSMESSAGE You do not have enough money for that. //否则提示钱不够
ENDIF //结束IF判断

怎么样?函数的脚本是不是很有趣啊?你也来编写一个函数试试看吧!

它会让你的程序和脚本非常简介有效方便。函数的定义可以放到任何一个非特定脚本文件中,建议你建立一个新的文件名字,比如叫作sphere_custom_functions.scp,里面放一些你自己编写的函数脚本,这样你就可以在任何一个脚本中调用和使用这些函数了。别忘了在文件最后要加上[EOF]文件结束标志。。。

留言

还没有留言,来坐个沙发吧。

留个言

留个言