Document Vanguard rules and implementation gaps
CI / test (push) Successful in 2m15s Details

This commit is contained in:
MpakobecEx 2026-10-22 02:30:02 +05:00
parent c0c00ccc4c
commit 1e0b36bbb8
4 changed files with 375 additions and 2 deletions

View File

@ -158,6 +158,7 @@ dotnet run --project server/src/Vanguard.Cli -- translations check
- `IMPLEMENTATION_CHECKLIST.md` — план реализации по блокам и гейтам.
- `docs/HANDOFF.md` — состояние на конец сессии и порядок следующих шагов.
- `docs/protocol.md` — протокол матча: кадры, интенты, события, таймеры, реконнект.
- `docs/game-rules.md` — конспект правил и сверка с текущей реализацией.
- `docs/server-api.md` — HTTP API: JWT, коллекция, каталог, колоды, магазин, очередь,
история и реплеи.
- `content/cards-mvp.md` — каталог карт с разбором состава сетов.

View File

@ -610,7 +610,7 @@ Battle; Boot и общие сервисы остаются персистент
## 8. Порядок действий в новой сессии
1. Прочитать `docs/SESSION-STATE.md`, `docs/HANDOFF.md`,
`IMPLEMENTATION_CHECKLIST.md`, `README.md`.
`IMPLEMENTATION_CHECKLIST.md`, `README.md`, `docs/game-rules.md`.
2. Прогнать проверки из раздела 3.
3. Следующий блок — клиент: магазин/бустеры в Lobby и история/реплей,
затем полный декбилдер и 3D-наполнение сцен. Сервер и мета-API готовы:
@ -815,3 +815,18 @@ Battle; Boot и общие сервисы остаются персистент
**4/4** (включая рендер доски с уроном и отдыхающей картой);
`SCENE_SMOKE success=True active=Login`; `validate` и
`translations check` — без ошибок.
## 2026-10-22 — конспект правил
- Источник: `https://www.cardfight.ru/avangard-pravila` (редакция 22.05.2019).
- Создан `docs/game-rules.md`: форматы, колода, поле, карта, старт/mulligan,
победа, фазы, бой, триггеры, стоимости, инварианты и отдельная таблица
сверки с текущим кодом.
- Главные расхождения для следующего блока (подробно в файле):
урон сейчас создаётся закрытым, Counter Blast переворачивает его в
обратную сторону; heal требует строго большего урона вместо `>=`;
mulligan перемешивает до добора, допускает повтор и не переключает
второго игрока; нет запрета атаки в первый ход и проверки ровно 16
триггеров; первый игрок всегда 0.
- Classic-режим не включает Stride/Вознесение, Legacy, Gift, Front-триггер
и Grade support.

View File

@ -22,7 +22,7 @@
- Тесты: **135** правил + **45** серверных, CI зелёный.
- Стенд: `http://192.168.31.158:18080`, `/health` → ok.
- Документация: `docs/server-api.md`, `docs/protocol.md`,
`docs/HANDOFF.md`.
`docs/game-rules.md`, `docs/HANDOFF.md`.
## Клиент

357
docs/game-rules.md Normal file
View File

@ -0,0 +1,357 @@
# Cardfight!! Vanguard — конспект правил
**Источник:** [cardfight.ru/avangard-pravila](https://www.cardfight.ru/avangard-pravila)
**Редакция источника:** 22.05.2019
**Назначение:** рабочий справочник для правил, сервера и клиента Vanguard ReMaster.
Это конспект, а не замена официальному тексту. В спорных случаях приоритет у
официальных правил и текста карты. Для проекта используется формат **Classic**
(BT01 + TD01/TD02); правила поздних эр (G, V) отмечены отдельно.
---
## 1. Форматы
| Формат | Что разрешено |
|---|---|
| **Standard** | только карты новой эры с меткой `V` |
| **Premium** | все когда-либо выпущенные карты |
| **G Standard** | карты без метки `V`; существовал до октября 2018 |
| **Classic (проект)** | базовая эра: BT01, TD01, TD02; без Stride, Gift, Legacy |
Перед сборкой колоды формат фиксируется: от него зависят допустимые карты,
механики и правила колоды.
---
## 2. Колода
Основная колода:
- ровно **50 карт**, включая стартового авангарда;
- не более **4 копий** карты с одинаковым **именем** (не по арту и не по
printingId);
- ровно **16 триггер-карт**;
- не более **4 Heal-триггеров**;
- не более **4 стражей** (Sentinel).
Колода наследия (G-эра, не используется в Classic):
- до 16 карт;
- только воины наследия.
Кланы: без отдельной договорённости игрок не может смешивать карты разных
кланов в одной колоде.
---
## 3. Игровое поле
| Зона | Назначение |
|---|---|
| **Основная колода** | закрытая колода; отсюда берутся карты |
| **Кладбище / дроп** | использованные, скинутые и уничтоженные карты |
| **Зона урона** | полученный урон; 6 и более карт — поражение |
| **Круг авангарда** | текущий авангард; карты под ним — душа |
| **5 кругов арьергарда** | по одному воину в каждом |
| **Круг защитников** | временная зона для защитников и перехватчиков |
| **Колода наследия** | G-эра; только воины наследия |
| **Зона ограничений** | используется только способностями, если указано |
Авангард — только верхняя карта круга авангарда. Всё, что под ней, — душа.
Авангард не входит в душу. У арьергарда души нет.
---
## 4. Анатомия карты
| Поле | Значение |
|---|---|
| **Имя** | ограничение 4 копий по имени |
| **Раса** | может использоваться эффектами |
| **Клан** | ограничение состава колоды |
| **Сила** | атака и защита |
| **Щит** | только для защиты/перехвата |
| **Ранг** | 0–4; влияет на призыв, Ride, Drive Check и доступ к способностям |
| **Триггер** | только у карт 0 ранга |
| **Критический удар** | сколько урона получит защищающийся при успешной атаке |
| **Тип** | обычный воин, триггер-воин, воин наследия, страж наследия |
| **Способности** | ACT / CONT / AUTO и текст карты |
Способности ранга:
- **Boost (Поддержка)** — у 0–1 ранга. Стоящий воин в заднем ряду позади
атакующего может уйти в rest; его сила добавляется атакующему до конца
битвы.
- **Intercept (Перехват)** — у 2 ранга. Воин из переднего ряда арьергарда
может переместиться в круг защитников; его щит учитывается в защите, после
боя он уходит в дроп.
- **Twin Drive (Двойная проверка)** — у 3 ранга и некоторых 4 рангов, только
из авангарда; две проверки эффектов.
- **Triple Drive** — только у воинов наследия, из авангарда; три проверки.
---
## 5. Начало игры
1. Каждый игрок выбирает карту 0 ранга и кладёт её **закрытой** в круг
авангарда — это стартовый авангард.
2. Случайно определяется первый игрок. **В первый ход атаковать нельзя.**
3. Оба игрока перемешивают колоду и берут по **5 карт**.
4. **Вторая попытка (mulligan):** игрок может вернуть **любое количество**
карт из руки в низ колоды, взять столько же карт сверху, после чего колода
перемешивается. Используется **не более одного раза за бой**.
5. Оба игрока одновременно переворачивают стартового авангарда лицом вверх.
Игра начинается.
Порядок mulligan важен: сначала возврат в низ, затем добор, затем shuffle.
Возвращённые карты не должны попасть в тот же добор.
---
## 6. Победа и поражение
Игрок проигрывает, если:
- в зоне урона оказалось **6 карт** после разрешения всех способностей;
- в колоде в любой момент не осталось карт;
- авангард исчез, а в душе нет карты для Ride (или игрок не может его
восстановить);
- сработала особая способность, например `Star-vader, "Omega" Glendios`.
Победа не обязательна только через урон: карты могут давать альтернативные
условия.
---
## 7. Фазы хода
### 7.1. Stand (подъём)
Все воины владельца, находящиеся в rest, поднимаются (stand), если эффект или
ограничение не запрещает подъём.
### 7.2. Draw (взятие карты)
Игрок берёт верхнюю карту колоды в руку.
### 7.3. Grade support
Если у авангарда не 3/4 ранг и в руке нет Ride-карты следующего ранга:
- показать руку сопернику;
- посмотреть верхние 5 карт колоды;
- взять одну карту следующего ранга;
- остальные вернуть и перемешать;
- за взятую карту отправить 2 карты из руки в никуда (убрать из игры).
Это правило поздней эры; в Classic-режиме проекта не используется, если не
включено отдельно.
### 7.4. Ride (смена авангарда)
- Карта из руки кладётся поверх авангарда.
- Новый авангард должен быть того же ранга или на 1 выше.
- Старый авангард уходит в душу.
- Ride — **один раз за ход**; можно пропустить.
- Ride не лечит уже полученный урон.
### 7.5. Stride / Вознесение
G-эра, в Classic не используется: выбор воина наследия из зоны наследия,
оплата картами из руки, сердце, возврат в конце хода. В проекте не реализуется
до отдельного решения.
### 7.6. Main (основная фаза)
Разрешено:
- **Call**: призвать воина из руки в пустой круг арьергарда. Ранг воина не
выше ранга авангарда. Количество призывов за ход не ограничено. При призыве
в занятый круг старый воин уходит в дроп.
- **Move**: перемещать арьергард вперёд/назад в пределах своей колонки;
влево/вправо и в круг авангарда нельзя. Два воина в одной колонке могут
меняться местами.
- **Activate**: активировать ACT-способности; AUTO — при выполнении условий.
- **End Main**: перейти в Battle.
Призванные арьергарды входят в **стоячем** положении, если текст карты не
говорит обратное.
### 7.7. Battle (боевая фаза)
1. **Объявление атаки.** Атакующий — стоящий воин **переднего ряда**. Он
уходит в rest. Цель — воин соперника в переднем ряду (или авангард).
2. **Boost.** Стоящий воин 0–1 ранга позади атакующего может уйти в rest;
его сила добавляется атакующему до конца битвы.
3. **Guard.** Защищающийся может призвать защитников из руки. Щит
защитников/перехватчиков добавляется к силе защищающегося до конца битвы.
У воинов 3+ ранга щита нет, кроме стражей наследия.
4. **Intercept.** Воин 2 ранга из переднего ряда арьергарда может выйти на
перехват; его щит учитывается, после боя он уходит в дроп.
5. **Drive Check.** Только если атакующий — авангард. Верхняя карта колоды
раскрывается, показывается обоим, затем уходит в руку. Триггер срабатывает,
если у атакующего есть воин того же клана на поле. У 3 ранга — 2 проверки,
у воинов наследия — 3. Первая проверка разрешается до следующей.
6. **Сравнение силы.**
- сила атакующего **меньше** защищающегося — атака провалилась, урона и
потерь нет;
- сила атакующего **равна или больше** — атака успешна;
- если цель — арьергард, он уходит в дроп, урон не наносится;
- если цель — авангард, защищающийся получает урон, равный **критическому
удару** атакующего.
7. **Damage Check.** Для каждой единицы урона раскрывается верхняя карта
колоды; триггеры могут сработать; затем карта кладётся в зону урона.
8. **Конец битвы.** Защитники и перехватчики уходят в дроп. Если у атакующего
остались стоящие воины переднего ряда, он может атаковать снова.
Число атак за ход не ограничено. После перехода в Battle вернуться в Main
нельзя.
### 7.8. End (конец хода)
Ход переходит сопернику. Эффекты «до конца хода» заканчиваются.
---
## 8. Триггеры
Триггеры срабатывают только при Drive Check и Damage Check. Сила/критический
удар от триггера действуют до конца хода. В Classic используется усиление
**+5000**; в новой эре — **+10000**.
| Триггер | Эффект |
|---|---|
| **Heal** | +5000 одному воину; если у игрока урона не меньше, чем у соперника, можно вылечить 1 урон (карту из урона в дроп) |
| **Critical** | +5000 одному воину и +1 критический удар (можно разным воинам) |
| **Draw** | +5000 одному воину и немедленно взять карту |
| **Stand** | +5000 одному воину и поднять одного отдыхающего арьергарда |
| **Front** | +10000 всем воинам переднего ряда; только новая эра |
Heal: в источнике условие «урона больше либо столько же, сколько у
соперника». То есть равенство уже даёт право лечить.
В Classic Front-триггеров нет. В BT01/TD01/TD02 используются Heal, Critical,
Draw, Stand.
---
## 9. Стоимости способностей
| Стоимость | Что делать |
|---|---|
| **Counter Blast (X)** | перевернуть X карт в зоне урона **лицом вниз** |
| **Soul Blast (X)** | отправить X карт из души в дроп |
| **Counter Charge (X)** | перевернуть X карт в зоне урона **лицом вверх**; если меньше — сколько есть |
| **Soul Charge (X)** | отправить X верхних карт колоды в душу |
Важно: обычный урон лежит в зоне урона **лицом вверх**; Counter Blast
переворачивает его лицом вниз, Counter Charge — обратно.
---
## 10. Способности
- **ACT** — только в Main, если не сказано иное; обычно сколько угодно раз.
- **CONT** — постоянный эффект, не требует активации.
- **AUTO** — срабатывает автоматически при условии.
Порядок разрешения нескольких одновременных AUTO-способностей определяется
правилами/эффектами; в проекте для этого есть очередь и выбор порядка.
### 10.1. G/V-механики (справочно, не Classic)
**Stride / Вознесение.** Авангард 3 ранга (или 3 ранг был в начале хода)
позволяет положить воина наследия из зоны наследия поверх круга авангарда,
оплатив карты из руки с суммой рангов не меньше 3. Старый авангард становится
сердцем: имя и сила сердца переходят к новому воину, остальные характеристики
— нет. В конце хода воин наследия возвращается в зону наследия, сердце снова
становится авангардом. Stride не считается Ride.
**Legacy / Наследие.** Отдельная колода до 16 воинов наследия. Стражи
наследия — 15 000 щита; чтобы призвать, скинуть из руки карту с Heal, при этом
оба авангарда должны быть 3 ранга. После боя страж возвращается в зону
наследия открытым. Если там 4 открытых стража, призыв стражей больше
недоступен. Воины наследия дают Triple Drive из авангарда.
**Gift / Дары воображения.** Появляются у некоторых карт 3–4 ранга V-эры.
При первом Ride на такого воина игрок выбирает один из двух вариантов дара;
до конца боя при последующих Ride доступен только выбранный вариант.
| Дар | Эффект |
|---|---|
| **Accel I** | дополнительный передний круг арьергарда; во время своего хода воин в нём получает +10 000; boost в этот круг невозможен |
| **Accel II** | дополнительный передний круг; сразу взять карту; воин в нём получает +5 000; boost невозможен |
| **Force I** | выбранный круг: +10 000 воину во время своего хода; дары можно складывать |
| **Force II** | критический удар воина в выбранном круге становится равным 2 (не +1) |
| **Protect I** | дар идёт в руку; можно скинуть его для perfect guard; после использования исчезает |
| **Protect II** | выбранный круг арьергарда: +5 000 силы и +10 000 щита при перехвате; эффекты складываются |
**Front-триггер.** +10 000 всем воинам переднего ряда; только новая эра.
**Grade support.** См. раздел 7.3; в Classic не используется.
Всё перечисленное в этом подразделе не входит в текущий Classic-режим
проекта и не должно попадать в игровое ядро без отдельного решения.
---
## 11. Ключевые инварианты для реализации
1. Атаковать может только стоящий воин **переднего ряда**.
2. Цель обычной атаки — только передний ряд; атака по заднему ряду — только
особая способность (`CanSnipeBackRow`) и только по своей колонке.
3. Rest — это поворот карты; stand — возврат в вертикальное положение.
4. Призванный арьергард входит стоящим.
5. Атака/boost/часть ACT переводят карту в rest.
6. 6 урона — поражение; пустая колода — поражение.
7. Урон — лицом вверх; Counter Blast — лицом вниз.
8. Heal срабатывает при уроне **>=** урона соперника.
9. Mulligan: один раз, любое количество карт, возврат в низ → добор → shuffle.
10. В первый ход атаковать нельзя.
---
## 12. Соответствие текущей реализации
Проект: **Classic**, BT01 + TD01/TD02, 94 карты / 124 принта.
Уже реализовано в `Vanguard.Rules`:
- 50 карт, ≤4 по имени, ≤4 Sentinel, ≤4 Heal;
- стартовый авангард, рука 5, Ride, Call, Move, Boost, Intercept, Guard;
- Drive Check и Damage Check, критические удары, урон, heal, retire;
- триггеры Heal/Critical/Draw/Stand;
- Counter Blast / Soul Blast / Soul Charge / Counter Charge;
- проверка переднего ряда для атаки и особая атака по заднему ряду.
### 12.1. Расхождения, которые нужно учесть
Это не «правила», а результат сверки текста источника с кодом на текущий
момент. Перед следующим блоком их стоит исправить.
| № | Место | Сейчас | По правилам |
|---|---|---|---|
| 1 | `GameEngine.PutIntoDamage` | карта урона создаётся `FaceUp = false`; клиент рисует её рубашкой | урон лежит **лицом вверх** |
| 2 | `GameEngine.CounterBlast` | переворачивает закрытые карты в открытые; `CanCounterBlast` считает закрытые | Counter Blast переворачивает **открытые в закрытые** |
| 3 | `GameEngine.TryBeginHeal` | лечит только если урон **больше** (`<=` — отказ) | достаточно **равного** урона (`>=`) |
| 4 | `GameEngine.Mulligan` | shuffle → draw; можно вызывать несколько раз; обрабатывается только активный игрок (0) | возврат в низ → draw → shuffle; один раз; оба игрока |
| 5 | `GameEngine.Attack` | нет проверки первого хода | в первый ход атака запрещена |
| 6 | `GameEngine.Start` | первым всегда ходит игрок 0 | первый игрок определяется случайно |
| 7 | `DeckValidator` | не проверяет ровно 16 триггеров | ровно 16 триггер-карт |
| 8 | UI зоны урона | закрытые карты показываются рубашкой; после исправления №1—2 открытые должны быть видны | открытые карты видны, на боку |
Пункты 1—3 влияют на игровую логику и UI; 4—6 — на корректность матча и
колод. Пункт 7 — визуальное следствие 1—2.
### 12.2. Не входит в Classic
Без отдельного решения не реализовывать:
- Standard/Premium/G-форматы;
- колоду наследия, стражей наследия, воинов наследия;
- Stride/Вознесение;
- Gift/Дары воображения;
- Front-триггер;
- Grade support;
- Legion (если появится позже — отдельным блоком).