作者laechan (小太保)
看板mud_sanc
标题[wizs] 任务物件说明书
时间Thu Apr 26 12:03:01 2012
所谓的任务物件,例如 n000 这个任务,其任务物件假设也
叫 n000,基本说明如下..
一、每一个任务物件都会 inherit quest_d.c
二、每一个任务物件都有宣告一个 mapping quest_data,
但依据我的写法,你并不需要去知道其结构如何,只要
知道读取各项 key 值的方法(函数)即可。
三、每一个任务物件还有宣告 void create(),这代表这个
任务物件是可以暂存东西用的,例如..
n000->set("tmp_data/"+ppl->query("name"), bla bla...);
比方说我们有需要暂存一些东西时就可以这样做,在该
物件 reborn 或是系统 shutdown 後其值就会消失。
====================================================
因此关键在 quest_d.c,这篇其实就是在讲这个。
int check_nonseq(string names,string qq,int s,object ob);
这个函数的主要用途是做 nonseq 的相关判断,其关键参数
就是 s(names 已把 qq 这个任务解到第几步骤)
1.它判断到该任务有 nonseq 时,会自动在玩家的任务资料
上新增 quest_temp,使用 quest query 指令可以看到这
个 quest_temp 的结构。
2.nonseq允许设定两组以上。换言之,你可以设定这个任务
的第 a1~b1 步骤是 nonseq、然後第 a2~b2 步也是nonseq
,我没有实测,不过理论上是可行的。不过建议nonseq之
间至少隔一个任务步骤(如 2~5,7~10)
3.这个函数可以传回玩家在 nonseq 里面的未解部份,例如
说当 nonseq=2~7,玩家已解第 2,4,6 步骤时,它就传回
({3,5,7}) 这个阵列。若玩家把第 2~7 都解过了(不用照
顺序),就传回 ({-7}) 这个值(用负的代表都解过了)。
int check_max_nonseq(int n);
比方 n000 设定 2~7 是 nonseq,它的意思就是玩家解完第
一步骤後,到第 7 步骤为止其顺序是可以随意的。
而比方你已经解到第 5 步骤了,这个函数可以传回 7 这个
值(也就是 nonseq 范围的最大值, 2~7, 那自然是 7)
而如果给定的范围不在 2~7 之间,就传回 0。换言之这个
函数就是用来判断你是不是已经解到了 nonseq 所包含的范
围。
(是的话,就不能要求你必须照顺序来解的意思)
int check_test();
这个函数是判断该任务物件是不是 wiz 测试用任务物件,它
主要是判断 test 这个参数,比方 l003 的 test 就设成 1
,就代表它是任务物件。
其实 test 只要有设(不管设 0 设 1),它就会判断为测试用
,这点要特别注意,判断为测试用时它会传 1 回来。
然後底下以 n000 为例,来说明一些简短的函数
// 取得 quest_data.c 这个物件(它会去读特定目录的档案)
// 这东西就是用来存取玩家的任务已解/未解资料用的
object get_quest_data_ob();
// 取得 quest_data 这个 mapping 参数, 就是读取所有的
// 任务设定资料的意思, 通常不建议这样做
mapping query_quest_data();
// 传回这个任务物件设定的 keyword。当设定两组以上的
// keyword 时就传回阵列, 例如 n000 的 key 是
// ({"newbie quest","新手任务"})
// 其对映的值是 key
mixed query_quest_key();
// 传回这个任务的「前置任务」,这个设定也很重要,可
// 以让 wiz 设定要解哪些任务前,必须先解哪些前置任务
// 其对映的值是 front,比方 front=n001;n002,代表要
// 解 n000 前要先解 n001 及 n002。玩家在 quest n000
// 时自动显示玩家需先解什麽任务。
mixed query_quest_front();
// 传回该任务总共设定了几个步骤,其对映值是 steps。
int query_quest_steps();
// 传回这个任务总共可以被玩家解几次,其对映值是 times.
// 有设的话就传回它可被解几次, 没设的话就传回 1(只能解一次)
// times 参数在任务有设 repeat 时是无效的(代表可解无限多次)
int query_quest_times();
// 传回这个任务有没有设定可解无限多次,其对映值是 repeat。
// 有设的话就传回其设定的值(所以设 0 代表没设),没设传回 0
int query_quest_repeat();
// 这东西跟上面的 check_test 是类似的
int query_quest_test();
// 传回任务的正式名称. n000 是代号, "在新手村生活的第一步"
// 就是 title,其对映值是 title。
string query_quest_title();
// 传回任务的作者. 若没有作者就会传回「无名氏」。
// 其对映的参数是 author
string query_quest_author();
// 传回该任务的 date 标记。它可以当成「需重置的标记」,例
// 如说该任务在 2012/04/25 开放玩家解,但是 04/26 时你发现
// 该任务必须更动,且更动後玩家必须重解时,就更动 date 这
// 个标记,例如改成 2012/04/26,这样玩家就必须重解该任务。
// 换言之这个 date 不一定只能设成日期格式。
string query_quest_date();
// 传回该任务第 s 步骤的对映 npc 或物件,例如 n000 这个任
// 务的第 1 步骤是找 musi 对话,这时就传回 musi 的完整路径
// 档名。其对映值就是 stepX_npc,X 代表第几步骤。
string query_quest_npc(int s);
// 传回该任务第 s 步骤的相关讯息
// 其对映值就是 stepX_msg,X 代表第几步骤。
mixed query_quest_msg(int s);
// 这个设定的用意是,比方某任务设定最多可解三次,
// 你可以设定解到第 3 次时显示不同的讯息跟领取不同
// 的报酬之类的, 这个函数主要是读取讯息
mixed query_time_msg(int s,int times);
void show_quest(object quest_ob,string qq);
void shows_quest(object quest_ob,string qq);
两种不同的任务资料显示格式,shows 显示的是原始资料
,wiz 可透过 quest shows 去观看原始设定,然後再对照
原始脚本,就可以知道脚本跟设定的差异。
show 则是显示编译过的资料。
string query_quest_chat_npc(int s);
string query_quest_chat_msg(int s);
这个函数的对映参数是 chatX_npc 及 chatX_msg,它的设
定意义是,比方某 npc 没有在某个任务的 n 个任务里头
,但是你觉得玩家有可能会去 quest 他时,就可以把他设
进 chatX_npc 里头,任务系统会根据玩家目前已经解到第
几步骤,去读出该步骤对应的 chat_npc,若玩家在此时去
quest 他,可以得到「额外的讯息=chat_msg」。
例如说,某 npc 可能在任务 a 而不在任务 b,而任务 a
是任务 b 的前置,这时在解任务 b 时,该 npc 就不必然
是「不相干的人」。
check_quest(int s,string f,mixed tmp,mapping quest_temp,object npc)
这个函数就是任务物件的核心函数,本来应该更名的但我
忘记了(只好将错就错,原则上它不应该被叫这名字)。
这个函数是用来处理「当玩家解某个任务到第 n 个步骤
时,下一步该做什麽」。
其详细的内容就自行 more quest_d.c 观看即可。
(大部份我都有在程式内注解了)
其它自订函数的部份
这个我目前是倾向将这些自订函数另外收集起来写成一个
xxx.c 档,然後再让 quest_d.c 去 inherit 它。
(这样 quest_d.c 才不会太过肥大)
自订函数就是用来让任务脚本撰写者可以呼叫用的,它将
一呼叫格式化,例如..
ppl->set("up",500);
简化後就变成
set_v(ppl,"up",500);
格式化的用意在於「方便编译」,例如 set_v 就是设定值
,ppl 就是玩家,up 就是学习点数,500 就是值,因此而
可以有底下的结果..
> quest show l001
┌────────────────────────────────┐
│任务奖励: │
│ │
│ 学习点数 500 点。 │
└────────────────────────────────┘
格式化的好处就是方便编译,不过这并不是编译的唯一手段
LAechan
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.81.173.167
※ 编辑: laechan 来自: 111.81.173.167 (04/26 13:44)
1F:推 hlead :意思是无限多次解时要写times=repeat## ?.... 04/26 18:56
2F:→ laechan :repeat=1## (此时似乎就无视time) 04/27 01:36
3F:→ hlead :soga.. 04/27 06:57