Re: [心得] 區域寫作 mob_prog 2

看板mud_mars (瑪爾斯群英傳)作者 (Eplis)時間12年前 (2012/12/20 00:37), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串5/5 (看更多)
※ 引述《eplis (Eplis)》之銘言: ※ 引述《eplis (Eplis)》之銘言: 這篇主要是介紹 mob 專用指令,我會列出比較常用的 對於想做區域的人應該很夠了 上一篇介紹的是mob的程式,假設mob要產生一個任務道具那該怎麼做 以下是所有的mob指令: mpjunk mpechoat mpechoaround mpkill mpmload mpoload mpgoto mpat mptransfer mpforce mpmodify 2012/12/17新增 mprandomatk 2012/12/18新增 以下開始一一介紹: mpjunk,刪除物件指令,請用此指令取代mppurg 今天我們要刪除mob身上的金幣,則語法是 mpjunk coins 若要直接刪除全部則是 mpjunk all mpechoat,在某處使用廣播,利用這個方法mob可以直接遠端在某個房間進行廣播 此指令較少使用。 mpechoaround,在某個區域使用廣播,此指令較少使用。 mpkill,mob開始攻擊目標,例如 mpkill eplis mpmload,mob產生mob,例如編號007是一隻叫Eplis的mob 則產生一個Eplis的指令是 mpmload 007 不過通常我都會拒絕使用這個指令,除非是用在 death_prog 裡面 因為放在其他地方,沒有足夠的程式去支援控制產生多少隻mob 也就是你儘用 .are 檔案沒辦法控制數量,可能造成玩家大量產生mob 導至系統附單,所以一般來說我會禁止使用這個。 mpoload,mob產生物品的指令,有兩個參數,第一個事物品編號,第二個是等級 切記請勿 mpoload 比 mob 本身等級還高,例如Lv30的mob請不要mpoload Lv31的設定。 飛龍珠(Dragon pearl)的編號是 407,產生一個就是 mpoload 407 100 這樣就會產生一個 100 級的飛龍珠在 mob 身上。 聰明的玩家已經想到我怎麼做怪物掉落了,基本上就是寫在 death_prog 裡面 通常是長這個樣子 >death_prog 100~ mpjunk all if rand(30) mpoload 427 100 endif if rand(10) mpoload 426 13 endif ~ 這段程式就是mob死亡後會清空身上的物品,然後有30%機率產生物品編號427等級100 和10%的機率產生物品編號426等級13的物品,這兩者是獨立事件,互不相依。 如果你希望只掉落一個物品的話,就加入 break 語法,例如 >death_prog 100~ mpjunk all if rand(30) mpoload 427 100 break endif if rand(10) mpoload 426 13 endif ~ 這樣子的話當系統先產生了427這個物品,就不再往下走了,所以沒產生427 就有10%機率產生426,要搞清楚兩者個相依性。 mpgoto,mob前往何處,只有一個參數,就是房間編號。 如果希望mob前往一個編號228的房間,mmpgoto 228 mpat,mob在何處做啥事,參數有兩個,第一個就是房間編號,第二個是指令 這個較少使用。 mptransfer,傳送,兩個參數,第一個是房間編號,第二個是傳送對象ID mptransfer eplis 311就是傳送 Eplis 到哈水 mpforce,命令,兩個參數,第一個是命令對象ID,第二個是做啥事, 請在安全合理公平的範圍內自由發揮。 mpmodify,新的指令!直接讓mob增加玩家的某個謎參數值用的 例如你要玩家蒐集三個物品A,以往的做法如下: >give_prog obj~ if obj($n) ==0 mpjunk obj mset $n obj 1 else if obj($n) ==1 mpjunk obj mset $n obj 2 else if obj($n) ==2 mpjunk obj tell $n 恭喜你蒐集完了 endif endif endif ~ 要一個一個判斷他的值是多少,非常的麻煩,現在可以直接用mpmodify指令 語法是 mpmodify [變數] [玩家ID] [數值] [變數]: 就是謎的變數 [玩家ID]: 通常是用 $n [數值]: 數值只接受 0~1000 (也許未來會變?) 所以我要改變玩家傳奇護腿(legendleg)的數據,想要讓他+1的話就只需要這樣寫 >xxx_prog~ mpmodify legendleg $n 1 ~ 就這樣!完全不需要去判斷他原本數據是多少! 很簡單吧! 以後寫區域寫迷的人可以更輕鬆,減少程式量了! 我也不用一直debug了 T_T mprandomatk 這個指令是讓NPC隨機攻擊任一玩家,機率性的,不一定每次 呼叫都會成功變換目標,免得讓王太難捉摸 只需要讓 mob 做這個指令就會自動進入判定換目標了 ex: >fight_prog 100~ if rand(30) mprandomatk endif ~ 王每次戰鬥會有30%機率進行換目標判定,建議不要太常呼叫這指令 尤其小怪不要用,放在戰鬥時間長的王就好 講完了mob指令還有一個東西很重要,我們常會用 greet_prog 來做一些迷的提示 但 greet_prog 是對任何生物都會觸發的,無論是 NPC or Player 總不可能 NPC 會主動找 NPC 解任務吧? 接下來講的是判斷,其實之前的例子已經使用過了,就是 rand 函式。 if rand(50) endif 要注意的是變數當中$n 代表的是玩家$i 代表的是NPC本身 以下列出常用的判斷式: isnpc($*) 判斷是否為NPC Ex: isnpc($n) 判斷眼前這個是 NPC 嗎 ispc($*) PC isimmort($*) imm isgood($*) 善良陣營 isfight($*) 戰鬥狀態 以下有判斷符號 == > < >= <= 這些都可使用 hitprcen($*) <= integer 判斷血量百分比是否小於等於多少 inroom($*) == integer 該NPC是否在房間編號 xxx level($*) == integer 對象的等級 class($*) == integer 對象的職業 name($*) == string 對象ID是否等於 string 大概就介紹到這邊,有這些東西應該就可以做出變化很大的區域了 所以玩家可以感受得到一個區域是可以很簡單,也可以很複雜的 下一篇要來介紹 object 也是個大工程! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.251.218.246

10/14 17:14,
mpload 只能 load 在同一格嗎? O_o
10/14 17:14

10/14 17:16,
mpm or mpo 都問一下 O_o
10/14 17:16

10/14 17:47,
你可以用mpat + mpload 來運作
10/14 17:47

10/14 17:48,
甚至可以用mpgoto + mpload 來做類似的事 不過效果不同
10/14 17:48

10/14 18:06,
mpmload mpoload
10/14 18:06
-- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 124.218.24.252

12/19 00:51,
恩 有這個就可以做聲望系統了xdddd
12/19 00:51

12/19 01:45,
原來如此 XDD
12/19 01:45

12/19 03:33,
希望聲望系統趕快出來 然後跟陣營連在一起 (不是善惡)
12/19 03:33

12/19 03:34,
而是跟國家 (哈里亞 亞伯特 諾瓦提莉亞) 特殊技能裝備
12/19 03:34

12/19 03:34,
之類的連在一起~~~
12/19 03:34

12/19 09:26,
讓每個人可以選擇國籍 XD
12/19 09:26

12/19 10:32,
有國籍設計喔 只是完全沒內容XD
12/19 10:32
-- Mars-瑪爾斯群英傳,為一種多人的地下城文字網路遊戲(MUD), 以西方魔法奇幻風格為背景,讓玩家扮演各種職業進行冒險、解謎。 IP:220.135.242.105:8888 討論板: PTT mud_mars Eplis @ Mars -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 124.218.24.252
文章代碼(AID): #1GqUrXRw (mud_mars)
文章代碼(AID): #1GqUrXRw (mud_mars)