Генерация больших карт в ремейке игры «Caesar III(с)»

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



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

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

    image

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

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

    image

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



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



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

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

    image

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

    image

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

    imageimage

    Генерация карты размером 500х500 тайлов занимает немного времени, но все-таки существенно больше чем загрузка уже готовых карт. Ниже я разместил скриншот большой карты, размером 3800х1880 пикселей. На такую карту можно добавить разных объектов, поселений и даже город в режиме одиночной игры, но мне видится, что она больше подойдет для сетевой. Еще один из положительных сторон выбранного алгоритма состоит в масштабируемости, можно сохранить результаты вычислений и при необходимости использовать их для расчета соседней территории.



    Конечно, сгенерированная карта не сравнится со сделанной человеком, но возможность создавать карты в автоматическом режиме, позволяет еще на шаг продвинуться в создании продолжения и развитии идей заложенных в оригинальной игре. Вы также можете посмотреть и поучаствовать в развитии ремейка «Caesar III» на странице проекта. Исходный код генератора карт находится здесь.

    Бонус. Скриншоты из ремейка

    Метки:
    Поделиться публикацией
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 20
    • +4
      Имейджхостинг смените, пожалуйста.
      • +1
        Все изображения автоматически перезаливаются на habrastorage.
        • 0
          А эти не хотят. Меня на фастпик перекидывает.
          • +2
            А меня на радикал. Это хуже.
            • +2
              Благодарю за подсказки, сейчас перезалью
      • 0
        Замечательно, что хоть какой-то полный ремейк старой и хорошей игры движется большими шагами к релизу. Скажите, какое состояние у проекта относительно оригинала?
        • +6
          Большими шагами это громко сказано, за добрые слова спасибо ))) на данный момент остались «за бортом» еще порядка 1000 строковых параметров из оригинала, которые отвечают за разные аспекты города, каждый из них нужно осмыслить и понять куда пристроить. У части зданий отсутствует описание, пропущена работа нескольких советников. Много времени отнимает просмотр и разбор исходников оригинала. Осталось добавить еще 6 сюжетных миссий, работа не сложная, но требует времени, ну и правка багов — куда же без неё. Радует что удалось добиться сборки на всех целевых платформах (мак, виндовс, линукс хайку и андроид) с некоторыми ограничениями, но работает.
          • 0
            мак, виндовс, линукс хайку и андроид
            Насклоько я понял, iOS и WinPhone не являются целевыми платформами?
            • +2
              Насчет ИОС я думаю не получитсяв в силу тех причин, что в апстор не пускают проги с заимствованными ресурсами(прав то на текстуры у меня нет), а ломать телефон ради одной игры думаю желающих найдется немного. winphon'a просто нет, и потом не маленьких экранах начинает проявляться много косяков интерфейса. С андроидом получилось быстро портировать, т.к. уже был проект, использующий SDL… немного шаманства и СaesarIA на андроиде.
              • 0
                в апстор не пускают проги с заимствованными ресурсами(прав то на текстуры у меня нет)
                А если ресурсы скачивать при первом запуске игры? При этом ссылка на ресурсы предоставляется пользователем :) Вариант гиковый, конечно, большинство… хм… обычных пользователей аппстора не осилит и возможно наклёпает единиц, но должен быть рабочий?
                • 0
                  С иос я практически не пересекаюсь, знающие хабражители наверняка могут больше рассказать по этой темею
          • 0
            Слышали про Fallout? Так вот есть очень хороший online-хардкорный ремейк, в котором помимо turn-based режима есть еще и real-time боевка. Вся графика поддерживается в строгом стиле Fallout 1/2, дофигища всего помимо оригинальных возможностей (контроль городов, крафт, профессии и тд и тп) и даже встроена поддержка 3d не говоря уже об освещении.
            Коммунити большое и проект называется FOnline. Вот там действительно ремейк так ремейк. Правда, играть одному там нереально сложно.

            Серверный движок в открытом доступе, при желании можно даже нагромоздить обычный Fallout поверх этого движка.
            • 0
              Дык я и не претендую на звезды ))) в фолл играл, но мне больше нравятся ситибилдеры. Игра делается для собственного удовольствия в свободное время, в команде постоянно 2-3 человека. Игр хороших много, на всех хватит
              • 0
                А нет, не берите в голову, это я написал не для того, чтобы укорить вашу идею в чем-то, нет ) Просто я увидел комментарий про ностальгию и очень захотелось рекламнуть про движок )

                По вашей теме, советую почитать и вникнуться в — www-cs-students.stanford.edu/~amitp/game-programming/polygon-map-generation/
                Там и реки и все на свете вокруг одной «полигональной» идеи можно строить )
          • +1
            Эх, такая классика :)
            Желаю вам удачи, и сил, чтобы довести проект до релиза!
            • 0
              а как же реки проходящие через карту??
              • 0
                Пока добавлены только ручьи ))) с рекой еще не определился как реализовать
              • 0
                «тайл побережья, ориентированный на сервер»
                Опечатка так опечатка ;)
              • –10
                Помнится, совсем недавно писал алгоритм карты высот на JS для одного заказчика. Проблема была в том, чтобы вникнуть в тему, которую не знал за пару часов и построить этот алгоритм… Получилось неплохо, плюс нашел баг в хроме и получил денег. =)

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