Подтвердить что ты не робот

Логика игры в файлах XML

Я имею дело с игровыми файлами диалога (разговор между игроком и неиграбельными персонажами), где выбор диалога и их результат зависят от определенных условий и приводят к определенным действиям. Теперь я могу написать простой синтаксический анализатор, чтобы обрабатывать какой-то язык для указания предыстории и пост-условий, но мой друг предложил использовать 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 правильным инструментом для работы или я что-то не хватает?

4b9b3361

Ответ 1

Если в вашей игре будет менее полутора десятков уникальных диалогов, вы обязательно должны поместить эту информацию в какой-то файл данных. XML - сильный конкурент для формата. Я не говорю Ruby, поэтому в этом случае это может не сработать, но другой вариант заключается в том, чтобы определить диалог как данные непосредственно в коде Ruby. (Я знаю, что это будет очень хорошо работать в Lua, Python и Javascript... Я предполагаю, что определение вложенных структур данных также легко в Ruby.)

Мы использовали XML файлы для определения всех статических данных в "Пиратах Пылающего моря", и это был отличный способ. Наличие такого формата данных позволяет не программистам управлять данными и высвобождает программистов для работы над функциями вместо ввода данных. Наличие этих файлов данных в текстовом режиме означает, что вы можете держать их под контролем источника, чтобы вы могли сказать, когда они меняются.

Ответ 2

Если вы не слышали о YAML, взгляните на него. Это похоже на XML, но XML на самом деле не написан вручную - это интерфейс машинной машины, который, по-видимому, читается человеком (поэтому вы действительно должны создать для него редактор). YAML - это человеко-машинный интерфейс, гораздо более доступный для записи.

Я бы не стал разбираться с DSL, YAML карты отлично.

Ответ 3

DSL будет воплощением Mercedes-Benz для этого, и было бы интересно писать в Ruby. Вы правы, это займет много работы, но это может окупиться, если это был хорошо написан, и эта игра действительно снялась.

Одна вещь, которую следует учитывать, если идти по XML-маршруту, это парсер/движок, который вы будете использовать для его рендеринга. Последнее, что я проверил, REXML был единственное шоу в городе для рубистов. Если вам нравится REXML, тогда XML звучит как хороший способ, но если вы не пробовали, я бы предложил сделать это прежде чем принимать это решение. Я не собираюсь на REXML, просто советую немного осторожно, так как вы полностью зависите от этой библиотеки, независимо от того, что вы используете.

Ответ 4

Поскольку вы пишете это в Ruby, я думаю, что делать это в XML должно быть достаточно. Таким образом, вы можете создать веб-приложение, которое позволит вам работать с диалогом и логикой игры из любого места. И другие люди могут сотрудничать с вами или, возможно, создавать моды пользователей, что всегда является плюсом.

Пока вы держите свои XML файлы хорошо организованными (блок-схемы на бумаге помогут), вы не должны сталкиваться с какими-либо проблемами и даже можете поблагодарить себя за то, что вы испытываете боль от разбора его:)

Ответ 5

Чтобы получить вдохновение или, может быть, даже усыновить, взгляните на AIML и BuddyScript. AIML - это XML для чатов, BuddyScript - еще один вариант - теперь принадлежит Microsoft.

Ниже приведен образец AIML из http://www.alicebot.org/aiml.html

<category>
<pattern>WHAT ARE YOU</pattern>
<template>
    <think><set name="topic">Me</set></think> 
    I am the latest result in artificial intelligence,
    which can reproduce the capabilities of the human brain
    with greater speed and accuracy.
</template>

Если бы вы интегрировали технологию AIML (которая, я думаю, свободна) в вашу игру, ваш NPC будет иметь ИИ, с которым могут разговаривать ваши игроки. Разве это не интересно?

AIML является модульным, поэтому все ваши NPC могут иметь общий файл, описывающий все стандартные знания об их мире. Затем вы можете добавить определенные файлы для материала, который будет типичным для каждой расы, класса, места, личности или задачи. Есть много интересных образцов файлов AIML, например Eliza.

Ситуационная информация может быть добавлена ​​в начале разговора, и у вас может быть какое-то программное обеспечение за пределами механизма AIML, слушая "магические" слова от NPC, указывающие на то, что NPC хочет, чтобы что-то произошло в "реальном" игровом мире, как "*** ДАЙТЕ ИГРОК 20 БУФФАЛОВЫХ КРЫЛЬЯ".