生成语法正确的MUD式攻击描述


13

我目前正在开发一款基于文本的游戏,其中一轮战斗的结果是这样的

%attacker% inflicts a serious wound (12 points damage) on %defender%

现在,我只将%attacker%替换为攻击者的名称,将%defender%替换为防御者的名称。但是,该描述有效,但未正确阅读。由于游戏只是文字,所以我不想诉诸一般性的描述(例如“您对地精使用攻击造成了5点伤害”,可以说可以解决问题)

对于%attacker%所指的情况,如何生成正确的描述

  • “你”,玩家?“你造成……”是错误的
  • “蜜蜂”或其他复数形式?我需要某种方式知道我应该在名称前加上“
  • 如果%attacker%是通用名词,例如“ Goblin”,则它将读起来很奇怪,而不是%attacker%是一个名称。比较“地精造成...”与“ Aldraic剑使者造成...”。

基于文本的游戏通常如何解决此类问题?

Answers:


15

可以扩展%attacker%方法以包括一些信息,而不仅仅是对象的名称:

  1. 动词可以是单数或复数。这取决于主题。“您攻击 X”(第二人称单数)与“ Extrakun 攻击 X”(第三人称单数)与“地精攻击 X”(第三人称单数)。大多数动词只需要-s添加,但有一些例外。
  2. 名词可以是专有名词(“ 地精攻击X”)或普通名词(“ 地精攻击X”)。以元音开头的普通名词应使用“ an”而不是“ a”。它可能是一个普通名词,但在当前上下文中只有一个实例(“ 地精攻击X”)。
  3. 名词的数量可能有所不同,从零(“您没有击中地精 ”)到一个(“您击中一个地精 ”)到许多(“您击中了三个地精 ”)。许多名词只需要一个-s-es加一个,但有许多例外。
  4. 主题和对象可以是简单的(“ 小妖精 ”)或复合的(“ 小妖精和她的兄弟 ”)。
  5. 句子开头的普通名词需要大写,但是如果该名词有冠词或复合词,则只想将第一个单词大写。专有名词总是大写。
  6. 主语位置(“ 击中了地精”)和物语位置(“妖精击中了她 ”)使用了不同的代词。
  7. 可以通过添加'sif单数(“ 地精的斧头”),'if(复数)(“两个地精的斧头”),但代词有自己的规则(“ 您的斧头”)来生成所有格。

对于英语,我编写了Python,这是一个文本生成库,它源自名为JaysHouseMOO的MUD。随时学习或复制代码。它没有很好的例外案例库;您必须将其与游戏中使用的文字相加。恐怕我的移植代码未经广泛测试。它还可能需要为游戏添加更多案例(它是为社交MUD而非游戏MUD设计的)。

您的示例将写为"%1I %1:(inflicts) a serious wound (%2n damage) on %3i"。的数字%1%2%3告诉它其目的是被取代; I/ i告诉它在需要时添加一个间接文章(“ a”,“ an”);n告诉它显示没有文章的名词;:(inflicts)告诉它使该对象的动词缀合。

以下是向攻击者,防御者和其他所有人显示的输出:

$ python
>>> import msg
>>> m = "%1I %1:(inflicts) a serious wound (%2n damage) on %3i."
>>> attacker = msg.GenderedObject('Amit', 'm', 'proper')
>>> defender = msg.GenderedObject('goblin', 'm', 'unique')
>>> points = (12, 'point')
>>> msg.Msg().sub_parties({1: attacker, 2: points, 3: defender}, 
                          m, [attacker, defender])
(['You inflict a serious wound (12 points damage) on the goblin.', 
  'Amit inflicts a serious wound (12 points damage) on you.'], 
 'Amit inflicts a serious wound (12 points damage) on the goblin.')

请注意,如果您给了它(1, 'point'),它将打印“ 1点”而不是“ 1点”。那是我在游戏文字中遇到的问题,因此,我确保包括一项功能,以使其易于正确打印。

这是另一个示例,带有复合名词,以及“ a”和“ an”:

>>> m = "%1I %1:(hits) %2'n %2'(head)."
>>> a1 = msg.GenderedObject('goblin', 'm', 'normal')
>>> a2 = msg.GenderedObject('orc', 'm', 'normal')
>>> d1 = msg.GenderedObject('Amit', 'm', 'proper')
>>> d2 = msg.GenderedObject('Extrakun', 'm', 'proper')
>>> msg.Msg().sub_parties({1: [a1, a2], 2: [d1, d2]}, m, [d1, d2])
(["A goblin and an orc hit your and Extrakun's heads.", 
  "A goblin and an orc hit Amit's and your heads."], 
 "A goblin and an orc hit Amit's and Extrakun's heads.")

这些示例使用英语,并且仅跟踪男性/女性,代词,单数/复数动词/名词以及专有/普通名词。您需要追踪的内容会因语言和游戏文字的类型而异。西班牙语中有正式和非正式代词。几种语言具有男性和女性动词形式。日语代词取决于主语相对于宾语的状态。在某些语言中,动词变位可以隐式包含主语。确定要生成的所有类型的文本以及要翻译的语言,这将告诉您在游戏对象中需要跟踪的内容。创建内容时,可以包括必要的注释和例外情况。


1
+1,有关问题的摘要。我要补充的一件事是,只要其余信息(损坏量,来源,目标,过程)准确无误,则玩家往往会原谅此类生成的文本的轻微语法错误-拍摄95%正确的语法,因为最后5%太难了。

6

您可以拥有一整套字符串,而不是使用单个字符串并尝试正确替换它。从对象开始。您知道在创建生物时将其称为什么。您可以给它一个特定的属性,与名称分开,以替代攻击字符串。武器可以有多个不同的字符串,并且可以更详细地替代。他们可以代替“ attacker”来专门要求“ attacker-代词”或“ attacker-propername”。如果您的“蜜蜂”由多个生物而不是一个碰巧被称为“蜜蜂”的生物代表,则生物也可以具有这些标识符的复数形式。

所以你会像

name = goblin
pronoun = he
plural = goblins
proper = goblin
common = a goblin
specific_common = the goblin
possessive = the goblin's
possessive_pronoun = his

然后,您的攻击字符串会要求提供诸如此类的特定项目。

%attacker-pronoun%命中了%defender-specific_common%,造成了%damage%!%defender-pronoun%真的感觉到了那个!



3

我处理此问题的方法是通过一大套系统,其中包括将消息建模为数据结构而不是字符串。攻击者和防御者的值是它们的实际对象;动词(消息中的“ inflict”)已如此标记,并且知道执行该对象的对象,因此消息呈示者知道该对象需要以第一人称显示给演员,然后以第二人称显示给其他人。对象还知道它们的名词是否正确(因此,是否应将“ the”或“ a / an”应用于它们),有一些数据模型可让我指定“ the”或“ a / an” ”通常应该应用于该位置上的非专有名词,甚至更多。

Mudconnector上的该线程与您的问题非常相似,我在那里广泛讨论系统的详细信息。基本上,如果您希望完全不受消息传递系统的基础功能约束,并且愿意为此付出一定的学习代价,那么我会采用这种方式。(很像vi与nano。)


0

我建议您去KISS(非常简单),并利用文本界面的优势。

尽可能简化,简化,简化。在开始考虑编码之前就消除复杂性。就像许多游戏一样,使用两个句子代替一个句子来描述一个事件。你还记得博德之门吗?这不是文字游戏,但损害是用文字描述的;)


在事件的来源及其后果之间划分信息。

例如 :

  • 梅林投下了火球咒语。
  • Madmax被造成3点火焰伤害。
  • 地精受到2点火焰伤害。
  • 地精受到10点火焰伤害。
  • 等等...

我也建议始终使用第三人称单数,无论它是专有名词还是普通名词。

而且,尽管英语是一种重要的国际语言,但是如果您想产生更多的情感影响并占领更大的市场,则可能需要将游戏翻译成其他语言。

如果您打算这样做,请注意句子结构在其他语言中可能会有所不同。根据Wikipedia的说法,45%的可用语言以SOV(主题-宾语-动词)顺序构建句子,其中42%(如英语)以SVO顺序构建句子;像英语。


Baldur's Gate具有一个完整的图形引擎来显示输出,但对于交互式小说,文本是所有界面并在那里进行反馈。恕我直言,在这种情况下应该更加精致。
Extrakun
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.