Re: [wizs] quest的使用問題

看板mud_sanc (Sanctuary - 聖殿)作者 (小太保)時間13年前 (2012/12/17 21:23), 編輯推噓2(203)
留言5則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《justinj (黑旋風)》之銘言: : 我只是想要問這個要怎麼用quest使用.. : 然後提議一下增加... : 1.提議腳本要增加的... : marco 巨集(因為到時還是要移資料夾..所以希望加這個) : marco= : MOB_NAME abcde : OBJ_NAME $HIR$ccc$NOR$ : ROOT /u/j/justinj/area2/dark/mob/ : ## 已加上,大抵上設定方式同 xxx.h 檔裡面的設定法, 即 macro= #define MOB_NAME "abcde" #define OBJ_NAME "$HIR$ccc$NOR$" #define ROOT "/u/j/justinj/area2/dark/mob/"## 目前用 /open/cmds/quest/n/n000 (即新手任務) 當測試。 > more n000.c :::::::::::::: /open/cmds/quest/n/n000.c :::::::::::::: #define OOXX "ooxx" #define ABCD "abcd" inherit "/open/cmds/quest/quest_d.c"; . . 你亦可建議是否有比 macro 更適合的參數名。 (我是認為 include= 或 define= 也不錯, macro 則 是比較業界的語法) : 類似這樣 : 2. : 就是目前要寫的任務過程像這樣 : step1:quest here : step2:quest A : step3:quest B : step4:quest here(滿足條件X) : step5:quest A(滿足條件Y) : step6:quest B(滿足條件Z) : step7:quest A(滿足條件W) : step8:quest B(滿足條件W) : step2,step3至少要執行一個(也就是說可以只執行3不執行2) 可以透過設定 nonseq 的方式模擬,在 nonseq 進行中 玩家的 quest data 會增加一個 quest_temp 的參數: > quest query laechan n000 quest: ({ "n000", 1, 0, "2011/10/02" }) ([ "3" : 0, "2" : 0, "4" : 0, "7" : 0, "6" : 0, "5" : 0 ]) 那麼適當的模擬做法,就是只要你「已經」找了它們裡 面的其中一個,就把 quest_temp 全部填滿,並把step 設成最後一個 7。 因此,我新增了一個 anyone=a-b## 的語法。這個語法 一定要跟 nonseq 並存,單獨存在時將不 work。 我用新手任務做測試 > quest effie about 新手任務 道具店老闆伊菲: 你好啊, 陌生人 你: 您好, 謬西先生叫我來跟您打聲招呼 ^_^ 道具店老闆伊菲: 啊, 是這樣啊, 你好, 我叫伊菲, 是這兒的老闆 道具店老闆伊菲: 我們店裡有賣許多道具, 有需要的話就常常來這光顧吧! > quest query laechan n000 quest: ({ "n000", 7, 0, "2011/10/02" }) ([ "3" : 1, "2" : 1, "4" : 1, "7" : 1, "6" : 1, "5" : 1 ]) 上面就可以實現 1.步驟 a-b 可任意決定順序 2.一旦選了其中一個,就視為全部都解 再透過 stepX_end 的設定,還可以額外設定玩家究竟 選了哪一個 stepX_end= ppl->set_temp("相關參數_X",1)## : 7,8是不分先後順序(當成一組) nonseq : 4~7是各路線(4路線,只要走一個其它路線就沒了) : 條件X = Y and Z : 那這樣要怎麼做 step4:quest here(滿足條件X) 用 step4_check 去做。如果條件 X 很複雜就自訂 step4_check 函數。 : step5:quest A(滿足條件Y) : step6:quest B(滿足條件Z) : step7:quest A(滿足條件W) : step8:quest B(滿足條件W) 通通可以用自訂函數就能解決。然後看滿足了什麼條件 ,透過額外的 ppl->set_temp 方式來支援亦可。 : (ps.雖然我打字打完想到一個方法..但還是po出去好了...) : 我想的那個方法還是不行 : quest A,quest B都要有反應才行... : step3後 : 一開始能 quest A,quest B : 只滿足Y 只能quest A : 只滿足Z 只能quest B : 滿足X(Y && Z) 只能quest here : 條件W是其中一項時不滿足X,Y,Z 你必須知道新的 quest 系統的撰寫用意就是「任務撰寫 的簡單化」,而不是「可以用它來寫出複雜的任務」。 原因是因為這類任務「非常少」,為了極少數這樣的任務 而去大幅度更改系統使之可以套用,是非常沒效率的做法 ,而且有產生 bug 的風險。 所以我建議,你將任務簡化到「至少自訂 stepX_xxx 函 數就可以搞定」的程度,不然,就依我之前那一篇所寫的 「任務設定原則」去做。 我不太想再動目前任務系統的主因,是因為添加了新東西 進去時「有可能造成不可預期的 bug」。加 anyone 進去 已經很危險了,但幸好我原先的程式寫法可以預期不會產 生新的 bug: // 原本就有的 if(quest_temp=quest_data_ob->query_quest_temp(t1,qstr)) { if(!undefinedp(quest_temp[""+s1])) quest_temp[""+s1]=1; // 底下起為本次增加的部份 // 它的增加條件就是一定要有 nonseq if(exp=(mixed)quest_ob->query_quest_anyone(t1,qstr)) { foreach(tmps in exp) { // 再用這個來限定 quest_temp 的修改範圍 if(s1>=(int)tmps[0] && s1<=(int)tmps[1]) { for(i=(int)tmps[0];i<=(int)tmps[1];i++) quest_temp[""+i]=1; quest_data_ob->set_quest_data(t1,qstr,i-1,tt,tmp); } } } } 趁現在 quest 還算穩,希望你在寫任務時可以轉個彎,把 原先 quest 系統無法做出來的東西,透過修改一下條件或 行進方式,再運用 nonseq, anyone, ... 等設計,來讓它 變得可行。 你可以使用數學系的想法,某複雜函數 2 f(x) = ax + bx + c 它可以使用兩個「簡單的東西」,再用 x 這個運算來合成 f(x) = (ax+b)(cx+d) <= 兩個一維的簡單東西一樣可組合出一個二維的複雜東西 這跟 random(10000) = random(100) x random(100) 的做 法是一樣的意思。 Laechan -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 42.77.33.195

12/17 21:24, , 1F
n000 的 anyone 我先留著, 過幾天再移除
12/17 21:24, 1F
※ 編輯: laechan 來自: 42.77.33.195 (12/17 21:34) ※ 編輯: laechan 來自: 42.77.33.195 (12/17 21:42)

12/18 08:34, , 2F
再來想想看....
12/18 08:34, 2F

12/18 08:37, , 3F
不過我還是先將_quest.c,quest_d.c這兩個檔給分析完
12/18 08:37, 3F

12/18 08:37, , 4F
畢再來寫好了....
12/18 08:37, 4F

12/18 09:20, , 5F
或是你將需求講的更詳細一點亦可
12/18 09:20, 5F
文章代碼(AID): #1GpnpiCb (mud_sanc)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1GpnpiCb (mud_sanc)