From 1e0b36bbb87a635160ed3363bc95c05fe5bd1b48 Mon Sep 17 00:00:00 2001 From: MpakobecEx Date: Thu, 22 Oct 2026 02:30:02 +0500 Subject: [PATCH] Document Vanguard rules and implementation gaps --- README.md | 1 + docs/HANDOFF.md | 17 +- docs/SESSION-STATE.md | 2 +- docs/game-rules.md | 357 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 375 insertions(+), 2 deletions(-) create mode 100644 docs/game-rules.md diff --git a/README.md b/README.md index 789934e..076840a 100644 --- a/README.md +++ b/README.md @@ -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` — каталог карт с разбором состава сетов. diff --git a/docs/HANDOFF.md b/docs/HANDOFF.md index a53beb2..da23eb0 100644 --- a/docs/HANDOFF.md +++ b/docs/HANDOFF.md @@ -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. diff --git a/docs/SESSION-STATE.md b/docs/SESSION-STATE.md index 2ad448e..4d4a2bc 100644 --- a/docs/SESSION-STATE.md +++ b/docs/SESSION-STATE.md @@ -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`. ## Клиент diff --git a/docs/game-rules.md b/docs/game-rules.md new file mode 100644 index 0000000..4183314 --- /dev/null +++ b/docs/game-rules.md @@ -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 (если появится позже — отдельным блоком).