andrey pushed to main at andrey/fishing-game 2026-09-15 20:27:32 +03:00
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).
andrey pushed to main at andrey/fishing-game 2026-09-09 18:30:31 +03:00
a1afe224e6 fix: корректная генерация английских скриншотов
e2bb005304 gen-screenshots.js: 10 кадров × 3 вьюпорта, без debug файлов, regenerated screenshots
cca113377e gen-screenshots.js: 10 кадров (меню, лавка, достижения, дневник, ожидание, дождь, ночь, Озёра, вываживание, карточка) × 3 вьюпорта
Compare 3 commits »
andrey pushed to main at andrey/fishing-game 2026-09-09 17:48:02 +03:00
9519559387 revert logo
andrey pushed to main at andrey/fishing-game 2026-09-09 17:46:57 +03:00
ba61a77eaa Удалить пустую папку screenshots (мусор)
andrey pushed to main at andrey/fishing-game 2026-09-09 17:46:36 +03:00
3ba450d1ab README: вернуть скриншоты в верхнюю таблицу к markdown-формату
andrey pushed to main at andrey/fishing-game 2026-09-09 17:45:33 +03:00
f4b22f4a98 README: уменьшить скриншоты в секции Возможности (width=200)
andrey pushed to main at andrey/fishing-game 2026-09-09 17:43:52 +03:00
f79a7786af gen-screenshots.js: 15 кадров × 3 вьюпорта, поддержка en, обновлены доки и README
andrey pushed tag 1.0.1 to andrey/fishing-game 2026-09-09 16:47:12 +03:00
andrey pushed to main at andrey/fishing-game 2026-09-09 15:47:40 +03:00
4ee0d4fce3 Монеты → лавка и хаб «Меню» (Этап 29): клик по #coins в HUD открывает «Лавку рыбака» на вкладке «Лавка» (#tabTackle: «Снасти»→«Лавка», 🎣→🛒; секции «🎣 Удилища»/«🪱 Приманки» внутри не тронуты); openShop(tab?) — аргумент форсит вкладку (syncTabs() вынесен из setTab), HUD 🛒 зовёт без аргумента — помнит последнюю. Новый диалог «Меню» (#gamemenu, из паузы «В меню»): «Продолжить» (uiOpen=false + gameplayStart), Магазин/Достижения/Дневник (fromMenuShop(tab) → openShop), «Инструкции» (#menu, «Играть» вернёт в игру), 🔊 Звук и 🗑️ Очистить — ПЕРЕНЕСЕНЫ из HUD (id btnMute/btnReset сохранены; в .hudbtns остались 🛒 и ⏸). «В меню» больше не ставит state='MENU': сессия (заброс/вываживание) заморожена под оверлеем и продолжается с того же места; state='MENU' — только загрузка/сброс (там #menu с инструкциями — старт новой игры прежний). shopFromMenu: лавка, открытая из «Меню», при × возвращает в хаб (uiOpen=true, без gameplayStart); из HUD/монет — в игру. Z-порядок: #gamemenu в DOM позже #shop/#resetDlg — при открытии лавки/сброса из хаба гменю прячется, иначе перекрыл бы их. YG-счётчики сбалансированы: вход в хаб из паузы (gameplayStop уже сделал onPause), «Продолжить» → gameplayStart (пин §Y8(4): stop +1, start +0). i18n: gm_* ключи RU/EN, tab_tackle 'Лавка'/'Shop', updateHUD печатает 🔊/🔇 + «Звук», setLang дёргает updateHUD. Все emoji набора уже были в субсете встроенного шрифта — перегенерация tools/emoji-font.py не потребовалась. Тесты: §9/Y1/Y2/Y6 флоу btnReset/btnMute — через toGameMenu() (⏸ → «В меню»); §Y6(5) переписан (хаб открыт, state сохранён), (6) заходит к btnPlay через «Инструкции»; новая §Y8 (HUD-состав, монеты→«Лавка», вкладки из хаба, ×→хаб, mute-тогл по семантике — фикстура сейва §«локации» ставит muted:true, «Продолжить», инструкции). 177/177, exit 0. shots.js: кадр gamemenu (15/15), screenshots/ обновлены, визуально проверены (лавка/хаб/сброс/инструкции). orca-playtest.js: сброс 2b — настоящий UI-путь хаба (не синтетический клик по скрытой кнопке); новая секция 9e — переходы по хабу (монеты, Магазин/Достижения/Дневник + × назад, Инструкции, 🔊-тогл через объект — скаляры CLI приходят JSON-строками, «Продолжить»); закрыты давние флейки живого браузера: сейв профиля с ночью прошлого прогона (шаг 2c — форс дня: ночью без фонарика ветка клёва за гейтом hasLight, forceBite не работает), босс 5–40 кг рвал стартовую удочку натяжением до босс-фаз (выдаём «Титан», save.rod=3 — по UI нельзя, M5-гейтинг) и транзитное SNAP-окно 0.6 с vs CLI-roundtrip (ждём персистентный bossPhase, отпускание в том же eval). 76/76. check.mjs OK, pack 5/5, pack-smoke 6/6. Доки: AGENTS.md (177 чеков, «Меню», монеты→лавка, пауза), README (вкладка «Лавка», хаб), DEVLOG Этап 29, BROWSER-TESTING (п. 11–13, таблица шагов 2b/9e/12).
andrey pushed to main at andrey/fishing-game 2026-09-09 14:18:59 +03:00
4c257e19ec Встроенный 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.
53e7fab01e Тост: перенос длинного текста — white-space:normal + max-width min(88vw,560px), текст по центру; убраны overflow:hidden/text-overflow:ellipsis (резали длинный текст) и дублирующий max-width:92vw; радиус 999px→14px (многострочный тост не превращается в эллипс). Проверено по скриншотам трёх длин (DOM + пиксели PNG). 162/162, exit 0
Compare 2 commits »