编写同时进行移动的基于回合的PvP竞技场

在本文中,我将讨论是什么促使游戏以这种不寻常的类型创作,它是一种什么样的类型,开发是如何进行的,我们遇到了什么困难以及在傍晚不到一年的时间内我们设法创建了一个完全可玩的原型。



在2017年春季,我遇到了Atlas Reactor奖励计划。游戏是象棋,扑克和暴民的狂野混合,这种不同寻常的类型组合确实引起了我的注意。她成为我最喜欢的游戏,我参加了在线锦标赛和活动,一切都会好起来的,但是...

在2019年夏天,服务器关闭了,因为由于游戏的人气较低,他们的支持对发行商而言是无利可图的。本场比赛是建立在模型游戏作为一种服务,所以关闭服务器开启客户端成代码碎碎。

由于类似游戏类型的独特结合,市场上根本没有任何游戏,但我真的很想玩类似的游戏。

结束后不久,我在Reddit上发现了一个帖子,一群前玩家中的狂热者决定创建一个私人服务器并调整客户端代码以与其配合使用,但是我并不特别希望加入他们。我从来没有对逆向工程感兴趣,此外,这种活动看起来不太合法。

最后,我决定召集人们并组织有关“精神继承人”的工作-制作一款具有类似机制,但具有新角色,能力,卡片和ENT的游戏。晚上和周末,我们开始致力于纯粹的热情。我们希望将自己的东西带到类型中,增加可变性和深度,并纠正原始作品的缺陷。从一开始就很明显该游戏不会变得非常流行,但是我确信至少有数千人会对它感兴趣。至少-封闭的阿特拉斯反应堆的粉丝。

游戏玩法


一般而言,该动作让人想起多人XCOM,但有100%的命中率和英雄(如MOBA类型)。

游戏的思想是所有结果完全由玩家的固定动作决定。完全没有随机性,并且变化足够小,因此经验丰富的玩家可以计算所有可能的结果并根据此信息采取行动。为了减少可变性,使用了一个划分为多个单元的平坦比赛场,也就是说,英雄只能站在单元的中心(尽管通常将这些功能应用于任何地方,而无需参考网格)。

通常有8人参加比赛。他们分为2个小组,每个小组4人,每个小组控制一个角色。但是,由于循序渐进,没有什么可以阻止创建只有2个人参与并且每个人都控制其团队中所有四个角色的模式。

游戏分为移动。每一步都分为两个阶段- 决策(决策)和解决方案(显示所选操作的结果)。动态性是由于两个团队的两个阶段都同时发生(这种逐步方式称为We-Go)这一事实而增加的-没有一个团队会想到的事情,第二个团队只是等待着,看着屏幕什么也没有发生。而是由两个团队同时做出决策并观察结果。动作的同时性和角色视野的存在导致了游戏无法归因于具有充分信息的游戏的事实

决断-一个阶段,玩家可以立即选择自己想要的动作。比赛场地“冻结”了几十秒钟,玩家必须选择在“时间停止”结束后由他们控制的角色必须执行的特定动作。每个玩家都看到他的盟友将要采取的行动,但是对手选择的行动是隐藏的。

解决 -执行所选动作的阶段。随着时间的流逝,它与Decision几乎相同,甚至更少。在此期间,玩家无法控制-他们只是观察正在发生的事情,并思考下一步的动作。

解决方案分为多个阶段。各个阶段依次进行,对于每种能力,玩家都事先知道它将在哪个阶段工作。在这种情况下,能力在一个阶段内的运行顺序并不重要。



通常,伤害是在爆炸阶段完成的,因此防御能力会更早触发-您可以在准备阶段应用盾牌,也可以在冲刺阶段移动(躲闪)。但是在躲避时,如果敌人穿过陷阱(玩家在准备阶段设置),则敌人可能受到伤害。而且,如果敌人没有躲闪,而只是停留在原地,那么陷阱将不会起作用,也不会给他造成任何伤害。盾牌也是一样:如果您不攻击受保护的角色,那么它们只会在回合结束时燃烧,而没有任何效果。如上所述,这里的兴趣在于,对手在做出决策时的动作是隐藏的,因此必须预见到它们。

典型的伤害值不超过35,以使玩家更容易想到。出于相同的原因,地位效应和能力很少。主要的游戏模式是通常的死亡竞赛,最多可杀死5个或20个招式。

实作


我决定用C#编写(因为这是我的主要语言),所以我选择Unity作为引擎(因为我以前没有创建游戏的经验,但是它本身支持C#,并且对初学者非常友好)。

回合制游戏不需要大量资源,因此从一开始我就考虑了托管主服务器的最预算选择。有一个想法可以在heroku上托管(因为它通常是免费的),但是每天至少随机一次重新启动应用程序非常不便。他以每月45卢布的价格在Linux上的VPS停留。

鉴于托管资源有限(尤其是硬盘上的空间很小),并且所有游戏逻辑都可以在2D模式下工作,因此我决定在.NET Core上使用它(通过编写轻量级的2d引擎来计算受能力影响的区域),并使用Unity纯粹用于客户端可视化。这样就可以简单地控制服务器端字符的视野,并仅向客户端发送他们应该知道的信息。在服务器上进行处理之前,对玩家选择的动作进行验证,这完全排除了作弊的可能性。

为了方便播放器,WinForms的一个简单启动器将其删除,如有必要,可从Dropbox下载客户端的更新版本。

现在,我将更详细地介绍我们在开发游戏时遇到的最有趣(或引起困难)的时刻。

使用能力的程序


如上所述,获得的结果不应依赖于阶段内能力的应用顺序。在服务器上,按英雄ID的升序使用功能,但玩家不应考虑它。此条件对可能发生的阶段和阶段施加了限制(游戏设计师在创建异能时必须考虑到这一点)。

例如,一旦进入准备阶段,您就可以使用防护罩,然后就不能对其进行伤害(否则,将取决于内在因素,伤害将传递给防护罩,或者在应用防护罩之前直接损害健康)。同样,由于可以在爆炸阶段造成伤害,因此不可能在其中施加“威武”状态效果,这会增加英雄造成的伤害。所有游戏元素都有类似的规则。

简单的游戏逻辑


游戏的初衷是让玩家能够计算出课程中所有事件的发展情况,因此所有游戏​​元素的逻辑都应该简单直观。但是随着计划的实施,出现了很多困难。

首先是运动。英雄可以在冲刺和移动阶段移动,并且该移动必须同时发生。允许两个英雄在移动时位于同一单元上,但是在移动阶段结束时,每个单元上最多只能保留一个角色。

解决运动结束时冲突的最简单规则是“谁先站起来,谁先拖鞋。”如果英雄在进入“有争议的”牢房之前已经走了很长一段路,那么就应该将他退回去,而走过一条小路的那个人应该留在原地。如果英雄们走了相同的距离到达目的地,则将他们两个都推开。由于其确定性,因此决定将英雄们沿着他们的运动轨迹推回去。重复排斥,直到解决所有冲突。

第二个问题是等价。假设我们要创建一个配置文件,当它击中敌人时对其造成伤害并自动将弹跳线拉到最近给他一个角色。这里的问题是“自动”和“最近”的组合。英雄位于方格场上,这意味着在相同最小距离处的主要目标旁边可能会有几个角色。

该怎么办?
  • 两者都弹跳
  • id
实际上,解决方案是我们拥有更多数据-射击的位置。如果您无法为反弹选择一个最接近的目标,则可以顺时针对英雄进行排序,主要目标是中锋,而应用此技能的英雄则是起始位置。

诚实的几何


事实证明,使用诚实的几何体并不有趣。墙壁不受大多数​​射击的阻挡,并阻挡了对手的视线,并且还充当了避难所(并且,如果损坏来自避难所的侧面,则可以减少50%)。但是,墙壁极大地限制了英雄本人的受影响区域,因此,玩家看不到使用它们的任何理由。

涂装时间

— , — . ( ) — . , 90 .

决定不仅检查中心之间的可见性范围,而且检查某些特定点之间的可见性范围。

油漆二


因此,沿着英雄的边缘使用额外的四个点将“死区”减小到60度(已经变得可以玩了)。

结果,墙壁变得非常有用。

油漆三

, 50% ( , ).

附加点恰好位于单元格中心与其边缘之间的中间,这种选择并非偶然。对于矩形攻击,从何处射击是非常重要的(因为此点用于计算墙,爆炸和其他一些攻击修正物的反弹)。通过简单的算法,可以根据鼠标的位置自动移动英雄内部的起点。在这种情况下,定位点的位置应使靠近墙壁的射击范围最大化。

这是gif(20Mb)的链接,您可以在其中查看拍摄点的自动移位如何工作。

本土化


为了添加本地化,​​我使用了string.Format(这样,损坏数字的平衡变化不会创建新行)和Google牌。用于显示在屏幕上的所有字符串都包装在一种方法中,该方法可以根据已知翻译对字典进行内插和检查。在游戏的首次亮相版本开始时,来自Google平板的翻译文件将以json格式加载到文本文件中,并且源源代码中未翻译的行会在首次尝试显示在屏幕上时自动下载到同一Google平板中。在游戏的发行版本中,由于明显的原因,没有用于该表的在线功能,并且在启动时仅从现有文本文件中加载翻译。

对于翻译人员来说,该解决方案不是很方便(因为更改一个单词会导致在表中创建新行),但是它实现起来非常简单,并且不会给程序员带来处理资源的负担。如果在开发过程中生产线没有变化,那将是理想的选择,但事实并非如此。


现在-最有趣的。一些显而易见的技巧可以帮助决定在志趣相投的团队中削减宠物项目的新手程序员。

  • 如有可能,请勿重新发明轮子。
    如果问题很普遍,那么应该有许多现成的解决方案。与从头开始编写解决方案相比,寻找合适的现成解决方案可能需要更少的时间(尤其是如果问题很复杂的话)。
    . , . , , . NetworkStream-, TcpClient- Json. , , . 30 ( MagicOnion, )

  • — , . — . . — . — .

  • — , . - summary readme. .
  • ,
    . . — , — , , .
  • Git — ,
    , . .
  • ,
    . .
  • ,
    . , , , , . , , , .


事实证明,不到一年的时间就创建了一个可玩的原型。活跃社区的一部分已加入开发或测试,因此,现在几乎每天都至少进行一些比赛。看到人们如何享受游戏真是太酷了,我积极参与其中。

就个人而言,在项目工作期间,我会讲英语(因为社区是国际性的),获得了使用Linux,编程和使用Unity的经验。宠物项目很酷。

随着时间的流逝,我们一定会为新玩家,正常模型和动画,适当的菜单以及更加方便的用户界面增加培训。由于好的3D模型非常昂贵,因此他们在Patreon上创建了一个帐户,并且社区开始为我们提供财务支持。

对这个想法感兴趣的人的链接
Discord-. .

, , - — , Atlas Reactor

All Articles