Felerous Arcade SDK v2.0 Rehberi
HTML5 Canvas ve WebGL oyunlarınızı PlayZone platformuna bağlayarak binlerce oyuncuya sıfır indirmeyle ulaştırın. Gerçek zamanlı skor telemetrisi, 18 kademeli profil başarımları ve otomatik CDN optimizasyonu.
⚡ 1. 5 Dakikada Hızlı Başlangıç
Felerous Arcade ekosisteminin felsefesi: "Oyun akıcı çalışır (Dumb Engine), Platform skorları ve başarımları akıllıca yönetir (Smart Platform)."
felerous-bridge.js köprüsünü dahil etmek ve oyuncu başarım kazandığında ya da oyun bittiğinde ilgili fonksiyonu çağırmaktır.
<!-- 1. Oyunun içine köprüyü ekleyin -->
<script src="js/felerous-bridge.js"></script>
<script>
// 2. Sayfa açıldığında köprüyü başlatın
felerousBridge.init();
// 3. Oyuncu bir başarım kazandığında anında tetikleyin:
felerousBridge.unlockAchievement('first_clear');
// 4. Oyun bittiğinde skoru platforma iletin:
felerousBridge.submitScore({
score: 18450,
difficultyTier: 'lvl2',
difficultyLabel: 'Klasik',
durationSeconds: 120,
achievements: ['first_clear'],
stats: { lines_cleared: 15, apm: 90 }
});
</script>
📁 2. Evrensel Klasör Standardı
Cloudflare R2 kovanına yüklenecek olan oyun paketinizin kök dizini standart ve temiz olmalıdır:
[oyun-slug-kodu]/ (Örn: dusen-sicimler/)
├── index.html # Oyunun giriş noktası (HTML5 Canvas)
├── manifest.json # [ZORUNLU] Oyun kimliği, tür ve yönlendirme
├── achievements.json # [ÖNERİLEN] Oyunun tüm başarımları (v1.0.1)
├── changelog.json # [OPSİYONEL] Sürüm geçmişi (FDB Depo sekmesinde gösterilir)
├── icon.png # 512x512 kare vitrin ikonu
├── cover.png # Dikey kapak görseli (600x900)
├── banner.png # Geniş afiş görseli (1920x1080)
├── css/
│ └── style.css # Oyun stilleri (100dvh ve koyu mod korumalı)
└── js/
├── felerous-bridge.js # Felerous Store resmi köprü SDK'sı
├── sound.js # 8-bit prosedürel Web Audio motoru
└── game.js # Oyun mantığı ve döngüsü
server.js, node_modules/, .git/ veya geçici geliştirici notları bulunmamalıdır. Sadece tarayıcının doğrudan çalıştıracağı saf dosyalar yer almalıdır.
📄 3. MANIFEST.JSON Spesifikasyonu & FDB Dosya Ağacı
Platformun oyunu otomatik tanıması, vitrine eklemesi ve FDB (FELEROUS Database) sisteminde depoları ve dosya ağacını listelemesi için kök dizinde manifest.json bulunmalıdır:
{
"id": "dusen_sicimler",
"slug": "dusen-sicimler",
"name": "Düşen Sicimler",
"version": "1.0.3",
"developer": "Subushaki",
"publisher": "FELEROUS",
"category": "Arcade",
"game_type": "web",
"entry": "index.html",
"icon": "icon.png",
"cover": "cover.png",
"banner": "banner.png",
"orientation": "portrait_or_landscape",
"resolution": {
"width": 1080,
"height": 1920,
"responsive": true
},
"features": {
"achievements": true,
"leaderboards": true,
"anti_cheat": true,
"telemetry": true
},
"files": [
{ "name": "index.html", "type": "Oyun Giriş Dosyası" },
{ "name": "banner.png", "type": "Afiş Görseli" },
{ "name": "cover.png", "type": "Kapak Görseli" },
{ "name": "icon.png", "type": "Oyun İkonu" },
{ "name": "manifest.json", "type": "Oyun Yapılandırması" },
{ "name": "achievements.json", "type": "Başarım Veritabanı" },
{ "name": "changelog.json", "type": "Sürüm Notları" },
{ "name": "js/game.js", "type": "Oyun Motoru & Mantığı" },
{ "name": "js/felerous-bridge.js", "type": "Platform SDK Köprüsü" },
{ "name": "js/sound.js", "type": "8-bit Ses Motoru" },
{ "name": "css/style.css", "type": "Stil Dosyası" }
]
}
| Alan | Tür | Açıklama |
|---|---|---|
id |
String | Veritabanı ve API ile eşleşen benzersiz kimlik (snake_case). Örn: dusen_sicimler. |
slug |
String | URL ve R2 klasör adı (kebab-case). Örn: dusen-sicimler. |
version |
String | Anlık oyun sürümü (SemVer formatı: "1.0.3"). FDB Depo başlığında gösterilir. |
orientation |
String | Mobil yön tercihi: "portrait", "landscape" veya "portrait_or_landscape". |
features |
Object | Oyunun desteklediği platform yetenekleri (başarımlar, liderlik tabloları, hile koruması, telemetri). |
files |
Array | FDB "Depolar" (Depots) sekmesinde taranan dosya listesi. Her dosyanın adı ve insan-okunabilir işlevi belirtilir. |
🏆 4. ACHIEVEMENTS.JSON Spesifikasyonu (18 Başarım Tam Referansı)
Felerous Store ekosisteminde başarımların tek doğru kaynağı (Single Source of Truth) oyun kökündeki achievements.json dosyasıdır. FDB Başarımlar sekmesi, oyun içi HUD bildirimleri ve oyuncunun Steam-standardı Profil Vitrini bu dosyayı okur.
{
"game_id": "dusen_sicimler",
"version": "1.0.3",
"total": 18,
"achievements": [
{
"id": "first_clear",
"title": "İlk Adım",
"description": "İlk satırını başarıyla temizle.",
"icon": "🧱",
"category": "progression",
"rarity": "common",
"points": 10
},
{
"id": "tetris_master",
"title": "Düşen Sicim",
"description": "Tek hamlede 4 satır birden sil.",
"icon": "⚡",
"category": "skill",
"rarity": "rare",
"points": 25
},
{
"id": "combo_king",
"title": "Kombo Ustası",
"description": "En az 4x ardışık satır kombosu yap.",
"icon": "🌪️",
"category": "skill",
"rarity": "epic",
"points": 50
},
{
"id": "hard_dropper",
"title": "Işık Hızı",
"description": "Tek oyunda 25 kez sert düşüş (smash) yap.",
"icon": "💥",
"category": "speed",
"rarity": "uncommon",
"points": 15
},
{
"id": "survivor",
"title": "Kabus Gazisi",
"description": "Kabus modunda en az 60 saniye hayatta kal.",
"icon": "🛡️",
"category": "survival",
"rarity": "legendary",
"points": 100
},
{
"id": "architect",
"title": "Büyük Mimar",
"description": "Tek bir oyunda 50+ satır sil.",
"icon": "👑",
"category": "endurance",
"rarity": "epic",
"points": 50
},
{
"id": "high_scorer",
"title": "Puan Avcısı",
"description": "Tek bir oyunda 20.000 puanı aş.",
"icon": "🎯",
"category": "score",
"rarity": "rare",
"points": 30
},
{
"id": "tactician",
"title": "Usta Taktisyen",
"description": "Hold (saklama) özelliğini en az 10 kez kullan.",
"icon": "🔄",
"category": "strategy",
"rarity": "uncommon",
"points": 15
},
{
"id": "double_trouble",
"title": "Çifte Vuruş",
"description": "Toplam 50 İkili Satır (2 satır birden) temizle.",
"icon": "2️⃣",
"category": "skill",
"rarity": "uncommon",
"points": 20
},
{
"id": "triple_threat",
"title": "Üçlü Tehdit",
"description": "Toplam 25 Üçlü Satır (3 satır birden) temizle.",
"icon": "3️⃣",
"category": "skill",
"rarity": "rare",
"points": 35
},
{
"id": "back_to_back",
"title": "Ardarda Tetris",
"description": "Arka arkaya 2 Tetris (4 satır) yap.",
"icon": "🔥",
"category": "skill",
"rarity": "epic",
"points": 60
},
{
"id": "perfect_clear",
"title": "Mükemmel Temizlik",
"description": "Tahtayı tamamen boşalt (Perfect Clear).",
"icon": "✨",
"category": "skill",
"rarity": "legendary",
"points": 150
},
{
"id": "speed_demon",
"title": "Hız Canavarı",
"description": "1 dakika içinde 40 satır temizle.",
"icon": "⏱️",
"category": "speed",
"rarity": "rare",
"points": 40
},
{
"id": "marathon_runner",
"title": "Maratoncu",
"description": "Toplam 1000 satır temizle.",
"icon": "🏃",
"category": "endurance",
"rarity": "epic",
"points": 75
},
{
"id": "piece_master",
"title": "Parça Ustası",
"description": "Toplam 1000 parça indir.",
"icon": "🎮",
"category": "progression",
"rarity": "rare",
"points": 30
},
{
"id": "apm_champion",
"title": "Hızlı Parmaklar",
"description": "Bir oyunda 300 APM (Aksiyon/Dk) üzerine çık.",
"icon": "⚡",
"category": "speed",
"rarity": "epic",
"points": 55
},
{
"id": "nightmare_warrior",
"title": "Kabus Savaşçısı",
"description": "Kabus modunda 120 saniye hayatta kal.",
"icon": "👹",
"category": "survival",
"rarity": "legendary",
"points": 200
},
{
"id": "millionaire",
"title": "Milyoner",
"description": "Toplam 1.000.000 kariyer puanı topla.",
"icon": "💎",
"category": "score",
"rarity": "legendary",
"points": 100
}
]
}
profile.html) oyuncunun açtığı başarımlar, toplam başarıma oranlanarak dinamik renkli Steam ilerleme çubuğunda (BAŞARIMLAR: N/18 (%X)) ve akordeon detay çekmecesinde sergilenir.
📜 5. CHANGELOG.JSON Spesifikasyonu (FDB Sürüm Günlüğü & Depolar)
Oyununuz güncellendikçe FDB (FELEROUS Database) "Depolar" sekmesinde sürüm geçmişinin otomatik taranıp SteamDB tarzında değişiklik günlüğü (patch notes) olarak sunulması için kök dizinde changelog.json tutulur.
[
{
"version": "v1.0.3",
"date": "2026-09-27T18:35:00Z",
"description": "Başarım açılışı ve ses motoru stabilite güncellemesi.",
"changes": [
"Başarım kilidi açıldığında oluşan ses motoru uyumsuzluğu giderildi",
"Kesintisiz oyun için başarım akışları tam korumalı (fail-safe) hale getirildi",
"Özel prosedürel zafer arpeji (playAchievement) ses motoruna eklendi"
]
},
{
"version": "v1.0.2",
"date": "2026-09-27T00:00:00Z",
"description": "Canvas doğrudan dokunmatik kaydırma ve jest kontrolleri güncellemesi.",
"changes": [
"Tahta üzerinde doğrudan parmakla sola/sağa hassas blok kaydırma eklendi",
"Yatay kaydırma sırasında kazara düşüşleri önleyen eksen kilidi (axis lock) geliştirildi",
"Aşağı hızlı kaydırmada (flick down) doğrudan zemine yapışma (Hard Drop) eklendi",
"Tek dokunuşla (tap) 90 derece döndürme ve yukarı kaydırmayla saklama (Hold) entegre edildi"
]
},
{
"version": "v1.0.1",
"date": "2026-09-26T21:30:00Z",
"description": "18 Başarım Paketi ve Kariyer Takibi güncellemesi.",
"changes": [
"10 yeni beceri ve kariyer başarımı eklendi (toplam 18 başarım)",
"Kümülatif kariyer istatistikleri ve SafeStorage kalıcılığı sağlandı",
"Perfect Clear (Mükemmel Temizlik) ve Back-to-Back Tetris tespiti eklendi"
]
},
{
"version": "v1.0.0",
"date": "2026-09-26T21:00:00Z",
"description": "Düşen Sicimler resmi PlayZone ve FDB lansman sürümü.",
"changes": [
"8 adet Arcade başarımı entegre edildi",
"Gerçek zamanlı Supabase telemetrisi bağlandı",
"FDB Depo tarama desteği eklendi",
"Mobil, Samsung Internet ve Safari tam uyumluluk optimizasyonları yapıldı"
]
}
]
🔌 6. Resmi Köprü SDK: felerous-bridge.js (v2.0)
Oyununuz ile PlayZone çerçevesi arasındaki tüm iletişimi yöneten hazır sınıf. Doğrudan js/felerous-bridge.js yoluna kaydedip projenize dahil edin:
/**
* FELEROUS ARCADE STANDART ENTEGRASYON KÖPRÜSÜ (SDK v2.0)
* Parent iframe ile tam uyumlu postMessage iletişim protokolü.
*/
class FelerousArcadeBridge {
constructor(gameId = 'dusen_sicimler') {
this.gameId = gameId;
this.player = null;
this.isEmbedded = window.self !== window.top;
this.setupListeners();
}
init() {
if (this.isEmbedded) {
window.parent.postMessage({
type: 'FELEROUS_INIT_PLAYER',
game_id: this.gameId
}, '*');
}
}
setupListeners() {
window.addEventListener('message', (event) => {
const data = event.data;
if (!data || typeof data !== 'object') return;
switch (data.type) {
case 'FELEROUS_PLAYER_INFO':
this.player = {
name: data.player_name || 'Oyuncu',
avatar: data.avatar_url || '',
felerousId: data.felerous_id || null,
isGuest: data.is_guest || false,
userId: data.user_id || null
};
break;
case 'FELEROUS_SET_MUTE':
if (typeof window.sound !== 'undefined' && typeof window.sound.setMute === 'function') {
window.sound.setMute(data.muted);
}
break;
case 'FELEROUS_PAUSE':
if (typeof window.game !== 'undefined' && typeof window.game.togglePause === 'function') {
window.game.togglePause(true);
}
break;
case 'FELEROUS_RESUME':
if (typeof window.game !== 'undefined' && typeof window.game.togglePause === 'function') {
window.game.togglePause(false);
}
break;
}
});
}
/**
* Başarım Kilidi Açma (Anında çağrılır ve Supabase'e yazar)
*/
unlockAchievement(achievementId) {
if (!achievementId) return;
const payload = {
type: 'FELEROUS_UNLOCK_ACHIEVEMENT',
game_id: this.gameId,
achievement_id: achievementId
};
try {
window.parent.postMessage(payload, '*');
} catch (e) {
console.warn('[Felerous Arcade] Başarım iletim hatası:', e);
}
}
/**
* Skor Bildirimi (Oyun bittiğinde çağrılır)
*/
submitScore({
score = 0,
levelReached = 1,
linesCleared = 0,
difficultyTier = 'lvl2',
difficultyLabel = 'Klasik',
durationSeconds = 0,
achievements = [],
stats = {}
}) {
const payload = {
type: 'FELEROUS_SUBMIT_SCORE',
game_id: this.gameId,
score: Math.max(0, Math.floor(score)),
level_reached: levelReached,
lines_cleared: linesCleared,
difficulty_tier: difficultyTier,
difficulty_label: difficultyLabel,
duration_seconds: Math.max(0, Math.floor(durationSeconds)),
achievements: achievements,
stats: {
lines_cleared: linesCleared,
...stats
}
};
try {
window.parent.postMessage(payload, '*');
} catch (e) {
console.error('[Felerous Arcade] Skor iletim hatası:', e);
}
return payload;
}
/**
* PlayZone Vitrinine Güvenli Çıkış
*/
exitToPlayzone() {
const targetUrl = 'https://store.felerous.com/playzone';
try {
window.parent.postMessage({
type: 'FELEROUS_EXIT_GAME',
game_id: this.gameId,
redirect_url: targetUrl
}, '*');
} catch (e) {}
setTimeout(() => {
if (window.top && window.top !== window.self) {
window.top.location.href = targetUrl;
} else {
window.location.href = targetUrl;
}
}, 100);
}
}
// Global köprü örneği
const felerousBridge = new FelerousArcadeBridge('dusen_sicimler');
📡 7. İki Yönlü Olay Sözleşmeleri (PostMessage Kataloğu)
Oyun (iFrame) ile ev sahibi PlayZone oynatıcı çerçevesi arasındaki tam çift yönlü olay haberleşme tablosu:
| Olay Adı (Type) | Yön | Açıklama | Yük (Payload) |
|---|---|---|---|
FELEROUS_INIT_PLAYER |
Oyun ➔ Platform | Oyun açıldığında oturumdaki oyuncu profilini ve liderlik tablosunu talep eder. | { type, game_id } |
FELEROUS_PLAYER_INFO |
Platform ➔ Oyun | Giriş yapmış kullanıcının veya misafirin rumuzunu, avatarını ve kimliğini oyuna aktarır. | { type, player_name, avatar_url, felerous_id, is_guest, user_id } |
FELEROUS_UNLOCK_ACHIEVEMENT |
Oyun ➔ Platform | Başarım kazanıldığında anında Supabase user_achievements tablosuna yazar ve PlayZone HUD toast bildirimini tetikler. |
{ type, game_id, achievement_id } |
FELEROUS_SUBMIT_SCORE |
Oyun ➔ Platform | Oyun bittiğinde skoru arcade_scores tablosuna kaydeder, oyuncunun kütüphanesine oyunu otomatik ekler ve liderlik tablosunu günceller. |
{ type, game_id, score, level_reached, lines_cleared, difficulty_tier, difficulty_label, duration_seconds, achievements, stats } |
FELEROUS_GET_LEADERBOARD |
Oyun ➔ Platform | İlgili oyunun Top 10 skor tablosunu talep eder. | { type, game_id } |
FELEROUS_LEADERBOARD_UPDATE |
Platform ➔ Oyun | Güncel ilk 10 skor sıralamasını dizi formatında oyuna gönderir. | { type, game_id, difficulty_tier, leaderboard: [...] } |
FELEROUS_SET_MUTE |
Platform ➔ Oyun | PlayZone üst HUD ses butonundan gelen ses aç/kapa komutu. | { type, muted: true/false } |
FELEROUS_PAUSE |
Platform ➔ Oyun | PlayZone üst HUD duraklat butonuna basıldığında oyunu durdurur. | { type } |
FELEROUS_RESUME |
Platform ➔ Oyun | PlayZone üst HUD devam butonuna basıldığında oyunu sürdürür. | { type } |
FELEROUS_EXIT_GAME |
Oyun ➔ Platform | Oyuncunun güvenli şekilde PlayZone vitrinine dönmesini sağlar. | { type, game_id, redirect_url } |
🧭 8. Zorluk Kademeleri & Liderlik Tablosu Entegrasyonu
PlayZone skor tablosunda adil rekabet sağlamak için skorlar zorluk kademelerine (Difficulty Tiers) göre filtrelenir.
lvl1/ Acemi: Yavaş düşüş hızı, yeni başlayanlar için.lvl2/ Klasik: Standart arcade dengesi (varsayılan kademe).lvl3/ Usta: Yüksek hız ve daha agresif tempo.lvl4/ Kabus: Zirve refleks gerektiren aşırı hız kademesi.
Skor gönderirken difficulty_tier: 'lvl2' ve difficulty_label: 'Klasik' parametrelerini sağladığınızda PlayZone ve FDB liderlik tablolarında bu sekmeler otomatik ayrışır.
📱 9. Mobil & Çapraz Tarayıcı "Altın Kuralları"
Mobil tarayıcılarda (Safari, Samsung Internet, Chrome Mobil) kusursuz deneyim sağlamak için şu 5 altın kural uygulanmalıdır:
1. Dynamic Viewport (100dvh)
Mobil gezinti çubuğu hareket ettiğinde sayfanın taşmasını engeller:
html, body, #game-container {
height: 100vh;
height: 100dvh;
height: -webkit-fill-available;
overflow: hidden;
position: fixed;
width: 100%;
}
2. SafeStorage (Safari Gizli Mod & Iframe Koruması)
Safari Gizli Modunda localStorage çökmelerini engeller:
window.SafeStorage = {
_mem: {},
getItem(k) {
try { return localStorage.getItem(k); }
catch (e) { return this._mem[k] || null; }
},
setItem(k, v) {
try { localStorage.setItem(k, v); }
catch (e) { this._mem[k] = String(v); }
}
};
3. Web Audio API Otomatik Oynatma Uyandırıcısı (unlockAudio)
Kullanıcının ilk dokunuşunda ses motorunu uyandırır:
function unlockAudio() {
if (window.audioCtx && window.audioCtx.state === 'suspended') {
window.audioCtx.resume();
}
document.removeEventListener('pointerdown', unlockAudio);
}
document.addEventListener('pointerdown', unlockAudio, { passive: true });
4. Samsung Internet Renk Bozulması Koruması
Gece modunda canvas renklerinin tersine çevrilmesini engeller:
:root { color-scheme: dark; }
canvas { color-scheme: dark; forced-color-adjust: none; touch-action: none; }
5. Dokunmatik Jestler ve Eksen Kilidi (Axis Lock)
Düşen Sicimler v1.0.2 ile geliştirilen sezgisel doğrudan Canvas jest kontrol modeli:
// Yatay sürüklemede kazara düşüşleri engelleyen eksen kilidi
let touchStartX = 0, touchStartY = 0, isDragging = false;
canvas.addEventListener('touchstart', (e) => {
const t = e.touches[0];
touchStartX = t.clientX;
touchStartY = t.clientY;
isDragging = true;
}, { passive: true });
canvas.addEventListener('touchmove', (e) => {
if (!isDragging) return;
const dx = e.touches[0].clientX - touchStartX;
const dy = e.touches[0].clientY - touchStartY;
// Eksen kilidi: Yatay hareket dikey hareketten fazlaysa sola/sağa kaydır
if (Math.abs(dx) > Math.abs(dy) && Math.abs(dx) > 28) {
if (dx > 0) game.moveRight(); else game.moveLeft();
touchStartX = e.touches[0].clientX;
}
}, { passive: true });
canvas.addEventListener('touchend', (e) => {
isDragging = false;
});
☁️ 10. İnceleme Süreci, Cloudflare R2 Yayını & Geliştirici Portalı
Oyununuzu milyonlarca oyuncuya güvenli ve yüksek performansla sunmak için FELEROUS Güvenlik Masası, Cloudflare R2 ve Geliştirici Portalı entegrasyonu:
games.felerous.com Cloudflare R2 kovanına aktarılır.
felerous-games Cloudflare R2 kovanında ve https://games.felerous.com/[oyun-slug-kodu]/index.html özel alan adında barındırılır. SSL, küresel CDN önbellekleme ve sandbox iframe güvenliği otomatik olarak devrededir.
Yayınlama & İnceleme Adımları:
- Oyun dosyalarınızı standart klasör hiyerarşisinde (
index.html,manifest.json,achievements.json,changelog.json,cover.png,banner.png,icon.png,js/,css/) hazırlayın ve bir ZIP arşivi haline getirin (veya GitHub Release / Google Drive / WeTransfer bağlantısı oluşturun). - Geliştirici Portalı'na (
/developer) gidin ve "Web Oyunları (PlayZone Arcade)" sekmesini açın. - Oyun Başlığı, Motoru, Türü, Açıklaması ve "Oyun İnceleme Paketi Linki" alanına ZIP veya indirme bağlantınızı girip "Web Oyununu İncelemeye Gönder" butonuna basın.
- FELEROUS Yönetim Masası paketi indirip güvenlik, 100dvh mobil düzeni, SafeStorage ve SDK köprüsünü bizzat test eder.
- Onaylanan oyun FELEROUS tarafından Cloudflare R2 kovanına konuşlandırılır, canlı URL'si atanır ve PlayZone vitrininde yayına girer.
- Oyun onaylandıktan sonra geliştirici; başlık, açıklama, kontroller ve yeni güncelleme paketleri sunma konusunda daha geniş ve özgür yönetim paneline sahip olur.
purchases tablosuna payment_method: 'arcade_play' olarak) ekler ve oyuncunun profilindeki "Sahip Olunan Oyun" sayacını artırır.
🧪 11. İnteraktif JSON Doğrulayıcı
Oyununuzu R2'ye yüklemeden önce manifest.json, achievements.json veya changelog.json dosyanızı buraya yapıştırıp şema geçerliliğini anında test edebilirsiniz: