Этап 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 — формула/таблица обновлены, пометка ревизии).
@@ -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-портреты рыб в дневнике и карточке улова
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
Before Width: | Height: | Size: 192 KiB After Width: | Height: | Size: 187 KiB |
|
Before Width: | Height: | Size: 163 KiB After Width: | Height: | Size: 159 KiB |
|
Before Width: | Height: | Size: 173 KiB After Width: | Height: | Size: 169 KiB |
|
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 197 KiB After Width: | Height: | Size: 193 KiB |
|
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 75 KiB |
|
Before Width: | Height: | Size: 77 KiB After Width: | Height: | Size: 80 KiB |
|
Before Width: | Height: | Size: 192 KiB After Width: | Height: | Size: 187 KiB |
|
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 81 KiB After Width: | Height: | Size: 80 KiB |
|
Before Width: | Height: | Size: 242 KiB After Width: | Height: | Size: 254 KiB |
|
Before Width: | Height: | Size: 270 KiB After Width: | Height: | Size: 270 KiB |
|
Before Width: | Height: | Size: 226 KiB After Width: | Height: | Size: 239 KiB |
|
Before Width: | Height: | Size: 121 KiB After Width: | Height: | Size: 117 KiB |
|
Before Width: | Height: | Size: 259 KiB After Width: | Height: | Size: 270 KiB |
|
Before Width: | Height: | Size: 126 KiB After Width: | Height: | Size: 131 KiB |
|
Before Width: | Height: | Size: 132 KiB After Width: | Height: | Size: 127 KiB |
|
Before Width: | Height: | Size: 245 KiB After Width: | Height: | Size: 257 KiB |
|
Before Width: | Height: | Size: 110 KiB After Width: | Height: | Size: 112 KiB |
|
Before Width: | Height: | Size: 129 KiB After Width: | Height: | Size: 136 KiB |
|
Before Width: | Height: | Size: 288 KiB After Width: | Height: | Size: 286 KiB |
|
Before Width: | Height: | Size: 292 KiB After Width: | Height: | Size: 295 KiB |
|
Before Width: | Height: | Size: 255 KiB After Width: | Height: | Size: 254 KiB |
|
Before Width: | Height: | Size: 134 KiB After Width: | Height: | Size: 142 KiB |
|
Before Width: | Height: | Size: 300 KiB After Width: | Height: | Size: 303 KiB |
|
Before Width: | Height: | Size: 154 KiB After Width: | Height: | Size: 153 KiB |
|
Before Width: | Height: | Size: 146 KiB After Width: | Height: | Size: 151 KiB |
|
Before Width: | Height: | Size: 291 KiB After Width: | Height: | Size: 292 KiB |
|
Before Width: | Height: | Size: 130 KiB After Width: | Height: | Size: 131 KiB |
|
Before Width: | Height: | Size: 153 KiB After Width: | Height: | Size: 152 KiB |