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

На скриншоте одна из тестовых карт в 3D: горы, лес и камни. Всё это не нарисовано, а посчитано по графу, о котором я расскажу ниже.
Зачем игре редактор карт
В онлайн-стратегии карта должна быть одинаковой у всех игроков до последней мелочи, поэтому её нельзя просто нарисовать как обычную локацию. Это набор данных, который каждый компьютер читает и считает одинаково. Вторая задача: карта должна быть честной. У обоих игроков должны быть равные базы, ресурсы и подходы, иначе всё решает то, какую сторону кто получил. Поэтому карты у меня симметричны по проходимости, а мелкий рельеф симметрии не имеет, чтобы глаз не видел зеркала.
Первая версия: генератор по рецепту
Сначала у меня был простой генератор, который собирал карту по рецепту слоями: эскиз зон, реки с бродами, формы рельефа, разметка проходимости, расстановка баз и ресурсов и в конце проверка. Любую карту можно записать одной строкой: рецепт, размер, число игроков и сид. Меняешь сид и получаешь другую карту по тому же рецепту. Потом я добавил горы, эрозию, мосты и леса, и карты стали выглядеть заметно лучше.

На скриншоте лист сидов: восемь вариантов одной карты. Редактор сразу проверяет каждый вариант на честность, и два из них не прошли. В одном враг слишком близко, в другом не сошлись доли обрывов, воды и проходимости.
Редактор на узлах, как в World Machine
Рецепт оказался слишком похож на пресет: выбрал шаблон, подвигал несколько настроек. Мне, привыкшему к World Machine и Gaea, этого было мало, и я переделал карту в граф узлов. Набор узлов знакомый: шумы, террасы, размытие, эрозия каплями и осыпями, маски по высоте и по уклону, смешивание. Граф считается на видеокарте, потому что на процессоре карта 256 на 256 с эрозией считалась от 0,6 до 2,3 секунды, а с такой задержкой на каждое движение ползунка работать неудобно. Все расчёты внутри целочисленные, чтобы карта получалась одинаковой на любом компьютере.

Здесь граф одной из тестовых карт. У каждого узла есть превью, слева итоговая карта, справа параметры. Внизу справа видно отметку «Играбельно»: это результат проверки.
Этапы работы над картой
Через день я понял, что в одном графе у меня лежит вообще всё: рельеф, стартовые площадки, нефть и пороги проходимости. Править это было неудобно, а стартовые позиции мне хотелось ставить мышкой прямо на карте, как на обычной локации. Поэтому работа над картой разделилась на этапы. «Мир» это граф, то есть только природа. В «Разметке» я ставлю старты и объекты, рисую зоны и переправы. В «Облике» настраиваю густоту леса и камней, биом и палитру. Проверка играбельности лежит вкладкой в «Разметке». Каждый этап читает результат предыдущего и его не переписывает.

Так выглядит этап «Разметка». Белая рамка это граница игровой зоны, оранжевые кружки это площадки баз.

А это этап «Облик». Здесь уже есть выбор биома и сезона, но об этом будет отдельная часть.
Мир за краем карты
Ещё одна вещь, которая мне не нравилась: карта всегда стояла в кольце гор, как в чаше, а мир за её краем выглядел отдельной декорацией, и на границе был заметен шов. Я попросил сделать карту и мир вокруг одним целым, а рамку оставить просто границей, за которую игрок не заходит. Теперь карта считается сразу вместе с полем вокруг неё, река за краем продолжает течь своим руслом, а горы появляются только там, где их требует рельеф. На скриншоте выше это видно по рамке: рельеф за ней не обрывается.
Импорт, экспорт и публикация
Чтобы не привязываться к одному редактору, я добавил импорт и экспорт карт высот. Гору можно вылепить в Gaea, World Machine или Blender и принести в игру, и наоборот. Ещё есть штампы, кривая высот и маски по кривизне, по стоку воды и по близости к воде. Готовая карта превращается в один защищённый файл вместе с миром за краем. Из редактора её можно одной кнопкой отправить на сервер, и у игроков появится обновление с новой картой.
Что дальше
Пока редактор умеет только землю, а для карты мне нужно больше. В планах слой ручной правки поверх графа, чтобы можно было вылепить деталь кистью и перегенерация её не стёрла, расстановка пропсов, дороги, которые рисуются линией и сами ложатся на рельеф, и типы карт: природа, село, город, промзона. Про город пока сказать почти нечего, это отдельная большая тема. В следующей части расскажу про лес, снег и погоду: как одна карта получила четыре сезона и почему я два раза забраковал деревья.
