Some checks failed
Движок: 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>
337 lines
24 KiB
JavaScript
337 lines
24 KiB
JavaScript
/**
|
||
* 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 },
|
||
];
|