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