Этап 41 ревизия: лог-шкала размера рыбы → линейная. fishSizeFromW(w)=8+44.2*(max(0.1,w)-0.1)/99.9 вместо 8+44.2*log10(max(0.1,w)/0.1)/3 — лог поднимал средние рыбы до «почти лодка» (1 кг → 0.9×, 10 кг → 1.4×): «все рыбы сильно большие». Якоря не изменились: 0.1 кг → 8 (минимум), 100 кг → 52.2 (128 px = 2× лодки 64 px). Линейное распределение: 1 кг → 8.4 (0.3×), 10 кг → 12.4 (0.5×), 20 кг (босс min) → 16.8 (0.6×), 50 кг (босс max) → 30.1 (1.2×), 100 кг → 52.2 (2×) — размер лодки (64 px) достигают ~41 кг. Мелочь осталась мелкой (как в старой формуле 8+(w/wMax)*10+rarity), разброс дали тяжёлые 20–100 кг. Баланс/тесты: не затронуто — 193/193 PASS, exit 0 (прогон поверх Этапа 42); check.mjs OK; скриншоты пересняты (кадр reel: 12.5 кг ≈ 33 px ≈ 0.5× лодки). Доки: DEVLOG (Этап 41 — формула и таблица размеров обновлены на линейную, помечена ревизия).
@@ -751,16 +751,16 @@ git add -A && git commit -m "что изменилось" && git push
|
||||
|
||||
## Этап 41. Размер рыбы при вываживании — от абсолютного веса (0.1 кг → минимум, 100 кг → 2× лодки)
|
||||
|
||||
**Задача:** «размер рыбы в воде (когда её вытягиваешь) должен соответствовать её весу в кг, а не минимальному/максимальному весу вида; диапазон больше: 0.1 кг — максимально маленькая как сейчас, 100 кг — в 2 раза больше лодки».
|
||||
**Задача:** «размер рыбы в воде (когда её вытягиваешь) должен соответствовать её весу в кг, а не минимальному/максимальному весу вида; диапазон больше: 0.1 кг — максимально маленькая как сейчас, 100 кг — в 2 раза больше лодки». Первая ревизия этапа была лог-шкалой (средние рыбы 1–10 кг подросли до 0.9–1.4× лодки — «все рыбы сильно большие»); по решению заменена на линейную, якоря те же.
|
||||
|
||||
**Решения:**
|
||||
- **Новый хелпер `fishSizeFromW(w)`** (секция «ОТРИСОВКА», перед `drawHookedFish()`): `8 + 44.2·log10(max(0.1,w)/0.1)/3`. Якоря: **0.1 кг → 8** (прежний минимум), **100 кг → 52.2** (длина силуэта 2.45·52.2 ≈ 128 px = 2× лодки 64 px из `drawBoat()`, `bx−32..bx+32`). Лог-шкала сознательно: линейная упёрла бы почти все уловы (0.1–10 кг) в 8..12.5 px — «больший диапазон» не получился бы; лог даёт разброс средним рыбам. Веса <0.1 кг клампятся в минимум (затрагивает только золотую рыбку 0.05–0.1 кг).
|
||||
- **`drawHookedFish()`:** `fs = fishSizeFromW(reel.w)` (было `8+(reel.w/sp.wMax)*10+sp.rarity`). Убраны **`+sp.rarity`** (редкая рыбка не обязана быть крупнее — размер = вес) и **босс-множитель ×1.5** (М4): босс весит 20–50 кг и так 1.7–1.8× лодки, с ×1.5 босс-рак 30 кг выглядел бы крупнее кита 100 кг — противоречие «крупнее вес → крупнее рыба». Золотая аура босса сохранена (читает новый `fs`).
|
||||
- **Новый хелпер `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`).
|
||||
- **Не тронуто:** подплывающая рыба до подсечки (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 кг → 22.7 (56 px, 0.9×) · 5 кг → 33.3 (82 px, 1.3×) · 10 кг → 37.5 (92 px, 1.4×) · 20 кг (босс min) → 44.7 (110 px, 1.7×) · 50 кг (босс max) → 47.8 (117 px, 1.8×) · 100 кг (кит max) → 52.2 (128 px, **2×**). Диапазон 8..52 px = ×6.5 (было ~9..22 = ×2.4). Тяжёлая рыба в конце вываживания (позиция `boatX+24`, поверх лодки) заметно её перекрывает — осознанный эффект «вывезена рядом с лодкой»; на мобильном 360 px кит ≈ 35% ширины.
|
||||
**Размеры (полная длина силуэта; лодка = 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% ширины.
|
||||
|
||||
**Тесты:** пины на размер силуэта в `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` — рыба ~92 px вместо ~30).
|
||||
**Тесты:** пины на размер силуэта в `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× лодки).
|
||||
|
||||
## Этап 42. SVG-портреты рыб в дневнике и карточке улова
|
||||
|
||||
|
||||
@@ -2579,10 +2579,9 @@ function fishReelPos(){
|
||||
return {x:x,y:y};
|
||||
}
|
||||
/* Размер силуэта пойманной рыбы — от АБСОЛЮТНОГО веса (кг), не от wMin/wMax вида.
|
||||
Якоря: 0.1 кг → 8 (прежний минимум), 100 кг → 52 (длина 2.45·52≈128 px = 2× лодки 64 px).
|
||||
Веса <0.1 кг клампятся в минимум; лог-шкала — средние рыбы (1–50 кг) получают разброс,
|
||||
линейная упёрла бы почти все уловы в 8..12 px. */
|
||||
const fishSizeFromW=w=>8+44.2*Math.log10(Math.max(0.1,w)/0.1)/3; // 3 = log10(100/0.1)
|
||||
Линейная шкала, якоря: 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
|
||||
function drawHookedFish(){
|
||||
if(state!=='REEL'||!reel) return;
|
||||
const sp=reel.sp;
|
||||
|
||||
|
Before Width: | Height: | Size: 190 KiB After Width: | Height: | Size: 192 KiB |
|
Before Width: | Height: | Size: 168 KiB After Width: | Height: | Size: 163 KiB |
|
Before Width: | Height: | Size: 172 KiB After Width: | Height: | Size: 173 KiB |
|
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 194 KiB After Width: | Height: | Size: 197 KiB |
|
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 75 KiB |
|
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 77 KiB |
|
Before Width: | Height: | Size: 189 KiB After Width: | Height: | Size: 192 KiB |
|
Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 81 KiB |
|
Before Width: | Height: | Size: 246 KiB After Width: | Height: | Size: 242 KiB |
|
Before Width: | Height: | Size: 283 KiB After Width: | Height: | Size: 270 KiB |
|
Before Width: | Height: | Size: 230 KiB After Width: | Height: | Size: 226 KiB |
|
Before Width: | Height: | Size: 123 KiB After Width: | Height: | Size: 121 KiB |
|
Before Width: | Height: | Size: 263 KiB After Width: | Height: | Size: 259 KiB |
|
Before Width: | Height: | Size: 129 KiB After Width: | Height: | Size: 126 KiB |
|
Before Width: | Height: | Size: 134 KiB After Width: | Height: | Size: 132 KiB |
|
Before Width: | Height: | Size: 249 KiB After Width: | Height: | Size: 245 KiB |
|
Before Width: | Height: | Size: 109 KiB After Width: | Height: | Size: 110 KiB |
|
Before Width: | Height: | Size: 131 KiB After Width: | Height: | Size: 129 KiB |
|
Before Width: | Height: | Size: 300 KiB After Width: | Height: | Size: 288 KiB |
|
Before Width: | Height: | Size: 303 KiB After Width: | Height: | Size: 292 KiB |
|
Before Width: | Height: | Size: 268 KiB After Width: | Height: | Size: 255 KiB |
|
Before Width: | Height: | Size: 139 KiB After Width: | Height: | Size: 134 KiB |
|
Before Width: | Height: | Size: 309 KiB After Width: | Height: | Size: 300 KiB |
|
Before Width: | Height: | Size: 152 KiB After Width: | Height: | Size: 154 KiB |
|
Before Width: | Height: | Size: 151 KiB After Width: | Height: | Size: 146 KiB |
|
Before Width: | Height: | Size: 302 KiB After Width: | Height: | Size: 291 KiB |
|
Before Width: | Height: | Size: 123 KiB After Width: | Height: | Size: 130 KiB |
|
Before Width: | Height: | Size: 144 KiB After Width: | Height: | Size: 153 KiB |