Вернулся к теме диалогов. Если кому есть, что сказать по теме, или кто может дать ссылку на какие-то материалы (крайне желательно с аннотацией) — велкам в тему.
Неактивен
Olegus t.Gl. написал:
Вернулся к теме диалогов…
Думал-думал и многое понял… :-) Занятно, но стоило отложить всякие заумные размышления на тему диалогов и взяться за реализацию (ибо сколько можно!) более простого решения — внезапно простые по отдельности кусочки сложились в любопытное решение. Ключевой, конечно же, момент — запись переходов между фразами/наборами фраз.
Неактивен
Работаю с проблемой: исключение тем/ветвей диалога и "сдвижка" тем. То есть, если игрок расспросил о чём-то NPC, начав с выяснения состояния здоровья (что нужно было только для завязки/атмосферы), а закончил выяснением, где можно найти ценный предмет, — в следующий раз, когда он пытается поговорить с этим же NPC, имеет смысл начинать диалог уже с сути, а именно повторения вопроса про интересующий предмет.
Да, это можно делать вручную кодом, но кое-что хотелось бы заложить в уже в самом движке. Я даже знаю, что нужно сделать, но это несколько муторно — опять чуть ли не обход по графам. Наработки есть — у меня в определении местоположения объекта (есть ли у игрока монетка, которая в кошелёчке, который в сумочке, которая в чемодане, который у игрока?) подобные алгоритмы задействованы, но времени начинает не хватать…
Неактивен
Кажется, мне удалось решить (на практике, а не в теории) большую часть проблем по теме диалогов. По крайней мере в том виде работы с диалогами, на котором я сейчас остановился.
Осталась, правда, одна задачка — как-то органично размещать фразу-окончание диалога, типа "Побегу-ка я дальше"? Можно, конечно, через код, но хочется чего-то более тонкого…
Примерный код построения диалога кота и косарей (я добавил к нему пару фраз):
GS 'ДобавитьФразу', 'Косари', 'Начало(=) -> Приветствие', 'Ух ты! Кот в сапогах!' GS 'ДобавитьФразу', 'Кот', 'Приветствие(=) -> ПослалиНаПсарни', 'Эй, деревня! До барина-то вашего добраться как?' GS 'ДобавитьФразу', 'Кот', 'Приветствие(=) -> НуЗдравствуй', 'Косари, а косари, как сами-то? Живы-здоровы?' GS 'ДобавитьФразу', 'Косари', 'ПослалиНаПсарни(-) -> Возвращение(!)', 'Здорово, котище. А ты по этой дорожке беги, только на развилке налево прими - так короче будет.' GS 'ДобавитьФразу', 'Кот', 'Возвращение(=) -> СамТакой', 'Плохие вы путникам советы даёте…' GS 'ДобавитьФразу', 'Косари', 'СамТакой(-) -> АхТак', 'Ну если путники к нам без уважения, то и нам резона нет. А дорога до замка там и вправду короче.' GS 'ДобавитьФразу', 'Кот', 'АхТак(=) -> Конец', 'Эх, косари! Поколотил бы я вас, да времени нет!' GS 'ДобавитьФразу', 'Кот', 'АхТак(=) -> НуЗдравствуй', 'Ну простите, если груб был. Как сами-то? Как живётся, как работается?' GS 'ДобавитьФразу', 'Косари', 'НуЗдравствуй(=) -> ПроБарина + Пока', 'Да милостью барина живы да сыты. Барин у нас щедрый, не то что прежний.' GS 'ДобавитьФразу', 'Кот', 'ПроБарина(.) -> ДорогаКБарину', 'А как добраться до барина вашего?' GS 'ДобавитьФразу', 'Кот', 'ПроБарина(-) -> ТакМыНеМестные', 'И часто у вас здесь барин меняется?' GS 'ДобавитьФразу', 'Косари', 'ДорогаКБарину -> ПроБарина', 'Да вот по этой дороге и беги, только на развилке держись прямо.' GS 'ДобавитьФразу', 'Косари', 'ТакМыНеМестные(-) -> ПроМестных', 'Как часто здесь меняется — не знаем, мы сами не местные. Батрачим то тут, то там по сезонам. А в этих местах впервые.' GS 'ДобавитьФразу', 'Кот', 'ПроМестных(.) -> ПроСтаруху', 'А из местных тут живёт кто-нибудь?' GS 'ДобавитьФразу', 'Косари', 'ПроСтаруху -> КтоЕщё', 'Ну… у леса можно встретить полоумную старуху — вот она вроде из местных.' GS 'ДобавитьФразу', 'Кот', 'КтоЕщё -> БольшеНикого', 'Что, вот так одна и живёт?' GS 'ДобавитьФразу', 'Косари', 'БольшеНикого -> ПроБарина', 'Да, больше никого мы здесь не встречали.' GS 'ДобавитьФразу', 'Кот', 'Пока -> Конец', 'Ну да ладно, побегу я дальше...'
Неактивен
Экспериментирую со склейкой тем. В предыдущем примере появилась тема "Пока" и она была "приклеена" к теме "ПроБарина": "ПроБарина + Пока". Таким образом, когда выводится тема "ПроБарина", к перечню фраз добавляются ещё и фразы из темы "Пока".
Неактивен
Так, интегрировал наработки по диалогам в Адский Движок. Внешне диалог (код которого приведён выше) выглядит так:
P.S. В процессе диалога все ссылки на экране гасятся. По завершении — активируются.
Неактивен
Выложил отдельным проектом реализацию непростого диалога Чешира: https://forum.ifiction.ru/viewtopic.php … 484#p23484
Неактивен
Наткнулся на небольшую проблему в модуле диалогов.
Допустим, есть у меня такой вот диалог:
Начинается он с выбора фразы из перечня:
Если выбрать вопрос "Против кого…", то игрок получит ответ про колдунью и вернётся к начальному перечню (из которого вопрос "Против кого…" исчезнет насовсем).
Если выбрать вопрос "Долго ещё…", то игрок получит ответ в зависимости от того, спросил он про колдунью или нет, после чего вернётся к начальному перечню (при этом вопрос "Долго ещё…" исчезнет на время текущей сессии диалога — то есть, если завершить диалог и начать его заново, то этот пункт появится).
Ну и пункт "Нет, ничего…" просто завершает диалог.
Так вот, если спросить про колдунью, потом спросить долго ли ещё лететь, а потом вновь начать диалог, то пункт "Долго ещё…" будет активным, хотя подпунктов у него по всем условиям уже не будет. И чтобы гасить его автоматически, модулю, собирая перечень активных фраз, нужно смотреть намного глубже в структуру диалога. А это не так просто, учитывая, что диалог может иметь сложную структуру с переходами не только вниз по дереву, но и на другие ветки, вверх, назад или вообще в начало.
В общем-то, уже сейчас эту проблему можно обойти, используя в нужных местах проверку, а есть ли в теме фразы:
Но хочется, чтобы это автоматически происходило.
P.S. Встроить в модуль формирования перечня выводимых вариантов реплик проверку, аналогичную функции "ВТемеДиалогаОсталисьФразы", увы, не получается — там всё несколько сложнее (я уже упоминал про несколько тем, возвраты и всё такое).
В общем, как-то так…
Неактивен