12 KiB
12 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 и наград. - Боевой экран: реальный арт на всю карту, рамка по клану, имя, ранг, триггер, сила/крит и рубашка; fallback — процедурная плашка. Rest поворачивает карту на бок.
- Поле: у каждого игрока два ряда
R V R/R R R, слева зона урона (+soul), справа колода и ниже дроп; у противника зеркально; между полями — зона защиты со щитом и проверками. - Зона урона: карты лежат открытыми и на боку; после Counter Blast выбранная карта переворачивается рубашкой. Heal выбирает карту урона; Counter Blast — открытую карту до активации способности.
- Маллиган: один раз на игрока, оба игрока; выбранные карты уходят в низ колоды, добираются новые, затем shuffle. Клик по руке выбирает карты.
- Анимации: event-фидбек (атака, guard, drive, урон, retire, heal) поверх стола, не блокирует ввод; очередь событий + кнопка «Пропустить анимации». Карты въезжают из руки/колоды при call/ride, атакующий и цель пульсируют, ушедшие в дроп карты летят призраком и растворяются.
- Реальные арты:
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-валидация декбилдера.
Запуск
Сервер (на 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
Клиентские проверки: 4/4 EditMode (сборка всех экранов, импорт арта,
перевод статических/динамических строк, live-переключение языка, рендер
доски с уроном и отдыхающей картой), SCENE_SMOKE success=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/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-экраны, камера.
- Звук и настройки, 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.