Welcome to the Death Dimension

Hi, my name is Joshua Parker, and I’m an engineer on our Champions team. I help create the systems that unlock new capabilities for champions inLeague。Although my work is typically focused on how we build out a new champion, it also means revamping older systems and smashing技术债务along the way to help our engine evolve and allow us to keep creating new exciting experiences for players.

在this article, I’ll describe the tech that went into重新加工League冠军Mordekaiser.。我们会看看Mordekaiser旧的终极能力以及我们如何进入维度的一些问题,以创造Mordekaiser的新终极 - 死亡领域。


Mordekaiser的终极能力将他和一个选择的敌人传送到一个新的维度。

首先,一点上下文

Mordekaiser的原始终极涉及标志着敌人,如果敌人在标记时死亡,那么授予可控克隆。一个特别受欢迎的Mordekaiser伎俩在龙上铸造了他的终极,并用龙队的龙头延续了中间车道。这种能力导致了奇怪的错误和所有类型的各种问题,因为游戏并没有真正设置以正确捕获和复制其他角色。

您认为Apartments为龙的宠物租金吗?

在规划Mordekaiser返工的同时,我们知道我们必须重新设计他的核心。只是错误定影不会实现我们的主要目标 - 以消除所有冠军,过去和未来的Mordekaiser相关的生产成本。

因为我们想要解决Mordekaiser如何与游戏中的其他冠军互动,我们不得不检查为什么他的能力导致了那些infamous bugs。Let’s take a look at two examples of in-game content that Mordekaiser’s old abilities struggled to handle.

被动攻击

一系列主要问题来自冠军被动。这些能力经常发生在游戏的背景中 - 他们通常不需要被激活,但它们塑造了冠军与其他玩家或环境的互动方式。

一个很好的例子是Jhin。He’s designed with a four-shot auto attack, and his passive guarantees that his fourth shot critically strikes.

这里的问题是Mordekaiser会捕捉敌人在一个明显的时刻。因此,当Mordekaiser将在jhin施放他的终极时,他会捕获Jhin的当前状态,这意味着Jhin Clone会因为每个汽车攻击而陷入困境的第四次射击。

The Problem with Clones

还有一些奇怪的加载问题导致Mordekaiser错误。当播放器启动与Mordekaiser的游戏开始游戏时,服务器将加载额外的内容,因此它将能够制作其他冠军的副本。但是,如果Mordekaiser在不是那样的冠军上使用他的终极应该有克隆?

Shaco例如,旨在有一个克隆 - 所以他的整个套件了解他的多个版本时会发生什么。但是涉及其他冠军谁没有构建以与自己的多个版本互动?这似乎很小,但乘以游戏中的每个冠军,你最终得到了很快失控的广泛问题。

Every champion after Mordekaiser would have to be adjusted so they could functionally turn into a clone. This would be a huge burden on all future champion development.

A Peek at Design

There was a time during Mordekaiser’s update where we were considering bringing the ghost clone from his ultimate ability back. But we decided not to, in part because it just didn’t feel true to who Mordekaiser was supposed to be.

His earlier gameplay was heavily rooted in spell casting where the clone does most of the work. This doesn’t really match the fantasy of an undead armor knight king who’s trying to populate his undead kingdom. And when you see a dude with a huge mace, you expect him to hit people with that mace. We did end up paying homage to his old ultimate by giving the new Mordekaiser a ghost crown when he steals the stats of another player during the 1v1 battle that happens during his new ultimate - in the death dimension.

有趣的事实:如果你在一个模式中播放我们的全部并选择MODEEKAISER,当你互相溃烂时,你们都会在同一个领域结束。

Hey, how did you get here?

Mordekaiser Reforged.

在发展开始时,我们提出了Mordekaiser死亡领域的原型。尽管它首先工作,但我们知道它基于它的技术不会因服务器带宽而扩大。亚搏网站这是因为它依赖于我们的关系技术,它描述了两个单位之间的游戏关系。

这是不可提供的,因为:

  • 关系是两个单位之间集合的合同,但是当创建一个新的单位时,它需要一个新的合同。这意味着不断检查服务器以用于创建和设置这些关系的新事物,这些关系创建了笨重的代码来维护。

  • 为游戏中的每个单元设置每个单位的每个关系,从转换到死亡维度的两个冠军都引起了初始服务器挂钩。这对所有玩家的降级的游戏表现,我们不愿意接受。

我们不得不从头开始,并建立一个基础的东西League这将封装所有冠军和系统,过去和未来。

这意味着我们必须向游戏的新概念引入。通过给游戏来了解尺寸的语言,我们能够建立现有基本维度(召唤者的裂缝)和其他维度之间的差异......像Mordekaiser的幽灵般的可怕死亡领域。

现在这是一个美学。

视力

Our vision system is highly complex because vision is such a foundational part of the game’s basic strategic experience.League是一场愿景 - 知道敌方单位的位置使玩家能够做出匹配生命周期的关键的决定。视觉系统很早就建造League在其开发生命周期,并拥有如此多的游戏系统,内置于它的顶部,开始扭转旋钮和推动按钮并不容易。

我们知道我们不得不利用视力制度来实现一个经验,使得Mordekaiser的终极感受完全孤立的群体。这意味着我们必须在最低的游戏级别进行更改,其中定义了愿景。是时候开始用GameObjects进行修补了。

对象的层次结构

亚博论坛游戏在其核心处具有层次结构,最低级别对象确定了游戏需求的每个基本功能,并且划分路径都会增加详细信息和功能。在League,我们使用GameObjects作为我们最基本的构建块,这些分支到攻击单位(冠军,奴才,塔楼)和不基格的单位(效果发射器,草)。

The first change I made was simple - adding a value on all GameObjects that establishes the dimension. I set this at “default” at first, and checked it in some time around week 2 of pre-production. This didn’t actually affect anything from the player side because they had only ever interacted with one dimension, but it gave us the language to start defining what it meant when a dimensionwasn’t默认。

Once this was done, I had to start digging into the questions that make up interactions. When two objects interact with each other, they go down a list of questions: Do I collide with you? Do I see you? Can I hurt you? In these places, I added another question - what dimension are you in? The answer to this question would determine whether the objects would continue down the list of questions or end the interaction immediately. To accurately answer these questions - especially the dimension one - objects need to consider if they can “net see” each other.

A ward gives ally players visibility in one area of the map.

净可见性

League“净可见性”的概念确定了网络数据包是否在玩家之间共享。如果播放器A在其计算机上移动,则将这些数据包发送到服务器。如果玩家B能够在其地图上看到它们,则服务器将播放器的数据包发送到移动。换句话说,服务器是唯一知道每个人都在哪里和谁在移动的位置。

在后端,我们认为愿景作为地区 - 想象他们喜欢我们在GameObjects上的泡沫。这些气泡倾向于是圆圈,但实际上可以是任何形状。如果我们将视觉区域泡沫放过一个对象,它开始接收数据包并将其发送回他们的审美团队(所有盟友单位)。例如,奴才都有附着在它们的视觉区域,这就是为什么玩家能够看到地图的地图的部分所在的原因。

为了清楚起见,这里在这里采取了一点创造性的自由,这些不是实际的视力泡沫。

Vision系统具有一组规则,可以确定游戏中的哪些操作的影响哪些字符。Net-可见性系统利用Vision系统的规则来确定是否发送或未发送数据包。例如,如果玩家处于死亡维度和奴才在附近的任何其他维度中死亡,那么球员仍然获得经验(因为经验忽略了视觉规则)。

导弹系统根据情况决定是否遵循这些规则。因此,如果一个导弹在一个维度中创建,我们必须让它决定它是否应该与另一个维度的玩家互动。

导弹

导弹like to hit things. Determining those hits gets complicated when there are multiple dimensions. The source of the missile needs to be clear, and we need to know which dimension it exists in - and where it should go if the caster switches dimensions. Establishing accurate sources of missiles - and therefore spells - helps us avoid situations that are confusing to players by making it clear to the server which dimensions they should exist in.

这很困难,因为它需要在咒语真正结束时理解,这可能是模糊的。

例如,考虑以下情况。球员们施放了一个咒语,它创造了一个牛奶,召唤了一个梅西昂,这击中了一个导弹法术,击中了某人并召唤施放法术的其他仆从。原始法术什么时候实际结束?

追踪咒语的原始源的标记系统称为“维度源上下文”。这是一种数据,当一个咒语被投射时收集的数据是捕获导弹的捕获以及它创建的维度。当咒语通过其生命周期时,它可以始终引用此面包屑,以了解它开始的哪个维度。这个allows the spell to make decisions around when it should follow a player when they switch dimensions, and when it shouldn’t.

例1:跟随

对于这个例子,我们将使用冠军卢西安和他的最终能力。

卢西安’s ultimate ability is a series of shots fired in the direction he’s facing. These are each individual missiles, and because they look like they’re coming from his gun, they need to follow where he goes. Even though the ability lasts several seconds, if Lucian were to switch dimensions, his ultimate should follow him because that’s what players expect.

例2:别关注

Now let’s take a look at an ability thatshouldn’tfollow dimension changes - theZiggs.炸弹。

每枚炸弹反弹都是一个单独的导弹。对于每次反弹,游戏决定了导弹是否打到任何人,如果它没有,它会给下一个反弹施放另一个导弹。如果维度源直接绑在炸弹反弹中间的施法者和Ziggs切换尺寸,我们希望炸弹留在后面。否则,炸弹将在没有警告的新维度开始弹跳,这可能会破坏游戏的完整性。

一旦我们具备维度来源系统到位,我们必须决定如何在游戏中的每个冠军上实施。

冠军

根据写入它们的设计者,类似的法术可以以不同的方式脚本。这意味着对所有法术/导弹/冠军的所有解决方案都没有一个捕获的解决方案,因为需要单独检查的东西以确定最佳的维度切换行为。

We did a granular sweep of the entire game by casting all the spells, missiles, abilities, and item effects during the following situations:

  • When a player transitions into the death dimension

  • When a player is in the death dimension

  • When a player transitions out of the death dimension

This quickly made it clear that we would have to make buckets with rules on what would come with and what wouldn’t.

例如,如果玩家在地面上留下某种陷阱,那么不应该突然切换尺寸。在这篇文章的开始时仔细观察GIF - 当他切换领域时,地面上的陷阱不会与Mordekaiser过渡。

如果他们有某种宠物怎么办?

This metal ball is not as cute as my friend’s puppy.

部ckets

我们的策略涉及创建基于80%VS 20%的分类的桶。我们创建解决80%问题的规则,最后20%是特殊情况。这样做允许我们与解决方案保持高效且符合,而不是将每个项目视为需要单独解决的单个案例。

这意味着确定真正的法术来源。上面描述的维度来源上下文系统有助于我们解决特别复杂的情况,并且在触发区域的情况下特别有用。

示例:触发区域

触发区域类似于视觉,但值得注意的是 - 物体或法术的碰撞是由撞击的半径确定的。但这些触发区域如何与死亡维度进行交互?我们如何知道他们的真实来源是什么,以及他们应该影响游戏玩法的地方?

触发区的一个例子是Yasuo的挡风墙。

这种墙壁阻挡导弹继续在他们的道路上,但是当风墙上了解触发区域时,它不明白尺寸。如果在播放器过渡到新尺寸之前被施放了风墙,它仍将阻止死亡维度中的导弹,即使它真的只存在于默认维度中。这意味着需要了解维度所需的触发区域。

为此,我们给出了触发区域自己的尺寸来源上下文。这允许它们跟踪它们应该在其寿命的过程中与哪个维度进行交互,因此决定何时切换尺寸以及何时保持后面。

可伸缩的系统+接下来是什么

在制定死亡维度的同时,我们考虑了很多关于它如何影响未来冠军和游戏,以及潜在的新游戏模式。我们希望创建一个可扩展和可用于未来开发人员的系统,我们希望避免任何将为新内容增加大量生产成本的任何东西。

New Champions

冠军法术和项目以一种名为BlockBuilder的语言编写脚本,它通过串串块创建复杂的行为。解决未来的冠军相对简单,我们只需要在BlockBuilder中创建工具以支持更改尺寸。其中一个工具是一个名为OnDimensionChange的事件,允许脚本对维度更改作出反应。然后,脚本可以决定是否要响应维度更改来做点什么。

如上一节所述,这可以是:

  • 没做什么

  • 与脚轮过渡

构建可扩展系统

现在,我们有三个维度League默认, which is the base map,Death Realm,这是Mordekaiser的最终能力,所有领域。所有领域is a specialized system specifically used in cases where we want objects to忽视维规则。部ildings like the Nexus (a team’s base) need to exist in all dimensions.

所有领域

这是一个战略局面的一个例子,帮助我们决定建筑物等物体的所有领域。如果一个Mordekaiser球员试图摧毁敌人的Nexus,但整个敌人的队伍都在那里,他能够通过铸造他的终极来转向死亡领域,说,这是一个弱者的球员。现在,他能够在他的维度中只能击中敌人的基础,因此能够阻止他。

Future Dimensions

现在我们已经在确定所有字符,法术,导弹和对象的维度系统周围完成了腿部,因此未来的工程师可以使系统可扩展。在这个新世界,我们可以做一次产生多维尺寸的游戏模式,以实现更复杂的播放器和NPC遭遇。

添加新维度将意味着将更多内容直接添加到我们的数据中,因此它在骚乱编辑器内是可见的。如果我们这样做,设计人员将简单地通过使用字符串散列快速添加多个维度。该维度系统的成熟将意味着创建一个在编辑器中生存的数据包,并在调用时应用尺寸的正确数据。

通过与MORDEKAISER开始这项工作,我们已经使这些可能性更加可访问。创造新尺寸不仅令人兴奋的是Mordekaiser的能力,而且令人难以置信联盟。

Thanks for reading! If you have any questions or want to tell me about wild Mordekaiser bugs you’ve seen, please comment below.

发表于约书亚帕克