Answers:
对话框树应使用XML完成。如果需要执行更复杂的操作,则可以使用对脚本文件的引用将响应条件和响应条件存储在嵌套树中。
您应该将脚本和对话框分开,特别是如果您要组合一个具有数以吨计的会话的RPG。然后,您可以使用诸如simpleXML之类的库来读取XML文件。
在SO上有一个类似的问题,举一个例子:https : //stackoverflow.com/questions/372915/game-logic-in-xml-files
我将研究嵌入诸如lua或ruby之类的脚本语言,并在其中编码对话框交互。
因此,对话脚本可能如下所示:
switch showDialog "Why don't you just leave me along!", "Okay", "But I found your dog!"
case 1:
showDialog "And stay gone!"
case 2:
if playerHasObject "dog"
showDialog "Thank you!"
else
showDialog "Liar!"
这也适用于对AI和其他在运行时进行调整有用的简单代码进行编码。您甚至可以在应用程序中添加内置的编辑器,当在调试(或作为复活节彩蛋)中运行时可以调用该编辑器。
在游戏Stendhal中,我们使用有限状态机来实现NPC。
下图显示了如何编写任务教程的一个小例子。
最初,NPC处于空闲状态,并且可能正在走动。玩家可以说“嗨”开始对话,然后NPC进入“注意”状态。在这种状态下,它回答有关他的“工作”的问题,并提供一些游戏“帮助”。玩家可能会要求一个任务,并且NPC将进入状态QUEST_OFFERED,等待玩家接受(“是”)或拒绝(“否”)。
我们定义了一组可以附加到转换的条件。例如,只有满足PlayerHasItemWithHimCondition才可能完成任务。
执行转换后,NPC可能会说一些文本和/或执行一个动作。与条件类似,我们定义了一组可重复使用的动作,例如EquipItemAction,用于为玩家提供任务奖励。
可以使用AndCondition,OrCondition和NotCondition组合多个条件。通常,在完成任务时需要执行许多操作,因此也有MultipleActions类。
尽管在Stendhal中的实际实现方式很难在其他(人类)语言中翻译,但我认为总体概念还是不错的。
我认为,在翻译中加入,你仍然可以使用XML的逻辑陈述之上。当您遇到这种复杂性时,您应该编写自己的对话工具。您的对话文本将被存储为数据库的键,您可以根据想要显示的语言交换出来。
例如,您可能有:
<dialogue id="101" condition="!npc.carsFixed">
<message>Localize.FixMyCar</message>
<choices>
<choice condition="hero.carFixingSkill > 5" priority="7" id="Localize.Sure">
<command>hero.carFixingSkills += 1</command>
<command>npc.carFixed = true</command>
<command>hero.playSmokeAnimation()</command>
<command>nextDialogue = 104</command>
</choice>
<choice condition="hero.carFixingSkill <= 5" id="Localize.CantFix">
<command>nextDialogue = 105</command>
</choice>
<choice id="Localize.FixYourself">
<command>npc.likesHero -= 1</command>
</choice>
</choices>
</dialogue>
然后,您将使任务文本渲染器将“ Localize.FixMyCar”替换为适当翻译的文本。
您的工具会以一种可选的语言以及可编辑的原始XML来显示玩家将看到的内容。
npc.add(ConversationStates.ATTENDING,
ConversationPhrases.QUEST_MESSAGES,
null,
ConversationStates.QUEST_OFFERED,
Localization[ "BringMeABeer" ],
null);
如果您的键具有足够的描述性,则没有完整的文本应该不是问题。
这样的事情也可能有用:
Localization[ "<Location>.<NPC_name>.<Dialogue_text_key>" ];
数据通过LUA脚本甚至XML文件来驱动您的角色。与NPC互动时,请抓取附加到该NPC的文件,将其读入,调整可能已触发的任何游戏变量,并产生有效的响应。
通过这种方式获得的最大好处是,您可以轻松地进入并操纵对话框,添加新字符等。您还可以避免在处理每种情况时使用特殊的逻辑来破坏代码库。
如果您有相当深的对话框树集,请使用ChatMapper。它们具有功能齐全的免费版本,该工具允许您将对话框树导出为XML。我一直在使用它,它是可视化和组织复杂对话框树的绝佳方法。
简单的自动机可以做到:
(dialogueline_id, condition) -> (next_id, response)
它可能看起来像这样:
(1, troll is hungry?) -> (2, say "troll be hungry")
(2, player has bananas?) -> (3, say "hey, you have bananas!")
(3, ) -> (-1, (say "i like bananas, i take them and eat, you may pass, bye", remove bananas, feed the troll))
(2, player does not have bananas?) -> (-1, say "go away!!!")
在游戏中,您找到id并尝试匹配id和条件。
您需要对条件和动作进行建模。通过对象,函数指针,XML ...
好的对话编辑器也会很方便。