[節慶] 聖誕節任務開放重新接取

作者: 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