Geliştirici Günlükleri

MKA Engine'i geliştirirken tuttuğumuz günlükler: neyi neden böyle kurduğumuz ve ne ölçtüğümüz.

MKA Engine'i geliştirirken tuttuğumuz günlükler. Her günlükte bir kararı, nedenini ve ölçtüğümüz sonucu yazıyoruz. Motorun kendisi için MKA Engine sayfasına bakın.

Geliştirici Günlükleri

Geliştirici Günlüğü #30: Artık yıllı takvim ve oyun zamanı

· Ayrı sayfada aç

Strateji haritası üzerinde, düzenli gün döngüsü ile fazladan bir günü çağrıştıran ayrı bir zaman akışı. Ölçeksiz kavramsal çizim; tarih veya gün sayısı şeması değildir.

Kısaca: MKA Engine artık bir oyun için iki takvim seçeneği sunuyor: her yılı 365 gün sayan takvim ve artık yıllı Gregoryen takvim. Oyun başlangıcında seçilen takvim oyun kaydına yazılıyor; böylece şubatın 29 gün çektiği yıllar, tarih ilerleyişi ve kayıtlı dünyanın takvim kuralı aynı kalıyor.

Sorun ne idi?

Önceki günlüklerimizde oyun zamanının bilgisayar saatinden bağımsız yürüdüğünü ve ay ya da yıl başında çalışan işleri motorun nasıl zamanladığını anlatmıştık. Takvim, bu işlerin zeminidir. Bir imparatorlukta yıl dönümü, vergi dönemi veya tarihî bir olay doğru güne bağlanacaksa, oyunun hangi takvimle ilerlediği de açık olmalı.

İlk sürümde motorun yılı hep 365 gündü. Her yıl aynı uzunlukta olduğu için kurması kolay bir takvimdi; ancak gerçek dünyadaki Gregoryen takvimini kullanan bir oyun için artık günü ifade edemiyordu. Bir takvimde tarih hesabının bir gün kayması, sonraki ay ve yıl başlangıçlarının da kayması demektir. Bu fark yalnız takvim ekranında görünmez: tarihe bağlı olayların ve aylık ya da yıllık işlerin ne zaman çalışacağını da etkileyebilir.

Bunu bir masa oyununun takvim kuralı gibi düşünebiliriz. Oyuncular aynı haritayı paylaşsa bile yılın uzunluğu oyun başlamadan belli olmalıdır. Birisi 28 Şubat’tan sonra doğrudan 1 Mart’a geçerken diğeri 29 Şubat’ı oynarsa, ikisinin “bugün” dediği an artık aynı değildir. Motorun hangi kuralı kullandığını bilmesi ve bu kuralı oyun boyunca değiştirmemesi gerekir.

Nasıl çözdük?

Önce takvimi oyunun kendi seçimi yaptık. MKA Engine’de varsayılan seçenek, artık gün içermeyen 365 günlük takvimdir. İkinci seçenek Gregoryen takvimdir. Bu takvimde dörtle bölünen yıllar artık yıldır; yüzle tam bölünen yıllar bu kuralın dışındadır; dört yüze tam bölünen yıllar yeniden artık yıl sayılır. Örneğin 2000 artık yıldır, 1900 değildir. Bu kural şubat ayını gerektiğinde 29 güne çıkarır.

Burada “Gregoryen” derken yalnız güncel tarih görüntüsünden söz etmiyoruz. Oyun günü sayısı yıl, ay ve güne çevrilirken seçilen takvim kullanılır. Bir aylık adım, ayın ilk gününde biter; sonraki ayın başlangıcı da aynı takvim kuralından bulunur. Yıllık zamanlamalar ve takvim dönemlerine bağlı hesaplar da yıl başlangıcını bu seçime göre bulur. Böylece tarih yazımı ile simülasyonun ilerleyişi birbirinden kopmaz.

Türkçe şema: 365 günlük takvimde 28 Şubat'tan 1 Mart'a geçiş; Gregoryen artık yılda 28 Şubat, 29 Şubat ve 1 Mart sırası. Yüzyıl istisnasında 1900 artık yıl değil, dört yüze bölünen 2000 artık yıldır. Tarih akışları ölçeksizdir.

Takvim seçimi oyun hazırlanırken yapılır. Oyunun başlangıç tarihi, bir takvim kuralıyla yorumlanır ve motor adımları bu kurala göre yürütür. Her adımın günü, haftası, ayı ve yılı aynı kaynaktan hesaplanır. Bir oyunun 365 günlük düzeni seçmesi de Gregoryen düzeni seçmesi de mümkündür; motor bu tercihi kendiliğinden değiştirmez.

Seçim kayda da eşlik eder. Kaydetme sırasında takvim türü, dünyanın tarihinin yanında saklanır. Yükleme yapılırken açılmak istenen oyunun takvimi kayıtla karşılaştırılır. Seçimler farklıysa yükleme reddedilir. Bu, aynı gün sayısının farklı takvimlerde farklı ay ve yıla denk gelebilmesinden kaynaklanır. Bu durumda motor takvim uyuşmazlığı hatası döndürür.

Oyunun takvim seçimini kayıt defterine taşıyan kavramsal atlas ve arşiv kitabı; farklı takvim işaretleri kayıt uyumsuzluğunu simgeliyor. Ölçekli ya da sayısal bir şema değildir.

Eski kayıtları da hesaba kattık. Takvim türü kayıtlara eklenmeden önce oluşturulmuş kayıtların seçilmiş bir artık yıl kuralı yoktu. Bu nedenle eski biçimden yeni biçime geçerken 365 günlük takvim varsayılır. Eski kayıt böylece bugünkü varsayılan takvimle devam eder; geçmişte var olmayan bir artık gün kuralı ona sonradan yüklenmez.

Ne gördük?

Takvim kurallarını sınarken normal yılların ve artık yılların sınırlarını ayrı ayrı kontrol ettik. Dört yıllık kuralı, yüzyıl istisnasını ve dört yüz yıllık istisnayı doğruladık. Bir tarihi gün sayısına çevirip yeniden yıl, ay ve güne dönmenin ay ve yıl sınırlarında aynı tarihi verdiğini de kontrol ettik. Bu doğrulama, takvim hesabının yalnız bilinen birkaç örnekte değil, art arda gelen günlerde de kendi içinde tutarlı olduğunu gösteriyor.

Motorun zaman hesabında da yeni takvim seçeneğini kullandık. Aylık adımın bir sonraki ayın ilk gününde bitmesi, takvim başlangıcına bağlı yıllık işlerin doğru yılda çalışması ve artık günün tarih dizisine katılması kod ve sınamalarla doğrulandı. Bu bir hız ölçümü değil; takvimin tarih ve zamanlama sonuçlarına dair işlevsel doğrulamadır.

Günlük kullanımda farkı en kolay şubatta görürüz. 365 günlük takvimde her yıl şubat 28 gündür. Gregoryen takvimdeyse artık yıl kuralına uyan yılda şubatın 29. günü vardır. Bu ek gün, o yılın ardından gelen tarihler için de önem taşır: motorun sonraki ay ve yıl başlangıçlarını doğru güne yerleştirmesi gerekir.

Neden böyle seçtik?

Tek bir sabit takvim, motorun ilk sürümünü yalın tutuyordu; #1’de de bu tercihi açıkça anlatmıştık. Fakat her strateji oyununun zamanı aynı biçimde düşünmesi gerekmiyor. Bazı oyunlar düzenli, her yılı eşit uzunlukta bir oyun takvimi isteyebilir. Bazılarıysa artık yılları olan Gregoryen takvimle tarihleri takip etmek isteyebilir. Seçimi oyuna bırakmak, motorun tek bir tarih anlayışını her projeye dayatmasını önlüyor.

Diğer uçta, takvimi yükleme anında serbestçe değiştirmek vardı. Bunu seçmedik. Kayıt yalnızca “kaç gün geçti” bilgisini değil, o günlerin hangi takvimle yıl ve aya dönüştüğünü de temsil eder. Takvim değiştiğinde aynı gün sayısının ekranda görünen tarihi değişebilir; tarihe bağlı işlerin gelecek zamanı da farklılaşabilir. Bu yüzden kayıt kendi takvim seçimini korur ve farklı takvimde açılmayı kabul etmez.

Bu konu #19’daki zamanlama anlatımına yakındır ama onun tekrarı değildir. #19, bir işin günlük, aylık veya yıllık ne zaman çağrıldığını ve uzun oyun adımlarında bu çağrıların nasıl ele alındığını anlatıyordu. Bu günlük, o zamanlamaların dayandığı “yıl ve ay hangi takvime göre hesaplanıyor?” sorusuna odaklanıyor. Takvim kuralı zamanı tanımlar; oyun veya mod ise hangi işi hangi dönemde çalıştıracağını seçer.

Bedeli ne?

Oyunun seçtiği takvim, kayıtla birlikte korunur; başka takvimle devam etmek isteyen oyuncu aynı kaydı o farklı kural altında açamaz. Bu sınır, tarihin ve dönem başlangıçlarının sessizce değişmesini önler.

Sırada ne var?

Bir takvimde günleri doğru saymak, strateji dünyasının tarihini güvenilir kılar.

Sık sorulanlar

MKA Engine artık yılları nasıl belirliyor?

Gregoryen takvimde dörtle bölünen yıllar artık yıldır; yüzle tam bölünen yıllar, dört yüze de tam bölünmüyorsa artık yıl değildir. Buna göre 2000 artık yıldır, 1900 değildir.

Her oyun Gregoryen takvimi kullanmak zorunda mı?

Hayır. Oyun, her yılı 365 gün sayan takvimi veya artık yıllı Gregoryen takvimi seçebilir. Varsayılan seçenek 365 günlük takvimdir.

Bir kayıt başka takvim seçilerek açılabilir mi?

Hayır. Kayıt kendi takvim türünü taşır ve yükleme sırasında mevcut oyun seçimiyle karşılaştırılır. Takvimler farklıysa motor takvim uyuşmazlığı hatası döndürür.

Eski kayıtlar hangi takvimle sürdürülür?

Takvim seçiminin kaydedilmesinden önceki eski biçimler 365 günlük takvimle yorumlanır. Böylece eski kayıtlar için geriye dönük yeni bir artık gün kuralı varsayılmaz.

Bağlantılar