mud_sanc 板


LINE

我大致思考了一下可行的做法。 首先,假設有 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 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 210.61.157.53
※ 文章網址: https://webptt.com/m.aspx?n=bbs/mud_sanc/M.1446092674.A.539.html







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Soft_Job站內搜尋

TOP