# 🎣 Рыбалка Браузерная мобильная игра про рыбалку. Один HTML-файл, без зависимостей — просто открой в браузере и играй. | Меню | Лавка | Вываживание | Улов | |---|---|---|---| | ![меню](screenshots-wiki/mobp-menu.png) | ![лавка](screenshots-wiki/mobp-shop.png) | ![вываживание](screenshots-wiki/mobp-reel.png) | ![улов](screenshots-wiki/mobp-card.png) | ## Как играть Управление одним пальцем (вертикальный экран): 1. **Держи палец** — заряжается мощность броска, **отпусти** — кидаешь удочку. Чем дальше, тем реже, но ценнее рыба. 2. Когда поплавок нырнул и появилась **«!**» — быстро нажми экран, чтобы зацепить. У редких рыб окно на подсечку всего доли секунды. 3. **Вываживание**: держишь палец — втягиваешь, но растёт нагрузка на шнур (жёлтая полоса справа). Рыба периодически **тянет** (⚡, с вибрацией) — в этот момент **отпускай**: леска проскальзывает через тормоз катушки, и теряешь только дистанцию. Полоса снизу — оставшаяся дистанция: доведи рыбку до лодки. Чем крупнее рыба, тем сильнее рвёт и дольше тянет. И не зависай без удержания — рыба сойдёт. 4. **У каждой рыбы свой вес**, продажа — по цене за кг своего вида (от 4 до 1500 🪙/кг). Крупная рыба = большие деньги. 5. **У удочек есть предел веса** (3–40 кг): зацепишь более тяжёлую — шнур лопнет почти мгновенно. Чем лучше удочка и приманка, тем выше шанс зацепить крупную. Новый максимум по виду отмечен бейджем «🏆 РЕКОРД!» на карточке улова. 6. На монеты — новые удилища и приманки в лавке 🛒 (кнопка 🛒 в HUD или клик по счётчику монет). 7. **Награды 🎯**: три квеста дня (уловы, монеты, забросы) с наградой за выполнение; стрик входов — ежедневная награда растёт до дня 7, «щит» прощает один пропуск в неделю; 38 достижений 🏅 с постоянными бонусами (+% к монетам, окно подсечки, нагрузка шнура). 8. **День/ночь**: полный цикл суток ~5 минут (утро → день → вечер → ночь). Ночью свой состав рыб — сом, щука и окунь активнее, но без 🪯 фонарика клёва не будет — фонарик дают апгрейды удилищ (1-й апгрейд любого удилища). 9. **Босс в каждой локации**: в каждой воде живёт свой босс — Река: осётр, Озёра: гигантский рак, Море: рыба-меч, Океан: синий кит, Болото: дух болота (шанс при поимке соответствующей рыбы). Босс весит 20–50 кг. Бой идёт в 3 фазы — босс «рвёт и уходит», и каждая следующая фаза глубже; удерживай, чтобы втащить. Награда ×5 к цене. 10. **Симулятор боёв (релиз 5)**: у рыбы есть выносливость — тонкая фиолетовая полоска под дистанцией: свежая рыба тянет долго и сильно, а уставшая (💤) вянет — втягивай её именно тогда. У катушек — тормоз (drag): рывок сильнее тормоза — леска скользит. Иногда поплавок не берёт вовсе — пустой клёв, подожди ещё немного. ## Возможности - 37 видов рыб с собственным весом (0.05–100 кг) и ценой за кг (5 уровней редкости), у каждой локации — только свои рыбы: Река — 8 базовых, Озёра — 10 озёрных (судак, хариус, сиг, линь, навага, гигантский рак и другие), Море — 5 морских (скумбрия, камбала, тунец, рыба-меч и другие), Океан — 9 глубоководных (синий кит, гигантский кальмар, скат-манта, гигантский осьминог и другие), Волшебное болото — 5 светящихся (светлячок, лунная рыбка, изумрудный светляк, фиалковый огонёк, дух болота) — ночью светятся разными цветами - Удилища: предел веса, прочность шнура, скорость подсечки, бонус на крупную рыбу - Приманки: частота клёва, дальность броска, шанс редких и крупных - Физика боя: выносливость рыбы (уставшая 💤 вянет и втягивается быстрее), тормоз катушки (drag) — сильнейший рывок проскальзывает, пустые клёвы - Цикл дня и ночи (~5 мин на сутки): ночью своя таблица рыб (сом/щука/окунь активнее), ночью нужен 🪯 фонарик — апгрейд 1 удилища - Апгрейды снастей: удилища и приманки улучшаются до 4 уровня (свет фонарика, крепость лески, тормоз, катушка, клёв, редкие и крупные рыбы); следующая снасть в лавке открывается после 4 уровня предыдущей - Босс-рыба в каждой локации (Река — осётр, Озёра — гигантский рак, Море — рыба-меч, Океан — синий кит, Болото — дух болота; шанс при поимке соответствующей рыбы, босс весит 20–50 кг): 3 фазы «рвёт и уходит», награда ×5, достижение «Босс-рыбак» + пер-босс достижения - Варианты рыб (особая рыба ≈31%): медная ×1.5, серебряная ×2, кварцевая ×2.5, золотая ×3, изумрудная ×4, алмазная ×4.5, радужная ×5 (топ, самая редкая) — бейдж и оформление карточки улова; снасть усиливает шанс (тип наживки и её уровень — редким вариантам прибавка больше, топ-снасть ≈×5 к шансу радужной) - Погода: дождь (🌧️) — шанс особых рыб ×3; туман (🌫️) — клёв ×1,5; событие идёт 120 с, следующее — раз в 2–4 минуты — дождь - Скины лодки и поплавка 🎨 — вкладка «Скины» в лавке: лодка «Красная лодка» 800 🪙 / «Лодка-домик» 2000 🪙, поплавок «Красный» 500 🪙 / «Неоновый» 1500 🪙 — чистая косметика (без эффектов на геймплей) - Локации: Озёра (500 🪙) — судак, хариус, гигантский рак; Болото (10 000 🪙) — светящиеся обитатели; Море (100 000 🪙) — скумбрия, тунец, рыба-меч; Океан (300 000 🪙) — глубоководные гиганты: синий кит, гигантский кальмар, скат-манта, гигантский осьминог; прогрессия плавно замедляется: 2-я удочка/приманка и Озёра — первые 5 минут, Карбон 5–10 мин, Болото +15 мин, Титан ~1 час, Море ~2 часа, Океан ~4 часа (модель `tools/progression.mjs`); Волшебное болото: светящиеся обитатели (светлячок, лунная рыбка, изумрудный светляк, фиалковый огонёк, дух болота), ночью рыбы и фоновые стайки светятся разными цветами, вода — тёмно-моховая, на поверхности кувшинки с лилиями и прыгающие лягушки; у каждой — свой состав днём/ночью, своя вода (цвет, волны, рыбы в толще) и свой берег (Река — лесистая полоса, Озёра — холмы, Море — парусник и чайки, Океан — открытый горизонт, Болото — мшистый берег с камышом), чем дальше вода — тем доходнее улов; покупка и переключение во вкладке 🗺️ лавки — озёра море океан болото днём болото ночью - **Аквариум 🐠** — декоративная сцена коллекции: с карточки улова кнопка «🐠 В аквариум» кладёт бесплатную копию экземпляра (монеты за улов платятся как обычно, модель C — экономика не тронута); старт 6 мест, расширение до 12 за монеты (1 500 → 100 000 🪙); жильцы — те же SVG-портреты с вариантной перекраской, что на карточке улова, и размером от абсолютного веса (та же шкала `fishSizeFromW`, что при вываживании; масштаб экрана растёт плавно, так что относительная крупность жильцов одинакова на телефоне и десктопе); тап по рыбе — вес и редкость, «Выпустить» освобождает слот (без монет). Вход — из хаба «Меню»; чистая косметика — аквариум - Квесты дня (3 шт, генерация по дню), стрик входов со «щитом», 38 достижений с бонусами - Дневник рыбака — коллекция, максимальный улов по каждому виду, статистика - Магазин с вкладками: Лавка 🛒, Дневник 📔, Награды 🎯, Достижения 🏅, Скины 🎨, Локации 🗺️ - Прогресс и коллекция сохраняются в `localStorage` (старые сейвы мигрируются автоматически) - Ночь: свой состав рыб и тёмная вода при `dayTime=0.85` — ночь - Клик по монетам в HUD открывает лавку на вкладке «Лавка» 🛒 - Звуки на WebAudio, вибрация на телефоне - Локализация RU/EN — язык определяется автоматически через SDK Яндекс Игр (`ysdk.environment.i18n.lang`); меню адаптируется под устройство (тач/мышь) - Кнопка паузы (⏸ в HUD) — пауза игры и звука («Продолжить»/«В меню» → хаб «Меню»); звук/игра также ставятся на паузу при потере фокуса окна - Вся графика нарисована на Canvas — внешних ресурсов нет ## Документация [📋 Процесс разработки](docs/DEVLOG.md) — этапы (ТЗ → прототип → автотесты → публикация), инструменты, найденные баги, гигиена секретов и как развивать игру дальше. ## Запуск Просто открой [index.html](index.html) в браузере (десктоп или телефон). Для локальной разработки: ```bash python3 -m http.server 8000 # → http://localhost:8000 ``` ## Публикация в Яндекс Играх Архив для платформы (только `index.html` в корне архива, с самопроверкой — набор файлов, размер, имена, sha256, синтаксис JS): ```bash node tools/pack.mjs # → dist/fishing-yandex.zip node tests/pack-smoke.js # перед загрузкой в консоль: smoke упакованной копии (игра из архива, 6 проверок) ``` ### Релизная (уменьшенная) сборка Игра — один файл (~577 КБ), из них ~200 КБ — встроенные SVG-портреты рыб, ~93 КБ — вшитый emoji-шрифт и ~34 КБ — favicon (`logo.png` в виде `data:`-URI PNG, вкладка + `apple-touch-icon`; генерируется `node tools/favicon.mjs`). Для публикации «поменьше» есть минификатор: `node tools/minify.mjs` (зависимости: `npm i --prefix tools` — terser+csso). Он пишет `dist/index.release.html` (−34%: 577→382 КБ, gzip 208→152 КБ) и гоняет самопроверку (6 пунктов: размер, синтаксис JS, маркеры блоков, набор id, видимый текст DOM, base64 шрифта). Что сжимает: JS (terser, имена глобалов НЕ трогаются — артефакт прогоняется обычной тестовой суитой), CSS (csso), комменты и whitespace в SVG-портретах и DOM. Блок emoji-шрифта не трогается (base64 woff2 уже сжат). Перед публикацией: подставь артефакт под `index.html` и прогони `node tests/test.js` (234 проверки) и/или цепочку выше (pack → pack-smoke). SDK подхватывается автоматически на площадке; локально (file://) игра работает без него (встроенный стаб). Локальная отладка с SDK: открыть игру с параметром `?sdk=1` и положить `sdk.js` рядом с игрой (или поднять локальный прокси SDK Яндекса). В консоли разработчика (games.yandex.ru): включить монетизацию, опция облачных сейвов — выключена (игра сама хранит сейв в `localStorage`), платформы — без Android TV, `debug-mode=16` — для проверки лоадера. ## Тесты Автотест прогоняет весь геймплей (бросок, подсечка, все исходы вываживания, магазин, дневник, сохранение, варианты рыб (медь/серебро/кварц/золото/изумруд/алмаз/радуга), near-miss, миграция сейва, квесты, стрик, достижения, день/ночь с фонариком, босс-рыба в 3 фазы, локации с эксклюзивной ихтиофауной и Болото со свечением/весами, аквариум (диалог выбора слота, заселение, замена с подтверждением, докупка слота, выпуск, миграция), SDK-стаб (YG), реклама: RV-бонус и гейты interstitial, i18n (RU/EN), пауза (кнопка + blur/focus окна)) в headless Chromium: ```bash cd tests npm install # ставит puppeteer-core node test.js # 234 проверки ``` Нужен установленный Chromium (`executablePath` в `test.js` при необходимости поправить). Есть и браузерный плейтест «вживую» во встроенном браузере Orca: `node tests/orca-playtest.js` (из каталога репо, требует запущенный Orca app) — полный геймплей, проверка консоли и pageerror; детали в [docs/BROWSER-TESTING.md](docs/BROWSER-TESTING.md). Скриншоты состояний — `tests/gen-screenshots.js` (headless, 15 кадров × 3 вьюпорта: десктоп 1280×720, мобильный портрет 360×640@2x, мобильный ландшафт 800×450@1.6x, 24-битный PNG без альфа). Без аргументов — русские скриншоты в `screenshots-wiki/`; с аргументом `en` — английские в `screenshots-wiki-en/`. README ссылается на `screenshots-wiki/mobp-*` (мобильный портрет).