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

看板mud (網路地下城/文字遊戲)作者 (小太保)時間10年前 (2014/06/24 17:05), 10年前編輯推噓14(1401)
留言15則, 3人參與, 最新討論串20/27 (看更多)
閒聊一下 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
其實非歐美那種超多種族的舊式MUD
06/24 23:02, 2F

06/24 23:11, , 3F
是不用太多語言和貨幣,我只是剛才
06/24 23:11, 3F

06/24 23:25, , 4F
用TEST站時發現買東西都不用錢而己
06/24 23:25, 4F

06/24 23:55, , 5F
有到到被註解掉的部份,正好研究一下
06/24 23:55, 5F

06/25 00:05, , 6F
改過shop.c如何讓它可用?update無效
06/25 00:05, 6F

06/25 00:13, , 7F
有指令可write(me->(query_"?"))嗎?
06/25 00:13, 7F

06/25 00:49, , 8F
雖然我自己寫了一個指令出來用...
06/25 00:49, 8F

06/25 01:37, , 9F
所以call me;query;xxx 這樣用嗎?
06/25 01:37, 9F

06/25 01:41, , 10F
call成功了,謝謝
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
那update後如何讓修改反應出來?
06/25 08:54, 11F

06/25 09:19, , 12F
update後修改不是就更新了嗎
06/25 09:19, 12F

06/25 09:40, , 13F
update shop.c後 買東西仍是舊訊息
06/25 09:40, 13F

06/25 10:53, , 14F
再update here試試看
06/25 10:53, 14F

06/25 12:19, , 15F
好的,所以inherit的物件也需update
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
文章代碼(AID): #1JgJzjZ0 (mud)
文章代碼(AID): #1JgJzjZ0 (mud)