作者laechan (小太保)
看板mud_sanc
标题[wizs] 仓库继承样本
时间Thu Jul 28 09:26:39 2011
仓库目前是预定设在各位的天空城之家,所以它的使用前提是
你必须要有天空城之家. 仓库为虚拟型式, 这是避免采用 npc
型式造成 npc 存在太多只。
在大多数 OLG 里头仓库是多人共用的,我有考虑过,不过它们
的仓库大多是「在玩家的物件资料上开栏位来存」,例如..
ppl->set("warehouse",([ ... ]));
圣殿不采这种型式,以免玩家资料档过大。
=======================================================
仓库的写法很简单,假设指令是 warehouse..
int warehouse_xxx(string str)
{
string str1,str2;
object ob,ppl=this_player();
mapping data,data2;
mixed keysw=({});
int t,n;
sscanf(str,"-%s %s",str1,str2;
if(str1=="put")
{
if(!ob=present(str2,ppl))
return 0;
t=time();
if(query("warehouse/"+t)
return 0;
执行一些存入限制判断;
data=ob->query_ob_data();
str=base_name(ob);
str2=ob->query("short");
data["base_name"]=str;
set("warehouse/"+t,data);
this_object()->save_room();
然後这里加重置判断;
ob->remove();
return notify_fail("你将 "+str2+" 存进了仓库.\n");
}
if(str1=="take")
{
keysw=keys((mapping)query("warehouse"));
n=atoi(str2);
if(n<1 || n>sizeof(keysw))
return notify_fail("没有第 "+n+" 样东西喔.\n");
// 依存入的顺序做排列
keysw=sort_array(keysw,"sort_keysw",this_object());
data=query("warehouse/"+keysw[n-1]);
ob=clone_object(data["base_name"]);
map_delete(data,"base_name");
data2=ob->query_ob_data();
// 然後让 data2 = data
data2=data;
ob->move(ppl);
delete("warehouse/"+keysw[n-1]);
ob->save_room();
然後做一些重置判断;
return notify_fail("你从仓库取出了 "+ob->query("short")+".\n");
}
if(str=="list")
{
keysw=keys((mapping)query("warehouse"));
keysw=sort_array(keysw,"sort_keysw",this_object());
str2="你仓库里面的东西有:\n";
n=1;
foreach(str1 in keysw)
{
data=query("warehouse/"+str1);
str2+=sprintf("%2d. %-s\n",n++,data["short"]);
}
return notify_fail(str2);
}
return notify_fail("没有这样的语法喔.\n");
}
仓库的程式不难写, 某些判断写一下就 ok 了, 这篇只是范例
所以写的比较简单, 但大致上就是像上面那样.
上面写法的好处是..
1.保证 ob 的 data 有哪些资料, 就存进哪些资料.
连任务限定的 ob 理论上都能存.
2.可以跟家的储存功能分开, 例如以 sdata 区隔,
家只能存"没有 sdata 的东西", 而仓库只能存有
sdata 的东西.
3.限制一下可储存的容量即可, 而该容量数值可以存
在玩家的 record_data 区, 就可当做一种奖赏.
基本上在储存的过程中也存在着最佳化的写法.
这个东西预订暑假结束前一定会实装天空城之家, 所以我不打
算让旅馆有仓库功能.
Laechan
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 117.19.95.83
1F:→ laechan :实际写好後有权限的 adm 可去 more, 重点的地方我会 07/28 09:30
2F:→ laechan :加注, warehouse 指令的相关函数会在 skyroom.c 的最 07/28 09:31
3F:→ laechan :後几行.各位有其它指令要建议都可以提供. 07/28 09:31
4F:→ laechan :另外目前暂定族徽不可存. 07/28 09:32
5F:→ hlead :话说现在盖天空城之家..应该要付费阿!地很贵的.. 07/28 15:54
6F:→ laechan :所以才盖在天空啊 07/28 19:35
7F:→ laechan :扩充再收钱就好了 07/28 19:35