GDD: Профиль игрока¶
Обзор¶
Профиль игрока — это каноническая поверхность идентичности в Overlord. Она разделена на два вида, всегда достижимых друг из друга:
- Карточка профиля — попап, прославляющий игрока. Идентичность, социальный статус, социальные действия.
- Экран героя — полноэкранный вид, прославляющий персонажа. Класс, билд, статы. Поддерживает Сравнение и Копирование билда для других игроков.
Оба вида работают для себя и для других игроков и достижимы из каждого
места в игре, где показан аватар (верхний левый HUD главного экрана, список
друзей, чат, пати, арена, лидерборды, ссылки вассалов, отправители подарков,
отправители писем). См. concept.md для «зачем»; этот документ специфицирует,
что построено.
Механики¶
Достижимость¶
Каждый аватар в игре — это кнопка. Касание любого аватара открывает попап Карточки профиля для соответствующего игрока.
- Касание собственного аватара игрока в верхнем левом углу главного экрана открывает его собственную Карточку профиля.
- Касание аватара любого другого игрока (список друзей, автор чата, строка лидерборда, оппонент арены, член пати, плашка вассал/сюзерен, отправитель подарка, отправитель письма) открывает Карточку профиля этого игрока.
С карточки «Открыть Экран героя» переходит вперёд и закрывает попап.
Содержимое Карточки профиля¶
Для себя и для других:
- Аватар (с выбранной рамкой и фоном карточки)
- Никнейм (отображаемое имя)
- Пол
- ID игрока с копированием в буфер в одно касание
- Строка статуса (написанная игроком, ограниченной длины — настраивается дизайнером)
- Арена: текущий ранг сезона + бейдж лиги
- Иконка класса + Мощь персонажа
- Ссылка на сюзерена, если есть; или бейдж «N вассалов», если есть
- Сервер + таймзона
- Индикатор онлайна (по бакетам: Онлайн / Сегодня / На этой неделе / Неактивен)
- Ссылка на клан / гильдию, если/когда отгрузятся кланы (плейсхолдер-слот)
Для других игроков карточка имеет следующие кнопки действий:
- Сообщение — открывает (или создаёт) канал приватного чата с ними.
- Добавить / Удалить друга — отправляет запрос в друзья или удаляет с подтверждающим попапом. Скрыто, если заблокирован.
- Открыть Экран героя — переход к их Экрану героя.
- Отправить подарок — видно, когда отношения позволяют (друг, вассал или общая цель для подарка) и состояние подарков позволяет отправку сегодня. Переиспользует существующий флоу отправки подарка.
- Заблокировать — открывает подтверждение с опциональным текстовым полем жалобы; три кнопки: Отмена / Заблокировать / Пожаловаться и заблокировать. Блокировка применяется единообразно: чат, запросы в друзья, приглашения в пати и отправка подарков.
Для себя кнопки действий:
- Настройки аккаунта — юзернейм, пол, привязанные провайдеры авторизации, переключатели уведомлений, регион/язык.
- Друзья — открывает существующий экран Друзей.
- Кастомизация — косметический редактор (см. «Кастомизация» ниже).
- Изменить статус — открывает текстовый ввод с валидацией длины, модерацией и кулдауном на смену.
Содержимое Экрана героя¶
- Крупная модель персонажа с текущим скином модели
- Анимированный или статичный фон (из экипированной косметики фона)
- Баннер класса — иконка + имя
- Мощь (крупно)
- Сводка сюзерена + список слотов вассалов (только чтение)
- Сетка экипированных скиллов
- Экипированные предметы / питомцы
- Кнопка Статов → подэкран детальных статов (HP, урон, крит и т.д.)
Для других игроков Экран героя показывает:
- Сравнить — открывает панель side-by-side: их статы против моих, их скиллы против моих, их экипировка против моей. Различия визуально подсвечены.
- Скопировать билд — устанавливает экипированные скиллы + предметы
смотрящего игрока, чтобы совпасть с лоадаутом инспектируемого игрока,
используя только предметы, которыми копирующий уже владеет. Проверки
перед подтверждением:
- Если инспектируемый игрок другого класса, сначала показать предупреждающий попап; игрок может отменить.
- Скиллы, которыми копирующий не владеет, перечисляются в сводке после копирования; соответствующие слоты скиллов остаются пустыми.
- Предметы, которыми копирующий не владеет, оставляются в инспектируемом слоте («без изменений») и также перечисляются.
- Копирование билда не выдаёт никаких предметов или скиллов; это чисто операция переэкипировки на том, чем копирующий уже владеет.
Для себя Экран героя показывает:
- Кастомизация — открывает пикер скина модели / фона.
- Скиллы — открывает существующий менеджер скиллов.
- Сменить класс — открывает существующий флоу смены класса с его текущими ограничениями.
Кастомизация¶
Плоский редактор с вкладками-категориями. Категории V1:
- Изображение аватара (выбирается из существующего пула аватаров + любых разблокированных платных аватаров)
- Рамка аватара (видна вокруг аватара везде, где он рендерится, а не только в профиле — список друзей, чат, лидерборд, баннер арены)
- Фон карточки профиля (виден на попапе карточки)
- Фон Экрана героя (виден на полноэкранном виде)
- Скин модели (только-чтение ссылка на существующую систему скинов)
Каждая категория — это инвентарь разблокированных косметических предметов. Касание одного показывает превью; «Применить» коммитит его. «Применить» никогда не стоит валюты — покупка происходит выше по флоу в Shop / Offers / Progress Pass.
Статус¶
Короткий текст, написанный игроком. Ограничения:
- Кап длины (настраивается дизайнером; текущее намерение ≤ 150 символов).
- Тот же конвейер модерации, что используется
SetUsername. - Кулдаун смены (предлагается 1 час), чтобы разочаровать спам-флиппинг абьюз.
- Статус по умолчанию пустой для новых аккаунтов; пустой статус рендерится как бледный плейсхолдер, а не пустая строка.
Сравнение¶
Сравнение — это дифф статов и лоадаута, а не симуляция боя. Сравниваемые поля:
- Мощь (дельта).
- Каждый отслеживаемый боевой стат (HP, урон, крит и т.д.) — дельта и процентная дельта против себя.
- Экипированные скиллы — визуально side-by-side; идентичные скиллы серые, уникальные подсвечены.
- Экипированные предметы — визуально side-by-side; показаны редкость и уровень.
- Питомцы — лидер + поддержка.
Сравнение никогда не раскрывает приватный инвентарь; оно инспектирует только то, что цель экипировала.
Копирование билда¶
Операция Копирования билда:
- Сервер получает запрос на копирование с ID инспектируемого персонажа.
- Сервер читает текущие экипированные скиллы, предметы и питомцев инспектируемого игрока (из публичного состояния).
- Сервер вычисляет максимальное подмножество этого лоадаута, которым копирующий владеет.
- Сервер применяет новую конфигурацию экипировки для копирующего одной атомарной операцией.
- Ответ включает список скиллов/предметов, которых не было у копирующего, чтобы UI мог показать сводку «недостающие слоты».
Небольшой дневной кап на операции Копирования билда (настраивается дизайнером) предотвращает скрапинг / гриф.
Блокировка¶
Блокировка применяется симметрично и единообразно:
- Оба игрока убираются из списка друзей друг друга, если были друзьями.
- Все входящие чат / приватные сообщения от заблокированного игрока скрываются для блокирующего.
- Запросы в друзья, приглашения в пати, отправка подарков и предложения вассалитета от заблокированного игрока отклоняются на стороне сервера.
- Профиль / экран героя блокирующего по-прежнему публично видим (мы не скрываем записи лидерборда); заблокированные игроки могут по-прежнему видеть блокирующего, они просто не могут взаимодействовать.
Разблокировка требует шага подтверждения и rate-limit'ится (чтобы разочаровать абьюз «блок-как-переключатель»).
Прогрессия / экономика¶
У Профиля нет своей прогрессии мощи. Это поверхность, на которой отображается прогрессия других систем и на которой аккумулируется косметическая прогрессия.
- Мощь и Класс рендерятся, не двигаются.
- Ранг арены рендерится из текущего сезона арены.
- Косметический инвентарь растёт со временем через:
- Награды туториала / квестов (начальный аватар + 1 стартовая рамка).
- Ярусы Progress Pass (рамки, фоны на milestone-ярусах).
- Покупки в Shop (платные рамки, фоны, премиум-аватары).
- Offers / event-бандлы (косметические сеты ограниченного времени).
- Достижения (например, «Достичь Diamond арены» → уникальная рамка).
- Бонд (между парами друзей) — уже спроектирован в
gd/friends.md, рендерится на Карточке профиля друга как индикатор прогресса.
Задействованные валюты — существующие (мягкая / твёрдая). Косметические предметы живут в новой категории «Косметический инвентарь», но переиспользуют конвейер доставки бандл / шоп.
Кривая, которую мы хотим: совершенно новый игрок видит пустую вкладку Кастомизации с 1 стартовым аватаром + 1 дефолтной рамкой; к моменту, когда он доходит до Главы 2, у него есть хотя бы одна альтернативная рамка из Progress Pass; к моменту, когда он попадает в Арену, он видит платные косметические предметы в слотах Shop, нацеленные на «я хочу, чтобы моя карточка арены выглядела отличительно». Конкретные числа ярусов принадлежат GDD Progress Pass и Shop.
UX¶
Экраны и состояния¶
- Главный HUD → касание своего аватара → попап Карточки профиля (себя).
- Любой список → касание любого аватара → попап Карточки профиля (другого).
- Карточка профиля → Открыть Экран героя → полноэкранный Экран героя.
- Экран героя → назад → предыдущий экран (не карточка).
- Экран героя (другого) → Сравнить → модальная панель side-by-side; назад возвращает к Экрану героя.
- Экран героя (другого) → Скопировать билд → confirm-модал → модал результата с предупреждениями о недостающих скиллах / предметах.
- Карточка профиля (себя) → Кастомизация → полноэкранный косметический редактор с вкладками категорий и живым превью.
- Карточка профиля (себя) → Изменить статус → модал текстового ввода с счётчиком символов, фидбэком модерации, состоянием блокировки кулдауна.
- Карточка профиля (себя) → Настройки аккаунта / Друзья → существующие экраны.
- Карточка профиля (другого) → Заблокировать → confirm-модал с опциональным полем комментария жалобы; Отмена / Заблокировать / Пожаловаться и заблокировать.
Состояния¶
- Загрузка — карточка и экран героя забирают состояние при открытии; показать скелет-плейсхолдеры, никогда пустой попап.
- Устарело — если данные старше нескольких секунд, рефреш при фокусе.
- Оффлайн цель — индикатор онлайна показывает бакет «последний раз видели»; Сообщение и Отправить подарок по-прежнему работают (доставляются асинхронно по существующему поведению чата / подарков).
- Заблокированная цель — Карточка профиля показывает игрока как заблокированного; все кнопки действий, кроме «Разблокировать» и «Закрыть», задизейблены. Мы не скрываем их карточку — игрок попросил заблокировать их, он должен иметь возможность снова их найти, чтобы разблокировать.
- Сам-как-другой — если deeplink резолвится в мой собственный ID, направить на вариант self-карточки, а не на вариант other-карточки.
Анимация¶
- Открытие/закрытие карточки — короткий slide+fade, без резкого щелчка.
- Вход на Экран героя — наезд камеры на модель персонажа, чтобы экран ощущался «кинематографичным» в первый раз (Экран героя задуман прославлять персонажа; плоскость тратит слот впустую).
- Панель Сравнения — slide-in сбоку.
- Подтверждение Копирования билда — явный тост «Лоадаут обновлён» со сводкой недостающих предметов.
Локализация и доступность¶
- Все статические строки локализованы.
- Текст статуса — пользовательский контент, не локализуется.
- Имена классов, имена лиг, имена валют используют существующие i18n ключи.
- Числовые значения используют форматирование, учитывающее локаль.
- Палитра, безопасная для дальтоников, для подсветки диффа Сравнения.
Визуальная идентичность¶
- Карточка профиля — холст игрока. Слот фона — основная поверхность выражения; рамка аватара — вторичная. Форма карточки и раскладка остаются согласованными, чтобы рамки/фоны оставались читаемыми.
- Экран героя — холст персонажа. Слот фона задаёт настроение (например, туманный лес для ностальгии главы 1, огненный трон для топа арены). Композиция камеры оставляет персонажа читаемым на любом фоне.
- Рамки — рендерятся в нескольких размерах, поскольку аватар появляется во многих местах (верхний левый HUD ≈ малый, строка чата ≈ крохотный, лидерборд ≈ малый, карточка профиля ≈ средний). Всё арт рамок должен быть авторизован в самом большом размере и чисто даунскейлиться.
- VFX — рамки высокого тира могут иметь idle-партиклы (тонкие). Анимированные фоны зациклены, дешёвые, никогда не провоцирующие эпилепсию.
Скоуп¶
В V1:
- Попап Карточки профиля, варианты self и other.
- Полноэкранный Экран героя, варианты self и other.
- Достижимость с каждой существующей поверхности аватара (верхний левый HUD, список друзей, чат, пати, арена, лидерборд, вассалы, отправитель подарка, отправитель письма).
- Все перечисленные действия: Сообщение, Друг, Открыть Экран героя, Отправить подарок, Заблокировать, Настройки аккаунта, Друзья, Кастомизация, Изменить статус, Сравнить, Скопировать билд, Скиллы, Сменить класс.
- Строка статуса с модерацией и кулдауном.
- Косметические категории: аватар, рамка аватара, фон карточки профиля, фон экрана героя. Стартовый инвентарь: существующий пул аватаров + 1 дефолтная рамка + 1 дефолтный фон карточки + 1 дефолтный фон героя.
- Block применяется единообразно к чату, запросам в друзья, приглашениям
в пати и отправке подарков (закрывает текущий разрыв
gd-generated/social.md, где подарки игнорируют блок). - События аналитики для каждого взаимодействия (открытие / кастомизация / правка статуса / друг / блок / сравнение / копирование билда / смена класса).
Отрезано / отложено:
- Кланы / гильдии: рендерить плейсхолдер-слот «нет клана»; полная интеграция кланов отгружается с фичей Кланов.
- Полный гардероб скинов (глубокая косметическая система по многим слотам): ссылается только существующая система скинов. Косметика, введённая Профилем, ограничена аватаром / рамкой / фоном карточки / фоном героя.
- Анимированные аватары / видео профиля: отложено.
- Реакции профиль-к-профилю (лайки / эндорсменты): отложено.
- Публичная витрина (последние достижения): отложено на более позднюю фичу «Витрина».
- Имитация боя в Сравнении («победил бы я их»): отложено — V1 это только дифф статов и лоадаута.
- Баннер клана / лидерборда, смонтированный на фон Экрана героя: отложено на кланы.
ТЗ / тех-спека¶
Не реализация — только то, что должно существовать, чтобы продукт + платформа могли построить фичу.
Форма конфига¶
Новая секция profile в GameConfig, содержащая только тюнаблы:
status_max_lengthstatus_change_cooldown_seccopy_build_daily_caponline_indicator_buckets— список (секунды-с-последнего-онлайна, ключ отображения) порогов для индикатора онлайна по бакетамdefault_cosmetic_ids— стартовый аватар, рамка, фон карточки, фон героя, выдаваемые при создании аккаунта
Новая конфиг-категория cosmetics, содержащая записи на каждый
косметический предмет:
id,category(Avatar | AvatarFrame | CardBackground | HeroBackground), отображаемое i18n-имя, тег редкости (для UI-сортировки), ссылка на ассет превью- Опциональный тег
source(ярус Progress Pass, Достижение, Shop SKU, Default) для UI-подзаголовков вроде «Получено за Diamond арены»
Косметика — это контент, а не баланс — она организована по категориям
и живёт рядом со skins. В этом конфиге нет per-level таблиц стоимостей;
прайсинг живёт в конфигах Shop / Offers / Progress Pass.
Бэкенд (концептуально)¶
Фича профиля в основном — поверхность чтения-и-рендера; большая часть нижележащего состояния уже существует. Новые вещи, которые должны существовать:
- Проекция
CharacterProfile— каноническая «забрать профиль для любого персонажа» полезная нагрузка, собираемая из существующего состояния персонажа (юзернейм, аватар, класс, мощь, ранг арены, сюзерен, вассалы, бакет онлайна, экипированная косметика, статус). Один серверный эндпойнт, принимает id персонажа, возвращает снапшот профиля. Варианты self и other гейтят редактируемые поля одной и той же полезной нагрузки. - Проекция
CharacterHeroLoadout— экипированные скиллы, предметы, питомцы, статы. Та же форма используется Сравнением и Копированием билда. Существующие essences уже моделируют части; проекция — это новая композиция. - Новые события / sync-события: установить статус, применить косметику, скопировать билд, открыть приватный чат из профиля, отправить запрос в друзья из профиля, заблокировать / разблокировать, пожаловаться-и-заблокировать. Каждое следует существующему паттерну sync-события клиент→сервер; полезные нагрузки валидируются на стороне сервера.
- Block должен расшириться на отправку подарков. Существующее событие
SetCharacterBlockedостаётся; обработчик отправки подарков должен консультироваться со списком блока, прежде чем списать с отправителя. (Это закрывает дрейф, отмеченный вgd-generated/social.md.) - Владение косметикой отслеживается на персонажа (мапа
cosmetics_ownedcosmetic-id → bool) и указатель «экипированная косметика на слот». Выдачи приходят из существующих конвейеров доставки бандл / квест / progress-pass. - Статус: новое персистентное поле на персонаже (
status_text,status_changed_at) с вызовом модерации на запись и проверкой кулдауна. - Копирование билда: серверная вычисление. Входы: id копирующего, id цели. Выход: новый экипированный набор + сводка недостающих предметов. Атомарно; эмиттит те же per-slot equip-события, что использует существующий флоу экипировки.
- Дневной счётчик
copy_build_uses, сбрасываемый на стандартном дневном сбросе. - События аналитики для всех взаимодействий (открытие self / открытие other / правка статуса / кастомизация / друг / блок / сообщение / отправка подарка / сравнение / копирование билда / смена класса).
UI / Unity / арт¶
Что должно быть построено:
- Префаб попапа Карточки профиля — варианты self и other со всеми перечисленными полями и слотами для косметической рамки + фона.
- Сцена Экрана героя — viewport модели персонажа, слот анимированного фона, баннер класса, виджет мощи, сетка скиллов, виджет экипировки, виджет питомцев, подэкран статов, кнопки действий.
- Модал Сравнения — side-by-side статы + дифф лоадаута, палитра, безопасная для дальтоников.
- Модалы подтверждения + результата Копирования билда.
- Редактор Кастомизации — вкладки категорий (аватар / рамка / фон карточки / фон героя), список инвентаря, viewport превью, кнопка Применить.
- Модал ввода Изменения статуса — счётчик символов, фидбэк модерации, состояние блокировки кулдауна.
- Модал подтверждения Блокировки — Отмена / Заблокировать / Пожаловаться и заблокировать, опциональное поле комментария жалобы.
- Виджет аватара — должен поддерживать рамки в малом / среднем / крупном размерах; каждая существующая поверхность аватара в игре должна принять его, чтобы рамки везде рендерились корректно.
- Арт-доставки: стартовый набор аватаров (существующий), 1 дефолтная рамка, 1 дефолтный фон карточки, 1 дефолтный фон героя, плюс достаточно платных косметических предметов для V1-слотов Shop / Progress Pass (объём принадлежит GDD этих фич, не этой).
- VFX: тонкие партиклы для премиум-рамок; зацикленные ambient-VFX для платных фонов героя.