Geliştirici Günlüğü #31: Modlara oyun takvimini sunmak

Kısaca: MKA Engine, oyunun seçtiği takvim bilgisini modlara sunar ve harita iklimini motorun takvim seçimine bağlar. Modun tarihi oyunla aynı kurala göre yorumlaması, mod yazarının bu bilgiyi tarih hesabında kullanmasına bağlıdır.
Sorun ne idi?
Mod, oyuna yeni kural veya içerik ekleyen bir eklentidir. Bir modun belirli bir tarihte olay başlatması ya da bir dönemi tanıması için o günün hangi ay ve yıla denk geldiğini bilmesi gerekir. Ancak geçen oyun günlerinin sayısı tek başına bunu söylemez: 365 günlük takvimde 28 Şubat'tan sonra 1 Mart gelir; artık yıllı Gregoryen takvimde arada 29 Şubat da vardır.
Günlüğün #30'unda takvim seçiminin oyun düzeyinde yapıldığını, tarihin ve kaydın bu seçime bağlı olduğunu anlattık. Bir sonraki soru, oyun tarihini kullanan modların da aynı tercihi nasıl göreceğiydi. Her mod kendi varsayılan yılını uygularsa, aynı oyun günü bir yerde 29 Şubat, başka bir yerde 1 Mart olarak yorumlanabilir. Bu durumda oyuncunun gördüğü tarih ile tarihe bağlı mod davranışı birbirinden ayrılır.
Mevsimler de benzer bir ilişkiye sahiptir. Haritadaki iklim, bir tarihin hangi mevsime denk geldiğini bulur. Oyun takvimi artık gün içerebiliyorsa, iklim hesabı takvim seçimini görmezden gelemez. Aksi hâlde Şubat'a eklenen gün, mevsim başlangıçlarının sonraki tarihlerde kaymış gibi görünmesine yol açabilir.
Nasıl çözdük?
Oyun çalışırken mod, o günün yanında oyunun seçtiği takvim bilgisini de edinebilir. Mod yazarı bu bilgiyi tarih hesabında kullanırsa geçen günleri yıl, ay ve güne oyunun kuralına göre çevirebilir. Böylece modun hangi takvimi kullanacağı bir tahmin olmaktan çıkar; ancak uyum, mod yazarının bu seçimi kullanmasına bağlıdır.
Bu bilgi, modun tarih hesabını kendiliğinden dönüştürmez. Mod yazarı, geçen günleri yıl, ay ve güne çevirirken oyunun verdiği takvim kuralını kullanmalıdır. Yalnızca 365 günlük yıla göre çalışan bir tarih hesabı, Gregoryen oyunda ay ve günü farklı yorumlayabilir. Motor tarihi ve takvim seçimini sağlar; hangi gün hangi olayın çalışacağına mod karar verir.
Mod yazarı, farklı oyun içi işlevlerde sunulan takvim bilgisini aynı şekilde kullanırsa bu işler tarihi ortak oyun kuralına göre yorumlayabilir. Motor seçilmiş takvimi sunar; modun bu kurala uyup uymadığını her mod için kendiliğinden garanti etmez.
İklim için de oyun takvimini esas aldık. Oyun kurulurken haritanın iklimine motorun kullandığı takvim verilir; böylece mevsim hesabı aynı yıl ve ay düzeniyle yapılır. İklim mevsimlerini ortak 365 günlük mevsim çizgisine yerleştirir. Gregoryen artık yılda 29 Şubat, mevsim hesabında 28 Şubat'ın gün konumunu alır. Bu nedenle Mart 1'e konmuş bir mevsim başlangıcı artık yılda da Mart 1'de kalır.

Burada değişen, oyunun mevsim kuralı değildir. Mevsimin hangi gün başladığını içerik belirler; motor o tarihi seçilmiş oyun takvimi üzerinden bulur. Havanın veya mevsimlerin oyun kararlarını nasıl etkilediği de oyunun kendi kurallarına bağlıdır.
Ne gördük?
Kaynakta bulunan mod sınaması, 28 Şubat 2024'ten başlayıp iki oyun adımı ilerleyen aynı örnek modun tarih dönüşümünü iki çalışma biçiminde sınamak üzere yazılmıştır. Beklenen sonuç, takvim bilgisini kullanan örneğin Gregoryen takvimde 29 Şubat, 365 günlük düzende 1 Mart görmesi ve iki farklı oyun işlevinin aynı tarihi vermesidir. Bu görevde sınama komutu çalıştırılmadı; burada aktardığımız değerler testin tanımlı beklentileridir.
Kaynakta ayrı bir motor sınaması, oyun 365 günlük takvimi seçtiğinde iklimin bu takvimi, Gregoryen takvimi seçtiğinde de Gregoryen takvimi aldığını doğrulamak üzere yazılmıştır. Bu sınamanın kapsamı iklim ile oyun takviminin eşleşmesidir; mevsim başlangıçlarının her tarihi ayrı ayrı denetlenmez. 29 Şubat'ın mevsim hesabındaki yeri ise kaynak tarih hesabında 28 Şubat'ın konumuyla eşlenir.
Neden böyle seçtik?
MKA Engine, seçilmiş takvimi modlara sunar; bu ortak bilgi, mod yazarı tarih hesabında kullandığında işe yarar. Mod kendi tarih dönüşümünde bu bilgiyi kullanırsa oyunun seçtiği takvime göre aynı günü yorumlayabilir; motor her modun uyumunu kendiliğinden sağlamaz. Harita iklimi ise motorun seçtiği takvimi alır ve mevsim hesabını bu seçimle yapar.
Bu günlük, #30'daki takvim seçeneklerini yeniden anlatmıyor. Önceki günlük hangi takvimin seçilebildiğini ve kaydın bu tercihi nasıl koruduğunu açıklıyordu. Burada odak, o seçimin modlara ve iklim hesabına nasıl ulaştığı. #13'te modların çalışma sınırlarını, #26'da nüfus ve pazar hesaplarına açılan mod işlemlerini ele almıştık; bu kez modların oyun tarihini doğru okumasına bakıyoruz.
Bedeli ne?
Mod, seçilmiş takvimi ilk tanıtım adımında kullanamaz; bilgi oyun içi işleri başladığında kullanılabilir. Modun hangi takvimi göreceğini oyunun seçimi belirler.
Sırada ne var?
Bir tarih, mod kuralları ve harita mevsimleri tarafından birlikte kullanıldığında oyunun farklı parçaları aynı zaman çizgisinde buluşur. Güvenilir bir strateji dünyası için bu ortak zeminin hangi hesaplarda kullanıldığını açıkça belirlemek önem taşır.
Sık sorulanlar
Mod oyunun takvimini kendisi mi seçer?
Takvimi oyun seçer ve motor seçimi modlara sunar. Mod, aynı takvime göre tarih hesaplamak için mod yazarının bu bilgiyi kullanmasına ihtiyaç duyar.
Gregoryen takvimde 29 Şubat mevsimi değiştirir mi?
İklim hesabı 29 Şubat'ı 28 Şubat ile aynı mevsim gününde değerlendirir. Mart 1'de başlayan mevsim de artık yılda aynı tarihte başlar.
Farklı mod çalışma biçimleri farklı tarihler mi görür?
Kaynak sınamasında, seçilmiş takvim bilgisini kullanan örnek modun iki çalışma biçiminde de aynı tarihi vermesi bekleniyor: 2024 Gregoryen takviminde 29 Şubat, 365 günlük takvimde 1 Mart. Bu görevde sınama çalıştırılmadı.
Mod daha ilk tanıtılırken takvimi okuyabilir mi?
Hayır. Mod tanıtılırken oyun takvimi bağlamı verilmez; bu bilgi oyun içi işler başladığında kullanılabilir. Bu erken aşamada takvimi okumaya çalışmak hata verir.