From 8db8171b979c3f56fee7259d98f96d84b91ebdae Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Sun, 14 Jun 2026 10:59:17 +0300 Subject: [PATCH] =?UTF-8?q?@=20fix(pet-sprite):=20=D1=83=D0=BD=D0=B8=D0=BA?= =?UTF-8?q?=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=B5=20id=20=D0=B3=D1=80=D0=B0?= =?UTF-8?q?=D0=B4=D0=B8=D0=B5=D0=BD=D1=82=D0=BE=D0=B2=20=D1=81=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B9=D1=82=D0=B0=20=E2=80=94=20=D1=84=D0=B8=D0=BA=D1=81?= =?UTF-8?q?=20=C2=AB=D0=BF=D1=80=D0=BE=D0=BF=D0=B0=D0=B4=D0=B0=D1=8E=D1=89?= =?UTF-8?q?=D0=B5=D0=B3=D0=BE=C2=BB=20=D1=82=D0=B5=D0=BB=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit uid градиента питомца строился детерминированно (pg+level+mood+colorKey), поэтому два питомца с одинаковыми параметрами на одной странице получали совпадающие id. url(#id) заливки тела резолвился в чужой градиент (часто в display:none-вьюхе) → тело без заливки, видны только контур/усики/аура. Проявлялось «случайно» — только при совпадении параметров (нарратор на карте vs на экране победы в /quantik). Теперь uid — глобальный счётчик (pg1, pg2, …), коллизий нет. Чинит и /pet, и /dashboard, и игру. Co-Authored-By: Claude Opus 4.8 (1M context) @ --- frontend/js/pet-sprite.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/frontend/js/pet-sprite.js b/frontend/js/pet-sprite.js index 359d1f7..90ac1f4 100644 --- a/frontend/js/pet-sprite.js +++ b/frontend/js/pet-sprite.js @@ -5,6 +5,10 @@ * dashboard.html используют window.PetSprite.render(...) — без дублей. */ (function () { + // Счётчик для УНИКАЛЬНЫХ id градиентов/клипов спрайта. Иначе два питомца с + // одинаковыми level/mood/colorKey дают совпадающие id, и url(#id) заливки тела + // резолвится в чужой (возможно display:none) градиент → тело без заливки. + let _petUidSeq = 0; const PET_PALETTES = { purple:'#9B5DE5', cyan:'#06D6E0', gold:'#F9C74F', red:'#F94144', green:'#38D95A', blue:'#4A90D9', @@ -24,7 +28,7 @@ const col = PET_PALETTES[colorKey] || '#9B5DE5'; const dark = shadeColor(col, -45); const light = shadeColor(col, 52); - const uid = `pg${level}${mood[0]}${colorKey[0]}`; + const uid = `pg${(++_petUidSeq).toString(36)}`; const bodyPath = 'M55,22 C70,22 86,37 87,56 C89,75 78,94 55,97 C32,94 21,75 23,56 C24,37 40,22 55,22 Z'; const eyeY = 52, eyeX1 = 40, eyeX2 = 70;