Вместо прежнего обмена 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 сохранён.
- Добавлены стойкие (ванна, лодка, кораблик, каравай, пожиратель, пруд),
осцилляторы (маяк, часы, пентадекатлон), долгожители (жёлудь, Diehard,
громовая птица); у записей появилось поле group.
- #optPattern сгруппирован в optgroup по PATTERN_GROUPS
(Стойкие/Осцилляторы/Корабли/Долгожители/Ружья).
- Тесты: patternCells новых фигур, поведение (периоды/рост/гибель),
группировка и наличие всех id; обновлены доки и комментарии.
У 96 сгенерированных уровней полная зона заменена на «центр»: теперь
зона рисования никогда не покрывает всю доску, остаётся 7 типов
(половина, центр, углы, полосы, прямоугольник). Полная зона — только
у ручных «Разминка» и «Рой».
- Правка точечная: изменены зоны 12 уровней, клетки врага и порядок
уровней не тронуты («Издалека» без изменений).
- Генератор: kind «всё поле» перенаправлен в центр без сдвига PRNG;
--check теперь запрещает полную зону у сгенерированных.
- Тесты: вместо «зоны разнообразны» — три проверки (нет полной зоны у
сгенерированных; полная только у ручных; все 7 типов присутствуют).
- 424/424, паритет step 273/273 сохранён.
Расширили кампанию с 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 сохранён.
Было 3 почти одинаковых уровня. Теперь первый — «Разминка» (блок),
второй — «Каравай», плюс «Рой» (много фигур) и «Издалека» (враг вне
зоны рисования игрока), и 10 сгенерированных уровней.
- Фигуры врага: блок, улей, мигалка, жаба, каравай, пульсар, ружьё
Госпера; есть уровни с врагом вне зоны игрока.
- tools/gen-campaign-levels.mjs — детерминированный генератор (seeded
PRNG, без Math.random); вывод вшит в CAMPAIGN_LEVELS статически, в
рантайме ничего не генерируется.
- Решаемость намеренно не гарантируется: уровни с ружьём почти
непроходимы — это задумка, а не дефект.
- Тесты обновлены под 14 уровней (416/416): инварианты вместо жёстких
значений, проверка набора фигур, врага вне зоны, детерминизма
генератора и отсутствия дрейфа между генератором и вшитым блоком.
- Ядро step не тронуто; паритет 273/273 сохранён.