Tüm yazılar

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_id sı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.