作者laechan (揮淚斬馬雲)
看板mud_sanc
標題[wizs] 一些設計
時間Tue Aug 8 22:10:00 2023
某房間有某物時,從它鄰近的房間都無法進入該房間
最簡單是改 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://webptt.com/m.aspx?n=bbs/mud_sanc/M.1691503802.A.8F6.html
1F:推 justinj : end先處理..任務j040有用過 08/09 11:04
2F:→ justinj : step1_msg=它出現在"+CONTROL->get_name()+"上 08/09 11:04
3F:→ justinj : step1_end=set_quest_data() 08/09 11:05
4F:→ laechan : 讚 >_<b 08/09 11:06
※ 編輯: laechan (59.126.145.135 臺灣), 08/09/2023 11:27:43
5F:→ justinj : 剛剛搜到/adm//vip/access裡的/d/spell權限是[r] 08/11 08:43
6F:→ justinj : 所以不能改,雖然還沒查到norr是如何開放給我改他的 08/11 08:44
7F:→ justinj : 目錄的 08/11 08:44
8F:→ laechan : 那個在 /d/ppl/adm 下改的, /d/spell 下的東西我還 08/11 09:25
9F:→ laechan : 在動,權限已開,但建議你先cp比方fire2.c,改一改沒問 08/11 09:26
10F:→ laechan : 題,再確認一下我有沒有在改,然後再cp回fire.c 08/11 09:27
11F:→ laechan : 原先的fire.c 則備份一下 08/11 09:28
12F:→ laechan : 技能有改動啥盡量發文說明一下 08/11 09:32
13F:→ justinj : 了解 08/11 11:14
14F:→ laechan : 我最近動的範圍會先侷限在種族進化的相關技能及新技 08/11 15:28
15F:→ laechan : 能的檔案,最近會新增的是/d/spell/meteor.c 08/11 15:29