MUDOS详解

MUD


第一.MUDOS中的三大类: 房间ROOM, 物品OBJECT和生物LIVING


1.1 [如何制作房间]
一个房间必定继承了ROOM,一个房间有三个非常重要的函数:create(), init()与refresh()这三个函数会在某些特定的时机被系统所呼叫。
inherit ROOM;
[create函数]
create()是房间被创建时候必定要调用的函数,相当于C当中的void main(),即主函数。
[init函数]
init()函数被调用的时机在于有生物(npc玩家)进入这个房的时候被调用。这时候有个函数this_player()会传回房间的这个人或是npc, this_player()就是触发调用init()函数的玩家。
intit()最常见的函数是int add_action("function", "action");它的作用是在进来的生物身上添加一个指令,并在玩家下达这个指令时去调用。
*********注意函数返回值,返回0则系统会对其他也有相同命令的函数一个一个尝试去执行,直到所有该命令函数都返回0. ---可以实现重载***********
最常用的写法是:
if (条件不合)
return notify_fail(错误讯息);
if (另一个条件不合)
return notify_fail(另一个错误讯息);
.............................
<所有可能导致错误的输入都过滤光了>
开始真正干活的部份....
return 1;
[refresh函数]
refresh函数调用时系统定时半个小时调用一次,用于房间中的npc再生。

1.2 [物品的制造]
要制作物品,必须inherit OBJECT; OBJECT是最基本的物品,如果要做的是武器,防具,地图灯,也需要inherit WEAPON, ARMOR, MAP等等。
物品两个重要函数是create()和init(),作用跟ROOM当中类似。
[create() 函数]
要写 create() 函数, 最好的方法是拿现成的同类物品来修改 因为不同类的物品往往可以 set 不同的属性, 而且特性极多, 有重量价格 攻击力(武器) 防御能力(防具) 使用寿命(火把)等等 很难记得完整, 所以我劝你找一个较完整档案来修改 
[init() 函数]
与 ROOM 中的 init 函数类似, 但是被呼叫的时机多了许多, 共有下列的几种情况:
1. 物品摆在房间中, 有一个玩家走进来 
2. 一个物品突然出现在某个玩家所在的房间中 
3. 一个物品突然出现在某个玩家的物品栏中 
物品的 init 函数大多还是用在写 add_action 上面, 这些 action 会
生效的场合归结起来很简单, 就是:
「玩家用 l 或是 i 指令看得到这个物品的时候」

1.3 [npc]
简单的npc很好做, 连 init 都不用写, 只需要写 create(), 唯一的问题是属性太多了, 要一一理解得花上相当的时间才行 
会做复杂动作的npc则需要相当的技巧, 并且了解有哪些变量可以被拦截下来改写利用 等你有一定的程度时, 再来找个npc参考参考较好 
npc要 inherit NPC 也没有 refresh() 这个函数 


[程序必须的概念]
你必须了解, 在 LPC 中最重要的一个概念是对象(object) 当你想做任何动作时, 都要考虑到这个动作是哪一个 object 所做的, 不然很容易导致错误 LPC 的语法并不严谨, 有些场合为了省事可以将函数是由哪个对象所作的省略掉, 例如我们在 create() 函数中最常看到的set(), 事实上最严谨的写法应为 this_object()->set() write() 则为 this_player()->write()(对,我们必须弄清楚,object 的概念是整个lpc的核心。往深一点说,每个object无非是一个包含了数据结构和内部外部函数的对象,他的数据结构决定了它的属性,比如房间的
名称,玩家的skills等等,而他的外部函数提供了修改这些数据结构的方法,比如 set_skill("xkx",1000)比如 set("title","大侠")这里set_skill()和set()函数就是object和外部的接口。数据结构和接口函数就拼出了一个object。---lnwm注。)
说这麽多只是为了强调一件事: 你能抓出一个物品的 object 变量就能让他干一切他所能做的事 


1.4 [this_object() 与 this_player()]
这两个函数是系统所提供的函数, 也是最最好用的两个函数 在你写作一个对象 (房间 物品...etc.)时, 
this_object() 表示自己这个对象(讲清object的结构后,你必须清楚object的所谓封闭性。当我们在程序里写 set("name","长剑")时,
实际上是this_object()->set("name","长剑")的简略写法。这样set("name")的不是其他的东西,每一个object有自己独立的数据结构,
它能与其他object严格区分开来。即使是同一个长剑程序,当你clone了两把时,在内存中就有两个完全独立的长剑object,你对其中一把做的任何处理如改名,
改威力完全不影响另一把的数据,这就是object的封闭性。---lnwm注。)


this_player() 则比较复杂, 它会传回一个属於玩家类型的对象这个玩家在 init 中就是触发 init 的那个玩家this_player() 会跟著函数呼叫一直传递给所有被 init 呼叫的函数, 
包括 add_action 中所定义出来的函数, 在这些函数中, this_player() 就是表示做动作的那个人 


1.5 [present() 函数]同时还有find_player(), find_living()等函数
通过对象的名字获取对象 object = present(string "id", object env);

1.6 [environment(), first_inventory(), next_inventory(), all_inventory()]
这一组函数跟对象所处在的位置有关
environment(object ob)传回了对象 ob 所处在的地点,例如 ob 是个玩家或生物, 那麽这个函数会传回 ob 所在的房间; 
如果 ob 是个物品, 那麽传回的就是携带著ob 的生物, 或是 ob 所在的房间 (如果没有任何人带著它)
first_inventory(object ob) 所传回的是 ob 中的第一个对象,如果 ob 是房间, 则传回第一个物品或是生物, 如果 ob 是生物, 则传回他身上所带的第一个物品
next_inventory(object ob) 通常跟著 first_inventory() 一起使用 它的功用是传回 ob 的下一个物品, 在同一个environment 中 
all_inventory(object ob) 类似於 first_inventory(), 但是它所传回的是包含了所有物品的一整个阵列(上面谈的是环境问题,一个object(除房间外)都要有自己的环境,所谓环境就是这个object在什么地方放着,是一间房间还是一口箱子还是一个人身上,环境通常是另一个object。比如物品A和B放在一个人M身上,那么上面的函数就给出了它们的关系
M=environment(A);
M=environment(B);
A=first_inventory(M);
B=next_inventory(M);
A=all_inventory(M)[0];
B=all_inventory(M)[1];



1.7 LPC 的函数群有三个, efun, lfun, simul_efun 它们提供了绝大部分的功能。
[关於输出输入讯息的各个函数的提示]
can_read_chinese
printf, sprintf
scanf, sscanf
write, say, shout
tell_object, tell_room
[关於对象操作的函数]
clone, new (变出新object )
destruct, remove (摧毁object )
move, move_player, move_around (移动object ---lnwm注。)
(这些函数不可能一一讲解了,你可以在mud里用help <函数名>
来看(英文呦),然后再放到程序里自己试试。 ---lnwm 注。)


第二 MUDOS支持的数据类型:
2.1 基本数据类型
在Lpc入门里面将介绍以下的数据类型:
void, int, float, string, object, 以及mixed. 对于复杂的数据类型比如: mapping, array, 以及一些不常用的类型比如: class,function, 我将在Lpc进阶介绍. 这一节我们主要介绍三种数据类型:
int(整型), float(浮点数)和string(字符串).


2.2 MUDOS支持的数据类型


int 一个整数(32位)。
float 一个浮点数(32位)。
string 无限长的字符串.
object 指向一个对象的指针.
mapping 一个关系型数组.
function 一种特殊的指针, 指向(object, 函数名)这样一个组合.
arrays 数组的声明采用使用 '*' 跟在一种基本的类型.
void 这种类型对变量没有任何用处, 只对函数有用. 它表明这个函数不返回任何值.
mixed 这是一种特殊的数据类型, 可以指向任何的数据类型. 如果一个变量被声明成mixed, 那么Driver不会对它做任何检查.
class 自定义的数据类型, 类似C的struct而和C++和class不一样.一上是MudOS支持的数据类型.


2.3 LPC函数
2.3.1 Efuns - Externally defined function
也许你已经听说过efun这个词了,他们是外部定义的函数,是
externally defined function 的缩写。就是说,他们是由Mud Driver定义好的。

你可能感兴趣的:(服务器开发)