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

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

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

fad37778f20cc5d16380604e716428f0.jpg

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

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

3f01174af2e5b5b9a88ef528c34b9d23.jpg

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

af2799ee4b45b892b9c79919f94f0222.jpgf4c08a9badd9b46d11e4f2181006d0bb.jpg

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

1a08bfb2d80cbd42734dd34f7bd191ed.jpg

При заполнении этих областей придется учитывать положение соседей, чтобы выбрать правильную текстуру для конкретного тайла. Игра располагает следующими видами текстур для берега, ориентированного: — на сервер: 1dc678765533324a78699239ac33af91.png17fc1a4abb72f1115cabc8ebeb196bf2.png1ea425e9bc53c7ff23a1837af7dc2a32.png96b91a5d404c6f3ce01d8dc3fc426e84.png— на восток: f1117ec85b1b07a65c66fb401b6fb442.png6fa4d4ee83ea44b226d3612371b5020d.pngb7bff4cfdd049fcf144bcef3d6cfcc38.png31b7d5527d944da6246bf79408b0a315.png— на юг: 1dc531baf7d991f70eaa1786c640d787.png1d5e4da9d8ae8b178f55677929221bc0.png0b36f4c42a3d01f8b18b963d99ac281a.png56917a9e1d2f1c5ef7df04ea9af6fa49.png— на запад: fe3ecd0aca5b61be20f7f12fb8c46a24.pnga8bf780c95ffeea1c990b07c815ea223.png6040358f9508e92e8d177f6978fabb89.png61ddaa81b4b9279d4fd8afb508dd861d.png

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

9600d1644dea3484cf885813c4633b80.png

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

a4896421f5c5fd96307ec2dc6c56cb1d.jpg

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

53f62d623a3d561488944be4d89ca96b.jpgf0607855a73b95f0cd509c2c9a49f6e8.jpg

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

c04a4e5cd15537a6b747c6f4cf73ce6f.jpg

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

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

© Habrahabr.ru