Re: [閒聊] tmi2-mudlib 的更改

看板mud (網路地下城/文字遊戲)作者 (小太保)時間10年前 (2014/06/23 16:27), 10年前編輯推噓5(505)
留言10則, 3人參與, 最新討論串18/27 (看更多)
網頁好讀版: http://www.ptt.cc/bbs/mud/M.1403512062.A.D9C.html tmi2_fluffos_v3_改,20140623 版本 http://sanclaechan.myweb.hinet.net/tmi2_fluffos_v3_modify.rar 建議下載並解壓縮後目錄位置為 D:\tmi2_fluffos_v3_改\ (底下以 tmi2_v3_改 簡稱) 新舊目錄之間資料的替換主要以底下目錄為主 1./data 2./u <= 比方你已經有建立自己的使用者目錄了 3./doc <= 比方你已經有新增一些說明文件了 比方你已經有在前一版本的 tmi2_v3_改 用 vobj 指令設定了一些虛擬物 品了,那只要把前一版本的 /data 目錄的 vobj.o 拿來蓋掉新的 vobj.o ,這樣舊版本的 tmi2_v3_改 的虛擬物品資料就能移植到新的版本。 WinXP 使用者,可直接雙擊 D:\tmi2_fluffos_v3_改\bin\啟動 mud 捷徑, 即可執行 mud。Win7 或 Win8 使用者,則務必先參考底下這篇: http://www.ptt.cc/bbs/mud/M.1399357070.A.366.html mud 啟動成功後,目前確定以 pietty 連線 localhost 5000 (Telnet),可 連線成功: http://imgur.com/IQwusvX.jpg
在 tmi2_fluffos_v3_改\ 目錄下會放一些圖片及說明文件。 管理者帳號預設為 mudadm,密碼 mudadm,只允許本機端登入,無法遠端登 入。欲新增管理者帳號,請依序做底下動作 1.修改 /adm/etc/groups 檔,將欲新增的管理者帳號加到 (admin) 群組 2.修改 /include/config.h 檔,確定 #define AUTO_WIZHOOD 沒有 // 掉 3.啟動 mud,然後創建一個步驟 1 所指定的管理者帳號角色 4.角色創完後 save quit,然後關閉 mud 5.再修改 /include/config.h 檔,將 #define AUTO_WIZHOOD 給 // 掉 6.再重新啟動 mud 7.此時再登入你的管理者角色帳號,此帳號就具有管理者權限 目前連線 telnet://210.61.157.53:5000 可連到以最新版本所架的測試站 ,有公頻聊天指令可使用,也有遠端頻道指令 tmi2 可使用,使用前 mail 給 laechan.bbs@ptt.cc 提出申請,信件內容需有: 1.你所架的站台 ip 及 port 2.你所架的站台之名稱(若沒有這個名稱會內定為 XXX's PC ================================================================== 本次修改範圍:20140619~20140623 一、新增群式怪物繼承檔 GMONSTER = /std/gmonster.c 對群式怪物的描述採用 sanc 的描述,但是程式架構不採用 sanc 的 架構(因為作者不是我),gmonster.c 基本上 inherit monster.c, 但是自訂底下函數 void init(); 怪物被觸發時的函數 string query_short(); 讀取怪物 short 名稱的函數 int query_points(string str); 讀取怪物 hp/sp/.. 的函數 int receive_damage(int damage); 怪物損血時呼叫的函數 群式怪物不需 set("short"),但需 set("member") 即隻數。 群式怪物檔案可參考 /d/area/newbie/mob/bear1.c 群式怪物的 script_mob 檔可參考 /d/area/redant/script_mob 底下會有群式怪物的相關 demo。 二、修改 /adm/simul_efun/base_name.c,新增 explode_base_name 全 域函數 base_name(ob) = "/d/area/newbie/room/001" ↓ 則 └────────┐                          ↓ explode_base_name(base_name(ob)) = "/d/area/newbie/room*001" 也就是最後一個 / 會被替換為 *,這樣就容易對這樣的字串做目錄   與檔名的拆解。 三、/cmds/std/_help.c 指令檔再補強 增加「虛擬目錄」以及相關指令功能: 數字 : 進入一個目錄或觀看一個說明檔案 0 或 < : 回上一層 q : 離開 底下指令只有 wiz 可以使用 add 數字 : 將某一項目還原 name 數字 = 名稱 : 將某一項目取新的名稱 virtual *目錄 = 名稱 : 新增一虛擬目錄 link 數字a to 數字b : 將 a link 到 b 這個虛擬目錄 unlink 數字a : 取消 a 的 link data : 顯示所在目錄有哪些設定資料 del 數字 : 將某一項目遮蔽不顯示或刪除一虛擬目錄 底下會有 demo。 四、修改 /cmds/object/_update.c 增加兩種指令語法 update -n 數字a-數字b 比方對 001.c~400.c 這個範圍做 update,就是 update -n 1-400 (這個語法還存在改版的空間,下一次再改版,它會更方便) update -p 它可以對整個目錄的 .c 檔做 update。 五、新增 /cmds/std/_betla.c,線上賭盤指令 直接下載 sanc 由我寫的指令,連同 /open/betla 也一起下載。 底下會有 demo。 六、新增 tmi2_v3_改 專用的地圖系統 這個系統最重要的功能是做地圖的共享,這個往後的改版會有更進 一步的說明。   修改日誌則有提到要新增這個系統需要新增及更動哪些東西,使用   者可參考修改日誌檔,這裡不做贅述(因為很長)。 底下會有 demo。 七、修改 /adm/simul_efun/attack.c 的 defence_attack 函數 增加如何寫盾擋及武器招架的程式段範例。 底下會有 demo。 八、其它修改 修正 !指令 、 數字 !指令 等上一次版本有 bug 的部份。 修改 /std/user.c 的 complete_setup 函數,對每一個登入的玩家 做部份數值初始化的工作。 修改 /adm/simul_efun/adminp.c,新增 wiz_lv 函數,可簡易判斷 一個使用者 id 是不是 wiz,是的話就會傳回 >0 的數值。 (使用者可用 running code: write(wiz_lv("隨便一個id")) 去看 新增 /cmds/std/_who2.c、_guild2.c,供使用者寫指令時參考。 新增 /d/area/redant 區域目錄,即 sanc 的「炙蟻地獄」區域 修改 /include/mudlib.h 全域定義檔,於最底下新增更多的定義 ================================================================= demo 區 > l [/d/area/redant/180 ] 炙蟻地穴-第二層 這座洞穴長年棲息著巨大的蟻類,嘎吱嘎吱的走動聲音不時從洞 穴的深處傳來,生活在這裡的炙蟻,其酸液據說是珍貴的藥材! 明顯出口有: east 和 west. 工炙蟻群(worker redants) [10群工炙蟻] > data redants id : ({ "worker redants", "redants", "monster" }) member : 10 <- 隻數 short : "@@query_short" <- 此時會讀取 query_short 函數去產生 unit : "群工炙蟻" <- unit 跟一般怪物的設定不太一樣 一般怪物頂多設 "隻", "位", .. 現在所有新式區域產生的怪物會自動帶的怪物 id 是 "monster" ,這個 id 定義在 /include/mudlib.h 的最底下。 上面各顏色則對映其作用的位置。 > wear all 你裝備上小盾牌(shield). 你裝備上格鬥匕首(fight dagger). 你裝備上所有的東西! > k redants 你對著工炙蟻群喝道: 「小王八蛋! 今日不是你死就是我活! 」 ☆☆☆ 戰 鬥 開 始 ☆☆☆ 你手握格鬥匕首刺向工炙蟻群,造成結實的傷害!(170) 工炙蟻群用酸液噴向你,但是被你以小盾牌擋開了! <= 盾擋成功判斷到的訊息 你手握格鬥匕首戳向工炙蟻群,造成結實的傷害!(170) 工炙蟻群猛烈地攻擊你,但是無關痛癢... <= 閃格擋沒有成功 你手握格鬥匕首刺向工炙蟻群,造成結實的傷害!(170) 工炙蟻群用酸液噴向你,但是被你以格鬥匕首格開了! <= 武器招架成功判斷到的訊息 . . 你手握格鬥匕首捅向工炙蟻群,造成結實的傷害!(170) 工炙蟻群 死掉了 1 群工炙蟻! <= 開始死第一隻 . . 工炙蟻群猛烈地攻擊你,但是被你以小盾牌擋開了 你手握格鬥匕首捅向工炙蟻群,造成結實的傷害!(170) 工炙蟻群 死掉了 1 群工炙蟻! <= 死第九隻了 工炙蟻群用酸液噴向你,但是無關痛癢... 你手握格鬥匕首刺向工炙蟻群,造成結實的傷害!(170) 工炙蟻群 死掉了 1 群工炙蟻! <= 第十隻陣亡 工炙蟻群 全體陣亡了。 這時就全體陣亡 工炙蟻群(worker redants)發出一聲慘叫!! 工炙蟻群(worker redants)慢慢的倒在地上...死了! ○○○ 這場戰鬥結束了! ○○○ 如果四個人圍毆「這隻怪物」,那麼在上面 10 隻的死掉過程中, 就可以實現: 玩家A 打死了 3 隻 玩家B 打死了 4 隻 玩家C 打死了 2 隻 玩家D 打死了 1 隻 ======================================================================== explode_base_name 的好處可以用底下的 running code 說明 tmp=base_name(environment(me)); write("explode 前: "+tmp+"\n"); tmp=explode_base_name(tmp); write("explode 後: "+tmp+"\n"); // 第一種方式: 用 explode, 以 "*" 為分隔字 obs=explode(tmp,"*"); write("目錄: "+obs[0]+", 檔名: "+obs[1]+"\n"); // 第二種方式: 用 strsrch, 找出 "*" 在字串裡的位置 i=strsrch(tmp,"*"); j=strlen(tmp); write("目錄: "+tmp[0..i-1]+", 檔名: "+tmp[i+1..j-1]+"\n"); ========== 程式執行區 ========== explode 前: /d/area/redant/313 explode 後: /d/area/redant*313 目錄: /d/area/redant, 檔名: 313 目錄: /d/area/redant, 檔名: 313 <= 兩種做法都能得到相同結果 ========== 程式執行區 ========== 傳統上要取出目錄及檔名要用 while 去做,現在有 explode_base_name 就方便很多,使用者可依需要看是要用 explode 的方式或 strsrch 的 方式分解出目錄及檔名皆可。 ================================================================ 再來是 help 的 demo。我已經先建立 /doc/skill 目錄,並且從 sanc 下載了一些技能說明檔。 > ls /doc/skill Path: [/doc/skill] 1 adventure_heart 1 counter 1 parry 1 backstab 1 dagger 1 return_spell 1 barefist 1 daggermaster 1 shield 1 blade_heart 1 dodge 1 thunder_spell 1 blizzard 1 egingin 1 watershield 1 bousou 1 fighter_heart > help [/doc/] 1.README 2.[concepts] 3.[daemons] 4.[driverdoc] 5.[emote] 6.[etc] 7.[functions] 8.[help] 9.[lpc] 10.[mudlib] 11.[properties] 12.[skill] 13.[wizhelp] 14.備忘 15.回上一層. 請輸入: 首先,可以把 12 那一項改名為 技能 請輸入: name 12 = 技能 skill 已更名為 技能. [/doc/] 1.README 2.[concepts] 3.[daemons] 4.[driverdoc] 5.[emote] 6.[etc] 7.[functions] 8.[help] 9.[lpc] 10.[mudlib] 11.[properties] 12.[技能] 13.[wizhelp] 14.備忘 15.回上一層. 請輸入: 然後進入 12 請輸入: 12 [/doc/skill/] 1.adventure_heart 2.backstab 3.barefist 4.blade_heart 5.blizzard 6.bousou 7.counter 8.dagger 9.daggermaster 10.dodge 11.egingin 12.fighter_heart 13.parry 14.return_spell 15.shield 16.thunder_spell 17.watershield 18.回上一層. 請輸入: 從上面可以看出技能其實有冒險者的、有盜賊的、有戰士的、有騎士的 ......通通都放在同一個目錄。這時就可以建虛擬目錄,例如說先來建 一個冒險者的: 請輸入: virtual *adventure = 冒險者(adventure) 虛擬目錄 冒險者(adventure) 已新增. [/doc/skill/] 1.[冒險者(adventure)] 2.adventure_heart 3.backstab 4.barefist 5.blade_heart 6.blizzard 7.bousou 8.counter 9.dagger 10.daggermaster 11.dodge 12.egingin 13.fighter_heart 14.parry 15.return_spell 16.shield 17.thunder_spell 18.watershield 19.回上一層. 請輸入: 虛擬目錄的 *adventure 的 * 就是虛擬目錄的標頭,有 * 就是虛擬目 錄,沒有 * 就不是。 接下來,就可以把 adventure_heart、barefist、dodge、parry、 shield 這五個技能 "link" 到 1.[冒險者(adventure)]: 請輸入: link 2 to 1 已將文件 adventure_heart link 到 冒險者(adventure) 中了. 請輸入: link 3 to 1 已將文件 barefist link 到 冒險者(adventure) 中了. . . 請輸入: link 12 to 1 已將文件 shield link 到 冒險者(adventure) 中了. [/doc/skill/] 1.[冒險者(adventure)] 2.backstab 3.blade_heart 4.blizzard 5.bousou 6.counter 7.dagger 8.daggermaster 9.egingin 10.fighter_heart 11.return_spell 12.thunder_spell 13.watershield 14.回上一層. 請輸入: 然後我們進 1.[冒險者(adventure)] 去看 請輸入: 1 [/doc/skill/*adventure/] 1.adventure_heart 2.barefist 3.dodge 4.parry 5.shield 6.回上一層. 請輸入: 同樣的,上面的東西也可以命名,例如把 1 命名成冒險者之心 請輸入: name 1 = 冒險者之心 adventure_heart 已更名為 冒險者之心. [/doc/skill/*adventure/] 1.冒險者之心 2.barefist 3.dodge 4.parry 5.shield 6.回上一層. 請輸入: 然後看一下 1 這個檔案在說些什麼 請輸入: 1 冒險者之心(Adventure heart) 這是個冒險者公會的技能,使用後可以讓新手冒險者更有勇氣及 能力去面對未來將會碰上的事件及怪物,雖然幫助有限,但對初 期的冒險者來說,這是非常有用的。 *使用方式:heart adventure。  指令 a 及 score l 可觀看使用後的影響。 請按 enter 鍵繼續... [/doc/skill/*adventure/] 1.冒險者之心 2.barefist 3.dodge 4.parry 5.shield 6.回上一層. 請輸入: 也可以解除某一個檔案的 link 請輸入: unlink 2 你解除了 barefist 的 link 設定. [/doc/skill/*adventure/] 1.冒險者之心 2.dodge 3.parry 4.shield 5.回上一層. 按 < 就能返回上一層: 請輸入: < [/doc/skill/] 1.[冒險者(adventure)] 2.backstab 3.barefist 4.blade_heart 5.blizzard 6.bousou 7.counter 8.dagger 9.daggermaster 10.egingin 11.fighter_heart 12.return_spell 13.thunder_spell 14.watershield 15.回上一層. 請輸入: 可以看見 barefist 已經是未 link 狀態。 然後如果把 1. 那個虛擬目錄整個刪掉,就會變成如下: 請輸入: del 1 *adventure 已刪除. [/doc/skill/] 1.adventure_heart 2.backstab 3.barefist 4.blade_heart 5.blizzard 6.bousou 7.counter 8.dagger 9.daggermaster 10.dodge 11.egingin 12.fighter_heart 13.parry 14.return_spell 15.shield 16.thunder_spell 17.watershield 18.回上一層. 請輸入: 所有曾被 link 到 虛擬目錄 的檔名就會回到未 link 狀態。 這樣就能實現樹狀型式的輸入型 help 功能,而且管理者也能透過 選單功能快速建立樹狀架構。 這東西比 sanc 現用的 help 及未完全開放的 xhelp 功能更強。 ========================================================== 線上賭盤指令如下: > betla 現有賭盤: ======================================================================== ======================================================================== betla [賭盤編號] 即可參與線上投注,請參閱 betla 指令說明。 到 /open/betla 目錄下隨便讀入一個 betla 檔 > cd /open/betla /open/betla > ls Path: [/open/betla] 1 20111114_5 1 20130413_1 1 betla.c 1 r1 1 20130410_1 1 20130415_1 1 betla_ex realtime/ 1 20130410_2 baseball/ 1 laechan tseng/ 1 20130411_1 1 betla polite/ wang/ > betla readfile 20130415_1 欲開賭盤:北韓20130414(日)發射飛彈 金額設定:每注 3000 影特幣 封盤時間:600 分鐘後 賭盤項目:會打美國      會打韓國      會打日本      會打其它(例如只射向東海)      不會射      其它可能      贊助賭盤 << 你贊助了 9999 注 >> 確定請按 Y or y: Y 跟 more 該檔的結果對照 > more 20130415_1 北韓20130414(日)發射飛彈 <= 賭盤標題 3000 <= 每注多少 600 <= 封盤時間設定在「幾分鐘後」 add:9999 <= 官方贊助多少注 會打美國 <= 賭盤選項1 會打韓國 <= 2 會打日本 <= 3 會打其它(例如只射向東海) <= 4 不會射 <= 5 其它可能 <= 6 贊助賭盤 <= 最後一項預設為贊助賭盤 > betla 現有賭盤: ======================================================================== 1. 北韓20130414(日)發射飛彈 封盤時間:2014/06/24 02:02 ======================================================================== betla [賭盤編號] 即可參與線上投注,請參閱 betla 指令說明。 > betla 1 賭盤:北韓20130414(日)發射飛彈 每注:3000 影特幣 ====================================================================== 1.會打美國 0 注(賠率:0.000000) 2.會打韓國 0 注(賠率:0.000000) 3.會打日本 0 注(賠率:0.000000) 4.會打其它(例如只射向東海) 0 注(賠率:0.000000) 5.不會射 0 注(賠率:0.000000) 6.其它可能 0 注(賠率:0.000000) 7.贊助賭盤 9999 注(賠率:1.000000) (你已下 9999 注) ====================================================================== 指令語法:betla [賭盤編號] [賭盤項目] [下注數]. 比方我們下注 1 > betla 1 1 1000 betla: 下注完畢. > betla 1 賭盤:北韓20130414(日)發射飛彈 每注:3000 影特幣 ====================================================================== 1.會打美國 1000 注(賠率:10.999000) (你已下 1001 注) 2.會打韓國 0 注(賠率:0.000000) 3.會打日本 0 注(賠率:0.000000) 4.會打其它(例如只射向東海) 0 注(賠率:0.000000) 5.不會射 0 注(賠率:0.000000) 6.其它可能 0 注(賠率:0.000000) 7.贊助賭盤 9999 注(賠率:1.100010) (你已下 9999 注) ====================================================================== 指令語法:betla [賭盤編號] [賭盤項目] [下注數]. 然後假設我們要手動封盤(時間到它也會自動封盤)並開獎: > betla set 1 1.賭盤:北韓20130414(日)發射飛彈(1 to [新標題]) 2.賭項:共 7 個(2 [n] to [新名稱]) ({ "會打美國", "會打韓國", "會打日本", "會打其它(例如只射向東海)", "不會射", "其它可能", "贊助賭盤" }) 3.每注:3000 影特幣(3 to [n]) 4.開放/暫停/取消該賭盤(4 to start/stop/halt) (附註:4 to halt 可以補發獎金給未領取的人。) 5.設定中獎項目及開獎(5 to [n]) 6.線上公告賭盤(6 to shout) =================================================== 請輸入(直接按[ENTER]為離開設定):4 to stop betla: 你暫停了該賭盤的下注. 請輸入(直接按[ENTER]為離開設定):5 to 1 賭盤:北韓20130414(日)發射飛彈 項目:會打美國 你決定開這個獎項嗎(y/n):y 【賭盤系統】北韓20130414(日)發射飛彈 【賭盤系統】本賭盤開 1. 會打美國 【賭盤系統】賠率 10.999000,每一注可得 32997 影特幣. 【賭盤系統】你下注了第 1 個項目,贏得賭金 33029996 影特幣! 【賭盤系統】贏得了賭盤使你的賭技有所增長! 【賭盤系統】laechan 買了 1001 注贏得賭金 33029996 影特幣! 剩餘未領獎人員: 我曾用這指令在 sanc 開過金曲獎、金馬獎相關賭盤,而且是邊看 轉播邊開賭盤,它的做法就是先把賭盤腳本檔編好,如下 > ls /open/betla/realtime/2013金曲獎 Path: [/open/betla/realtime/2013金曲獎] 1 台語女歌手 1 作詞人 1 原住民語歌手 1 單曲製作人 1 台語男歌手 1 客語專輯 1 國語女歌手 1 新人 1 台語專輯 1 客語歌手 1 國語男歌手 1 演唱組合 1 年度歌曲 1 音樂錄影帶 1 國語專輯 1 樂團 1 作曲人 1 原住民語專輯 1 專輯製作人 1 編曲人 > more /open/betla/realtime/2013金曲獎/國語女歌手 2013金曲獎─最佳國語女歌手獎 5000 300 add:9999 盧凱彤/你安安靜靜地躲起來 鄧紫棋/第四張專輯 Xposed曝光 林憶蓮/蓋亞 家家 /忘不記 徐佳瑩/理想人生 蔡依林/MUSE 從缺 贊助賭盤 這樣當電視直播到要開始頒最佳國語女歌手了時,就馬上把該賭盤 readfile 進來,然後就可以等頒獎結果揭曉,就再用 betla set 設定要開哪一項目,馬上就能開出賭盤。 /open/betla 下有 sanc 開過的所有賭盤,使用者可參考。 =========================================================== 新式地圖系統如下 首先在 /d/area/redant 目錄下下這三個指令(要分開下) trans map1 to /d/area/redant by script_room trans map2 to /d/area/redant by script_room trans map3 to /d/area/redant by script_room 上面三個指令可依三張數字圖各自產生出對映的房間,三個區域的 範圍如下: map1: 001.c~177.c map2: 178.c~331.c map3: 332.c~475.c 只要 more map1, map2, map3 就可知道其範圍,而 map1x、map2x 、map3x 就是其 x-x 圖。 這個區域共三層,map1、map2、map3 就代表第一、二、三層。 接著,就以 map 指令設定這三層地圖的資料: 目錄 層 起 迄 x-x地圖檔 > map -set redant 1 = 1,177,map1x map_data[redant][0]=({ 1, 177, ({ }), "map1x" }) 資料設定 ok. > map -set redant 2 = 178,331,map2x map_data[redant][1]=({ 178, 331, ({ }), "map2x" }) 資料設定 ok. > map -set redant 3 = 332,475,map3x map_data[redant][2]=({ 332, 475, ({ }), "map3x" }) 資料設定 ok. 上面應該不難理解。如果只有一層(如 /d/area/01/01) 那當然就 只需要一行,然後給個起迄範圍及 x-x 地圖是哪一個檔即可。 接著設定出口資料,根據 /d/area/redant/area_room.c // 這裡則可以針對房間號碼變更出口設定 // 依房間號碼來設定連接上下層的例子 if(n==152 && !query("exits/down")) set("exits/down",__DIR__+"313"); if(n==313 && !query("exits/up")) set("exits/up",__DIR__+"152"); if(n==210 && !query("exits/down")) set("exits/down",__DIR__+"370"); if(n==370 && !query("exits/up")) set("exits/up",__DIR__+"210"); (這裡就是一個透過 area_room.c 做集中管理的例子) 我設定第一層的出口是 001 之外還有 152,第二層 210 及 313 ,第三層為 370,也就是說 第一層 入口001───152 │ 第二層 210───313 │ 第三層 370 大概是這樣的關係,這時指令就可以這樣下 > map -exits redant 1 = 1,152 map_data[redant][0]=({ 1, 177, ({ 1, 152 }), "map1x" }) 設定完成. > map -exits redant 2 = 210,313 map_data[redant][1]=({ 178, 331, ({ 210, 313 }), "map2x" }) 設定完成. > map -exits redant 3 = 370 map_data[redant][2]=({ 332, 475, ({ 370 }), "map3x" }) 設定完成. 接著還可以再為各層命名,指令這樣下 > map -name redant 1 = 炙蟻地獄第一層 map_data[redant][0]=({ 1, 177,({1,152}),"map1x","炙蟻地獄第一層"}) 設定完成. > map -name redant 2 = 炙蟻地獄第二層 map_data[redant][1]=({ 178, 331,({210,313}),"map2x","炙蟻地獄第二層"}) 設定完成. > map -name redant 3 = 炙蟻地獄第三層 map_data[redant][2]=({ 332, 475,({ 370 }),"map3x","炙蟻地獄第三層"}) 設定完成. 這樣設定就結束了,流程就是: trans產生房間→map -set 設定基本資料→map -exits 設出口→map -name 設名字 然後就能使用 map 指令了,先 goto 到 /d/area/redant/001 區域入口。 > goto 001 [/d/area/redant/001 ] 炙蟻地穴-第一層 越往洞穴的深處走,你越覺得燥熱難當,在這個狹窄的地方遇上 魔物的話,在戰鬥上極為不利,生活在這裡的炙蟻,其酸液據說 是珍貴的藥材! 明顯出口有: south 和 east. 兵炙蟻群(soldier redants) [10群兵炙蟻] > map                                  │                                        > 由上圖可知入口在區域的左上角。接著往東走兩格看看 > run 2e 炙蟻地穴-第一層 明顯出口有: south, east, 和 west. 黑炙蟻群(black redants) [10群黑炙蟻] 工炙蟻群(worker redants) [10群工炙蟻] 炙蟻地穴-第一層 明顯出口有: south, east, 和 west. > map                              │ │ │                               口 口                                                                          > 上面包含了三種東西 1.你走了多少範圍,就顯示多少範圍的地圖出來 2.區域的出口會以 標示                        自己則以 標示 房間則以 標示 路線則以 ─ │ 標示 3.它不只顯示你走過的房間,連相鄰的房間也顯示 wiz 如果下 map here 則會看到全圖: > map here ─口──口 口─口─口─口─口─口 口 口     口─口─口 口 │ │ │ │   │ │   │ │ │ │     │   │ │ 口 口─口─口─口─口 口─口─口─口─口─口─口─口 口─口 口─口 │ │ │ │   │ │ │       │     │ 口─口 口─口─口─口 口─口─口─口 口─口─口─口─口─口─口─口─口     │ │     │   │ │ │ │ │ │ │   │ 口─口─口─口─口─口─口 口─口─口 口─口─口 口 口─口 口─口 口─口 │ │ │ │ │ │ │ │ │ │     │ │ │   │   │ │ 口─口─口 口─口─口─口─口─口─口     口─口 口 口─口─口─口 口                   │                   │ 口─口─口─口           口     口   口─口─口─口─口 口 │                 │     │           │ │ 口─口 口─口     口─口─口 口─口   口─口─口─口─口 口─口─口   │ │ │       │ │ │     │   │   │ 口─口 口 口─口─口─口 口─口─口─口 口─口─口 口   口─口─口─口 │   │         │ │       │   │         │ 口 口─口─口─口─口 口 口 口 口─口─口  口 口─口─口─口 口─口 │ │ │     │ │   │ │   │   │ │ │ │     │ 口─口 口     口─口─口─口─口─口 口─口─口─口 口 口─口─口─口                        底下模擬接近到下一個區域出口時的情況: > run e 4s 6e 3s w 2s e n 2e s 3e 3n 2w > map ─口─口─口                             │ │ │ │                             口 口─口─口─口                               │ │                           口─口─口                                 │ │                               口─口─口─口─口 口─口─口                           │ │ │ │ │ │ │                           口─口─口─口─口─口─口                                       │                                       口     口                                 │     │                               口 口─口   ─口─口─口                         │ │     │   │                   口─口─口─口   口   口                           │           │                           口 口─口─口   口 口─口                         │ │   │   │ │                         口─口─口─口 口─口─口─口                                          > 然後再往南走一格 > s [/d/area/redant/133 ] 炙蟻地穴-第一層 走在這座洞穴裡令你覺得十分的悶熱,嘎吱嘎吱的走動聲音不時 從洞穴的深處傳來,生活在這裡的炙蟻,其酸液據說是珍貴的藥 材。 明顯出口有: south, north, east, 和 west. 兵炙蟻群(soldier redants) [10群兵炙蟻] > map ─口─口─口                             │ │ │ │                             口 口─口─口─口                               │ │                           口─口─口                                 │ │                               口─口─口─口─口 口─口─口                           │ │ │ │ │ │ │                           口─口─口─口─口─口─口                                       │                                       口     口                                 │     │                               口 口─口   口─口─口─口                         │ │     │   │                   口─口─口─口 口──口 口                           │       │   │                           口 口─口─口  口 口─口                         │ │   │   │ │                         口─口─口─口 口─口─口─口  > 上面包含了兩種東西 1.它真的只顯示你走過的範圍以及其鄰近房間 2.只有走到接近出口的那一格,才顯示出口 在刀劍神域的某一集裡,桐人與亞絲娜組隊遇到克萊因,打屁閒聊 之後又遇到軍隊,軍隊的隊長就開口向桐人他們要「地圖」。 這個地圖系統就能做到「給玩家地圖」。 而例如說你希望你的 mud 有小地圖,則這個地圖系統是辦得到的, 例如你要預設玩家能看到全圖,只要修改特定段落即可(我會在地圖 系統的說明文件裡說明要怎麼改)。 我設計了只顯示走過的範圍 -> 你可以將其改成顯示全圖 我只設計一律顯示全圖 -> 你很難新增只顯示走過的範圍的功能 我的意思就是,我今天設計它具有「只顯示走過的範圍」的用意, 並不是要所有 tmi2_v3_改 的使用者都要照我設計的去跑,因為程 式是可以修改的。 但是如果我沒有為 tmi2_v3_改 設計這個東西,使用者要設計出這 東西卻是很困難的。 兩相比較當然是「我把它設計出來,然後由你來決定要不要用它」 (那基本上我會想設計這個,當然也是因為我本來就要用的緣故) 有任何問題或建議,都可透過推文或回文的方式讓我知道。 我覺得關鍵是像 caselook 這位使用者,是否能光靠 map 指令所 看到的地圖,就知道下一步應該怎麼走,據我的瞭解有些使用者是 辦不到的,sanc 為此才新增了位於地圖底下的資訊: > map 炙蟻地穴-第一層(o: 你的位置 @: 區域出入口) @-x-x-x x-x-x-x-x-x x x x-x-x x | | | | | | | | | | | | | x x-x-x-x-x x-x-x-x-x-x-x-x x-x x-x | | | | | | | | | x-x x-x-x-x x-x-x-x x-x-x-x-x-x-x-x-x | | | | | | | | | | | x-x-x-x-x-x-x x-x-x x-x-x x x-x x-x x-x | | | | | | | | | | | | | | | | x-x-x x-x-x-x-x-x-x x-x x x-x-x-x x | | x-x-x-x x x x-x-x-x-x x | | | | | x-x x-x x-x-x x-x x-x-x-x-o x-x-x | | | | | | | | | x-x x x-x-x-x x-x-x-x x-x-x x x-x-x-x | | | | | | | x x-x-x-x-x x x x x-x-x @ x x-x-x-x x-x | | | | | | | | | | | | | x-x x x-x-x-x-x-x x-x-x-x x x-x-x-x 前往方式: recall w look mirror 輸入 felid, 然後 11d 4s 32w n enter 地圖說明: 本區域為亞雷克萊斯特大陸上的區域,共三層。區域一 開始的進入點為地圖的最左上角。前往第二層建議走法 3e 4s 6e 3s w 2s e n 2e s 3e 3n 2w 2s down (上面就是新增的資訊) 預計下次的版本會對 attack.c 做更多的修改、建立更多的說明文件、 並在 show 函數實裝「小黑鼠傷口鮮血滿身是。」這個受傷狀況訊息, 說明文件會佔大部份。 Laechan -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 210.61.157.53 ※ 文章網址: http://www.ptt.cc/bbs/mud/M.1403512062.A.D9C.html

06/23 16:53, , 1F
明天起沒啥空,但有零碎時間編文件檔
06/23 16:53, 1F
※ 編輯: laechan (210.61.157.53), 06/23/2014 17:02:49

06/23 18:45, , 2F
推啊 越來越強大的mudlib
06/23 18:45, 2F

06/23 19:07, , 3F
突然發現應該可以練習看口─口圖
06/23 19:07, 3F

06/23 21:19, , 4F
好,上次更新我只摸到一次:p
06/23 21:19, 4F

06/23 21:51, , 5F
那群式怪物loot判定是如何呢?
06/23 21:51, 5F

06/23 22:15, , 6F
基本設定是殺死最後一隻=呼叫die的人
06/23 22:15, 6F

06/23 22:36, , 7F
但是要get all不會選不到嗎?
06/23 22:36, 7F
原則上 tmi2_v3_改 會避免把東西「放進」怪物身上,從虛擬物品 及怪物掉落物系統的設計可以看得出來,每一樣該掉落的東西都是 有設定機率的,實體物品只有符合機率的情況才會 clone 出來。 因此是由呼叫怪物 die 函數的 killer,由他呼叫 exec_mob_drop ,但是這只是呼叫的人是他,實際上 exec_mob_drop 還是可以實現 各種 loot 設定,端看你怎麼設定。 但即便如此,你還是可以設定你的 mud 有 corpse、以及打死了東 西會掉在屍體或是掉在地上,因為這是 tmi2_v3 本來就有的東西, 只是我目前透過怪物掉落物系統而得以無視它而已。 這是你自己可以決定的。 底下舉例 int exec_mob_drop(object killer,object mob) { mixed obs,attackers,tmps; object ob,env; mapping mob_drops; string tmp; // 怪物所在的房間 env=environment(mob); // 該房間所有的物件 obs=all_inventory(env); // 或是說 obs = killer 的所有隊友 // obs=PARTY_D->query_members(killer); // 該怪物死前所有的攻擊對象 attackers=mob->query_attackers(); // 讀出該怪物的掉寶資訊 mob_drops=mob_drop("query",base_name(mob)); tmps=keys(mob_drops); foreach(ob in obs) { // ob 符合掉寶機率的條件就是要在 attackers 內 if(ob && member_array(ob,attackers)!=-1) { // 然後就看你怎麼設定 // 比方以 D3 的做法,每個符合掉寶的 ob // 都會跑一次掉寶 foreach(tmp in tmps) { // 當符合掉寶機率時 if(mob_drops[tmp]>random(10000)) // 或者「主殺的 killer」才享有主掉寶率,其它非主殺的較低 // if(mob_drops[tmp]>random(12000) || // (ob==killer && mob_drops[tmp]>random(10000))) { // 若是實體物品就 clone 出來 move 給 ob if(tmp[0..0]=="/") // 或者只有主殺的 killer 才能拿到實體物品 // if(ob==killer) // 又或者只有主殺的 killer 才能拿到機率在 1% 以下的物品 // if(ob==killer && (int)mob_drops[tmp]<=100) clone_object(tmp)->move(ob); // 非實體物品就是虛擬物品,就讓玩家增加 1 個 tmp else ob->add_vobjs(tmp,1); } } } } 上面的東西很直覺,你可以把重點擺在讓自己漸漸有能力寫出這 些 code,這樣不管你如何構思要怎麼執行掉寶,你都能在想到的 同時,就馬上能將它們寫成相對映的程式段,就如同我上面所寫 的程式段一樣,tmi2_v3 具有不管你希望它怎麼執行掉寶,它都 幾乎可以辦到的特質,而且很直覺,就如同你上面看到的。 既然它有這樣的特質,則只要常摸就一定能熟。 ※ 編輯: laechan (61.224.75.82), 06/23/2014 23:14:23 ※ 編輯: laechan (61.224.75.82), 06/23/2014 23:16:39 ※ 編輯: laechan (61.224.75.82), 06/23/2014 23:18:56

06/23 23:35, , 8F
只是函數很多,又沒API查,只能慢來
06/23 23:35, 8F
常用的 efun 及 simul_efun 就那幾個,我會寫在說明內,然後我 事先有寫在備忘內你亦可先看,就知道「其實就那幾個而已」,然 後 running 指令就很適合用來練習這些函數。 我新增的系統部份,規則幾乎都很共通: /adm/daemons/vobjd.c VOBJ_D->vobj_data("query","物品編號或名字"); VOBJ_D->mob_drop("query","怪物檔名"); /adm/daemons/mapd.c MAP_D->map_data("query","目錄名"); /adm/daemons/chinesed.c CHINESE_D->chinese_data("query","英文"); (query/set/... 也共通,因為它們都是 cp from /adm/系統物件範例.txt) 以底下的 running code 為例 write(identify("/adm/daemons/vobjd"->vobj_data("query","m001"))+"\n"+ identify("/adm/daemons/vobjd"->mob_drop("query", "/d/area/newbie/mob/rabbit1"))+"\n"+ identify("/adm/daemons/mapd"->map_data("query","redant"))+"\n"+ identify("/adm/daemons/chinesed"->chinese_data("query","knight"))+"\n"); ========== 程式執行區 ========== ([ "name" : "兔毛", "value" : 362 ]) ([ "m001" : 5000 ]) ({ ({ 1, 177, ({ 1, 152 }), "map1x", "炙蟻地獄第一層" }), ({ 178, 331, ({ 210, 313 }), "map2x", "炙蟻地獄第二層" }), ({ 332, 475, ({ 370 }), "map3x", "炙蟻地獄淪臚T層" }) }) "騎士" ========== 程式執行區 ========== 我還有規劃一種速查的做法,但是它跟寫說明文件一樣超耗時間, sanc 一度想實裝但後來我放棄了,tmi2_v3_改 確定會實裝,因為 有要寫說明文件,寫完後再寫它就會比較簡單。 以前 spock@ff 也有翻譯一系列的 LPC 函數說明,因為他有做釋出 ,所以我也會將那一系列的說明檔通通放進 /doc 目錄內,有中文 翻譯。 大家都是從對它很不熟,然後一路走過來的。 ※ 編輯: laechan (61.224.75.82), 06/24/2014 00:20:38

06/25 17:33, , 9F
任務系統接近完工,比sanc現用的還好
06/25 17:33, 9F
> quest show l001 ┌──────────────────────────────┐ │任務名稱:測試任務 │ │任務作者:laechan │ │關 鍵 字:({ "test", "測試" }) │ ├──────────────────────────────┤ │任務步驟: │ │ │ │ 1.與 道具店老闆--瑪兒(Maor) 對話。 │ │ 2.與 修理店老闆--安琪拉(Angelia) 對話。 │ │ 3.與 道具店老闆--瑪兒(Maor) 對話。 │ └──────────────────────────────┘ 話說回來,這不是結束,而是漫長 debug 的開始。。。。。。 ※ 編輯: laechan (61.224.75.82), 06/27/2014 00:49:45

06/30 00:29, , 10F
任務系統明天就能完成雛形必釋出
06/30 00:29, 10F
文章代碼(AID): #1Jf-J-sS (mud)
文章代碼(AID): #1Jf-J-sS (mud)