andrey 3905693487 Э64-fix: подтверждение выпуска в диалоге «Слоты» — под строкой жильца, а не внизу панели. #aqShopConfirm лежал после #aqShopBody — при 12 слотах блок оказывался вдали от нажатой кнопки «Выпустить». renderAqShop() теперь ПЕРЕНОСИТ узел (не пересоздаёт — слушатели кнопок живут): перед innerHTML-пересборкой вынимается из #aqShopBody, при pending вставляется сразу после подсвеченной строки .replace — ДО заполнения текстов (иначе после вынимания $('aqShopConfirmText') вернул бы null), при снятии pending возвращается на место после списка; в обработчике askrelease — scrollIntoView({block:'nearest'}) (блок может выглядывать за край панели). Перетыкание «Выпустить» на другой строке без «Отмены» — рабочий кейс (при приёмке всплыл крах первой версии правки — суита его не ловила, пин добавлен). Тесты: §AQ(8) +1 проверка (узел жив, previousElementSibling — .replace-строка, текст новой рыбы) — 262/262 PASS exit 0; check.mjs OK; визуально 390×844 (row0/смена на row2/отмена/нижняя строка со скроллом). Геймплей/сейв/i18n/emoji не тронуты. Доки: AGENTS.md (пункт «Диалог улучшений аквариума», Э64).
2026-11-06 17:08:09 +03:00
Этап 56: Которыбка — болотный босс переименован и перерисован из целаканта (идея «кошачьей рыбы» — милая вымышленная рыба-кот, не окаменелость). (1) Ренейм coelacanth→meowfish «Которыбка»/Meowfish: SPECIES[37] (hue 28, glow #ff9ecb — розовая аура вместо сине-стальной), NIGHT_WEIGHTS, SWAMP_IDS, SWAMP_DAY/NIGHT_WEIGHTS, BOSS_BY_LOCATION[4], ачивка swamp_boss («Победа над Которыбкой»/Meowfish Tamer, check=bosses.meowfish; id/без coinPct — пин 0.18 жив). Числа (цена 50🪙/кг, 20–80 кг, ролл 4, статы) не менялись — баланс Этапа 55 сохранён 1:1 (Болото 302.9/342.3). Сейв: bosses — динамический словарь, миграция не нужна (целакант не выходил в релизе), выданная ach не отзывается. (2) Портрет: новый fish-meowfish.svg — пухлое рыжее тельце с кремовым брюшком и полосками «табби», ушки с розовым внутренним, большой зелёный глаз, носик-треугольничек, ротик-«бантик», усики, щёчка, лапки, пушистый полосатый хвост-плавник; fish-coelacanth.svg удалён; embed-fish IDS обновлён, спрайт перегенерирован (38 symbol). (3) Тесты 234/234 (счётчик тот же): §9k2 Болото → Которыбка (карточка «Которыбка-БОСС», bosses.meowfish), lc1 (mwf='Которыбка,4,50,20,80', swampOrder …,meowfish), lc2/lc10, тексты. (4) Проверки: check.mjs OK; test.js 234/234 exit 0; balance.mjs — 302.9/342.3 без изменений, целостность зелёная; emoji --check OK; minify 6/6 (583→386 КБ); pack 5/5; pack-smoke 6/6. (5) Доки: AGENTS.md/README — Которыбка/meowfish, DEVLOG (Этап 56).
2026-10-30 20:32:25 +03:00
Этап 64: выпуск рыбы из аквариума — только из диалога «Слоты» и с подтверждением; перерисовка наживок (червь на конце крючка, воблер-минноу, блёстка-вращалка). Выпуск: кнопка #btnAqRelease из поповера #aqPop убрана (поповер — чистое инфо), на строке жильца во вкладке «Слоты» #aqShop — кнопка «Выпустить» (data-act=askrelease, делегирование #aqShopBody), inline-подтверждение #aqShopConfirm (паттерн #aqPickConfirm, строка подсвечивается .replace, текст aq_release_q RU/EN), подтверждение — aqReleaseAt(i) (переименовано из aqReleaseSel: индекс вместо aqSel; aqSel при выпуске левее сдвигается, по индексу — снимается), по-прежнему без монет и без телепорта остальных; aqShopRelPending сбрасывается в openAqShop/closeAqShop/setAqTab и при сбросе прогресса. Наживки (чистый визуал, данные в записях LURES.hook, switch по id нет): Воблер — body (тельце-минноу: эллипс+хвост+брюшко+лопатка, bead — красный глаз, крючок выглядит тройником под вобом), Блёстка — blade (золотой лепесток с шириной |sin(t·4.5)|, кромка+блик, рисуется внутри gold-тени до restore), Червь — bait вдоль жала с торчащим кончиком и головным утолщением (lineWidth 1.6→2.2). Геометрия hx/hy/hookPos не тронута; баланс/сейв/ачивки/i18n/emoji не тронуты, миграция не нужна. Тесты: §10e2 — пин body/blade (#hex, у остальных нет); §AQ(8) переписан на новый флоу (поповер без кнопок → askrelease → подтверждение → «Отмена»/«Выпустить»), (8b) — aqReleaseAt(0). Проверки: check.mjs OK; emoji --check OK; test.js 261/261 PASS exit 0. Доки: AGENTS.md (тест-глобалы, пункты Э46/Э52/Э62/Э63), DEVLOG (Этап 64).
2026-11-06 15:54:55 +03:00
Этап 48: размер рыбы в аквариуме — от абсолютного веса (общая шкала вываживания) + десктоп ×2. (1) aqFishSize(sp,w) → aqFishSize(w): вместо w/wMax+rarity читает общую с drawHookedFish кривую Этапа 41 — fishSizeFromW(w) (узловая таблица FISH_SIZE_KNOTS, log2 веса) — так «крупнее вес → крупнее рыба» работает в банке как в воде. Формула: clamp(fishSizeFromW(w)·AQ_FISH_SCALE·k, AQ_FISH_SIZE_MIN·k, min(W,H)·AQ_FISH_SIZE_REL·k); константы AQ_FISH_SCALE=0.7, AQ_FISH_SIZE_MIN=7, AQ_FISH_SIZE_REL=0.16. (2) Ревизия по просьбе владельца: мобильный вид одобрен как есть, поэтому десктопный множитель k=AQ_DESKTOP_SCALE=2 включается только при min(W,H)>=AQ_DESKTOP_MIN=600 (иначе k=1) — телефон 390×844 и mobile-landscape 800×450 остаются 1×, десктоп 1280×720 получает жильцов вдвое крупнее (щука 7.4 кг: 40→79 px DOM, кит 100 кг: 125→293 px). Оба клампа (MIN и REL) масштабируются на k вместе с телом — иначе на десктопе мелкая рыба застревала бы на мобильном минимуме, а верхний кламп резал бы увеличенных гигантов. Порог по min(W,H), а не IS_TOUCH: не ломает headless-скриншоты и работает при resize (initAquarium). (3) Обновлены 3 вызова — aqBuildFishEl/drawAquarium/aqTap (sp больше не нужен как аргумент; в drawAquarium sp остался для sp.glow); радиус тапа (size*1.2+10), рамка выбора и ореол свечения читают ту же size — согласованы автоматически. Таблицу/кривую НЕ дублируем (fishSizeFromW объявлен в «ОТРИСОВКА» раньше секции аквариума). Имя aqFishSize сохранено (глобал тестов/AGENTS). (4) Не тронуто: FISH_SIZE_KNOTS/fishSizeFromW/drawHookedFish (вода), wMin/wMax, формат/миграция save.aqFish, баланс/роллы/физика. (5) Тесты не правились — §AQ размеры не пинит (проверяются .aqfish/use href/варианты/transform; aqTap жмёт центр): 222/222 PASS, exit 0. check.mjs OK; balance.mjs — пины без изменений (Река 65.1/125.9 · Озёра 194.1/249.0 · Болото 240.3/328.9 · Море 297.3/476.7 · Океан 329.1/552.7). (6) Скриншоты: перегенерированы только кадры aquarium (6 PNG, оба набора — паттерн ревизии Этапа 47); остальные 84 кадра возвращены (набор не побитово-детерминирован из-за анимаций). (7) Доки: AGENTS.md (пункт «Аквариум» — формула + константы + десктоп-множитель), README.md (размер по весу, на десктопе ×2), DEVLOG (Этап 48 с таблицей мобильный/десктоп).
2026-09-23 18:02:56 +03:00
Э64-fix: подтверждение выпуска в диалоге «Слоты» — под строкой жильца, а не внизу панели. #aqShopConfirm лежал после #aqShopBody — при 12 слотах блок оказывался вдали от нажатой кнопки «Выпустить». renderAqShop() теперь ПЕРЕНОСИТ узел (не пересоздаёт — слушатели кнопок живут): перед innerHTML-пересборкой вынимается из #aqShopBody, при pending вставляется сразу после подсвеченной строки .replace — ДО заполнения текстов (иначе после вынимания $('aqShopConfirmText') вернул бы null), при снятии pending возвращается на место после списка; в обработчике askrelease — scrollIntoView({block:'nearest'}) (блок может выглядывать за край панели). Перетыкание «Выпустить» на другой строке без «Отмены» — рабочий кейс (при приёмке всплыл крах первой версии правки — суита его не ловила, пин добавлен). Тесты: §AQ(8) +1 проверка (узел жив, previousElementSibling — .replace-строка, текст новой рыбы) — 262/262 PASS exit 0; check.mjs OK; визуально 390×844 (row0/смена на row2/отмена/нижняя строка со скроллом). Геймплей/сейв/i18n/emoji не тронуты. Доки: AGENTS.md (пункт «Диалог улучшений аквариума», Э64).
2026-11-06 17:08:09 +03:00
Этап 56: Которыбка — болотный босс переименован и перерисован из целаканта (идея «кошачьей рыбы» — милая вымышленная рыба-кот, не окаменелость). (1) Ренейм coelacanth→meowfish «Которыбка»/Meowfish: SPECIES[37] (hue 28, glow #ff9ecb — розовая аура вместо сине-стальной), NIGHT_WEIGHTS, SWAMP_IDS, SWAMP_DAY/NIGHT_WEIGHTS, BOSS_BY_LOCATION[4], ачивка swamp_boss («Победа над Которыбкой»/Meowfish Tamer, check=bosses.meowfish; id/без coinPct — пин 0.18 жив). Числа (цена 50🪙/кг, 20–80 кг, ролл 4, статы) не менялись — баланс Этапа 55 сохранён 1:1 (Болото 302.9/342.3). Сейв: bosses — динамический словарь, миграция не нужна (целакант не выходил в релизе), выданная ach не отзывается. (2) Портрет: новый fish-meowfish.svg — пухлое рыжее тельце с кремовым брюшком и полосками «табби», ушки с розовым внутренним, большой зелёный глаз, носик-треугольничек, ротик-«бантик», усики, щёчка, лапки, пушистый полосатый хвост-плавник; fish-coelacanth.svg удалён; embed-fish IDS обновлён, спрайт перегенерирован (38 symbol). (3) Тесты 234/234 (счётчик тот же): §9k2 Болото → Которыбка (карточка «Которыбка-БОСС», bosses.meowfish), lc1 (mwf='Которыбка,4,50,20,80', swampOrder …,meowfish), lc2/lc10, тексты. (4) Проверки: check.mjs OK; test.js 234/234 exit 0; balance.mjs — 302.9/342.3 без изменений, целостность зелёная; emoji --check OK; minify 6/6 (583→386 КБ); pack 5/5; pack-smoke 6/6. (5) Доки: AGENTS.md/README — Которыбка/meowfish, DEVLOG (Этап 56).
2026-10-30 20:32:25 +03:00
Э64-fix: подтверждение выпуска в диалоге «Слоты» — под строкой жильца, а не внизу панели. #aqShopConfirm лежал после #aqShopBody — при 12 слотах блок оказывался вдали от нажатой кнопки «Выпустить». renderAqShop() теперь ПЕРЕНОСИТ узел (не пересоздаёт — слушатели кнопок живут): перед innerHTML-пересборкой вынимается из #aqShopBody, при pending вставляется сразу после подсвеченной строки .replace — ДО заполнения текстов (иначе после вынимания $('aqShopConfirmText') вернул бы null), при снятии pending возвращается на место после списка; в обработчике askrelease — scrollIntoView({block:'nearest'}) (блок может выглядывать за край панели). Перетыкание «Выпустить» на другой строке без «Отмены» — рабочий кейс (при приёмке всплыл крах первой версии правки — суита его не ловила, пин добавлен). Тесты: §AQ(8) +1 проверка (узел жив, previousElementSibling — .replace-строка, текст новой рыбы) — 262/262 PASS exit 0; check.mjs OK; визуально 390×844 (row0/смена на row2/отмена/нижняя строка со скроллом). Геймплей/сейв/i18n/emoji не тронуты. Доки: AGENTS.md (пункт «Диалог улучшений аквариума», Э64).
2026-11-06 17:08:09 +03:00
Э64-fix: подтверждение выпуска в диалоге «Слоты» — под строкой жильца, а не внизу панели. #aqShopConfirm лежал после #aqShopBody — при 12 слотах блок оказывался вдали от нажатой кнопки «Выпустить». renderAqShop() теперь ПЕРЕНОСИТ узел (не пересоздаёт — слушатели кнопок живут): перед innerHTML-пересборкой вынимается из #aqShopBody, при pending вставляется сразу после подсвеченной строки .replace — ДО заполнения текстов (иначе после вынимания $('aqShopConfirmText') вернул бы null), при снятии pending возвращается на место после списка; в обработчике askrelease — scrollIntoView({block:'nearest'}) (блок может выглядывать за край панели). Перетыкание «Выпустить» на другой строке без «Отмены» — рабочий кейс (при приёмке всплыл крах первой версии правки — суита его не ловила, пин добавлен). Тесты: §AQ(8) +1 проверка (узел жив, previousElementSibling — .replace-строка, текст новой рыбы) — 262/262 PASS exit 0; check.mjs OK; визуально 390×844 (row0/смена на row2/отмена/нижняя строка со скроллом). Геймплей/сейв/i18n/emoji не тронуты. Доки: AGENTS.md (пункт «Диалог улучшений аквариума», Э64).
2026-11-06 17:08:09 +03:00
2026-09-09 17:48:00 +03:00
Этап 56: Которыбка — болотный босс переименован и перерисован из целаканта (идея «кошачьей рыбы» — милая вымышленная рыба-кот, не окаменелость). (1) Ренейм coelacanth→meowfish «Которыбка»/Meowfish: SPECIES[37] (hue 28, glow #ff9ecb — розовая аура вместо сине-стальной), NIGHT_WEIGHTS, SWAMP_IDS, SWAMP_DAY/NIGHT_WEIGHTS, BOSS_BY_LOCATION[4], ачивка swamp_boss («Победа над Которыбкой»/Meowfish Tamer, check=bosses.meowfish; id/без coinPct — пин 0.18 жив). Числа (цена 50🪙/кг, 20–80 кг, ролл 4, статы) не менялись — баланс Этапа 55 сохранён 1:1 (Болото 302.9/342.3). Сейв: bosses — динамический словарь, миграция не нужна (целакант не выходил в релизе), выданная ach не отзывается. (2) Портрет: новый fish-meowfish.svg — пухлое рыжее тельце с кремовым брюшком и полосками «табби», ушки с розовым внутренним, большой зелёный глаз, носик-треугольничек, ротик-«бантик», усики, щёчка, лапки, пушистый полосатый хвост-плавник; fish-coelacanth.svg удалён; embed-fish IDS обновлён, спрайт перегенерирован (38 symbol). (3) Тесты 234/234 (счётчик тот же): §9k2 Болото → Которыбка (карточка «Которыбка-БОСС», bosses.meowfish), lc1 (mwf='Которыбка,4,50,20,80', swampOrder …,meowfish), lc2/lc10, тексты. (4) Проверки: check.mjs OK; test.js 234/234 exit 0; balance.mjs — 302.9/342.3 без изменений, целостность зелёная; emoji --check OK; minify 6/6 (583→386 КБ); pack 5/5; pack-smoke 6/6. (5) Доки: AGENTS.md/README — Которыбка/meowfish, DEVLOG (Этап 56).
2026-10-30 20:32:25 +03:00

🎣 Рыбалка

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

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

Как играть

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

  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): рывок сильнее тормоза — леска скользит. Иногда поплавок не берёт вовсе — пустой клёв, подожди ещё немного.

Возможности

  • 38 видов рыб с собственным весом (0.05–100 кг) и ценой за кг (5 уровней редкости), у каждой локации — только свои рыбы: Река — 8 базовых, Озёра — 10 озёрных (судак, хариус, сиг, линь, навага, гигантский рак и другие), Море — 5 морских (скумбрия, камбала, тунец, рыба-меч и другие), Океан — 9 глубоководных (синий кит, гигантский кальмар, скат-манта, гигантский осьминог и другие), Волшебное болото — 6 светящихся (светлячок, лунная рыбка, изумрудный светляк, фиалковый огонёк, дух болота, которыбка — вымышленная милая рыба-кот, самый крупный и дорогой болотный трофей, босс локации) — ночью светятся разными цветами
  • Удилища: предел веса, прочность шнура, скорость подсечки, бонус на крупную рыбу
  • Приманки: частота клёва, дальность броска, шанс редких и крупных
  • Физика боя: выносливость рыбы (уставшая 💤 вянет и втягивается быстрее), тормоз катушки (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 — внешних ресурсов нет

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

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

Запуск

Просто открой 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 проверок)

Релизная (уменьшенная) сборка

Игра — один файл (~582 КБ), из них ~202 КБ — встроенные 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%: 582→386 КБ, gzip 210→153 КБ) и гоняет самопроверку (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:

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.

Скриншоты состояний — 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-* (мобильный портрет).

S
Description
Браузерная мобильная игра про рыбалку: один HTML-файл, без зависимостей
Readme
242 MiB
0 Stars 1 Watchers 0 Forks
1.1.1
Latest
2026-11-06 16:14:11 +03:00
Languages
HTML 63.8%
JavaScript 35.5%
Python 0.7%