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: + таблица лидеров справа-сверху (монеты, время, уровень) и + достижения — всплывающие награды с редкостью, звуком и + страницей-витриной. Прогресс сохраняется в базе — закрыл + игру, вернулся завтра, а монеты и открытые ачивки на месте. +

+ + + +

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

+ + +

Шаг 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. */