# Как NPC научились общаться

- Дата публикации: 2026-10-20
- Автор: Станислав Агеев
- Каноническая HTML-версия: https://satisfy.dev/ru/devlog/how-npcs-learned-to-talk/
- Английская версия: https://satisfy.dev/devlog/how-npcs-learned-to-talk/

Когда NPC впервые получили «свой голос», отдельные реплики стали живее, но разговор не складывался. В v0.11 симуляция уже владела фактами и решала, что делать: сказать, уклониться, сменить тему или признать, что NPC ничего не знает. Модель не придумывала факты — она подбирала манеру и слова, а фактическую часть игра подставляла от лица NPC.

## От заготовленных реплик к одному ходу

Варианты ответов готовились заранее и сохранялись. Если строка не проходила проверку, оставался запасной ответ. Это давало вариативность одной реплики, но не диалог: парсер читал каждую реплику игрока отдельно, поэтому обрывки вроде «из чего его а?» или «он сразу или как?» повисали без опоры. Заготовленные реплики не складывались в разговор.

## Один ход, строгие рамки

В v0.12 задача сменилась: не «подбери реплику под известное действие», а «дай одному NPC один ответ с короткой историей разговора». Для читателя это микроагент — не постоянный всезнающий персонаж, а один ход с контекстом, инструментами и одной репликой.

Ход получает говорящего, слушателя, место, время, слова игрока и несколько последних реплик. NPC может запросить только доступные ему факты и сведения о месте. Секреты отсеиваются до модели, ответ проверяется после, результат записывается для точного воспроизведения.

![Игрок трижды называет Савву Громова Щавой. Савва сначала естественно поправляет имя, затем к ответу о Нижнем Новгороде добавляет лишний факт о своём пути. После слов игрока «получается не на того контракт» Савву тут же убивают из арбалета.](./savva-conversation.svg)

*Тот же ограниченный ход внутри мира, который не ставится на паузу ради разговора.*

## Почему персонажи заговорили по-разному

Первые прогоны выявили ошибки, которые не лечатся одними инструкциями: Кузьма называл свою мастерскую «в мастерской Кузьмы» вместо «в моей», племянница Мары не узнавала стоящую рядом тётю, а NPC иногда пересказывал игроку его собственные действия. Часть таких ошибок исправили правилами игры, а не инструкциями модели: первое лицо для своих мест, родственные связи, учёт того, что собеседник уже видел или слышал, и пропуск действий самого игрока.

Затем обнаружилось, что все говорят в одном народном регистре — «сударь», «милостивый государь», «скрипим помаленьку». Ход знал характер, пол, чувства и формальность, но не то, как персонаж строит речь. Каждому добавили речевой профиль: темп, синтаксис, словарь, обращение, эмоциональные реакции. Профиль управляет манерой, а не знанием; он не подсказывает факты, имена или источники.

До профилей Кузьма звучал так:
> Старый Кузьма: «Делаю, а как же. Я сделал болт с красной нитью в мастерской Кузьмы — вот тебе и весь сказ».

После он остался собой, но заговорил иначе:
> Старый Кузьма: «Так я ж не с потолка это взял, друг, Стража заказала у меня партию болтов — в дом Стражи к 20:00, за 3 рубля. И работа-то рук просит, в партии болтов готово 49 штук».

А Мара получила собственный ритм:
> Мара: «Сыщик! Ха! А я-то думала, ты у меня рыбу чистить ходишь. Ну и что, нашла чего?»

Это не контролируемый эксперимент, где все отвечают на один вопрос; это примеры того, как у каждого появился узнаваемый голос.

## О том, как NPC перестали повторять очевидное

В v0.13 NPC помнит лишь несколько последних реплик и учитывает, что игрок уже видел или слышал. Это делает разговоры чуть более осмысленными, но память всё ещё короткая.

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

Теперь очевидное не попадает в обычный ответ, но NPC может повторить его при прямом уточнении. Устаревший план умершего убирается, как только говорящий узнаёт о смерти.

## Модель выбирает слова

Мы хотим, чтобы разговор с NPC был комфортным, но не выдавал его за игрока. Пусть будет видна игровая условность — это честно. Живость рождается из общего мира, ограниченного знания, недавнего контекста, узнаваемого голоса и понятных правил.

Главное: модель не решает, что в мире правда. Игра помнит, что персонаж видел и слышал, и определяет, какие действия возможны. Модель лишь подбирает слова и интонацию. Убедительность появилась именно благодаря такому ясному разделению задач, а не длинным промптам.
