作者laechan (小太保)
看板mud
标题Re: [问题]关於es2lib虚拟物件的生成
时间Wed Dec 28 16:41:07 2011
※ 引述《happyhero (2010)》之铭言:
: Es2lib的物件生成 有种以虚拟物件的方式
: 例如有个档案是 /std/room.c
: 可以在程式码里用
: obj=new("/std/room.c");
: 来生成一个新的物件
: 然後档名会变成/std/room#33
: /std/room#76
: /std/room#177
: ....
: (都是原档名後面增加#数字)
: 想请问虚拟物件的档名是如何产生?
: (#後面的数字是乱数决定或是有规律?)
: 有办法改变或指定虚拟物件生成後的档名吗?
: 想说如果可以的话
: 就可以方便管理整个都用虚拟物件生成的区域
: 最近在写类似OLG副本的东西
: 例如某个玩家happyhero开启了副本
: 那那个区域房间名就会以 /std/room/happyhero/0/0/0
: /std/room/happyhero/0/1/0
: 後面数字表示三维空间(x,y,z) 0/0/0=第0层空间的(0,0)
: 这样还可以做出无限层的地下城冒险区域
这个一般建议是不要这样写,比方说单人副本,省时省力
的方法就是「全部运作在同一个房间」。
例如该房间平常长底下这样..
地下城--一楼
这里可看到一条长长的走道,走道上十分的阴暗,不远处
似乎有着水滴的声音。
明显出口有: north, south.
则当你往 north 走时
set("pre_exit_func/north","check_north");
object tmp_room;
int check_north()
{
object ppl=this_player();
int *pos=([]);
pos=query("pos"); // 读取房间座标 ({x,y})
做一下必要的判断如战斗中,etc...时不能走动;
if(!tmp_room)
tmp_room=find_object_or_load(TMP_ROOM); // 自设一个房间当 tmp_room
// 往北走 => y+1
set("pos",({pos[0],pos[1]+1});
set("long",set_room_long()); // 重设房间 long
set("exits",set_room_exits()); // 重设房间出口
ppl->move(tmp_room); // 先把玩家移往 tmp_room
ppl->move_player(this_object()); // 瞬间再把玩家移回来
clone_mob(); // 做一下房间怪物的随机召唤
return 1;
}
这样就可以模拟一个玩家在一个「空间」里面的走动跟战斗
,set_room_long 等函数就看你怎麽写。
这样当 n 位玩家同时在解这个「单人任务」时,就可以每个
玩家给一个房间来跑(tmp_room 则是大家共通的),而假设是
n 人组队型的任务,就限制不能脱队即可。
而这样的房间也可以事先写好,例如预设同一时间只能 10个
团体(包含单人)解任务,那就一次写好十个房间就可以了,这
样玩家在解任务时会变更的就只有物件资料(记忆体资料),档
案的读写部份就会比较少。
至於档案部份一般是 base_name 跟 file_name 的区别,後者
或许你可以找找 simul_efun 区是不是有该函数,那说不定就
能找到後头的编号是怎麽编的。
(印象中是物件生成流水号)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 223.142.203.159
1F:推 happyhero:全部运作在同一个房间的做法不错 12/28 20:20
2F:→ happyhero:这样就只剩遇敌战斗的问题了 限制有mob在时不能逃跑 12/28 20:21
3F:→ happyhero:或是看不到不同坐标的生物 12/28 20:23
一般来说有一种做法并不需要知道 file_name 所加的流水号。
例如你因为需要而得在同一时间 new 出 n 个物件,那麽你可以
做个 control_room
object cr,new_room;
int *pos=([]);
string new_pos;
if(!cr)
cr=find_object_or_load(CONTROL_ROOM);
j=sizeof_rooms; // 需 new 出的 n 个房间
for(i=0;i<j;i++)
{
new_room=new(room); // new 出新的房间
pos=get_pos(i); // 取出第 i 个房间的座标
new_pos=implode(pos,"_"); // 把座标变成 a_b_c 这种字串
cr->set("new_pos",new_room);
}
这样你要读取座标 (a,b,c) 的房间时
this_room = (object)cr->query(""+a+"_"+b+"_"+c);
※ 编辑: laechan 来自: 122.117.7.33 (12/28 21:00)
4F:推 happyhero:XD...我刚才在写control room的方式 这里就出现了 12/28 21:52
5F:→ happyhero:不过刚事先用单向道做测试 所以很单纯记录1->2->3->4... 12/28 21:53