Тетрис, где падают не фигуры — а сам колодец качается, смещается и живёт своей жизнью
«Что если в тетрис можно было бы играть, наклоняя стакан — как реальный физический сосуд с кубиками внутри?»
GRAVITRIS — реинтерпретация классического тетриса, построенная на одной радикальной инверсии: игрок управляет не падающей фигурой, а самим колодцем.
Управляй пространством, а не объектом. Это меняет всю ментальную модель.
Колодец ощущается как реальный сосуд — инерция, качание, вес, вибрация.
Каждое действие — событие. Звук, свет, анимация, частицы. Игра живая.
Опытный тетрис-игрок поймёт цель с первого взгляда, но учится заново.
При нажатии ← или → все занятые ячейки в колодце сдвигаются на одну позицию. Блоки, выходящие за правую границу, появляются слева — и наоборот. Это торoidальная топология по горизонтали. Падающая фигура при этом не смещается.
Исключение — режим MAGNET: там ← → двигают саму фигуру, а сдвиг колодца прижимает блоки к стенке без оборачивания.
| Клавиша | Обычные режимы | Режим Magnet |
|---|---|---|
| ← → | Циклический сдвиг колодца | Двигает падающую фигуру |
| ↑ / Z | Вращение фигуры | Вращение фигуры |
| ↓ | Мягкий дроп | Мягкий дроп |
| Пробел | Жёсткий дроп | Жёсткий дроп |
| C / Shift | Hold | Hold |
| P | Пауза | Пауза |
Поле 10×20 ячеек. Классические тетромино I, O, T, S, Z, J, L. Набор 7-bag.
| Уровень | Скорость падения | Особенности |
|---|---|---|
| 1–3 | 1.0 с/клетка | Базовая механика |
| 4–9 | 0.6–0.35 с/клетка | Нарастающий темп |
| 10–15 | 0.3–0.2 с/клетка | Подключаются слои музыки |
| 16+ | ≤0.15 с/клетка | Гравитационный импульс активен |
| Событие | Очки |
|---|---|
| 1 линия (Single) | 100 × уровень |
| 2 линии (Double) | 300 × уровень |
| 3 линии (Triple) | 500 × уровень |
| 4 линии (Tetris) | 800 × уровень |
| Комбо | +50 × номер комбо |
| Мягкий дроп | 1 за клетку |
| Жёсткий дроп | 2 за клетку |
Каждые 15–35 секунд — случайный авто-сдвиг на 1–3 позиции. За 2.5 секунды до удара: нарастающий гул + красная подсветка рамки колодца. При ударе: белая вспышка, встряска, кольцо частиц из центра.
До game over. Уровни 1–20+. Таймер в HUD. Основной режим.
Очистить 40 линий максимально быстро. Рекорд по времени.
Максимум очков за 2 минуты. Старт с уровня 15. Таймер обратного отсчёта с миганием в последние 20 сек.
Колодец автоматически сдвигается волнами, синхронно с ритмом. Период сокращается с уровнем. Прогресс-бар волны внизу.
← → двигают фигуру, а не колодец. При сдвиге блоки прижимаются к стенке без wrap. Классическая механика позиционирования + новая физика поля.
Каждые 20 сек — случайный эффект: инверсия стрелок, темнота, двойной сдвиг, качка, ускорение ×3, мега-гравитация. HUD показывает обратный отсчёт.
| Эффект | Длительность | Описание |
|---|---|---|
| Инверсия | 8 с | ← и → меняются местами |
| Темнота | 6 с | Лежащие блоки почти невидимы |
| Двойной сдвиг | 7 с | Каждый сдвиг смещает на 2 позиции |
| Качка | 6 с | При активации случайно вращает фигуру |
| Скорость | 5 с | Падение в 3× быстрее |
| Мега-гравитация | мгновенно | 3 авто-сдвига подряд |
±3° пружинная анимация при каждом сдвиге. Отключается в настройках профиля.
При посадке, Tetris, дропе, импульсе — разная интенсивность.
Зелёный → красный по мере заполнения. Только на критическом уровне (>75%).
Красная рамка нарастает за 2.5с до удара.
| Скин | Разблокировка | Эффект |
|---|---|---|
| Классика | Всегда | 3D-блок с фаской и подсветкой |
| Неон | Уровень профиля 3 | Тёмный фон, светящийся контур, точки в углах |
| Стекло | Уровень профиля 6 | Полупрозрачный, блик, диагональный отсвет |
| Пиксель | 100 линий | Чекерборд 4px пикселей |
| Металл | Достижение TETRIS | Brushed metal, горизонтальные штрихи, бевел |
| Лава | Уровень профиля 10 | Пульсирующий жар, живая анимация |
| Пустота | Perfect Clear | Звёздная пыль, пульсирующий контур |
| Голограмма | 50 игр | Сканлайны, мерцание, угловые скобки |
Весь звук генерируется процедурно через Web Audio API — никаких семплов. Полная независимость от внешних ресурсов.
| Слой | Активируется | Описание |
|---|---|---|
| Drums | С уровня 1 | Kick, snare, hi-hat. Паттерн усложняется с уровня 6 |
| Bass | С уровня 3 | Sawtooth бас по D-minor pentatonic. Вариация с уровня 8 |
| Lead | С уровня 6 | Square-мелодия. Более сложная вариация с уровня 12 |
| Pad | С уровня 10 | Мягкие треугольные аккорды Dm/Cm, долгое затухание |
| Danger drone | При заполнении >75% | Sine-осциллятор, нарастает до критической высоты. Мгновенно глушится при game over |
Отдельно от игровых уровней — глобальный уровень профиля. Сохраняется в localStorage. XP за игру: 10 базово + бонус за уровень, линии, очки, тетрисы, perfect clear.
В авто-демо режиме XP и достижения не начисляются.
| Достижение | Условие | XP |
|---|---|---|
| Первый сдвиг | Сдвинуть колодец 1 раз | 20 |
| Сдвигатель | 100 сдвигов суммарно | 50 |
| Вихрь | 1000 сдвигов суммарно | 150 |
| TETRIS! | 4 линии за раз | 80 |
| Пироман | 5 Tetris в одной игре | 200 |
| Комбо-машина | Комбо x5 | 100 |
| 100 линий | Суммарно 100 линий | 60 |
| Строитель | Суммарно 1000 линий | 200 |
| Глубокий колодец | Уровень игры 10 | 120 |
| В стратосферу | Уровень игры 20 | 300 |
| Финишёр | Завершить Sprint 40 | 100 |
| Молния | Sprint 40 быстрее 30 сек | 250 |
| Ультра | Завершить Ultra 2min | 100 |
| Серфер | Выжить в Tsunami | 100 |
| Идеальный колодец | Perfect Clear | 300 |
| Сто тысяч | 100 000 очков в одной игре | 200 |
| Регуляр | 10 игр | 80 |
| Ветеран | 50 игр | 250 |
Все скины блоков рендерятся процедурно через Canvas API. Скины Лава, Пустота и Голограмма анимированы — меняются каждый кадр через Date.now().
Выбор скина доступен в профиле. Заблокированные скины отображаются серыми с иконкой замка и условием разблокировки. Выбор сохраняется в localStorage.
Режим автоматической игры с AI-ботом. Запускается кнопкой «▶ Авто-демо» в главном меню.
style.width/height| Кнопка | Действие |
|---|---|
| ← → | Сдвиг колодца (или движение фигуры в Magnet) |
| ↻ (круглая) | Вращение фигуры |
| ↓ (зажать) | Мягкий дроп с авто-повтором |
| HOLD | Hold фигуры |
| DROP | Жёсткий дроп |
Один HTML-файл. Никаких зависимостей, фреймворков или сборщиков. Работает офлайн.
Canvas 2D API. Два слоя: игровой (well-canvas) и частицы (particle-canvas).
Web Audio API — полностью процедурный звук и музыка. Никаких аудиофайлов.
localStorage. XP, уровень профиля, статистика, достижения, активный скин, настройки.
Vanilla JS. Матрица — Uint8-совместимый массив 10×20. Горячий путь без Object overhead.
Частицы через object pool. RAF loop. Музыкальные слои обновляются раз в 30 кадров.
loop(now) ├── Mode ticks (ultra timer, sprint counter, tsunami wave, chaos events) ├── Gravity Impulse (lv 16+) ├── Auto drop → lock() → checkLines() → [clearRows animation] → finalClear() ├── Spring physics (shake, tilt) └── draw() → matrix + ghost + piece + glow + particles shiftWell(dir) ├── Pre-check: simulate shift on copy, test hit() → cancel if blocked ├── Apply toroidal shift (or magnet compress) └── Trail particles + SFX + arrow indicator AI autoplay ├── bestMove(): enumerate rotations × positions, eval each board ├── executePlan(): rotate → shift → hard drop with human delays └── gameover hook → auto-restart after 3.2s