※ 本文轉寄自 ptt.cc, 文章原始頁面
看板mud_sanc
標題

[wizs] 一些設計

時間
最新2023-08-11 15:29:00
留言15則留言,2人參與討論
推噓1 ( 1014 )
某房間有某物時,從它鄰近的房間都無法進入該房間 最簡單是改 go,但移動不只有 go,而且移動手段多種,所以 最好的方法是該物本身有 init 函數,當被觸發時 void init() { object ppl=this_player(),env; if(!userp(ppl)) return ; // 讀取玩家上一個地點 if(!env=ppl->query("last_location")) return ; // 把玩家踢走 if(env=environment(this_object())) { ppl->move_player(env->query("exits/out"),"SNEAK"); return ; } // 把玩家移回前一個地方 ppl->move_to(env); return ; } 這個可以用在攻城戰的階段設計,當敵方還存在著某些單位時, 玩家無法突破,必須先掃除該階段的敵人,然後這些單位會遠隔 攻擊玩家,也就是玩家一邊要清除現階段的敵人,一邊要承受敵 人的遠隔砲火,直到敵人清除完畢,那麼這些單位才會轉化成實 際的可攻擊單位,玩家才能進入去清除這些敵方單位。 如何讓任務具有隨機性 quest read 後會產生 .c 檔,為該檔做前置程式段塞入主要是 靠腳本檔的 other= 去添加,解析 .c 檔的結構: inherit "/open/cmds/quest/quest_d.c"; void set_quest_data() { quest_data["1"]["msg"]=" $M:你好哇~趕快先去加入(join)東邊盡頭的冒險者公會   加入後就能回來找我領賞喔 ^_^"; . . 理論上,玩家 quest ooo about xxx 時,stepX_end 會被呼叫 ,就可以在這裡動手腳: int stepX_end() { string msg=quest_data["X"]["msg"]; mixed foods=({"蘋果派","蘋果蛋糕","蘋果司康"}); int r=random(3); msg=substr(msg,"$FOOD",foods[r]); me->set("record_data/quest_l013_food",foods[r]); return 1; } 不過,到底是 msg 先被丟過去處理,還是 end 先被呼叫,就 要實際印證才知道,若是 msg 先被處理,那就要調換 end 到 更優先的呼叫位置。 如何讓副本串副本 /u/l/laechan/skycastle/room/street/game2.c 進入副本的方法 questing("instance","create","laechan/0071", ({"/u/l/laechan/workroom",({me}),"normal",0})); 在 0071.c 裡頭有循環判斷函數 instance_check if((int)ob->query_temp("time_record/shadow_1_dragon_times")>=3) { tell_object(ob,"你已經殺掉了三位龍忍者,自動進入下一關!\n"); ob->delete_temp("time_record/shadow_1_dragon_times"); } 只要在上述判斷區加上一行(目前還沒加): questing("instance","create","laechan/0072", ({"/u/l/laechan/workroom",({me}),"normal",0})); 這樣玩家就會從 0071 副本跳進 0072 副本。 龍忍者發出一聲慘叫!! 龍忍者慢慢的倒在地上死了...你得到 11488點的經驗值。 你拿起[副本怪] 龍忍者(Dragon Ninja)身上所有的東西。 75% 103% 100% > 你已經殺掉了三位龍忍者,自動進入下一關! 目前有規劃幾個副本會做這樣的設計,初期會用來模擬一些任○堂 的遊戲。 如何避免怪物遭受無心跳攻擊 最簡單的方法是怪物自定義 set_heart_beat 函數: int set_heart_beat(int i) { // 不管 i 是什麼,都當成 1 ::set_heart_beat(1); return 1; } 目前會讓怪物無心跳的技能為束縛術 /d/spell/confine.c,實際 上若讓 set("no_confine",1); 有作用也是可以的。 如何防止怪物被破甲攻擊置換 有一種做法是讓房間做循環判斷,假設循環判斷的函數是 heart_beat: int heart_beat() { mixed obs; object ob,origin_mob; if(!obs=all_inventory(this_object())) return 1; foreach(ob in obs) { if(!ob) continue; // 有發現到被破甲的怪時 if(base_name(ob)==FINGERWIND_MOB_FILE) { if(origin_mob=ob->query("origin_mob")) { // 就自動交換回來 origin_mob->move(this_object()); ob->remove(); continue; } } } return 1; } 上面讀取 origin_mob 的設定也可以換成 clone 別的怪物。 另一種做法則是,因為只有 fingerwind 會破甲,只要簡單限制 玩家無法在該房間施展任何 fist 即可。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.126.145.135 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/mud_sanc/M.1691503802.A.8F6.html

15 則留言

justinj, 1F
end先處理..任務j040有用過

justinj, 2F
step1_msg=它出現在"+CONTROL->get_name()+"上

justinj, 3F
step1_end=set_quest_data()

laechan, 4F
讚 >_<b
※ 編輯: laechan (59.126.145.135 臺灣), 08/09/2023 11:27:43

justinj, 5F
剛剛搜到/adm//vip/access裡的/d/spell權限是[r]

justinj, 6F
所以不能改,雖然還沒查到norr是如何開放給我改他的

justinj, 7F
目錄的

laechan, 8F
那個在 /d/ppl/adm 下改的, /d/spell 下的東西我還

laechan, 9F
在動,權限已開,但建議你先cp比方fire2.c,改一改沒問

laechan, 10F
題,再確認一下我有沒有在改,然後再cp回fire.c

laechan, 11F
原先的fire.c 則備份一下

laechan, 12F
技能有改動啥盡量發文說明一下

justinj, 13F
了解

laechan, 14F
我最近動的範圍會先侷限在種族進化的相關技能及新技

laechan, 15F
能的檔案,最近會新增的是/d/spell/meteor.c

laechan 作者的近期文章

Re: [wizs] 節慶相關
※ 引述《justinj (黑旋風)》之銘言: : 之前有些怪物只在節慶出現,想將他們做成自動化開放, : 以下是整理出來的 : 年獸 : /d/event/newyear/control.c-&gt;take_war(); : 目前 we
更多 laechan 作者的文章...