作者laechan (小太保)
看板mud_sanc
标题[程式] 房间随机放怪
时间Sun Nov 11 17:43:31 2007
写在要出门吃饭之前。
假设某个区域有 500 个房间,每个房间都长得差不多...
inherit AREA_ROOM;
void create()
{
::create();
set("exits",([...])); // 只有出口不一样
}
问题:如何在这 500 个房间放怪,而不需要修改这 500 个房间?
解答:从 AREA_ROOM 下手
例如说我们有九种怪,我希望每个房间平均出现 3~5 只怪,然後
这 3~5 只怪是从上述九种怪中随机叫出来的,例如可能是 A B C
,也可能是 A A D E, 也可能是 C E F F G, ...
一、只数随机
二、种类随机
三、怪物总量不变
可以从 AREA_ROOM 的 init 函数着手,init 函数就是,你进房
间之前「会事先呼叫的」,换句话说..
房间本来没怪 -> 你进房间 -> 呼叫了 init -> 放出了怪
-> 然後你才会看到房间有怪(look_room 是在 init 之後执行)
所以可以利用 init 函数去放怪,假设 AREA_MOB 目录下有九
只怪...
0.c 1.c 2.c 3.c ...... 8.c
底下是简单写法...
void init()
{
if(query("already_clone")) return ;
set("already_clone",1);
clone_object(AREA_MOB+random(9))->move(this_object());
clone_object(AREA_MOB+random(9))->move(this_object());
clone_object(AREA_MOB+random(9))->move(this_object());
if(random(2)==1)
clone_object(AREA_MOB+random(9))->move(this_object());
if(random(3)==1)
clone_object(AREA_MOB+random(9))->move(this_object());
}
这样保证叫出的只数是 3~5 只,而且每一只都是「随机从九种
怪里头挑选」,而且在一定时间内只会被触发一次。
因为 500 个房间都继承这个 AREA_ROOM,所以每进任何一个房
间,都会做上述的 init,这样就不需要修改那 500 个房间,也
可以让房间放出怪了。
假设 500 个房间档名依序是...
0.c 1.c 2.c 3.c 4.c ........ 498.c 499.c
然後让九种怪都继承同一个档案 AREA_MOB_D...
// 怪物被杀死的时候
int die()
{
string files;
object room,mob;
files=base_name(this_object());
mob=clone_object(file);
room=find_object_or_load(AREA_PATH+random(500)); // 先让房间载入
mob->move(room); // 再把怪物移过去
::die();
return 1;
}
这样在 A 房间被杀死的怪,在它死之前就会呼叫相同的怪物到
B 房间後才死,如此一来就能确保怪物总量不变
以上。
当然...实际的写法有做一些「保险」的判断,这部份就不透露
了,其实只是上述做一下变化而已,例如说,上面怪物的 die
里头,我的写法是没有去做 clone_object 的动作。
Laechan
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.134.34.90