Генерація великих карт в рімейку гри «Caesar III (с)»

    Якщо ви любитель гри «Caesar III», то напевно помічали з те, з яким старанням і увагою до дрібниць зроблені карти кампанії, та й вільного режиму теж. Природні пейзажі, на яких гравець зводить «новий Рим», виглядають цілком реалістично (у рамках гри): струмочки впадають у річки та озера, річки течуть через всю карту, а в лісах бродять «безсмертні» вівці, іноді забредая на луки і заважаючи будувати ферми, чайки кружляють над місцями скупчення риби, а іноді по річці пропливає невдаха моряк на останках корабля. Скельні масиви оточені деревами, а земля покрита килимом соковитої зеленої трави. У всієї цієї чудової картинки є недолік, розмір карти не перевищує 160х160 тайлів, у статті я розповім як зробив генерацію карт великих розмірів.
 
 
 
Оригінальна гра не підтримує великих карт, так що всі досліди проводилися в рамках проекту CaesarIA (open-source клона Caesar III ©) . Підтримка великих карт в рімейку була з самого початку, але до прочитання хорошої статті про використання методу «diamond-square» при побудові ландшафтів , вантажити будь-які карти, крім які йшли з грою або зроблених шанувальниками, не представлялося можливим. Зрозумівши в якому напрямку потрібно рухатися, я набрів ще на одну статтю про генерації ландшафтів , яка остаточно мене переконала в реальності використання цього методу для автоматичного створення карти.
 
Результатом роботи вихідного алгоритму буде масив точок з висотами, зв'язавши висоту з кольором отримаємо таку карту.
 
 
 
Кольори мають відповідні значення:
 - Синій колір відповідає воді з великою глибиною,
 - Посветлее означатиме воду біля берегів,
 - Жовтий буде узбережжі,
 - Зелений означає траву і рівнинні території,
 - Насиченим зеленим буде отображатьсф ліс,
 - Сірим і темно-сірим дрібні і високі гори відповідно.
 
При адаптації результатів роботи до специфіки ландшафту гри, довелося переглянути інтерпретацію деяких значень і налаштувань, але в цілому ці дані підходять для подальшої обробки. Тепер можна відобразити отримані значення на карті міста, для початку я зміню тільки тайли води і залишу інші незакращеннимі.
 
 
 
Після заливки тайлів води, можна заповнювати траву, ліс і гори. Тепер згенерувала карта вже більше походить на звичайну.
 
 
 
Залишилася велика частина карти по ідеї повинна бути покрита високими горами, але тоді вона стане непрохідна для людей, тому я замість високих гір знову використовую тайли рівнини. На отриманій карті залишилися незаповненими області, прилеглі до води.
 
 
 
При заповненні цих областей доведеться враховувати положення сусідів, щоб вибрати правильну текстуру для конкретного тайла. Гра має такими видами текстур для берега, орієнтованого:
 - На сервер:
 - На схід:
 - На південь:
 - На захід:
 
Такі тайли визначаються по розташуванню тайлів з водою щодо тайла, для якого проводиться обчислення. Наприклад, тайл узбережжя, орієнтований на сервер, може мати тайл води тільки по напрямках північ, північний схід і північний захід і їх комбінації. Аналогічно проводимо обчислення для інших тайлів узбережжя і не чіпаємо інші. Результатом буде лінія узбережжя без кутових тайлів.
 
 
 
Наступний етап полягає у пошуку кутових тайлів, що були пропущені на попередньому кроці. Такі тайли мають трійки сусідів (воду) в по напряму північ-> північний схід-> схід, схід -> південний схід -> південь і аналогіние. Для етображенія кутів берега в грі є такі текстури: , розмістивши їх ми отримаємо практично завершену карту.
 
 
 
Тепер залишилися тайли на воді і на землі, що не були оброблені на попередніх етапах. Тайли які оточені землею з усіх боків також віднесемо до землі, а ті що оточені водою — відповідно до води. Тайли узбережжя одночасно вважаються і водою і землею. Тепер залишається доповнити карту дорогою, щоб могли приходити поселенці, і ріками, щоб урізноманітнити загальний пейзаж.
 
 
 
Генерація карти розміром 500х500 тайлів займає небагато часу, але всетаки істотно більше ніж завантаження вже готових карт. Нижче я розмістив скріншот великої карти, розміром 3800х1880 пікселів. На таку карту можна додати різних об'єктів, поселень і навіть місто в режимі одиночної гри, але мені бачиться, що вона більше підійде для мережевої. Ще один з позитивних сторін обраного алгоритму полягає в масштабованості, можна зберегти результати обчислень і при необхідності використовувати їх для розрахунку сусідній території.
 
 
 
Звичайно згенерувала карта не зрівняється зі зробленим людиною, але можливість створювати карти в автоматичному режимі, дозволяє ще на крок просунутися у створенні продовження і розвитку ідей заложенниз в оригінальній грі. Ви також можете подивитися і прийняти участь в розвитку ремейка «Caesar III» на сторінці проекту . Вихідний код генератора карт знаходиться тут .
 
 Бонус. Скріншоти з ремейка
 
    
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.