Этап 41 ревизия 2: минимум 0.1 кг → 8 px длины силуэта (fs 8→3.27). fishSizeFromW(w)=(8+120*(max(0.1,w)-0.1)/99.9)/2.45 — шкала теперь линейна по ДЛИНЕ силуэта (длина = 2.45·fs), якоря: 0.1 кг → 8 px (было 19.6 px — «ещё меньше»), 100 кг → 128 px = 2× лодки 64 px (не тронут). Новое распределение: 1 кг → 9.1 px (0.14× лодки), 5 кг → 13.9 px (0.22×), 10 кг → 19.9 px (0.31×), 20 кг (босс min) → 31.8 px (0.50×), 50 кг (босс max) → 67.9 px (1.06×), 100 кг → 128 px (2×); размер лодки (64 px) достигают ~47 кг. Диапазон 8..128 px = ×16 (было ~20..54 px = ×2.7): мелочь — точечная, разброс дали тяжёлые 20–100 кг. Баланс/тесты: не затронуто — 193/193 PASS, exit 0; check.mjs OK; скриншоты пересняты (кадр reel: 12.5 кг ≈ 23 px ≈ 0.36× лодки). Доки: DEVLOG (Этап 41 — формула/таблица обновлены, пометка ревизии).

This commit is contained in:
2026-09-20 19:09:51 +03:00
parent 2734998854
commit 203694a30c
32 changed files with 9 additions and 8 deletions
+5 -5
View File
@@ -751,16 +751,16 @@ git add -A && git commit -m "что изменилось" && git push
## Этап 41. Размер рыбы при вываживании — от абсолютного веса (0.1 кг → минимум, 100 кг → 2× лодки)
**Задача:** «размер рыбы в воде (когда её вытягиваешь) должен соответствовать её весу в кг, а не минимальному/максимальному весу вида; диапазон больше: 0.1 кг — максимально маленькая как сейчас, 100 кг — в 2 раза больше лодки». Первая ревизия этапа была лог-шкалой (средние рыбы 1–10 кг подросли до 0.9–1.4× лодки — «все рыбы сильно большие»); по решению заменена на линейную, якоря те же.
**Задача:** «размер рыбы в воде (когда её вытягиваешь) должен соответствовать её весу в кг, а не минимальному/максимальному весу вида; диапазон больше: 0.1 кг — максимально маленькая как сейчас, 100 кг — в 2 раза больше лодки». Первая ревизия этапа была лог-шкалой (средние рыбы 1–10 кг подросли до 0.9–1.4× лодки — «все рыбы сильно большие»); по решению заменена на линейную. Вторая ревизия: минимум опустили ещё — 0.1 кг с длины 19.6 px до **8 px** («ещё меньше»), якорь 100 кг = 2× лодки не тронут.
**Решения:**
- **Новый хелпер `fishSizeFromW(w)`** (секция «ОТРИСОВКА», перед `drawHookedFish()`): **линейно** `8 + 44.2·(max(0.1,w)−0.1)/99.9`. Якоря: **0.1 кг → 8** (прежний минимум), **100 кг → 52.2** (длина силуэта 2.45·52.2 ≈ 128 px = 2× лодки 64 px из `drawBoat()`, `bx−32..bx+32`). Веса <0.1 кг клампятся в минимум (затрагивает только золотую рыбку 0.05–0.1 кг). Распределение «сдвинуто в мелочь»: типичные уловы 0.1–10 кг → 8..12.4 px (0.3–0.5× лодки), размер лодки (64 px) достигает ~41 кг, в 2× — ровно 100 кг.
- **`drawHookedFish()`:** `fs = fishSizeFromW(reel.w)` (было `8+(reel.w/sp.wMax)*10+sp.rarity`). Убраны **`+sp.rarity`** (редкая рыбка не обязана быть крупнее — размер = вес) и **босс-множитель ×1.5** (М4): босс весит 20–50 кг (0.6–1.2× лодки по линейной шкале), с ×1.5 босс-рак 30 кг выглядел бы крупнее кита 100 кг — противоречие «крупнее вес → крупнее рыба»; драматизм босса теперь несёт аура + бейдж + фазы. Золотая аура босса сохранена (читает новый `fs`).
- **Новый хелпер `fishSizeFromW(w)`** (секция «ОТРИСОВКА», перед `drawHookedFish()`): **линейно по ДЛИНЕ силуэта** (длина = 2.45·fs: тело 2·fs + хвост): `fs = (8 + 120·(max(0.1,w)−0.1)/99.9)/2.45`. Якоря: **0.1 кг → 8 px** (мелочь-мелкая, fs≈3.27), **100 кг → 128 px = 2× лодки 64 px** из `drawBoat()` (`bx−32..bx+32`). Веса <0.1 кг клампятся в минимум (затрагивает только золотую рыбку 0.05–0.1 кг). Распределение «сдвинуто в мелочь»: типичные уловы 0.1–10 кг → 8..19.9 px (0.13–0.31× лодки), размер лодки (64 px) достигают ~47 кг, в 2× — ровно 100 кг.
- **`drawHookedFish()`:** `fs = fishSizeFromW(reel.w)` (было `8+(reel.w/sp.wMax)*10+sp.rarity`). Убраны **`+sp.rarity`** (редкая рыбка не обязана быть крупнее — размер = вес) и **босс-множитель ×1.5** (М4): босс весит 20–50 кг (0.5–1.06× лодки по линейной шкале), с ×1.5 босс-рак 30 кг выглядел бы крупнее кита 100 кг — противоречие «крупнее вес → крупнее рыба»; драматизм босса теперь несёт аура + бейдж + фазы. Золотая аура босса сохранена (читает новый `fs`).
- **Не тронуто:** подплывающая рыба до подсечки (APPROACH/BITE, `12+rarity*2.5` — вес к моменту подплывания ещё не зароллен, `hook()` роллит его при подсечке), фоновые рыбы `rand(8,22)`, 🐟-маркер на дистанционной полосе, emoji-карточка улова. Баланс/роллы не задеты: `wMin/wMax` остаются только в `rollWeight()`/`hook()`/`st0`.
**Размеры (полная длина силуэта; лодка = 64 px):** 0.1 кг → 8 (19.6 px, 0.3×) · 1 кг → 8.4 (20.6 px, 0.3×) · 5 кг → 10.2 (24.9 px, 0.4×) · 10 кг → 12.4 (30.4 px, 0.5×) · 20 кг (босс min) → 16.8 (41.2 px, 0.6×) · 50 кг (босс max) → 30.1 (73.7 px, 1.2×) · 100 кг (кит max) → 52.2 (128 px, **2×**). Диапазон 8..52 px = ×6.5 (было ~9..22 = ×2.4), но распределение сдвинуто в мелочь: мелочь осталась мелкой (как в старой формуле), а разброс дали тяжёлые 20–100 кг. Тяжёлая рыба в конце вываживания (позиция `boatX+24`, поверх лодки) заметно её перекрывает — осознанный эффект «вывезена рядом с лодкой»; на мобильном 360 px кит ≈ 35% ширины.
**Размеры (полная длина силуэта; лодка = 64 px):** 0.1 кг → 8 px (0.13×) · 1 кг → 9.1 px (0.14×) · 5 кг → 13.9 px (0.22×) · 10 кг → 19.9 px (0.31×) · 20 кг (босс min) → 31.8 px (0.50×) · 50 кг (босс max) → 67.9 px (1.06×) · 100 кг (кит max) → 128 px (**2×**). Диапазон 8..128 px = ×16 (в старой формуле ~20..54 px = ×2.7), распределение сдвинуто в мелочь: мелочь — точечная, разброс дали тяжёлые 20–100 кг. Тяжёлая рыба в конце вываживания (позиция `boatX+24`, поверх лодки) заметно её перекрывает — осознанный эффект «вывезена рядом с лодкой»; на мобильном 360 px кит ≈ 35% ширины.
**Тесты:** пины на размер силуэта в `tests/test.js` отсутствуют (проверено: `drawFishShape`/`drawHookedFish`/`fishReelPos` не ассертятся; `reel.w` в тестах — для физики). Итого **193/193 PASS, exit 0**; `check.mjs` OK; `tools/balance.mjs` — пины без изменений (Река 65.1/125.9 · Озёра 194.1/249.0 · Море 297.3/476.7 · Океан 329.1/552.7). Скриншоты перегенерированы (`gen-screenshots.js`, 30 кадров; кадр `reel` форсит `reel.w=12.5` — рыба ~33 px ≈ 0.5× лодки).
**Тесты:** пины на размер силуэта в `tests/test.js` отсутствуют (проверено: `drawFishShape`/`drawHookedFish`/`fishReelPos` не ассертятся; `reel.w` в тестах — для физики). Итого **193/193 PASS, exit 0**; `check.mjs` OK; `tools/balance.mjs` — пины без изменений (Река 65.1/125.9 · Озёра 194.1/249.0 · Море 297.3/476.7 · Океан 329.1/552.7). Скриншоты перегенерированы (`gen-screenshots.js`, 30 кадров; кадр `reel` форсит `reel.w=12.5` — рыба ~23 px ≈ 0.36× лодки).
## Этап 42. SVG-портреты рыб в дневнике и карточке улова
+4 -3
View File
@@ -2579,9 +2579,10 @@ function fishReelPos(){
return {x:x,y:y};
}
/* Размер силуэта пойманной рыбы — от АБСОЛЮТНОГО веса (кг), не от wMin/wMax вида.
Линейная шкала, якоря: 0.1 кг → 8 (прежний минимум), 100 кг → 52.2 (длина 2.45·52≈128 px = 2× лодки 64 px).
Веса <0.1 кг клампятся в минимум. Средние значения: 1 кг → 8.4, 10 кг → 12.3, 50 кг → 29.4, 100 кг → 52.2. */
const fishSizeFromW=w=>8+44.2*(Math.max(0.1,w)-0.1)/99.9; // 99.9 = 100-0.1
Линейная шкала по ДЛИНЕ силуэта (длина = 2.45·fs: тело 2·fs + хвост), якоря:
0.1 кг → 8 px (мелочь), 100 кг → 128 px = 2× лодки 64 px. Веса <0.1 кг клампятся в минимум.
Средние значения (длина): 1 кг → 9.1 px, 10 кг → 19.9 px, 20 кг → 31.8 px, 50 кг → 67.9 px. */
const fishSizeFromW=w=>(8+120*(Math.max(0.1,w)-0.1)/99.9)/2.45; // 120 = 128-8 px, 99.9 = 100-0.1
function drawHookedFish(){
if(state!=='REEL'||!reel) return;
const sp=reel.sp;
Binary file not shown.

Before

Width:  |  Height:  |  Size: 192 KiB

After

Width:  |  Height:  |  Size: 187 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 163 KiB

After

Width:  |  Height:  |  Size: 159 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 173 KiB

After

Width:  |  Height:  |  Size: 169 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 197 KiB

After

Width:  |  Height:  |  Size: 193 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 192 KiB

After

Width:  |  Height:  |  Size: 187 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 81 KiB

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 242 KiB

After

Width:  |  Height:  |  Size: 254 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 270 KiB

After

Width:  |  Height:  |  Size: 270 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 226 KiB

After

Width:  |  Height:  |  Size: 239 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 121 KiB

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 259 KiB

After

Width:  |  Height:  |  Size: 270 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 132 KiB

After

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 245 KiB

After

Width:  |  Height:  |  Size: 257 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 129 KiB

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 288 KiB

After

Width:  |  Height:  |  Size: 286 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 292 KiB

After

Width:  |  Height:  |  Size: 295 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 255 KiB

After

Width:  |  Height:  |  Size: 254 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 300 KiB

After

Width:  |  Height:  |  Size: 303 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 154 KiB

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 146 KiB

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 291 KiB

After

Width:  |  Height:  |  Size: 292 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 130 KiB

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 153 KiB

After

Width:  |  Height:  |  Size: 152 KiB