Re: [wizs] mob_record 及 questing 新語法
看板mud_sanc (Sanctuary - 聖殿)作者laechan (小太保)時間13年前 (2012/05/09 00:55)推噓0(0推 0噓 19→)留言19則, 2人參與討論串3/3 (看更多)
※ 引述《hlead (希多)》之銘言:
: mob_record :([ "na01" : ([ "/d/ppl/fmf/lion/mob/small" : "011111/40",
: "/d/ppl/fmf/lion/mob/white" : "0/15" ]) ])
: 嗯..基本上好像mob_d的地方有寫錯吧...
: 她會變成 "0"+"1"="01" 而非 0+1=1 ....
跟 mob_d.c 的呼叫無關。
quest_data.c 的 mob_record 的 add 區
m=(int)qq3[0];
n=(int)qq3[1];
這寫法是錯的,改成 atoi 就會正確,已改。
: ------------------
: 然後 questing("mob_record","delete","na01",({ppl})); 語法好像還沒寫好。
已寫,cp check 的程式段來改就行了。
: ------------------
: 另外,任務是否完成,要額外寫函式判斷嗎?
: 像是questing("mob_record","finish","na01",({ppl}));之類的...
這語法可以,已新增。
傳回值 > 0 就是已完成。
之所以沒寫是因為用 query 就夠了,通常未完成時順便顯示
未完成原因(如a怪只殺幾隻、b怪只殺幾隻),靠 query 就能
搞定。但是若只是單純要知道有沒有完成,就用 finish。
另外 finish = check_finish
: 還是說自行寫:
: mixed mobs=questing("mob_record","query","na01",({ppl}));
: if(mobs[0][1] < mobs[0][2] || mobs[1][1] < mobs[1][2])
這是原意。不過你應該不能預設該任務你知道要殺幾種怪,
而是要預設「你不知道幾種」。
mixed tmps=({}),mobs=questing("mob_record","query","na01",({ppl}));
int i,j=sizeof(mobs),check=0;
// mobs 是二維陣列, ({ ({"怪物檔",已殺,應殺}), ({"怪物檔",已殺,應殺}), .. })
for(i=0;i<j;i++)
{
// 每一個 mobs[i] = ({"怪物檔",已殺隻數,應殺隻數})
tmps=mobs[i];
if(tmps[1]!=tmps[2])
check=1;
}
// 底下代表若上面有出現不符的情況
if(check>0)
代表任務尚未完全達成;
那如果只是要判斷有無達成,例如在 list 裡面順便就即時
標示有無完成,那用 finish 就足夠。
===============以上均已實裝,以下則尚未實裝===========
: -------------------
: 然後...我在想殺怪狀況要怎麼寫?
: 是 quest mob_record
: 還是 quest mob_record na01 。
: 目前想到的格式:
: 任務編號 怪物名稱 數量
: --------------------------------
: na01 xxxx 10/40
: xxxx 4/15
: na02
: (可是這樣變成說...要存怪物名稱...這東西很麻煩...)
: (雖然可以依照mob路徑,clone出來讀short...不過感覺更麻煩..)
假設用 quest 指令支援,那麼讀取 mob_record 是最簡單的
方法,怪物 clone 出來再 dest 掉即可。
再來就是,更動 set/query/check 等函數,把資料格式改成
mob_record = (["na01":([
"#name":"任務的名字",
"/u/l/.../mob1":"0/20",
"/u/l/.../mob2":"0/30",
]) ]);
也就是在 set 時就順便把任務名稱 set 上去,這樣在做任務
列表時,就不用給玩家看 "na01",在做 set/query/check 時
則略過 "#name" 這個設定即可。
然後 "0/20" 也可以改成 "##怪物全名##0/20" 這種的,那就
不做 explode, 改成..
sscanf(tmp,"##%s##%d/%d",怪物名,已殺,應殺);
概念是類似的,query 出的資料就變成..
({ ({"怪物檔","怪物名",已殺,應殺}),
({"怪物檔","怪物名",已殺,應殺}),
.
.
})
這部份就是看你覺得 ok 不 ok,若你覺得 ok 我星期三就實裝.
Laechan
另外,假設某腳本,執行到第 n 步驟時,訊息顯示要求玩家要
殺某怪物 50 隻...
step(n)_end=
questing("mob_record","set","自訂標記",({ppl,"怪物檔",50}))##
step(n+1)_check=
questing("mob_record","finish","自訂標記",({ppl}))<1
你還沒有滿足要求喔!##
本來這樣寫是可以的,但是如果玩家未達成任務就 quit,則下
次再上時,因為 quest_data 已紀錄玩家已經達成步驟 n,而玩
家身上卻又無 mob_record,就會造成「任務無法重接」,所以
需要一個可重接任務的設計。
它的做法就是在 other 區自訂 step(n+1)_check, 即如下..
other=
int step(n+1)_check(object ppl,object npc,string key)
{
// 代表玩家 quit 過, 這時就重設 mob_record
if(questing("mob_record","check","自訂標記",({ppl}))<1)
questing("mob_record","set","自訂標記",({ppl,
"怪物1",幾隻,"怪物2",幾隻,... }));
if(questing("mob_record","finish","自訂標記",({ppl}))<1)
{
任務尚未達成;
return 1;
}
任務已經達成;
return 0;
}##
所以 mob_record 是可以支援現行任務腳本的「某一步驟要求
的殺怪任務是否達成」的判斷的,other 就是為了這個存在。
Laechan
※ 編輯: laechan 來自: 122.117.11.103 (05/09 01:10)
→
05/09 08:16, , 1F
05/09 08:16, 1F
→
05/09 08:26, , 2F
05/09 08:26, 2F
→
05/09 11:21, , 3F
05/09 11:21, 3F
→
05/09 11:22, , 4F
05/09 11:22, 4F
→
05/09 11:23, , 5F
05/09 11:23, 5F
→
05/09 11:23, , 6F
05/09 11:23, 6F
→
05/09 11:24, , 7F
05/09 11:24, 7F
→
05/09 11:24, , 8F
05/09 11:24, 8F
→
05/09 11:24, , 9F
05/09 11:24, 9F
→
05/09 11:25, , 10F
05/09 11:25, 10F
→
05/09 11:48, , 11F
05/09 11:48, 11F
→
05/09 11:50, , 12F
05/09 11:50, 12F
→
05/09 11:51, , 13F
05/09 11:51, 13F
→
05/09 12:09, , 14F
05/09 12:09, 14F
→
05/09 12:09, , 15F
05/09 12:09, 15F
→
05/09 12:09, , 16F
05/09 12:09, 16F
→
05/09 12:09, , 17F
05/09 12:09, 17F
→
05/09 12:10, , 18F
05/09 12:10, 18F
→
05/09 23:03, , 19F
05/09 23:03, 19F
討論串 (同標題文章)
完整討論串 (本文為第 3 之 3 篇):
mud_sanc 近期熱門文章
PTT遊戲區 即時熱門文章