Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
1ebaf6e2ae
Этап 53: ребаланс прогрессии и экономики + масштабируемые квесты. (1) Цены снастей: RODS 0/875/4500/15000 → 0/150/500/30000; LURES 0/625/3000/11250 → 0/100/2000/22000 (Воблер 300→2000 по правке владельца). Апгрейды id 0: ROD_UPG_COST 70/210/500 → 20/50/100, LURE_UPG_COST 60/160/400 → 15/40/80; UPG_MULT 0.2/0.6/1.2 → 0.15/0.35/0.6. Гейт «предыдущая снасть на 4 ур.» оставлен, но апгрейды сильно удешевлены. (2) Цены локаций: Озёра 65536→500, Болото 90000→10000, Море 131072→100000, Океан 196608→300000; порядок по цене Река<Озёра<Болото<Море<Океан сохранён. (3) Веса Болота снижены до уровня Озёр и ниже (цель «тащить легче, доход меньше»): SWAMP_DAY_WEIGHTS={glowfin:4,moonfish:32,emberfin:3,violetlure:6,spiritfin:7}, SWAMP_NIGHT_WEIGHTS={glowfin:4,moonfish:28,emberfin:3,violetlure:10,spiritfin:3}; per-catch E 240.3/328.9 → 133.9/162.5 (доля дешёвой лёгкой moonfish поднята, дорогая violetlure/emberfin срезана); по 🪙/мин Болото ≈ Озёра. Инвариант balance.mjs «дороже вода доходнее» для Болота сознательно не выполняется. (4) Квесты дня масштабируются по save.earned: questScale()=clamp(round((earned/2000)^0.6),1,30); QUEST_TPLS масштабирует ВСЕ шаблоны (earn_coins goal×scale, casts ×(1+0.15·scale), catch_weight порог от localMedianW() — медиана середин весов рыб ТЕКУЩЕЙ локации ×scale^0.35, catch_rarity r=clamp(1+floor(1.5·log10(scale+1)),1,4), catch_species вид из SPECIES_BY_LOCATION[save.location] с rarity≤2), qReward(base)=round(base·scale^0.6); questText RU/EN терпим к неречным id (fallback trName). (5) Новый tools/progression.mjs (read-only, данные из index.html): моделирует улов (pickSpecies+rollWeight+варианты+обрыв по maxW) и цикл ловли (biteChance/таймеры/fishForce+updateReel ботом), жадный маршрут покупок → 🪙/мин по водам и ETA целей; what-if --rod/--lure/--loc/--rod-upg/--lure-upg/--upg-mult/--set/--set-day/--set-night. Калибровочные цели: Стекло 4.4 мин · Озёра 10.3 (5.9 после Стекло) · Карбон 6.9 · Болото 22.9 (13.3 после Карбона) · Титан ~50 мин · Море 2 ч 17 · Океан 4 ч 04. (6) Тесты 233→234: обновлены пины M5 (150/100, апгрейды 20/50/100 и 15/40/80, upgCost-строки), lc1 (costs 0,500,100000,300000,10000), lc8 (покупки локаций), ранний магазин; новый §9e2 — questScale/localMedianW/рост целей. Прогон: 234/234 PASS, exit 0; check.mjs OK; balance.mjs — Болото 133.9/162.5, остальные пины (Река/Озёра/Море/Океан) не сдвинуты. (7) Доки: AGENTS.md (Баланс/Локации/Баланс Озёр/Баланс-скрипт + пункт «Прогрессия»/Награды + тест-глобалы), README (локации/цены/прогрессия), docs/PLAN-PROGRESSION.md (новый), DEVLOG (Этап 53).
ef5c66d682
Этап 52: диалог выбора слота аквариума с карточки улова. (1) Кнопка #btnKeep «🐠 В аквариум» больше НЕ кладёт рыбу сразу, а открывает новый DOM-оверлей #aqPick поверх #card (тот же .overlay/z-index 20, в DOM позже; uiOpen не ставит — мир под карточкой не морозится, сцену банки aqOpen не трогает). Список save.aqSlots строк .aqpickrow: занятые — SVG-портрет #fish-<id> + имя/вариант/вес (вариант через aqApplyVariant() на строку + CSS-фильтры #aqPickList .aqpickrow.var* .je svg), пустые — +/aq_empty_slot. Логика: клик по пустой строке — aqPickPlace(i) (поселить копию cardSpec сразу); по занятой — aqPickPending=i + inline-подтверждение #aqPickConfirm (текст aq_replace_q с именем, «Отмена»/«Заменить»), aqPickConfirmReplace() меняет экземпляр (вытесненная рыба выпускается БЕСПЛАТНО, как aqReleaseSel — экономика/модель C не тронуты); докупка #btnAqPickSlot → aqPickBuySlot() (та же лестница AQ_SLOT_COSTS, что у #btnAqSlot, disabled при максе/подтверждении). Финиш aqPickFinish() единообразен с прежним #btnKeep: persist→checkAchievements→тост aq_kept→cardSpec=null→закрытие #aqPick и #card→state='IDLE'→tryInterstitial(). closeAqPick() (Отмена/тап мимо подложки) возвращает к карточке без поселения. (2) syncKeepBtn() теперь держит #btnKeep всегда активной (подпись/title = aq_keep): убрана логика «Нет места»/disabled при заполненном аквариуме — из диалога можно заменить занятый слот или докупить новый. (3) Сопутствующее: setLang() пере-рендерит открытый диалог; сброс прогресса закрывает #aqPick и сбрасывает aqPickOpen/aqPickPending/cardSpec; backdropClose($('aqPick'),closeAqPick) — новый оверлей по правилу AGENTS.md. (4) i18n RU/EN: aq_pick_title, aq_empty_slot, aq_replace_q({n}), aq_replace, aq_replace_short; btn_cancel/aq_buy_slot/aq_max переиспользованы; aq_no_room оставлен в T, но не используется. Новых emoji нет (🐠/+ уже в субсете) — перегенерация шрифта не нужна. (5) Тесты 225→233: §AQ(4) переписан (#btnKeep → диалог открыт, рыба ещё не поселена, карточка видна; клик по пустому слоту → поселение/закрытие/aq_first); §AQ(5) — диалог из полного аквариума, inline-подтверждение, «Отмена» не меняет список, подтверждение заменяет экземпляр (длина aqFish не растёт); §AQ(5b) докупка слота из диалога + отмена с возвратом к карточке; §AQ(5c) портрет/вариант (.varsilver) в занятой строке. Прогон: 233/233 PASS, exit 0; node tools/check.mjs OK. (6) Доки: AGENTS.md (раздел «Аквариум (Этап 46)», новый пункт «Диалог слота аквариума (Этап 52)», «Закрытие по тапу мимо диалога», список тест-глобалов), README (счётчик 233 + состав аквариумных проверок), docs/DEVLOG.md (Этап 52).
6fb13d9886
Этап 51: время погоды и дня/ночи стоит под неигровыми экранами. (1) frame(): мировые строки setDayTime/updateWeather/updateWeatherHud обёрнуты в if(!uiOpen) — день/ночь и погода идут только в игре; time/updateDecor/updateAquarium НЕ морозятся (визуал и жизнь банки под оверлеем). Покрытие: #menu (MENU), #gamemenu, лавка (все вкладки), аквариум, #resetDlg, #pause; под YG.paused (реклама/скрытая вкладка) заморожено как раньше. Карточка улова #card uiOpen не ставит — остаётся частью цикла улова. (2) Тесты 222→225: §Y8(7b) лавка → dayTime и weatherT заморожены за 300 мс, после × снова идут; §Y8(7c) хаб «Меню» → заморожены; §10d перед M8-таймерами добавлен вход #btnPlay (после reload в §10c(6) игра в MENU — естественные таймеры теперь без игры не тикают). (3) Проверено: 225/225 PASS exit 0, node tools/check.mjs OK. (4) Доки: AGENTS.md (строки «Ночь (M3)»/«Погода (M8)»/«Пауза» — гейт if(!uiOpen)), README (счётчик тестов), DEVLOG (Этап 51). Офлайн-догон loadSave() (Date.now()-lastSaveMs) не тронут.