Оперативный план · v1.0 · Для служебного пользования

ISO MINES ПРОТИВОТАНКОВЫЕ МИНЫ

Сапёр в изометрии. Поле — настоящая земля с травой. Под ней — противотанковые мины. Задача: обезвредить всё, выжить, отметить каждую угрозу.

Жанр
Головоломка / Тактика
Платформа
Web / Mobile
Статус
Разработка
Версия
ПЛАН 1.0
// 01

Разведданные

СЕКРЕТНО

«Что если сапёр — это не серые клетки, а настоящий участок земли? Трава колышется, флажки стоят в грунте, а под каждым кликом — риск.»

ISO MINES — полевая версия классического сапёра. Игрок получает изометрическое поле: каждая клетка — ромб земли с травяной поверхностью. Под травой — цифры, предупреждающие о минах в соседних клетках. Цель — раскопать всё безопасное и отметить каждую мину флажком.

🌿
Живая почва

Трава шевелится на ветру. Бабочки порхают. Облака плывут. Это не сетка — это клочок земли.

💣
Реальная угроза

Противотанковые мины. Взрыв сотрясает экран, выбрасывает грязь, искры и дым. Нет пощады.

🚩
Полевые метки

Красные флажки втыкаются в землю и развеваются. Каждый — решение. Каждый — риск.

Максимум ощущений

Каждый клик — частицы. Каждая победа — салют. Каждый провал — эпичный взрыв.

// 02

Тактика

Изометрическое раскапывание

Поле в изометрии: каждая клетка — ромб, наклонённый под 30°. ЛКМ — раскопать. ПКМ / долгий тап — поставить флажок. Первый клик всегда безопасен: поле генерируется после него, зона 3×3 вокруг клика свободна от мин.

Каскадное открытие: клетка с 0 мин вокруг открывает всех соседей рекурсивно.

Схема управления

ДействиеМышьКлавиатураТач
РаскопатьЛКМEnter / SpaceТап
ФлажокПКМFДолгий тап 400мс
ChordЛКМ по цифреEnter по цифреДвойной тап по цифре
НавигацияСтрелки / WASDТап для выделения
ПаузаКнопкаP / EscКнопка

Правила Chord

// 03

Поле боя

Участки и сложность

УчастокРазмерМинОсобенности
Новичок9 × 910Базовая подготовка
Любитель16 × 1640Стандартный участок
Профессионал30 × 1699Поле для спецназа
Экстрим30 × 24180Плотное минирование

Система очков

СобытиеОчки
Раскопать клетку+10
Каскад (1 клетка)+5
Правильный флажок (при победе)+50
Победа+1000 × множитель
Бонус за время+max(0, (300 − сек) × 2)
Серия верных флажков×1.5 к флажкам

Множители

// 04

Операции

🌿
Классика

4 уровня сложности. Обычные правила. Рекорды по времени и очкам.

На время

10 попыток. Лучшее время фиксируется. Нет очков — только секунды.

Аркада

Каждые 30 секунд автоматически открывается одна безопасная клетка. Помощь, но штраф к очкам.

🎯
Точность

Флажков нет. Только раскапывание. Ошибка — смерть. Для профи.

🏗
Строитель

После победы поле растёт: +2 строки, +10% мин. До первого поражения.

🌑
Ночь

Видно только в радиусе 3 от последнего клика. Остальное — темнота. Фонари — бонусы.

Особенности Аркады

Особенности Ночи

// 05

Камуфляж

Палитра местности

Трава светлая#5a8f3c
Трава тёмная#3d6b2a
Земля#8b6914
Грунт#5c4033
Флажок#cc3300
Мина#222222
Акцент#4a5d23

Изометрический рендер

Живость мира

Трава

Волна синусоиды с разной фазой на каждой клетке. Скорость — сила ветра (рандом при старте).

Бабочки

1–3 штуки летают по кривым Безье. Улетают при взрыве.

Облака

2–4 облака на фоне, параллакс при движении мыши.

Свет

Градиент солнца на фоне. Клетки ближе к свету — ярче.

Частицы

6 типов местности

МестностьРазблокировкаОписание
ЛетоВсегдаЗелёная трава, яркое солнце, голубое небо
ОсеньУровень 3Оранжевая трава, падающие листья, тёплый свет
ЗимаУровень 6Снег, лёд, снежинки
Пустыня50 победПесок, кактусы, волны жары
МарсУровень 10Красный грунт, звёзды, низкая гравитация частиц
Неон100 игрТёмное поле, светящиеся цифры, голографические мины
// 06

Связь

Весь звук — процедурный, через Web Audio API. Никаких файлов.

4 слоя музыки

СлойУсловиеОписание
AmbienceСтартСверчки, ветер, тихий drone
Rhythm5 открытийПеркуссия, noise bursts, BPM 80
Melody25 открытий или 50% поляTriangle melody, пентатоника, осторожная
Tension<20% закрытыхНарастающий drone, диссонанс

Динамика

SFX

// 07

Награды

Уровень бойца

Глобальный уровень. Сохраняется в localStorage. XP: 20 базово + сложность + время + точность.

20 достижений

НаградаУсловиеXP
Первый шагПервая клетка10
КаскадёрКаскад 20+ клеток50
Мастер каскадаКаскад 50+ клеток150
Флаговод100 флажков30
Снайпер50 флажков подряд без ошибки100
Сапёр-новичокПобеда на лёгком20
Сапёр-профиПобеда на среднем50
Сапёр-ветеранПобеда на сложном100
Сапёр-легендаПобеда на экстриме200
МолниеносныйСложный быстрее 60 сек250
БезупречныйПобеда без ошибочных флажков80
Глаз-алмазПобеда в Точности150
Строитель5-й уровень в Строителе120
Ночной стражПобеда в Ночи100
Аркадный чемпионАркада без подсказок100
Серийный победитель3 победы подряд80
Неостановимый10 побед подряд250
Искатель10 фонарей в Ночи60
Регуляр25 игр50
Ветеран100 игр150
// 08

Снаряжение

Скины — процедурный Canvas. Зима, Пустыня, Марс, Неон имеют уникальные анимации.

Выбор в профиле. Заблокированные — серые с замком. Сохраняется в localStorage.

Настройки

// 09

Полевые условия

Адаптация

Тач

ЖестДействие
Тап по закрытойРаскопать
Долгий тап 400мсФлажок
Двойной тап по цифреChord
// 10

Техника

Платформа

Один HTML. Нет зависимостей, сборщиков, фреймворков. Работает офлайн.

Рендер

Canvas 2D. Два слоя: field-canvas + fx-canvas для частиц.

Аудио

Web Audio API — процедурный звук. Нет аудиофайлов.

Хранилище

localStorage. XP, уровень, статистика, достижения, скин, настройки, рекорды.

Логика

Vanilla JS. Плоский массив клеток: {mine, revealed, flagged, adjacent, bonus}.

Производительность

Object pool для частиц. RAF loop. Музыка — раз в 30 кадров. Изометрия — предрасчёт.

Архитектура

initGame(difficulty)
├── Создать матрицу width × height
├── firstClick = true
└── startRenderLoop()

onCellClick(x, y)
├── Если firstClick: generateMines(x, y)
├── Если flagged: ничего
├── Если mine: explode() → частицы, взрыв, game over
├── Иначе: reveal(x, y)
│   ├── Если adjacent === 0: floodFillReveal(x, y)
│   ├── particles(dirt)
│   └── checkWin()
└── updateMusicLayers()

generateMines(safeX, safeY)
├── Случайная растановка N мин
├── Исключение зоны 3×3 вокруг (safeX, safeY)
└── Подсчёт adjacent для каждой не-мины

floodFillReveal(x, y)
├── Очередь BFS/DFS
├── Для каждой клетки с adjacent === 0: добавить соседей
└── Для каждой открытой: particles(dust)

onCellRightClick(x, y)
├── toggleFlag(x, y)
├── particles(flag)
└── checkWin()

onChord(x, y)
├── Если flagsAround === adjacent: revealAllAround()
├── Если среди них mine: explode()
└── Иначе: particles(dust) + checkWin()
    
// 11

Отчёт

Выполнено

Вне скоупа