作者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/cn.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