Бот, который гуляет по лесу

Вынул текст из старого черновика одной игры и сделал бота для Mastodon: https://botsin.space/@forestbot

Бот ходит по лесу и каждые 6 часов отчитывается. Так как текст взят из игры, то текст написан во втором лице. Если нет блога в Mastodon, можно подписаться на RSS.

Зачем? Потому что это весело. А ещё, раз я забросил эту игру, так хоть показать описания. Зря, что ли, писал 41 вариант странных запахов в родительном падеже?

А теперь о том, как это сделано. Бот написан на движке Improv.

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

Затем идёт генерация описания. Самый первый шаблон — это description.cson. Improv выбирает случайным образом один из вариантов шаблонов и идёт на уровень глубже, генерируя текст для тегов в составе шаблона. Например, тег
[:object]
подключит случайную фразу из файла object.cson.

Но в файле object.cson есть много групп фраз. Одна из них выполняется на любом условии, а вот остальные — только если в модели Improv находятся определённый теги. Например, если игрок стоит в клетке с типом «shore» (берег озера), то Improv добавит к вариантам выбора подходящую группу и исключит варианты для других типов.

Но ведь наша модель пуста — значит ли это, что бот будет ходить только по самым скучным и типичным фразам? Нет, потому что в настройках Improv установлен параметр
incorporate: true
С этим параметром Improv выполняет инкорпорацию: если модель позволяет это сделать, то он выбирает вариант текста и обновляет модель в соответствии с выбранным вариантом. То есть, идёт обратная связь: если текст говорит, что вы стоите на берегу озера, то теперь так оно и есть. И это уже может использоваться в последующих кусках текста. Таким образом, текст никогда не будет противоречив.

Код открыт под свободной лицензией, если хотите — можете попробовать дополнить библиотеку фраз. Я не делал подсчётов, насколько какая группа фраз имеет вероятность выпадения, так что вполне может оказаться, что этот 41 вариант странных запахов имеет лишь один шанс из сотни на попадание в текст, а 5 вариантов неба — один шанс из десяти, и надо было лучше описывать небо.

Короче, процедурная генерация — это просто, мощно и интересно. Даже в ботах, а не играх.

Похожие публикации

Нет комментариев