From 7bb789f1affe7bb88302d43eb3346f493c0c0af5 Mon Sep 17 00:00:00 2001 From: min Date: Sat, 6 Jun 2026 10:04:57 +0300 Subject: [PATCH] =?UTF-8?q?docs(studio):=20=D0=B2=D0=B8=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=2020=20=E2=80=94=20=D0=BA?= =?UTF-8?q?=D0=B0=D1=80=D1=82=D0=BE=D1=87=D0=BA=D0=B0=20#63=20+=20=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D1=82=D1=8C=D1=8F=20=C2=AB=D0=A1=D0=B1=D0=BE=D1=80?= =?UTF-8?q?=20=D0=BC=D0=BE=D0=BD=D0=B5=D1=82=20(=D0=BB=D0=B8=D0=B4=D0=B5?= =?UTF-8?q?=D1=80=D0=B1=D0=BE=D1=80=D0=B4=D1=8B=20=D0=B8=20=D0=B4=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D0=B8=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F)=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Карточка g5 #63 guide-leaderstats (openProjectId 2616) + статья в docsLessons: что получится, API leaderstats/achievements, 2 шага (таблица/достижения), bindToStat, сохранение в БД. 3 скрина (scene/play/page) — донести вручную (headless-студия не пускает после взлома, попрошу у пользователя). Co-Authored-By: Claude Opus 4.8 --- src/community/docsGames.js | 5 ++ src/community/docsLessons.jsx | 88 +++++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+) diff --git a/src/community/docsGames.js b/src/community/docsGames.js index 06d58db..b7a30fd 100644 --- a/src/community/docsGames.js +++ b/src/community/docsGames.js @@ -358,4 +358,9 @@ export const GAMES = [ desc: 'Одной строкой меняешь небо: голубой день, закат, звёздная ночь, космос. Облака, туман, далёкие горы и плавные переходы между пресетами.', mechanics: ['game.scene.setSkybox({ preset })', 'game.scene.setClouds / setFog', 'skybox.fadeTo(opts, сек) — плавный переход', '6 пресетов: день/lowpoly/закат/ночь/космос', 'небо = единый источник света сцены', 'облака-дрейф + дымка горизонта'], previewShot: 'guide-skybox-scene.png', openProjectId: 2541, ready: true }, + { id: 'guide-leaderstats', num: 63, group: 'g5', stars: 2, icon: 'trophy', + title: 'Сбор монет — лидерборды и достижения', + desc: 'Таблица лидеров справа-сверху (монеты/время/уровень) + всплывающие достижения с редкостью и звуком. Прогресс сохраняется в БД между сессиями.', + mechanics: ['game.leaderstats.define / me.add', 'HUD-таблица топ-10 (сортировка по primary)', 'game.achievements.define / unlock', 'bindToStat — авто-награда по статy', 'toast 4 редкости + очередь', 'кубок → страница достижений', 'сохранение в БД (savegame)'], + previewShot: 'guide-leaderstats-scene.png', openProjectId: 2616, ready: true }, ]; diff --git a/src/community/docsLessons.jsx b/src/community/docsLessons.jsx index 8562c3b..d2fba82 100644 --- a/src/community/docsLessons.jsx +++ b/src/community/docsLessons.jsx @@ -8691,6 +8691,94 @@ game.gui.onClick('btn-space', () => game.scene.skybox.fadeTo({ preset: 'space' ), }, + 'guide-leaderstats': { + body: ( + <> +

Что получится

+

+ Игра «собери монеты» с двумя системами удержания, как в Roblox: + таблица лидеров справа-сверху (монеты, время, уровень) и + достижения — всплывающие награды с редкостью, звуком и + страницей-витриной. Прогресс сохраняется в базе — закрыл + игру, вернулся завтра, а монеты и открытые ачивки на месте. +

+ + + +

Чему научишься

+
    +
  • game.leaderstats.define(name, opts) — столбец таблицы: + иконка, цвет, формат (число / время / 1.2K), primary (по нему сортировка);
  • +
  • game.leaderstats.me.add('Монеты', 1) — изменить стат игрока + (ячейка жёлто мигает);
  • +
  • game.achievements.define([...]) — объявить достижения + (id, название, описание, редкость, очки, скрытое);
  • +
  • game.achievements.unlock(id) — выдать достижение (плашка + звук);
  • +
  • game.achievements.bindToStat(id, 'Монеты', {'{'} gte: 10 {'}'}) — + авто-награда при достижении значения стата;
  • +
  • прогресс сохраняется в БД и подгружается в новой сессии.
  • +
+ +

Шаг 1. Таблица лидеров

+

+ Объяви столбцы. Первый primary: true — по нему сортируются + игроки в топе. Дальше меняй значения через me.add / me.set. +

+ + {`game.leaderstats.define('Монеты', { initial: 0, format: 'number', icon: '🪙', color: '#ffd23a', primary: true }); +game.leaderstats.define('Время', { initial: 0, format: 'time', icon: '⏱', color: '#7fd0ff' }); +game.leaderstats.define('Уровень', { initial: 1, format: 'number', icon: '⭐', color: '#b48bff' }); + +// Время идёт само, монеты — за подбор +game.every(1, () => game.leaderstats.me.add('Время', 1)); +game.leaderstats.me.add('Монеты', 1);`} + +

Шаг 2. Достижения

+

+ Объяви список достижений с редкостью (common / rare / epic / + legendary — разный цвет плашки и звук). Выдавай явно через + unlock или автоматически через bindToStat. +

+ + {`game.achievements.define([ + { id:'first_coin', name:'Первая монета', description:'Подобрать монету', icon:'🪙', rarity:'common', points:5 }, + { id:'fifty_coins', name:'Полная сумка', description:'Собрать 50 монет', icon:'💰', rarity:'rare', points:25 }, +]); + +// Авто-награда: как только Монеты >= 50 — плашка «Полная сумка» сама выедет +game.achievements.bindToStat('fifty_coins', 'Монеты', { gte: 50 }); + +// Явная выдача (на первой монете) +game.achievements.unlock('first_coin');`} + + + + + Прогресс игрока (значения статов + открытые достижения) автоматически + сохраняется в базу и подгружается при следующем входе — ничего + дописывать не нужно. Уже открытое достижение второй раз плашкой не + показывается (оно «навсегда»). + + +

Почему это важно

+

+ Лидерборды и достижения — главный механизм удержания: ребёнок + возвращается в игру за новым рекордом и новой ачивкой. Это основа + симуляторов, ферм и PvP — в Roblox столбец «Coins / Wins / Level» + есть почти в каждой игре. +

+ + + Добавь стат «Рекорд» и достижение 'speedrun', которое + выдаётся через bindToStat('Время', {'{'} lte: 30 {'}'}), + если собрать все монеты быстрее 30 секунд. + + + ), + }, + }; /** Есть ли готовый текст урока для игры с таким id. */