[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