Re: [心得] 區域寫作 mob_prog

看板mud_mars (瑪爾斯群英傳)作者 (Eplis)時間12年前 (2013/01/12 20:51), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/3 (看更多)
mob_prog = mob_program 即 mob 的動作程式,舉凡是給它錢 告訴他什麼話,給他什麼東西都是由這邊操控,這是最簡易版的 程序控制,不需要真正寫到程式,但是也是一連串的邏輯控制就是了。 以下是一個例子 巨型野兔(huge hare) >fight_prog 100~ if rand(25) mset hare level 5 emote 咚!咚!咚!跳到了你的面前 bare multi $n mset hare level 11 endif ~ >death_prog 100~ mpjunk all if rand(10) mpoload 5601 10 break endif if rand(35) mpoload 5608 1 mpecho 你發現腳邊有一個土堆! endif ~ | 兔子的動作主要分兩種 program,分別是 fight_prog 與 death_prog program 種類有很多,格式是這樣: 注意! 任何prog內禁止使用tab、全形空白,compiler絕對不會報錯 但是你的prog內容會完全無效!! >[prog_type] [argument]~ ~ >是prog進入點 [prog_type]rog 種類,總共有以下 1. SPEECH_PROG //說話程式 2. RAND_PROG //隨機啟動程式 3. FIGHT_PROG //戰鬥程式 4. DEATH_PROG //死亡時啟動程式 5. HITPRCNT_PROG //mob血量百分比程式 6. ENTRY_PROG //生物進入房間起動的程式 7. GREET_PROG //生物見面啟動程式 8. GIVE_PROG //被給予時啟動程式 9. BRIBE_PROG //被給錢時啟動程式 1. speech_prog 就是你告訴他什麼話時會啟動的程式,例如 >speech_prog [p] 給我錢~ say 才不要咧! ~ 當玩家 "tell mob 給我錢" 的時候,NPC會說"才不要咧!" [p] 參數為了良好的程式習慣,就都要加就對了! 2. rand_prog 就是mob會不斷的隨機一個亂數,然後執行這段程式 >rand_prog 50~ say 耶 50% 機率可以說話! ~ 嗯,沒錯!後面接的參數就是機率!這個 rand_prog 每個 tick 就會執行一次亂數,所以是非常吃系統資源的,我自己是完全禁 止使用這種prog,沒意義也沒效率 3. fight_prog 就是戰鬥的動作,後面接的也是參數。例如: >fight_prog 100~ say 竟敢打我! ~ 這個例子不是很好,因為它每一回合都會說一次 "竟敢打我!" 機率是 100% 嘛!來應用一下剛剛兔子的prog >fight_prog 100~ if rand(25) mset hare level 5 emote 咚!咚!咚!跳到了你的面前 bare multi $n mset hare level 11 endif ~ 這邊就是每回合都會進入這個戰鬥程式,第二行的 if rand(25) 代表有 25%的機率會進入這個條件,if 當然要用 endif 包起來,這就是程式的 概念,所以要寫難度高的、複雜的prog建議要有基礎的程式底子。 mset xxxx 是 mob 動作,這是改變兔子等級到 5 級,然後使用 bare multi 使用完後再改回 11 級,因為等級太高打玩家會太痛XD 4. death_prog 死亡時會啟動的程式,一樣用數字當作機率參數。 >death_prog 100~ mpjunk all if rand(10) mpoload 5601 10 break endif if rand(35) mpoload 5608 1 mpecho 你發現腳邊有一個土堆! endif ~ 這個例子稍微複雜一點,死亡時清空身上的裝備(mpjunk all),這邊使用 mpjunk 而不是 mppurge,請注意以後清東西請用這個指令,不要再用mppurge if rand(10) 有10%機率會產生(mpoload) 5601 這個物品 break 則是直接結束整個 death_prog if rand(35) 有35%機率產生 5608,且在房間廣播 "你發現腳邊有一個土堆!" 某個很難打的重要戒指 death_prog 很簡單, >death_prog 5~ mpoload xxx 1 ~ 這樣就了解了 5.hitprcnt_prog 血量比例程式, 當 mob 的 hp 低於某百分比時所進行的prog >hitprcnt_prog 50~ say HP低於一半啦! ~ 不過通常不會單獨使用,而是用另外一種方式出現在其他 prog 裡面 例如在 fight_prog 裡面常用 if hitprcnt($i) < 50 say 我的血量低於一半,開始變身! mset eplis level 130 endif 這邊就是龍王不斷變強的秘密(?),每到一定的血量就提升自己的等級 6. entry_prog 基本上就是玩家進入這格房間會驅動的程式 >entry_prog 80~ say 我有80%的機率跟你打招呼喔! ~ 簡單易懂,除非特殊情況,不然我覺得這個部分其實跟 greet_prog 蠻重疊的 7. greet_prog 碰到該mob會觸發的程式, >greet_prog 100~ say 您好歡迎光臨! ~ 通常作服務業賣商品的都要很有禮貌,所以都會作類似這種 prog 不過有時候NPC進到商店,理論上 NPC 不可能跟 NPC 買東西吧! 所以都還會加一個判斷式,判斷是不是人,阿不是啦!是不是玩家 8. give_prog 玩家給予物品時會觸發的程式,要記得物品名稱是完整名稱喔 >give_prog dragon pearl~ say 哇!這麼好給我飛龍珠!那我就收下啦! mpjunk all ~ 通常做迷的時候一定要把物品給刪除(mpjunk),避免玩家從你(mob)身上 得到好處之後殺人越貨再來一次XD 9. bribe_prog 賄賂程式,參數是金額 >bribe_prog 5000~ say 謝謝你給我5000金幣! mpjunk coins ~ 概念如同 give_prog,計得刪除金幣。 bribe_prog 還有一個概念,就是參數以上也視同接受,例如上面的例子 你給 mob 5001 金幣,他也是會說 歇歇你給我5000 金幣 所以要做出上下限的概念比較搞剛一點,要做這樣子: >bribe_prog 5000~ say you gave at least 5000 coins!! mpjunk coins ~ >bribe_prog 1~ say you gave less than 5000 coins!! mpjunk coin ~ 這樣給予不到5000金幣的時候也會有反應了! 補充: 現在的mob有內建四個變數,分別是 mobphase, mobvar1, mobvar2, mobvar3 可以自己靈活運用!設定的方式就是 mset $i mobphase 1 很多人喜歡做召喚怪、產生物品,以往因為 mpoload, mpmload xxx 只能一直產生 有些人會刻意讓mob無限產生導致系統不穩,現在可以透過設定變數來達到功能 舉例: if mobvar1($i)==0 mset $i mobvar1 1 mpmload xxx mpoload ooo break endif 如此一來就不會一直產生 xxx ooo 了 好了 prog 介紹到這邊,還有很很多的參數沒介紹到,再下一篇會出現 -- Mars-瑪爾斯群英傳,為一種多人的地下城文字網路遊戲(MUD), 以西方魔法奇幻風格為背景,讓玩家扮演各種職業進行冒險、解謎。 IP:220.135.242.105:8888 討論板: PTT mud_mars Eplis @ Mars -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.251.211.22

10/13 17:23,
推!!希望其他的也趕緊出來 O_o
10/13 17:23

10/13 18:45,
Pan大大要投稿區域!!
10/13 18:45

10/13 19:28,
開條新路從哈里亞往亞伯特吧,不然要學游泳走芬士多河
10/13 19:28

10/13 19:28,
或者走很恐怖的雨林,走出來背包不見,錢少一半
10/13 19:28

10/13 19:37,
可以坐船 O_o
10/13 19:37

10/13 20:03,
喝飛行也可以走河啊 況且魚還被nerf過
10/13 20:03

10/14 21:20,
雨林背包會不見? 有這種事情嗎?
10/14 21:20

10/14 21:36,
有,我解謎道具放背包被偷,現在不能解大地了
10/14 21:36
-- Mars-瑪爾斯群英傳,為一種多人的地下城文字網路遊戲(MUD), 以西方魔法奇幻風格為背景,讓玩家扮演各種職業進行冒險、解謎。 IP:220.135.242.105:8888 討論板: PTT mud_mars Eplis @ Mars -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 124.218.24.252
文章代碼(AID): #1GyLnWeA (mud_mars)
文章代碼(AID): #1GyLnWeA (mud_mars)