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