标签


游戏设计师常做的一件事就是对分组的物体执行操作。一个典型的例子是用天气脚本影响所有室外的房间;另一个例子是玩家施放魔法会影响副本中所有的地方,但不会影响到外面;还有一个例子是快速找出同一公会的人或当前死亡的人。

标签是一种数据库实体,用途是给物体做标记以便将它们编组。


标签的属性

标签是唯一的。也就是说,具有特定关键字和类别的标签只有一个。给多个游戏实体分配标签时,这些实体实际上是在共用相同的标签。比如和需要在每个物体上创建的通用属性相比,标签的数量是非常有限的。这可以让它们在数据库中搜索起来非常快,这就是它们的目的。

标签具有以下属性,都存储在数据库中:
  • key —— 标签的名称。这是查找标签时搜索的重要属性。
  • category —— 标签的类别。可以通过设定类别来检索特定子类的标签,这可以用于不同的用途。Evennia处理物体别名的方式就是一例,它们实际上都是类别为“alias”的简单标签。
  • data —— 这是可选的文本字段,用来记录标签的相关信息。要记住,标签是共用的,所以在这个字段中不能存储任何与特定对象有关的信息。通常它可以用来存储标签所指定的分组的信息。默认没有使用它。

此外,还有两个特殊的属性。通常不需要修改或设置它们,Evennia会在内部使用它们以实现标签对象的众多其它功能:
  • model —— 它保存了与该标签有关的模块对象的自然键,形式为“应用.模块类”,例如objects.objectdb。各个类型的实体的标签处理程序都会在幕后用它来组织数据。
  • tagtype —— 这是标签、别名及权限等各种内建子类的“类别”。标签处理程序使用这个特别的属性名字是为了把属性名字 category 腾出来给你使用。


使用标签

你可以给物体玩家脚本频道做标签。通用的标签可以通过标签处理程序添加,它是相关实体上的 tags 属性:
    mychair.tags.add("furniture")
    myroom.tags.add("dungeon#01")
    myscript.tags.add("weather", category="climate")
    myplayer.tags.add("guestaccount")
你可以通过相关对象上的标签处理程序添加、删除和清除标签。你也可以使用默认 @tag 命令:
 @tag mychair = furniture
这会在幕后创建一个新标签或者复用已有的标签。

你可以在代码中通过以下方式获取所有具有指定标签的对象:
    import ev
    objs = ev.search_tag("furniture")
 @tag/search furniture


其他的标记处理程序

标签是非常有用的东西,因此在幕后还用它们来实现别名和权限。它们都是通过各自版本的标签处理程序来访问的,名字分别为 aliases 和 permissions。它们与标签处理程序的唯一区别是,它们使用的是 tagattr 数据库字段,以使它们有别于其他标签。


使用标签类别

通常,标签本身就足以对对象分组。对于普通的操作,不用标签类别也完全没有问题。给对象分组时,简单地增加一个新标签往往要比创建一个新类别好。所以请你仔细思考是否真的需要对你的标签分类。

如果你建立了某个使用标签的游戏系统,并且你想确保在搜索时只查找这些标签,那标签类别可以派上用处。在区域教程中可以找到这样的例子。


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