13 KiB
План: ребаланс прогрессии и экономики (Этап 53, в работе)
Статус: реализован (Этап 53) — см. запись «Этап 53» в docs/DEVLOG.md.
Финальные цены: Стекло/Червь 150/100, Карбон/Воблер 500/2000, Титан/Блёстка 30000/22000;
апгрейды 20/50/100 и 15/40/80, UPG_MULT 0.15/0.35/0.6; Озёра 500, Болото 10000,
Море 100000, Океан 300000. Веса Болота — день 4/32/3/6/7, ночь 4/28/3/10/3
(per-catch 133.9/162.5). Квесты масштабируются по save.earned. Тело плана ниже —
историческая фиксация решения. Ссылки на строки — на момент составления плана.
Ориентир по коду: index.html ~5608 строк.
1. Задача
Ранняя игра должна быстро давать апгрейды (2-я удочка/приманка и первая новая локация), дальше прогресс должен плавно замедляться без «застревания», а поздние цели — занимать несколько игровых сессий (ориентир: 15 минут в день × 2–3 дня на удочку «Титан»).
Дополнительно: ежедневные задания должны масштабироваться по прогрессу игрока, чтобы оставаться осмысленными и не доминировать на поздних этапах.
2. Зафиксированные решения (ответы владельца)
| Развилка | Решение |
|---|---|
| Темп раннего этапа | 2-я удочка + 2-я приманка + Озёра ≈ 4–6 минут (гарантированно < 5 мин по опыту) |
| Что меняем | Только цены снастей/локаций + веса рыб Болота + логика квестов. Доходность остальных вод не трогаем |
| Гейт лавки | Оставляем «предыдущая снасть на 4 ур.», но сильно удешевляем апгрейды |
| Локации | Озёра 500 · Болото 5 000 · Море 100 000 · Океан 200 000 |
| Болото | Перебалансировать веса рыб, чтобы доходность стала примерно как у Озёр (~194/249 🪙) |
| Титан | ~1 час игры, апгрейды Титана — опциональны и в расчёт до Моря не входят |
| Море / Океан | ~2 часа / ~4 часа игры (задаётся ценой; проверить progression.mjs) |
| Ежедневные задания | Масштабировать все шаблоны; метрика прогресса — save.earned |
| Стартовый капитал | Не выдаём |
3. Целевая кривая прогрессии
Времена — накопительные от старта сессии, фаза — самая выгодная доступная вода.
| # | Цель | Когда | Цена | Текущая цена |
|---|---|---|---|---|
| 1 | Дедова удочка 1→4 ур. | ~1 мин | апгрейды 20/50/100 | 70/210/500 |
| 2 | Стеклопластик + Червь | ~2–3 мин | 150 + 100 | 875 + 625 |
| 3 | Озёра | < 5 мин | 500 | 65 536 |
| 4 | Карбон + Воблер | 5–10 мин | 500 + 300 | 4 500 + 3 000 |
| 5 | Болото | +15 мин после Карбона и 2-й приманки | 5 000 | 90 000 |
| 6 | Блёстка | ~40–50 мин | 22 000 | 11 250 |
| 7 | Титан (без апгрейдов) | ~1 час | 30 000 | 15 000 |
| 8 | Апгрейды Титана/Блёстки (опция) | 1–2 ч | из UPG_MULT |
— |
| 9 | Море | ~2 часа | 100 000 | 131 072 |
| 10 | Океан | ~4 часа | 200 000 | 196 608 |
Порядок вод по цене сохраняется: Озёра (500) < Болото (5 000) < Море (100 000) < Океан (200 000).
4. Цены (первый проход)
| Константа | Где | Сейчас | Стало |
|---|---|---|---|
RODS cost |
index.html:2226-2230 |
0 / 875 / 4500 / 15000 | 0 / 150 / 500 / 30000 |
LURES cost |
:2232-2237 |
0 / 625 / 3000 / 11250 | 0 / 100 / 300 / 22000 |
ROD_UPG_COST |
:2240 |
70 / 210 / 500 | 20 / 50 / 100 |
LURE_UPG_COST |
:2241 |
60 / 160 / 400 | 15 / 40 / 80 |
UPG_MULT |
:2242 |
0.2 / 0.6 / 1.2 | 0.15 / 0.35 / 0.6 |
Озёра cost |
:2088 |
65536 | 500 |
Болото cost |
:2097 |
90000 | 5000 |
Море cost |
:2091 |
131072 | 100000 |
Океан cost |
:2094 |
196608 | 200000 |
Апгрейды id>0 считаются upgCost() (:2250) от новой базы — формула не меняется.
Калибровка progression.mjs (what-if с ценами выше и весами Болота из раздела 5):
| Цель | Модель | Целевое | Комментарий |
|---|---|---|---|
| Стеклопластик | 4.5 мин | < 5 мин | ок |
| Озёра | 8.1 мин (3.6 после Стекло) | < 5 мин после Стекло | ок |
| Карбон | 7.1 мин | 5–10 мин | ок |
| Болото (цена 5000) | 14.2 мин | +15 мин после Карбона/Воблера | от Карбона 6.7 мин — мало; под 15 мин цена ≈ 12 000 |
| Титан | 32.5 мин (44 мин при Болоте 12000) | 2–3 дня × 15 мин = 30–45 мин | ок для чистой игры |
| Море | 1 ч 37 мин (при Болоте 12000 ≈ 1 ч 46) | ~2 ч | близко |
| Океан | 2 ч 48 мин (при Болоте 12000 ≈ 2 ч 57) | ~4 ч | мало; при необходимости поднять цену |
Модель — «идеальный» игрок и оптимистична (реальная игра медленнее на промахи/меню), поэтому реальные времена будут выше модельных — цели по реальной игре могут сойтись. Итог по цене Болота: 5000 даёт ~7 мин, для целевых 15 мин нужно ~12 000 (уточнить у владельца).
5. Веса рыб Болота (снизить доход до уровня Озёр)
Цель: SWAMP_*_WEIGHTS дают день ≈194 / ночь ≈249 🪙 (как Озёра). Текущие 240.3/328.9.
Двигаем доли (умножение всех весов доход не меняет). Подобраны точные векторы:
| Таблица | glowfin | moonfish | emberfin | violetlure | spiritfin | E, 🪙 |
|---|---|---|---|---|---|---|
SWAMP_DAY_WEIGHTS |
8 | 5 | 28 | 8 | 8 | 194.1 |
SWAMP_NIGHT_WEIGHTS |
4 | 8 | 12 | 14 | 3 | 249.0 |
Все веса ≥3 (тест «каждый вид ≥1» за 3000 роллов с запасом). Ночь богаче долей
violetlure (14 против 8), день — долей emberfin. Финал сверить
node tools/balance.mjs после правки.
Важно (расхождение метрик): per-catch E совпадает с Озёрами, но 🪙/мин у Болота всё
равно выше (~1800 против ~1400, tools/progression.mjs): болотная рыба легче и бой
короче, цикл быстрее. Если владелец имел в виду паритет именно по 🪙/мин, веса Болота
нужно опустить сильнее (≈−25%) — уточнить.
Внимание: это ломает инвариант balance.mjs «каждая новая (по цене) вода доходнее
предыдущей в ОБЕ фазы» (Болото/Озёра станет ≈1.0). Инвариант и пины в шапке balance.mjs
обновить осознанно.
6. Ежедневные задания с масштабированием
- Метрика
P = save.earned(только доход с рыбалки; награды квестов его не разгоняют). questScale() = clamp(round((P/2000)^0.6), 1, 30).QUEST_TPLS(:2488) — масштабируем все:earn_coins:goal = base(150/250/400)·scale,reward = round(goal·0.25);casts:goal = base(8/10/15)·(1+scale·0.15);catch_species: вид — из текущей воды (SPECIES_BY_LOCATION[save.location]), цель 3–5;catch_weight:param— от медианного веса рыб воды (localMedianW()), не 2/3/5 кг;catch_rarity:param = clamp(1+floor(log10(scale+1)), 1, 4);catch_shiny: цель 1, растёт награда.
- Итог: 3 квеста/день ≈ 5–10 минут текущего дохода на любом этапе.
7. Инструмент tools/progression.mjs (новый)
По образцу tools/balance.mjs — чистое чтение index.html:
- вырезает данные (
SPECIES, таблицы локаций,VARIANTS,RODS,LURES,ROD/LURE_UPG_COST,UPG_MULT,LOCATIONS); - моделирует улов:
pickSpecies+rollWeight(статsize) + ожидаемый множитель вариантов (бустrare) + обрыв, еслиw > rod.maxW; - время цикла:
biteChance(:2974), таймер клёва (:3178),fishForce/updateReel(:3021/:3043) — бот «держать в затишье, отпускать в рывке»; - жадный путь покупок по маршруту (по умолчанию — цели раздела 3) → печатает
доход по этапам (
🪙/мин) и ETA каждой цели; - флаги
--rod/--lure/--loc/--rod-upg/--lure-upg/--upg-mult(what-if),--start-coins,--per-day <мин>,--route,--help.
8. Карта изменений по коду (index.html)
| Что | Где | Правка |
|---|---|---|
| Цены снастей/апгрейдов | :2226-2242 |
новые числа (раздел 4) |
| Цены локаций | :2084-2100 |
новые числа (раздел 4) |
| Веса Болота | :2148-2149 |
новые SWAMP_DAY/NIGHT_WEIGHTS (раздел 5) |
| Квесты | :2488-2501 |
questScale(), масштаб goal/reward, localMedianW() |
| i18n подписи | T |
при необходимости — подписи новых шаблонов |
Не трогаем: catchFish()/экономику улова, доходность Реки/Озёр/Моря/Океана,
физику боя, формат сейва (новых персистентных полей нет).
9. Тесты (tests/test.js) — в том же коммите
- M5:
:1271-1272('875 🪙'/'625 🪙'),:1379-1380(покупка Стеклопластика и остаток),:1383-1387(апгрейд),:1390-1397(строкаupgCost). - lc1:
:2035(costs→0,500,100000,200000,5000). - lc8:
:2240-2338(остатки монет при покупках). - Новые:
questScale/масштабQUEST_TPLS,localMedianW. balance.mjs: обновить пины Болота (и, при решении, инвариант).
10. Проверка (порядок команд)
node tools/check.mjsnode tools/balance.mjs— Болото в цели, остальные пины не сдвинутыnode tools/progression.mjs— ETA целей совпадают с разделом 3cd tests && npm test— все PASS, exit 0- Плейтест первых 5 минут + симуляция «15 мин/день × 2–3 дня»
- При релизе:
node tools/minify.mjs
11. Риски и открытые вопросы
- Болото ≈ Озёра ломает инвариант «дороже вода = доходнее» — принято осознанно.
- Море/Океан дают меньше 🪙/мин, чем Озёра/Болото (длиннее бой, ниже доля удержания) — это существующая особенность баланса рыб; задаём только цену. Отдельная задача, если владелец захочет поднять их доход.
- Разброс RNG (варианты/золотая рыбка) — «< 5 мин» гарантируется с запасом квестами первого дня; строгого детерминизма не будет.
- Точные цены Моря/Океана (100000/200000) — по решению владельца;
progression.mjsпокажет итоговые ETA, при расхождении — скорректировать.