Игры как инженерная песочница и искусство ломать код
Я, как и многие люди, проводящие много времени за ПК, люблю видеоигры, но ещё больше мне нравится пытаться понять как та или иная игра устроена. Мне нравится копаться в механизмах, разбираться, как вещи работают изнутри, и, если повезет, заставлять их работать так, как разработчики совсем не планировали. Игры для меня — это отличный полигон, где можно строить гигантские заводы, программировать на языке цветных проводов или искать дыры в логике движка, чтобы срезать пару минут прохождения.
Ниже я хочу рассказать о том, как обычный геймплей превращается в инженерную задачу, почему на калькуляторах запускают Doom и что такое "параллельные вселенные" в коде Super Mario 64.
# 1. Жанр инженерной автоматизации: от термодинамики до логистики
Существует целый пласт игр, который можно назвать «симуляторами автоматизации» или CMS (Construction and Management Simulation). Главная задача - управление эффективностью, а главная проблема - «бутылочное горлышко» (bottleneck) в вашей производственной цепочке и энтропия.
// Пример CMS игры - Satisfactory. Источник: https://store.steampowered.com/app/526870/Satisfactory/
Этот жанр многогранен, и разные проекты делают упор на разные аспекты инженерного дела:
- > Satisfactory: 3D-проектирование. Если большинство игр жанра — это «схемотехника на плоскости», то Satisfactory переносит задачи в 3D. Инженер здесь сталкивается с вертикальностью: как компактно разместить цех в ограниченном ущелье, используя многоэтажные конструкции? Здесь важна не только логика, но и пространственное мышление — прокладка труб с учетом гравитационного напора и создание развязок конвейеров, напоминающих сложные дорожные эстакады.
- > Oxygen Not Included (ONI): Термодинамика. Здесь автоматизация сталкивается с физикой газов и тепла. Заводы греются, и тепло не исчезает «в никуда». Игроку приходится проектировать активные системы охлаждения: паровые турбины, превращающие тепловую энергию в электричество, и контуры с хладагентом, использующие фазовые переходы жидкости. Это суровый симулятор борьбы с законом сохранения энергии.
- > Dyson Sphere Program: Логистика масштаба. Игра берет концепции автоматизации и масштабирует их до звездного скопления. Главная переменная здесь — орбитальная механика. Время доставки ресурсов между планетами меняется динамически, так как планеты вращаются вокруг звезд. Финальная цель — строительство Сферы Дайсона, что требует расчета траекторий для роя солнечных парусов.
- > Mindustry: Программирование на Assembly. Гибрид Tower Defense и завода. Уникальна тем, что содержит блоки микропроцессоров. Игрок может писать реальный код (упрощенный Ассемблер) для управления юнитами, логикой турелей или распределением энергии в сети.
Но, пожалуй, самым ярким представителем жанра и его безусловным популяризатором является Factorio.
// Factorio. Источник: https://store.steampowered.com/app/427520/Factorio/
Идея Factorio проста: вы разбиваетесь на чужой планете, и вам нужно построить ракету, чтобы улететь. Сначала вы добываете руду киркой. Потом ставишь первый бур. Потом плавильню. А через 100 часов вы обнаруживаете себя в 4 утра, отлаживающим железнодорожную развязку, потому что пропускная способность по меди упала на 3%. Это игра про чистую логистику и масштабирование, где сюжет пишется вашими конвейерными лентами.
## Логика и комбинаторы: программирование внутри игры
В Factorio есть механика под названием "Circuit Network" (Логическая сеть). Это провода (красные и зеленые), которыми можно соединять объекты. С их помощью можно передавать сигналы. Например, сундук может передать сигнал "У меня 500 железных плит".
Разработчики добавили туда три базовых элемента:
- > Арифметический комбинатор: выполняет операции (+, -, *, /, битовые сдвиги) над сигналами.
- > Сравнивающий комбинатор: работает как оператор if (если А > Б, то выдать сигнал 1).
- > Постоянный комбинатор: просто генерирует заданный сигнал (константу).
// Логическая схема в Factorio. Источник: https://wiki.factorio.com/File:LogicGates.png
Казалось бы, примитив. Но любой программист знает, что если у вас есть логические вентили (AND, OR, XOR, NOT) и память (а её можно сделать, зациклив выход комбинатора на вход), то вы обладаете Тьюринг-полным инструментом. И тут понеслось.
Умные поезда и SR-триггеры.
Обычный игрок просто пускает поезда по расписанию. Инженер внутри игры строит систему на базе RS-триггеров (SR-Latch). Суть такая: поезд не должен ехать на станцию погрузки, пока там не накопится достаточно руды для полной загрузки. Но и уезжать он не должен, пока не разгрузится полностью. Простой таймер тут не сработает эффективно. Игроки собирают из компараторов схему памяти, которая хранит состояние станции (открыта/закрыта) и переключает его только при достижении пороговых значений.
Дисплеи и видеопамять.
В игре есть лампы, которые можно включать и выключать сигналами, и даже задавать им цвет. Игроки создают массивы ламп (например, 32x32), превращая их в пиксельный экран. Чтобы вывести картинку, нужно где-то хранить данные. Для этого строятся массивы постоянных комбинаторов (как ПЗУ / ROM), где каждый сигнал кодирует строку пикселей. Затем создается декодер, который считывает эти сигналы и зажигает нужные лампы. Люди умудрялись запускать на таких экранах клип "Sandstorm" или Bad Apple, полностью синхронизированные со звуком (который тоже генерировался игровыми динамиками через программируемые сигналы).
// Factorio - Sandstorm Источник: YT канал DaveMcV (https://www.youtube.com/watch?v=mgfwwqwxdxY)
Пиком стало создание полноценного процессора внутри игры, мощности которого хватило, чтобы запустить внутри Factorio упрощенную версию Doom. Игроки реализовали движок рейкастинга (raycasting) исключительно на игровых комбинаторах, выводя изображение на экран из ламп.
// DOOM в факторио Источник: YT канал arrow in my gluteus maximus (https://www.youtube.com/watch?v=0bAuP0gO5pc)
Саморасширяющиеся фабрики (Grey Goo).
С помощью мода "Recursive Blueprints" (который позволяет ставить чертежи автоматикой) и ванильной логики, игроки создали базы, которые строят сами себя. Машина считывает координаты, проверяет наличие ресурсов, ставит чертеж солнечной панели, добывает ресурсы, производит новые панели и ставит следующий чертеж. Это буквально реализация концепции "Серой слизи" (Grey Goo) фон Неймана — машины, которая бесконечно реплицирует сама себя.
# 2. Minecraft, Terraria и Dwarf Fortress: «Железо» из кубиков
Такая же история происходит и в других песочницах. Если игра дает хоть малейшую возможность передавать сигнал от точки А к точке Б и как-то его изменять — в ней построят компьютер. Однако подходы к инженерному делу в этих играх кардинально различаются.
## Minecraft: Редстоун (Hardware)
В Майнкрафте есть красная пыль (Redstone). По сути, это электричество с бинарной логикой (сигнал есть / сигнала нет). Есть повторители (задержки). Из факелов и блоков собираются логические вентили (AND, OR, NOT), из которых собираются сумматоры, а из них — процессоры.
Самое безумное, что я видел — это проект Chungus 2. Это не просто «калькулятор». Это полноценный процессор с собственной архитектурой, построенный внутри игры в масштабе 1 блок = 1 транзистор.
- [CPU] У него есть своё АЛУ для сложения/вычитания и регистры.
- [RAM] Оперативная память реализована через блокировку воронок или сдвиг блоков поршнями.
- [ASM] У него есть свой набор инструкций (Assembler), под который энтузиасты пишут компиляторы на реальных языках.
- [GPU] Графический дисплей на лампах, способный отрисовывать примитивы.
// CHUNGUS 2 — процессор для Minecraft с частотой 1 Гц. Источник: YT канал SethBling (https://www.youtube.com/watch?v=FDiapbD0Xfg)
Скорость работы такого компьютера — около 1 Гц (один такт в секунду) или даже меньше, потому что игра обрабатывает редстоун со скоростью 20 тиков в секунду. Но он работает. На нем запускали "Змейку", "Тетрис" и, разумеется, рендеринг 3D-графики. Но энтузиасты не остановились на тетрисе. Используя моды для ускорения симуляции редстоуна, они смогли запустить на таком компьютере Doom. Кадровая частота была ужасной, экран был монохромным, но это был рабочий 3D-шутер внутри кубической песочницы.
## Minecraft: Командный блок и Ванильный Скриптинг
Если редстоун — это паяльник и транзисторы, то Командный блок (Command Block) — это IDE и код. Изначально добавленный как инструмент для админов, он эволюционировал в Тьюринг-полный язык программирования, работающий поверх игрового мира.
Синтаксис и Логика.
Основа всего — команда execute. В последних версиях игры её синтаксис стал напоминать функциональное программирование. Она позволяет менять контекст исполнения (кто исполняет? где? при каких условиях?).
// Если игрок с тегом "wizard" стоит над водой -> дать левитацию.
Переменные и NBT.
В игре есть система scoreboard. Это целочисленные переменные (Integer). С их помощью создают циклы, таймеры и математические вычисления.
Более сложные данные хранятся в NBT (Named Binary Tag) — формате, похожем на JSON. Командные блоки могут читать и менять свойства любого объекта: от здоровья зомби до текста на странице книги, лежащей в сундуке на другом конце карты.
Рейкастинг (Raycasting).
Как сделать рабочее оружие в игре, где есть только мечи и луки? Инженеры пишут рекурсивные функции для рейкастинга. При выстреле запускается невидимая сущность (маркер), которая перемещается вперед на 0.1 блока, проверяет коллизию со стеной или врагом, и если ничего нет — вызывает саму себя снова. Этот цикл повторяется сотни раз за один кадр (тик), создавая иллюзию мгновенного попадания пули.
Datapacks: Игра как движок.
Современные разработчики почти не используют физические командные блоки. Они пишут Датапаки — архивы с текстовыми файлами .mcfunction. Это позволяет писать код во внешнем редакторе (VS Code) и загружать его в игру.
Это привело к появлению концепции «Vanilla Modding» — созданию сложных игровых режимов (MOBA, Королевские битвы, RPG с прокачкой) без установки модов, используя только нативный код игры.
Энтузиаст SethBling написал интерпретатор языка BASIC внутри Minecraft на командных блоках. Вы можете писать код на BASIC в книге, бросать её в воронку, и черепашка-робот будет исполнять ваши команды, строя блоки в мире.
## Terraria: Логические вентили и «Баги как фичи»
Многие называют Terraria «2D Майнкрафтом», но инженерная часть здесь совсем другая. Тут есть официальная система проводки с разноцветными проводами, которые не пересекаются, и, что важно, готовые компоненты логических вентилей (Logic Gates), которые в Minecraft приходится строить вручную.
// 32-битный компьютер внутри Terraria Источник: YT канал From Scratch (https://www.youtube.com/watch?v=zXPiqk0-zDY)
Телепорты и автоматизация ферм.
Игроки строят сложные арены для битв с боссами, где датчики (нажимные плиты или таймеры) активируют ловушки, телепортируют игрока из опасной зоны и автоматически собирают лут.
Механика Hoik.
Ещё один пример инженерной смекалки. Изначально это был баг: если поставить скошенные блоки определенным образом, игровой движок, пытаясь «вытолкнуть» персонажа из текстуры, мгновенно перемещает его на следующий блок. Разработчики решили не исправлять это, и игроки превратили баг в технологию. Hoik-двигатели позволяют перемещать игрока или предметы со скоростью света (бесконечная скорость в пределах одного тика), создавая транспортные системы, работающие быстрее телепортов, и механизмы, которые невозможно создать официальными инструментами.
## Dwarf Fortress: Компьютер на жидкостях
Эта игра — прародитель жанра и она еще сложнее. В ней симулируется жизнь гномов в процедурно генерируемом мире. Там нет электричества. Но игроки поняли, что можно использовать механику течения воды и магмы.
Dwarven Computer — легендарный проект. Логический «0» — воды в канале нет, логическая «1» — вода есть. Системы шлюзов, насосов и нажимных плит, реагирующих на вес воды (7/7 depth), работают как транзисторы и логические элементы. Это медленно, это невероятно сложно строить, но это доказывает, что вычислительная машина — это концепция, не зависящая от кремния. Её можно построить хоть из гномов, хоть из воды.
# 3. "It Runs Doom": Почему именно он?
Я не зря упомянул запуск этой игры в разделах про Factorio и Minecraft. В мире технологий есть негласное правило: если у устройства есть экран и хоть какой-то процессор, на нем нужно запустить Doom (1993). Это стало своего рода мемом и показателем мастерства. Почему именно Дум?
- Открытый код. Id Software открыла исходники движка id Tech 1 еще в 90-х. Он написан на C, который является "lingua franca" программирования.
- Простота портирования. Код игры очень четко разделен на "движок" (логика, рендеринг) и "платформо-зависимый слой" (ввод, вывод звука, вывод картинки). Программисту достаточно переписать только этот нижний слой под конкретное железо, и игра заработает.
- Низкие требования. Оригиналу нужно всего 4 МБ оперативной памяти и процессор 33 МГц. По современным меркам это ничто. Микроконтроллер в вашей стиральной машине мощнее.
Люди запускали Doom на:
- > Принтерах Canon: взломав прошивку принтера.
- > Осциллографах: преобразуя видеосигнал в звуковые волны, чтобы луч рисовал картинку.
- > Блокноте (Notepad.exe): Это не запуск *в* блокноте, а программа, которая рендерит игру в ASCII-символах и обновляет текстовый файл 60 раз в секунду с такой скоростью, что открытый Блокнот показывает "видео".
- > Внутри Doom: В новой части Doom Eternal можно найти компьютер, на котором можно сыграть в классический Doom. Рекурсия.
// DOOM на осциллографе (Tektronix 2220) Источник: YT канал MrSlehofer (https://www.youtube.com/watch?v=OU16lIx_pC8)
# 4. Реверс-инжиниринг: как понять то, что скрыто
Создание механизмов внутри игры — это только одна сторона медали. Но есть и обратная: анализ того, как создана сама игра. Это называется реверс-инжиниринг (обратная разработка). Это процесс, когда у вас есть только готовый файл (exe), и вы хотите понять, как именно он работает, не имея исходного кода.
Это настоящее детективное расследование, которое требует глубокого понимания архитектуры компьютера (регистры CPU, стек, куча, виртуальная память). Обычно процесс делится на два этапа:
Интерфейс Ghidra
1. Статический анализ.
Вы загружаете файл в дизассемблер (например, Ghidra или IDA Pro). Он превращает набор единиц и нулей в инструкции ассемблера — язык, который понимает процессор. Вы видите бесконечные строки вроде MOV EAX, [EBX] или CMP ECX, 0. Ваша задача — по этим микро-действиям восстановить логику программы. Это похоже на чтение книги на иностранном языке, где вы знаете только предлоги и союзы, но пытаетесь понять сюжет.
2. Динамический анализ.
Вы запускаете игру под отладчиком (x64dbg) или сканером памяти (Cheat Engine) и наблюдаете за программой в реальном времени. Ключевая проблема при анализе памяти — ASLR (Address Space Layout Randomization). Современные ОС случайным образом меняют адреса загрузки модулей при каждом запуске. Поэтому поиск статического адреса ("здоровье лежит в ячейке 0x0050F123") бесполезен. Инженер ищет цепочки указателей (Pointer chains) и базовые адреса (Base Address + Offset), чтобы стабильно обращаться к нужным данным.
Интерфейс Cheat Engine
3. Хукинг и Инъекция кода (Code Injection).
Понимание логики позволяет вмешиваться в работу программы.
- > DLL Injection: Принудительная загрузка своей библиотеки в адресное пространство процесса игры для получения доступа к её памяти изнутри.
- > Hooking (Detours): Перехват вызова функции. Первые байты оригинальной функции в памяти перезаписываются инструкцией безусловного перехода (
JMP) на код исследователя. Это позволяет, например, перехватить функцию отрисовки DirectX (EndScene) для вывода своего меню поверх игры (Overlay) или изменить логику получения урона.
Зачем это нужно?
- > Создание сложных модов и Script Extenders: Легендарные моды вроде SKSE для Skyrim работают именно так — они расширяют функционал движка, внедряясь в него на уровне памяти.
- > Hooking (Перехват) позволяет подменять игровые функции своими. Например, чтобы добавить поддержку широкоформатных мониторов в игру 2003 года.
- > Сохранение наследия: Фанаты чинят старые игры, которые не запускаются на современных Windows, удаляя проверки DRM или исправляя работу с графикой.
- > Поиск уязвимостей (Security): В онлайн-играх это поиск дыр для создания читов или, наоборот, для их закрытия разработчиками.
Именно этот глубокий технический анализ — понимание того, как игра хранит координаты, как округляет числа с плавающей точкой и в каком порядке обрабатывает коллизии — становится фундаментом для поиска уязвимостей. Когда вы знаете, как движок "думает" на уровне байтов, вы можете найти ситуации, где его логика ломается. Это подводит нас к самому зрелищному прикладному применению реверс-инжиниринга — спидранам.
# 5. Спидраны и их примеры
Спидран — это прохождение игры на скорость. Но на высоком уровне это не про "быстро жать кнопки". Это про тотальное уничтожение логики игры с использованием знаний, полученных через реверс-инжиниринг.
Спидраннеры ищут глитчи (ошибки). Но чтобы найти полезный глитч, нужно понимать, как игра думает. Вот несколько примеров, которые взрывают мозг своей технической подоплекой.
## Super Mario World: Произвольное выполнение кода (ACE)
Это, пожалуй, "Святой Грааль" спидраннинга. Игроки нашли способ манипулировать памятью консоли SNES прямо во время игры. Выполняя абсурдные действия (передвигая панцири черепах в определенные пиксели, меняя предметы в инвентаре в нужном порядке), они записывают нужные байты в системную память.
По сути, игрок пишет программу, используя геймпад. В какой-то момент игра считывает эти байты как инструкции процессора. Результат? Можно заставить игру мгновенно показать финальные титры. Или, как вы уже догадались, энтузиасты использовали этот метод, чтобы перепрограммировать Марио на лету и запустить внутри него «Змейку» или Doom. Без картриджей, просто нажимая кнопки. Это явление известно как ACE (Arbitrary Code Execution).
## Super Mario 64: Параллельные Вселенные (PU)
Один из самых известных технических концептов. Координаты Марио в памяти хранятся как числа с плавающей точкой (float). Но движок игры проверяет столкновения (коллизии) с помощью упрощенной сетки, используя целые числа (short integer). Если разогнать Марио до невероятной скорости (используя баг с прыжками назад — BLJ), его координаты могут стать настолько огромными, что при конвертации в целые числа произойдет переполнение. Движок игры подумает, что Марио находится на "карте", хотя визуально он улетел за миллионы километров. Эти зоны, где геометрия уровня "дублируется" из-за математики координат, называют Параллельными Вселенными. Спидраннеры перемещаются в "невидимые" копии уровня, чтобы обойти стены и триггеры, буквально манипулируя математикой переполнения буфера.
## Half-Life 2: Accelerated Back Hopping (ABH)
Движок Source, на котором сделана HL2, имеет ограничение скорости для игрока. Если вы двигаетесь быстрее нормы (например, распрыжкой), игра пытается вас замедлить, прикладывая силу в противоположном направлении. Проблема в коде: если вы прыгаете спиной вперед, игра фиксирует превышение скорости, но ошибается в векторе "торможения". Вместо того чтобы замедлить вас, она прикладывает силу в ту же сторону, куда вы летите. В итоге, чем быстрее вы летите спиной, тем сильнее игра вас "пинает", разгоняя до космических скоростей. Это ошибка в одной формуле вектора, которая позволяет пролетать уровни за секунды.
## Trackmania: Wicked и Uber-bugs
Trackmania — гоночная игра с детерминированной физикой. Это значит, что одни и те же нажатия кнопок всегда приводят к одному и тому же результату. Это рай для TAS (Tool-Assisted Speedrun). Там есть баг, называемый "Uber-bug". Если машина ударяется о поверхность под очень специфическим углом и с определенной скоростью, физический движок неправильно рассчитывает отскок, придавая машине вертикальное ускорение вместо горизонтального торможения. Игроки используют это, чтобы буквально перепрыгивать стадионы. Для выполнения такого трюка нужно нажать тормоз на конкретном кадре (фрейм-перфект) с точностью до миллисекунды.
## GTA Vice City: Переполнение буфера реплеев
Это пример того, как игровая механика используется как эксплойт памяти. В игре есть функция "повтора" (Replay), которая записывает последние секунды геймплея. Спидраннеры выяснили, что если начать и отменить миссию определенным образом, а потом включить реплей, данные в буфере памяти смещаются. Игра начинает читать данные не там, где нужно. Это классическое переполнение буфера (Buffer Overflow). Это позволяет подменить значение переменной "Текущая миссия" на "Финальная миссия". Игрок просто садится в такси, нажимает кнопку реплея, игра "сходит с ума", читает мусор из памяти, интерпретирует его как команду запуска скрипта, и через секунду начинаются финальные титры. Это чистой воды хакинг, выполненный средствами самой игры.
# Excel как киберспорт
Ну и напоследок — забавный факт. Существует Financial Modeling World Cup. Да, люди соревнуются в Microsoft Excel. Это тоже своего рода спидран. Участникам дают задачу (например, смоделировать инвестиционный портфель или рассчитать логистику компании) и жесткий лимит времени. Побеждает тот, кто не просто решит задачу правильно, а кто сделает это быстрее всех. Зрелище специфическое: экраны мелькают, мышки почти не используются (только клавиатурные шорткаты), формулы на полстраницы пишутся за секунды. Это доказывает, что азарт оптимизации и скорости можно найти везде, даже в скучных таблицах.
В общем, игры для меня — это не просто эскапизм. Это бесконечный пазл. Будь то строительство процессора из красной пыли в Minecraft, оптимизация завода в Factorio или попытка понять, почему прыжок спиной в Half-Life ломает законы физики — всё это тренирует мозг видеть структуру за красивой картинкой. И это, пожалуй, самый полезный навык в мире IT.
# Полезные ссылки:
- -> Factorio — Официальный сайт игры
- -> Minecraft — Официальный сайт игры
- -> Wikipedia: CMS — О жанре симуляторов строительства и управления
- -> Factorio Wiki: Circuit Network — Документация по логической сети
- -> Minecraft Wiki: Redstone — Основы схемотехники из блоков
- -> Terraria Wiki: Hoik — Эксплойт движения для автоматизации
- -> Dwarf Fortress Wiki: Computing — Вычисления на жидкостях
- -> GitHub: DOOM — Оригинальный исходный код движка id Tech 1
- -> Know Your Meme: It Runs Doom — История запуска игры на всем подряд
- -> Ghidra — Фреймворк для реверс-инжиниринга от NSA
- -> x64dbg — Популярный отладчик для Windows
- -> Cheat Engine — Инструмент для сканирования памяти
- -> Speedrun.com — База мировых рекордов скоростного прохождения
- -> TASVideos — Ресурс о Tool-Assisted Speedruns (TAS)
- -> SourceRuns Wiki: ABH — Физика прыжков спиной в Half-Life 2
- -> Wikipedia: Arbitrary Code Execution (ACE) — Произвольное исполнение кода
# Похожие увлечения магистров прошлых лет:
© Кочетуров В.В., ДонНТУ 2025