ИИ‑мастер для настольной RPG: один запрос на ход, кубик до ответа и баг, который удваивал здоровье
Absurdia 17 минут назад Объяснить с ИИ‑мастер для настольной RPG: один запрос на ход, кубик до ответа и баг, который удваивал здоровье Средний 5 мин 360 Разработка игр * Искусственный интеллект Node.JS * Кейс Из...
Will Anthropic have the best AI model at the end of October 2026?
В сфере искусственного интеллекта произошло заметное событие. Absurdia 17 минут назад Объяснить с ИИ‑мастер для настольной RPG: один запрос на ход, кубик до ответа и баг, который удваивал здоровье Средний 5 мин 360 Разработка игр * Искусственный интеллект Node. JS * Кейс Из песочницы Я делаю браузерную текстовую ролевую игру, где ведущим работает языковая модель. Игрок пишет любое действие своими словами, мастер отвечает рассказом, а игра ведёт механику: здоровье, деньги, характеристики, инвентарь, броски d20.
Кажется, что всё просто: отправь модели историю и лист персонажа, получи ответ. На практике самые интересные задачи оказались не в промптах вида «напиши смешно», а на стыке вероятностной модели и детерминированной игровой механики. Ниже — четыре таких места и то, как я их решил.
Технические детали
js 24, Express, встроенный node:sqlite, модели через OpenRouter и общий для сервера и браузера модуль движка. Механику ведёт код, а не модельПервая версия была наивной: модели дают весь лист персонажа и просят «ответь и обнови состояние». Модель забывает предметы, раздаёт мечи +100, путает, сколько у героя денег, и через десяток ходов лист персонажа живёт своей жизнью.
Поэтому модель отвечает строгим JSON, в котором кроме рассказа есть только изменения:{ "check": { "stat": "ХАР", "dc": 12, "why": "уговорить дракона", "kind": "other", "ok": true }, "narration": "Дракон открывает один глаз…", "hp": -3, "add": , "fact": "Гоша назвал дракона папой" }Плюс поле scene с ключами из каталога пиксельных картинок, по которым клиент собирает иллюстрацию к ходу. Применяет изменения движок, и он же следит за границами: броня режет урон не больше чем вдвое, характеристики не уходят в бесконечность, у предметов из редактора есть потолок бонуса. Модель придумывает, что произошло, а код решает, сколько это стоит.
Например, урон с учётом брони:let dhp = num(r. hp); if (dhp < 0 && ! pierce) { // броня снижает урон, но не больше чем вдвое const def = Math.
Отраслевые последствия
def); const dmg = -dhp, after = Math. ceil(dmg / 2), dmg - def); dhp = -after; }Поле fact уходит в «хронику» — короткий список событий, который подмешивается в промпт следующих ходов. Так мастер помнит, что двадцать ходов назад герой назвал дракона папой, а вся история целиком в контекст не тащится.
Один запрос на ход вместо двухИзначально ход был двухшаговым. Сначала модель решала, нужна ли проверка и какая сложность, потом игрок бросал кубик, потом второй запрос — рассказ с учётом броска. Двойная цена и двойная задержка, а на быстрых дешёвых моделях задержка ощущается сильнее всего.
Решение — бросать кубик заранее. Сервер кидает d20 до запроса и кладёт результат в промпт:КУБИК: выпало 14, с бонусом Харизмы итог 16.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.



