87 lines
12 KiB
Markdown
87 lines
12 KiB
Markdown
# 🎣 Рыбалка
|
|
|
|
Браузерная мобильная игра про рыбалку. Один HTML-файл, без зависимостей — просто открой в браузере и играй.
|
|
|
|
| Меню | Клёв | Вываживание | Улов |
|
|
|---|---|---|---|
|
|
|  |  |  |  |
|
|
|
|
## Как играть
|
|
|
|
Управление одним пальцем (вертикальный экран):
|
|
|
|
1. **Держи палец** — заряжается мощность броска, **отпусти** — кидаешь удочку. Чем дальше, тем реже, но ценнее рыба.
|
|
2. Когда поплавок нырнул и появилась **«!**» — быстро нажми экран, чтобы зацепить. У редких рыб окно на подсечку всего доли секунды.
|
|
3. **Вываживание**: держишь палец — втягиваешь, но растёт нагрузка на шнур (жёлтая полоса справа). Рыба периодически **тянет** (⚡, с вибрацией) — в этот момент **отпускай**: леска проскальзывает через тормоз катушки, и теряешь только дистанцию. Полоса снизу — оставшаяся дистанция: доведи рыбку до лодки. Чем крупнее рыба, тем сильнее рвёт и дольше тянет. И не зависай без удержания — рыба сойдёт.
|
|
4. **У каждой рыбы свой вес**, продажа — по цене за кг своего вида (от 20 до 1500 🪙/кг). Крупная рыба = большие деньги.
|
|
5. **У удочек есть предел веса** (3–40 кг): зацепишь более тяжёлую — шнур лопнет почти мгновенно. Чем лучше удочка и приманка, тем выше шанс зацепить крупную. Новый максимум по виду отмечен бейджем «🏆 РЕКОРД!» на карточке улова.
|
|
6. На монеты — новые удилища и приманки в лавке 🛒 (кнопка 🛒 в HUD или клик по счётчику монет).
|
|
7. **Награды 🎯**: три квеста дня (уловы, монеты, забросы) с наградой за выполнение; стрик входов — ежедневная награда растёт до дня 7, «щит» прощает один пропуск в неделю; 29 достижений 🏅 с постоянными бонусами (+% к монетам, окно подсечки, нагрузка шнура).
|
|
8. **День/ночь**: полный цикл суток ~5 минут (утро → день → вечер → ночь). Ночью свой состав рыб — сом, щука и окунь активнее, но без 🪯 фонарика клёва не будет — фонарик дают апгрейды удилищ (1-й апгрейд любого удилища).
|
|
9. **Осётр-босс**: при поимке осётра есть шанс встретить босса. Бой идёт в 3 фазы — босс «рвёт и уходит», и каждая следующая фаза глубже; удерживай, чтобы втащить. Награда ×5 к цене.
|
|
10. **Симулятор боёв (релиз 5)**: у рыбы есть выносливость — тонкая фиолетовая полоска под дистанцией: свежая рыба тянет долго и сильно, а уставшая (💤) вянет — втягивай её именно тогда. У катушек — тормоз (drag): рывок сильнее тормоза — леска скользит. Иногда поплавок не берёт вовсе — пустой клёв, подожди ещё немного.
|
|
|
|
## Возможности
|
|
|
|
- 11 видов рыб с собственным весом (0.05–40 кг) и ценой за кг (5 уровней редкости)
|
|
- Удилища: предел веса, прочность шнура, скорость подсечки, бонус на крупную рыбу
|
|
- Приманки: частота клёва, дальность броска, шанс редких и крупных
|
|
- Физика боя: выносливость рыбы (уставшая 💤 вянет и втягивается быстрее), тормоз катушки (drag) — сильнейший рывок проскальзывает, пустые клёвы
|
|
- Цикл дня и ночи (~5 мин на сутки): ночью своя таблица рыб (сом/щука/окунь активнее), ночью нужен 🪯 фонарик — апгрейд 1 удилища
|
|
- Апгрейды снастей: удилища и приманки улучшаются до 4 уровня (свет фонарика, крепость лески, тормоз, катушка, клёв, редкие и крупные рыбы); следующая снасть в лавке открывается после 4 уровня предыдущей
|
|
- Босс-рыба — Осётр-босс (шанс при поимке осётра): 3 фазы «рвёт и уходит», награда ×5, достижение «Босс-рыбак»
|
|
- Варианты рыб: серебряная ×2, золотая ×3, радужная ×5 — бейдж и оформление карточки улова
|
|
- Погода: дождь (🌧️) — шанс серебряной/золотой/радужной ×2,5; туман (🌫️) — клёв ×1,5; событие идёт 120 с, следующее — раз в 2–4 минуты — 
|
|
- Скины лодки и поплавка 🎨 — вкладка «Скины» в лавке: лодка «Красная лодка» 800 🪙 / «Лодка-домик» 2000 🪙, поплавок «Красный» 500 🪙 / «Неоновый» 1500 🪙 — чистая косметика (без эффектов на геймплей)
|
|
- Локации: Озёра (100 000 🪙) — судак, хариус, гигантский рак; свой состав днём/ночью, свой цвет воды; покупка и переключение во вкладке 🗺️ лавки — 
|
|
- Квесты дня (3 шт, генерация по дню), стрик входов со «щитом», 29 достижений с бонусами
|
|
- Дневник рыбака — коллекция, максимальный улов по каждому виду, статистика
|
|
- Магазин с вкладками: Лавка 🛒, Дневник 📔, Награды 🎯, Достижения 🏅, Скины 🎨, Локации 🗺️
|
|
- Прогресс и коллекция сохраняются в `localStorage` (старые сейвы мигрируются автоматически)
|
|
- Диалог «Меню» (пауза ⏸ → «В меню»): «Продолжить» (сессия сохраняется), Магазин/Достижения/Дневник, «Инструкции», звук 🔊 и сброс 🗑️ (через диалог подтверждения; настройка звука при сбросе сохраняется) — 
|
|
- Клик по монетам в 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 проверок)
|
|
```
|
|
|
|
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 # 162 проверки
|
|
```
|
|
|
|
Нужен установленный Chromium (`executablePath` в `test.js` при необходимости поправить).
|
|
|
|
Есть и браузерный плейтест «вживую» во встроенном браузере Orca: `node tests/orca-playtest.js` (из каталога репо, требует запущенный Orca app) — полный геймплей, проверка консоли и pageerror; детали в [docs/BROWSER-TESTING.md](docs/BROWSER-TESTING.md).
|
|
|
|
Скриншоты состояний — `tests/shots.js` (headless, запускать из каталога `tests/`, кадры пишутся в текущий каталог): без аргументов снимает все кадры; `node shots.js menu boss` — только выбранные (прогон всё равно полный, пропускается лишь сохранение остальных); `node shots.js --list` — список кадров. Свежие скрины для README копируются в `screenshots/`.
|