作者laechan (小太保)
看板mud
标题Re: [闲聊] 分散式储存
时间Tue Jan 29 10:11:54 2013
※ 引述《kyoe (习惯,不容易)》之铭言:
: if(!room = new(PRIVATE_ROOM)) return 0;
: // 如果无法载入初始物件则直接回传无此房间或可使用 error() 来报错
: return room->restore_room(filename);
: // 呼叫初始物件(object room)告诉他可以创造并载入 filename 这个档案
virtual object 的部份,sanc 有做 v_room 的设计,
这东西简单来说就是使用 new 的方式,"生"出一个物
件出来。
它类似 clone_object 出来的东西,跟一般的差异:
某房间物件 有房间档(如 /area/hole/001.c)
某虚拟物件 实际上没有对映的房间档
然後它的最直觉问题就是「没有房间档,哪来的物件?」
它的做法就是 kyoe 上篇程式码提到的,用 new 的方式
,比方该虚拟物件 vroom = new("/inherit/vroom.c");
也就是说「所有的虚拟房间」,其「原生源」都是上面
的 vroom.c,类似「所有的玩家」,其「原生源」都是
user.c 一样,则以 user.c 为例,就可以做到让 n 个
.o 档,共用一个 .c 档。
它的最直接好处,就是玩家 quit 时,「玩家物件」就
会消灭,而「玩家资料」则会被储存到对映的 .o 档。
那假设家族(或帮派)有根据地时,最简单的做法则是使
用指令呼叫式,例如 home
mapping homes=([]);
int cmd_home(string str)
{
.
.
// 读取你家族(或帮派)族长的 ID 及对应档案
leaders=this_player()->query_leader_names();
// 若该根据地已经被载入且被存入 homes 里头就直接移动
if(homes[leaders])
{
this_player()->move(homes[leaders]);
return 1;
}
// 不然就产生一个 vroom 物件
vroom=new("/inherit/vroom.c");
// 让该物件执行回存 leaders 资料的动作
// 当然 restore_room 这个函数是必须写在 vroom 内的
// int restore_room(string leader_files)
// {
// restore_object(leader_files);
// return 1;
// }
vroom->restore_room("/group_data/"+leaders);
// 然後让 homes 储存它
homes[leaders]=vroom;
// 然後才让玩家移动到 vroom
this_player()->move(homes[leaders]);
return 1;
}
(实际上这样写是有问题的,但它可以方便说明 vroom)
则 homes[leaders] 在,玩家直接移动到该物件即可,
不在时,才另外 new。
上面是 vroom 的简易实作法,而进阶的用法就如 kyoe
所写的,以房间出口搭配 compile_object 的函数做法
,是更直接的(房间的移动指令是早就存在的,home 指
令则是另外写的)。
底下讲 vroom 的另一种应用,sanc 的 Int 有实做过,
它的概念在於,比方 001.c 接往 west 的出口是 002.c
,设定方式是:
set("exits/west",__DIR__+"002");
传统做法,是存在一个 __DIR__+"002.c" 档,在 sanc
则是改采存在 __DIR__+"_002.c" 这个档。
> ls
1 001.c 1 _002.c
接着就跟 kyoe 提到的一样,因为它找不到 west 方向
的 "002.c",就会接着跑虚拟物件的判断流程,这时就
发现有 "_002.c", 於是就跑底下
vroom = new(__DIR__+"_002.c");
这样就相当於「有 002 这个房间物件,但实际上它是虚
拟的」。
那为何要写 _002.c,不直接写 002.c 就好呢?
虚拟房间跟实体房间的差异,一般相信是在占用记忆体
的大小(虚拟房间占用较小),以及 all_inventory(vroom)
为空时的存在时间(虚拟物件存在时间可较短)。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
※ 编辑: laechan 来自: 122.117.106.224 (01/29 10:39)