我正在处理游戏对话文件(玩家和不可玩角色之间的对话),其中对话选择及其结果取决于某些条件并导致某些动作.现在,我可以编写一个简单的解析器来处理某种语言来指定前置条件和后置条件,但是我的一个朋友建议使用XML.条件可以存储为对话元素的属性,选择和动作是内部元素.然后我使用eval函数来解析这些条件和语句(我使用Ruby来制作这个游戏).为了使这种方法更简单,我可以编写一个简单的GUI来操作这些文件而不必担心丑陋的XML.
但它让我觉得在XML文件中处理逻辑是一个奇怪的选择.我的理解是XML文件用于存储和交换数据,我总是阅读关于人们如何过度使用XML以获取其不适合的各种事物的咆哮.我的朋友们回应说明XML是如何用于所有事情的,包括XHTML和这种子弹描述语言(这也说明了一些逻辑).
说实话,使用XML会为我简化很多事情.编写解析器可能既痛苦又耗时,而且我的要求通常很简单.但它真的没问题,或者我会后悔这样的选择吗?
对于对细节感兴趣的人,这是基本对话交换在XML文件中的样子:
<dialogue id="101" condition="!npc.carsFixed">
<message>Man, fix my car!</message>
<choices>
<choice condition="hero.carFixingSkill > 5" priority="7" id="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="I can't...">
<command>nextDialogue = 105</command>
</choice>
<choice id="Fix it yourself">
<command>npc.likesHero -= 1</command>
</choice>
</choices>
</dialogue>
Run Code Online (Sandbox Code Playgroud)
如果用Ruby编写相应的代码将是:
def dialogue101
if !npc.carsFixed
showMessage("Man, fix my car!")
choices = []
if hero.carFixingSkill > 5
choices.push(Choice.new("Sure!", 7))
else
choices.push(Choice.new("I can't"))
end
choices.push(Choice.new("Fix it yourself"))
choices = selectTopPriority(choices) if …Run Code Online (Sandbox Code Playgroud) xml ×1