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
Варианты рыб: медные/кварцевые/изумрудные/алмазные + буст шансов особых (Этап 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
Варианты рыб: медные/кварцевые/изумрудные/алмазные + буст шансов особых (Этап 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
Встроенный emoji-шрифт (Этап 28): субсет Noto Color Emoji (COLRv1, OFL) как base64 @font-face 'EmojiEmbedded' в index.html — 57 глифов (все emoji игры), 78 КБ woff2, +105 КБ base64 (155→260 КБ; публикуемый zip 110.9 КБ, лимит 1.22 — 100 МБ). Внешний .woff2 невозможен: pack.mjs публикует строго один index.html. Шрифт ПЕРВЫМ в font-stack html,body и во всех 10 ctx.font (константа UI_FONT, секция «ОТРИСОВКА») — единый Google-стиль emoji на всех платформах; headless-скриншоты больше не зависят от системных emoji-шрифтов. Первый кадр ждёт document.fonts.load('16px "EmojiEmbedded"') с timeout-фолбэком 1.5 с (canvas-emoji 💥🌀⚡💪🐟💤). tools/emoji-font.py — генератор: вытаскивает emoji-кодопоинты из index.html (одна точка истины) → fontTools.subset (woff2, без SVG-таблицы) → вписывает base64 между маркерами EMOJI-FONT:BEGIN/END; --check — регрессия (падает, если новый emoji не в субсете; ✓№●○↩ в NCE нет — ок). venv tools/.venv + исходник tools/fonts-src/ — в gitignore. Осознанно: ⚡⭐☀⚠⏸⚖⛵⚒ теперь цветные на всех платформах (унификация). Тесты §Y7 (164/164, exit 0), check.mjs OK, pack 5/5, pack-smoke 6/6, emoji-font.py --check OK; рендер-пробы canvas 🪙⚠️⏸⭐ — цветные пиксели. screenshots/ — 14 кадров пересняты (среда: системный шрифт Emoji One — на кадрах встроенный Google-стиль). Доки: AGENTS.md (раздел «Встроенный emoji-шрифт», 164 чека), DEVLOG Этап 28.
2026-09-09 13:45:51 +03:00
Варианты рыб: медные/кварцевые/изумрудные/алмазные + буст шансов особых (Этап 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
Варианты рыб: медные/кварцевые/изумрудные/алмазные + буст шансов особых (Этап 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
2026-09-09 17:48:00 +03:00
Варианты рыб: медные/кварцевые/изумрудные/алмазные + буст шансов особых (Этап 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

🎣 Рыбалка

Браузерная мобильная игра про рыбалку. Один 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, достижение «Босс-рыбак»
  • Варианты рыб (особая рыба ≈31%): медная ×1.5, серебряная ×2, кварцевая ×2.5, золотая ×3, изумрудная ×4, алмазная ×4.5, радужная ×5 (топ, самая редкая) — бейдж и оформление карточки улова
  • Погода: дождь (🌧️) — шанс особых рыб ×2,5; туман (🌫️) — клёв ×1,5; событие идёт 120 с, следующее — раз в 2–4 минуты — дождь
  • Скины лодки и поплавка 🎨 — вкладка «Скины» в лавке: лодка «Красная лодка» 800 🪙 / «Лодка-домик» 2000 🪙, поплавок «Красный» 500 🪙 / «Неоновый» 1500 🪙 — чистая косметика (без эффектов на геймплей)
  • Локации: Озёра (100 000 🪙) — судак, хариус, гигантский рак; свой состав днём/ночью, свой цвет воды; покупка и переключение во вкладке 🗺️ лавки — озёра
  • Квесты дня (3 шт, генерация по дню), стрик входов со «щитом», 29 достижений с бонусами
  • Дневник рыбака — коллекция, максимальный улов по каждому виду, статистика
  • Магазин с вкладками: Лавка 🛒, Дневник 📔, Награды 🎯, Достижения 🏅, Скины 🎨, Локации 🗺️
  • Прогресс и коллекция сохраняются в localStorage (старые сейвы мигрируются автоматически)
  • Ночь: свой состав рыб и тёмная вода при dayTime=0.85 — ночь
  • Клик по монетам в HUD открывает лавку на вкладке «Лавка» 🛒
  • Звуки на WebAudio, вибрация на телефоне
  • Локализация RU/EN — язык определяется автоматически через SDK Яндекс Игр (ysdk.environment.i18n.lang); меню адаптируется под устройство (тач/мышь)
  • Кнопка паузы (⏸ в HUD) — пауза игры и звука («Продолжить»/«В меню» → хаб «Меню»); звук/игра также ставятся на паузу при потере фокуса окна
  • Вся графика нарисована на Canvas — внешних ресурсов нет

Документация

📋 Процесс разработки — этапы (ТЗ → прототип → автотесты → публикация), инструменты, найденные баги, гигиена секретов и как развивать игру дальше.

Запуск

Просто открой index.html в браузере (десктоп или телефон). Для локальной разработки:

python3 -m http.server 8000
# → http://localhost:8000

Публикация в Яндекс Играх

Архив для платформы (только index.html в корне архива, с самопроверкой — набор файлов, размер, имена, sha256, синтаксис JS):

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:

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.

Скриншоты состояний — tests/gen-screenshots.js (headless, 10 кадров × 3 вьюпорта: десктоп 1280×720, мобильный портрет 360×640@2x, мобильный ландшафт 800×450@1.6x, 24-битный PNG без альфа). Без аргументов — русские скриншоты в screenshots-wiki/; с аргументом en — английские в screenshots-wiki-en/. README ссылается на screenshots-wiki/mobp-* (мобильный портрет).

S
Description
Браузерная мобильная игра про рыбалку: один HTML-файл, без зависимостей
Readme
228 MiB
1.0.0
Latest
2026-09-08 17:51:06 +03:00
Languages
HTML 63.6%
JavaScript 35.5%
Python 0.9%