CONDITION系统分析
2007/5/10 21:15:47

condition是利用系统的心跳来解决关于在一个不算太长的时间里,定时触发种现象的解决方法。在MUD中
,为了解决定时触发某种现象,一般有两种方法,一种是通过call_out()延时呼叫,另一种就是通过心跳
。在spock翻译的LPC及教材中曾对这两种方法进行了比较,好象是说:如果时间较长的话采用心跳比较好
,时间短的话采用call_out()。紧接着又说了句,其个人看不出这两者有什么必要的区别,反正稀里糊涂
的。不过,在实际运用中,两者都有不同的效果,大家看明白了本文之后,可以有自己的理解,并进行正
确的选择。
  call_out(other_fun,t)这个外部函数就是起一种延时呼叫的作用,后面必须要加第一个参数,指定
延时呼叫的函数名,第二个参数表示延时几秒,再之后加上的参数可以作为呼叫的那个函数的参数。象这
一个也就是设定在t秒钟后,呼叫other_fun这个事先指定的函数,你可以在这个函数里设定好应该进行的
事情。比如,你在一个玩家进入监狱后,要做牢五分钟,如果一定要用call_out()进行的话,你可以设定
成:
call_out("out_jianyu",300,ob);
  意思就是在300秒后呼叫out_jianyu()这个函数,ob作为这个玩家的变量传递过去,然后在这个函数
里进行将玩家从牢中放出来,告诉他做牢结束等等处理。但是,有的巫师看到这里,就会问了,如果五分
钟没到,这个玩家退出游戏了怎么办?对,如果这个玩家退出游戏,这个call_out()一到时间就会找不到
这个操作对象,如果程序写得不好就容易出错,即使是不会出错,那个玩家再次进入游戏后也就无法继续
刚才的延时过程,也就不能够出牢。于是,对于要跨起离线前后的象做牢这类的事,大多都是采用
condition。
  condition的处理方法,就是在开始的时候在玩家身上设定一定的点数的记号,这些记号会通过save
()保存进玩家的档案中。然后通过系统的心跳,每一次心跳就执行一次这个固定的condition的函数,函
数每被执行一次就减一点记号,直至这个记号为0后,就可以触发某种效果。比如做牢,就在进牢时设定
一定点数,每一次心跳减一点,减为0时,将玩家放出。由于这个记号在玩家身上,因此,在玩家离线时
不会发生到有关函数对这个玩家的操作。
  在ES系列MUD中。一个完整的condition系统包括三个部分:
一、首先就是调用或者说是触发它的程序,也就是/inherit/char/char.c这个
文件,这是所有玩家与NPC都共同继承的文件,在里面的heart_beat()函数,就是每一次心跳时调用执行
的函数。里面有这么几句:
  if( tick-- ) return;
  else tick = 5 + random(10);
  cnd_flag = update_condition();
解释:tick是这个文件里的一个全局变量,假设它只要>1,那么tick--就不会等于0,那么tick值就会减
1,并且立即return;中止这个函数向下执行。假想如此这样经过几次减1之后,终有一次tick--就会为0,
那么这时,程序就不会中止而是执行下一句的else。这时,tick被重新赋值为5+random(10)。并执行
update_condition()函数,update_condition()是一个什么函数呢?在char.c里怎么也找不到。
  那么我们再回头看看char.c这个文件的开头,就会看到,这个文件已经继承了/feature/condition.c
文件,update_condition()这个函数正是在这个文件里面。所以下面我们就开看这个文件。
  附:由于大多数MUD里的心跳是每两秒调一次,5+random(10)是5至14次,因此可以看出每一个
condition被调用的时间是平均19秒。知道了这此,你才能更加有数地设定一些毒的发作时间,一些做牢
的时间长短了。 
二、下面就是主程序,feature目录下的condition.c文件。
程序详解:
#include "condition.h"//继承一些宏定义
mapping conditions;//定义一个映射集
/*更新

下一页
返回列表
返回首页
©2025 MUD游戏网_文字mud 电脑版
Powered by iwms