作者laechan (挥泪斩马云)
看板mud_sanc
标题[节庆] 圣诞节任务开放重新接取
时间Tue Dec 19 12:27:42 2017
以下也供 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
--------------------------------------------------------
圣诞节礼物箱(物品编号: f802)
--------------------------------------------------------
单位:个
型态:节庆物
携带:9 / 10
价格:10
掉落:无
贩卖:不可
交换:不可
一个礼物箱,你可以使用 ob use 圣诞节礼物箱 指令来开启它。
--------------------------------------------------------
物品资讯:虚拟物品
> ob use 圣诞节礼物箱
你开启了礼物箱,里面装了一颗蓝宝石。
> ob view 蓝宝石
--------------------------------------------------------
蓝宝石(物品编号: m814)
--------------------------------------------------------
单位:颗
型态:怪掉落
携带:1 / 99
价格:1000
掉落:无
贩卖:可
交换:可
一颗蓝宝石,可向收集品商人购买。
--------------------------------------------------------
> 10 ob use 圣诞节礼物箱
你开启了礼物箱,结果里面又装了一个礼物箱。
你: ......
你开启了礼物箱,里面装了一颗绿宝石。
你开启了礼物箱,结果里面又装了一个礼物箱。
你: ......
你开启了礼物箱,里面装了一颗红宝石。
你开启了礼物箱,结果里面又装了一个礼物箱。
你: ......
你开启了礼物箱,里面装了一颗%敏捷大补丸%(Dex Pill)。
你开启了礼物箱,结果里面又装了一个礼物箱。
你: ......
你开启了礼物箱,结果里面又装了一个礼物箱。
你: ......
你开启了礼物箱,结果箱子里是空的。
你: ......
你开启了礼物箱,结果里面又装了一个礼物箱。
你: ......
10连开大概是这样,礼物箱装的东西,我有空再改,改完会
公告(同时公告开放打邪恶圣诞老人)。
LAechan
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 122.117.106.224
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/mud_sanc/M.1513657666.A.7D6.html
补充一下,如果不想清除 quest_data_X.c 所储存的玩家已解过
某任务的资料,也有变通做法,就是直接改任务脚本,把里头的
date 日期换一下,然後再重新 quest read 脚本档 载入修改後
的脚本,这样当玩家去 quest ooo about xxx,它会比对脚本的
date 与玩家的 date,若不一致时就会重置玩家解过该任务的纪
录。
date 我通常做为脚本档撰写日期,所以若是不想动 date,才去
清除所有玩家解过该任务的标记。
※ 编辑: laechan (122.117.106.224), 12/24/2017 20:16:09