Войти
ФлеймФорумРазработка игр

Динамически-генерируемые диалоги между NPC (типа живой мир)

Страницы: 1 2 315 16 Следующая »
#0
12:42, 2 дек 2016

Всем доброго времени суток! :)
Сразу с порога: эта тема скорее всего никогда не воплотится в реальность. Просто так развлечь разум и подумать на тему геймдизайна открытого живого мира.

+ Краткий и опциональный экскурс

Характер NPC генерируется в момент взаимодействия игрока с ним или наоборот.
NPC имеет таблицу "характер и ценности" (назовём матрица характера).
Каждое событие или понятие в игре имеет такую же таблицу "характер и ценности".
Отношение NPC к событию или понятию определятся свёрткой этих двух таблиц.
Склонность NPC к действию определяется свёрткой этих двух таблиц (не по всем понятиям возможно действие).
Если быть точнее, то у NPC имеется две таблицы - первая определяет его собственные действия, вторая - его оценку действий других (двойные стандарты форева!). Чаще всего они не сильно отличаются, но иногда бывают существенно различными.
Кроме того, у NPC имеется "память" (про события, но в основном про разговоры с другими NPC) круг "друзей".

Теперь проблема.

1. Каким должен быть состав таблицы, чтобы она была оптимального размера (с игровыми ситуациями/механиками там вполне понятно)? Лучше больше, чем меньше. Есть ли какие-то попытки формализировать характер в цифрах? Я видел различные подходы, но ни один из них не "готов ко внедрению в игру".
Я понимаю, что логика в том, что матрица будет состоять из:
а) отношения к глобальным понятиям (добро, зло, деньги и т.п.)
б) отношение к игровым действиям/механикам (убийство, воровство, алкоголь...)
в) отношение к социальным понятиям (сочувствие, честность, власть, грубость...)

2. Такая таблица будет весьма большой и, в общем, используется она полностью только в момент диалога с главным героем. Т.е. чтобы не захаращивать память, она должна "упрощаться"  (масштабироваться) после завершения разговора.
Таким образом мы получаем, что хранить надо исключительно "особенности" характера. А все параметры, где NPC "средненький" можно усреднить по соответствующим группам.
Таким образом, матрица характера может быть на разных уровнях:
0 - Расширенная. Для самых близких друзей и текущих компаньйонов. Также такой NPC имеет расширенную память.
1 - Полная. Генерируется в момент инициализации разговора. Для друзей и прошлых компаньйонов остаётся навсегда.
2 - Упрощённая. Если герой некоторое время не общался с NPC, то его матрица "остывает" оставляя только яркие черты характера, остальные начинают усредняться.
Такую же матрицу получают незнакомые фелгир на улице, чтобы дать им возможность общаться между собой.
3 ... N-1
N - Минимальная. Она хранит только яркие черты характера персонажа и его отношение к базовым понятиям типа "добро-зло". Любой персонаж, с которым игрок взаимодействовал более одного раза не может "остыть" ниже этого уровня.
Матрицы низких уровней могут генерироваться в момент, когда ещё не знакомого NPC упоминает другой NPC в диалоге.

Какие идеи могут быть по генерации таких матриц характера? По их масштабированию?
В первую очередь меня интересует именно "минимальный" уровень - наиболее общий, чтобы можно было "набросать" небольшой рабочий пример не выписывая 1000 черт характера и найти глюк где-то в основах логики...
Буду премного благодарен :)

#1
13:08, 2 дек 2016

eugeneloza
> а) отношения к глобальным понятиям (добро, зло, деньги и т.п.)
> б) отношение к игровым действиям/механикам (убийство, воровство, алкоголь...)
> в) отношение к социальным понятиям (сочувствие, честность, власть, грубость...)
Больше похоже на вектор чем на матрицу. Ну т.е. из перечисленных пунктов получается 10 чисел. Ну пусть будет 20 - вполне маленький размер, и не надо ни урезать ни усложнять. Да хоть 100 - если это не глобальная стратегия то памяти вполне хватит.

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

#2
13:57, 2 дек 2016

kipar
> Больше похоже на вектор чем на матрицу.
Ну да, если быть точнее, это таблица. Т.е. одномерная матрица. Т.е. вектор :) Просто изначально была именно матрица отношений, то я уже так по-старинке её и называю :) Теперь всё, что есть выполняется простой свёрткой (скалярным произведением векторов). Впрочем, возможно, между знакомыми таки будет матрица "как они знают друг друга".
kipar
> Ну т.е. из перечисленных пунктов получается 10 чисел.
Увы, получается очень и очень много. Память - "не критично", но "вполне возможно, что цифры полезут под потолок", т.е. надо её изначально оптимизировать. Выставить в ноль скорость "остывания" всегда возможно.

+ пример

Т.е. может быть отношение пресонажа к конкретным предметам, пищи, к факту того, что знакомый ходит в бар или встречается с NPC, которая данному NPC неприятна. Если NPC алкаш ему не критично хранить 100 игровых дней его вкусы в алкоголе, достаточно выставить в плюс отношение к алкоголю вообще. А если персонаж ярый ненавистник противоположной зеркальности, то для него не критично отношение к различным блюдам противоположной зеркальности.
Проблема ещё в том, что эта матрица лепится ко всему, что существует в игре. Каждому факту, который NPC запомнил соответствует какая-то матрица ценностей и, соответственно, его оценка - а таких фактов каждый NPC носит около сотни-тысячи.

#3
14:24, 2 дек 2016

eugeneloza
> Если NPC алкаш ему не критично хранить 100 игровых дней его вкусы в алкоголе,
> достаточно выставить в плюс отношение к алкоголю вообще. А если персонаж ярый
> ненавистник противоположной зеркальности, то для него не критично отношение к
> различным блюдам противоположной зеркальности.
Ну по идее можно дерево сделать, соответственно детализировать каждый узел когда появляется необходимость в этом и потом сворачивать назад к корню. Но имхо похоже на преждевременную оптимизацию. Ну или да, два-три уровня матрицы сделать, раз уж жалко памяти всем подробную давать.

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

#4
14:43, 2 дек 2016

kipar
Да. Именно так. Вот никак у меня не склеится, какими узлами всё делать. Причём ещё и так, чтобы особенности можно было хранить отдельно и долго. Например, NPC любит рубины. Остальные драгоценные камни нас не интересуют. Но, чтобы если герой подарит ей перстень с рубином, вдруг не оказалось, что матрица упростилась, и теперь она любит алмазы. Т.е. сжимаем мы разницу полной матрицы и ярких особенностей персонажа.

А в диалоге как раз просто.
Есть 100500 фраз в пуле.
У каждой фразы есть "контекст" и есть "ценности" (в основном фраза "цепляет" 2-3 ценности).
Рандомно выбираем фразу. Если фраза близка по контексту - делаем свёртку. Если по ценностям прокатило (результат больше нуля, хотя конкретная формула будет более "чувствительная") - ответ в студию.
т.е. диалог с точки зрения логики будет выглядеть как:
Выбрать подходящее приветствие.
Выбрать подходящую тему (например, недавнее событие для друзей, знакомство для незнакомцев, сплетни для сплетников, политика, бизнес...)
Сообщить факт (на тему) + возможно, оценка факта.
Реакция на факт (или) реакция на оценку (или) реакция на тему (и/или) продолжение темы, сообщение факта №2 (на ту же тему).
рекурсия, пока тема не исчерпает себя (и следим за повторами, чтобы не зациклиться).

+ пример

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

- Недавно в воде мне померещилась стая грязевых крабов.
- Отвратительные создания. Надеюсь, я с ними больше не повстречаюсь.

#5
15:05, 2 дек 2016

eugeneloza
> NPC имеет таблицу "характер и ценности" (назовём матрица характера).
> Каждое событие или понятие в игре имеет такую же таблицу "характер и ценности".
Evil Neutral Good
Lawful Neutral Chaotic
?
Хотел бы я посмотреть генератор текстов/реакций для днд alignment

#6
15:17, 2 дек 2016

eugeneloza
> Но, чтобы если герой подарит ей перстень с рубином, вдруг не оказалось, что матрица упростилась, и теперь она любит алмазы. Т.е. сжимаем мы разницу полной матрицы и ярких особенностей персонажа.
Если вектор предпочтений статический, то его хранить, вообще, не надо. Зафиксируй процедуру генерации от NPC ID и генерируй по необходимости.

#7
15:36, 2 дек 2016

skalogryz
DnD - первая мысль, которая пришла мне в голову :) Но, увы, это слишком обще, чтобы генерировать фразу. Фразе нужна конкретика. Иначе весь диалог может быть лишь об этих общих ценностях - а это не интересно.
Куда веселее обсуждать "слышал, что NPC1 вчера перебрал лишнего. NPC2 говорит, он такое вытворял...", чем "каково твоё отношение к добру?".

+ но и такое может быть

}:+()___ [Smile]
Идея такая, чтобы он не был статическим. Хотя, идея весьма хороша. Я думал об этом исключительно с точки зрения генерации NPC. Но ведь действительно, всех, кроме близких друзей можно фиксировать...
Впрочем, для фактов и фраз матрицы необходимо не генерировать, а задавать вручную (но, в общем, они рассчитываются из составляющих, нет критичной нужды привязывать их к каждому факту). Так что в любом случае необходим явный вид матрицы

#8
19:45, 2 дек 2016

О, еще одна тема. Надо почитать на досуге.

#9
20:16, 2 дек 2016

Lawful Good не может "перебрать на досуге". Он может "перемолиться на досуге" или "перебороться со злом на досуге"

Но мне кажется вводные фразы должны опираться больше на профессию npc (его класс)
Даже законопослушные-добрые могут ругаться матом

#10
0:08, 3 дек 2016

eugeneloza
// а) отношения к глобальным понятиям
я такое не одобряю.
Перво-начально должно быть отношение к явным игровым свойствам.
Например, свойства контроля владения_ресурсом.
t_unit:: gold_now // сколько денег в кармане, у характера
t_unit:: gold_max // макси-размер кармана для золота
t_unit:: gold_spec // порог довольства числом gold_now
gold_spec low --> альтер-масив мнений, вместо норм-масива.
gold_spec norm --> норм-масив мнений.
Мало денег - (развилка _вступать_ли_в_бой) готов убивать.
Нормально денег - (развилка _вступать_ли_в_бой) готов убегать.

// б) отношение к игровым ...
здесь что-то мутное в скобочках.
Но я думаю, что отношение к предметам.
Потому-что свойства и предметы - это разные элементы.
Свойство - оно личное, и отношение, как к своей части.
А предметы - это публичное, хотя многие предметы меняют свойства.
Но если свойство можно скрывать, и быть дву-личным, то предмет,
имеит хинт, который виден _всякому ...

// в) отношение к социальным понятиям
здесь тоже мутно, но похоже на отношение к тригерам.
Тоесть, заденет-ли тебя некий _грубый тригер ...
Если свойство-число Грубости ниже порога, то характер проходит
по граблям, как-будто их нет, в том месте.
Но если поговорить грубо, и набрать это число выше порога,
а потом, возвращение по _той_же_тропинке, то тригер сработает,
и выдаст характеру прямых люлей, или влияние на какое-то число
(например, число страха за свой карман с золотом станут максимальны)
(а из за страха, какой-то доп-альтер-масив мнений превысит всех)

// чтобы не знанимать много опер-памяти
Не обижайся, но не надо жалеть опер-память ... если вспоминать,
что ты акцентируеш на том, что игра для одного игрока.
Дай каждому характеру масив в 100+ свойств, и по 10 таких масивов,
и оставь INT_4BYTE элементом масива ...
4 мегабайта на сотню характеров с десятком друзей = почти не заметно.

// 1000 черт характера
черта == свойство
Трудно придумать 1000 свойств, чтобы работать с ними.
Лимитируй себя двумя десятками свойств в масиве_мнений_реакций.

#11
12:21, 5 дек 2016

skalogryz
Я несколько иное имел в виду. Поддержание темы диалога - достаточно сложное занятие.
Есть определённая канва: как будет выглядеть структура диалога.
Дальше следующая фраза определяется из контекста (свойств нпц, включая их профессию), общей темы, подтемы, предыдущей фразы и отношения между персонажами + рандом в этих рамках.
Просто определения Lawful chaotic для этого не достаточно. Для этого необходимы несколько (десятков-сотен) отношений персонажей к разным вопросам.

slatazan
> Лимитируй себя двумя десятками свойств в масиве_мнений_реакций.
да, об этом и тема. Какой минимальный набор выбрать, чтобы можно было на нём собрать что-либо вменяемое.
slatazan
> я такое не одобряю.
> Перво-начально должно быть отношение к явным игровым свойствам.
Многие вещи вытекают из нашего мировоззрения. Это типа дедукция - и отношение персонажа к конкретным механикам во многом "проистекает" из его отношения к более общему классу объектов.
Например:
Общий идеал общества -> Отношение к алкоголю -> отношение к сильному алкоголю -> отношение к конкретному типу алкоголя.
Если у персонажа общий идеал "сухой закон" - то у него вряд-ли должно быть "позитивное" отношение к любому из типов алкоголя. При этом как исключение, (но именно "осознанное" исключение) у него может быть "слабость" к конкретному напитку.

Попробую объяснить каким образом эта система "должна" (ага, сейчас, так она мне и задолжала) заработать:
Есть NPC
Есть игровой контент (действия+фразы)
NPC выбирает допустимое в данном контексте действие (фразу диалога) и выполняет его в соответствии с некоторыми общими закономерностями.

Что это даёт?

1. Добавляем контент. Дописали 30 фраз, закинули их в пул и NPC сразу стали ими пользоваться. Добавили механику кражи - закинули в пул действий - и NPC, которые это одобряют, стали пользоваться кражей, соответственно, стали реагировать на неё на основании того, что есть сейчас в пуле фраз-реакций.
2. При достаточно жёстком соответствии фраз друг другу у каждого диалога есть несколько вариантов развития. Иными словами, контент будет создаваться в виде диалога, где каждой фразе нужно будет приписать такие условия совместимости, чтобы она обязательно была возможна в таком диалоге, но условия совместимости будут обеспечивать также её совместимость с другими возможными фразами и контекстами.
3. Каждая фраза может быть вплоть до того, что озвучена, т.к. их число ограничено. Обеспечить однородность звучания при подстановке имён, фактов и т.п. - отдельная сложная задача, но про это пока речи не идёт.

Что для этого надо?

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

+ Показать
#12
12:50, 5 дек 2016

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

#13
13:44, 5 дек 2016

kipar
Да, чрезмерная детализация для системы, где диалоги не генерятся ИИ, а лепятся из достаточно ограниченного пула.

#14
13:45, 5 дек 2016

kipar
Совершенно верно. Логика генерации (пула) и соответствует такой "сотне" диалогов. Только с усложнёнными параметрами выбора следующей фразы.

Между NPC создаётся поток информации (в том числе слухов - тут чуть сложнее, но тоже возможно). NPC "перезнакомятся" друг с другом, создаются социальные сети и т.п.
Ключевых слов как таковых не будет. Будет "автодиалог" (с возможностью чтения или упрощённый - только обмен фактами). Т.е. главный герой может идти и "десяток игровых часов" трындеть с NPC по дороге между Оазисами. Игра с непрямым управлением, игрок может при необходимости сменять тему разговора, чтобы добиться необходимого результата (диалог медленно, но верно влияет на характер главного героя - "скажи мне кто твой друг и я скажу кто ты"). Кроме того, особые (квестовые) темы выделяются особым образом. Кроме того, можно спросить об обыденных вещах. Самое частое из такого - спросить у прохожего на улице "где такой-то" или "где найти это место".
Темы будут группироваться по "NPC" (включая поговорить про самого героя), "Локации", "Places of interst", "Recent news and gossip", "Just chat".
Например, спросив про конкретного NPC собеседник (если знаком с ним) вывалит несколько важных фактов про него, можно расспросить детальнее и получить порцию менее значительных фактов. Можно конкретно (меню-меню-меню :)) зайти и спросить "что этот NPC любит из подарков" (естественно, вменяемый ответ смогут дать только близкие друзья этого NPC).
Другой уровень - для близких друзей, которые могут вывалить свои 10 тысяч слов на тему того "с кем и о чём разговаривал сегодня" до самых мелких и незначительных деталей, типа цен на масло. Логика тут проста - чтобы персонажи могли долго и плодотворно общаться. Общение налаживает (или портит) отношения между персонажами. В игре будет один из вариантов/плоскостей геймплея - социальный, где это важно.

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

Самый простой пример такой генерации... как бы глупо это не выглядело: http://www.gamedev.ru/flame/forum/?id=205051
Да. Это именно тот подход к генерации диалогов, который я пытаюсь "состряпать". Как тайлы ложатся в структуру лабиринта - так фразы в структуру диалога.

Страницы: 1 2 315 16 Следующая »
ФлеймФорумРазработка игр

Тема в архиве.