НовоеНовая концепция: 1 победа = от 1 до 5 кирпичей (вместо целого небоскрёба). 11 кирпичей = закрытая высотка. Как в самой игре
НовоеБонусы к кирпичам: +1 за живого соперника, +1/+2/+3 за Hard/Extreme/Impossible AI, +1 за золотую победу. Цвет этажа = скин на момент той победы
НовоеЗолотая корона-шпиль над высотками где последний кирпич был из особой победы (золотая виктория или Impossible AI). Над короной — звезда и дым
НовоеКнопка «Поделиться городом» — ссылка /embed/city/:id даёт в Telegram/Discord/Reddit красивую PNG-карточку с именем, 4 статами и силуэтом города
НовоеВ модалке Шаринга — три разные ссылки (embed-виджет, профиль, iframe-снипет) + кнопка системного шаринга (Web Share API)
Новоеiframe-снипет для встраивания в блоги. Поддерживаются параметры ?theme=day|night и ?nocontrols=1
НовоеКнопка «Сравнить с…»: 3 вкладки — Друзья, Топ из leaderboard, Поиск по точному нику. Открывает страницу с двумя городами бок-о-бок, счётом и лидером с короной
НовоеОчки сравнения = высоток × 100 + корон × 50 + кирпичей. Такая же формула в холле оф фейм в табе «Размер»
НовоеКнопка «Сравнить города» в публичном профиле другого игрока — в один клик
НовоеКнопка «Поделиться сравнением» прямо на странице compare — копирует ссылку с SSR-превью для мессенджеров
НовоеОтдельная PNG-картинка превью для сравнения двух городов — в Telegram видны имена, счёт и оба города бок-о-бок
НовоеЗапись 8-секундного облёта города в видео (.webm/.mp4, кодеки vp9→vp8→h264). Где есть Web Share — сразу в системный share sheet, иначе скачивается файлом. REC-индикатор с прогресс-баром и обратным отсчётом
НовоеХолл оф фейм: топ-20 по 4 метрикам (размер города, кирпичи, высотки, короны) + глобальные счётчики игроков/кирпичей/высоток. Медали 🥇🥈🥉 за топ-3, твоя строка подсвечена «(вы)»
НовоеКлик по строке в холле оф фейм — переход на профиль этого игрока (через глобальный event open-profile)
НовоеМини-превью городов в холле оф фейм — лёгкий SVG-силуэт без WebGL, сразу видно форму города
НовоеНа пустом городе появилась кнопка «Посмотреть топ городов» — сразу видно куда стремиться
НовоеИндикатор «Следующая высотка: 7/11 кирпичей» под статами
НовоеКлик по высотке — модалка со списком всех побед из которых она сложена, с числом кирпичей от каждой (сгруппировано по source_id)
НовоеHover на этаже: соперник, сложность AI, дата. Hover на высотке целиком: статус закрыта/строится, период от первой до последней победы, число побед в этой стойке
НовоеНаведённая высотка подсвечивается и лёгко увеличивается (скейл 1.06)
НовоеФильтры высоток: все / с короной / содержит Impossible AI / за последнюю неделю. Неподходящие высотки становятся полупрозрачными
НовоеTime-lapse «История» — проигрывает постройку города хронологически, с датой в углу. Стоп любой кнопкой
Новое4 пресета камеры: Изо, Сверху, Кино (низкий угол), FPV-облёт + автоповорот. Плавный переход между пресетами
Новое4 пресета времени суток (Ночь, Утро, День, Закат) — меняются цвет неба, фог, солнце, экспозиция. Ночью зажигаются окна и выходят звёзды
НовоеСезонная погода: снег зимой, дождь весной, листья осенью (летом выключена). Переключается отдельной кнопкой
НовоеСнимок города с фильтрами (Vivid, Ч/Б, Сепия) и водяным знаком «Highrise Heist · Имя · N побед». Где есть Web Share — в share sheet, иначе скачивается
Новое6 слотов сохранённых ракурсов камеры в localStorage. Нашёл красивый угол — сохранил с именем, возвращаешься в один клик
НовоеМинимап в углу: золото = с короной, фиолет = строящаяся, синий = обычная, бледный = отфильтрована. Клик по точке — камера летит к высотке. Скрывается кнопкой ×
НовоеРежим полного экрана для города + подсказка «ESC чтобы выйти»
НовоеДым-частицы над высотками с короной (additive blending), рассветные окна с emissive-свечением, дороги с разметкой, ground texture, звёзды ночью
НовоеIntro-анимация камеры при первой загрузке и рост башен из земли с лёгким stagger
НовоеESC закрывает любые модалки (Поделиться, Сравнить, Холл оф фейм)
НовоеНовый endpoint /api/buildings/leaderboard: топ-20 по 4 метрикам + глобальные счётчики + возраст кэша. Кэш 5 минут
НовоеНовый endpoint /api/buildings/feed/recent: лента последних 20 побед всех игроков + статы за 24ч и всё время. Сумма кирпичей считается в SQL CASE-выражении. Кэш 30 сек
НовоеНовый indices: idx_victory_buildings_recent (created_at DESC) — ускоряет /feed/recent на больших объёмах
НовоеSSR-страница /embed/compare/:id1/:id2 для ботов-краулеров: отдаёт og:image и редиректит пользователя на SPA
УлучшениеPOST /api/buildings возвращает обновлённый город сразу — UI обновляется без второго запроса. Экономия раунд-трипа после каждой победы
Улучшение2D-fallback для устройств без WebGL переписан под новую модель towers — SVG-изометрия, зум колёсиком, drag-pan, выбор высотки тапом
УлучшениеMobile/low-power режим: меньше окон, basic shadow map, no tone mapping, devicePixelRatio=1, 250 частиц погоды вместо 600
Улучшениеprefers-reduced-motion: отключает автоповорот, пульсацию корон, дым и погоду
СкоростьOG-картинки через @resvg/resvg-js (Rust binding, ~50ms) вместо headless chrome (экономия ~195MB зависимостей). LRU кэш 500 картинок / 1ч. Сброс после новой победы инвалидирует и city-, и compare-картинки
СкоростьIntersectionObserver останавливает рендер когда город вне экрана. visibilityState — когда вкладка в фоне. Окна башен рендерятся одним InstancedMesh
СкоростьВерсионирование кэш-ключей OG (v1:userId, cmpv1:id1-id2). При правке SVG-дизайна бампаем префикс — старые картинки обновляются
УлучшениеОкна на высотках теперь зажигаются ночью при первой загрузке профиля, а не только после клика по пресету времени суток
УлучшениеОкна больше не висят в воздухе пока башни вырастают из земли (intro и time-lapse) — появляются только после того как город построен
УлучшениеЗапись 8-секундного облёта больше не «съедает» включённый авто-поворот — после видео он восстанавливается, если был активен
СкоростьДороги (~10 штук) теперь шарят одну геометрию, материал и текстуру вместо клонирования каждой — экономия ~10 GPU-текстур и геометрий на каждое открытие профиля
СкоростьГород побед корректно высвобождает все WebGL-ресурсы при закрытии профиля: убраны утечки прогресс-таймера записи, обработчиков мыши и race condition между unmount и анимационным циклом