Доходность Озёр 100+ 🪙 (Этап 34): LAKE_*_WEIGHTS — сдвиг долей в пользу дорогой рыбы, день 84.7→110.4 (×1.70 реки), ночь 122.2→145.5 (×1.16 реки).
Пользователь предлагал «просто увеличить вес озёрных рыб», но pickSpecies() нормирует веса (шанс = w/total из тех же w), поэтому ожидаемая выручка за улов = Σ(w·V)/Σw (V — середина диапазона веса × цена) инвариантна к умножению всех весов на константу: масштабирование дало бы ровно те же 84.7. Заявленный эффект достигнут тем же инструментом — правкой двух озёрных таблиц, но сдвигом ДОЛЕЙ: вниз размыватели carass 60→55 (V≈9 🪙, был 21% всех роллов) и bleak 30→18 (V≈6), плюс bream 30→24, perch 40→36, chuch 22→18, roundel 18→12, carp 25→24; вверх дорогая рыба — sturge 3.5→5, gold 1.6→2.2, tench 10→14, catfish 8→10, navaga 2.5→3.4, zander 14→16, pike 12→14, crayfish 2→2.4.
Попутно исправлено расхождение, которое комментировалось как норма: ночью Озёра были УБЫТОЧНЕЕ ночи Реки (122.2 < 125.9) при «смещении к хищникам». Ночная таблица выправлена в том же направлении — perch 70→60, carass 25→22, bream/chuch 10→9, tench 8→11, zander 18→20, catfish 16→18, sturge 4.5→6, gold 1.6→2.2, crayfish 2.5→2.6, navaga 2→2.4. Река не тронута (RIVER_IDS, weight в SPECIES, NIGHT_WEIGHTS) — роллы реки прежние, pin lc3 цел.
Пол редких видов не тронут вниз: минимальный вес 2.2 (gold/navaga/crayfish) — за 3000 роллов ожидается ≥25 попаданий против ~20 у gold раньше, так что lc4 («каждый вид ≥1», где из-за отсутствия аргумента не действует штраф minDist) проходит с вероятностью провала ~e⁻²⁵ вместо прежнего меньшего запаса. Ниже ~2 в этих таблицах опускать нельзя — зафиксировано в AGENTS.md/KODA.md.
Тесты: конкретных значений озёрных весов пинов нет (lc2 — длина 16 и «вес — число», lc4 — факт выпадения), правка таблиц не потребовала правок тестов: 178/178 PASS, exit 0; check.mjs OK; pack.mjs + pack-smoke 6/6 (115.5 КБ). Скриншоты не перегенерированы осознанно: кадры рила и карточки форсируют sturge в gen-screenshots.js, остальные от весов не зависят.
Доки: DEVLOG — «Этап 34» (инвариантность к масштабу, полный список весов, ночное расхождение, пол 2.2), AGENTS.md и KODA.md — правило «дороже = сдвиг долей, а не масштаб» + текущие ориентиры Озёра 110.4/145.5 против Реки 65.1/125.9 и минимальный вес ~2.2; README — Озёра «улов в ~1.2–1.7 раза доходнее Реки».
This commit is contained in:
@@ -40,6 +40,7 @@
|
||||
- Погода (M8): таблица `WEATHER` (rain — `variantMult` ×3; fog — `biteMult` ×1,5), таймеры в реальном времени — `updateWeather()` в `frame()` (gap `WEATHER_GAP_MIN..MAX` 120–240 с, длительность `WEATHER_DURATION` 120 с, под форсом не гоняются), `weatherActive()` — единственная точка чтения (форс приоритетнее), эффекты только в `variantChance()` (rain) и `biteChance()` (fog), тест-форс `forceWeather` ('rain'/'fog'/null, паттерн `forceBoss`); погода не персистится в сейв. Тост погоды — из `T` (`t('wx_'+weather)`; `WEATHER.*.toast` — не используется). Заметка: туман может дать p>1 → насыщение 100% клёва (осознанно).
|
||||
- Скины (M-skins): таблицы `BOAT_SKINS`/`BOBBER_SKINS` (лодка: Обычная 0 / «Красная лодка» 800 / «Лодка-домик» 2000 🪙; поплавок: Обычный 0 / Красный 500 / Неоновый 1500 🪙), сейв `save.boatSkin(s)`/`save.bobberSkin(s)` + миграция в `loadSave()` (включая гарантию бесплатного скина 0), вкладка «Скины» 🎨 (`#tabSkins`, строка `skinRow(list,i,owned,equipped,group)`, ветки buyskin/select в `shopClick()`: покупка со списанием и авто-экипировкой, выбор — только купленное), отрисовка `drawBoat()`/`drawBobber()` с clamp 0..2 (скин 2: каюта у лодки, неоновое свечение `shadowBlur` в save/restore у поплавка); чистая косметика — без эффектов на геймплей.
|
||||
- Локации (этап 5): таблица `LOCATIONS` (Река 0 — бесплатно / «Озёра» 100000 🪙; `water` — 6 hex [dayTop,dayMid,dayBot,nightTop,nightMid,nightBot] для градиента `drawWater()`, nightMix-логика та же), сейв `save.locations[]`/`save.location` + миграция в `loadSave()` (гарантия бесплатной Реки, паттерн скинов), вкладка «Локации» 🗺️ (`#tabLocations`, строка `locationRow(loc,i,owned,selected)`, ветки buylocation/selectlocation в `shopClick()`: покупка — списание, push, АВТО-ПЕРЕХОД `save.location`, тост «Добро пожаловать на Озёра!»; выбор — только купленное). Таблицы рыб: `RIVER_SPECIES(_NIGHT)` — ТОЛЬКО 8 базовых видов (роллы реки не меняются: pin-тесты §9j(b)/M4/M6 завязаны на веса и порядок — новые виды в реку НЕ добавлять!), `LAKE_SPECIES(_NIGHT)` — все 16 видов (веса `LAKE_DAY_WEIGHTS`/`LAKE_NIGHT_WEIGHTS`); `SPECIES`/`SPECIES_NIGHT` — полный словарь 16 видов (этап 5: zander/chuch/crayfish, этап 33: bleak/roundel/eelpout/tench/navaga; ночные веса — в `NIGHT_WEIGHTS`, ключ обязателен каждому id, иначе `weight=undefined`). **Новые виды добавлять только в КОНЕЦ `SPECIES`** — `SPECIES[0..7]` запинены тестами (§573/§1524/§2446 `SPECIES[0]`, §9j/M4/M6 по id) и квестами (`QUEST_TPLS` индексы 0..2); вставка в середину молча сломает их. `pickSpecies()` выбирает таблицу по `save.location` и dayPhase (логика ролла та же); босс (sturge) есть в обеих локациях; ачивка species_8 — «Поймай все виды» (все 16, check = `SPECIES.every`, id не менять — старые сейвы).
|
||||
- **Баланс Озёр (этап 34):** ожидаемая выручка за улов = Σ(w·V)/Σw, V — середина диапазона веса × цена. `pickSpecies()` нормирует веса, так что **умножение всех весов на константу доход НЕ меняет** — для «стало дороже» правят СДВИГ долей (меньше `carass`/`bleak` — самые дешёвые V≈9/6 🪙, больше `sturge`/`gold`/`catfish`/`tench`/`navaga`). Текущие ориентиры: Озёра день 110.4 / ночь 145.5 🪙, Река день 65.1 / ночь 125.9 (Озёра доходнее в обе фазы — проверять при любой правке `LAKE_*_WEIGHTS`). **Минимальный вес вида ≥ ~2.2**: ниже — тест lc4 (3000 роллов, «каждый вид ≥1») начинает плавать.
|
||||
- Сложность вываживания: `updateReel()`.
|
||||
- Физика боя (спринт 4): `fishForce()` (сила рыбы: рывок `(16+34·st)·(0.5+0.9·ag)·(0.7+0.5·ov)`, затишье `5+7·ag`, уставшая ×0.45) и `updateReel()` — выносливость `st` (старт `st0`, флаг `tired` при `st≤0.12`: рывки ×0.45, втягивание быстрее до ×1.6), тормоз катушки (черта `drag` в `RODS`: в рывке выше тормоза леска скользит `over·0.22`), натяжение (`10+over·1.1+22·ag`, ×0.35 в затишье), втягивание `(11+3·reel)·(1+0.6·(1−st))`, свободный бег `F·0.32`, escape-бар растёт только при затишье без удержания (отпускание в рывок безопасно), near-miss `1.45·d0`, `d0=45+7·w`. Пустые клёвы: ролл `biteChance()` в ветке WAIT (тест-форс `forceBite`). Тесты (§10) завязаны на эти константы — при ребалансе гонять Monte-Carlo точными формулами (docs/PHYSICS-RESEARCH.md, §4.7) и править тесты в том же коммите.
|
||||
- Награды (M2): шаблоны квестов `QUEST_TPLS`, награды стрика `STREAK_REWARDS`, достижения `ACHIEVEMENTS` — секция «M2. Награды» после сейва. Этап 22: ачивок 29 (идут `ACHIEVEMENTS`-записями по темам: снасти у экономики, варианты/погода/вес/ночь у рыболовных, скины/локации у магазинных); новые счётчики сейва `save.kgTotal`/`nightCatch`/`wxRainV`/`wxFog` (чтение через `||0` — без миграции) ставятся в `catchFish()` до `checkAchievements()` (rain-счётчик — только вариант ≠ normal, босс всегда normal); тест-пин §10c(8): сумма `achBonus().coinPct` (все 8 видов × 8 вариантов) = 0.16.
|
||||
|
||||
Reference in New Issue
Block a user