Я научил свой ИИ-детектив стравливать живых игроков: как устроен режим «Живые подозреваемые» в CASE ZERO

Я научил свой ИИ-детектив стравливать живых игроков: как устроен режим «Живые подозреваемые» в CASE ZERO

Если коротко, то в базовом режиме подозреваемых отыгрывает LLM — их допрашиваешь живым текстом, они врут и проговариваются. Про это я уже писал. А сегодня — про то, что я прикрутил недавно и что, кажется, ради этого всё и затевалось:

🎭 Что если убрать ИИ из роли подозреваемых и посадить туда живых людей

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

Один из игроков тайно виновен. Все улики против него настоящие (их сгенерил ИИ). Его задача — не расколоться. Задача детективов — расколоть его живым допросом. Получилась смесь Cluedo, «Мафии» и квеста, где ИИ — режиссёр живого стола.

Я научил свой ИИ-детектив стравливать живых игроков: как устроен режим «Живые подозреваемые» в CASE ZERO

Зачем, если базовый режим и так работает

Экономика. Самая дорогая и непредсказуемая статья в ИИ-режиме — токены на допрос. Игрок может задать свидетелю сотню вопросов, и каждый — запрос к LLM. В live-режиме отвечают люди → допрос стоит ноль токенов. Это позволило сделать режим заметно дешевле, не ломая экономику основного.

Главный кайф разработки: почти ничего не пришлось писать заново

Самое приятное инженерное открытие — новый режим переиспользует ~70% существующего кода. Улики, локации, доска версий, реконструкция хронологии, обвинение, разбор — всё то же. Технически я просто ввёл ортогональный флаг mode: 'ai' | 'live' и в одной точке заменил «LLM отыгрывает NPC» на «человек читает роль-карту». Движок раздачи ролей отдаёт ту же структуру дела, что и генератор, поэтому весь низ работает без изменений. ИИ-режим при этом не тронут вообще — старые партии играются как играли. Это осознанно отдельный режим, а не переписанный старый.

Раздача ролей — отдельная церемония, а не сухой старт

Когда дело сгенерировано, я не бросаю всех сразу в расследование. Сначала — отдельная фаза ROLE_REVEAL: детективы видят экран «Роли розданы, подозреваемые изучают легенды», а каждому подозреваемому приватно прилетает досье. Мелочь, но момент, когда открываешь карточку и читаешь «ВЫ — ВИНОВНЫ», того стоит.

Я научил свой ИИ-детектив стравливать живых игроков: как устроен режим «Живые подозреваемые» в CASE ZERO

Досье: чтобы человек мог достоверно отыграть, а не мямлить

Тут была геймдизайн-ловушка: если дать игроку сухое «ты — Пётр, ты невиновен», он на первом же вопросе поплывёт. Поэтому досье богатое, и — что мне нравится инженерно — оно синтезируется из уже существующих данных дела, без единого дополнительного запроса к ИИ:

  • Алиби собирается из настоящей хронологии: где ты был по времени. Невиновному это правда, её и держись. Виновному — что было на самом деле, не проговорись.
  • Что ты знаешь / что скрываешь, манера речи, отношения с другими фигурантами, кого ещё допрашивают.
  • А виновному — отдельный блок «Прикрытие: что вас выдаёт»: какие ключевые улики указывают на него и какой мотив придётся отрицать.

Анти-спойлер тут работает так же жёстко, как везде в проекте. Досье уходит только своему владельцу — адресной отправкой по сокету, отфильтрованной по playerId. Детектив, дёрнув тот же запрос, получит null. Блок «прикрытие» и флаг «виновен» существуют только внутри собственного досье. В общий стейт комнаты уходит публичная проекция без секретов. Правда раскрывается всем только в разборе — ни секундой раньше.

Живой допрос: голос + текст, и почему я его НЕ ограничил

Детектив кликает подозреваемого — и «приходит» к нему в локацию. Голос группируется по локациям (WebRTC + Socket.IO-комнаты): пришёл к человеку — слышишь его. Параллельно идёт текстовый тред — для тех, кто без микрофона, и как протокол. ИИ в этот разговор не лезет.

Я научил свой ИИ-детектив стравливать живых игроков: как устроен режим «Живые подозреваемые» в CASE ZERO

Осознанно не стал вешать лимит на реплики живого допроса — это же живой разговор, глупо его душить. Но тут вылез приятный побочный баг-класс: раз нет лимита и npcId приходит с клиента, кто-нибудь мог бы слать вопросы на «левые» id и плодить мусорные треды в памяти. Закрыл валидацией (спрашивать можно только реального живого подозреваемого) + лёгким анти-флуд-гардом — это не лимит реплик, а защита от спама.

Награда за качество обмана: чтобы убийца не выигрывал «камнем»

Вот где пришлось думать про баланс. Если награждать виновного просто за то, что его не поймали, оптимальная стратегия — молчать и всё отрицать. Скучно. Поэтому награда убийце считается не только по исходу, но и по качеству обмана (шкала 0–100):

  • увёл след — особенно если команда обвинила живого игрока вместо него;
  • выдержал плотный допрос и не раскололся;
  • ушёл, хотя команда собрала ключевые улики.

Пойман с уликами — обман провалился, ноль. А у невиновных — свои приватные цели («не дай себя обвинить», «незаметно наведи подозрение на X», «выдержи N вопросов»), детерминированно проверяемые, за них тоже капают звёзды. Всё раскрывается в разборе — вместе с разоблачением виновного.

Я научил свой ИИ-детектив стравливать живых игроков: как устроен режим «Живые подозреваемые» в CASE ZERO

Честно про слабое место этой механики: голосовой допрос я не логирую, поэтому «выдержку» и часть целей считаю по текстовым вопросам. Если стол играет чисто голосом — эти счётчики недосчитывают. Пока живу с этим; идей, как честно померить «выдержку под голосовым напором», у меня нет — если есть у вас, накидайте.

Баланс специализаций

В игре есть роли-специализации (следователь, криминалист, опер и т.д.) с бонусами и дебафами. И в live внезапно поехал баланс: часть дебафов была завязана на «лимит сообщений подозреваемым», а в живом допросе лимита нет. То есть роль с таким дебафом в live получала бонус даром, а другая — дебаф без работающего бонуса, превращаясь в ловушку. Пришлось сделать баланс режимо-зависимым: перекладываю мёртвую ось на рабочие (скорость обыска, подсказки, проверки хронологии). Незаметная деталь, но именно из таких и складывается ощущение, что «продумано».

Честно про состояние

Это по-прежнему прототип в проде:

  • Live-режим не обкатан на большом столе — нужно 4+ живых игроков одновременно, а это главный риск формата (собрать людей сложнее, чем нажать «играть»).
  • Голос в допросе не логируется → часть наград считается по тексту (см. выше).
  • Состояние всё ещё in-memory + JSON — осознанный техдолг, план миграции расписан.

В планах — гибрид: добор стола ИИ-подозреваемыми, когда живых не хватает (3 живых + 2 ИИ), чтобы формат не упирался в «нужно ровно N человек».

CASE ZERO — casezero.ru

И вопрос в комменты: как бы вы наказывали «игрока-камень», который в социальной игре просто молчит и всё отрицает — механикой, метрикой вовлечённости или ещё как?

5