Re: [wizs] quest的使用問題
看板mud_sanc (Sanctuary - 聖殿)作者laechan (小太保)時間13年前 (2012/12/17 21:23)推噓2(2推 0噓 3→)留言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
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
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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
mud_sanc 近期熱門文章
PTT遊戲區 即時熱門文章
29
45