Как я могу реализовать диалоговые деревья в моей игре?

Каков наилучший способ реализовать систему дерева диалогов в моей игре? Я хочу, чтобы NPC дал игроку разные наборы ответов, некоторые из которых могут появляться только в том случае, если у Игрока есть предмет или предыдущее событие.

50 голосов | спросил Bryan Denny 14 J000000Wednesday10 2010, 23:24:16

11 ответов


18

Диалоговые деревья должны быть выполнены с использованием XML. Вы сохраняете условия для ответов и ответа во вложенных деревьях с ссылкой на файл сценария, если вам нужно сделать что-то более сложное.

Вы должны держать сценарии и диалог отдельно, особенно если вы собираете RPG, у которого есть количество разговоров в метрической тонне. Затем вы можете использовать библиотеку, например simpleXML, для чтения XML-файла.

На SO есть аналогичный вопрос: https://stackoverflow.com/questions/372915/game-logic-in-xml-files

ответил Fox 15 J000000Thursday10 2010, 03:26:41
20

Я бы посмотрел на встраивание языка сценариев, например, в lua или ruby ​​и в диалоговое взаимодействие с кодированием.

Таким образом, скрипт диалога может выглядеть так:

switch showDialog "Why don't you just leave me along!", "Okay", "But I found your dog!"
    case 1:
        showDialog "And stay gone!"
    case 2:
        if playerHasObject "dog"
            showDialog "Thank you!"
        else
            showDialog "Liar!"

Это также хорошо работает для кодирования AI и других простых вещей, которые могут быть полезны для настройки во время выполнения. Вы даже можете добавить редактор, встроенный в ваше приложение, которое можно вызвать при запуске в отладке (или в виде пасхального яйца).

ответил BarrettJ 14 J000000Wednesday10 2010, 23:35:46
16

В игре Stendhal мы используем машину конечного состояния для реализации NPC.

На следующей диаграмме показан небольшой пример из того, как писать учебники квестов .

FSM с состояниями IDLE, ATTENDING и QUEST_OFFERED

Вначале NPC находится в состоянии IDLE и может ходить. Игрок может начать разговор, сказав «привет», и NPC отправится в состояние «УЧАСТВОВАТЬ». В этом состоянии он отвечает на вопросы о своей «работе» и предлагает некоторую «помощь» игры. Игрок может запросить квест, и NPC отправится в состояние QUEST_OFFERED, ожидая, пока игрок примет («да») или уменьшит («нет»).

Мы определили a набор условий , которые могут быть присоединены к переходам. Например, выполнение квеста возможно только в том случае, если PlayerHasItemWithHimCondition выполняется.

После того, как переход был выполнен, NPC может сказать некоторый текст и /или выполнить действие. Подобно условиям, мы определили многоразовый набор действий , например EquipItemAction , который используется для получения награды за выполнение задания.

Несколько условий можно объединить, используя AndCondition , OrCondition и NotCondition . Обычно для завершения квеста необходимо выполнить ряд действий, поэтому существует MultipleActions .

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

ответил Hendrik Brummermann 13 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 13 Sep 2010 10:55:30 +0400 2010, 10:55:30
5

Вы можете взглянуть на инструмент Dlgedit с движком Open Source RPG Adonthell . Он очень продвинутый и должен содержать все, что вам нужно (включая источники;))

ответил Koonsolo 14 J000000Wednesday10 2010, 23:55:58
5

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

Например, вы могли бы:

<dialogue id="101" condition="!npc.carsFixed">
  <message>Localize.FixMyCar</message>
  <choices>
    <choice condition="hero.carFixingSkill > 5" priority="7" id="Localize.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="Localize.CantFix">
      <command>nextDialogue = 105</command>
    </choice>
    <choice id="Localize.FixYourself">
      <command>npc.likesHero -= 1</command>
    </choice>
  </choices>
</dialogue>

Тогда у вас появится рендеринг текста квеста, замените «Localize.FixMyCar» соответствующим образом переведенным текстом.

В вашем инструменте будет отображаться то, что игрок увидит на выбранном языке наряду с редактируемым необработанным XML.

Аналогичным образом вы можете использовать что-то вроде этого в примере, на который вы ссылались :

npc.add(ConversationStates.ATTENDING,
        ConversationPhrases.QUEST_MESSAGES, 
        null,
        ConversationStates.QUEST_OFFERED, 
        Localization[ "BringMeABeer" ],
        null);

Если ваши ключи достаточно понятны, не имея полного текста, это не должно быть проблемой.

Что-то вроде этого также может быть полезно:

Localization[ "<Location>.<NPC_name>.<Dialogue_text_key>" ];
ответил toddw 21 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 21 Sep 2010 21:54:44 +0400 2010, 21:54:44
4

Данные приводят ваши символы с помощью скриптов LUA или даже файлов XML. Когда вы взаимодействуете с NPC, возьмите файл, прикрепленный к нему, прочитайте его, настройте для любых игровых переменных, которые могли быть запущены, и произведите действительный ответ.

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

ответил David McGraw 15 J000000Thursday10 2010, 00:52:25
4

Если вы используете XML, убедитесь, что вы создали небольшой инструмент для редактирования XML-файла. В противном случае вы сойдете с ума.

ответил zooropa 13 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 13 Sep 2010 19:44:03 +0400 2010, 19:44:03
3

Если у вас есть довольно глубокий набор диалоговых деревьев, используйте ChatMapper . У них есть полнофункциональная бесплатная версия, и инструмент позволяет экспортировать ваши диалоговые деревья в XML. Я использую его, и это отличный способ визуализировать и упорядочить сложные диалоговые деревья.

ответил 5 AMpTue, 05 Apr 2011 03:43:33 +040043Tuesday 2011, 03:43:33
1

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

ответил Aaron Brady 17 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 17 Sep 2010 09:07:52 +0400 2010, 09:07:52
1

Я думаю, что вы используете свой собственный язык скриптов для управления этим типом игры (если нет, вам следует). Затем расширьте свой скрипт для обработки диалогов.
Вы можете работать с другими игровыми переменными во время создания диалоговой логики. Игровые движки похожи на Lego. Вы запрограммировали только кирпичи, и скрипт их использует. Неважно, сделаете ли вы интерпретатор или компилятор скрипта. Но скрипт всегда полезен.

ответил samboush 21 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 21 Sep 2010 19:41:30 +0400 2010, 19:41:30
0

Простой автомат может сделать:

(dialogueline_id, condition) -> (next_id, response)

Он может выглядеть примерно так:

(1, troll is hungry?) -> (2, say "troll be hungry")
(2, player has bananas?) -> (3, say "hey, you have bananas!")
(3, ) -> (-1, (say "i like bananas, i take them and eat, you may pass, bye", remove bananas, feed the troll))
(2, player does not have bananas?) -> (-1, say "go away!!!")

В игре вы найдете id и попытайтесь совместить id и условие.

Вам нужно смоделировать условия и действия. По объектам, указателям на функции, XML ...

Хороший редактор диалога также будет полезен.

ответил user712092 6 +04002011-10-06T04:15:39+04:00312011bEurope/MoscowThu, 06 Oct 2011 04:15:39 +0400 2011, 04:15:39

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132