[wizs] 一些設計

作者: laechan (揮淚斬馬雲)   2023-08-08 22:10:00
某房間有某物時,從它鄰近的房間都無法進入該房間
最簡單是改 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 即可。

Links booklink

Contact Us: admin [ a t ] ucptt.com