NUGANUGA Web SDK
Tvoje hra běží v izolovaném iframe na https://play.nuganuga.com. SDK je jediný kanál k platformě — přihlašování, žebříčky, sdílení, reklamu ani analytiku nikdy neimplementuješ sám.
1. Načti SDK
Vždy z téhle přesné absolutní cesty. Platforma ho servíruje a verzuje.
<script src="/sdk/nuga-sdk.js"></script>
<script src="./game.js"></script>2. Čtyři volání
const ctx = await Nuga.ready(); // počkej na platformu
await Nuga.game.start(); // když hráč opravdu začne partii
await Nuga.score.submit({ score }); // přesně jedno číselné skóre na partii
await Nuga.game.finish(); // platforma vykreslí obrazovku výsledkuNekresli vlastní obrazovku výsledku, tlačítko opakování, sdílení ani žebříček — platforma je vykreslí po finish() stejně pro každou hru.
3. Všechno ostatní
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. Manifest
nuga.json v kořeni tvého balíčku:
{
"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개의 타겟을 빠르게 클릭하세요." }
}
}Typy žebříčku: HIGH_SCORE, LOW_SCORE, LOW_TIME, HIGH_TIME, CUSTOM. Kategorie: REACTION, TIMING, ACCURACY, MEMORY, PUZZLE, LUCK, ARCADE.
5. Pravidla sandboxu
Statická validace odmítne balíček, který poruší kterékoli z nich, ještě než se dostane ke hráči:
- Žádné externí URL — žádné CDN, webové fonty ani vzdálené obrázky. Zabal si všechno.
- Žádné
eval,new Function,document.writeanidocument.cookie. - Žádná vlastní síť:
fetchna absolutní URL,XMLHttpRequest,WebSocketa service workery blokuje jak CSP, tak validace. - Žádná navigace nejvyšší úrovně a žádná vyskakovací okna.
- Balíček pod 5 MB; mikrohry by měly zůstat pod 1 MB.
- Aspoň jedno volání
Nuga.score.submit()— hra, která nevyprodukuje skóre, se do žebříčku nedostane. - Obal platformy je pevný: index.html, styl obalu a harness v game.js musí zůstat beze změny. Tvoje je jen tělo run() a styly #field.
6. Skóre se ověřují
Každá partie dostane serverovou relaci. Tvoje hra token relace nikdy nevidí — drží ho obal platformy a odesílá za tebe — a server porovná skóre se skutečnou dobou trvání a s mezemi z manifestu, než se dostane do žebříčku.
Jde to i líp. Ber náhodnost ze semínka vydaného serverem a zaznamenávej, co se opravdu stalo: server pak partii přepočítá z tvých událostí místo toho, aby věřil číslu. Skóre, které záznam nepodpoří, se rovnou odmítne.
const rng = Nuga.random(); // semínko od serveru — reprodukovatelné, na rozdíl od Math.random()
const target = rng.int(0, 8);
Nuga.replay.record('hit', 172); // jedna událost důležitá pro skóre, až 400 na partiiDeklaruj mechaniku v nuga.json a zapneš to. Bez toho se hra do žebříčku dostane taky, jen s kontrolou délky a mezí.
"verification": { "kind": "REPLAY_V1", "mechanic": "REACTION",
"params": { "rounds": 5 } }7. Vydej to
Zazipuj kořen balíčku (ne složku) a nahraj ho v konzoli tvůrce. Statická validace, build a sady runtime, responzivity, hratelnosti a bezpečnosti běží automaticky; publikace se odemkne, jakmile projdou.