ERGGalata
← Devlog
Sunucu

Tek günde aylar: Faz 2'den Faz 7'ye

Yol haritasının aylar biçtiği aşamalar tek oturumda kapandı. Bunu mümkün kılan hız değil, her aşamanın somut bir testle kapanması.

Dayanıklılık testi: botlar 59 kez boss dövüşünü koştu, 59'unda da kazandı, tek bir hata çıkmadı.
Dayanıklılık testi: botlar 59 kez boss dövüşünü koştu, 59'unda da kazandı, tek bir hata çıkmadı.

Projenin en yoğun günü.

Yol haritasının “ay”, hatta “yıl” biçtiği aşamaların çoğu bu oturumda kapandı.

Bunu mümkün kılan hız değil disiplin. Her aşama somut bir testle kapandığı için hiçbir noktada geri dönüp bir şeyi onarmak gerekmedi.

Faz 2 ve 3 — Sunucu internete açılıyor

Simülasyon o güne dek tek başına çalışan bir çekirdekti. Şimdi ağa sarıldı: bağlantı yönetimi, beş kişilik odalar ve ekrana çizilen her şeyin sunucudan gelmesi.

Ardından kalıcılık geldi. Veritabanı, hesap, karakter, envanter.

Böylece oyunun ilk bütünlüklü hâli çıktı. Hesap açılıyor, karakter seçiliyor, beş kişilik bir zindan internet üzerinden koşuluyor ve sonunda indirilebilir bir savaş kaydı kalıyor.

İlk kez “ortada bir oyun var” denebilecek andı.

Faz 4 — Hareket ve Python’ın sınavı

Tek odalı zindandan açık dünyaya ilk adım.

Hareket tamamen tam sayılarla, milimetre cinsinden hesaplanıyor. Bu yüzden her makinede aynı sonuç çıkıyor.

Sunucu boşuna da konuşmuyor. Bir karakterin hızı değişmediği sürece onun hakkında tek bir mesaj bile göndermiyor.

Bu aşama büyük bir sorunun da cevabıydı. Python bu işi kaldırır mı, yoksa çekirdek başka bir dile mi taşınmalı?

Karar ölçüme bırakıldı. Sonuç: 100 hareketli varlıkla tur süresi 0,58 milisaniye. Bütçenin 57’de biri.

Python kaldı.

Üstüne bir de hız hilesi denendi. Sınırı üç kat aşan sahte istemciyi sunucu her adımda sınıra geri çekti; hile hiçbir şey kazandırmadı.

Faz 5 — Dünya sunucusu

Yol haritasının en ağır aşamalarından biri, üç parça hâlinde.

Bölge geçişi. Her bölge kendi süreci olarak koşuyor, portaldan geçerken bağlantı kopmuyor.

Buradaki asıl tehlike şu: bir an dikkatsizlik ve karakter iki yerde birden var olur. Çözüm bankacılıktaki emanet mantığı oldu. Geçiş iki aşamalı; kaynak taraf, onay gelmeden karakteri silmiyor.

Katmanlama. Bölge kalabalıklaşınca yeni bir kopyası açılıyor, katman başına yüz kişi. Kural net: parti üyeleri her zaman aynı kopyaya düşüyor.

Dünya içeriği. Toplama noktaları ve ilk dünya boss’u — yirmi bin canlık Kül Devi.

Kapanış testi üç koşu sürdü. Her koşu bir kat derindeki hatayı yakaladı, sonuncusu temiz geçti: 30 dakika, 120 bot, 7.065 bölge geçişi, sıfır kayıp.

Faz 6 — Adil PvP

Farklı gecikmelerdeki (ping) oyuncular arasında ölçülebilir bir PvP gerekiyordu.

En zor parça şu: yüksek gecikmeli oyuncunun ekranında gördüğü hedef, sunucunun şimdisinde başka bir yerde.

Çözüm “atıcıya öncelik” oldu. Sunucu her anın konum fotoğrafını saklıyor, saldırı niyeti atıcının gördüğü anı taşıyor ve hedef o anki yerinden örnekleniyor.

Sınır net: geçmişe en fazla 267 milisaniye.

Bir de önemli bir kısıt var. Yalnız konum geri sarılıyor; can ve bekleme süreleri her zaman şimdiki zamanda kalıyor. Ekranda canlı görünen ama aslında ölmüş bir hedef vurulamıyor.

Aşamanın yargıcı bağımsız bir doğrulayıcı oldu. Maçın kayıtlarını alıp her vuruşu baştan yargılıyor.

Ona bilerek üç yalan yedirildi, üçünü de yakaladı.

Faz 7 — Canlı operasyon

Bir MMO’yu yazmak yetmiyor, aylarca kesintisiz yaşatmak gerekiyor.

Sunucu artık kendi durumunu raporluyor. Bir bölge süreci ölünce oyuncular otomatik toparlanıyor; eskiden sonsuza dek “zaten dünyadasın” hatası alıyorlardı.

İçerik, sunucu kapanmadan güncellenebiliyor. Tanımlar değişiyor, canlı durum yaşamaya devam ediyor.

Savaş kayıtlarını dışarı akıtan salt okunur bir kapı da yazıldı. Analiz sitesinin bir gün bağlanacağı yer orası.

Yanına bir hile denetim listesi kondu. Sıralama şu: hile önce hiç mümkün olmamalı; yakalamak ancak ikinci savunma hattı.

Böylece sıfırdan yediye kadar bütün aşamalar kapandı.

Sunucu kodu donduruldu ve bir haftalık dayanıklılık koşusu başladı. Bu donma sayesinde istemci işleri koşuyu bozmadan paralel yürüyebiliyor.