Re: [閒聊] tmi2-mudlib 的更改
閒聊一下 boss 系統。
大抵上會有個 /std/bmonster.c,不用 /std/boss.c 是因為這樣比較
有統一性(gmonster, smonster, bmonster, ..),但使用者可以依自己
喜好新增 #define BOSS BMONSTER 這個我就不干涉。
這個 boss 具有我在 sanc 為舊版 boss 所設定的一些特性,例如血量
可以破 22 億就是它其中一種特性。
再來的話就是新的東西,有的我在 sanc 有提出過但沒有實裝。
簡單的說 tmi2_v3_改 的 boss 分為三種
1.小王型
這種 boss 基本的會帶小兵,它的重生比較隨興,例如使用者可以在
area_room.X 裡面控制它的生出之類的。我限制它可帶的小兵必須是
跟它同目錄的(因為這可透過 #define CLONE_MOBS 去產生),而且該
小王生出的唯一條件就是小兵的檔案已經先產生。
2.地圖 BOSS
這種 boss 跟小王一樣會帶小兵,但是它也可以帶小王,帶著小王的
情況小王就不生小兵。
這種 boss 就類似地圖巡邏者,由 boss 管理系統生出及控管,也就
是說該 boss 不 follow area_room.X 的設定,是自成一格的,管理
系統會隨時掌控 boss 目前所在的位置,以及當 boss 被清掉時,控
制隔多久後再生出等等。
有這系統的好處就是容易實裝所謂的 boss 雷達。
3.BOSS 房間內的 BOSS
這種 boss 一樣會帶小兵,而且一樣可以帶小王。
這種 boss 比較特別的就是「多血條」,我會設定 boss 有五條血,
所有的這種類 boss 都一樣,它不受 boss 管理系統的控制,但是它
會有資料紀錄在 boss 管理系統。
什麼資料呢?比方「該 boss 什麼時間被打倒的、打倒該 boss 的玩
家有哪幾位、隊伍有哪幾隊、打該 boss 花了多久、..」
這種的只紀錄一次,也就是「第一次被打倒」。
打倒這種 boss 後就可以推進下一層區域。
基本上第一次打倒這種 boss 的玩家都可直接升一級。
前面兩種 boss 都是 inherit BMONSTER,但是第三種 boss 會比較特
別 inherit SMONSTER。
在實裝 boss 之前,我會先實裝特攻系統,所以這是實裝特攻系統以後
的事,倒是趁現在可以提一下,boss 很簡單就是有特殊攻擊,以及陣
亡時的處理比較特別。
Laechan
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 210.61.157.53
※ 文章網址: http://www.ptt.cc/bbs/mud/M.1403600749.A.8C0.html
※ 編輯: laechan (210.61.157.53), 06/24/2014 17:06:26
推
06/24 22:22, , 1F
06/24 22:22, 1F
還沒。如果要簡單點就是 ppl->query("balance") 是銀行存款,
ppl->query("wealth") 是身上現金,然後平常採單一貨幣,有需
要第二種貨幣比方 gold 時就是 ppl->query("gold")。
也就是說假設把底層的貨幣當成銀幣,那 balance 跟 wealth 就
是「銀幣」,而「金幣」另外放。
或者 wealth 是銀幣,balance 是金幣,也曾有 mud 這樣子做過
,例如假設做成 100:1 的比例,要存錢一定要 100 銀以上才能存
,存進去的就是金幣。
然後要做成泛用的呼叫就是函數化,也就是說例如
ppl->query_wealths(); // 預設讀銀幣
ppl->query_wealths("gold"); // 讀取身上的金幣
ppl->query_balances(); // 預設讀銀幣存款
ppl->query_balances("gold"); // 讀取金幣存款
ppl->add_wealths(100); // 身上的銀幣增加 100
ppl->add_wealths("gold",100); // 身上的金幣增加 100
.
.
然後玩家身上 wealth 與 balance 的欄位就用 "wealth" 與
"balance"。
> data me
balance : ({銀幣的量,金幣的量})
wealth : ({銀幣的量,金幣的量})
這是我預計要做的,沒排入優先事項,我猜是因為我不滿意這樣的
做法,然後我期望這段期間我有想到更好的做法這類的。
(我是有想過直接用 query_moneys 更簡潔一點)
※ 編輯: laechan (61.224.75.82), 06/24/2014 22:55:26
推
06/24 23:02, , 2F
06/24 23:02, 2F
推
06/24 23:11, , 3F
06/24 23:11, 3F
推
06/24 23:25, , 4F
06/24 23:25, 4F
推
06/24 23:55, , 5F
06/24 23:55, 5F
推
06/25 00:05, , 6F
06/25 00:05, 6F
推
06/25 00:13, , 7F
06/25 00:13, 7F
推
06/25 00:49, , 8F
06/25 00:49, 8F
推
06/25 01:37, , 9F
06/25 01:37, 9F
推
06/25 01:41, , 10F
06/25 01:41, 10F
call 物件;函數;要帶的參數...
例如 call me;set;"level";10 相當於 me->set("level",10);
call me;query;"level" 相當於 me->query("level")
simul_efun 的 call 則可以這樣做
> call /adm/obj/simul_efun;atoi;"123"
房間(/adm/obj/simul_efun)-> atoi( "123" ) = 123
(more /adm/obj/simul_efun.c 就能發現它 include 了一堆檔案,
那些檔案就放在 /adm/simul_efun 下,因此 call simul_efun.c
就能呼叫被它 include 進來的所有 simul_efun)
但是要 call efun 呢?
running 指令就提供了更簡易的方法
> running
編輯結束並存檔(.). 中途放棄編輯(~q).訊息暫時中斷。
__________________________________________________________________
obs=users();
foreach(ob in obs)
if(ob && ob->query("level")>0)
tmp+=sprintf("%-12s 等級 %3d\n",
ob->query("name"),
ob->query("level"));
me->more(explode(tmp,"\n"),1,1);
.
========== 程式執行區 ==========
jana 等級 65
blancneige 等級 120
pss2 等級 120
teresa 等級 120
lannssssyy 等級 120
.
.
========== 程式執行區 ==========
簡易的 running code 及其執行結果就像底下
> running
編輯結束並存檔(.). 中途放棄編輯(~q).訊息暫時中斷。
__________________________________________________________________
write("hello, world!\n");
write("你的等級: "+me->query("level")+".\n");
.
========== 程式執行區 ==========
hello, world!
你的等級: 120.
========== 程式執行區 ==========
其中,me、ob、obs、i、j、tmp、.. 等等就是內建變數,內建了
哪些變數可自行 more /cmds/wiz/_running.c,若你懂了該指令
也可以視自己的需要擴充內建變數:
int running(object me,object env)
{ ^^^^^^^^^^連這個也是內建變數
// 變數可依需要自己新增
int i,j,k;
mixed obs=({});
object ob;
string tmp;
mapping data=([]);
// 注意:新增了什麼變數, 就要相對初始化什麼變數
ob=me;
obs=({});
i=0;j=0;k=0;
tmp="";
我會內建這些變數是因為大部份的情況通常用到這些變數就已足
夠,頂多再增加一個 mixed tmps=({}) 幾乎就夠用了。
running code 就是「所見即所執行」,它可以讓 wiz 橫空執行
一段程式碼,而不需藉助工具物件或 workroom 或其它指令的幫
助,只要靠 running 指令就夠了,而且它也會受到權限的限制.
因為 call 有它的極限,而總不能每每想要執行什麼,就得去改
workroom 來做或是寫物件,「如果有更方便的東西就好了」。
※ 編輯: laechan (61.224.75.82), 06/25/2014 06:33:25
推
06/25 08:54, , 11F
06/25 08:54, 11F
→
06/25 09:19, , 12F
06/25 09:19, 12F
推
06/25 09:40, , 13F
06/25 09:40, 13F
推
06/25 10:53, , 14F
06/25 10:53, 14F
推
06/25 12:19, , 15F
06/25 12:19, 15F
如果有 a b 兩個物件,a 裡面有函數這樣寫
void xxx()
{
b->xxx();
}
那只要 update b,呼叫 a 執行 xxx 的結果就會更新。
但如果 a inherit b:
void xxx()
{
::xxx();
}
那 update b 後 a 不會更新,因為 a 還騎在舊的 b 上面,
這時簡易的 update 方法是
update -R a
它會先對 a 所繼承的 b 做 update,做完才做 a 的 update
※ 編輯: laechan (210.61.157.53), 06/25/2014 12:47:05
討論串 (同標題文章)
完整討論串 (本文為第 20 之 27 篇):
mud 近期熱門文章
PTT遊戲區 即時熱門文章