|
发一个让刚刚接触脚本制作的朋友急需的东西!
脚本一般是源码形式发布的文本文件,无需编译或仅编译为中间代码(象java),执行时由一个解释引擎来解释执行。一般可用来快速的做一些简单工具,当然复杂的也是可以的,或是应用程序的不通模块之间的连接纽带,这些模块可以由不同的语言来实现C,C++,Java,Delphi,或是脚本。在linux环境下由很多脚本,相当部分都移植到windows中来了,常见的有perl,php,python,ruby,java也可以算是脚本,不过在企业应用中得到了强化。 为什么在外辅中没有支持C类似的高级程序语言来作为脚本语言?
因为大多数人没有学过程序语言,甚至不懂程序语言是什么,所以我们使用了自制的中文命令作为外辅的脚本语言。
脚本语言是如何在外辅中得到支持的?
开发小组已经事先编写了一套脚本语言支持环境(脚本语言解释器),只要在外辅中,大家所写脚本语言就能够被脚本支持所识别或排斥。
脚本在外辅中的运行过程是怎样的?
在脚本中,用户所编写的脚本被分成若干行,每一行构成一个句子,句子中可以使判断语句、赋值语句、或者是任意一个可以被识别的命令,该句子被导入解释器后,根据该语句的结构分解,由解释器转换为程序语言,再执行相应的操作或者输出结果。
梦工厂外辅的脚本是有流程顺序的,构成流程主要通过判断语句和跳转语句。
判断语句
如果()
那么()
以上是判断语句的格式。“如果()”括号里的是判断条件,“那么()”括号里的是条件成立时所需要表达的内容。
判断条件通常是由常量或者变量组成。
变量是由用户自由制定的一个名字,它指向某一个数据或者数值。常量则是事先在程序中已经内嵌所支持的变量。
例子1:
如果(武器=骨玉权杖)
那么(输出(骨玉权杖))
我们首先分析“如果()”语句,解释器导入这条语句时,首先会分解出语句的命令格式,分离后得到“武器”,“=”,“骨玉权杖”,根据解释,判断该条件是否成立,成立则执行下一条“那么()”语句,否则跳过后面的那么去执行。假设上面这个条件是成立的,那当然得执行后面的“那么()”,最后结果就是在外辅左边的文本框显示出一行文字“骨玉权杖”。注意:如果上面的判断条件用“<”,“>”,解释器则报错,因为“武器”与“骨玉权杖”不应该有数值型的比较。
例子2:
如果(背包,超级金创药<30)
那么(输出(买药))
以上的如果语句被解释分离成“背包”,“超级金创药”,“<”,“30”,因为这个判断条件是判断背包内的超级金创药数量是否小于30个,所以在类似的数值型判断里可以用到 等于 =,不等于 <>,小于 <,大于 >,小于或等于 <=,大于或等于 >=,如果背包内金创药确实小于30个,那将会在左边的文本框输出“买药”的一行文字。
上一课我们讲到了如果编写一个判断语句,以及判断语句如何被解释。接下来我们需要了解的是控制脚本流程的另一重要语句:跳转语句、执行语句。
通常,我们的脚本是从上而下,从左到右的被导入到脚本解释器中运行。
例如:
输出(1)
输出(2)
输出(3)
这三行语句的结果将是在左边的文本框分别显示“1”,“2”,“3”,共三行文本。我们如何去改变这命令导入的先后顺序呢?能不能改变呢?答案当然是YES!
有人可能会告诉我改变三行语句的先后顺序,不是就改变了命令被导入的顺序吗?当然,这确实是一种方法。不过在众多未知情况下,我们如何了解哪一行应该先执行?哪一行又应该后执行?唯一的方法只有,通过判断,事先枚举出所有可能发生的条件,根据条件再执行相应的操作。
通过上一节我们学习,我们已经能够很轻松的编写出一个判断语句。于此同时,我们已经能够通过一个判断语句输出一个相应的结果。那么我们如何根据判断的条件成立区执行一个相应的操作?
以上说过,脚本语言实际上是一行行的命令,并且是从上到下的被执行。在计算机程序语言中,通常可以用类似BASIC的“GOTO”语句实现从某一行跳转到另一行的跨度式执行。然而在我们外辅的脚本中也有相应的命令,那就是“跳转()”,或者“执行()”。
例子1:
如果(武器=骨玉权杖)
那么(跳转(修武器))
假设该判断的条件已经成立,当然会运行“那么()”里面的语句。“跳转(修武器)”是一个独立的语句。之所以会出现在“那么()”语句里,是为了让判断语句成立时作出一个反应。它被导入解释器后,形成一个独立的命令“跳转()”,顾名思义,“跳转”就是跳跃到某一行,某一行是值的哪一行?“修武器”则是正解。(因为脚本解释器的强大功能,我们已经取消了类似BASIC的行号标记。)
我们把某一行或者某几行通过标记放入一个独立的句子中,这就叫做子句。子句不会被解释器执行,必须通过一个外部的命令来导入到解释器中。子句以“<子句名>”开始,以“</子句名>”结束,请大家注意,结束时多了一个斜杠。子句名是有用户自行定义的,可以是任何合法的字符串。
例子2:
<修武器>
输出(修武器)
</修武器>
例子2是一个完整的子句定义,当然子句中可以不包含任何命令,也可以包含N个命令。视情况而定,可以任意出现在脚本的任意位置,但必须是连续的,所谓的连续就是指从“<修武器>”到“</修武器>”中间的所有命令都会被看作一个整体被导入到解释器,头尾定义缺一不可,否则解释器报错。
从前面的“跳转(修武器)”被导入解释器后,脚本解释器就会从脚本的第一行开始搜索名为“修武器”的子句,请注意,“跳转()”命令里包含的必须是一个子句的名字。当“<修武器>”在脚本中被解释器找到后,就会把整个子句导入到解释器去运行。然后运行完之后,从“</修武器>”之后的一行继续运行。以上就是整个“跳转()”命令的一个运行过程。
与之不同的一个调用子句的命令是“执行()”,它虽然同样是将整个括号内所包含的子句内的命令导入解释器,但子句结束后它将返回“执行()”命令所调用的地方。
例子3:
如果(武器=骨玉权杖)
那么(执行(修武器))
输出(修理武器过程已经成功完成)
同上,该判断语句后面的“那么()”里所包含的是“执行(修武器)”。当解释器找到“<修武器>”时,该子句被导入解释器运行。完毕后再回到“那么(执行(修武器))”,继续下面的语句“输出(修理武器过程已经成功完成)”,最终将会在左边的文本框显示一行文本“修理武器过程已经成功完成”。这就是“执行”与“跳转”的不同之处。
条件语句
通过前三节的学习,我们已经基本上了解如何在脚本中如何控制整个脚本的流程。接下来我们将进入到判断语句,去了解众多的条件语句。
判断语句除了规定的格式头“如果()”,在括号中还应该有一个条件语句。
什么是条件语句?条件语句就是指通过判断符将至少两个或者多个条件连接在一起的句子。
例子1:
如果(地图名称=盟重省)
以上括号内的“地图名称=盟重省”就是一个基本的条件语句。等号将“地图名称”与“盟重省”连接起来。当然我们也可以这样写“地图名称<>盟重省”,前面一节我们讲到文本型判断只能用等于或者不等于,否则报错,请注意到这个问题。
例子2:
如果(寄存物品个数>0)
这个例子首先会统计需要寄存物品的个数,再将结果与0比较。判断是否成立则是根据中间的符号,最后返回成立或者不成立。
其他条件语句
背包,物品名称<?
该条件则是统计背包里某一物品的个数后再与后面的条件值比较。
可以写为:如果(背包,超级金创药<20)
装备位置名称,持久<?
该条件则是根据装备位置的持久来判断,装备位置名称参照角色面板装备栏。
可以写为:如果(衣服,持久<500)
装备位置名称=物品名称
该条件则是根据目前装备位置物品的名称来判断是否是某一件物品。
可以写为:项链=圣战项链
如何实现对人物的监测
代言人
我想实现:当HP<80% 的时候 使用特殊药水,当HP<20% 时自动下线
等全程监测(一旦满足条件,都会触发的那种)的命令,不知道如何实现?
下面是我编的脚本:
问题1 当回城后,没有去买药,修东西等 ,而是停留在那里。
问题2 战死回城后,也不买药,修东西,而是直接到达战斗地图。
问题3 小退上线后不能自动战斗
如果(寄存物品个数>1)
那么(执行(回城))
如果(地图名称=盟重省)
那么(执行(存))
等待(1000)
如果(地图名称=盟重省)
那么(执行(买回城))
等待(1000)
如果(地图名称=盟重省)
那么(执行(修))
等待(1000)
如果(地图名称=盟重省)
那么(执行(买药))
等待(1000)
//*****出发******//
走到(338,333)
对话(新地图传送)
对话(新地图传送)
选择(@duihua)
选择(@jinru1)
过门(33,16)
等待(1000)
过门(97,12)
自动战斗(开)
//***********子程序********
<回城>
使用物品(回城卷)
</回城>
<存>
走到(338,333)
对话(万事通B)
选择(@003)
选择(@storage)
自动存入
等待(1500)
</存>
<买回城>
走到(338,333)
对话(流浪汉)
选择(@buy)
买够(回城卷,2)
买够(随机传送卷包,3)
</买回城>
<修>
走到(338,333)
对话(万事通B)
选择(@002)
选择(@s_repair)
卸下(衣服)
卸下(武器)
卸下(项链)
卸下(头盔)
卸下(左手镯)
卸下(右手镯)
卸下(左戒指)
卸下(右戒指)
选择(@main)
选择(@002)
选择(@s_repair)
修理物品(火窟战甲(男))
修理物品(火窟战甲(男))
修理物品(≮火窟神兵≯)
修理物品(≮火窟之链≯)
修理物品(≮火窟之盔≯)
修理物品(沧海神镯)
修理物品(沧海神镯)
修理物品(火窟之戒)
修理物品(≮勇者戒指≯)
选择(@main)
装上(衣服,火窟战甲(男))
装上(武器,≮火窟神兵≯)
装上(项链,≮火窟之链≯)
装上(头盔,≮火窟之盔≯)
装上(左手镯,沧海神镯)
装上(右手镯,沧海神镯)
装上(左戒指,火窟之戒)
装上(右戒指,≮勇者戒指≯)
输出(修理完成)
</修>
<买药>
走到(359,336)
对话(M药店老板)
选择(@buy)
买够(绝强金创药,2)
买够(超级魔法药,3)
</买药>
-----------------------分-----------------------界----------------------------线------------------------
符号详解:
[] [@main]这样的段落可以被goto @main识别
\ 语言的换行'太长的语言将被显示在对话框之外
<> 交谈选项例如<关 闭/@exit>'在传奇中显示为黄色可点选的"关闭"字样'也有goto 只含义
/ 分隔符,像上例中的分隔显示语言与脚本语言
; 注释符号'加在一行之首,那么这行文字将作为注释理解,不显示也不加入脚本语言编译
地图属性(mapinfo.txt中地图代码后的英文含义):
DAY 白天 白天'免蜡
dark 黑暗 黑暗区域需要蜡烛火把'就是没有免蜡时候的效果
MINE 矿区 可以挖矿的地图
SAFE 安全区 安全区不可PK
FIGHT 战斗区 战斗区域'允许PK
FIGHT3 行会战 战斗区域'用在行会战争地图中'战斗不掉东西,包括祈祷系列'可连续登陆三次
norandommove 随机无效 不能使用随机传送卷的地图
NOPOSITIONMOVE 传送无效 不能使用传送戒指的地图
NORECALL 记忆无效 不能被记忆一套召回的地图
NORECONNECT 重登出现在 掉线后跳出地图'重登出现在(地图代码)掉线后被传送到某地图
nodrug 任务 不能使用药的地图
needhole 需要洞口 需要一个洞才可以进去的地图'用于尸王殿和桃源之门
quiz 小考 小考
↑新的M2中有这样的作用:标上后地图全封穿人穿怪 New..!(新的M2支持的功能)
checkquest 询问地图(进入此地图会弹出对话框)CHECKQUEST(Q001)内容在[地图脚本_配置]文件夹中
needset_on 检查人物属性NEEDSET_ON(001)必须赋有001属性的人才可进入
needset_off 同上相反
[地图编号 地图名称 ] X经验倍数 经验地图倍数 New..!(新的M2支持的功能)
固定含义的语句(不能当作他用'可以在M2里修改这些命令):
@s_repair 特殊修理
@buy 购买东西
@sell 出售东西
@repair 普通修理
@makedrug 制作毒药
@prices 未解
@storage 保管物品
@getback 取回物品
@exit 关闭窗口
@upgradenow 升级武器
@getbackupgnow 取回武器
<$USERWEAPON> 你手中的武器
<$USERname> 你的姓名
<$OWNERGUILD> 沙巴克的占领行会
<$LORD> 沙巴克城主的名字
<$CASTLEGOLD> 沙巴克的总黄金
<$TODAYINCOME> 沙巴克今天的收入
<$CASTLEDOORSTATE>城门的状态
关于买卖NPC的属性设置的解释:
%100 这个百分比是表现了这里的物价'%100是原始物价'%150是1.5倍物价
+19 +20 +21 是项链店,所有项链可以在这里维修和交易
+22 +23 是戒指店,所有戒指可以在这里维修和交易
+24 +26 是手镯店,所有手镯可以在这里维修和交易
+3 +25 +30 是杂货店,所有杂货可以在这里维修和交易
+3 +4 是书店,所有图书可以在这里交易
+0 +42 是药店,所有药剂可以在这里交易
+10 +11 是衣服店,所有衣服可以在这里维修和交易
+15 是头盔店,所有头盔可以在这里维修和交易
+5 +6 +43 是兵器店,所有兵器可以在这里维修和交易
+1 +40 是肉店,所有肉可以在这里交易 |
上一篇:天关教程及脚本,数据量会让新手哭下一篇:对付网站喊话的禁言脚本,测试完全有效
|