1. Визуальная концепция и философия дизайна
1.1 Базовая онтология системы
Игровое поле
трактуется как живая числовая сеть (Graph Field).
Каждая сота
— это узел графа, обладающий:
- уникальным ID,
- фиксированной позицией в
топологии,
- номиналом (value),
- типом (normal | ghost |
singularity).
Игрок не
управляет перемещением объектов.
Игрок осуществляет навигацию по графу, строя маршруты между узлами
одинакового номинала.
Любое
изменение состояния поля происходит только через:
- схлопывание маршрута
(Collapse),
- регенерацию узлов
(Regeneration),
- спавн новых узлов (Spawn
System).
Физическая
метафора отсутствует.
Игра моделирует поиск связности и усиление в дискретной сетевой структуре.
1.2 Визуальный стиль
Стиль:
светлый, воздушный, минималистичный.
Поле визуально воспринимается как чистая нейросхема на матовой
поверхности.
Запрещены:
- растровые текстуры,
- «тяжёлые» градиенты,
- тёмные фоны.
1.3 Цветовая схема (циклическая пастель)
Используется
палитра из 6 базовых оттенков:
- #D1EAFF — нежно-голубой
- #D1F2EB — мятный
- #FEF5D1 — лимонный
- #FADBD8 — персиковый
- #EBDEF0 — лавандовый
- #FCF3CF — розовый кварц
Принцип кольца
Цвета
привязаны не к абсолютному значению, а к позиции в цикле номиналов.
При сдвиге
окна генерации:
- младший номинал исключается,
- его цвет переиспользуется для
нового старшего.
Это
гарантирует:
- постоянную «светлость»
интерфейса,
- отсутствие визуального
«загрязнения» на поздних стадиях.
1.4 Текст и формат чисел
Цвет текста:
#3E2723 (тёмно-коричневый).
Контраст всегда достаточный для любой пастели.
Auto-scaling:
- размер шрифта уменьшается при
росте количества цифр.
Формат:
- до 9999 — полностью,
- от 10000 — формат #.##K.
Правило
нулевой точки:
- 19.6K допустимо,
- 59.0K отображается как 59K.
Суффиксы:
- 10³ — K
- 10⁶ — M
- 10⁹ — B
- 10¹² — T
- 10¹⁵ — Q
1.5 Рендеринг
Тип: HTML5 Canvas Monolith.
Запрещено:
- любые CSS-стили,
- внешние библиотеки визуализации.
Все
визуальные параметры:
- размеры,
- скругления,
- тени,
- эффекты
рендерятся исключительно
через JavaScript с использованием requestAnimationFrame.
1.6 Эффекты обратной связи (Feedback)
Луч
Радиальное
высветление активной соты при наведении/касании.
Лерп-распухание
Активная
сота масштабируется до 1.2x.
Интерполяция: k = 0.15 на кадр.
Визуальное достижение цели за ~100–150ms.
Масштабирование
происходит от центра, с перекрытием соседних узлов.
Линия
Линия маршрута
— главный визуальный объект игры.
Она всегда
рисуется поверх узлов и отражает:
- текущую длину маршрута,
- его напряжение,
- его энергетическое состояние.
2. Топология поля и координатная модель
2.1 Тип поля
Поле — гексагональная
пирамида.
Всего: 8
рядов, 44 узла.
Ряды:
- 1,3,5,7 — по 5 узлов
- 2,4,6,8 — по 6 узлов
2.2 Система координат
Используется
even-r offset coordinates.
Хранение:
grid[row][col]
Нечётные
ряды смещены вправо на 0.5 ширины узла.
2.3 Навигационные связи
Каждый узел
имеет до 6 соседей.
Навигация
разрешена только по:
- общим граням,
- без диагоналей.
Поле
трактуется как ориентированный гекс-граф:
- без перемещения узлов,
- без изменения топологии.
ГЛАВА 3. Центральная механика: Река (Flow System)
3.1 Принцип
навигации по графу
- Тип: Непрерывный направленный
маршрут (Link-building).
- Вектор: Игрок строит «русло», соединяя
соседние узлы по 6 направлениям.
- Условие инициации: Маршрут обязан начинаться
строго с двух узлов одинакового номинала ($V_1 = V_2$).
3.2 Правила эскалации
(Ascending Rule)
После активации первой пары (V → V)
маршрут может развиваться по следующим правилам:
1.
Удержание (Plateau): Присоединение узла того же номинала
(V → V → V).
2.
Подъем (Step-up): Присоединение узла следующей степени тройки (Vcurrent →
Vnext, где Vnext = Vcurrent × 3).
Уточнение о промежуточных
ступенях:
·
В маршруте могут присутствовать узлы разных степеней (например,
3-3-9-27-27).
·
Промежуточные ступени учитываются в длине цепи и
влияют на множитель M(L).
·
Однако результирующий номинал Vres всегда рассчитывается
только по максимальному узлу в цепи (см. Главу 4.2).
·
Запреты:
o Понижение номинала (9 →
3) разрывает связь.
o Пропуск ступени (3 →
27) разрывает связь.
3.3
Эргономика связи (UX)
- Snap-эффект: Магнитный захват узла
происходит при попадании курсора/пальца в радиус 80% от размера
соты.
- Soft Undo (Живой откат): При движении пальца в обратном
направлении по линии, узлы мгновенно исключаются из стека маршрута.
- Визуальное напряжение линии:
- 2-3 узла: Нить толщиной 2px.
- 4-6 узлов: Кабель 4px с
внутренним свечением (Glow).
- 7+ узлов (Поток): Толщина 6px +
динамическая Вибрация (амплитуда $\pm1.5$ px, частота 10 Hz).
Раздел 3.4: Рендеринг линии
(Rendering Logic)
Уточнение визуального представления линии
для разработчика:
·
Геометрия: Линия рисуется как ломаная (polyline), проходящая
через центры всех узлов текущего маршрута.
·
Приоритет отрисовки: Линия всегда находится в верхнем
слое (z-index), рисуется поверх всех узлов, включая активный (масштабированный), как и
указано в п. 1.6.
·
Сглаживание: для создания эффекта "энергетического состояния" (п.
1.6) используется сглаженная линия (lineCap = 'round', lineJoin
= 'round').
·
Алгоритм вибрации (для длины 7+):
1.
На каждый кадр анимации (в requestAnimationFrame) берется массив
опорных точек (центры узлов).
2.
Для каждого сегмента линии между точками i и i+1 вычисляется его
нормаль (перпендикуляр).
3.
К координатам каждой второй точки (т.е. точек, не являющихся началом
или концом всего маршрута) применяется смещение вдоль нормали. Величина
смещения = sin(время_с_начала_вибрации * частота + i) *
амплитуда. Это создает эффект "бегущей волны" или дрожания.
4.
Амплитуда: 1.5px, частота: 10 Гц (10 колебаний в секунду). При
60 FPS это означает изменение фазы примерно на 1.05 радиан за кадр.
Обоснование: Четкое
описание геометрии и алгоритма вибрации снимает все вопросы по реализации
ключевого визуального эффекта и гарантирует, что он будет выглядеть именно так,
как задумано, без потери производительности.
ГЛАВА 4. Система Схлопывания (Collapse & Score)
4.1 Точка
Синтеза
- В отличие от 2048, где блоки
сдвигаются к краю, здесь все узлы маршрута исчезают, а результат
синтезируется строго в последнем узле (место отрыва пальца).
4.2 Алгоритм расчета результата
- Результирующий
номинал Vres — это степень тройки, следующая за максимальным
номиналом, участвовавшим в цепи.
- Формула
(стандартный случай):
text
Vres = max(Vchain) × 3
- Пример: Цепочка 3-3-9-27-27 → max
= 27 → Vres = 81.
- Superchain
(для сверхдлинных цепей L ≥ 12):
Если сумма всех номиналов в цепи значительно
превышает следующую степень, система может выдать +2 шага по шкале.
Точный порог:
text
Если L ≥ 12 И Σ(Vchain) ≥
max(Vchain) × 3 × 2,
то Vres = max(Vchain) × 9 (+2 шага)
- Важное
уточнение: Промежуточные
значения не суммируются в базовый результат (кроме условия для
superchain). Vres применяется только к последнему узлу (место
отрыва пальца).
4.3
Экономика очков и Множители
- Очки за ход: $S =
\sum(V_{chain}) \times M$.
- Шкала множителей (M):
- Длина 2: x1.0
- Длина 3: x1.2
- Длина 4: x1.5
- Длина 5-6: x2.0
- Длина 7-11: x3.0
- Длина 12+: x4.0 + Бонус
«Чистая вода» (1000 очков).
ГЛАВА 5. Физика поля: Песочная Гравитация (Sand
Gravity)
5.1 Создание
Вакуума
- После исчезновения маршрута
(Collapse) на поле образуются пустые ячейки. Система переходит в состояние
FALLING.
5.2 Механика
падения (Downflow)
- Узлы, не имеющие опоры снизу,
перемещаются в пустые ячейки по векторам 5 (South-East) и 7 (South-West)
часов.
·
5.3 Приоритет Лёгкости (The Sand Logic)
·
Если на одну пустую ячейку претендуют два узла из верхних рядов,
первым её занимает узел с наименьшим номиналом.
·
Смысл: Крупные числа («камни») тяжелее и медленнее, они склонны
«зависать» в верхних слоях, в то время как мелкие числа («песок») просачиваются
вниз.
·
Вероятность сбоя (пробой):
Узлы с номиналом выше 3⁶ имеют шанс упасть вне очереди (игнорируя сортировку по
легкости).
·
Унифицированная формула вероятности сбоя:
·
text
· P = min(0.15, log₃(V)/20) для всех узлов V > 3⁶
·
где log₃(V) — степень тройки (например, для 3⁷ = 7).
Раздел 5.4: Алгоритм
пошагового падения (Cascade Resolution)
Для обеспечения детерминизма (п. 17.5) и
предсказуемого поведения, процесс падения (состояние FALLING) реализуется как
итеративный алгоритм:
1.
Инициализация: Система получает список всех пустых ячеек (emptyCells) после фазы COLLAPSING.
2.
Цикл падения: Пока в предыдущем проходе были перемещения, выполнять:
a. Сбор претендентов: Для каждой пустой ячейки (row,
col) определить,
есть ли над ней (по векторам 5 и 7 часов) ячейки с узлами.
b. Разрешение коллизий: Если на одну пустую ячейку
претендуют два узла (левый верхний и правый верхний), выбирается тот, у
которого меньше номинал (Приоритет Лёгкости, п. 5.3).
c. Одновременное перемещение: Все выбранные
пары (узел -> пустая ячейка) выполняют перемещение одновременно. Это важно, чтобы
избежать эффекта "каскада" внутри одного шага цикла.
d. Обновление списков: Список пустых ячеек и позиций узлов
обновляется.
e. Повтор: Цикл начинается заново, пока на шаге (b) не будет найдено
ни одного претендента.
3.
Завершение: Состояние FALLING завершается, система переходит
к SPAWNING.
Обоснование: Такой
пошаговый подход гарантирует, что "песок" (маленькие числа)
гарантированно просочится вниз, а "камни" (большие числа) зависнут,
создавая нужную игровую динамику, и при этом результат всегда будет одинаков
для одного и того же начального состояния.
6. Математика чисел и Окно генерации (Generation Window)
6.1 Числовая система
Все игровые
значения — степени тройки:
3¹ = 3
3² = 9
3³ = 27
3⁴ = 81
...
3¹⁵ = 14348907
Никакие
другие числа в системе не допускаются.
6.2 Окно генерации
В каждый
момент времени активно ровно 3 номинала:
Window =
[Vn, Vn+1, Vn+2]
Пример:
[3, 9, 27]
6.3 Баланс вероятностей
При
генерации нового узла:
- младший: 70%
- средний: 25%
- старший: 5%
Сумма всегда
= 100%.
6.4 Эволюция окна (Shift)
При
достижении нового максимального номинала:
maxValue >= Vn+2
Происходит
сдвиг:
Window = [Vn+1, Vn+2, Vn+3]
Младший
исключается навсегда.
6.5 Механика спасения (Ghost Nodes)
Если на поле
присутствуют номиналы ниже младшего окна:
С
вероятностью 1–2%:
- может сгенерироваться
«призрачный» узел старого номинала.
Тип:
type = "ghost"
Ghost:
- участвует в маршрутах,
- учитывается в смерти,
- визуально полупрозрачный (alpha
= 0.6).
Раздел 6.6: Пул
исторических номиналов для Ghost
Для механики спасения (п. 6.5) необходимо
определить источник "старого номинала".
·
Пул номиналов: "Старым" считается любой номинал, который был в
окне генерации ранее, но был исключен из него при сдвиге.
·
Вероятность выбора: при срабатывании шанса 1-2% на
генерацию ghost-узла, его номинал выбирается равновероятно из всего пула
исторических номиналов.
o Пример: Окно сдвинулось с
[3,9,27] на [9,27,81]. Пул исторических номиналов = [3]. Шанс 2% на спавн
тройки.
o Пример: Окно сдвинулось с
[9,27,81] на [27,81,243]. Пул = [3,9]. При спавне ghost с вероятностью
50% появится 3, с 50% — 9.
Обоснование: Это правило
простое для разработчика, использует уже существующие данные (историю сдвигов)
и делает механику ghost прозрачной и
предсказуемой для балансировки.
7. Экономика очков (Score System)
7.1 Множитель по длине маршрута
|
Длина L
|
Множитель
|
|
2
|
x1.0
|
|
3
|
x1.2
|
|
4
|
x1.5
|
|
5–6
|
x2.0
|
|
7–11
|
x3.0
|
|
12+
|
x4.0 + 1000
|
7.2 Формула очков
Base Score:
Sbase = Σ(Vi)
Final:
Sfinal =
Sbase × M(L)
7.3 Пример
Цепочка:
3-3-3-3-3
Sbase = 15
M(5) = 2.0
Итог:
30 очков
8. Алгоритм смерти (Game Over System)
8.1 Критерий смерти
Игра
завершается, если одновременно:
- Не существует ни одного
маршрута длиной ≥ 2.
- На поле нет ни одного узла из
активного окна.
- Не сработал шанс Ghost (2%).
8.2 Семантика смерти
Смерть
трактуется как:
потеря
связности живой числовой сети.
Не переполнение.
Не физический тупик.
А топологическая невозможность построить путь усиления.
8.3 Вызов GameOver
При
выполнении условий:
state =
GAMEOVER
Показывается confirm:
New Game?
9. Числовой кап и Сингулярность
9.1 Hard Cap
Максимальный
отображаемый номинал:
3¹⁴ = 4782969
9.2 Сингулярность
3¹⁵ = 14348907
Тип:
type = "singularity"
Свойства:
- чёрный цвет,
- логотип Трон,
- не участвует в merge,
- не учитывается в очках.
9.3 Большой Взрыв
Если
образуются 3 сингулярности, связанные гранями:
Происходит:
- очистка всего поля,
- запуск New Game+,
- окно генерации смещается на +3
уровня.
9.4 Экономика сингулярности
Score:
0
Смысл:
- трофей,
- инструмент очистки,
- переход на более высокий
уровень сложности.
Раздел 9.5:
Взаимодействие с сингулярностью
Уточнение статуса узла
типа singularity в навигационной модели:
- Навигация: Сингулярность
является непроходимым препятствием. Прокладывать маршрут через неё
(т.е. включать её в цепочку Node A ->
Singularity -> Node B) запрещено.
- Блокировка: Если игрок при построении
маршрута пытается перейти на сингулярность или через неё, происходит
стандартная обработка невалидного хода (п. 19.1). Связи с сингулярностью
визуально не отображаются и логически не существуют для маршрута.
- Исключение: Единственное
взаимодействие с сингулярностью — это образование троицы для
"Большого Взрыва" (п. 9.3), которое проверяется как особое
состояние поля, а не как игровой ход.
Обоснование: Это
устраняет двусмысленность фразы "блокирует маршрут". Сингулярность —
это стена, а не часть пути. Это делает её роль более тактильной и значимой.
10. Формальная модель сложности (Difficulty Curve)
10.1 Формула роста старшего
P = min(25%, 5% + floor(turns / 20) * 5%)
10.2 Этапы
100 ходов:
150 ходов:
- фиксация окна (больше не
сдвигается).
10.3 Casual Guardrail
Если:
3 поражения подряд < 50 ходов
То:
- временное снижение сложности,
- +5% к шансу Ghost.
Механизм
действует до первой успешной сессии > 100 ходов.
11. Режимы игры (Game Modes)
11.1 Classic
Базовый
режим.
Характеристики:
- активна регенерация узлов,
- окно генерации сдвигается,
- действует вся кривая сложности.
Это основной
режим баланса и телеметрии.
11.2 Zen
Режим
обучения и расслабления.
Характеристики:
- окно фиксировано: [3, 9, 27],
- регенерация активна,
- смерть отключена,
- очки считаются, но не пишутся в
Best.
Назначение:
- обучение механике маршрутов,
- сенсорный комфорт,
- демонстрационный режим.
11.3 Hexa-Storm
Режим
динамической топологии.
Характеристики:
- каждые 10 ходов инвертируется
вектор регенерации,
- сохраняются все остальные
правила.
Состояние
режима:
gravityVector
turnsToInversion
(термин
gravityVector сохраняется как исторический, но семантически означает направление
регенерации).
12. Когнитивная адаптация (Intro System)
12.1 Этапы включения механик
0–20 ходов:
- только номиналы: 3 и 9,
- линия без glow и вибрации.
21–50 ходов:
- добавляется 27,
- включается glow,
- активируются Ghost.
51+ ходов:
12.2 Правило переключений
Переключение
этапов допускается только в состоянии IDLE,
при полном отсутствии активных анимаций.
13. Телеметрия (Telemetry System)
Все данные
логируются в «Сферу».
13.1 Логируемые параметры
- длины маршрутов,
- максимальный номинал,
- количество ходов,
- плотность сети,
- количество Ghost,
- количество сингулярностей.
13.2 Формат данных
{
"meta": {
"sessionId":
"string_uuid",
"seed": 123456789,
"mode":
"classic|zen|storm"
},
"stats": {
"turns": 452,
"maxValue": 19683,
"totalScore": 85400,
"avgChainLength": 3.2,
"ghostsSpawned": 12,
"singularitiesCreated": 1
},
"termination": {
"reason":
"no_matches|window_lock|full_lock|user_exit",
"lastGridDensity": 0.95
}
}
13.3 Назначение телеметрии
Используется
для:
- балансировки окна,
- оценки сложности,
- анализа удержания,
- выявления тупиковых
конфигураций сети.
14. Технические требования и сохранение
14.1 Производительность
Цель:
60 FPS стабильно
Любые
аллокации в игровом цикле запрещены.
14.2 Сохранение
Сохраняется:
- grid,
- Score,
- Best,
- WindowState,
- currentMode.
Хранилище:
localStorage
Формат:
snapshot всего состояния.
14.3 Domain Lock
Игра
разрешена к запуску только на домене tron.ru.
При несоответствии:
15. Маркетинг (как часть релизного регламента)
Этот раздел
сохраняется как часть продакшен-документа,
не как концепт.
15.1 Слоган
Троичная логика в навигации живой числовой сети
15.2 One-liner
Шесть направлений, три числа и одна сеть, которую
можно усилить.
15.3 Этапы релиза
- Релиз на tron.ru
- Тестирование со Сферой
- Google Play
16. Дополнительные уточнения (Production Parameters)
16.1 Стратегия ресайза (Адаптивность)
Выбор
Используется
Вариант A — Dynamic Redraw.
Логика
При любом
событии:
- resize окна,
- смена ориентации,
Canvas:
- пересчитывает cellSize,
- исходя из min(screenWidth,
screenHeight).
Соотношение
сторон пирамиды (8 рядов) фиксировано.
Визуальное правило
Поле:
- всегда полностью вписано в
экран,
- центрировано,
- без скролла.
Матрица grid не изменяется,
меняются только координаты отрисовки.
16.2 Начальное состояние (Initial State)
Стартовый режим: Mixed Start
Механика
Новая игра
начинается с пустого поля,
после чего вбрасываются 5 случайных узлов
из текущего стартового окна.
Начальное
окно:
[3, 9]
Позиционирование
Вброс
происходит в случайные узлы:
Вероятности
Вариативность
Допускается:
- увеличение до 6–7 стартовых узлов,
- но не более 7.
Раздел 16.2 (Редакция):
Начальное состояние (Initial State)
Уточнение алгоритма начального вброса:
·
Алгоритм: Новая игра начинается с пустого поля grid. Запускается цикл,
который выполняется ровно 5 итераций (или до 6-7, если решено увеличить
сложность).
·
Условие: На каждой итерации:
1.
Генерируется случайная позиция в рядах 7 или 8 (индексы рядов 6
и 7 при нумерации с 0).
2.
Проверяется, свободна ли эта ячейка.
3.
Если свободна — в ней создается новый узел. Номинал определяется
согласно весам (70% на 3, 30% на 9).
4.
Если занята — генератор повторяет попытку. Для предотвращения
бесконечного цикла (если свободных ячеек в нижних рядах не осталось)
предусмотрен лимит попыток (например, 100). Если за 100 попыток не найдено
свободное место, алгоритм аварийно завершается (такая ситуация невозможна при
старте с пустым полем, но требование есть).
Обоснование: Добавление
проверки на коллизию и защиту от бесконечного цикла делает спецификацию
законченной с точки зрения программирования.
16.3 Hexa-Storm: физика инверсии
(Термин
«физика» сохраняется исторически,
семантически — логика регенерации.)
Инвариант
Приоритет
«лёгкости» сохраняется при любой инверсии.
Логика
При смене
направления регенерации:
- «лёгкие» номиналы (3, 9)
первыми занимают новые позиции,
- «тяжёлые» (81+)
дольше сохраняют текущие узлы.
16.4 Soft Undo: определение сессии
Сессия
Сессия —
интервал между:
New Game → Game Over
Ограничение
1 Soft Undo
на сессию.
Хранение
Счётчик
Undo:
- хранится в localStorage,
- внутри объекта сессии.
Перезагрузка
страницы:
Штраф
При
использовании Undo:
Score = Score × 0.9
16.5 Тайминги и
анимация (Physics Timing)
- Лерп-распухание: k = 0.15 (цель 1.2x за
100–150ms).
- Collapse: Перед удалением узлов
микро-пауза 100ms с белой вспышкой линии.
- Падение
(Falling):
Базовая скорость: 300ms на один
узел.
Ускорение при
множественном падении:
- Ускорение линейное по
рядам.
- Формула
времени падения через rowDistance рядов:
text
t
= baseTime × (1 - 0.1 × (rowDistance - 1))
где baseTime = 300ms, rowDistance ≥ 1.
Пример: Падение через 3
ряда → t = 300 × (1 - 0.1 × 2) = 240ms.
- Блокировка
ввода:
Состояние ANIMATING блокирует любой ввод игрока до
полного завершения всех анимаций падения. Это исключает возможность
построения маршрута во время падения.
16.6 Звуковой ландшафт (Minimalist Sound Design)
Концепция
«Триада».
Только чистые синусоидальные тоны.
События
Связь узлов:
- повышающийся тон,
- каждая новая сота — +1 ступень мажорного
трезвучия.
Collapse:
- мягкий колокольчик,
- 432 Гц.
Сингулярность:
Ошибка:
Управление
Иконка
«Динамик»:
Раздел 16.7: Интерфейс
пользователя (UI Components)
В дополнение к визуальной концепции (Глава
1) и требованиям Blogger.com (Глава 20),
специфицируются элементы интерфейса:
·
Кнопка Undo: Располагается в нижней панели управления. Визуально — круг
с иконкой "изогнутая стрелка", выполненный в стиле "только
border, без background-color" (согласно п. 20.5).
·
Счетчик Undo: Рядом с кнопкой отображается дробь: 1/1 (использовано/доступно).
В начале сессии — 0/1. После использования
Undo — 1/1. Кнопка деактивируется (становится серой
и неактивной).
·
Применение штрафа: Штраф (Score × 0.9) применяется мгновенно при нажатии
кнопки Undo, до восстановления состояния из снепшота. Это дает четкую обратную
связь игроку о потере очков.
Обоснование: Дизайн
должен быть целостным. Раз игрок может взаимодействовать с Undo, у этого
взаимодействия должен быть четкий интерфейс, вписанный в общий минималистичный
стиль.
ГЛАВА 17. Критические спецификации ядра (Core Logic
Specs) — v3.1 (FULL)
17.1 State
Machine (Жизненный цикл)
- Состояния: INIT → IDLE → DRAGGING →
PROCESSING → COLLAPSING → FALLING → SPAWNING → GAMEOVER.
- FALLING (Новое): Состояние расчета
гравитационного смещения узлов. Ввод заблокирован.
- IDLE: Единственное состояние, где
разрешены начало маршрута и Soft Undo .
17.2 Алгоритм
генерации (Spawn System)
- Триггер: Происходит после
завершения фазы FALLING.
- Количество: Строго 1 новый узел за
результативный ход.
- Локация: Новые узлы «вливаются» в
систему сверху.
Приоритет верхнего
ряда:
- Сначала
ищем пустые ячейки в ряду 0.
- Если
ряд 0 полностью заполнен → спавн в ряду 1.
- Если
ряд 1 заполнен → ряд 2 и так далее.
- Deadlock
prevention:
Если свободных ячеек нет вообще (все 44 узла заняты), то после завершения
FALLING вызывается:
text
Game
Over (FULL_LOCK)
- Номинал: Веса 70% / 25% / 5% из
текущего Окна
17.3 Правила
Merge (Collapse Logic)
- Условие: Длина маршрута $L \ge 2$.
- Результат: Удаление всей цепи, кроме
последней точки.
- Формула: $V_{new} = \max(V_{chain})
\times 3$ (согласно правилам эскалации 2248).
- Сингулярность: Не участвует в merge,
блокирует маршрут .
17.4 Физика Гравитации
(Gravity & Sorting)
·
Тип: Sand Gravity.
·
Логика: Узлы падают в пустые ячейки снизу (векторы 5 и 7 часов).
·
Приоритет: Сначала падают меньшие номиналы («песок»), затем крупные
(«камни»).
·
No-Cascade — уточнение:
o Все схлопывания,
образовавшиеся во время состояния FALLING, не учитываются в
активной линии игрока.
o Игрок может продолжать
строить маршрут только на существующих узлах после окончания анимации падения.
o Гравитационное
падение не вызывает автоматических слияний, даже если после
падения узлы совпадают по номиналу.
o Автоматические merge
происходят только по инициативе игрока в состоянии
DRAGGING.
17.5
Determinism & RNG
- Запрещено: Math.random().
- Генератор: LCG (Linear Congruential
Generator).
- Seed: Генерируется при старте,
сохраняется в телеметрии для воспроизводимости .
17.6 Модель
данных (Data Model)
- HexCell: Объект содержит id, r, q, value, type (normal/ghost/singularity) .
- Дополнение: Флаг isFalling для управления анимацией
падения.
17.7 Система
очков (Score Formula)
- Base:
$S_{base} = \sum(V_i)$.
- Multiplier: $M(L)$ согласно таблице из
Главы 7.
+1
- Final:
$S_{final} = S_{base} \times M(L)$.
17.8 Победа и цель (Victory
Condition)
- Тип: Endless High Score.
- Soft Win: Первая сингулярность
($3^{15}$) вызывает салют и ачивмент «Архитектор» .
17.9
Мета-прогресс (Zero-Meta)
- Запрещено: Валюты, апгрейды, бусты .
- Хранение: Только текущая сессия и Best
Score в localStorage .
17.10 AI /
Bot (Debug Mode)
- GreedyBot: Алгоритм для балансировки.
- Метод: Сканирует поле, выбирает
маршрут с максимальным $S_{final}$.
- Статус: Вырезается из релизной версии
(DEBUG =
false) .
18. Синхронизация противоречий (Final Sync)
Раздел
фиксирует приоритеты, если разные части спецификации дают конфликтующие
требования.
18.1 Collapse: вспышка vs скорость
Терминология
«Мгновенно»
= без анимации перемещения узлов.
Правило
Если длина
маршрута:
L >= 12
То:
- при touchend → белая вспышка 100ms,
- сразу после вспышки узлы
удаляются из grid без промежуточных кадров.
Если:
L < 12
То:
- без вспышки,
- стандартное удаление.
18.2 Spawn: инициализация vs игровой цикл
Инициализация
(Initial State)
Исключение:
- в начале партии → 5 стартовых
узлов внизу.
Игровой цикл
(Loop)
Норма:
- строго 1 новый узел за
результативный ход.
18.3 Тип узла Ghost
Статус в
модели
type = "ghost"
Логика
Ghost:
- участвует в маршрутах,
- участвует в смерти,
- участвует в merge как normal.
Рендер
- alpha = 0.6
- либо десатурация цвета.
19. Дополнительные логические протоколы
19.1 Обработка пустого хода (Invalid Interaction)
Критерий
Маршрут:
L < 2
или разные
номиналы.
Результат
Состояние:
IDLE не прерывается
Последствия
- счётчик ходов не увеличивается,
- spawn не происходит,
- сложность не меняется.
Визуал
- линия исчезает,
- целевой узел окрашивается в
#FFCDD2 на 100ms.
Звук
Короткий
низкий тон («ошибка»).
19.2 Лимит длины маршрута (UX / Performance)
Hard Cap
Отсутствует.
Допустимо захватить все 44 узла.
Требование
Реализация:
- zero-allocation,
- 60fps при максимальной длине.
19.3 Экономика сингулярности
Сингулярность:
- не даёт очков,
- не влияет на score,
- используется только как:
19.4 Протокол Soft Undo (Rollback Point)
Snapshot Point
Полный
снимок состояния в момент:
IDLE → перед touchstart
Откат
При нажатии
Undo:
- восстановление snapshot,
- состояние возвращается в IDLE.
Защита от лагов
Если Undo
вызван во время ANIMATING:
- команда ставится в очередь,
- выполняется при возврате в
IDLE.
19.5 Схема телеметрии для Сферы
Финальный
формат:
{
"meta": {
"sessionId":
"string_uuid",
"seed": 123456789,
"mode":
"classic|zen|storm"
},
"stats": {
"turns": 452,
"maxValue": 19683,
"totalScore": 85400,
"avgChainLength": 3.2,
"ghostsSpawned": 12,
"singularitiesCreated": 1
},
"termination": {
"reason": "no_matches|window_lock|full_lock|user_exit",
"lastGridDensity": 0.95
}
}
19.6 Классификация причин Game Over
NO_MATCHES
Есть узлы,
но нет маршрутов.
WINDOW_LOCK
Числа есть,
но окно ушло.
FULL_LOCK
Все 44 узла
заняты, и нет маршрутов.
20. Техническая адаптация для Blogger.com
Этот раздел
— обязательный регламент деплоя.
20.1 Ограничения платформы
Запрещено:
- <style>
- внешние CSS
- flex / grid
- position: absolute / fixed
- отрицательные margin
20.2 Табличный каркас
Все сложные структуры:
<table width="100%">
20.3 Работа со ссылками
Только
абсолютные ссылки:
https://...
Любое
упоминание сайта — активная ссылка.
20.4 Визуальный регламент
Основной
текст:
- без фиксированного цвета.
Цвет
разрешён:
- только для кнопок,
- только для акцентов.
20.5 Адаптация интерфейса
Максимальная
ширина поля:
400px
Отступы:
padding: 10px
Базовый цвет
UI:
#3E2723
Кнопки:
- только border,
- без background-color.
20.6 Регламент выдачи
Заголовок
поста:
- отдельной строкой перед кодом.
Description:
- отдельной строкой после кода,
- не более 150 символов.
20.7 Чистота выдачи
Финальный
HTML:
- только код,
- без пояснений,
- без комментариев,
- без вступлений.