Пятничные факты #312 – Смешивание жидкостей и Террайн засыпки

Поделиться

опубликовали Dominik, Ernestas, Albert

Смешивание жидкостей Dominik

Привет Факторианцы,

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

Недавно я взялся за обновление жидкостной системы (FFF-260). В 0.16 он работает так, что контейнеры для жидкости (то, что удерживает жидкость и содержится в объектах, таких как трубы или нефтеперерабатывающие заводы), не имели никакой организации, кроме их соединений. Они будут сидеть там и ничего не делать, а затем один раз за обновление отправляли куда-нибудь жидкость. Там были проблемы, особенно с симметрией, и когда вы подали какую-то жидкость туда, где она не нужна, вы могли бы в конечном итоге получить крупные работы по сносу.

Моя задача состояла в том, чтобы разработать лучший алгоритм перемещения жидкостей, и одна очень дополнительная задача, которую я имел в виду, заключалась в том, чтобы жидкости не попадали в неправильные места и смешивались. Мы начали с того, что организовали контейнеры с жидкостями в системы (соединенные контейнеры создают систему), управляемые специальным менеджером жидкости, и оптимизировали его (FFF-271).

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

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

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

Создавая системы жидкостей , номер 1 был почти закончен, и нам нужно было только назначить блок. Он может быть установлен либо с помощью жидкости, либо с помощью «фильтра», который представляет собой контейнер с жидкостью, которая настроена на использование жидкости – например, водяной насос, использующий воду, или сборщик, имеющий некоторые входы / выходы, заданные рецептом.
Через некоторое время у меня был и алгоритм жидкости и смешивание (FFF-274). Смешивание было не таким простым (как в 5 раз более сложным), но оно работало довольно хорошо. Что касается жидкостного алгоритма, V453000 и Twinsen обнаружили некоторые проблемы с волнами в макромасштабе, и, поскольку это было правильно до выпуска патча 0.17, мы решили пока его отложить (сейчас у нас есть новая версия, кажется, все в порядке, но сначала нужно подождать, пока 0.17 станет стабильной). Смешивание все же прошло, и казалось, что оно закончено.

Оказалось, что работа над ним была завершена не более чем на одну десятую.

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

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

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

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

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

В результате вводится новая концепция – заблокированное соединение. Подземное соединение, которое обычно подключается, но не может. Создание это самая легкая часть. Но когда это будет исправлено? Объект, находящийся за много миль, вращается, что раскалывает жидкостную систему, отсоединяя заблокированное соединение от жидкостного фильтра на другой стороне, и соединение должно разблокироваться. Но даже такая простая вещь, как вращение, содержит исправления жидкости и восстановление коробок с жидкостью, и если она не работает, она все равно исправляет заблокированное соединение в процессе, и это не может быть отменено … Вы получаете картину. И мы все еще говорим о подземных трубах, в то время как все может иметь подземные соединения, включая упомянутые ассемблеры, которые предыдущий код вообще не рассматривал. Сложность становится все глубже и глубже, и Rseding, вероятно, прав, что мы никогда не должны были идти этим путем вообще.

Таким образом, исправление ошибок происходило в основном по кругу – очистка одной партии ошибок, думая, что это были последние, и испытание, наконец, закончено, только чтобы найти другую партию (в идеале от какой-то идеи модератора bizzare) несколько дней спустя. Много раз мне хотелось, чтобы моды никогда не существовало. Ни мультиплеер, ни какие-либо игроки в этом отношении. Около двух месяцев назад все выглядело очень хорошо: практически никаких отчетов и всего несколько сбоев в автоматических отчетах о сбоях.

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

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


Террайн засыпки Ernestas, Albert

На этой неделе Эрнестас физически пришел в офис Wube, чтобы провести с нами некоторое время (он обычно работает удаленно), поэтому мы пользуемся шансом закончить то, что у нас было в ящике, что требовало более тесного общения. Одной из таких вещей является конкретная местность засыпки. Как вы знаете, мы использовали траву для этого. Уже нет.

В Factorio у нас есть столкновение двух миров:

  • Естественная и органическая планета, вне сетки с несколькими типами местности, деревьями
  • Мир фабрики, который является математическим, регулярным, модульным и полностью привязанным к сетке.

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

Как всегда, дайте нам знать, что вы думаете на нашем форуме.


Поделиться

Комментарии: