mud_sanc 板


LINE

其實聖殿大部份的 wiz 也都具備了中階 LPC 的 70% 能力,很多 很像知識性的東西其實不用研究的那麼深也會用,只不過要你講它 的架構啦、理論之類的就不知從何講起。 可以去研究啦..我是覺得 socket_xxx 之類的東西蠻可以研究的。 (我太懶了所以不會用,不過 nobu 會,可以問他) 這兩章講的東西,底下做一個補充說明,其實重點在第二章。 每到遊戲管理者設定的週期, driver 呼叫 reset() 函式 這個通常在 driver 存在的 bin 目錄下的 config.xxx 中設定 ,但有的 mud 會自訂 reset 方式,例如聖殿在 weather_d.c 中去做的就是其中的一種。 driver 定義了一套稱為外部函式的函式 這個我稱之為「天外飛來的」函數,如 this_player(),每個 wiz 都會用,那現在你至少應該知道它的架構應該類似.. varargs object this_player(int i) { return 一個啥小給你; } 若是 driver 定義的就是 efun,若是我們 wiz 自己擴充的,  就是 simul_efun,這個通常匯集在 /adm/obj/simul_efun.c  中,它的架構類似.. #include "/adm/simul_efun/xx1.c" #include "/adm/simul_efun/xx2.c" . . . 重點不是匯集了幾個 .c,而是匯集了寫在這些 .c 中的函數 ,例如 chinese.c 裡頭就定了一堆跟 chinese 相關的函數  ,如 skill_name、to_chinese、chinese_number、...等。 有些東西適合寫成全域函數,這個以後提到家族時會順便介紹 一旦遊戲啟動, 並且正確地執行功能, driver 就進入一個迴圈  這個我的簡易解釋是「心跳」,你可以想像一個程式被執行且  常駐了,它每一週期時間就會「跳」一下,人在每個心跳期間  會做一些事,例如打字、挖鼻孔、說一句話、看美眉、.....  同樣的 driver 在每心跳期間也會做一些事,有些是它固定會  做的,有些就看它有沒有接受到什麼額外的命令。 文裡也有提到「在週期結束時, 呼叫每一個有 heart_beat() 函式的物件」,所以解讀為 driver 的心跳應該沒啥問題XD  那,這個週期是可以控制的,聖殿原本跟其它 mud 一樣設定  每秒跳一下,但某個時間點開始就改成了每兩秒設一下。 在玩家物件中有一個叫做 "cmd_hook()" 的函式  這個東西放在 /std/user.c 中,我是最近一兩年才去瞭解它  是啥(我很懶,會用就好XD),簡單的說,我們要設定一個房間  可以在它裡頭下啥指令,用 add_action,我們會給一個指令。  問題:那有沒有更溯源的指令指定方式,我只要有下指令它都     能知道?  用的就是 cmd_hook,例如你在某房間的 init() 加上底下的  東西.. add_action("cmd_hook","",1); 然後再加上底下的函數... int cmd_hook(string cmd) { string verb=query_verb(); write("cmd="+cmd+", verb="+verb+"\n"); return 0; } 然後你在該房間下 look here > look here cmd=here, verb=look 上面至少學到了 query_verb() 就是讀出你現在下的指令是啥  ,然後你如果要直接在「玩家下啥指令」的部份做一些過濾或  特殊處理的話,方式就類似上面那樣。  要注意的是 return 1 跟 return 0,上例是 return 0,它的  意思就是「不管你下了啥指令,我先秀出 verb 跟 cmd,然後  再執行它原先要執行的東西」,例如我下 look here,它先秀  給我看,然後才顯示下 look「原先會產生的結果」。 各位在自己測試時千萬別用 return 1 嘿,不然就要雙開進來  救自己哩。 set_heart_beat (heart_beat) 與 call_out 各位 wiz 們應該知道 call_out 用太多對聖殿不好,有些處理  方式我們都已經改在物件中使用 heart_beat 來處理了。 文裡提到「有心跳的物件越多, mud 每個週期需要處理的時間 也就越久.有心跳的物件已知是 mud 貪求 CPU 時間最主要的 因素.」  有個 mud 的 imm 曾問過我怎麼讓 mud 的負荷人數可以提高,  我給它的其中一個建議,就是「怪物不一定都要有心跳」,我  忘了哪個 mud 了,不過它說那樣做之後確實產生了明顯的效果 聖殿某些戰爭採用底下的寫法.. call_out("call_mob_group1",5); call_out("call_mob_group2",10); call_out("call_mob_group3",15); 我沒記錯的話在聖殿,dfire 第一次採用這樣的寫法,我之後的  世紀末戰爭也使用類似的寫法。程式執行到上面時,它就一次排  了三個排程:五秒後怎樣、十秒後怎樣、十五秒後又怎樣  早期的寫法則是串接式的,我們知道 5 秒後它會呼叫 group1,  所以我們在 group1 的最底下加上.. call_out("call_mob_group2",5); 這樣 5 秒後它先執行 group1,「再五秒後」才執行 group2。  這兩種寫法的差異就是「一次」被寫入 driver 記憶區的量,後  者會比較少,而且 5 秒後呼叫 mob_group1 後,原先被寫入的就  釋出,然後才寫入新的東西。 按 callouts 指令時就可以顯示目前有幾個 call_out 排程。 兩者依目前電腦的規格來說其實差別已經不太大,要採用簡易的  寫法自然以 dfire 的寫法較好,但根據理論,它對 driver造成  的負擔會比較大一點點。 而以目前來說其實給予戰爭系統「心跳」,就可以很大一部份取  代掉 call_out 的大量使用,這也不失為一個好的方式。 Laechan --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.170.228.153







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