我猜这个问题与MMO和《暗黑破坏神》类游戏有关。
实施放置表的常见设计是什么,怪物可以根据百分比放置不同类型的物品?我猜想最简单的方法是对项目类型使用“百分比权重”字典,但是如果我们希望引入新的项目类型(例如,当D2扩展包括符文和新的类项目时),这很难扩展。
我猜这个问题与MMO和《暗黑破坏神》类游戏有关。
实施放置表的常见设计是什么,怪物可以根据百分比放置不同类型的物品?我猜想最简单的方法是对项目类型使用“百分比权重”字典,但是如果我们希望引入新的项目类型(例如,当D2扩展包括符文和新的类项目时),这很难扩展。
Answers:
对于我正在从事的流氓行为,我实现了一个非常灵活的数据驱动系统来生成墨滴。我已经在这里记录了。从本质上讲,它是一个用于选择许多随机选择项的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表达式。这为您提供了简单的基于表的方法无法提供的可组合性。
像所有数据驱动的系统一样,您可以通过构建难以理解的复杂液滴来使自己不知所措,但它满足了我的目标:
实现此功能的C#代码在此处。
在Stendhal,我们的战利品表是清单。每个条目均包含商品名称,最小和最大数量以及概率。内部结构与我们在该生物的网页上显示的非常相似。
对于我们而言,重要的是,拥有丰富世界知识的游戏设计师可以定义这些东西。也就是说,没有在程序代码级别理解复杂的逻辑。因此,我们在程序代码中没有生物和物品的定义,而是将它们移到了.xml文件中,例如elves.xml或club.xml。我们确实为他们提供了gui编辑器,但是大多数游戏设计者都会直接修改.xml文件。
为了使生物和物品易于扩展,我们使用了构建块系统:没有用于“小精灵”或“弓箭小精灵”的程序类。但是有许多与行为相关的类,例如“胆小”,“巡逻”,“攻击性”,“弓箭手”,“治疗者”。设计师可以通过选择这些行为来定义新生物,而无需编写程序代码:例如,要创建一个“弓箭手精灵”,画一个带有弓箭的精灵精灵,并将其定义为“进攻性”,“弓箭手”。然后定义级别和相似属性,并将一些精灵项添加到战利品表中。
对于项目,我们采用类似的方法,但目前仅限于一种行为:设计人员可以添加新项目并定义行为,例如“ ConsumableItem”,“ KeyItem”或“ AttackItem”,“ Spell”,“ Scroll”,而无需必须编程逻辑。
在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的值即可。