Re: [wizs] mob_record 及 questing 新語法

看板mud_sanc (Sanctuary - 聖殿)作者 (小太保)時間13年前 (2012/05/09 00:55), 編輯推噓0(0019)
留言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
嗯,上面部分是OK...後面大概懂了,思慮不夠詳盡。
05/09 08:16, 1F

05/09 08:26, , 2F
另外,stepX_msg有一定要寫嗎?...
05/09 08:26, 2F

05/09 11:21, , 3F
然後query的第一個..就存任務name吧...
05/09 11:21, 3F

05/09 11:22, , 4F
另外,quest_data..其實可以解完任務就移除該任務資
05/09 11:22, 4F

05/09 11:23, , 5F
料?...這樣或許就能省到空間了?...
05/09 11:23, 5F

05/09 11:23, , 6F
任何一個已解過的任務都會被存在 quest_data 裡
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
那建議這類任務不要寫成腳本,只用mob_record跟任務店
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
我明天實裝未寫的部份,query會特別說明.
05/09 23:03, 19F
文章代碼(AID): #1FgL060f (mud_sanc)
文章代碼(AID): #1FgL060f (mud_sanc)