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

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

21 голосов
/ 17 декабря 2008

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

Ответы [ 5 ]

8 голосов
/ 17 декабря 2008

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

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

5 голосов
/ 17 декабря 2008

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

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

1 голос
/ 17 декабря 2008

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

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

1 голос
/ 17 декабря 2008

Чтобы получить вдохновение или даже усыновление, взгляните на 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 КРЫЛЬЯ БУФФАЛО".

1 голос
/ 17 декабря 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...