Веб-SDK NUGANUGA
Ваша гра працює в ізольованому iframe на https://play.nuganuga.com. SDK — єдиний канал до платформи: авторизацію, рейтинги, поширення, рекламу й аналітику вам реалізовувати не потрібно.
1. Підключіть SDK
Завжди за цим абсолютним шляхом. Роздачу та версії забезпечує платформа.
<script src="/sdk/nuga-sdk.js"></script>
<script src="./game.js"></script>2. Чотири виклики
const ctx = await Nuga.ready(); // дочекатися платформи
await Nuga.game.start(); // коли гравець справді почав партію
await Nuga.score.submit({ score }); // рівно один числовий результат за партію
await Nuga.game.finish(); // платформа малює екран результатуНе малюйте власний екран результату, кнопку повтору, кнопку «поділитися» чи таблицю лідерів — платформа намалює їх після finish() однаково для всіх ігор.
3. Усе інше
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. Маніфест
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개의 타겟을 빠르게 클릭하세요." }
}
}Типи рейтингу: HIGH_SCORE, LOW_SCORE, LOW_TIME, HIGH_TIME, CUSTOM. Категорії: REACTION, TIMING, ACCURACY, MEMORY, PUZZLE, LUCK, ARCADE.
5. Правила пісочниці
Статична перевірка відхилить пакет, що порушує будь-яке з них, ще до того, як він дійде до гравця:
- Жодних зовнішніх URL — ні CDN, ні вебшрифтів, ні віддалених зображень. Усе має бути в пакеті.
- Жодних
eval,new Function,document.writeтаdocument.cookie. - Жодної власної мережі:
fetchна абсолютний URL,XMLHttpRequest,WebSocketі service worker блокуються і CSP, і перевіркою. - Жодної навігації верхнього рівня та жодних спливних вікон.
- Пакет менший за 5 МБ; мікроігри краще тримати в межах 1 МБ.
- Щонайменше один виклик
Nuga.score.submit()— гра, яка не видає результат, не може потрапити в рейтинг. - Оболонка платформи фіксована: index.html, таблиця стилів оболонки та обв’язка в game.js мають лишитися незмінними. Вам належать лише тіло run() і стилі #field.
6. Результати перевіряються
Для кожної партії створюється серверна сесія. Гра ніколи не бачить токен сесії — його зберігає оболонка платформи й надсилає результат за вас, — а сервер звіряє результат із реальною тривалістю та межами з маніфесту, перш ніж він потрапить до рейтингу.
Можна зробити надійніше. Беріть випадковість із виданого сервером зерна й записуйте, що сталося насправді: тоді сервер перерахує партію за вашими подіями, а не повірить числу. Результат, який запис не підтверджує, відхиляється одразу.
const rng = Nuga.random(); // зерно від сервера — відтворюване, на відміну від Math.random()
const target = rng.int(0, 8);
Nuga.replay.record('hit', 172); // одна значуща для результату подія, до 400 за партіюОголосіть механіку в nuga.json, щоб увімкнути це. Без неї гра все одно бере участь у рейтингу — але лише з перевірками тривалості та меж.
"verification": { "kind": "REPLAY_V1", "mechanic": "REACTION",
"params": { "rounds": 5 } }7. Публікація
Заархівуйте корінь пакета (не теку) і завантажте в консолі автора. Статична перевірка, збірка, а також набори runtime, адаптивності, геймплею та безпеки виконуються автоматично; публікація відкривається після їх проходження.