Geliştirici günlüğü

Geliştirici Günlüğü #14: Strateji oyunu haritası konumlara ve illere nasıl bölünür?

MKA Engine harita aracı tarihî sınırları, yerleşimleri ve araziyi birleştirerek nasıl konum ve il üretiyor? Mandates of History paketindeki ölçüler ve kararlar.

İçindekiler
Ahşap bir çalışma masasında üst üste yarı saydam harita kâğıtları, puzzle parçalarına bölünmüş renkli haritalar ve bir terazi

Kısaca: MKA Engine’in harita aracı, tarihî devlet sınırlarını ve tarihî idari birimlerin (yönetim bölgelerinin) sınırlarını üst üste getirerek küçük harita parçaları çıkarıyor; sonra bu parçaları yerleşim ve arazi türüne göre konumlara dönüştürüyor. Bu günlükte kullandığımız Mandates of History harita paketinde 27.959 kara ve 5.733 su konumu oluştu; kara konumları da illere, alanlara ve bölgelere toplandı. Bu sayılar oyunun harita ayarlarıyla üretilen pakete özgü sonuçlar.

Sorun ne idi?

Bir harita ekranını açıp bir şehre tıkladığınızı düşünün. O şehir yalnızca ekranda duran bir nokta değildir. Oyunun nüfusu, orduları, yolları ve tarihî kayıtları o noktaya bağlanır. Bir komşu ülkeye geçerken, bir bölgedeki nüfusu sayarken ya da ordunun dağdan geçip geçemeyeceğini hesaplarken oyun aynı harita parçalarına bakar. Oyunun bunları güvenilir biçimde yapabilmesi için dünya, anlamlı ve tutarlı parçalara ayrılmalıdır.

Bunu kâğıt harita yapan bir atölye gibi düşünebiliriz. Atölyenin önünde farklı şeffaf kâğıtlar vardır: birinde tarihî devlet sınırları, diğerinde birim sınırları, bir başkasında şehirler ve araziler. Kâğıtları üst üste koyunca ilk çizgiler ortaya çıkar; sonra bu çizgiler yürünebilir yolları, nehirleri ve dağ sırtlarını izleyerek düzeltilir. Sonunda tek tek parçalar, oyuncunun bildiği iller ve bölgeler hâline gelir.

Buradaki güçlük, bu katmanların aynı şeyi anlatmamasıdır. Bir devlet sınırı tarih boyunca değişebilir. Bir idari birim, bir şehir ya da nüfus kümesiyle bire bir örtüşmeyebilir. Dağlık ve geçilmez arazi de düz bir çizgiyle kesilirse haritada yapay görünür. Üstelik araç aynı girdiyi yeniden kullandığında aynı paketi üretmelidir. Yoksa bir harita yenilemesi oyunun içerik dosyalarındaki şehirleri başka yerlere bağlayabilir.

Önceki günlükte harita anahtarlarının neden kalıcı olması gerektiğini anlatmıştık. O anahtarların bağlanacağı yerleri bu günlükte kuruyoruz: haritanın küçük konumlarını, onların üstündeki illeri ve daha geniş alanları. Anahtar defteri yerlerin kimliğini korur; bölümleme ise haritada hangi yerlerin var olacağını belirler.

Nasıl çözdük?

İlk çizgiler: tarihî sınırları üst üste getirmek

Raster, haritayı küçük karelere ayıran ve her karede hangi sınıfın bulunduğunu kaydeden dijital katmandır. Her kareye piksel denir. Araç altı farklı yılın devlet rasterlerini tarihî idari birimlerin sınır katmanıyla üst üste koyuyor. Üst üste gelen çizgiler, her katmanda aynı devlet ve idari birim içinde kalan bağlantılı parçaları belirliyor. Bu ilk parçalar atom adını alıyor: atom, sonraki adımlar başlamadan önceki küçük harita yapıtaşıdır.

İlk üst üste koymada 64.075 parça çıktı. Bu parçaların bazıları haritada iş görecek kadar büyük değildi; dar şerit veya küçük kırıntı olarak kalmışlardı. Araç bu kırıntıları komşularıyla birleştirerek sayıyı 5.648 atoma indirdi. Birleştirme sırasında önce aynı tarihî devlet ve birim içindeki komşular aranıyor. Böyle bir komşu yoksa parça, en uzun ortak sınırı paylaştığı komşuya katılıyor; bu sırada devlet sınırı da aşılabiliyor. Böylece ilk sınırlar korunuyor, ama haritanın geri kalanını tek piksellik parçalar doldurmuyor.

Her atom tek bir harita karakteri alıyor

Bir oyuncu için bir konumun yalnızca nerede başladığı değil, orada ne yapılabildiği de önemlidir. Araç bu nedenle tarihî parçalara yerleşim sınıfı ekliyor: yerleşik alan, koridor veya geçilmez alan. Her konum tek bir sınıf alıyor; böylece yerleşik alanla geçilmez arazi ayrı oyun kurallarıyla izleniyor.

Bazı küçük yerleşik parçalar komşu sınıfa katılabilir. Fakat bir parça oyunun elle tuttuğu yerleşim listesinden geliyorsa ya da şehir verisi taşıyorsa otomatik birleştirme onu koruyor. Ölçüm belgesinde bu kaynak korumasına uyan 558 parça kaydedilmişti. Mekke, Medine, Cidde ve Riyad çevresindeki yerleşik parçalar bu sayede koridor sınıfına karışmıyor. Bu ayrıntı, haritadaki şehirlerin yalnızca bir piksel yığını değil, oyunun içerik olarak tanıdığı yerler olmasını sağlıyor.

Konum merkezleri: önemli noktaları önce sabitlemek

Konum oluşturmanın başlangıç noktalarına tohum diyoruz. Tohum, bir konumun büyümeye başlayacağı harita noktasıdır; bir bölgeyi doldurmak için işe koyulan ilk görevli gibi düşünülebilir. Bütün tohumları rastgele dağıtmak yerine, araç önce belirli tarihî ve coğrafi noktaları sabitliyor.

Mandates paketinde önce 14 boğaz şehri ayrı konum olarak ayrılıyor. Ardından kaynaklardan gelen 4.953 yerleşim noktası, çevresinde yeterli yer varsa sabit başlangıç noktası oluyor. Her iki tür merkez, yakınında başka bir merkez bulunsa da kendi konumunu koruyor. Sonra haritanın kalan yerleri için yoğunluğa göre 23.096 serbest tohum ekleniyor. Bu serbest tohumların sayısı ve dağılımı oyunun nüfus ve harita ayarlarına bağlı; motorun her oyuna dayattığı sabit bir sayı değil.

Bu sıralama önemlidir. Boğaz şehrinin kendine ait bir konumu olması, bir ordunun veya ticaret yolunun geçiş noktasını haritada seçilebilir kılar. Yerleşim noktalarının önce konum alması ise şehir çevresinin geniş, kimliksiz bir alana yutulmasını önler. Serbest tohumlar bundan sonra kalan yerleri doldurur. Böylece hem tarihî merkezler korunur hem de şehirlerden uzak bölgeler boş kalmaz.

Tohumlar sınırları nasıl büyütüyor?

Tohumlar konduktan sonra her tohumun çevresindeki harita alanı konumlara paylaştırılıyor. Bu iş için araç doğal maliyet kullanıyor. Yükseklik, nehirlerin büyüklüğü ve harita boyunca yavaşça değişen küçük bir çeşitlilik, bir pikselden ötekine geçmenin maliyetini etkiliyor. Basitçe: düz bir ovada ilerlemek kolay, yüksek bir sırtı ya da büyük bir nehri aşmak daha pahalı. Böylece sınır sadece cetvelle çizilmiş bir şekil olmuyor; arazi biçimi de çizgiye katılıyor.

Araç, aynı bölgedeki tohumlardan başlayarak havza gibi yayılıyor. Havza, suyun yokuş aşağı akıp çukurları doldurmasıdır; burada harita pikselleri en düşük maliyetli tohuma bağlanıyor. İlk yayılımdan sonra iki tur daha çalışıyor: her turda konumun kapladığı alanın merkezi bulunup taşınabilir tohum o merkeze yaklaştırılıyor. Bu işlemin adı dengeleme. Böylece konumların büyüklükleri birbirine yaklaşırken şehir ve boğaz merkezleri sabit kalıyor.

Bu düzeltme her tohumu taşımaz. Önceden sabitlenmiş boğaz ve yerleşim noktaları yerlerinde kalır. Dengeleme, serbest tohumların çevresindeki alanları düzenler. Böylece şehir gibi anlamı önceden belirlenmiş merkezler korunurken, kalan konumlar daha dengeli büyüyebilir.

Büyük konumları yeniden bölmek

Yoğun nüfuslu bir yerleşim çevresinde tek bir konum çok geniş kalırsa, o konumun içinde farklı şehirleri veya yerleşim kümelerini ayırmak zorlaşır. Bu nedenle araç, kenar payları da hesaba katıldığında 30.000 km²’yi aşan nüfuslu yerleşik konumları yeniden bölüyor. Yeni tohum, mevcut tohumundan en uzaktaki noktalara konuyor; sonra yayılım yeniden yapılıyor.

Bu işlem tek seferde bitmiyor. İlk turda eşik üstünde 267 konum vardı. Tohum ekleyip yeniden yaydıktan sonra sayı 101’e, sonra 29’a, 11’e, 3’e ve 1’e düştü; son turda eşik üstünde konum kalmadı. Bu turlarda toplam 415 ek tohum kullanıldı. Burada amaç her konumu eşit büyüklükte yapmak değil. Amaç, özellikle nüfuslu yerleşim alanlarında tek parça hâline gelmiş aşırı büyük konumları makul parçalara ayırmak.

Konumları büyütüp dengeledikten sonra araç, ana parçadan kopuk adacıkları kontrol ediyor. Yeterince büyük kopuk bir parça ayrı konum olabiliyor; küçük parça komşuya katılıyor. Böylece bir konumun kimliği haritada birbirinden kopuk, ilgisiz lekeleri toplamıyor.

Konumlardan illere ve bölgelere

Konumlar, oyunun harita üzerinde seçebileceği en küçük yerlerdir. Bunları oyuncunun daha aşina olduğu illere toplamak için ikinci bir düzen kuruyoruz. Bir binanın odalarından mahalle, mahallelerden şehir çıkarmak gibi: her üst düzey, altındaki parçaları bir araya getiriyor.

İl tabanı için önce tarihî birimler kullanılıyor. Uygun tarihî birim yoksa 1444 ile 1836 arasındaki tarihî il merkezleri, sonra da bugünkü idari bölgeler devreye giriyor. Bir taban parçası çok küçükse komşu illerle birleştirilebiliyor; genel düzen, illerin çoğunu 3–8 konum arasında tutuyor. Bu seçim, her yerde aynı geometrik ızgarayı kullanmak yerine mevcut tarihî ve idari bilgiyi başlangıç noktası yapıyor.

Alan ve bölge düzeyleri farklı bir karardır: bu gruplar oyunun kendi harita içeriğinde elle tanımlanır. Mandates paketinde 730 alan ve 86 bölge vardır. Araç bunların adını veya yerini kendi başına icat etmez; oyun tarafından verilen merkez noktalarını kullanarak illeri ilgili alana toplar. Her alanın tarihî bir merkezi, yani çapa noktası vardır; bu noktayı içeren il alanın çekirdeğini oluşturur. Bölge sayısı, alan sayısı ve çapa adları oyunun ayarlarına ait olduğundan başka bir oyunda aynı sayılar beklenmez.

Ne gördük?

Bu çalışmada ölçülen paket Mandates of History’nin harita ayarlarıyla üretildi. Sonuç, dünya çapında tek bir rakamdan ibaret değil; farklı katmanların nasıl bir araya geldiğini de gösteriyor.

Katman veya ölçüSonuç
Tarihî parçaların birleşmesi sonrası atom5.648
Kara konumu27.959
Yerleşik / koridor / geçilmez kara konumu25.517 / 136 / 2.306
Su konumu5.733
Ortanca konum alanı1.566 km²
En büyük sayılan yerleşik konum / üst sınır29.985 / 39.140 km²
Kara ili / alan / bölge / alt kıta5.216 / 730 / 86 / 14
İl başına konum ortancası5

27.959 kara konumunun 25.517’si yerleşik, 136’sı koridor, 2.306’sı geçilmez sınıftadır. Koridor ve geçilmez konumlar il tabanına alınmaz. Diğer kara konumları, tarihî birimler ve merkezlerden başlayan il düzenine katılır. 5.216 kara ili de oyunun tanımladığı alan, bölge ve alt kıta katmanlarına bağlanır.

Ölçümdeki en büyük sayılan yerleşik konum 29.985 km² oldu; üst sınır 39.140 km² idi. Tavan istisnası olarak kaydedilen 179 konumun tamamı geçilmez, koridor veya nüfusu sıfır olan yerlerdi. Tavan yalnız nüfuslu yerleşik konumları böldüğü için bu alanlar büyük kalabilir; oyuncu bunları yerleşik kentler değil, geçilmez arazi, geçiş koridoru veya nüfussuz alanlar olarak görür.

Düz sınır payı, kara konumları arasındaki sınırın ne kadarının uzun ve düz parçalar oluşturduğunu ölçer. Değer düştükçe, uzun ve düz sınırların toplam sınır içindeki payı azalır. Dünya değeri Mandates of History’nin 1337 haritasının önceki üretim sürümündeki 0,374’ten yeni sürümde 0,125’e indi; Anadolu’da 0,361’den 0,066’ya, Avrupa’da 0,352’den 0,053’e düştü.

Aynı paketi yeniden kurduğumuz son iki koşu aynı çıktıyı verdi; harita aracı aynı veriler ve ayarlarla aynı konum düzenini tekrar oluşturabildi. Paket üretiminin bir koşusu da bu makinede 24–33 dakika sürdü ve en çok 9,2 GB bellek kullandı. Bu değerler oyunun oynanma süresi değil, harita içeriğini kurma maliyetidir.

Harita aracının ölçümleri: 27.959 kara konumu, 5.733 su konumu, düz sınır payı yüzde 12,5, ortanca konum alanı 1.566 km²

Neden böyle seçtik?

Araştırma notunda dört yöntemi karşılaştırdık:

YöntemNe sağlar?Neden tek başına yetmedi?
Kapasite sınırlı ağırlıklı Voronoi (güç diyagramı)Her merkezin çevresine, ağırlıklarla belirlenen bir alan verir; konumların istenen büyüklüklere yaklaşmasına yardım eder.Nehirleri ve dağ sırtlarını kendiliğinden sınır yapmaz; parçaların bağlantısını ayrıca onarmak gerekir.
Dengeli k-ortalama / Lloyd gevşetmesiMerkezleri çevrelerindeki alanın ortasına taşıyarak tohumların dağılımını ve alan büyüklüklerini dengeler.Arazi engellerini hesaba katmaz; aynı konumun tek parça kalacağını garanti etmez.
Havza / maliyet yüzeyinde büyütmeYüksek arazi ve büyük nehir geçişini pahalı sayar; sınırlar sırtlara ve nehirlere yaklaşır.Konumların alanlarını kendi başına dengelemez; merkezleri ayrıca düzeltmek gerekir. Bu nedenle sınır çizme adımı olarak seçildi, tek başına tüm düzen olmadı.
Grafik bölme (METIS)Haritadaki birbirine değen kareleri gruplara ayırır. Karelere ve aralarındaki sınırlara verilen ağırlıklar, grup büyüklüğünü ve sınırların nereden geçeceğini belirler.Bağlantılılık seçeneği kesin güvence vermez; kopuk parçaları ayrıca onarmak gerekir.

Biz havza büyütmeyi ana sınır çizme yöntemi seçtik; ardından iki dengeleme turu, büyük yerleşimlere en uzak noktadan yeni tohum ekleme ve kopuk parçaları onarma adımlarını ekledik. Bu sıralama üç ihtiyacı birlikte karşılıyor: yerleşim merkezleri yerinde kalıyor, arazi biçimi sınırlara yansıyor ve her konum haritada tek bir bağlı parça oluşturuyor.

Bu kararın oyuncuya görünen yanı, yoğun yerleşim ile geniş coğrafyanın aynı dünyada temsil edilmesi. Şehir ve yerleşim merkezleri sabit başlangıç noktaları; kalan alan ise oyunun nüfus grupları için verdiği yoğunluk ayarlarıyla dolduruluyor. Sınır maliyetine yükseklik ve nehirleri katmak, çizgileri ızgara yerine araziye yaklaştırıyor. Tarihî sınırlar başlangıç çerçevesi olarak kalıyor; yeni konum çizgileri bu tarihî izlerin üzerine kuruluyor.

İller için oyunun tarihî ve idari bilgilerinden başlayıp gerektiğinde komşuları birleştiriyoruz. Alan ve bölge adlarını araca gömmüyoruz. Bunlar oyunun anlatısının parçası; harita aracı yalnızca oyunun verdiği çapalara göre yerleştiriyor. Böylece aynı yöntem farklı bir oyuna uygulanabilirken, her oyunun tarihî tercihleri kendi içeriğinde kalıyor.

Bedeli ne?

Bu ölçümler Mandates of History’nin harita ayarlarıyla üretilen pakete aittir. Bir üretim koşusu 24–33 dakika sürdü ve en çok 9,2 GB bellek kullandı; sekiz bağlantılı adımdan oluşan zincir, oyunun çalışma anında değil içerik hazırlanırken çalışıyor. İçerik üretimi şu sekiz parçalı zincirden geçiyor:

  • Tarihî harita parçalarını birleştirme.
  • Yerleşim sınıfı verme.
  • Sabit merkezleri seçme.
  • Serbest merkezleri yoğunluğa göre dağıtma.
  • Arazi maliyetiyle yayılıp konumları dengeleme.
  • Büyük konumları yeniden bölme.
  • Kopuk parçaları onarma.
  • İl hiyerarşisini kurma.

Sırada ne var?

Konumları illere ve bölgelere bağladıktan sonra sıradaki soru, aynı dünyada her oyuncunun hangi devleti yönettiğidir. #15’te oyuncu yetkisini, gözlemciyi ve yapay zekâ oyuncusunu anlatacağız.

Sık sorulanlar

MKA Engine harita aracında bir konum nedir?

Konum, haritanın oyunda ayrı kimlik taşıyan küçük parçasıdır. Bu pakette kara konumları yerleşik, koridor veya geçilmez sınıflarından birine sahip; su konumları ayrı kurulur.

Harita aracı konum sınırlarını neye göre çiziyor?

Tarihî devlet ve birim sınırlarını ilk parçalar için kullanıyor. Sonra şehir ve yerleşim merkezlerini, oyunun yoğunluk ayarlarını, yüksekliği ve nehir maliyetini hesaba katarak konum alanlarını oluşturuyor.

27.959 kara konumu her MKA Engine oyununda aynı mı?

Hayır. Bu sayı Mandates of History’nin harita ayarlarıyla üretilen pakete ait. Başka bir oyun farklı sınır, yoğunluk ve yerleşim ayarları seçebilir.

Harita aracı aynı veriden aynı sonucu veriyor mu?

Son iki koşuda aynı paket çıktısı alındı. Bunun nedeni başlangıç noktalarının, girdilerin ve harita ayarlarının açıkça belirlenmesi; böylece yeniden kurulum aynı düzeni üretebiliyor.

Önceki yazıda harita anahtarlarının nasıl korunduğunu anlattık: Oyun haritasında kalıcı anahtarlar. Motorun genel çerçevesi için MKA Engine, bütün günlükler için Geliştirici Günlükleri, görüş ve sorularınız için iletişim sayfalarına bakabilirsiniz.

Kaynaklar ve ilgili belgeler

Bunlar da ilginizi çekebilir