
Taht ve Kan’ın teknik günlüğü; gerçek mimari kararlarını, üretimde yaşanan hataları ve bunlardan çıkarılan kalıcı kuralları anlatır.
1. Mimari: istemci talep eder, sunucu karar verir
React istemci → Server Actions → saf oyun mantığı → Supabase/PostgreSQL
İstemciye güvenilmez. İstemci yalnızca “şu bölgeye saldır” talebi gönderir; sıra, eylem puanı, komşuluk ve yetki sunucuda doğrulanır. Savaş, ekonomi, Elo ve lig eşikleri veritabanından bağımsız saf fonksiyonlar halinde tutulur. Bütün tablolarda RLS açıktır ve anonim anahtarla satır okunamaz.
2. Kimlik: misafir ve hesaplı oyuncu aynı çözümleyicide
Misafir oyuncu oyun başına httpOnly çerezle, giriş yapan oyuncu 30 günlük scrypt hash’li oturumla tanınır. resolvePlayer() iki yolu da kabul eder. Gizli oyun token’ı hiçbir genel select listesine eklenmez; istemciye dönen alanlar elle sabitlenir.
3. Performansta gerçek suçlu coğrafyaydı
Veritabanı Frankfurt’tayken sunucu fonksiyonları varsayılan başka bir bölgede çalışıyordu. Bir sayfadaki onlarca sıralı sorgu yaklaşık 90 ms ağ gecikmesini tekrar tekrar ödüyordu. vercel.json ile fonksiyonlar fra1 bölgesine alındı ve hesap yükleme yedi sorgudan iki korumalı sorguya indirildi.

4. Migration dayanıklılığı
Şema değişikliği ve kod dağıtımı her zaman aynı anda yapılmıyor. Yeni sütunu okuyan sorgu ayrı ve korumalı çalışır; sütun yoksa varsayılan döner. Bu kuralın ihlal edildiği daily_streak olayı, ana select’in tamamını düşürüp kozmetikleri ve admin bayrağını sıfırladı. Kalıcı ders: korumalı sütunu ana select’e koyma.
5. Asılı maç problemine üç savunma
- Tur son tarihi dolunca sıra otomatik geçer.
- Oyuncu, zaman aşımı ve yapay zekâ aynı
advanceTurnCore()fonksiyonunu kullanır. - Uzun süre terk edilen maç yapay zekâya devredilebilir.
Kullanılmayan eylem puanına altın ve gıda verilmesi, oyuncuyu turu bekletmeden bitirmeye yönlendiren küçük bir ekonomik teşviktir.
6. Haritanın üç nesli
İlk sürüm prosedürel SVG hex ızgaraydı; teknik olarak temiz ama jenerikti. İkinci sürüm boyalı karo atlasıydı; daha iyi görünse de tahta oyunu hissini korudu. Güncel sürüm tek parça boyalı dünya üzerine araziyi izleyen Voronoi bölütlemesiyle 22 asimetrik bölge kuruyor. Yapay beyaz sınırlar kaldırıldı; sahiplik yumuşak renk nüfuzuyla okunuyor. Eski 40 bölgeli maçlar bozulmasın diye görünüm oyun kaydı bazında seçiliyor.

7. Android bir WebView değildir
Android sürümü TWA sarmalayıcı olarak başlayıp Kotlin ve Jetpack Compose ile yerel uygulamaya dönüştürüldü. Oyun motoru Kotlin’de yeniden yazıldı; uygulama çevrimdışı oynanabiliyor ve çevrimiçi modda aynı arka ucun mobil uçlarını kullanıyor. Yeni veri alanlarına varsayılan değer verilmesi ve bilinmeyen alanların yok sayılması eski yerel kayıtların kırılmasını engelliyor.
8. Sunucu maliyetini oyuncu sayısından ayırmak
- Biten maçlar savaş, casusluk ve olay kayıtlarını yüklemez.
document.hiddeniken yoklama döngüleri durur.- Sohbet 8 saniye, tur yenileme 18 saniye aralıkla çalışır.
- Ağır harita memoize edilir; saniyelik sayaç ayrı bileşendir.
Sonuçta maliyet kayıtlı oyuncu sayısından çok o anda oynanan tur sayısıyla ölçeklenir.
9. Platform tuzakları
"use server"dosyaları yalnız async fonksiyon export edebilir.- Sunucuya özgü modüller istemci bileşenine import edilemez.
- Windows’taki büyük/küçük harf duyarsızlığı
recentGames.tsveRecentGames.tsxçakışması üretti. - Render sırasında server action içinden yol geçersizleştirme çağrısı yapılamadığı için e-posta doğrulama akışı yeniden kuruldu.
10. Şu an nerede?
Kapalı beta; kayıt, onay, giriş, e-posta doğrulama, davet ve geri bildirim toplama devrede. Otuz migration uygulanmış durumda. Yerel Android istemcisi v1.8.1. Gerçek ödeme entegrasyonu bilinçli olarak ertelendi; öncelik hata ayıklama, denge ve oyuncu tutundurma.
