Files

11 KiB
Raw Permalink Blame History

План: локация «Волшебное болото» (id 4, 90 000 🪙)

Статус: реализован (Этап 45) — см. запись «Этап 45» в docs/DEVLOG.md; тело плана ниже оставлено как историческая фиксация. Ориентир по коду: index.html ~3861 строка; ссылки на строки даны на момент составления плана (перед реализацией сверять — номера могли сдвинуться).

1. Задача

Добавить пятую локацию — «Волшебное болото» за 90 000 🪙:

  • светящиеся рыбы, которые ночью светятся в темноте разными цветами;
  • прыгающие лягушки;
  • кувшинки и лилии (жёлтые, белые, розовые).

2. Зафиксированные решения (ответы пользователя)

Развилка Решение
Когда светятся рыбы Только ночью — включать при nightMix() > 0.35 (тот же порог, что у фонаря на лодке, index.html:2584). Днём болото — обычная мрачная вода.
Сколько новых видов 5 видов по одному на редкость r0–r4, у каждого своё поле glow:'#hex' (разные цвета).
Босс Да — светящийся босс + персональная ачивка (паттерн остальных 4 локаций).
Доходность «Не принципиально» → берём между Озёрами и Морем (уважает связку «дороже вода = дороже улов» при цене 90 000). Ориентир день ~240 / ночь ~330 🪙; точные цифры подбираются balance.mjs --set и фиксируются.
Свечение в карточке/дневнике Да — CSS drop-shadow по полю glow вида.

3. Предлагаемые виды (имена/цвета можно менять)

id RU EN r weight wMin–wMax glow цена
glowfin Светлячок Glowfin 0 38 0.3–3 #5ff2ff циан 8
moonfish Лунная рыбка Moonfish 1 24 0.8–8 #b9c8ff бледно-голубой 13
emberfin Изумрудный светляк Emerald Glowfish 2 14 1.5–16 #57ffa8 зелёный 20
violetlure Фиалковый огонёк Violet Lure 3 5 2–24 #d17bff фиолетовый 38
spiritfin Дух болота Swamp Spirit 4 2.5 0.5–6 #ffe07a золотой 70
  • Босс — spiritfin (легендарный дух; вес по общему правилу 20–50 кг, награда ×5).
  • Веса и цены — стартовая заготовка, финал через node tools/balance.mjs --set ....
  • «Здоровье» теста «каждый вид ≥1»: минимальный вес вида ≥ ~2.2 (иначе lc4 за 3000 роллов заплывёт). moonfish/emberfin в норме; при желании боссу можно добавить вес.
  • Дополнительные ачивки: swamp_first (локация, coinPct:0.02, как lake_first) и swamp_boss (без coinPct, как lake_boss). Это поднимет ACHIEVEMENTS.length 34→36 и пин achBonus().coinPct 0.16→0.18 — тесты и доки обновить явно.

4. Карта изменений по коду

4.1 Данные (index.html, секция «ДАННЫЕ»)

Что Где Правка
Локация 1143-1156 (LOCATIONS) Запись {id:4, name:'Волшебное болото', ... cost:90000}; water — тёмно-моховой 6-hex (день/ночь); waves — слабая рябь (amp~0.8). Миграция сейва (1382-1387) уже завязана на LOCATIONS.length.
Новые виды 1072-1118 (SPECIES) Только в КОНЕЦ (после whale) — SPECIES[0..7] запинены тестами/квестами (§9j/M4/M6). Каждому поле glow.
Ночные веса 1127 (NIGHT_WEIGHTS) Ключ каждому новому id (иначе weight=undefined).
Таблицы болота 1176-1196 SWAMP_IDS, SWAMP_DAY_WEIGHTS, SWAMP_NIGHT_WEIGHTS, SWAMP_SPECIES(_NIGHT) — копия паттерна LAKE/SEA/OCEAN, без пересечений.
Босс 1201 (BOSS_BY_LOCATION) 4:'spiritfin'.
Фоновые рыбы 1809-1814 (AMBIENT_FISH) 5-я запись + palette (циан/зелёный/фиолет/золото) для «разных цветов».

4.2 Логика

  • pickSpecies() (1907-1925): заменить вложенный тернарник на табличный доступ по save.location + guard на диапазон. Поведение локаций 0..3 идентично; болото больше не «проваливается» в реку.
  • startBite() (1950): босс подхватится из BOSS_BY_LOCATION[4] автоматически; save.bosses уже миграционно готов (1371-1372).

4.3 Свечение (только ночь)

  • drawFishShape/drawAmbientFish (2517-2540): аура радиальным градиентом + globalCompositeOperation='lighter', цвет из palette/glow, только при nightMix()>0.35 и save.location===4.
  • draw() (2934-2943) и drawHookedFish() (2731-2745): аура для вида с glow ночью (паттерн боссовой ауры 2739-2743). Обязательно save/restore либо сброс shadowBlur.
  • Карточка (showCard 3645, CSS 175-190): класс glow-card для вида с glow при normal-варианте (чтобы не конфликтовать с фильтрами вариантов) → drop-shadow цвета glow.
  • Дневник (renderShop journal 3501-3521): маркер-класс на SVG для светящихся видов.

4.4 Декорации (лягушки, кувшинки, лилии)

  • initScenery() (1836-1853): ветка i===4 — фон (камыш/кривые деревья) + отдельные массивы pads[]/frogs[] (очищаются вместе с scenery).
  • updateDecor(dt) (2240-2266): параболический прыжок лягушек; покачивание кувшинок.
  • Новая drawSwampDecor(): кувшинки (эллипс с вырезом), лилии жёлтые/белые/розовые (лепестки), лягушки. Вызов в draw() (2924) после drawWater/drawAmbientFish и до drawBoat — лилии поверх воды.
  • Вызовы initScenery() не трогаем (уже есть в resize и обеих ветках shopClick).

4.5 Магазин / i18n / ачивки

  • shopClick тост (3586): ветка id===4 → welcome_swamp.
  • T ru/en (3060+ / 3157+): название и описание локации, welcome_swamp, nameEn/descEn/описания видов.
  • ACHIEVEMENTS (1618-1655): swamp_first (+0.02), swamp_boss (без coinPct).

4.6 Портреты (основной объём)

  • 5 файлов assets/fish/fish-<id>.svg (viewBox 0 0 160 100, цвета через var(--f1/--f3)).
  • Добавить id в tools/embed-fish.mjs:24-29, прогнать node tools/embed-fish.mjs.

4.7 Тесты (tests/test.js) — в том же коммите

  • lc1 (1956-2010): SPECIES.length 32→37, LOCATIONS 4→5, costs +,90000, names, sprites 32→37, swampOrder, поля новых видов.
  • lc2 (2013-2045): SWAMP_* длины/порядок/пересечения.
  • Новый тест роллов болота (аналог lc4c 2112-2132).
  • lc5 (2135-2171): кейс location:4.
  • Покупка болота — аналог lc8c (2247-2259).
  • lc9 (2261-2266): дневник 32→37.
  • lc10 (2268-2290): дополнить mid24 swamp-видами.
  • a22d (2309-2326): ACHIEVEMENTS.length 34→36.
  • Пин 0.16 (1648-1666): 0.16→0.18.
  • Новый data-тест: у swamp-видов есть glow, цвета различны, *_WEIGHTS покрывают все id.

4.8 Инструменты / доки / визуал

  • tools/balance.mjs: таблицы болота в TABLES, пины в шапке; сортировать сводку отношений по цене (т.к. 90000 < Моря/Океана, а порядок массива иной).
  • tests/gen-screenshots.js: кадр swamp (день) и/или swamp-night со свечением.
  • AGENTS.md, README.md, docs/DEVLOG.md («Этап 45»).
  • Emoji-шрифт не трогаем (лягушки/лилии — фигуры canvas), пока не появятся новые emoji.

5. Порядок работ (фазы)

  1. Данные: LOCATIONS + SPECIES + веса + BOSS_BY_LOCATION + табличный pickSpecies. → node tools/check.mjs.
  2. Баланс: node tools/balance.mjs (+--set), зафиксировать числа.
  3. Портреты: 5 SVG + embed-fish.mjs.
  4. Свечение рыб (ambient/bite/reel, карточка/дневник).
  5. Декорации: лягушки/кувшинки/лилии + фон болота.
  6. Магазин/тосты/i18n/ачивки.
  7. Тесты (все пины выше) → cd tests && npm test.
  8. Доки + скриншоты + при желании orca-playtest.js.

6. Проверка (порядок команд)

  1. node tools/check.mjs
  2. node tools/embed-fish.mjs (сам прогонит check)
  3. node tools/balance.mjs — пины Река/Озёра/Море/Океан не изменились, болото в цели
  4. cd tests && npm test — все PASS, exit 0
  5. Опционально: node tests/orca-playtest.js, node tests/gen-screenshots.js

7. Риски

  1. SPECIES — только в конец (иначе river-пины/квесты ломаются молча).
  2. pickSpecies табличный рефакторинг — нужен guard, чтобы не изменить роллы локаций 0..3.
  3. Порядок отрисовки лилий/лягушек — строго после воды.
  4. Порог свечения и производительность (shadowBlur/градиенты на мобиле).
  5. Числовые пины тестов и achBonus().coinPct — обновить всё в одном коммите.