作者laechan (小太保)
看板mud
标题[闲聊] 让一只怪物占据两个房间以上的做法
时间Sat Apr 13 09:53:45 2013
比方说按照一般的做法,当房间有设定怪物时
mob=clone_object(怪物档案);
mob->move(room);
那麽,因为有 mob->move 的动作,就可以在 move 这个函数
里面做手脚。比方说,某个房间的某只怪物设定其占据面积为
2 时..
env->set("room_range",2);
则在 move 时做底下设定..
::move(room);
env=environment(mob);
r=env->query("room_range");
if(r>0)
{
mob_file=base_name(mob);
mob->set_other_mobs();
exits=keys((mapping)room->query("exits"));
for(i=1;i<r;i++)
{
another_mob=clone_object(mob_file);
// 设定 another_mob 的资料与 mob 同步
another_mob->set_temp("origin_mob",mob);
another_mob->move(room->query("exits/"+exits[i-1]));
mob->add_other_mobs(another_mob);
}
}
然後在该 mob 档案里新增 set_other_mobs 与 add_other_mobs
函数,然後在阵亡函数这样写..
varargs int die(object ppl,int f)
{
object *mobs=query_other_mobs(),mob;
// 当死掉的不是源头怪物时,用 f 来判断要不要死
// 或是先呼叫源头怪物让它来执行所有怪物的 die
if(mob=query_temp("origin_mob"))
{
if(f<1)
mob->die(ppl,1);
else
::die(ppl);
return 1;
}
// 当死掉的是源头怪物时, 先让所有 another_mobs die
if(sizeof(mobs)>0)
foreach(mob in mobs)
mob->die(ppl,1);
::die(ppl);
return 1;
}
然後相关的函数如 set、add 等设一下,以 set 为例..
varargs int set(string label,mixed term,int f)
{
object *mobs=(mixed)query_temp("other_mobs"),mob;
::set(label,term);
// 若该怪物是 another_mob 的话就对源头 mob 做同步设定
if(mob=query_temp("origin_mob"))
mob->set(label,term,1);
// 若有 f 参数就执行到这
if(f>0) return 1;
// 若该怪物为源头怪物、f<1、且有 other_mob 时就对所有 other_mobs 做同步设定
if(sizeof(mobs)>0)
foreach(mob in mobs)
mob->set(label,term);
return 1;
}
add 函数、delete 函数也是相同做法,query 函数则不需要自
订(因为资料都已同步)。
设定 XXX_other_mobs 函数的用意,是不让其资料与 data 同步
,比方可设定它是存在 temp_data 这样。
也就是说实际上..
初始化
set_other_mobs = set_temp("other_mobs",({}));
add_other_mobs = add_temp("other_mobs",({another_mob}));
query_other_mobs = query_temp("other_mobs");
底下是在 sanc 运行的结果..
> update here
/d/wiz/room/disc: 更新及载入了.
> l
[/d/wiz/room/disc ]
巨型高塔
明显出口有: down, south, west, up, east, 和 north.
Lv250.『你可以跟我 adv 属性』小卤蛋(Lodao)
> d
巨型高塔下
明显出口有: south, west, 和 up.
Lv250.『你可以跟我 adv 属性』小卤蛋(Lodao)
然後 down 这格的 lodao 血量设为 1
> call lodao;set;"hp";1
怪物(lodao /d/wiz/mob/lodao)-> set( "hp", 1 ) = 0
然後去 up 看 up 那格的 lodao 血量
> call lodao;query;"hp"
怪物(lodao /d/wiz/mob/lodao)-> query( "hp" ) = 1
也就是说,玩家不管打哪个房间的怪物,另一个房间的怪物的
血量一定会同步,而且阵亡也会同步,例如把 down 那只给
call die
> call lodao;die
小卤蛋发出一声惨叫!!
小卤蛋慢慢的倒在地上死了...你得到 38160点的经验值。
你拿起『你可以跟我 adv 属性』小卤蛋(Lodao)身上所有的东西。
然後去 up 看
> up
[/d/wiz/room/disc ]
巨型高塔
明显出口有: down, south, west, up, east, 和 north.
Maldi:进阶牧师 [队员]雾特翎v民兵团
Ipos:神只官斋巫女 [队员]凯特雷c拳士团
Ubest:法师 [队员]雾特翎v民兵团
>
即 up 那只也会死亡。反过来也是一样。
这样写的特色是,比方某 BOSS,玩家不一定只能聚集在同一格
去打该 mob,例如它可以分布在底下五个房间..
x
|
x-x-x
|
x
而玩家可以将人马分开来,就不会大家都挤在一起造成房间处理
讯息上的 loading 过重以及玩家观看画面的混乱等等。
一点心得跟大家分享。
Laechan@Sanc
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 1.165.172.198