andrey 31d60a6333 Этап 41 ревизия 3: 100 кг → 256 px (4× лодки), 1 кг → 20 px — степенная шкала. fishSizeFromW(w)=(3.95+16.05*max(0.1,w)^0.5981)/2.45 — по ДЛИНЕ силуэта (длина = 2.45·fs): якоря 0.1 кг → 8 px (не тронут), 1 кг → 20 px, 100 кг → 256 px = 4× лодки 64 px (было 128 = 2×). Буквально квадратичная шкала 3 якоря не держит монотонно (парабола по w: пик ~420 px на 61 кг, затем схождение к 256 px на 100 кг — кит меньше «средней» рыбы; квадратичная по ln w: провал до ~4 px у 0.2 кг) — степенная A+B·w^k точна по всем трём якорям и монотонна (k≈0.598, A≈3.95, B≈16.05). Распределение: 5 кг → 46 px (0.72× лодки), 10 кг → 67.6 px (1.05×; размер лодки достигают ~9.1 кг), 20 кг (босс min) → 100 px (1.57×), 50 кг (босс max) → 170.6 px (2.67×), 100 кг (кит max) → 256 px (4×). Диапазон 8..256 px = ×32 (было ×16; в исходной формуле ×2.7). На мобильном 360 px кит ≈ 71% ширины экрана. Тесты: пинов на размер силуэта нет — 193/193 PASS, exit 0; check.mjs OK; скриншоты пересняты (кадр reel: 12.5 кг ≈ 77 px ≈ 1.2× лодки); якоря 100/1 кг проверены живыми кадрами headless-Chromium. Доки: DEVLOG (Этап 41 — формула, таблица размеров, пометка ревизии и обоснование выбора шкалы).
2026-09-20 19:32:53 +03:00
SVG-портреты рыб в дневнике и карточке улова + убраны эмодзи рыб (Этап 42): 32 flat-SVG портрета в assets/fish/fish-<id>.svg (viewBox 0 0 160 100, flat-заливки, цвета var(--f1..f4,hsl-fallback) с инлайн-fallback в каждом элементе, переменные НЕ объявляются на <svg>/<g> — иначе перекраска сквозь <use> не сработает). Встраивание — node tools/embed-fish.mjs (идемпотентно, блок между маркерами FISH-SVG:BEGIN/END сразу после <body>, 32 <symbol id="fish-<id>" viewBox="0 0 160 100">, валидация + самопроверка + check.mjs внутри; повторный запуск — md5-стабильно). Приёмка — tools/fish-preview.html (file://: сетка 32 + демо перекраски вариантов). Дневник (пойманные) и карточка улова — <use href="#fish-<id>"> вместо дублирующихся эмодзи (🐟 был у 11 видов); showCard ставит href у #cardFishUse; перекраска вариантов — CSS-переменные --f1/--f3 в #card.<variant>-card .bigemoji (copper/gold/quartz/emerald/diamond; silver/rainbow — существующие filter, boss — filter). Эмодзи рыб УБРАНЫ полностью: поле emoji удалено из всех 32 записей SPECIES (пин lc1 fieldsOk обновлён в том же коммите), тосты обрыва/срыва без эмодзи, иконка квеста catch_species — mini-SVG .qfish (<use>, скоуп .jrow .je из-за специфичности правила портрета), рыбка-маркер дистанции на канвасе — drawFishMark (path), иконки ачивок/воблера — глифы уже бывшие в субсете (🏅/💪/🗺️/⚓/🌊/🎣). Emoji-шрифт перегенерирован (tools/emoji-font.py): субсет 64→52 глифа, woff2 89→65 КБ. Тесты: пины lc1 (32 symbol + spriteIdsOk по всем id) и M6-карточка (href #fish-carass у всех 8 вариантов); 193/193 PASS, exit 0; check.mjs OK; emoji-font --check OK (52); grep 12 рыбных эмодзи — 0 вхождений. Игровая логика/баланс/пины роллов не тронуты (визуальный этап). Доки: AGENTS.md (строка «Портреты рыб (SVG-спрайт)» в «Где крутить»), DEVLOG (Этап 42, обе части).
2026-09-20 18:23:54 +03:00
Этап 41 ревизия 3: 100 кг → 256 px (4× лодки), 1 кг → 20 px — степенная шкала. fishSizeFromW(w)=(3.95+16.05*max(0.1,w)^0.5981)/2.45 — по ДЛИНЕ силуэта (длина = 2.45·fs): якоря 0.1 кг → 8 px (не тронут), 1 кг → 20 px, 100 кг → 256 px = 4× лодки 64 px (было 128 = 2×). Буквально квадратичная шкала 3 якоря не держит монотонно (парабола по w: пик ~420 px на 61 кг, затем схождение к 256 px на 100 кг — кит меньше «средней» рыбы; квадратичная по ln w: провал до ~4 px у 0.2 кг) — степенная A+B·w^k точна по всем трём якорям и монотонна (k≈0.598, A≈3.95, B≈16.05). Распределение: 5 кг → 46 px (0.72× лодки), 10 кг → 67.6 px (1.05×; размер лодки достигают ~9.1 кг), 20 кг (босс min) → 100 px (1.57×), 50 кг (босс max) → 170.6 px (2.67×), 100 кг (кит max) → 256 px (4×). Диапазон 8..256 px = ×32 (было ×16; в исходной формуле ×2.7). На мобильном 360 px кит ≈ 71% ширины экрана. Тесты: пинов на размер силуэта нет — 193/193 PASS, exit 0; check.mjs OK; скриншоты пересняты (кадр reel: 12.5 кг ≈ 77 px ≈ 1.2× лодки); якоря 100/1 кг проверены живыми кадрами headless-Chromium. Доки: DEVLOG (Этап 41 — формула, таблица размеров, пометка ревизии и обоснование выбора шкалы).
2026-09-20 19:32:53 +03:00
Этап 41 ревизия 3: 100 кг → 256 px (4× лодки), 1 кг → 20 px — степенная шкала. fishSizeFromW(w)=(3.95+16.05*max(0.1,w)^0.5981)/2.45 — по ДЛИНЕ силуэта (длина = 2.45·fs): якоря 0.1 кг → 8 px (не тронут), 1 кг → 20 px, 100 кг → 256 px = 4× лодки 64 px (было 128 = 2×). Буквально квадратичная шкала 3 якоря не держит монотонно (парабола по w: пик ~420 px на 61 кг, затем схождение к 256 px на 100 кг — кит меньше «средней» рыбы; квадратичная по ln w: провал до ~4 px у 0.2 кг) — степенная A+B·w^k точна по всем трём якорям и монотонна (k≈0.598, A≈3.95, B≈16.05). Распределение: 5 кг → 46 px (0.72× лодки), 10 кг → 67.6 px (1.05×; размер лодки достигают ~9.1 кг), 20 кг (босс min) → 100 px (1.57×), 50 кг (босс max) → 170.6 px (2.67×), 100 кг (кит max) → 256 px (4×). Диапазон 8..256 px = ×32 (было ×16; в исходной формуле ×2.7). На мобильном 360 px кит ≈ 71% ширины экрана. Тесты: пинов на размер силуэта нет — 193/193 PASS, exit 0; check.mjs OK; скриншоты пересняты (кадр reel: 12.5 кг ≈ 77 px ≈ 1.2× лодки); якоря 100/1 кг проверены живыми кадрами headless-Chromium. Доки: DEVLOG (Этап 41 — формула, таблица размеров, пометка ревизии и обоснование выбора шкалы).
2026-09-20 19:32:53 +03:00
SVG-портреты рыб в дневнике и карточке улова + убраны эмодзи рыб (Этап 42): 32 flat-SVG портрета в assets/fish/fish-<id>.svg (viewBox 0 0 160 100, flat-заливки, цвета var(--f1..f4,hsl-fallback) с инлайн-fallback в каждом элементе, переменные НЕ объявляются на <svg>/<g> — иначе перекраска сквозь <use> не сработает). Встраивание — node tools/embed-fish.mjs (идемпотентно, блок между маркерами FISH-SVG:BEGIN/END сразу после <body>, 32 <symbol id="fish-<id>" viewBox="0 0 160 100">, валидация + самопроверка + check.mjs внутри; повторный запуск — md5-стабильно). Приёмка — tools/fish-preview.html (file://: сетка 32 + демо перекраски вариантов). Дневник (пойманные) и карточка улова — <use href="#fish-<id>"> вместо дублирующихся эмодзи (🐟 был у 11 видов); showCard ставит href у #cardFishUse; перекраска вариантов — CSS-переменные --f1/--f3 в #card.<variant>-card .bigemoji (copper/gold/quartz/emerald/diamond; silver/rainbow — существующие filter, boss — filter). Эмодзи рыб УБРАНЫ полностью: поле emoji удалено из всех 32 записей SPECIES (пин lc1 fieldsOk обновлён в том же коммите), тосты обрыва/срыва без эмодзи, иконка квеста catch_species — mini-SVG .qfish (<use>, скоуп .jrow .je из-за специфичности правила портрета), рыбка-маркер дистанции на канвасе — drawFishMark (path), иконки ачивок/воблера — глифы уже бывшие в субсете (🏅/💪/🗺️/⚓/🌊/🎣). Emoji-шрифт перегенерирован (tools/emoji-font.py): субсет 64→52 глифа, woff2 89→65 КБ. Тесты: пины lc1 (32 symbol + spriteIdsOk по всем id) и M6-карточка (href #fish-carass у всех 8 вариантов); 193/193 PASS, exit 0; check.mjs OK; emoji-font --check OK (52); grep 12 рыбных эмодзи — 0 вхождений. Игровая логика/баланс/пины роллов не тронуты (визуальный этап). Доки: AGENTS.md (строка «Портреты рыб (SVG-спрайт)» в «Где крутить»), DEVLOG (Этап 42, обе части).
2026-09-20 18:23:54 +03:00
SVG-портреты рыб в дневнике и карточке улова + убраны эмодзи рыб (Этап 42): 32 flat-SVG портрета в assets/fish/fish-<id>.svg (viewBox 0 0 160 100, flat-заливки, цвета var(--f1..f4,hsl-fallback) с инлайн-fallback в каждом элементе, переменные НЕ объявляются на <svg>/<g> — иначе перекраска сквозь <use> не сработает). Встраивание — node tools/embed-fish.mjs (идемпотентно, блок между маркерами FISH-SVG:BEGIN/END сразу после <body>, 32 <symbol id="fish-<id>" viewBox="0 0 160 100">, валидация + самопроверка + check.mjs внутри; повторный запуск — md5-стабильно). Приёмка — tools/fish-preview.html (file://: сетка 32 + демо перекраски вариантов). Дневник (пойманные) и карточка улова — <use href="#fish-<id>"> вместо дублирующихся эмодзи (🐟 был у 11 видов); showCard ставит href у #cardFishUse; перекраска вариантов — CSS-переменные --f1/--f3 в #card.<variant>-card .bigemoji (copper/gold/quartz/emerald/diamond; silver/rainbow — существующие filter, boss — filter). Эмодзи рыб УБРАНЫ полностью: поле emoji удалено из всех 32 записей SPECIES (пин lc1 fieldsOk обновлён в том же коммите), тосты обрыва/срыва без эмодзи, иконка квеста catch_species — mini-SVG .qfish (<use>, скоуп .jrow .je из-за специфичности правила портрета), рыбка-маркер дистанции на канвасе — drawFishMark (path), иконки ачивок/воблера — глифы уже бывшие в субсете (🏅/💪/🗺️/⚓/🌊/🎣). Emoji-шрифт перегенерирован (tools/emoji-font.py): субсет 64→52 глифа, woff2 89→65 КБ. Тесты: пины lc1 (32 symbol + spriteIdsOk по всем id) и M6-карточка (href #fish-carass у всех 8 вариантов); 193/193 PASS, exit 0; check.mjs OK; emoji-font --check OK (52); grep 12 рыбных эмодзи — 0 вхождений. Игровая логика/баланс/пины роллов не тронуты (визуальный этап). Доки: AGENTS.md (строка «Портреты рыб (SVG-спрайт)» в «Где крутить»), DEVLOG (Этап 42, обе части).
2026-09-20 18:23:54 +03:00
SVG-портреты рыб в дневнике и карточке улова + убраны эмодзи рыб (Этап 42): 32 flat-SVG портрета в assets/fish/fish-<id>.svg (viewBox 0 0 160 100, flat-заливки, цвета var(--f1..f4,hsl-fallback) с инлайн-fallback в каждом элементе, переменные НЕ объявляются на <svg>/<g> — иначе перекраска сквозь <use> не сработает). Встраивание — node tools/embed-fish.mjs (идемпотентно, блок между маркерами FISH-SVG:BEGIN/END сразу после <body>, 32 <symbol id="fish-<id>" viewBox="0 0 160 100">, валидация + самопроверка + check.mjs внутри; повторный запуск — md5-стабильно). Приёмка — tools/fish-preview.html (file://: сетка 32 + демо перекраски вариантов). Дневник (пойманные) и карточка улова — <use href="#fish-<id>"> вместо дублирующихся эмодзи (🐟 был у 11 видов); showCard ставит href у #cardFishUse; перекраска вариантов — CSS-переменные --f1/--f3 в #card.<variant>-card .bigemoji (copper/gold/quartz/emerald/diamond; silver/rainbow — существующие filter, boss — filter). Эмодзи рыб УБРАНЫ полностью: поле emoji удалено из всех 32 записей SPECIES (пин lc1 fieldsOk обновлён в том же коммите), тосты обрыва/срыва без эмодзи, иконка квеста catch_species — mini-SVG .qfish (<use>, скоуп .jrow .je из-за специфичности правила портрета), рыбка-маркер дистанции на канвасе — drawFishMark (path), иконки ачивок/воблера — глифы уже бывшие в субсете (🏅/💪/🗺️/⚓/🌊/🎣). Emoji-шрифт перегенерирован (tools/emoji-font.py): субсет 64→52 глифа, woff2 89→65 КБ. Тесты: пины lc1 (32 symbol + spriteIdsOk по всем id) и M6-карточка (href #fish-carass у всех 8 вариантов); 193/193 PASS, exit 0; check.mjs OK; emoji-font --check OK (52); grep 12 рыбных эмодзи — 0 вхождений. Игровая логика/баланс/пины роллов не тронуты (визуальный этап). Доки: AGENTS.md (строка «Портреты рыб (SVG-спрайт)» в «Где крутить»), DEVLOG (Этап 42, обе части).
2026-09-20 18:23:54 +03:00
Этап 41 ревизия 3: 100 кг → 256 px (4× лодки), 1 кг → 20 px — степенная шкала. fishSizeFromW(w)=(3.95+16.05*max(0.1,w)^0.5981)/2.45 — по ДЛИНЕ силуэта (длина = 2.45·fs): якоря 0.1 кг → 8 px (не тронут), 1 кг → 20 px, 100 кг → 256 px = 4× лодки 64 px (было 128 = 2×). Буквально квадратичная шкала 3 якоря не держит монотонно (парабола по w: пик ~420 px на 61 кг, затем схождение к 256 px на 100 кг — кит меньше «средней» рыбы; квадратичная по ln w: провал до ~4 px у 0.2 кг) — степенная A+B·w^k точна по всем трём якорям и монотонна (k≈0.598, A≈3.95, B≈16.05). Распределение: 5 кг → 46 px (0.72× лодки), 10 кг → 67.6 px (1.05×; размер лодки достигают ~9.1 кг), 20 кг (босс min) → 100 px (1.57×), 50 кг (босс max) → 170.6 px (2.67×), 100 кг (кит max) → 256 px (4×). Диапазон 8..256 px = ×32 (было ×16; в исходной формуле ×2.7). На мобильном 360 px кит ≈ 71% ширины экрана. Тесты: пинов на размер силуэта нет — 193/193 PASS, exit 0; check.mjs OK; скриншоты пересняты (кадр reel: 12.5 кг ≈ 77 px ≈ 1.2× лодки); якоря 100/1 кг проверены живыми кадрами headless-Chromium. Доки: DEVLOG (Этап 41 — формула, таблица размеров, пометка ревизии и обоснование выбора шкалы).
2026-09-20 19:32:53 +03:00
Цены Озёр/Моря/Океана под цели ×3/×4/×5 Реки (Этап 39): после лестницы весов Этапа 38 доходность новых вод была ×5–15 — урезаны цены 24 видов (Озёра k≈0.201: zander 8, chuch 6, crayfish 40, bleak 4, roundel 5, eelpout 11, tench 16, navaga 50, rudd 5, cisco 18; Море k≈0.253: herring 8, mackerel 18, flounder 33, tuna 46, swordfish 81; Океан k≈0.192: moray 5, grouper 5, turtle 9, angler 21, octopus 23, manta 29, shark 31, squid 37, whale 67), цены Реки не тронуты. tools/balance.mjs: новая опция --price id:цена (what-if 🪙/кг, паттерн --set: парсинг/валидация id/calcTable/WHAT-IF строка/help) — набор цен собран и сверен через скрипт ДО и ПОСЛЕ правки index.html (цифры совпали). Итог (нейтральная снасть): Озёра 194.1/214.5 (×2.98/×1.70 Реки), Море 262.7/304.2 (×4.04/×2.42), Океан 329.1/398.9 (×5.06/×3.17), Река 65.1/125.9 — цель по ДНЮ (×3/×4/×5): единый множитель масштабирует обе фазы, а ночь/день у новых вод ×1.11–1.21 против ×1.93 у Реки — «обе фазы» ценами недостижимо (нужна правка *_WEIGHTS); зафиксировано в AGENTS.md. Инвариант «новая вода доходнее в ОБЕ фазы» держится с запасом: Море/Озёра ×1.35/×1.42, Океан/Море ×1.25/×1.31 (тонкий запас этапа 38 ×1.06 снят). Тесты: пины lc1 (10f) — 24 строки (колонка price) + текст ассерта; тесты наград M4/§9k2/M6/shiny читают w×price динамически — без изменений (босс-рак 200→40). 193/193 PASS, exit 0; check.mjs OK. Доки: AGENTS.md (финальные пины + --price), README (4–1500 🪙/кг), KODA.md (0.05–100 кг, 4–1500 🪙/кг), шапка balance.mjs (пины), DEVLOG (Этап 39).
2026-09-19 23:49:07 +03:00
2026-09-09 17:48:00 +03:00
Цены Озёр/Моря/Океана под цели ×3/×4/×5 Реки (Этап 39): после лестницы весов Этапа 38 доходность новых вод была ×5–15 — урезаны цены 24 видов (Озёра k≈0.201: zander 8, chuch 6, crayfish 40, bleak 4, roundel 5, eelpout 11, tench 16, navaga 50, rudd 5, cisco 18; Море k≈0.253: herring 8, mackerel 18, flounder 33, tuna 46, swordfish 81; Океан k≈0.192: moray 5, grouper 5, turtle 9, angler 21, octopus 23, manta 29, shark 31, squid 37, whale 67), цены Реки не тронуты. tools/balance.mjs: новая опция --price id:цена (what-if 🪙/кг, паттерн --set: парсинг/валидация id/calcTable/WHAT-IF строка/help) — набор цен собран и сверен через скрипт ДО и ПОСЛЕ правки index.html (цифры совпали). Итог (нейтральная снасть): Озёра 194.1/214.5 (×2.98/×1.70 Реки), Море 262.7/304.2 (×4.04/×2.42), Океан 329.1/398.9 (×5.06/×3.17), Река 65.1/125.9 — цель по ДНЮ (×3/×4/×5): единый множитель масштабирует обе фазы, а ночь/день у новых вод ×1.11–1.21 против ×1.93 у Реки — «обе фазы» ценами недостижимо (нужна правка *_WEIGHTS); зафиксировано в AGENTS.md. Инвариант «новая вода доходнее в ОБЕ фазы» держится с запасом: Море/Озёра ×1.35/×1.42, Океан/Море ×1.25/×1.31 (тонкий запас этапа 38 ×1.06 снят). Тесты: пины lc1 (10f) — 24 строки (колонка price) + текст ассерта; тесты наград M4/§9k2/M6/shiny читают w×price динамически — без изменений (босс-рак 200→40). 193/193 PASS, exit 0; check.mjs OK. Доки: AGENTS.md (финальные пины + --price), README (4–1500 🪙/кг), KODA.md (0.05–100 кг, 4–1500 🪙/кг), шапка balance.mjs (пины), DEVLOG (Этап 39).
2026-09-19 23:49:07 +03:00

🎣 Рыбалка

Браузерная мобильная игра про рыбалку. Один HTML-файл, без зависимостей — просто открой в браузере и играй.

Меню Лавка Вываживание Улов
меню лавка вываживание улов

Как играть

Управление одним пальцем (вертикальный экран):

  1. Держи палец — заряжается мощность броска, отпусти — кидаешь удочку. Чем дальше, тем реже, но ценнее рыба.
  2. Когда поплавок нырнул и появилась «!» — быстро нажми экран, чтобы зацепить. У редких рыб окно на подсечку всего доли секунды.
  3. Вываживание: держишь палец — втягиваешь, но растёт нагрузка на шнур (жёлтая полоса справа). Рыба периодически тянет (⚡, с вибрацией) — в этот момент отпускай: леска проскальзывает через тормоз катушки, и теряешь только дистанцию. Полоса снизу — оставшаяся дистанция: доведи рыбку до лодки. Чем крупнее рыба, тем сильнее рвёт и дольше тянет. И не зависай без удержания — рыба сойдёт.
  4. У каждой рыбы свой вес, продажа — по цене за кг своего вида (от 4 до 1500 🪙/кг). Крупная рыба = большие деньги.
  5. У удочек есть предел веса (3–40 кг): зацепишь более тяжёлую — шнур лопнет почти мгновенно. Чем лучше удочка и приманка, тем выше шанс зацепить крупную. Новый максимум по виду отмечен бейджем «🏆 РЕКОРД!» на карточке улова.
  6. На монеты — новые удилища и приманки в лавке 🛒 (кнопка 🛒 в HUD или клик по счётчику монет).
  7. Награды 🎯: три квеста дня (уловы, монеты, забросы) с наградой за выполнение; стрик входов — ежедневная награда растёт до дня 7, «щит» прощает один пропуск в неделю; 34 достижения 🏅 с постоянными бонусами (+% к монетам, окно подсечки, нагрузка шнура).
  8. День/ночь: полный цикл суток ~5 минут (утро → день → вечер → ночь). Ночью свой состав рыб — сом, щука и окунь активнее, но без 🪯 фонарика клёва не будет — фонарик дают апгрейды удилищ (1-й апгрейд любого удилища).
  9. Босс в каждой локации: в каждой воде живёт свой босс — Река: осётр, Озёра: гигантский рак, Море: рыба-меч, Океан: синий кит (шанс при поимке соответствующей рыбы). Босс весит 20–50 кг. Бой идёт в 3 фазы — босс «рвёт и уходит», и каждая следующая фаза глубже; удерживай, чтобы втащить. Награда ×5 к цене.
  10. Симулятор боёв (релиз 5): у рыбы есть выносливость — тонкая фиолетовая полоска под дистанцией: свежая рыба тянет долго и сильно, а уставшая (💤) вянет — втягивай её именно тогда. У катушек — тормоз (drag): рывок сильнее тормоза — леска скользит. Иногда поплавок не берёт вовсе — пустой клёв, подожди ещё немного.

Возможности

  • 32 вида рыб с собственным весом (0.05–50 кг) и ценой за кг (5 уровней редкости), у каждой локации — только свои рыбы: Река — 8 базовых, Озёра — 10 озёрных (судак, хариус, сиг, линь, навага, гигантский рак и другие), Море — 5 морских (скумбрия, камбала, тунец, рыба-меч и другие), Океан — 9 глубоководных (синий кит, гигантский кальмар, скат-манта, гигантский осьминог и другие)
  • Удилища: предел веса, прочность шнура, скорость подсечки, бонус на крупную рыбу
  • Приманки: частота клёва, дальность броска, шанс редких и крупных
  • Физика боя: выносливость рыбы (уставшая 💤 вянет и втягивается быстрее), тормоз катушки (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 🪙 — чистая косметика (без эффектов на геймплей)
  • Локации: Озёра (65 536 🪙) — судак, хариус, гигантский рак; Море (131 072 🪙) — скумбрия, тунец, рыба-меч; Океан (196 608 🪙 = ×1.5 Моря) — глубоководные гиганты: синий кит, гигантский кальмар, скат-манта, гигантский осьминог; у каждой — свой состав днём/ночью, свой цвет воды, чем дальше вода — тем доходнее улов; покупка и переключение во вкладке 🗺️ лавки — озёра
  • Квесты дня (3 шт, генерация по дню), стрик входов со «щитом», 34 достижения с бонусами
  • Дневник рыбака — коллекция, максимальный улов по каждому виду, статистика
  • Магазин с вкладками: Лавка 🛒, Дневник 📔, Награды 🎯, Достижения 🏅, Скины 🎨, Локации 🗺️
  • Прогресс и коллекция сохраняются в 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         # 193 проверки

Нужен установленный 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%