Я имею дело с файлами диалогов игры (диалог между игроком и неиграбельными персонажами), где выбор диалога и его результат зависят от определенных условий и приводят к определенным действиям. Теперь я мог бы написать простой синтаксический анализатор для обработки своего рода языка для определения предварительных и постусловий, но мой друг предложил использовать XML. Условия могут быть сохранены как атрибуты элемента диалога, а варианты выбора и действия являются внутренними элементами. Затем я бы использовал функцию eval для разбора этих условий и операторов (я использую Ruby для создания этой игры). Чтобы упростить такой подход, я мог бы написать простой графический интерфейс для управления этими файлами, не беспокоясь об уродливом XML.
Но мне кажется странным выбором обрабатывать логику в файлах XML. Насколько я понимаю, файлы XML предназначены для хранения и обмена данными, и я всегда читал о том, как люди злоупотребляют XML для всех видов вещей, для которых он не предназначен. Мои друзья отвечают, отметив, как XML IS используется для всего, включая 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>
Соответствующий код, если он написан на 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 choices.size > 4
result = showChoices(choices)
case result
when "Sure"
hero.carFixingSkills += 1
npc.carFixed = true
hero.playSmokeAnimation
dialogue104
when "I can't"
dialogue105
when "Fix it yourself"
npc.likesHero -= 1
end
end
end
Такие вещи, как likesHero и carFixingSkills, могут быть предметом знаний, который может иметь игрок и неигровые персонажи, которые, вероятно, будут храниться в хэше в реальной реализации. Я считаю, что подход к диалоговому файлу более гибкий, потому что я мог бы сделать редактор, чтобы легко редактировать диалог и условия / действия, а также из-за сложной природы деревьев разговоров игры. Помогает такой язык сценариев, как Ruby или Lua, но он требует сложных структур для обработки логики таких деревьев.
Возвращаясь к первоначальному вопросу, является ли XML подходящим инструментом для работы или я что-то упустил?