作者laechan (小太保)
看板mud_sanc
标题[wizs] 直觉化的虚拟物品系统
时间Wed Sep 24 10:36:10 2008
底下是几个原则设定...
一、虚拟物品暂时不予储存(放在玩家的 temp_data 区)
二、允许 wiz 可自订属於自己的虚拟物品资料库,包括虚拟物品
指向的实体物件、虚拟物品ID、虚拟物品中文名,各自的资料
库各自进行资料的增减(因此该资料库存放位置由 wiz 决定).
除了该 wiz 外其它 wiz 无法去做资料的增减.
三、wiz 必须透过申请来建立自己的资料库。会有个总资料库由我
建置,它会去抓取各 wiz 自建的资料库的所有资料来总存放。
四、假设我的虚拟物品资料库为 /u/l/laechan/vobj.c, 它的内容
为...
// 档名不一定要这麽取
====== /u/l/aechan/vobj.c ======
inherit ROOM;
// 统一定为 vobjs_data
// 所有虚拟物品必须依 key 的开头字母做排序以避免重覆
// name 与 file 两个子 key 必备, mark 非必要
// name 尽量等於实体物件名(无色码与空白)
// file 指向实体物件档名(预设 .c 档)
// mark 是用来做特殊判断用(也可当成 wiz 自行 remark 用), 可有可无
mapping vobjs_data=(["_maker":"laechan", // _maker:谁建置这个虚拟物品系统
"crystal" : ([ "name" : "水晶",
"file" : "/u/l/laechan/obj/crystal",
"mark" : "解盗贼任务时会用到的东西",]),
"disk" : ([ "name" : "光碟",
"file" : "/u/l/laechan/obj/disk",
"mark" : "解盗贼任务时会用到的东西",]),
]);
// 统一的函数名 set_vobjs() 一定要有
void set_vobjs()
{
// 避免产生 bug
if(file_exists("/adm/daemons/vobjs_d.c"))
"/adm/daemons/vobjs_d"->set_vobjs(vobjs_data);
}
// 一定要有
void create()
{
::create();
seteuid(getuid(this_object()));
set("light",1);
set("short","虚拟物品资料房");
set_vobjs(); // 一定要有, 保证 update 房间就去 set
}
// 统一的函数名 vobjs_data()
mapping vobjs_data()
{
return vobjs_data;
}
// 底下还可自行撰写 void init 函数来自定 add_action 做
// show 资料用之类的, 但不能有删改 vobjs_data 的东西
要增减或删改资料就透过 ed 去新增然後 update 该物件即可
完成更新.
我自己的我待会就会先建好, 若我有建好, wizs 就可透过底
下方式确认...
call /u/l/laechan/vobjs;vobjs_data
去看看 vobjs 有没有回传东西.
各 wizs 可先完成这一部份并联络我向我报备自建的资料库的完整路
径档名为何. 建议先弄个测试的即可.
vobj 指向的实体物品则可以是现存的任何的 obj, 如生命水晶、小
地图、去刀粉、...
底下是你们上面边弄, 我也边弄的东西...
五、放在玩家 temp_data 区的虚拟物品资料...
mapping vobjs = query_vobjs(ppl);
(这个其实等於 vobjs = ppl->query_temp("vobjs"); 但不建议
使用这种呼叫)
objs 会 = (["laechan_crystal" : 3,
"laechan_disk" : 5,
.
.
]);
这样可确保各 wiz 所定的 vobjs 其 key 都是独特的, 因为
它们都会被加上建置者的 id, 例如我自己建的 crystal, 我
的虚拟物品 id 就会是 laechan_crystal.
所以假若 wizs 要增改玩家的 vobjs 资料, 有三种方法
1)直接读取玩家的 vobjs 做 mapping 资料异动
读出来的 vobjs 更动 => 玩家身上的 temp_data["vobjs"] 就会一起更动
2)直接 ppl->set_temp("vobjs/key名",数量); \
ppl->add_temp("vobjs/key名",数量); -- 不建议使用,但最直觉
ppl->delete_temp("vobjs/key名",数量); /
3)透过全域函数 set_vobjs(ppl,key名,数量);
add_vobjs(ppl,key名,数量);
delete_vobjs(ppl,key名);
请尽量使用第三种方法, 透过全域函数来做资料更动的最大优
点, 就是将来若读取方式异动时, wizs 不用去更改呼叫方法,
只需我去更动全域函数的内容即可, 避免日後大规模异动.
(以前为了将 add("warexp" 改成 add_warexp 曾大费功夫)
这个弄好了会公告.
六、指令 vobjs
玩家操作这个指令, 跟 wiz 操作会看到不太相同的结果.
这个弄好了也会公告.
暂时先用上面的, 先弄出一个雏型, 然後测试一阵子找出可修改
的地方, 再讨论看看怎麽更动较 ok.
(例如是否要确保资料更新的安全性而采用更严谨的处理方式等)
最後, 上面设定原则也确立了实体物品与虚拟物品的共存性, 例
如玩家身上可能有实体的生命水晶, 但可能也有 n 颗虚拟的生命
水晶. 在过渡时期这应该是最佳的设定方式.
Laechan
--
※ 发信站: 批踢踢实业坊(ptt.cc)
※ 编辑: laechan 来自: 218.170.230.61 (09/24 10:40)
1F:推 hlead :/u/n/norr/vobj.c 09/26 21:29
2F:推 hlead :NAME可以配色彩吗= =? 09/26 21:32
3F:→ laechan :name暂时不能配色彩(因为关系到排版) 09/26 23:16
4F:→ laechan :(而且我忘记了.. name 要有最大长度,这个会在新一篇 09/26 23:16
5F:→ laechan :说明, 同样也是要方便排版) 09/26 23:16
6F:→ laechan :更新步骤 1)修改 /include/vobjs.h 09/26 23:17
7F:→ laechan :2)update /adm/daemons/vobjs_d.c 09/26 23:17
8F:→ laechan :3)call /adm/daemons/vobjs_d;vobjs_data 确认 09/26 23:18