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

看板mud (網路地下城/文字遊戲)作者 (小太保)時間11年前 (2014/06/10 10:12), 11年前編輯推噓0(006)
留言6則, 1人參與, 最新討論串12/27 (看更多)
tmi2_fluffos_v3_改,20140610 版本 http://sanclaechan.myweb.hinet.net/tmi2_fluffos_v3_modify.rar 建議下載並解壓縮後目錄位置為 D:\tmi2_fluffos_v3_改\ (底下以 tmi2_v3_改 簡稱) 這個版本做了更有效率的壓縮,檔案大小約 3MB 多。 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_改\ 目錄下會放一些圖片及說明文件。 目前連線 telnet://210.61.157.53:5000 可連到以最新版本所架的測試站 ,有公頻聊天指令可使用。 ================================================================== 本次修改範圍: 2014/06/06~2014/06/09 一、實裝 wear/remove 指令 移除 tmi2_v3 原先使用的 equip、unequip、wield、unwield 四個指 令,改成穿脫裝備一律使用 wear 及 remove 指令。 (但是透過修改 /adm/etc/global_aliases,玩家還是能使用這四個指 令,只是它們會被導向 wear 及 remove) 裝備是否被 wear 的參數也統一使用 "wear" 資料欄位。 還有一些細部的地方要修改,集中在 /std/armor.c 與 weapon.c。 二、實裝 /adm/daemons/channeld.c 公頻管理系統 這是仿 sanc 對公頻的規劃,而 sanc 是仿 tmi2 對 channels 的規 劃(所以系出同源)。 這東西簡單的說就是 user.c 的 cmd_hook 函數是管理玩家下了指令   後應呼叫什麼,在它裡面加上這一段: if(verb=="chat" || verb=="rumor" || verb=="chatlog") return CHANNEL_D->find_channel(this_object(),verb,cmd); 那麼遇到玩家下 chat、rumor、chatlog 的場合就會讓 channeld.c 呼叫 find_channel 函數去執行相對映的動作。 這樣日後不管增加幾個頻道指令,都不會佔用 /cmds/std 的指令數 量,而且方便管理各個公頻。 三、確立 tmi2_v3_改 的 "stat" 屬性欄位 這是可以日後修改的。 /include/stats.h 定義了 tmi2_v3_改 使用的六個屬性。 /adm/daemons/newuserd.c 也設定新玩家會預載這六個屬性。 /std/body/attack.c 也建立 query_stats、set_stats、add_stats 等函數,用來統一做為屬性資料的存取函數。 /std/user.c 則尚未動到相關設定。 (玩家與 mob 皆共用相同的函數) 這樣日後使用者想要修改 tmi2_v3_改 的屬性時,只要更動上述四   個檔案的對映內容即可,這是建立在「你的 mud 尚未正式開放給 玩家遊戲」的前提。(已開放的 mud 要做更多修改是必然的) 例如說你希望你的 mud 沒有 "mag" 欄位,然後以動 attack.c 為   例,它的做法就類似底下 int query_stats(string str) { if(str=="mag") str="int"; return data["stat"][str]; } 這樣 tmi2_v3_改 原本讀取 "mag" 的地方就通通會被導向為讀取 "int",也就是說日後你只需要動相關的函數就行了。 四、實裝新的戰鬥系統&普攻的部份 新增 /adm/simul_efun/attack.c 全域函數物件 它有幾個與戰鬥系統有關的函數(而且視情況會再增加) cant_attack(object me,object tar) me 與 tar 能否進入戰鬥狀態的總控管函數 damage_str(int hp,int damage) hp 指的是 tar 的剩餘 hp,damage 指的是對 tar 的傷害。比    方 hp 剩 1000,而 damage 是 500,意思就是說這一擊就造成    對方剩餘血量「又少掉 50%」,然後它就會傳回一個對這一擊    的描述,如下的 running code: > running To end message type ".". To abort, type ~q. To view help, type ~h. __________________________________________________________________ write(damage_str(1000,500)+"\n"); . ========== 程式執行區 ========== 對$O造成身體機能嚴重的傷害! ========== 程式執行區 ========== 我應該會變更這個函數,把 damage 放前面 hp 放後面,並改用 varargs 宣告,這是方便使用者日後做修改。 defence_attack(object me,object tar,int dam,int hit) 這個函數就是 me 與 tar 在進行戰鬥時會呼叫的函數,用來處 理閃格擋的相關判斷,並得到最終的傷害計算結果及相對映的訊    息等等。 目前我還沒有寫 sample 進去,之後我會寫一個簡易的 sample。 即便如此,使用者目前還是可以找 newbie 區域裡面的小兔兔進    行戰鬥測試(只是訊息幾乎都會是沒有造成傷害這類的)。底下會    有 demo。 總之,閃格擋通通都是呼叫這個函數做統一處理。 notmal_attack(object me,mixed attackers,int n) 這個就是「普攻」的專門處理函數,也就是 continue_atttack 一般會持續呼叫的函數。 這個函數的運作過程很簡單,它當然會先判斷自己與該戰鬥的目    標們是否存在,存在的話: tar=attackers[0]; // tar=attackers[random(sizeof(attackers))]; 就選出一個 tar 來做為本次攻擊的目標。選擇的方法不外乎兩    種:固定及亂數。tmi2_v3_改 預設為取 attackers[0]。 接著,就是呼叫 defence_attack(me,tar) 來做閃格擋方面的相    關判斷並取得結果: // 先讀取 defence_attack 的計算結果 // ({傷害, "閃格擋訊息"}) result=defence_attack(me,tar); 然後取得 me 本次攻擊應擊出的攻擊敘述(空手, 拿武器, en..) // 每連擊一次,就取得一次 me 的攻擊訊息 msg=sprintf("%s,%s",me->query_attack_msg(),result[1]); 第一個 %s 就類似 "$N用砂鍋大的拳頭打向$O" (me->query_attack_msg()) 第二個 %s 就類似 "造成了巨大的傷害!" (result[1]) 最後將 msg 傳給 show 做處理: show(me,tar,msg,result[0]); show 也是本次新增的全域函數,寫在 tell_room.c 裡頭。 細部的說明可參看修改日誌.txt。 ================================================================= 底下為 demo 的部份。 > chat *test 【閒聊】你笑道:『測試一下東東。』 > rumor *test 【謠言】你笑道:『測試一下東東。』 > rumor test 【謠言】你說道: test > chatlog (09:40) 某人 : test (09:40) 某人 : *test (09:40) Laechan : *test > i You are carrying 6 objects. (Total bulk: 0 Total weight 68) 新手地圖(newbie map). 小短劍(short sword). 格鬥匕首(fight dagger). 小布靴(boots). 小披風(cloak). 小布靴(boots). > data armor : ([ ]) armor_class : 0 damage : 0 hit_chance : 0 > wear all 你裝備上小短劍(short sword). 已裝備上 sword 就不會再去裝備 dagger 你裝備上小布靴(boots). 你裝備上小披風(cloak). 你裝備上小布靴(boots). <= 這有一點 bug 下次修正(實際上無裝備) 你裝備上所有的東西! > i You are carrying 6 objects. (Total bulk: 0 Total weight 68) 新手地圖(newbie map). 小短劍(short sword) (已裝備). 格鬥匕首(fight dagger). 小布靴(boots) (已裝備). 小披風(cloak) (已裝備). 小布靴(boots). <= 實際上是沒有裝備的 > data armor : ([ "cape" : 30, "foot" : 15 ]) armor_class : 45 damage : 175 <= 裝備武防後相關數值的更動情況 hit_chance : 350 > remove all 你卸下了小短劍(short sword). 你脫下了小布靴(boots). 你脫下了小披風(cloak). 你脫卸了所有的武防! > i You are carrying 6 objects. (Total bulk: 0 Total weight 68) 新手地圖(newbie map). 小短劍(short sword). 格鬥匕首(fight dagger). 小布靴(boots). 小披風(cloak). 小布靴(boots). > data armor : ([ ]) armor_class : 0 資料順利歸零 damage : 0 hit_chance : 0 > data stat : ([ "dex" : 11, "agi" : 11, "con" : 11, "int" : 11, "str" : 13, "mag" : 11 ]) > k rabbit 你對著小兔兔喝道: 「小王八蛋! 今日不是你死就是我活! 」 ☆☆☆ 戰 鬥 開 始 ☆☆☆ 你用砂鍋大的拳頭打向小兔兔,但是無關痛癢.. 小兔兔用砂鍋大的拳頭打向你,但是無關痛癢... 上面就代表 me 與 tar 在呼叫 continue_attack 的過程中是順利的。 然後我 demo 兩種攻擊對象消失時的情況 > call rabbit;set;"hp";0 <= 1.將 rabbit 的血量變成 0 OBJ(小兔兔 /d/area/newbie/mob/rabbit1#14)-> set( "hp", 0 ) = 1 > You have died. <= 這一句是錯的應顯示為 rabbit has died. 以後會修正並中文化. ○○○ 這場戰鬥結束了! ○○○ 第二種 > k rabbit 你對著小兔兔喝道: 「小王八蛋! 今日不是你死就是我活! 」 ☆☆☆ 戰 鬥 開 始 ☆☆☆ 你用砂鍋大的拳頭打向小兔兔,但是無關痛癢... 小兔兔用砂鍋大的拳頭打向你,但是無關痛癢... > update here <= 2.將房間更新 /d/area/newbie/room/012: Updated and loaded. > ○○○ 這場戰鬥結束了! ○○○ continue_attack 會判斷何時開始進入戰鬥,以及何時戰鬥消失。 今次最主要的修改就是將原本只需 me->kill_ob(tar) 的單方面呼 叫,修改為若 me 與 tar 要進入戰鬥,一定要 me->kill_ob(tar); tar->kill_ob(me); 它的好處就是有時候我們視情況會需要「打不還手的 mob」,這時 只需要 call me;kill_ob;目標 即可。(想要它還手就下 kill) 我規劃 tmi2_v3_改 在戰鬥上至少有四種類技能: 1.基礎技能(有些遊戲稱為被動技能) 2.enable 類技能 3.cast/spell 類技能=法術技能 4.force 類技能=特攻技能 未來它們都會有相對映的指令、物件以及函數,而且會參考 sanc 的發展經驗,為相關的存取及運算做一下最佳化的配置,而且這些 技能也都會有 sample 檔供設定參考。 技能會使用 "skill" 這個欄位,並有 query/add/set/del_skills 等欄位相關存取函數,但是特殊情況下會直接讀欄位值。 (所以才說函數化不是萬能的) 技能熟練度則會使用 "skill_exp" 欄位名稱,技能熟練度的相關 存取函數則會使用 query/set/add/del_skill_exps 等名稱。 下一次的改版會優先以虛擬物品系統的實裝為主,並且應該會重寫 monster.c 的 die 函數,讓怪物可掉落虛擬物品。 laechan -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 210.61.157.53 ※ 文章網址: http://www.ptt.cc/bbs/mud/M.1402366361.A.1FB.html

06/10 10:23, , 1F
對了目前怪物的killer參數無效化狀態
06/10 10:23, 1F

06/10 17:16, , 2F
虛擬物品系統已寫好再來是掉落物系統
06/10 17:16, 2F
2014/06/10 20:40 updated Liao 你的訊息我有看到,裝備武器 quit 會保留 damage 的問題, 只要修改 complete_setup 即會解決(我還沒動這個函數)。 戰鬥離開原本區域,不會停止戰鬥的問題,是因為我沒有把雙方的 env 於現階段加進判斷的緣故,加進去就可以解決。 (現階段你可使用巫師指令 halt 終止戰鬥) 虛擬物品系統及怪物掉落物系統皆已完工。 ※ 編輯: laechan (61.224.75.253), 06/10/2014 20:41:48

06/11 17:57, , 3F
今天嚐試intermud,不意外地..失敗了
06/11 17:57, 3F

06/11 21:46, , 4F
嚐試了intermud的替代方案, 理論可行
06/11 21:46, 4F

06/12 23:16, , 5F
下一個版本要解決autoload不work問題
06/12 23:16, 5F

06/13 15:47, , 6F
autoload 會 work 了
06/13 15:47, 6F
文章代碼(AID): #1JbccP7x (mud)
文章代碼(AID): #1JbccP7x (mud)