北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 4809|回复: 2

Cmud的代码模块化处理

[复制链接]
发表于 2010-1-22 11:20:21 | 显示全部楼层 |阅读模式
在Zmud时代,几乎没有模块化的概念,Zscript没有提供
这方面的任何支持,包括函数,过程,内部变量都没有,也
就没有模块化可言,那时候我实现模块化是用alias来实现的,
但是alias有许多问题,对alias无法控制,传入参数只能通过
%1,%2等来实现,很不直观,alias执行之后输出很成问题。
Zmud把alias里面的东西都当作命令来执行了,总是回显很多
'>'换行。
    Cmud时代终于有了函数,过程和内部变量这些概念。函数
就是#function,过程就是#event,内部变量就是#local或者
直接用$var赋值就可以,这里说一个小技巧,用内部变量之前
最好对$var=""或者$var=0进行初始化然后才接受函数返回值,
否则有可能会出现赋值失败的问题,这个用多了应该都能知道。
这个问题不知道是Cmud本身的Bug还是别的什么。由于无法对
Com Object进行初始化,所以内部变量无法创建Com object或
者说我没找到方法,只能使用全局变量来创建。内部变量的问
题就到这里为止了,下面进入正题。
    Cmud的#function的正确使用场合是计算,里面不能包含
给服务器的命令。要给服务器命令使用#event来处理。#function
就是处理你输入参数,我对参数进行处理,返回结果给你或者
给全局变量进行修改,大体就是这些,没有更多了。举一个例
子:
#function compare_room($room,$targetname,$targetdirect) {
#local $detect_flag,$detect
$detect_flag=0
#local $detect
$detect=1
#if $targetname=$room.name {
  $detect=0
  #loop %numitems( $targetdirect) {
    #if %ismember( %item( $targetdirect, %i), $room.direct)=0 {
      $detect=1
      }
    }
  }
#if ($detect=0&&$detect_flag=0) {
  $detect_flag=1
  #return 1
  }
#return -1}
这个例子是一个比较房间是否正确的函数,输入$room是通过
数据库取出来的房间信息,是一个database record结构,里面
包含name=房间名称,id=房间号,direct=方向,其他暂时不说。
$targetname和$targetdirect是用触发器抓下来的房间名称和
房间的方向。这个函数在比较成功的情况下返回1,比较失败
返回-1。使用函数可以让负责计算的部分代码更通用。不用
相似的代码要写很多遍。
    Cmud的过程也就是不需要返回值的代码是通过Event来
实现的。#event命令是用来创建事件的,也可以通过package
Editor窗口来创建事件。#raiseevent是调用事件的命令。
#raiseevent par1 par2 ...来传入参数。事件包括系统事件
和用户事件两种,系统时间查看#event命令的帮助就详细列
出系统已经提供的事件,你只要实现事件本身的逻辑,就可
以在系统发出事件的时候自动执行。用户事件就需要自己定
义了。事件是和Trigger类似的一个概念,里面可以放逻辑
判断,命令等等,可以传入参数,唯一区别就是事件不需要
触发条件,他的触发途径就是#raiseevent命令。我举一个
事件的简单例子:
#event hbWalk($direct,$mode) {
#if (@target_pathid<@locate_pathid&&$mode=1) {
  #SECTION SingleThread {
    target_arr_flag=1
    locate_pathid=@target_pathid
  }
  #t- walk_room_check
  #t- hbWalk
  #unt check_locate
  #alarm quest_search_huoji {+3} {set action 伙计搜索阶段一}
  } {
    #show $direct
  #SWITCH ($mode=0) {
    #exec gan che to $direct
    } ($mode=1) {
    #exec $direct
    } {
    #win hubiao 护镖任务:行走模式:$mode,有问题!行走命令:$direct
    }
  }
}
这是一个我自己开发的护镖行走事件,行走的时候输入方向和模式
就可以自动执行行走命令。模式0是确定的方向,1是特殊命令。
比如#raiseevent hbWalk north 0镖车就会向北走。再比如
#raiseevent hbWalk "yell boat" 1就会叫渡船。
    如果你在cmud开发的时候能够熟练使用函数和事件,你的代码
可维护性就会提高到一个新的层级。另外还有一个命令是#varfunc
就是Zmud模式的函数,可以实现一些简单计算,比如大小值比较之
类,使用的相对比较少。可以参考帮助系统查询具体使用方法。

评分

参与人数 1精华 +30 收起 理由
icer + 30

查看全部评分

北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2010-1-22 11:21:00 | 显示全部楼层
这一篇应该是最后一篇了!还有其他专题需要说说的发帖子写一下。我看看有时间给大家写写。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2010-1-22 11:31:14 | 显示全部楼层
赞,授人以鱼不如授人以渔,这样的技术文章比单纯的机器人好。
等我闲下来把这个系列都整理到wiki里。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-5-18 07:09 AM , Processed in 0.012482 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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