İçindekiler

Büyük strateji oynayan herkes haritanın başında saatler geçirmiştir. Ordular haritada yürür, vergi haritadan toplanır, bir nehir saldırıyı yavaşlatır, bir boğaz iki kıtayı birbirine bağlar. Bu türde harita bir arka plan resmi değildir, oyunun tahtasıdır.
MKA Engine için bu tahtayı gerçek dünya verisinden kendimiz ürettik. Bu yazıda, bir oyuncunun gözünden başlayıp bir geliştiricinin merak edeceği ayrıntıya inerek, haritanın nasıl yapıldığını anlatıyoruz. İlk deneme yılı olarak 1337'yi seçtik. Yazıdaki her sayı bu haritadan ölçüldü.
- 27.357 konum 21.622 kara, 5.735 deniz ve göl
- 16.384 × 8.192 piksel 45. enlemde bir piksel yaklaşık 1,7 km
- 410 milyon 1337 nüfus tahmini 21.622 kara konumuna dağıtıldı
- 3,4 sn haritanın motora girişi iki kurulum bayt bayt aynı
Harita oyunun içinde ne işe yarar?
Haritayı bir satranç tahtası gibi düşünün; yalnız kareler eşit değil. Her konum tahtadaki bir karedir: bir arazisi (ova, tepe, dağ), bir bitki örtüsü (orman, tarla, bozkır), bir iklimi ve bir nüfusu vardır. Bir ordu bir konumdan komşusuna yürür. Aradaki sınır bir nehri geçiyorsa yürüyüş zorlaşır. Kara ile kara arasında dar bir deniz varsa ordu boğazdan geçebilir.
Motor açısından harita bir ağdır. Düğümler konumlar, kenarlar komşuluklardır. Bir kenar ek bilgi taşıyabilir: nehir geçişi, boğaz, kanal ya da gemiyle gidilebilen nehir. Motor bu ağın üstünde yol bulur, mesafe ölçer, ikmal hattı kurar. Hangi arazinin savaşta ne kadar ceza verdiğine ise oyun karar verir; motor "dağ" kelimesini bilmez, yalnız oyunun tanımladığı arazi türlerini taşır.
Önce gerçek veri, ama yalnız izinli olanı
İlk kural basitti: haritaya giren her veri, ticari bir oyunda kullanılmasına izin veren bir lisansla gelmeli. Kamu malı, CC0 ve CC BY verileri kabul ettik. Ticari kullanımı yasaklayan (NC) ya da türevi aynı lisansla paylaşmayı zorunlu kılan verileri baştan eledik. Bu yüzden bazı ünlü kaynakları kullanmadık; örneğin WorldClim iklim verisi ve OpenStreetMap kıyı çizgileri bu elemeden geçemedi.
| Katman | Kaynak | Lisans |
|---|---|---|
| Yükseklik ve deniz derinliği | NOAA ETOPO 2022 | CC0 |
| Kıyı, göl, buzul, günümüz ülke sınırları, deniz adları | Natural Earth | Kamu malı |
| Nehirler | HydroRIVERS (HydroSHEDS) | HydroSHEDS lisansı; yalnız türev |
| Büyük göller | HydroLAKES | CC BY 4.0 |
| Doğal bitki örtüsü | RESOLVE Ecoregions 2017 | CC BY 4.0 |
| 1337'de açılmış tarım arazisi | KK10 (Kaplan ve Krumhardt) | CC BY 3.0 |
| İklim kuşağı | Köppen-Geiger (Beck ve ark. 2023) | CC BY 4.0 |
| Ülke nüfusu | Maddison Project 2023 | CC BY 4.0 |
| Tarihsel şehir nüfusu | Chandler (Reba ve ark. 2016), Buringh | CC BY 4.0, CC0 |
| Yer adları | GeoNames | CC BY 4.0 |
Her dosya, indirildiği gün sabitlenmiş bir parmak iziyle kaydediliyor. Kaynaktaki dosya değişirse boru hattı bunu fark ediyor ve durduruyor.
Dünyayı düz bir kâğıda sermek
Küreyi düz bir dikdörtgene sermenin kusursuz bir yolu yoktur; her izdüşüm bir şeyi bozar. Biz Gall stereografik izdüşümünü seçtik. Boylamlar düz ve eşit aralıklıdır, bu yüzden haritanın doğu ucu batı ucuna dikişsiz bağlanır ve Pasifik'te dolaşan bir gemi haritanın kenarına takılmaz. 45. enlem civarında, yani Avrupa'nın, Anadolu'nun ve Çin'in büyük kısmında, ölçek doğrudur. Kutuplara doğru şişme, sık kullanılan düz enlem-boylam haritasından azdır.
Harita 16.384 × 8.192 pikseldir ve yaklaşık 75° kuzey ile 56° güney arasını kapsar. Horn Burnu içeride kalır, Antarktika ve Svalbard dışarıda.
Geliştiriciler için bir ayrıntı: bütün katmanları önce düz enlem-boylam ızgarasında üretiyoruz, izdüşümü en son adımda uyguluyoruz. İzdüşümü değiştirmek istersek yalnız son adımı yeniden koşuyoruz. Motor da mesafeyi düz haritada ölçmüyor. Her konumun küre üzerindeki konumu kilometre cinsinden verildiği için iki konum arasındaki uzaklık her enlemde gerçeğe yakın çıkıyor.
Arazi: ova, tepe, dağ

Bir yerin dağ mı ova mı olduğunu yalnız yüksekliğe bakarak anlayamazsınız. Konya Ovası deniz seviyesinden 1.000 metre yüksektir ama dümdüzdür. Bu yüzden her noktanın çevresindeki en yüksek ve en alçak yer arasındaki farka bakıyoruz. Fark küçükse ova, ortaysa tepe, büyükse dağ. Yüksek ama düz yerler yayla oluyor.
Bitki örtüsü iki katmandan geliyor. Doğal bitki örtüsü bugünkü ekolojik bölgelerden alınıyor: orman, bozkır, çöl, tundra. Sonra KK10 verisine bakıyoruz. Bu veri, insanların geçmişte hangi oranda ormanı açıp tarla yaptığını yıl yıl tahmin ediyor. 1337'de açılmış arazi payı yüksek olan yerler tarla oluyor, yarı açılmış yerler ağaçlık. Aynı yöntem 1836 haritasında başka bir sonuç verecek.
Kara konumlarının bitki örtüsü (1337) (konum)
| Etiket | Konum |
|---|---|
| Tarla | 7.666 |
| Bozkır ve çayır | 4.718 |
| Ağaçlık | 3.227 |
| Orman | 2.100 |
| Tropik orman | 1.966 |
| Çöl | 1.471 |
| Tundra | 432 |
Bazı konumlara hiç girilemiyor: buzullar, ortalama yüksekliği 5.000 metreyi aşan dağlar ve neredeyse kimsenin yaşamadığı çöller. 1337 haritasında böyle 674 konum var. Kapak görselindeki gri alanlar bunlar.
Haritayı konumlara bölmek
İşin en zor kısmı bu. Bir pastayı dilimlere ayırdığınızı düşünün, ama bıçağı istediğiniz yerden geçiremiyorsunuz. Dilimler aşağı yukarı eşit olmalı, her biri tek parça kalmalı ve kesikler mümkünse doğal çizgilerden geçmeli: nehirden, dağ sırtından, kıyıdan.

Yöntem şöyle işliyor:
- Önce konumların merkezleri seçiliyor. 1337'de nüfusu 10 bini aşan bilinen şehirler kendi konumlarının merkezi oluyor. Kalan merkezler nüfusa göre dağılıyor: kalabalık yerlerde konumlar küçük, seyrek yerlerde büyük.
- Her merkezden su gibi taşan bir dolum başlıyor (bu yönteme "havza" bölümlemesi deniyor). Nehir, sırt ve kıyı bu dolum için yokuş gibi davranıyor; dolumlar en çok bu çizgilerde karşılaşıyor. Sınırlar da oraya oturuyor.
- Şehir olmayan merkezler iki kez kendi konumlarının ortasına kaydırılıp dolum tekrarlanıyor. Böylece konumlar daha yuvarlak oluyor.
- Kalan küçük kırıntılar komşuya katılıyor, her konumun tek parça olduğu denetleniyor.
Denizde de aynı yöntem kullanılıyor, yalnız hedef büyüklük farklı. Kıyıda ve boğazlarda küçük, açık okyanusta büyük deniz konumları çıkıyor. Görselde İstanbul ve Çanakkale boğazlarının çevresindeki küçük deniz konumlarını görebilirsiniz.
| Ölçü | Sonuç |
|---|---|
| Kara konumu sayısı | 21.622 |
| Deniz ve göl konumu sayısı | 5.735 |
| Kara konumunun ortanca alanı | 2.313 km² |
| Nehir üstüne oturan kara sınırı | %28,8 |
| Dağ sırtına oturan kara sınırı | %20,3 |
| Kıyıya oturan kara sınırı | %15,1 |
| Birden çok parçalı konum | 0 |
Bölümlemeyi aynı veriden iki kez koşturduk; iki çıktı bayt bayt aynıydı.
Konumdan eyalete, bölgeden alt kıtaya
Oyuncu 27 bin konumu tek tek yönetmez. Konumlar gruplanır ve gruplar daha büyük gruplara katılır. Bizim haritada dört düzey var: yaklaşık beşer konumluk eyaletler (5.181), onlardan alanlar (912), bölgeler (131) ve alt kıtalar (19).

Gruplar, komşu konumlar adım adım birleştirilerek kuruluyor. Her adımda en uygun komşu çifti seçiliyor. Gruplar derli toplu olsun, benzer büyüklükte kalsın diye uğraşıyoruz. İki konum farklı iklim kuşağındaysa ya da bugünkü bir ülke sınırının iki yanında kalıyorsa birleşmeleri zorlaşıyor. Kara ve deniz hiçbir düzeyde karışmıyor.
Her konumun ve her grubun bir adı ve kalıcı bir anahtarı var: istanbul, canakkale, kobenhaven. Adlar GeoNames'teki yerleşim adlarından geliyor. Bu bir modcu için önemli: harita yeniden üretildiğinde anahtarlar korunuyor. Bir konumun merkezi biraz kaysa bile denememizde anahtarların en az %95'i yerinde kaldı. Kullanılmış bir anahtar başka bir yere verilmiyor; böylece eski bir mod yanlış konumu değiştirmiyor.
Nehirler, boğazlar ve kanallar
Nehirler HydroRIVERS verisinden geliyor. Yeterince büyük bir nehri geçen her kara sınırı "nehir geçişi" olarak işaretleniyor. Ayrıca 1337'de gemiyle taşımacılık yapılan 27 büyük nehri tek tek seçtik: Tuna, Ren, Volga, Nil, Fırat, Dicle, Yangçe, Ganj ve diğerleri. Bunların akışı boyunca 3.036 kara sınırı "su yolu" olarak işaretlendi.
Boğazların bir kısmını adıyla biz tanımladık: İstanbul Boğazı, Çanakkale Boğazı, Cebelitarık, Øresund ve Babülmendep. Gerisini boru hattı buluyor: iki ayrı kara parçası arasında 35 kilometreden kısa bir su geçişi varsa, bu bir boğaz adayıdır. Her kara parçası çifti için yalnız en kısa geçiş alınıyor. Bu kuralla 1.168 boğaz daha çıktı. Süveyş ve Panama ise "kanal" olarak işaretli. 1337'de ikisi de yok; ne zaman açılacaklarına oyun karar verecek.
1337'de dünyada kaç kişi vardı?
Kimse kesin bilmiyor; tarihçilerin tahminleri var. Biz şöyle ilerledik:
- Ülke toplamlarını Maddison Project'ten aldık. Maddison'da rakamı olmayan 134 ülke var. Bunların nüfusunu, aynı alt bölgede rakamı bilinen ülkelerin aynı iklim kuşağındaki nüfus yoğunluğundan tahmin ettik ve kayıtta tahmin olarak işaretledik.
- Bilinen şehirleri Chandler ve Buringh derlemelerinden yerlerine koyduk.
- Kalan kırsal nüfusu kara konumlarına dağıttık. Tarla, ova, nehir kenarı ve kıyı daha çok insan çekiyor; dağ, çöl ve tundra daha az.
Sonuç: 1337 için dünya nüfusu yaklaşık 410 milyon. McEvedy ve Jones'un tanınmış tarihsel nüfus atlası 1340 için 443 milyon veriyor; bizim tahminimiz bunun %7,4 altında. Bu atlası yalnız karşılaştırma için kullandık; haritaya girmedi.
Aynı veriden aynı harita
Çok oyunculu bir strateji oyununda her oyuncunun bilgisayarı dünyayı kendisi hesaplar. Bu yüzden haritanın da herkeste aynı olması gerekir. Bir konumun sınırı bir bilgisayarda bir piksel kaysa, birkaç oyun yılı sonra iki oyuncu farklı dünyalarda oynuyor olabilir. Bunu Çok oyunculu ve tutarlılık günlüğünde ayrıntılı anlattık.
Haritanın her adımı bu yüzden tekrarlanabilir. Rastgele görünen her seçim sabit bir tohumdan geliyor. Harita paketi motora bsm map build aracıyla giriyor. Bu araç konumları ekranda yakın duranlar bellekte de yakın dursun diye yeniden numaralandırıyor, komşulukları ve sınır uzunluklarını çıkarıyor, motorun okuyacağı tabloları yazıyor. Tam harita için bu 3,4 saniye sürüyor. Aracı iki kez çalıştırdık; iki çıktı bayt bayt aynıydı.
Ekranda: Godot
Haritayı ekranda görmek için Godot 4.7 ile küçük bir görüntüleyici yazdık. Fikir, büyük strateji oyunlarının çoğunda kullanılan fikirle aynı: haritadaki her piksel, ait olduğu konumun numarasını taşıyan bir doku. Ekran kartı her pikselde bu numaraya bakıyor ve küçük bir renk tablosundan o konumun rengini alıyor. Bir konumun sahibi ya da harita kipi değişince yalnız renk tablosu değişiyor; yaklaşık 270 MB'lık harita dokusuna dokunulmuyor. Sınırlar da aynı şekilde çiziliyor: bir pikselin komşusundaki numara farklıysa orası sınırdır.
| Ölçüm | Sonuç |
|---|---|
| Haritanın yüklenmesi | 0,5 saniye |
| Ekran kartı belleği | 280 MB |
| Bir karenin süresi, bütün dünya görünürken | 5,2–5,7 ms |
| Bir karenin süresi, yakın planda | 1,3–1,4 ms |
Ölçümler, ayrı ekran kartı olmayan bir bilgisayarda, işlemcinin içindeki AMD Radeon grafik biriminde yapıldı. Bilgisayar ölçüm sırasında başka işlerle de meşguldü. Bu görüntüleyici bir oyun ön yüzü değil, haritayı denetlemek için bir araç.
Neler eksik?
Haritanın bugünkü hâli bir deneme ve eksiklerini saklamıyoruz:
- Geçilmez çöller fazla geniş. Sahra, Arabistan ve Avustralya'nın içi neredeyse tamamen gri. Gerçekte 1337'de bu çöllerden kervanlar geçiyordu. Eşiği ayarlayacağız.
- Hazar Denizi ve Sibirya gölleri en yakın deniz bölgesi olan Akdeniz bölgesine katılıyor. Göllerin kendi bölgeleri olmalı.
- Siyasi sınır yok. 1337 için ticari kullanıma izinli tarihsel sınır verisi bulamadık. Ülkeler ve sınırları, oyunun içeriği olarak elle kurulacak.
- Hava durumu haritada değil. Mevsimler ve hava değişen şeyler. Bunları sabit bir haritaya gömmek yerine motorun hesaplamasına bıraktık. Haritada yalnız her konumun iklim kuşağı var.
- 1836 haritası henüz yok. Yöntem hazır, ikinci yıl için verileri değiştirip yeniden koşturmak gerekiyor.
Henüz oynanabilir bir oyun yok. Bu harita, motorun gerçek boyutta bir dünyayı taşıyıp taşıyamadığını sınamak için yapıldı ve sınavı geçti: 27 bin konumluk dünya motora birkaç saniyede giriyor, ekranda da akıcı çiziliyor.
MKA Engine'in genel durumunu MKA Engine sayfasında, motorun neden ve nasıl yazıldığını Oyun motoruna giden yol yazısında bulabilirsiniz.
Kaynaklar
- NOAA National Centers for Environmental Information (2022): ETOPO 2022 Global Relief Model (30 açı saniyelik sürüm), doi:10.25921/fd45-gt74.
- Natural Earth (naturalearthdata.com), 10m fiziki ve kültürel katmanlar.
- Lehner, B. ve Grill, G. (2013): Global river hydrography and network routing: baseline data and new approaches to study the world's large river systems. Hydrological Processes 27(15). HydroRIVERS, HydroSHEDS lisansıyla.
- Messager, M. L. ve ark. (2016): Estimating the volume and age of water stored in global lakes using a geo-statistical approach. Nature Communications 7:13603 (HydroLAKES).
- Dinerstein, E. ve ark. (2017): An Ecoregion-Based Approach to Protecting Half the Terrestrial Realm. BioScience 67(6) (RESOLVE Ecoregions 2017).
- Kaplan, J. O. ve Krumhardt, K. M. (2011): KK10 tarihsel arazi kullanımı, PANGAEA, doi:10.1594/PANGAEA.871369.
- Beck, H. E. ve ark. (2023): High-resolution (1 km) Köppen-Geiger maps for 1901–2099 based on constrained CMIP6 projections. Scientific Data 10:724.
- Bolt, J. ve van Zanden, J. L. (2024): Maddison Project Database 2023.
- Reba, M., Reitsma, F. ve Seto, K. C. (2016): Spatializing 6,000 years of global urbanization from 3700 BC to AD 2000. Scientific Data 3:160034 (Chandler verisi).
- Buringh, E.: European urban population, 700–2000, DANS, doi:10.17026/dans-xzy-u62q.
- GeoNames (geonames.org), cities1000, 14 Ekim 2026 dökümü.
- McEvedy, C. ve Jones, R. (1978): Atlas of World Population History (yalnız karşılaştırma).
Kaynaklar ve ilgili belgeler
- NOAA ETOPO 2022 (yükseklik)
- Natural Earth
- HydroSHEDS: HydroRIVERS (Lehner ve Grill 2013), HydroLAKES (Messager ve ark. 2016)
- RESOLVE Ecoregions 2017 (Dinerstein ve ark. 2017)
- KK10 tarihsel arazi kullanımı (Kaplan ve Krumhardt 2011)
- Köppen-Geiger iklim kuşakları (Beck ve ark. 2023)
- Maddison Project Database 2023
- Tarihsel şehir nüfusları (Reba, Reitsma ve Seto 2016)
- Buringh, Avrupa şehir nüfusu 700–2000
- GeoNames
- MKA Engine
Bunlar da ilginizi çekebilir
- Oyun motoruna giden yol
MKA Engine'e nasıl başladık: dört oyunu okumak, belirlenimciliği yasa saymak, aşama aşama ölçerek ilerlemek ve şu an neredeyiz.
- Atatürk'ün gösterdiği yol ve bizim çalışma biçimimiz
Bilime dayanmak, belirleyici olanı elde tutmak, yapabileceğine inanıp çalışmak: Atatürk'ün gösterdiği yolun MKA Engine'deki karşılığı.