8 Commits
Author SHA1 Message Date
andrey 126c7525fd Кампания: «Издалека» вставлен на 10-е место со сдвигом уровней
Вместо прежнего обмена id4 и id10 — вставка: «Издалека» (id4) стоит на
10-м месте, а id5..id10 сдвинуты на позицию вверх (индексы 3..8).
Порядок: 1,2,3,5,6,7,8,9,10,4,11..100.

- Меняется только порядок записей: данные уровней (имя, размер, зона,
  бюджет, клетки) не тронуты, «Издалека» как была.
- Единственный «блип» размеров теперь на индексе 9; тест монотонности
  усилен (исключается только он), добавлен кейс «порядок вставки».
- 464/464, паритет step 273/273 сохранён.
2026-10-12 15:43:09 +03:00
andrey 6518d70dd1 Паттерны: 12 новых фигур и группировка дропдауна по категориям
- Добавлены стойкие (ванна, лодка, кораблик, каравай, пожиратель, пруд),
  осцилляторы (маяк, часы, пентадекатлон), долгожители (жёлудь, Diehard,
  громовая птица); у записей появилось поле group.
- #optPattern сгруппирован в optgroup по PATTERN_GROUPS
  (Стойкие/Осцилляторы/Корабли/Долгожители/Ружья).
- Тесты: patternCells новых фигур, поведение (периоды/рост/гибель),
  группировка и наличие всех id; обновлены доки и комментарии.
2026-10-12 13:06:42 +03:00
andrey 41b0b37a64 Кампания: у сгенерированных уровней нет зоны на всё поле
У 96 сгенерированных уровней полная зона заменена на «центр»: теперь
зона рисования никогда не покрывает всю доску, остаётся 7 типов
(половина, центр, углы, полосы, прямоугольник). Полная зона — только
у ручных «Разминка» и «Рой».

- Правка точечная: изменены зоны 12 уровней, клетки врага и порядок
  уровней не тронуты («Издалека» без изменений).
- Генератор: kind «всё поле» перенаправлен в центр без сдвига PRNG;
  --check теперь запрещает полную зону у сгенерированных.
- Тесты: вместо «зоны разнообразны» — три проверки (нет полной зоны у
  сгенерированных; полная только у ручных; все 7 типов присутствуют).
- 424/424, паритет step 273/273 сохранён.
2026-10-12 13:00:03 +03:00
andrey ba4ac28d95 Кампания: 100 уровней с растущими картами и разными зонами
Расширили кампанию с 14 до 100 уровней: 4 ручных + 96 сгенерированных
(id 5..100). Размер карты растёт с ~60 до 300×300, бюджет и число фигур —
вместе с размером.

- Данные уровней переведены с ASCII-сеток enemy на компактный формат
  cells: [[x,y],...] (иначе 96 уровней до 300×300 раздували память и
  старт); enemyFromCells удалён, buildCampaignField строит поле из cells.
- Зоны рисования разнообразны: всё поле, половина, углы, центр, узкие
  полосы, произвольные прямоугольники; у части уровней враг вне зоны.
- Уровень «Издалека» перенесён на 10-е место (данные без изменений).
- Список из 100 уровней — прокручиваемый; syncLevelList не работает вне
  экрана выбора.
- tools/gen-campaign-levels.mjs обновлён под 96 уровней и формат cells
  (seeded PRNG, без Math.random, --check).
- Тесты обновлены под 100 уровней (422/422), паритет 273/273 сохранён.
2026-10-12 12:46:45 +03:00
andrey b601bcb195 Кампания: 14 уровней (ручные + генератор) с новыми фигурами
Было 3 почти одинаковых уровня. Теперь первый — «Разминка» (блок),
второй — «Каравай», плюс «Рой» (много фигур) и «Издалека» (враг вне
зоны рисования игрока), и 10 сгенерированных уровней.

- Фигуры врага: блок, улей, мигалка, жаба, каравай, пульсар, ружьё
  Госпера; есть уровни с врагом вне зоны игрока.
- tools/gen-campaign-levels.mjs — детерминированный генератор (seeded
  PRNG, без Math.random); вывод вшит в CAMPAIGN_LEVELS статически, в
  рантайме ничего не генерируется.
- Решаемость намеренно не гарантируется: уровни с ружьём почти
  непроходимы — это задумка, а не дефект.
- Тесты обновлены под 14 уровней (416/416): инварианты вместо жёстких
  значений, проверка набора фигур, врага вне зоны, детерминизма
  генератора и отсутствия дрейфа между генератором и вшитым блоком.
- Ядро step не тронуто; паритет 273/273 сохранён.
2026-10-12 09:49:20 +03:00
andrey 36f0fa2623 R2-3: полное покрытие новых фич, паритет torus, полировка
- tests/test.js: 148 -> 206 проверок (разделы 23 wrap/torus, 24 зоны, 25 бюджет,
  26 размеры, 27 сейв v2/миграция, 28 рендер/resize 300x300, 29 HUD 381-400px);
  resetGlobals сбрасывает tool/reason/winner; sleep заменён на waitCond/settleViewport.
- tools/old-ref/: независимый torus-эталон (nextStepCleanWrap, CLI --torus,
  gen-torus.js, reference-torus.json); diff-our.js сверяет stepN при setWrap(true).
- index.html: медиазапрос HUD 380->400px (убрана микро-обрезка 381-388px);
  инлайн-комментарий про согласованность useWrap/setWrap.
- AGENTS.md: полный список контракта дополнен; useWrap-заметка уточнена; покрытие
  приведено в соответствие. README: скорость — константа в коде, не UI.
- .gitignore: tools/old-ref/.tmp-*.txt.
- Прогоны: check: OK; суита 206/206 (3 повтора); паритет clean 273/273 + torus 273/273.
- Ревью-гейт R2-3 (Oracle): PASS; minor/nit закрыты.
2026-10-11 11:02:23 +03:00
andrey 7d788404f8 Фаза 4: персистентность, полная суита и полировка
- index.html: реальная персистентность (loadSave/applySave/persist/freshSave,
  SAVE_VERSION=1, форма сейва v1, base64-поле, миграции), резюм незавершённой
  партии после reload, авто-пауза при visibilitychange без перезаписи сейва;
  полировка: modeForState вместо мёртвого mode, валидация FIELD_SIZES,
  setFieldSize игнорирует чужие значения, согласованный дефолт fieldH,
  сброс hoverCell на pointerup/cancel, актуализирован комментарий mode.
- tests/test.js: расширена 65 -> 123 проверок (резюм R1/R2/R3, миграция/битый
  сейв, настройки, resize, клики DOM-кнопок, applyIntent, паритет сохранён).
- tools/old-ref/: harness паритета перенесён в репозиторий (old_ref.cpp,
  reference*.json, генераторы, diff-our.js, ref-*.txt, ce1.txt, README).
- AGENTS.md/README.md: форма сейва, миграции, резюм, harness, структура.
- .gitignore: секрет .gitea_token и бинарники/логи harness.
- Прогоны: check: OK; npm test — ИТОГ 123/123; паритет clean 273/273.
- Ревью-гейт 4 (Oracle): PASS; minor/mit закрыты.
2026-10-11 09:29:20 +03:00
andrey e889cf8e45 Фаза 2: инфраструктура разработки и тестирования
- tools/check.mjs: проверка синтаксиса JS из <script> в index.html через node --check
  (перевод номера строки в координаты index.html), exit-коды 0/1.
- tests/: каркас headless-суиты на puppeteer-core (ok/waitState/waitCond/sleep,
  viewport 390x844@2, контроль pageerror/console.error, ИТОГ N/N и exit code).
- index.html: минимальный скелет (canvas/DPR/resize, state=MENU, SAVE_KEY, 60x60)
  без игровой логики — она в фазе 3.
- Прогоны: check: OK; npm test — ИТОГ 12/12, exit 0.
- Ревью-гейт 2 (Oracle): PASS; minor/nit перенесены в фазу 3.
2026-10-11 08:47:11 +03:00