2015年4月—2024年4月,论坛已建立9周年,欢迎加入QQ群讨论:419848937

【天堂2单机版】修复任务脚本心得

主要是游戏中一些经典任务、游戏资料的科普.
回复
头像
hagcse
Mr.GL
Mr.GL
帖子: 151
注册时间: 2018-02-25 15:50

【天堂2单机版】修复任务脚本心得

帖子 hagcse » 2018-03-10 15:10

首先,在python脚本中(扩展名为*.py),有属性,也可以说是实体。其中包括对象、变量和常量。如对象id,event等,是不可以自定义的,对象往往代表一系列物品及其具备的行为也就是方法(就是能做出什么动作来,如给任务道具等)的集合,一般由系统给出并不可自定义;又如变量ANATOMY_DIAGRAM_ID,这个是今天325任务中的一个变量,它可以由我们自己定义,也就是起什么名字都行,如果我写成“JIEPOUTU”也可以,这个东西在任务中代表解剖图,后面的=1349就是给它赋值,这个值就是实际物品解剖图的 ID;再如常量1、2、3、"7336-03.htm"等,这些常量就是具体的值,有数字,还有字符串,比如带引号的都是字符串,里面可以包含要说出来的话,这个引号里面也可以加入html标签,如350任务中,对话直接用的字符串而不是另外写了一个htm。这些东西,是拿来操作的,或者说是一个个的部件,但实际上,它们装载的都是数据,因此会很抽象。

脚本中还有控制这些部件的东西,称为行为。其中包括宏、运算符、控制关键字、方法和函数。比如宏或函数前面一定会有def,在脚本中,总是会看到这个:def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr),它的意思就是,用__init__(self,id,name,descr) 来替换冒号“:”后面的JQuest.__init__(self,id,name,descr),这样可以使代码简洁并保持较高的兼容性,宏这个东西在这里其实和函数的作用一样,所以函数(也用def定义,def 函数名(参数表))就不介绍了,但是不管是宏或者是函数,都可以由我们自己定义;接下来再说运算符和控制关键字,运算符有常见的+、- 、*、/即加减乘除,注意乘除的写法,这些叫做算术运算符,是计算数值时用的;还有>、<、==也就是大于小于和等于,注意等于的写法,是2个“=”这些叫做逻辑运算符,是比较大小时用的;然后还有and、or、not运算符,就是逻辑运算符,这个东西代表“真假”之间的一系列关系,逻辑值有2个,一个真,一个假,说这两个值之间的关系,就是与(and)、或(or)和非(not),与是指两个值A和B,如果都为真,那么结果为真,其余情况为假,或是指两个值A和B,如果两个都为假,它们的结果才为假,其余为真,非就简单了,就是指这个值的相反;最后有赋值运算符=、点运算符.和引号运算符"",=运算符就是把这个符号前面的变量的值,变成后边的值,如A =2,那么A就是2了,这里要注意判断2个数是否相等一定要用==,点运算符一般是用来取得一个对象里面某一个元素用的,如取得一个方法等,而引号的作用是把它里面的内容变成字符串,这样可以将其原封不动地发到客户端的对话中去;接下来,有控制关键字,在脚本中,只出现了if、else、elif和return这些东西,是控制操作流向的,if关键字后面的表达式如果为真则执行if下面的东西,如果为假,则执行 else或者elif里面的东西,这个elif的作用就是执行了条件假规定的操作后进行下一步判断,在这里要说一句:每一行语句前面的空格数量,决定着这个if、elif是否结束,如:

a=1 #给一个变量赋值为1
if a==1 : #判断表达式a==1是否成立
print "a = 1" #在控制台显示a = 1这行字,注意这里缩进4个空格,不过显示的不是很准确
print "line 2" #这里我也缩进了4格,这表示在a=1的情况下这句也执行
else #这里没有缩进,意思是上面的2句结束,该处理条件为假了
print "a <> 1" #如果a不等于1,则会输出这句a <> 1
print "if,else ended" #这里面的语句无论a值为什么,都会被输出,,因为没有缩进,看成是与if平齐,也就是if语句结束后才执行的,并不属于那个if;

接下来是return,这个关键字是负责标示一个函数定义结束用的,同时也会把结果返回给调用者,如用得最多的return htmltext,就是把结果返回给服务器,服务器收到了这里面的内容后,发送给客户端;最后还有方法,方法就是系统中对象所含的一些操作,比如 st.giveItems()就是一个方法,它的作用就是给玩家任务道具,方法、函数和宏往往带有参数,也就是其运行所依赖的条件,比如我们可以定义一个函数def add(a, b): return a+b,那么宏add会返回a+b的值,则a和b就是宏add的参数,也是执行所依赖的条件。

好了,以上就是脚本中的各个组成部分,下面,看一看脚本如何与htm一起工作的:

首先在htm里面我们会发现

<a action="bypass -h Quest 325_GrimCollector 1">(任务选项的文字)</a>

这样的东西,这里面是类似标准htm的标签,bypass -h Quest 325_GrimCollector是一个命令,表示把后面的值“1”传送到引擎里面去,bypass为命令动词,意为传输,-h为方式参数,这个暂时不知道其意义,基本上都是用这个参数,Quest是类别参数,表明是任务 325_GrimCollector是任务名/ID参数,这个参数在quests目录下的__init__.py中定义,如果没有定义,系统就不会加载这个任务。当玩家点了这个选项后,值1就会被传送到脚本中,而脚本中会指定def onEvent (self,event,st)接收相关的值,其中对象event就会接收该值,也就是说,将直传过来以后event=1,以便我们下一步根据这个事件的值判断该做什么。这里要说一句,一般情况下,为了使程序易读,便于和步骤中的htm校对,我们将传送的值设为xxxx_x,前面的4个x代表npc编号,后面的代表步骤号,一般是与任务目录中的htm名相符,所以像这样传送1过来的情况不是很常见。接下来,如果接受任务,那么传值就完成,这样会将下面的步骤激活,其中会有st.set("cond","1")这个是为了将数据库中的字段设为开始,也就是存储进度。下面st.setState (STARTED),这个是启动任务的标志,接下来的,希望大家自己分析,一直到onTalk,也就是处理对话条件的宏,这个地方记载着点选npc时, npc会调用哪个htm回应,大家看这里有不少get和set打头的,get一般是查询资格,set一般是存储临时进度……

最后有onKill,这个是判断杀死任务怪物后掉落的物品,以前已经有人说过了,这里就不再重复了,我想看完了脚本中各元素以后,自己也能轻松的分析了……

这个任务在古鲁丁城镇南端的警卫克堤兹处,可以测试下
图片

回复