Pure It!

Как-то в своём профиле в Instagram я рассказывал тебе о модификации, которую разрабатываю для компьютерной игры Factorio. Той, которая позволяет сделать игровой мир чуть лучше путём очистки воздуха. Осенью я наконец-то взял себя в руки и довёл этот мод до стадии альфа-тестирования, так что теперь он доступен для скачивания на официальном портале игры.

Bery0za's Pure It rendered machines
Рендер всех механизмов, которые мне довелось смоделировать для дополнения. Без текстур смотрится даже лучше

В процессе я неплохо поднял уровень своих навыков в Cinema 4D, в которую, кстати, влюбился (за исключением карт развёртки). Припомнил невероятно обаятельный язык Lua. С любовью и ненавистью покопался в чужом коде и документации (весьма туманной местами). А также написал пару удобных утилит, которые позволили упростить работу со спрайтами. Но давай обо всём по порядку.

Идея пришла ко мне после многочасовых игровых сессий с @softkitty___warmkitty, в ходе которых нам периодически приходилось устраивать рейды на местную фауну и её гнездилища. Весьма агрессивную, надо сказать. Но её можно понять: сидишь себе спокойно, растишь кровожадных ядовитых деток, а тут налетает туча сернистых облаков и портит всю малину (или что у них там на завтрак?). Естественно, надо этих владельцев заводов (газет, пароходов) покусать. А заодно погромить эти самые заводы. Что, в свою очередь, не могло понравиться нам, строителям светлого будущего. Вот я и решил сделать игровой мир ещё чуть светлее. В прямом смысле. Убрать те самые облака с тяжёлыми металлами и прочей химией и обрести, наконец, вселенскую гармонию.

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

Схема фильтрации
Одна из технологических ветвей процесса улавливания и фильтрации – абсорбционная

После этого процесс разделился на две основных ветви: собственно программирование механизмов и создание их прототипов (описание и графика). Если в части первого разработчики предоставили весьма исчерпывающую документацию (к тому же мне пригодился код из других пользовательских модов), то в плане прототипов официальный портал игры весьма немногословен. Да, он описывает всё. Но без каких бы то ни было деталей и примеров. Так что в этом вопросе я бы сразу порекомендовал смотреть на моды других игроков, благо там даже ничего декомпилировать не надо.

По кодингу сложностей у меня не возникло. Разве что пришлось немного поразбираться в игровых событиях, сохранении/загрузке и мультиплеерной совместимости. В этом плане все проблемы возникали только в тех местах, где я неправильно или не в тот момент обращался к глобальной игровой таблице. В остальном могу сказать, что авторы предоставили весьма исчерпывающий функционал, который позволяет добавлять в игру практически любые механики. Если вы не пользуетесь каким-нибудь сторонним инструментом для отладки (я находил плагины для Visual Studio Code), то game.print() станет одним из ваших любимых методов.

Bery0za's Pure It absorption workflow
Та же самая схема, но теперь уже реализованная в игре

С графикой мне предстояло решить куда больше вопросов: создание 3D моделей, конвертирование их в игровые спрайты (двумерные внутриигровые изображения, представляют собой один или несколько кадров анимации), создание описаний того, как эти спрайты должны отображаться. Могу сказать, что на это ушло процентов 80 всего времени, которое я потратил на мод. По ходу я создал предустановленню сцену для Cinema 4D, которая имитирует игровое освещение и атмосферу и позволяет сосредоточиться на создании модели, а также упрощает последующий экспорт в 2D изображения. После чего они подхватываются моей же утилитой, комбинирующей их вместе и выдающей в результате упакованные и готовые к использованию атласы.

Cinema 4D Factorio scene setup
Предустановленная сцена для трёхмерного моделирования

В моделировании мне помогли не столько видео-инструкции от зарубежных мододелов, сколько уроки по Cinema 4D, ведь каждый из них рисовал графику и организовывал экспорт по-своему. Так что я рекомендую вам сначала разобраться в деталях программы, это позволит организовать свой собственный рабочий процесс. О своём я, пожалуй, напишу отдельную статью.

Описание рецептов, самих сущностей и их графического представления – рутинная задача. Большую часть времени я просто копировал существующие описания, внося в них небольшие изменения, главное, нужно быть максимально внимательным при указании величин и ссылок. Сейчас я уже и не припомню, сколько раз во время загрузки игра показывала мне кукиш и говорила, что такая-то картинка не найдена или такой-то размер не соответствует реальности. Думаю, этот этап я тоже автоматизирую и напишу ещё одну утилиту. После чего можно будет говорить о готовом полноценном рабочем процессе, знай только придумывай механики и рисуй сущности.

Пока что для меня осталось не до конца понятным, каким образом в игре отображаются трубы и применяется окрашивание (tint), но, надеюсь, в сообществе мне помогут с этим вопросом. Кстати, если вы знакомы с английским, форум – отличное место для решения возникающих задач.

Bery0za's Pure It machines
Все механизмы с первой картинки так, как они выглядят в игре

Ух, как много получилось. А ведь это я буквально пробежал по верхам, описав в двух словах весь свой путь от идеи до рабочей альфа-версии. Понимаю, пост получился весьма техническим, такова уж природа моей деятельности. Но, возможно, кого-то он вдохновит поиграть в Factorio, а кого-то – придумать и реализовать свою собственную модификацию. Потому что для себя я усвоил главное – если ты можешь поставить себе задачу, то ты можешь и решить её. Чуть не забыл, а вот и сама ссылка для загрузки: играйте, наслаждайтесь и делайте мир лучше.

Mazeraptor

Вы любили в детстве разгадывать лабиринты? Искать выход из сложных переплетений, напечатанных в журналах с головоломками? Может быть, вы помните легенду о нити Ариадны или игру с пространством в фильме «Начало»? У всех этих лабиринтов был один минус. После того, как путь найден, уже не составляло труда пройти по нему снова.

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

Для этих целей я написал собственную программную библиотеку Mazeraptor. По-русски это слово звучало бы как-то навроде «Лабиринторатопс». Знаю, выглядит ужасно, а произнесение вслух может разбудить каких-нибудь древних богов, поэтому оставлю его, как есть, в своём изначальном варианте.

Что же нужно для создания лабиринта? Нужна некая структура, которая будет описывать положение его «комнат» относительно друг друга. Это может быть просто прямоугольная сетка с клетками, как в тетради, где каждая клетка исполняет роль такой комнаты. А может быть и множество колец друг в друге, разделённых на ячейки. Здесь всё ограничено только вашей фантазией. Главное, чтобы вы смогли объяснить логику своей структуры на понятном языке.

Как видите, моя библиотека умеет выдумывать и по-ньюйоркски прямоугольные лабиринты, и по-московски кольцевые. Скажу больше, в ней ещё реализована возможность создавать лабиринты в виде пчелиных сот или треугольной плитки. А на десерт – структуры из своих собственных изображений. Как, например, эта.

Логотип приложения, созданный в самом приложении

(Не)удивительно, но помимо формы и структуры лабиринтов теоретики также выдумали немало способов непосредственно его создания. Ведь мало организовать отдельные ячейки в структуру, нужно рассказать им, из какой в какую существует проход, а какие закрыты друг от друга глухой стеной. Все вышеприведённые примеры были созданы с помощью алгоритма обратного прохода. Но есть и другие. Например, алгоритм растущего дерева или алгоритм Prim.

Понимаю, в целом всё выгядит одинаково запутанно. Поэтому я добавил цветовую индикацию того, в каком порядке обрабатываются ячейки. От тёмных к светлым. Видите разницу? На картинке справа прослеживается характерная черта Prim – множество коротких тупиковых ответвлений. Можете вернуться к первым двум картинкам и взглянуть на ход работы алгоритма обратного прохода (его характерная особенность – длинные закрученные ходы).

Не составляет также труда для моей программы найти путь из ячейки А в ячейку Б. Причём начальную и конечную точку вы можете указать абсолютно любую. А для поиска использовать различные алгоритмы, в том числе и A Star. Надо сказать, что в среде компьютерных игр это, пожалуй, один из самых распространённых способов поиска пути. Играете ли вы в стратегии или шутеры, будьте уверены, где-то там под корпусом вашего ПК или консоли маленькие единицы и нули скачут под его управлением. Уже не удивлю вас, сказав, что придумано и множество других алгоритмов, решающих ту же задачу. Всем заинтересованным могу намекнуть, что смотреть стоит в сторону теории графов, о которой я вам как-нибудь обязательно расскажу.

Если же вы в целом интересуетесь темой создания лабиринтов, обратите внимание на книгу Jamis Buck «Mazes for Programmers», которая невероятно помогла мне в работе. На этом, пожалуй, достаточно слов. Оставляю ссылку на архив со своим генератором здесь. А также ссылку на github для тех, кому нужен функционал библиотеки. Играйтесь, ищите, создавайте и не забывайте делиться со мной своими впечатлениями.

(Компьютерные) игры

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

В 4 года эта книга была для меня отдельным учебником наравне с Букварём.

Затем в юности я неплохо поизвращался, создавая игры в PowerPoint. Серьёзно, приложение для презентаций можно неплохо использовать для игр в духе «Поиск предмета» или «Квест». Конечно, приходилось для каждого крупного ответвления создавать свою отдельную очерёдность слайдов, поэтому свобода действий там была сильно ограничена. Но весь прикол был именно в подаче и немного наркоманской атмосфере этих проектов. Одно только название «Миссия Режиссёра» уже интригует, не правда ли? Мы с друзьями даже целую серию запустили. Точно помню, что у нас там была ещё миссия продюсера и миссия репера (именно через «е»).

Потом у меня был долгий период, когда я забыл об этом своём увлечении, лишь изредка отмечая где-то в черновиках новые идеи относительно выдуманных миров и игровых механик. К счастью, некоторое время назад я, что называется, «вернулся к себе» и взялся за разработку компьютерных игр уже по уму. Знакомясь с программированием, с игровыми движками, с общими концепциями. Могу сказать, что сподвигли меня на этот шаг не только накопившиеся задумки, но и те игры, в которые я сам периодически играл. Во главе стоял, конечно же, Minecraft с его простейшей изначальной идеей «всё есть блок размером 1х1 м», но безграничными возможностями в рамках этой парадигмы. Я знаю, что он был далеко не первый на своём поприще, но концепция блочного, модульного, изменяемого мира получила, в нём, пожалуй, самый главный толчок, после чего пошло-поехало. Думаю, что помимо меня ещё множество людей могут назвать его вдохновителем на занятия разработкой.

Реальное программирование началось для меня с мода ComputerCraft, а не с Turbo Pascal в школе или универе.

Этим летом я столкнулся с утверждением о том, что игра как явление несёт смысл только в детстве. И оно кажется мне сомнительным. Точнее, неполным. Да, как механизм познания мира она, может быть, и полезна только в детстве. Но игра не ограничивается только этой функцией.

Как сказал один из самых известных гейм-дизайнеров Сид Мейер (вы наверняка слышали о серии Civilization, идейным вдохновителем которой он является): «Игры – это последовательность интересных решений». Конечно, это выражение вряд ли применимо к спортивным состязаниям, аркадам, да и вообще к активностям, в которых планирование и поиск стратегии не являются чем-то основополагающим. Но, в целом, мы возвращаемся в игровые миры, потому что там нам действительно интересно. Точно так же, как кто-то иногда забывает о реальности, погружаясь в кино, в книги, в театр, мы находим свои отражения, альтернативные ипостаси в играх. И в этом плане они совершенно точно являются самостоятельным видом искусства. Далеко не новым, кстати. Со своей философией и историей, своим чувственным пластом, своим посылом. Отсюда и увлечённость ими людьми любых возрастов.

Компьютерные игры – это сплав математики, технологий и всех видов искусства. Кто ещё может похвастаться такой смесью?

Я уверен, что игры обогащают нас, позволяют открывать новые грани в себе, а значит и в окружающем мире. Поэтому я желаю всем хотя бы иногда впускать их в свою жизнь. И она станет легче и насыщенней. Хотя бы на чуть-чуть.

Post Zero

Spyglass

Друзья. После некоторых раздумий я всё же решил начать рассказывать вам о том, чем я занимаюсь в свободное время. Потому что, как мне кажется, компьютеры, программирование, разработка и игры в общем смысле – это удивительные вещи. Там, где математика и логика встречаются с красотой и творчеством, а простор для тематики не ограничен ничем, ведь IT-технологии проникли практически в каждую сферу нашей жизни.

Ставите ли вы будильник, чтобы проснуться утром на работу, балуетесь с масками в Instagram или чертите невероятные конструкции в AutoCAD – за всем этим стоит разум человека и его мечты, полёт фантазии. И я хочу передать вам то воодушевление, которое я ощущаю, когда задумываюсь обо всех тех открытиях, которые сделало человечество.

Наверное, некоторые мои посты будут наполнены техническими деталями. Об этом я буду предупреждать заранее. Но, в целом, мне бы хотелось писать вам о своих разработках в духе «Популярной механики». Ведь, объясняя что-то другому человеку простыми словами, мы сами лучше понимаем структуру раскрываемой темы. Я вас уверяю, программирование – это не столько умение писать код на каком-либо языке (язык – всего лишь инструмент), сколько способность подмечать очевидные и неочевидные связи между вещами, стремление всегда познавать что-то новое и разбираться в тонкостях того или иного предмета. Именно поэтому я уверен, что вам будет интересен мой блог, ведь мне всегда есть, что рассказать о своих изысканиях.

Буду рад видеть вас на своей странице снова. В добрый путь!