Factorio обзор игры

Обновлено: 04.07.2024

В последнее время много копий сломано вокруг технических собеседований. Очевидно, что инвертирование двоичного дерева на доске практически никак не связано с практическими навыками реального программиста. Примитивный Fizzbuzz по-прежнему остаётся самым эффективным тестом. Как следствие, выросло внимание к опенсорсным проектам, но оказалось, что это тоже не очень хороший показатель, потому что у большинства профессионалов нет на них времени.

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

Factorio — это игра об автоматизации. Вероятно, лучшим введением будет этот трейлер, но, по сути, ваша задача — построить автоматизированный завод, способный запустить ракету в космос.

Начинаете с нуля. Добываете вручную железную руду и камень, строите плавильную печь, чтобы плавить руду в железные пластины, из которых можно скрафтить автоматический твёрдотопливный бур. Можно самостоятельно забирать железную руду из бура и закладывать её в плавильню, но более эффективно использовать автоматический конвейер. Потом можно использовать полученное железо, чтобы сделать другой бур, который автоматизирует добычу угля. Затем строится конвейер для забора угля и конвейер для его передачи в бур. Эта крошечная фабрика производит железные пластины, из которых можно сделать третий бур — и начать добычу медной руды, которая позволяет крафтить медные плиты, а из них можно сделать медный провод, необходимый для работы погружного насоса. В сочетании с паровым котлом и паровым двигателем это даёт нам первую электроэнергию. Её можно использовать для исследовательского центра и изобретения новых технологий, таких как сборочный автомат. Как только разблокируете сборочные автоматы, можете использовать сделанный вручную провод для создания сборочной машины, которая будет автоматически изготавливать эти провода.

Игра начинается без установленной цели и почти без направления. Ведущий программист должен быть способен изучить UI и определить цель, а затем разработать план для её достижения. От джуниора ожидают правильного выполнения задач, поставленных ведущим разработчиком. Предполагается, что стажёр работает с наставником, но джуниор должен быть в состоянии самостоятельно устранить основные проблемы со своим кодом, прежде чем просить помощи от старшего. Миддл должен уметь работать независимо, как только ему дают задание, но от него не ожидают архитектурного проектирования.

Конкретные ожидания можно сформулировать так:

Важнейшим аспектом разработки программного обеспечения является умение работать в команде. Это означает координацию усилий с другими людьми, удовлетворение потребностей чужих проектов и сотрудничество с командой, а не самостоятельную работу, когда вы отказываетесь изменить свой дизайн, чтобы помочь интегрировать его с чьей-то работой. Естественно, такие ситуации всё время возникают в Factorio, потому что стандартные чертежи ограничены физическим пространством. В результате нужно тщательно изучить действия других людей, а иногда скорректировать свой дизайн, чтобы вписаться в ограничения по размеру или приспособиться к какому-то чужому чертежу, который занял больше места, чем ожидалось.

Если игрок уйдёт в себя, начнёт делать всё сам или молча исправлять проблемы, это быстро навлечёт на него гнев команды по тем же самым причинам, по которым коллеги злятся на программистов-ковбоев. К счастью, в Factorio есть встроенный эквивалент git blame : он показывает последнего игрока, который изменил любую сущность. Таким образом, если кто-то поставил костыль и не сообщил команде о проблеме, то когда этот костыль наконец сломается — все узнают, кто виноват. Если хотите выиграть, придётся плотно сотрудничать с товарищами по команде.

Одним из главных навыков для программиста является отладка. Это, пожалуй, самая очевидная параллель между Factorio и реальной разработкой ПО. Что-то может сломаться очень далеко от фактического источника проблемы. Способность быстро выяснить реальную проблему — это критический навык, и процесс мышления почти идентичен отслеживанию причины сбоя в реальной программе. Если перестал работать сборочный автомат, сначала нужно проверить выходящие потоки. Потом проверить, какого ингредиента не хватает на входе. Затем проследить ингредиент по фабрике, чтобы узнать, где он производится. И повторять процесс снова и снова, до тошноты.

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

Бывали случаи, когда весь завод останавливался, потому что вы начали исследовать что-то, не требующее жёлтой науки. В результате вы перестали использовать каркасы дронов, которым перестали поставляться электрические двигатели, где использовалась смазочная жидкость, для производства которой забирался мазут. В итоге стопорилась выходящая труба на нефтеперерабатывающем заводе, из-за чего у вас заканчивался попутный нефтяной газ (petrolium), что останавливало производство пластмассы. Как результат, прекращался выпуск сигнального красного провода — и вся фабрика выходила из строя. Опытные игроки предвидят подобные сценарии и внедряют самобалансирующийся крекинг нефти, чтобы всегда гарантировать баланс системы. Такой завод остановится только при закупорке выходящей трубы с попутным газом. Если хорошему программисту дадут сломавшийся нефтеперерабатывающий завод, он обычно сможет проследить проблему до источника, понять, что произошло, и быстро попытаться найти решение. С другой стороны, если человек просто плюхает на землю пару новых резервуаров без веской причины (он абсолютно уверен, что смазочная жидкость будет нужна всегда), то это большой красный флаг на методы решения проблем в его программах.

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

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

Отказ следовать советам — лишь часть гораздо большей проблемы, когда программист не способен нормально интегрироваться в существующую структуру. Есть много способов построить фабрику в Factorio, и каждый требует стандартных методов сборки. Несоблюдение стандартов быстро затормозит всю фабрику, часто тонкими способами, которые не очевидны неосторожному разработчику.

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


Логистическая сеть

Есть разные способы построения логистических сетей. Самый простой — с сундуками пассивного снабжения. Но есть другой метод — сундуки хранения с фильтром, который решает проблему с мусором. Оба метода требуют правильной установки ограничителей в нужных местах. Сундуки пассивного снабжения обычно ограничены пространством сундука. К сундукам хранения нужно поставить манипулятор для подключения сундука к логистической сети. И обеспечить не менее N предметов перед установкой манипулятора. Если забыть про эти шаги, то будут впустую потрачены огромные ресурсы. Если программист постоянно забывает про ограничители на выходах — это красный флаг, что человек небрежно относится к производительности в реальных приложениях.

В других случаях команда может применять заранее разработанные чертежи, такие как проект ядерного реактора или роботизированного завода на дронах (bot factory). Они могут быть крайне сложными, но если сделать над собой усилие и разобраться, то они чрезвычайно экономят время. Остерегайтесь кандидатов, которые не хотят настраивать на заводе новый элемент просто потому, что не могут отследить сложную управляющую логику. Или кто бросает попытки разобраться в алгоритме функционирования такого завода, несмотря на очевидные преимущества дронов перед конвейерами.



Неоптимальный дизайн завода на дронах, источник

Поезда в Factorio — прямой аналог многопоточности: один поезд — это один поток выполнения, а каждое пересечение поездов или остановка — место в памяти, куда два потока потенциально могут писать одновременно. Светофоры — это блокировки (или мьютексы). Все баги в железнодорожной сети проявляются точно так же, как состояние гонки в ПО, потому что они буквально являются физическим состоянием гонки. Все компромиссы применимы и здесь — слишком длительная блокировка уменьшает пропускную способность. Неправильное проектирование светофоров обычно вызывает взаимоблокировку, точно так же, как в программном обеспечении, потому что в итоге возникает циклическая зависимость блокировок. Самая распространённая взаимоблокировка — это когда поезд слишком длинный и неожиданно блокирует второй перекрёсток, ожидая входа в первый. Затем этот второй перекрёсток препятствует отправлению другого поезда, предотвращая разблокировку первого перекрёстка.

Количество путей в железнодорожной сети соответствует количеству ядер CPU. Один железнодорожный путь трудно масштабировать больше, чем на несколько полос, потому что пропускная способность всей системы очень быстро ограничивается, даже с зонами ожидания. Наиболее распространённой конструкцией является двухполосная конструкция, по одной полосе в каждую сторону. Здесь появятся проблемы с пропускной способностью, когда возникнет необходимость постоянно разгружать поезда. Поэтому в больших железнодорожных сетях минимум по четыре полосы, причём две внешние действуют как объездные пути, чтобы избежать пересечений, когда это возможно.

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

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

Управление логистической сетью само по себе становится логистической задачей в конце игры из-за того количества проблем, какое вызывают экспансивные дрон-сети. Как правило, нужно приступить к сегментированию логистической сети и либо использовать поезда для транспортировки товаров между сегментами, либо строить сундуки запроса и снабжения, которые будут передавать товары через границы.

В конце игре для управления поездами требует перехода с push-архитектуры на pull-архитектуру, поскольку push-архитектура не справляется с высокой пропускной способностью. Это неизбежно приводит к использованию функции Train Limit и изучению, как использовать логические сети для кодирования базовой логики, чтобы станция запрашивала поезд только тогда, когда действительно готова полностью заполнить его ресурсами, вместо обычной игровой тактики в начале игры, когда куче поездов просто даётся команда ехать за железом. Новая схема сводит к минимуму количество поездов и при этом гарантирует, что в сети обслуживаются все станции.

Часто бывает, что ограничения входных линий в сборочный автомат и лимиты скорости манипулятора требуют перепроектирования заводов вокруг, точно так же, как высокоскоростные вычисления требуют знания узких мест в работе CPU. Эти узкие места почти никогда не являются проблемой, пока вы не достигнете определённого масштаба, но после этого начинают ограничивать производительность.

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

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

Такие мегабазы представляют верхний уровень дефолтного сервера Factorio. Конечно, существует много модов, которые гораздо усложняют игру.

Space Exploration — полностью переделанная версия Factorio для колонизации космоса. Здесь планеты становятся ограниченными ресурсами, требуя от игроков колонизировать другие миры и использовать ракеты для передачи ресурсов между планетами. Из-за огромной задержки с доставкой материалов между планетами, координация этих баз приводит к возникновению проблем, сходных с глобально распределённой системой баз данных. Даже в логической сети приходится бороться с задержкой, потому что автоматическая система теряет из виду элементы, которые запущены, но ещё не достигли целевой планеты. Если это не учитывать, возникают дубликаты запросов для всех нужных элементов. С точно такой же проблемой сталкиваются распределённые системы при попытке обеспечить согласованность между узлами.

В целом софтверная индустрия не имеет ни малейшего представления, как находить и нанимать лучших разработчиков. Наверное, совместная игра в Factorio стала лучшим техническим собеседованием, которые мы когда-либо проводили. И это нас сильно смущает. Такое собеседование дико непрактично, занимает более 20 часов в мультиплеере с первого раза или 8 часов для команды опытных игроков. Что из этого можно извлечь? Не знаю. Мы, конечно, не можем перейти на Factorio в качестве метода собеседований — с таким же успехом можно просто дать кандидату домашнее задание.

Всем привет. Сегодня я расскажу вам об tower-defence песочнице — Factorio Mindustry.

Общая информация

  • Название - Mindustry.
  • Жанр - tower-defence, песочница.
  • Платформы - Windows, Linux, MacOS, Android, IOS.
  • Ссылка на страницу в Steam.
  • Ссылка на страницу в itch(бесплатно).

Геймплей

Игра представляет из себя (почти) tower-defence — вы строите защитные сооружения, чтобы защититься от волн.Игровая карта состоит из клеток. На клетках может находится блок (неразрушимое препятствие), булыжник, спора, месторождение. Сами клетки бывают нескольких типов — песок, споровый покров, мелководье, глубокая вода и прочие.

Вы управляете мехом. Если ваш мех уничтожат, то ваш мех через какое-то время окажется на реконструкторе. Есть разные типы мехов: тяжёлые, лёгкие, поддержка.

Для постройки вам необходимы ресурсы. Их можно получить двумя способами — добыча (вручную, с помощью дронов, буров, насосов) и создание из других ресурсов с помощью специальных сооружений.

Транспортировка ресурсов осуществляется с помощью транспортных строений — конвееров, перекрёстков, мостов, катапульт и прочего. В условиях ограниченного пространства приходится максимально оптимизировать транспортные цепочки с помощью средств, данных игрой.

Для защиты от волн используются разноообразные турели и дроны специальные постройки. Начнём с турелей. Турелям для работы нужны ресурсы. Турели можно разделить на:

  • Огнеметные — требуют горючие ресурсы (уголь, пиротит).
  • Электрические — требуют электроэнергию.
  • Жидкостные — стреляют жидкостями, несущие разный эффект (вода — тушит ближайшие горящие постройки, шлак — поджигает противников, разливает горящие лужи, криогенная жидкость — замедляет врагов).
  • Стандарные. — стреляют твердыми ресурсами: медью, свинцом, кремнием и т.д.

Примечание — некоторые постройки могут принимать воду и криогенную жидкость для охлаждения и увеличения эффективности.

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

Для работы некоторых зданий(заводов, защитных проекторов и пр.) требуется энергия. Есть разные способы выроботки ее, со своими приемуществами и недостатками.

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

Воздушные же свободно летают над всеми препятствиями. Их задача — уничтожение источников энергии. Поэтому ваше поле из аккумуляторов — их цель №1.

Я в кампании дошёл до 40 волны. Мне всё ещё не хватало ресурсов, поэтому я решил дождаться 50. Но на 40 волне появился летающий босс, стреляющий ракетами. Тут я подумал, что мне конец, ибо противовоздушных турелей у меня почти небыло. Но босс налетел на моё скопление аккумуляторов. Они были полностью заполнены, поэтому при уничтожении рванули и задели ближайшие. К счастью цепной реакции не последовало. Но мне повезло, ведь именно там стояла моя противовоздушная турель, стреляющая расплавленным металлоломом. Она кое-как справилась, но тут я заметил, что трубы, подающие расплав были сломаны, и выливающееся содержимое поджигает ближайщие трубы. Пришлось сносить всю конструкцию :b

И вот — у вас есть множество средств для достяжения сдерживания волн врагов. Вы можете построить всё что-угодно и как угодно. И тут задаёшься вопросом: «А в чём смысл если даже я и могу сделать иначе, а разницы или нет, или она есть и сущетвенна, поэтому вам придётся использовать одну страту каждый раз?» А я отвечу: «несовсем». Настало время погрузится в тонкости игровых режимов.

Игровые режимы

Капмания

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

Пользовательская игра

Включает в себя 4 режима:

  • Волны — вы появляетесь на выбранной вами карте. Ресурсы располагаются случайным образом, карты не похожи друг на друга, благодаря чему каждый раз вы будете попадать в совершенно разные ситуации. Вам доступны все строения.
  • Песочница — Волны вызываются игроком. Не требуются ресурсы для постройки. Есть бесконечные источники предметов и энергии.
  • Атака — ваша цель — уничтожить ядро противника (КИ). Нет волн.
  • PVP — та же Атака, только против игроков.

У игры имеется мультиплеер.

По графике лишний раз распинатся не буду, просто посмотрите gif-ки в спойлерах. В звуковое сопровождение хорошее. Каждый завод по своему шумит, турель стреляет и т.п. Переодически на фоне играет музыка. Она, конечно, не очень выразительная, но в некоторых ситуациях поддерживает атмосферу происходящего.

Личное мнение

Игра мне очень понравилась. Всю игру можно назвать хорошо продуманной. Конечно, она понравится не всем. Но если вам зашла Factorio или Satisfactory, то я настоятельно рекомендую вам ознакомится с ней.

Спасибо за внимание! Если у вас есть вопросы, можете задать их в комментариях.

Эта игра — очередная очень интересная с точки зрения механики бета, представляющая заодно своеобразный язык программирования.


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

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

Первая задача — используя технологии бронзового века, получить прединдустриальные, а затем собрать жестяной радар, чтобы найти основную часть корабля. Затем — добраться туда на каком-то транспортном средстве. Там забрать ядро компьютера и получить доступ ко всем данным по тому, как правильно делать ракеты, бронебойные патроны, скафандры и прочую мелочь, важную для выживания.

Самое первое, что до безумия удивляет — это то, что это стратегия, где главный герой играет за скролл. Серьёзно, ваш персонаж по центру экрана — это всегда фокус ввода, внимания и интереса. Вместо того, чтобы обезличивать игру, вы получаете сборочный цех с инвентарём на ножках. Инженер! Как быстро выясняется, ещё наш инженер умеет стрелять. Получается некий гибрид Crimson Land (10%) и симулятора реконструкции отечественного автопрома (90%).

Итак, суть. Есть базовые ресурсы — уголь, камень, медь, железо, вода (позже добавляется знание о нефти и солнечной энергии). Задача — собрать ракету. Используя только свои руки в момент начала. В отличие от обычных craft&explore игр (лучший пример из относительно свежего — Radiation Island для планшетов), здесь основной интерес смещён на конвейерное производство и автоматизацию всего того, до чего не может дотянуться ваш персонаж руками.

А ресурсов надо столько, что руками он просто не сможет всё сделать. Даже чтобы приготовить обычную стальную балку, нужно очень сильно попотеть — открыть принципы переработки стали, организовать переплавку металла, собрать печь, обеспечить подвоз топлива (то есть раскопать угольное месторождение) и так далее.

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

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

Дерево науки огромное:



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


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

Конечно, при legacy-driven-проектировании ситуация может немного усложниться:


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


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


А вот прямо этюд из последних уровней Кримсона:


Планета выглядит примерно так:


Красное по центру — это ваша база, загрязняющая природу. Красные скопления по краям — это гнёзда «зергов», их надо время от времени пропалывать, если зерги лезут к базе. С краю пустыни сверху видно добывающий аванпост с нефтью. Вообще, распределённая база и коммуникации — это одна из важных граней игры. Например, можно играть в Transport Tycoon:


Или строить сеть на летающих дронах:


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


Как только вы с этим освоитесь, начинается самая странная часть игры. А именно — автоматизация автоматизации или рефакторинг. Оказывается, дикое удовольствие может доставлять не только кайфно шипящий тормозами поезд «Hello, world!», не только уничтоженное гнездо кусак, но и то, как вы переделаете все процессы, чтобы они шли без вашего участия.

Вообще, тут надо чуть отвлечься и сказать про то, как распределён даунтайм игры:


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

Итог игры — вылетающая ракета. Но настоящая радость — в песочнице, которая позволяет творить любую фигню, например, музыкальные шкатулки. Вот тут парень упоролся и «написал» программируемые динамики на основе комбинаторов логической сети производства:

UPD: А graninas собрал вообще свой процессор.

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

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

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

В общем, ещё один интересный учебный курс. Который вместо традиционного обучения. Хотя бы по схемотехнике, потому что вся карта — эта плата, и вы делаете на ней трассировку своими зданиями и чертежами их совокупностей вроде «блок производства красных микросхем».

Пользователь Twitter ArrowGMaximus разработал систему под названием Facto-RayO — движок рейкастинга, работающий в ванильной версии Factorio. Управлять игрой можно, нажимая с зажатым Ctrl на сундуки по краям экрана и доставая из них предметы. Движок не позволяет поднимать и опускать взгляд, и очень похож этим на первые 3D-игры наподобие Wolfenstein 3D. Игру типа Doom на этом движке воссоздать невозможно из-за того, что все объекты должны иметь одинаковую высоту.



Несмотря на ограничения движка, он имеет множество функций. Например, можно менять горизонтальный угол обзора (FOV), вплоть до 360° (разумеется, изображение при таком FOV будет сильно искажённым).


Более того, можно менять направление каждого отдельного луча. Эту функцию можно, например, использовать для добавления слепого пятна в центре экрана:


Можно сделать одну сторону экрана зеркальным отображением другой:


Или превратить экран в своеобразный калейдоскоп:


Движок способен распознавать коллизии: игрок не может проходить сквозь стены. Объекты, которые рендерятся движком, не обязаны быть статичными, они могут поворачиваться, перемещаться и растягиваться. Их можно комбинировать с системой распознавания коллизий. Даже движущиеся объекты, например, куб-компаньон, могут быть твёрдыми.


Игры от первого лица — это в первую очередь шутеры, поэтому автор движка добавил кнопку стрельбы и… многопользовательский режим. На карте уровня присутствуют два игрока, изначально находящихся на разных сторонах симметричной карты. Второй игрок тоже имеет распознавание коллизий и может стрелять.


На карте Factorio движок состоит из нескольких компонентов. Во-первых, это экран, который ArrowGMaximus изготовил на основе архитектуры, придуманной DaveMcW. Разрешение было снижено до 107x80 пикселей минус несколько «битых» пикселей, занятых подстанциями. Это было сделано для снижения лага (маленькое изображение генерировать проще). Каждый пиксель экрана может иметь один из восьми цветов.

Кнопки — это квадраты сундуков запроса. Комбинаторы определяют, когда из них достают предметы, а боты кладут их обратно.

Генерация энергии выполняется ядерными реакторами.


Далее идёт логика, определяющая победителя игры и выполняющая её сброс:


Рядом находится логика, используемая для анимирования куба-компаньона и дверей:


Весь проект состоит примерно из 300 тысяч деталей, если считать только лампы и комбинаторы. Карта настолько велика, что на скриншоте сгенерировался не весь рельеф. Справа видна логика первого игрока, слева — логика второго.


У каждого игрока есть 107 блоков рейкастинга. Благодаря этому все необходимые для кадра лучи можно вычислять параллельно.

Сразу под блоками рейкастинга расположена основная часть логики распознавания коллизий.

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


Теперь рассмотрим сам движок рейкастинга. Для начала нужно объяснить, как работает сам рейкастинг. Смысл рейкастинга заключается в испускании лучей из камеры и рендеринге на экране всего того, с чем они столкнутся.

Так как разрешение экрана по горизонтали составляет 107 пикселей, нам нужно 107 лучей. Каждый из них направлен под немного отличающимся углом. Чтобы реализовать это, нам для начала необходимо некое описание мира. Мир состоит из набора прямоугольников.

Каждый из этих прямоугольников можно задать пятью числами. Четыре числа — это координаты x и y его конечных точек, а пятое число обозначает текстуру, которую нужно отображать на прямоугольнике. Далее нам нужно перемещать весь мир таким образом, чтобы игрок оказывался в координате 0, 0. На изображении показана логика, запоминающая позицию игрока, и логика, перемещающую мир, пока игрок не достигнет координаты 0, 0. Справа мы видим генератор тактовой частоты. Он синхронизирует различные части системы, генерируя импульс через каждые 45 тактов игры. Движок тоже генерирует изображение каждые 45 тактов игры.



Затем нам нужно повернуть мир, чтобы луч (или линия видимости) соответствовала оси x. Это сильно упрощает наш мир. Так как ось x соответствует лучу, можно устранить все прямоугольники, не пересекающиеся с лучом. Все прямоугольники, обе конечные точки которых находятся выше или ниже оси x никогда не столкнутся с лучом, то есть они находятся вне лини видимости луча.

На карте Factorio есть логика, поворачивающая мир, и логика, упрощающая мир. Также там есть пятое число, описывающее каждый четырёхугольник.





Для следующего шага нам необходимо найти два свойства прямоугольников. Первое — это расстояние до игрока. Это необходимо для того, чтобы понять, какой из прямоугольников находится ближе всего, а также для того, чтобы определить, какого размера должна рендериться текстура. Чем дальше объекты от игрока, тем они выглядят меньше. Второе свойство — это часть прямоугольника, с которой столкнулся луч. Текстуры обычно шире одного пикселя, поэтому нужно определить, какую часть текстуры нужно отображать. Мы можем вычислить оба эти свойства по точке пересечения прямоугольника с осью x. На бумаге это сделать достаточно легко, но не так просто в Factorio. Вместо непосредственного вычисления точки пересечения мы можем аппроксимировать точку пересечения, а затем повышать точность аппроксимации, пока она не станет достаточно хорошей. В качестве первой аппроксимации используется средняя точка между двумя конечными точками прямоугольника. Чтобы усовершенствовать аппроксимацию, мы повторяем процедуру вычисления средней точки, но заменяем одну из конечных точек предыдущей аппроксимацией. Если предыдущая средняя точка находилась выше оси x, то мы заменяем конечную точку, которая была выше оси x. Если она находилась ниже оси x, то мы заменяем конечную точку ниже оси x. При каждой такой операции мы приближаемся к истинному пересечению. Суммарно мы вычисляем среднюю точку восемь раз. Это может не дать нам точного пересечения, но для игры с таким низким разрешением этого достаточно.


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


Текстуры часто содержат повторения. Для примера возьмём текстуру стены, она многократно повторяется.


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

Теперь поговорим о самих текстурных блоках. Они содержат самое большое количество комбинаторов этой системы. Они такие большие, потому что каждая текстура сохранена в них множество раз (а именно 138), каждая копия с немного отличающимся масштабом. Благодаря этому в Factorio не требуется выполнять масштабирование текстур. Достаточно просто выбрать подходящую. Разные срезы текстуры хранятся один под другим. Разные масштабы — рядом друг с другом. Расстановка всех устройств была бы слишком трудоёмкой задачей, поэтому автор написал скрипт для преобразования изображений непосредственно в чертёж. Каждая группа из восьми комбинаторов содержит один срез текстуры.



Последняя часть системы — место хранения экранов Game over и победы:


Новые версии движка

В версии движка 2.0 автор полностью переделал систему построения изображения. Теперь оно формируется конвейерами, на которые при помощи идеально синхронизированных манипуляторов устанавливаются разноцветные предметы. Благодаря этому удалось увеличить разрешение экрана до 256x144 и количество цветов до 48, а также избавиться от «битых» пикселей. Однако в новой системе смена кадра производится «подъёмом» вверх предметов, составляющих предыдущий кадр. В движке появилась поддержка изогнутых стен, а также была усовершенствована технология масштабирования текстур, благодаря чему появилась возможность прыжков и приседаний.


Новый экран


Внутреннее устройство экрана: конвейеры и манипуляторы

Вся структура движка была переделана и усовершенствована, теперь количество составляющих его устройств уменьшено на 97%



В версии 2.1 ArrowGMaximus добавил пользовательский интерфейс из Doom (который пока не связан с игрой), для чего пришлось увеличить разрешение экрана до 256х187


В интерфейсе есть работающие счётчики здоровья, брони, амуниции и ключей.

Также автор импортировал анимированные модели оружия из Doom.


Для хранения ресурсов ему пришлось увеличить количество элементов движка с 5843 до 8504. В основном это постоянные комбинаторы, хранящие в себе новую графику.


На правах рекламы

VDS для игровых серверов с посуточной оплатой. Защита от DDoS-атак включена в тариф, возможность использовать любые операционные системы, а главное — доступные цены. Попробуйте прямо сейчас!

Читайте также: