刚好上次有人问,这里提一下。
带宠物(或是RO的猎鹰、生命体那样的模式)趴趴造的情况,我们
先看结果,当你带着宠物时,别的玩家 look 会看到
> look
一个房间
这是一间寻常的房间。
明显出口有: out.
路人甲(User1)[带着猎鹰]正站在这个地方。
>
假设是这样子显示,在 look_room 那边的判断通常有几种:
1. if(user->query(XXX))
2. if(user->query_temp(XXX))
3. if(pet=present("PET",user)) // 所有宠物都有共通的 PET id
4. if(pet=present("PET",environment(user)))
// 通常很少这样写但也不是不行
// 这样写的缺点是还要把玩家kill宠物、房间reset、玩家recall
// 或阵亡等因素考量进来
我的意思就是,其实我们(mud coder)在 coding 一段时间到有
经验之后,我们的思维就会很自然地变成
我们会优先去想像它在 mud 里头 run 起来的样子
↓
接着大致也会知道大概要动、要改哪些地方(根据经验)
甚至一些 code 就会产生,并开始在脑海里转啊转的..
↓
┌─→ 不可行,可能是基于blabla..等因素
评估 ─┤
└─→ 可行 ─→ 决定动刀的顺序 ─→ 动刀
以宠物系统为例,我通常会先决定的就是上面的 1,2,3,4 要用
哪一种,那假设用 2. if(user->query_temp(XXX))
那就是假设宠物不是带在身上的东西,而是类似"远端"的一个
东西,那接着就决定它是不是生物(living)。
那假设它就是生物,但是又不希望把它带在身上,那就是当我们
召唤牠时:
pet=find_object(对映的宠物档名);
user->set_temp("pet",pet);
这样的做法。
(我没记错的话部份 mud 的 horse 即座骑,是采取这种做法)
这样这个宠物系统最关键的问题就解决了。
剩下的问题就是呈现,而任何的呈现几乎都会跟底下的判断有关
if(pet=user->query_temp("pet"))
比方其它玩家 look 时要看到你带着宠物 -> 改相对应的 code
比方你自己下 i 指令时发现宠物在你身上 -> 改相对应的 code
比方你希望你走动时会看到宠物也跟着你移动的讯息 -> 改相对应的 code
比方你希望下 hp 或下 score 时也能看到宠物的 -> 改相对应的 code
.
.
你考量到的地方越多、你改动的范围也越多时,你所呈现出来的
就会更趋近于真实(real),随时都让人感受到这只宠物就像是在
你的身边跟着你,并且对这件事丝毫不会有任何的起疑。
但是实际上: 这只宠物根本就没有在玩家的身边
然后,实际上没有在你身上,可是能不能做到当你下 look pet
时,能够看到它呢? 当然可以,改相对应的 code 就行了。
以上一点分享,顺便解答某人曾问过我的问题,以及再一次强调
,因为我惯用的 mudlib 跟你正在研究且将要使用的不一样,然
后座骑、宠物等系统,每一家的写法也都不尽相同,所以把握共
通的原则就好,也就是让呈现出来的样子够趋近于真实,就好了
,采取怎样的写法都无所谓啦!
然后多看看别人的 code,甚至多玩、多接触其它游戏、事物,
对自己最有帮助的一点就是会激发自己将来能思考更多可能的写
法。
mud coder 当到最后,每个人都会是高明的诈欺师。