diff --git a/docs/Development/IMPLEMENTATION_PLAN.md b/docs/Development/IMPLEMENTATION_PLAN.md index 3c343fd..0dc6446 100644 --- a/docs/Development/IMPLEMENTATION_PLAN.md +++ b/docs/Development/IMPLEMENTATION_PLAN.md @@ -44,6 +44,7 @@ | TASK-2026-021 | `[!]` | Login по референсу: 2D-арт и неоновый UI | DeepSeek: C1–C9, Tab/Enter/Esc; ждёт приёмки | EditMode 60/60; `SCENE_SMOKE success=True`; standalone собран; ручная — пользователь | | TASK-2026-022 | `[!]` | Lobby по референсу: дашборд, заглушки, сцена Community | DeepSeek: C1–C11 реализованы; ждёт ручной приёмки | EditMode 62/62; `SCENE_SMOKE`, `PLAYMAT_SMOKE`, standalone; ручная — пользователь | | TASK-2026-023 | `[!]` | DeckBuilder: один экран, мультифильтры и список колоды | DeepSeek: C1–C11 реализованы; ждёт ручной приёмки | EditMode 67/67; `SCENE_SMOKE`, `PLAYMAT_SMOKE`; ручная — пользователь | +| TASK-2026-024 | `[ ]` | DeckBuilder по референсу: топбар Lobby, крупные карты, фильтры | DeepSeek: анализ и план готовы; реализация ожидает | не выполнена | Новые задачи добавляются в конец файла отдельными разделами. Не используй один раздел для нескольких независимых задач. @@ -2563,8 +2564,233 @@ HUD с номером хода и фазовой шкалой, компактн - **Замечания:** граница иллюстрации 0.59 подобрана по BT01/TD01 (350×511); при другом макете карты константу нужно проверить. Правка имени колоды помечает колоду как несохранённую. +- **Продолжение:** визуальная компоновка переработана по референсу в + `TASK-2026-024` (топбар Lobby, крупные карты, фильтры в оверлее). + Логика фильтров, группировки и валидации переиспользуется. - **Skill обновлён:** не требуется. -- **Git:** не коммитилось. +- **Git:** `ecb7314`. + +--- + +### TASK-2026-024 — DeckBuilder по референсу: топбар Lobby, крупные карты, фильтры + +- **Статус:** `[ ]` +- **Создано:** 2026-11-01 +- **Анализ:** DeepSeek выполнен (референс DeckBuilder от 2026-11-01) +- **Реализация:** не начата +- **Проверка:** не выполнена +- **Затронутые системы:** `LobbyView`, новый `PlayerTopBar`, + `HamburgerMenu`, `DeckBuilderView`, `DeckBuilderSceneController`, + `CardImageService`, `DeckListFilter`, `Localization`, EditMode-тесты. + Сервер, правила и контент не меняются. + +#### A. Цель и требования + +Привести DeckBuilder к композиции референса, сохранив логику +`TASK-2026-023` (фильтры, группировка, live-валидация): + +1. **Топбар как в Lobby**: аватар, ник, MMR, сезон, `Rating` и `Community` + неактивны, `Menu` — язык, версия, адрес сервера, история, «В лобби», + «Выйти». +2. **Без вкладок** Collection/Deck Builder — это элемент референса, не + функция. +3. **Коллекция — крупные карты со скроллом** (6 в ряд): номер грейда, + иллюстрация, плашка имени поверх, строка количества, камень редкости. + Пагинации нет. +4. **Режим просмотра:** карты коллекции только смотрят, крафтят и + разбирают; ЛКМ по карте ничего не делает, ПКМ открывает карточку. + В этом режиме под картой — «есть ×N». +5. **Режим колоды:** при выборе колоды справа появляется её состав, + добавление/удаление включается; ЛКМ по карте коллекции добавляет + копию, ПКМ — карточка. Под картой — «в колоде ×N · есть ×M». +6. **Список колод**: кнопка `+ Новый набор`, строки с эмблемой клана, + именем, `N/50` и `T N/16`, кебаб-меню (открыть/удалить), подсветка + выбранной. +7. **Фильтры — в модальном оверлее:** мультивыбор клана, грейда, + триггера и **редкости (C/R/RR/RRR/SP)**, плюс поиск по названию; + «Сбросить», «Отмена», «Применить», сводка в шапке. +8. Визуальный язык — неоновые панели/свечение/фаски из `NeonUi`, как в + Login и Lobby. + +Ограничения: + +- сервер, правила, протокол и контент не меняются; +- 3D-окружение сцены DeckBuilder не трогаем; +- сохранение/создание/удаление/крафт/разбор сохраняют поведение; +- Lobby не должен визуально измениться после выноса топбара; +- ручная приёмка — пользователь. + +Критерии готовности: + +- DeckBuilder открывается с топбаром Lobby и меню, «В лобби» работает; +- в режиме просмотра клик по карте не добавляет её в колоду; +- после выбора колоды справа состав, ЛКМ добавляет, клик по строке + состава убирает; +- крупные карты не растянуты, имя и количество читаются, скролл плавный; +- мультифильтры + редкость + поиск реально фильтруют и отражаются в + сводке; +- EditMode и смоуки проходят. + +#### B. Текущее состояние + +- `DeckBuilderView` (`ecb7314`) — один экран со своим топбаром (назад, + заголовок, сводка, фильтры, сброс), коллекция 174×238 с + `ApplyIllustration`, правая панель 380 px со списком колод и составом. +- Клик по карте коллекции всегда добавляет копию (в обоих режимах). +- Фильтры — модальный оверлей без редкости и поиска. +- Топбар Lobby реализован внутри `LobbyView` (`TopBar`, `AddTopAction`), + меню — `HamburgerMenu`. +- `LobbyView` показывает аватар-инициалы, ник, MMR, сезон, Rating, + Community и гамбургер. +- `DeckBuilderSceneController` резолвит только `MetaService`/`AuthService`. + +Что сохранить: + +- `DeckListModel`/`DeckFilter`/`DeckValidation` и тесты; +- `CardImageService.ApplyIllustration`; +- правую панель со списком колод/составом и live-валидацию; +- крафт/разбор и ПКМ-карточку; +- Lobby: расположение и поведение элементов после выноса топбара. + +#### C. Чек-лист изменений + +- [ ] **C1. `CREATE` `Runtime/UI/PlayerTopBar.cs`; `MODIFY` + `LobbyView.cs`.** + - Вынести из `LobbyView` топбар: аватар, ник, MMR, сезон, две кнопки, + гамбургер; подписка на `PlayerState`; меню `HamburgerMenu`. + - Конструктор принимает `onRating`, `onCommunity`, `onHistory`, + `onLobby`, `onLogout`; `null` для действия = кнопка disabled. + - `LobbyView` использует компонент без визуальных изменений. + - `HamburgerMenu`: пункт «В лобби» при `onLobby != null`. + - Реализация: не выполнена. Проверка: не выполнена. + - Зависит: нет. + +- [ ] **C2. `MODIFY` `Runtime/App/DeckBuilderSceneController.cs`.** + - Резолвить `PlayerState`/`AppConfig`; создать `PlayerTopBar` с + `onRating: null`, `onCommunity: null`, «В лобби» → Lobby. + - Реализация: не выполнена. Проверка: не выполнена. + - Зависит: C1. + +- [ ] **C3. `MODIFY` `DeckBuilderView` — каркас.** + - Убрать собственный топбар; тело начинается под `PlayerTopBar`. + - Сохранить панели `DeckListPanel`/`DeckPanel`, статус под коллекцией. + - Реализация: не выполнена. Проверка: не выполнена. + - Зависит: C1, C2. + +- [ ] **C4. `MODIFY` сетка коллекции.** + - `GridLayoutGroup` 6 колонок, ячейка ≈216×286, вертикальный скролл без + пагинации. + - Ячейка: иллюстрация `ApplyIllustration` (216×182), номер грейда в + углу, плашка имени поверх низа иллюстрации, строка количества, + камень редкости. + - ЛКМ в просмотре ничего не делает; ПКМ — карточка; в режиме колоды + ЛКМ добавляет, ПКМ — карточка. + - Количество: «есть ×N» / «в колоде ×N · есть ×M». + - Реализация: не выполнена. Проверка: не выполнена. + - Зависит: C3, C5. + +- [ ] **C5. `MODIFY` режимы просмотра и колоды.** + - `_editing == null` — просмотр: панель колод, добавление выключено; + нажатие на колоду открывает состав и включает добавление. + - «К списку колод» возвращает просмотр (несохранённые изменения + отбрасываются; предупреждение — отдельный пункт при необходимости). + - Реализация: не выполнена. Проверка: не выполнена. + - Зависит: C3. + +- [ ] **C6. `MODIFY` список колод по референсу.** + - Кнопка `+ Новый набор` (полная ширина). + - Строка: эмблема клана (процедурная, цвет клана), имя, `N/50 · + T N/16`, бейдж валидности точкой/цветом; кебаб-меню «Открыть / + Удалить». + - Подсветка открытой колоды. + - Реализация: не выполнена. Проверка: не выполнена. + - Зависит: C3. + +- [ ] **C7. `MODIFY` фильтры.** + - `DeckFilter`: добавить `Rarities` (C/R/RR/RRR/SP) и `Search`. + - Оверлей: поиск, чипы редкости, клан/грейд/триггер; «Сбросить», + «Отмена», «Применить»; сводка включает редкость и поиск. + - `DeckListModel`/`DeckFilter` остаются чистыми и тестируемыми. + - Реализация: не выполнена. Проверка: не выполнена. + - Зависит: C3. + +- [ ] **C8. `MODIFY` `Localization.cs`** — «В лобби», «Новый набор», + «Поиск по названию», «Редкость», «есть», «в колоде», «Открыть», + «Ещё», названия редкостей. + - Реализация: не выполнена. Проверка: не выполнена. + - Зависит: C4–C7. + +- [ ] **C9. `TEST` EditMode.** + - `DeckFilter`: редкость и поиск (регистр, локализованное имя). + - `PlayerTopBar`: создаётся, ник/MMR обновляются, disabled-кнопки при + `null`-действиях. + - UI: `DeckBuilderScreen`, панели, отсутствие добавления в просмотре + (seam), переключение в режим колоды. + - Реализация: не выполнена. Проверка: не выполнена. + - Зависит: C1–C8. + +- [ ] **C10. `VERIFY` EditMode, smoke, standalone.** + - Копия без `Library`; EditMode; `SCENE_SMOKE`; `PLAYMAT_SMOKE`; + standalone. + - Ручная проверка: топбар и меню, крупные карты, скролл, фильтры и + поиск, режимы, добавление/удаление, сохранение, «В бой»/«С ботом». + - Реализация: не выполнена. Проверка: не выполнена. + - Зависит: C9. + +#### D. Последовательность выполнения + +1. C1: `PlayerTopBar` и меню; проверить, что Lobby не изменился. +2. C2–C3: DeckBuilder с топбаром Lobby. +3. C4–C5: крупная сетка и режимы просмотра/колоды. +4. C6: список колод по референсу. +5. C7–C8: фильтры, поиск, локализация. +6. C9–C10: тесты, смоуки, standalone, ручная приёмка. + +#### E. Проверки + +- EditMode в копии без `Library`. +- `SceneSmoke.Run`, `RunPlaymat`, standalone. +- Проверка Lobby после выноса топбара (визуально и смоуком). +- `git diff --check`; нет изменений в `server/`, `content/`, + `Vanguard.Rules`. +- Ручная приёмка — пользователь. + +#### F. Решения и риски + +**Зафиксировано пользователем (2026-11-01):** + +1. Топбар как в Lobby; `Rating`/`Community` неактивны; «В лобби» — в меню. +2. Вкладки Collection/Deck Builder не реализуем. +3. Коллекция — крупные карты, вертикальный скролл, без пагинации. +4. Просмотр: ЛКМ не добавляет, ПКМ открывает карточку. +5. В режиме колоды справа состав, ЛКМ добавляет, клик по строке убирает. +6. Количество: «есть ×N» / «в колоде ×N · есть ×M». +7. Фильтры — всё в оверлее, включая редкость C/R/RR/RRR/SP и поиск. + +**Риски:** + +- **Вынос топбара** затрагивает принятый Lobby: менять аккуратно, + проверять смоук и раскладку. +- **ПКМ-only в просмотре** может быть неочевидным: нужна подсказка + «ПКМ — подробности» в статусе/шапке коллекции. +- **Несохранённые изменения** при возврате к списку теряются; при + необходимости добавить подтверждение отдельным пунктом. +- **Крупные ячейки** уменьшают число видимых карт: скролл должен быть + плавным, без пересоздания пула на каждый кадр. +- **Кебаб-меню** требует отдельного маленького оверлея; не дублировать + существующие меню. +- **Редкости SP** в каталоге есть; если у принтов встретится другая + строка, чип не совпадёт — показывать как есть. + +**Открытых вопросов, блокирующих старт, нет.** + +#### G. Результат + +- **Реализовано:** — +- **Проверки:** — +- **Не завершено/заблокировано:** — +- **Skill обновлён:** — +- **Git:** — diff --git a/docs/SESSION-STATE.md b/docs/SESSION-STATE.md index 1c5aa35..0180745 100644 --- a/docs/SESSION-STATE.md +++ b/docs/SESSION-STATE.md @@ -378,8 +378,10 @@ client/Assets/Plugins/Vanguard.Shared + MessagePack собраны и запущены. **TASK-2026-023 — DeckBuilder (один экран, мультифильтры, список колоды): реализован C1–C11, ждёт ручной приёмки.** EditMode 67/67, `SCENE_SMOKE`, `PLAYMAT_SMOKE`; standalone. - После приёмки — **TASK-2026-019** (загрузочная сцена, fade, кадр без - покадровых аллокаций). + **TASK-2026-024 — DeckBuilder по референсу (топбар Lobby, крупные + карты, фильтры в оверлее): план готов**, реализация — следующим + проходом. После приёмки — **TASK-2026-019** (загрузочная сцена, fade, + кадр без покадровых аллокаций). 2. **TASK-2026-001 — ручная проверка пользователем** (C10): draw, call, ride, move/swap, guard, trigger, drive/damage, retire, search, открытие скрытого урона, рука противника, повторные клики UI во время/после анимации.