NUGANUGA Web SDK
Oyunun https://play.nuganuga.com üzerinde korumalı bir iframe içinde çalışır. SDK, platforma açılan tek kanaldır — kimlik doğrulama, sıralama, paylaşım, reklam veya analitiği asla kendin yazmazsın.
1. SDK’yı yükle
Her zaman tam olarak bu mutlak yoldan. Dağıtımı ve sürümlemeyi platform yapar.
<script src="/sdk/nuga-sdk.js"></script>
<script src="./game.js"></script>2. Dört çağrı
const ctx = await Nuga.ready(); // platformu bekle
await Nuga.game.start(); // oyuncu gerçekten bir tura başladığında
await Nuga.score.submit({ score }); // tur başına tam olarak bir sayısal skor
await Nuga.game.finish(); // platform sonuç ekranını çizerKendi sonuç ekranını, tekrar düğmeni, paylaş düğmeni veya sıralamanı çizme — platform bunları finish() sonrasında her oyun için aynı şekilde çizer.
3. Geri kalan her şey
Nuga.game.getContext();
Nuga.player.get();
Nuga.challenge.get();
Nuga.storage.get(key);
Nuga.storage.set(key, value);
Nuga.audio.setMuted(true);
Nuga.locale.get(); // 'en' | 'ko' | ...
Nuga.event.track('level_up', { level: 3 });
Nuga.on('pause', () => pauseLoop());4. Bildirim dosyası
Paketinin kökündeki nuga.json:
{
"schemaVersion": 1,
"name": "Reaction Hunter",
"slug": "reaction-hunter",
"description": "Click 10 targets as fast as possible.",
"rule": "Tap every target as fast as you can.",
"category": "REACTION",
"orientation": "PORTRAIT",
"duration": { "min": 5, "max": 30 },
"input": ["POINTER", "TOUCH"],
"ranking": { "type": "LOW_TIME", "unit": "ms" },
"entry": "index.html",
"locales": {
"ko": { "name": "리액션 헌터", "description": "10개의 타겟을 빠르게 클릭하세요." }
}
}Sıralama türleri: HIGH_SCORE, LOW_SCORE, LOW_TIME, HIGH_TIME, CUSTOM. Kategoriler: REACTION, TIMING, ACCURACY, MEMORY, PUZZLE, LUCK, ARCADE.
5. Korumalı alan kuralları
Statik doğrulama, bunlardan herhangi birini çiğneyen paketi oyuncuya ulaşmadan reddeder:
- Dış URL yok — CDN, web yazı tipi veya uzak görsel olmaz. Her şeyi pakete koy.
eval,new Function,document.writeveyadocument.cookieyok.- Kendi ağın olmaz: mutlak URL’ye
fetch,XMLHttpRequest,WebSocketve service worker hem CSP hem doğrulama tarafından engellenir. - Üst düzey gezinme ve açılır pencere yok.
- Paket 5 MB’ın altında; mikro oyunlar 1 MB’ın altında kalmalı.
- En az bir
Nuga.score.submit()çağrısı — skor üretemeyen oyun sıralamaya giremez. - Platform kabuğu sabittir: index.html, kabuk stil dosyası ve game.js içindeki koşum değiştirilmemelidir. Yalnızca run() gövdesi ve #field stilleri sana aittir.
6. Skorlar doğrulanır
Her tura sunucu tarafında bir oturum verilir. Oyunun oturum jetonunu asla görmez — platform kabuğu onu tutar ve senin adına gönderir — sunucu da skoru, gerçek süreyle ve bildirimde belirtilen sınırlarla karşılaştırdıktan sonra sıralamaya alır.
Daha iyisini yapabilirsin. Rastgeleliği sunucunun verdiği tohumdan üret ve gerçekte ne olduğunu kaydet; sunucu turu bildirdiğin sayıya güvenmek yerine olaylarından yeniden hesaplar. Kaydının desteklemediği bir skor doğrudan reddedilir.
const rng = Nuga.random(); // sunucu tohumlu — Math.random() aksine yeniden üretilebilir
const target = rng.int(0, 8);
Nuga.replay.record('hit', 172); // skorla ilgili tek bir sonuç, tur başına en fazla 400Açmak için mekaniği nuga.json içinde bildir. Bildirmezsen oyunun yine sıralamaya girer, sadece süre ve sınır kontrolleriyle.
"verification": { "kind": "REPLAY_V1", "mechanic": "REACTION",
"params": { "rounds": 5 } }7. Yayına al
Paketin kökünü (klasörü değil) sıkıştır ve Üretici Konsolu’ndan yükle. Statik doğrulama, derleme, çalışma zamanı, duyarlılık, oynanış ve güvenlik testleri otomatik çalışır; hepsi geçince yayımlama açılır.