Я имею дело с игровыми файлами диалога (разговор между игроком и неиграбельными персонажами), где выбор диалога и их результат зависят от определенных условий и приводят к определенным действиям. Теперь я могу написать простой синтаксический анализатор, чтобы обрабатывать какой-то язык для указания предыстории и пост-условий, но мой друг предложил использовать XML. Условия могут храниться как атрибуты элемента диалога, а выбор и действия - это внутренние элементы. Затем я использовал функцию eval для анализа этих условий и утверждений (я использую Ruby для создания этой игры). Чтобы упростить такой подход, я мог бы написать простой графический интерфейс для управления этими файлами, не беспокоясь об уродливом 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>
Соответствующий код, если он написан в 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
Вещи вроде likeHero и carFixingSkills - это игроки знаний, которые могут иметь игроки NPC, которые, вероятно, будут храниться в хеше в реальной реализации. Я нахожу подход к файлу диалога более гибким, потому что я мог бы сделать редактор, чтобы легко редактировать диалог и условия/действия, а также из-за сложной природы деревьев игровых бесед. Язык сценариев, такой как Ruby или Lua, помогает, но для обработки таких деревьев потребуются сложные структуры.
Вернуться к исходному вопросу, является ли XML правильным инструментом для работы или я что-то не хватает?