13 Commits
Author SHA1 Message Date
andrey 36f54109a7 Рыба-босс в каждой локации (Этап 37): BOSS_BY_LOCATION={0:'sturge',1:'crayfish',2:'swordfish',3:'whale'} — босс = существующий вид текущей локации (Осётр/Гигантский рак/Рыба-меч/Синий кит, новых видов в SPECIES нет), условие в startBite() по save.location, тот же паттерн M4 (клон с boss:true, 30% или forceBoss). Единое правило веса: любой босс 20–50 кг (hook(): w=sp.boss?20+rand*30:rollWeight(sp), до d0/ov/st0, тот же w в reel.w/catchFish) — карманного рака нет, но босс до 50 кг > maxW Титана 40: при w>40 в режиме «держи кнопку» возможен настоящий обрыв (вываживается контролем натяжения) — зафиксировано в DEVLOG как материал баланс-этапа. Награда ×5/фазы/карточка «-БОСС» — без изменений, все вид-независимы; старые M4-пины (§9k/§9l(3)/M6(4)) прошли байт-в-байт без правок (награда читает фактический w, фазы нормированы на d0). Ачивки: boss_first — нейтральный текст «Победи рыбу-босса», +3 новые lake_boss 🦞 / sea_boss 🦈 / ocean_boss 🐳 (check по save.bosses[id], БЕЗ coinPct — пин §10c(8) achBonus 0.16 жив; bonus:{} — bonusText/achBonus корректны) — 31→34. save.bosses={} — дефолт save/freshSave + миграция loadSave + запись в boss-ветке catchFish. Тесты: новый блок §9k2 (3 локации × старт/вес 20–50 по фактическому reel.w/улов ×5/save.bosses/ачивка/карточка) + миграция сейва, a22d 31→34 — 193/193 PASS (2 прогона); check.mjs OK; emoji-font --check OK (🦞/🦈/🐳 уже в субсете); balance.mjs — без сдвига (босс вне ролла). Доки: README/AGENTS/KODA/DEVLOG (Этап 37), BROWSER-TESTING и orca-playtest — цифры босса 5–40→20–50 кг. 2026-09-19 21:31:54 +03:00
andrey 975ed32d97 Дождь ×3 (Этап 32): WEATHER.rain.variantMult 2.5→3 — особые варианты в дождь ещё чаще; эффект в variantChance() применяется к шансу с бустом снасти (суммарно у топ-снасти в дождь P(особой)≈90%, насыщения нет — все шансы <1). Заодно упущение Этапа 30: тост погоды берётся из T (t('wx_rain'), i18n), а WEATHER.rain.toast — мёртвое поле; в T.wx_rain оставался старый текст «шанс серебряной/золотой/радужной ×2,5» — RU «Дождь: шанс особых рыб ×3», EN «Rain: special fish chance ×3» (+WEATHER.rain.toast для консистентности). Тесты: M8(1) пин variantMult===3; M8(2) шансы ×3 (copper 0.36 / silver 0.24 / quartz 0.21 / gold 0.18 / emerald 0.03 / diamond 0.021 / rainbow 0.015, tol 1e-9) + пин текста тоста («особых», «×3»); orca-шаг 8 ratio ×3. 178/178 PASS, exit 0; check.mjs OK. Доки: README (×3), AGENTS (M8 ×3 + пометка про t('wx_*)/мёртвый toast), DEVLOG Этап 32, BROWSER-TESTING (шаг 8). 2026-09-15 21:35:34 +03:00
andrey fb83f17c22 Варианты рыб: медные/кварцевые/изумрудные/алмазные + буст шансов особых (Этап 30). Лестница VARIANTS — 8 вариантов, порядок ролла = порядок массива: copper ×1.5 @0.12 → silver ×2 @0.08 → quartz ×2.5 @0.07 → gold ×3 @SHINY_CHANCE (0.03→0.06, живая) → emerald ×4 @0.01 → diamond ×4.5 @0.007 → rainbow ×5 @0.005 (топ: самая редкая и наибольший множитель), иначе normal; P(особой) ≈31% (было ≈8.5%), E[mult] ≈1.36 (было ≈1.13); rollVariant() обобщён — ролл по массиву VARIANS без хардкода id. Счётчики улова: карта VARIANT_KEY={copper:'cp',silver:'sv',quartz:'qz',gold:'sn',emerald:'em',diamond:'dm',rainbow:'rb'} (sn = «shiny» = gold — семантика не тронута); catchFish() пишет caught[id] обобщённо (дефолты всех счётчиков + инкремент по ключу), миграция loadSave() — дефолт 0 для всех VARIANT_KEY-ключей (старые сейвы читаются). Дневник — обобщённые мини-чипы (обычная + 7 особых в порядке лестницы, подписи trName), новые цвета jv-cp/jv-qz/jv-em/jv-dm. Карточка улова — оформление copper-card/quartz-card/emerald-card/diamond-card (медь — бронза, кварц — молочно-сиреневый, изумруд — зелёный, алмаз — ледяной голубой: бейдж+панель+свечение), showCard() тоглит классы по всем VARIANTS. full_variants «Полная коллекция» — check на все 8 вариантов (награда прежняя +5000 разово, coinPct 0.05; ачивок по-прежнему 29, сумма achBonus().coinPct 0.16). Дождь M8 — уже обобщён в variantChance() (все особые ×2,5), тост «шанс особых рыб». Тесты: §10c(1) пин 8 вариантов/множителей/шансов, (2) +cp/qz/em/dm=0, (5) границы ролла под новый порядок (в eval сброс погоды — дождь ×2.5 сдвинул бы границы), (6) миграция всех счётчиков, (7) probe всех 8 вариантов, (8) full_variants 8×8; M8(2) — ×2.5 всех 7 особых (tol 1e-9); §lc10 — сетап 8 счётчиков; флейка-фикс: медь роллится ПЕРЕД gold — тест «золотая рыба» (§9a) и orca-шаг 8 получили forceVariant='gold', восстановление SHINY_CHANCE во всех тестах 0.03→0.06. 177/177 PASS, exit 0; check.mjs OK. Доки: README (лестница/дождь/тесты), AGENTS.md (M6/M2-пин), DEVLOG Этап 30, BROWSER-TESTING (шаг 8). 2026-09-15 20:27:31 +03:00
andrey f79a7786af gen-screenshots.js: 15 кадров × 3 вьюпорта, поддержка en, обновлены доки и README 2026-09-09 17:43:46 +03:00
andrey 4ee0d4fce3 Монеты → лавка и хаб «Меню» (Этап 29): клик по #coins в HUD открывает «Лавку рыбака» на вкладке «Лавка» (#tabTackle: «Снасти»→«Лавка», 🎣→🛒; секции «🎣 Удилища»/«🪱 Приманки» внутри не тронуты); openShop(tab?) — аргумент форсит вкладку (syncTabs() вынесен из setTab), HUD 🛒 зовёт без аргумента — помнит последнюю. Новый диалог «Меню» (#gamemenu, из паузы «В меню»): «Продолжить» (uiOpen=false + gameplayStart), Магазин/Достижения/Дневник (fromMenuShop(tab) → openShop), «Инструкции» (#menu, «Играть» вернёт в игру), 🔊 Звук и 🗑️ Очистить — ПЕРЕНЕСЕНЫ из HUD (id btnMute/btnReset сохранены; в .hudbtns остались 🛒 и ⏸). «В меню» больше не ставит state='MENU': сессия (заброс/вываживание) заморожена под оверлеем и продолжается с того же места; state='MENU' — только загрузка/сброс (там #menu с инструкциями — старт новой игры прежний). shopFromMenu: лавка, открытая из «Меню», при × возвращает в хаб (uiOpen=true, без gameplayStart); из HUD/монет — в игру. Z-порядок: #gamemenu в DOM позже #shop/#resetDlg — при открытии лавки/сброса из хаба гменю прячется, иначе перекрыл бы их. YG-счётчики сбалансированы: вход в хаб из паузы (gameplayStop уже сделал onPause), «Продолжить» → gameplayStart (пин §Y8(4): stop +1, start +0). i18n: gm_* ключи RU/EN, tab_tackle 'Лавка'/'Shop', updateHUD печатает 🔊/🔇 + «Звук», setLang дёргает updateHUD. Все emoji набора уже были в субсете встроенного шрифта — перегенерация tools/emoji-font.py не потребовалась. Тесты: §9/Y1/Y2/Y6 флоу btnReset/btnMute — через toGameMenu() (⏸ → «В меню»); §Y6(5) переписан (хаб открыт, state сохранён), (6) заходит к btnPlay через «Инструкции»; новая §Y8 (HUD-состав, монеты→«Лавка», вкладки из хаба, ×→хаб, mute-тогл по семантике — фикстура сейва §«локации» ставит muted:true, «Продолжить», инструкции). 177/177, exit 0. shots.js: кадр gamemenu (15/15), screenshots/ обновлены, визуально проверены (лавка/хаб/сброс/инструкции). orca-playtest.js: сброс 2b — настоящий UI-путь хаба (не синтетический клик по скрытой кнопке); новая секция 9e — переходы по хабу (монеты, Магазин/Достижения/Дневник + × назад, Инструкции, 🔊-тогл через объект — скаляры CLI приходят JSON-строками, «Продолжить»); закрыты давние флейки живого браузера: сейв профиля с ночью прошлого прогона (шаг 2c — форс дня: ночью без фонарика ветка клёва за гейтом hasLight, forceBite не работает), босс 5–40 кг рвал стартовую удочку натяжением до босс-фаз (выдаём «Титан», save.rod=3 — по UI нельзя, M5-гейтинг) и транзитное SNAP-окно 0.6 с vs CLI-roundtrip (ждём персистентный bossPhase, отпускание в том же eval). 76/76. check.mjs OK, pack 5/5, pack-smoke 6/6. Доки: AGENTS.md (177 чеков, «Меню», монеты→лавка, пауза), README (вкладка «Лавка», хаб), DEVLOG Этап 29, BROWSER-TESTING (п. 11–13, таблица шагов 2b/9e/12). 2026-09-09 15:44:04 +03:00
andrey 9914fe89a9 Тесты: починка orca-playtest (ломался с 622d203 — M5) + +13 проверок последних дополнений (48→61). Фикс: профиль Orca переживает localStorage между прогонами (test.js — свежий headless-профиль), а с M5 «фонарик» — не строка, а апгрейд-кнопка удилища 0 при 1–3 ур. → на грязном сейве (4 ур.) шаг 9c падал «no flask»; добавлен шаг 2b — сброс сейва через игру (🗑️ → «Сбросить» = freshSave()+persist+сброс тест-форсов) после error-хуков, без перезагрузки. New: 7c скины (🎨 рендер, покупка «Красный» 500 — списание/авто-экип, клик+состояние в одном eval), 7d локации (🗺️, покупка «Озёра» 100000 — авто-переход+тост+списание, возврат на Реку), 8' золото в дождь (пилюля 🌧️, ratio variantChance ×2.5, улов с SHINY_CHANCE=1 в дождь → 4 ачивки Этапа 22 разом: first_shiny+rain_variant+skin_first+lake_first — skin/lake выдаются на улове, checkAchievements в catchFish, не в лавке), 8b туман (пилюля 🌫️, ratio biteChance ×1.5, скрытие пилюли); +скрины orca-skins/orca-locations; ratio-чеки независимы от баланса/фазы суток (одна eval); реальная погода за прогон не стартует (gap ≥120 c). Доки: BROWSER-TESTING — строки 2b/7c/7d/8/8b в таблице, п.10 камешков (localStorage), пример вывода построчно под реальный прогон, 400/250→70 (d5212e9), 1.4→1.45. 61/61 live ×4 (в т.ч. из грязного сейва), 128/128 headless, exit 0 2026-09-07 11:32:01 +03:00
andrey 4c4b6db1fa Ачивки: Этап 22 — +11 достижений (18→29) по итогам M5/M6/M8/скинов/локаций + «shiny»→«золотая рыба». new: first_silver 🥈 / first_rainbow 🌈 / rain_variant 🌧️ (особая в дождь) / fog_catch 🌫️ / skin_first 🎨 / skins_all 🎭 / lake_first 🗺️ / gear_max ⚒️ (4 ур.) / titan 💪 / weight_1000 🚢 / night_first 🌙 — все coinPct 1–2%. Сейв: +kgTotal/nightCatch/wxRainV/wxFog (чтение ||0, без миграции), крючок в catchFish() до checkAchievements() (rain — только вариант ≠ normal, босс normal). Тексты: квест catch_shiny и desc first_shiny — «Поймай золотую рыбу» (id/SHINY_CHANCE не тронуты); README/BROWSER-TESTING/лейблы test.js+orca-playtest — «золотая рыба». Тесты: +11 (§10g: тексты, данные 29/уникальность, геймплей ночной улов в дождь — 3 счётчика+3 ачивки, first_rainbow/fog_catch, граница 999.9/1000, скины, lake, снасти, старый сейв), пин full_variants 0.13→0.16. 128/128, exit 0; доки: DEVLOG Этап 22, AGENTS/README — 128/29. 2026-09-07 10:50:03 +03:00
andrey 929191b46d Доки/тесты: orca-playtest — вкладка Дневника по id (tabJournal), таблица BROWSER-TESTING — иконки вкладок (📔/🎣) как в UI 2026-09-06 20:40:25 +03:00
andrey e13613a782 M6: Этап 2 — варианты рыб (серебряная ×2 / золотая ×3 / радужная ×5), «Улучшить вариант» на карточке (cost=0.6×Δ), энциклопедия 4 счётчика, ачивка full_variants (+5000, +5% перманентно); по ревью: orca-playtest/доки/скрин/орфо. 92/92, exit 0 2026-09-06 14:37:10 +03:00
andrey 622d203e52 M5: Этап 1 — апгрейды снастей (lv 1..4, save.rodLv/lureLv + миграция), фонарик → первый апгрейд удилища (LURES id=4 удалён), гейтинг лавки lv(i-1)===4; по ревью: доки/скриншот/индентация/NIT. 82/82, exit 0 2026-09-06 12:04:21 +03:00
andrey d65815ad95 Тесты: харденинг orca-playtest.js — pageerror-хуки, бэкофф ретраев, диагностика кнопок 2026-09-01 18:39:52 +03:00
andrey 5c95309ce0 Sprint 2: ночная рыбалка + босс-рыба + доки/скриншоты 2026-09-01 17:53:42 +03:00
andrey abab18b0d0 Sprint 1: shiny + near-miss + награды (квесты, стрик, достижения) + браузерный плейтест
M1:
- Shiny-рыба (SHINY_CHANCE=0.03, ×3 монет, золотая карточка + бейдж)
- Near-miss: сбежавшая рыба даёт ~10% цены (toast «Сбежала! ...»)
- Миграция сейвов (caught: число → {n,best,sn})

M2:
- Ежедневные квесты (3/день, 6 шаблонов, сид по дате)
- Стрик входов со щитом (1/неделю, награды 25-200 🪙)
- 16 достижений с аддитивными бонусами (+% монет, окно, линия)
- Вкладки 🎯 (квесты+стрик) и 🏅 (достижения) в лавке

Инструменты:
- tests/orca-playtest.js — браузерный плейтест через Orca CLI
- docs/BROWSER-TESTING.md — документация процесса
- AGENTS.md — правила разработки

Проверки: 43 puppeteer + 35 orca-playtest = 78, все PASS
2026-09-01 14:24:21 +03:00