区域


你在漂亮的森林MUD游戏中创建了一个名为“草地”的房间,这看上去都挺好的,但如果你在森林的另一端也想要一片草地呢?作为游戏的创建者,这可能会导致各种混乱。比如你想传送到草地,现在会给你一个警告说你有两个草地,你必须选择其中一个。这没什么问题,你只要选择一个就行了,比如去2号草地,但除非你仔细地检查过它们,否则连你也无法确定哪片草地位于森林有魔法的一侧而哪片不是。

举另一个例子,如果你想将房间按地理区域分组,比如森林“正常”部分的天气模式和魔法部分的不一样,或者在魔法森林的所有房间中都有魔法干扰。如果你能轻松地找到所有带有魔法的房间,那向它们发送特定信息会非常方便。


Evennia的区域

区域会通过全局位置将房间区分开。在我们的例子中,森林被分为两部分 —— 有魔法的部分和没有魔法的部分。它们各自的草地和房间都应该易于检索。

许多MUD代码库会将区域信息硬编码进引擎和数据库中,Evennia没有做这样的硬性规定,因为房间本身应该允许做各种不同级别的定制。下面是如何在Evennia中设定区域的建议。

Evennia中的所有对象都可以有任意数量的标签。标签是附加在对象上小标记,它们使检索成组的对象变得非常容易。一个对象可以有任意数量的不同标签。让我们把相关标签添加到森林上:
    forestobj.tags.add("魔法森林", category="区域")
你可以手动添加或在创建对象时自动添加(为此你可能要修改你的 @dig 命令)。你也可以在建造中使用默认的 @tag 命令:
@tag forestobj = 魔法森林
此后你就可以通过指定标签轻松地检索对象了:
    import ev
    rooms = ev.search_tag("魔法森林", category="区域")


用类型类和继承来分区

上述的标记或分组系统不会给魔法森林房间和普通房间带来任何功能上的不同 —— 他们只是给对象加上标记以便快速检索。想要在功能上有差异就必须用类型类来表示。

当然,还有一种区域的实现方式是让一个区域内的所有房间、对象都继承自一个指定的类型类父类 —— 然后限定只搜索继承自指定父类的对象。结果是类似的,但你需要扩展搜索功能以正确地搜索继承树。


(原文:https://github.com/Evennia/evennia/wiki/Zones    翻译:卢铱俊)