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

2020-06-17 05:39:30易采站长站整理

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

Game

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

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

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

Rooms

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

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

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

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

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

items

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

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

最后,其中一些道具可能会触发其他操作或者状态更新,具体取决于玩家决定用它们做什么。其中一个例子就是从入口处点燃的火把。如果你拿着一个,将在游戏中触发状态更新,这反过来将使游戏向你显示下一个房间的不同描述。

道具也可以有“子道具”,一旦原始道具被销毁(例如通过“分解”操作)就会发挥作用。一个道具可以被分解为多个,并在“subitems”元素中定义。

本质上,此元素只是一个新道具的数组,其中还包含可以触发其创建的一组操作。基本上可以根据你对原始道具执行的操作创建不同的子道具。

最后,有些物品会有“伤害”属性。所以如果你用某个道具击中 NPC,该值用于从中减去生命。

exits

出口是与道具分开的实体,因为引擎需要知道你是否能够根据其状态去遍历它们。否则被锁定的出口无法让你通过,除非你把它的状态改为已解锁。