14 KiB
14 KiB
Vanguard ReMaster — состояние сессии
Дата: 2026-10-22
HEAD: см. git log -1
Коротко: сервер готов, клиент — рабочий каркас с 3D-сценами.
Правила работы
- Ответы короткие, без повторов и длинных вступлений — экономия токенов.
- Любое сомнение/вопрос — диалог: 2–4 варианта с рекомендацией, выбор за пользователем (или его свободный ответ). Не угадывать.
- Полный свод правил —
AGENTS.md.
Сервер
- .NET 10 / ASP.NET Core, EF Core, PostgreSQL, Redis, опциональный Orleans.
- Реализовано: auth/JWT, онбординг, коллекция, колоды, магазин, экономика, матчмейкинг, WebSocket-матч, история, реплеи.
- Orleans включается
Orleans:Enabled; в compose включён. Один silo, in-process реестр соединений. - Тесты: 138 правил + 45 серверных, CI зелёный.
- Стенд:
http://192.168.31.158:18080,/health→ ok. - Документация:
docs/server-api.md,docs/protocol.md,docs/game-rules.md,docs/HANDOFF.md.
Клиент
- Unity 6000.6.6f1, URP; проект в
client/. - Пакеты: URP, Input System, Addressables, Localization, Newtonsoft.Json, VContainer (OpenUPM).
- Визуальное направление: 3D, отдельные сцены-экраны:
Login,Lobby,DeckBuilder,Battle.DeckBuilderсовмещает коллекцию и колоды;Boot— стартовая служебная сцена;VanguardAppперсистентный. - Переходы —
SceneFlow; очередь/онбординг — оверлеи Lobby. - 3D-окружение сейчас из примитивов (
SceneEnvironment): камера, свет, пол, тематические кубы. UI — code-generated uGUI, пока gray-box. - Login: тёмный неон + 3D-карточный стол, форма по центру на полупрозрачной панели.
- Сервисы:
ApiClient,AuthService,MetaService,TokenStore,PlayerState,GameConnection. - Работает: логин/регистрация/refresh, онбординг, коллекция с разбором,
декбилдер в духе HS (список колод справа, карточная сетка коллекции,
фильтры в оверлее, сортировка клан→ранг→имя, редактор с вертикальным
списком карт колоды и статистикой по рангам/общему числу),
магазин (бустер/триал-дека), история матчей и реплей, очередь,
WebSocket-матч (snapshot, интенты, маллиган, сдача,
GameFinished), таймер, результат. - Декбилдер:
DeckBuilderView; каталог метаданных —GET /api/cards(grade, trigger, clan, rarity, printing, power/shield/type, текст способности), клиент объединяет с коллекцией. Изображения карт — реальные арты изResources/CardArt(124/124), с процедурным fallback по цвету клана. - ПКМ по карте — оверлей с картой, способностями, разбором в пыль и крафтом; SP/TD не разбираются и не крафтятся.
- Локализация RU/EN:
Loc+LocalizedText; переключатель в Login и Lobby (кнопкаEN/RU), выбор сохраняется вPlayerPrefs. Русские строки остаются ключами, переводятся и статические, и динамические подписи; имена/тексты карт берутся изnameRu/nameEnиtextRu/textEn. - Тренировка с ботом: кнопка «С ботом» в редакторе колоды; сервер
создаёт casual-матч против случайного бота (
POST /api/game/practice), без истории, MMR и наград. - Боевой экран: поле, рука и стопки — 3D (
GameBoard3D), HUD/кнопки остаются uGUI. Карты — тонкие 3D-объекты с артом, рубашкой, торцом и коллайдером. Rest (атака/поддержка) — поворот по часовой стрелке вокруг Y, урон лежит на боку против часовой; закрытость — переворот вокруг X. Рубашка — стандартная VF Vanguard (Resources/CardArt/vanguard_back.png), общая для 2D и 3D. Рука закреплена в поле зрения камеры снизу по центру и всегда смотрит на игрока, а не лежит на столе. Камера фиксирована над полем под небольшим углом и не двигается игроком. Драг-н-дроп на плоскость стола с подсветкой целей и плавным снапом. - Поле: у каждого игрока два ряда
R V R/R R R(V + 5 RC), у противника зеркально; между полями общий круг защиты; душа — стопка под V; колода, дроп и урон — 3D-стопки/карты. Локальный игрок всегда снизу, даже если он за вторым местом. Карты в кругах V/R принудительно показываются лицом вверх. - Статистика карт — отдельное UI-наложение: своя панель снизу слева, противника — сверху справа. Кнопка «Душа: n» в верхней панели и клик по стопке души открывают список карт души.
- Зона урона: карты лежат открытыми и на боку; после Counter Blast выбранная карта переворачивается рубашкой. Heal выбирает карту урона; Counter Blast — открытую карту до активации способности.
- Маллиган: один раз на игрока, оба игрока; выбранные карты уходят в низ колоды, добираются новые, затем shuffle. Клик по руке выбирает карты.
- Анимации: event-фидбек (атака, guard, drive, урон, retire, heal) поверх стола, не блокирует ввод; очередь событий + кнопка «Пропустить анимации». 3D-карты плавно снапятся, поворачиваются в Rest и переворачиваются; подсветка целей и точки броска обновляются на каждом снимке.
- Реальные арты:
imageKeyиз/api/cards+CardImageServiceищетResources/CardArt/{imageKey}. Скачаны все 124 арта. Импорт:tools/import_card_art.py. - Взаимодействие в бою: клик по картам/зонам, подсветка целей, группировка действий (карты → цели, глобальные кнопки отдельно), выбор силы/эффекта триггера, журнал последних событий. Позванные rear-guard'ы входят в стоячем положении; rest — только после атаки/буста. В первый ход атака запрещена; первый игрок определяется сидом.
- Отдельная сцена
CollectionиCollectionViewудалены; коллекция открывается из Lobby кнопкой «Коллекция» (сценаDeckBuilder). - Не готово: 3D-модели карт/стола (пока процедурные примитивы и арты), звук, настройки (язык уже есть), DOTween, drag&drop и live-валидация декбилдера. Камера боя фиксирована; анимации retire/ghost для 3D-карт ещё не перенесены.
Запуск
Сервер (на ssh home):
cd ~/VanguardReMaster
docker compose up -d --build
curl http://127.0.0.1:18080/health
Клиент:
- Unity Hub →
client, редактор 6000.6.6f1. - Открыть
Assets/Scenes/Boot.unity, Play. - Стенд по умолчанию —
http://192.168.31.158:18080.
Проверки клиента
# EditMode
& 'C:\Program Files\Unity\Hub\Editor\6000.6.6f1\Editor\Unity.exe' `
-batchmode -nographics -projectPath client `
-runTests -testPlatform EditMode -testResults client\TestResults.xml
# Boot → Login + 3D environment
& 'C:\Program Files\Unity\Hub\Editor\6000.6.6f1\Editor\Unity.exe' `
-batchmode -nographics -projectPath client `
-executeMethod Vanguard.Editor.SceneSmoke.Run
# 3D playmat sandbox
& 'C:\Program Files\Unity\Hub\Editor\6000.6.6f1\Editor\Unity.exe' `
-batchmode -nographics -projectPath client `
-executeMethod Vanguard.Editor.SceneSmoke.RunPlaymat
Клиентские проверки: 18/18 EditMode (сборка всех экранов, импорт арта,
перевод статических/динамических строк, live-переключение языка, рендер
3D-доски с уроном и отдыхающей картой, геометрия поля, правила
перемещения, рука в поле зрения камеры), SCENE_SMOKE success=True,
PLAYMAT_SMOKE success=True cards=20 hand=5/5 fieldVisible=True.
SceneSmoke заменяет PlayMode-тест загрузки сцен: Single-загрузка сцены
ломает стандартный PlayMode test runner. SceneBuilder пересобирает сцены:
& '...\Unity.exe' -batchmode -nographics -projectPath client `
-executeMethod Vanguard.Editor.SceneBuilder.BuildAll
Ключевые файлы клиента
client/Assets/Vanguard/Runtime/App/
VanguardApp.cs composition root, персистентный
SceneFlow.cs переходы Login/Lobby/DeckBuilder/Battle
SceneEnvironment.cs 3D-фон сцен
SceneControllerBase.cs
LoginSceneController.cs
LobbySceneController.cs
DeckBuilderSceneController.cs
BattleSceneController.cs
client/Assets/Vanguard/Runtime/UI/
LoginView.cs MetaView.cs OnboardingView.cs
DeckBuilderView.cs QueueView.cs BattleView.cs
UiKit.cs Localization.cs
client/Assets/Vanguard/Runtime/Board3D/
Config/PlaymatLayoutConfig.cs ScriptableObject-раскладка
Data/BoardTypes.cs зоны, круги, CardState3D, refs
Logic/PlaymatLayout.cs геометрия, рука, поиск цели броска
Logic/BoardPlacementRules.cs Ride/Call/Move/Guard
View/GameBoard3D.cs стол, круги, пул карт, drag&drop
View/Card3D.cs карта: лицо/рубашка/торец, Rest, флип
PlaymatSandbox.cs демо без сервера
client/Assets/Vanguard/Resources/CardArt/vanguard_back.png рубашка VF
client/Assets/Vanguard/Scenes/GameBoard3D.unity песочница поля
client/Assets/Vanguard/Runtime/Battle/GameConnection.cs
client/Assets/Vanguard/Runtime/Api/ApiClient.cs + ApiContracts.cs
client/Assets/Vanguard/Editor/SceneBuilder.cs + SceneSmoke.cs
client/Assets/Vanguard/Scenes/*.unity
client/Assets/Plugins/Vanguard.Shared + MessagePack
Решения
- 3D-визуал, отдельные сцены; подробно —
docs/client-visual-direction.md. Bootне показывается;VanguardApp/сервисы не пересоздаются.- Очередь — оверлей Lobby; DeckBuilder «В бой» возвращает в Lobby с
выбранной колодой в
SceneFlow.PendingQueueDeck. - Токены в
PlayerPrefs— dev; для релиза защищённое хранилище. - HTTP разрешён только для dev (
insecureHttpOption: 2); для релиза HTTPS. GameConnectionиспользуетSystem.Net.WebSockets.ClientWebSocket(Windows/десктоп first); WebGL потребует другого транспорта.- Сервер авторитарный; клиент отправляет только интенты, скрытые данные не покидают сервер.
Следующие шаги
- Декбилдер: drag&drop, счётчики лимитов, live-валидация, пресеты.
- 3D-наполнение: модели карт/стола, prefab-экраны, анимации retire/ghost.
- Звук и настройки, DOTween.
- Лаунчер WPF.
Тренировка с ботом и боевой UI с артами/анимациями/локализацией уже есть.
Подводные камни
- Не запускать
dotnet/Docker на рабочем ПК; сервер проверяется наssh home. - В Unity нельзя открыть два экземпляра одного проекта: для batch-проверок
делать копию проекта (без
Library) или закрывать редактор. - Сцены ссылаются на скрипты по GUID; при копировании сцен копировать и
.metaконтроллеров. Vanguard.Shared.dll— netstandard2.1 + MessagePack 3.1.12; при изменении протокола пересобрать DLL и заменить вclient/Assets/Plugins.UiKit.CreateCanvasпо умолчанию не персистентный: Canvas принадлежит сцене; EventSystem остаётся персистентным.- Сцена
Bootдолжна быть первой в Build Settings; сейчас тамBoot,Login,Lobby,DeckBuilder,Battle.