Пятничные факты #258 – Новая система авторазмещения

Spread the love

опубликовал TOGoS, Twinsen

Приручения генератора случайностей(рандом) (Twinsen)

Одна из вещей в большом списке СДЕЛАТЬ для 0,17  окончательно отполировать генератор карт.

В настоящее время существует довольно много очевидных проблем в 0,16, а некоторые менее очевидные. Вот некоторые из исправлений и улучшений (некоторые работы находятся в процессе):

  • Все комбинации настроек больше не должны создавать странные карты, такие как круги скал.
  • Гораздо более предсказуемые ресурсы начальной зоны, которые не перекрываются друг с другом и не покрываются водой.
  • Установки генерации ресурсов теперь имеют гораздо более существенный эффект (ранее они практически не влияли).
  • Увеличено количество шагов (малый, средний, большой и т. Д.) Для каждого параметра от 5 до 9 для еще большей настройки.
  • Начальная область всегда будет содержать воду, чаще всего озеро, близкое к месту появления.
  • Поскольку алгоритм генерации руд был полностью переписан, существует множество небольших улучшений.

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

Было бы просто просто сказать: «Это всего лишь RNG,вы справитесь с этим», но обвинять плохой опыт игры в RNG – это просто плохой дизайн.
Итак, что мы сделали:

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

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

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

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

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

Техничная часть генератора (TOGoS)

Добрый день процедурные энтузиасты генерации карты!

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

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

Я хотел объединить эти две системы, так как летом я начал работать над созданием ландшафта. Начиная с выпуска 0,16, наше стремление улучшить размещение ресурсов, в сочетании с моей неспособностью придумать хороший способ сделать это с использованием существующей системы авторазмещения, привело меня к окончательному  взятию «большого рефакторинга авторазмещения».

Это была большая работа.

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

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

В частности, чтобы сделать процесс создания рудников ресурсов более управляемым, я добавил новый тип выражения шума, называемый «точечный шум». Способ, которым он работает, состоит в том, что карта разделена на регионы (большие области, размер которых настраивается на одно пятно) и для каждого региона:

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

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

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

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

Эта система открывает множество возможностей:

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

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

Соединяя все вместе, вот как выглядит типичная начальная область и окружающий регион, созданный новой системой. Мы можем сделать еще несколько настроек до 0,17, но это, вероятно, довольно близко:

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

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


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