(RPG)放置表设计


18

我猜这个问题与MMO和《暗黑破坏神》类游戏有关。

实施放置表的常见设计是什么,怪物可以根据百分比放置不同类型的物品?我猜想最简单的方法是对项目类型使用“百分比权重”字典,但是如果我们希望引入新的项目类型(例如,当D2扩展包括符文和新的类项目时),这很难扩展。


4
为什么在添加新项目时很难扩展百分比字典?我的意思是,如果您不需要所有百分比就可以得出100%的总和(并且只有在您希望怪物总是丢掉单个物品的情况下才是这种情况,这对我来说很奇怪),但我看不到问题。
2010年

1
说兽人=> {'dagger','sword''armor'},我有一个新的物品类型,例如符文;我将不得不直接更新与每种怪物类型关联的所有词典。当然,这是间接层无法解决的。所以问题是,该层的外观如何?
Extrakun 2010年

我不确定您为什么认为很难更新字典。例如,在Python中,使用新方法扩展一个具有新值的字典。您能说明您认为困难在哪里吗?
Kylotan

2
Extrakun,如果您在下面查看我的回答,那么您的“另一层间接”问题就有了答案。可以将嵌套的表达式构建为液滴,而不是将其视为平面表。如果允许命名宏(即函数),则可以在不同实体之间重用drop table的块。
慷慨

2
您刚刚偶然发现了游戏开发的“风向标”。当然,您可以在两天内完成游戏,但是接下来的五年便是添加内容。而添加内容就是磨碎。研磨。
Tor Valamo 2010年

Answers:


22

对于我正在从事的流氓行为,我实现了一个非常灵活的数据驱动系统来生成墨滴。我已经在这里记录。从本质上讲,它是一个用于选择许多随机选择项的DSL。

一个简单的下落看起来像:

1-10 copper coin

它只是说要在1到10之间随机放置一个铜币。添加分支后,事情变得更加灵活:

one of
    turquoise stone (50%)
    onyx stone (25%)
    malachite stone (15%)
    jade stone (10%)

“一个”之一基于给定的概率选择其子分支之一,然后对其进行评估。掉落可以掉落多个物品:

any of
    turquoise stone (50%)
    onyx stone (25%)
    malachite stone (15%)
    jade stone (10%)

这将评估所有子支行,如果针对它们的概率滚动失败,则将其丢弃。还有其他一些分支,用于根据地牢和玩家级别选择项目。

因为它们可能变得复杂,所以它还允许您定义命名的宏,这些宏本质上是扩展分支表达式的函数,并且可以在多个子句中重用。这样,例如,如果所有矮人掉落相同种类的战利品,则可以为此创建一个宏,并在所有这些怪物类型中使用它,而不用复制并粘贴巨大的掉落表。

一个怪物掉落的例子:

:: ancient dragon
    glyph   = D
    groups  = dragon
    drops
        (coins)
        2-3(1:8) one of
            (any-weapon)
            (any-armor)

这里(coins)(any-weapon)(any-armor)都是宏调用:

(any-armor)
    one of
        (shield)
        (helm)
        (boots)
        (gloves)
        (cloak)
        (robe)
        (soft-armor)
        (hard-armor)

依次调用如下内容:

(cloak)
    one near level
        cloak (10)
        velvet cloak (20)
        fur-lined cloak (50)

您可以像真正的编程语言一样深深地嵌套drop表达式。这为您提供了简单的基于表的方法无法提供的可组合性。

像所有数据驱动的系统一样,您可以通过构建难以理解的复杂液滴来使自己不知所措,但它满足了我的目标:

  1. 能够指定将哪些内容完全丢弃在代码之外。
  2. 简单地在代码中实现核心系统。
  3. 能够调整掉落哪些特定怪物,以便玩家可以进行面向目标的探索。(“我需要一条项链。我会寻找矮人,因为它们会掉下它们。”)

实现此功能的C#代码在此处


这是我以前从未见过的一种实现。谢谢!
Extrakun 2010年

12

在Stendhal,我们的战利品表是清单。每个条目均包含商品名称,最小和最大数量以及概率。内部结构与我们在该生物的网页上显示的非常相似。

对于我们而言,重要的是,拥有丰富世界知识的游戏设计师可以定义这些东西。也就是说,没有在程序代码级别理解复杂的逻辑。因此,我们在程序代码中没有生物和物品的定义,而是将它们移到了.xml文件中,例如elves.xmlclub.xml。我们确实为他们提供了gui编辑器,但是大多数游戏设计者都会直接修改.xml文件。

为了使生物和物品易于扩展,我们使用了构建块系统:没有用于“小精灵”或“弓箭小精灵”的程序类。但是有许多与行为相关的类,例如“胆小”,“巡逻”,“攻击性”,“弓箭手”,“治疗者”。设计师可以通过选择这些行为来定义新生物,而无需编写程序代码:例如,要创建一个“弓箭手精灵”,画一个带有弓箭的精灵精灵,并将其定义为“进攻性”,“弓箭手”。然后定义级别和相似属性,并将一些精灵项添加到战利品表中。

对于项目,我们采用类似的方法,但目前仅限于一种行为:设计人员可以添加新项目并定义行为,例如“ ConsumableItem”,“ KeyItem”或“ AttackItem”,“ Spell”,“ Scroll”,而无需必须编程逻辑。


8

在D&D桌面游戏中,有一种战利品类型的概念。大多数怪物都会从一个或多个表中删除,这些表就是您在扩展中要更新的表。这些怪物仍然会掉落“ 65%普通,10%宝石,15%艺术品,10%工具”,但是您将更新每个表中的内容。

例如,宝石包含随机范围的插槽,它们返回“ 1宝石(25%)2宝石(50%)5宝石(75%)100宝石”。当您要添加特殊的符文宝石时,请将表格更新为“ 1宝石(25%)2宝石(50%)5宝石(75%)100宝石(95%)1宝石”。

但是,另一方面,如果您已经有了百分比权重,为什么不只更新扩展中的所有怪物表呢?与纹理和网格相比,这样的表肯定是较小的有效负载。同样,您也不需要将百分比保持在100以内,这只是一个开始的假设,您可以在生成随机值之前对真实总数进行累加。如果权重之和为120,则只需生成1-120而不是1-100的值即可。


3

从表面上看,这似乎与“加权随机选择”问题相同。

确定随机事件的算法

为每个事件分配相对概率,将它们相加,然后选择该范围内的随机数来确定所需的事件。

即使您更喜欢使用百分比-这是同一系统,只是缩放到100-但您还是高估了添加内容的难度。如果您有100%,然后在扩展中添加20%,则将所有值除以(120/100),然后您便又回到了100%。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.