Geliştirici Günlüğü #8: Oyun motorunda mod desteği

Kısaca: MKA Engine'de oyunun kendisi de bir mod; oyun ve modlar motora aynı kapıdan bağlanır. Bir mod yazarı üç düzeyde çalışabilir: metin dosyalarıyla içerik yazar, betiklerle kural yazar, WebAssembly ile yeni sistemler yazar. Bu günlükte bugün neye erişilebildiğini, neyin yapım aşamasında olduğunu ve modların çok oyunculuda neden aynı çıkması gerektiğini anlatıyoruz.
Bir strateji oyununu oynayanlar için mod çoğu zaman şu demektir: yeni bir olay, yeni bir ülke, yeni bir birim ya da oyunun kuralını değiştiren bir ayar. Bir oyun motoru için ise mod desteği bir sorudur: oyunun dışından gelen biri, motorun hangi parçasına, hangi yoldan dokunabilir? Bu günlükte o sorunun bugünkü yanıtını kabaca veriyoruz. Ayrıntılar, yani hangi erişimin nasıl işlediği, ilerideki günlüklerin konusu.
Oyun da bir mod
MKA Engine'in en temel tasarım kararlarından biri şu: oyunun kendisi de bir mod. Motor, oyuna özel bir şey bilmez; tabloları, sistemleri ve kuralları oyun getirir. Oyun motora hangi yoldan bağlanıyorsa mod da aynı yoldan bağlanır. Bunun iki faydası var. Birincisi, modcunun elindeki güç, oyunu yazanın gücünden uzak kalmaz. İkincisi, mod yolu bizim deneme oyunumuzla sınanır; yani yalnızca kâğıt üzerinde duran bir yol değildir.
Üç düzey
Bir atölyeyi düşünün. Bir kâtip harita üzerindeki kartları ve fermanları düzenliyor; bir usta ise haritanın altındaki mekanizmaya yeni bir dişli takıyor. Modlar da böyle iki ayrı iş yapar, arada bir de kural yazma işi var:
| Düzey | Ne yazılır | Neye dokunur |
|---|---|---|
| İçerik | Metin dosyaları (.bsm) | Olaylar, kararlar, çarpanlar, eşyalar, teknolojiler ve oyunun başka içerik türleri |
| Kural | Koşul, etki ve formül betikleri | "Bu ülke zengin mi?", "vergi topla", "bu bölgenin geliri ne kadar?" gibi kurallar |
| Kod | WebAssembly modülü | Yeni tablolar ve alanlar, yeni sistemler, komutlar, kancalar, zamanlayıcılar |
İçerik. En kolay düzey. Bir mod, oyunun içerik klasörlerine dosya koyar. Bir sonraki mod, öncekinin kaydını değiştirebilir: tümünü yeniden yazabilir, tek bir alanını değiştirebilir ya da silebilir. Modlar yükleme sırasına göre işlenir ve bu sıra her bilgisayarda aynıdır. İki mod aynı kaydı değiştirirse motor çakışmayı raporlar; sonra gelen mod kazanır. Hatalar dosya adı, satır ve sütunla bildirilir; bozuk bir dosya motoru çökertmez.
Kural. Koşul bir şeyin doğru olup olmadığını sınar, etki oyunun durumunu değiştirir, formül bir sayı üretir. Günlük #5'te bu dili anlattık. Mod yazarı, oyunun kendi kuralları gibi aynı dille yeni kurallar yazabilir.
Kod. En güçlü düzey. Kod yazan bir mod, WebAssembly (tarayıcılarda da kullanılan, taşınabilir bir derlenmiş kod biçimi) modülü olarak gelir. Bu modül motora yeni tablolar ve alanlar kaydedebilir, her gün çalışacak sistemler ekleyebilir, komut türleri ve kancalar tanımlayabilir, zamanlayıcı kurabilir. Büyük sütunları tek çağrıda okuyup yazabilir. Rastgele sayıyı da motorun kendi kaynağından alır; böylece sonuç her makinede aynı çıkar.
Kodlu modlar neden güvenli çalışır?
Bir moda kendi kodunu çalıştırma izni vermek, ona kötü yazılmış bir döngüyle oyunu kilitleme izni de vermek olabilir. Bu yüzden WebAssembly modülü bir cam kasanın içinde çalışır: sandbox (yalıtılmış çalışma alanı). Kasanın kuralları şunlar:
- Her çağrının bir komut sınırı var. Varsayılan sınır çağrı başına 10.000.000 komut; aşan mod kapatılır. Komutlar sayıldığı için sınır her makinede aynıdır.
- Bellek de sınırlı.
- Hatalı kimlik, hatalı değer ya da yazma izni olmayan bir alana yazma çalışmayı durdurur. Motor hatayı modun adı ve sistemiyle birlikte bildirir; oyun çökmez.
- Kodun saati, dosyayı ya da ağı yok; zamanı ve rastgeleliği yalnız motordan alır.
Modlar neden aynı olmak zorunda?
Çok oyunculu bir strateji oyununda her bilgisayar aynı simülasyonu kendi başına çalıştırır; ağdan yalnız komutlar gider. Bu yüzden iki oyuncunun mod seti farklıysa bir süre sonra iki farklı dünya oluşur (Günlük #2). Motor mod setini, içerik dosyalarından ve derlenmiş modüllerden hesaplanan sayısal bir özetle tanır; özet tamsayı hesabıyla çıktığı için her platformda aynıdır. Kayıt dosyasına da hangi mod setiyle oynandığı yazılır. Yani bir kaydı yüklerken "bu oyun hangi modlarla oynandı?" sorusunun yanıtı hazırdır.
Bugün nelere erişilebiliyor?
Kabaca şöyle:
- İçerik ve kural dili: olaylar, kararlar, çarpanlar, eylemler ve oyunun tanımladığı içerik türleri.
- Kod tarafında: harita, cephe ve savaş, taşıma ağı, deniz hâkimiyeti ve yapay zekâ gibi düzenekler. Ayrıca çarpanlar, olaylar, zamanlayıcılar, betik değişkenleri ve bildirimler (bunları Günlük #6'da anlattık).
- Yeni veri: modlar kendi tablolarını ve alanlarını ekleyebilir; bunlar da motorun kendi depolama düzenine (Günlük #3) girer.
Yapım aşamasında olanlar da var. Motorda çalışan pazar, üretim, nüfus, aile ve hiyerarşi düzenekleri henüz kod yazan modlara açılmış değil; görüş, savaş sisi ve keşif gibi işler de sırada. Bu açılışlar planladığımız çalışmaların parçası ve ilerledikçe yeni günlüklerde paylaşacağız.
Bu günlüğün sınırları
- Bu bir erişim özeti, tam bir mod kılavuzu değil. Hangi düzeneğin nasıl kullanıldığını sonraki günlüklerde ayrı ayrı anlatacağız.
- Anlatılanlar bugünkü motorun durumu. Yapım aşamasındakiler bitince tablo değişecek.
- Ölçüm içermiyor; bu günlükte yalnız yapıyı ve sınırları anlattık.
Sık sorulanlar
Oyun motorunda mod desteği nasıl çalışır?
Mod, motora oyunla aynı kapıdan bağlanır. MKA Engine'de bir mod metin dosyalarıyla içerik, betiklerle kural ve WebAssembly modülüyle yeni sistemler getirebilir.
WebAssembly modları oyunu çökertebilir mi?
Hayır. Kodlu mod, komut ve bellek sınırı olan yalıtılmış bir alanda çalışır. Sınırı aşan ya da hatalı çalışan mod durdurulur ve motor hatayı modun adıyla bildirir.
Mod seti farklıysa çok oyunculuda ne olur?
Her bilgisayar aynı simülasyonu çalıştırdığı için mod setinin aynı olması gerekir. Motor mod setini bir özet sayıyla tanır ve kayıt dosyasına yazar.
İki mod aynı şeyi değiştirirse ne olur?
Modlar belirlenimci bir sırayla yüklenir. Motor çakışmayı raporlar, sonra yüklenen mod kazanır.
Kaynaklar
- Vikipedi, WebAssembly (yeni sekmede açılır)
- Vikipedi, Video game modding (oyun modlama) (yeni sekmede açılır)
- Vikipedi, Sandbox (computer security) (yalıtılmış çalışma alanı) (yeni sekmede açılır))
Bu konuda daha fazlası gelecek
Mod desteği ve oyun durumları üzerine daha çok çalışma planlıyoruz. Bunları yeni günlüklerle paylaşacağız.
Sorularınız ya da önerileriniz için iletişim sayfasından bize yazabilirsiniz. Motorun tanıtımı için MKA Engine sayfasına, tüm günlükler için Geliştirici Günlükleri listesine bakabilirsiniz.