Генерация больших карт в ремейке игры «Caesar III(с)»
Если вы любитель игры «Caesar III», то наверняка замечали с то, с каким старанием и вниманием к мелочам сделаны карты кампании, да и свободного режима тоже. Природные пейзажи, на которых игрок возводит «новый Рим», выглядят вполне реалистично (в рамках игры): ручейки впадают в реки и озера, реки текут через всю карту, а в лесах бродят «бессмертные» овцы, иногда забредая на луга и мешая строить фермы, чайки кружат над местами скопления рыбы, а иногда по реке проплывает неудачливый моряк на останках корабля. Скальные массивы окружены деревьями, а земля покрыта ковром сочной зеленой травы. У всей этой чудной картинки есть недостаток, размер карты не превышает 160×160 тайлов, в статье я расскажу как сделал генерацию карт больших размеров.Оригинальная игра не поддерживает больших карт, так что все опыты проводились в рамках проекта CaesarIA (open-source клона Caesar III©). Поддержка больших карт в ремейке была с самого начала, но до прочтения хорошей статьи об использовании метода «diamond-square» при построении ландшафтов, грузить какие-либо карты, помимо шедших с игрой или сделанных поклонниками, не представлялось возможным. Поняв в каком направлении нужно двигаться, я набрел еще на одну статью о генерации ландшафтов, которая окончательно меня убедила в реальности использования этого метода для автоматического создания карты.
Результатом работы исходного алгоритма будет массив точек с высотами, связав высоту с цветом получим такую карту.
Цвета имеют соответствующие значения: — синий цвет соответствует воде с большой глубиной, — посветлее будет означать воду возле берегов, — желтый будет побережье, — зеленый означает траву и равнинные территории, — насыщенным зеленым будет отображатьсф лес, — серым и темно-серым мелкие и высокие горы соответственно.
При адаптации результатов работы к специфике ландшафта игры, пришлось пересмотреть интерпретацию некоторых значений и настроек, но в целом эти данные подходят для дальнейшей обработки. Теперь можно отобразить полученные значения на карте города, для начала я изменю только тайлы воды и оставлю остальные незакращенными.
После заливки тайлов воды, можно заполнять траву, лес и горы. Теперь сгенерированная карта уже больше походит на обычную.
Оставшаяся большая часть карты по идее должна быть покрыта высокими горами, но тогда она станет непроходима для людей, поэтому я вместо высоких гор опять использую тайлы равнины. На полученной карте остались незаполненными области, прилегающие к воде.
При заполнении этих областей придется учитывать положение соседей, чтобы выбрать правильную текстуру для конкретного тайла. Игра располагает следующими видами текстур для берега, ориентированного: — на сервер: — на восток: — на юг: — на запад:
Такие тайлы определяются по расположению тайлов с водой относительно тайла, для которого проводится вычисление. Например, тайл побережья, ориентированный на сервер, может иметь тайл воды только по направлениям север, северо-восток и северо-запад и их комбинации. Аналогично проводим вычисления для остальных тайлов побережья и не трогаем другие. Результатом будет линия побережья без угловых тайлов.
Следующий этап состоит в поиске угловых тайлов, которые были пропущены на предыдущем шаге. Такие тайлы имеют тройки соседей (воду) в по направления север→северо-восток→восток, восток → юго-восток → юг и аналогиные. Для этображения углов берега в игре есть следующие текстуры: , разместив их мы получим практически завершенную карту.
Теперь остались тайлы на воде и на земле, которые не были обработаны на предыдущих этапах. Тайлы которые окружены землей со всех сторон также отнесем к земле, а те что окружены водой — соответственно к воде. Тайлы побережья одновременно считаются и водой и землей. Теперь остается дополнить карту дорогой, чтобы могли приходить поселенцы, и реками, чтобы разнообразить общий пейзаж.
Генерация карты размером 500×500 тайлов занимает немного времени, но всетаки существенно больше чем загрузка уже готовых карт. Ниже я разместил скриншот большой карты, размером 3800×1880 пикселей. На такую карту можно добавить разных объектов, поселений и даже город в режиме одиночной игры, но мне видится, что она больше подойдет для сетевой. Еще один из положительных сторон выбранного алгоритма состоит в масштабируемости, можно сохранить результаты вычислений и при необходимости использовать их для расчета соседней территории.
Конечно сгенерированная карта не сравнится со сделанной человеком, но возможность создавать карты в автоматическом режиме, позволяет еще на шаг продвинуться в создании продолжения и развитии идей заложенныз в оригинальной игре. Вы также можете посмотреть и поучаствовать в развитии ремейка «Caesar III» на странице проекта. Исходный код генератора карт находится здесь.
Бонус. Скриншоты из ремейка