SDK Web NUGANUGA
Gimmu berjalan di iframe tersandbox pada https://play.nuganuga.com. SDK adalah satu-satunya kanal ke platform — kamu tidak pernah membuat sendiri autentikasi, peringkat, berbagi, iklan, atau analitik.
1. Muat SDK
Selalu dari path absolut ini persis. Platform yang menyajikan dan memversikannya.
<script src="/sdk/nuga-sdk.js"></script>
<script src="./game.js"></script>2. Empat pemanggilan
const ctx = await Nuga.ready(); // tunggu platform
await Nuga.game.start(); // saat pemain benar-benar memulai permainan
await Nuga.score.submit({ score }); // tepat satu skor angka per permainan
await Nuga.game.finish(); // platform menggambar layar hasilJangan menggambar layar hasil, tombol ulang, tombol bagikan, atau papan peringkat sendiri — platform menggambarnya setelah finish(), sama untuk setiap gim.
3. Selebihnya
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. Manifes
nuga.json di root paketmu:
{
"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개의 타겟을 빠르게 클릭하세요." }
}
}Jenis peringkat: HIGH_SCORE, LOW_SCORE, LOW_TIME, HIGH_TIME, CUSTOM. Kategori: REACTION, TIMING, ACCURACY, MEMORY, PUZZLE, LUCK, ARCADE.
5. Aturan sandbox
Validasi statis menolak paket yang melanggar salah satunya, sebelum sampai ke pemain:
- Tanpa URL eksternal — tanpa CDN, font web, atau gambar jarak jauh. Bundel semuanya sendiri.
- Tanpa
eval,new Function,document.write, ataudocument.cookie. - Tanpa jaringan sendiri:
fetchke URL absolut,XMLHttpRequest,WebSocket, dan service worker diblokir oleh CSP maupun validasi. - Tanpa navigasi tingkat atas dan tanpa pop-up.
- Paket di bawah 5 MB; gim mikro sebaiknya di bawah 1 MB.
- Minimal satu pemanggilan
Nuga.score.submit()— gim yang tidak menghasilkan skor tidak bisa masuk peringkat. - Cangkang platform bersifat tetap: index.html, stylesheet cangkang, dan harness di game.js harus tetap utuh. Hanya isi run() dan gaya #field yang menjadi milikmu.
6. Skor diverifikasi
Setiap permainan mendapat sesi di sisi server. Gimmu tidak pernah melihat token sesi — cangkang platform yang menyimpannya dan mengirim atas namamu — dan server mencocokkan skor dengan durasi sebenarnya serta batas yang dinyatakan di manifes sebelum masuk papan peringkat.
Kamu bisa lebih baik lagi. Ambil keacakan dari benih yang diberikan server dan catat apa yang benar-benar terjadi: server akan menghitung ulang permainan dari kejadianmu alih-alih memercayai angkanya. Klaim yang tidak didukung rekamanmu langsung ditolak.
const rng = Nuga.random(); // berbenih dari server — dapat diulang, tidak seperti Math.random()
const target = rng.int(0, 8);
Nuga.replay.record('hit', 172); // satu hasil yang relevan dengan skor, maksimal 400 per permainanDeklarasikan mekaniknya di nuga.json untuk mengaktifkannya. Tanpa itu gimmu tetap masuk peringkat, hanya dengan pemeriksaan durasi dan batas.
"verification": { "kind": "REPLAY_V1", "mechanic": "REACTION",
"params": { "rounds": 5 } }7. Terbitkan
Kompres root paket (bukan foldernya) lalu unggah di Konsol Kreator. Validasi statis, build, serta rangkaian runtime, responsif, gameplay, dan keamanan berjalan otomatis; penerbitan terbuka begitu semuanya lulus.