Re: [wizs] 成就系统

楼主: laechan (挥泪斩马云)   2015-10-29 12:24:31
我大致思考了一下可行的做法。
首先,假设有 achieve 指令,则必然有 achieve list 这样的东西
来显示现在共有哪些成就。
则比较简易的做法就是宣告一个 mapping
mapping achieve=([
"a001":(["title":"徒步走到泰帕依城",
.
.
]),
]);
但是因为成就系统需要储存的东西其实不多,而且还要兼顾顺序性
,而且 title 可另外存到 chinesed.c 里头,而且还要做分类,
因此可改成 mixed..
mapping achieve=([
"area":({
// 徒步走到泰帕依城
({"a001",......}),
// 徒步走到试炼窟第10层
({"a002",......}),
}),
"skill":({
// n个技能达到9900
({"a003",......}),
}),
]);
但是考虑到以后,这东西不能用“宣告”的,而必须写指令让 wiz
操作来增删及修改资料,但大致的资料结构是这样没错。
那么指令的格式就类似底下
> achieve add area call laechan_area_func var 走到泰帕依城
你设定达成编号 a001 成就时会呼叫 laechan_area_func() 函数
上面的指令将把底下的资料设定加到 achieve["area"] 里头:
({"a001","laechan_area_func","走到泰帕依城","设定时间"})
其中 a001 是由 achieve 指令依目前 aXXX 的指派状况来指配的,
这样 wiz 就不用担心目前已经用到 a 多少,而它属于 a 多少也不
是重点,只要知道会有一个编号指向它即可。
使用二维阵列的好处也方便做排序,例如 list area 时它会依现有
的顺序列表,类似 note list,而 note 就是采可排序的写法。
那么 achieve del 的情况呢,只要给编号即可,这时该编号就会空
出来,当 wiz 新增新的成就时,该编号就有可能被指配进去。
那要如何判断这个新编号指的是一个新的成就呢?依靠的就是上面
的“设定时间”,用这个参数来判断该成就有没有被重新 assign
过,若有被重新 assign 过,玩家在获得该成就前会先被删除曾达
成该成就的标记。(也就是利用 quest 里头的 date 参数)
那么 laechan_area_func 及 "走到泰帕依城" 又是什么呢,它的
意思就类似底下:
int laechan_area_func(object ppl_names,string marks,string titles,string times)
{
// 先判断玩家有没有旧标记资料
// 每一个 wiz 自订函数都必须先呼叫这一行
check_times(ppl_names,marks,times);
// 再来就能依 str 开始写自订成就报酬
switch(titles)
{
case "走到泰帕依城":
.
.
// 呼叫范例
questing("set",ppl_names,marks,({"times",1}));
questing("set",ppl_names,marks,({"date",times}));
break;
}
// 最后一定 return 1
return 1;
}
以这样的写法,wiz 就不需要管说该成就是哪一个 aXXX,因为
有自订描述该成就的 titles。
而 title_name 全域函数,则会去 achieve.c 里头找说 aXXX
这个成就的 titles 是什么。
(这样就不需要 chinese a001=achieve=走到泰帕依城)
所以由上可知,需要一个 _achieve.c 函数以及 achieve.c 物
件来存 achieve.o 资料档,就能弄出成就系统的雏型,剩下的
就由各 wiz 依自己的需要来撰写函数,再让 achieve.c 来做
inherit 即可,比方在 /open/cmds/achieve 目录下可能有
/open/cmds/achieve:
achieve.c achieve.o sample.c laechan.c
↓ ↑ ^^^^^^^^^ wiz 自己建的
让它 inherit laechan.c 各自建档需共同 inherit 的
像我就可以在 laechan.c(inherit sample.c) 里面自己写所需
的各函数例如 laechan_area_func、laechan_skill_func 等。
而 sample.c 则提供像是 check_times 这类的共通函数,甚至
可提供其它方便函数例如“叫出未鉴定防具并直接鉴定”“给
玩家物品顺便设定认主”......
也就是说先在 laechan.c 写好 switch 判断,再去对映的地方
写好判断函数(例如徒步走到泰帕依城需要修改区域房间),再用
achieve 指令设定成就....这样该成就就新增完成。
上面只有一个问题:为了新增“徒步走到泰帕依城”这个成就,
就一定得去修改区域房间吗?
只有这个我到现在还没有答案。“不必修改区域房间”的走向
则是确定的,为此就必须有玩家曾经到过某房间的额外判断方
式,而且不能造成系统过大的负担,还必须适用新型态区域的
房间产生方式。
LAechan

Links booklink

Contact Us: admin [ a t ] ucptt.com