Re: [閒聊] tmi2_v3_改 使用回饋/提問

看板mud (網路地下城/文字遊戲)作者 (小太保)時間11年前 (2014/06/16 00:25), 11年前編輯推噓5(5010)
留言15則, 2人參與, 最新討論串1/5 (看更多)
※ 引述《tenyfish (何時才有發言權?)》之銘言: : 趁心血來潮,就把 Mud lib 抓下來摸一摸了, : 約莫花了1個小時讀new_wiz及directories等文件 : 然後在u/xxx/開了自己的workroom.c,寫了幾個房間這樣。 : 以下是簡單的心得,不一定有參考價值 : : 1.因為之前有摸過DS MUDLIB所以我直覺得就改完設定 : 開runmud.bat,然後就出錯了(因為driver.exe改位置了) : 原來東西都放在bin裡面了,而且都有中文註記,不錯 : 2.檔案資料架構相對DS mudlib簡單,而且都有原文說明 : 這一點對於新人入門比較方面一點 : 3.DSmudlib會幫有權限的人直接開資料夾,而看起來TMI2要自己去開 : 不然home只會到一個clone的workroom,要是能自動開的話也不錯。 : 有些還沒摸出來,我就直接在這裡提問了, : 懶的回我可以自己再摸看看。 : 4. 回wiz.c有指令嗎 除了goto之外 : 5. 要如何設定home會到的room?是叫workroom.c嗎? : 6. 這裡有任何快速編輯當下房間的指令嗎 : 例:在DSmudlib的 modify room long 這只是一個房間 : 只是一些當下的想法 是通常沒那麼晚睡^^; tmi-2 的話,通常以 "laechan" 這個使用者為例,如果有 /u/l/laechan/workroom.c 的話,按 home 就是 move 到這 個物件,沒有的話就是 move 到你看到的那個 clone 出來 的房間。 換言之你瞭解其運作原理的話 /cmds/wiz/_home.c 指令自 己寫也可以,我在 tmi2_v3_改 寫的一些指令就是這樣子寫 來的。 /d/area/wiz.c 則是用 recall 指令,而且是要 wiz 身份 ,非 wiz 身份則會到 /d/area/newbie/room/007.c,這個 修改日誌有提到可參考。 workroom.c 不是重點,/cmds/std/_recall.c 才是,一邊 看這指令執行的結果,一邊 more 這個指令的內容,兩相對 照就比較能瞭解它是幹嘛的,瞭解其原理的話就能自己寫。 區域房間的部份,我有更快的方法,我在 mud 板有張貼過 這個方法以及實際的 demo 結果,我預計等改到差不多了才 會把區域產生系統放進去。 不論是 roommaker 或是 modify、setroom、....這些做法 對我來說都太沒效率了,萬一不幸的你找不到人一起架站, 你只能一個人架的時候,tmi2_v3_改 就是「即便你只有一 個人」,你也能架站、能維護、能持續發展及擴充。 區域產生器 https://www.ptt.cc/bbs/mud/M.1320510743.A.4BB.html https://www.ptt.cc/bbs/mud/M.1320564310.A.5D9.html https://www.ptt.cc/bbs/mud/M.1321636486.A.0FA.html 新 mud 的設定 - 區域篇 https://www.ptt.cc/bbs/mud/M.1348040578.A.C4A.html 有問題都能盡量提出,在你原本的那篇提出也可,我都會 集中在這篇說明。 ================================================== 殺不了兔子是因為我就是那樣子設定的,你可以參考前面 tmi2_v3_改 釋出的相關文章。 http://www.ptt.cc/bbs/mud/M.1402366361.A.1FB.html 它的關鍵段落,放在 /adm/simul_efun/attack.c 裡面的 normal_attack 函數,如果你有拿武器就有 damage 值那 或許就殺得死,你可以 clone /d/area/newbie/wp 目錄 下的武器出來 wear,然後再打看看。 戰鬥系統也會有說明文件。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.165.194.160 ※ 文章網址: http://www.ptt.cc/bbs/mud/M.1402849541.A.F0C.html ※ 編輯: laechan (1.165.194.160), 06/16/2014 00:29:22

06/16 00:33, , 1F
我clone了一把白瓦的blade殺 傷害740
06/16 00:33, 1F
以武器為例,/cmds/std/_wear.c 會看到最終它做了一個 wear_xx() 的呼叫,這個函數是寫在 /std/weapon.c 裡頭 ,會寫在這裡是因為所有的武器都是 inherit 它。 (也就是 inherit WEAPON = inherit "/std/weapon.c" ) 函數裡面一定會有一行就是 玩家->add_damages(武器的damage); 而它要怎麼跟指令對照呢? 就是你 wear 前 data 一下自 己,wear 後再 data 一下自己,就能發現有兩個數值有改 變: damage(傷害) 與 hit_chance(命中) (或是 call me;query;"damage" ) 我要強調的是,「這是我為 tmi2_v3_改 所做的雛形規劃 」,將來要拿 tmi2_v3_改 架站的人,是可以有自己的規 劃的,就像我也不是照 tmi2_v3 原本的規劃,而是自己寫 一樣。 tmi2 的目錄規劃很簡單,核心目錄說穿了就底下幾個 /adm/daemons /adm/etc /adm/simul_efun /adm/obj /std /cmds /data 如果你會用 grep 指令的話你幾乎能找到你想要找的任何 資訊,如果你不會用也沒關係,因為 win 也提供依關鍵 字搜尋到檔案的功能,所以你確實可以將重點擺在「我今 天看到了一項有中文的執行結果,我就用它來當關鍵字去 找出它到底是被寫在哪裡」,這是確實可以的。 比方我要找「巨大的傷害」是寫在哪.. http://imgur.com/JpPBIek.jpg
※ 編輯: laechan (1.165.194.160), 06/16/2014 00:59:03

06/16 00:50, , 2F
然後我竟然忘了recall的存在 哈哈
06/16 00:50, 2F

06/16 01:04, , 3F
有照你的文件 用data確認傷害
06/16 01:04, 3F

06/16 01:09, , 4F
我先睡了謝謝l大幾個指令摸了一下
06/16 01:09, 4F

06/16 09:14, , 5F
今天繼續新增新的系統
06/16 09:14, 5F

06/16 09:57, , 6F
新增數字圖防機程式
06/16 09:57, 6F
在 win 下,比方你進入某一個目錄,按右鍵→排列圖示依→修改日期, 就可以知道這個目錄有被我動到什麼,以及更動的順序是什麼,比方如 下: http://imgur.com/9uBO1zJ.jpg
像這樣一排就知道我更動了啥,像最新的更動就是 _xxx2.c 那三個指 令,再之前就是 _note.c、_wear.c 這幾個指令。 ※ 編輯: laechan (210.61.157.53), 06/16/2014 12:14:16

06/16 16:54, , 7F
今天進度不錯,這禮拜至少可再釋出1次
06/16 16:54, 7F

06/16 19:25, , 8F
明天會針對/doc/emote稍微做個整理
06/16 19:25, 8F

06/16 19:41, , 9F
並開始動貨幣
06/16 19:41, 9F

06/16 23:20, , 10F
確定有傷害還是殺不死兔子
06/16 23:20, 10F
那就檢查 /adm/simul_efun/tell_room.c > grep -n show * [/adm/simul_efun/attack.c] 307: // 讓 show 依照 result 是否 >0 309: show(me,tar,msg,result[0]); 312: // 內迴的極限就在上面, 即內迴 n 次,show 就會被呼叫 n 次 313: // show 的呼叫如果 [/adm/simul_efun/tell_room.c] 11:// show 最好是用 int 宣告 12:varargs int show(object me,object tar,string msg,int damage) 傷害是從 attack.c 的 normal_attack 函數呼叫 show 函數來執行的。 if(damage>0) tar->receive_damage(damage); 然後再看 /std/body/attack.c 的 receive_damage 函數 > grep -n receive_damage * [/std/body/attack.c] 15:// Added receive_damage() and receive_healing() systems, Watcher 3-27-93 117:int receive_damage(int damage) { 143:// positive healing calls. receive_damage() should be used for damage. dam = query("hp") - damage; if(dam < 0) dam = -1; // 暫時 abort by laechan@sanc 2014/06/01 // set("hp", dam); return 1; } 這就是為何打不死的原因。以上也是一種 trace 的 demo,你可以 參考,tmi2 有些東西是固定的,tmi2_v3_改 也不打算做太大的變 動,以上面來說呼叫 receive_damage 進行扣血就是 tmi2 的傳統 ,我是從 sanc 也是這樣做的來推測。 sanc 的 int 大改過 tmi2 mudlib,結構較 tmi2_v3 更簡單,我 有考慮也做這樣的大改。比方你 update -R /std/monster.c: > update -R /std/monster.c /std/priv.c: Updated and loaded. /std/object/ob_logic.c: Updated and loaded. /std/object/sec_ob.c: Updated and loaded. /std/body/more.c: Updated and loaded. /std/body/wild_card.c: Updated and loaded. /std/body/alias.c: Updated and loaded. /std/body/track.c: Updated and loaded. /std/body/attack.c: Updated and loaded. /std/living/messages.c: Updated and loaded. /std/coinvalue.c: Updated and loaded. /std/living/env.c: Updated and loaded. /std/object/contents.c: Updated and loaded. /std/living/edit.c: Updated and loaded. /std/living/skills.c: Updated and loaded. /std/living/spells.c: Updated and loaded. /std/body.c: Updated and loaded. /std/living.c: Updated and loaded. /std/monster: Updated and loaded. 但是在 sanc 則是 > update -R /std/monster.c /std/ob/mob.c: 更新及載入了. /std/mob/living.c: 更新及載入了. /std/mob/attack.c: 更新及載入了. /std/monster: 更新及載入了. int 這樣的改版不僅是我所欣賞的,也是我想在 tmi2_v3_改 實 作的。 ※ 編輯: laechan (1.165.194.160), 06/17/2014 00:04:03

06/17 12:05, , 11F
今天應可完成新版的 help
06/17 12:05, 11F

06/17 15:10, , 12F
新的 help 指令完工
06/17 15:10, 12F

06/17 16:38, , 13F
drawmap,makearea,trans指令修改完畢
06/17 16:38, 13F

06/17 17:21, , 14F
明天會對戰鬥系統做更多的更動
06/17 17:21, 14F

06/17 22:55, , 15F
明天的目標就是完成區域生產架構
06/17 22:55, 15F
文章代碼(AID): #1JdSa5yC (mud)
文章代碼(AID): #1JdSa5yC (mud)