我不确定您是否仍在阅读此书,但长期以来我一直在努力解决此类问题。
我设计了许多不同类型的影响系统。现在,我将简要介绍它们。这一切都是基于我的经验。我并不是声称知道所有答案。
静态修饰符
这种类型的系统主要依靠简单的整数来确定任何修改。例如,最大生命值+100,攻击最大+10,依此类推。该系统也可以处理百分比。您只需要确保堆叠不会失控即可。
我从未真正缓存过此类系统的生成值。例如,如果我想显示某物的最大健康状况,则可以在现场生成该值。这样可以防止事情容易出错,并且每个参与人员都更容易理解。
(我使用Java进行工作,因此下面的内容基于Java,但应该对其他语言进行一些修改)。可以使用枚举的修改类型,然后使用整数来轻松完成此系统。可以将最终结果放入具有键值对的某种集合中。这将是快速的查找和计算,因此性能非常好。
总体而言,仅使用静态修饰符,效果很好。但是,必须在适当的位置放置代码才能使用修饰符:getAttack,getMaxHP,getMeleeDamage等。
这种方法失败的地方(对我而言)是buff之间非常复杂的交互。没有互动的真正简单方法,只能是贫民窟。它确实具有一些简单的交互可能性。为此,必须对存储静态修饰符的方式进行修改。您可以使用String而不是枚举作为键。该字符串将是Enum名称+额外变量。在10中有9次中,没有使用多余的变量,因此您仍然保留枚举名称作为键。
让我们举一个简单的例子:如果您希望能够修改对不死生物的伤害,则可以有一个这样的有序对:(DAMAGE_Undead,10)DAMAGE是枚举,而Undead是多余的变量。因此,在战斗中,您可以执行以下操作:
dam += attacker.getMod(Mod.DAMAGE + npc.getRaceFamily()); //in this case the race family would be undead
无论如何,它运行良好且速度很快。但是它在复杂的交互以及到处都有“特殊”代码的情况下失败了。例如,考虑“死亡时有25%的机会传送”的情况。这是一个“相当”复杂的过程。上面的系统可以处理它,但是不容易,因为您需要以下条件:
- 确定玩家是否拥有此模组。
- 如果成功的话,在某个地方,有一些代码可以执行隐形传送。此代码的位置本身就是一个讨论!
- 从Mod映射中获取正确的数据。该值是什么意思?他们也在传送房间吗?如果玩家身上有两个瞬移模组怎么办?金额不会加在一起吗?????? 失败!
因此,这使我进入了下一个:
终极复杂增益系统
我曾经尝试自己编写2D MMORPG。这是一个可怕的错误,但我学到了很多东西!
我重写了情感系统3次。第一个使用了上述功能的一种不太强大的变体。第二个是我要谈论的。
对于每个修改,该系统都有一系列类,例如:ChangeHP,ChangeMaxHP,ChangeHPByPercent,ChangeMaxByPercent。我有一百万个家伙,甚至像TeleportOnDeath这样的家伙。
我的课堂上有要做以下事情的事情:
- applyAffect
- removeAffect
- checkForInteraction <-重要
套用并删除自己的解释(尽管对于百分比之类的东西,该影响会跟踪它增加了多少HP,以确保该影响消失时,它只会删除其添加的量。这是错误的,大声笑和我花了很长时间来确保它是正确的。对此我仍然感觉不太好。
checkForInteraction方法是一段非常复杂的代码。在每个情感(即ChangeHP)类中,它将具有代码来确定是否应通过输入情感对其进行修改。例如,如果您有类似...
- Buff 1:攻击时造成10点火焰伤害
- Buff 2:火焰伤害提高25%。
- Buff 3:火焰伤害提高15点。
checkForInteraction方法将处理所有这些影响。为了做到这一点,必须检查对附近所有玩家的影响!!这是因为我在一个区域的跨度中与多个玩家打交道时产生的影响类型。这意味着该代码永远不会像上面那样发生任何特殊的陈述-“如果我们刚刚死亡,我们应该检查死亡的传送能力”。该系统将在正确的时间自动正确处理它。
尝试编写这个系统花了我大约2个月的时间,使头部爆炸了好几次。但是,它确实功能强大,可以完成大量的工作-尤其是当您考虑以下两个事实时,我的游戏能力:1.他们具有目标范围(即:单个,自我,仅团体,PB AE自我) ,PB AE目标,目标AE等)。2.能力可能对他们造成1以上的影响。
正如我上面提到的,这是该游戏的第三影响系统的第二。我为什么要离开这个?
该系统的性能是我见过的最差的!这太慢了,因为它必须对发生的每件事进行大量检查。我试图改进它,但认为它是失败的。
所以我们来看看我的第三个版本(以及另一种类型的buff系统):
具有处理程序的复杂影响类
因此,这几乎是前两者的组合:我们可以在Affect类中包含静态变量,该类包含许多功能和额外数据。然后,当我们想做某事时,只需调用处理程序(对我来说,是一些静态实用程序方法,而不是用于特定操作的子类。但是我敢肯定,如果您愿意的话,可以将子类用于操作)。
Affect类将拥有所有多汁的好东西,例如目标类型,持续时间,使用次数,执行机会等等。
我们仍然必须添加特殊代码来处理这种情况,例如,死亡时传送。我们仍然需要在战斗代码中手动检查该代码,然后如果存在,我们将获得一个影响列表。此影响列表包含处理死亡时传送的玩家当前所有已应用的影响。然后,我们将仅查看每个对象,并检查它是否已执行且是否成功(我们将在第一个成功的对象处停止)。它成功了,我们只需要调用处理程序来解决这个问题。
如果需要,也可以进行交互。只需编写代码即可在播放器/ etc上查找特定的buff。因为它具有良好的性能(请参见下文),所以这样做应该相当有效。它只需要更复杂的处理程序等等。
因此,它具有第一个系统的很多性能,并且仍然像第二个系统一样具有很多复杂性(但不多)。至少在Java中,您可以做一些棘手的事情来获得MOST情况下几乎第一个的性能(即:拥有一个枚举映射(http://docs.oracle.com/javase/6/docs/api/java /util/EnumMap.html),其中以Enums作为键,而将ArrayList of Effects作为值。这使您可以快速查看是否有影响[因为列表为0或地图没有枚举],并且没有以无缘无故地不断迭代玩家的情感列表。我不介意目前是否需要迭代情感。如果出现问题,我会在以后进行优化)。
我目前正在重新开放(用Java代替原来的FastROM代码库重写游戏)到2005年结束的MUD,最近我遇到了如何实现buff系统的问题?我将使用此系统,因为它在我之前的失败游戏中能很好地工作。
好吧,希望有人能从中找到一些有用的见解。