![image](https://cdn.vox-cdn.com/thumbor/BzDxWFRVJvyAMFJBHd3ZxpOTA44=/0x0:1421x662/920x613/filters:focal(534x436:760x662):format(webp)/cdn.vox-cdn.com/uploads/chorus_image/image/66094188/Screen_Shot_2020_01_13_at_2.27.18_PM.0.png)
На прошлой неделе создатель Dicey Dungeons Терри Кавана отпраздновал десятую годовщину своей давней игры VVVVVV, by опубликовав её исходный код [перевод на Хабре]. Если объяснять просто, то это значит, что любой человек может теперь посмотреть, как создавалась игра, потому что каждую строку кода можно внимательно изучить.
Такое нечасто случается и поэтому ценность публикации этой информации очень велика. Люди могут учиться по ней или улучшать код. Некоторые отзывы на исходный код VVVVVV были ужасными — исследователи увидели вещи, которые можно было написать лучше. Возможно, Кавана предвидел это — в своём посте, где он объявил о публикации кода, Терри признаёт, что «технически игра VVVVVV не очень хорошо продумана! Даже по стандартам инди-разработчиков-самоучек, код довольно хаотичен».
Существует заблуждение, что написание кода само по себе является изящным и продуманным, ведь в конечном итоге, это своего рода написание логики, не так ли? Не зря ведь это называется компьютерными НАУКАМИ? Но в реальности всё гораздо сложнее. Очень часто истории разработки видеоигр показывают, что поскольку в играх есть так много элементов, от геймдизайна до звука, что часто собираются в единое целое только в последний момент, если вообще когда-нибудь собираются.
«Существует название для игр, в которых код едва связан, имеет глупую архитектуру, в которых ошибки почти невозможно исправить, а костыли громоздятся на велосипеды. Они называются „выпущенные игры“».
«Почти каждая игра, над которой я работал, выпускалась именно в тот момент, когда навоз и палки, удерживающие всё здание от разрушения, находились на грани катастрофы», — написал разработчик Джеймс Паттон в обсуждении кода игры в Twitter.
Почти каждый разработчик, с которым я общался, говорит то же самое.
«Игры — это не обычное ПО, а сложный механизм, для успешного издания которого требуется знание множества дисциплин, и часто для того, чтобы уложиться в срок, приходится идти на жертвы», — написал в письме разработчик игр Джеймс Симпсон. «Я знаю многих разработчиков, из кожи вон лезущих, чтобы сделать свой код идеальным. Этот пример открытого исходного кода показывает, что можно успешно выпустить игру, не достигая такого уровня совершенства».
В случае VVVVVV обширные дискусии вызвал отдельный фрагмент исходного кода, имеющий очень хаотичную структуру. По сути, он помогает определить, в каком состоянии находится игра: например, в катсцене или части диалога. В обычной ситуации многие из этих состояний группируются по отдельности — код мини-игр пишется отдельно от, допустим, механики прыжков — но не в случае этой игры. Например, в коде Кавана состояния игры, связанные с катсценами, разбросаны по разным частям программы и перемешаны с такими элементами, как игровые режимы и главное меню.
Сегодня видеоигра «VVVVVV» перешла в #OpenSource и кто-то обнаружил в коде конструкцию из нескольких сотен switch. #programming Это одновременно прекрасно и отвратительно.
Зак Гейдж, работавший над такими мобильными играми, как Pocket-Run Pool и Really Bad Chess, разобрал для нас эту печально известную конструкцию из switch, сказав, что «это прекрасный пример того, о чём Терри скорее всего не знал, когда начинал писать игру: сколько катсцен в ней будет, как будет работать главное меню, и сколько странных потенциальных конечных состояний странных режимов может возникнуть».
Если бы Кавана стремился сделать код безукоризненным, то он мог бы прекратить вносить такие изменения и лучше упорядочить код. Но вместо этого он решил двигаться дальше и сделать то, что получится, заставив одну гигантскую часть кода управлять сотнями различных вариантов.
«Вместо того, чтобы сделать шаг назад и упорядочить всё, Терри наверно подумал что-то типа „Да, я собираюсь просто добавлять состояния в огромный оператор switch каждый раз, когда мне понадобится что-то новое“. Это на 100% нормально и по сути необходимо для выпуска игры».
Гейджу очень близко известен такой образ мышления — он рассказал нам, что оглядываясь на разработку игры Ridiculous Fishing, «в буквальном смысле не понимает, как коду удаётся работать, ведь он так плохо написан». Даже другие члены команды не полностью понимают, как работает их игра.
Но знаете что? Ridiculous Fishing всё равно получила несколько наград и заработала на несколько месяцев почти миллион долларов. Очевидно, что разработчики должны устранять ломающие игру баги и всё, что может встать на пути игрока к наслаждению игрой, но, как говорится, лучшее — враг хорошего.
«Всегда будут появляться незапланированные части, и если вернутся назад для упорядочивания кода, то это означает, что ты потеряешь время, которое можно потратить на написание нового кода, добавление новых функций или рисование арта», — говорит Гейдж.
Но несмотря на весь снобизм, вызванный в социальных сетях игрой VVVVVV, Кавана, похоже, не теряет чувства юмора и шутит над всем этим.
Каждый увиденный мной скриншот ужасных недостатков в исходном коде VVVVVV лишь делает меня сильнее.
«Не знаю, что мне сказать по этому поводу?», — написал он в посте о публикации исходного кода. «Я был молод, и мне было интереснее создать что-нибудь на экране, чем реализовать это правильно. Вероятно, самое лучшее в исходном коде VVVVVV — он стал доказательством того, что можно слепить что-нибудь самостоятельно, даже если вы не очень хороший программист».
О том, как разработчики игр решают проблемы при помощи быстрых хаков, можно прочитать в серии переводов «Грязные трюки в коде видеоигр»:
Грязные трюки в коде игр
Разработчики о самых грязных программных трюках в играх
Грязные трюки и оперативка
Грязные трюки разработчиков видеоигр