Geliştirici Notları: Krono
Giriş ve Mimari Yaklaşım
Paira Krono, tarihsel olayları, buluşları ve eserleri en eskiden en yeniye doğru kronolojik olarak sıralamaya dayalı, sunucusuz ve veritabanı bağımsız çalışan bir web oyunudur. Paira topluluğunun genel kültür bilgisini sınamak ve interaktif bir rekabet ortamı sunmak amacıyla geliştirilmiştir. Oyun, herhangi bir merkezi sunucu veya veritabanı ihtiyacı duymadan, tamamen tarayıcı tabanlı WebRTC (Peer-to-Peer) mimarisi ile oyuncuların doğrudan birbiriyle haberleşmesini sağlar.
Krono, tek oyunculu (solo) modda yerel bir oyuncu nesnesi üzerinden çalışırken, 1v1 veya çok oyunculu modlarda Host-Client mimarisinde tarayıcı düzeyinde oyun durumlarını senkronize etmektedir.
P2P Ağ Topolojisi (Host-Client Yapısı)
Geleneksel istemci-sunucu modelinin aksine, Krono'da WebRTC protokolü üzerinden Host-Client (Kurucu-Katılımcı) modeli benimsenmiştir:
- Host (Kurucu Node): Oyunu kuran oyuncu, oyun mantığının ana karar vericisidir. Host, odayı kurduktan sonra yerel desteyi (
tr.jsondosyasından çekilen olayları) karıştırarak raunt verilerini hazırlar. Turlar, süre limitleri, puanlama hesaplamaları Host tarafından yönetilir. - Client (Katılımcı Peer): 6 karakterli oda kodunu girerek bağlanan oyuncu, Host ile doğrudan bir
RTCDataChannelbağlantısı açar. Katılımcı, Host'un yerel hafızasından gelen olayları alır ve kendi ekranında sıralama yapar. - Sinyalleşme (Signaling): İstemcilerin birbirlerini bulabilmesi için ICE Adayları ve SDP tekliflerinin değiş tokuş edilmesi aşamasında PeerJS tabanlı bir sinyalleşme sunucusu kullanılır. Bağlantı bir kez sağlandıktan sonra bu sunucuyla olan iletişim durdurulur ve doğrudan P2P veri aktarımına geçilir.
Gerçek Zamanlı Veri Senkronizasyonu
Krono, oyun sürecindeki tüm durum güncellemelerini, puan tablolarını ve oyuncu etkileşimlerini RTCDataChannel üzerinden JSON tabanlı paketler halinde aktarır:
SYNC_SETTINGS: Kurucunun (Host) oyun lobisinde belirlediği tur sayısı (roundCount) ve tur süresi (turnDuration) ayarlarını rakiplere iletir.GAME_START: Host,tr.jsondosyasındaki geniş tarih havuzundan rastgele 5 olayı seçer, bunları tarihlerine göre arka planda sıralayarak doğru indeks sırasını (correctOrder) oluşturur ve karışık olay destesini rakiplere göndererek raundu başlatır.SCORE_UPDATE: Her oyuncunun tur sonunda elde ettiği doğru sıralama adedine ve süre bonusuna göre güncellenen puan durumunu tüm odadaki katılımcılara dağıtır.OPPONENT_FINISHED: Oyuncular sıralamalarını tamamlayıp "Kontrol Et" butonuna bastıklarında veya süreleri dolduğunda, harcadıkları zamanı ve doğru cevap sayılarını karşı tarafa bildirirler. Bu paketle tarafların birbirini bekleme süreci ve raunt geçişleri tetiklenir.ROUND_OVER: Son tur tamamlandığında nihai puan tablosunun tüm kullanıcılarda gösterilmesini sağlar.RETURN_LOBBY: Oyun bittikten sonra kurucunun lobiyi sıfırlayarak tüm oyuncuları lobi ekranına geri götürmesini sağlar.
Oda Yönetimi ve Oyun İçi Mekanikler
Krono'nun oda mantığı ve oturum süreçleri aşağıdaki bileşenlerle optimize edilmiştir:
- Deste Yönetimi: Olay kartları yerel
tr.jsonveritabanından çekilir. Raunt başında seçilen olayların karıştırılması Host tarafından yapılarakGAME_STARTpaketiyle iletilir, böylece her iki oyuncuya da milisaniyelik gecikmelerle tamamen aynı kartlar ve aynı başlangıç dizilimi ulaştırılmış olur. - İpucu (Hint) Mekanizması: Oyunculara raunt başına 2 ipucu hakkı tanınır. İlk ipucu kullanıldığında olay kartlarından birinin tarihi görünür kılınır (
.event-date.visible). İkinci ipucu ise rastgele bir olay kartını olması gereken doğru sıraya yerleştirir ve o kartı kilitler (locked), böylece oyuncunun o kartı sürüklemesi engellenir. - Zaman Senkronizasyonu:
PairaTime.now()API'si ve milisaniye bazlı bitiş süreleri kullanılarak oyuncuların yerel cihazlarındaki saat farklarından kaynaklanabilecek tutarsızlıklar giderilir. - Bağlantı Kesintileri:
handlePlayerLeavetetiklendiğinde, eğer oyun lobide değilse sistem rakibin ayrıldığını algılar ve oyunu sonlandırarak oyuncuyu otomatik olarak ana lobiye yönlendirir.
Güvenlik ve Performans
Oyun boyunca hiçbir veri uzak bir sunucuda barındırılmaz veya kaydedilmez. WebRTC veri kanalları DTLS/SRTP şifreleme standartları ile uçtan uca korunmaktadır. İstemci tarafında çalışan SortableJS kütüphanesi sürükle-bırak animasyonlarını pürüzsüzce işlerken, kilitli kartların doğru pozisyona zorlanması (forceLockedCardsToCorrectPosition) algoritması ile kartların yer değiştirmesi durumunda bile kilitli olayların pozisyonlarının korunması sağlanır.
Bu teknik dokümantasyon, P2P tabanlı web oyun mekanikleri ve tarayıcı düzeyinde veri senkronizasyonu hakkında bilgi vermek amacıyla geliştirici ekibi için hazırlanmıştır.