Oyunda kayıt dosyası sürümleme: güncelleme sonrası oyuncunun ilerlemesini silmemek
Hatanın kaynağı basitti. Birim sınıfına yeni bir alan ekledim ve kayıt dosyasını doğrudan bu sınıfın yapısından üretiyordum. Eski kayıtta bu alan yoktu, yükleyici de eksik alanla karşılaşınca hata verip duruyordu. Kendi testlerimde hep yeni kayıtla başladığım için hiç görmedim.
Şimdi kullandığım düzen şu. Her kayıt dosyasının başında bir sürüm numarası var. Kayıt yapısında her değişiklikte bu numarayı artırıyorum ve bir önceki sürümden bir sonrakine dönüştüren küçük bir fonksiyon yazıyorum. Yükleyici dosyanın sürümüne bakıyor, güncel sürüme gelene kadar dönüştürücüleri sırayla çalıştırıyor. Üç sürüm eski bir dosya üç adımda güncelleniyor. Bu yöntemi veritabanı migration'larından aldım, oyun dünyasına da birebir uyuyor.
İkinci kural: kayıt yapısını oyun içi sınıflardan ayırdım. Kayıt için ayrı, sade veri yapıları var ve oyun nesneleri bunlardan kuruluyor. Böylece kodu yeniden düzenlediğimde kayıt dosyası etkilenmiyor. Başta fazladan iş gibi geldi ama refactoring yaparken çok rahatladım.
Üçüncüsü, eski kayıtları test etmek. Her yayınlanan sürümden birkaç gerçek kayıt dosyasını bir test klasöründe saklıyorum. Otomatik test her derlemede bunları yükleyip birkaç kontrol yapıyor: oyuncunun altını doğru mu, harita yükleniyor mu, birim sayısı tutuyor mu. Geçen ayki hatayı bu test yakalardı.
Dördüncüsü, yazma sırasında bozulmaya karşı önlem. Oyun kayıt yazarken kapanırsa ya da elektrik giderse yarım bir dosya kalabiliyor. Önce geçici bir dosyaya yazıp yazma tamamlanınca asıl dosyanın yerine koymak ve bir önceki kaydı yedek olarak tutmak bu riski büyük ölçüde azaltıyor.
Son bir not, metin mi ikili biçim mi sorusu. Ben JSON kullanıyorum, dosyalar biraz büyük ama hata ayıklarken açıp okuyabilmek çok değerli. Oyuncuların kayıtları elle düzenlemesi de mümkün oluyor; tek oyunculu bir oyunda bunu sorun görmüyorum.



@endof