作者laechan (小太保)
看板mud_sanc
标题Re: [wizs] quest的使用问题
时间Mon Dec 17 21:23:53 2012
※ 引述《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
1F:→ laechan :n000 的 anyone 我先留着, 过几天再移除 12/17 21:24
※ 编辑: laechan 来自: 42.77.33.195 (12/17 21:34)
※ 编辑: laechan 来自: 42.77.33.195 (12/17 21:42)
2F:推 justinj :再来想想看.... 12/18 08:34
3F:推 justinj :不过我还是先将_quest.c,quest_d.c这两个档给分析完 12/18 08:37
4F:→ justinj :毕再来写好了.... 12/18 08:37
5F:→ laechan :或是你将需求讲的更详细一点亦可 12/18 09:20