[节日] 圣诞节任务开放重新接取

楼主: laechan (挥泪斩马云)   2017-12-19 12:27:42
以下也供 wiz 参考。
在我的写法里头,我让 quest_data.c 控制 36 个 quest_data_X.c
(X=0~9, a~z),在 /open/cmds/quest/quest_data 目录。
quest_data.c 仅做控制,实际上各玩家的 quest 资料就是依玩家的
ID 开头,存放在各自所属的 quest_data_X.c 里头。
quest_data_X.c 里面某一玩家的储存资料内容如下
quest_data ([
"XXX":
({
({"n000",0,1,"2011/10/02",}),
({"l001",0,1,"2011/09/23",}),
({"n001",0,1,"2011/10/09",}),
}), ↑↑
]) │└玩家已解过几次
└─玩家该任务已解到第几步骤
知道了资料结构,就可以额外写函数来处理资料,quest_data_X.c
都是 inherit sample.c,而 sample.c 已经有这样的函数存在:
// 对所有玩家的‘特定任务’资料录做共同的设定
// types 有两种
// "times": 则 v = 欲重置的次数
// "remove": 则不用加 v, 代表将所有玩家解过该任务的资料清除
varargs void clean_quest_data_by_nums(string quest_num,string types,int v)
{
mixed tmps,tmps2=({});
int i,j,ii,jj;
string names;
if(sizeof(quest_data)<1) return ;
tmps=keys(quest_data);
j=sizeof(tmps);
if(types=="times")
{
for(i=0;i<j;i++)
{
// quest_data 下每一笔键值 = 玩家的id
names=tmps[i];
//2维阵列, "玩家id" : ({ ({任务资料串行}),({任务资料串行}),.. })
tmps2=quest_data[names];
jj=sizeof(tmps2);
for(ii=0;ii<jj;ii++) // 对每一个资料串行
if((string)tmps2[ii][0]==quest_num) // 只要串行的第0元素=任务标记
quest_data[names][ii][2]=v; // 就将串行的第2元素修改为 v 值
}
save_room();
}
// remove 的写法应该是有问题还得修改 by laechan 10/18
else if(types=="remove")
{
for(i=0;i<j;i++)
{
names=tmps[i];
//2维阵列
tmps2=quest_data[names];
jj=sizeof(tmps2);
for(ii=0;ii<jj;ii++) // 对每一个资料串行
if((string)tmps2[ii][0]==quest_num) // 只要串行的第0元素=任务标记
tmps2[ii]=({0}); // 就将该串行直接以 0 值取代
tmps2-=({0}); // 最后再对 2维阵列 做 -({0}} 的动作就能消掉所有 0 元素
quest_data[names]=tmps2; // 然后再把处理过后的 2维阵列 设回 quest_data 中
}
save_room();
}
return ;
}
有问题的那一段我用 running 测过,应该是没问题才对,可能我有修正
过了
tmps=({({"1","2"}),0,0,({3,4}),0});
tmps-=({0});
write(identify(tmps)+"\n");
========== 程式执行区 ==========
({ ({ "1", "2" }), ({ 3, 4 }) }) // 它确实将 0 消除了, 有几个 0 就消几个
========== 程式执行区 ==========
也就是说,当我要清除的任务标记是:
───────────────────────────────────────
l/l008 圣诞礼物兑换任务 圣诞礼物, xmas
圣诞老人(Santa Claus) /u/p/ppl/hiei/rocky/mob/santa_claus
───────────────────────────────────────
我只要使用 wiz 指令 call 去做就可以了,指令是
cd /open/cmds/quest/quest_data
call quest_data_0;clean_quest_data_by_nums;"l008";"remove"
call quest_data_1;clean_quest_data_by_nums;"l008";"remove"
call quest_data_2;clean_quest_data_by_nums;"l008";"remove"
call quest_data_3;clean_quest_data_by_nums;"l008";"remove"
call quest_data_4;clean_quest_data_by_nums;"l008";"remove"
call quest_data_5;clean_quest_data_by_nums;"l008";"remove"
call quest_data_6;clean_quest_data_by_nums;"l008";"remove"
call quest_data_7;clean_quest_data_by_nums;"l008";"remove"
call quest_data_8;clean_quest_data_by_nums;"l008";"remove"
call quest_data_9;clean_quest_data_by_nums;"l008";"remove"
call quest_data_a;clean_quest_data_by_nums;"l008";"remove"
call quest_data_b;clean_quest_data_by_nums;"l008";"remove"
call quest_data_c;clean_quest_data_by_nums;"l008";"remove"
call quest_data_d;clean_quest_data_by_nums;"l008";"remove"
call quest_data_e;clean_quest_data_by_nums;"l008";"remove"
call quest_data_f;clean_quest_data_by_nums;"l008";"remove"
call quest_data_g;clean_quest_data_by_nums;"l008";"remove"
call quest_data_h;clean_quest_data_by_nums;"l008";"remove"
call quest_data_i;clean_quest_data_by_nums;"l008";"remove"
call quest_data_j;clean_quest_data_by_nums;"l008";"remove"
call quest_data_k;clean_quest_data_by_nums;"l008";"remove"
call quest_data_l;clean_quest_data_by_nums;"l008";"remove"
call quest_data_m;clean_quest_data_by_nums;"l008";"remove"
call quest_data_n;clean_quest_data_by_nums;"l008";"remove"
call quest_data_o;clean_quest_data_by_nums;"l008";"remove"
call quest_data_p;clean_quest_data_by_nums;"l008";"remove"
call quest_data_q;clean_quest_data_by_nums;"l008";"remove"
call quest_data_r;clean_quest_data_by_nums;"l008";"remove"
call quest_data_s;clean_quest_data_by_nums;"l008";"remove"
call quest_data_t;clean_quest_data_by_nums;"l008";"remove"
call quest_data_u;clean_quest_data_by_nums;"l008";"remove"
call quest_data_v;clean_quest_data_by_nums;"l008";"remove"
call quest_data_w;clean_quest_data_by_nums;"l008";"remove"
call quest_data_x;clean_quest_data_by_nums;"l008";"remove"
call quest_data_y;clean_quest_data_by_nums;"l008";"remove"
call quest_data_z;clean_quest_data_by_nums;"l008";"remove"
这样就能清除所有玩家解过 l008 这个任务的纪录。
做完后下底下指令
> grep -n l008 *
Grep: No pattern matches found.
这样就确定了所有玩家解过 l008 的纪录均已清除。
> look mirror
请输入次元镜密码: rocky
> l
[/u/p/ppl/hiei/rocky/027 ]
洛奇村─中央广场
村里的房子沿着道路整齐地排列著,常常看到有冒险者出入于这
里的旅店,石板铺成的道路则结著薄薄的冰霜。
明显出口有: south, north, east, 和 west.
(!quest)Lv200.圣诞老人(Santa Claus)
这样所有玩家就都能再接圣诞老人给的任务。
> quest claus about ?
quest: 与 claus 有关的关键字有“圣诞礼物、xmas”等。
> quest claus about xmas
圣诞老人: 最近有一群邪恶圣诞老人,用我的名义四处欺骗小孩子
圣诞老人: 我本来想亲自去抓他们的,可是我老了,跑不动了
你: 我也觉得他们很可恶,交给我吧!
圣诞老人用慈蔼的眼神仔细地端详了你一下。
圣诞老人: 好吧,那就拜托你了,他们虽然看起来模样凶恶,其实很弱的
圣诞老人: 因为其实他们是圣诞袜变成的,话说,很久很久以前...
你: 故事不重要啦,告诉我怎么换礼物就好。
圣诞老人: 呵呵....好吧,只要集满 3 双圣诞袜就可以了。
圣诞老人: 只要集满了 3 双就可以再来 quest 我。
圣诞老人: 每 3 双的圣诞袜,可以换一个圣诞礼物喔。
> quest claus about xmas
圣诞老人帮你施了强力法术。“圣诞节快乐唷 ^_^”
你还没集满三双圣诞袜喔。
> a
第[120]级 抠顶机器(Laechan:进阶刀客)
主要武器:砂锅大的拳头
攻击力:603X 战斗速度:1500X 命中力:673X
躲避力:862X 防御力:1934X
如果你有发现数值是负的情况,就请 quit 再进来一次。
1.圣诞buff:魔力(9X) 力量(9X) 气劲(9X) 敏捷(9X) 理性(9X) 感性(9X) 30 分钟
目前开放所有等级 20 以上的玩家可至 rocky 村接任务并让
圣诞老人可以帮你上 buff。
邪恶圣诞老人待接近圣诞节时再开放。
该任务最多可接三次的样子。
完成任务会执行以下两行程式:
ppl->vobjs("add","f801",-3); // 清除 3 双圣诞袜
ppl->vobjs("add","f802",1); // 拿到 f802 虚拟物品
> ob view f802

Links booklink

Contact Us: admin [ a t ] ucptt.com