studio/src/community/docsGames.js
МИН 76b2afd312
Some checks failed
CI / Lint (pull_request) Failing after 5s
CI / PR size check (pull_request) Successful in 12s
CI / Secret scan (pull_request) Failing after 14m51s
CI / Build (pull_request) Failing after 14m52s
CI / Deploy to S1 + S2 (pull_request) Has been cancelled
feat(10): живые 3D-надписи (attachFace) + витрина-лутбокс + вики
Движок: LabelManager attachFace (текст плоско на грань примитива, FRONTSIDE
без зеркала), tilt, 5 пресетов, richText; GameRuntime scene.move/scene.rotate
для моделей и примитивов; ScriptSandboxWorker obj.move/obj.rotate в Instance-
proxy; InspectorPanel настройки label. Вики: карточка #57 guide-dynamic-label
(Часовая башня) + полная статья-урок с разбором attachFace/obj.move/format.money.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 21:15:54 +03:00

337 lines
24 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* docsGames.js — каталог 50 мини-игр-уроков вики Рублокса.
*
* Раздел K вики. Каждая игра — карточка: { id, num, title, stars, icon,
* desc, mechanics, ready }.
* - num — порядковый номер 1..50
* - stars — сложность 1..3
* - icon — имя SVG-иконки из docsIcons.jsx (НЕ эмодзи)
* - desc — что получится в игре, 1-2 предложения
* - mechanics — список механик, которым учит игра
* - previewShot — (необязательно) имя файла из public/wiki/ для
* превью на карточке. По умолчанию берётся
* lessonN-result.png; задаётся, когда другой кадр
* урока смотрится на карточке лучше.
* - ready — есть ли подробный урок (пока у всех false — наполним позже)
*
* Группы:
* 1-12 — самые простые
* 13-28 — простые с механиками
* 29-40 — средние
* 41-50 — сложные
*/
export const GAME_GROUPS = [
{ id: 'g1', title: 'Группа 1 — Самые простые', stars: 1,
hint: 'Постановка объектов, базовые скрипты, события, простые твины.' },
{ id: 'g2', title: 'Группа 2 — Простые с механиками', stars: 2,
hint: 'NPC, инвентарь, теги, billboard, камера, констрейнты.' },
{ id: 'g3', title: 'Группа 3 — Средние', stars: 2,
hint: 'Комбинации механик, GUI, состояние игры, NPC-логика.' },
{ id: 'g4', title: 'Группа 4 — Сложные', stars: 3,
hint: 'Полные игры, мультиплеер, продвинутые системы.' },
{ id: 'g5', title: 'Разбор готовых игр', stars: 2,
hint: 'Настоящие игры из студии по косточкам: камера и таблички, анимации интерфейса, модальные сцены и кастомные скины. У каждой — кнопка «Открыть оригинал в редакторе».' },
];
export const GAMES = [
// ── Группа 1 — Самые простые ──────────────────────────────────
{ id: 'collect-coins', num: 1, group: 'g1', stars: 1, icon: 'coin',
title: 'Собери монетки',
desc: 'Ходишь по уровню и собираешь жёлтые сферы, счёт растёт.',
mechanics: ['события касания', 'счётчик очков', 'удаление объектов'],
ready: false },
{ id: 'platform-jump', num: 2, group: 'g1', stars: 1, icon: 'jump',
title: 'Прыгай по платформам',
desc: 'Паркур из примитивов — допрыгай до финиша, не упав вниз.',
mechanics: ['примитивы-платформы', 'точка спавна', 'финиш'],
ready: false },
{ id: 'dont-fall', num: 3, group: 'g1', stars: 1, icon: 'hole',
title: 'Не упади',
desc: 'Платформы исчезают под ногами — нужно всё время убегать.',
mechanics: ['таймеры', 'исчезновение объектов', 'onTouch'],
ready: false },
{ id: 'button-door', num: 4, group: 'g1', stars: 1, icon: 'door',
title: 'Кнопка-открывашка',
desc: 'Нажми кнопку клавишей E — и откроется дверь в следующую комнату.',
mechanics: ['ProximityPrompt (E)', 'твины', 'перемещение объектов'],
ready: false },
{ id: 'maze', num: 5, group: 'g1', stars: 1, icon: 'maze',
title: 'Лабиринт',
desc: 'Найди путь из стен-кубов от старта к выходу из лабиринта.',
mechanics: ['постройка из блоков', 'спавн', 'триггер-финиш'],
// на карточке лучше виден лабиринт сверху — берём второй скрин урока
previewShot: 'lesson5-scene.png',
ready: false },
{ id: 'color-tiles', num: 6, group: 'g1', stars: 1, icon: 'palette',
title: 'Цветные плитки',
desc: 'Наступаешь на плитки на полу — и они меняют свой цвет.',
mechanics: ['onTouch', 'setColor', 'примитивы-плитки'],
ready: false },
{ id: 'catch-falling', num: 7, group: 'g1', stars: 1, icon: 'box',
title: 'Поймай падающее',
desc: 'С неба падают кубы — лови их, пока не упали на землю.',
mechanics: ['спавн с таймером', 'физика падения', 'счёт'],
ready: false },
{ id: 'run-to-finish', num: 8, group: 'g1', stars: 1, icon: 'flag',
title: 'Беги к финишу',
desc: 'Гонка на время: добеги до финишной черты как можно быстрее.',
mechanics: ['таймер', 'триггер-финиш', 'game.ui'],
ready: false },
{ id: 'traffic-light', num: 9, group: 'g1', stars: 1, icon: 'light',
title: 'Светофор',
desc: 'Стой на красный, беги на зелёный — успей дойти до конца.',
mechanics: ['лампы', 'таймеры', 'проверка движения'],
ready: false },
{ id: 'spring-jump', num: 10, group: 'g1', stars: 1, icon: 'spring',
title: 'Прыжок-пружина',
desc: 'Батуты подбрасывают тебя всё выше — допрыгни до верхней площадки.',
mechanics: ['пружины (spring)', 'boostJump', 'onTouch'],
ready: false },
{ id: 'echo-room', num: 11, group: 'g1', stars: 1, icon: 'sound',
title: 'Эхо-комната',
desc: 'Наступаешь на плитку — играет звук. Собери мелодию из шагов.',
mechanics: ['game.sound', 'onTouch', '3D-звук'],
ready: false },
{ id: 'code-door', num: 12, group: 'g1', stars: 1, icon: 'keypad',
title: 'Дверь по коду',
desc: 'Введи правильное число в поле ввода — и дверь откроется.',
mechanics: ['GUI-поле ввода', 'onSubmit', 'твины'],
ready: false },
// ── Группа 2 — Простые с механиками ───────────────────────────
{ id: 'trader', num: 13, group: 'g2', stars: 2, icon: 'trader',
title: 'Торговец',
desc: 'Поговори с NPC-торговцем по клавише E и получи от него предмет.',
mechanics: ['NPC', 'диалоги', 'инвентарь'],
ready: false },
{ id: 'collect-by-tag', num: 14, group: 'g2', stars: 2, icon: 'star',
title: 'Собери по тегам',
desc: 'Собери все объекты, помеченные тегом «звезда», на уровне.',
mechanics: ['теги', 'getTagged', 'счётчик'],
ready: false },
{ id: 'shooting-range', num: 15, group: 'g2', stars: 2, icon: 'crosshair',
title: 'Тир',
desc: 'Стреляй по мишеням лучом-raycast и считай выбитые очки.',
mechanics: ['raycast', 'onClick', 'счёт'],
ready: false },
{ id: 'lava-floor', num: 16, group: 'g2', stars: 2, icon: 'lava',
title: 'Лава-пол',
desc: 'Пол наносит урон — прыгай только по безопасным островкам.',
mechanics: ['урон по касанию', 'HP', 'платформы'],
ready: false },
{ id: 'key-chest', num: 17, group: 'g2', stars: 2, icon: 'key',
title: 'Ключ и сундук',
desc: 'Найди ключ на уровне, подбери его и открой запертый сундук.',
mechanics: ['инвентарь', 'has()', 'ProximityPrompt'],
ready: false },
{ id: 'swing', num: 18, group: 'g2', stars: 2, icon: 'swing',
title: 'Качели',
desc: 'Запрыгни на качели-констрейнт и катайся туда-сюда.',
mechanics: ['констрейнт-петля (hinge)', 'физика'],
ready: false },
{ id: 'elevator', num: 19, group: 'g2', stars: 2, icon: 'elevator',
title: 'Лифт',
desc: 'Платформа-лифт возит тебя между этажами здания.',
mechanics: ['твины', 'движущаяся платформа', 'триггеры'],
ready: false },
{ id: 'enemy-names', num: 20, group: 'g2', stars: 2, icon: 'tag',
title: 'Имена над врагами',
desc: 'У каждого врага над головой висит метка с именем и его HP.',
mechanics: ['billboard-метки', 'NPC', 'HP'],
ready: false },
{ id: 'chaser', num: 21, group: 'g2', stars: 2, icon: 'chase',
title: 'Преследователь',
desc: 'NPC гонится за тобой по всему уровню — убегай и прячься.',
mechanics: ['NPC follow', 'distance', 'onTick'],
ready: false },
{ id: 'danger-zone', num: 22, group: 'g2', stars: 2, icon: 'warning',
title: 'Зона опасности',
desc: 'Войдёшь в триггер-зону — начинаешь терять здоровье.',
mechanics: ['триггер-зона', 'onTouch/onUntouch', 'урон'],
ready: false },
{ id: 'switches', num: 23, group: 'g2', stars: 2, icon: 'lever',
title: 'Переключатели',
desc: 'Активируй три рычага в правильном порядке, чтобы пройти дальше.',
mechanics: ['ProximityPrompt', 'состояние', 'проверка порядка'],
ready: false },
{ id: 'falling-bridge', num: 24, group: 'g2', stars: 2, icon: 'bridge',
title: 'Падающий мост',
desc: 'Мост собран из исчезающих платформ — беги, пока он не рухнул.',
mechanics: ['таймеры', 'исчезновение', 'onTouch'],
ready: false },
{ id: 'flyby-camera', num: 25, group: 'g2', stars: 2, icon: 'camera',
title: 'Камера-облёт',
desc: 'При старте игры камера красиво облетает весь уровень.',
mechanics: ['game.camera.cutscene', 'onCutsceneDone'],
ready: false },
{ id: 'coin-magnet', num: 26, group: 'g2', stars: 2, icon: 'magnet',
title: 'Магнит монет',
desc: 'Монеты сами летят к игроку, когда он подходит близко.',
mechanics: ['твин к позиции', 'distance', 'onTick'],
ready: false },
{ id: 'double-jump', num: 27, group: 'g2', stars: 2, icon: 'doubleArrow',
title: 'Двойной прыжок',
desc: 'Паркур, где не пройти без двойного прыжка в воздухе.',
mechanics: ['setDoubleJump', 'платформы', 'финиш'],
ready: false },
{ id: 'ghost-walls', num: 28, group: 'g2', stars: 2, icon: 'ghost',
title: 'Призрачные стены',
desc: 'Некоторые стены становятся проходимыми — найди секретный путь.',
mechanics: ['passThrough', 'триггеры', 'секреты'],
ready: false },
// ── Группа 3 — Средние ────────────────────────────────────────
{ id: 'shop', num: 29, group: 'g3', stars: 2, icon: 'cart',
title: 'Магазин',
desc: 'GUI-список товаров — покупай предметы за собранные монеты.',
mechanics: ['GUI-список', 'экономика', 'инвентарь'],
ready: false },
{ id: 'quest-tasks', num: 30, group: 'g3', stars: 2, icon: 'scroll',
title: 'Квест с заданиями',
desc: 'NPC выдаёт цепочку заданий — выполни их все по очереди.',
mechanics: ['NPC-диалоги', 'состояние квеста', 'события'],
ready: false },
{ id: 'base-defense', num: 31, group: 'g3', stars: 2, icon: 'shield',
title: 'Защита базы',
desc: 'Враги идут к твоей базе — останавливай их, пока не дошли.',
mechanics: ['NPC-волны', 'raycast', 'HP базы'],
ready: false },
{ id: 'lap-race', num: 32, group: 'g3', stars: 2, icon: 'car',
title: 'Гонка с кругами',
desc: 'Проедь несколько кругов через чекпоинты на время.',
mechanics: ['чекпоинты', 'таймер', 'счётчик кругов'],
ready: false },
{ id: 'boss-platformer', num: 33, group: 'g3', stars: 2, icon: 'boss',
title: 'Платформер с боссом',
desc: 'Пройди паркур до NPC-босса и победи его в конце уровня.',
mechanics: ['паркур', 'NPC-босс', 'бой'],
ready: false },
{ id: 'harvest', num: 34, group: 'g3', stars: 2, icon: 'plant',
title: 'Сбор урожая',
desc: 'Растения растут на грядках — собирай их вовремя, пока спелые.',
mechanics: ['твины роста', 'таймеры', 'счёт'],
ready: false },
{ id: 'hide-from-npc', num: 35, group: 'g3', stars: 2, icon: 'hide',
title: 'Прятки от NPC',
desc: 'NPC ищет тебя по уровню — прячься за объектами, чтобы не нашёл.',
mechanics: ['NPC-логика', 'raycast видимости', 'distance'],
ready: false },
{ id: 'box-puzzle', num: 36, group: 'g3', stars: 2, icon: 'puzzle',
title: 'Головоломка с ящиками',
desc: 'Двигай ящики на кнопки-плиты, чтобы открыть запертую дверь.',
mechanics: ['физика толкания', 'кнопки-плиты', 'логика'],
ready: false },
{ id: 'obstacle-course', num: 37, group: 'g3', stars: 2, icon: 'obstacle',
title: 'Полоса препятствий',
desc: 'Шипы, ямы и движущиеся платформы — пройди всё без смерти.',
mechanics: ['шипы', 'движущиеся платформы', 'чекпоинты'],
ready: false },
{ id: 'music-game', num: 38, group: 'g3', stars: 2, icon: 'music',
title: 'Музыкальная игра',
desc: 'Запомни и повтори последовательность звуков, которую сыграла игра.',
mechanics: ['game.sound', 'массивы', 'проверка ответа'],
ready: false },
{ id: 'tower-build', num: 39, group: 'g3', stars: 2, icon: 'tower',
title: 'Башня — стройка',
desc: 'Ставь блоки по подсказкам скрипта и построй высокую башню.',
mechanics: ['спавн блоков', 'GUI-подсказки', 'счётчик'],
ready: false },
{ id: 'wave-survival', num: 40, group: 'g3', stars: 2, icon: 'zombie',
title: 'Выживание от волн',
desc: 'Волны врагов нападают одна за другой — продержись N секунд.',
mechanics: ['NPC-волны', 'таймеры', 'HP'],
ready: false },
// ── Группа 4 — Сложные ────────────────────────────────────────
{ id: 'adventure-platformer', num: 41, group: 'g4', stars: 3, icon: 'map',
title: 'Платформер-приключение',
desc: 'Большой уровень с чекпоинтами, врагами и финишем-сокровищем.',
mechanics: ['большой уровень', 'чекпоинты', 'враги', 'финиш'],
ready: false },
{ id: 'rpg-village', num: 42, group: 'g4', stars: 3, icon: 'village',
title: 'RPG-деревня',
desc: 'Деревня с NPC, диалогами, квестами, инвентарём и торговлей.',
mechanics: ['NPC', 'квесты', 'инвентарь', 'экономика'],
ready: false },
{ id: 'obstacle-race', num: 43, group: 'g4', stars: 3, icon: 'car',
title: 'Гонка с препятствиями',
desc: 'Трасса с бустами скорости и ловушками — приди первым к финишу.',
mechanics: ['бусты', 'ловушки', 'таймер', 'чекпоинты'],
ready: false },
{ id: 'tower-defense', num: 44, group: 'g4', stars: 3, icon: 'castle',
title: 'Tower Defense',
desc: 'Ставь башни вдоль дороги и отбивай волны наступающих врагов.',
mechanics: ['GUI-меню', 'NPC-волны', 'башни', 'экономика'],
ready: false },
{ id: 'arena-shooter', num: 45, group: 'g4', stars: 3, icon: 'gun',
title: 'Стрелялка-арена',
desc: 'Оружие, враги, очки и GUI-счёт — выживай на боевой арене.',
mechanics: ['оружие (Tool)', 'raycast', 'NPC', 'GUI-счёт'],
ready: false },
{ id: 'clicker', num: 46, group: 'g4', stars: 3, icon: 'click',
title: 'Кликер',
desc: 'GUI-игра: кликай по кнопке, копи очки и покупай улучшения.',
mechanics: ['GUI', 'game.save', 'экономика улучшений'],
ready: false },
{ id: 'escape-quest', num: 47, group: 'g4', stars: 3, icon: 'door',
title: 'Квест-побег',
desc: 'Комната-головоломка: реши все загадки и найди выход.',
mechanics: ['головоломки', 'инвентарь', 'состояние', 'триггеры'],
ready: false },
{ id: 'mp-tag', num: 48, group: 'g4', stars: 3, icon: 'chase',
title: 'Мультиплеер: Салки',
desc: 'Несколько игроков, один водящий — догони и осаль остальных.',
mechanics: ['мультиплеер', 'команды', 'game.room'],
ready: false },
{ id: 'mp-race', num: 49, group: 'g4', stars: 3, icon: 'trophy',
title: 'Мультиплеер: Гонка',
desc: 'Соревнование игроков на трассе с общим счётом комнаты.',
mechanics: ['мультиплеер', 'game.room', 'чекпоинты'],
ready: false },
{ id: 'make-your-own', num: 50, group: 'g4', stars: 3, icon: 'sparkles',
title: 'Своя игра',
desc: 'Гайд: как придумать и собрать собственную игру с нуля.',
mechanics: ['проектирование игры', 'все механики вместе'],
ready: false },
// ── Группа 5 — Разбор готовых игр ─────────────────────────────
// Это НАСТОЯЩИЕ игры из студии. У карточек есть openProjectId —
// кнопка открывает оригинал игры в редакторе (а не строит из билдера).
{ id: 'guide-dvor', num: 51, group: 'g5', stars: 1, icon: 'camera',
title: 'Двор с табличкой',
desc: 'Учимся крутить камеру мышкой как в Roblox и нажимать на 3D-таблички прямо в мире.',
mechanics: ['камера и мышь', 'ПКМ-orbit и зум', 'Shift-Lock (L)', '3D-таблички'],
previewShot: 'guide-dvor-scene.png', openProjectId: 1991, ready: true },
{ id: 'guide-vitrina', num: 52, group: 'g5', stars: 2, icon: 'palette',
title: 'Витрина GUI',
desc: 'Живые кнопки магазина: градиенты, пульсация, поворот и плавные твины при нажатии.',
mechanics: ['GUI-кнопки', 'анимации (pulse/rotate)', 'твины', 'счётчик монет'],
previewShot: 'guide-vitrina-scene.png', openProjectId: 1995, ready: true },
{ id: 'guide-sunduk', num: 53, group: 'g5', stars: 2, icon: 'scroll',
title: 'Тайна старого сундука',
desc: 'Кат-сцены и диалоги: затемнение, прожектор на сундуке, выбор приза и финальная победа.',
mechanics: ['game.modal', 'диалог по строкам', 'прожектор + камера', 'лутбокс'],
previewShot: 'guide-sunduk-scene.png', openProjectId: 2037, ready: true },
{ id: 'guide-zoo', num: 54, group: 'g5', stars: 2, icon: 'gamepad',
title: 'Парк животных',
desc: 'Кастомные скины: герой превращается в пончик, машину, пришельца. Магазин скинов на B.',
mechanics: ['game.player.setSkin', 'non-humanoid скины', 'магазин скинов', 'таблички'],
previewShot: 'guide-zoo-scene.png', openProjectId: 2046, ready: true },
{ id: 'guide-strelka', num: 55, group: 'g5', stars: 1, icon: 'gamepad',
title: 'Туториал — собери монетки',
desc: '3D-стрелка-указатель «иди сюда»: дорожка из бегущих шевронов + парящий маркер над целью. Дошёл — стрелка прыгает на следующую.',
mechanics: ['game.fx.pointer', 'preset стрелки', 'setTarget/update', 'onTouch цели'],
previewShot: 'guide-strelka-scene.png', openProjectId: 333, ready: true },
{ id: 'guide-lego', num: 56, group: 'g5', stars: 1, icon: 'cube',
title: 'Лего-полигон — studs материал',
desc: 'Лего-кружки (studs) на блоках и примитивах любого цвета: зелёный пол, оранжевая стена, разноцветные кубы + готовый лего-сет (дерево, дом, машина).',
mechanics: ['material: studs', 'studs-block (цвет на блок)', 'тайлинг по размеру', 'лего-сет моделей'],
previewShot: 'guide-lego-scene.png', openProjectId: 2217, ready: true },
{ id: 'guide-dynamic-label', num: 57, group: 'g5', stars: 2, icon: 'clock',
title: 'Часовая башня — живые 3D-надписи',
desc: 'Живые 3D-надписи + витрина-лутбокс: таймер над башней, ряд подиумов с вращающимися предметами и наклонными табличками-ценниками, счётчик монет (клик +10), HP над зомби. Текст крепится плоско к грани наклонного примитива.',
mechanics: ['scene.bindLabel', 'scene.bindTimer', 'attachFace (текст на грани)', '5 пресетов (gameui/boss-hp/reward…)', 'richText <color>', 'game.format.money', 'obj.move/rotate', 'onClick объекта'],
previewShot: 'guide-dynamic-label-scene.png', openProjectId: 2261, ready: true },
];