Oyun mantığını görüntüden ayırmak
EraClash, iki oyuncunun kalelerinden asker üretip savaşı canlı izlediği bir strateji oyunu. Online oynanırken iki telefonun aynı savaşı birebir aynı hesaplaması gerekiyor. Bu yüzden oyunun ilk kuralı şu oldu: mantık ile görüntü iki ayrı katman.
Simülasyon saf bir katman
Oyun mantığı src/sim/ altında duruyor ve şunları kullanamıyor: Node, sahne, Engine, Time, OS, randf(), randi() ve fizik motoru. Sadece RefCounted tabanlı saf sınıflar var.
- Float yok. Tüm değerler tamsayı. Konumlar “mili-birim” cinsinden, şerit uzunluğu 140.000.
- Sabit zaman adımı. Simülasyon saniyede 20 tick çalışır. Delta time yok, her şey tick cinsinden.
- Rastgelelik tek yerden. Gerekirse yalnızca maç tohumuyla başlayan
SimRng(xorshift32) kullanılır. - Sıra sabit. Varlıklar her zaman
entity_idsırasına göre güncellenir; sırasız koleksiyonların dolaşma sırasına güvenilmez.
Görüntü simülasyonu sadece okur
Animasyon, efekt, ses ve skinler simülasyonun her tick sonrası verdiği duruma bakar. İki tick arasını yumuşatmak için enterpolasyon yapar, ama durumu asla değiştirmez. Hit-stop ve ekran sarsıntısı gibi efektler yalnızca görüntüde yaşar, simülasyonu yavaşlatmaz.
Her şey komutla olur
Oyuncu, bot ve online rakip simülasyonu aynı yoldan etkiler: Command nesneleri. Bu sayede aynı komut dizisi aynı sonucu verir. Bir maçı kaydedip yeniden oynatmak ve sonucu doğrulamak da bu yüzden kolay.
Ne kazandırdı
Online maçta iki istemci aynı komutları aynı tick’te çalıştırıyor ve simülasyonun durum özetini karşılaştırarak ayrışmayı yakalıyor. Mantık motordan bağımsız olduğu için birim testleri sahne açmadan çalışıyor.
Bedeli de var: tamsayıyla hesap yapmak ve her şeyi komuta çevirmek ilk başta daha yavaş. Ama online bir oyunda “iki cihaz aynı sonucu bulur” garantisi, bu bedelden önemli.