作者laechan (小太保)
看板mud
標題Re: [閒聊] tmi2_v3_改 使用回饋/提問
時間Mon Jun 16 00:25:38 2014
※ 引述《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://webptt.com/m.aspx?n=bbs/mud/M.1320510743.A.4BB.html
https://webptt.com/m.aspx?n=bbs/mud/M.1320564310.A.5D9.html
https://webptt.com/m.aspx?n=bbs/mud/M.1321636486.A.0FA.html
新 mud 的設定 - 區域篇
https://webptt.com/m.aspx?n=bbs/mud/M.1348040578.A.C4A.html
有問題都能盡量提出,在你原本的那篇提出也可,我都會
集中在這篇說明。
==================================================
殺不了兔子是因為我就是那樣子設定的,你可以參考前面
tmi2_v3_改 釋出的相關文章。
http://webptt.com/m.aspx?n=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://webptt.com/m.aspx?n=bbs/mud/M.1402849541.A.F0C.html
※ 編輯: laechan (1.165.194.160), 06/16/2014 00:29:22
1F:推 tenyfish :我clone了一把白瓦的blade殺 傷害740 1.162.184.31 06/16 00:33
以武器為例,/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
2F:推 tenyfish :然後我竟然忘了recall的存在 哈哈 1.162.184.31 06/16 00:50
3F:推 tenyfish :有照你的文件 用data確認傷害 114.37.55.240 06/16 01:04
4F:推 tenyfish :我先睡了謝謝l大幾個指令摸了一下 114.37.55.240 06/16 01:09
5F:→ laechan :今天繼續新增新的系統 210.61.157.53 06/16 09:14
6F:→ laechan :新增數字圖防機程式 210.61.157.53 06/16 09:57
在 win 下,比方你進入某一個目錄,按右鍵→排列圖示依→修改日期,
就可以知道這個目錄有被我動到什麼,以及更動的順序是什麼,比方如
下:
http://imgur.com/9uBO1zJ.jpg
像這樣一排就知道我更動了啥,像最新的更動就是 _xxx2.c 那三個指
令,再之前就是 _note.c、_wear.c 這幾個指令。
※ 編輯: laechan (210.61.157.53), 06/16/2014 12:14:16
7F:→ laechan :今天進度不錯,這禮拜至少可再釋出1次 210.61.157.53 06/16 16:54
8F:→ laechan :明天會針對/doc/emote稍微做個整理 1.165.194.160 06/16 19:25
9F:→ laechan :並開始動貨幣 1.165.194.160 06/16 19:41
10F:推 tenyfish :確定有傷害還是殺不死兔子 111.243.135.25 06/16 23:20
那就檢查 /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
11F:→ laechan :今天應可完成新版的 help 210.61.157.53 06/17 12:05
12F:→ laechan :新的 help 指令完工 210.61.157.53 06/17 15:10
13F:→ laechan :drawmap,makearea,trans指令修改完畢 210.61.157.53 06/17 16:38
14F:→ laechan :明天會對戰鬥系統做更多的更動 210.61.157.53 06/17 17:21
15F:→ laechan :明天的目標就是完成區域生產架構 61.224.75.116 06/17 22:55