使用Node.js实现一个多人游戏服务器引擎(9)

它看起来有很多内容,但是如果你把它视为一个简单的游戏描述,就会明白这是一个含有六个房间的地牢,每个房间都与其他房间相互连接,如上图所示。

你的任务是穿越并探索它。你会发现有两个地方可以找到武器(无论是在厨房还是在黑暗的房间,只要破坏掉椅子就能得到)。你也将面对一扇上锁的门,所以,一旦找到钥匙(位于类似办公室的房间内),就可以打开并用你收集到的武器和BOSS展开一场大战。

你可以干掉它而获胜,也可以被它杀死而输掉。

现在让我们更详细地了解整个 JSON 结构及其中的三个部分。

Graph

这里包含节点之间的关系。基本上这一部分会直接转换为我们之前看到的图。

这部分的结构非常简单。它是一个节点列表,其中每个节点都包含以下属性:

  • 一个标识游戏中所有其他节点的唯一 ID;
  • 一个名称,实际上是给玩家看到的 ID 版本;
  • 一组指向其他节点的链接。这可以通过四个可能的 key 来描述:north, south, east 和 west.。我们可以通过添加这四个组合来增加更多方向。每个链接都包含相关节点的 ID 以及该关系的距离(或权重)。

Game

本节包含常规设置和条件。特别是在上面的示例中,此部分包含输赢条件。换句话说,在这两个条件下,我们会让游戏知道什么时候结束。

为了简单起见,我添加了两个条件:

  • 要么通过杀死 BOSS 获胜,
  • 或者因为被杀而输掉。

Rooms

这一部分占了 JSON 文件很大的篇幅,也是最复杂的部分。在这里描述冒险中所有区域及其内部所有房间。

每个房间都有一把钥匙,使用我们之前定义的 ID。每个房间都有一个描述,一个物品列表,一个出口(或门)列表和一个非玩家角色(NPC)列表。在这些属性中,唯一应该被强制定义的属性是描述,因为引擎需要这个属性才能让你明白所看到的内容。如果有什么东西需要展示,它们只能在那里。

让我们来看看这些属性能为游戏做些什么。

description
这一项并不像想象的那么简单,因为你看到的房间可能会根据不同的情况而变化。例如:如果你查看第一个房间的描述,就会注意到在默认情况下,你将看不到任何东西,除非你有一个点亮的火炬。

因此,拾取物品并使用它们,可能会触发影响游戏中其他部分的全局条件。

items

这些代表了你可以在房间内找到的所有东西。每个项目都会共享与 graph 节点相同的 ID 和名称。

它们还有“目标”属性,该属性指示一旦拾取该道具应放在哪里。这是有意义的,因为你手上只能装备一个道具,而在背包中可以存放很多的道具。