作者laechan (小太保)
看板mud_sanc
標題Re: [wizs] mob_record 及 questing 新語法
時間Wed May 9 00:55:31 2012
※ 引述《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)
→ hlead :嗯,上面部分是OK...後面大概懂了,思慮不夠詳盡。 05/09 08:16
→ hlead :另外,stepX_msg有一定要寫嗎?... 05/09 08:26
→ hlead :然後query的第一個..就存任務name吧... 05/09 11:21
→ hlead :另外,quest_data..其實可以解完任務就移除該任務資 05/09 11:22
→ hlead :料?...這樣或許就能省到空間了?... 05/09 11:23
→ laechan :任何一個已解過的任務都會被存在 quest_data 裡 05/09 11:23
→ hlead :比較特別的任務,在額外的寫成不會移除之類... 05/09 11:24
→ laechan :我做字母分散就是為了儲存全部的已解資料 05/09 11:24
→ hlead :那把玩家的已接資料刪除不就好了?... 05/09 11:24
→ hlead :打錯..已接->已解... 05/09 11:25
→ laechan :不會刪除.不然會不曉得玩家到底有解過什麼. 05/09 11:48
→ hlead :我意思是刪除任務店的某些不重要的持續重複殺小怪的 05/09 11:50
→ hlead :任務...這樣就可以不用另外寫?又可以不佔空間? 05/09 11:51
→ laechan :那建議這類任務不要寫成腳本,只用mob_record跟任務店 05/09 12:09
→ laechan :樣本支援即可. 05/09 12:09
→ laechan :我一般的做法是若該殺怪任務是某一任務裡面的某一步 05/09 12:09
→ laechan :驟,我會把它寫進該腳本內,這樣它就只變成一個步驟,而 05/09 12:09
→ laechan :不是一個獨立的腳本 05/09 12:10
→ laechan :我明天實裝未寫的部份,query會特別說明. 05/09 23:03