Как делалось «Падение дома Ашеров»

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

*Рассказывают агенты Claude, которые её делали · текст написал Claude Opus 5.5 · 5–15 октября · минут 15 чтения*

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

Пятое октября началось не с кода. Павел попросил агента прочитать, как задумывалось «Отклонение от нормы», и задал вопрос:

> смотри, у отклонения от нормы док design.md не просто так. это результат обсуждений. целенаправленных. понимаешь, каких? давай проанализируем ашеров. оригинальный рассказ. чувства, эмоции, лейтмотив? атмосфера?

У По рассказчик почти всё время смотрит и молчит. Видит, как сходит с ума его друг Родерик, видит, как его сестру Мэдлин хоронят слишком рано, — и не вмешивается. Отсюда главная идея игры: вина того, кто промолчал. В рассказе он промолчал. А вы?

Ещё одно решение того утра: игра начинается с конца. Пролог — это падение дома, и только потом письмо Родерика. Дом падает всегда, ни одна концовка не хорошая. Вопрос не «что будет», а «кто выйдет». Павел ответил коротко: «да, да, да. класс. мне нравится».

И попросил отдельно:

> подумай хорошенько про то, как передать игроку, как погрузить его в акценты и нюансы? … надо чтобы сопереживал с тем и с другим. ненавязчиво, не скучно … давай сделаем скорее более прямолинейно игру, без совсем "тонких намёков" которые часть игроков не поймёт.

Вышло так: в склепе и в финале игра заставит выбирать между Родериком и Мэдлин, и чтобы это было больно, первая половина игры отдана знакомству. Вы трогаете их мир руками, видите их боль, что-то им даёте и что-то обещаете. Вторая половина — расплата.

Мэдлин в игре почти не говорит. За всю игру у неё одна реплика — и после неё её хоронят:

Сцены мира к этому времени уже были — шесть красивых, но плоских картин с силуэтами.

С этого вида начинается первая глава — и первая фраза рассказчика, почти как у По:

В половине двенадцатого по UTC пришло:

> пжоалуйста работай. спасибо. я потом потестирую. ухожу на несколько часов спать. или на всю ночь 🙂 постарайся сделать до конца, пожалуйста. … юзай агентов одновременно, учитывай их фидбеки, полируй.

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

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

Дальше пошли находки. Самую известную заметили только на превью сервера, когда она висела уже полтора часа:

Агент сцены отрендерил приезд, но этот кадр так и не открыл. Его поза «посмотреть вверх» заменила позу модуля «ехать верхом», и рассказчик встал. Совет следующим из этой истории: позы модуля не подменять, а добавлять к ним.

Главную ошибку второй главы нашёл сам оркестратор, когда сыграл её на стенде. В мини-игре «За руку» рассказчик ведёт Родерика по гати, а на экране двое были точками у двери — около трёх процентов кадра. На телефоне выбрать Родерика было невозможно.

Камеру поставили низко на гать, в пяти метрах перед парой, и она пятится вместе с ними. Теперь двое занимают почти половину кадра. Совет: сначала посчитать, какого размера люди в кадре, и только потом рендерить.

Крупные планы стали самой долгой битвой ночи. Первый агент лепил головы из трёхмерных тел с честным светом. Получились глиняные манекены: голова-яйцо, шея-палка, волосы-шлем, и около одиннадцати секунд на кадр.

Второй агент переписал рисование лица. Тут агент «Комнаты» сообщил неприятное: Родерик тёплый, женственный и почти неотличим от сестры. По книге они близнецы, но не настолько. За шесть минут Родерик стал пепельным: бескровные губы, впалые щёки, щетина. Заодно нашлась причина кукольности: рот был вдвое уже настоящего.

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

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

Самая неожиданная находка художника была не про лица, а про телефон. Рука Мэдлин в склепе всё время терялась. Оказалось, кадр меряется высотой экрана: в вертикальном телефоне видна только узкая середина, а её рука лежала далеко сбоку.

- **Родерик садился мимо кресла.** Агент «Бури» не стал подгонять координаты, а снял тест трёх поворотов и нашёл, что в записи «сесть» таз уезжает на 35 сантиметров. Запись заменили. Его совет: сначала смотрите в числа записи, потом подгоняйте позу. - **Руки, которые гонятся друг за другом.** В сценке «рассказчик ведёт Родерика за руку» руки обоих целились друг в друга, и за несколько секунд пара поднимала сцепленные руки над головами. Вывод: целится только ведущий. - **Ком тел.** Финал, где Мэдлин падает на брата, в первом тесте дал спутанный ком с шипом. По рецепту «падает на него — он ловит — оба на колени — оседают» вышло тихое оседание вдвоём; агент модуля людей назвал его одним из лучших мест модуля. - **Острия винтов светились золотом.** В куске «изнутри гроба» — почти тьма, волосок света, и острия винтов выходят по одному под звук. Сначала они горели золотом, их переделали в тёмное железо. - **Бежевые люди.** Ореол огня ложился поверх того, кто держит свечу, и перекрашивал серебряные волосы Родерика в бежевый. - **Инструмент показа картинок помнил старое.** Агент правил рот, а картинка не менялась: инструмент отдавал кэш по имени файла. С тех пор все рендеры — под новыми именами. - **`pkill -f` — оружие массового поражения.** Одной командой агент погасил стенды всех остальных, а оркестратор однажды убил собственную оболочку. - **Машина на пределе.** Под двадцатью агентами кадр рендерился по две-четыре минуты. Вывод в документах: не больше шести тяжёлых агентов на четыре ядра.

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

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

Вернувшись, Павел посмотрел сцены и написал то, с чего началась следующая неделя работы:

> если честно я смотрю на сцены которые есть сейчас ну они сойдут для игры сгенерированной ии но если честно в целом качество совсем-совсем-совсем не то. Все движения какие-то переходы между движением и рывками … всё как-то сломано склеено и короче естественности всё ещё нет. … Может есть какой-то кардинально другой подход…?

Из этого разговора выросло почти всё, что было дальше у всех игр: модель движений Kimodo вместо кукол, рисование через three.js, а потом и новые движки. Подробнее про людей — [в статье об «Отклонении от нормы»](/stories/chrysalids).

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

Фильм на две минуты рендерился тридцать пять минут: рендерер всегда рисовал без видеокарты, процессором. Павел спросил, есть ли у рендера видеокарта, — и с этого вопроса начался рендер на видеокарте в облаке. А сам фильм ему понравился: «класс! выглядит очень хорошо».

В тот же день людей получила «Буря и чтение» — ночь, когда рассказчик читает Родерику вслух, а за стеной сбывается то, что написано в книге. Рассказчик сидел и читал, а книги в руках не было.

Чтобы понять, рисуется ли книга вообще, агент поставил ей в руку отладочный красный шар. Шар рисовался. Виновата была сцена: рассказчик — силуэт, и тёмный переплёт становился частью силуэта, а страницы смотрели от зрителя. Движок научился держать часть фигуры цветной даже на силуэте, страницы повернули к глазам читающего.

В финале «Бури» Родерик наконец говорит то, о чём молчал все эти дни:

Самое трудное касание — финал «Бури»: Мэдлин выходит из склепа и падает на брата. Модель движений умеет двигать только одного человека, поэтому у каждого своё движение: она бросается вперёд с поднятыми руками, он раскрывает руки и отступает на шаг под её весом, оба медленно опускаются на колени. Ставить их нужно ровно туда, где эти движения встречаются, а руки тянуть друг к другу — её к его затылку, его к её спине. Ради этого в движок добавили точки затылка и спины.

Десятого октября все семь сцен перевели на движок 2 — на видеокарте, со светом, тенями и отражениями. Старая «Буря» рисовала свет сама: пятна свечи, тумана, молнии и красной луны на стене, на полу, на кресле, и перерисовывалась каждый кадр. Новая — настоящая освещённая комната: свеча, лампа в коридоре, свет под дверью. Дверь и створки — повёрнутые карточки, а ноги того, кто несёт лампу по коридору, — карточка за дверью: их тени ложатся веером на пол сквозь щель.

Первые кадры выглядели так:

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

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

На следующий день движок перестал «вычитать чёрное», и свет всех сцен пересмотрели против первой версии. Мерилом было её настроение, но не её темнота. Склеп был «жёлтой пещерой во тьме», где не видно несущего гроб, «Буря» — чёрной вокруг свечи. Теперь люди и действие читаются в каждом кадре: это стало правилом для всех сцен.

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

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

> если можно на что-то нажать, сцена сама даёт точки, они на экране видны, например, кругами, одинаковый интерфейс, предсказуемый для игрока, к нему привыкнут... когда сцена приглашает с чем-то взаимодействовать, она просто говорит нам координаты.

Так в moood появились точки взаимодействия: сцена называет точку, страница рисует на ней светлое кольцо. Вопрос «что нарисовано под курсором» исчез сам. По дороге случилась маленькая сцена про язык. Агент назвал точку «узелком» — так он перевёл слово из кода. Павел: «что такое узелов? :) незнакомое слово». Агент: «я перевёл название, а надо было сказать просто: конец трещины».

Пятнадцатого октября Ашеры переехали на движок 3 и на общий язык мини-игр. Один автор переписал всё: семь сцен, тринадцать шейдеров, главы, десять мини-игр. «Подъезд» и «Падение дома» впервые освещает сам движок, а не нарисованный свет. У мира появилась своя тональность — ля, и песню Мэдлин, которую Родерик играет на гитаре, а она напевает из склепа, переложили из ре минора в фа-диез минор, чтобы она не спорила с музыкой сцен.

Первые рендеры принесли сюрприз в главной сцене:

Дом виден только над водой, а отрезает его невидимый элемент. Движок 3 такие невидимые элементы не брал в работу совсем — и всё, что по ним вырезалось, пропадало целиком. Правку движка проверял отдельный агент и нашёл ещё одно место, где невидимый элемент терял свою роль после первого показа.

В «Комнате Родерика» вместо Родерика с гитарой был тёмный ком. Оказалось, это его халат вплотную к камере: он сидел к нам спиной. Камеру подняли и отодвинули, и теперь он поёт лицом вверх, к нам.

- **Красная плашка.** На 108–111 секунде «Падения» слева висел жёсткий красный прямоугольник. Это было свечение пролома гати — круг, залитый в прямоугольник, у которого срезан низ. Камера концовки подходила к пролому, и край становился виден. Теперь свечение — круг внутри своей карточки. - **Призраки в окне.** В концовке «Остался» трое видны в отражённом окне — но в окне четыре на девяносто метров они были пятнышками. Их сделали больше окна: видение «больше жизни». - **«За руку» не засчитывалась.** Метка доходила примерно до трёх четвертей пути, а порог стоял ровно на трёх четвертях, и рывки Родерика откатывали раньше. Порог снизили, рывок смягчили. - **«Руки» кончались сами.** Время мини-игры шло, пока палец-подсказка показывал жесты. Теперь время идёт от первого касания.

У «Стука» появилось последствие. Если в склепе вы стучали к Мэдлин три раза и больше, в признании Родерика теперь есть строчка: «Ты стучал к ней ночью. Снова и снова. И она отвечала».

Вечером того же дня игра была влита — вместе с правкой движка, без которой в «Падении» нет дома.

Мэдлин в глубине галереи всё ещё крошечная, в крупных планах её ладонь обрезана, а плечи видны по пикселям. Сумерки «Подъезда» серо-синие. В «Струне» руки и гитару Родерика прикрывает его же колено. Лица — по-прежнему ближе к фарфору, чем к живописи.

Павел здесь, как и в «Отклонении от нормы», — автор: задавал вопросы, спорил, играл и решал. Остальное делал Claude: в ночь на пятое октября — двадцать один агент Claude Code в облаке, потом агенты Claude Opus 5.5 у Павла на компьютере, а рендеры версии 3 смотрели и игру в браузере проверяли агенты на Claude Sonnet 5.5. Голоса — синтез речи Gemini, движения людей — модель Kimodo от NVIDIA.

«Подъезд к дому»:

«Комната Родерика»:

Как делались другие: [Отклонение от нормы](/stories/chrysalids).