如何在Enter The Gungeon中生成地牢

最近,我在Enter The Gungeon中扮演了很多角色 。 这是一款很棒的极具挑战性的子弹地狱游戏,让我想起了很多《以撒绑定》 。 但是我玩的越多,就越能体会到地下城设计的精妙之处。


有许多程序生成器创建逻辑级别方案,以确保游戏的正确步伐并奖励玩家,还有其他生成器创建具有循环和紧凑型方案的级别。 但是很少会在一款游戏中同时找到这两种类型。 我所知道的唯一尝试实现这种事情的游戏是Unexplored

因此,我自然启动了反编译器,以便Gungeon向我透露其所有秘密。 在本文中,我将与您分享我设法找到的东西。



乍一看, 地牢的等级似乎很简单。 这是一个典型的地图示例。


典型的1级卡

玩家从入口开始。 穿过胸部 和店主 收集战利品,然后最终击败老板 。 如果您陷入漫长的死胡同,则可以使用传送带快速返回房间。 显然,单独的房间是手工创建的,并被需要射击的各种敌人所居住。 当前进到游戏的下一个级别时,玩家一次又一次看到相同的模式,只有阶段变大。

到目前为止,看来这没什么有趣的。 在互联网上,您可以找到许多将过道连接到随机房间的发电机。

开始播放时,生成器功能会变得很明显。 这些水平似乎比偶然的预期要多一些计划。 老板室从一开始就总是有一段合理的距离。 有敌人的房间总是散布着平静的房间,长凳和交叉路口。 最重要的是-许多箱子位于铰链的后面,并带有单向交叉。


红线是单向走廊。 如果要进入有胸部的房间,则需要走很长一段路。 绝大多数的箱子位于单向循环的尽头,或者位于关卡内部足够深的地方,这迫使玩家必须穿过许多房间进行战斗,才能到达箱子。 没有风险就没有回报。

这段文字的秘密在于,一般方案是手动创建的。 这是用于生成上面显示的级别的图。


普通房间是随机选择的带有敌人的房间,交叉房间或具有多个出口的大型房间。 奖励(奖励)和老板(老板)无需解释。 它不显示“连接中”的房间,即没有敌人的房间,经常有自然灾害。 其余房间是预定义的,或从特殊的房间表中选择。

Gungeon中,有很多这样的方案,称为“流”(flow)。 在空心级别,它们是最少的(4),而在Gungeon Proper中,它们是最多的(8)。 这些不是简单的方案,它们的设计是基于某些特征创建的,该特征可以多次注意到。 它可能是一个巨大的循环,或者在许多方面是一个重要的分支,或者是需要坐在板凳上才能通过水平测试。 他们是如此引人注目,以至于速跑者注意到了差异并制定了时间表 ,以便您可以尽快找到老板。 我已经准备了完整的方案列表,可以从此处下载。

您可能已经注意到,流模式和映射不完全匹配。 在长凳下有一个额外的空间。 与计划不一致,走廊房间很奇怪 。 让我们研究整个过程,它包含很多聪明的主意。

首先随机选择一个流文件,如上图所示。 这是“图形”数据结构 ,即它存储房间的互连,但不存储它们的位置。 每个房间都包含有关房间类型及其应具有的连接的元数据。 连接有一个方向-每个流程图都从根节点开始,然后形成一个子节点树。 然后,其他连接会破坏树结构以创建循环。 我认为这主要是由于游戏开发的功能,但是它简化了分析地图的过程,因为所有循环都明确定义了起点和终点。

流转换


流文件可以通过多种方式进行转换。 首先,一些特定的房间将被一系列随机长度的房间代替。 此功能仅在以后的较大级别中使用。 另外,流文件的某些部分具有备用路径,并且其中之一是随机选择的。 此功能仅使用两次。

然后“注入”一些其他节点。 此功能非常灵活,可用于许多不同目的。

每个“注入”都包含确定应插入哪种类型的对象,应将其插入到哪里,创建可能性以及必须满足的任何条件(例如,存在主回合 ,高诅咒或玩家尚未保存角色的数据)的数据。 ) 例如,秘密房间通常是在死角处创建的,但是有1/5的概率被附加到任何房间。 它们有90%的发生机会,不需要任何其他条件。

游戏中几乎每个特殊房间都是由网站的注入决定的,包括商人(不包括总店),监狱,带壁炉的房间和电梯。


可以注入水平仪中的监狱牢房之一

在同一阶段,生成器为每个节点选择一个特定的房间。 这主要取决于当前阶段和所需房间的类型。 房间数量巨大-第一阶段几乎有300个房间-但是生成器尝试不两次选择同一房间。

连接器节点的工作方式不同。 创建方案后,稍后将选择其房间。 这些房间通常是狭长的房间,因此选择方向正确的房间非常重要。

复合对象


流创建完成后,将其分为“复合对象”。 每个复合对象要么是一个与房间分开的回路,要么是一组没有回路的连通房间(即一棵树 )。 这是通过在地图上找到最小的循环并将其剪切为一个合成对象来实现的。 重复该操作,直到地图上没有循环为止。 地图的其余部分成为一组分开的树和各个合成对象之间的连接。


注入和分裂后的相同流

复合对象架构


然后,在单独的地图上分别创建每个复合对象。 他们将在以后合并在一起。

要计划复合对象,请将第一个房间放置在任意位置。 然后,通过选择一对出口将房间一个接一个地添加到回路中,其中一个与新房间有关,另一个与现有回路有关。 出口是每个房间的元数据中的预定义位置。 然后放置新房间,使其出口直接连接到前一个房间的出口。 然后重复该过程。

更具体地说,通过深度遍历树来放置复合树对象。 该算法仅选择那些导致出现新房间而不与先前房间相交的输出对。 通常,该算法倾向于选择与现有输出相距甚远的输出。 如果无法放置房间,它将返回并重新生成房间的选择,最多重复此过程3次。

同时,通过在循环线的两侧依次添加循环中的元素来放置复合循环对象。 首先,随机选择成对的出口(优先选择相对的墙壁,东西或南北)。 当循环创建一半时,它开始优先考虑将循环的两个开放边组合在一起的输出对。 创建所有房间之后,算法需要在最后两个房间之间添加另一个连接。 他选择另一对出口。 如果可能的话,他在这些出口之间设计了一个小的矩形房间。 否则,他会在出口之间寻找一条路径,并创建一个“房间”,它只是一条狭窄的走廊。 走廊的长度应为4到30个单位(最多50个矿井)。

最终组装


在此阶段,地牢的各个小部分相互连接,但是必须连接合成对象本身才能创建完整的地图。


与最终装配前的复合对象相同的贴图

如您所见,在这种情况下,其余化合物的选择范围不是很大。 但情况可能比以前更复杂。 该算法从连接最多的房间开始绕过地图。 和以前一样,为每个创建的连接选择一对输出。 如果两个房间位于地图的不同部分,则将地图的这两部分对齐以创建一条短路径。 否则,将使用路线搜索来创建路线。

这就是级别图的创建结束的地方。 只剩下选择敌人和房间装饰,这是一个完全不同的话题。

总结


开发人员的主要目标似乎是创建一个能够提供令人满意的游戏玩法的程序生成器。 显然,要正确执行该代码,他们必须执行许多迭代-我发现了大量的生成代码,似乎没有使用,因为开发人员已更改其过程公式以求完美。

一个奇怪的技巧是,它们首先生成地图中最复杂/最重要的部分。 生成器专注于在关卡的中心部分创建狭窄的环路和较短的走廊,然后尝试将其他所有内容与它们连接。

就像我研究《暗黑破坏神1》的生成一样 ,它使我震惊,以抽象形式生成地下城的一部分有多有效-在这种情况下,它是一张没有位置信息的图形。 一切只会在以后变得更加具体。 如果我们立即使用平铺图,则“注入”功能将根本不可能。 得益于房间布置细节的抽象,它使您可以控制游戏的风格和关卡比例。

另外,整个系统的可扩展性给我留下了深刻的印象。 Unity鼓励采用主动的数据驱动方法。 只需将新对象添加到相应的表中,即可实现添加新房间,方案甚至特殊行为。 这肯定是一个很大的帮助,因为道奇·罗尔(Dodge Roll)已经发布了一些免费的DLC,并且毫无疑问,它支持mod的创建。



红利


研究此生成器是我研究Unity中创建专业游戏的第一个机会。 Dodge Roll开发人员竭尽所能,编写了出色的代码。 它读起来很好,在某些地方还很有趣-似乎他们对双关语的热爱已经传播到了代码中。 我喜欢这些:

  • 游戏中的流体引擎称为DeadlyDeadlyGoopManager
  • 地牢生成代码称为Dungeonator
  • 各个步骤称为CASTLEGEON/GUNGEON/MINEGEON/CATACOMBGEON等。 我想知道开发者是否受到暗黑破坏神1的启发,而暗黑破坏神1使用的方案非常相似?
  • 从字面上看,每个房间都有其自己的名称,通常以双关语的形式出现(或以纪念某些乔;也许是一位很有自负的艺术家)。

我还注意到,工作室最初计划以太空,丛林和狂野西部为主题进行演出。 las,他们注定不会出现。 道奇·罗尔(Dodge Roll)决定完成她在Gungeon的工作。 我将等待他们的下一场比赛,并希望他们投入尽可能多的爱和关注。

Source: https://habr.com/ru/post/zh-CN462377/


All Articles