
virtual Object 的撰写:				by bor @DA, 3/11 2003


    相信不少人在写 MUD 的过程中, 都会为了程式的精简, 记忆体的最小化而
努力着, 而 Virtual Object就是其中一项节省记忆体的一个手段, 在此提供由
Tmi2-1.2 Mudlib 撰写的方法, 替各位有个参考:

	 1. 补进 /adm/daemons/virtuald.c
	 2. 新增 /adm/daemons/virtual/ 的相关目录与档案
	 3. 修改 /adm/obj/master.c 的 compile_object()
	 4. 修改 /cmds/npc/go.c
	 5. 新增区域 /d/grid/ 内的资料, 修改 /d/gourd/gourd_recall.c
	 6. 新增 /include/virtual.h
	 7. 新增 /std/virtual/ 内相关档案

        Virtual Area 主要放置于 /d/grid/ 内, 而其中分为两个主目录,
<data>, <rooms>, 以下分别介绍之:

	<data>		grid.descs		房间叙述(short, long)
			grid.exits		房间出口定义
			grid.terrain		房间地形定义

	<rooms>		*.grid			在 Virtual Area 内的真实房间
						稍后介绍这些真实房间的命名规
						则与哪些座标可以制作, 哪些又
						不能制作或注意事项

一般的系统区域( 假设某房间档名为 gourd_recal.c)与 Virtual Area作区域连结的方
式依然为真实房间作连结, 如:

// /d/gourd/gourd_recal.c

inherit ROOM;

void create()
{
	set("short", "广场");
	set("long", @LONG
一个系统区域的房间。
LONG
	);
	set("exits", ([
		"up" : "/d/grid/rooms/3,2.grid",	// 连结到 Virtual Area
	]));
	setup();
	replace_program(ROOM);
}

------
// /d/grid/rooms/3,2.grid.c
// by bor @DA, 3/11 2003

inherit ROOM ;

void create () {
	set ("short", "测试房间") ;
	set ("long", @LONG
这里人来人往, 没事都会发呆。
LONG
	);
	set ("exits", ([
		"north" : "/d/grid/rooms/2,2.grid",		// 档案不存在
		"east" : "/d/grid/rooms/3,3.grid",		// 档案不存在
		"west" : "/d/grid/rooms/3,1.grid",		// 档案不存在
		"south" : "/d/grid/rooms/4,2.grid",		// 档案不存在
		"down" : "/d/gourd/gourd_recall"		// 真实房间
	]) ) ;
}

------

定义好两个区域连结后, 接下来必须去定义 Virtual Area 的大小, 每个房间开了哪些
出口, 以及简短描述(short), 以及叙述(long), 这时候请定义之前说明的 grid.descs
, grid.exits, grid.terrain 三个主要的档案, 介绍分别如下:

// /d/grid/data/grid.descs
高山					<---- 0
这里充满着白色飞雪的高山。
池塘					<---- 1
这里有许多的莲花种植于此地。
道路					<---- 2
杂乱无章的小石子路。
房舍					<---- 3
破破烂烂的房屋, 可住着不少的人。
水井					<---- 4
一推人围着汲水的地方。

------
[说明]:
grid.descs 中, 我标示的 0, 1, 2, 3, 4 为 grid.terrain 内各数值的表示的意义, 当
grid.terrain 标示 3, 表示该座标的 short 为[房舍], long 则为[破破烂烂的房屋, 可
住着不少的人。]
grid.descs 的描述, 可以多没关系, 反正 grid.terrain 又不一定必须用到, 不是吗 !?

-------------------------
// /d/grid/data/grid.exits		(5x5)

	9 8 8 8 10	<--- 座标分别为 (0,0), (0,1), (0, 2), (0,3), (0,4)
	1 0 0 0 2	<--- 座标分别为 (1,0), (1,1), (1, 2), (1,3), (1,4)
	5 2 1 0 2	<--- 座标分别为 (2,0), (2,1), (2, 2), (2,3), (2,4)
	11 1 0 0 2	<--- 座标分别为 (3,0), (3,1), (3, 2), (3,3), (3,4)
	5 5 4 4 6	<--- 座标分别为 (4,0), (4,1), (4, 2), (4,3), (4,4)

------
[说明]:
grid.exits 的数值各表示出口的意义, 如下:
0 : e, s, w, n
1 : e, s,    n
2 :    s, w, n
4 : e,    w, n
5 : e,       n
8 : e, s, w
9 : e, s
10:    s, w
11: 

-------------------------
// /d/grid/grid.terrain		(5x5)

	4 2 2 2 0
	2 2 3 2 0
	1 2 3 0 0
	2 2 3 0 0
	2 2 2 2 2

------
[说明]:
grid.terrain 的各数值定义在 grid.descs, 而大小也必须与 grid.exits 一致

-------------------------
// /d/grid/rooms/*.grid

这里定义的真实房间档案, 格式必须为 X,Y.grid 的格式, 而房间内容, 以下面为范例:


// /d/grid/rooms/3,2.grid.c
// by bor @DA, 3/11 2003

inherit ROOM ;

void create () {
	set ("short", "测试房间") ;
	set ("long", @LONG
这里人来人往, 没事都会发呆。
LONG
	);
	set ("exits", ([
		"north" : "/d/grid/rooms/2,2.grid",		// 档案不存在
		"east" : "/d/grid/rooms/3,3.grid",		// 档案不存在
		"west" : "/d/grid/rooms/3,1.grid",		// 档案不存在
		"south" : "/d/grid/rooms/4,2.grid",		// 档案不存在
		"down" : "/d/gourd/gourd_recall"		// 真实房间
	]) ) ;
}

------
[说明]:
1. 与一般区域作连接的 Virtual Area 的选取规则为, 必须此座标在 grid.exits 的大小内, 
   例如, 我选择了 /d/grid/rooms/3,2.grid 当作连结的房间, 此时该房间必须为真实房间
   , 因此必须撰写其档案出来, 如上述的 /d/grid/rooms/3,2.grid。
2. 定义 /d/grid/rooms/3,2.grid 的各出口必须依照 grid.exits 内的 3,2 此座标的出口定
   义, 例如, 定义为 4, 表示开口为 west, east, north, 因此你必须定义出来。
3. 座标的定义为: 往东 Y 加一, 往西 Y 减一, 往北 X 减一, 往南 X 加一, 而左上角的座标
   则定义为原点(0,0)。
4. 定义其他的真实房间: 你可以挑 grid.exits 内标示为 0 的座标去撰写, 也可以任意挑拉,
   只是要依照 grid.exits 内数值去定义出口方向, 或者按照原本的 grid.exits 由系统自行
   定义, 这样也是可以的。
5. 超出刚刚我们定义的 [5x5] 大小的座标, 就没有必要制作了。
6. /d/grid/rooms/ 内某房间有故意制造一个 bug, 会有错误讯息, 各位可以思考一下 why 出
   错, 以及如何修改就会正常, 又 why 这样。

-------------------------
[附注]
1. 各位不访查一下每一格房间的记忆体(直接输入 mem here 查一下), 比对一般区域的房间的
   记忆体。记得最好 short, long 都一致, 这样的比较会更有意义。
2. 此 Virtual Area 的写法, 有其限制在, 就是系统只能用一个 Virtual Area 而已, 除非自
   己重新改过其架构, 否则像系统假设有很多区域, 每个区域都会想用一些 Virtual Area, 那
   该怎么套用?? 难不成, 大家都用 /d/grid/data/*.* 吗?? 这样也太怪了。
3. 又, grid.exits 内的数值定义, 大家可以想一下怎么改掉, 比如说 east == 1, south == 2,
   west == 4, north == 8, 那么出口若为 12 表示出口有 west, north, 那么程式该怎么改呢
   , 大家可以参考参考 /d/adm/daemins/virtual/grid_server.c。

-------------------------
本 mudlib 所架设的 Mud ip 位于 203.204.154.76 6666
官方网页: http://home.kimo.com.tw/rg_mud/

my e-mail: sbada_rg@yahoo.com.tw
	   damud6666＠yahoo.com.tw

							by bor @ DA, 3/11 2003
