Делаю движок для 3D-игр на веб (ч.6)
Движок рассчитан на то, что игры в нём делает не человек, а ИИ-агенты.
Времени на движок у меня мало, основное уходит на OfferClaw. Поэтому работаю иначе: не пилю одну фичу до блеска, а гоняю много дешёвых экспериментов, чтобы нащупать те немногие решения, которые стоит тащить в долгую. Часть экспериментов закономерно идёт в мусорку, и это нормально, так и задумано. Ниже и то, что выжило, и то, что выкинул.
Веб-редактор, человек и ИИ в одном пространстве
Раньше игру можно было только править текстом и смотреть результат. Теперь есть полноценный редактор прямо в браузере: дашборд со всеми играми, по сцене летаешь как в Unity, двигаешь объекты стрелками-гизмо, есть undo&redo и история правок. Главное, что рядом работает ИИ-агент и ты видишь это вживую: его правки появляются в сцене, очередь его задач сбоку. Один и тот же 3D-мир как общий стол для меня и для агента.
Картинка стала чуть живее
Игры всё ещё выглядят просто, но я добавил базовую графику, чтобы они не были совсем серыми: лёгкое свечение, нормальный свет и отражения, процедурное небо, более чёткий объёмный текст, обводка объектов. Плюс библиотека процедурных объектов (кристаллы, камни, столбы, фонари), так что игре не нужны тяжёлые модели, всё генерится кодом.
Игры собирает конвейер, и теперь он умеет себя проверять
Игры я и раньше собирал не вручную, а через пайплайн: раскладка уровня, генерация декораций, палитры под общий стиль. Новое в этих неделях это «утверждения» (claims): машинно-проверяемые факты про игру, которые она обязана выполнять до коммита. Например «до финиша реально дойти в пределах высоты прыжка» или «глубокая шахта экономически выгоднее поверхностной». Если игра не удовлетворяет утверждению, коммита нет. Идея простая: сборка должна доказать заявленное, а не «вроде работает».
Бот, который играет за разные типы игроков
Сделал симулятор персон: он гоняет игру без окна за новичка и за спидранера и сам проверяет темп. На свежей игре-шахте он сразу нашёл проблему, которую я не видел: копать глубоко экономически бессмысленно, выгоднее тупо гриндить поверхность. Перебалансировал, глубина стала иметь смысл. Баланс ловит машина, а не я вручную.
Что не взлетело
Декларативный «язык логики». Пробовал слой, где агент описывает «событие, действие» (нажал, дал монету), чтобы вообще не писать код. Замерил на нескольких играх: склейку простых событий ловит, но как полноценный язык упирается в потолок быстро. В итоге оставил его не как замену коду, а как страховку-линтер, который ловит висящие и мёртвые связи. Главным инструментом не стал.
Визуальный граф логики (ноды-стрелочки, как в Blueprints). Собрал прототип, поигрался, выигрыша против простого текста не дал. Запарковал на отдельной ветке.
—
На видео очередной пример игры, которую полностью сделал агент и сам снял видео. Все еще примитивно, но с каждым шагом мне нравится все больше.
~17 000 строк ядра, 700+ автотестов.