Размер рыбы при вываживании — от абсолютного веса (Этап 41): 0.1 кг → минимум как раньше, 100 кг → 2× лодки. drawHookedFish(): fs=fishSizeFromW(reel.w) вместо 8+(w/wMax)*10+rarity — размер больше не от диапазона вида и не от редкости (крупнее вес → крупнее рыба); босс-×1.5 убран (20–50 кг и так 1.7–1.8× лодки, с ×1.5 рак 30 кг выглядел бы крупнее кита 100 кг), аура босса сохранена. fishSizeFromW(w)=8+44.2*log10(max(0.1,w)/0.1)/3 — лог-шкала (линейная упёрла бы все уловы 0.1–10 кг в 8..12 px), якоря 0.1 кг→8 / 100 кг→52.2 (длина 2.45·52≈128 px = 2× лодки 64 px); диапазон ×6.5 (было ×2.4). Не тронуто: подплывающая рыба до подсечки (вес не зароллен), фоновые рыбы, 🐟-маркер, карточка; wMin/wMax остались в rollWeight/hook/st0 — баланс не задет (balance.mjs: пины 65.1/125.9 · 194.1/249.0 · 297.3/476.7 · 329.1/552.7 без изменений). Тесты: пинов на размер силуэта нет — 193/193 PASS, exit 0; check.mjs OK; скриншоты пересняты (30 кадров, кадр reel: 12.5 кг ≈ 95 px ≈ 1.5× лодки). Доки: DEVLOG (Этап 41), AGENTS.md правок не требует (формулу не пинит).
@@ -748,3 +748,16 @@ git add -A && git commit -m "что изменилось" && git push
|
||||
- Средний вес улова: Море день ≈7.0 кг (было 6.5), ночь ≈9.4; Озёра ночь ≈13.9 — разрыв «Море легче Озёр» сократился (ночь 9.4 против 13.9, было 6.5 против 10.7), полностью не закрыт: дневное Море ограничено инвариантом.
|
||||
|
||||
**Тесты:** lc2 (id/порядок/числовость — веса не пинятся), lc4/lc4b/lc4c («каждый вид ≥1» — все виды с запасом), §9j/M4/M6/§10 — без изменений (река и константы физики не тронуты). Итого **193/193 PASS, exit 0**; `check.mjs` OK; `tools/balance.mjs` — цифры выше. Доки: AGENTS.md (строки «Локации»/«Баланс Озёр»/«Баланс-скрипт» — пины и пометка про тонкий запас Океан/Море), комментарии секции ДАННЫЕ в index.html (этап 40 у LAKE/SEA/OCEAN таблиц).
|
||||
|
||||
## Этап 41. Размер рыбы при вываживании — от абсолютного веса (0.1 кг → минимум, 100 кг → 2× лодки)
|
||||
|
||||
**Задача:** «размер рыбы в воде (когда её вытягиваешь) должен соответствовать её весу в кг, а не минимальному/максимальному весу вида; диапазон больше: 0.1 кг — максимально маленькая как сейчас, 100 кг — в 2 раза больше лодки».
|
||||
|
||||
**Решения:**
|
||||
- **Новый хелпер `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`).
|
||||
- **Не тронуто:** подплывающая рыба до подсечки (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% ширины.
|
||||
|
||||
**Тесты:** пины на размер силуэта в `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).
|
||||
|
||||
@@ -1859,6 +1859,11 @@ function fishReelPos(){
|
||||
const y=hy+(waterY+10-hy)*pe + Math.sin(time*5*k)*3*k; // диагональ: из глубины к лодке у поверхности
|
||||
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)
|
||||
function drawHookedFish(){
|
||||
if(state!=='REEL'||!reel) return;
|
||||
const sp=reel.sp;
|
||||
@@ -1866,13 +1871,13 @@ function drawHookedFish(){
|
||||
const fp=fishReelPos();
|
||||
const x=fp.x, y=fp.y;
|
||||
const dir=Math.sin(time*2.5*k)>0?1:-1;
|
||||
const fs=8+(reel.w/sp.wMax)*10+sp.rarity;
|
||||
const fs=fishSizeFromW(reel.w); // размер = абсолютный вес (редкость и босс-×1.5 убраны: крупнее вес → крупнее рыба)
|
||||
if(reel.boss){ // босс: золотая аура (визуал)
|
||||
const gg=ctx.createRadialGradient(x,y,4,x,y,fs*2.6);
|
||||
gg.addColorStop(0,'rgba(255,215,94,0.35)'); gg.addColorStop(1,'rgba(255,215,94,0)');
|
||||
ctx.fillStyle=gg; ctx.fillRect(x-fs*2.6,y-fs*2.6,fs*5.2,fs*5.2);
|
||||
}
|
||||
drawFishShape(x,y,reel.boss?fs*1.5:fs,dir,sp.hue,0.75,Math.sin(time*9*k)*0.3*k); // силуэт крупнее у тяжёлых, босс ×1.5
|
||||
drawFishShape(x,y,fs,dir,sp.hue,0.75,Math.sin(time*9*k)*0.3*k); // силуэт крупнее у тяжёлых (по весу)
|
||||
}
|
||||
function drawParticles(){
|
||||
for(const p of particles){
|
||||
|
||||
|
Before Width: | Height: | Size: 186 KiB After Width: | Height: | Size: 190 KiB |
|
Before Width: | Height: | Size: 169 KiB After Width: | Height: | Size: 168 KiB |
|
Before Width: | Height: | Size: 168 KiB After Width: | Height: | Size: 172 KiB |
|
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 191 KiB After Width: | Height: | Size: 194 KiB |
|
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 81 KiB After Width: | Height: | Size: 78 KiB |
|
Before Width: | Height: | Size: 185 KiB After Width: | Height: | Size: 189 KiB |
|
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 78 KiB |
|
Before Width: | Height: | Size: 254 KiB After Width: | Height: | Size: 246 KiB |
|
Before Width: | Height: | Size: 290 KiB After Width: | Height: | Size: 283 KiB |
|
Before Width: | Height: | Size: 238 KiB After Width: | Height: | Size: 230 KiB |
|
Before Width: | Height: | Size: 120 KiB After Width: | Height: | Size: 123 KiB |
|
Before Width: | Height: | Size: 270 KiB After Width: | Height: | Size: 263 KiB |
|
Before Width: | Height: | Size: 128 KiB After Width: | Height: | Size: 129 KiB |
|
Before Width: | Height: | Size: 133 KiB After Width: | Height: | Size: 134 KiB |
|
Before Width: | Height: | Size: 256 KiB After Width: | Height: | Size: 249 KiB |
|
Before Width: | Height: | Size: 105 KiB After Width: | Height: | Size: 109 KiB |
|
Before Width: | Height: | Size: 127 KiB After Width: | Height: | Size: 131 KiB |
|
Before Width: | Height: | Size: 301 KiB After Width: | Height: | Size: 300 KiB |
|
Before Width: | Height: | Size: 300 KiB After Width: | Height: | Size: 303 KiB |
|
Before Width: | Height: | Size: 268 KiB After Width: | Height: | Size: 268 KiB |
|
Before Width: | Height: | Size: 138 KiB After Width: | Height: | Size: 139 KiB |
|
Before Width: | Height: | Size: 310 KiB After Width: | Height: | Size: 309 KiB |
|
Before Width: | Height: | Size: 155 KiB After Width: | Height: | Size: 152 KiB |
|
Before Width: | Height: | Size: 148 KiB After Width: | Height: | Size: 151 KiB |
|
Before Width: | Height: | Size: 303 KiB After Width: | Height: | Size: 302 KiB |
|
Before Width: | Height: | Size: 130 KiB After Width: | Height: | Size: 123 KiB |
|
Before Width: | Height: | Size: 153 KiB After Width: | Height: | Size: 144 KiB |