Files
fishing-game/README.md
T
andrey ad079b08f3 Инструмент: релизная сборка tools/minify.mjs (index.html −35%). (1) Методы: JS — terser compress passes:2 + mangle.toplevel:false (глобалы из буллета «Подводные камни» держатся именами — артефакт прогоняется обычной тестовой суитой); CSS — csso в каждом <style> КРОМЕ блока EMOJI-FONT (base64 woff2 держится побайтово, csso мог бы перенормировать кавычки); FISH-SVG — вырезаны HTML-комменты (~50 КБ описаний анатомии) и whitespace между тегами (в SVG текст-ноды не рендерятся — безопасно); прочие HTML-комменты — кроме маркеров EMOJI-FONT/FISH-SVG BEGIN/END (нельзя: whitespace внутри отрицательного lookaхeda, иначе <!-- EMOJI-FONT:BEGIN съедался бэктреком); whitespace DOM — только между блок-тегами (div/section/… + canvas/svg), inline-текст и пробелы между <b>…</b> и словом не трогаются. (2) Самопроверка 6 пунктов при любом FAIL exit 1: (a) размер, (b) node --check вынутого JS (паттерн tools/check.mjs), (c) маркеры по одному, (d) набор id идентичен (104), (e) видимый текст DOM идентичен, (f) блок EMOJI-FONT побайтово. (3) Артефакт dist/index.release.html: 541029 → 349886 байт (−35,3%), gzip 183366 → 128565; разбивка релиза: JS 112 КБ, SVG 120 КБ, шрифт 93 КБ, CSS 18 КБ, DOM ~5 КБ. (4) Валидация: ПОЛНАЯ тестовая суита на самом артефакте (подставлен под index.html) — 222/222 PASS, exit 0, headless Chromium. (5) Зависимости tools/: terser 5.51.2 + csso 5.0.5 (package.json + package-lock.json, npm i --prefix tools; tools/node_modules не коммитится — .gitignore +node_modules/, заодно прикрыл tests/node_modules). (6) index.html, balance, тесты, скриншоты НЕ тронуты. Доки: README (секция «Релизная (уменьшенная) сборка» в «Публикация в Яндекс Играх»), AGENTS.md (пункт 6 в «Проверка»: команда + методы + обязательный прогон tests/test.js на артефакте перед публикацией).
2026-09-24 19:25:04 +00:00

94 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🎣 Рыбалка
Браузерная мобильная игра про рыбалку. Один 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 минуты — <img src="screenshots-wiki/mobp-weather-rain.png" width="200" alt="дождь">
- Скины лодки и поплавка 🎨 — вкладка «Скины» в лавке: лодка «Красная лодка» 800 🪙 / «Лодка-домик» 2000 🪙, поплавок «Красный» 500 🪙 / «Неоновый» 1500 🪙 — чистая косметика (без эффектов на геймплей)
- Локации: Озёра (65 536 🪙) — судак, хариус, гигантский рак; Море (131 072 🪙) — скумбрия, тунец, рыба-меч; Океан (196 608 🪙 = ×1.5 Моря) — глубоководные гиганты: синий кит, гигантский кальмар, скат-манта, гигантский осьминог; Волшебное болото (90 000 🪙) — светящиеся обитатели (светлячок, лунная рыбка, изумрудный светляк, фиалковый огонёк, дух болота), ночью рыбы и фоновые стайки светятся разными цветами, вода — тёмно-моховая, на поверхности кувшинки с лилиями и прыгающие лягушки; у каждой — свой состав днём/ночью, своя вода (цвет, волны, рыбы в толще) и свой берег (Река — лесистая полоса, Озёра — холмы, Море — парусник и чайки, Океан — открытый горизонт, Болото — мшистый берег с камышом), чем дальше вода — тем доходнее улов; покупка и переключение во вкладке 🗺️ лавки — <img src="screenshots-wiki/mobp-lake.png" width="200" alt="озёра"> <img src="screenshots-wiki/mobp-sea.png" width="200" alt="море"> <img src="screenshots-wiki/mobp-ocean.png" width="200" alt="океан"> <img src="screenshots-wiki/mobp-swamp.png" width="200" alt="болото днём"> <img src="screenshots-wiki/mobp-swamp-night.png" width="200" alt="болото ночью">
- **Аквариум 🐠** — декоративная сцена коллекции: с карточки улова кнопка «🐠 В аквариум» кладёт бесплатную копию экземпляра (монеты за улов платятся как обычно, модель C — экономика не тронута); старт 6 мест, расширение до 12 за монеты (1 500 → 100 000 🪙); жильцы — те же SVG-портреты с вариантной перекраской, что на карточке улова, и размером от абсолютного веса (та же шкала `fishSizeFromW`, что при вываживании; на десктопе жильцы вдвое крупнее); тап по рыбе — вес и редкость, «Выпустить» освобождает слот (без монет). Вход — из хаба «Меню»; чистая косметика — <img src="screenshots-wiki/mobp-aquarium.png" width="200" alt="аквариум">
- Квесты дня (3 шт, генерация по дню), стрик входов со «щитом», 38 достижений с бонусами
- Дневник рыбака — коллекция, максимальный улов по каждому виду, статистика
- Магазин с вкладками: Лавка 🛒, Дневник 📔, Награды 🎯, Достижения 🏅, Скины 🎨, Локации 🗺️
- Прогресс и коллекция сохраняются в `localStorage` (старые сейвы мигрируются автоматически)
- Ночь: свой состав рыб и тёмная вода при `dayTime=0.85` — <img src="screenshots-wiki/mobp-night.png" width="200" alt="ночь">
- Клик по монетам в 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 проверок)
```
### Релизная (уменьшенная) сборка
Игра — один файл (~528 КБ), из них ~200 КБ — встроенные SVG-портреты рыб и ~93 КБ — вшитый emoji-шрифт. Для публикации «поменьше» есть минификатор: `node tools/minify.mjs` (зависимости: `npm i --prefix tools` — terser+csso). Он пишет `dist/index.release.html` (−35%: 528→342 КБ, gzip 179→126 КБ) и гоняет самопроверку (6 пунктов: размер, синтаксис JS, маркеры блоков, набор id, видимый текст DOM, base64 шрифта). Что сжимает: JS (terser, имена глобалов НЕ трогаются — артефакт прогоняется обычной тестовой суитой), CSS (csso), комменты и whitespace в SVG-портретах и DOM. Блок emoji-шрифта не трогается (base64 woff2 уже сжат).
Перед публикацией: подставь артефакт под `index.html` и прогони `node tests/test.js` (222 проверки) и/или цепочку выше (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 # 222 проверок
```
Нужен установленный 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-*` (мобильный портрет).