Azgaar’s Fantasy Map Generator — (по моему скромному мнению) один из лучших инструментов для построения мира. Хотя в настоящее время он не моделирует сезонные изменения, его годовая симуляция температуры и осадков по-прежнему позволяет экономить время создателям мира.

Генератор поставляется с 12 биомами по умолчанию, которые он может автоматически генерировать по требованию. Вы можете добавлять пользовательские биомы и вручную назначать их ячейкам, но, к сожалению, встроенной опции для создания пользовательских биомов нет. К счастью, поскольку генератор почти полностью клиентский (запускается локально в вашем браузере), вы можете создавать собственные биомы с помощью Javascript в консоли вашего браузера.

Если вы не знакомы с использованием консоли в Chrome (тот же браузер, которым пользуюсь я), ознакомьтесь с справочной статьей Google. В противном случае для пользователей разных браузеров вам придется разбираться с этим в другом месте. Большинство браузеров, вероятно, имеют какую-либо форму консольного инструмента.

Отказ от ответственности

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

Создание одного биома за раз

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

function generate_custom_biome(index, min_height, max_height, min_temp, max_temp, min_prec, max_prec) {
  for (const i of pack.cells.i) {
    if (pack.cells.h[i] >= min_height && pack.cells.h[i] <= max_height && grid.cells.temp[pack.cells.g[i]] >= min_temp && grid.cells.temp[pack.cells.g[i]] <= max_temp && (grid.cells.prec[pack.cells.g[i]] * 100) >= min_prec && (grid.cells.prec[pack.cells.g[i]] * 100) <= max_prec) {
      pack.cells.biome[i] = index;
    }
  }
}

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

индекс

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

biomesData.name

Возможно, вы заметили биом «Морской пехотинец» с индексом 0. Пожалуйста, не пытайтесь создать этот биом и не связывайтесь с ним каким-либо образом. Видимые биомы в генераторе только наземные, а биом «Морской» используется генератором только для идентификации водных клеток. Технически говоря, есть 13 биомов по умолчанию, но биом «Морской» не отображается.

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

мин_высота

Этот параметр определяет минимальную высоту, необходимую для создания биома. Используйте значение от 20 до 100 (не используйте значение ниже 20), имея в виду, что генератор считает 70 или выше гор. Чтобы узнать, во что точно переводится значение высоты в абсолютных единицах, просмотрите высоту ячейки в скобках рядом с измерением высоты на панели инструментов «Сведения о ячейке» (перейдите в «Инструменты» -> «Щелкните для обзора»: -> «Ячейки»).

максимальная высота

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

min_temp

Этот параметр определяет минимальную температуру (ºC), необходимую для генерации биома. Используйте значение от -50 до 50.

max_temp

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

min_prec

Этот параметр определяет минимальное количество осадков (мм), необходимое для образования биома. Используйте значение от 0 до 9999 (вы можете ввести и более высокие значения, но я лично не встречал на своих картах осадков выше 9999 мм).

max_prec

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

Добавление пользовательского биома

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

Если вы уже создали пользовательский биом или несколько, они появятся в списке с использованием biomesData.name. В любом случае вы можете ввести это в консоль, чтобы подтвердить индексы биома.

Использование generate_custom_biome

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

generate_custom_biome(index, min_height, max_height, min_temp, max_temp, min_prec, max_prec)

Пример вышеизложенного ниже.

generate_custom_biome(13, 20, 69, 10, 18, 600, 1199)

После запуска функции обновите редактор биомов, нажав кнопку с вращающейся стрелкой в ​​крайнем левом углу в нижней части панели. Кроме того, измените Обитаемость, чтобы обновить расчет населения в назначенных ячейках. Например, даже если вы хотите сохранить обитаемость по умолчанию (50%), вам все равно придется временно изменить ее, чтобы заставить редактор обновить популяцию. Чтобы увидеть примененные изменения, включите и выключите «Биомы» в разделе «Слои». Все примененные изменения должны правильно сохраниться на этом этапе при следующем сохранении файла карты.

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

Названия и цвета биомов можно без проблем изменить с помощью редактора биомов; это не повлияет на функцию, поскольку она использует индекс биома (а не его имя).

Создание нескольких биомов одновременно

Если вы хотите сгенерировать более нескольких биомов одновременно, вы можете сделать это более эффективно, используя немного более сложный, но более быстрый метод. Тем не менее, изучение вышеуказанного метода научит вас сути того, что вам нужно знать. Я использовал этот более сложный метод для создания пользовательских биомов, показанных на первом изображении статьи. Всего я использовал 84 пользовательских биома, которые плавно генерировались на моем относительно скромном ноутбуке. Для этого я рекомендую использовать Google Sheets, делая столбцы для каждого параметра, который использует этот сложный метод. Google Таблицы могут сэкономить вам много времени, но это не обязательно. Тем не менее, я сделаю свою работу доступной для справки или производного использования.

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

Создание биомов из списка

Прежде всего, выясните, сколько биомов вы хотите создать (обратите внимание, что некоторые биомы могут не генерироваться, если ни одна клетка на карте не соответствует их параметрам). Когда вы определили число, добавьте это число к 12. Например, если я хочу создать до 84 пользовательских биомов, мне нужно иметь в общей сложности 96 биомов в редакторе биомов. Без этих уже существующих биомов код генерации не будет работать, поскольку он требует существования индексов, прежде чем назначать их данным биома ячейки.

function generate_custom_biome(index, min_height, max_height, min_temp, max_temp, min_prec, max_prec) {
  var biome_count = 0;
  for (const i of pack.cells.i) {
    if (pack.cells.h[i] >= min_height && pack.cells.h[i] <= max_height && grid.cells.temp[pack.cells.g[i]] >= min_temp && grid.cells.temp[pack.cells.g[i]] <= max_temp && (grid.cells.prec[pack.cells.g[i]] * 100) >= min_prec && (grid.cells.prec[pack.cells.g[i]] * 100) <= max_prec) {
      pack.cells.biome[i] = index;
      biome_count = biome_count + 1;
    }
  }
  return biome_count;
}
function generate_custom_biome_list() {
  var index = 13;
  for (const i in custom_biome_list) {
    const min_height = custom_biome_list[i][3];
    const max_height = custom_biome_list[i][4];
    const min_temp = custom_biome_list[i][5];
    const max_temp = custom_biome_list[i][6];
    const min_prec = custom_biome_list[i][7];
    const max_prec = custom_biome_list[i][8];
    if (generate_custom_biome(index, min_height, max_height, min_temp, max_temp, min_prec, max_prec) > 0) {
      biomesData.name[index] = custom_biome_list[i][0];
      biomesData.color[index] = custom_biome_list[i][1];
      biomesData.habitability[index] = custom_biome_list[i][2];
      index = index + 1;
    }
  }
}

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

custom_biome_list = [
  ['Glaciers', '#f2f1ef', 0, 20, 69, -50, -1, 0, 9999],
  ['Polar deserts', '#f4eee1', 5, 20, 69, 0, 1, 0, 124],
  ['Subpolar deserts', '#f6ebd2', 10, 20, 69, 2, 3, 0, 124],
  ['Continental deserts', '#f7e9c4', 15, 20, 69, 4, 6, 0, 124],
  ['Oceanic deserts', '#f7e6b5', 20, 20, 69, 7, 12, 0, 124],
  ['Temperate deserts', '#f7e4a7', 25, 20, 69, 13, 17, 0, 124],
  ['Subtropical deserts', '#f6e199', 30, 20, 69, 18, 23, 0, 124],
  ['Tropical deserts', '#f4df8a', 25, 20, 69, 24, 30, 0, 124],
  ['Ultratropical deserts', '#f2dd7b', 20, 20, 69, 31, 50, 0, 124],
  ['Polar shrublands', '#dedacd', 40, 20, 69, 0, 1, 125, 9999],
  ['Subpolar shrublands', '#dfd7bf', 45, 20, 69, 2, 3, 125, 249],
  ['Continental shrublands', '#ded6b1', 50, 20, 69, 4, 6, 125, 249],
  ['Oceanic shrublands', '#ddd3a3', 55, 20, 69, 7, 12, 125, 249],
  ['Temperate shrublands', '#dcd195', 60, 20, 69, 13, 17, 125, 249],
  ['Subtropical shrublands', '#dacf87', 65, 20, 69, 18, 23, 125, 249],
  ['Tropical shrublands', '#d3ca76', 60, 20, 69, 24, 30, 125, 249],
  ['Ultratropical shrublands', '#cac664', 55, 20, 69, 31, 50, 125, 249],
  ['Subpolar grasslands', '#c8c4ac', 80, 20, 69, 2, 3, 250, 9999],
  ['Continental grasslands', '#c6c39f', 85, 20, 69, 4, 6, 250, 499],
  ['Oceanic grasslands', '#c4c191', 90, 20, 69, 7, 12, 250, 499],
  ['Temperate grasslands', '#c2bf84', 95, 20, 69, 13, 17, 250, 499],
  ['Subtropical grasslands', '#bfbd76', 100, 20, 69, 18, 23, 250, 499],
  ['Tropical grasslands', '#b2b663', 95, 20, 69, 24, 30, 250, 499],
  ['Ultratropical grasslands', '#a4af50', 90, 20, 69, 31, 50, 250, 499],
  ['Continental woodlands', '#afb08d', 80, 20, 69, 4, 6, 500, 9999],
  ['Oceanic woodlands', '#acae80', 85, 20, 69, 7, 12, 500, 999],
  ['Temperate woodlands', '#a8ad73', 90, 20, 69, 13, 17, 500, 999],
  ['Subtropical woodlands', '#a4ab66', 95, 20, 69, 18, 23, 500, 999],
  ['Tropical woodlands', '#92a252', 90, 20, 69, 24, 30, 500, 999],
  ['Ultratropical woodlands', '#7e983d', 85, 20, 69, 31, 50, 500, 999],
  ['Oceanic forests', '#949c70', 80, 20, 69, 7, 12, 1000, 9999],
  ['Temperate forests', '#8f9b64', 85, 20, 69, 13, 17, 1000, 1999],
  ['Subtropical forests', '#8a9a57', 90, 20, 69, 18, 23, 1000, 1999],
  ['Tropical forests', '#738e42', 85, 20, 69, 24, 30, 1000, 1999],
  ['Ultratropical forests', '#59812d', 80, 20, 69, 31, 50, 1000, 1999],
  ['Temperate rainforests', '#778955', 80, 20, 69, 13, 17, 2000, 9999],
  ['Subtropical rainforests', '#718849', 85, 20, 69, 18, 23, 2000, 3999],
  ['Tropical rainforests', '#547a33', 80, 20, 69, 24, 30, 2000, 3999],
  ['Ultratropical rainforests', '#346a1e', 75, 20, 69, 31, 50, 2000, 3999],
  ['Subtropical jungles', '#58773c', 80, 20, 69, 18, 23, 4000, 9999],
  ['Tropical jungles', '#366626', 75, 20, 69, 24, 30, 4000, 9999],
  ['Ultratropical jungles', '#005411', 70, 20, 69, 31, 50, 4000, 9999],
  ['Montane glaciers', '#fffefc', 0, 70, 100, -50, -1, 0, 9999],
  ['Montane polar deserts', '#fffdf0', 3, 70, 100, 0, 1, 0, 124],
  ['Montane subpolar deserts', '#fffbe3', 7, 70, 100, 2, 3, 0, 124],
  ['Montane continental deserts', '#fffbd7', 10, 70, 100, 4, 6, 0, 124],
  ['Montane oceanic deserts', '#fffaca', 13, 70, 100, 7, 12, 0, 124],
  ['Montane temperate deserts', '#fff9be', 17, 70, 100, 13, 17, 0, 124],
  ['Montane subtropical deserts', '#fff9b2', 20, 70, 100, 18, 23, 0, 124],
  ['Montane tropical deserts', '#fff9a5', 17, 70, 100, 24, 30, 0, 124],
  ['Montane ultratropical deserts', '#fff999', 13, 70, 100, 31, 50, 0, 124],
  ['Montane polar shrublands', '#f8f1dd', 27, 70, 100, 0, 1, 125, 9999],
  ['Montane subpolar shrublands', '#f5f0d1', 30, 70, 100, 2, 3, 125, 249],
  ['Montane continental shrublands', '#f3f0c5', 34, 70, 100, 4, 6, 125, 249],
  ['Montane oceanic shrublands', '#f2f0b9', 37, 70, 100, 7, 12, 125, 249],
  ['Montane temperate shrublands', '#f0efad', 40, 70, 100, 13, 17, 125, 249],
  ['Montane subtropical shrublands', '#efefa1', 44, 70, 100, 18, 23, 125, 249],
  ['Montane tropical shrublands', '#eaee92', 40, 70, 100, 24, 30, 125, 249],
  ['Montane ultratropical shrublands', '#e5ed83', 37, 70, 100, 31, 50, 125, 249],
  ['Montane subpolar grasslands', '#ebe6bf', 54, 70, 100, 2, 3, 250, 9999],
  ['Montane continental grasslands', '#e7e6b4', 57, 70, 100, 4, 6, 250, 499],
  ['Montane oceanic grasslands', '#e4e6a8', 60, 70, 100, 7, 12, 250, 499],
  ['Montane temperate grasslands', '#e1e69c', 64, 70, 100, 13, 17, 250, 499],
  ['Montane subtropical grasslands', '#dee691', 67, 70, 100, 18, 23, 250, 499],
  ['Montane tropical grasslands', '#d4e480', 64, 70, 100, 24, 30, 250, 499],
  ['Montane ultratropical grasslands', '#c9e170', 60, 70, 100, 31, 50, 250, 499],
  ['Montane continental woodlands', '#dbdca3', 54, 70, 100, 4, 6, 500, 9999],
  ['Montane oceanic woodlands', '#d5dc98', 57, 70, 100, 7, 12, 500, 999],
  ['Montane temperate woodlands', '#d0dd8d', 60, 70, 100, 13, 17, 500, 999],
  ['Montane subtropical woodlands', '#cbdd82', 64, 70, 100, 18, 23, 500, 999],
  ['Montane tropical woodlands', '#bcd96f', 60, 70, 100, 24, 30, 500, 999],
  ['Montane ultratropical woodlands', '#acd65e', 57, 70, 100, 31, 50, 500, 999],
  ['Montane oceanic forests', '#c6d388', 54, 70, 100, 7, 12, 1000, 9999],
  ['Montane temperate forests', '#bfd47d', 57, 70, 100, 13, 17, 1000, 1999],
  ['Montane subtropical forests', '#b8d473', 60, 70, 100, 18, 23, 1000, 1999],
  ['Montane tropical forests', '#a3cf60', 57, 70, 100, 24, 30, 1000, 1999],
  ['Montane ultratropical forests', '#8bca4e', 54, 70, 100, 31, 50, 1000, 1999],
  ['Montane temperate rainforests', '#adcb6f', 54, 70, 100, 13, 17, 2000, 9999],
  ['Montane subtropical rainforests', '#a4cc66', 57, 70, 100, 18, 23, 2000, 3999],
  ['Montane tropical rainforests', '#88c552', 54, 70, 100, 24, 30, 2000, 3999],
  ['Montane ultratropical rainforests', '#67bf41', 50, 70, 100, 31, 50, 2000, 3999],
  ['Montane subtropical jungles', '#8fc359', 54, 70, 100, 18, 23, 4000, 9999],
  ['Montane tropical jungles', '#6abb46', 50, 70, 100, 24, 30, 4000, 9999],
  ['Montane ultratropical jungles', '#36b336', 47, 70, 100, 31, 50, 4000, 9999]
];

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

['Biome name', 'Biome HEX colour code', habitability, min_height, max_height, min_temp, max_temp, min_prec, max_prec]

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

generate_custom_biome_list()

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

Заключительные мысли

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

Кредит

Руководство по биомам, созданное пользователем, известным как MBARTELSM, частично вдохновило меня на создание моего списка пользовательских биомов. Я нашел их PDF-документ в ссылке на вложение от Гильдии картографов. Другие также могут найти свое руководство интересным. Поскольку я обнаружил ссылку в результатах поиска DuckDuckGo, я не знаю исходную ветку, в которой пользователь предположительно разместил ее.